diff --git a/geoprism-client/src/main/java-gen/base/net/geoprism/MappableClassDTOBase.java b/geoprism-client/src/main/java-gen/base/net/geoprism/MappableClassDTOBase.java index cd78bae2b..dfa4695cc 100644 --- a/geoprism-client/src/main/java-gen/base/net/geoprism/MappableClassDTOBase.java +++ b/geoprism-client/src/main/java-gen/base/net/geoprism/MappableClassDTOBase.java @@ -18,11 +18,11 @@ */ package net.geoprism; -@com.runwaysdk.business.ClassSignature(hash = 2377446) +@com.runwaysdk.business.ClassSignature(hash = -1914429695) public abstract class MappableClassDTOBase extends com.runwaysdk.business.BusinessDTO implements com.runwaysdk.generation.loader.Reloadable { public final static String CLASS = "net.geoprism.MappableClass"; - private static final long serialVersionUID = 2377446; + private static final long serialVersionUID = -1914429695; protected MappableClassDTOBase(com.runwaysdk.constants.ClientRequestIF clientRequest) { @@ -555,6 +555,22 @@ public static final void remove(com.runwaysdk.constants.ClientRequestIF clientRe clientRequest.invokeMethod(_metadata, null, _parameters); } + public final void xport() + { + String[] _declaredTypes = new String[]{}; + Object[] _parameters = new Object[]{}; + com.runwaysdk.business.MethodMetaData _metadata = new com.runwaysdk.business.MethodMetaData(net.geoprism.MappableClassDTO.CLASS, "xport", _declaredTypes); + getRequest().invokeMethod(_metadata, this, _parameters); + } + + public static final void xport(com.runwaysdk.constants.ClientRequestIF clientRequest, java.lang.String id) + { + String[] _declaredTypes = new String[]{"java.lang.String"}; + Object[] _parameters = new Object[]{id}; + com.runwaysdk.business.MethodMetaData _metadata = new com.runwaysdk.business.MethodMetaData(net.geoprism.MappableClassDTO.CLASS, "xport", _declaredTypes); + clientRequest.invokeMethod(_metadata, null, _parameters); + } + @SuppressWarnings("unchecked") public java.util.List getAllGeoNode() { diff --git a/geoprism-client/src/main/java-gen/base/net/geoprism/MappableClassQueryDTO.java b/geoprism-client/src/main/java-gen/base/net/geoprism/MappableClassQueryDTO.java index 9e64911ab..6335595f4 100644 --- a/geoprism-client/src/main/java-gen/base/net/geoprism/MappableClassQueryDTO.java +++ b/geoprism-client/src/main/java-gen/base/net/geoprism/MappableClassQueryDTO.java @@ -18,7 +18,7 @@ */ package net.geoprism; -@com.runwaysdk.business.ClassSignature(hash = 1699839997) +@com.runwaysdk.business.ClassSignature(hash = 1288313290) /** * This class is generated automatically. * DO NOT MAKE CHANGES TO IT - THEY WILL BE OVERWRITTEN @@ -29,7 +29,7 @@ public class MappableClassQueryDTO extends com.runwaysdk.business.BusinessQueryDTO implements com.runwaysdk.generation.loader.Reloadable { -private static final long serialVersionUID = 1699839997; +private static final long serialVersionUID = 1288313290; protected MappableClassQueryDTO(String type) { diff --git a/geoprism-client/src/main/java-gen/base/net/geoprism/dhis2/response/DHIS2DuplicateAttributeExceptionDTOBase.java b/geoprism-client/src/main/java-gen/base/net/geoprism/dhis2/response/DHIS2DuplicateAttributeExceptionDTOBase.java new file mode 100644 index 000000000..3c89400a7 --- /dev/null +++ b/geoprism-client/src/main/java-gen/base/net/geoprism/dhis2/response/DHIS2DuplicateAttributeExceptionDTOBase.java @@ -0,0 +1,125 @@ +/** + * Copyright (c) 2015 TerraFrame, Inc. All rights reserved. + * + * This file is part of Runway SDK(tm). + * + * Runway SDK(tm) is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * Runway SDK(tm) is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with Runway SDK(tm). If not, see . + */ +package net.geoprism.dhis2.response; + +@com.runwaysdk.business.ClassSignature(hash = 143517797) +public abstract class DHIS2DuplicateAttributeExceptionDTOBase extends com.runwaysdk.business.SmartExceptionDTO implements com.runwaysdk.generation.loader.Reloadable +{ + public final static String CLASS = "net.geoprism.dhis2.response.DHIS2DuplicateAttributeException"; + private static final long serialVersionUID = 143517797; + + public DHIS2DuplicateAttributeExceptionDTOBase(com.runwaysdk.constants.ClientRequestIF clientRequestIF) + { + super(clientRequestIF); + } + + protected DHIS2DuplicateAttributeExceptionDTOBase(com.runwaysdk.business.ExceptionDTO exceptionDTO) + { + super(exceptionDTO); + } + + public DHIS2DuplicateAttributeExceptionDTOBase(com.runwaysdk.constants.ClientRequestIF clientRequest, java.util.Locale locale) + { + super(clientRequest, locale); + } + + public DHIS2DuplicateAttributeExceptionDTOBase(com.runwaysdk.constants.ClientRequestIF clientRequest, java.util.Locale locale, java.lang.String developerMessage) + { + super(clientRequest, locale, developerMessage); + } + + public DHIS2DuplicateAttributeExceptionDTOBase(com.runwaysdk.constants.ClientRequestIF clientRequest, java.util.Locale locale, java.lang.Throwable cause) + { + super(clientRequest, locale, cause); + } + + public DHIS2DuplicateAttributeExceptionDTOBase(com.runwaysdk.constants.ClientRequestIF clientRequest, java.util.Locale locale, java.lang.String developerMessage, java.lang.Throwable cause) + { + super(clientRequest, locale, developerMessage, cause); + } + + public DHIS2DuplicateAttributeExceptionDTOBase(com.runwaysdk.constants.ClientRequestIF clientRequest, java.lang.Throwable cause) + { + super(clientRequest, cause); + } + + public DHIS2DuplicateAttributeExceptionDTOBase(com.runwaysdk.constants.ClientRequestIF clientRequest, java.lang.String msg, java.lang.Throwable cause) + { + super(clientRequest, msg, cause); + } + + protected java.lang.String getDeclaredType() + { + return CLASS; + } + + public static java.lang.String DHIS2ATTRS = "dhis2Attrs"; + public static java.lang.String ID = "id"; + public String getDhis2Attrs() + { + return getValue(DHIS2ATTRS); + } + + public void setDhis2Attrs(String value) + { + if(value == null) + { + setValue(DHIS2ATTRS, ""); + } + else + { + setValue(DHIS2ATTRS, value); + } + } + + public boolean isDhis2AttrsWritable() + { + return isWritable(DHIS2ATTRS); + } + + public boolean isDhis2AttrsReadable() + { + return isReadable(DHIS2ATTRS); + } + + public boolean isDhis2AttrsModified() + { + return isModified(DHIS2ATTRS); + } + + public final com.runwaysdk.transport.metadata.AttributeCharacterMdDTO getDhis2AttrsMd() + { + return (com.runwaysdk.transport.metadata.AttributeCharacterMdDTO) getAttributeDTO(DHIS2ATTRS).getAttributeMdDTO(); + } + + /** + * Overrides java.lang.Throwable#getMessage() to retrieve the localized + * message from the exceptionDTO, instead of from a class variable. + */ + public String getMessage() + { + java.lang.String template = super.getMessage(); + + template = template.replace("{dhis2Attrs}", this.getDhis2Attrs().toString()); + template = template.replace("{id}", this.getId().toString()); + + return template; + } + +} diff --git a/geoprism-client/src/main/java-gen/base/net/geoprism/dhis2/response/OAuthLoginRequiredExceptionDTOBase.java b/geoprism-client/src/main/java-gen/base/net/geoprism/dhis2/response/OAuthLoginRequiredExceptionDTOBase.java new file mode 100644 index 000000000..2f67f54a7 --- /dev/null +++ b/geoprism-client/src/main/java-gen/base/net/geoprism/dhis2/response/OAuthLoginRequiredExceptionDTOBase.java @@ -0,0 +1,86 @@ +/** + * Copyright (c) 2015 TerraFrame, Inc. All rights reserved. + * + * This file is part of Runway SDK(tm). + * + * Runway SDK(tm) is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * Runway SDK(tm) is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with Runway SDK(tm). If not, see . + */ +package net.geoprism.dhis2.response; + +@com.runwaysdk.business.ClassSignature(hash = 1517525951) +public abstract class OAuthLoginRequiredExceptionDTOBase extends com.runwaysdk.business.SmartExceptionDTO implements com.runwaysdk.generation.loader.Reloadable +{ + public final static String CLASS = "net.geoprism.dhis2.response.OAuthLoginRequiredException"; + private static final long serialVersionUID = 1517525951; + + public OAuthLoginRequiredExceptionDTOBase(com.runwaysdk.constants.ClientRequestIF clientRequestIF) + { + super(clientRequestIF); + } + + protected OAuthLoginRequiredExceptionDTOBase(com.runwaysdk.business.ExceptionDTO exceptionDTO) + { + super(exceptionDTO); + } + + public OAuthLoginRequiredExceptionDTOBase(com.runwaysdk.constants.ClientRequestIF clientRequest, java.util.Locale locale) + { + super(clientRequest, locale); + } + + public OAuthLoginRequiredExceptionDTOBase(com.runwaysdk.constants.ClientRequestIF clientRequest, java.util.Locale locale, java.lang.String developerMessage) + { + super(clientRequest, locale, developerMessage); + } + + public OAuthLoginRequiredExceptionDTOBase(com.runwaysdk.constants.ClientRequestIF clientRequest, java.util.Locale locale, java.lang.Throwable cause) + { + super(clientRequest, locale, cause); + } + + public OAuthLoginRequiredExceptionDTOBase(com.runwaysdk.constants.ClientRequestIF clientRequest, java.util.Locale locale, java.lang.String developerMessage, java.lang.Throwable cause) + { + super(clientRequest, locale, developerMessage, cause); + } + + public OAuthLoginRequiredExceptionDTOBase(com.runwaysdk.constants.ClientRequestIF clientRequest, java.lang.Throwable cause) + { + super(clientRequest, cause); + } + + public OAuthLoginRequiredExceptionDTOBase(com.runwaysdk.constants.ClientRequestIF clientRequest, java.lang.String msg, java.lang.Throwable cause) + { + super(clientRequest, msg, cause); + } + + protected java.lang.String getDeclaredType() + { + return CLASS; + } + + public static java.lang.String ID = "id"; + /** + * Overrides java.lang.Throwable#getMessage() to retrieve the localized + * message from the exceptionDTO, instead of from a class variable. + */ + public String getMessage() + { + java.lang.String template = super.getMessage(); + + template = template.replace("{id}", this.getId().toString()); + + return template; + } + +} diff --git a/geoprism-client/src/main/java-gen/base/net/geoprism/ontology/GeoEntityUtilDTOBase.java b/geoprism-client/src/main/java-gen/base/net/geoprism/ontology/GeoEntityUtilDTOBase.java index e08cd23fd..436cd224a 100644 --- a/geoprism-client/src/main/java-gen/base/net/geoprism/ontology/GeoEntityUtilDTOBase.java +++ b/geoprism-client/src/main/java-gen/base/net/geoprism/ontology/GeoEntityUtilDTOBase.java @@ -1,28 +1,10 @@ -/** - * Copyright (c) 2015 TerraFrame, Inc. All rights reserved. - * - * This file is part of Runway SDK(tm). - * - * Runway SDK(tm) is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * Runway SDK(tm) is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Runway SDK(tm). If not, see . - */ package net.geoprism.ontology; -@com.runwaysdk.business.ClassSignature(hash = -318518985) +@com.runwaysdk.business.ClassSignature(hash = -2105263295) public abstract class GeoEntityUtilDTOBase extends com.runwaysdk.business.UtilDTO implements com.runwaysdk.generation.loader.Reloadable { public final static String CLASS = "net.geoprism.ontology.GeoEntityUtil"; - private static final long serialVersionUID = -318518985; + private static final long serialVersionUID = -2105263295; protected GeoEntityUtilDTOBase(com.runwaysdk.constants.ClientRequestIF clientRequest) { @@ -35,6 +17,22 @@ protected java.lang.String getDeclaredType() } public static java.lang.String ID = "id"; + public static final void applyGeometries(com.runwaysdk.constants.ClientRequestIF clientRequest, java.lang.String featureCollection) + { + String[] _declaredTypes = new String[]{"java.lang.String"}; + Object[] _parameters = new Object[]{featureCollection}; + com.runwaysdk.business.MethodMetaData _metadata = new com.runwaysdk.business.MethodMetaData(net.geoprism.ontology.GeoEntityUtilDTO.CLASS, "applyGeometries", _declaredTypes); + clientRequest.invokeMethod(_metadata, null, _parameters); + } + + public static final void cancelEditingSession(com.runwaysdk.constants.ClientRequestIF clientRequest, java.lang.String config) + { + String[] _declaredTypes = new String[]{"java.lang.String"}; + Object[] _parameters = new Object[]{config}; + com.runwaysdk.business.MethodMetaData _metadata = new com.runwaysdk.business.MethodMetaData(net.geoprism.ontology.GeoEntityUtilDTO.CLASS, "cancelEditingSession", _declaredTypes); + clientRequest.invokeMethod(_metadata, null, _parameters); + } + public static final void deleteEntityProblem(com.runwaysdk.constants.ClientRequestIF clientRequest, java.lang.String problemId) { String[] _declaredTypes = new String[]{"java.lang.String"}; @@ -43,6 +41,14 @@ public static final void deleteEntityProblem(com.runwaysdk.constants.ClientReque clientRequest.invokeMethod(_metadata, null, _parameters); } + public static final void deleteGeoEntity(com.runwaysdk.constants.ClientRequestIF clientRequest, java.lang.String id) + { + String[] _declaredTypes = new String[]{"java.lang.String"}; + Object[] _parameters = new Object[]{id}; + com.runwaysdk.business.MethodMetaData _metadata = new com.runwaysdk.business.MethodMetaData(net.geoprism.ontology.GeoEntityUtilDTO.CLASS, "deleteGeoEntity", _declaredTypes); + clientRequest.invokeMethod(_metadata, null, _parameters); + } + public static final com.runwaysdk.system.gis.geo.GeoEntityProblemViewDTO[] getAllProblems(com.runwaysdk.constants.ClientRequestIF clientRequest) { String[] _declaredTypes = new String[]{}; @@ -59,6 +65,30 @@ public static final com.runwaysdk.business.ValueQueryDTO getChildren(com.runways return (com.runwaysdk.business.ValueQueryDTO) clientRequest.invokeMethod(_metadata, null, _parameters); } + public static final java.lang.String getChildrenBBOX(com.runwaysdk.constants.ClientRequestIF clientRequest, java.lang.String id, java.lang.String universalId) + { + String[] _declaredTypes = new String[]{"java.lang.String", "java.lang.String"}; + Object[] _parameters = new Object[]{id, universalId}; + com.runwaysdk.business.MethodMetaData _metadata = new com.runwaysdk.business.MethodMetaData(net.geoprism.ontology.GeoEntityUtilDTO.CLASS, "getChildrenBBOX", _declaredTypes); + return (java.lang.String) clientRequest.invokeMethod(_metadata, null, _parameters); + } + + public static final java.io.InputStream getData(com.runwaysdk.constants.ClientRequestIF clientRequest, java.lang.String config) + { + String[] _declaredTypes = new String[]{"java.lang.String"}; + Object[] _parameters = new Object[]{config}; + com.runwaysdk.business.MethodMetaData _metadata = new com.runwaysdk.business.MethodMetaData(net.geoprism.ontology.GeoEntityUtilDTO.CLASS, "getData", _declaredTypes); + return (java.io.InputStream) clientRequest.invokeMethod(_metadata, null, _parameters); + } + + public static final java.lang.String getEntitiesBBOX(com.runwaysdk.constants.ClientRequestIF clientRequest, java.lang.String[] ids) + { + String[] _declaredTypes = new String[]{"[Ljava.lang.String;"}; + Object[] _parameters = new Object[]{ids}; + com.runwaysdk.business.MethodMetaData _metadata = new com.runwaysdk.business.MethodMetaData(net.geoprism.ontology.GeoEntityUtilDTO.CLASS, "getEntitiesBBOX", _declaredTypes); + return (java.lang.String) clientRequest.invokeMethod(_metadata, null, _parameters); + } + public static final com.runwaysdk.system.gis.geo.GeoEntityDTO getEntity(com.runwaysdk.constants.ClientRequestIF clientRequest, java.lang.String id) { String[] _declaredTypes = new String[]{"java.lang.String"}; @@ -107,6 +137,14 @@ public static final java.lang.String[] makeSynonym(com.runwaysdk.constants.Clien return (java.lang.String[]) clientRequest.invokeMethod(_metadata, null, _parameters); } + public static final java.io.InputStream openEditingSession(com.runwaysdk.constants.ClientRequestIF clientRequest, java.lang.String config) + { + String[] _declaredTypes = new String[]{"java.lang.String"}; + Object[] _parameters = new Object[]{config}; + com.runwaysdk.business.MethodMetaData _metadata = new com.runwaysdk.business.MethodMetaData(net.geoprism.ontology.GeoEntityUtilDTO.CLASS, "openEditingSession", _declaredTypes); + return (java.io.InputStream) clientRequest.invokeMethod(_metadata, null, _parameters); + } + public static final java.lang.String publishLayers(com.runwaysdk.constants.ClientRequestIF clientRequest, java.lang.String id, java.lang.String universalId, java.lang.String existingLayerNames) { String[] _declaredTypes = new String[]{"java.lang.String", "java.lang.String", "java.lang.String"}; diff --git a/geoprism-client/src/main/java-gen/stub/net/geoprism/DataUploaderController.java b/geoprism-client/src/main/java-gen/stub/net/geoprism/DataUploaderController.java index 0a83ce5f9..1ed0aafae 100644 --- a/geoprism-client/src/main/java-gen/stub/net/geoprism/DataUploaderController.java +++ b/geoprism-client/src/main/java-gen/stub/net/geoprism/DataUploaderController.java @@ -22,8 +22,6 @@ import java.io.InputStream; import java.util.List; -import net.geoprism.ontology.ClassifierDTO; - import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; @@ -40,6 +38,10 @@ import com.runwaysdk.mvc.RequestParamter; import com.runwaysdk.mvc.ResponseIF; import com.runwaysdk.mvc.RestBodyResponse; +import com.runwaysdk.system.gis.geo.GeoEntityDTO; + +import net.geoprism.ontology.ClassifierDTO; +import net.geoprism.ontology.GeoEntityUtilDTO; @Controller(url = "uploader") public class DataUploaderController implements Reloadable @@ -185,4 +187,24 @@ public ResponseIF validateCategoryName(ClientRequestIF request, @RequestParamter return new RestBodyResponse(""); } + + @Endpoint(error = ErrorSerialization.JSON) + public ResponseIF getGeoEntitySuggestions(ClientRequestIF request, @RequestParamter(name = "parentId") String parentId, @RequestParamter(name = "universalId") String universalId, @RequestParamter(name = "text") String text, @RequestParamter(name = "limit") Integer limit) throws JSONException + { + JSONArray response = new JSONArray(); + + ValueQueryDTO query = GeoEntityUtilDTO.getGeoEntitySuggestions(request, parentId, universalId, text, limit); + List results = query.getResultSet(); + + for (ValueObjectDTO result : results) + { + JSONObject object = new JSONObject(); + object.put("text", result.getValue(GeoEntityDTO.DISPLAYLABEL)); + object.put("data", result.getValue(GeoEntityDTO.ID)); + + response.put(object); + } + + return new RestBodyResponse(response); + } } diff --git a/geoprism-client/src/main/java-gen/stub/net/geoprism/dashboard/layer/CategoryIconController.java b/geoprism-client/src/main/java-gen/stub/net/geoprism/dashboard/layer/CategoryIconController.java index af418ebe8..07aca41c6 100644 --- a/geoprism-client/src/main/java-gen/stub/net/geoprism/dashboard/layer/CategoryIconController.java +++ b/geoprism-client/src/main/java-gen/stub/net/geoprism/dashboard/layer/CategoryIconController.java @@ -20,9 +20,8 @@ import java.io.InputStream; -import net.geoprism.JSONControllerUtil; - import org.json.JSONArray; +import org.json.JSONException; import org.json.JSONObject; import com.runwaysdk.constants.ClientRequestIF; @@ -31,10 +30,14 @@ import com.runwaysdk.generation.loader.Reloadable; import com.runwaysdk.mvc.Controller; import com.runwaysdk.mvc.Endpoint; +import com.runwaysdk.mvc.ErrorSerialization; import com.runwaysdk.mvc.InputStreamResponse; import com.runwaysdk.mvc.RequestParamter; import com.runwaysdk.mvc.ResponseIF; import com.runwaysdk.mvc.RestBodyResponse; +import com.runwaysdk.mvc.RestResponse; + +import net.geoprism.JSONControllerUtil; @Controller(url = "iconimage") public class CategoryIconController implements Reloadable @@ -66,7 +69,7 @@ public ResponseIF create(ClientRequestIF request, @RequestParamter(name = "file" return JSONControllerUtil.handleException(t); } } - + @Endpoint(method = ServletMethod.POST) public ResponseIF apply(ClientRequestIF request, @RequestParamter(name = "id") String id, @RequestParamter(name = "file") MultipartFileParameter file, @RequestParamter(name = "label") String label) { @@ -105,7 +108,7 @@ public ResponseIF apply(ClientRequestIF request, @RequestParamter(name = "id") S } } - @Endpoint(method = ServletMethod.GET) + @Endpoint(method = ServletMethod.POST) public ResponseIF edit(ClientRequestIF request, @RequestParamter(name = "id") String id) { try @@ -120,21 +123,23 @@ public ResponseIF edit(ClientRequestIF request, @RequestParamter(name = "id") St } } - public ResponseIF getAll(ClientRequestIF request) + @Endpoint(method = ServletMethod.POST, error = ErrorSerialization.JSON) + public ResponseIF unlock(ClientRequestIF request, @RequestParamter(name = "id") String id) { - try - { - String icons = CategoryIconDTO.getAllAsJSON(request); + CategoryIconDTO.unlock(request, id); - JSONObject object = new JSONObject(); - object.put("icons", new JSONArray(icons)); + return new RestResponse(); + } - return new RestBodyResponse(object); - } - catch (Throwable t) - { - return JSONControllerUtil.handleException(t); - } + @Endpoint(method = ServletMethod.GET, error = ErrorSerialization.JSON) + public ResponseIF getAll(ClientRequestIF request) throws JSONException + { + String icons = CategoryIconDTO.getAllAsJSON(request); + + JSONObject object = new JSONObject(); + object.put("icons", new JSONArray(icons)); + + return new RestBodyResponse(object); } @Endpoint(method = ServletMethod.POST) diff --git a/geoprism-client/src/main/java-gen/stub/net/geoprism/dhis2/response/DHIS2DuplicateAttributeExceptionDTO.java b/geoprism-client/src/main/java-gen/stub/net/geoprism/dhis2/response/DHIS2DuplicateAttributeExceptionDTO.java new file mode 100644 index 000000000..eccfcede3 --- /dev/null +++ b/geoprism-client/src/main/java-gen/stub/net/geoprism/dhis2/response/DHIS2DuplicateAttributeExceptionDTO.java @@ -0,0 +1,65 @@ +/** + * Copyright (c) 2015 TerraFrame, Inc. All rights reserved. + * + * This file is part of Runway SDK(tm). + * + * Runway SDK(tm) is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * Runway SDK(tm) is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with Runway SDK(tm). If not, see . + */ +package net.geoprism.dhis2.response; + +public class DHIS2DuplicateAttributeExceptionDTO extends DHIS2DuplicateAttributeExceptionDTOBase + implements com.runwaysdk.generation.loader.Reloadable{ + private static final long serialVersionUID = -1879063742; + + public DHIS2DuplicateAttributeExceptionDTO(com.runwaysdk.constants.ClientRequestIF clientRequestIF) + { + super(clientRequestIF); + } + + public DHIS2DuplicateAttributeExceptionDTO(com.runwaysdk.business.ExceptionDTO exceptionDTO) + { + super(exceptionDTO); + } + + public DHIS2DuplicateAttributeExceptionDTO(com.runwaysdk.constants.ClientRequestIF clientRequest, java.util.Locale locale) + { + super(clientRequest, locale); + } + + public DHIS2DuplicateAttributeExceptionDTO(com.runwaysdk.constants.ClientRequestIF clientRequest, java.util.Locale locale,java.lang.String developerMessage) + { + super(clientRequest, locale, developerMessage); + } + + public DHIS2DuplicateAttributeExceptionDTO(com.runwaysdk.constants.ClientRequestIF clientRequest, java.util.Locale locale, java.lang.Throwable cause) + { + super(clientRequest, locale, cause); + } + + public DHIS2DuplicateAttributeExceptionDTO(com.runwaysdk.constants.ClientRequestIF clientRequest, java.util.Locale locale, java.lang.String developerMessage, java.lang.Throwable cause) + { + super(clientRequest, locale, developerMessage, cause); + } + + public DHIS2DuplicateAttributeExceptionDTO(com.runwaysdk.constants.ClientRequestIF clientRequest, java.lang.Throwable cause) + { + super(clientRequest, cause); + } + + public DHIS2DuplicateAttributeExceptionDTO(com.runwaysdk.constants.ClientRequestIF clientRequest, java.lang.String msg, java.lang.Throwable cause) + { + super(clientRequest, msg, cause); + } + +} diff --git a/geoprism-client/src/main/java-gen/stub/net/geoprism/dhis2/response/OAuthLoginRequiredExceptionDTO.java b/geoprism-client/src/main/java-gen/stub/net/geoprism/dhis2/response/OAuthLoginRequiredExceptionDTO.java new file mode 100644 index 000000000..7f94ece4e --- /dev/null +++ b/geoprism-client/src/main/java-gen/stub/net/geoprism/dhis2/response/OAuthLoginRequiredExceptionDTO.java @@ -0,0 +1,65 @@ +/** + * Copyright (c) 2015 TerraFrame, Inc. All rights reserved. + * + * This file is part of Runway SDK(tm). + * + * Runway SDK(tm) is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * Runway SDK(tm) is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with Runway SDK(tm). If not, see . + */ +package net.geoprism.dhis2.response; + +public class OAuthLoginRequiredExceptionDTO extends OAuthLoginRequiredExceptionDTOBase + implements com.runwaysdk.generation.loader.Reloadable{ + private static final long serialVersionUID = 575017692; + + public OAuthLoginRequiredExceptionDTO(com.runwaysdk.constants.ClientRequestIF clientRequestIF) + { + super(clientRequestIF); + } + + public OAuthLoginRequiredExceptionDTO(com.runwaysdk.business.ExceptionDTO exceptionDTO) + { + super(exceptionDTO); + } + + public OAuthLoginRequiredExceptionDTO(com.runwaysdk.constants.ClientRequestIF clientRequest, java.util.Locale locale) + { + super(clientRequest, locale); + } + + public OAuthLoginRequiredExceptionDTO(com.runwaysdk.constants.ClientRequestIF clientRequest, java.util.Locale locale,java.lang.String developerMessage) + { + super(clientRequest, locale, developerMessage); + } + + public OAuthLoginRequiredExceptionDTO(com.runwaysdk.constants.ClientRequestIF clientRequest, java.util.Locale locale, java.lang.Throwable cause) + { + super(clientRequest, locale, cause); + } + + public OAuthLoginRequiredExceptionDTO(com.runwaysdk.constants.ClientRequestIF clientRequest, java.util.Locale locale, java.lang.String developerMessage, java.lang.Throwable cause) + { + super(clientRequest, locale, developerMessage, cause); + } + + public OAuthLoginRequiredExceptionDTO(com.runwaysdk.constants.ClientRequestIF clientRequest, java.lang.Throwable cause) + { + super(clientRequest, cause); + } + + public OAuthLoginRequiredExceptionDTO(com.runwaysdk.constants.ClientRequestIF clientRequest, java.lang.String msg, java.lang.Throwable cause) + { + super(clientRequest, msg, cause); + } + +} diff --git a/geoprism-client/src/main/java/net/geoprism/DefaultClientConfiguration.java b/geoprism-client/src/main/java/net/geoprism/DefaultClientConfiguration.java index 7df7004e8..cdcfff52e 100644 --- a/geoprism-client/src/main/java/net/geoprism/DefaultClientConfiguration.java +++ b/geoprism-client/src/main/java/net/geoprism/DefaultClientConfiguration.java @@ -44,7 +44,7 @@ public List getApplications(ClientRequestIF request) management.setId("management"); management.setLabel(LocalizationFacadeDTO.getFromBundles(request, "geoprismLanding.dataManagement")); management.setSrc("net/geoprism/images/dm_icon.svg"); - management.setUrl("management"); + management.setUrl("prism/management"); management.addRole(RoleConstants.ADIM_ROLE); management.addRole(RoleConstants.BUILDER_ROLE); diff --git a/geoprism-client/src/main/java/net/geoprism/InputStreamResponse.java b/geoprism-client/src/main/java/net/geoprism/InputStreamResponse.java index 45a2634aa..549bab247 100644 --- a/geoprism-client/src/main/java/net/geoprism/InputStreamResponse.java +++ b/geoprism-client/src/main/java/net/geoprism/InputStreamResponse.java @@ -3,18 +3,16 @@ * * This file is part of Runway SDK(tm). * - * Runway SDK(tm) is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. + * Runway SDK(tm) is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General + * Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any + * later version. * - * Runway SDK(tm) is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. + * Runway SDK(tm) is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more + * details. * - * You should have received a copy of the GNU Lesser General Public - * License along with Runway SDK(tm). If not, see . + * You should have received a copy of the GNU Lesser General Public License along with Runway SDK(tm). If not, see + * . */ package net.geoprism; @@ -24,13 +22,11 @@ import java.net.URLEncoder; import javax.servlet.ServletException; -import javax.servlet.http.HttpServletResponse; import org.apache.commons.io.IOUtils; import com.runwaysdk.controller.RequestManager; import com.runwaysdk.mvc.ResponseIF; -import com.runwaysdk.request.ResponseDecorator; import com.runwaysdk.request.ServletResponseIF; public class InputStreamResponse implements ResponseIF @@ -55,18 +51,17 @@ public InputStreamResponse(InputStream istream, String contentType, String filen @Override public void handle(RequestManager manager) throws ServletException, IOException { - ServletResponseIF resp = manager.getResp(); - resp.setStatus(200); - resp.setContentType(this.contentType); - - if (this.filename != null && resp instanceof ResponseDecorator) - { - HttpServletResponse response = ( (ResponseDecorator) resp ).getResponse(); - response.setHeader("Content-disposition", "attachment; filename=" + URLEncoder.encode(this.filename, "UTF-8")); - } - try { + ServletResponseIF resp = manager.getResp(); + resp.setStatus(200); + resp.setContentType(this.contentType); + + if (this.filename != null) + { + resp.setHeader("Content-disposition", "attachment; filename=" + URLEncoder.encode(this.filename, "UTF-8")); + } + OutputStream ostream = resp.getOutputStream(); try @@ -78,6 +73,10 @@ public void handle(RequestManager manager) throws ServletException, IOException ostream.close(); } } + catch(IOException e) + { + // Do nothing + } finally { this.istream.close(); diff --git a/geoprism-client/src/main/java/net/geoprism/JavascriptUtil.java b/geoprism-client/src/main/java/net/geoprism/JavascriptUtil.java index 1ecf673e0..f9153165c 100644 --- a/geoprism-client/src/main/java/net/geoprism/JavascriptUtil.java +++ b/geoprism-client/src/main/java/net/geoprism/JavascriptUtil.java @@ -66,6 +66,7 @@ import com.runwaysdk.constants.ClientRequestIF; import com.runwaysdk.generation.loader.Reloadable; +import com.runwaysdk.mvc.ViewTemplateResponse; import com.runwaysdk.system.RolesDTO; import com.runwaysdk.system.gis.geo.AllowedInDTO; import com.runwaysdk.system.gis.geo.GeoEntityController; @@ -110,6 +111,14 @@ private static void loadJavascript(ClientRequestIF request, HttpServletRequest r req.setAttribute("js", javascript); } + private static void loadJavascript(ClientRequestIF request, ViewTemplateResponse response, Set set) + { + String[] types = set.toArray(new String[set.size()]); + String javascript = JavascriptUtil.getJavascript(request, types); + + response.set("js", javascript); + } + public static void loadGeoEntityBundle(ClientRequestIF request, HttpServletRequest req) { Set types = new HashSet(); @@ -131,6 +140,27 @@ public static void loadGeoEntityBundle(ClientRequestIF request, HttpServletReque JavascriptUtil.loadJavascript(request, req, types); } + public static void loadGeoEntityBundle(ClientRequestIF request, ViewTemplateResponse response) + { + Set types = new HashSet(); + types.add(GeoEntityDTO.CLASS); + types.add(LocatedInDTO.CLASS); + types.add(GeoEntityDisplayLabelDTO.CLASS); + types.add(GeoEntityController.CLASS); + types.add(UniversalDTO.CLASS); + types.add(UniversalDisplayLabelDTO.CLASS); + types.add(TermUtilDTO.CLASS); + types.add(GeoEntityViewDTO.CLASS); + types.add(SynonymDTO.CLASS); + types.add(SynonymDisplayLabelDTO.CLASS); + types.add(GeoEntityExportMenuDTO.CLASS); + types.add(GeoEntityUtilDTO.CLASS); + types.add(GeoEntityProblemViewDTO.CLASS); + types.add(GeoEntityProblemDTO.CLASS); + + JavascriptUtil.loadJavascript(request, response, types); + } + public static void loadSchedulerBundle(ClientRequestIF request, HttpServletRequest req) { Set types = new HashSet(); @@ -145,6 +175,20 @@ public static void loadSchedulerBundle(ClientRequestIF request, HttpServletReque JavascriptUtil.loadJavascript(request, req, types); } + public static void loadSchedulerBundle(ClientRequestIF request, ViewTemplateResponse response) + { + Set types = new HashSet(); + types.add(ExecutableJobDTO.CLASS); + types.add(ExecutableJobDescriptionDTO.CLASS); + types.add(QualifiedTypeJobDTO.CLASS); + types.add(JobHistoryDTO.CLASS); + types.add(JobSnapshotDTO.CLASS); + types.add(JobHistoryViewDTO.CLASS); + types.add(JobHistoryHistoryInformationController.CLASS); + + JavascriptUtil.loadJavascript(request, response, types); + } + public static void loadUserBundle(ClientRequestIF request, HttpServletRequest req) { Set types = new HashSet(); @@ -161,6 +205,22 @@ public static void loadUserBundle(ClientRequestIF request, HttpServletRequest re JavascriptUtil.loadJavascript(request, req, types); } + public static void loadUserBundle(ClientRequestIF request, ViewTemplateResponse response) + { + Set types = new HashSet(); + types.add(RolesDTO.CLASS); + types.add(RoleViewDTO.CLASS); + types.add(GeoprismUserDTO.CLASS); + types.add(ExternalProfileDTO.CLASS); + types.add(DashboardDTO.CLASS); + types.add(DashboardDisplayLabelDTO.CLASS); + types.add(DashboardController.CLASS); +// types.add(DataUploaderController.CLASS); + types.add(GeoEntityUtilDTO.CLASS); + + JavascriptUtil.loadJavascript(request, response, types); + } + public static void loadDatabrowserBundle(ClientRequestIF request, HttpServletRequest req) { Set types = new HashSet(); @@ -172,6 +232,17 @@ public static void loadDatabrowserBundle(ClientRequestIF request, HttpServletReq JavascriptUtil.loadJavascript(request, req, types); } + public static void loadDatabrowserBundle(ClientRequestIF request, ViewTemplateResponse response) + { + Set types = new HashSet(); + types.add(DataBrowserUtilDTO.CLASS); + types.add(MetadataTypeDTO.CLASS); + types.add(PairViewDTO.CLASS); + types.add(ReportItemDTO.CLASS); + + JavascriptUtil.loadJavascript(request, response, types); + } + public static void loadSystemBundle(ClientRequestIF request, HttpServletRequest req) { Set types = new HashSet(); @@ -197,6 +268,20 @@ public static void loadUniversalBundle(ClientRequestIF request, HttpServletReque JavascriptUtil.loadJavascript(request, req, types); } + public static void loadUniversalBundle(ClientRequestIF request, ViewTemplateResponse response) + { + Set types = new HashSet(); + types.add(UniversalDTO.CLASS); + types.add(AllowedInDTO.CLASS); + types.add(UniversalDisplayLabelDTO.CLASS); + types.add(GeoEntityDTO.CLASS); + types.add(IsARelationshipDTO.CLASS); + types.add(TermUtilDTO.CLASS); + types.add(UniversalExportMenuDTO.CLASS); + + JavascriptUtil.loadJavascript(request, response, types); + } + public static void loadOntologyBundle(ClientRequestIF request, HttpServletRequest req) { Set types = JavascriptUtil.getOntologyTypes(); @@ -204,6 +289,13 @@ public static void loadOntologyBundle(ClientRequestIF request, HttpServletReques JavascriptUtil.loadJavascript(request, req, types); } + public static void loadOntologyBundle(ClientRequestIF request, ViewTemplateResponse response) + { + Set types = JavascriptUtil.getOntologyTypes(); + + JavascriptUtil.loadJavascript(request, response, types); + } + private static Set getOntologyTypes() { Set types = new HashSet(); @@ -292,6 +384,16 @@ public static void loadDatasets(ClientRequestIF request, HttpServletRequest req) JavascriptUtil.loadJavascript(request, req, types); } + public static void loadDatasets(ClientRequestIF request, ViewTemplateResponse req) + { + Set types = new HashSet(); + types.add(DataSetController.CLASS); + types.add(GeoEntityUtilDTO.CLASS); +// types.add(DataUploaderController.CLASS); + + JavascriptUtil.loadJavascript(request, req, types); + } + public static void loadIcons(ClientRequestIF request, HttpServletRequest req) { Set types = new HashSet(); diff --git a/geoprism-client/src/main/java/net/geoprism/SessionFilter.java b/geoprism-client/src/main/java/net/geoprism/SessionFilter.java index 8b6a1f641..d65d61154 100755 --- a/geoprism-client/src/main/java/net/geoprism/SessionFilter.java +++ b/geoprism-client/src/main/java/net/geoprism/SessionFilter.java @@ -205,6 +205,8 @@ private boolean pathAllowed(HttpServletRequest req) extensions.add(".gif"); extensions.add(".svg"); extensions.add(".pdf"); + extensions.add(".otf"); + extensions.add(".mp4"); // Login/Logout requests for mojax/mojo extensions. extensions.add(SessionController.LOGIN_ACTION); diff --git a/geoprism-client/src/main/java/net/geoprism/data/LocationController.java b/geoprism-client/src/main/java/net/geoprism/data/LocationController.java index 1dc8fc22d..6c43ed6f0 100644 --- a/geoprism-client/src/main/java/net/geoprism/data/LocationController.java +++ b/geoprism-client/src/main/java/net/geoprism/data/LocationController.java @@ -3,30 +3,23 @@ * * This file is part of Runway SDK(tm). * - * Runway SDK(tm) is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. + * Runway SDK(tm) is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General + * Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any + * later version. * - * Runway SDK(tm) is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. + * Runway SDK(tm) is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more + * details. * - * You should have received a copy of the GNU Lesser General Public - * License along with Runway SDK(tm). If not, see . + * You should have received a copy of the GNU Lesser General Public License along with Runway SDK(tm). If not, see + * . */ package net.geoprism.data; +import java.io.InputStream; import java.util.Arrays; import java.util.List; -import net.geoprism.ExcludeConfiguration; -import net.geoprism.ListSerializable; -import net.geoprism.gis.geoserver.GeoserverProperties; -import net.geoprism.ontology.GeoEntityUtilDTO; - -import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; @@ -48,6 +41,12 @@ import com.runwaysdk.system.gis.geo.UniversalDTO; import com.runwaysdk.util.IDGenerator; +import net.geoprism.ExcludeConfiguration; +import net.geoprism.InputStreamResponse; +import net.geoprism.ListSerializable; +import net.geoprism.gis.geoserver.GeoserverProperties; +import net.geoprism.ontology.GeoEntityUtilDTO; + @Controller(url = "location") public class LocationController implements Reloadable { @@ -75,18 +74,25 @@ private RestResponse getLocationInformation(ClientRequestIF request, GeoEntityDT { List universals = entity.getUniversal().getAllContains(); - String layers = GeoEntityUtilDTO.publishLayers(request, entity.getId(), universalId, existingLayers); + if ( ( universalId == null || universalId.length() == 0 ) && universals.size() > 0) + { + universalId = universals.get(0).getId(); + } + + // String geometries = GeoEntityUtilDTO.publishLayers(request, entity.getId(), universalId, existingLayers); ValueQueryDTO children = GeoEntityUtilDTO.getChildren(request, entity.getId(), universalId, 200); RestResponse response = new RestResponse(); response.set("children", children); - response.set("layers", new JSONArray(layers)); + response.set("bbox", GeoEntityUtilDTO.getChildrenBBOX(request, entity.getId(), universalId) ); response.set("universals", new ListSerializable(universals)); response.set("entity", new GeoEntitySerializable(entity), new GeoEntityJsonConfiguration()); response.set("universal", ( universalId != null && universalId.length() > 0 ) ? universalId : ""); response.set("workspace", GeoserverProperties.getWorkspace()); - + // response.set("geometries", new JSONStringImpl(geometries)); + // response.set("layers", object.get("layers")); + return response; } @@ -141,6 +147,30 @@ public ResponseIF apply(ClientRequestIF request, @RequestParamter(name = "entity } } + @Endpoint(error = ErrorSerialization.JSON) + public ResponseIF applyGeometries(ClientRequestIF request, @RequestParamter(name = "featureCollection") String featureCollection) + { + GeoEntityUtilDTO.applyGeometries(request, featureCollection); + + return new RestBodyResponse(""); + } + + @Endpoint(error = ErrorSerialization.JSON) + public ResponseIF openEditingSession(ClientRequestIF request, @RequestParamter(name = "config") String config) + { + InputStream istream = GeoEntityUtilDTO.openEditingSession(request, config.toString()); + + return new InputStreamResponse(istream, "application/x-protobuf", null); + } + + @Endpoint(error = ErrorSerialization.JSON) + public ResponseIF cancelEditingSession(ClientRequestIF request, @RequestParamter(name = "config") String config) + { + GeoEntityUtilDTO.cancelEditingSession(request, config.toString()); + + return new RestBodyResponse(""); + } + @Endpoint(error = ErrorSerialization.JSON) public ResponseIF edit(ClientRequestIF request, @RequestParamter(name = "entityId") String entityId) throws JSONException { @@ -160,11 +190,23 @@ public ResponseIF unlock(ClientRequestIF request, @RequestParamter(name = "entit @Endpoint(error = ErrorSerialization.JSON) public ResponseIF remove(ClientRequestIF request, @RequestParamter(name = "entityId") String entityId, @RequestParamter(name = "existingLayers") String existingLayers) throws JSONException { - GeoEntityDTO entity = GeoEntityDTO.get(request, entityId); - entity.delete(); + GeoEntityUtilDTO.deleteGeoEntity(request, entityId); GeoEntityUtilDTO.refreshViews(request, existingLayers); return new RestBodyResponse(""); } + + @Endpoint(error = ErrorSerialization.JSON) + public ResponseIF data(ClientRequestIF request, @RequestParamter(name = "x") Integer x, @RequestParamter(name = "y") Integer y, @RequestParamter(name = "z") Integer z, @RequestParamter(name = "config") String config) throws JSONException + { + JSONObject object = new JSONObject(config); + object.put("x", x); + object.put("y", y); + object.put("z", z); + + InputStream istream = GeoEntityUtilDTO.getData(request, object.toString()); + + return new InputStreamResponse(istream, "application/x-protobuf", null); + } } diff --git a/geoprism-client/src/main/java/net/geoprism/prism/CategoryController.java b/geoprism-client/src/main/java/net/geoprism/prism/CategoryController.java new file mode 100644 index 000000000..e6694ac6e --- /dev/null +++ b/geoprism-client/src/main/java/net/geoprism/prism/CategoryController.java @@ -0,0 +1,194 @@ +/** + * Copyright (c) 2015 TerraFrame, Inc. All rights reserved. + * + * This file is part of Runway SDK(tm). + * + * Runway SDK(tm) is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * Runway SDK(tm) is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with Runway SDK(tm). If not, see . + */ +package net.geoprism.prism; + +import java.util.List; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import com.runwaysdk.business.ontology.TermDTO; +import com.runwaysdk.constants.ClientRequestIF; +import com.runwaysdk.controller.ServletMethod; +import com.runwaysdk.mvc.Controller; +import com.runwaysdk.mvc.Endpoint; +import com.runwaysdk.mvc.ErrorSerialization; +import com.runwaysdk.mvc.RequestParamter; +import com.runwaysdk.mvc.ResponseIF; +import com.runwaysdk.mvc.RestBodyResponse; +import com.runwaysdk.mvc.RestResponse; + +import net.geoprism.ontology.ClassifierDTO; +import net.geoprism.ontology.ClassifierIsARelationshipDTO; +import net.geoprism.ontology.ClassifierSynonymDTO; + +@Controller(url = "category") +public class CategoryController +{ + @Endpoint(url = "all", method = ServletMethod.GET, error = ErrorSerialization.JSON) + public ResponseIF getAllCategories(ClientRequestIF request) throws JSONException + { + String classifiers = ClassifierDTO.getCategoryClassifiersAsJSON(request); + + JSONArray array = new JSONArray(classifiers); + + for (int i = 0; i < array.length(); i++) + { + JSONObject object = array.getJSONObject(i); + object.put("id", object.getString("value")); + object.remove("value"); + } + + return new RestBodyResponse(array); + } + + @Endpoint(url = "get", method = ServletMethod.GET, error = ErrorSerialization.JSON) + public ResponseIF getCategory(ClientRequestIF request, @RequestParamter(name = "id") String id) throws JSONException + { + ClassifierDTO dto = ClassifierDTO.get(request, id); + + JSONArray dArray = new JSONArray(); + + TermDTO[] descendants = dto.getAllDescendants(new String[] { ClassifierIsARelationshipDTO.CLASS }); + + for (TermDTO descendant : descendants) + { + JSONObject object = new JSONObject(); + object.put("label", descendant.getDisplayLabel().getValue()); + object.put("id", descendant.getId()); + + dArray.put(object); + } + + JSONObject response = new JSONObject(); + response.put("label", dto.getDisplayLabel().getValue()); + response.put("id", dto.getId()); + response.put("descendants", dArray); + + return new RestBodyResponse(response); + } + + @Endpoint(url = "edit", method = ServletMethod.POST, error = ErrorSerialization.JSON) + public ResponseIF editOption(ClientRequestIF request, @RequestParamter(name = "parentId") String parentId, @RequestParamter(name = "id") String id) throws JSONException + { + ClassifierDTO dto = ClassifierDTO.editOption(request, id); + + JSONArray sArray = new JSONArray(); + + List synonyms = dto.getAllHasSynonym(); + + for (ClassifierSynonymDTO synonym : synonyms) + { + JSONObject object = new JSONObject(); + object.put("label", synonym.getDisplayLabel().getValue()); + object.put("id", synonym.getId()); + + sArray.put(object); + } + + ClassifierDTO parent = ClassifierDTO.get(request, parentId); + + JSONArray dArray = new JSONArray(); + + TermDTO[] descendants = parent.getAllDescendants(new String[] { ClassifierIsARelationshipDTO.CLASS }); + + for (TermDTO descendant : descendants) + { + if (!descendant.getId().equals(id)) + { + JSONObject object = new JSONObject(); + object.put("label", descendant.getDisplayLabel().getValue()); + object.put("id", descendant.getId()); + + dArray.put(object); + } + } + + JSONObject response = new JSONObject(); + response.put("label", dto.getDisplayLabel().getValue()); + response.put("id", dto.getId()); + response.put("synonyms", sArray); + response.put("siblings", dArray); + + return new RestBodyResponse(response); + } + + @Endpoint(url = "apply", method = ServletMethod.POST, error = ErrorSerialization.JSON) + public ResponseIF applyOption(ClientRequestIF request, @RequestParamter(name = "config") String config) throws JSONException + { + // JSONObject object = new JSONObject(config); + // String categoryId = object.getString("categoryId"); + + ClassifierDTO.applyOption(request, config); + + // return this.getCategory(request, categoryId); + return new RestBodyResponse(""); + } + + @Endpoint(url = "unlock", method = ServletMethod.POST, error = ErrorSerialization.JSON) + public ResponseIF unlockCategory(ClientRequestIF request, @RequestParamter(name = "id") String id) + { + ClassifierDTO.unlockCategory(request, id); + + return new RestResponse(); + } + + @Endpoint(url = "create", method = ServletMethod.POST, error = ErrorSerialization.JSON) + public ResponseIF createOption(ClientRequestIF request, @RequestParamter(name = "option") String option) throws JSONException + { + ClassifierDTO classifier = ClassifierDTO.createOption(request, option); + + JSONObject object = new JSONObject(); + object.put("label", classifier.getDisplayLabel().getValue()); + object.put("id", classifier.getId()); + + return new RestBodyResponse(object); + } + + @Endpoint(url = "remove", method = ServletMethod.POST, error = ErrorSerialization.JSON) + public ResponseIF deleteOption(ClientRequestIF request, @RequestParamter(name = "id") String id) + { + ClassifierDTO.deleteOption(request, id); + + return new RestResponse(); + } + + @Endpoint(url = "validate", method = ServletMethod.GET, error = ErrorSerialization.JSON) + public ResponseIF validateCategoryName(ClientRequestIF request, @RequestParamter(name = "name") String name, @RequestParamter(name = "id") String id) + { + ClassifierDTO.validateCategoryName(request, name, id); + + return new RestResponse(); + } + + @Endpoint(url = "update", method = ServletMethod.POST, error = ErrorSerialization.JSON) + public ResponseIF updateCategory(ClientRequestIF request, @RequestParamter(name = "category") String category) throws JSONException + { + JSONObject config = new JSONObject(); + config.put("option", new JSONObject(category)); + config.put("restore", new JSONArray()); + config.put("synonym", ""); + + ClassifierDTO.applyOption(request, config.toString()); + + return new RestResponse(); + } + +} diff --git a/geoprism-client/src/main/java/net/geoprism/prism/PrismController.java b/geoprism-client/src/main/java/net/geoprism/prism/PrismController.java new file mode 100644 index 000000000..4bf372172 --- /dev/null +++ b/geoprism-client/src/main/java/net/geoprism/prism/PrismController.java @@ -0,0 +1,100 @@ +/** + * Copyright (c) 2015 TerraFrame, Inc. All rights reserved. + * + * This file is part of Runway SDK(tm). + * + * Runway SDK(tm) is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * Runway SDK(tm) is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with Runway SDK(tm). If not, see . + */ +package net.geoprism.prism; + +import org.json.JSONException; +import org.json.JSONObject; + +import com.runwaysdk.constants.ClientRequestIF; +import com.runwaysdk.controller.ServletMethod; +import com.runwaysdk.generation.loader.Reloadable; +import com.runwaysdk.mvc.Controller; +import com.runwaysdk.mvc.Endpoint; +import com.runwaysdk.mvc.ErrorSerialization; +import com.runwaysdk.mvc.RequestParamter; +import com.runwaysdk.mvc.ResponseIF; +import com.runwaysdk.mvc.RestBodyResponse; +import com.runwaysdk.mvc.RestResponse; +import com.runwaysdk.mvc.ViewResponse; + +import net.geoprism.MappableClassDTO; + +@Controller(url = "prism") +public class PrismController implements Reloadable +{ + @Endpoint(method = ServletMethod.GET) + public ResponseIF management() + { + return new ViewResponse("/WEB-INF/net/geoprism/prism/prism.jsp"); + } + + @Endpoint(method = ServletMethod.GET, error = ErrorSerialization.JSON) + public ResponseIF datasets(ClientRequestIF request) throws JSONException + { + String datasets = MappableClassDTO.getAllAsJSON(request); + + return new RestBodyResponse(new JSONObject(datasets)); + } + + @Endpoint(method = ServletMethod.POST, error = ErrorSerialization.JSON) + public ResponseIF remove(ClientRequestIF request, @RequestParamter(name = "id") String id) + { + MappableClassDTO.remove(request, id); + + return new RestResponse(); + } + + @Endpoint(url = "edit-dataset", method = ServletMethod.POST, error = ErrorSerialization.JSON) + public ResponseIF edit(ClientRequestIF request, @RequestParamter(name = "id") String id) throws JSONException + { + MappableClassDTO mappableClass = MappableClassDTO.lock(request, id); + + return new RestBodyResponse(new JSONObject(mappableClass.getAsJSON())); + } + + @Endpoint(url = "xport-dataset", method = ServletMethod.POST, error = ErrorSerialization.JSON) + public ResponseIF xport(ClientRequestIF request, @RequestParamter(name = "id") String id) throws JSONException + { + MappableClassDTO.xport(request, id); + + return new RestResponse(); + } + + @Endpoint(url = "unlock-dataset", method = ServletMethod.POST, error = ErrorSerialization.JSON) + public ResponseIF cancel(ClientRequestIF request, @RequestParamter(name = "id") String id) + { + MappableClassDTO.unlock(request, id); + + return new RestResponse(); + } + + @Endpoint(url = "apply-dataset", method = ServletMethod.POST, error = ErrorSerialization.JSON) + public ResponseIF applyDatasetUpdate(ClientRequestIF request, @RequestParamter(name = "dataset") String dataset) throws JSONException + { + JSONObject dsJSONObj = new JSONObject(dataset); + String dsId = dsJSONObj.getString("id"); + + MappableClassDTO ds = MappableClassDTO.lock(request, dsId); + MappableClassDTO.applyDatasetUpdate(request, dataset); + ds.unlock(); + + return new RestBodyResponse(new JSONObject(ds.getAsJSON())); + } + +} diff --git a/geoprism-client/src/main/resources/jawr.properties b/geoprism-client/src/main/resources/jawr.properties index 9478cf188..dad857bcf 100644 --- a/geoprism-client/src/main/resources/jawr.properties +++ b/geoprism-client/src/main/resources/jawr.properties @@ -48,6 +48,12 @@ jawr.css.bundle.datatable.mappings=/3rd-party/jquery/datatables/css/jquery.dataT jawr.css.bundle.dynamic-map.id=/bundles/dynamic-map.css jawr.css.bundle.dynamic-map.mappings=/3rd-party/jquery-colorpicker/css/colpick.css, /3rd-party/openlayers/openlayers-v3.7.0-dist/ol.css, /3rd-party/openlayers/ol3-google-maps-v0.4/ol3gm.css, /net/geoprism/css/map.css +jawr.css.bundle.dynamic-map-webgl.id=/bundles/webgl-map.css +jawr.css.bundle.dynamic-map-webgl.mappings=/3rd-party/mapbox/mapbox-gl-draw/v0.16.0/mapbox-gl-draw.css, /3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.29.0/dist/mapbox-gl.css, /3rd-party/jquery-colorpicker/css/colpick.css, /net/geoprism/css/map.css + +jawr.css.bundle.dynamic-map-webgl-current.id=/bundles/webgl-map-current.css +jawr.css.bundle.dynamic-map-webgl-current.mappings=/3rd-party/mapbox/mapbox-gl-draw/v0.16.0/mapbox-gl-draw.css, /3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.32.1/dist/mapbox-gl.css, /3rd-party/jquery-colorpicker/css/colpick.css, /net/geoprism/css/map.css + ########################################################################################## # Javascript properties and mappings @@ -58,14 +64,21 @@ jawr.js.bundle.basedir=/ jawr.js.bundle.runway.id=/bundles/runway.js jawr.js.bundle.runway.mappings=/com/runwaysdk/log4js.js, /com/runwaysdk/errorcatch.js, /com/runwaysdk/Util.js, /com/runwaysdk/ClassFramework.js, /com/runwaysdk/Structure.js, /com/runwaysdk/RunwaySDK_Core.js, /com/runwaysdk/RunwaySDK_DTO.js, /com/runwaysdk/RunwaySDK_GIS.js, /com/runwaysdk/RunwaySDK_Inspector.js, /com/runwaysdk/ui/RunwaySDK_UI.js, /net/geoprism/Geodashboard.js +jawr.js.bundle.psd2html.id=/bundles/psd2html.js +jawr.js.bundle.psd2html.mappings=/psd2html.jcf.js + # Main 3rd party bundle jawr.js.bundle.main.id=/bundles/main.js -jawr.js.bundle.main.mappings=/3rd-party/jquery/jquery-1.9.0.min.js, /3rd-party/bootstrap/bootstrap.min.js , /psd2html.jcf.js, /3rd-party/jquery/ui/js/jquery-ui.min.js +jawr.js.bundle.main.mappings=/3rd-party/jquery/jquery-1.9.0.min.js, /3rd-party/bootstrap/bootstrap.min.js, /3rd-party/jquery/ui/js/jquery-ui.min.js # Localization jawr.js.bundle.localization.id=/bundles/localization.js jawr.js.bundle.localization.mappings=/3rd-party/cldrjs-0.4.0/dist/cldr.js, /3rd-party/cldrjs-0.4.0/dist/cldr/event.js, /3rd-party/cldrjs-0.4.0/dist/cldr/supplemental.js, /3rd-party/globalize-1.0.0-alpha.17/dist/globalize.js, /3rd-party/globalize-1.0.0-alpha.17/dist/globalize/number.js, /3rd-party/globalize-1.0.0-alpha.17/dist/globalize/currency.js, /3rd-party/globalize-1.0.0-alpha.17/dist/globalize/date.js, /3rd-party/jquery/ui/js/jquery-ui-i18n.min.js +# ng2 bundle +jawr.js.bundle.ng2-main.id=/bundles/ng2-main.js +jawr.js.bundle.ng2-main.mappings=/3rd-party/jquery/jquery-1.9.0.min.js, /3rd-party/jquery/ui/js/jquery-ui.min.js, /3rd-party/cldrjs-0.4.0/dist/cldr.js, /3rd-party/cldrjs-0.4.0/dist/cldr/event.js, /3rd-party/cldrjs-0.4.0/dist/cldr/supplemental.js, /3rd-party/globalize-1.0.0-alpha.17/dist/globalize.js, /3rd-party/globalize-1.0.0-alpha.17/dist/globalize/number.js, /3rd-party/globalize-1.0.0-alpha.17/dist/globalize/currency.js, /3rd-party/globalize-1.0.0-alpha.17/dist/globalize/date.js, /3rd-party/jquery/ui/js/jquery-ui-i18n.min.js + # Global widgets jawr.js.bundle.widget.id=/bundles/widget.js jawr.js.bundle.widget.mappings=/com/runwaysdk/ui/factory/runway/runway.js, /com/runwaysdk/ui/factory/runway/widget/Widget.js, /com/runwaysdk/ui/factory/runway/list/List.js, /com/runwaysdk/ui/factory/runway/form/Form.js, /com/runwaysdk/ui/factory/runway/contextmenu/ContextMenu.js, /com/runwaysdk/ui/factory/runway/button/Button.js, /com/runwaysdk/ui/factory/jquery/Factory.js, /com/runwaysdk/ui/factory/jquery/Dialog.js, /com/runwaysdk/ui/factory/runway/checkbox/CheckBox.js, /com/runwaysdk/ui/factory/runway/overlay/Overlay.js @@ -79,7 +92,7 @@ jawr.js.bundle.ontology-tree.mappings=/3rd-party/jquerytree/tree.jquery.js jawr.js.bundle.datatablejquery.id=/bundles/datatablejquery.js jawr.js.bundle.datatablejquery.mappings=/3rd-party/jquery/datatables/js/jquery.dataTables.min.js -# Datatable +# Datatablex jawr.js.bundle.datatable.id=/bundles/datatable.js jawr.js.bundle.datatable.mappings=/com/runwaysdk/ui/factory/generic/datatable/datasource/DataSourceIF.js, /com/runwaysdk/ui/factory/generic/datatable/datasource/Events.js, /com/runwaysdk/ui/factory/generic/datatable/datasource/DataSourceFactory.js, /com/runwaysdk/ui/factory/generic/datatable/datasource/BaseServerDataSource.js, /com/runwaysdk/ui/factory/generic/datatable/datasource/ServerDataSource.js, /com/runwaysdk/ui/factory/generic/datatable/DataTable.js, /com/runwaysdk/ui/factory/generic/datatable/Column.js, /com/runwaysdk/ui/factory/generic/datatable/Events.js, /com/runwaysdk/ui/factory/generic/datatable/Row.js, /com/runwaysdk/ui/factory/jquery/datatable/datasource/ServerDataSource.js, /com/runwaysdk/ui/factory/jquery/datatable/datasource/DataSourceFactory.js, /com/runwaysdk/ui/factory/jquery/datatable/DataTable.js, /com/runwaysdk/ui/PollingRequest.js, /com/runwaysdk/ui/datatable/datasource/InstanceQueryDataSource.js, /com/runwaysdk/ui/datatable/datasource/MdMethodDataSource.js @@ -122,6 +135,21 @@ jawr.js.bundle.dynamic-map.mappings=/3rd-party/jquery-colorpicker/js/colpick.js, #/3rd-party/openlayers/openlayers-v3.7.0-dist/ol-debug.js #, /net/geoprism/gis/persist/DashboardMap.js, /net/geoprism/gis/persist/DashboardLayer.js,, /net/geoprism/gis/persist/DashboardLayerView.js, /net/geoprism/gis/persist/DashboardLayerController.js, /net/geoprism/gis/persist/condition/DashboardGreaterThan.js, /net/geoprism/gis/persist/condition/DashboardGreaterThanOrEqual.js, /net/geoprism/gis/persist/condition/DashboardLessThan.js, /net/geoprism/gis/persist/condition/DashboardLessThanOrEqual.js, /net/geoprism/gis/persist/condition/DashboardEqual.js, /net/geoprism/gis/persist/condition/DashboardNotEqual.js, /net/geoprism/DashboardController.js, /net/geoprism/Dashboard.js, /net/geoprism/gis/persist/condition/LocationCondition.js, /net/geoprism/report/ReportItemController.js, /net/geoprism/report/ReportItem.js, /net/geoprism/report/ReportItemView.js + +# WebGL Map +jawr.js.bundle.dynamic-map-webgl.id=/bundles/webgl-map.js +#jawr.js.bundle.dynamic-map.mappings=/3rd-party/jquery-colorpicker/js/colpick.js, /net/geoprism/Form.js, /net/geoprism/FeatureForm.js, /net/geoprism/MapFactoryWebGL.js, /net/geoprism/DynamicMap.js +jawr.js.bundle.dynamic-map-webgl.mappings=/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.29.0/js/mapbox-gl.js, /3rd-party/mapbox/wellknown-5.0/wellknown.js, /3rd-party/mapbox/turf/v_2_0_2/turf.min.js, /3rd-party/jquery-colorpicker/js/colpick.js, /net/geoprism/Form.js, /net/geoprism/FeatureForm.js, /net/geoprism/MapFactoryWebGL.js, /net/geoprism/DynamicMap.js, /net/geoprism/widgets/SimpleMapWebGL.js, /net/geoprism/widgets/EditableMapWebGL.js + + +# WebGL Map current +jawr.js.bundle.dynamic-map-webgl-current.id=/bundles/webgl-map-current.js +#jawr.js.bundle.dynamic-map.mappings=/3rd-party/jquery-colorpicker/js/colpick.js, /net/geoprism/Form.js, /net/geoprism/FeatureForm.js, /net/geoprism/MapFactoryWebGL.js, /net/geoprism/DynamicMap.js +#jawr.js.bundle.dynamic-map-webgl-current.mappings=/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.32.1/js/mapbox-gl.js, /3rd-party/mapbox/wellknown-5.0/wellknown.js, /3rd-party/mapbox/turf/v_2_0_2/turf.min.js, /3rd-party/jquery-colorpicker/js/colpick.js, /net/geoprism/Form.js, /net/geoprism/FeatureForm.js, /net/geoprism/MapFactoryWebGL.js, /net/geoprism/DynamicMap.js, /net/geoprism/widgets/SimpleMapWebGL.js, /net/geoprism/widgets/EditableMapWebGL.js +jawr.js.bundle.dynamic-map-webgl-current.mappings=/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.32.1/js/mapbox-gl.js, /3rd-party/mapbox/wellknown-5.0/wellknown.js, /3rd-party/mapbox/turf/v_2_0_2/turf.min.js, /3rd-party/jquery-colorpicker/js/colpick.js, /net/geoprism/Form.js, /net/geoprism/FeatureForm.js, /net/geoprism/MapFactoryWebGL.js, /net/geoprism/DynamicMap.js, /net/geoprism/widgets/SimpleMapWebGL.js, /net/geoprism/widgets/EditableMapWebGL.js + + + # Geo Entity UI jawr.js.bundle.geoentity.id=/bundles/geoentity.js jawr.js.bundle.geoentity.mappings=/net/geoprism/ontology/GeoEntityTree.js @@ -147,7 +175,7 @@ jawr.js.bundle.dashboard.mappings=/3rd-party/angular/angularjs-1.4.7.min.js, /3r # Data Management UI jawr.js.bundle.management.id=/bundles/management.js -jawr.js.bundle.management.mappings=/3rd-party/angular/angularjs-1.4.7.min.js, /3rd-party/angular-animate/angular-animate.min.js, /3rd-party/angular/angular-route.min.js, /3rd-party/ng-file-upload/ng-file-upload-all.min.js, /net/geoprism/service/WidgetService.js, /net/geoprism/service/RunwayService.js, /net/geoprism/service/DatasetService.js, net/geoprism/service/CategoryService.js, /net/geoprism/service/CategoryService.js, /net/geoprism/service/LocalizationService.js, /net/geoprism/service/LocationService.js, /net/geoprism/service/MapService.js, /net/geoprism/data/DataManagement.js, /net/geoprism/inputs/StyledInputs.js, /net/geoprism/data/importer/DataUploader.js, /net/geoprism/data/browser/DataSet.js, /net/geoprism/service/CategoryIconService.js, /net/geoprism/data/importer/CategoryIcon.js, /net/geoprism/data/browser/CategoryManagement.js, /net/geoprism/data/browser/LocationManagement.js, /net/geoprism/widgets/EditableMap.js +jawr.js.bundle.management.mappings=/3rd-party/mapbox/mapbox-gl-draw/v0.16.0/mapbox-gl-draw.js, /3rd-party/angular/angularjs-1.4.7.min.js, /3rd-party/angular-animate/angular-animate.min.js, /3rd-party/angular/angular-route.min.js, /3rd-party/ng-file-upload/ng-file-upload-all.min.js, /net/geoprism/service/WidgetService.js, /net/geoprism/service/RunwayService.js, /net/geoprism/service/DatasetService.js, net/geoprism/service/CategoryService.js, /net/geoprism/service/CategoryService.js, /net/geoprism/service/LocalizationService.js, /net/geoprism/service/LocationService.js, /net/geoprism/service/WebGLMapService.js, /net/geoprism/data/DataManagement.js, /net/geoprism/inputs/StyledInputs.js, /net/geoprism/data/importer/DataUploader.js, /net/geoprism/data/browser/DataSet.js, /net/geoprism/service/CategoryIconService.js, /net/geoprism/data/importer/CategoryIcon.js, /net/geoprism/data/browser/CategoryManagement.js, /net/geoprism/data/browser/LocationManagement.js # Datasets UI jawr.js.bundle.datasets.id=/bundles/datasets.js @@ -155,4 +183,9 @@ jawr.js.bundle.datasets.mappings=/3rd-party/angular/angularjs-1.4.7.min.js, /3rd # Category Image UI jawr.js.bundle.category.id=/bundles/category-icon.js -jawr.js.bundle.category.mappings=/3rd-party/angular/angularjs-1.4.7.min.js, /3rd-party/ng-file-upload/ng-file-upload-all.min.js, /net/geoprism/service/WidgetService.js, /net/geoprism/service/RunwayService.js, /net/geoprism/service/LocalizationService.js, /net/geoprism/service/CategoryIconService.js, /net/geoprism/inputs/StyledInputs.js, /net/geoprism/data/importer/CategoryIcon.js \ No newline at end of file +jawr.js.bundle.category.mappings=/3rd-party/angular/angularjs-1.4.7.min.js, /3rd-party/ng-file-upload/ng-file-upload-all.min.js, /net/geoprism/service/WidgetService.js, /net/geoprism/service/RunwayService.js, /net/geoprism/service/LocalizationService.js, /net/geoprism/service/CategoryIconService.js, /net/geoprism/inputs/StyledInputs.js, /net/geoprism/data/importer/CategoryIcon.js + +# Prism UI +#jawr.js.bundle.prism.id=/bundles/prism.js +#jawr.js.bundle.prism.mappings=/node_modules/core-js/client/shim.min.js, /node_modules/zone.js/dist/zone.js, /node_modules/reflect-metadata/Reflect.js, /node_modules/systemjs/dist/system.src.js +#jawr.js.bundle.prism.mappings=/dist/polyfills.js, /dist/vendor.js, /dist/app.js diff --git a/geoprism-common/src/main/java/net/geoprism/JSONStringImpl.java b/geoprism-common/src/main/java/net/geoprism/JSONStringImpl.java new file mode 100644 index 000000000..e0e476b53 --- /dev/null +++ b/geoprism-common/src/main/java/net/geoprism/JSONStringImpl.java @@ -0,0 +1,25 @@ +package net.geoprism; + +import org.json.JSONString; + +public class JSONStringImpl implements JSONString +{ + private String json; + + public JSONStringImpl(String json) + { + this.json = json; + } + + @Override + public String toJSONString() + { + return this.json; + } + + @Override + public String toString() + { + return this.json; + } +} diff --git a/geoprism-dhis2/docker-compose.yml b/geoprism-dhis2/docker-compose.yml new file mode 100644 index 000000000..b138b9102 --- /dev/null +++ b/geoprism-dhis2/docker-compose.yml @@ -0,0 +1,26 @@ +version: '2' +services: + database: + container_name: dhis2-database + image: pgracio/dhis2-db:2.25-sierra-leone + environment: + POSTGRES_USER: dhis + POSTGRES_DB: dhis + POSTGRES_PASSWORD: dhis + PG_DATA: /var/lib/postgresql/data/pgdata + restart: always + ports: + - "5432:5432" + web: + container_name: dhis2-web + image: dhis2/dhis2-web:2.25-tomcat7-jre8-latest + environment: + JAVA_OPTS: "-Xmx1024m -Xms4000m" + POSTGRES_DB: dhis + ports: + - "8085:8080" + depends_on: + - database + restart: always + entrypoint: ./wait-for-it.sh -t 0 database:5432 -- + command: catalina.sh run # https://github.com/docker/compose/issues/3140 diff --git a/geoprism-dhis2/notes.txt b/geoprism-dhis2/notes.txt index 6233ba4ed..8635d6da6 100644 --- a/geoprism-dhis2/notes.txt +++ b/geoprism-dhis2/notes.txt @@ -17,6 +17,19 @@ License along with Runway SDK(tm). If not, see . ==== +TODO: +1) Assign program to org units +2) Why can't I see the data in tracker? +3) Synonyms?? + + +Corner Cases: +1) If you create a new category list in our app it won't populate over into DHIS2 +2) Attribute already exists? (all attribute imports fail, transactional) + + + + Notes for DHIS2 devs: 1) Metadata exporter does not respect query/filter criteria: diff --git a/geoprism-dhis2/pom.xml b/geoprism-dhis2/pom.xml index ce07ef38a..24dfd71d6 100644 --- a/geoprism-dhis2/pom.xml +++ b/geoprism-dhis2/pom.xml @@ -108,8 +108,8 @@ 1024m + org.apache.maven.plugins maven-jar-plugin 3.0.2 @@ -153,6 +153,7 @@ + --> diff --git a/geoprism-dhis2/src/main/java/net/geoprism/dhis2/DHIS2BasicConnector.java b/geoprism-dhis2/src/main/java/net/geoprism/dhis2/DHIS2HTTPConnector.java similarity index 81% rename from geoprism-dhis2/src/main/java/net/geoprism/dhis2/DHIS2BasicConnector.java rename to geoprism-dhis2/src/main/java/net/geoprism/dhis2/DHIS2HTTPConnector.java index 36f7997cd..9b50140f4 100644 --- a/geoprism-dhis2/src/main/java/net/geoprism/dhis2/DHIS2BasicConnector.java +++ b/geoprism-dhis2/src/main/java/net/geoprism/dhis2/DHIS2HTTPConnector.java @@ -47,18 +47,17 @@ import net.geoprism.account.ExternalProfile; import net.geoprism.account.OauthServer; +import net.geoprism.dhis2.response.DHIS2ConflictException; -public class DHIS2BasicConnector +public class DHIS2HTTPConnector { - private Logger logger = LoggerFactory.getLogger(DHIS2BasicConnector.class); + private Logger logger = LoggerFactory.getLogger(DHIS2HTTPConnector.class); private HttpClient client; private String serverurl; - private String username; - - private String password; + private String externalUrl; public static final String CLIENT_ID = "geoprism"; @@ -68,11 +67,13 @@ public class DHIS2BasicConnector private String refreshToken; - public DHIS2BasicConnector(String serverurl, String username, String password) + private String username; + + private String password; + + public DHIS2HTTPConnector() { - this.serverurl = serverurl; - this.username = username; - this.password = password; + this.serverurl = "http://127.0.0.1:8085/"; } public String getAccessToken() @@ -85,18 +86,51 @@ public String getServerUrl() return serverurl; } - public void initialize() + public void setServerUrl(String url) + { + this.serverurl = url; + } + + public void setServerExternalUrl(String url) + { + this.externalUrl = url; + } + + public void setCredentials(String username, String password) { - createOauthData(); - logIn(); + this.username = username; + this.password = password; + } + + synchronized public void initialize() + { + this.client = new HttpClient(); + this.accessToken = ExternalProfile.getAccessToken(); + + if (!isInitialized() && username != null && password != null) + { + createOauthData(username, password); + + logIn(username, password); + } + + if (!isInitialized()) + { + throw new RuntimeException("Unable to log into DHIS2."); + } + } + + public boolean isInitialized() + { + return client != null && accessToken != null; } @Transaction - public void createOauthData() + public void createOauthData(String username, String password) { try { - createOauthClient(); + createOauthClient(username, password); } catch (DHIS2ConflictException e) { @@ -114,11 +148,11 @@ public void createOauthData() OauthServer oauth = new OauthServer(); oauth.setKeyName("dhis2-local"); oauth.getDisplayLabel().setValue("DHIS2"); - oauth.setAuthorizationLocation("http://127.0.0.1:8085/uaa/oauth/authorize"); - oauth.setTokenLocation("http://127.0.0.1:8085/uaa/oauth/token"); - oauth.setProfileLocation("http://127.0.0.1:8085/api/me"); - oauth.setClientId(DHIS2BasicConnector.CLIENT_ID); - oauth.setSecretKey(DHIS2BasicConnector.SECRET); + oauth.setAuthorizationLocation(externalUrl + "/uaa/oauth/authorize"); + oauth.setTokenLocation(externalUrl + "/uaa/oauth/token"); + oauth.setProfileLocation(externalUrl + "/api/me"); + oauth.setClientId(DHIS2HTTPConnector.CLIENT_ID); + oauth.setSecretKey(DHIS2HTTPConnector.SECRET); oauth.setServerType("DHIS2"); oauth.apply(); } @@ -141,17 +175,12 @@ public void createOauthData() * Uses the DHIS2 REST API to register a new OAuth configuration for Geoprism */ // curl -X POST -H "Content-Type: application/json" -d '{ "name" : "OAuth2 Demo Client", "cid" : "demo", "secret" : "1e6db50c-0fee-11e5-98d0-3c15c2c6caf6", "grantTypes" : [ "password", "refresh_token", "authorization_code" ], "redirectUris" : [ "http://www.example.org" ]}' -u admin:district - private void createOauthClient() + private void createOauthClient(String username, String password) { - if (this.accessToken != null || ExternalProfile.getAccessToken() != null) - { - return; - } - - this.client = new HttpClient(); + HttpClient client = new HttpClient(); client.getParams().setAuthenticationPreemptive(true); - Credentials defaultcreds = new UsernamePasswordCredentials(this.username, this.password); + Credentials defaultcreds = new UsernamePasswordCredentials(username, password); client.getState().setCredentials(AuthScope.ANY, defaultcreds); try @@ -164,7 +193,7 @@ private void createOauthClient() post.setRequestEntity(new StringRequestEntity(body, null, null)); JSONObject response = new JSONObject(); - int statusCode = httpRequest(post, response); + int statusCode = httpRequest(client, post, response); if (statusCode == HttpStatus.SC_OK || statusCode == HttpStatus.SC_CREATED) { @@ -191,20 +220,12 @@ else if (statusCode == HttpStatus.SC_CONFLICT) { throw new RuntimeException(e); } - - this.client = new HttpClient(); } // curl -X POST -H "Accept: application/json" -u demo:$SECRET $SERVER/uaa/oauth/token -d grant_type=password -d username=admin -d password=district - public void logIn() + public void logIn(String username, String password) { - this.client = new HttpClient(); - this.accessToken = ExternalProfile.getAccessToken(); - - if (this.accessToken != null) - { - return; - } + HttpClient client = new HttpClient(); client.getParams().setAuthenticationPreemptive(true); Credentials defaultcreds = new UsernamePasswordCredentials("geoprism", SECRET); @@ -220,7 +241,7 @@ public void logIn() post.addParameter("format", "json"); JSONObject json = new JSONObject(); - int statusCode = httpRequest(post, json); + int statusCode = httpRequest(client, post, json); if (statusCode == HttpStatus.SC_OK) { @@ -244,12 +265,15 @@ public void logIn() { throw new RuntimeException(e); } - - this.client = new HttpClient(); } public JSONObject httpGet(String url, NameValuePair[] params) { + if (!isInitialized()) + { + initialize(); + } + GetMethod get = new GetMethod(this.getServerUrl() + url); get.setRequestHeader("Authorization", "Bearer " + this.getAccessToken()); @@ -258,7 +282,7 @@ public JSONObject httpGet(String url, NameValuePair[] params) get.setQueryString(params); JSONObject response = new JSONObject(); - int statusCode = this.httpRequest(get, response); + int statusCode = this.httpRequest(this.client, get, response); if (statusCode != HttpStatus.SC_OK) { @@ -270,6 +294,11 @@ public JSONObject httpGet(String url, NameValuePair[] params) public JSONObject httpPost(String url, String body) { + if (!isInitialized()) + { + initialize(); + } + try { PostMethod post = new PostMethod(this.serverurl + url); @@ -280,7 +309,7 @@ public JSONObject httpPost(String url, String body) post.setRequestEntity(new StringRequestEntity(body, null, null)); JSONObject response = new JSONObject(); - int statusCode = httpRequest(post, response); + int statusCode = httpRequest(this.client, post, response); if (statusCode != HttpStatus.SC_OK && statusCode != HttpStatus.SC_CREATED) { @@ -295,7 +324,7 @@ public JSONObject httpPost(String url, String body) } } - public int httpRequest(HttpMethod method, JSONObject response) + public int httpRequest(HttpClient client, HttpMethod method, JSONObject response) { String sResponse = null; try @@ -303,7 +332,7 @@ public int httpRequest(HttpMethod method, JSONObject response) this.logger.info("Sending request to " + method.getURI()); // Execute the method. - int statusCode = this.client.executeMethod(method); + int statusCode = client.executeMethod(method); // Follow Redirects if (statusCode == HttpStatus.SC_MOVED_TEMPORARILY || statusCode == HttpStatus.SC_MOVED_PERMANENTLY || statusCode == HttpStatus.SC_TEMPORARY_REDIRECT || statusCode == HttpStatus.SC_SEE_OTHER) @@ -311,7 +340,7 @@ public int httpRequest(HttpMethod method, JSONObject response) this.logger.info("Redirected [" + statusCode + "] to [" + method.getResponseHeader("location").getValue() + "]."); method.setURI(new URI(method.getResponseHeader("location").getValue(), true, method.getParams().getUriCharset())); method.releaseConnection(); - return httpRequest(method, response); + return httpRequest(client, method, response); } // TODO : we might blow the memory stack here, read this as a stream somehow if possible. diff --git a/geoprism-dhis2/src/main/java/net/geoprism/dhis2/exporter/DHIS2DataExporter.java b/geoprism-dhis2/src/main/java/net/geoprism/dhis2/exporter/DHIS2DataExporter.java index 220ab572e..b19ed88e0 100644 --- a/geoprism-dhis2/src/main/java/net/geoprism/dhis2/exporter/DHIS2DataExporter.java +++ b/geoprism-dhis2/src/main/java/net/geoprism/dhis2/exporter/DHIS2DataExporter.java @@ -26,19 +26,25 @@ import org.apache.commons.cli.Option; import org.apache.commons.cli.Options; import org.apache.commons.cli.ParseException; +import org.apache.commons.lang.StringUtils; import com.runwaysdk.configuration.ConfigurationManager; import com.runwaysdk.session.Request; import com.runwaysdk.system.metadata.MdBusiness; +import com.runwaysdk.system.metadata.MdClass; +import net.geoprism.account.ExternalProfile; import net.geoprism.configuration.GeoprismConfigurationResolver; +import net.geoprism.data.GeoprismDatasetExporterIF; import net.geoprism.data.etl.TargetBuilder; -import net.geoprism.dhis2.DHIS2BasicConnector; +import net.geoprism.dhis2.DHIS2HTTPConnector; +import net.geoprism.dhis2.response.OAuthLoginRequiredException; -public class DHIS2DataExporter +public class DHIS2DataExporter implements GeoprismDatasetExporterIF { - private DHIS2BasicConnector dhis2; + private DHIS2HTTPConnector dhis2; + @Request public static void main(String[] args) { CommandLineParser parser = new DefaultParser(); @@ -47,6 +53,7 @@ public static void main(String[] args) options.addOption(Option.builder("username").hasArg().argName("username").longOpt("username").desc("The username of the root (admin) DHIS2 user.").required().build()); options.addOption(Option.builder("password").hasArg().argName("password").longOpt("password").desc("The password for the root (admin) DHIS2 user.").required().build()); options.addOption(Option.builder("appcfgPath").hasArg().argName("appcfgPath").longOpt("appcfgPath").desc("An absolute path to the external configuration directory for this geoprism app.").optionalArg(true).build()); + options.addOption(Option.builder("dataset").hasArg().argName("dataset").longOpt("dataset").desc("The name of the dataset to export.").required().build()); try { CommandLine line = parser.parse( options, args ); @@ -55,6 +62,7 @@ public static void main(String[] args) String username = line.getOptionValue("username"); String password = line.getOptionValue("password"); String appcfgPath = line.getOptionValue("appcfgPath"); + String dataset = StringUtils.capitalize(line.getOptionValue("dataset").toLowerCase()); if (url == null) { @@ -66,7 +74,10 @@ public static void main(String[] args) resolver.setExternalConfigDir(new File(appcfgPath)); } - new DHIS2DataExporter(url, username, password).exportToTrackerInRequest(TargetBuilder.PACKAGE_NAME + ".LaborForceByState2015"); + MdBusiness mdBiz = MdBusiness.getMdBusiness(TargetBuilder.PACKAGE_NAME + "." + dataset); + + DHIS2DataExporter exporter = new DHIS2DataExporter(); + exporter.exportWithCredentials(mdBiz, url, username, password); } catch (ParseException e) { @@ -74,27 +85,31 @@ public static void main(String[] args) } } - public DHIS2DataExporter(String url, String username, String password) - { - dhis2 = new DHIS2BasicConnector(url, username, password); - } - - @Request - public void exportToTrackerInRequest(String mdbiz) + // Our constructor must be 0 arguments because it conforms to Java service loader paradigm. + public DHIS2DataExporter() { - exportToTracker(MdBusiness.getMdBusiness(mdbiz)); + dhis2 = new DHIS2HTTPConnector(); } - public void exportToTracker(MdBusiness mdbiz) + public void exportWithCredentials(MdClass mdClass, String url, String username, String password) { - dhis2.initialize(); - exportMetadata(mdbiz); - // exportData(mdbiz); + dhis2.setServerUrl(url); + dhis2.setCredentials(username, password); + + MdBusinessExporter exporter = new MdBusinessExporter((MdBusiness) mdClass, dhis2); + exporter.exportToTracker(); } - public void exportMetadata(MdBusiness mdbiz) + @Override + public void xport(MdClass mdClass) { - MdBusinessExporter exporter = new MdBusinessExporter(mdbiz, dhis2); + if (ExternalProfile.getAccessToken() == null) + { + OAuthLoginRequiredException ex = new OAuthLoginRequiredException(); + throw ex; + } + + MdBusinessExporter exporter = new MdBusinessExporter((MdBusiness) mdClass, dhis2); exporter.exportToTracker(); } } diff --git a/geoprism-dhis2/src/main/java/net/geoprism/dhis2/exporter/MdBusinessExporter.java b/geoprism-dhis2/src/main/java/net/geoprism/dhis2/exporter/MdBusinessExporter.java index 4f45d42cb..df591b365 100644 --- a/geoprism-dhis2/src/main/java/net/geoprism/dhis2/exporter/MdBusinessExporter.java +++ b/geoprism-dhis2/src/main/java/net/geoprism/dhis2/exporter/MdBusinessExporter.java @@ -18,12 +18,19 @@ */ package net.geoprism.dhis2.exporter; +import java.text.SimpleDateFormat; +import java.util.Date; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import org.apache.commons.httpclient.NameValuePair; import org.apache.commons.lang.ArrayUtils; +import org.apache.commons.lang.StringUtils; import org.json.JSONArray; import org.json.JSONObject; import org.slf4j.Logger; @@ -34,13 +41,21 @@ import com.runwaysdk.constants.MdAttributeBooleanInfo; import com.runwaysdk.query.OIterator; import com.runwaysdk.query.QueryFactory; +import com.runwaysdk.system.gis.geo.GeoEntity; import com.runwaysdk.system.metadata.MdAttribute; import com.runwaysdk.system.metadata.MdAttributeConcreteDTO; +import com.runwaysdk.system.metadata.MdAttributeReference; import com.runwaysdk.system.metadata.MdBusiness; import com.runwaysdk.system.metadata.MdBusinessDTO; +import com.runwaysdk.system.metadata.MdClass; -import net.geoprism.dhis2.DHIS2BasicConnector; -import net.geoprism.dhis2.ErrorProcessor; +import net.geoprism.dhis2.DHIS2HTTPConnector; +import net.geoprism.dhis2.response.DHIS2DuplicateAttributeException; +import net.geoprism.dhis2.response.DHIS2DuplicateDataException; +import net.geoprism.dhis2.response.DHIS2ResponseProcessor; +import net.geoprism.dhis2.response.DHIS2UnexpectedResponseException; +import net.geoprism.ontology.Classifier; +import net.geoprism.ontology.ClassifierSynonym; /** * This class is responsible for exporting an MdBusiness to DHIS2. @@ -55,7 +70,7 @@ public class MdBusinessExporter protected MdBusinessToTrackerJson converter; - protected DHIS2BasicConnector dhis2; + protected DHIS2HTTPConnector dhis2; private String trackedEntityId; @@ -67,24 +82,28 @@ public class MdBusinessExporter private final int pageSize = 1000; - public MdBusinessExporter(MdBusiness mdbiz, DHIS2BasicConnector dhis2) + public MdBusinessExporter(MdBusiness mdbiz, DHIS2HTTPConnector dhis2) { this.mdbiz = mdbiz; this.converter = new MdBusinessToTrackerJson(mdbiz); this.dhis2 = dhis2; } + public void xport(MdClass mdClass) + { + + } + public void exportToTracker() { createTrackedEntity(); createTrackedEntityAttributes(); createProgramTrackedEntityAttributes(); createProgram(); - createTrackedEntityInstances(); - // registerTrackedEntityInstances(); + createAndEnrollTrackedEntityInstances(); } - protected void createTrackedEntityInstances() + protected void createAndEnrollTrackedEntityInstances() { List mdAttrs = mdbiz.getAllAttribute().getAll(); @@ -111,26 +130,73 @@ protected void createTrackedEntityInstances() trackedEntityInstance.put("trackedEntity", trackedEntityId); + GeoEntity orgUnit = null; + JSONArray jAttributes = new JSONArray(); for (MdAttribute mdAttr : mdAttrs) { if (mdAttr.getValue(MdAttributeConcreteDTO.SYSTEM).equals(MdAttributeBooleanInfo.FALSE) && - !ArrayUtils.contains(MdBusinessExporter.skipAttrs, mdAttr.getValue(MdAttributeConcreteDTO.ATTRIBUTENAME)) && - trackedEntityAttributeIds.containsKey(mdAttr.getId()) + !ArrayUtils.contains(MdBusinessExporter.skipAttrs, mdAttr.getValue(MdAttributeConcreteDTO.ATTRIBUTENAME)) ) { - String attrName = mdAttr.getAttributeName(); - JSONObject jAttribute = new JSONObject(); + String attrName = mdAttr.getAttributeName(); jAttribute.put("attribute", trackedEntityAttributeIds.get(mdAttr.getId())); - jAttribute.put("value", biz.getValue(attrName)); + + if (mdAttr instanceof MdAttributeReference) + { + String refId = biz.getValue(attrName); + if (!refId.equals("")) + { + MdBusiness reference = ((MdAttributeReference) mdAttr).getMdBusiness(); + + if (reference.definesType().equals(GeoEntity.CLASS)) + { + orgUnit = GeoEntity.get(refId); + } + else if (reference.definesType().equals(Classifier.CLASS)) + { + Classifier classy = Classifier.get(refId); + jAttribute.put("value", classy.getDisplayLabel().getValue()); + } + else if (reference.definesType().equals(ClassifierSynonym.CLASS)) + { +// System.out.println("TODO : We just hit a ClassifierSynonym reference in tei."); + } + } + } + else if (trackedEntityAttributeIds.containsKey(mdAttr.getId())) + { + jAttribute.put("value", biz.getValue(attrName)); + } + + if (jAttribute.has("value")) + { + jAttributes.put(jAttribute); + } } } - trackedEntityInstance.put("attributes", jAttributes); -// trackedEntityInstance.put("orgUnit", value); - - trackedEntityInstances.put(trackedEntityInstance); + if (orgUnit != null) + { + trackedEntityInstance.put("attributes", jAttributes); + + JSONArray enrollments = new JSONArray(); + JSONObject enrollment = new JSONObject(); + enrollment.put("orgUnit", orgUnit.getGeoId()); + enrollment.put("program", programId); + String date = new SimpleDateFormat("yyyy-MM-dd").format(new Date()); + enrollment.put("incidentDate", date); + enrollment.put("enrollmentDate", date); + enrollments.put(enrollment); + trackedEntityInstance.put("enrollments", enrollments); + + // TODO : The geoId contains the DHIS2 id, and not the actual geoid. We do this because it has to be referenced when we export and there's no other place to save the DHIS2 id. + // If we make this a real product perhaps we need to store a map from runway id to dhis2 id in some table somewhere. + trackedEntityInstance.put("orgUnit", orgUnit.getGeoId()); + + trackedEntityInstances.put(trackedEntityInstance); + } } } finally @@ -141,7 +207,7 @@ protected void createTrackedEntityInstances() jsonMetadata.put("trackedEntityInstances", trackedEntityInstances); JSONObject response = dhis2.httpPost("api/25/trackedEntityInstances", jsonMetadata.toString()); - ErrorProcessor.validateImportSummaryResponse(response); + DHIS2ResponseProcessor.validateImportSummaryResponse(response); page = page + 1; } @@ -156,7 +222,7 @@ protected void createTrackedEntity() jsonMetadata.put("trackedEntities", trackedEntities); JSONObject response = dhis2.httpPost("api/25/metadata", jsonMetadata.toString()); - ErrorProcessor.validateTypeReportResponse(response); + DHIS2ResponseProcessor.validateTypeReportResponse(response, false); getTrackedEntityId(); } @@ -194,10 +260,47 @@ protected void createTrackedEntityAttributes() { JSONObject jsonMetadata = new JSONObject(); - jsonMetadata.put("trackedEntityAttributes", converter.getTrackedEntityAttributes()); + JSONArray trackedEntityAttributes = converter.getTrackedEntityAttributes(); + + jsonMetadata.put("trackedEntityAttributes", trackedEntityAttributes); JSONObject response = dhis2.httpPost("api/25/metadata", jsonMetadata.toString()); - ErrorProcessor.validateTypeReportResponse(response); + + try + { + DHIS2ResponseProcessor.validateTypeReportResponse(response, true); + } + catch (DHIS2DuplicateDataException e) + { + List msgs = e.getErrorMessages(); + + Set attrNames = new HashSet(); + for (String msg : msgs) + { + // Property `name` with value `Gender` on object Gender [XWImNYPqAIz] (TrackedEntityAttribute) already exists on object cejWyOfXge6. + Pattern p = Pattern.compile("Property `(.*)`.*with value `(.*)` on object .*"); + Matcher m = p.matcher(msg); + + if (m.find()) + { + String attrName = m.group(2); + + if (attrName != null) + { + attrNames.add(attrName); + } + } + else + { + // If we get some weird message back that doesn't match our regex + throw new DHIS2UnexpectedResponseException("Unexpected response [" + response + "]"); + } + } + + DHIS2DuplicateAttributeException ex = new DHIS2DuplicateAttributeException(); + ex.setDhis2Attrs(StringUtils.join(attrNames, ", ")); + throw ex; + } getTrackedEntityAttributeIds(); } @@ -238,8 +341,7 @@ protected void getTrackedEntityAttributeIds() { if (mdAttr.getValue(MdAttributeConcreteDTO.SYSTEM).equals(MdAttributeBooleanInfo.FALSE) && !ArrayUtils.contains(skipAttrs, mdAttr.getValue(MdAttributeConcreteDTO.ATTRIBUTENAME)) && - TEA.getString("name").equals(mdAttr.getDisplayLabel().getValue() - ) + TEA.getString("name").equals(mdAttr.getDisplayLabel().getValue()) ) { trackedEntityAttributeIds.put(mdAttr.getId(), TEA.getString("id")); @@ -265,7 +367,7 @@ protected void createProgramTrackedEntityAttributes() jsonMetadata.put("programTrackedEntityAttributes", converter.getProgramTrackedEntityAttributes(programId, trackedEntityAttributeIds)); JSONObject response = dhis2.httpPost("api/25/metadata", jsonMetadata.toString()); - ErrorProcessor.validateTypeReportResponse(response); + DHIS2ResponseProcessor.validateTypeReportResponse(response, false); getProgramTrackedEntityAttributeIds(); } @@ -366,7 +468,7 @@ protected void createProgram() jsonMetadata.put("programs", programs); JSONObject response = dhis2.httpPost("api/25/metadata", jsonMetadata.toString()); - ErrorProcessor.validateTypeReportResponse(response); + DHIS2ResponseProcessor.validateTypeReportResponse(response, false); getProgramId(); } diff --git a/geoprism-dhis2/src/main/java/net/geoprism/dhis2/exporter/MdBusinessToTrackerJson.java b/geoprism-dhis2/src/main/java/net/geoprism/dhis2/exporter/MdBusinessToTrackerJson.java index 5258069e9..112d6a8ea 100644 --- a/geoprism-dhis2/src/main/java/net/geoprism/dhis2/exporter/MdBusinessToTrackerJson.java +++ b/geoprism-dhis2/src/main/java/net/geoprism/dhis2/exporter/MdBusinessToTrackerJson.java @@ -25,9 +25,13 @@ import org.json.JSONArray; import org.json.JSONObject; +import com.runwaysdk.business.ontology.Term; import com.runwaysdk.constants.MdAttributeBooleanInfo; +import com.runwaysdk.dataaccess.metadata.MdAttributeTermDAO; import com.runwaysdk.query.OIterator; import com.runwaysdk.system.gis.geo.GeoEntity; +import com.runwaysdk.system.gis.geo.GeoEntityBase; +import com.runwaysdk.system.gis.geo.LocatedIn; import com.runwaysdk.system.gis.metadata.MdAttributeGeometry; import com.runwaysdk.system.metadata.MdAttribute; import com.runwaysdk.system.metadata.MdAttributeBoolean; @@ -39,10 +43,12 @@ import com.runwaysdk.system.metadata.MdAttributeInteger; import com.runwaysdk.system.metadata.MdAttributeLong; import com.runwaysdk.system.metadata.MdAttributeReference; -import com.runwaysdk.system.metadata.MdAttributeTerm; import com.runwaysdk.system.metadata.MdAttributeText; import com.runwaysdk.system.metadata.MdBusiness; +import net.geoprism.ontology.Classifier; +import net.geoprism.ontology.ClassifierSynonym; + /** * Responsible for exporting an MdBusiness directly to DHIS2 Tracker * @@ -94,15 +100,22 @@ public JSONArray getTrackedEntityAttributes() JSONObject jsonAttr = new JSONObject(); jsonAttr.put("name", mdAttr.getDisplayLabel().getValue()); jsonAttr.put("shortName", mdAttr.getDisplayLabel().getValue()); + jsonAttr.put("aggregationType", "NONE"); // Find the corresponding DHIS2 attribute type from our Runway MdAttribute types - String valueType = "TEXT"; + String valueType = null; + if (mdAttr instanceof MdAttributeDate) { valueType = "DATE"; } else if (mdAttr instanceof MdAttributeCharacter) { + if (mdAttr.getAttributeName().endsWith("FeatureId")) + { + continue; + } + valueType = "TEXT"; } else if (mdAttr instanceof MdAttributeText) @@ -121,26 +134,42 @@ else if (mdAttr instanceof MdAttributeDouble || mdAttr instanceof MdAttributeFlo { valueType = "NUMBER"; } - else if (mdAttr instanceof MdAttributeTerm) - { - // throw new UnsupportedOperationException(); - } else if (mdAttr instanceof MdAttributeReference) { MdBusiness reference = ((MdAttributeReference) mdAttr).getMdBusiness(); if (reference.definesType().equals(GeoEntity.CLASS)) { - valueType = "ORGANISATION_UNIT"; +// valueType = "ORGANISATION_UNIT"; + // We are skipping this one because the orgUnit is not set as an attribute, it has its own separate requirements + } + else if (reference.definesType().equals(Classifier.CLASS)) + { + valueType = "TEXT"; + + JSONObject optionSet = new JSONObject(); + + Classifier root = Classifier.findClassifierRoot(MdAttributeTermDAO.get(mdAttr.getId())); + optionSet.put("id", root.getClassifierId()); + + jsonAttr.put("optionSet", optionSet); + } + else if (reference.definesType().equals(ClassifierSynonym.CLASS)) + { +// System.out.println("TODO : We just hit a ClassifierSynonym reference in metadata."); } } else if (mdAttr instanceof MdAttributeGeometry) { valueType = "COORDINATE"; + continue; // TODO ? } - jsonAttr.put("valueType", valueType); - jsonAttrs.put(jsonAttr); + if (valueType != null) + { + jsonAttr.put("valueType", valueType); + jsonAttrs.put(jsonAttr); + } } } @@ -155,7 +184,8 @@ public JSONArray getProgramTrackedEntityAttributes(String programId, Map units.put(new JSONObject().put("id", ((GeoEntity) term).getGeoId()))); + program.put("organisationUnits", units); + JSONArray attrs = new JSONArray(); if (attributeIds != null) { diff --git a/geoprism-dhis2/src/main/java/net/geoprism/dhis2/importer/DHIS2DataImporter.java b/geoprism-dhis2/src/main/java/net/geoprism/dhis2/importer/DHIS2DataImporter.java index 42de82252..104a8f15b 100644 --- a/geoprism-dhis2/src/main/java/net/geoprism/dhis2/importer/DHIS2DataImporter.java +++ b/geoprism-dhis2/src/main/java/net/geoprism/dhis2/importer/DHIS2DataImporter.java @@ -19,7 +19,6 @@ package net.geoprism.dhis2.importer; import java.io.File; -import java.sql.Savepoint; import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.CommandLineParser; @@ -31,8 +30,10 @@ import org.json.JSONArray; import org.json.JSONObject; +import com.runwaysdk.business.ontology.Term; import com.runwaysdk.configuration.ConfigurationManager; -import com.runwaysdk.dataaccess.DuplicateDataException; +import com.runwaysdk.constants.MdAttributeLocalInfo; +import com.runwaysdk.dataaccess.BusinessDAO; import com.runwaysdk.dataaccess.database.Database; import com.runwaysdk.dataaccess.transaction.Transaction; import com.runwaysdk.gis.geometry.GeometryHelper; @@ -43,10 +44,10 @@ import com.runwaysdk.system.gis.geo.Universal; import com.vividsolutions.jts.geom.GeometryFactory; -import net.geoprism.account.OauthServer; import net.geoprism.configuration.GeoprismConfigurationResolver; -import net.geoprism.dhis2.DHIS2BasicConnector; -import net.geoprism.dhis2.DHIS2ConflictException; +import net.geoprism.dhis2.DHIS2HTTPConnector; +import net.geoprism.ontology.Classifier; +import net.geoprism.ontology.ClassifierIsARelationship; /** * This class is the main entrypoint for all DHIS2 data importing. Run the main method in this class to kick off a data import. @@ -56,7 +57,7 @@ */ public class DHIS2DataImporter { - private DHIS2BasicConnector dhis2; + private DHIS2HTTPConnector dhis2; private GeometryFactory geometryFactory; @@ -69,6 +70,7 @@ public static void main(String[] args) CommandLineParser parser = new DefaultParser(); Options options = new Options(); options.addOption(Option.builder("url").hasArg().argName("url").longOpt("url").desc("URL of the DHIS2 server to connect to, including the port. Defaults to: http://127.0.0.1:8085/").optionalArg(true).build()); + options.addOption(Option.builder("externalUrl").hasArg().argName("externalUrl").longOpt("externalUrl").desc("External URL of the DHIS2 server to connect to, including the port. Defaults to: http://127.0.0.1:8085/").optionalArg(true).build()); options.addOption(Option.builder("username").hasArg().argName("username").longOpt("username").desc("The username of the root (admin) DHIS2 user.").required().build()); options.addOption(Option.builder("password").hasArg().argName("password").longOpt("password").desc("The password for the root (admin) DHIS2 user.").required().build()); options.addOption(Option.builder("appcfgPath").hasArg().argName("appcfgPath").longOpt("appcfgPath").desc("An absolute path to the external configuration directory for this geoprism app.").optionalArg(true).build()); @@ -77,6 +79,7 @@ public static void main(String[] args) CommandLine line = parser.parse( options, args ); String url = line.getOptionValue("url"); + String externalUrl = line.getOptionValue("externalUrl"); String username = line.getOptionValue("username"); String password = line.getOptionValue("password"); String appcfgPath = line.getOptionValue("appcfgPath"); @@ -85,13 +88,17 @@ public static void main(String[] args) { url = "http://127.0.0.1:8085/"; } + if (externalUrl == null) + { + externalUrl = url; + } if (appcfgPath != null) { GeoprismConfigurationResolver resolver = (GeoprismConfigurationResolver) ConfigurationManager.Singleton.INSTANCE.getConfigResolver(); resolver.setExternalConfigDir(new File(appcfgPath)); } - new DHIS2DataImporter(url, username, password).importAll(); + new DHIS2DataImporter(url, externalUrl, username, password).importAll(); } catch (ParseException e) { @@ -99,12 +106,15 @@ public static void main(String[] args) } } - public DHIS2DataImporter(String url, String username, String password) + public DHIS2DataImporter(String url, String externalUrl, String username, String password) { this.geometryFactory = new GeometryFactory(); this.geometryHelper = new GeometryHelper(); - dhis2 = new DHIS2BasicConnector(url, username, password); + dhis2 = new DHIS2HTTPConnector(); + dhis2.setServerUrl(url); + dhis2.setServerExternalUrl(externalUrl); + dhis2.setCredentials(username, password); } @Request @@ -116,10 +126,46 @@ private void importAll() @Transaction private void importAllInTransaction() { - dhis2.initialize(); + deleteAll(); + importOrgUnitLevels(); importOrgUnits(); buildAllpaths(); + + importOptionSets(); + importOptions(); + importOptionSetRelationships(); + } + + // TODO: Create or Update is a lot harder than just deleting everything + private void deleteAll() + { + Database.executeStatement("truncate geo_entity;"); + Database.executeStatement("truncate geo_entity_problem;"); + Database.executeStatement("truncate universal;"); + Database.executeStatement("truncate located_in;"); + Database.executeStatement("truncate allowed_in;"); + Database.executeStatement("truncate classifier;"); + Database.executeStatement("truncate classifier_is_a_relationship;"); + + Universal rootUni = new Universal(); + rootUni.getDisplayLabel().setValue("ROOT"); + rootUni.setUniversalId("ROOT"); + rootUni.getDescription().setValue("ROOT"); + rootUni.apply(); + + GeoEntity root = new GeoEntity(); + root.getDisplayLabel().setValue("ROOT"); + root.setGeoId("ROOT"); + root.setUniversal(rootUni); + root.apply(); + + BusinessDAO rootC = BusinessDAO.newInstance("net.geoprism.ontology.Classifier"); + rootC.setStructValue(Classifier.DISPLAYLABEL, MdAttributeLocalInfo.DEFAULT_LOCALE, "ROOT"); + rootC.setValue(Classifier.CLASSIFIERID, "ROOT"); + rootC.setValue(Classifier.CLASSIFIERPACKAGE, "ROOT"); + rootC.setValue(Classifier.KEYNAME, Term.ROOT_KEY); + rootC.apply(); } public OrgUnitLevelJsonToUniversal getUniversalByLevel(int level) @@ -131,12 +177,12 @@ private void buildAllpaths() { Universal.getStrategy().reinitialize(AllowedIn.CLASS); GeoEntity.getStrategy().reinitialize(LocatedIn.CLASS); -// Classifier.getStrategy().reinitialize(ClassifierIsARelationship.CLASS); + Classifier.getStrategy().reinitialize(ClassifierIsARelationship.CLASS); } private void importOrgUnitLevels() { - // curl -H "Accept: application/json" -u admin:district "http://localhost:8085/api/metadata?assumeTrue=false&organisationUnitLevels=true" + // curl -H "Accept: application/json" -u admin:district "http://localhost:8085/api/metadata.json?assumeTrue=false&organisationUnitLevels=true" JSONObject response = dhis2.httpGet("api/25/metadata", new NameValuePair[] { new NameValuePair("assumeTrue", "false"), new NameValuePair("organisationUnitLevels", "true") @@ -164,7 +210,7 @@ private void importOrgUnitLevels() private void importOrgUnits() { - // curl -H "Accept: application/json" -u admin:district "http://localhost:8085/api/metadata?assumeTrue=false&organisationUnits=true" + // curl -H "Accept: application/json" -u admin:district "http://localhost:8085/api/metadata.json?assumeTrue=false&organisationUnits=true" JSONObject response = dhis2.httpGet("api/25/metadata", new NameValuePair[] { new NameValuePair("assumeTrue", "false"), new NameValuePair("organisationUnits", "true") @@ -191,13 +237,74 @@ private void importOrgUnits() converter.applyLocatedIn(); } + + + // TODO : The geoId contains the DHIS2 id, and not the actual geoid. We do this because it has to be referenced when we export and there's no other place to save the DHIS2 id. + // The OrgUnit parent reference is done by a DIHS2 id. In order to find the parent, we first set the GeoId to the DHIS2 internal id. Now we're swapping out those DHIS2 internal ids with geoids. // This could also be solved with a hashmap from {DHIS2 id -> geoId} to help us find the parent, but in the interest of saving memory I decided to loop through it again and hammer the processor instead. - for (int i = 0; i < converters.length; ++i) +// for (int i = 0; i < converters.length; ++i) +// { +// OrgUnitJsonToGeoEntity converter = converters[i]; +// +// converter.swapGeoId(); +// } + } + + private void importOptionSets() + { + // curl -H "Accept: application/json" -u admin:district "http://localhost:8085/api/metadata.json?assumeTrue=false&categories=true" + JSONObject response = dhis2.httpGet("api/25/metadata", new NameValuePair[] { + new NameValuePair("assumeTrue", "false"), + new NameValuePair("optionSets", "true") + }); + + // Create Classifiers from OptionSets + JSONArray units = response.getJSONArray("optionSets"); + for (int i = 0; i < units.length(); ++i) { - OrgUnitJsonToGeoEntity converter = converters[i]; + JSONObject unit = units.getJSONObject(i); + + OptionSetJsonToClassifier converter = new OptionSetJsonToClassifier(unit); + converter.apply(); + } + } + + private void importOptions() + { + // curl -H "Accept: application/json" -u admin:district "http://localhost:8085/api/metadata.json?assumeTrue=false&options=true" + JSONObject response = dhis2.httpGet("api/25/metadata", new NameValuePair[] { + new NameValuePair("assumeTrue", "false"), + new NameValuePair("options", "true") + }); + + // Create Classifiers from Options + JSONArray units = response.getJSONArray("options"); + for (int i = 0; i < units.length(); ++i) + { + JSONObject unit = units.getJSONObject(i); + + OptionJsonToClassifier converter = new OptionJsonToClassifier(unit); + converter.apply(); + } + } + + private void importOptionSetRelationships() + { + // curl -H "Accept: application/json" -u admin:district "http://localhost:8085/api/metadata.json?assumeTrue=false&categories=true" + JSONObject response = dhis2.httpGet("api/25/metadata", new NameValuePair[] { + new NameValuePair("assumeTrue", "false"), + new NameValuePair("optionSets", "true") + }); + + // Create Relationships + JSONArray units = response.getJSONArray("optionSets"); + for (int i = 0; i < units.length(); ++i) + { + JSONObject unit = units.getJSONObject(i); - converter.swapGeoId(); + OptionSetJsonToClassifier converter = new OptionSetJsonToClassifier(unit); + converter.applyCategoryRelationships(); } } } diff --git a/geoprism-dhis2/src/main/java/net/geoprism/dhis2/importer/OptionJsonToClassifier.java b/geoprism-dhis2/src/main/java/net/geoprism/dhis2/importer/OptionJsonToClassifier.java new file mode 100644 index 000000000..df9115b16 --- /dev/null +++ b/geoprism-dhis2/src/main/java/net/geoprism/dhis2/importer/OptionJsonToClassifier.java @@ -0,0 +1,43 @@ +/** + * Copyright (c) 2015 TerraFrame, Inc. All rights reserved. + * + * This file is part of Runway SDK(tm). + * + * Runway SDK(tm) is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * Runway SDK(tm) is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with Runway SDK(tm). If not, see . + */ +package net.geoprism.dhis2.importer; + +import org.json.JSONObject; + +import net.geoprism.ontology.Classifier; + +public class OptionJsonToClassifier +{ + private JSONObject json; + + public OptionJsonToClassifier(JSONObject json) + { + this.json = json; + } + + public void apply() + { + Classifier classy = new Classifier(); + classy.getDisplayLabel().setValue(json.getString("name")); + classy.setClassifierId(json.getString("id")); + classy.setClassifierPackage(json.getString("id")); + classy.setCategory(false); + classy.apply(); + } +} diff --git a/geoprism-dhis2/src/main/java/net/geoprism/dhis2/importer/OptionSetJsonToClassifier.java b/geoprism-dhis2/src/main/java/net/geoprism/dhis2/importer/OptionSetJsonToClassifier.java new file mode 100644 index 000000000..9122db597 --- /dev/null +++ b/geoprism-dhis2/src/main/java/net/geoprism/dhis2/importer/OptionSetJsonToClassifier.java @@ -0,0 +1,64 @@ +/** + * Copyright (c) 2015 TerraFrame, Inc. All rights reserved. + * + * This file is part of Runway SDK(tm). + * + * Runway SDK(tm) is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * Runway SDK(tm) is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with Runway SDK(tm). If not, see . + */ +package net.geoprism.dhis2.importer; + +import org.json.JSONArray; +import org.json.JSONObject; + +import net.geoprism.ontology.Classifier; +import net.geoprism.ontology.ClassifierIsARelationship; + +public class OptionSetJsonToClassifier +{ + private JSONObject json; + + private Classifier classy; + + public OptionSetJsonToClassifier(JSONObject json) + { + this.json = json; + } + + public void apply() + { + this.classy = new Classifier(); + this.classy.getDisplayLabel().setValue(json.getString("name")); + this.classy.setClassifierId(json.getString("id")); + this.classy.setClassifierPackage(json.getString("id")); + this.classy.setCategory(true); + this.classy.apply(); + + Classifier parent = Classifier.getRoot(); + this.classy.addLink(parent, ClassifierIsARelationship.CLASS); + } + + public void applyCategoryRelationships() + { + this.classy = Classifier.getByKey(json.getString("id") + Classifier.KEY_CONCATENATOR + json.getString("id")); + + JSONArray options = json.getJSONArray("options"); + for (int i = 0; i < options.length(); ++i) + { + JSONObject jsonOption = options.getJSONObject(i); + Classifier option = Classifier.getByKey(jsonOption.getString("id") + Classifier.KEY_CONCATENATOR + jsonOption.getString("id")); + + option.addLink(classy, ClassifierIsARelationship.CLASS); + } + } +} diff --git a/geoprism-dhis2/src/main/java/net/geoprism/dhis2/DHIS2ConflictException.java b/geoprism-dhis2/src/main/java/net/geoprism/dhis2/response/DHIS2ConflictException.java similarity index 97% rename from geoprism-dhis2/src/main/java/net/geoprism/dhis2/DHIS2ConflictException.java rename to geoprism-dhis2/src/main/java/net/geoprism/dhis2/response/DHIS2ConflictException.java index e92deb8de..541f616a9 100644 --- a/geoprism-dhis2/src/main/java/net/geoprism/dhis2/DHIS2ConflictException.java +++ b/geoprism-dhis2/src/main/java/net/geoprism/dhis2/response/DHIS2ConflictException.java @@ -16,7 +16,7 @@ * You should have received a copy of the GNU Lesser General Public * License along with Runway SDK(tm). If not, see . */ -package net.geoprism.dhis2; +package net.geoprism.dhis2.response; import org.json.JSONArray; import org.json.JSONObject; diff --git a/geoprism-dhis2/src/main/java/net/geoprism/dhis2/response/DHIS2DuplicateDataException.java b/geoprism-dhis2/src/main/java/net/geoprism/dhis2/response/DHIS2DuplicateDataException.java new file mode 100644 index 000000000..21cc617a2 --- /dev/null +++ b/geoprism-dhis2/src/main/java/net/geoprism/dhis2/response/DHIS2DuplicateDataException.java @@ -0,0 +1,52 @@ +/** + * Copyright (c) 2015 TerraFrame, Inc. All rights reserved. + * + * This file is part of Runway SDK(tm). + * + * Runway SDK(tm) is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * Runway SDK(tm) is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with Runway SDK(tm). If not, see . + */ +package net.geoprism.dhis2.response; + +import java.util.List; + +import org.json.JSONObject; + +public class DHIS2DuplicateDataException extends RuntimeException +{ + private static final long serialVersionUID = -5902095640582124900L; + + JSONObject errorReport; + + List msgs; + + public DHIS2DuplicateDataException(List msgs) + { + this.msgs = msgs; + } + + public DHIS2DuplicateDataException(JSONObject errorReport) + { + this.errorReport = errorReport; + } + + public DHIS2DuplicateDataException(String message) + { + super(message); + } + + public List getErrorMessages() + { + return this.msgs; + } +} diff --git a/geoprism-dhis2/src/main/java/net/geoprism/dhis2/ErrorProcessor.java b/geoprism-dhis2/src/main/java/net/geoprism/dhis2/response/DHIS2ResponseProcessor.java similarity index 69% rename from geoprism-dhis2/src/main/java/net/geoprism/dhis2/ErrorProcessor.java rename to geoprism-dhis2/src/main/java/net/geoprism/dhis2/response/DHIS2ResponseProcessor.java index 60196321d..def81acfc 100644 --- a/geoprism-dhis2/src/main/java/net/geoprism/dhis2/ErrorProcessor.java +++ b/geoprism-dhis2/src/main/java/net/geoprism/dhis2/response/DHIS2ResponseProcessor.java @@ -16,16 +16,19 @@ * You should have received a copy of the GNU Lesser General Public * License along with Runway SDK(tm). If not, see . */ -package net.geoprism.dhis2; +package net.geoprism.dhis2.response; + +import java.util.ArrayList; +import java.util.List; import org.json.JSONArray; import org.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class ErrorProcessor +public class DHIS2ResponseProcessor { - private static Logger logger = LoggerFactory.getLogger(ErrorProcessor.class); + private static Logger logger = LoggerFactory.getLogger(DHIS2ResponseProcessor.class); public static void validateImportSummaryResponse(JSONObject response) { @@ -54,7 +57,7 @@ public static void validateImportSummaryResponse(JSONObject response) if (!response.has("responseType") || !response.getString("responseType").equals("ImportSummaries")) { - throw new RuntimeException("Unexpected response [" + response + "]"); + throw new DHIS2UnexpectedResponseException("Unexpected response [" + response + "]"); } JSONArray summaries = response.getJSONArray("importSummaries"); @@ -63,22 +66,38 @@ public static void validateImportSummaryResponse(JSONObject response) { JSONObject summary = summaries.getJSONObject(i); - JSONArray conflicts = summary.getJSONArray("conflicts"); + String status = summary.getString("status"); + if (!status.equals("SUCCESS")) + { + throw new DHIS2UnexpectedResponseException("Unexpected response [" + response + "]"); + } - for (int j = 0; j < conflicts.length(); ++j) + if (summary.has("conflicts")) { - JSONObject conflict = conflicts.getJSONObject(j); - String value = conflict.getString("value"); + JSONArray conflicts = summary.getJSONArray("conflicts"); - if (value.contains("No org unit")) + for (int j = 0; j < conflicts.length(); ++j) { -// throw new RuntimeException("No org unit found on TEI. [" + response + "]."); + JSONObject conflict = conflicts.getJSONObject(j); + String value = conflict.getString("value"); + + if (value.contains("No org unit")) + { + throw new RuntimeException("No org unit found on TEI. [" + response + "]."); + } } } + + if (summary.has("enrollments")) + { + JSONObject enrollments = summary.getJSONObject("enrollments"); + + validateImportSummaryResponse(enrollments); + } } } - public static void validateTypeReportResponse(JSONObject response) + public static void validateTypeReportResponse(JSONObject response, boolean errorOnAlreadyExists) { // { // "status": "ERROR", @@ -117,9 +136,11 @@ public static void validateTypeReportResponse(JSONObject response) //} if (!response.has("status")) { - throw new RuntimeException("Unexpected response [" + response + "]"); + throw new DHIS2UnexpectedResponseException("Unexpected response [" + response + "]"); } + List failMsgs = new ArrayList(); + if (response.getString("status").equals("ERROR")) { JSONArray typeReports = response.getJSONArray("typeReports"); @@ -144,15 +165,27 @@ public static void validateTypeReportResponse(JSONObject response) if (errorReport.getString("errorCode").equals("E5003")) { - logger.error("Entity [" + klass + "] already exists."); + if (errorOnAlreadyExists) + { + failMsgs.add(errorReport.getString("message")); + } + else + { + logger.error(errorReport.getString("message")); + } } else { - throw new RuntimeException("Unexpected response [" + response + "]"); + throw new DHIS2UnexpectedResponseException("Unexpected response [" + response + "]"); } } } } } + + if (errorOnAlreadyExists && failMsgs.size() > 0) + { + throw new DHIS2DuplicateDataException(failMsgs); + } } } diff --git a/geoprism-dhis2/src/main/java/net/geoprism/dhis2/response/DHIS2UnexpectedResponseException.java b/geoprism-dhis2/src/main/java/net/geoprism/dhis2/response/DHIS2UnexpectedResponseException.java new file mode 100644 index 000000000..1ad86e786 --- /dev/null +++ b/geoprism-dhis2/src/main/java/net/geoprism/dhis2/response/DHIS2UnexpectedResponseException.java @@ -0,0 +1,34 @@ +/** + * Copyright (c) 2015 TerraFrame, Inc. All rights reserved. + * + * This file is part of Runway SDK(tm). + * + * Runway SDK(tm) is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * Runway SDK(tm) is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with Runway SDK(tm). If not, see . + */ +package net.geoprism.dhis2.response; + +public class DHIS2UnexpectedResponseException extends RuntimeException +{ + private static final long serialVersionUID = -3944686827403531446L; + + public DHIS2UnexpectedResponseException(String msg) + { + super(msg); + } + + public DHIS2UnexpectedResponseException(String msg, Throwable cause) + { + super(msg, cause); + } +} diff --git a/geoprism-dhis2/src/main/resources/META-INF/services/net.geoprism.data.GeoprismDatasetExporterIF b/geoprism-dhis2/src/main/resources/META-INF/services/net.geoprism.data.GeoprismDatasetExporterIF new file mode 100644 index 000000000..f5e694eb4 --- /dev/null +++ b/geoprism-dhis2/src/main/resources/META-INF/services/net.geoprism.data.GeoprismDatasetExporterIF @@ -0,0 +1 @@ +net.geoprism.dhis2.exporter.DHIS2DataExporter \ No newline at end of file diff --git a/geoprism-dhis2/test_data.xlsx b/geoprism-dhis2/test_data.xlsx new file mode 100644 index 000000000..b637ce0b8 Binary files /dev/null and b/geoprism-dhis2/test_data.xlsx differ diff --git a/geoprism-server/pom.xml b/geoprism-server/pom.xml index a318bcffc..9e1c39804 100644 --- a/geoprism-server/pom.xml +++ b/geoprism-server/pom.xml @@ -18,9 +18,6 @@ License along with Runway SDK(tm). If not, see . --> - 4.0.0 @@ -108,6 +105,11 @@ gt-wms ${geotools.version} + + org.geotools + gt-geojson + ${geotools.version} + com.amazonaws aws-java-sdk-s3 @@ -131,6 +133,17 @@ org.apache.oltu.oauth2.client 1.0.2 + + + + + + + + com.wdtinc + mapbox-vector-tile + 1.1.1-tf + @@ -264,6 +277,8 @@ ${project.basedir}/target/classes/metadata ${configuration.dir}/${geoprism.app} + -Xmx4g + -Xms2g @@ -462,7 +477,7 @@ - + org.codehaus.mojo @@ -616,17 +631,17 @@ - - org.codehaus.mojo - exec-maven-plugin - [1.4.0,) - - java - - - - - + + org.codehaus.mojo + exec-maven-plugin + [1.4.0,) + + java + + + + + diff --git a/geoprism-server/src/main/domain/(0001485389164474)EditGeometry.xml b/geoprism-server/src/main/domain/(0001485389164474)EditGeometry.xml new file mode 100644 index 000000000..89e4503e2 --- /dev/null +++ b/geoprism-server/src/main/domain/(0001485389164474)EditGeometry.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/geoprism-server/src/main/domain/(0001486077826195)GeoEntityUtilUpdate.xml b/geoprism-server/src/main/domain/(0001486077826195)GeoEntityUtilUpdate.xml new file mode 100644 index 000000000..b1167b9f4 --- /dev/null +++ b/geoprism-server/src/main/domain/(0001486077826195)GeoEntityUtilUpdate.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/geoprism-server/src/main/domain/(0001488155097210)ExportDataset.xml b/geoprism-server/src/main/domain/(0001488155097210)ExportDataset.xml new file mode 100644 index 000000000..224f0f0d2 --- /dev/null +++ b/geoprism-server/src/main/domain/(0001488155097210)ExportDataset.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/geoprism-server/src/main/domain/(0001489530069436)EditGeometry2.xml b/geoprism-server/src/main/domain/(0001489530069436)EditGeometry2.xml new file mode 100644 index 000000000..5c4b9df51 --- /dev/null +++ b/geoprism-server/src/main/domain/(0001489530069436)EditGeometry2.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/geoprism-server/src/main/domain/(0001490294619205)GeoEntityUtilUpdate.xml b/geoprism-server/src/main/domain/(0001490294619205)GeoEntityUtilUpdate.xml new file mode 100644 index 000000000..ee4d17c00 --- /dev/null +++ b/geoprism-server/src/main/domain/(0001490294619205)GeoEntityUtilUpdate.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/geoprism-server/src/main/domain/(0001490318009735)GeoEntityUtilUpdate.xml b/geoprism-server/src/main/domain/(0001490318009735)GeoEntityUtilUpdate.xml new file mode 100644 index 000000000..456192194 --- /dev/null +++ b/geoprism-server/src/main/domain/(0001490318009735)GeoEntityUtilUpdate.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/geoprism-server/src/main/java-gen/base/net/geoprism/MappableClassBase.java b/geoprism-server/src/main/java-gen/base/net/geoprism/MappableClassBase.java index 9c4fbb9b9..78eb251b5 100644 --- a/geoprism-server/src/main/java-gen/base/net/geoprism/MappableClassBase.java +++ b/geoprism-server/src/main/java-gen/base/net/geoprism/MappableClassBase.java @@ -18,7 +18,7 @@ */ package net.geoprism; -@com.runwaysdk.business.ClassSignature(hash = -1691617178) +@com.runwaysdk.business.ClassSignature(hash = 1480924545) /** * This class is generated automatically. * DO NOT MAKE CHANGES TO IT - THEY WILL BE OVERWRITTEN @@ -43,7 +43,7 @@ public abstract class MappableClassBase extends com.runwaysdk.business.Business public static java.lang.String SITEMASTER = "siteMaster"; public static java.lang.String TYPE = "type"; public static java.lang.String WRAPPEDMDCLASS = "wrappedMdClass"; - private static final long serialVersionUID = -1691617178; + private static final long serialVersionUID = 1480924545; public MappableClassBase() { @@ -532,6 +532,18 @@ public static void remove(java.lang.String id) throw new com.runwaysdk.dataaccess.metadata.ForbiddenMethodException(msg); } + public void xport() + { + String msg = "This method should never be invoked. It should be overwritten in net.geoprism.MappableClass.java"; + throw new com.runwaysdk.dataaccess.metadata.ForbiddenMethodException(msg); + } + + public static final void xport(java.lang.String id) + { + MappableClass _instance = MappableClass.get(id); + _instance.xport(); + } + public static MappableClass lock(java.lang.String id) { MappableClass _instance = MappableClass.get(id); diff --git a/geoprism-server/src/main/java-gen/base/net/geoprism/MappableClassQuery.java b/geoprism-server/src/main/java-gen/base/net/geoprism/MappableClassQuery.java index 047cfc5f6..e4e6c5280 100644 --- a/geoprism-server/src/main/java-gen/base/net/geoprism/MappableClassQuery.java +++ b/geoprism-server/src/main/java-gen/base/net/geoprism/MappableClassQuery.java @@ -18,7 +18,7 @@ */ package net.geoprism; -@com.runwaysdk.business.ClassSignature(hash = -261175537) +@com.runwaysdk.business.ClassSignature(hash = 1784828664) /** * This class is generated automatically. * DO NOT MAKE CHANGES TO IT - THEY WILL BE OVERWRITTEN diff --git a/geoprism-server/src/main/java-gen/base/net/geoprism/dhis2/response/DHIS2DuplicateAttributeExceptionBase.java b/geoprism-server/src/main/java-gen/base/net/geoprism/dhis2/response/DHIS2DuplicateAttributeExceptionBase.java new file mode 100644 index 000000000..99f01b109 --- /dev/null +++ b/geoprism-server/src/main/java-gen/base/net/geoprism/dhis2/response/DHIS2DuplicateAttributeExceptionBase.java @@ -0,0 +1,113 @@ +/** + * Copyright (c) 2015 TerraFrame, Inc. All rights reserved. + * + * This file is part of Runway SDK(tm). + * + * Runway SDK(tm) is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * Runway SDK(tm) is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with Runway SDK(tm). If not, see . + */ +package net.geoprism.dhis2.response; + +@com.runwaysdk.business.ClassSignature(hash = 1077705189) +/** + * This class is generated automatically. + * DO NOT MAKE CHANGES TO IT - THEY WILL BE OVERWRITTEN + * Custom business logic should be added to DHIS2DuplicateAttributeException.java + * + * @author Autogenerated by RunwaySDK + */ +public abstract class DHIS2DuplicateAttributeExceptionBase extends com.runwaysdk.business.SmartException implements com.runwaysdk.generation.loader.Reloadable +{ + public final static String CLASS = "net.geoprism.dhis2.response.DHIS2DuplicateAttributeException"; + public static java.lang.String DHIS2ATTRS = "dhis2Attrs"; + public static java.lang.String ID = "id"; + private static final long serialVersionUID = 1077705189; + + public DHIS2DuplicateAttributeExceptionBase() + { + super(); + } + + public DHIS2DuplicateAttributeExceptionBase(java.lang.String developerMessage) + { + super(developerMessage); + } + + public DHIS2DuplicateAttributeExceptionBase(java.lang.String developerMessage, java.lang.Throwable cause) + { + super(developerMessage, cause); + } + + public DHIS2DuplicateAttributeExceptionBase(java.lang.Throwable cause) + { + super(cause); + } + + public String getDhis2Attrs() + { + return getValue(DHIS2ATTRS); + } + + public void validateDhis2Attrs() + { + this.validateAttribute(DHIS2ATTRS); + } + + public static com.runwaysdk.dataaccess.MdAttributeCharacterDAOIF getDhis2AttrsMd() + { + com.runwaysdk.dataaccess.MdClassDAOIF mdClassIF = com.runwaysdk.dataaccess.metadata.MdClassDAO.getMdClassDAO(net.geoprism.dhis2.response.DHIS2DuplicateAttributeException.CLASS); + return (com.runwaysdk.dataaccess.MdAttributeCharacterDAOIF)mdClassIF.definesAttribute(DHIS2ATTRS); + } + + public void setDhis2Attrs(String value) + { + if(value == null) + { + setValue(DHIS2ATTRS, ""); + } + else + { + setValue(DHIS2ATTRS, value); + } + } + + public String getId() + { + return getValue(ID); + } + + public void validateId() + { + this.validateAttribute(ID); + } + + public static com.runwaysdk.dataaccess.MdAttributeCharacterDAOIF getIdMd() + { + com.runwaysdk.dataaccess.MdClassDAOIF mdClassIF = com.runwaysdk.dataaccess.metadata.MdClassDAO.getMdClassDAO(net.geoprism.dhis2.response.DHIS2DuplicateAttributeException.CLASS); + return (com.runwaysdk.dataaccess.MdAttributeCharacterDAOIF)mdClassIF.definesAttribute(ID); + } + + protected String getDeclaredType() + { + return CLASS; + } + + public java.lang.String localize(java.util.Locale locale) + { + java.lang.String message = super.localize(locale); + message = replace(message, "{dhis2Attrs}", this.getDhis2Attrs()); + message = replace(message, "{id}", this.getId()); + return message; + } + +} diff --git a/geoprism-server/src/main/java-gen/base/net/geoprism/dhis2/response/OAuthLoginRequiredExceptionBase.java b/geoprism-server/src/main/java-gen/base/net/geoprism/dhis2/response/OAuthLoginRequiredExceptionBase.java new file mode 100644 index 000000000..b1210d0ee --- /dev/null +++ b/geoprism-server/src/main/java-gen/base/net/geoprism/dhis2/response/OAuthLoginRequiredExceptionBase.java @@ -0,0 +1,83 @@ +/** + * Copyright (c) 2015 TerraFrame, Inc. All rights reserved. + * + * This file is part of Runway SDK(tm). + * + * Runway SDK(tm) is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * Runway SDK(tm) is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with Runway SDK(tm). If not, see . + */ +package net.geoprism.dhis2.response; + +@com.runwaysdk.business.ClassSignature(hash = -2066477761) +/** + * This class is generated automatically. + * DO NOT MAKE CHANGES TO IT - THEY WILL BE OVERWRITTEN + * Custom business logic should be added to OAuthLoginRequiredException.java + * + * @author Autogenerated by RunwaySDK + */ +public abstract class OAuthLoginRequiredExceptionBase extends com.runwaysdk.business.SmartException implements com.runwaysdk.generation.loader.Reloadable +{ + public final static String CLASS = "net.geoprism.dhis2.response.OAuthLoginRequiredException"; + public static java.lang.String ID = "id"; + private static final long serialVersionUID = -2066477761; + + public OAuthLoginRequiredExceptionBase() + { + super(); + } + + public OAuthLoginRequiredExceptionBase(java.lang.String developerMessage) + { + super(developerMessage); + } + + public OAuthLoginRequiredExceptionBase(java.lang.String developerMessage, java.lang.Throwable cause) + { + super(developerMessage, cause); + } + + public OAuthLoginRequiredExceptionBase(java.lang.Throwable cause) + { + super(cause); + } + + public String getId() + { + return getValue(ID); + } + + public void validateId() + { + this.validateAttribute(ID); + } + + public static com.runwaysdk.dataaccess.MdAttributeCharacterDAOIF getIdMd() + { + com.runwaysdk.dataaccess.MdClassDAOIF mdClassIF = com.runwaysdk.dataaccess.metadata.MdClassDAO.getMdClassDAO(net.geoprism.dhis2.response.OAuthLoginRequiredException.CLASS); + return (com.runwaysdk.dataaccess.MdAttributeCharacterDAOIF)mdClassIF.definesAttribute(ID); + } + + protected String getDeclaredType() + { + return CLASS; + } + + public java.lang.String localize(java.util.Locale locale) + { + java.lang.String message = super.localize(locale); + message = replace(message, "{id}", this.getId()); + return message; + } + +} diff --git a/geoprism-server/src/main/java-gen/base/net/geoprism/ontology/GeoEntityUtilBase.java b/geoprism-server/src/main/java-gen/base/net/geoprism/ontology/GeoEntityUtilBase.java index df9078a3c..3d4279819 100644 --- a/geoprism-server/src/main/java-gen/base/net/geoprism/ontology/GeoEntityUtilBase.java +++ b/geoprism-server/src/main/java-gen/base/net/geoprism/ontology/GeoEntityUtilBase.java @@ -1,24 +1,6 @@ -/** - * Copyright (c) 2015 TerraFrame, Inc. All rights reserved. - * - * This file is part of Runway SDK(tm). - * - * Runway SDK(tm) is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * Runway SDK(tm) is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Runway SDK(tm). If not, see . - */ package net.geoprism.ontology; -@com.runwaysdk.business.ClassSignature(hash = -1839924553) +@com.runwaysdk.business.ClassSignature(hash = 1722546625) /** * This class is generated automatically. * DO NOT MAKE CHANGES TO IT - THEY WILL BE OVERWRITTEN @@ -30,7 +12,7 @@ public abstract class GeoEntityUtilBase extends com.runwaysdk.business.Util impl { public final static String CLASS = "net.geoprism.ontology.GeoEntityUtil"; public static java.lang.String ID = "id"; - private static final long serialVersionUID = -1839924553; + private static final long serialVersionUID = 1722546625; public GeoEntityUtilBase() { @@ -63,12 +45,30 @@ public static GeoEntityUtil get(String id) return (GeoEntityUtil) com.runwaysdk.business.Util.get(id); } + public static void applyGeometries(java.lang.String featureCollection) + { + String msg = "This method should never be invoked. It should be overwritten in net.geoprism.ontology.GeoEntityUtil.java"; + throw new com.runwaysdk.dataaccess.metadata.ForbiddenMethodException(msg); + } + + public static void cancelEditingSession(java.lang.String config) + { + String msg = "This method should never be invoked. It should be overwritten in net.geoprism.ontology.GeoEntityUtil.java"; + throw new com.runwaysdk.dataaccess.metadata.ForbiddenMethodException(msg); + } + public static void deleteEntityProblem(java.lang.String problemId) { String msg = "This method should never be invoked. It should be overwritten in net.geoprism.ontology.GeoEntityUtil.java"; throw new com.runwaysdk.dataaccess.metadata.ForbiddenMethodException(msg); } + public static void deleteGeoEntity(java.lang.String id) + { + String msg = "This method should never be invoked. It should be overwritten in net.geoprism.ontology.GeoEntityUtil.java"; + throw new com.runwaysdk.dataaccess.metadata.ForbiddenMethodException(msg); + } + public static com.runwaysdk.system.gis.geo.GeoEntityProblemView[] getAllProblems() { String msg = "This method should never be invoked. It should be overwritten in net.geoprism.ontology.GeoEntityUtil.java"; @@ -81,6 +81,24 @@ public static com.runwaysdk.query.ValueQuery getChildren(java.lang.String id, ja throw new com.runwaysdk.dataaccess.metadata.ForbiddenMethodException(msg); } + public static java.lang.String getChildrenBBOX(java.lang.String id, java.lang.String universalId) + { + String msg = "This method should never be invoked. It should be overwritten in net.geoprism.ontology.GeoEntityUtil.java"; + throw new com.runwaysdk.dataaccess.metadata.ForbiddenMethodException(msg); + } + + public static java.io.InputStream getData(java.lang.String config) + { + String msg = "This method should never be invoked. It should be overwritten in net.geoprism.ontology.GeoEntityUtil.java"; + throw new com.runwaysdk.dataaccess.metadata.ForbiddenMethodException(msg); + } + + public static java.lang.String getEntitiesBBOX(java.lang.String[] ids) + { + String msg = "This method should never be invoked. It should be overwritten in net.geoprism.ontology.GeoEntityUtil.java"; + throw new com.runwaysdk.dataaccess.metadata.ForbiddenMethodException(msg); + } + public static com.runwaysdk.system.gis.geo.GeoEntity getEntity(java.lang.String id) { String msg = "This method should never be invoked. It should be overwritten in net.geoprism.ontology.GeoEntityUtil.java"; @@ -117,6 +135,12 @@ public static java.lang.String[] makeSynonym(java.lang.String sourceId, java.lan throw new com.runwaysdk.dataaccess.metadata.ForbiddenMethodException(msg); } + public static java.io.InputStream openEditingSession(java.lang.String config) + { + String msg = "This method should never be invoked. It should be overwritten in net.geoprism.ontology.GeoEntityUtil.java"; + throw new com.runwaysdk.dataaccess.metadata.ForbiddenMethodException(msg); + } + public static java.lang.String publishLayers(java.lang.String id, java.lang.String universalId, java.lang.String existingLayerNames) { String msg = "This method should never be invoked. It should be overwritten in net.geoprism.ontology.GeoEntityUtil.java"; diff --git a/geoprism-server/src/main/java-gen/stub/net/geoprism/DataUploader.java b/geoprism-server/src/main/java-gen/stub/net/geoprism/DataUploader.java index 037a89d27..29e6717c8 100644 --- a/geoprism-server/src/main/java-gen/stub/net/geoprism/DataUploader.java +++ b/geoprism-server/src/main/java-gen/stub/net/geoprism/DataUploader.java @@ -23,26 +23,6 @@ import java.io.IOException; import java.io.InputStream; import java.util.Collection; -import java.util.List; - -import net.geoprism.data.etl.DefinitionBuilder; -import net.geoprism.data.etl.ExcelSourceBinding; -import net.geoprism.data.etl.ImportResponseIF; -import net.geoprism.data.etl.ImportRunnable; -import net.geoprism.data.etl.LoggingProgressMonitor; -import net.geoprism.data.etl.ProgressMonitorIF; -import net.geoprism.data.etl.SourceDefinitionIF; -import net.geoprism.data.etl.TargetDefinitionIF; -import net.geoprism.data.etl.excel.ExcelDataFormatter; -import net.geoprism.data.etl.excel.ExcelSheetReader; -import net.geoprism.data.etl.excel.FieldInfoContentsHandler; -import net.geoprism.data.etl.excel.InvalidExcelFileException; -import net.geoprism.data.importer.SeedKeyGenerator; -import net.geoprism.gis.geoserver.SessionPredicate; -import net.geoprism.localization.LocalizationFacade; -import net.geoprism.ontology.Classifier; -import net.geoprism.ontology.ClassifierSynonym; -import net.geoprism.ontology.GeoEntityUtil; import org.apache.commons.io.FileUtils; import org.apache.poi.openxml4j.exceptions.InvalidFormatException; @@ -70,6 +50,25 @@ import com.runwaysdk.system.gis.geo.UniversalQuery; import com.runwaysdk.system.metadata.MdClassQuery; +import net.geoprism.data.etl.DefinitionBuilder; +import net.geoprism.data.etl.ExcelSourceBinding; +import net.geoprism.data.etl.ImportResponseIF; +import net.geoprism.data.etl.ImportRunnable; +import net.geoprism.data.etl.LoggingProgressMonitor; +import net.geoprism.data.etl.ProgressMonitorIF; +import net.geoprism.data.etl.SourceDefinitionIF; +import net.geoprism.data.etl.TargetDefinitionIF; +import net.geoprism.data.etl.excel.ExcelDataFormatter; +import net.geoprism.data.etl.excel.ExcelSheetReader; +import net.geoprism.data.etl.excel.FieldInfoContentsHandler; +import net.geoprism.data.etl.excel.InvalidExcelFileException; +import net.geoprism.data.importer.SeedKeyGenerator; +import net.geoprism.gis.geoserver.SessionPredicate; +import net.geoprism.localization.LocalizationFacade; +import net.geoprism.ontology.Classifier; +import net.geoprism.ontology.ClassifierSynonym; +import net.geoprism.ontology.GeoEntityUtil; + public class DataUploader extends DataUploaderBase implements com.runwaysdk.generation.loader.Reloadable { private static final KeyGeneratorIF GENERATOR = new SeedKeyGenerator(); @@ -103,8 +102,7 @@ public static String createGeoEntity(String parentId, String universalId, String @Authenticate public static void deleteGeoEntity(String entityId) { - GeoEntity entity = GeoEntity.get(entityId); - entity.delete(); + GeoEntityUtil.deleteGeoEntity(entityId); } @Transaction @@ -241,6 +239,7 @@ public static String getOptionsJSON() Universal universal = it.next(); Collection children = GeoEntityUtil.getOrderedDescendants(universal, AllowedIn.CLASS); + children.remove(universal); // children.add(0, universal); JSONArray options = new JSONArray(); diff --git a/geoprism-server/src/main/java-gen/stub/net/geoprism/MappableClass.java b/geoprism-server/src/main/java-gen/stub/net/geoprism/MappableClass.java index d71211a80..af7ed18ee 100644 --- a/geoprism-server/src/main/java-gen/stub/net/geoprism/MappableClass.java +++ b/geoprism-server/src/main/java-gen/stub/net/geoprism/MappableClass.java @@ -22,22 +22,12 @@ import java.util.Collections; import java.util.Comparator; import java.util.HashSet; +import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Locale; import java.util.TreeSet; -import net.geoprism.dashboard.AttributeWrapper; -import net.geoprism.dashboard.AttributeWrapperQuery; -import net.geoprism.dashboard.Dashboard; -import net.geoprism.dashboard.DashboardAttributes; -import net.geoprism.dashboard.DashboardMetadata; -import net.geoprism.dashboard.MetadataWrapper; -import net.geoprism.dashboard.MetadataWrapperQuery; -import net.geoprism.data.DatabaseUtil; -import net.geoprism.data.etl.TargetBinding; -import net.geoprism.ontology.Classifier; - import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; @@ -70,6 +60,19 @@ import com.runwaysdk.system.metadata.MdAttributeConcrete; import com.runwaysdk.system.metadata.MdClass; +import net.geoprism.dashboard.AttributeWrapper; +import net.geoprism.dashboard.AttributeWrapperQuery; +import net.geoprism.dashboard.Dashboard; +import net.geoprism.dashboard.DashboardAttributes; +import net.geoprism.dashboard.DashboardMetadata; +import net.geoprism.dashboard.MetadataWrapper; +import net.geoprism.dashboard.MetadataWrapperQuery; +import net.geoprism.data.DatabaseUtil; +import net.geoprism.data.GeoprismDatasetExporterIF; +import net.geoprism.data.GeoprismDatasetExporterService; +import net.geoprism.data.etl.TargetBinding; +import net.geoprism.ontology.Classifier; + public class MappableClass extends MappableClassBase implements com.runwaysdk.generation.loader.Reloadable { private static class LabelComparator implements Comparator @@ -107,6 +110,26 @@ protected String buildKey() return super.buildKey(); } + + /** + * MdMethod + * + * Exports the dataset to all available exporters. (currently only DHIS2, if the DHIS2 exporter plugin is included) + */ + @Override + public void xport() + { + MdClass mdClass = this.getWrappedMdClass(); + + Iterator it = GeoprismDatasetExporterService.getAllExporters(); + + while (it.hasNext()) + { + GeoprismDatasetExporterIF exporter = it.next(); + + exporter.xport(mdClass); + } + } @Override @Transaction @@ -739,6 +762,10 @@ public static String getAllAsJSON() { try { + JSONObject jObject = new JSONObject(); + + jObject.put("canExport", GeoprismDatasetExporterService.getAllExporters().hasNext()); + JSONArray array = new JSONArray(); MappableClass[] mClasses = MappableClass.getAll(); @@ -747,8 +774,10 @@ public static String getAllAsJSON() { array.put(mClass.toJSON()); } + + jObject.put("datasets", array); - return array.toString(); + return jObject.toString(); } catch (JSONException e) { diff --git a/geoprism-server/src/main/java-gen/stub/net/geoprism/dhis2/response/DHIS2DuplicateAttributeException.java b/geoprism-server/src/main/java-gen/stub/net/geoprism/dhis2/response/DHIS2DuplicateAttributeException.java new file mode 100644 index 000000000..3186e8069 --- /dev/null +++ b/geoprism-server/src/main/java-gen/stub/net/geoprism/dhis2/response/DHIS2DuplicateAttributeException.java @@ -0,0 +1,45 @@ +/** + * Copyright (c) 2015 TerraFrame, Inc. All rights reserved. + * + * This file is part of Runway SDK(tm). + * + * Runway SDK(tm) is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * Runway SDK(tm) is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with Runway SDK(tm). If not, see . + */ +package net.geoprism.dhis2.response; + +public class DHIS2DuplicateAttributeException extends DHIS2DuplicateAttributeExceptionBase implements com.runwaysdk.generation.loader.Reloadable +{ + private static final long serialVersionUID = -944876350; + + public DHIS2DuplicateAttributeException() + { + super(); + } + + public DHIS2DuplicateAttributeException(java.lang.String developerMessage) + { + super(developerMessage); + } + + public DHIS2DuplicateAttributeException(java.lang.String developerMessage, java.lang.Throwable cause) + { + super(developerMessage, cause); + } + + public DHIS2DuplicateAttributeException(java.lang.Throwable cause) + { + super(cause); + } + +} diff --git a/geoprism-server/src/main/java-gen/stub/net/geoprism/dhis2/response/OAuthLoginRequiredException.java b/geoprism-server/src/main/java-gen/stub/net/geoprism/dhis2/response/OAuthLoginRequiredException.java new file mode 100644 index 000000000..89ed17009 --- /dev/null +++ b/geoprism-server/src/main/java-gen/stub/net/geoprism/dhis2/response/OAuthLoginRequiredException.java @@ -0,0 +1,45 @@ +/** + * Copyright (c) 2015 TerraFrame, Inc. All rights reserved. + * + * This file is part of Runway SDK(tm). + * + * Runway SDK(tm) is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * Runway SDK(tm) is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with Runway SDK(tm). If not, see . + */ +package net.geoprism.dhis2.response; + +public class OAuthLoginRequiredException extends OAuthLoginRequiredExceptionBase implements com.runwaysdk.generation.loader.Reloadable +{ + private static final long serialVersionUID = 1285981276; + + public OAuthLoginRequiredException() + { + super(); + } + + public OAuthLoginRequiredException(java.lang.String developerMessage) + { + super(developerMessage); + } + + public OAuthLoginRequiredException(java.lang.String developerMessage, java.lang.Throwable cause) + { + super(developerMessage, cause); + } + + public OAuthLoginRequiredException(java.lang.Throwable cause) + { + super(cause); + } + +} diff --git a/geoprism-server/src/main/java-gen/stub/net/geoprism/ontology/Classifier.java b/geoprism-server/src/main/java-gen/stub/net/geoprism/ontology/Classifier.java index bbec31cdb..fba5bf6d0 100644 --- a/geoprism-server/src/main/java-gen/stub/net/geoprism/ontology/Classifier.java +++ b/geoprism-server/src/main/java-gen/stub/net/geoprism/ontology/Classifier.java @@ -62,7 +62,7 @@ public class Classifier extends ClassifierBase implements com.runwaysdk.generati { private static final long serialVersionUID = 1158111601; - private static final String KEY_CONCATENATOR = "."; + public static final String KEY_CONCATENATOR = "."; public Classifier() { @@ -182,12 +182,10 @@ public static Classifier findMatchingTerm(String sfTermToMatch, MdAttributeTermD } /** - * Returns the Classifier object with a label or synonym that matches the given term. Searches all nodes - * that are children of the given attribute root nodes including the root nodes. + * Returns the root Classifier which is referenced by the given MdAttributeTerm. * - * @param sfTermToMatch - * @param mdAttributeTermDAO - * @return the Classifier object with a label or synonym that matches the given term. + * @param mdAttributeTermDAOIF + * @return the Classifier object */ public static Classifier findClassifierRoot(MdAttributeTermDAOIF mdAttributeTermDAOIF) { @@ -886,7 +884,7 @@ public static Classifier createOption(String option) Classifier.validateCategoryName(label, null); } - if (object.has("parentId")) + if (object.has("parentId") && object.getString("parentId").length() > 0) { String parentId = object.getString("parentId"); diff --git a/geoprism-server/src/main/java-gen/stub/net/geoprism/ontology/GeoEntityUtil.java b/geoprism-server/src/main/java-gen/stub/net/geoprism/ontology/GeoEntityUtil.java index c3fc6885b..9a14737ea 100644 --- a/geoprism-server/src/main/java-gen/stub/net/geoprism/ontology/GeoEntityUtil.java +++ b/geoprism-server/src/main/java-gen/stub/net/geoprism/ontology/GeoEntityUtil.java @@ -3,45 +3,55 @@ * * This file is part of Runway SDK(tm). * - * Runway SDK(tm) is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. + * Runway SDK(tm) is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General + * Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any + * later version. * - * Runway SDK(tm) is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. + * Runway SDK(tm) is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more + * details. * - * You should have received a copy of the GNU Lesser General Public - * License along with Runway SDK(tm). If not, see . + * You should have received a copy of the GNU Lesser General Public License along with Runway SDK(tm). If not, see + * . */ package net.geoprism.ontology; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.StringWriter; +import java.sql.ResultSet; +import java.sql.SQLException; import java.sql.Savepoint; +import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; -import net.geoprism.ConfigurationIF; -import net.geoprism.ConfigurationService; -import net.geoprism.KeyGeneratorIF; -import net.geoprism.TermSynonymRelationship; -import net.geoprism.data.DatabaseUtil; -import net.geoprism.data.importer.SeedKeyGenerator; - +import org.geotools.geometry.jts.JTS; +import org.geotools.referencing.CRS; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; +import org.json.JSONWriter; +import org.opengis.geometry.MismatchedDimensionException; +import org.opengis.referencing.FactoryException; +import org.opengis.referencing.crs.CoordinateReferenceSystem; +import org.opengis.referencing.operation.MathTransform; +import org.opengis.referencing.operation.TransformException; import com.runwaysdk.business.Business; import com.runwaysdk.business.BusinessFacade; import com.runwaysdk.business.ontology.Term; +import com.runwaysdk.business.rbac.Authenticate; import com.runwaysdk.dataaccess.BusinessDAOIF; import com.runwaysdk.dataaccess.DuplicateDataException; import com.runwaysdk.dataaccess.ProgrammingErrorException; @@ -49,6 +59,7 @@ import com.runwaysdk.dataaccess.database.Database; import com.runwaysdk.dataaccess.transaction.Transaction; import com.runwaysdk.generated.system.gis.geo.GeoEntityAllPathsTableQuery; +import com.runwaysdk.gis.geometry.GeometryHelper; import com.runwaysdk.query.AttributeReference; import com.runwaysdk.query.CONCAT; import com.runwaysdk.query.Coalesce; @@ -67,6 +78,21 @@ import com.runwaysdk.system.gis.geo.Synonym; import com.runwaysdk.system.gis.geo.SynonymQuery; import com.runwaysdk.system.gis.geo.SynonymRelationshipQuery; +import com.vividsolutions.jts.geom.Coordinate; +import com.vividsolutions.jts.geom.Envelope; +import com.vividsolutions.jts.geom.Geometry; +import com.vividsolutions.jts.geom.GeometryFactory; +import com.vividsolutions.jts.geom.MultiPolygon; +import com.vividsolutions.jts.geom.Polygon; + +import net.geoprism.ConfigurationIF; +import net.geoprism.ConfigurationService; +import net.geoprism.KeyGeneratorIF; +import net.geoprism.TermSynonymRelationship; +import net.geoprism.dashboard.Dashboard; +import net.geoprism.data.DatabaseUtil; +import net.geoprism.data.GeometrySerializationUtil; +import net.geoprism.data.importer.SeedKeyGenerator; public class GeoEntityUtil extends GeoEntityUtilBase implements com.runwaysdk.generation.loader.Reloadable { @@ -80,6 +106,208 @@ public GeoEntityUtil() super(); } + /** + * Helper method, returns all GeoEntities that match the given criteria. + * + * @param config + * @return + */ + private static OIterator getAllGeoentities(String config) + { + JSONObject jObj = new JSONObject(config); + + String universalId = jObj.has("universalId") ? jObj.getString("universalId") : null; + String parentId = jObj.getString("id"); + + QueryFactory qf = new QueryFactory(); + GeoEntityQuery geq = new GeoEntityQuery(qf); + LocatedInQuery liq = new LocatedInQuery(qf); + + if (universalId != null) + { + geq.WHERE(geq.getUniversal().EQ(universalId)); + } + + liq.WHERE(liq.getParent().EQ(parentId)); + geq.AND(geq.locatedIn(liq)); + + return geq.getIterator(); + } + + /** + * MdMethod + * + * Accepts a JSON configuration object (Similar to getData) and locks all geoentities to be edited. + * + * @param config + * @return VectorTile data + */ + @Transaction + public static java.io.InputStream openEditingSession(java.lang.String config) + { + OIterator lockMes = getAllGeoentities(config); + for (GeoEntity lockMe : lockMes) + { + lockMe.lock(); + } + + // Uncomment this if you want to play with vector tiles + // return GeoEntityUtil.getData(config); + + JSONObject jObj = new JSONObject(config); + String id = jObj.getString("id"); + String universalId = jObj.has("universalId") ? jObj.getString("universalId") : null; + + LocationTargetPublisher publisher = new LocationTargetPublisher(id, universalId, ""); + + StringWriter writer = new StringWriter(); + JSONWriter jw = new JSONWriter(writer); + + try + { + publisher.writeGeojson(jw); + byte[] bytes = writer.toString().getBytes(); + + return new ByteArrayInputStream(bytes); + } + finally + { + try + { + writer.close(); + } + catch (IOException e) + { + throw new ProgrammingErrorException("Could not close IO stream.", e); + } + } + } + + /** + * MdMethod + * + * Cancels an editing session by unlocking all GeoEntities at a given universal level. + * + * @param config + * @return VectorTile data + */ + @Transaction + public static void cancelEditingSession(java.lang.String config) + { + OIterator unlockMes = getAllGeoentities(config); + for (GeoEntity unlockMe : unlockMes) + { + unlockMe.unlock(); + } + } + + /** + * MdMethod + * + * Accepts a JSON FeatureCollection from the client. This JSON is directly produced by the Mapbox GL Draw plugin. + */ + @Transaction + public static void applyGeometries(java.lang.String featureCollection) + { + GeometryFactory geometryFactory = new GeometryFactory(); + GeometryHelper geometryHelper = new GeometryHelper(); + GeometrySerializationUtil serializer = new GeometrySerializationUtil(geometryFactory); + + HashMap> multiPolyMap = new HashMap>(); + + try + { + JSONObject json = new JSONObject(featureCollection); + + JSONArray features = json.getJSONArray("features"); + + for (int i = 0; i < features.length(); ++i) + { + JSONObject feature = features.getJSONObject(i); + + String type = feature.getString("type").toLowerCase(); + + if (type.equals("feature")) + { + JSONObject geometry = feature.getJSONObject("geometry"); + String featureType = geometry.getString("type").toLowerCase(); + + JSONObject properties = feature.getJSONObject("properties"); + String geoEntId = properties.getString("id"); + JSONArray coordinates = geometry.getJSONArray("coordinates"); + + if (!multiPolyMap.containsKey(geoEntId)) + { + multiPolyMap.put(geoEntId, new ArrayList()); + } + List polygons = multiPolyMap.get(geoEntId); + + if (featureType.equals("polygon")) + { + coordinates = coordinates.getJSONArray(0); + + Polygon polygon = serializer.jsonToPolygon(coordinates); + polygons.add(polygon); + } + else if (featureType.equals("multipolygon")) + { + for (int p = 0; p < coordinates.length(); ++p) + { + JSONArray jsonP = coordinates.getJSONArray(p).getJSONArray(0); + + Polygon polygon = serializer.jsonToPolygon(jsonP); + polygons.add(polygon); + } + } + else + { + throw new UnsupportedOperationException(); + } + } + else if (type.equals("unlock")) + { + GeoEntity.get(feature.getString("id")).unlock(); + } + else if (type.equals("delete")) + { + GeoEntity.get(feature.getString("id")).delete(); + } + } + } + catch (JSONException e) + { + e.printStackTrace(); + } + + Set ids = multiPolyMap.keySet(); + for (String id : ids) + { + List listPoly = multiPolyMap.get(id); + + MultiPolygon multiPoly = geometryFactory.createMultiPolygon(listPoly.toArray(new Polygon[listPoly.size()])); + + // Make sure we're in 4326 projection + Geometry geom = multiPoly; + // try + // { + // CoordinateReferenceSystem sourceCRS = CRS.decode("EPSG:3857", true); + // CoordinateReferenceSystem targetCRS = CRS.decode("EPSG:4326", true); + // MathTransform transform = CRS.findMathTransform(sourceCRS, targetCRS); + // geom = JTS.transform(multiPoly, transform); + // } + // catch (FactoryException | MismatchedDimensionException | TransformException e) + // { + // throw new RuntimeException(e); + // } + + GeoEntity geo = GeoEntity.lock(id); + geo.setGeoPoint(geometryHelper.getGeoPoint(geom)); + geo.setGeoMultiPolygon(geometryHelper.getGeoMultiPolygon(geom)); + geo.setWkt(geom.toText()); + geo.apply(); + } + } + /** * Merges the source geo entity into the destination geo entity and creates a new synonym with the name of the source * geo entity. @@ -686,6 +914,139 @@ public static String getAncestorsAsJSON(String entityId) throw new ProgrammingErrorException(e); } } + + public static String getEntitiesBBOX(String[] ids) + { + if(ids.length > 0) + { + StringBuffer geoIdsStr = new StringBuffer(); + for(int i=0; i 0){ + geoIdsStr.append(","); + } + geoIdsStr.append("'").append(id).append("'"); + } + + + ValueQuery vQuery = new ValueQuery(new QueryFactory()); + GeoEntityQuery query = new GeoEntityQuery(vQuery); + + StringBuffer sql = new StringBuffer(); + sql.append("SELECT ST_AsText(ST_Extent(" + query.getGeoMultiPolygon().getDbColumnName() + ")) AS bbox"); + sql.append(" FROM geo_entity WHERE geo_entity.id = any (array["+geoIdsStr+"]);"); + + + ResultSet bboxResult = Database.query(sql.toString()); + + return formatBBox(bboxResult).toString(); + } + + return null; + } + + + public static String getChildrenBBOX(String id, String universalId) + { + GeoEntity entity = GeoEntity.get(id); + + ValueQuery vQuery = new ValueQuery(new QueryFactory()); + LocatedInQuery liQuery = new LocatedInQuery(vQuery); + GeoEntityQuery query = new GeoEntityQuery(vQuery); + + StringBuffer sql = new StringBuffer(); + sql.append("SELECT ST_AsText(ST_Extent(" + query.getGeoMultiPolygon().getDbColumnName() + ")) AS bbox"); + sql.append(" FROM universal, geo_entity, located_in WHERE geo_entity.universal = universal.id"); + sql.append(" AND ((located_in.parent_id ='" + entity.getId() + "'"); + sql.append(" AND geo_entity.id = located_in.child_id)"); + sql.append(" AND geo_entity.universal = '" + universalId + "');"); + + ResultSet bboxResult = Database.query(sql.toString()); + + return formatBBox(bboxResult).toString(); + } + + + /** + * Format the bounding box result set returned from a PostGIS database query + * + * @param resultSet + * @return + */ + public static JSONArray formatBBox(ResultSet resultSet) + { + JSONArray bboxArr = new JSONArray(); + + try + { + if (resultSet.next()) + { + String bbox = resultSet.getString("bbox"); + if (bbox != null) + { + Pattern p = Pattern.compile("POLYGON\\(\\((.*)\\)\\)"); + Matcher m = p.matcher(bbox); + + if (m.matches()) + { + String coordinates = m.group(1); + List coords = new LinkedList(); + + for (String c : coordinates.split(",")) + { + String[] xAndY = c.split(" "); + double x = Double.valueOf(xAndY[0]); + double y = Double.valueOf(xAndY[1]); + + coords.add(new Coordinate(x, y)); + } + + Envelope e = new Envelope(coords.get(0), coords.get(2)); + + try + { + bboxArr.put(e.getMinX()); + bboxArr.put(e.getMinY()); + bboxArr.put(e.getMaxX()); + bboxArr.put(e.getMaxY()); + } + catch (JSONException ex) + { + throw new ProgrammingErrorException(ex); + } + } + else + { + String error = "Could not create a valid bounding box"; + + throw new ProgrammingErrorException(error); + } + } + } + } + catch (SQLException sqlEx1) + { + Database.throwDatabaseException(sqlEx1); + } + finally + { + try + { + java.sql.Statement statement = resultSet.getStatement(); + resultSet.close(); + statement.close(); + } + catch (SQLException sqlEx2) + { + Database.throwDatabaseException(sqlEx2); + } + } + + return bboxArr; + } + public static ValueQuery getChildren(String id, String universalId, Integer limit) { @@ -715,7 +1076,7 @@ public static ValueQuery getChildren(String id, String universalId, Integer limi { vQuery.restrictRows(limit, 1); } - + return vQuery; } @@ -767,10 +1128,29 @@ public static GeoEntity getEntity(String id) public static String publishLayers(String id, String universalId, String existingLayerNames) { - LocationLayerPublisher publisher = new LocationLayerPublisher(id, universalId, existingLayerNames); - JSONArray layers = publisher.publish(); + LocationTargetPublisher publisher = new LocationTargetPublisher(id, universalId, existingLayerNames); + + StringWriter writer = new StringWriter(); + JSONWriter jw = new JSONWriter(writer); + + try + { + publisher.writeGeojson(jw); + + return writer.toString(); + } + finally + { + try + { + writer.close(); + } + catch (IOException e) + { + throw new ProgrammingErrorException("Could not close IO stream.", e); + } + } - return layers.toString(); } @Transaction @@ -796,4 +1176,45 @@ public static void refreshViews(String layers) throw new ProgrammingErrorException(e); } } + + public static InputStream getData(String config) + { + try + { + JSONObject object = new JSONObject(config); + String type = object.getString("type"); + + List configurations = ConfigurationService.getConfigurations(); + + for (ConfigurationIF configuration : configurations) + { + if (configuration.hasLocationData(type)) + { + return configuration.getLocationData(type, object); + } + } + + throw new ProgrammingErrorException("Unsupported type [" + type + "]"); + } + catch (Exception e) + { + throw new ProgrammingErrorException(e); + } + } + + @Transaction + @Authenticate + public static void deleteGeoEntity(String id) + { + GeoEntity entity = GeoEntity.get(id); + + List configurations = ConfigurationService.getConfigurations(); + + for (ConfigurationIF configuration : configurations) + { + configuration.onEntityDelete(entity); + } + + entity.delete(); + } } diff --git a/geoprism-server/src/main/java/net/geoprism/ConfigurationIF.java b/geoprism-server/src/main/java/net/geoprism/ConfigurationIF.java index 0654f3b68..f75c61084 100644 --- a/geoprism-server/src/main/java/net/geoprism/ConfigurationIF.java +++ b/geoprism-server/src/main/java/net/geoprism/ConfigurationIF.java @@ -18,9 +18,12 @@ */ package net.geoprism; +import java.io.InputStream; import java.util.Collection; import java.util.Set; +import org.json.JSONObject; + import com.runwaysdk.dataaccess.MdClassDAOIF; import com.runwaysdk.generation.loader.Reloadable; import com.runwaysdk.system.gis.geo.GeoEntity; @@ -72,4 +75,29 @@ public interface ConfigurationIF extends Reloadable public boolean hasAccess(String functionality); public GeoEntity getDefaultGeoEntity(); + + /** + * Returns if the configuration supports the location query + * + * @param type + * @return + */ + public boolean hasLocationData(String type); + + /** + * Returns if the location data corresponding to the query type + * + * @param type + * @param object + * + * @return + */ + public InputStream getLocationData(String type, JSONObject object); + + /** + * Extension point for deleting geo entities + * + * @param entity + */ + public void onEntityDelete(GeoEntity entity); } diff --git a/geoprism-server/src/main/java/net/geoprism/DefaultConfiguration.java b/geoprism-server/src/main/java/net/geoprism/DefaultConfiguration.java index 7c3db527a..08dc921e6 100644 --- a/geoprism-server/src/main/java/net/geoprism/DefaultConfiguration.java +++ b/geoprism-server/src/main/java/net/geoprism/DefaultConfiguration.java @@ -3,36 +3,45 @@ * * This file is part of Runway SDK(tm). * - * Runway SDK(tm) is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. + * Runway SDK(tm) is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General + * Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any + * later version. * - * Runway SDK(tm) is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. + * Runway SDK(tm) is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more + * details. * - * You should have received a copy of the GNU Lesser General Public - * License along with Runway SDK(tm). If not, see . + * You should have received a copy of the GNU Lesser General Public License along with Runway SDK(tm). If not, see + * . */ package net.geoprism; +import java.io.ByteArrayInputStream; +import java.io.InputStream; import java.util.Collection; +import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Set; -import net.geoprism.data.etl.TargetBuilder; - import org.apache.commons.lang.StringUtils; +import org.json.JSONException; +import org.json.JSONObject; import com.runwaysdk.business.rbac.Operation; import com.runwaysdk.business.rbac.RoleDAO; import com.runwaysdk.business.rbac.RoleDAOIF; import com.runwaysdk.dataaccess.MdClassDAOIF; import com.runwaysdk.dataaccess.MdRelationshipDAOIF; +import com.runwaysdk.dataaccess.ProgrammingErrorException; import com.runwaysdk.system.gis.geo.GeoEntity; +import com.vividsolutions.jts.geom.Envelope; + +import net.geoprism.data.etl.TargetBuilder; +import net.geoprism.ontology.CompositePublisher; +import net.geoprism.ontology.LocationContextPublisher; +import net.geoprism.ontology.LocationTargetPublisher; +import net.geoprism.ontology.PublisherUtil; public class DefaultConfiguration implements ConfigurationIF { @@ -42,6 +51,22 @@ public class DefaultConfiguration implements ConfigurationIF public static final String DECISION_MAKER = "geoprism.DecisionMaker"; + public static final String LM_TARGET = "LM_TARGET"; + + public static final String LM_CONTEXT = "LM_CONTEXT"; + + public static final String LM = "LM"; + + private Set types; + + public DefaultConfiguration() + { + this.types = new HashSet(); + this.types.add(LM_TARGET); + this.types.add(LM_CONTEXT); + this.types.add(LM); + } + @Override public Collection getDatabrowserPackages() { @@ -149,4 +174,59 @@ public GeoEntity getDefaultGeoEntity() { return null; } + + @Override + public boolean hasLocationData(String type) + { + return this.types.contains(type); + } + + @Override + public InputStream getLocationData(String type, JSONObject object) + { + try + { + if (this.hasLocationData(type)) + { + String id = object.getString("id"); + String universalId = object.has("universalId") ? object.getString("universalId") : null; + + Envelope envelope = PublisherUtil.getTileBounds(object); + + if (type.equals(LM_CONTEXT)) + { + LocationContextPublisher publisher = new LocationContextPublisher(id, ""); + byte[] bytes = publisher.writeVectorTiles(envelope); + + return new ByteArrayInputStream(bytes); + } + else if (type.equals(LM_TARGET)) + { + LocationTargetPublisher publisher = new LocationTargetPublisher(id, universalId, ""); + byte[] bytes = publisher.writeVectorTiles(envelope); + + return new ByteArrayInputStream(bytes); + } + else if (type.equals(LM)) + { + CompositePublisher publisher = new CompositePublisher(new LocationTargetPublisher(id, universalId, ""), new LocationContextPublisher(id, "")); + byte[] bytes = publisher.writeVectorTiles(envelope); + + return new ByteArrayInputStream(bytes); + } + } + + throw new ProgrammingErrorException("Unsupported type [" + type + "]"); + } + catch (JSONException e) + { + throw new ProgrammingErrorException(e); + } + } + + @Override + public void onEntityDelete(GeoEntity entity) + { + // Do nothing + } } diff --git a/geoprism-server/src/main/java/net/geoprism/data/GeometrySerializationUtil.java b/geoprism-server/src/main/java/net/geoprism/data/GeometrySerializationUtil.java new file mode 100644 index 000000000..5df9edd4c --- /dev/null +++ b/geoprism-server/src/main/java/net/geoprism/data/GeometrySerializationUtil.java @@ -0,0 +1,55 @@ +package net.geoprism.data; + +import org.json.JSONArray; +import org.json.JSONException; + +import com.vividsolutions.jts.geom.Coordinate; +import com.vividsolutions.jts.geom.GeometryFactory; +import com.vividsolutions.jts.geom.MultiPolygon; +import com.vividsolutions.jts.geom.Polygon; + +public class GeometrySerializationUtil { + + private GeometryFactory geometryFactory; + + public GeometrySerializationUtil(GeometryFactory geometryFactory) + { + this.geometryFactory = geometryFactory; + } + + public Coordinate jsonToCoordinate(JSONArray jsonPoint) throws JSONException + { + double x = jsonPoint.getDouble(0); + double y = jsonPoint.getDouble(1); + + Coordinate coord = new Coordinate(x, y); + + return coord; + } + + public Polygon jsonToPolygon(JSONArray jsonPoly) throws JSONException + { + Coordinate[] coords = new Coordinate[jsonPoly.length()]; + for (int i = 0; i < jsonPoly.length(); ++i) + { + JSONArray jsonPoint = jsonPoly.getJSONArray(i); + + coords[i] = jsonToCoordinate(jsonPoint); + } + + return geometryFactory.createPolygon(coords); + } + + public MultiPolygon jsonToMultiPolygon(JSONArray jsonMultiPoly) throws JSONException + { + Polygon[] polygons = new Polygon[jsonMultiPoly.length()]; + for (int i = 0; i < jsonMultiPoly.length(); ++i) + { + JSONArray jsonPoly = jsonMultiPoly.getJSONArray(i); + + polygons[i] = jsonToPolygon(jsonPoly); + } + + return geometryFactory.createMultiPolygon(polygons); + } +} diff --git a/geoprism-server/src/main/java/net/geoprism/data/GeoprismDatasetExporterIF.java b/geoprism-server/src/main/java/net/geoprism/data/GeoprismDatasetExporterIF.java new file mode 100644 index 000000000..1a98061e2 --- /dev/null +++ b/geoprism-server/src/main/java/net/geoprism/data/GeoprismDatasetExporterIF.java @@ -0,0 +1,31 @@ +/** + * Copyright (c) 2015 TerraFrame, Inc. All rights reserved. + * + * This file is part of Runway SDK(tm). + * + * Runway SDK(tm) is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * Runway SDK(tm) is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with Runway SDK(tm). If not, see . + */ +package net.geoprism.data; + +import com.runwaysdk.system.metadata.MdClass; + +/** + * Allows for IOC pluggable export utilites on MappableClass. Originally designed for the DHIS2Exporter. + * + * @author rrowlands + */ +public interface GeoprismDatasetExporterIF +{ + public void xport(MdClass mdClass); +} diff --git a/geoprism-server/src/main/java/net/geoprism/data/GeoprismDatasetExporterService.java b/geoprism-server/src/main/java/net/geoprism/data/GeoprismDatasetExporterService.java new file mode 100644 index 000000000..3466345f3 --- /dev/null +++ b/geoprism-server/src/main/java/net/geoprism/data/GeoprismDatasetExporterService.java @@ -0,0 +1,46 @@ +/** + * Copyright (c) 2015 TerraFrame, Inc. All rights reserved. + * + * This file is part of Runway SDK(tm). + * + * Runway SDK(tm) is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * Runway SDK(tm) is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with Runway SDK(tm). If not, see . + */ +package net.geoprism.data; + +import java.util.Iterator; +import java.util.ServiceConfigurationError; +import java.util.ServiceLoader; + +import com.runwaysdk.dataaccess.ProgrammingErrorException; +import com.runwaysdk.generation.loader.DelegatingClassLoader; +import com.runwaysdk.generation.loader.LoaderDecorator; + +public class GeoprismDatasetExporterService +{ + public static Iterator getAllExporters() + { + ServiceLoader loader = ServiceLoader.load(GeoprismDatasetExporterIF.class, ( (DelegatingClassLoader) LoaderDecorator.instance() )); + + try + { + Iterator it = loader.iterator(); + + return it; + } + catch (ServiceConfigurationError serviceError) + { + throw new ProgrammingErrorException(serviceError); + } + } +} diff --git a/geoprism-server/src/main/java/net/geoprism/data/etl/SourceBuilder.java b/geoprism-server/src/main/java/net/geoprism/data/etl/SourceBuilder.java index 6d3673cd1..30a8fd5ca 100644 --- a/geoprism-server/src/main/java/net/geoprism/data/etl/SourceBuilder.java +++ b/geoprism-server/src/main/java/net/geoprism/data/etl/SourceBuilder.java @@ -59,9 +59,9 @@ public void build() { JSONArray cSheets = configuration.getJSONArray("sheets"); - for (int i = 0; i < cSheets.length(); i++) +// for (int i = 0; i < cSheets.length(); i++) { - JSONObject sheet = cSheets.getJSONObject(i); + JSONObject sheet = cSheets.getJSONObject(0); if (sheet.has("existing")) { diff --git a/geoprism-server/src/main/java/net/geoprism/data/etl/TargetBuilder.java b/geoprism-server/src/main/java/net/geoprism/data/etl/TargetBuilder.java index e34534b2e..f9a739957 100644 --- a/geoprism-server/src/main/java/net/geoprism/data/etl/TargetBuilder.java +++ b/geoprism-server/src/main/java/net/geoprism/data/etl/TargetBuilder.java @@ -117,9 +117,9 @@ public void build() { JSONArray cSheets = configuration.getJSONArray("sheets"); - for (int i = 0; i < cSheets.length(); i++) +// for (int i = 0; i < cSheets.length(); i++) { - JSONObject sheet = cSheets.getJSONObject(i); + JSONObject sheet = cSheets.getJSONObject(0); if (sheet.has("existing")) { @@ -269,45 +269,34 @@ private TargetDefinitionIF createMdBusiness(JSONObject cSheet) throws JSONExcept */ if (cSheet.has("coordinates")) { - JSONObject cCoordinates = cSheet.getJSONObject("coordinates"); - JSONObject values = cCoordinates.getJSONObject("values"); - JSONArray ids = cCoordinates.getJSONArray("ids"); + Object object = cSheet.get("coordinates"); - for (int i = 0; i < ids.length(); i++) + if (object instanceof JSONObject) { - String id = ids.getString(i); - JSONObject cField = values.getJSONObject(id); - String universalId = cField.getString("universal"); + JSONObject cCoordinates = (JSONObject) object; + JSONObject values = cCoordinates.getJSONObject("values"); + JSONArray ids = cCoordinates.getJSONArray("ids"); - if (universalId != null && universalId.length() > 0) + for (int i = 0; i < ids.length(); i++) { - lowest = this.setLowest(lowest, universalId); + String id = ids.getString(i); + JSONObject cField = values.getJSONObject(id); + + lowest = this.createGeoNodeGeometry(sheetName, nodes, country, lowest, definition, mdBusiness, cField); } + } + else + { + JSONArray cCoordinates = (JSONArray) object; - TargetFieldIF point = this.createMdPoint(mdBusiness, sheetName, cField); - TargetFieldIF multiPolygon = this.createMdMultiPolygon(mdBusiness, sheetName, cField); - TargetFieldIF featureId = this.createFeatureId(mdBusiness, sheetName, cField); - TargetFieldIF location = this.createLocationField(mdBusiness, sheetName, cField, country, definition); - TargetFieldIF featureLabel = definition.getFieldByLabel(cField.getString("featureLabel")); - - definition.addField(point); - definition.addField(multiPolygon); - definition.addField(featureId); - definition.addField(location); - - // Create the geoNode - GeoNodeGeometry node = new GeoNodeGeometry(); - node.setKeyName(point.getKey()); - node.setGeoEntityAttribute(MdAttributeReference.getByKey(location.getKey())); - node.setIdentifierAttribute(MdAttribute.getByKey(featureId.getKey())); - node.setDisplayLabelAttribute(MdAttribute.getByKey(featureLabel.getKey())); - node.setGeometryAttribute(MdAttribute.getByKey(point.getKey())); - node.setMultiPolygonAttribute(MdAttributeMultiPolygon.getByKey(multiPolygon.getKey())); - node.setPointAttribute(MdAttributePoint.getByKey(point.getKey())); - node.apply(); - - nodes.add(node); + for (int i = 0; i < cCoordinates.length(); i++) + { + JSONObject cField = cCoordinates.getJSONObject(i); + + lowest = this.createGeoNodeGeometry(sheetName, nodes, country, lowest, definition, mdBusiness, cField); + } } + } /* @@ -354,29 +343,82 @@ private TargetDefinitionIF createMdBusiness(JSONObject cSheet) throws JSONExcept */ LocalPersistenceStrategy strategy = new LocalPersistenceStrategy(); strategy.apply(); - + definition.setStrategy(strategy); return definition; } + private Universal createGeoNodeGeometry(String sheetName, List nodes, GeoEntity country, Universal lowest, TargetDefinition definition, MdBusinessDAO mdBusiness, JSONObject cField) throws JSONException + { + String universalId = cField.getString("universal"); + + if (universalId != null && universalId.length() > 0) + { + lowest = this.setLowest(lowest, universalId); + } + + TargetFieldIF point = this.createMdPoint(mdBusiness, sheetName, cField); + TargetFieldIF multiPolygon = this.createMdMultiPolygon(mdBusiness, sheetName, cField); + TargetFieldIF featureId = this.createFeatureId(mdBusiness, sheetName, cField); + TargetFieldIF location = this.createLocationField(mdBusiness, sheetName, cField, country, definition); + TargetFieldIF featureLabel = definition.getFieldByLabel(cField.getString("featureLabel")); + + definition.addField(point); + definition.addField(multiPolygon); + definition.addField(featureId); + definition.addField(location); + + // Create the geoNode + GeoNodeGeometry node = new GeoNodeGeometry(); + node.setKeyName(point.getKey()); + node.setGeoEntityAttribute(MdAttributeReference.getByKey(location.getKey())); + node.setIdentifierAttribute(MdAttribute.getByKey(featureId.getKey())); + node.setDisplayLabelAttribute(MdAttribute.getByKey(featureLabel.getKey())); + node.setGeometryAttribute(MdAttribute.getByKey(point.getKey())); + node.setMultiPolygonAttribute(MdAttributeMultiPolygon.getByKey(multiPolygon.getKey())); + node.setPointAttribute(MdAttributePoint.getByKey(point.getKey())); + node.apply(); + + nodes.add(node); + + return lowest; + } + private Set getReferencedLocationAttributes(JSONObject cSheet) throws JSONException { Set locations = new TreeSet(); if (cSheet.has("coordinates")) { - JSONObject cCoordinates = cSheet.getJSONObject("coordinates"); - JSONObject values = cCoordinates.getJSONObject("values"); - JSONArray ids = cCoordinates.getJSONArray("ids"); + Object object = cSheet.get("coordinates"); - for (int i = 0; i < ids.length(); i++) + if (object instanceof JSONObject) { - String id = ids.getString(i); - JSONObject cField = values.getJSONObject(id); - String location = cField.getString("location"); + JSONObject cCoordinates = (JSONObject) object; + JSONObject values = cCoordinates.getJSONObject("values"); + JSONArray ids = cCoordinates.getJSONArray("ids"); - locations.add(location); + for (int i = 0; i < ids.length(); i++) + { + String id = ids.getString(i); + JSONObject cField = values.getJSONObject(id); + String location = cField.getString("location"); + + locations.add(location); + } + } + else + { + JSONArray cCoordinates = (JSONArray) object; + + for (int i = 0; i < cCoordinates.length(); i++) + { + JSONObject cField = cCoordinates.getJSONObject(i); + String location = cField.getString("location"); + + locations.add(location); + } } } @@ -499,7 +541,7 @@ private TargetFieldIF createMdAttribute(MdClassDAO mdClass, String sheetName, JS // Create the attribute if (columnType.equals(ColumnType.CATEGORY.name())) { - if (!cField.has("root")) + if (!cField.has("root") || cField.getString("root").length() == 0) { MdAttributeTermDAO mdAttribute = createMdAttributeTerm(mdClass, label, attributeName); diff --git a/geoprism-server/src/main/java/net/geoprism/ontology/CompositePublisher.java b/geoprism-server/src/main/java/net/geoprism/ontology/CompositePublisher.java new file mode 100644 index 000000000..d0c819bd9 --- /dev/null +++ b/geoprism-server/src/main/java/net/geoprism/ontology/CompositePublisher.java @@ -0,0 +1,32 @@ +package net.geoprism.ontology; + +import com.vividsolutions.jts.geom.Envelope; +import com.wdtinc.mapbox_vector_tile.VectorTile; +import com.wdtinc.mapbox_vector_tile.VectorTile.Tile; + +public class CompositePublisher +{ + private VectorLayerPublisherIF[] publishers; + + public CompositePublisher(VectorLayerPublisherIF... publishers) + { + this.publishers = publishers; + } + + public byte[] writeVectorTiles(Envelope envelope) + { + // Add built layer to MVT + final VectorTile.Tile.Builder builder = VectorTile.Tile.newBuilder(); + + for (VectorLayerPublisherIF publisher : this.publishers) + { + builder.addLayers(publisher.writeVectorLayer(envelope)); + } + + /// Build MVT + Tile mvt = builder.build(); + + return mvt.toByteArray(); + } + +} diff --git a/geoprism-server/src/main/java/net/geoprism/ontology/LayerPublisher.java b/geoprism-server/src/main/java/net/geoprism/ontology/LayerPublisher.java index c92939e77..51a9724b9 100644 --- a/geoprism-server/src/main/java/net/geoprism/ontology/LayerPublisher.java +++ b/geoprism-server/src/main/java/net/geoprism/ontology/LayerPublisher.java @@ -3,33 +3,61 @@ * * This file is part of Runway SDK(tm). * - * Runway SDK(tm) is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. + * Runway SDK(tm) is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General + * Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any + * later version. * - * Runway SDK(tm) is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. + * Runway SDK(tm) is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more + * details. * - * You should have received a copy of the GNU Lesser General Public - * License along with Runway SDK(tm). If not, see . + * You should have received a copy of the GNU Lesser General Public License along with Runway SDK(tm). If not, see + * . */ package net.geoprism.ontology; +import java.io.IOException; +import java.io.StringWriter; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.LinkedList; import java.util.List; +import java.util.Map; +import java.util.TreeMap; +import java.util.concurrent.ThreadLocalRandom; -import net.geoprism.data.DatabaseUtil; -import net.geoprism.gis.geoserver.GeoserverFacade; -import net.geoprism.gis.geoserver.GeoserverLayerIF; - +import org.geotools.geojson.geom.GeometryJSON; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; +import org.json.JSONWriter; +import org.postgis.jts.JtsGeometry; +import com.runwaysdk.dataaccess.AttributeIF; import com.runwaysdk.dataaccess.ProgrammingErrorException; +import com.runwaysdk.dataaccess.ValueObject; import com.runwaysdk.dataaccess.transaction.Transaction; +import com.runwaysdk.gis.dataaccess.AttributeGeometryIF; +import com.runwaysdk.query.OIterator; +import com.runwaysdk.query.ValueQuery; +import com.runwaysdk.system.gis.geo.GeoEntity; +import com.vividsolutions.jts.geom.Envelope; +import com.vividsolutions.jts.geom.Geometry; +import com.vividsolutions.jts.geom.GeometryFactory; +import com.wdtinc.mapbox_vector_tile.VectorTile; +import com.wdtinc.mapbox_vector_tile.VectorTile.Tile; +import com.wdtinc.mapbox_vector_tile.adapt.jts.IGeometryFilter; +import com.wdtinc.mapbox_vector_tile.adapt.jts.IUserDataConverter; +import com.wdtinc.mapbox_vector_tile.adapt.jts.JtsAdapter; +import com.wdtinc.mapbox_vector_tile.adapt.jts.TileGeomResult; +import com.wdtinc.mapbox_vector_tile.build.MvtLayerBuild; +import com.wdtinc.mapbox_vector_tile.build.MvtLayerParams; +import com.wdtinc.mapbox_vector_tile.build.MvtLayerProps; + +import net.geoprism.JSONStringImpl; +import net.geoprism.data.DatabaseUtil; +import net.geoprism.gis.geoserver.GeoserverFacade; +import net.geoprism.gis.geoserver.GeoserverLayerIF; public abstract class LayerPublisher { @@ -37,11 +65,14 @@ public static enum LayerType { POINT, POLYGON } - private String layers; + private String layers; + + private GeometryJSON gjson; public LayerPublisher(String layers) { this.layers = layers; + this.gjson = new GeometryJSON(8); } protected void removeGeoserverLayers() throws JSONException @@ -127,4 +158,232 @@ private List createDatabaseViews() throws JSONException } protected abstract List buildLayers(); + + protected JSONObject getProperties(ValueObject object) throws JSONException + { + AttributeIF[] attributes = object.getAttributeArrayIF(); + + JSONObject properties = new JSONObject(); + + for (AttributeIF attribute : attributes) + { + String name = attribute.getName(); + + if (!name.equals(GeoserverFacade.GEOM_COLUMN)) + { + properties.put(name, attribute.getValue()); + } + } + + return properties; + } + + protected void writeGeometry(ValueObject object, JSONWriter writer) throws IOException, JSONException + { + StringWriter geomWriter = new StringWriter(); + + AttributeGeometryIF attributeIF = (AttributeGeometryIF) object.getAttributeIF(GeoserverFacade.GEOM_COLUMN); + + this.gjson.write(attributeIF.getGeometry(), geomWriter); + + writer.value(new JSONStringImpl(geomWriter.toString())); + } + + protected long writeFeatures(JSONWriter writer, ValueQuery query) throws IOException + { + long count = 0; + + OIterator iterator = query.getIterator(); + + try + { + + while (iterator.hasNext()) + { + count++; + + ValueObject object = iterator.next(); + + JSONObject properties = this.getProperties(object); + + writer.object(); + + writer.key("type"); + writer.value("Feature"); + + writer.key("properties"); + writer.value(properties); + + writer.key("id"); + writer.value(object.getValue(GeoEntity.ID)); + + writer.key("geometry"); + this.writeGeometry(object, writer); + + writer.endObject(); + } + } + finally + { + iterator.close(); + } + + return count; + } + + protected void writeCRS(JSONWriter jw) + { + jw.key("crs"); + jw.value(new JSONObject("{\"type\":\"name\",\"properties\":{\"name\":\"urn:ogc:def:crs:EPSG::4326\"}}")); + } + + public abstract void writeGeojson(JSONWriter writer); + + protected Map getUserData(ValueObject object) + { + AttributeIF[] attributes = object.getAttributeArrayIF(); + + Map data = new TreeMap(); + + for (AttributeIF attribute : attributes) + { + String name = attribute.getName(); + + if (!name.equals(GeoserverFacade.GEOM_COLUMN)) + { + data.put(name, attribute.getValue()); + } + } + + return data; + } + + protected byte[] writeVectorTiles(String layerName, Envelope envelope, ValueQuery query) throws IOException + { + OIterator iterator = query.getIterator(); + + try + { + List geometries = new LinkedList(); + + while (iterator.hasNext()) + { + ValueObject object = iterator.next(); + + AttributeGeometryIF attributeIF = (AttributeGeometryIF) object.getAttributeIF(GeoserverFacade.GEOM_COLUMN); + + Geometry geometry = attributeIF.getGeometry(); + geometry.setUserData(this.getUserData(object)); + + geometries.add(geometry); + } + + + GeometryFactory geomFactory = new GeometryFactory(); + IGeometryFilter acceptAllGeomFilter = geometry -> true; + + MvtLayerParams layerParams = new MvtLayerParams(); + + TileGeomResult tileGeom = JtsAdapter.createTileGeom(geometries, envelope, geomFactory, layerParams, acceptAllGeomFilter); + + final VectorTile.Tile.Builder tileBuilder = VectorTile.Tile.newBuilder(); + + // Create MVT layer + final MvtLayerProps layerProps = new MvtLayerProps(); + final IUserDataConverter ignoreUserData = new UserDataConverter(); + + // MVT tile geometry to MVT features + final List features = JtsAdapter.toFeatures(tileGeom.mvtGeoms, layerProps, ignoreUserData); + + final VectorTile.Tile.Layer.Builder layerBuilder = MvtLayerBuild.newLayerBuilder(layerName, layerParams); + layerBuilder.addAllFeatures(features); + + MvtLayerBuild.writeProps(layerBuilder, layerProps); + + // Build MVT layer + final VectorTile.Tile.Layer layer = layerBuilder.build(); + + // Add built layer to MVT + tileBuilder.addLayers(layer); + + /// Build MVT + Tile mvt = tileBuilder.build(); + + return mvt.toByteArray(); + } + finally + { + iterator.close(); + } + } + + protected byte[] writeVectorTiles(String layerName, Envelope envelope, ResultSet resultSet) throws IOException + { + // Add built layer to MVT + final VectorTile.Tile.Builder builder = VectorTile.Tile.newBuilder(); + + builder.addLayers(this.writeVectorLayer(layerName, envelope, resultSet)); + + /// Build MVT + Tile mvt = builder.build(); + + return mvt.toByteArray(); + } + + public VectorTile.Tile.Layer writeVectorLayer(String layerName, Envelope envelope, ResultSet resultSet) throws IOException + { + try + { + List geometries = new LinkedList(); + + while (resultSet.next()) + { + Map data = new TreeMap(); + data.put(GeoEntity.ID, resultSet.getString("id")); + data.put(GeoEntity.DISPLAYLABEL, resultSet.getString("default_locale")); + data.put(GeoEntity.GEOID, resultSet.getString("geo_id")); + data.put("height", "15"); // TODO: This should be set on the GeoEntity + data.put("base", "0"); // TODO: This should be set on the GeoEntity + data.put("isClickable", "true"); + + JtsGeometry geom = (JtsGeometry) resultSet.getObject(GeoserverFacade.GEOM_COLUMN); + + if (geom != null) + { + Geometry geometry = geom.getGeometry(); + geometry.setUserData(data); + + geometries.add(geometry); + } + } + + GeometryFactory geomFactory = new GeometryFactory(); + IGeometryFilter acceptAllGeomFilter = geometry -> true; + + MvtLayerParams layerParams = new MvtLayerParams(); + + TileGeomResult tileGeom = JtsAdapter.createTileGeom(geometries, envelope, geomFactory, layerParams, acceptAllGeomFilter); + + final VectorTile.Tile.Builder tileBuilder = VectorTile.Tile.newBuilder(); + + // Create MVT layer + final MvtLayerProps layerProps = new MvtLayerProps(); + final IUserDataConverter ignoreUserData = new UserDataConverter(); + + // MVT tile geometry to MVT features + final List features = JtsAdapter.toFeatures(tileGeom.mvtGeoms, layerProps, ignoreUserData); + + final VectorTile.Tile.Layer.Builder layerBuilder = MvtLayerBuild.newLayerBuilder(layerName, layerParams); + layerBuilder.addAllFeatures(features); + + MvtLayerBuild.writeProps(layerBuilder, layerProps); + + // Build MVT layer + return layerBuilder.build(); + } + catch (SQLException e) + { + throw new ProgrammingErrorException(e); + } + } } diff --git a/geoprism-server/src/main/java/net/geoprism/ontology/LocationContextPublisher.java b/geoprism-server/src/main/java/net/geoprism/ontology/LocationContextPublisher.java new file mode 100644 index 000000000..b1462efd8 --- /dev/null +++ b/geoprism-server/src/main/java/net/geoprism/ontology/LocationContextPublisher.java @@ -0,0 +1,205 @@ +package net.geoprism.ontology; + +import java.io.IOException; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.LinkedList; +import java.util.List; + +import org.json.JSONException; +import org.json.JSONWriter; + +import com.runwaysdk.business.ontology.Term; +import com.runwaysdk.dataaccess.ProgrammingErrorException; +import com.runwaysdk.dataaccess.database.Database; +import com.runwaysdk.query.QueryFactory; +import com.runwaysdk.query.Selectable; +import com.runwaysdk.query.SelectableChar; +import com.runwaysdk.query.SelectableSingle; +import com.runwaysdk.query.ValueQuery; +import com.runwaysdk.system.gis.geo.AllowedIn; +import com.runwaysdk.system.gis.geo.GeoEntity; +import com.runwaysdk.system.gis.geo.GeoEntityQuery; +import com.runwaysdk.system.gis.geo.Universal; +import com.runwaysdk.system.gis.mapping.GeoserverFacade; +import com.vividsolutions.jts.geom.Envelope; +import com.wdtinc.mapbox_vector_tile.VectorTile; +import com.wdtinc.mapbox_vector_tile.VectorTile.Tile; +import com.wdtinc.mapbox_vector_tile.VectorTile.Tile.Layer; + +import net.geoprism.data.DatabaseUtil; +import net.geoprism.gis.geoserver.GeoserverLayer; +import net.geoprism.gis.geoserver.GeoserverLayerIF; +import net.geoprism.gis.geoserver.SessionPredicate; + +public class LocationContextPublisher extends LayerPublisher implements VectorLayerPublisherIF +{ + private String id; + + public LocationContextPublisher(String id, String layers) + { + super(layers); + + this.id = id; + } + + @Override + protected List buildLayers() + { + + GeoEntity entity = GeoEntity.get(this.id); + Universal universal = entity.getUniversal(); + List descendants = universal.getAllDescendants(AllowedIn.CLASS).getAll(); + + List layers = new LinkedList(); + layers.add(this.publishEntityLayer(entity, descendants)); + + return layers; + } + + private GeoserverLayerIF publishEntityLayer(GeoEntity entity, List descendants) + { + LayerType layerType = this.getEntityLayerType(descendants); + String sql = this.getEntityQuery(entity, layerType).getSQL(); + String viewName = SessionPredicate.generateId(); + + DatabaseUtil.createView(viewName, sql); + + GeoserverLayer layer = new GeoserverLayer(); + layer.setLayerName(viewName); + layer.setStyleName(this.getStyle(layerType)); + layer.setLayerType(layerType); + + return layer; + } + + private ValueQuery getEntityQuery(GeoEntity entity, LayerType type) + { + QueryFactory factory = new QueryFactory(); + ValueQuery query = new ValueQuery(factory); + + GeoEntityQuery geQ1 = new GeoEntityQuery(query); + + // Id column + SelectableChar id = geQ1.getId(GeoEntity.ID); + id.setColumnAlias(GeoEntity.ID); + + // geoentity label + SelectableSingle label = geQ1.getDisplayLabel().localize(GeoEntity.DISPLAYLABEL); + label.setColumnAlias(GeoEntity.DISPLAYLABEL); + + // geo id (for uniqueness) + Selectable geoId = geQ1.getGeoId(GeoEntity.GEOID); + geoId.setColumnAlias(GeoEntity.GEOID); + + Selectable geom = ( type.equals(LayerType.POINT) ? geQ1.get(GeoEntity.GEOPOINT) : geQ1.get(GeoEntity.GEOMULTIPOLYGON) ); + geom.setColumnAlias(GeoserverFacade.GEOM_COLUMN); + geom.setUserDefinedAlias(GeoserverFacade.GEOM_COLUMN); + + query.SELECT(id, label, geoId, geom); + query.WHERE(geQ1.getId().EQ(entity.getId())); + + return query; + } + + private LayerType getEntityLayerType(List descendants) + { + return LayerType.POLYGON; + } + + public void writeGeojson(JSONWriter writer) + { + GeoEntity entity = GeoEntity.get(this.id); + Universal universal = entity.getUniversal(); + List descendants = universal.getAllDescendants(AllowedIn.CLASS).getAll(); + + try + { + LayerType entityLayerType = this.getEntityLayerType(descendants); + ValueQuery entityQuery = this.getEntityQuery(entity, entityLayerType); + + this.writeGeojson(writer, entityQuery); + } + catch (JSONException | IOException e) + { + throw new ProgrammingErrorException(e); + } + } + + private void writeGeojson(JSONWriter writer, ValueQuery query) throws IOException + { + writer.object(); + + writer.key("type"); + writer.value("FeatureCollection"); + writer.key("features"); + writer.array(); + + long count = this.writeFeatures(writer, query); + + writer.endArray(); + + writer.key("totalFeatures"); + writer.value(count); + + this.writeCRS(writer); + + writer.endObject(); + } + + @Override + public String getLayerName() + { + return "context"; + } + + private ResultSet getResultSet(String entityId, LayerType type) + { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ge.id, gdl.default_locale, ge.geo_id, ST_Transform(ge.geo_multi_polygon, 3857) AS " + GeoserverFacade.GEOM_COLUMN + "\n"); + sql.append("FROM geo_entity AS ge\n"); + sql.append("JOIN geo_entity_display_label AS gdl ON gdl.id = ge.display_label\n"); + sql.append("WHERE ge.id = '" + entityId + "'\n"); + sql.append("AND ge.geo_multi_polygon IS NOT NULL\n"); + + return Database.query(sql.toString()); + } + + @Override + public Layer writeVectorLayer(Envelope envelope) + { + try + { + ResultSet resultSet = this.getResultSet(this.id, LayerType.POLYGON); + + try + { + String layerName = this.getLayerName(); + + return this.writeVectorLayer(layerName, envelope, resultSet); + } + finally + { + resultSet.close(); + } + } + catch (JSONException | IOException | SQLException e) + { + throw new ProgrammingErrorException(e); + } + } + + public byte[] writeVectorTiles(Envelope envelope) + { + // Add built layer to MVT + final VectorTile.Tile.Builder builder = VectorTile.Tile.newBuilder(); + + builder.addLayers(this.writeVectorLayer(envelope)); + + /// Build MVT + Tile mvt = builder.build(); + + return mvt.toByteArray(); + } + +} diff --git a/geoprism-server/src/main/java/net/geoprism/ontology/LocationLayerPublisher.java b/geoprism-server/src/main/java/net/geoprism/ontology/LocationLayerPublisher.java deleted file mode 100644 index 484afbe74..000000000 --- a/geoprism-server/src/main/java/net/geoprism/ontology/LocationLayerPublisher.java +++ /dev/null @@ -1,173 +0,0 @@ -/** - * Copyright (c) 2015 TerraFrame, Inc. All rights reserved. - * - * This file is part of Runway SDK(tm). - * - * Runway SDK(tm) is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * Runway SDK(tm) is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with Runway SDK(tm). If not, see . - */ -package net.geoprism.ontology; - -import java.util.LinkedList; -import java.util.List; - -import net.geoprism.data.DatabaseUtil; -import net.geoprism.gis.geoserver.GeoserverFacade; -import net.geoprism.gis.geoserver.GeoserverLayer; -import net.geoprism.gis.geoserver.GeoserverLayerIF; -import net.geoprism.gis.geoserver.SessionPredicate; - -import com.runwaysdk.business.ontology.Term; -import com.runwaysdk.query.QueryFactory; -import com.runwaysdk.query.Selectable; -import com.runwaysdk.query.SelectableChar; -import com.runwaysdk.query.SelectableSingle; -import com.runwaysdk.query.ValueQuery; -import com.runwaysdk.system.gis.geo.AllowedIn; -import com.runwaysdk.system.gis.geo.GeoEntity; -import com.runwaysdk.system.gis.geo.GeoEntityQuery; -import com.runwaysdk.system.gis.geo.LocatedInQuery; -import com.runwaysdk.system.gis.geo.Universal; - -public class LocationLayerPublisher extends LayerPublisher -{ - private String id; - - private String universalId; - - public LocationLayerPublisher(String id, String universalId, String layers) - { - super(layers); - - this.id = id; - this.universalId = universalId; - } - - @Override - protected List buildLayers() - { - - GeoEntity entity = GeoEntity.get(this.id); - Universal universal = entity.getUniversal(); - List descendants = universal.getAllDescendants(AllowedIn.CLASS).getAll(); - - List layers = new LinkedList(); - layers.add(this.publishEntityLayer(entity, descendants)); - layers.add(this.publishChildLayer(entity, descendants)); - - return layers; - } - - private GeoserverLayerIF publishChildLayer(GeoEntity entity, List descendants) - { - LayerType layerType = this.getChildLayerType(descendants); - String viewName = SessionPredicate.generateId(); - String sql = this.getChildQuery(entity, layerType).getSQL(); - - DatabaseUtil.createView(viewName, sql); - - GeoserverLayer layer = new GeoserverLayer(); - layer.setLayerName(viewName); - layer.setStyleName(this.getStyle(layerType)); - layer.setLayerType(layerType); - - return layer; - } - - private GeoserverLayerIF publishEntityLayer(GeoEntity entity, List descendants) - { - LayerType layerType = this.getEntityLayerType(descendants); - String viewName = SessionPredicate.generateId(); - String sql = this.getEntityQuery(entity, layerType).getSQL(); - - DatabaseUtil.createView(viewName, sql); - - GeoserverLayer layer = new GeoserverLayer(); - layer.setLayerName(viewName); - layer.setStyleName(this.getStyle(layerType)); - layer.setLayerType(layerType); - - return layer; - } - - private ValueQuery getEntityQuery(GeoEntity entity, LayerType type) - { - QueryFactory factory = new QueryFactory(); - ValueQuery query = new ValueQuery(factory); - - GeoEntityQuery geQ1 = new GeoEntityQuery(query); - - // Id column - SelectableChar id = geQ1.getId(GeoEntity.ID); - id.setColumnAlias(GeoEntity.ID); - - // geoentity label - SelectableSingle label = geQ1.getDisplayLabel().localize(GeoEntity.DISPLAYLABEL); - label.setColumnAlias(GeoEntity.DISPLAYLABEL); - - // geo id (for uniqueness) - Selectable geoId = geQ1.getGeoId(GeoEntity.GEOID); - geoId.setColumnAlias(GeoEntity.GEOID); - - Selectable geom = ( type.equals(LayerType.POINT) ? geQ1.get(GeoEntity.GEOPOINT) : geQ1.get(GeoEntity.GEOMULTIPOLYGON) ); - geom.setColumnAlias(GeoserverFacade.GEOM_COLUMN); - geom.setUserDefinedAlias(GeoserverFacade.GEOM_COLUMN); - - query.SELECT(id, label, geoId, geom); - query.WHERE(geQ1.getId().EQ(entity.getId())); - - return query; - } - - private ValueQuery getChildQuery(GeoEntity entity, LayerType type) - { - ValueQuery vQuery = new ValueQuery(new QueryFactory()); - LocatedInQuery liQuery = new LocatedInQuery(vQuery); - GeoEntityQuery query = new GeoEntityQuery(vQuery); - - // Id column - SelectableChar id = query.getId(GeoEntity.ID); - id.setColumnAlias(GeoEntity.ID); - - SelectableSingle label = query.getDisplayLabel().localize(GeoEntity.DISPLAYLABEL); - label.setColumnAlias(GeoEntity.DISPLAYLABEL); - - Selectable geoId = query.getGeoId(GeoEntity.GEOID); - geoId.setColumnAlias(GeoEntity.GEOID); - - Selectable geom = ( type.equals(LayerType.POINT) ? query.get(GeoEntity.GEOPOINT) : query.get(GeoEntity.GEOMULTIPOLYGON) ); - geom.setColumnAlias(GeoserverFacade.GEOM_COLUMN); - geom.setUserDefinedAlias(GeoserverFacade.GEOM_COLUMN); - - vQuery.SELECT(id, label, geoId, geom); - vQuery.WHERE(liQuery.parentId().EQ(entity.getId())); - vQuery.AND(query.locatedIn(liQuery)); - - if(this.universalId != null && this.universalId.length() > 0) - { - vQuery.AND(query.getUniversal().EQ(this.universalId)); - } - - return vQuery; - } - - private LayerType getChildLayerType(List descendants) - { - return descendants.size() <= 1 ? LayerType.POINT : LayerType.POLYGON; - } - - private LayerType getEntityLayerType(List descendants) - { - return descendants.size() == 0 ? LayerType.POINT : LayerType.POLYGON; - } -} diff --git a/geoprism-server/src/main/java/net/geoprism/ontology/LocationTargetPublisher.java b/geoprism-server/src/main/java/net/geoprism/ontology/LocationTargetPublisher.java new file mode 100644 index 000000000..8b1113fe8 --- /dev/null +++ b/geoprism-server/src/main/java/net/geoprism/ontology/LocationTargetPublisher.java @@ -0,0 +1,233 @@ +/** + * Copyright (c) 2015 TerraFrame, Inc. All rights reserved. + * + * This file is part of Runway SDK(tm). + * + * Runway SDK(tm) is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General + * Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any + * later version. + * + * Runway SDK(tm) is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more + * details. + * + * You should have received a copy of the GNU Lesser General Public License along with Runway SDK(tm). If not, see + * . + */ +package net.geoprism.ontology; + +import java.io.IOException; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.LinkedList; +import java.util.List; + +import org.json.JSONException; +import org.json.JSONWriter; + +import com.runwaysdk.business.ontology.Term; +import com.runwaysdk.dataaccess.ProgrammingErrorException; +import com.runwaysdk.dataaccess.database.Database; +import com.runwaysdk.query.QueryFactory; +import com.runwaysdk.query.Selectable; +import com.runwaysdk.query.SelectableChar; +import com.runwaysdk.query.SelectableSingle; +import com.runwaysdk.query.ValueQuery; +import com.runwaysdk.system.gis.geo.AllowedIn; +import com.runwaysdk.system.gis.geo.GeoEntity; +import com.runwaysdk.system.gis.geo.GeoEntityQuery; +import com.runwaysdk.system.gis.geo.LocatedInQuery; +import com.runwaysdk.system.gis.geo.Universal; +import com.vividsolutions.jts.geom.Envelope; +import com.wdtinc.mapbox_vector_tile.VectorTile; +import com.wdtinc.mapbox_vector_tile.VectorTile.Tile; +import com.wdtinc.mapbox_vector_tile.VectorTile.Tile.Layer; + +import net.geoprism.data.DatabaseUtil; +import net.geoprism.gis.geoserver.GeoserverFacade; +import net.geoprism.gis.geoserver.GeoserverLayer; +import net.geoprism.gis.geoserver.GeoserverLayerIF; +import net.geoprism.gis.geoserver.SessionPredicate; + +public class LocationTargetPublisher extends LayerPublisher implements VectorLayerPublisherIF +{ + private String id; + + private String universalId; + + public LocationTargetPublisher(String id, String universalId, String layers) + { + super(layers); + + this.id = id; + this.universalId = universalId; + } + + @Override + protected List buildLayers() + { + + GeoEntity entity = GeoEntity.get(this.id); + Universal universal = entity.getUniversal(); + List descendants = universal.getAllDescendants(AllowedIn.CLASS).getAll(); + + List layers = new LinkedList(); + layers.add(this.publishLayer(entity, descendants)); + + return layers; + } + + private GeoserverLayerIF publishLayer(GeoEntity entity, List descendants) + { + LayerType layerType = this.getLayerType(descendants); + String sql = this.getQuery(entity, layerType).getSQL(); + String viewName = SessionPredicate.generateId(); + + DatabaseUtil.createView(viewName, sql); + + GeoserverLayer layer = new GeoserverLayer(); + layer.setLayerName(viewName); + layer.setStyleName(this.getStyle(layerType)); + layer.setLayerType(layerType); + + return layer; + } + + private ValueQuery getQuery(GeoEntity entity, LayerType type) + { + ValueQuery vQuery = new ValueQuery(new QueryFactory()); + LocatedInQuery liQuery = new LocatedInQuery(vQuery); + GeoEntityQuery query = new GeoEntityQuery(vQuery); + + // Id column + SelectableChar id = query.getId(GeoEntity.ID); + id.setColumnAlias(GeoEntity.ID); + + SelectableSingle label = query.getDisplayLabel().localize(GeoEntity.DISPLAYLABEL); + label.setColumnAlias(GeoEntity.DISPLAYLABEL); + + Selectable geoId = query.getGeoId(GeoEntity.GEOID); + geoId.setColumnAlias(GeoEntity.GEOID); + + Selectable geom = ( type.equals(LayerType.POINT) ? query.get(GeoEntity.GEOPOINT) : query.get(GeoEntity.GEOMULTIPOLYGON) ); + geom.setColumnAlias(GeoserverFacade.GEOM_COLUMN); + geom.setUserDefinedAlias(GeoserverFacade.GEOM_COLUMN); + + vQuery.SELECT(id, label, geoId, geom); + vQuery.WHERE(liQuery.parentId().EQ(entity.getId())); + vQuery.AND(query.locatedIn(liQuery)); + + if (this.universalId != null && this.universalId.length() > 0) + { + vQuery.AND(query.getUniversal().EQ(this.universalId)); + } + + return vQuery; + } + + private LayerType getLayerType(List descendants) + { + return LayerType.POLYGON; + } + + public void writeGeojson(JSONWriter writer) + { + GeoEntity entity = GeoEntity.get(this.id); + Universal universal = entity.getUniversal(); + List descendants = universal.getAllDescendants(AllowedIn.CLASS).getAll(); + + try + { + LayerType childLayerType = this.getLayerType(descendants); + ValueQuery childQuery = this.getQuery(entity, childLayerType); + + this.writeGeojson(writer, childQuery); + } + catch (JSONException | IOException e) + { + throw new ProgrammingErrorException(e); + } + } + + private void writeGeojson(JSONWriter writer, ValueQuery query) throws IOException + { + writer.object(); + + writer.key("type"); + writer.value("FeatureCollection"); + writer.key("features"); + writer.array(); + + long count = this.writeFeatures(writer, query); + + writer.endArray(); + + writer.key("totalFeatures"); + writer.value(count); + + this.writeCRS(writer); + + writer.endObject(); + } + + private ResultSet getResultSet(String entityId, LayerType type) + { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT ge.id, gdl.default_locale, ge.geo_id, ST_Transform(ge.geo_multi_polygon, 3857) AS " + GeoserverFacade.GEOM_COLUMN + "\n"); + sql.append("FROM geo_entity AS ge\n"); + sql.append("JOIN geo_entity_display_label AS gdl ON gdl.id = ge.display_label\n"); + sql.append("JOIN located_in AS li ON li.child_id = ge.id\n"); + sql.append("WHERE li.parent_id = '" + entityId + "'\n"); + sql.append("AND ge.geo_multi_polygon IS NOT NULL\n"); + + if (this.universalId != null && this.universalId.length() > 0) + { + sql.append("AND ge.universal = '" + this.universalId + "'\n"); + } + + return Database.query(sql.toString()); + } + + @Override + public String getLayerName() + { + return "target"; + } + + @Override + public Layer writeVectorLayer(Envelope envelope) + { + try + { + ResultSet resultSet = this.getResultSet(this.id, LayerType.POLYGON); + + try + { + String layerName = this.getLayerName(); + + return this.writeVectorLayer(layerName, envelope, resultSet); + } + finally + { + resultSet.close(); + } + } + catch (JSONException | IOException | SQLException e) + { + throw new ProgrammingErrorException(e); + } + } + + public byte[] writeVectorTiles(Envelope envelope) + { + // Add built layer to MVT + final VectorTile.Tile.Builder builder = VectorTile.Tile.newBuilder(); + + builder.addLayers(this.writeVectorLayer(envelope)); + + /// Build MVT + Tile mvt = builder.build(); + + return mvt.toByteArray(); + } +} diff --git a/geoprism-server/src/main/java/net/geoprism/ontology/PublisherUtil.java b/geoprism-server/src/main/java/net/geoprism/ontology/PublisherUtil.java new file mode 100644 index 000000000..51356cb55 --- /dev/null +++ b/geoprism-server/src/main/java/net/geoprism/ontology/PublisherUtil.java @@ -0,0 +1,62 @@ +package net.geoprism.ontology; + +import org.geotools.geometry.jts.JTS; +import org.geotools.referencing.CRS; +import org.json.JSONException; +import org.json.JSONObject; +import org.opengis.referencing.FactoryException; +import org.opengis.referencing.crs.CoordinateReferenceSystem; +import org.opengis.referencing.operation.MathTransform; +import org.opengis.referencing.operation.TransformException; + +import com.runwaysdk.dataaccess.ProgrammingErrorException; +import com.vividsolutions.jts.geom.Envelope; + +public class PublisherUtil +{ + public static Envelope getTileBounds(JSONObject object) + { + try + { + int x = object.getInt("x"); + int y = object.getInt("y"); + int zoom = object.getInt("z"); + + return PublisherUtil.getTileBounds(x, y, zoom); + } + catch (JSONException e) + { + throw new ProgrammingErrorException(e); + } + } + + public static Envelope getTileBounds(int x, int y, int zoom) + { + try + { + CoordinateReferenceSystem sourceCRS = CRS.decode("EPSG:4326", true); + CoordinateReferenceSystem targetCRS = CRS.decode("EPSG:3857", true); + MathTransform transform = CRS.findMathTransform(sourceCRS, targetCRS); + + Envelope envelope = new Envelope(getLong(x, zoom), getLong(x + 1, zoom), getLat(y, zoom), getLat(y + 1, zoom)); + + return JTS.transform(envelope, transform); + } + catch (FactoryException | TransformException e) + { + throw new ProgrammingErrorException(e); + } + } + + public static double getLong(int x, int zoom) + { + return ( x / Math.pow(2, zoom) * 360 - 180 ); + } + + public static double getLat(int y, int zoom) + { + double n = Math.PI - 2 * Math.PI * y / Math.pow(2, zoom); + // return ( 180 / Math.PI * Math.atan(0.5 * ( Math.exp(n) - Math.exp(-n) )) ); + return Math.toDegrees(Math.atan(Math.sinh(n))); + } +} diff --git a/geoprism-server/src/main/java/net/geoprism/ontology/UserDataConverter.java b/geoprism-server/src/main/java/net/geoprism/ontology/UserDataConverter.java new file mode 100644 index 000000000..8067c87b9 --- /dev/null +++ b/geoprism-server/src/main/java/net/geoprism/ontology/UserDataConverter.java @@ -0,0 +1,32 @@ +package net.geoprism.ontology; + +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +import com.wdtinc.mapbox_vector_tile.VectorTile.Tile.Feature.Builder; +import com.wdtinc.mapbox_vector_tile.adapt.jts.IUserDataConverter; +import com.wdtinc.mapbox_vector_tile.build.MvtLayerProps; + +public class UserDataConverter implements IUserDataConverter +{ + @Override + @SuppressWarnings("unchecked") + public void addTags(Object userData, MvtLayerProps layerProps, Builder featureBuilder) + { + if (userData != null) + { + Map data = (Map) userData; + Set> entries = data.entrySet(); + + for (Entry entry : entries) + { + int kIndex = layerProps.addKey(entry.getKey()); + int vIndex = layerProps.addValue(entry.getValue()); + + featureBuilder.addTags(kIndex); + featureBuilder.addTags(vIndex); + } + } + } +} diff --git a/geoprism-server/src/main/java/net/geoprism/ontology/VectorLayerPublisherIF.java b/geoprism-server/src/main/java/net/geoprism/ontology/VectorLayerPublisherIF.java new file mode 100644 index 000000000..d2298aa9b --- /dev/null +++ b/geoprism-server/src/main/java/net/geoprism/ontology/VectorLayerPublisherIF.java @@ -0,0 +1,11 @@ +package net.geoprism.ontology; + +import com.vividsolutions.jts.geom.Envelope; +import com.wdtinc.mapbox_vector_tile.VectorTile; + +public interface VectorLayerPublisherIF +{ + public String getLayerName(); + + public VectorTile.Tile.Layer writeVectorLayer(Envelope envelope); +} diff --git a/geoprism-server/src/main/resources/messages.properties b/geoprism-server/src/main/resources/messages.properties index e17e85d23..2121a6705 100755 --- a/geoprism-server/src/main/resources/messages.properties +++ b/geoprism-server/src/main/resources/messages.properties @@ -266,6 +266,7 @@ dashboard.descriptionLabel=Description dashboard.descriptionTooltip=Manage the description of this kaleidoscope dashboard.descriptionPlaceholderText=Enter a description for this kaleidoscope dashboard.errorsLabel=Errors +dashboard.messagesLabel=Messages dashboard.warning=Warning # Dashboard Export @@ -329,7 +330,7 @@ dashboardViewer.removeLayers=This change will remove the following layers: {0} dashboardViewer.information=Information dashboardViewer.ok=Ok dashboardViewer.administrationLinkLabel=Administration -dashboardViewer.userDashboardsLinkLabel=Your kaleidoscopes +dashboardViewer.userDashboardsLinkLabel=Your Kaleidoscopes dashboardViewer.userMenuLinkLabel=Home dashboardViewer.dataManagementLinkLabel=Data Management dashboardViewer.removeReportTooltip=Remove report @@ -337,6 +338,7 @@ dashboardViewer.remove=Remove report geoprismLanding.dashboards=KALEIDOSCOPES geoprismLanding.dataManagement=DATA MANAGEMENT +geoprismLanding.prismManagement=PRISM MANAGEMENT geoprismLanding.administration=Administration geoprismLanding.footerMessage="COMBINE DATA FROM MULTIPLE SOURCES TO LEARN THE REAL MEANING BEHIND THE BIG PICTURE" @@ -780,6 +782,7 @@ dataUploader.categoryAttribute=Attribute dataUploader.categoryAttributeHelpToolTip=Name of the attribute on which the category valdiation is failing. dataUploader.resolvedCategoryOption=Resolved as new category option dataUploader.createNewOptionTooltip=Create a new category option using this option name. +dataUploader.sheetWarning=Please note only the first sheet of the workbook will be imported # Dataset dataset.label=Label @@ -787,7 +790,8 @@ dataset.title=Manage Your Datasets dataset.header=Datasets dataset.removeTooltip=Delete dataset dataset.editTooltip=Edit dataset -dataset.removeContent=Are you sure you want to delete the dataset [{0}]? +dataset.exportTooltip=Export dataset to DHIS2 +dataset.removeContent=Are you sure you want to delete this dataset? dataset.deleteDatasetTitle=Delete dataset dataset.deleteDatasetTitle=Click to edit this datasets name dataset.delete=Delete @@ -797,13 +801,13 @@ dataset.loadingData=Loading data... dataset.datasetListInputTitle=Click to edit this datasets name dataset.attributes=Attributes dataset.category=Category: -dataset.description=Description -dataset.source=Source +dataset.description=Description (optional) +dataset.source=Source (optional) dataset.exportToolip=Export your dataset # Category Icon category.icon.deleteTitle=Delete icon -category.icon.removeContent=Are you sure you want to delete the icon [{0}]? +category.icon.removeContent=Are you sure you want to delete the icon? category.icon.delete=Delete category.icon.cancel=Cancel category.icon.title=Manage Custom Icons @@ -833,17 +837,17 @@ category.management.option.label=Option category.management.createSynonym=Merge this option into: category.management.restoreTooltip=Restore this synonym to its own option category.management.restoreSynonymTitle=Restore synonym -category.management.restoreConfirm=Are you sure you want to restore the synonym [{0}] to its own category option? +category.management.restoreConfirm=Are you sure you want to restore the synonym to its own category option? category.management.synonyms=Synonyms category.management.done=Done category.management.optionTitle=Edit category option category.management.add=Add new option category.management.removeOptionTitle=Delete option -category.management.removeOptionConfirm=Are you sure you want to delete the category option [{0}]? Any data which references this option will be modified. +category.management.removeOptionConfirm=Are you sure you want to delete this category option? Any data which references this option will be modified. category.management.editThisCategoryTooltip=Edit this category category.management.createCategoryOptionTooltip=Create a new option for this category category.management.removeTooltip=Remove category -category.management.removeCategoryConfirm=Are you sure you want to delete the category [{0}]? +category.management.removeCategoryConfirm=Are you sure you want to delete this category? # Location Management location.management.title=Location management @@ -862,7 +866,15 @@ location.management.newTooltip=Add a new location location.management.labelPlaceholder=Name of the location location.management.geoIdPlaceholder=Unique identifier of the location location.management.removeTitle=Delete location -location.management.removeConfirm=Are you sure you want to delete the location [{0}]? +location.management.removeConfirm=Are you sure you want to delete the location? + +# Editing tool +location.management.editing.edit=Edit Location Geometries +location.management.editing.new=New Location +location.management.editing.cancel=Cancel +location.management.editing.trash=Trash +location.management.editing.save=Save +location.management.editing.polygon=Polygon Tool # Data Management data.management.title=Data Management @@ -870,3 +882,9 @@ data.management.title=Data Management layer.category.configure=Configure category layer.category.ok=Ok layer.category.cancel=Cancel + +# Prism Management +prism.dashboard=Dashboard +prism.prisms=Prisms +prism.management.title=Prism Management +prism.loading=Loading content from server \ No newline at end of file diff --git a/geoprism-server/src/main/resources/project.json b/geoprism-server/src/main/resources/project.json index 07c34a8fd..3fd36efc7 100644 --- a/geoprism-server/src/main/resources/project.json +++ b/geoprism-server/src/main/resources/project.json @@ -1,3 +1,3 @@ { "countries":[] -} \ No newline at end of file +} diff --git a/geoprism-test/src/main/resources/runwaysdk/server.properties b/geoprism-test/src/main/resources/runwaysdk/server.properties index d46d8e734..0c0372fe8 100644 --- a/geoprism-test/src/main/resources/runwaysdk/server.properties +++ b/geoprism-test/src/main/resources/runwaysdk/server.properties @@ -73,7 +73,7 @@ database.execImport=pg_restore # Fully qualified name of the properties bundle representing your desired database database.vendor=com.runwaysdk.gis.constants.PostGIS database.hostURL=127.0.0.1 -database.port=5432 +database.port=5433 # RUNWAY will create a user with these properties and will use it to # modify database records diff --git a/geoprism-web/.gitignore b/geoprism-web/.gitignore index 7c8bc4128..caa6e63de 100644 --- a/geoprism-web/.gitignore +++ b/geoprism-web/.gitignore @@ -3,3 +3,855 @@ /.settings /cache/ /target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ +/target/ diff --git a/geoprism-web/pom.xml b/geoprism-web/pom.xml index 43542fdcf..049ff4add 100644 --- a/geoprism-web/pom.xml +++ b/geoprism-web/pom.xml @@ -37,6 +37,7 @@ geoprism geoprism 5432 + $${pageContext.request.contextPath} @@ -93,6 +94,13 @@ + + ng2-dev + + http://localhost:8080 + + + cargo-run @@ -239,6 +247,7 @@ maven-war-plugin 2.4 + **/prism.jsp **/*geoprism-common*.jar, @@ -345,6 +354,76 @@ + + org.codehaus.mojo + exec-maven-plugin + + + exec-npm-install + generate-sources + + ${project.basedir}/src/main/ng2 + npm + + install + + + + exec + + + + exec-typings-install + generate-sources + + ${project.basedir}/src/main/ng2 + typings + + install + lodash + + + + exec + + + + exec-npm-run-tsc + generate-sources + + ${project.basedir}/src/main/ng2 + npm + + run + build + + + + exec + + + + + + com.google.code.maven-replacer-plugin + maven-replacer-plugin + 1.4.1 + + + prepare-package + + replace + + + + + src/main/webapp/WEB-INF/net/geoprism/prism/prism.jsp + target/geoprism/WEB-INF/net/geoprism/prism/prism.jsp + false + $local.host$ + ${local.host} + + diff --git a/geoprism-web/src/main/ng2/.gitignore b/geoprism-web/src/main/ng2/.gitignore new file mode 100644 index 000000000..1e1eac0c6 --- /dev/null +++ b/geoprism-web/src/main/ng2/.gitignore @@ -0,0 +1,4 @@ +/node_modules/ +/typings/ +/src/app/**/*.js +/src/app/**/*.js.map diff --git a/geoprism-web/src/main/ng2/config/helpers.js b/geoprism-web/src/main/ng2/config/helpers.js new file mode 100644 index 000000000..253fa7d92 --- /dev/null +++ b/geoprism-web/src/main/ng2/config/helpers.js @@ -0,0 +1,7 @@ +var path = require('path'); +var _root = path.resolve(__dirname, '..'); +function root(args) { + args = Array.prototype.slice.call(arguments, 0); + return path.join.apply(path, [_root].concat(args)); +} +exports.root = root; \ No newline at end of file diff --git a/geoprism-web/src/main/ng2/config/karma-test-shim.js b/geoprism-web/src/main/ng2/config/karma-test-shim.js new file mode 100644 index 000000000..1c1040c98 --- /dev/null +++ b/geoprism-web/src/main/ng2/config/karma-test-shim.js @@ -0,0 +1,21 @@ +Error.stackTraceLimit = Infinity; + +require('core-js/es6'); +require('core-js/es7/reflect'); + +require('zone.js/dist/zone'); +require('zone.js/dist/long-stack-trace-zone'); +require('zone.js/dist/proxy'); +require('zone.js/dist/sync-test'); +require('zone.js/dist/jasmine-patch'); +require('zone.js/dist/async-test'); +require('zone.js/dist/fake-async-test'); + +var appContext = require.context('../src', true, /\.spec\.ts/); + +appContext.keys().forEach(appContext); + +var testing = require('@angular/core/testing'); +var browser = require('@angular/platform-browser-dynamic/testing'); + +testing.TestBed.initTestEnvironment(browser.BrowserDynamicTestingModule, browser.platformBrowserDynamicTesting()); \ No newline at end of file diff --git a/geoprism-web/src/main/ng2/config/karma.conf.js b/geoprism-web/src/main/ng2/config/karma.conf.js new file mode 100644 index 000000000..218e78d1a --- /dev/null +++ b/geoprism-web/src/main/ng2/config/karma.conf.js @@ -0,0 +1,38 @@ +var webpackConfig = require('./webpack.test'); + +module.exports = function (config) { + var _config = { + basePath: '', + + frameworks: ['jasmine'], + + files: [ + {pattern: './test/global.js', watched: false}, + {pattern: './config/karma-test-shim.js', watched: false} + ], + + preprocessors: { + './config/karma-test-shim.js': ['webpack', 'sourcemap'] + }, + + webpack: webpackConfig, + + webpackMiddleware: { + stats: 'errors-only' + }, + + webpackServer: { + noInfo: true + }, + + reporters: ['progress'], + port: 9876, + colors: true, + logLevel: config.LOG_INFO, + autoWatch: true, + browsers: ['Chrome'], + singleRun: false + }; + + config.set(_config); +}; \ No newline at end of file diff --git a/geoprism-web/src/main/ng2/config/webpack.common.js b/geoprism-web/src/main/ng2/config/webpack.common.js new file mode 100644 index 000000000..2a302bbfd --- /dev/null +++ b/geoprism-web/src/main/ng2/config/webpack.common.js @@ -0,0 +1,64 @@ +var webpack = require('webpack'); +var HtmlWebpackPlugin = require('html-webpack-plugin'); +var ExtractTextPlugin = require('extract-text-webpack-plugin'); +var helpers = require('./helpers'); + +module.exports = { + entry: { + 'polyfills': './src/polyfills.ts', + 'vendor': './src/vendor.ts', + 'app': './src/main.ts' + }, + + resolve: { + extensions: ['.ts', '.js'] + }, + + module: { + rules: [ + { + test: /\.ts$/, + loaders: [{ + loader: 'awesome-typescript-loader', + options: { configFileName: helpers.root('tsconfig.json') } + } , 'angular2-template-loader'] + }, + { + test: /\.html$/, + loader: 'html-loader' + }, + { + test: /\.(png|jpe?g|gif|svg|woff|woff2|ttf|eot|ico)$/, + loader: 'file-loader?name=assets/[name].[hash].[ext]' + }, + { + test: /\.css$/, + exclude: helpers.root('src', 'app'), + loader: ExtractTextPlugin.extract({ fallbackLoader: 'style-loader', loader: 'css-loader?sourceMap' }) + }, + { + test: /\.css$/, + include: helpers.root('src', 'app'), + loader: 'raw-loader' + } + ] + }, + + plugins: [ + // Workaround for angular/angular#11580 + new webpack.ContextReplacementPlugin( + // The (\\|\/) piece accounts for path separators in *nix and Windows + /angular(\\|\/)core(\\|\/)(esm(\\|\/)src|src)(\\|\/)linker/, + helpers.root('./src'), // location of your src + {} // a map of your routes + ), + + new webpack.optimize.CommonsChunkPlugin({ + name: ['app', 'vendor', 'polyfills'] + }), + +// new HtmlWebpackPlugin({ +// template: '../../webapp/WEB-INF/net/geoprism/prism/prism.jsp' +// }) + ] +}; \ No newline at end of file diff --git a/geoprism-web/src/main/ng2/config/webpack.dev.js b/geoprism-web/src/main/ng2/config/webpack.dev.js new file mode 100644 index 000000000..346678438 --- /dev/null +++ b/geoprism-web/src/main/ng2/config/webpack.dev.js @@ -0,0 +1,31 @@ +var webpackMerge = require('webpack-merge'); +var ExtractTextPlugin = require('extract-text-webpack-plugin'); +var commonConfig = require('./webpack.common.js'); +var helpers = require('./helpers'); + +const ENV = process.env.NODE_ENV = process.env.ENV = 'development'; + +module.exports = webpackMerge(commonConfig, { + devtool: 'cheap-module-eval-source-map', + + output: { + path: helpers.root('dist'), + publicPath: 'http://localhost:8080/dist/', + filename: '[name].js', + chunkFilename: '[id].chunk.js' + }, + + plugins: [ + new ExtractTextPlugin('[name].css'), + new webpack.DefinePlugin({ + 'process.env': { + 'ENV': JSON.stringify(ENV) + } + }), + ], + + devServer: { + historyApiFallback: true, + stats: 'minimal' + } +}); \ No newline at end of file diff --git a/geoprism-web/src/main/ng2/config/webpack.prod.js b/geoprism-web/src/main/ng2/config/webpack.prod.js new file mode 100644 index 000000000..b805edfc2 --- /dev/null +++ b/geoprism-web/src/main/ng2/config/webpack.prod.js @@ -0,0 +1,38 @@ +var webpack = require('webpack'); +var webpackMerge = require('webpack-merge'); +var ExtractTextPlugin = require('extract-text-webpack-plugin'); +var commonConfig = require('./webpack.common.js'); +var helpers = require('./helpers'); + +const ENV = process.env.NODE_ENV = process.env.ENV = 'production'; + +module.exports = webpackMerge(commonConfig, { + devtool: 'source-map', + + output: { + path: '../webapp/dist', + publicPath: '/', + filename: '[name].js', + chunkFilename: '[id].chunk.js' + }, + + plugins: [ + new webpack.NoEmitOnErrorsPlugin(), + new webpack.optimize.UglifyJsPlugin({ // https://github.com/angular/angular/issues/10618 + mangle: { + keep_fnames: true + } + }), + new ExtractTextPlugin('[name].css'), + new webpack.DefinePlugin({ + 'process.env': { + 'ENV': JSON.stringify(ENV) + } + }), + new webpack.LoaderOptionsPlugin({ + htmlLoader: { + minimize: false // workaround for ng2 + } + }) + ] +}); \ No newline at end of file diff --git a/geoprism-web/src/main/ng2/config/webpack.test.js b/geoprism-web/src/main/ng2/config/webpack.test.js new file mode 100644 index 000000000..e57e11dea --- /dev/null +++ b/geoprism-web/src/main/ng2/config/webpack.test.js @@ -0,0 +1,47 @@ +var webpack = require('webpack'); +var helpers = require('./helpers'); + +module.exports = { + devtool: 'inline-source-map', + + resolve: { + extensions: ['.ts', '.js'] + }, + + module: { + rules: [ + { + test: /\.ts$/, + loaders: ['awesome-typescript-loader', 'angular2-template-loader'] + }, + { + test: /\.html$/, + loader: 'html-loader' + + }, + { + test: /\.(png|jpe?g|gif|svg|woff|woff2|ttf|eot|ico)$/, + loader: 'null-loader' + }, + { + test: /\.css$/, + exclude: helpers.root('src', 'app'), + loader: 'null-loader' + }, + { + test: /\.css$/, + include: helpers.root('src', 'app'), + loader: 'raw-loader' + } + ] + }, + + plugins: [ + new webpack.ContextReplacementPlugin( + // The (\\|\/) piece accounts for path separators in *nix and Windows + /angular(\\|\/)core(\\|\/)(esm(\\|\/)src|src)(\\|\/)linker/, + helpers.root('./src'), // location of your src + {} // a map of your routes + ) + ] +} \ No newline at end of file diff --git a/geoprism-web/src/main/ng2/karma.conf.js b/geoprism-web/src/main/ng2/karma.conf.js new file mode 100644 index 000000000..fc51e5504 --- /dev/null +++ b/geoprism-web/src/main/ng2/karma.conf.js @@ -0,0 +1 @@ +module.exports = require('./config/karma.conf.js'); \ No newline at end of file diff --git a/geoprism-web/src/main/ng2/package.json b/geoprism-web/src/main/ng2/package.json new file mode 100644 index 000000000..7519e6a85 --- /dev/null +++ b/geoprism-web/src/main/ng2/package.json @@ -0,0 +1,52 @@ +{ + "name": "geoprism", + "version": "0.1.0", + "scripts": { + "start": "webpack-dev-server --inline --progress --port 8080", + "test": "karma start", + "build": "rimraf dist && webpack --config config/webpack.prod.js --progress --profile" + }, + "dependencies": { + "@angular/common": "~2.4.0", + "@angular/compiler": "~2.4.0", + "@angular/core": "~2.4.0", + "@angular/forms": "~2.4.0", + "@angular/http": "~2.4.0", + "@angular/platform-browser": "~2.4.0", + "@angular/platform-browser-dynamic": "~2.4.0", + "@angular/router": "~3.4.0", + "core-js": "^2.4.1", + "rxjs": "5.0.1", + "zone.js": "^0.7.4", + "ng2-file-upload": "1.1.3-0", + "lodash": "^4.12.0", + "ng2-bootstrap": "1.2.6" + }, + "devDependencies": { + "@types/node": "^6.0.45", + "@types/jasmine": "2.5.41", + "angular2-template-loader": "^0.6.0", + "awesome-typescript-loader": "^3.0.0-beta.18", + "css-loader": "^0.26.1", + "extract-text-webpack-plugin": "2.0.0-beta.5", + "file-loader": "^0.9.0", + "html-loader": "^0.4.3", + "html-webpack-plugin": "^2.16.1", + "jasmine-core": "^2.4.1", + "karma": "^1.2.0", + "karma-jasmine": "^1.0.2", + "karma-phantomjs-launcher": "^1.0.2", + "karma-chrome-launcher": "^1.0.1", + "karma-sourcemap-loader": "^0.3.7", + "karma-webpack": "^2.0.1", + "null-loader": "^0.1.1", + "phantomjs-prebuilt": "^2.1.7", + "raw-loader": "^0.5.1", + "rimraf": "^2.5.2", + "style-loader": "^0.13.1", + "typescript": "~2.0.10", + "webpack": "2.2.0", + "webpack-dev-server": "2.2.0-rc.0", + "webpack-merge": "^2.4.0" + } +} diff --git a/geoprism-web/src/main/ng2/src/app/app-routing.module.ts b/geoprism-web/src/main/ng2/src/app/app-routing.module.ts new file mode 100644 index 000000000..9e6f56d73 --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/app-routing.module.ts @@ -0,0 +1,93 @@ +/// +/// Copyright (c) 2015 TerraFrame, Inc. All rights reserved. +/// +/// This file is part of Runway SDK(tm). +/// +/// Runway SDK(tm) is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Lesser General Public License as +/// published by the Free Software Foundation, either version 3 of the +/// License, or (at your option) any later version. +/// +/// Runway SDK(tm) is distributed in the hope that it will be useful, but +/// WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Lesser General Public License for more details. +/// +/// You should have received a copy of the GNU Lesser General Public +/// License along with Runway SDK(tm). If not, see . +/// + +import { NgModule, Injectable, Inject } from '@angular/core'; +import { LocationStrategy, HashLocationStrategy } from '@angular/common'; +import { Routes, RouterModule, Resolve, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router'; +import { Observable } from 'rxjs/Observable'; + +import { IconsComponent } from './icon/icons.component'; +import { IconDetailComponent, IconResolver} from './icon/icon-detail.component'; + +import { DatasetsComponent } from './datasets/datasets.component'; +import { DatasetDetailComponent, DatasetResolver} from './datasets/dataset-detail.component'; + +import { CategoriesComponent } from './category/categories.component'; +import { CategoryDetailComponent, CategoryResolver} from './category/category-detail.component'; +import { OptionDetailComponent, OptionResolver} from './category/option-detail.component'; + +declare var acp: any; + +const routes: Routes = [ + { + path: '', + redirectTo: '/datasets', + pathMatch: 'full' + }, + { + path: 'datasets', + component: DatasetsComponent + }, + { + path: 'dataset/:id', + component: DatasetDetailComponent, + resolve: { + dataset: DatasetResolver + } + }, + { + path: 'categories', + component: CategoriesComponent + }, + { + path: 'category/:id', + component: CategoryDetailComponent, + resolve: { + category: CategoryResolver + } + }, + { + path: 'category-option/:parentId/:id', + component: OptionDetailComponent, + resolve: { + category: OptionResolver + } + }, + { + path: 'icons', + component: IconsComponent + }, + { + path: 'icon/:id', + component: IconDetailComponent, + resolve: { + icon: IconResolver + } + }, + +]; + +@NgModule({ + imports: [RouterModule.forRoot(routes)], + exports: [RouterModule], + providers: [{provide: LocationStrategy, useClass: HashLocationStrategy}, DatasetResolver, CategoryResolver, OptionResolver, IconResolver] +}) +export class AppRoutingModule { } + +export const routedComponents = [DatasetsComponent, DatasetDetailComponent, CategoriesComponent, CategoryDetailComponent, OptionDetailComponent, IconsComponent, IconDetailComponent]; diff --git a/geoprism-web/src/main/ng2/src/app/app.component.css b/geoprism-web/src/main/ng2/src/app/app.component.css new file mode 100644 index 000000000..7eb9df57c --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/app.component.css @@ -0,0 +1,18 @@ +/** + * Copyright (c) 2015 TerraFrame, Inc. All rights reserved. + * + * This file is part of Runway SDK(tm). + * + * Runway SDK(tm) is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * Runway SDK(tm) is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with Runway SDK(tm). If not, see . + */ diff --git a/geoprism-web/src/main/ng2/src/app/app.component.html b/geoprism-web/src/main/ng2/src/app/app.component.html new file mode 100644 index 000000000..a9a627120 --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/app.component.html @@ -0,0 +1,36 @@ +
+ + + +
+ +
+ + +
+ +
+ + +
\ No newline at end of file diff --git a/geoprism-web/src/main/ng2/src/app/app.component.ts b/geoprism-web/src/main/ng2/src/app/app.component.ts new file mode 100644 index 000000000..1dbb4c1f1 --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/app.component.ts @@ -0,0 +1,36 @@ +/// +/// Copyright (c) 2015 TerraFrame, Inc. All rights reserved. +/// +/// This file is part of Runway SDK(tm). +/// +/// Runway SDK(tm) is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Lesser General Public License as +/// published by the Free Software Foundation, either version 3 of the +/// License, or (at your option) any later version. +/// +/// Runway SDK(tm) is distributed in the hope that it will be useful, but +/// WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Lesser General Public License for more details. +/// +/// You should have received a copy of the GNU Lesser General Public +/// License along with Runway SDK(tm). If not, see . +/// + +import { Component } from '@angular/core'; + +declare var acp: any; + +@Component({ + + selector: 'my-app', + templateUrl: './app.component.html', + styleUrls: ['./app.component.css'] +}) +export class AppComponent { + context: string; + + constructor() { + this.context = acp as string; + } +} diff --git a/geoprism-web/src/main/ng2/src/app/app.module.ts b/geoprism-web/src/main/ng2/src/app/app.module.ts new file mode 100644 index 000000000..cd36dcc43 --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/app.module.ts @@ -0,0 +1,142 @@ +/// +/// Copyright (c) 2015 TerraFrame, Inc. All rights reserved. +/// +/// This file is part of Runway SDK(tm). +/// +/// Runway SDK(tm) is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Lesser General Public License as +/// published by the Free Software Foundation, either version 3 of the +/// License, or (at your option) any later version. +/// +/// Runway SDK(tm) is distributed in the hope that it will be useful, but +/// WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Lesser General Public License for more details. +/// +/// You should have received a copy of the GNU Lesser General Public +/// License along with Runway SDK(tm). If not, see . +/// + +import { NgModule } from '@angular/core'; +import { BrowserModule } from '@angular/platform-browser'; +import { FormsModule} from '@angular/forms'; +import { HttpModule, XHRBackend, RequestOptions, Http} from '@angular/http'; + +import './rxjs-extensions'; + +import { FileUploadModule } from 'ng2-file-upload/ng2-file-upload'; +import { DropdownModule } from 'ng2-bootstrap' + +import { AppComponent } from './app.component'; +import { AppRoutingModule, routedComponents } from './app-routing.module'; + +import { LocalizeComponent } from './core/localize.component'; +import { LoadingBarComponent } from './core/loading-bar.component'; +import { MessageComponent } from './core/message.component'; +import { AsyncValidator } from './core/async-validator.directive'; +import { FunctionValidator } from './core/function-validator.directive'; +import { KeysPipe } from './core/keys.pipe'; +import { LocalizePipe } from './core/localize.pipe'; + +import { AutoCompleteDirective } from './autocomplete/auto-complete.directive'; +import { AutoCompleteComponent } from './autocomplete/auto-complete.component'; + +import { ConfirmModalDirective } from './confirm/confirm-modal.directive'; +import { ConfirmModalComponent } from './confirm/confirm-modal.component'; +import { ConfirmService } from './confirm/confirm-modal.service'; + +import { EventService, IdService} from './service/core.service'; +import { LocalizationService } from './service/localization.service'; + +import { DatasetService } from './service/dataset.service'; +import { CategoryService } from './service/category.service'; +import { IconService } from './service/icon.service'; + +// Upload wizard imports +import { NavigationService } from './uploader/navigation.service'; +import { UploadWizardComponent } from './uploader/upload-wizard.component'; +import { PagingComponent } from './uploader/paging.component'; +import { MatchInitialPageComponent } from './uploader/match-initial-page.component'; +import { MatchPageComponent } from './uploader/match-page.component'; +import { BeginningInfoPageComponent } from './uploader/beginning-info-page.component'; +import { NamePageComponent } from './uploader/name-page.component'; +import { AttributesPageComponent } from './uploader/attributes-page.component'; +import { LocationPageComponent } from './uploader/location-page.component'; +import { CoordinatePageComponent } from './uploader/coordinate-page.component'; +import { SummaryPageComponent } from './uploader/summary-page.component'; +import { GeoValidationPageComponent } from './uploader/geo-validation-page.component'; +import { GeoValidationProblemComponent } from './uploader/geo-validation-problem.component'; +import { CategoryValidationPageComponent } from './uploader/category-validation-page.component'; +import { CategoryValidationProblemComponent } from './uploader/category-validation-problem.component'; +import { UploadService } from './service/upload.service'; + +import { EventHttpService } from './service/event-http.service'; + + +@NgModule({ + imports: [ + BrowserModule, + FormsModule, + AppRoutingModule, + HttpModule, + FileUploadModule, + DropdownModule.forRoot() + ], + declarations: [ + // Global components + AppComponent, + LocalizeComponent, + LoadingBarComponent, + MessageComponent, + AsyncValidator, + FunctionValidator, + KeysPipe, + LocalizePipe, + + AutoCompleteDirective, + AutoCompleteComponent, + + ConfirmModalDirective, + ConfirmModalComponent, + + // Upload Wizard components + UploadWizardComponent, + PagingComponent, + MatchInitialPageComponent, + MatchPageComponent, + BeginningInfoPageComponent, + NamePageComponent, + AttributesPageComponent, + LocationPageComponent, + CoordinatePageComponent, + SummaryPageComponent, + GeoValidationPageComponent, + GeoValidationProblemComponent, + CategoryValidationPageComponent, + CategoryValidationProblemComponent, + + // Routing components + routedComponents + ], + providers: [ + LocalizationService, + IdService, + DatasetService, + CategoryService, + IconService, + UploadService, + NavigationService, + ConfirmService, + EventService, + { + provide : EventHttpService, + useFactory: (xhrBackend: XHRBackend, requestOptions: RequestOptions, service: EventService) => { + return new EventHttpService(xhrBackend, requestOptions, service) + }, + deps: [XHRBackend, RequestOptions, EventService] + } + ], + bootstrap: [AppComponent], + entryComponents: [AutoCompleteComponent] +}) +export class AppModule { } diff --git a/geoprism-web/src/main/ng2/src/app/autocomplete/auto-complete.component.css b/geoprism-web/src/main/ng2/src/app/autocomplete/auto-complete.component.css new file mode 100644 index 000000000..ee3e7e991 --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/autocomplete/auto-complete.component.css @@ -0,0 +1,12 @@ +.search-results { + position: relative; + right: 0; + display: block; + overflow-y: auto; + overflow-x: hidden; + max-height: 100px; +} + +.search-hover { + background:#DEDEDE; +} \ No newline at end of file diff --git a/geoprism-web/src/main/ng2/src/app/autocomplete/auto-complete.component.html b/geoprism-web/src/main/ng2/src/app/autocomplete/auto-complete.component.html new file mode 100644 index 000000000..4e65c7712 --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/autocomplete/auto-complete.component.html @@ -0,0 +1,5 @@ + diff --git a/geoprism-web/src/main/ng2/src/app/autocomplete/auto-complete.component.ts b/geoprism-web/src/main/ng2/src/app/autocomplete/auto-complete.component.ts new file mode 100644 index 000000000..608e67313 --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/autocomplete/auto-complete.component.ts @@ -0,0 +1,95 @@ +import { Component, ElementRef, Input, Output, OnInit, ViewEncapsulation, EventEmitter, ViewChild} from "@angular/core"; + +class Item { + text: string; + data: any; + selected: boolean; + + constructor(item: {text: string, data: any}) { + this.text = item.text; + this.data = item.data; + this.selected = false; + } +} + +@Component({ + + selector: "auto-complete-component", + templateUrl: './auto-complete.component.html', + styleUrls: ['./auto-complete.component.css'], +}) +export class AutoCompleteComponent { + + // Emit a selected event when an item in the list is selected + @Output() public onDropdownSelect = new EventEmitter<{text: string, data: any}>(); + + list: Item[]; + index: number; + + + /** + * Listen for a click event on the list + */ + public onClick(item: Item): void { + this.onDropdownSelect.emit(item); + } + + public onMouseEnter(item: Item, index: number): void { + item.selected = true; + + this.index = index; + } + + public onMouseLeave(item: Item, index: number): void { + item.selected = false; + + this.index = -1; + } + + public up(): void { + if(this.index === -1) { + this.index = (this.list.length - 1); + } + else { + this.list[this.index].selected = false; + + this.index--; + } + + if(this.index < 0) { + this.index = (this.list.length - 1); + } + + this.list[this.index].selected = true; + } + + public down(): void { + if(this.index === -1) { + this.index = 0; + } + else { + this.list[this.index].selected = false; + + this.index++; + } + + if(this.index === this.list.length) { + this.index = 0; + } + + this.list[this.index].selected = true; + } + + public enter(): void { + this.onDropdownSelect.emit(this.list[this.index]); + } + + public setOptions(items: {text: string, data: any}[]): void { + this.list = []; + this.index = -1; + + items.forEach(item => { + this.list.push(new Item(item)); + }); + } +} \ No newline at end of file diff --git a/geoprism-web/src/main/ng2/src/app/autocomplete/auto-complete.directive.ts b/geoprism-web/src/main/ng2/src/app/autocomplete/auto-complete.directive.ts new file mode 100644 index 000000000..c1546ab9b --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/autocomplete/auto-complete.directive.ts @@ -0,0 +1,165 @@ +import {Directive, ComponentFactoryResolver, Input, ComponentRef, Output, EventEmitter, OnInit, ViewContainerRef, ElementRef} from "@angular/core"; +import { ControlContainer, AbstractControl, FormGroup, FormControl } from "@angular/forms"; + +import { AutoCompleteComponent } from "./auto-complete.component"; + +/** + * display auto-complete section with input and dropdown list when it is clicked + */ +@Directive({ + selector: "[auto-complete], [auto-complete]", + host: { + "(keyup)": "onKey($event)" // Liten to keyup events on the host component + } +}) +export class AutoCompleteDirective implements OnInit { + + // The search function should be passed as an input + @Input() public source: (term: string) => Promise>; + + // The directive emits onDropdownSelect event when an item from the list is selected + @Output() public onDropdownSelect = new EventEmitter(); + + private term = ""; + + private listCmp: ComponentRef = undefined; + private refreshTimer: any = undefined; + private searchInProgress = false; + private searchRequired = false; + + constructor( + private resolver: ComponentFactoryResolver, + private viewContainerRef: ViewContainerRef, + private el: ElementRef) { } + + public ngOnInit() { + + // When an item is selected remove the list + this.onDropdownSelect.subscribe(() => { + this.removeList(); + }); + } + + /** + * On key event is triggered when a key is released on the host component + * the event starts a timer to prevent concurrent requests + */ + public onKey(event: any) { + // Arrow down code + if(event.keyCode === 40) { + event.preventDefault(); + + if (this.listCmp) { + ((this.listCmp.instance)).down(); + } + } + // Arrow up keycode + else if(event.keyCode === 38) { + if (this.listCmp) { + ((this.listCmp.instance)).up(); + } + } + // Enter keycode + else if(event.keyCode === 13) { + if (this.listCmp) { + ((this.listCmp.instance)).enter(); + } + } + else if (!this.refreshTimer) { + this.refreshTimer = setTimeout(() => { + if (!this.searchInProgress) { + this.doSearch(); + } else { + // If a request is in progress mark that a new search is required + this.searchRequired = true; + } + },200); + } + + this.term = event.target.value; + + if (this.term === "" && this.listCmp) { + // clean the list if the search term is empty + this.removeList(); + } + } + + /** + * Call the search function and handle the results + */ + private doSearch() { + + this.refreshTimer = undefined; + + // if we have a search function and a valid search term call the search + if (this.source && this.term !== "" && this.term.length > 1) { + this.searchInProgress = true; + + this.source(this.term).then((res) => { + this.searchInProgress = false; + + // if the term has changed during our search do another search + if (this.searchRequired) { + this.searchRequired = false; + this.doSearch(); + } else { + // display the list of results + this.displayList(res); + } + }) + .catch(err => { + + this.removeList(); + }); + } + else if(this.term === "") { + this.onDropdownSelect.emit({ text: '', data: null }); + } + } + + /** + * Display the list of results + * Dynamically load the list component if it doesn't exist yet and update the suggestions list + */ + private displayList(list: Array<{ text: string, data: any }>) { + if (!this.listCmp) { + + let factory = this.resolver.resolveComponentFactory(AutoCompleteComponent); + + this.listCmp = this.viewContainerRef.createComponent(factory); + + this.updateList(list); + + // Emit the selectd event when the component fires its selected event + ((this.listCmp.instance)).onDropdownSelect.subscribe((selectedItem: {text: string, data: any}) => { + this.el.nativeElement.value = selectedItem.text; + + this.onDropdownSelect.emit(selectedItem); + }); + } else { + this.updateList(list); + } + } + + /** + * Update the suggestions list in the list component + */ + private updateList(list: Array<{ text: string, data: any }>) { + if (this.listCmp) { + ((this.listCmp.instance)).setOptions(list); + } + } + + /** + * remove the list component + */ + private removeList() { + this.searchInProgress = false; + this.searchRequired = false; + + if (this.listCmp) { + this.listCmp.destroy(); + this.listCmp = undefined; + } + } +} \ No newline at end of file diff --git a/geoprism-web/src/main/ng2/src/app/category/categories.component.html b/geoprism-web/src/main/ng2/src/app/category/categories.component.html new file mode 100644 index 000000000..09a2bddec --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/category/categories.component.html @@ -0,0 +1,33 @@ +
+ + + +

+ +
+ + + + + + + + + + + +
+ + + {{category.label}}
+ + +
+ +
+
+
+
diff --git a/geoprism-web/src/main/ng2/src/app/category/categories.component.ts b/geoprism-web/src/main/ng2/src/app/category/categories.component.ts new file mode 100644 index 000000000..165b6a940 --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/category/categories.component.ts @@ -0,0 +1,90 @@ +/// +/// Copyright (c) 2015 TerraFrame, Inc. All rights reserved. +/// +/// This file is part of Runway SDK(tm). +/// +/// Runway SDK(tm) is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Lesser General Public License as +/// published by the Free Software Foundation, either version 3 of the +/// License, or (at your option) any later version. +/// +/// Runway SDK(tm) is distributed in the hope that it will be useful, but +/// WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Lesser General Public License for more details. +/// +/// You should have received a copy of the GNU Lesser General Public +/// License along with Runway SDK(tm). If not, see . +/// + +import { Component, OnInit, ViewChild, ElementRef } from '@angular/core'; +import { Router } from '@angular/router'; + +import { Category, BasicCategory } from '../model/category'; + +import { EventService } from '../service/core.service'; +import { CategoryService } from '../service/category.service'; + +class Instance { + active: boolean; + label: string; +} + +@Component({ + + selector: 'categories', + templateUrl: './categories.component.html', + styleUrls: [] +}) +export class CategoriesComponent implements OnInit { + categories: BasicCategory[]; + instance : Instance = new Instance(); + + constructor( + private router: Router, + private eventService: EventService, + private categoryService: CategoryService) { } + + ngOnInit(): void { + this.getCategories(); + } + + getCategories() : void { + this.categoryService + .getAll() + .then(categories => { + this.categories = categories + }) + } + + remove(category: BasicCategory) : void { + this.categoryService + .remove(category.id) + .then(response => { + this.categories = this.categories.filter(h => h !== category); + }); + } + + edit(category: BasicCategory) : void { + this.router.navigate(['/category', category.id]); + } + + newInstance() : void { + this.instance.active = true; + } + + create() : void { + this.categoryService.create(this.instance.label, '', true) + .then((category:BasicCategory) => { + this.categories.push(category); + + this.instance.active = false; + this.instance.label = ''; + }); + } + + cancel(): void { + this.instance.active = false; + this.instance.label = ''; + } +} diff --git a/geoprism-web/src/main/ng2/src/app/category/category-detail.component.html b/geoprism-web/src/main/ng2/src/app/category/category-detail.component.html new file mode 100644 index 000000000..6b7c6f32e --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/category/category-detail.component.html @@ -0,0 +1,75 @@ +
+ + + +
diff --git a/geoprism-web/src/main/ng2/src/app/category/category-detail.component.ts b/geoprism-web/src/main/ng2/src/app/category/category-detail.component.ts new file mode 100644 index 000000000..415b9df1d --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/category/category-detail.component.ts @@ -0,0 +1,138 @@ +/// +/// Copyright (c) 2015 TerraFrame, Inc. All rights reserved. +/// +/// This file is part of Runway SDK(tm). +/// +/// Runway SDK(tm) is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Lesser General Public License as +/// published by the Free Software Foundation, either version 3 of the +/// License, or (at your option) any later version. +/// +/// Runway SDK(tm) is distributed in the hope that it will be useful, but +/// WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Lesser General Public License for more details. +/// +/// You should have received a copy of the GNU Lesser General Public +/// License along with Runway SDK(tm). If not, see . +/// + +import { Component, EventEmitter, Input, OnInit, Output, Inject } from '@angular/core'; +import { Router, ActivatedRoute, Params, Resolve, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router'; +import { Location } from '@angular/common'; + +import { Observable } from 'rxjs/Observable'; +import 'rxjs/add/operator/switchMap'; + +import { Category, BasicCategory } from '../model/category'; + +import { EventService } from '../service/core.service'; +import { LocalizationService } from '../service/localization.service'; +import { CategoryService } from '../service/category.service'; + +export class CategoryResolver implements Resolve { + constructor(@Inject(CategoryService) private categoryService: CategoryService, @Inject(EventService) private eventService: EventService) {} + + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot):Promise { + return this.categoryService.get(route.params['id']) + .catch((error:any) => { + this.eventService.onError(error); + + return Promise.reject(error); + }); + } +} + +class Instance { + active: boolean; + label: string; +} + +@Component({ + + selector: 'category-detail', + templateUrl: './category-detail.component.html', + styleUrls: [] +}) +export class CategoryDetailComponent implements OnInit { + @Input() category: Category; + @Output() close = new EventEmitter(); + + instance : Instance = new Instance(); + validName: boolean = true; + + + constructor( + private router: Router, + private categoryService: CategoryService, + private route: ActivatedRoute, + private location: Location, + private localizationService: LocalizationService) { + } + + ngOnInit(): void { + this.category = this.route.snapshot.data['category']; + + this.instance.active = false; + this.instance.label = ''; + } + + onSubmit(): void { + this.categoryService.update(this.category) + .then(category => { + this.goBack(category); + }); + } + + goBack(category : Category): void { + this.close.emit(category); + + this.location.back(); + } + + newInstance() : void { + this.instance.active = true; + } + + create() : void { + this.categoryService.create(this.instance.label, this.category.id, false) + .then((category:BasicCategory) => { + this.category.descendants.push(category); + + this.instance.active = false; + this.instance.label = ''; + }); + } + + cancel(): void { + this.instance.active = false; + this.instance.label = ''; + } + + remove(descendant: BasicCategory) { +// let message = this.localizationService.localize("category.management", "removeCategoryConfirm"); +// message = message.replace('{0}', this.category.label); +// +// if(confirm(message)) { + this.categoryService.remove(descendant.id) + .then((response:any) => { + this.category.descendants = this.category.descendants.filter(h => h !== descendant); + }); +// } + } + + + edit(descendant: BasicCategory) : void { + this.router.navigate(['/category-option', this.category.id, descendant.id]); + } + + validateName(name: string) { + this.categoryService.validate(name, this.category.id) + .then((response:any) => { + this.validName = true; + }) + .catch((error:any) => { + this.validName = false; + }); + } +} diff --git a/geoprism-web/src/main/ng2/src/app/category/option-detail.component.html b/geoprism-web/src/main/ng2/src/app/category/option-detail.component.html new file mode 100644 index 000000000..be162d7c6 --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/category/option-detail.component.html @@ -0,0 +1,72 @@ +
+ + + +
diff --git a/geoprism-web/src/main/ng2/src/app/category/option-detail.component.ts b/geoprism-web/src/main/ng2/src/app/category/option-detail.component.ts new file mode 100644 index 000000000..1bbc2f546 --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/category/option-detail.component.ts @@ -0,0 +1,121 @@ +/// +/// Copyright (c) 2015 TerraFrame, Inc. All rights reserved. +/// +/// This file is part of Runway SDK(tm). +/// +/// Runway SDK(tm) is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Lesser General Public License as +/// published by the Free Software Foundation, either version 3 of the +/// License, or (at your option) any later version. +/// +/// Runway SDK(tm) is distributed in the hope that it will be useful, but +/// WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Lesser General Public License for more details. +/// +/// You should have received a copy of the GNU Lesser General Public +/// License along with Runway SDK(tm). If not, see . +/// + +import { Component, EventEmitter, OnInit, Output, Inject} from '@angular/core'; +import { ActivatedRoute, Params, Resolve, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router'; +import { Location } from '@angular/common'; + +import { Observable } from 'rxjs/Observable'; +import 'rxjs/add/operator/switchMap'; + +import { Category, BasicCategory } from '../model/category'; +import { Synonym } from '../model/synonym'; + +import { EventService } from '../service/core.service'; +import { LocalizationService } from '../service/localization.service'; +import { CategoryService } from '../service/category.service'; + + +export class OptionResolver implements Resolve { + constructor(@Inject(CategoryService) private categoryService: CategoryService, @Inject(EventService) private eventService: EventService) {} + + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot):Promise { + return this.categoryService.edit(route.params['parentId'], route.params['id']) + .catch((error:any) => { + this.eventService.onError(error); + + return Promise.reject(error); + }); + } +} + +class Action { + synonym: string; + restore: string[]; + + constructor() { + this.synonym = ''; + this.restore = []; + } +} + +@Component({ + + selector: 'option-detail', + templateUrl: './option-detail.component.html', + styleUrls: [] +}) +export class OptionDetailComponent implements OnInit { + @Output() close = new EventEmitter(); + + category: Category; + action: Action; + + constructor( + private categoryService: CategoryService, + private route: ActivatedRoute, + private location: Location, + private localizationService: LocalizationService) { + } + + ngOnInit(): void { + this.category = this.route.snapshot.data['category']; + + this.action = new Action(); + } + + onSubmit(): void { + let config = { + option : this.category, + synonym : this.action.synonym, + restore : this.action.restore + } + + this.categoryService.apply(config) + .then(response => { + this.goBack(this.category); + }); + } + + cancel(): void { + this.categoryService.unlock(this.category) + .then(response => { + this.goBack(this.category); + }) + } + + goBack(category : Category): void { + this.close.emit(category); + + this.location.back(); + } + + restore(synonym: Synonym): void { + +// let message = this.localizationService.localize("category.management", "restoreConfirm"); +// message = message.replace('{0}', this.category.label); +// +// if(confirm(message)) { + this.action.restore.push(synonym.id); + + this.category.synonyms = this.category.synonyms.filter(h => h !== synonym); +// } + } + +} diff --git a/geoprism-web/src/main/ng2/src/app/confirm/confirm-modal.component.css b/geoprism-web/src/main/ng2/src/app/confirm/confirm-modal.component.css new file mode 100644 index 000000000..3354310d7 --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/confirm/confirm-modal.component.css @@ -0,0 +1,23 @@ +.confirm-overlay { + z-index: 99998; +} + +.confirm-modal { + background: #fff; + position: absolute; + color: #222; + top: 50%; + left: 50%; + -ms-transform: translateX(-50%) translateY(-50%); + -webkit-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); + z-index: 99999; +} + +.confirm-text { + display: block; + width: auto; + min-height: 22px; + max-height: none; + height: auto; +} \ No newline at end of file diff --git a/geoprism-web/src/main/ng2/src/app/confirm/confirm-modal.component.html b/geoprism-web/src/main/ng2/src/app/confirm/confirm-modal.component.html new file mode 100644 index 000000000..72fcecb60 --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/confirm/confirm-modal.component.html @@ -0,0 +1,22 @@ +
+
+ +
\ No newline at end of file diff --git a/geoprism-web/src/main/ng2/src/app/confirm/confirm-modal.component.ts b/geoprism-web/src/main/ng2/src/app/confirm/confirm-modal.component.ts new file mode 100644 index 000000000..0c394a6ee --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/confirm/confirm-modal.component.ts @@ -0,0 +1,57 @@ +import { Component, OnInit} from "@angular/core"; + +import { ConfirmService, IListener, IAction } from "./confirm-modal.service"; + +@Component({ + + selector: "confirm-modal", + templateUrl: './confirm-modal.component.html', + styleUrls: ['./confirm-modal.component.css'], +}) +export class ConfirmModalComponent implements OnInit, IListener { + + private action: IAction; + private message: string; + private active: boolean = false; + + constructor(private service: ConfirmService) { } + + ngOnInit(): void { + this.service.registerListener(this); + } + + ngOnDestroy(): void { + this.service.deregisterListener(this); + } + + public open(action: IAction): void { + if(this.action == null) { + this.action = action; + + this.message = action.getMessage(); + this.active = true; + } + } + + public confirm(): void { + if(this.action != null) { + this.action.confirm(); + + this.action = undefined; + } + + this.active = false; + this.message = undefined; + } + + public cancel(): void { + if(this.action != null) { + this.action.cancel(); + + this.action = undefined; + } + + this.active = false; + this.message = undefined; + } +} \ No newline at end of file diff --git a/geoprism-web/src/main/ng2/src/app/confirm/confirm-modal.directive.ts b/geoprism-web/src/main/ng2/src/app/confirm/confirm-modal.directive.ts new file mode 100644 index 000000000..02719eeb7 --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/confirm/confirm-modal.directive.ts @@ -0,0 +1,43 @@ +import {Directive, Input, Output, EventEmitter, HostListener} from "@angular/core"; + +import { ConfirmService, IAction } from "./confirm-modal.service"; + +@Directive({ + selector: "[confirm-modal]" +}) +export class ConfirmModalDirective implements IAction { + + @Input() enabled: boolean = true; + @Input() message: string = "Are you sure?"; + + @Output() onConfirm = new EventEmitter(); + + constructor(private service: ConfirmService) { + } + + /** + * On key event is triggered when a key is released on the host component + * the event starts a timer to prevent concurrent requests + */ + @HostListener('click') + public onClick(): void { + if(this.enabled){ + this.service.open(this); + } + else { + this.onConfirm.emit(); + } + } + + getMessage(): string { + return this.message; + } + + confirm(): void { + this.onConfirm.emit(); + } + + cancel(): void { + + } +} \ No newline at end of file diff --git a/geoprism-web/src/main/ng2/src/app/confirm/confirm-modal.service.ts b/geoprism-web/src/main/ng2/src/app/confirm/confirm-modal.service.ts new file mode 100644 index 000000000..1ba844f84 --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/confirm/confirm-modal.service.ts @@ -0,0 +1,33 @@ +import { Injectable } from "@angular/core"; + +export interface IAction { + getMessage(): string; + confirm(): void; + cancel(): void; +} + +export interface IListener { + open(action: IAction): void; +} + +@Injectable() +export class ConfirmService { + private listeners: IListener[] = []; + + public constructor() {} + + public registerListener(listener: IListener): void { + this.listeners.push(listener); + } + + public deregisterListener(listener: IListener): void { + this.listeners = this.listeners.filter(h => h !== listener); + } + + public open(action: IAction): void { + for (const listener of this.listeners) { + listener.open(action); + } + } +} + diff --git a/geoprism-web/src/main/ng2/src/app/core/async-validator.directive.ts b/geoprism-web/src/main/ng2/src/app/core/async-validator.directive.ts new file mode 100644 index 000000000..4ee6b4628 --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/core/async-validator.directive.ts @@ -0,0 +1,48 @@ +/// +/// Copyright (c) 2015 TerraFrame, Inc. All rights reserved. +/// +/// This file is part of Runway SDK(tm). +/// +/// Runway SDK(tm) is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Lesser General Public License as +/// published by the Free Software Foundation, either version 3 of the +/// License, or (at your option) any later version. +/// +/// Runway SDK(tm) is distributed in the hope that it will be useful, but +/// WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Lesser General Public License for more details. +/// +/// You should have received a copy of the GNU Lesser General Public +/// License along with Runway SDK(tm). If not, see . +/// + + +import { Directive, forwardRef, Attribute, Input } from '@angular/core'; +import { Validator, AbstractControl, NG_ASYNC_VALIDATORS } from '@angular/forms'; + +export interface RemoteValidator { + validate(value:string, config:string): Promise<{[key : string] : any}>; +} + +@Directive({ + selector: '[asyncValidator][ngModel]', + providers: [ + { provide: NG_ASYNC_VALIDATORS, useExisting: forwardRef(() => AsyncValidator), multi: true } + ] +}) +export class AsyncValidator implements Validator { + + @Input() validator: RemoteValidator; + @Input() config: string; + + constructor(){} + + validate(c: AbstractControl): Promise<{[key : string] : any}> { + if(c.value != null && c.value.length > 0) { + return this.validator.validate(c.value, this.config); + } + + return null; + } +} \ No newline at end of file diff --git a/geoprism-web/src/main/ng2/src/app/core/filter.pipe.ts b/geoprism-web/src/main/ng2/src/app/core/filter.pipe.ts new file mode 100644 index 000000000..b88eb8ae4 --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/core/filter.pipe.ts @@ -0,0 +1,12 @@ +import { Pipe, PipeTransform } from '@angular/core'; + + +@Pipe({name: 'filter'}) +export class FilterPipe implements PipeTransform { + transform(items: any[], prop: string, value: string): any[] { + if (!items) return []; + + return items.filter(it => it[prop] === value); + } +} + diff --git a/geoprism-web/src/main/ng2/src/app/core/function-validator.directive.ts b/geoprism-web/src/main/ng2/src/app/core/function-validator.directive.ts new file mode 100644 index 000000000..cb970d7bd --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/core/function-validator.directive.ts @@ -0,0 +1,48 @@ +/// +/// Copyright (c) 2015 TerraFrame, Inc. All rights reserved. +/// +/// This file is part of Runway SDK(tm). +/// +/// Runway SDK(tm) is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Lesser General Public License as +/// published by the Free Software Foundation, either version 3 of the +/// License, or (at your option) any later version. +/// +/// Runway SDK(tm) is distributed in the hope that it will be useful, but +/// WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Lesser General Public License for more details. +/// +/// You should have received a copy of the GNU Lesser General Public +/// License along with Runway SDK(tm). If not, see . +/// + + +import { Directive, forwardRef, Attribute, Input } from '@angular/core'; +import { Validator, AbstractControl, NG_VALIDATORS } from '@angular/forms'; + +export interface LocalValidator { + localValidate(value:string, config: string): {[key : string] : any}; +} + +@Directive({ + selector: '[funcValidator][ngModel]', + providers: [ + { provide: NG_VALIDATORS, useExisting: forwardRef(() => FunctionValidator), multi: true } + ] +}) +export class FunctionValidator implements Validator { + + @Input() validator: LocalValidator; + @Input() config: string; + + constructor(){} + + validate(c: AbstractControl): {[key : string] : any} { + if(c.value != null && c.value.length > 0) { + return this.validator.localValidate(c.value, this.config); + } + + return null; + } +} \ No newline at end of file diff --git a/geoprism-web/src/main/ng2/src/app/core/keys.pipe.ts b/geoprism-web/src/main/ng2/src/app/core/keys.pipe.ts new file mode 100644 index 000000000..50e2afb07 --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/core/keys.pipe.ts @@ -0,0 +1,15 @@ +import { Pipe, PipeTransform } from '@angular/core'; + +@Pipe({ + name: 'keys', + pure: false +}) +export class KeysPipe implements PipeTransform { + transform(value:any, args:string[]) : any { + let keys = new Array(); + for (let key in value) { + keys.push({key: key, value: value[key]}); + } + return keys; + } +} diff --git a/geoprism-web/src/main/ng2/src/app/core/loading-bar.component.html b/geoprism-web/src/main/ng2/src/app/core/loading-bar.component.html new file mode 100644 index 000000000..7cf0e655f --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/core/loading-bar.component.html @@ -0,0 +1,3 @@ +
+ +
\ No newline at end of file diff --git a/geoprism-web/src/main/ng2/src/app/core/loading-bar.component.ts b/geoprism-web/src/main/ng2/src/app/core/loading-bar.component.ts new file mode 100644 index 000000000..2a8588e3d --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/core/loading-bar.component.ts @@ -0,0 +1,39 @@ +import { Component, OnInit } from '@angular/core'; + +import { EventService, IEventListener } from '../service/core.service'; + +@Component({ + + selector: 'loading-bar', + templateUrl: './loading-bar.component.html', + styleUrls: [] +}) +export class LoadingBarComponent implements OnInit, IEventListener { + showIndicator: boolean = false; + + constructor(private service: EventService) { } + + ngOnInit(): void { + this.service.registerListener(this); + } + + ngOnDestroy(): void { + this.service.deregisterListener(this); + } + + start(): void { + this.showIndicator = true; + } + + complete(): void { + this.showIndicator = false; + } + + onError(error:any): void { + console.log('error'); + } + + onMessage(message:string): void { + console.log('message : ' + message); + } +} diff --git a/geoprism-web/src/main/ng2/src/app/core/localize.component.html b/geoprism-web/src/main/ng2/src/app/core/localize.component.html new file mode 100644 index 000000000..bcc835519 --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/core/localize.component.html @@ -0,0 +1 @@ +{{text}} \ No newline at end of file diff --git a/geoprism-web/src/main/ng2/src/app/core/localize.component.ts b/geoprism-web/src/main/ng2/src/app/core/localize.component.ts new file mode 100644 index 000000000..39366fe6b --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/core/localize.component.ts @@ -0,0 +1,20 @@ +import { Input, Component, OnInit } from '@angular/core'; + +import { LocalizationService } from '../service/localization.service'; + +@Component({ + + selector: 'localize', + templateUrl: './localize.component.html', + styleUrls: [] +}) +export class LocalizeComponent implements OnInit { + @Input() key: string; + text: string; + + constructor(private service: LocalizationService) { } + + ngOnInit(): void { + this.text = this.service.decode(this.key); + } +} diff --git a/geoprism-web/src/main/ng2/src/app/core/localize.pipe.ts b/geoprism-web/src/main/ng2/src/app/core/localize.pipe.ts new file mode 100644 index 000000000..e703b92d3 --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/core/localize.pipe.ts @@ -0,0 +1,12 @@ +import { Pipe, PipeTransform } from '@angular/core'; +import { LocalizationService } from '../service/localization.service'; + +@Pipe({name: 'localize'}) +export class LocalizePipe implements PipeTransform { + constructor(private service: LocalizationService) { } + + transform(value: string): string { + return this.service.decode(value); + } +} + diff --git a/geoprism-web/src/main/ng2/src/app/core/message.component.css b/geoprism-web/src/main/ng2/src/app/core/message.component.css new file mode 100644 index 000000000..c2e8c6d32 --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/core/message.component.css @@ -0,0 +1,18 @@ +.error-container { + text-align: center; + border-width: 1px; + border-color: #8c0000; + border-style: solid; + margin-left: 10%; + margin-right: 10%; + color: #8c0000; +} +.message-container { + text-align: center; + border-width: 1px; + border-color: #106828; + border-style: solid; + margin-left: 10%; + margin-right: 10%; + color: #106828; +} \ No newline at end of file diff --git a/geoprism-web/src/main/ng2/src/app/core/message.component.html b/geoprism-web/src/main/ng2/src/app/core/message.component.html new file mode 100644 index 000000000..2f5f2dfc8 --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/core/message.component.html @@ -0,0 +1,24 @@ + +
+
+
+ +
+
+
+

{{message}}

+
+
+
+
+
+ +
+
+
+

{{error.localizedMessage}}

+

+
+
+
+
diff --git a/geoprism-web/src/main/ng2/src/app/core/message.component.ts b/geoprism-web/src/main/ng2/src/app/core/message.component.ts new file mode 100644 index 000000000..e04f5b402 --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/core/message.component.ts @@ -0,0 +1,42 @@ +import { Component, OnInit } from '@angular/core'; + +import { EventService, IEventListener } from '../service/core.service'; + +@Component({ + + selector: 'message', + templateUrl: './message.component.html', + styleUrls: ['./message.component.css'] +}) +export class MessageComponent implements OnInit, IEventListener { + + private error: any = null; + + private message: string = ""; + + constructor(private service: EventService) { } + + ngOnInit(): void { + this.service.registerListener(this); + } + + ngOnDestroy(): void { + this.service.deregisterListener(this); + } + + start(): void { + this.error = null; + } + + complete(): void { + console.log('complete'); + } + + onError(error: any): void { + this.error = error; + } + + onMessage(msg: string): void { + this.message = msg; + } +} diff --git a/geoprism-web/src/main/ng2/src/app/datasets/dataset-detail.component.html b/geoprism-web/src/main/ng2/src/app/datasets/dataset-detail.component.html new file mode 100644 index 000000000..19b3f62ff --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/datasets/dataset-detail.component.html @@ -0,0 +1,81 @@ +
+ + + +
diff --git a/geoprism-web/src/main/ng2/src/app/datasets/dataset-detail.component.ts b/geoprism-web/src/main/ng2/src/app/datasets/dataset-detail.component.ts new file mode 100644 index 000000000..bb0841480 --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/datasets/dataset-detail.component.ts @@ -0,0 +1,102 @@ +/// +/// Copyright (c) 2015 TerraFrame, Inc. All rights reserved. +/// +/// This file is part of Runway SDK(tm). +/// +/// Runway SDK(tm) is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Lesser General Public License as +/// published by the Free Software Foundation, either version 3 of the +/// License, or (at your option) any later version. +/// +/// Runway SDK(tm) is distributed in the hope that it will be useful, but +/// WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Lesser General Public License for more details. +/// +/// You should have received a copy of the GNU Lesser General Public +/// License along with Runway SDK(tm). If not, see . +/// + +import { Component, EventEmitter, Input, OnInit, OnChanges, Output, Inject, ViewChild } from '@angular/core'; +import { ActivatedRoute, Params, Resolve, ActivatedRouteSnapshot, RouterStateSnapshot, Router } from '@angular/router'; +import { Location } from '@angular/common'; + +import { Observable } from 'rxjs/Observable'; +import 'rxjs/add/operator/switchMap'; + +import { Dataset } from '../model/dataset'; +import { BasicCategory } from '../model/category'; + +import { EventService } from '../service/core.service'; +import { DatasetService } from '../service/dataset.service'; + +export class DatasetResolver implements Resolve { + constructor(@Inject(DatasetService) private datasetService: DatasetService, @Inject(EventService) private eventService: EventService) {} + + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot):Promise { + return this.datasetService.edit(route.params['id']) + .catch((error:any) => { + this.eventService.onError(error); + + return Promise.reject(error); + }); + } +} + +@Component({ + + selector: 'dataset-detail', + templateUrl: './dataset-detail.component.html', + styleUrls: [] +}) +export class DatasetDetailComponent implements OnInit { + @Input() dataset: Dataset; + @Output() close = new EventEmitter(); + + validName: boolean = true; + + constructor( + private datasetService: DatasetService, + private router: Router, + private route: ActivatedRoute, + private location: Location) { + } + + ngOnInit(): void { + this.dataset = this.route.snapshot.data['dataset']; + } + + validateName(name: string) { + this.datasetService.validateDatasetName(name, this.dataset.id) + .then((response:any) => { + this.validName = true; + }) + .catch((error:any) => { + this.validName = false; + }); + } + + cancel(): void { + this.datasetService.unlock(this.dataset) + .then(response => { + this.goBack(this.dataset); + }) + } + + onSubmit(): void { + this.datasetService.apply(this.dataset) + .then(dataset => { + this.goBack(dataset); + }) + } + + open(category: BasicCategory, event: any) : void { + this.router.navigate(['/category', category.id]); + } + + goBack(dataset : Dataset): void { + this.close.emit(dataset); + + this.location.back(); + } +} diff --git a/geoprism-web/src/main/ng2/src/app/datasets/datasets.component.css b/geoprism-web/src/main/ng2/src/app/datasets/datasets.component.css new file mode 100644 index 000000000..7eb9df57c --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/datasets/datasets.component.css @@ -0,0 +1,18 @@ +/** + * Copyright (c) 2015 TerraFrame, Inc. All rights reserved. + * + * This file is part of Runway SDK(tm). + * + * Runway SDK(tm) is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * Runway SDK(tm) is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with Runway SDK(tm). If not, see . + */ diff --git a/geoprism-web/src/main/ng2/src/app/datasets/datasets.component.html b/geoprism-web/src/main/ng2/src/app/datasets/datasets.component.html new file mode 100644 index 000000000..139432967 --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/datasets/datasets.component.html @@ -0,0 +1,48 @@ +
+ + + +

+ +
+ +
+
+ + + + + + + + + + + + + + + +
+ + + + {{ dataset.label }} {{dataset.description}}
+
+ +
+
+
+ +

+
+
+
+ +
+ + +
diff --git a/geoprism-web/src/main/ng2/src/app/datasets/datasets.component.ts b/geoprism-web/src/main/ng2/src/app/datasets/datasets.component.ts new file mode 100644 index 000000000..1cf75dcb4 --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/datasets/datasets.component.ts @@ -0,0 +1,150 @@ +/// +/// Copyright (c) 2015 TerraFrame, Inc. All rights reserved. +/// +/// This file is part of Runway SDK(tm). +/// +/// Runway SDK(tm) is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Lesser General Public License as +/// published by the Free Software Foundation, either version 3 of the +/// License, or (at your option) any later version. +/// +/// Runway SDK(tm) is distributed in the hope that it will be useful, but +/// WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Lesser General Public License for more details. +/// +/// You should have received a copy of the GNU Lesser General Public +/// License along with Runway SDK(tm). If not, see . +/// + +import { Component, OnInit, ViewChild, ElementRef } from '@angular/core'; +import { Router } from '@angular/router'; + +import { FileSelectDirective, FileDropDirective, FileUploader, FileUploaderOptions } from 'ng2-file-upload/ng2-file-upload'; + +import { Dataset } from '../model/dataset'; + +import { EventService } from '../service/core.service'; +import { LocalizationService } from '../service/localization.service'; +import { DatasetService } from '../service/dataset.service'; + +import { UploadWizardComponent } from '../uploader/upload-wizard.component'; + +declare let acp: string; + +@Component({ + selector: 'datasets', + templateUrl: './datasets.component.html', + styleUrls: ['./datasets.component.css'] +}) +export class DatasetsComponent implements OnInit { + public datasets: Dataset[]; + + public canExport: boolean; + + public uploader:FileUploader; + public dropActive:boolean = false; + + @ViewChild(UploadWizardComponent) + private wizard: UploadWizardComponent; + + @ViewChild('uploadEl') + private uploadElRef: ElementRef; + + constructor( + private router: Router, + private datasetService: DatasetService, + private localizationService: LocalizationService, + private eventService: EventService) { } + + ngOnInit(): void { + this.getDatasets(); + + let options:FileUploaderOptions = { + autoUpload: true, + queueLimit: 1, + removeAfterUpload: true, + url: acp + '/uploader/getAttributeInformation' + }; + + this.uploader = new FileUploader(options); + this.uploader.onBeforeUploadItem = (fileItem: any) => { + this.eventService.start(); + }; + this.uploader.onCompleteItem = (item:any, response:any, status:any, headers:any) => { + this.eventService.complete(); + }; + this.uploader.onSuccessItem = (item: any, response: string, status: number, headers: any) => { + this.wizard.initialize(response); + }; + this.uploader.onErrorItem = (item: any, response: string, status: number, headers: any) => { + this.eventService.onError(response); + } + }; + + ngAfterViewInit() { + this.uploader.onAfterAddingFile = (item => { + this.uploadElRef.nativeElement.value = ''; + }); + } + + getDatasets() : void { + this.datasetService + .getDatasets() + .then(datasetCollection => { + this.datasets = datasetCollection.datasets; + this.canExport = datasetCollection.canExport; + }) + }; + + remove(dataset: Dataset, event: any) : void { + this.datasetService + .remove(dataset) + .then(response => { + this.datasets = this.datasets.filter(h => h.id !== dataset.id); + }); + } + + edit(dataset: Dataset, event: any) : void { + this.router.navigate(['/dataset', dataset.id]); + } + + xport(dataset: Dataset, event: any) : void { + this.datasetService.xport(dataset.id); + } + + fileOver(e:any):void { + this.dropActive = e; + } + + onSuccess(data: any): void { + if(data.datasets != null) { + this.addDatasets(data.datasets); + } + } + + getIndex(dataset: Dataset) { + for(var i = 0; i < this.datasets.length; i++) { + if(this.datasets[i].id == dataset.id) { + return i; + } + } + + return -1; + } + + addDatasets(datasets:Dataset[]) { + for(let i = 0; i < datasets.length; i++) { + let dataset = datasets[i]; + + let index = this.getIndex(dataset) + + if(index == -1) { + this.datasets.push(dataset); + } + else { + this.datasets[index] = dataset; + } + } + } +} diff --git a/geoprism-web/src/main/ng2/src/app/datasets/datasets.spec.ts b/geoprism-web/src/main/ng2/src/app/datasets/datasets.spec.ts new file mode 100644 index 000000000..649f8ab31 --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/datasets/datasets.spec.ts @@ -0,0 +1,99 @@ +import { async, TestBed, fakeAsync, tick } from '@angular/core/testing'; +import { RouterTestingModule } from '@angular/router/testing'; + +import { AppModule } from '../app.module'; + +import { Dataset } from '../model/dataset'; +import { DatasetsComponent } from './datasets.component'; + +import { LocalizationService } from '../service/localization.service'; +import { MockLocalizationService } from '../service/localization.service.mock'; + +import { DatasetService } from '../service/dataset.service'; +import { MockDatasetService } from '../service/dataset.service.mock'; + +describe('DatasetsComponent', () => { + + beforeEach(() => { + + TestBed.configureTestingModule({ + imports: [ + AppModule, + RouterTestingModule.withRoutes([]) + ], + providers: [ + {provide: DatasetService, useValue: new MockDatasetService()}, + {provide: LocalizationService, useValue: new MockLocalizationService()} + ], + }); + + this.fixture = TestBed.createComponent(DatasetsComponent); + }); + + it('Test inital state', () => { + let comp:DatasetsComponent = this.fixture.componentInstance; + + expect(comp.datasets).toBe(undefined); + expect(comp.uploader).toBe(undefined); + expect(comp.dropActive).toBe(false); + }); + + it('Test ng init', fakeAsync(() => { + this.fixture.componentInstance.ngOnInit(); + tick(); + this.fixture.detectChanges(); + + let comp:DatasetsComponent = this.fixture.componentInstance; + expect(comp.uploader).not.toBe(undefined); + expect(comp.datasets.length).toBe(1); + })); + + it('Test remove', fakeAsync(() => { + this.fixture.componentInstance.ngOnInit(); + tick(); + this.fixture.detectChanges(); + + let dataset = this.fixture.componentInstance.datasets[0]; + + this.fixture.componentInstance.remove(dataset); + tick(); + this.fixture.detectChanges(); + + expect(this.fixture.componentInstance.datasets.length).toBe(0); + })); + + it('Test edit', fakeAsync(() => { + let navigateSpy = spyOn((this.fixture.componentInstance).router, 'navigate'); + + this.fixture.componentInstance.ngOnInit(); + tick(); + this.fixture.detectChanges(); + + let dataset = this.fixture.componentInstance.datasets[0]; + + this.fixture.componentInstance.edit(dataset); + tick(); + this.fixture.detectChanges(); + + expect(navigateSpy).toHaveBeenCalledWith(['/dataset', dataset.id]); + })); + + it('Test onSuccess', fakeAsync(() => { + let navigateSpy = spyOn((this.fixture.componentInstance).router, 'navigate'); + + this.fixture.componentInstance.ngOnInit(); + tick(); + this.fixture.detectChanges(); + + expect(this.fixture.componentInstance.datasets.length).toBe(1); + + let dataset = this.fixture.componentInstance.datasets[0]; + + let dataset2 = new Dataset(); + dataset2.id = 'test-id-2'; + + this.fixture.componentInstance.onSuccess({datasets: [dataset, dataset2]}); + + expect(this.fixture.componentInstance.datasets.length).toBe(2); + })); +}); \ No newline at end of file diff --git a/geoprism-web/src/main/ng2/src/app/icon/icon-detail.component.html b/geoprism-web/src/main/ng2/src/app/icon/icon-detail.component.html new file mode 100644 index 000000000..871079c68 --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/icon/icon-detail.component.html @@ -0,0 +1,67 @@ +
+ + + +
\ No newline at end of file diff --git a/geoprism-web/src/main/ng2/src/app/icon/icon-detail.component.ts b/geoprism-web/src/main/ng2/src/app/icon/icon-detail.component.ts new file mode 100644 index 000000000..0d7d45ae8 --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/icon/icon-detail.component.ts @@ -0,0 +1,175 @@ +/// +/// Copyright (c) 2015 TerraFrame, Inc. All rights reserved. +/// +/// This file is part of Runway SDK(tm). +/// +/// Runway SDK(tm) is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Lesser General Public License as +/// published by the Free Software Foundation, either version 3 of the +/// License, or (at your option) any later version. +/// +/// Runway SDK(tm) is distributed in the hope that it will be useful, but +/// WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Lesser General Public License for more details. +/// +/// You should have received a copy of the GNU Lesser General Public +/// License along with Runway SDK(tm). If not, see . +/// + +import { Component, OnInit, ViewChild, ElementRef, Inject, Input } from '@angular/core'; +import { ActivatedRoute, Params, Resolve, ActivatedRouteSnapshot, RouterStateSnapshot, Router } from '@angular/router'; +import { Location } from '@angular/common'; + +import { FileSelectDirective, FileDropDirective, FileUploader, FileUploaderOptions } from 'ng2-file-upload/ng2-file-upload'; + +import { Observable } from 'rxjs/Observable'; +import 'rxjs/add/operator/switchMap'; + +import { EventService } from '../service/core.service'; + +import { Icon } from '../model/icon'; +import { IconService } from '../service/icon.service'; + +export class IconResolver implements Resolve { + constructor(@Inject(IconService) private iconService: IconService, @Inject(EventService) private eventService: EventService) {} + + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot):Promise { + let id = route.params['id']; + + if(id !== "-1") { + return this.iconService.edit(id) + .catch((error:any) => { + this.eventService.onError(error); + + return Promise.reject(error); + }); + } + else { + return new Promise((resolve, reject) => { + resolve(new Icon()); + }); + } + } +} + +declare var acp: any; + +@Component({ + + selector: 'icon-detail', + templateUrl: './icon-detail.component.html', + styleUrls: [] +}) +export class IconDetailComponent implements OnInit { + @Input() icon: Icon; + + public uploader:FileUploader; + public dropActive:boolean = false; + + @ViewChild('uploadEl') + private uploadElRef: ElementRef; + + private file: any; + private context: string; + + constructor( + private router: Router, + private route: ActivatedRoute, + private location: Location, + private iconService: IconService, + private eventService: EventService) { + this.context = acp as string; + } + + ngOnInit(): void { + this.icon = this.route.snapshot.data['icon']; + + let url = acp + '/iconimage/create'; + + if(this.icon.id != null) { + url = acp + '/iconimage/apply'; + } + + let options:FileUploaderOptions = { + autoUpload: false, + queueLimit: 1, + removeAfterUpload: true, + url: url + }; + + this.uploader = new FileUploader(options); + this.uploader.onBeforeUploadItem = (fileItem: any) => { + this.eventService.start(); + }; + this.uploader.onCompleteItem = (item:any, response:any, status:any, headers:any) => { + this.eventService.complete(); + }; + this.uploader.onSuccessItem = (item: any, response: string, status: number, headers: any) => { + this.location.back(); + }; + this.uploader.onErrorItem = (item: any, response: string, status: number, headers: any) => { + this.eventService.onError(response); + }; + this.uploader.onBuildItemForm = (fileItem: any, form: any) => { + form.append('label', this.icon.label); + + if(this.icon.id != null) { + form.append('id', this.icon.id); + } + }; + } + + ngAfterViewInit() { + let that = this; + + this.uploader.onAfterAddingFile = (item => { + this.uploadElRef.nativeElement.value = '' + + let reader = new FileReader(); + reader.onload = function(e: any) { + that.file = reader.result; + }; + reader.readAsDataURL(item._file); + + if(that.icon.label == null || that.icon.label == '') { + that.icon.label = item.file.name.replace(".png", ""); + } + }); + } + + fileOver(e:any):void { + this.dropActive = e; + } + + cancel(): void { + if(this.icon.id != null) { + this.iconService.unlock(this.icon.id) + .then((response:any) => { + this.location.back(); + }) + } + else { + this.location.back(); + } + } + + onSubmit(): void { + if(this.file == null) { + this.iconService.apply(this.icon.id, this.icon.label) + .then(icon => { + this.location.back(); + }); + } + else { + this.uploader.uploadAll(); + } + } + + clear(): void { + this.file = null; + this.icon.filePath = null; + + this.uploader.clearQueue() + } +} diff --git a/geoprism-web/src/main/ng2/src/app/icon/icons.component.html b/geoprism-web/src/main/ng2/src/app/icon/icons.component.html new file mode 100644 index 000000000..793180271 --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/icon/icons.component.html @@ -0,0 +1,51 @@ +
+ + + +
+ +

+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ + + + + {{ icon.label }} + Icon +
+ + +
+
+ +
+
+

+
+
diff --git a/geoprism-web/src/main/ng2/src/app/icon/icons.component.ts b/geoprism-web/src/main/ng2/src/app/icon/icons.component.ts new file mode 100644 index 000000000..69a6e669f --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/icon/icons.component.ts @@ -0,0 +1,71 @@ +/// +/// Copyright (c) 2015 TerraFrame, Inc. All rights reserved. +/// +/// This file is part of Runway SDK(tm). +/// +/// Runway SDK(tm) is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Lesser General Public License as +/// published by the Free Software Foundation, either version 3 of the +/// License, or (at your option) any later version. +/// +/// Runway SDK(tm) is distributed in the hope that it will be useful, but +/// WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Lesser General Public License for more details. +/// +/// You should have received a copy of the GNU Lesser General Public +/// License along with Runway SDK(tm). If not, see . +/// + +import { Component, OnInit, ViewChild, ElementRef } from '@angular/core'; +import { Router } from '@angular/router'; + +import { Icon } from '../model/icon'; +import { IconService } from '../service/icon.service'; + +declare let acp: string; + +@Component({ + + selector: 'icons', + templateUrl: './icons.component.html', + styleUrls: [] +}) +export class IconsComponent implements OnInit { + public icons: Icon[]; + context: string; + + constructor( + private router: Router, + private iconService: IconService) { + this.context = acp as string; + } + + ngOnInit(): void { + this.getIcons(); + } + + getIcons() : void { + this.iconService + .getIcons() + .then(icons => { + this.icons = icons + }) + } + + remove(icon: Icon) : void { + this.iconService + .remove(icon.id) + .then((response: any) => { + this.icons = this.icons.filter(h => h.id !== icon.id); + }); + } + + edit(icon: Icon) : void { + this.router.navigate(['/icon', icon.id]); + } + + add() : void { + this.router.navigate(['/icon', -1]); + } +} diff --git a/geoprism-web/src/main/ng2/src/app/model/category.ts b/geoprism-web/src/main/ng2/src/app/model/category.ts new file mode 100644 index 000000000..7ed5da3ff --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/model/category.ts @@ -0,0 +1,31 @@ +/// +/// Copyright (c) 2015 TerraFrame, Inc. All rights reserved. +/// +/// This file is part of Runway SDK(tm). +/// +/// Runway SDK(tm) is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Lesser General Public License as +/// published by the Free Software Foundation, either version 3 of the +/// License, or (at your option) any later version. +/// +/// Runway SDK(tm) is distributed in the hope that it will be useful, but +/// WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Lesser General Public License for more details. +/// +/// You should have received a copy of the GNU Lesser General Public +/// License along with Runway SDK(tm). If not, see . +/// + +import { Synonym } from './synonym'; + +export class BasicCategory { + id: string; + label: string; +} + +export class Category extends BasicCategory { + descendants : BasicCategory[]; + synonyms : Synonym[]; + siblings : BasicCategory[]; +} \ No newline at end of file diff --git a/geoprism-web/src/main/ng2/src/app/model/dataset-attribute.ts b/geoprism-web/src/main/ng2/src/app/model/dataset-attribute.ts new file mode 100644 index 000000000..c7f694697 --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/model/dataset-attribute.ts @@ -0,0 +1,28 @@ +/// +/// Copyright (c) 2015 TerraFrame, Inc. All rights reserved. +/// +/// This file is part of Runway SDK(tm). +/// +/// Runway SDK(tm) is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Lesser General Public License as +/// published by the Free Software Foundation, either version 3 of the +/// License, or (at your option) any later version. +/// +/// Runway SDK(tm) is distributed in the hope that it will be useful, but +/// WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Lesser General Public License for more details. +/// +/// You should have received a copy of the GNU Lesser General Public +/// License along with Runway SDK(tm). If not, see . +/// + +import { BasicCategory } from '../model/category'; + +export class DatasetAttribute { + id: string; + label: string; + type: string + selected: boolean; + root: BasicCategory; +} diff --git a/geoprism-web/src/main/ng2/src/app/model/dataset.ts b/geoprism-web/src/main/ng2/src/app/model/dataset.ts new file mode 100644 index 000000000..273124b0c --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/model/dataset.ts @@ -0,0 +1,35 @@ +/// +/// Copyright (c) 2015 TerraFrame, Inc. All rights reserved. +/// +/// This file is part of Runway SDK(tm). +/// +/// Runway SDK(tm) is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Lesser General Public License as +/// published by the Free Software Foundation, either version 3 of the +/// License, or (at your option) any later version. +/// +/// Runway SDK(tm) is distributed in the hope that it will be useful, but +/// WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Lesser General Public License for more details. +/// +/// You should have received a copy of the GNU Lesser General Public +/// License along with Runway SDK(tm). If not, see . +/// + +import { DatasetAttribute } from './dataset-attribute'; + +export class Dataset { + id: string; + label: string; + description: string; + type: string; + value: string; + source: string; + attributes : DatasetAttribute[]; +} + +export class DatasetCollection { + canExport: boolean; + datasets: Dataset[]; +} \ No newline at end of file diff --git a/geoprism-web/src/main/ng2/src/app/model/icon.ts b/geoprism-web/src/main/ng2/src/app/model/icon.ts new file mode 100644 index 000000000..eb7a797ab --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/model/icon.ts @@ -0,0 +1,24 @@ +/// +/// Copyright (c) 2015 TerraFrame, Inc. All rights reserved. +/// +/// This file is part of Runway SDK(tm). +/// +/// Runway SDK(tm) is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Lesser General Public License as +/// published by the Free Software Foundation, either version 3 of the +/// License, or (at your option) any later version. +/// +/// Runway SDK(tm) is distributed in the hope that it will be useful, but +/// WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Lesser General Public License for more details. +/// +/// You should have received a copy of the GNU Lesser General Public +/// License along with Runway SDK(tm). If not, see . +/// + +export class Icon { + label: string; + id: string; + filePath: string; +} diff --git a/geoprism-web/src/main/ng2/src/app/model/pair.ts b/geoprism-web/src/main/ng2/src/app/model/pair.ts new file mode 100644 index 000000000..5f6935592 --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/model/pair.ts @@ -0,0 +1,4 @@ +export class Pair { + id: string; + value: string; +} \ No newline at end of file diff --git a/geoprism-web/src/main/ng2/src/app/model/runway-exception.ts b/geoprism-web/src/main/ng2/src/app/model/runway-exception.ts new file mode 100644 index 000000000..c5e05aabd --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/model/runway-exception.ts @@ -0,0 +1,25 @@ +/// +/// Copyright (c) 2015 TerraFrame, Inc. All rights reserved. +/// +/// This file is part of Runway SDK(tm). +/// +/// Runway SDK(tm) is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Lesser General Public License as +/// published by the Free Software Foundation, either version 3 of the +/// License, or (at your option) any later version. +/// +/// Runway SDK(tm) is distributed in the hope that it will be useful, but +/// WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Lesser General Public License for more details. +/// +/// You should have received a copy of the GNU Lesser General Public +/// License along with Runway SDK(tm). If not, see . +/// + +export class RunwayException { + localizedMessage: string; + developerMessage: string; + dto_type: string; + wrappedException: string; +} diff --git a/geoprism-web/src/main/ng2/src/app/model/synonym.ts b/geoprism-web/src/main/ng2/src/app/model/synonym.ts new file mode 100644 index 000000000..24948d4aa --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/model/synonym.ts @@ -0,0 +1,4 @@ +export class Synonym { + id: string; + label: string; +} \ No newline at end of file diff --git a/geoprism-web/src/main/ng2/src/app/rxjs-extensions.ts b/geoprism-web/src/main/ng2/src/app/rxjs-extensions.ts new file mode 100644 index 000000000..1cee2a47c --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/rxjs-extensions.ts @@ -0,0 +1,31 @@ +/// +/// Copyright (c) 2015 TerraFrame, Inc. All rights reserved. +/// +/// This file is part of Runway SDK(tm). +/// +/// Runway SDK(tm) is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Lesser General Public License as +/// published by the Free Software Foundation, either version 3 of the +/// License, or (at your option) any later version. +/// +/// Runway SDK(tm) is distributed in the hope that it will be useful, but +/// WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Lesser General Public License for more details. +/// +/// You should have received a copy of the GNU Lesser General Public +/// License along with Runway SDK(tm). If not, see . +/// + +// // Observable class extensions +// import 'rxjs/add/observable/of'; +// import 'rxjs/add/observable/throw'; + +// // Observable operators +// import 'rxjs/add/operator/catch'; +// import 'rxjs/add/operator/debounceTime'; +// import 'rxjs/add/operator/distinctUntilChanged'; +// import 'rxjs/add/operator/do'; +// import 'rxjs/add/operator/filter'; +// import 'rxjs/add/operator/map'; +// import 'rxjs/add/operator/switchMap'; diff --git a/geoprism-web/src/main/ng2/src/app/service/category.service.ts b/geoprism-web/src/main/ng2/src/app/service/category.service.ts new file mode 100644 index 000000000..6400fc336 --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/service/category.service.ts @@ -0,0 +1,153 @@ +/// +/// Copyright (c) 2015 TerraFrame, Inc. All rights reserved. +/// +/// This file is part of Runway SDK(tm). +/// +/// Runway SDK(tm) is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Lesser General Public License as +/// published by the Free Software Foundation, either version 3 of the +/// License, or (at your option) any later version. +/// +/// Runway SDK(tm) is distributed in the hope that it will be useful, but +/// WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Lesser General Public License for more details. +/// +/// You should have received a copy of the GNU Lesser General Public +/// License along with Runway SDK(tm). If not, see . +/// + +import { Injectable } from '@angular/core'; +import { Headers, Http, Response, URLSearchParams } from '@angular/http'; + +import 'rxjs/add/operator/toPromise'; + +import { EventService, BasicService } from './core.service'; + +import { EventHttpService } from './event-http.service'; + +import { Category, BasicCategory } from '../model/category'; + +declare var acp: any; + +@Injectable() +export class CategoryService extends BasicService { + + constructor(service: EventService, private ehttp: EventHttpService, private http: Http) { + super(service); + } + + getAll(): Promise { + return this.ehttp + .get(acp + '/category/all') + .toPromise() + .then(response => { + return response.json() as BasicCategory[]; + }) + .catch(this.handleError.bind(this)); + } + + edit(parentId: string, id : string): Promise { + let headers = new Headers({ + 'Content-Type': 'application/json' + }); + + return this.ehttp + .post(acp + '/category/edit', JSON.stringify({parentId:parentId, id:id}), { headers: headers }) + .toPromise() + .then(response => { + return response.json() as Category; + }) + .catch(this.handleError.bind(this)); + } + + get(id : string): Promise { + let headers = new Headers({ + 'Content-Type': 'application/json' + }); + + return this.ehttp + .post(acp + '/category/get', JSON.stringify({id:id}), { headers: headers }) + .toPromise() + .then(response => { + return response.json() as Category; + }) + .catch(this.handleError.bind(this)); + } + + unlock(category: Category): Promise { + let headers = new Headers({ + 'Content-Type': 'application/json' + }); + + return this.ehttp + .post(acp + '/category/unlock', JSON.stringify({id:category.id}), { headers: headers }) + .toPromise() + .catch(this.handleError.bind(this)); + } + + apply(config: any): Promise { + let headers = new Headers({ + 'Content-Type': 'application/json' + }); + + return this.ehttp + .post(acp + '/category/apply', JSON.stringify({config:config}), { headers: headers }) + .toPromise() + .catch(this.handleError.bind(this)); + } + + remove(id: string): Promise { + let headers = new Headers({ + 'Content-Type': 'application/json' + }); + + return this.ehttp + .post(acp + '/category/remove', JSON.stringify({id:id}), { headers: headers }) + .toPromise() + .catch(this.handleError.bind(this)); + } + + validate(name: string, id:string): Promise { + + let params: URLSearchParams = new URLSearchParams(); + params.set('name', name); + params.set('id', id); + + return this.http + .get(acp + '/category/validate', {search: params}) + .toPromise(); + } + + + create(label: string, parentId: string, validate: boolean): Promise { + let headers = new Headers({ + 'Content-Type': 'application/json' + }); + + let option = {label:label, parentId:parentId, validate:validate}; + + return this.ehttp + .post(acp + '/category/create', JSON.stringify({option:option}), { headers: headers }) + .toPromise() + .then((response:any) => { + return response.json() as BasicCategory; + }) + .catch(this.handleError.bind(this)); + } + + update(category:Category): Promise { + let headers = new Headers({ + 'Content-Type': 'application/json' + }); + + return this.ehttp + .post(acp + '/category/update', JSON.stringify({category:category}), { headers: headers }) + .toPromise() + .then((response:any) => { + return response.json() as BasicCategory; + }) + .catch(this.handleError.bind(this)); + } + +} diff --git a/geoprism-web/src/main/ng2/src/app/service/core.service.ts b/geoprism-web/src/main/ng2/src/app/service/core.service.ts new file mode 100644 index 000000000..53d0a944f --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/service/core.service.ts @@ -0,0 +1,113 @@ +import { Injectable } from '@angular/core'; +import { Response } from '@angular/http'; + +import { RunwayException } from '../model/runway-exception'; + +export interface IEventListener { + start(): void; + complete(): void; + onError(error:RunwayException): void; + onMessage(message:string): void; +} + +@Injectable() +export class EventService { + private listeners: IEventListener[] = []; + + public constructor() {} + + public registerListener(listener: IEventListener): void { + this.listeners.push(listener); + } + + public deregisterListener(listener: IEventListener): boolean { + let indexOfItem = this.listeners.indexOf(listener); + + if (indexOfItem === -1) { + return false; + } + + this.listeners.splice(indexOfItem, 1); + + return true; + } + + public start(): void { + for (const listener of this.listeners) { + listener.start(); + } + } + + public complete(): void { + for (const listener of this.listeners) { + listener.complete(); + } + } + + public onMessage(msg:string): void { + for (const listener of this.listeners) { + listener.onMessage(msg); + } + } + + public onError(error:any): void { + let rError:any = null; + + if(error instanceof Response) { + rError = error.json() as RunwayException; + } + else { + rError = JSON.parse(error) as RunwayException; + } + + for (const listener of this.listeners) { + listener.onError(rError); + } + } +} + +@Injectable() +export class BasicService { + service: EventService; + + constructor(service: EventService) { + this.service = service; + } + + protected handleError(error: any): Promise { + /* + * Must add the null check on this because the this reference gets messed up when + * this code is executed from ng2 zone.js + */ + + if(this != null) { + this.service.onError(error); + } + + return Promise.reject(error); + } + + protected handleMessage(msg: string): void { + /* + * Must add the null check on this because the this reference gets messed up when + * this code is executed from ng2 zone.js + */ + + if(this != null) { + this.service.onMessage(msg); + } + } +} + +@Injectable() +export class IdService { + + constructor() {} + + generateId(): string { + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { + var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8); + return v.toString(16); + }); + } +} diff --git a/geoprism-web/src/main/ng2/src/app/service/dataset.service.mock.ts b/geoprism-web/src/main/ng2/src/app/service/dataset.service.mock.ts new file mode 100644 index 000000000..91bf66889 --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/service/dataset.service.mock.ts @@ -0,0 +1,83 @@ +/// +/// Copyright (c) 2015 TerraFrame, Inc. All rights reserved. +/// +/// This file is part of Runway SDK(tm). +/// +/// Runway SDK(tm) is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Lesser General Public License as +/// published by the Free Software Foundation, either version 3 of the +/// License, or (at your option) any later version. +/// +/// Runway SDK(tm) is distributed in the hope that it will be useful, but +/// WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Lesser General Public License for more details. +/// +/// You should have received a copy of the GNU Lesser General Public +/// License along with Runway SDK(tm). If not, see . +/// + +import { Injectable } from '@angular/core'; +import { Response} from '@angular/http'; +import 'rxjs/add/operator/toPromise'; + +import { Dataset } from '../model/dataset'; + +@Injectable() +export class MockDatasetService { + + getMockDataset(): Dataset { + let dataset = new Dataset(); + dataset.id = 'test-id'; + dataset.label = 'Test Label'; + dataset.description = 'Test Description'; + dataset.source = 'Test Source'; + + return dataset; + } + + getDatasets(): Promise { + return new Promise((resolve, reject) => { + let datasets:Dataset[] = []; + datasets.push(this.getMockDataset()); + + resolve(datasets); + }); + } + + edit(id : string): Promise { + return new Promise((resolve, reject) => { + resolve(this.getMockDataset()); + }); + } + + unlock(dataset: Dataset): Promise { + return new Promise((resolve, reject) => { + resolve(null); + }); + } + + apply(dataset: Dataset): Promise { + return new Promise((resolve, reject) => { + resolve(this.getMockDataset()); + }); + } + + remove(dataset: Dataset): Promise { + return new Promise((resolve, reject) => { + resolve(null); + }); + } + + validateDatasetName(name: string, id: string): Promise { + return new Promise((resolve, reject) => { + resolve(null); + }); + } + + xport(id : string): Promise { + return new Promise((resolve, reject) => { + resolve(this.getMockDataset()); + }); + } +} diff --git a/geoprism-web/src/main/ng2/src/app/service/dataset.service.ts b/geoprism-web/src/main/ng2/src/app/service/dataset.service.ts new file mode 100644 index 000000000..bf22facb5 --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/service/dataset.service.ts @@ -0,0 +1,123 @@ +/// +/// Copyright (c) 2015 TerraFrame, Inc. All rights reserved. +/// +/// This file is part of Runway SDK(tm). +/// +/// Runway SDK(tm) is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Lesser General Public License as +/// published by the Free Software Foundation, either version 3 of the +/// License, or (at your option) any later version. +/// +/// Runway SDK(tm) is distributed in the hope that it will be useful, but +/// WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Lesser General Public License for more details. +/// +/// You should have received a copy of the GNU Lesser General Public +/// License along with Runway SDK(tm). If not, see . +/// + +import { Injectable } from '@angular/core'; +import { Headers, Http, Response, URLSearchParams } from '@angular/http'; + +import 'rxjs/add/operator/toPromise'; + +import { EventService, BasicService } from './core.service'; +import { EventHttpService } from './event-http.service'; + +import { Dataset, DatasetCollection } from '../model/dataset'; + +declare var acp: any; + +@Injectable() +export class DatasetService extends BasicService { + + constructor(service: EventService, private ehttp: EventHttpService, private http: Http) { super(service); } + + getDatasets(): Promise { + return this.ehttp + .get(acp + '/prism/datasets') + .toPromise() + .then(response => { + return response.json() as DatasetCollection; + }) + .catch(this.handleError.bind(this)); + } + + edit(id : string): Promise { + + let headers = new Headers({ + 'Content-Type': 'application/json' + }); + + return this.ehttp + .post(acp + '/prism/edit-dataset', JSON.stringify({id:id}), {headers: headers}) + .toPromise() + .then((response: any) => { + return response.json() as Dataset; + }) + .catch(this.handleError.bind(this)); + } + + unlock(dataset: Dataset): Promise { + let headers = new Headers({ + 'Content-Type': 'application/json' + }); + + return this.ehttp + .post(acp + '/prism/unlock-dataset', JSON.stringify({id:dataset.id}), {headers: headers}) + .toPromise() + .catch(this.handleError.bind(this)); + } + + apply(dataset: Dataset): Promise { + let headers = new Headers({ + 'Content-Type': 'application/json' + }); + + return this.ehttp + .post(acp + '/prism/apply-dataset', JSON.stringify({dataset:dataset}), {headers: headers}) + .toPromise() + .then((response: any) => { + return response.json() as Dataset; + }) + .catch(this.handleError.bind(this)); + } + + remove(dataset: Dataset): Promise { + let headers = new Headers({ + 'Content-Type': 'application/json' + }); + + return this.ehttp + .post(acp + '/prism/remove', JSON.stringify({id:dataset.id}), {headers: headers}) + .toPromise() + .catch(this.handleError.bind(this)); + } + + + validateDatasetName(name: string, id: string): Promise { + let params: URLSearchParams = new URLSearchParams(); + params.set('name', name); + params.set('id', id); + + return this.http + .get(acp + '/uploader/validateDatasetName', {search: params}) + .toPromise(); + } + + xport(id : string): void { + + let headers = new Headers({ + 'Content-Type': 'application/json' + }); + + this.ehttp + .post(acp + '/prism/xport-dataset', JSON.stringify({id:id}), {headers: headers}) + .toPromise() + .then((response: any) => { + this.handleMessage('Export success.'); + }) + .catch(this.handleError.bind(this)); + } +} diff --git a/geoprism-web/src/main/ng2/src/app/service/event-http.service.ts b/geoprism-web/src/main/ng2/src/app/service/event-http.service.ts new file mode 100644 index 000000000..2cfe9739a --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/service/event-http.service.ts @@ -0,0 +1,46 @@ +import { Injectable } from '@angular/core'; +import { Http, RequestOptions, RequestOptionsArgs, Response, ConnectionBackend } from '@angular/http'; + +import { Observable } from 'rxjs/Observable'; +import 'rxjs/add/operator/finally'; + +import { EventService } from './core.service'; + +@Injectable() +export class EventHttpService extends Http { + private currentRequests: number = 0; + + public constructor(_backend: ConnectionBackend, _defaultOptions: RequestOptions, private service: EventService) { + super(_backend, _defaultOptions); + } + + public get(url: string, options?: RequestOptionsArgs) : Observable { + this.incrementRequestCount(); + + var response = super.get(url, options).finally(() => { + this.decrementRequestCount(); + }); + return response; + } + + public post(url: string, body: any, options?: RequestOptionsArgs): Observable { + this.incrementRequestCount(); + + var response = super.post(url, body, options).finally(() => { + this.decrementRequestCount(); + }); + return response; + } + + private decrementRequestCount() { + if (--this.currentRequests == 0) { + this.service.complete(); + } + } + + private incrementRequestCount() { + if (this.currentRequests++ == 0) { + this.service.start(); + } + } +} \ No newline at end of file diff --git a/geoprism-web/src/main/ng2/src/app/service/icon.service.ts b/geoprism-web/src/main/ng2/src/app/service/icon.service.ts new file mode 100644 index 000000000..6e1281c76 --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/service/icon.service.ts @@ -0,0 +1,101 @@ +/// +/// Copyright (c) 2015 TerraFrame, Inc. All rights reserved. +/// +/// This file is part of Runway SDK(tm). +/// +/// Runway SDK(tm) is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Lesser General Public License as +/// published by the Free Software Foundation, either version 3 of the +/// License, or (at your option) any later version. +/// +/// Runway SDK(tm) is distributed in the hope that it will be useful, but +/// WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Lesser General Public License for more details. +/// +/// You should have received a copy of the GNU Lesser General Public +/// License along with Runway SDK(tm). If not, see . +/// + +import { Injectable } from '@angular/core'; +import { Headers, Http, Response, URLSearchParams } from '@angular/http'; + +import 'rxjs/add/operator/toPromise'; + +import { EventService, BasicService } from '../service/core.service'; +import { EventHttpService } from '../service/event-http.service'; + +import { Icon } from '../model/icon'; + +declare var acp: any; + +@Injectable() +export class IconService extends BasicService { + + constructor(service: EventService, private ehttp: EventHttpService, private http: Http) { + super(service); + } + + getIcons(): Promise { + return this.ehttp + .get(acp + '/iconimage/getAll') + .toPromise() + .then(response => { + return response.json().icons as Icon[]; + }) + .catch(this.handleError.bind(this)); + } + + remove(id:string): Promise { + let headers = new Headers({ + 'Content-Type': 'application/json' + }); + + return this.ehttp + .post(acp + '/iconimage/remove', JSON.stringify({id:id}), { headers: headers }) + .toPromise() + .catch(this.handleError.bind(this)); + } + + edit(id : string): Promise { + let headers = new Headers({ + 'Content-Type': 'application/json' + }); + + return this.ehttp + .post(acp + '/iconimage/edit', JSON.stringify({id:id}), { headers: headers }) + .toPromise() + .then(response => { + return response.json() as Icon; + }) + .catch(this.handleError.bind(this)); + } + + unlock(id: string): Promise { + let headers = new Headers({ + 'Content-Type': 'application/json' + }); + + return this.ehttp + .post(acp + '/iconimage/unlock', JSON.stringify({id:id}), { headers: headers }) + .toPromise() + .catch(this.handleError.bind(this)); + } + + + apply(id: string, label: string): Promise { + + let data = new FormData(); + data.append('id', id); + data.append('label', label) + + return this.ehttp + .post(acp + '/iconimage/apply', data) + .toPromise() + .then(response => { + return response.json() as Icon; + }) + .catch(this.handleError.bind(this)); + } + +} diff --git a/geoprism-web/src/main/ng2/src/app/service/localization.service.mock.ts b/geoprism-web/src/main/ng2/src/app/service/localization.service.mock.ts new file mode 100644 index 000000000..e957cdf2c --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/service/localization.service.mock.ts @@ -0,0 +1,45 @@ +/// +/// Copyright (c) 2015 TerraFrame, Inc. All rights reserved. +/// +/// This file is part of Runway SDK(tm). +/// +/// Runway SDK(tm) is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Lesser General Public License as +/// published by the Free Software Foundation, either version 3 of the +/// License, or (at your option) any later version. +/// +/// Runway SDK(tm) is distributed in the hope that it will be useful, but +/// WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Lesser General Public License for more details. +/// +/// You should have received a copy of the GNU Lesser General Public +/// License along with Runway SDK(tm). If not, see . +/// + +import { Injectable } from '@angular/core'; + + +@Injectable() +export class MockLocalizationService { + + public parseNumber(value: string) : number { + return parseFloat(value); + } + + public formatNumber(value:any): string { + return value + ''; + } + + public localize(bundle: string, key: string): string { + return bundle + '.' + key; + } + + public get(key: string): string { + return key; + } + + public decode(key: string): string { + return key; + } +} diff --git a/geoprism-web/src/main/ng2/src/app/service/localization.service.ts b/geoprism-web/src/main/ng2/src/app/service/localization.service.ts new file mode 100644 index 000000000..d0be767a8 --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/service/localization.service.ts @@ -0,0 +1,83 @@ +/// +/// Copyright (c) 2015 TerraFrame, Inc. All rights reserved. +/// +/// This file is part of Runway SDK(tm). +/// +/// Runway SDK(tm) is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Lesser General Public License as +/// published by the Free Software Foundation, either version 3 of the +/// License, or (at your option) any later version. +/// +/// Runway SDK(tm) is distributed in the hope that it will be useful, but +/// WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Lesser General Public License for more details. +/// +/// You should have received a copy of the GNU Lesser General Public +/// License along with Runway SDK(tm). If not, see . +/// + +import { Injectable } from '@angular/core'; + +declare var Globalize: any; +declare var com: any + +@Injectable() +export class LocalizationService { + + private parser: any = Globalize.numberParser(); + private formatter: any = Globalize.numberFormatter(); + + public parseNumber(value: string) : number { + if(value != null && value.length > 0) { + //convert data from view format to model format + var number = this.parser( value ); + + return number; + } + + return null; + } + + public formatNumber(value:any): string { + if(value != null) { + var number = value; + + if(typeof number === 'string') { + if(number.length > 0 && Number(number)) { + number = Number(value); + } + else { + return ""; + } + } + + //convert data from model format to view format + return this.formatter(number); + } + + return null; + } + + public localize(bundle: string, key: string): string { + return com.runwaysdk.Localize.localize(bundle, key); + } + + public get(key: string): string { + return com.runwaysdk.Localize.get(key); + } + + public decode(key: string): string { + let index = key.lastIndexOf('.'); + + if(index !== -1) { + + let temp = [key.slice(0, index), key.slice(index + 1)] + + return this.localize(temp[0], temp[1]); + } + else { + return this.get(key); + } + } +} diff --git a/geoprism-web/src/main/ng2/src/app/service/upload.service.ts b/geoprism-web/src/main/ng2/src/app/service/upload.service.ts new file mode 100644 index 000000000..750a23f10 --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/service/upload.service.ts @@ -0,0 +1,207 @@ +/// +/// Copyright (c) 2015 TerraFrame, Inc. All rights reserved. +/// +/// This file is part of Runway SDK(tm). +/// +/// Runway SDK(tm) is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Lesser General Public License as +/// published by the Free Software Foundation, either version 3 of the +/// License, or (at your option) any later version. +/// +/// Runway SDK(tm) is distributed in the hope that it will be useful, but +/// WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Lesser General Public License for more details. +/// +/// You should have received a copy of the GNU Lesser General Public +/// License along with Runway SDK(tm). If not, see . +/// + +import { Injectable } from '@angular/core'; +import { Headers, Http, Response, URLSearchParams } from '@angular/http'; + +import { Observable } from 'rxjs/Observable'; +import 'rxjs/add/operator/toPromise'; + +import { EventService, BasicService } from './core.service'; +import { EventHttpService } from './event-http.service'; + +import { Pair } from '../model/pair'; +import { Sheet, Workbook, GeoSynonym, ClassifierSynonym, Entity, DatasetResponse } from '../uploader/uploader-model'; + +declare var acp: any; + +@Injectable() +export class UploadService extends BasicService { + + constructor(service: EventService, private ehttp: EventHttpService, private http: Http) { super(service); } + + getSavedConfiguration(id: string, sheetName: string): Promise { + + let headers = new Headers({ + 'Content-Type': 'application/json' + }); + + let data = JSON.stringify({id:id, sheetName: sheetName}); + + return this.ehttp + .post(acp + '/uploader/getSavedConfiguration', data, {headers: headers}) + .toPromise() + .then((response: any) => { + return response.json(); + }) + .catch(this.handleError.bind(this)); + } + + cancelImport(workbook: Workbook): Promise { + + let headers = new Headers({ + 'Content-Type': 'application/json' + }); + + let data = JSON.stringify({configuration : workbook }); + + return this.ehttp + .post(acp + '/uploader/cancelImport', data, {headers: headers}) + .toPromise() + .catch(this.handleError.bind(this)); + } + + importData(workbook: Workbook): Promise { + let headers = new Headers({ + 'Content-Type': 'application/json' + }); + + let data = JSON.stringify({configuration : workbook }); + + return this.ehttp + .post(acp + '/uploader/importData', data, {headers: headers}) + .toPromise() + .then((response: any) => { + return response.json() as DatasetResponse; + }) + .catch(this.handleError.bind(this)); + } + + getGeoEntitySuggestions(parentId: string, universalId: string, text: string, limit: string): Promise> { + + let params: URLSearchParams = new URLSearchParams(); + params.set('parentId', parentId); + params.set('universalId', universalId); + params.set('text', text); + params.set('limit', limit); + + return this.http + .get(acp + '/uploader/getGeoEntitySuggestions', {search: params}) + .toPromise() + .then((response: any) => { + return response.json() as Array<{ text: string, data: any }>; + }) + .catch(this.handleError.bind(this)); + } + + createGeoEntitySynonym(entityId: string, label: string): Promise { + let headers = new Headers({ + 'Content-Type': 'application/json' + }); + + let data = JSON.stringify({entityId: entityId, label: label }); + + return this.ehttp + .post(acp + '/uploader/createGeoEntitySynonym', data, {headers: headers}) + .toPromise() + .then((response: any) => { + return response.json() as GeoSynonym; + }) + .catch(this.handleError.bind(this)); + } + + createGeoEntity(parentId: string, universalId: string, label: string): Promise { + let headers = new Headers({ + 'Content-Type': 'application/json' + }); + + let data = JSON.stringify({parentId: parentId, universalId: universalId, label: label }); + + return this.ehttp + .post(acp + '/uploader/createGeoEntity', data, {headers: headers}) + .toPromise() + .then((response: any) => { + return response.json() as Entity; + }) + .catch(this.handleError.bind(this)); + } + + deleteGeoEntity(entityId: string): Promise { + let headers = new Headers({ + 'Content-Type': 'application/json' + }); + + let data = JSON.stringify({entityId: entityId}); + + return this.ehttp + .post(acp + '/uploader/deleteGeoEntity', data, {headers: headers}) + .toPromise() + .catch(this.handleError.bind(this)); + } + + deleteGeoEntitySynonym(synonymId: string): Promise { + let headers = new Headers({ + 'Content-Type': 'application/json' + }); + + let data = JSON.stringify({synonymId: synonymId}); + + return this.ehttp + .post(acp + '/uploader/deleteGeoEntitySynonym', data, {headers: headers}) + .toPromise() + .catch(this.handleError.bind(this)); + } + + getClassifierSuggestions(mdAttributeId: string, text: string, limit: string): Promise> { + + let params: URLSearchParams = new URLSearchParams(); + params.set('mdAttributeId', mdAttributeId); + params.set('text', text); + params.set('limit', limit); + + return this.http + .get(acp + '/uploader/getClassifierSuggestions', {search: params}) + .toPromise() + .then((response: any) => { + return response.json() as Array<{ text: string, data: any }>; + }) + .catch(this.handleError.bind(this)); + } + + createClassifierSynonym(classifierId: string, label: string): Promise { + let headers = new Headers({ + 'Content-Type': 'application/json' + }); + + let data = JSON.stringify({classifierId: classifierId, label: label }); + + return this.ehttp + .post(acp + '/uploader/createClassifierSynonym', data, {headers: headers}) + .toPromise() + .then((response: any) => { + return response.json() as ClassifierSynonym; + }) + .catch(this.handleError.bind(this)); + } + + deleteClassifierSynonym(synonymId: string): Promise { + let headers = new Headers({ + 'Content-Type': 'application/json' + }); + + let data = JSON.stringify({synonymId: synonymId}); + + return this.ehttp + .post(acp + '/uploader/deleteClassifierSynonym', data, {headers: headers}) + .toPromise() + .catch(this.handleError.bind(this)); + } + + +} diff --git a/geoprism-web/src/main/ng2/src/app/uploader/attributes-page.component.html b/geoprism-web/src/main/ng2/src/app/uploader/attributes-page.component.html new file mode 100644 index 000000000..c8dfa7553 --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/uploader/attributes-page.component.html @@ -0,0 +1,102 @@ + diff --git a/geoprism-web/src/main/ng2/src/app/uploader/attributes-page.component.ts b/geoprism-web/src/main/ng2/src/app/uploader/attributes-page.component.ts new file mode 100644 index 000000000..27d184577 --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/uploader/attributes-page.component.ts @@ -0,0 +1,171 @@ +/// +/// Copyright (c) 2015 TerraFrame, Inc. All rights reserved. +/// +/// This file is part of Runway SDK(tm). +/// +/// Runway SDK(tm) is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Lesser General Public License as +/// published by the Free Software Foundation, either version 3 of the +/// License, or (at your option) any later version. +/// +/// Runway SDK(tm) is distributed in the hope that it will be useful, but +/// WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Lesser General Public License for more details. +/// +/// You should have received a copy of the GNU Lesser General Public +/// License along with Runway SDK(tm). If not, see . +/// + +import { Component, OnInit, Input, Output, EventEmitter, AfterViewChecked} from '@angular/core'; +import { Validator, AbstractControl, NG_VALIDATORS } from '@angular/forms'; + +import { LocalValidator } from '../core/function-validator.directive'; +import { RemoteValidator } from '../core/async-validator.directive'; +import { UploadInformation, Sheet, Page, Field, Universal} from './uploader-model'; +import { CategoryService } from '../service/category.service'; + +@Component({ + + selector: 'attributes-page', + templateUrl: './attributes-page.component.html', + styleUrls: [] +}) +export class AttributesPageComponent implements OnInit, AfterViewChecked, LocalValidator, RemoteValidator { + + @Input() info: UploadInformation; + @Input() sheet: Sheet; + @Input() page: Page; + + @Output() onFieldChange = new EventEmitter(); + + longitudeFields = {}; + latitudeFields = {}; + textFields = {}; + universals: Universal[]; + loaded: boolean; + + coordinateMismatch: boolean; + coordinateText: boolean; + + constructor(private categoryService: CategoryService) { + this.loaded = false; + this.coordinateMismatch = false; + this.coordinateText = false; + } + + ngOnInit(): void { + for(let i = 0; i < this.sheet.fields.length; i++) { + let field = this.sheet.fields[i]; + + if(field.categoryLabel == null) { + field.categoryLabel = field.label; + } + + if(field.root == null) { + field.root = ''; + } + + this.accept(field); + } + + // Initialize the universal options + if(this.info.options != null) { + let countries = this.info.options.countries; + + for(let i = 0; i < countries.length; i++) { + let country = countries[i]; + + if(country.value == this.sheet.country) { + this.universals = country.options; + } + } + } + } + + public ngAfterViewChecked(): void { + this.loaded = true; + } + + accept(field: Field): void { + if(field.type === "LATITUDE") { + this.latitudeFields[field.name] = field; + } + else { + delete this.latitudeFields[field.name]; + } + + if(field.type === "LONGITUDE") { + this.longitudeFields[field.name] = field; + } + else { + delete this.longitudeFields[field.name]; + } + + if(field.type === "TEXT") { + this.textFields[field.name] = field; + } + else { + delete this.textFields[field.name]; + } + + this.coordinateMismatch = (Object.keys(this.latitudeFields).length != Object.keys(this.longitudeFields).length); + + if(Object.keys(this.latitudeFields).length > 0 || Object.keys(this.longitudeFields).length > 0) { + this.coordinateText = (Object.keys(this.textFields).length == 0); + } + else { + this.coordinateText = false; + } + + if(this.loaded) { + this.onFieldChange.emit(field); + } + } + + localValidate(value: string, config: string): {[key : string] : any} { + if(config == 'label') { + return this.validateLabel(value); + } + + return null; + } + + validateLabel(label: string): {[key : string] : any} { + if(this.sheet != null) { + let count = 0; + + for(let i = 0; i < this.sheet.fields.length; i++) { + let field = this.sheet.fields[i]; + + if(field.label == label) { + count++; + } + } + + if(count > 1) { + return {unique:false}; + } + } + + return null; + } + + validate(value:string, config:string): Promise<{[key : string] : any}> { + if(config == 'category') { + return this.validateCategory(value); + } + + return null; + } + + validateCategory(label: string): Promise<{[key : string] : any}> { + return this.categoryService.validate(label, '') + .then((response:any) => { + return null; + }) + .catch((error:any) => { + return {uniqueName: false}; + }); + } +} diff --git a/geoprism-web/src/main/ng2/src/app/uploader/beginning-info-page.component.html b/geoprism-web/src/main/ng2/src/app/uploader/beginning-info-page.component.html new file mode 100644 index 000000000..b6a217270 --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/uploader/beginning-info-page.component.html @@ -0,0 +1,86 @@ + \ No newline at end of file diff --git a/geoprism-web/src/main/ng2/src/app/uploader/beginning-info-page.component.ts b/geoprism-web/src/main/ng2/src/app/uploader/beginning-info-page.component.ts new file mode 100644 index 000000000..f61e0aa49 --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/uploader/beginning-info-page.component.ts @@ -0,0 +1,33 @@ +/// +/// Copyright (c) 2015 TerraFrame, Inc. All rights reserved. +/// +/// This file is part of Runway SDK(tm). +/// +/// Runway SDK(tm) is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Lesser General Public License as +/// published by the Free Software Foundation, either version 3 of the +/// License, or (at your option) any later version. +/// +/// Runway SDK(tm) is distributed in the hope that it will be useful, but +/// WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Lesser General Public License for more details. +/// +/// You should have received a copy of the GNU Lesser General Public +/// License along with Runway SDK(tm). If not, see . +/// + +import { Component, Input} from '@angular/core'; +import { Page } from './uploader-model'; + +@Component({ + + selector: 'beginning-info-page', + templateUrl: './beginning-info-page.component.html', + styleUrls: [] +}) +export class BeginningInfoPageComponent { + @Input() page: Page; + + constructor() { } +} diff --git a/geoprism-web/src/main/ng2/src/app/uploader/category-validation-page.component.html b/geoprism-web/src/main/ng2/src/app/uploader/category-validation-page.component.html new file mode 100644 index 000000000..31b7ebd17 --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/uploader/category-validation-page.component.html @@ -0,0 +1,54 @@ + + diff --git a/geoprism-web/src/main/ng2/src/app/uploader/category-validation-page.component.ts b/geoprism-web/src/main/ng2/src/app/uploader/category-validation-page.component.ts new file mode 100644 index 000000000..d258d3fe6 --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/uploader/category-validation-page.component.ts @@ -0,0 +1,51 @@ +/// +/// Copyright (c) 2015 TerraFrame, Inc. All rights reserved. +/// +/// This file is part of Runway SDK(tm). +/// +/// Runway SDK(tm) is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Lesser General Public License as +/// published by the Free Software Foundation, either version 3 of the +/// License, or (at your option) any later version. +/// +/// Runway SDK(tm) is distributed in the hope that it will be useful, but +/// WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Lesser General Public License for more details. +/// +/// You should have received a copy of the GNU Lesser General Public +/// License along with Runway SDK(tm). If not, see . +/// + +import { Component, Input} from '@angular/core'; + +import { Page, Problems, Workbook} from './uploader-model'; + +@Component({ + + selector: 'category-validation-page', + templateUrl: './category-validation-page.component.html', + styleUrls: [] +}) +export class CategoryValidationPageComponent { + + @Input() workbook: Workbook; + @Input() page: Page; + @Input() problems: Problems; + + constructor() { + } + + hasProblems(): boolean { + if(this.problems.categories != null) { + for(let i = 0; i < this.problems.categories.length; i++) { + + if(!this.problems.categories[i].resolved) { + return true; + } + } + } + + return false; + } +} diff --git a/geoprism-web/src/main/ng2/src/app/uploader/category-validation-problem.component.html b/geoprism-web/src/main/ng2/src/app/uploader/category-validation-problem.component.html new file mode 100644 index 000000000..a2c2c987d --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/uploader/category-validation-problem.component.html @@ -0,0 +1,38 @@ +
+
+
+
{{problem.attributeLabel}}
+
{{problem.label}}
+
+
+ +
+
+ + + + + + +
+
+
+
+ +
+
+ [{{problem.action.label}}] +
+
+ [{{problem.label}}] +
+
+ +
+
+
+
+
\ No newline at end of file diff --git a/geoprism-web/src/main/ng2/src/app/uploader/category-validation-problem.component.ts b/geoprism-web/src/main/ng2/src/app/uploader/category-validation-problem.component.ts new file mode 100644 index 000000000..62b8aecef --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/uploader/category-validation-problem.component.ts @@ -0,0 +1,170 @@ +/// +/// Copyright (c) 2015 TerraFrame, Inc. All rights reserved. +/// +/// This file is part of Runway SDK(tm). +/// +/// Runway SDK(tm) is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Lesser General Public License as +/// published by the Free Software Foundation, either version 3 of the +/// License, or (at your option) any later version. +/// +/// Runway SDK(tm) is distributed in the hope that it will be useful, but +/// WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Lesser General Public License for more details. +/// +/// You should have received a copy of the GNU Lesser General Public +/// License along with Runway SDK(tm). If not, see . +/// + +import { Component, Input, Output, EventEmitter, OnInit} from '@angular/core'; + +import { Page, CategoryProblem, Workbook} from './uploader-model'; +import { Pair } from '../model/pair'; + +import { CategoryService } from '../service/category.service'; +import { UploadService } from '../service/upload.service'; +import { IdService } from '../service/core.service'; + +@Component({ + + selector: 'category-validation-problem', + templateUrl: './category-validation-problem.component.html', + styleUrls: [] +}) +export class CategoryValidationProblemComponent implements OnInit { + + @Input() problem: CategoryProblem; + @Input() index: number; + @Input() workbook: Workbook; + @Input() options: Pair[]; + + @Output() onProblemChange = new EventEmitter(); + + show: boolean; + hasSynonym: boolean; + + constructor(private uploadService: UploadService, private categoryService: CategoryService, private idService: IdService) { + } + + ngOnInit(): void { + this.problem.synonym = null; + this.show = false; + this.hasSynonym = false; + } + + source = (text: string) => { + let limit = '20'; + + return this.uploadService.getClassifierSuggestions(this.problem.mdAttributeId, text, limit); + } + + setSynonym() { + this.hasSynonym = (this.problem.synonym != null && this.problem.synonym.length > 0); + } + + createSynonym(): void { + if(this.hasSynonym){ + this.uploadService.createClassifierSynonym(this.problem.synonym, this.problem.label) + .then(response => { + this.problem.resolved = true; + this.problem.action = { + name : 'SYNONYM', + synonymId : response.synonymId, + label : response.label + }; + + this.onProblemChange.emit(this.problem); + }); + } + } + + createOption(): void { + this.categoryService.create(this.problem.label, this.problem.categoryId, false) + .then(response => { + this.problem.resolved = true; + this.problem.action = { + name : 'OPTION', + optionId : response.id + }; + + this.onProblemChange.emit(this.problem); + }); + } + + ignoreValue(): void { + this.problem.resolved = true; + + this.problem.action = { + name : 'IGNORE' + }; + + let mdAttributeId = this.problem.mdAttributeId; + + if(!this.workbook.categoryExclusion){ + this.workbook.categoryExclusion = {}; + } + + if(!this.workbook.categoryExclusion[mdAttributeId]) { + this.workbook.categoryExclusion[mdAttributeId] = []; + } + + this.workbook.categoryExclusion[mdAttributeId].push(this.problem.label); + + this.onProblemChange.emit(this.problem); + } + + removeExclusion(): void { + + let mdAttributeId = this.problem.mdAttributeId; + let label = this.problem.label; + + if(this.workbook.categoryExclusion && this.workbook.categoryExclusion[mdAttributeId]){ + this.workbook.categoryExclusion[mdAttributeId] = this.workbook.categoryExclusion[mdAttributeId].filter(h => h !== label); + } + + if(this.workbook.categoryExclusion[mdAttributeId].length === 0) { + delete this.workbook.categoryExclusion[mdAttributeId]; + } + } + + undoAction(): void { + + if(this.problem.resolved) { + + let action = this.problem.action; + + if(action.name == 'IGNORE'){ + this.problem.resolved = false; + + this.removeExclusion(); + + this.onProblemChange.emit(this.problem); + } + else if(action.name == 'SYNONYM') { + this.uploadService.deleteClassifierSynonym(action.synonymId) + .then(response => { + this.problem.resolved = false; + this.problem.synonym = null; + this.problem.action = null; + + this.hasSynonym = (this.problem.synonym != null); + + this.onProblemChange.emit(this.problem); + }); + } + else if(action.name == 'OPTION') { + this.categoryService.remove(action.optionId) + .then(response => { + this.problem.resolved = false; + this.problem.optionId = null; + this.problem.action = null; + + this.hasSynonym = (this.problem.synonym != null); + + this.onProblemChange.emit(this.problem); + }); + } + } + } +} diff --git a/geoprism-web/src/main/ng2/src/app/uploader/coordinate-page.component.html b/geoprism-web/src/main/ng2/src/app/uploader/coordinate-page.component.html new file mode 100644 index 000000000..ab0c132e3 --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/uploader/coordinate-page.component.html @@ -0,0 +1,109 @@ + \ No newline at end of file diff --git a/geoprism-web/src/main/ng2/src/app/uploader/coordinate-page.component.ts b/geoprism-web/src/main/ng2/src/app/uploader/coordinate-page.component.ts new file mode 100644 index 000000000..047413b40 --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/uploader/coordinate-page.component.ts @@ -0,0 +1,227 @@ +/// +/// Copyright (c) 2015 TerraFrame, Inc. All rights reserved. +/// +/// This file is part of Runway SDK(tm). +/// +/// Runway SDK(tm) is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Lesser General Public License as +/// published by the Free Software Foundation, either version 3 of the +/// License, or (at your option) any later version. +/// +/// Runway SDK(tm) is distributed in the hope that it will be useful, but +/// WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Lesser General Public License for more details. +/// +/// You should have received a copy of the GNU Lesser General Public +/// License along with Runway SDK(tm). If not, see . +/// + +import { Component, OnInit, Input, Output, EventEmitter, Directive} from '@angular/core'; +import { Validator, AbstractControl, NG_VALIDATORS } from '@angular/forms'; + +import { LocalValidator } from '../core/function-validator.directive'; +import { UploadInformation, Sheet, Page, Field, Universal, CoordinateAttribute, Coordinates} from './uploader-model'; +import { LocalizationService } from '../service/localization.service'; + +@Component({ + + selector: 'coordinate-page', + templateUrl: './coordinate-page.component.html', + styleUrls: [] +}) +export class CoordinatePageComponent implements OnInit, LocalValidator { + + @Input() info: UploadInformation; + @Input() sheet: Sheet; + @Input() page: Page; + + locations: {[key : string] : string}[]; + + longitudes: Field[]; + featureLabels: Field[]; + featureIds: Field[]; + + universals: Universal[]; + labels: {[key : string] : string}; + + constructor(private localizationService: LocalizationService) { + this.longitudes = []; + this.featureLabels = []; + this.locations = []; + this.featureIds = []; + this.labels = {}; + } + + ngOnInit(): void { + let countries = this.info.options.countries; + + for(let i = 0; i < countries.length; i++) { + let country = countries[i]; + this.universals = country.options; + + if(country.value == this.sheet.country) { + + for(let j = 0; j < country.options.length; j++) { + let universal = country.options[j]; + + this.labels[universal.value] = universal.label; + } + } + } + + for(let i = 0; i < this.sheet.fields.length; i++) { + let field = this.sheet.fields[i]; + + if(field.type == 'LATITUDE') { + + if(!this.hasCoordinateField(field)) { + let coordinate = new CoordinateAttribute(); + coordinate.label = ""; + coordinate.latitude = field.label; + coordinate.longitude = this.getSuggestedLongitude(field); + coordinate.featureLabel = ""; + coordinate.location = ""; + coordinate.featureId = ""; + coordinate.id = field.label + + this.sheet.coordinates.push(coordinate); + } + } + else if(field.type == 'LONGITUDE') { + this.longitudes.push(field); + } + else if(field.type == 'TEXT') { + this.featureLabels.push(field); + } + else if(this.isBasic(field)) { + this.featureIds.push(field); + } + } + + /* + * If there is only 1 longitude field then set that value + * automatically and don't give the user a drop-down that + * they need to select from + */ + if(this.longitudes.length == 1) { + for(let i = 0; i < this.sheet.coordinates.length; i++) { + let coordinate = this.sheet.coordinates[i]; + + coordinate.longitude = this.longitudes[0].label; + } + } + + if(this.sheet.attributes != null) { + for(let i = 0; i < this.sheet.attributes.ids.length; i++) { + let id = this.sheet.attributes.ids[i]; + let attribute = this.sheet.attributes.values[id]; + + this.locations.push({ + label : attribute.label, + universal : attribute.universal + }); + } + } + } + + getSuggestedLongitude(targetField: Field): string { + let fields = this.sheet.fields; + let trackingPosition:any = null; + let mostLikelyLongitudeField:any = null; + let label = targetField.label.toLowerCase(); + + let labels = [ + this.localizationService.localize("dataUploader", "attributeLatAbbreviation").toLowerCase(), + this.localizationService.localize("dataUploader", "attributeLatitudeName").toLowerCase(), + this.localizationService.localize("dataUploader", "attributeLngAbbreviation").toLowerCase(), + this.localizationService.localize("dataUploader", "attributeLongAbbreviation").toLowerCase(), + this.localizationService.localize("dataUploader", "attributeLongitudeName").toLowerCase() + ]; + + for(let i=0; i 1) { + return {unique:false}; + } + } + + return null; + } +} diff --git a/geoprism-web/src/main/ng2/src/app/uploader/geo-validation-page.component.html b/geoprism-web/src/main/ng2/src/app/uploader/geo-validation-page.component.html new file mode 100644 index 000000000..cdee2715a --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/uploader/geo-validation-page.component.html @@ -0,0 +1,55 @@ + + diff --git a/geoprism-web/src/main/ng2/src/app/uploader/geo-validation-page.component.ts b/geoprism-web/src/main/ng2/src/app/uploader/geo-validation-page.component.ts new file mode 100644 index 000000000..a923ca0fa --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/uploader/geo-validation-page.component.ts @@ -0,0 +1,51 @@ +/// +/// Copyright (c) 2015 TerraFrame, Inc. All rights reserved. +/// +/// This file is part of Runway SDK(tm). +/// +/// Runway SDK(tm) is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Lesser General Public License as +/// published by the Free Software Foundation, either version 3 of the +/// License, or (at your option) any later version. +/// +/// Runway SDK(tm) is distributed in the hope that it will be useful, but +/// WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Lesser General Public License for more details. +/// +/// You should have received a copy of the GNU Lesser General Public +/// License along with Runway SDK(tm). If not, see . +/// + +import { Component, Input} from '@angular/core'; + +import { Page, Problems, Workbook} from './uploader-model'; + +@Component({ + + selector: 'geo-validation-page', + templateUrl: './geo-validation-page.component.html', + styleUrls: [] +}) +export class GeoValidationPageComponent { + + @Input() workbook: Workbook; + @Input() page: Page; + @Input() problems: Problems; + + constructor() { + } + + hasProblems(): boolean { + if(this.problems.locations != null) { + for(let i = 0; i < this.problems.locations.length; i++) { + + if(!this.problems.locations[i].resolved) { + return true; + } + } + } + + return false; + } +} diff --git a/geoprism-web/src/main/ng2/src/app/uploader/geo-validation-problem.component.html b/geoprism-web/src/main/ng2/src/app/uploader/geo-validation-problem.component.html new file mode 100644 index 000000000..03a16f123 --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/uploader/geo-validation-problem.component.html @@ -0,0 +1,50 @@ +
+
+
+
+
    +
  1. {{context.label}} ({{context.universal}})
  2. +
+
+
{{problem.label}} ({{problem.universalLabel}})
+
+
+ +
+
+ + + + + + +
+
+
+
+ +
+
+ + + + [{{problem.action.label}}] + + + +
    + +
  • {{ancestor.label}}
  • +
+
+
+
+ [{{problem.action.label}}] +
+
+ +
+
+
+
+
\ No newline at end of file diff --git a/geoprism-web/src/main/ng2/src/app/uploader/geo-validation-problem.component.ts b/geoprism-web/src/main/ng2/src/app/uploader/geo-validation-problem.component.ts new file mode 100644 index 000000000..2d2159633 --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/uploader/geo-validation-problem.component.ts @@ -0,0 +1,173 @@ +/// +/// Copyright (c) 2015 TerraFrame, Inc. All rights reserved. +/// +/// This file is part of Runway SDK(tm). +/// +/// Runway SDK(tm) is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Lesser General Public License as +/// published by the Free Software Foundation, either version 3 of the +/// License, or (at your option) any later version. +/// +/// Runway SDK(tm) is distributed in the hope that it will be useful, but +/// WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Lesser General Public License for more details. +/// +/// You should have received a copy of the GNU Lesser General Public +/// License along with Runway SDK(tm). If not, see . +/// + +import { Component, Input, Output, EventEmitter, OnInit} from '@angular/core'; + +import { Page, LocationProblem, Workbook, LocationExclusion} from './uploader-model'; +import { UploadService } from '../service/upload.service'; +import { IdService } from '../service/core.service'; + +@Component({ + + selector: 'geo-validation-problem', + templateUrl: './geo-validation-problem.component.html', + styleUrls: [] +}) +export class GeoValidationProblemComponent implements OnInit { + + @Input() problem: LocationProblem; + @Input() index: number; + @Input() workbook: Workbook; + + @Output() onProblemChange = new EventEmitter(); + + show: boolean; + hasSynonym: boolean; + + constructor(private uploadService: UploadService, private idService: IdService) { + } + + ngOnInit(): void { + this.problem.synonym = null; + this.show = false; + this.hasSynonym = false; + } + + source = (keyword: string) => { + let limit = '20'; + + return this.uploadService.getGeoEntitySuggestions(this.problem.parentId, this.problem.universalId, keyword, limit); + } + + setSynonym(item: {text: string, data: any}) { + this.problem.synonym = item.data; + this.hasSynonym = (this.problem.synonym != null); + } + + createSynonym(): void { + if(this.hasSynonym){ + this.uploadService.createGeoEntitySynonym(this.problem.synonym, this.problem.label) + .then(response => { + this.problem.resolved = true; + this.problem.action = { + name : 'SYNONYM', + synonymId : response.synonymId, + label : response.label, + ancestors : response.ancestors + }; + + this.onProblemChange.emit(this.problem); + }); + } + } + + createEntity(): void { + + this.uploadService.createGeoEntity(this.problem.parentId, this.problem.universalId, this.problem.label) + .then(response => { + this.problem.resolved = true; + this.problem.action = { + name : 'ENTITY', + entityId : response.entityId + }; + + this.onProblemChange.emit(this.problem); + }); + } + + removeLocationExclusion(exclusionId: string): void { + + if(this.workbook.locationExclusions){ + this.workbook.locationExclusions = this.workbook.locationExclusions.filter(h => h.id !== exclusionId); + } + } + + ignoreDataAtLocation(): void { + let locationLabel = this.problem.label; + let universal = this.problem.universalId; + let id = this.idService.generateId(); + + this.problem.resolved = true; + + this.problem.action = { + name : 'IGNOREATLOCATION', + label : locationLabel, + id : id + }; + + let exclusion = new LocationExclusion(id, universal, locationLabel, this.problem.parentId); + + if(this.workbook.locationExclusions){ + this.workbook.locationExclusions.push(exclusion); + } + else{ + this.workbook.locationExclusions = [exclusion]; + } + + this.onProblemChange.emit(this.problem); + } + + undoAction(): void { + let locationLabel = this.problem.label; + let universal = this.problem.universalId; + + if(this.problem.resolved) { + let action = this.problem.action; + + if(action.name == 'ENTITY') { + this.uploadService.deleteGeoEntity(action.entityId) + .then(response => { + this.problem.resolved = false; + this.problem.synonym = null; + this.problem.action = null; + + this.hasSynonym = (this.problem.synonym != null); + + this.onProblemChange.emit(this.problem); + }); + } + else if(action.name == 'IGNOREATLOCATION'){ + this.problem.resolved = false; + this.problem.action = null; + + this.removeLocationExclusion(action.id); + + this.onProblemChange.emit(this.problem); + } + else if(action.name == 'SYNONYM') { + this.uploadService.deleteGeoEntitySynonym(action.synonymId) + .then(response => { + this.problem.resolved = false; + this.problem.synonym = null; + this.problem.action = null; + + this.hasSynonym = (this.problem.synonym != null); + + this.onProblemChange.emit(this.problem); + }); + } + + } + } + + toggle(): void { + this.show = !this.show; + } + +} diff --git a/geoprism-web/src/main/ng2/src/app/uploader/location-page.component.html b/geoprism-web/src/main/ng2/src/app/uploader/location-page.component.html new file mode 100644 index 000000000..ba0771d13 --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/uploader/location-page.component.html @@ -0,0 +1,116 @@ + + diff --git a/geoprism-web/src/main/ng2/src/app/uploader/location-page.component.ts b/geoprism-web/src/main/ng2/src/app/uploader/location-page.component.ts new file mode 100644 index 000000000..1c1ad678c --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/uploader/location-page.component.ts @@ -0,0 +1,603 @@ +/// +/// Copyright (c) 2015 TerraFrame, Inc. All rights reserved. +/// +/// This file is part of Runway SDK(tm). +/// +/// Runway SDK(tm) is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Lesser General Public License as +/// published by the Free Software Foundation, either version 3 of the +/// License, or (at your option) any later version. +/// +/// Runway SDK(tm) is distributed in the hope that it will be useful, but +/// WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Lesser General Public License for more details. +/// +/// You should have received a copy of the GNU Lesser General Public +/// License along with Runway SDK(tm). If not, see . +/// + +import { Component, OnInit, Input, Output, EventEmitter, Directive} from '@angular/core'; +import { Validator, AbstractControl, NG_VALIDATORS } from '@angular/forms'; + +import { LocalValidator } from '../core/function-validator.directive'; +import { RemoteValidator } from '../core/async-validator.directive'; +import { UploadInformation, Sheet, Page, Field, Universal, Locations, LocationAttribute} from './uploader-model'; +import { CategoryService } from '../service/category.service'; +import { IdService } from '../service/core.service'; + +class LocationField { + constructor(public field: Field, public universal: Universal) {} +} + +@Component({ + + selector: 'location-page', + templateUrl: './location-page.component.html', + styleUrls: [] +}) +export class LocationPageComponent implements OnInit, LocalValidator { + + @Input() info: UploadInformation; + @Input() sheet: Sheet; + @Input() page: Page; + + locationFields: { [key:string]:Field[]; } = {}; + universals: Universal[]; + + universalOptions: Universal[]; + attribute: LocationAttribute; + unassignedFields: Field[]; + + constructor(private idService: IdService) { + this.unassignedFields = []; + this.attribute = this.createNewAttribute(); + } + + ngOnInit(): void { + + // Initialize the universal options + let countries = this.info.options.countries; + + for(let i = 0; i < countries.length; i++) { + let country = countries[i]; + + if(country.value == this.sheet.country) { + this.universals = country.options; + } + } + + // Create a map of possible location fields + for(let j = 0; j < this.sheet.fields.length; j++) { + let field = this.sheet.fields[j]; + + if(field.type == 'LOCATION') { + if(this.locationFields[field.universal] == null) { + this.locationFields[field.universal] = []; + } + + this.locationFields[field.universal].push(field); + } + } + + this.setLocationFieldAutoAssignment(); + } + + + /** + * Gets the lowest unassigned location fields in across the entire universal hierarchy. + */ + getLowestUnassignedLocationFields(): LocationField[] { + let unassignedLowestFields = new Array(); + + for(let i = (this.universals.length - 1); i >= 0; i--) { + let universal = this.universals[i]; + + if(this.locationFields[universal.value] != null) { + let fields = this.locationFields[universal.value]; + + for(let j = 0; j < fields.length; j++) { + let field = fields[j]; + + if(!field.assigned) { + unassignedLowestFields.push(new LocationField(field, universal)); + } + } + + if(unassignedLowestFields.length > 0){ + return unassignedLowestFields; + } + } + } + + return unassignedLowestFields; + } + + + /** + * Gets all unassigned location fields at a given universal level + * + * @universalId - The universal level at which to search for unassigned fields + */ + getUnassignedLocationFields(universalId: string): Field[] { + if(this.locationFields.hasOwnProperty(universalId)){ + let fields = this.locationFields[universalId]; + let unassignedFields:any = []; + + for(let j = 0; j < fields.length; j++) { + let field = fields[j]; + + if(!field.assigned) { + unassignedFields.push(field); + } + } + + return unassignedFields; + } + + return []; + } + + /** + * Gets the next location moving from low to high in the universal hierarchy. + * Valid returns include another field at the same universal level or a higher universal level. + * + */ + getNextLocationField(): LocationField { + for(let i = (this.universals.length - 1); i >= 0; i--) { + let universal = this.universals[i]; + + if(this.locationFields[universal.value] != null) { + let fields = this.locationFields[universal.value]; + + for(let j = 0; j < fields.length; j++) { + let field = fields[j]; + + if(!field.assigned) { + return new LocationField(field, universal); + } + } + } + } + + return null; + } + + + edit(attribute: LocationAttribute): void { + // This should only be hit if trying to edit when an existing edit session is in place. + if(this.attribute && this.sheet.attributes.values[this.attribute.id]){ + if(this.sheet.attributes.values[this.attribute.id].editing){ + this.sheet.attributes.values[this.attribute.id].editing = false; + } + + // all fields that are in the current attribute (ui widget) should be set back to assigned + // which creates a save type behavior for the current state of the attribute. + this.setFieldAssigned(); + } + + if(this.attribute == null) { + this.attribute = this.createNewAttribute(); + } + + Object.assign(this.attribute, attribute); + + this.sheet.attributes.values[this.attribute.id].editing = true; + + this.unassignLocationFields(); + + let locFieldsSelectedButNotYetAssigned = this.getLocationFieldsSelectedInWidget(); + this.refreshUnassignedFields(locFieldsSelectedButNotYetAssigned); + + let fieldLabel = this.attribute.fields[attribute.universal]; + let field = this.getField(fieldLabel); + + // EXCLUDEed fields should be skipped + if(field){ + this.setUniversalOptions(field); + } + } + + + /** + * Sets all this.locationFields to false if the location field is part of this.attribute.fields. + */ + unassignLocationFields(): void{ + for (let key in this.attribute.fields) { + if (this.attribute.fields.hasOwnProperty(key)) { + let attributeFieldLabel = this.attribute.fields[key]; + let locFields = this.locationFields[key]; + + for(let i=0; i attributeInSheet + Object.assign(attributeInSheet, this.attribute); + + // Set the assigned prop in sheet.fields if an attribute stored in sheet.attributes.values + // also references the field. This means that a saved attribute has claimed that field. + this.setFieldAssigned(); + } + + let nextLocation = this.getNextLocationField(); + + // This typically passes when a user manually sets an attribute and + // there are more location fields yet to be set + if(nextLocation) { + let field = nextLocation.field; + let universal = nextLocation.universal; + + this.attribute = this.createNewAttribute(); + this.attribute.label = field.label; + this.attribute.universal = universal.value; + + this.addField(field); + this.setUniversalOptions(field); + this.refreshUnassignedFields([]); + } + else { + this.refreshUnassignedFields([]); + this.attribute = null; + } + } + + /** + * Try to auto build the location field if there is only one field option per universal + * + * Rules: + * 1. Attempt to auto-assign context fields if there is ONLY one lowest level universal + * 2. Auto-assign a single context field only if there is a single option + * + */ + setLocationFieldAutoAssignment(): void { + + let lowestLevelUnassignedLocationFields = this.getLowestUnassignedLocationFields(); + let lowestLevelUnassignedUniversal: any = null; + + if(lowestLevelUnassignedLocationFields.length > 0){ + lowestLevelUnassignedUniversal = lowestLevelUnassignedLocationFields[0].universal.value; + } + + if(lowestLevelUnassignedLocationFields.length === 1){ + + for(let j = 0; j < lowestLevelUnassignedLocationFields.length; j++) { + let field = lowestLevelUnassignedLocationFields[j].field; + + // construct the initial model for a location field + this.attribute = this.createNewAttribute(); + this.attribute.label = field.label; + this.attribute.name = field.name; + this.attribute.universal = field.universal; + + // add the targetLocationField.field (remember, it's from the source data) + // to the new location field (i.e. attribute) + this.addField(field); + + // sets all valid universal options (excluding the current universal) for this location field + this.setUniversalOptions(field); + + // There is only one or no universal options (i.e. context locations) so just set the field + // to save a click for the user + if(this.universalOptions.length < 1){ + // calling newAttribute() is safe because there are no other location fields so the + // location attribute will just be set to null. + this.newAttribute(); + } + else{ + // Attempting auto-assignment of context fields + this.constructContextFieldsForAttribute(field); + } + } + } + // There are more than one lowest level un-assigned fields so lets not assume we can guess context fields. + else if(lowestLevelUnassignedLocationFields.length > 1){ + for(let j = 0; j < lowestLevelUnassignedLocationFields.length; j++) { + let field = lowestLevelUnassignedLocationFields[j].field; + + // construct the initial model for a location field + this.attribute = this.createNewAttribute(); + this.attribute.label = field.label; + this.attribute.name = field.name; + this.attribute.universal = field.universal; + + // add the targetLocationField.field (remember, it's from the source data) + // to the new location field (i.e. attribute) + this.addField(field); + + // sets all valid universal options (excluding the current universal) for this location field + this.setUniversalOptions(field); + + this.refreshUnassignedFields([field.name]); + + break; + } + } + else if (lowestLevelUnassignedLocationFields.length == 0){ + this.attribute = null; + } + } + + + /** + * Construct all possible context fields for a given target field. + * NOTE: there is an assumption that this will only be called for a lowest level univeral field + * + * @field - the target field to which context fields would be built from. This is typically a field + * in the lowest level universal of a sheet. + */ + constructContextFieldsForAttribute(field: Field) { + let unassignedLocationFieldsForTargetFieldUniversal = this.getUnassignedLocationFields(field.universal); + + if(this.universalOptions.length > 0 && unassignedLocationFieldsForTargetFieldUniversal.length === 1){ + let fieldsSetToUniversalOptions = new Array(); + + for(let i=this.universalOptions.length; i--;){ + let universalOption = this.universalOptions[i]; + let unassignedLocationFieldsForThisUniversal = this.getUnassignedLocationFields(universalOption.value); + + // Set the field ONLY if there is a single option per universal + if(unassignedLocationFieldsForThisUniversal.length === 1){ + this.addField(unassignedLocationFieldsForThisUniversal[0]); + + fieldsSetToUniversalOptions.push(unassignedLocationFieldsForThisUniversal[0].name); + } + } + + // set the location attribute only if all the universal options have been set automatically + // i.e. The # of universal options must match the # of fields set + if(fieldsSetToUniversalOptions.length === this.universalOptions.length){ + this.newAttribute(); + } + + this.refreshUnassignedFields(fieldsSetToUniversalOptions); + } + } + + addField(field: Field): void { + this.attribute.fields[field.universal] = field.label; + } + + /** + * Sets the valid universal options for a given field. + * + * Valid options are: + * 1. universals that are assigned by the user in the source data + * 2. universals with fields that are not yet assigned + */ + setUniversalOptions(field: Field): void { + this.universalOptions = []; + let valid = true; + + for(let i = 0; i < this.universals.length; i++) { + let universal = this.universals[i]; + let unassignedFieldsForThisUniversal = this.getUnassignedLocationFields(universal.value); + + if(universal.value == field.universal) { + valid = false; + } + else if(valid && unassignedFieldsForThisUniversal.length > 0) { + this.universalOptions.push(universal); + } + } + } + + + /** + * Sets all sheet.fields in a sheet to isAssigned = true if the field is assigned to a sheet attribute + * and is a location field. + * + */ + setFieldAssigned(): void { + for(let i = 0; i < this.sheet.fields.length; i++) { + let field = this.sheet.fields[i] + + if(field.type == 'LOCATION') { + field.assigned = this.isAssigned(field); + } + else { + field.assigned = false; + } + } + } + + + /** + * Check if a field is assigned to a sheet attribute + * + * @field - the field to check + * + * isAssigned = true if the sheet attribute fields has a field with a corresponding field label + */ + isAssigned(field: Field): boolean { + for(let i = 0; i < this.sheet.attributes.ids.length; i++) { + let id = this.sheet.attributes.ids[i]; + let attribute = this.sheet.attributes.values[id]; + + for (let key in attribute.fields) { + if (attribute.fields.hasOwnProperty(key)) { + if(attribute.fields[key] == field.label) { + return true; + } + } + } + } + + return false; + } + + change(selectedFields:{ [key:string]:string}): void{ + let selectedFieldsArr:any = []; + + for (let key in selectedFields) { + if (selectedFields.hasOwnProperty(key) && selectedFields[key] !== "EXCLUDE") { + selectedFieldsArr.push(selectedFields[key]); + } + } + + this.refreshUnassignedFields(selectedFieldsArr); + } + + + localValidate(value: string, config: string): {[key : string] : any} { + if(config == 'label') { + return this.validateLabel(value); + } + + return null; + } + + validateLabel(label: string): {[key : string] : any} { + if(this.sheet != null) { + let count = 0; + + for(let i = 0; i < this.sheet.fields.length; i++) { + let field = this.sheet.fields[i]; + + if(field.type != 'LOCATION' && field.label == label) { + count++; + } + } + + for(let i = 0; i < this.sheet.attributes.ids.length; i++) { + let id = this.sheet.attributes.ids[i]; + let attribute = this.sheet.attributes.values[id]; + + if(attribute.label === label && !attribute.editing) { + count++; + } + if(this.attribute && this.attribute.label === attribute.label && !attribute.editing){ + count++; + } + } + + if(count > 0) { + return {unique:false}; + } + } + + return null; + } +} diff --git a/geoprism-web/src/main/ng2/src/app/uploader/match-initial-page.component.html b/geoprism-web/src/main/ng2/src/app/uploader/match-initial-page.component.html new file mode 100644 index 000000000..a6382b9c0 --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/uploader/match-initial-page.component.html @@ -0,0 +1,40 @@ + \ No newline at end of file diff --git a/geoprism-web/src/main/ng2/src/app/uploader/match-initial-page.component.ts b/geoprism-web/src/main/ng2/src/app/uploader/match-initial-page.component.ts new file mode 100644 index 000000000..5bab91a30 --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/uploader/match-initial-page.component.ts @@ -0,0 +1,36 @@ +/// +/// Copyright (c) 2015 TerraFrame, Inc. All rights reserved. +/// +/// This file is part of Runway SDK(tm). +/// +/// Runway SDK(tm) is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Lesser General Public License as +/// published by the Free Software Foundation, either version 3 of the +/// License, or (at your option) any later version. +/// +/// Runway SDK(tm) is distributed in the hope that it will be useful, but +/// WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Lesser General Public License for more details. +/// +/// You should have received a copy of the GNU Lesser General Public +/// License along with Runway SDK(tm). If not, see . +/// + +import { Component, Output, EventEmitter } from '@angular/core'; + +@Component({ + + selector: 'match-initial-page', + templateUrl: './match-initial-page.component.html', + styleUrls: [] +}) +export class MatchInitialPageComponent { + @Output() public onNextPage = new EventEmitter(); + + constructor() { } + + next(targetPage: string, sourcePage: string) : void { + this.onNextPage.emit({targetPage:targetPage, sourcePage:sourcePage}); + } +} diff --git a/geoprism-web/src/main/ng2/src/app/uploader/match-page.component.html b/geoprism-web/src/main/ng2/src/app/uploader/match-page.component.html new file mode 100644 index 000000000..30b9e6efe --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/uploader/match-page.component.html @@ -0,0 +1,38 @@ + \ No newline at end of file diff --git a/geoprism-web/src/main/ng2/src/app/uploader/match-page.component.ts b/geoprism-web/src/main/ng2/src/app/uploader/match-page.component.ts new file mode 100644 index 000000000..9249aa05c --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/uploader/match-page.component.ts @@ -0,0 +1,51 @@ +/// +/// Copyright (c) 2015 TerraFrame, Inc. All rights reserved. +/// +/// This file is part of Runway SDK(tm). +/// +/// Runway SDK(tm) is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Lesser General Public License as +/// published by the Free Software Foundation, either version 3 of the +/// License, or (at your option) any later version. +/// +/// Runway SDK(tm) is distributed in the hope that it will be useful, but +/// WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Lesser General Public License for more details. +/// +/// You should have received a copy of the GNU Lesser General Public +/// License along with Runway SDK(tm). If not, see . +/// + +import { Component, Input, Output, EventEmitter } from '@angular/core'; + +import { UploadInformation, Step, Sheet, Page } from './uploader-model'; + +import { UploadService } from '../service/upload.service'; + + +@Component({ + + selector: 'match-page', + templateUrl: './match-page.component.html', + styleUrls: [] +}) +export class MatchPageComponent { + + @Input() sheet: Sheet; + @Output() onSelect = new EventEmitter(); + + constructor(private service: UploadService) { } + + select(match:any, overwrite:boolean) : void { + + this.service.getSavedConfiguration(match.id, this.sheet.name) + .then(response => { + let sheet = response.datasets; + sheet.replaceExisting = overwrite; + sheet.exists = true; + + this.onSelect.emit(sheet); + }); + } +} diff --git a/geoprism-web/src/main/ng2/src/app/uploader/name-page.component.html b/geoprism-web/src/main/ng2/src/app/uploader/name-page.component.html new file mode 100644 index 000000000..b175c3220 --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/uploader/name-page.component.html @@ -0,0 +1,57 @@ + \ No newline at end of file diff --git a/geoprism-web/src/main/ng2/src/app/uploader/name-page.component.ts b/geoprism-web/src/main/ng2/src/app/uploader/name-page.component.ts new file mode 100644 index 000000000..eb9cf413c --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/uploader/name-page.component.ts @@ -0,0 +1,49 @@ +/// +/// Copyright (c) 2015 TerraFrame, Inc. All rights reserved. +/// +/// This file is part of Runway SDK(tm). +/// +/// Runway SDK(tm) is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Lesser General Public License as +/// published by the Free Software Foundation, either version 3 of the +/// License, or (at your option) any later version. +/// +/// Runway SDK(tm) is distributed in the hope that it will be useful, but +/// WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Lesser General Public License for more details. +/// +/// You should have received a copy of the GNU Lesser General Public +/// License along with Runway SDK(tm). If not, see . +/// + +import { Component, Input} from '@angular/core'; + +import { Sheet, Options, Field, Page } from './uploader-model'; + +import { RemoteValidator } from '../core/async-validator.directive'; +import { DatasetService } from '../service/dataset.service'; + +@Component({ + + selector: 'name-page', + templateUrl: './name-page.component.html', + styleUrls: [] +}) +export class NamePageComponent implements RemoteValidator { + @Input() options: Options; + @Input() sheet: Sheet; + @Input() page: Page; + + constructor(private service: DatasetService) { } + + validate(value:string): Promise<{[key : string] : any}> { + return this.service.validateDatasetName(value, '') + .then((response:any) => { + return null; + }) + .catch((error:any) => { + return {uniqueName: false}; + }); + } +} diff --git a/geoprism-web/src/main/ng2/src/app/uploader/navigation.service.ts b/geoprism-web/src/main/ng2/src/app/uploader/navigation.service.ts new file mode 100644 index 000000000..c3dc7334a --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/uploader/navigation.service.ts @@ -0,0 +1,17 @@ +import { Injectable } from '@angular/core'; +import { Subject } from 'rxjs/Subject'; + +@Injectable() +export class NavigationService { + + // Observable string sources + private navigationSource = new Subject(); + + // Observable string streams + navigationAnnounced$ = this.navigationSource.asObservable(); + + // Service message commands + navigate(direction: string) { + this.navigationSource.next(direction); + } +} \ No newline at end of file diff --git a/geoprism-web/src/main/ng2/src/app/uploader/paging.component.html b/geoprism-web/src/main/ng2/src/app/uploader/paging.component.html new file mode 100644 index 000000000..33141b4db --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/uploader/paging.component.html @@ -0,0 +1,39 @@ +
+
+
+
+ + + + +
+
+
diff --git a/geoprism-web/src/main/ng2/src/app/uploader/paging.component.ts b/geoprism-web/src/main/ng2/src/app/uploader/paging.component.ts new file mode 100644 index 000000000..cff3be530 --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/uploader/paging.component.ts @@ -0,0 +1,54 @@ +/// +/// Copyright (c) 2015 TerraFrame, Inc. All rights reserved. +/// +/// This file is part of Runway SDK(tm). +/// +/// Runway SDK(tm) is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Lesser General Public License as +/// published by the Free Software Foundation, either version 3 of the +/// License, or (at your option) any later version. +/// +/// Runway SDK(tm) is distributed in the hope that it will be useful, but +/// WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Lesser General Public License for more details. +/// +/// You should have received a copy of the GNU Lesser General Public +/// License along with Runway SDK(tm). If not, see . +/// + +import { Component, Input, Output, EventEmitter} from '@angular/core'; +import { FormGroup} from '@angular/forms'; + +import { Page } from './uploader-model'; +import { NavigationService } from './navigation.service'; + +@Component({ + + selector: 'paging', + templateUrl: './paging.component.html', + styleUrls: [] +}) +export class PagingComponent { + @Input() form: FormGroup; + @Input() page: Page; + @Input() global: boolean = true; + + constructor(private service: NavigationService) { } + + next(): void { + this.service.navigate('next'); + } + + prev(): void { + this.service.navigate('prev'); + } + + cancel(): void { + this.service.navigate('cancel'); + } + + ready(): void { + this.service.navigate('ready'); + } +} diff --git a/geoprism-web/src/main/ng2/src/app/uploader/summary-page.component.html b/geoprism-web/src/main/ng2/src/app/uploader/summary-page.component.html new file mode 100644 index 000000000..c4c97e492 --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/uploader/summary-page.component.html @@ -0,0 +1,217 @@ + + diff --git a/geoprism-web/src/main/ng2/src/app/uploader/summary-page.component.ts b/geoprism-web/src/main/ng2/src/app/uploader/summary-page.component.ts new file mode 100644 index 000000000..d3aa6201a --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/uploader/summary-page.component.ts @@ -0,0 +1,148 @@ +/// +/// Copyright (c) 2015 TerraFrame, Inc. All rights reserved. +/// +/// This file is part of Runway SDK(tm). +/// +/// Runway SDK(tm) is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Lesser General Public License as +/// published by the Free Software Foundation, either version 3 of the +/// License, or (at your option) any later version. +/// +/// Runway SDK(tm) is distributed in the hope that it will be useful, but +/// WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Lesser General Public License for more details. +/// +/// You should have received a copy of the GNU Lesser General Public +/// License along with Runway SDK(tm). If not, see . +/// + +import { Component, OnInit, Input, Output, EventEmitter, Directive} from '@angular/core'; +import { Validator, AbstractControl, NG_VALIDATORS } from '@angular/forms'; + +import { UploadInformation, Sheet, Page, Field, Universal, CoordinateAttribute} from './uploader-model'; + +@Component({ + + selector: 'summary-page', + templateUrl: './summary-page.component.html', + styleUrls: [] +}) +export class SummaryPageComponent implements OnInit { + + @Input() sheet: Sheet; + @Input() page: Page; + @Input() info: UploadInformation; + + universals: Universal[]; + labels: {[key : string] : string}; + + texts: Field[]; + categories: Field[]; + numbers: Field[]; + booleans: Field[]; + dates: Field[]; + universalMap: {[key : string]: Universal[]}; + + constructor() { + this.texts = []; + this.categories = []; + this.numbers = []; + this.booleans = []; + this.dates = []; + this.universalMap = {}; + } + + ngOnInit(): void { + // Initialize the universal options + if(this.info.options != null) { + let countries = this.info.options.countries; + + for(let i = 0; i < countries.length; i++) { + let country = countries[i]; + + if(country.value == this.sheet.country) { + this.universals = country.options; + this.labels = {}; + + for(let j = 0; j < country.options.length; j++) { + let universal = country.options[j]; + + this.labels[universal.value] = universal.label; + } + } + } + } + + for(let i=0; i(); + + c.ids.forEach((id:string) => { + coordinates.push(c.values[id]); + }); + + this.sheet.coordinates = coordinates; + } + } + + hasFieldType(type: string): boolean { + let fields = this.sheet.fields; + + for(let i=0; i +
+
+ + + +
+ +
+
+ diff --git a/geoprism-web/src/main/ng2/src/app/uploader/upload-wizard.component.ts b/geoprism-web/src/main/ng2/src/app/uploader/upload-wizard.component.ts new file mode 100644 index 000000000..cacc19393 --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/uploader/upload-wizard.component.ts @@ -0,0 +1,555 @@ +/// +/// Copyright (c) 2015 TerraFrame, Inc. All rights reserved. +/// +/// This file is part of Runway SDK(tm). +/// +/// Runway SDK(tm) is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Lesser General Public License as +/// published by the Free Software Foundation, either version 3 of the +/// License, or (at your option) any later version. +/// +/// Runway SDK(tm) is distributed in the hope that it will be useful, but +/// WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Lesser General Public License for more details. +/// +/// You should have received a copy of the GNU Lesser General Public +/// License along with Runway SDK(tm). If not, see . +/// + +import { Component, EventEmitter, Output, OnDestroy } from '@angular/core'; + +import { Subscription } from 'rxjs/Subscription'; + +import * as _ from 'lodash'; + +import { Dataset } from '../model/dataset'; +import { UploadInformation, Step, Sheet, Snapshot, Page, Locations, Problems } from './uploader-model'; + +import { EventService } from '../service/core.service'; +import { LocalizationService } from '../service/localization.service'; + +import { UploadService } from '../service/upload.service'; +import { NavigationService } from './navigation.service'; + +@Component({ + + selector: 'upload-wizard', + templateUrl: './upload-wizard.component.html', + styleUrls: [] +}) +export class UploadWizardComponent implements OnDestroy { + + @Output() onSuccess = new EventEmitter(); + + steps : Step[]; + + info: UploadInformation; + sheet: Sheet; + page: Page; + problems: Problems; + + pageDirection: string; + currentStep: number; + subscription: Subscription; + + constructor( + private localizationService: LocalizationService, + private uploadService: UploadService, + private navigationService: NavigationService) { + + this.subscription = navigationService.navigationAnnounced$.subscribe( + direction => { + if(direction === 'next') { + this.next(null, null); + } + else if(direction === 'prev') { + this.prev(); + } + else if(direction === 'cancel') { + this.cancel(); + } + else if(direction === 'ready') { + this.persist(); + } + }); + } + + ngOnDestroy(): void { + this.subscription.unsubscribe(); + } + + initialize(info: string): void { + this.info = JSON.parse(info) as UploadInformation; + this.sheet = this.info.information.sheets[0]; + + if(this.sheet.attributes == null) { + this.sheet.attributes = new Locations(); + this.sheet.attributes.ids = []; + this.sheet.attributes.values = {}; + } + + if(this.sheet.coordinates == null) { + this.sheet.coordinates = []; + } + + if(this.info.information.locationExclusions == null){ + this.info.information.locationExclusions = []; + } + + if(this.sheet.matches.length > 0) { + this.page = new Page('MATCH-INITIAL', null); + } + else { + this.page = new Page('BEGINNING-INFO', null); + } + + this.initializeAttributes(); + + this.refreshSteps(); + } + + initializeAttributes(): void { + let fields = this.sheet.fields; + + let lats = [ + this.localizationService.localize("dataUploader", "attributeLatAbbreviation").toLowerCase(), + this.localizationService.localize("dataUploader", "attributeLatitudeName").toLowerCase() + ]; + + let longs = [ + this.localizationService.localize("dataUploader", "attributeLngAbbreviation").toLowerCase(), + this.localizationService.localize("dataUploader", "attributeLongAbbreviation").toLowerCase(), + this.localizationService.localize("dataUploader", "attributeLongitudeName").toLowerCase() + ]; + + for(let i=0; i(); + this.steps.push(new Step("1", "INITIAL")); + this.steps.push(new Step("2", "FIELDS")); + this.steps.push(new Step("3", "SUMMARY")); + + let locationStep = new Step("4", "LOCATION"); + let coordinateStep = new Step("5", "COORDINATE"); + let geoProblemResStep = new Step("6", "GEO-VALIDATION"); + let categoryProblemResStep = new Step("7", "CATEGORY-VALIDATION"); + + let hasLocationField = this.hasLocationField(); + let hasCoordinateField = this.hasCoordinateField(); + let hasCategoryField = this.hasCategoryField(); + + if(hasLocationField && hasCoordinateField && hasCategoryField){ + this.steps.splice(2, 0, locationStep, coordinateStep); + this.steps.splice(5, 0, geoProblemResStep); + this.steps.splice(6, 0, categoryProblemResStep); + } + else if(!hasLocationField && hasCoordinateField && hasCategoryField){ + this.steps.splice(2, 0, coordinateStep); + this.steps.splice(4, 0, geoProblemResStep); + this.steps.splice(5, 0, categoryProblemResStep); + } + else if(hasLocationField && !hasCoordinateField && hasCategoryField){ + this.steps.splice(2, 0, locationStep); + this.steps.splice(4, 0, geoProblemResStep); + this.steps.splice(5, 0, categoryProblemResStep); + } + else if(hasLocationField && hasCoordinateField && !hasCategoryField){ + this.steps.splice(2, 0, locationStep, coordinateStep); + this.steps.splice(5, 0, geoProblemResStep); + } + else if(hasLocationField){ + this.steps.splice(2, 0, locationStep); + this.steps.splice(4, 0, geoProblemResStep); + } + else if(hasCoordinateField){ + this.steps.splice(2, 0, coordinateStep); + this.steps.splice(4, 0, geoProblemResStep); + } + else if(hasCategoryField){ + this.steps.splice(3, 0, categoryProblemResStep); + } + } + + hasLocationField() : boolean { + for(let i = 0; i < this.sheet.fields.length; i++) { + let field = this.sheet.fields[i]; + + if(field.type == 'LOCATION') { + return true; + } + } + + return false; + } + + hasCoordinateField() : boolean { + for(let i = 0; i < this.sheet.fields.length; i++) { + let field = this.sheet.fields[i]; + + if(field.type == 'LONGITUDE' || field.type == 'LATITUDE' ) { + return true; + } + } + + return false; + } + + hasCategoryField() : boolean { + for(let i = 0; i < this.sheet.fields.length; i++) { + let field = this.sheet.fields[i]; + + if(field.type == 'CATEGORY') { + return true; + } + } + + return false; + } + + incrementStep(targetPage: string): void { + if(targetPage === 'MATCH-INITIAL') { + this.currentStep = -1; + } + else if(targetPage == 'MATCH') { + this.currentStep = -1; + } + else if(targetPage == 'BEGINNING-INFO') { + this.currentStep = -1; + } + else if(targetPage == 'INITIAL') { + this.currentStep = 1; + } + else if(targetPage === 'FIELDS') { + this.currentStep = 2; + } + else if(targetPage === 'LOCATION') { + this.currentStep = 3; + } + else if(targetPage === 'COORDINATE') { + if(this.hasLocationField()) { + this.currentStep = 4; + } + else{ + this.currentStep = 3; + } + } + else if(targetPage === 'GEO-VALIDATION') { + if(this.hasLocationField() && this.hasCoordinateField()) { + this.currentStep = 5; + } + else if (this.hasLocationField()){ + this.currentStep = 4; + } + else if (this.hasCoordinateField()) { + this.currentStep = 4; + } + else { + this.currentStep = 3; + } + } + } + + + /** + * @param targetPage + * @param sourcePage + */ + next(targetPage: string, sourcePage: string) :void { + this.pageDirection = "NEXT"; + + if(targetPage && sourcePage){ + this.page.name = targetPage + + this.page.snapshot = _.cloneDeep(this.sheet) as Sheet; + + let page = new Page(targetPage, this.page); + page.hasNext = this.hasNextPage(targetPage); + page.isReady = this.isReady(targetPage); + + this.page = page; + } + else{ + this.page.snapshot = _.cloneDeep(this.sheet) as Sheet; + + // Linear logic + if(this.page.name == 'MATCH-INITIAL') { + let page = new Page('MATCH', this.page); + page.hasNext = this.hasNextPage('MATCH'); + page.isReady = this.isReady('MATCH'); + + this.page = page; + } + else if(this.page.name == 'MATCH') { + let page = new Page('BEGINNING-INFO', this.page); + page.hasNext = this.hasNextPage('BEGINNING-INFO'); + page.isReady = this.isReady('BEGINNING-INFO'); + + this.page = page; + } + else if(this.page.name == 'BEGINNING-INFO') { + let page = new Page('INITIAL', this.page); + page.hasNext = this.hasNextPage('INITIAL'); + page.isReady = this.isReady('INITIAL'); + page.confirm = true; + + this.page = page; + + this.incrementStep(this.page.name); + } + else if(this.page.name === 'INITIAL') { + let page = new Page('FIELDS', this.page); + page.hasNext = this.hasNextPage('FIELDS'); + page.isReady = this.isReady('FIELDS'); + page.layout = 'wide-holder'; + page.confirm = true; + + this.page = page; + } + else if(this.page.name === 'FIELDS') { + if(this.hasLocationField()) { + // Go to location attribute page + let page = new Page('LOCATION', this.page); + page.hasNext = this.hasNextPage('LOCATION'); + page.isReady = this.isReady('LOCATION'); + page.confirm = true; + + this.page = page; + } + else if (this.hasCoordinateField()) { + // Go to location attribute page + let page = new Page('COORDINATE', this.page); + page.hasNext = this.hasNextPage('COORDINATE'); + page.isReady = this.isReady('COORDINATE'); + page.confirm = true; + + this.page = page; + } + else { + // Go to summary page + let page = new Page('SUMMARY', this.page); + page.hasNext = this.hasNextPage('SUMMARY'); + page.isReady = this.isReady('SUMMARY'); + + this.page = page; + } + + this.incrementStep(this.page.name); + } + else if(this.page.name === 'LOCATION') { + if (this.hasCoordinateField()) { + // Go to coordinate page + let page = new Page('COORDINATE', this.page); + page.hasNext = this.hasNextPage('COORDINATE'); + page.isReady = this.isReady('COORDINATE'); + page.confirm = true; + + this.page = page; + } + else { + // Go to summary page + let page = new Page('SUMMARY', this.page); + page.hasNext = this.hasNextPage('SUMMARY'); + page.isReady = this.isReady('SUMMARY'); + + this.page = page; + } + } + else if(this.page.name === 'COORDINATE') { + // Go to summary page + let page = new Page('SUMMARY', this.page); + page.hasNext = this.hasNextPage('SUMMARY'); + page.isReady = this.isReady('SUMMARY'); + + this.page = page; + + this.incrementStep(this.page.name); + } + else if(this.page.name === 'GEO-VALIDATION') { + // Go to summary page + let page = new Page('CATEGORY-VALIDATION', this.page); + page.hasNext = this.hasNextPage('CATEGORY-VALIDATION'); + page.isReady = this.isReady('CATEGORY-VALIDATION'); + page.layout = 'wide-holder'; + + this.page = page; + + this.incrementStep(this.page.name); + } + } + } + + prev(): void { + this.pageDirection = "PREVIOUS"; + + if(this.page.prev != null) { + this.page = this.page.prev; + this.sheet = this.page.snapshot; + this.page.snapshot = null; + } + + if(this.page.name === "SUMMARY" || this.page.name === 'CATEGORY-VALIDATION'){ + let stepCt = 4; + + if (!this.hasCoordinateField()) { + stepCt = stepCt - 1; + } + + if(!this.hasLocationField()) { + stepCt = stepCt - 1; + } + + if(this.page.name === 'CATEGORY-VALIDATION') { + stepCt = stepCt - 1; + } + + this.currentStep = stepCt; + } + else if(this.page.name === "COORDINATE"){ + let stepCt = 3; + if(!this.hasLocationField()) { + stepCt = stepCt - 1; + } + + this.currentStep = stepCt; + } + else if(this.page.name === "LOCATION"){ + this.currentStep = 2; + } + else if(this.page.name === "FIELDS"){ + this.currentStep = 1; + } + else if(this.page.name === "INITIAL"){ + this.currentStep = 0; + } + } + + onSubmit(): void { + this.onSuccess.emit(); + this.clear(); + } + + cancel(): void { + this.uploadService.cancelImport(this.info.information) + .then(response => { + this.clear(); + }); + } + + clear(): void { + this.steps = null; + this.info = null; + this.sheet = null; + this.page = null; + + this.pageDirection = null; + this.currentStep = null; + } + + + persist(): void { + this.info.information.sheets[0] = _.cloneDeep(this.sheet) as Sheet; + + this.uploadService.importData(this.info.information) + .then(result => { + if(result.success) { + this.clear(); + + this.onSuccess.emit({datasets:result.datasets, finished : true}); + } + else { + + if(this.hasLocationField() && this.hasCoordinateField()) { + this.currentStep = 5; + } + else if(this.hasLocationField() || this.hasCoordinateField()) { + this.currentStep = 4; + } + else{ + this.currentStep = 3; + } + + this.problems = result.problems; + this.info.information.sheets = result.sheets; + this.sheet = result.sheets[0]; + + if( !result.problems.locations || result.problems.locations.length > 0) { + + let page = new Page('GEO-VALIDATION', null); + page.hasNext = this.hasNextPage('GEO-VALIDATION'); + page.isReady = this.isReady('GEO-VALIDATION'); + page.layout = 'wide-holder'; + + this.page = page; + } + else { + let page = new Page('CATEGORY-VALIDATION', null); + page.hasNext = false; + page.isReady = true; + page.layout = 'wide-holder'; + + this.page = page; + } + + this.onSuccess.emit({datasets:result.datasets, finished : false}); + } + }); + + } + + isReady(name: string) : boolean { + return (name === 'SUMMARY' || name === 'CATEGORY-VALIDATION' || (name === 'GEO-VALIDATION' && this.problems.categories !== null && this.problems.categories.length === 0)); + } + + hasNextPage(name: string): boolean { + if(name == 'GEO-VALIDATION') { + return (this.problems.categories !== null && this.problems.categories.length > 0); + } + + return (name !== 'MATCH-INITIAL' && name !== 'SUMMARY' && name !== 'MATCH' && name !== 'CATEGORY-VALIDATION'); + } + + onNextPage(data: any) : void { + this.next(data.targetPage, data.sourcePage); + } + + onSelectSheet(sheet: Sheet): void { + + this.page.snapshot = _.cloneDeep(this.sheet) as Sheet; + + // Go to summary page + let page = new Page('SUMMARY', this.page); + page.hasNext = this.hasNextPage('SUMMARY'); + page.isReady = this.isReady('SUMMARY'); + + this.page = page; + this.sheet = sheet; + } + + showStep(): boolean { + + let names = ['MATCH-INITIAL', 'MATCH']; + + return this.page && (names.indexOf(this.page.name) === -1) && !this.sheet.exists; + } +} diff --git a/geoprism-web/src/main/ng2/src/app/uploader/uploader-model.ts b/geoprism-web/src/main/ng2/src/app/uploader/uploader-model.ts new file mode 100644 index 000000000..67c2ede0f --- /dev/null +++ b/geoprism-web/src/main/ng2/src/app/uploader/uploader-model.ts @@ -0,0 +1,210 @@ +/// +/// Copyright (c) 2015 TerraFrame, Inc. All rights reserved. +/// +/// This file is part of Runway SDK(tm). +/// +/// Runway SDK(tm) is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Lesser General Public License as +/// published by the Free Software Foundation, either version 3 of the +/// License, or (at your option) any later version. +/// +/// Runway SDK(tm) is distributed in the hope that it will be useful, but +/// WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Lesser General Public License for more details. +/// +/// You should have received a copy of the GNU Lesser General Public +/// License along with Runway SDK(tm). If not, see . +/// + +import { Dataset } from '../model/dataset'; +import { Pair } from '../model/pair'; + +export class Universal { + value: string; + label: string; +} + +export class Country { + options : Universal[]; + value: string; + label: string; +} + +export class Options { + countries : Country[]; +} + +export class Classifier { + value: string; + label: string; +} + +export class Field { + columnType: string; + fieldPosition: number; + name: string; + aggregatable: boolean; + accepted: boolean; + label: string; + type: string; + + // Properties for category fields + categoryLabel: string; + root: string; + + // Properties for location fields + universal: string; + assigned: boolean; +} + +export class LocationAttribute { + label: string; + name: string; + universal: string; + fields: { [key:string]:string}; + id: string; + editing: boolean; +} + +export class Locations { + ids: string[]; + values: { [key:string]:LocationAttribute}; +} + +export class CoordinateAttribute { + label : string; + latitude : string; + longitude : string; + featureLabel : string; + location : string; + featureId : string; + id : string; + universal: string; +} + +export class Coordinates { + ids: string[]; + values: { [key:string]:CoordinateAttribute}; +} + +export class Sheet { + value: string; + label: string; + name: string; + description: string; + source: string; + country: string; + replaceExisting: boolean; + exists: boolean; + + fields : Field[]; + attributes: Locations; + coordinates: CoordinateAttribute[]; + categories: any; + matches: any[]; +} + +export class LocationExclusion { + constructor(public id: string, public universal: string, public locationLabel: string, public parentId: string) {} +} + +export class Workbook { + filename: string; + directory: string; + sheets: Sheet[]; + locationExclusions: LocationExclusion[]; + categoryExclusion: { [key:string]:string[]}; +} + +export class UploadInformation { + options: Options; + classifiers: Classifier[]; + information: Workbook; +} + +export class Step { + constructor(public label: string, public page: string) {} +} + +export class Snapshot { + + constructor(public page: string, public sheet: Sheet) {} +} + +export class Page { + snapshot: Sheet; + + hasNext: boolean; + isReady: boolean; + confirm: boolean; + layout: string; + + constructor(public name: string, public prev: Page) { + this.layout = 'holder'; + this.hasNext = true; + this.isReady = false; + this.confirm = false; + } +} + +export class LocationContext { + label: string; + universal: string; +} + +export class LocationProblem { + type: string; + label: string; + parentId: string; + universalId: string; + universalLabel: string; + context: LocationContext[]; + resolved: boolean; + synonym: string; + action: any; +} + +export class CategoryProblem { + label: string; + mdAttributeId: string; + categoryId: string; + optionId: string; + resolved: boolean; + synonym: string; + action: any; +} + +export class Problems { + locations : LocationProblem[]; + categories : CategoryProblem[]; + options: { [key:string]:Pair[]}; +} + +export class DatasetResponse { + success: boolean; + datasets: Dataset[]; + sheets: Sheet[]; + problems: Problems; +} + +export class Label { + label: string; +} + +export class GeoSynonym { + synonymId: string; + label: string; + ancestors: Label[]; +} + +export class ClassifierSynonym { + synonymId: string; + label: string; +} + +export class Entity { + entityId: string; +} + + diff --git a/geoprism-web/src/main/ng2/src/main.ts b/geoprism-web/src/main/ng2/src/main.ts new file mode 100644 index 000000000..c1df9cd1f --- /dev/null +++ b/geoprism-web/src/main/ng2/src/main.ts @@ -0,0 +1,31 @@ +/// +/// Copyright (c) 2015 TerraFrame, Inc. All rights reserved. +/// +/// This file is part of Runway SDK(tm). +/// +/// Runway SDK(tm) is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Lesser General Public License as +/// published by the Free Software Foundation, either version 3 of the +/// License, or (at your option) any later version. +/// +/// Runway SDK(tm) is distributed in the hope that it will be useful, but +/// WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Lesser General Public License for more details. +/// +/// You should have received a copy of the GNU Lesser General Public +/// License along with Runway SDK(tm). If not, see . +/// + +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; +import { enableProdMode } from '@angular/core'; +import { AppModule } from './app/app.module'; + +if (process.env.ENV === 'production') { + enableProdMode(); +} + +platformBrowserDynamic().bootstrapModule(AppModule) + .then(success => console.log('Bootstrap success')) + .catch(error => console.log(error)); + diff --git a/geoprism-web/src/main/ng2/src/polyfills.ts b/geoprism-web/src/main/ng2/src/polyfills.ts new file mode 100644 index 000000000..90f7b890a --- /dev/null +++ b/geoprism-web/src/main/ng2/src/polyfills.ts @@ -0,0 +1,11 @@ +import 'core-js/es6'; +import 'core-js/es7/reflect'; +require('zone.js/dist/zone'); + +if (process.env.ENV === 'production') { + // Production +} else { + // Development and test + Error['stackTraceLimit'] = Infinity; + require('zone.js/dist/long-stack-trace-zone'); +} \ No newline at end of file diff --git a/geoprism-web/src/main/ng2/src/vendor.ts b/geoprism-web/src/main/ng2/src/vendor.ts new file mode 100644 index 000000000..065811af1 --- /dev/null +++ b/geoprism-web/src/main/ng2/src/vendor.ts @@ -0,0 +1,17 @@ +// Angular +import '@angular/platform-browser'; +import '@angular/platform-browser-dynamic'; +import '@angular/core'; +import '@angular/common'; +import '@angular/http'; +import '@angular/router'; +import '@angular/forms'; +// RxJS +import 'rxjs'; + + +// Other vendors for example jQuery, Lodash or Bootstrap +// You can import js, ts, css, sass, ... + +import 'ng2-file-upload/ng2-file-upload'; +import 'ng2-bootstrap' \ No newline at end of file diff --git a/geoprism-web/src/main/ng2/test/global.js b/geoprism-web/src/main/ng2/test/global.js new file mode 100644 index 000000000..698e43c20 --- /dev/null +++ b/geoprism-web/src/main/ng2/test/global.js @@ -0,0 +1 @@ +window.acp = 'https://localhost:8443/dev'; \ No newline at end of file diff --git a/geoprism-web/src/main/ng2/tsconfig.json b/geoprism-web/src/main/ng2/tsconfig.json new file mode 100644 index 000000000..ae3d76fdd --- /dev/null +++ b/geoprism-web/src/main/ng2/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "target": "es5", + "module": "commonjs", + "moduleResolution": "node", + "sourceMap": true, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "lib": ["es2015", "dom"], + "noImplicitAny": true, + "suppressImplicitAnyIndexErrors": true + }, + "exclude": [ + "node_modules/*", + "aot/*", + "app/*-aot.ts" + ] +} \ No newline at end of file diff --git a/geoprism-web/src/main/ng2/tslint.json b/geoprism-web/src/main/ng2/tslint.json new file mode 100644 index 000000000..995b96deb --- /dev/null +++ b/geoprism-web/src/main/ng2/tslint.json @@ -0,0 +1,94 @@ +{ + "rules": { + "class-name": true, + "comment-format": [ + true, + "check-space" + ], + "curly": true, + "eofline": true, + "forin": true, + "indent": [ + true, + "spaces" + ], + "label-position": true, + "label-undefined": true, + "max-line-length": [ + true, + 140 + ], + "member-access": false, + "member-ordering": [ + true, + "public-before-private", + "static-before-instance", + "variables-before-functions" + ], + "no-arg": true, + "no-bitwise": true, + "no-console": [ + true, + "debug", + "info", + "time", + "timeEnd", + "trace" + ], + "no-construct": true, + "no-debugger": true, + "no-duplicate-key": true, + "no-duplicate-variable": true, + "no-empty": true, + "no-eval": true, + "no-inferrable-types": true, + "no-shadowed-variable": true, + "no-string-literal": false, + "no-switch-case-fall-through": true, + "no-trailing-whitespace": true, + "no-unused-expression": true, + "no-unused-variable": true, + "no-unreachable": true, + "no-use-before-declare": true, + "no-var-keyword": true, + "object-literal-sort-keys": false, + "one-line": [ + true, + "check-open-brace", + "check-catch", + "check-else", + "check-whitespace" + ], + "radix": true, + "quotemark": [ + true, + "single" + ], + "semicolon": [ + "always" + ], + "triple-equals": [ + true, + "allow-null-check" + ], + "typedef-whitespace": [ + true, + { + "call-signature": "nospace", + "index-signature": "nospace", + "parameter": "nospace", + "property-declaration": "nospace", + "variable-declaration": "nospace" + } + ], + "variable-name": false, + "whitespace": [ + true, + "check-branch", + "check-decl", + "check-operator", + "check-separator", + "check-type" + ] + } +} diff --git a/geoprism-web/src/main/ng2/webpack.config.js b/geoprism-web/src/main/ng2/webpack.config.js new file mode 100644 index 000000000..0715c306b --- /dev/null +++ b/geoprism-web/src/main/ng2/webpack.config.js @@ -0,0 +1 @@ +module.exports = require('./config/webpack.dev.js'); \ No newline at end of file diff --git a/geoprism-web/src/main/scripts/ant/build.xml b/geoprism-web/src/main/scripts/ant/build.xml index bf435e5c6..8166f542c 100755 --- a/geoprism-web/src/main/scripts/ant/build.xml +++ b/geoprism-web/src/main/scripts/ant/build.xml @@ -33,7 +33,9 @@ - + + + diff --git a/geoprism-web/src/main/webapp/.gitignore b/geoprism-web/src/main/webapp/.gitignore new file mode 100644 index 000000000..213240951 --- /dev/null +++ b/geoprism-web/src/main/webapp/.gitignore @@ -0,0 +1,4 @@ +/node_modules/ +/typings/ +/app/**/*.js +/app/**/*.js.map \ No newline at end of file diff --git a/geoprism-web/src/main/webapp/3rd-party/angular/angular-sanitize.min.js b/geoprism-web/src/main/webapp/3rd-party/angular/angular-sanitize.min.js new file mode 100644 index 000000000..f6b349e9d --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/angular/angular-sanitize.min.js @@ -0,0 +1,16 @@ +/* + AngularJS v1.4.7 + (c) 2010-2015 Google, Inc. http://angularjs.org + License: MIT +*/ +(function(n,h,p){'use strict';function E(a){var f=[];r(f,h.noop).chars(a);return f.join("")}function g(a,f){var d={},c=a.split(","),b;for(b=0;b=c;d--)f.end&&f.end(e[d]);e.length=c}}"string"!==typeof a&&(a=null===a||"undefined"===typeof a?"":""+a);var b,k,e=[],m=a,l;for(e.last=function(){return e[e.length-1]};a;){l="";k=!0;if(e.last()&&w[e.last()])a=a.replace(new RegExp("([\\W\\w]*)<\\s*\\/\\s*"+e.last()+"[^>]*>","i"),function(a,b){b=b.replace(H,"$1").replace(I,"$1");f.chars&&f.chars(q(b));return""}),c("",e.last());else{if(0===a.indexOf("\x3c!--"))b=a.indexOf("--",4),0<=b&&a.lastIndexOf("--\x3e", +b)===b&&(f.comment&&f.comment(a.substring(4,b)),a=a.substring(b+3),k=!1);else if(x.test(a)){if(b=a.match(x))a=a.replace(b[0],""),k=!1}else if(J.test(a)){if(b=a.match(y))a=a.substring(b[0].length),b[0].replace(y,c),k=!1}else K.test(a)&&((b=a.match(z))?(b[4]&&(a=a.substring(b[0].length),b[0].replace(z,d)),k=!1):(l+="<",a=a.substring(1)));k&&(b=a.indexOf("<"),l+=0>b?a:a.substring(0,b),a=0>b?"":a.substring(b),f.chars&&f.chars(q(l)))}if(a==m)throw L("badparse",a);m=a}c()}function q(a){if(!a)return"";A.innerHTML= +a.replace(//g,">")}function r(a,f){var d=!1,c=h.bind(a,a.push);return{start:function(a,k,e){a=h.lowercase(a);!d&&w[a]&&(d=a);d||!0!==C[a]||(c("<"),c(a),h.forEach(k,function(d,e){var k=h.lowercase(e),g="img"===a&&"src"===k|| +"background"===k;!0!==O[k]||!0===D[k]&&!f(d,g)||(c(" "),c(e),c('="'),c(B(d)),c('"'))}),c(e?"/>":">"))},end:function(a){a=h.lowercase(a);d||!0!==C[a]||(c(""));a==d&&(d=!1)},chars:function(a){d||c(B(a))}}}var L=h.$$minErr("$sanitize"),z=/^<((?:[a-zA-Z])[\w:-]*)((?:\s+[\w:-]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)\s*(>?)/,y=/^<\/\s*([\w:-]+)[^>]*>/,G=/([\w:-]+)(?:\s*=\s*(?:(?:"((?:[^"])*)")|(?:'((?:[^'])*)')|([^>\s]+)))?/g,K=/^]*?)>/i, +I=/"\u201d\u2019]/i,d=/^mailto:/i;return function(c,b){function k(a){a&&g.push(E(a))}function e(a, +c){g.push("');k(c);g.push("")}if(!c)return c;for(var m,l=c,g=[],n,p;m=l.match(f);)n=m[0],m[2]||m[4]||(n=(m[3]?"http://":"mailto:")+n),p=m.index,k(l.substr(0,p)),e(n,m[0].replace(d,"")),l=l.substring(p+m[0].length);k(l);return a(g.join(""))}}])})(window,window.angular); +//# sourceMappingURL=angular-sanitize.min.js.map diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapbox-gl-draw/v0.16.0/mapbox-gl-draw.css b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapbox-gl-draw/v0.16.0/mapbox-gl-draw.css new file mode 100644 index 000000000..117edb825 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapbox-gl-draw/v0.16.0/mapbox-gl-draw.css @@ -0,0 +1,95 @@ + +/* Override default control style */ +.mapbox-gl-draw_ctrl-bottom-left, +.mapbox-gl-draw_ctrl-top-left { + margin-left:0; + border-radius:0 4px 4px 0; +} +.mapbox-gl-draw_ctrl-top-right, +.mapbox-gl-draw_ctrl-bottom-right { + margin-right:0; + border-radius:4px 0 0 4px; +} +.mapbox-gl-draw_ctrl-draw { + background-color:rgba(0,0,0,0.75); + border-color:rgba(0,0,0,0.9); +} +.mapbox-gl-draw_ctrl-draw > button { + border-color:rgba(0,0,0,0.9); + color:rgba(255,255,255,0.5); + width:30px; + height:30px; +} +.mapbox-gl-draw_ctrl-draw > button:hover { + background-color:rgba(0,0,0,0.85); + color:rgba(255,255,255,0.75); +} +.mapbox-gl-draw_ctrl-draw > button.active, +.mapbox-gl-draw_ctrl-draw > button.active:hover { + background-color:rgba(0,0,0,0.95); + color:#fff; +} +.mapbox-gl-draw_ctrl-draw-btn { + background-repeat: no-repeat; + background-position: center; +} +.mapbox-gl-draw_point { + background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+PHN2ZyAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIgICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiICAgd2lkdGg9IjIwIiAgIGhlaWdodD0iMjAiICAgdmlld0JveD0iMCAwIDIwIDIwIiAgIGlkPSJzdmcxOTE2NyIgICB2ZXJzaW9uPSIxLjEiICAgaW5rc2NhcGU6dmVyc2lvbj0iMC45MStkZXZlbCtvc3htZW51IHIxMjkxMSIgICBzb2RpcG9kaTpkb2NuYW1lPSJtYXJrZXIuc3ZnIj4gIDxkZWZzICAgICBpZD0iZGVmczE5MTY5IiAvPiAgPHNvZGlwb2RpOm5hbWVkdmlldyAgICAgaWQ9ImJhc2UiICAgICBwYWdlY29sb3I9IiNmZmZmZmYiICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIgICAgIGJvcmRlcm9wYWNpdHk9IjEuMCIgICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwLjAiICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIiAgICAgaW5rc2NhcGU6em9vbT0iMTYiICAgICBpbmtzY2FwZTpjeD0iMTQuMTY0MjUzIiAgICAgaW5rc2NhcGU6Y3k9IjguODg1NzIiICAgICBpbmtzY2FwZTpkb2N1bWVudC11bml0cz0icHgiICAgICBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJsYXllcjEiICAgICBzaG93Z3JpZD0iZmFsc2UiICAgICB1bml0cz0icHgiICAgICBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjEyODAiICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSI3NTEiICAgICBpbmtzY2FwZTp3aW5kb3cteD0iMjA4IiAgICAgaW5rc2NhcGU6d2luZG93LXk9IjE5MCIgICAgIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9IjAiICAgICBpbmtzY2FwZTpvYmplY3Qtbm9kZXM9InRydWUiPiAgICA8aW5rc2NhcGU6Z3JpZCAgICAgICB0eXBlPSJ4eWdyaWQiICAgICAgIGlkPSJncmlkMTk3MTUiIC8+ICA8L3NvZGlwb2RpOm5hbWVkdmlldz4gIDxtZXRhZGF0YSAgICAgaWQ9Im1ldGFkYXRhMTkxNzIiPiAgICA8cmRmOlJERj4gICAgICA8Y2M6V29yayAgICAgICAgIHJkZjphYm91dD0iIj4gICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PiAgICAgICAgPGRjOnR5cGUgICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+ICAgICAgICA8ZGM6dGl0bGUgLz4gICAgICA8L2NjOldvcms+ICAgIDwvcmRmOlJERj4gIDwvbWV0YWRhdGE+ICA8ZyAgICAgaW5rc2NhcGU6bGFiZWw9IkxheWVyIDEiICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIiAgICAgaWQ9ImxheWVyMSIgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTEwMzIuMzYyMikiPiAgICA8cGF0aCAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtjbGlwLXJ1bGU6bm9uemVybztkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO3Zpc2liaWxpdHk6dmlzaWJsZTtvcGFjaXR5OjE7aXNvbGF0aW9uOmF1dG87bWl4LWJsZW5kLW1vZGU6bm9ybWFsO2NvbG9yLWludGVycG9sYXRpb246c1JHQjtjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM6bGluZWFyUkdCO3NvbGlkLWNvbG9yOiMwMDAwMDA7c29saWQtb3BhY2l0eToxO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO2NvbG9yLXJlbmRlcmluZzphdXRvO2ltYWdlLXJlbmRlcmluZzphdXRvO3NoYXBlLXJlbmRlcmluZzphdXRvO3RleHQtcmVuZGVyaW5nOmF1dG87ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIgICAgICAgZD0ibSAzNiwxMDQwLjM2MjIgYyA2ZS02LDMuMzA5MyAtNS45ODg2MTIsMTAgLTUuOTg4NjEyLDEwIDAsMCAtNS45OTg3NzYsLTYuNjY4IC02LjAxMTM0NSwtOS45NzcyIC0wLjAxMjU3LC0zLjMwOTIgMi42NTY1NzYsLTYuMDAzOSA1Ljk2NTc5MiwtNi4wMjI3IDMuMzA5MTg5LC0wLjAxOSA2LjAwODg0LDIuNjQ1MiA2LjAzMzk5Miw1Ljk1NDMiICAgICAgIGlkPSJwYXRoMTI1NjEiICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2Nzc2MiIC8+ICAgIDxwYXRoICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2NsaXAtcnVsZTpub256ZXJvO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7dmlzaWJpbGl0eTp2aXNpYmxlO29wYWNpdHk6MTtpc29sYXRpb246YXV0bzttaXgtYmxlbmQtbW9kZTpub3JtYWw7Y29sb3ItaW50ZXJwb2xhdGlvbjpzUkdCO2NvbG9yLWludGVycG9sYXRpb24tZmlsdGVyczpsaW5lYXJSR0I7c29saWQtY29sb3I6IzAwMDAwMDtzb2xpZC1vcGFjaXR5OjE7ZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7bWFya2VyOm5vbmU7Y29sb3ItcmVuZGVyaW5nOmF1dG87aW1hZ2UtcmVuZGVyaW5nOmF1dG87c2hhcGUtcmVuZGVyaW5nOmF1dG87dGV4dC1yZW5kZXJpbmc6YXV0bztlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAgICAgICBkPSJtIDM0LjAwMDExNSwxMDQwLjM2MjIgYyAtNWUtNiwyLjIwNjIgLTMuOTkyNTIzLDcuMDAwMSAtMy45OTI1MjMsNy4wMDAxIDAsMCAtMy45OTkyOTEsLTQuNzc4NyAtNC4wMDc2NzksLTYuOTg0OSAtMC4wMDg0LC0yLjIwNjIgMS43NzEwODIsLTQuMDAyNyAzLjk3NzMxLC00LjAxNTMgMi4yMDYyMSwtMC4wMTMgNC4wMDYwMzcsMS43NjM1IDQuMDIyNzc3LDMuOTY5NyIgICAgICAgaWQ9InBhdGgxMjU2MyIgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIgICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2NzYyIgLz4gICAgPHBhdGggICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7Y2xpcC1ydWxlOm5vbnplcm87ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTt2aXNpYmlsaXR5OnZpc2libGU7b3BhY2l0eToxO2lzb2xhdGlvbjphdXRvO21peC1ibGVuZC1tb2RlOm5vcm1hbDtjb2xvci1pbnRlcnBvbGF0aW9uOnNSR0I7Y29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzOmxpbmVhclJHQjtzb2xpZC1jb2xvcjojMDAwMDAwO3NvbGlkLW9wYWNpdHk6MTtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1kYXNob2Zmc2V0OjA7c3Ryb2tlLW9wYWNpdHk6MTttYXJrZXI6bm9uZTtjb2xvci1yZW5kZXJpbmc6YXV0bztpbWFnZS1yZW5kZXJpbmc6YXV0bztzaGFwZS1yZW5kZXJpbmc6YXV0bzt0ZXh0LXJlbmRlcmluZzphdXRvO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiICAgICAgIGQ9Ik0gOS45NjY3OTY5LDEwMTQuMzYyMiBDIDYuNjU3NTgwOSwxMDE0LjM4MSAzLjk4NzQzLDEwMTcuMDc2NCA0LDEwMjAuMzg1NiBjIDAuMDEyNTY5LDMuMzA5MiA2LjAxMTcxOSw4Ljk3NjYgNi4wMTE3MTksOC45NzY2IDAsMCA1Ljk4ODI4NywtNS42OTA3IDUuOTg4MjgxLC05IGwgMCwtMC4wNDUgYyAtMC4wMjUxNSwtMy4zMDkxIC0yLjcyNDAxNCwtNS45NzQxIC02LjAzMzIwMzEsLTUuOTU1MSB6IG0gMC4wMDk3NywyIGMgMi4yMDYyMDYxLC0wLjAxMyA0LjAwNjY5MzEsMS43NjI2IDQuMDIzNDMzMSwzLjk2ODggbCAwLDAuMDMxIGMgLTVlLTYsMi4yMDYyIC0zLjk5MjE4OCw2IC0zLjk5MjE4OCw2IDAsMCAtMy45OTk0MjQsLTMuNzc4MiAtNC4wMDc4MTIsLTUuOTg0NCAtMC4wMDg0LC0yLjIwNjIgMS43NzAzMzQ1LC00LjAwMyAzLjk3NjU2MjUsLTQuMDE1NiB6IiAgICAgICBpZD0icGF0aDEyNTY4IiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNzY3NjY2Njc2NzYyIgLz4gICAgPHBhdGggICAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46YmV2ZWw7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lIiAgICAgICBkPSJNIDEwIDIgQyA2LjY4NjI5MiAyIDQgNC42ODYzIDQgOCBDIDQgMTEuMzEzNyAxMCAxNyAxMCAxNyBDIDEwIDE3IDE2IDExLjMxMzcgMTYgOCBDIDE2IDQuNjg2MyAxMy4zMTM3MDggMiAxMCAyIHogTSAxMCA0IEMgMTIuMDcxMDY4IDQgMTMuNzUgNS42Nzg5IDEzLjc1IDcuNzUgQyAxMy43NSA5LjIwNTMyNzggMTEuOTMxMTEgMTEuNjQ0MzkzIDEwLjgzMDA3OCAxMyBMIDkuMTY5OTIxOSAxMyBDIDguMDY4ODkwMyAxMS42NDQzOTMgNi4yNSA5LjIwNTMyNzggNi4yNSA3Ljc1IEMgNi4yNSA1LjY3ODkgNy45Mjg5MzIgNCAxMCA0IHogIiAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDEwMzIuMzYyMikiICAgICAgIGlkPSJwYXRoMTczMDUiIC8+ICA8L2c+PC9zdmc+); +} +.mapbox-gl-draw_polygon { + background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+PHN2ZyAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIgICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiICAgd2lkdGg9IjIwIiAgIGhlaWdodD0iMjAiICAgdmlld0JveD0iMCAwIDIwIDIwIiAgIGlkPSJzdmcxOTE2NyIgICB2ZXJzaW9uPSIxLjEiICAgaW5rc2NhcGU6dmVyc2lvbj0iMC45MStkZXZlbCtvc3htZW51IHIxMjkxMSIgICBzb2RpcG9kaTpkb2NuYW1lPSJzcXVhcmUuc3ZnIj4gIDxkZWZzICAgICBpZD0iZGVmczE5MTY5IiAvPiAgPHNvZGlwb2RpOm5hbWVkdmlldyAgICAgaWQ9ImJhc2UiICAgICBwYWdlY29sb3I9IiNmZmZmZmYiICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIgICAgIGJvcmRlcm9wYWNpdHk9IjEuMCIgICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwLjAiICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIiAgICAgaW5rc2NhcGU6em9vbT0iMTEuMzEzNzA4IiAgICAgaW5rc2NhcGU6Y3g9IjExLjY4MTYzNCIgICAgIGlua3NjYXBlOmN5PSI5LjI4NTcxNDMiICAgICBpbmtzY2FwZTpkb2N1bWVudC11bml0cz0icHgiICAgICBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJsYXllcjEiICAgICBzaG93Z3JpZD0idHJ1ZSIgICAgIHVuaXRzPSJweCIgICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTI4MCIgICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9Ijc1MSIgICAgIGlua3NjYXBlOndpbmRvdy14PSIwIiAgICAgaW5rc2NhcGU6d2luZG93LXk9IjIzIiAgICAgaW5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMCIgICAgIGlua3NjYXBlOm9iamVjdC1ub2Rlcz0idHJ1ZSI+ICAgIDxpbmtzY2FwZTpncmlkICAgICAgIHR5cGU9Inh5Z3JpZCIgICAgICAgaWQ9ImdyaWQxOTcxNSIgLz4gIDwvc29kaXBvZGk6bmFtZWR2aWV3PiAgPG1ldGFkYXRhICAgICBpZD0ibWV0YWRhdGExOTE3MiI+ICAgIDxyZGY6UkRGPiAgICAgIDxjYzpXb3JrICAgICAgICAgcmRmOmFib3V0PSIiPiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+ICAgICAgICA8ZGM6dHlwZSAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4gICAgICAgIDxkYzp0aXRsZSAvPiAgICAgIDwvY2M6V29yaz4gICAgPC9yZGY6UkRGPiAgPC9tZXRhZGF0YT4gIDxnICAgICBpbmtzY2FwZTpsYWJlbD0iTGF5ZXIgMSIgICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiICAgICBpZD0ibGF5ZXIxIiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtMTAzMi4zNjIyKSI+ICAgIDxwYXRoICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7dmlzaWJpbGl0eTp2aXNpYmxlO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC41O21hcmtlcjpub25lO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiICAgICAgIGQ9Im0gNSwxMDM5LjM2MjIgMCw2IDIsMiA2LDAgMiwtMiAwLC02IC0yLC0yIC02LDAgeiBtIDMsMCA0LDAgMSwxIDAsNCAtMSwxIC00LDAgLTEsLTEgMCwtNCB6IiAgICAgICBpZD0icmVjdDc3OTciICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2NjY2NjY2NjY2NjY2NjIiAvPiAgICA8Y2lyY2xlICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7dmlzaWJpbGl0eTp2aXNpYmxlO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS42MDAwMDAwMjttYXJrZXI6bm9uZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAgICAgICBpZD0icGF0aDQzNjQiICAgICAgIGN4PSI2IiAgICAgICBjeT0iMTA0Ni4zNjIyIiAgICAgICByPSIyIiAvPiAgICA8Y2lyY2xlICAgICAgIGlkPSJwYXRoNDM2OCIgICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTt2aXNpYmlsaXR5OnZpc2libGU7ZmlsbDojMDAwMDAwO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxLjYwMDAwMDAyO21hcmtlcjpub25lO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGUiICAgICAgIGN4PSIxNCIgICAgICAgY3k9IjEwNDYuMzYyMiIgICAgICAgcj0iMiIgLz4gICAgPGNpcmNsZSAgICAgICBpZD0icGF0aDQzNzAiICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7dmlzaWJpbGl0eTp2aXNpYmxlO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS42MDAwMDAwMjttYXJrZXI6bm9uZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAgICAgICBjeD0iNiIgICAgICAgY3k9IjEwMzguMzYyMiIgICAgICAgcj0iMiIgLz4gICAgPGNpcmNsZSAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO3Zpc2liaWxpdHk6dmlzaWJsZTtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuNjAwMDAwMDI7bWFya2VyOm5vbmU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIgICAgICAgaWQ9InBhdGg0MzcyIiAgICAgICBjeD0iMTQiICAgICAgIGN5PSIxMDM4LjM2MjIiICAgICAgIHI9IjIiIC8+ICA8L2c+PC9zdmc+); +} +.mapbox-gl-draw_line { + background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+PHN2ZyAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIgICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiICAgd2lkdGg9IjIwIiAgIGhlaWdodD0iMjAiICAgdmlld0JveD0iMCAwIDIwIDIwIiAgIGlkPSJzdmcxOTE2NyIgICB2ZXJzaW9uPSIxLjEiICAgaW5rc2NhcGU6dmVyc2lvbj0iMC45MStkZXZlbCtvc3htZW51IHIxMjkxMSIgICBzb2RpcG9kaTpkb2NuYW1lPSJsaW5lLnN2ZyI+ICA8ZGVmcyAgICAgaWQ9ImRlZnMxOTE2OSIgLz4gIDxzb2RpcG9kaTpuYW1lZHZpZXcgICAgIGlkPSJiYXNlIiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiICAgICBib3JkZXJvcGFjaXR5PSIxLjAiICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMC4wIiAgICAgaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIgICAgIGlua3NjYXBlOnpvb209IjE2IiAgICAgaW5rc2NhcGU6Y3g9IjEyLjg5ODc3NSIgICAgIGlua3NjYXBlOmN5PSI5LjU4OTAxNTIiICAgICBpbmtzY2FwZTpkb2N1bWVudC11bml0cz0icHgiICAgICBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJsYXllcjEiICAgICBzaG93Z3JpZD0idHJ1ZSIgICAgIHVuaXRzPSJweCIgICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTI4MCIgICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9Ijc1MSIgICAgIGlua3NjYXBlOndpbmRvdy14PSIwIiAgICAgaW5rc2NhcGU6d2luZG93LXk9IjIzIiAgICAgaW5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMCIgICAgIGlua3NjYXBlOm9iamVjdC1ub2Rlcz0idHJ1ZSI+ICAgIDxpbmtzY2FwZTpncmlkICAgICAgIHR5cGU9Inh5Z3JpZCIgICAgICAgaWQ9ImdyaWQxOTcxNSIgLz4gIDwvc29kaXBvZGk6bmFtZWR2aWV3PiAgPG1ldGFkYXRhICAgICBpZD0ibWV0YWRhdGExOTE3MiI+ICAgIDxyZGY6UkRGPiAgICAgIDxjYzpXb3JrICAgICAgICAgcmRmOmFib3V0PSIiPiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+ICAgICAgICA8ZGM6dHlwZSAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4gICAgICAgIDxkYzp0aXRsZSAvPiAgICAgIDwvY2M6V29yaz4gICAgPC9yZGY6UkRGPiAgPC9tZXRhZGF0YT4gIDxnICAgICBpbmtzY2FwZTpsYWJlbD0iTGF5ZXIgMSIgICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiICAgICBpZD0ibGF5ZXIxIiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtMTAzMi4zNjIyKSI+ICAgIDxwYXRoICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7dmlzaWJpbGl0eTp2aXNpYmxlO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MzttYXJrZXI6bm9uZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAgICAgICBkPSJtIDEzLjUsMTAzNS44NjIyIGMgLTEuMzgwNzEyLDAgLTIuNSwxLjExOTMgLTIuNSwyLjUgMCwwLjMyMDggMC4wNDYxNCwwLjYyNDQgMC4xNTYyNSwwLjkwNjMgbCAtMy43NSwzLjc1IGMgLTAuMjgxODM2LC0wLjExMDIgLTAuNTg1NDIxLC0wLjE1NjMgLTAuOTA2MjUsLTAuMTU2MyAtMS4zODA3MTIsMCAtMi41LDEuMTE5MyAtMi41LDIuNSAwLDEuMzgwNyAxLjExOTI4OCwyLjUgMi41LDIuNSAxLjM4MDcxMiwwIDIuNSwtMS4xMTkzIDIuNSwtMi41IDAsLTAuMzIwOCAtMC4wNDYxNCwtMC42MjQ0IC0wLjE1NjI1LC0wLjkwNjIgbCAzLjc1LC0zLjc1IGMgMC4yODE4MzYsMC4xMTAxIDAuNTg1NDIxLDAuMTU2MiAwLjkwNjI1LDAuMTU2MiAxLjM4MDcxMiwwIDIuNSwtMS4xMTkzIDIuNSwtMi41IDAsLTEuMzgwNyAtMS4xMTkyODgsLTIuNSAtMi41LC0yLjUgeiIgICAgICAgaWQ9InJlY3Q2NDY3IiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIiAvPiAgPC9nPjwvc3ZnPg==); +} +.mapbox-gl-draw_trash { + background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+PHN2ZyAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIgICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiICAgd2lkdGg9IjIwIiAgIGhlaWdodD0iMjAiICAgaWQ9InN2ZzU3MzgiICAgdmVyc2lvbj0iMS4xIiAgIGlua3NjYXBlOnZlcnNpb249IjAuOTErZGV2ZWwrb3N4bWVudSByMTI5MTEiICAgc29kaXBvZGk6ZG9jbmFtZT0idHJhc2guc3ZnIiAgIHZpZXdCb3g9IjAgMCAyMCAyMCI+ICA8ZGVmcyAgICAgaWQ9ImRlZnM1NzQwIiAvPiAgPHNvZGlwb2RpOm5hbWVkdmlldyAgICAgaWQ9ImJhc2UiICAgICBwYWdlY29sb3I9IiNmZmZmZmYiICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIgICAgIGJvcmRlcm9wYWNpdHk9IjEuMCIgICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwLjAiICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIiAgICAgaW5rc2NhcGU6em9vbT0iMjIuNjI3NDE3IiAgICAgaW5rc2NhcGU6Y3g9IjEyLjEyODE4NCIgICAgIGlua3NjYXBlOmN5PSI4Ljg0NjEzMDciICAgICBpbmtzY2FwZTpkb2N1bWVudC11bml0cz0icHgiICAgICBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJsYXllcjEiICAgICBzaG93Z3JpZD0idHJ1ZSIgICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTAzMyIgICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9Ijc1MSIgICAgIGlua3NjYXBlOndpbmRvdy14PSIyMCIgICAgIGlua3NjYXBlOndpbmRvdy15PSIyMyIgICAgIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9IjAiICAgICBpbmtzY2FwZTpzbmFwLXNtb290aC1ub2Rlcz0idHJ1ZSIgICAgIGlua3NjYXBlOm9iamVjdC1ub2Rlcz0idHJ1ZSI+ICAgIDxpbmtzY2FwZTpncmlkICAgICAgIHR5cGU9Inh5Z3JpZCIgICAgICAgaWQ9ImdyaWQ1NzQ2IiAgICAgICBlbXBzcGFjaW5nPSI1IiAgICAgICB2aXNpYmxlPSJ0cnVlIiAgICAgICBlbmFibGVkPSJ0cnVlIiAgICAgICBzbmFwdmlzaWJsZWdyaWRsaW5lc29ubHk9InRydWUiIC8+ICA8L3NvZGlwb2RpOm5hbWVkdmlldz4gIDxtZXRhZGF0YSAgICAgaWQ9Im1ldGFkYXRhNTc0MyI+ICAgIDxyZGY6UkRGPiAgICAgIDxjYzpXb3JrICAgICAgICAgcmRmOmFib3V0PSIiPiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+ICAgICAgICA8ZGM6dHlwZSAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4gICAgICAgIDxkYzp0aXRsZSAvPiAgICAgIDwvY2M6V29yaz4gICAgPC9yZGY6UkRGPiAgPC9tZXRhZGF0YT4gIDxnICAgICBpbmtzY2FwZTpsYWJlbD0iTGF5ZXIgMSIgICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiICAgICBpZD0ibGF5ZXIxIiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtMTAzMi4zNjIyKSI+ICAgIDxwYXRoICAgICAgIHN0eWxlPSJjb2xvcjojMDAwMDAwO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7dmlzaWJpbGl0eTp2aXNpYmxlO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MC45OTk5OTk4MjttYXJrZXI6bm9uZTtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIiAgICAgICBkPSJtIDEwLDEwMzUuNzc0MyBjIC0wLjc4NDkyNTMsOGUtNCAtMS40OTY4Mzc2LDAuNDYwNiAtMS44MjAzMTI1LDEuMTc1OCBsIC0zLjE3OTY4NzUsMCAtMSwxIDAsMSAxMiwwIDAsLTEgLTEsLTEgLTMuMTc5Njg4LDAgYyAtMC4zMjM0NzUsLTAuNzE1MiAtMS4wMzUzODcsLTEuMTc1IC0xLjgyMDMxMiwtMS4xNzU4IHogbSAtNSw0LjU4NzkgMCw3IGMgMCwxIDEsMiAyLDIgbCA2LDAgYyAxLDAgMiwtMSAyLC0yIGwgMCwtNyAtMiwwIDAsNS41IC0xLjUsMCAwLC01LjUgLTMsMCAwLDUuNSAtMS41LDAgMCwtNS41IHoiICAgICAgIGlkPSJyZWN0MjQzOS03IiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2MiIC8+ICA8L2c+PC9zdmc+); +} + +.mapbox-gl-draw_uncombine { + background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgd2lkdGg9IjIwIgogICBoZWlnaHQ9IjIwIgogICBpZD0ic3ZnNTczOCIKICAgdmVyc2lvbj0iMS4xIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjkxIHIxMzcyNSIKICAgc29kaXBvZGk6ZG9jbmFtZT0idW5jb21iaW5lLnN2ZyI+CiAgPGRlZnMKICAgICBpZD0iZGVmczU3NDAiPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ0MTAzIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDE4NCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgeDE9IjMwMDMiCiAgICAgICB5MT0iMTAiCiAgICAgICB4Mj0iMzAxNyIKICAgICAgIHkyPSIxMCIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoMSwyLjYxNzE4NzRlLTYpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0MTAzIj4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3A0MTA1IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eTowOyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDQxMDciIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogIDwvZGVmcz4KICA8c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgaWQ9ImJhc2UiCiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgIGJvcmRlcm9wYWNpdHk9IjEuMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMC4wIgogICAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCiAgICAgaW5rc2NhcGU6em9vbT0iMTEuMzEzNzA4IgogICAgIGlua3NjYXBlOmN4PSItMTAuMjczOTQ2IgogICAgIGlua3NjYXBlOmN5PSI2LjkzMDM0NCIKICAgICBpbmtzY2FwZTpkb2N1bWVudC11bml0cz0icHgiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ibGF5ZXIxIgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjIwNzgiCiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iMTA1NCIKICAgICBpbmtzY2FwZTp3aW5kb3cteD0iOTAwIgogICAgIGlua3NjYXBlOndpbmRvdy15PSIyOTYiCiAgICAgaW5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMCIKICAgICBzaG93Z3VpZGVzPSJmYWxzZSIKICAgICBpbmtzY2FwZTpzbmFwLWJib3g9InRydWUiCiAgICAgaW5rc2NhcGU6YmJveC1wYXRocz0idHJ1ZSIKICAgICBpbmtzY2FwZTpiYm94LW5vZGVzPSJ0cnVlIgogICAgIGlua3NjYXBlOm9iamVjdC1wYXRocz0idHJ1ZSIKICAgICBpbmtzY2FwZTpvYmplY3Qtbm9kZXM9InRydWUiCiAgICAgaW5rc2NhcGU6c25hcC1zbW9vdGgtbm9kZXM9InRydWUiCiAgICAgaW5rc2NhcGU6c25hcC1vdGhlcnM9ImZhbHNlIgogICAgIGlua3NjYXBlOnNuYXAtbm9kZXM9ImZhbHNlIj4KICAgIDxpbmtzY2FwZTpncmlkCiAgICAgICB0eXBlPSJ4eWdyaWQiCiAgICAgICBpZD0iZ3JpZDU3NDYiCiAgICAgICBlbXBzcGFjaW5nPSIyIgogICAgICAgdmlzaWJsZT0idHJ1ZSIKICAgICAgIGVuYWJsZWQ9InRydWUiCiAgICAgICBzbmFwdmlzaWJsZWdyaWRsaW5lc29ubHk9InRydWUiCiAgICAgICBzcGFjaW5neD0iMC41cHgiCiAgICAgICBzcGFjaW5neT0iMC41cHgiCiAgICAgICBjb2xvcj0iIzAwMDBmZiIKICAgICAgIG9wYWNpdHk9IjAuMDU4ODIzNTMiIC8+CiAgPC9zb2RpcG9kaTpuYW1lZHZpZXc+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhNTc0MyI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgICA8ZGM6dGl0bGU+PC9kYzp0aXRsZT4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGcKICAgICBpbmtzY2FwZTpsYWJlbD0iTGF5ZXIgMSIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIgogICAgIGlkPSJsYXllcjEiCiAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtMTAzMi4zNjIyKSI+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImNvbG9yOiMwMDAwMDA7Y2xpcC1ydWxlOm5vbnplcm87ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTt2aXNpYmlsaXR5OnZpc2libGU7b3BhY2l0eToxO2lzb2xhdGlvbjphdXRvO21peC1ibGVuZC1tb2RlOm5vcm1hbDtjb2xvci1pbnRlcnBvbGF0aW9uOnNSR0I7Y29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzOmxpbmVhclJHQjtzb2xpZC1jb2xvcjojMDAwMDAwO3NvbGlkLW9wYWNpdHk6MTtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjI7c3Ryb2tlLWxpbmVjYXA6YnV0dDtzdHJva2UtbGluZWpvaW46bWl0ZXI7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLWRhc2hvZmZzZXQ6MDtzdHJva2Utb3BhY2l0eToxO21hcmtlcjpub25lO2NvbG9yLXJlbmRlcmluZzphdXRvO2ltYWdlLXJlbmRlcmluZzphdXRvO3NoYXBlLXJlbmRlcmluZzphdXRvO3RleHQtcmVuZGVyaW5nOmF1dG87ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZSIKICAgICAgIGQ9Ik0gMTIuMDA1ODU5IDIgQyAxMS43NTAzNiAyIDExLjQ5NDYwNSAyLjA5NzE4NyAxMS4yOTg4MjggMi4yOTI5Njg4IEwgMTAuMzAyNzM0IDMuMjg5MDYyNSBDIDkuOTExMTgwNCAzLjY4MDYyNiA5LjkxMTE4MDQgNC4zMTE1NjE1IDEwLjMwMjczNCA0LjcwMzEyNSBMIDExLjMwMjczNCA1LjcwMTE3MTkgQyAxMS42OTQyODggNi4wOTI3MzU0IDEyLjMyMzI5IDYuMDkyNzM1NCAxMi43MTQ4NDQgNS43MDExNzE5IEwgMTMuNzEwOTM4IDQuNzA1MDc4MSBDIDE0LjEwMjQ5MSA0LjMxMzUxNDYgMTQuMTAyNDkxIDMuNjgyNTc5MSAxMy43MTA5MzggMy4yOTEwMTU2IEwgMTIuNzEyODkxIDIuMjkyOTY4OCBDIDEyLjUxNzExNCAyLjA5NzE4NyAxMi4yNjEzNTkgMiAxMi4wMDU4NTkgMiB6IE0gMTYuMDAxOTUzIDUuOTk0MTQwNiBDIDE1Ljc0NjQ2MyA1Ljk5NDE0MDYgMTUuNDkwNjkyIDYuMDkzMjczNSAxNS4yOTQ5MjIgNi4yODkwNjI1IEwgMTQuMjk4ODI4IDcuMjg1MTU2MiBDIDEzLjkwNzI4OSA3LjY3NjczNDIgMTMuOTA3Mjg5IDguMzA1Njg3NyAxNC4yOTg4MjggOC42OTcyNjU2IEwgMTUuMjk2ODc1IDkuNjk3MjY1NiBDIDE1LjY4ODQxNCAxMC4wODg4NDQgMTYuMzE5Mzk4IDEwLjA4ODg0NCAxNi43MTA5MzggOS42OTcyNjU2IEwgMTcuNzA3MDMxIDguNzAxMTcxOSBDIDE4LjA5ODU3MSA4LjMwOTU5MzkgMTguMDk4NTcxIDcuNjc4Njg3MyAxNy43MDcwMzEgNy4yODcxMDk0IEwgMTYuNzA4OTg0IDYuMjg5MDYyNSBDIDE2LjUxMzIxNSA2LjA5MzI3MzUgMTYuMjU3NDQzIDUuOTk0MTQwNiAxNi4wMDE5NTMgNS45OTQxNDA2IHogTSA5IDcgQyA4IDcgOCA4IDguNSA4LjUgQyA4LjgzMzMzMyA4LjgzMzMgOS41IDkuNSA5LjUgOS41IEwgOC41IDEwLjUgQyA4LjUgMTAuNSA4IDExIDguNSAxMS41IEMgOSAxMiA5LjUgMTEuNSA5LjUgMTEuNSBMIDEwLjUgMTAuNSBMIDExLjUgMTEuNSBDIDEyIDEyIDEzIDEyIDEzIDExIEwgMTMgNyBMIDkgNyB6IE0gNC4wNDg4MjgxIDEwLjAwMTk1MyBDIDMuNzkzMzA4NyAxMC4wMDE5NTMgMy41Mzc1ODkxIDEwLjA5OTEyOSAzLjM0MTc5NjkgMTAuMjk0OTIyIEwgMi4yOTg4MjgxIDExLjMzNzg5MSBDIDEuOTA3MjQzNyAxMS43Mjk0NzYgMS45MDcyNDM3IDEyLjM2MDM2OCAyLjI5ODgyODEgMTIuNzUxOTUzIEwgNy4yNDgwNDY5IDE3LjcwMTE3MiBDIDcuNjM5NjMxMyAxOC4wOTI3NTcgOC4yNzA1MjUgMTguMDkyNzU3IDguNjYyMTA5NCAxNy43MDExNzIgTCA5LjcwNTA3ODEgMTYuNjU4MjAzIEMgMTAuMDk2NjYzIDE2LjI2NjYxOCAxMC4wOTY2NjMgMTUuNjM1NzI2IDkuNzA1MDc4MSAxNS4yNDQxNDEgTCA0Ljc1NTg1OTQgMTAuMjk0OTIyIEMgNC41NjAwNjcyIDEwLjA5OTEyOSA0LjMwNDM0NzUgMTAuMDAxOTUzIDQuMDQ4ODI4MSAxMC4wMDE5NTMgeiAiCiAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDEwMzIuMzYyMikiCiAgICAgICBpZD0icmVjdDkxOTgiIC8+CiAgPC9nPgo8L3N2Zz4K); +} +.mapbox-gl-draw_combine { + background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgd2lkdGg9IjIwIgogICBoZWlnaHQ9IjIwIgogICBpZD0ic3ZnNTczOCIKICAgdmVyc2lvbj0iMS4xIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjkxIHIxMzcyNSIKICAgc29kaXBvZGk6ZG9jbmFtZT0iY29tYmluZS5zdmciPgogIDxkZWZzCiAgICAgaWQ9ImRlZnM1NzQwIj4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NDEwMyIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQxODQiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIHgxPSIzMDAzIgogICAgICAgeTE9IjEwIgogICAgICAgeDI9IjMwMTciCiAgICAgICB5Mj0iMTAiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKDEsMi42MTcxODc0ZS02KSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50NDEwMyI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDAwMDA7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wNDEwNSIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MDsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3A0MTA3IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICA8L2RlZnM+CiAgPHNvZGlwb2RpOm5hbWVkdmlldwogICAgIGlkPSJiYXNlIgogICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKICAgICBib3JkZXJvcGFjaXR5PSIxLjAiCiAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAuMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOnpvb209IjE2IgogICAgIGlua3NjYXBlOmN4PSIyLjQyMzAwNiIKICAgICBpbmtzY2FwZTpjeT0iMTIuMTczMTY1IgogICAgIGlua3NjYXBlOmRvY3VtZW50LXVuaXRzPSJweCIKICAgICBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJsYXllcjEiCiAgICAgc2hvd2dyaWQ9ImZhbHNlIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMjA3OCIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSIxMDU0IgogICAgIGlua3NjYXBlOndpbmRvdy14PSI5MDAiCiAgICAgaW5rc2NhcGU6d2luZG93LXk9IjI5NiIKICAgICBpbmtzY2FwZTp3aW5kb3ctbWF4aW1pemVkPSIwIgogICAgIHNob3dndWlkZXM9ImZhbHNlIgogICAgIGlua3NjYXBlOnNuYXAtYmJveD0idHJ1ZSIKICAgICBpbmtzY2FwZTpiYm94LXBhdGhzPSJ0cnVlIgogICAgIGlua3NjYXBlOmJib3gtbm9kZXM9InRydWUiCiAgICAgaW5rc2NhcGU6b2JqZWN0LXBhdGhzPSJ0cnVlIgogICAgIGlua3NjYXBlOm9iamVjdC1ub2Rlcz0idHJ1ZSIKICAgICBpbmtzY2FwZTpzbmFwLXNtb290aC1ub2Rlcz0idHJ1ZSIKICAgICBpbmtzY2FwZTpzbmFwLW90aGVycz0iZmFsc2UiCiAgICAgaW5rc2NhcGU6c25hcC1ub2Rlcz0iZmFsc2UiPgogICAgPGlua3NjYXBlOmdyaWQKICAgICAgIHR5cGU9Inh5Z3JpZCIKICAgICAgIGlkPSJncmlkNTc0NiIKICAgICAgIGVtcHNwYWNpbmc9IjIiCiAgICAgICB2aXNpYmxlPSJ0cnVlIgogICAgICAgZW5hYmxlZD0idHJ1ZSIKICAgICAgIHNuYXB2aXNpYmxlZ3JpZGxpbmVzb25seT0idHJ1ZSIKICAgICAgIHNwYWNpbmd4PSIwLjVweCIKICAgICAgIHNwYWNpbmd5PSIwLjVweCIKICAgICAgIGNvbG9yPSIjMDAwMGZmIgogICAgICAgb3BhY2l0eT0iMC4wNTg4MjM1MyIgLz4KICA8L3NvZGlwb2RpOm5hbWVkdmlldz4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGE1NzQzIj4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICAgIDxkYzp0aXRsZT48L2RjOnRpdGxlPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8ZwogICAgIGlua3NjYXBlOmxhYmVsPSJMYXllciAxIgogICAgIGlua3NjYXBlOmdyb3VwbW9kZT0ibGF5ZXIiCiAgICAgaWQ9ImxheWVyMSIKICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLC0xMDMyLjM2MjIpIj4KICAgIDxwYXRoCiAgICAgICBzdHlsZT0iY29sb3I6IzAwMDAwMDtjbGlwLXJ1bGU6bm9uemVybztkaXNwbGF5OmlubGluZTtvdmVyZmxvdzp2aXNpYmxlO3Zpc2liaWxpdHk6dmlzaWJsZTtvcGFjaXR5OjE7aXNvbGF0aW9uOmF1dG87bWl4LWJsZW5kLW1vZGU6bm9ybWFsO2NvbG9yLWludGVycG9sYXRpb246c1JHQjtjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM6bGluZWFyUkdCO3NvbGlkLWNvbG9yOiMwMDAwMDA7c29saWQtb3BhY2l0eToxO2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2UtZGFzaG9mZnNldDowO3N0cm9rZS1vcGFjaXR5OjE7bWFya2VyOm5vbmU7Y29sb3ItcmVuZGVyaW5nOmF1dG87aW1hZ2UtcmVuZGVyaW5nOmF1dG87c2hhcGUtcmVuZGVyaW5nOmF1dG87dGV4dC1yZW5kZXJpbmc6YXV0bztlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlIgogICAgICAgZD0iTSAxMi4wNTA3ODEgMiBDIDExLjc5NTI2MiAyIDExLjUzOTU0MiAyLjA5NzE3NjIgMTEuMzQzNzUgMi4yOTI5Njg4IEwgMTAuMjk4ODI4IDMuMzM3ODkwNiBDIDkuOTA3MjQzNyAzLjcyOTQ3NTcgOS45MDcyNDM3IDQuMzYwMzY4IDEwLjI5ODgyOCA0Ljc1MTk1MzEgTCAxNS4yNDgwNDcgOS43MDExNzE5IEMgMTUuNjM5NjMxIDEwLjA5Mjc1NyAxNi4yNzA1MjUgMTAuMDkyNzU3IDE2LjY2MjEwOSA5LjcwMTE3MTkgTCAxNy43MDcwMzEgOC42NTYyNSBDIDE4LjA5ODYxNiA4LjI2NDY2NDkgMTguMDk4NjE2IDcuNjMzNzcyNiAxNy43MDcwMzEgNy4yNDIxODc1IEwgMTIuNzU3ODEyIDIuMjkyOTY4OCBDIDEyLjU2MjAyIDIuMDk3MTc2MiAxMi4zMDYzMDEgMiAxMi4wNTA3ODEgMiB6IE0gOCA4IEMgNyA4IDcgOSA3LjUgOS41IEMgNy44MzMzMzMgOS44MzMzIDguNSAxMC41IDguNSAxMC41IEwgNy41IDExLjUgQyA3LjUgMTEuNSA3IDEyIDcuNSAxMi41IEMgOCAxMyA4LjUgMTIuNSA4LjUgMTIuNSBMIDkuNSAxMS41IEwgMTAuNSAxMi41IEMgMTEgMTMgMTIgMTMgMTIgMTIgTCAxMiA4IEwgOCA4IHogTSA0IDEwLjAwMzkwNiBDIDMuNzQ0NTEgMTAuMDAzOTA2IDMuNDkwNjkxNiAxMC4xMDMwMzkgMy4yOTQ5MjE5IDEwLjI5ODgyOCBMIDIuMjk4ODI4MSAxMS4yOTQ5MjIgQyAxLjkwNzI4ODggMTEuNjg2NSAxLjkwNzI4ODggMTIuMzE1NDUzIDIuMjk4ODI4MSAxMi43MDcwMzEgTCAzLjI5Njg3NSAxMy43MDcwMzEgQyAzLjY4ODQxNDQgMTQuMDk4NjA5IDQuMzE5Mzk4MSAxNC4wOTg2MDkgNC43MTA5Mzc1IDEzLjcwNzAzMSBMIDUuNzA3MDMxMiAxMi43MTA5MzggQyA2LjA5ODU3MDYgMTIuMzE5MzYgNi4wOTg1NzA2IDExLjY4ODQ1MyA1LjcwNzAzMTIgMTEuMjk2ODc1IEwgNC43MDcwMzEyIDEwLjI5ODgyOCBDIDQuNTExMjYxNiAxMC4xMDMwMzkgNC4yNTU0OSAxMC4wMDM5MDYgNCAxMC4wMDM5MDYgeiBNIDcuOTk2MDkzOCAxNCBDIDcuNzQwNTk0MiAxNCA3LjQ4NDgzOTUgMTQuMDk3MTg3IDcuMjg5MDYyNSAxNC4yOTI5NjkgTCA2LjI5NDkyMTkgMTUuMjg5MDYyIEMgNS45MDMzNjc5IDE1LjY4MDYyNiA1LjkwMzM2NzkgMTYuMzExNTYxIDYuMjk0OTIxOSAxNi43MDMxMjUgTCA3LjI5Mjk2ODggMTcuNzAxMTcyIEMgNy42ODQ1MjI3IDE4LjA5MjczNSA4LjMxMzUyNDIgMTguMDkyNzM1IDguNzA1MDc4MSAxNy43MDExNzIgTCA5LjcwMTE3MTkgMTYuNzA1MDc4IEMgMTAuMDkyNzI2IDE2LjMxMzUxNSAxMC4wOTI3MjYgMTUuNjg0NTMyIDkuNzAxMTcxOSAxNS4yOTI5NjkgTCA4LjcwMzEyNSAxNC4yOTI5NjkgQyA4LjUwNzM0OCAxNC4wOTcxODcgOC4yNTE1OTMzIDE0IDcuOTk2MDkzOCAxNCB6ICIKICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsMTAzMi4zNjIyKSIKICAgICAgIGlkPSJyZWN0OTE5OCIgLz4KICA8L2c+Cjwvc3ZnPgo=); +} + +.mapboxgl-map.mouse-pointer .mapboxgl-canvas-container.mapboxgl-interactive { + cursor: pointer; +} +.mapboxgl-map.mouse-move .mapboxgl-canvas-container.mapboxgl-interactive { + cursor: move; +} +.mapboxgl-map.mouse-add .mapboxgl-canvas-container.mapboxgl-interactive { + cursor: crosshair; +} +.mapboxgl-map.mouse-move.mode-direct_select .mapboxgl-canvas-container.mapboxgl-interactive { + cursor: grab; + cursor: -moz-grab; + cursor: -webkit-grab; +} +.mapboxgl-map.mode-direct_select.feature-vertex.mouse-move .mapboxgl-canvas-container.mapboxgl-interactive { + cursor: move; +} +.mapboxgl-map.mode-direct_select.feature-midpoint.mouse-pointer .mapboxgl-canvas-container.mapboxgl-interactive { + cursor: cell; +} +.mapboxgl-map.mode-direct_select.feature-feature.mouse-move .mapboxgl-canvas-container.mapboxgl-interactive { + cursor: move; +} +.mapboxgl-map.mode-static.mouse-pointer .mapboxgl-canvas-container.mapboxgl-interactive { + cursor: grab; + cursor: -moz-grab; + cursor: -webkit-grab; +} + +.mapbox-gl-draw_boxselect { + pointer-events: none; + position: absolute; + top: 0; + left: 0; + width: 0; + height: 0; + background: rgba(0,0,0,.1); + border: 2px dotted #fff; + opacity: 0.5; +} \ No newline at end of file diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapbox-gl-draw/v0.16.0/mapbox-gl-draw.js b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapbox-gl-draw/v0.16.0/mapbox-gl-draw.js new file mode 100644 index 000000000..cb712cb7a --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapbox-gl-draw/v0.16.0/mapbox-gl-draw.js @@ -0,0 +1,3 @@ +!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;t="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,t.MapboxDraw=e()}}(function(){return function e(t,n,r){function o(s,a){if(!n[s]){if(!t[s]){var u="function"==typeof require&&require;if(!a&&u)return u(s,!0);if(i)return i(s,!0);var c=new Error("Cannot find module '"+s+"'");throw c.code="MODULE_NOT_FOUND",c}var l=n[s]={exports:{}};t[s][0].call(l.exports,function(e){var n=t[s][1][e];return o(n?n:e)},l,l.exports,e,t,n,r)}return n[s].exports}for(var i="function"==typeof require&&require,s=0;s=0;r--){var o=e[r];"."===o?e.splice(r,1):".."===o?(e.splice(r,1),n++):n&&(e.splice(r,1),n--)}if(t)for(;n--;n)e.unshift("..");return e}function r(e,t){if(e.filter)return e.filter(t);for(var n=[],r=0;r=-1&&!o;i--){var s=i>=0?arguments[i]:e.cwd();if("string"!=typeof s)throw new TypeError("Arguments to path.resolve must be strings");s&&(n=s+"/"+n,o="/"===s.charAt(0))}return n=t(r(n.split("/"),function(e){return!!e}),!o).join("/"),(o?"/":"")+n||"."},n.normalize=function(e){var o=n.isAbsolute(e),i="/"===s(e,-1);return e=t(r(e.split("/"),function(e){return!!e}),!o).join("/"),e||o||(e="."),e&&i&&(e+="/"),(o?"/":"")+e},n.isAbsolute=function(e){return"/"===e.charAt(0)},n.join=function(){var e=Array.prototype.slice.call(arguments,0);return n.normalize(r(e,function(e,t){if("string"!=typeof e)throw new TypeError("Arguments to path.join must be strings");return e}).join("/"))},n.relative=function(e,t){function r(e){for(var t=0;t=0&&""===e[n];n--);return t>n?[]:e.slice(t,n-t+1)}e=n.resolve(e).substr(1),t=n.resolve(t).substr(1);for(var o=r(e.split("/")),i=r(t.split("/")),s=Math.min(o.length,i.length),a=s,u=0;u1)for(var n=1;n0){t+=Math.abs(s(e[0]));for(var n=1;n2){for(i=0;i=e[0]&&this._bbox[3]>=e[1]:null},r.prototype.polygon=function(){return this._valid?{type:"Polygon",coordinates:[[[this._bbox[0],this._bbox[1]],[this._bbox[2],this._bbox[1]],[this._bbox[2],this._bbox[3]],[this._bbox[0],this._bbox[3]],[this._bbox[0],this._bbox[1]]]]}:null}},{}],9:[function(e,t,n){t.exports=function(e,t){function n(e){return Array.isArray(e)&&e.length&&"number"==typeof e[0]?[e]:e.reduce(function(e,t){return Array.isArray(t)&&Array.isArray(t[0])?e.concat(n(t)):(e.push(t),e)},[])}return n(e)}},{}],10:[function(e,t,n){var r=e("geojson-normalize"),o=e("geojson-flatten"),i=e("./flatten");t.exports=function(e){if(!e)return[];var t=o(r(e)),n=[];return t.features.forEach(function(e){e.geometry&&(n=n.concat(i(e.geometry.coordinates)))}),n}},{"./flatten":9,"geojson-flatten":11,"geojson-normalize":12}],11:[function(e,t,n){function r(e,t){switch(e&&e.type||null){case"FeatureCollection":return e.features=e.features.reduce(function(e,t){return e.concat(r(t))},[]),e;case"Feature":return r(e.geometry).map(function(t){return{type:"Feature",properties:JSON.parse(JSON.stringify(e.properties)),geometry:t}});case"MultiPoint":return e.coordinates.map(function(e){return{type:"Point",coordinates:e}});case"MultiPolygon":return e.coordinates.map(function(e){return{type:"Polygon",coordinates:e}});case"MultiLineString":return e.coordinates.map(function(e){return{type:"LineString",coordinates:e}});case"GeometryCollection":return e.geometries;case"Point":case"Polygon":case"LineString":return[e];default:return e}}t.exports=r},{}],12:[function(e,t,n){function r(e){if(!e||!e.type)return null;var t=o[e.type];return t?"geometry"===t?{type:"FeatureCollection",features:[{type:"Feature",properties:{},geometry:e}]}:"feature"===t?{type:"FeatureCollection",features:[e]}:"featurecollection"===t?e:void 0:null}t.exports=r;var o={Point:"geometry",MultiPoint:"geometry",LineString:"geometry",MultiLineString:"geometry",Polygon:"geometry",MultiPolygon:"geometry",GeometryCollection:"geometry",Feature:"feature",FeatureCollection:"featurecollection"}},{}],13:[function(e,t,n){function r(e){this.value=e}function o(e,t,n){var r=[],o=[],s=!0;return function e(a){function u(){if("object"==typeof f.node&&null!==f.node){f.keys&&f.node_===f.node||(f.keys=h(f.node)),f.isLeaf=0==f.keys.length;for(var e=0;e3)return b.push({message:"position should not have more than 3 elements",line:e.__line__||n});if(!r(e,"number"))return b.push({message:"each element in a position must be a number",line:e.__line__||n});if(t&&t.precisionWarning){if(E===T)return E+=1,b.push({message:"truncated warnings: we've encountered coordinate precision warning "+T+" times, no more warnings will be reported",level:"message",line:e.__line__||n});EO)return E+=1,b.push({message:"precision of coordinates should be reduced",level:"message",line:e.__line__||n})})}}function u(e,t,n,r){if(void 0===r&&void 0!==e.__line__&&(r=e.__line__),0===n)return a(e,r);if(1===n&&t)if("LinearRing"===t){if(!Array.isArray(e[e.length-1]))return b.push({message:"a number was found where a coordinate array should have been found: this needs to be nested more deeply",line:r}),!0;if(e.length<4&&b.push({message:"a LinearRing of coordinates needs to have four or more positions",line:r}),e.length&&(e[e.length-1].length!==e[0].length||!e[e.length-1].every(function(t,n){return e[0][n]===t})))return b.push({message:"the first and last positions in a LinearRing of coordinates must be the same",line:r}),!0}else if("Line"===t&&e.length<2)return b.push({message:"a line needs to have two or more coordinates to be valid",line:r});if(Array.isArray(e)){var o=e.map(function(e){return u(e,t,n-1,e.__line__||r)});return o.some(function(e){return e})}b.push({message:"a number was found where a coordinate array should have been found: this needs to be nested more deeply",line:r})}function c(e){if(e.crs){var t="urn:ogc:def:crs:OGC:1.3:CRS84";"object"==typeof e.crs&&e.crs.properties&&e.crs.properties.name===t?b.push({message:"old-style crs member is not recommended, this object is equivalent to the default and should be removed",line:e.__line__}):b.push({message:"old-style crs member is not recommended",line:e.__line__})}}function l(e){if(e.bbox)return Array.isArray(e.bbox)?(r(e.bbox,"number")||b.push({message:"each element in a bbox member must be a number",line:e.bbox.__line__}),4!==e.bbox.length&&6!==e.bbox.length&&b.push({message:"bbox must contain 4 elements (for 2D) or 6 elements (for 3D)",line:e.bbox.__line__}),b.length):void b.push({message:"bbox member must be an array of numbers, but is a "+typeof e.bbox,line:e.__line__})}function p(e){void 0!==e.properties&&b.push({message:'geometry object cannot contain a "properties" member',line:e.__line__}),void 0!==e.geometry&&b.push({message:'geometry object cannot contain a "geometry" member',line:e.__line__}),void 0!==e.features&&b.push({message:'geometry object cannot contain a "features" member',line:e.__line__})}function f(e){c(e),l(e),p(e),i(e,"coordinates","array")||a(e.coordinates)}function d(e){c(e),l(e),i(e,"coordinates","array")||u(e.coordinates,"LinearRing",2)||o(e,b)}function h(e){c(e),l(e),i(e,"coordinates","array")||u(e.coordinates,"LinearRing",3)||o(e,b)}function y(e){c(e),l(e),i(e,"coordinates","array")||u(e.coordinates,"Line",1)}function g(e){c(e),l(e),i(e,"coordinates","array")||u(e.coordinates,"Line",2)}function m(e){c(e),l(e),i(e,"coordinates","array")||u(e.coordinates,"",1)}function _(e){c(e),l(e),i(e,"geometries","array")||(r(e.geometries,"object")||b.push({message:"The geometries array in a GeometryCollection must contain only geometry objects",line:e.__line__}),1===e.geometries.length&&b.push({message:"GeometryCollection with a single geometry should be avoided in favor of single part or a single object of multi-part type",line:e.geometries.__line__}),e.geometries.forEach(function(t){t&&("GeometryCollection"===t.type&&b.push({message:"GeometryCollection should avoid nested geometry collections",line:e.geometries.__line__}),n(t))}))}function v(e){c(e),l(e),void 0!==e.id&&"string"!=typeof e.id&&"number"!=typeof e.id&&b.push({message:'Feature "id" member must have a string or number value',line:e.__line__}),void 0!==e.features&&b.push({message:'Feature object cannot contain a "features" member',line:e.__line__}),void 0!==e.coordinates&&b.push({message:'Feature object cannot contain a "coordinates" member',line:e.__line__}),"Feature"!==e.type&&b.push({message:"GeoJSON features must have a type=feature member",line:e.__line__}),i(e,"properties","object"),i(e,"geometry","object")||e.geometry&&n(e.geometry)}var b=[],E=0,T=10,O=6,x={Point:f,Feature:v,MultiPoint:m,LineString:y,MultiLineString:g,FeatureCollection:s,GeometryCollection:_,Polygon:d,MultiPolygon:h},I=Object.keys(x).reduce(function(e,t){return e[t.toLowerCase()]=t,e},{});return"object"!=typeof e||null===e||void 0===e?(b.push({message:"The root of a GeoJSON object must be an object.",line:0}),b):(n(e),b.forEach(function(e){({}).hasOwnProperty.call(e,"line")&&void 0===e.line&&delete e.line}),b)}var o=e("./rhr");t.exports.hint=r},{"./rhr":17}],17:[function(e,t,n){function r(e){return e*Math.PI/180}function o(e){var t=0;if(e.length>2)for(var n,o,i=0;i=0}function i(e){if(e&&e.length>0){if(o(e[0]))return!1;var t=e.slice(1,e.length);if(!t.every(o))return!1}return!0}function s(e){return"Polygon"===e.type?i(e.coordinates):"MultiPolygon"===e.type?e.coordinates.every(i):void 0}t.exports=function(e,t){s(e)||t.push({message:"Polygons and MultiPolygons should follow the right-hand rule",level:"message",line:e.__line__})}},{}],18:[function(e,t,n){(function(r){var o=function(){function e(){this.yy={}}var t=function(e,t,n,r){for(n=n||{},r=e.length;r--;n[e[r]]=t);return n},n=[1,12],r=[1,13],o=[1,9],i=[1,10],s=[1,11],a=[1,14],u=[1,15],c=[14,18,22,24],l=[18,22],p=[22,24],f={trace:function(){},yy:{},symbols_:{error:2,JSONString:3,STRING:4,JSONNumber:5,NUMBER:6,JSONNullLiteral:7,NULL:8,JSONBooleanLiteral:9,TRUE:10,FALSE:11,JSONText:12,JSONValue:13,EOF:14,JSONObject:15,JSONArray:16,"{":17,"}":18,JSONMemberList:19,JSONMember:20,":":21,",":22,"[":23,"]":24,JSONElementList:25,$accept:0,$end:1},terminals_:{2:"error",4:"STRING",6:"NUMBER",8:"NULL",10:"TRUE",11:"FALSE",14:"EOF",17:"{",18:"}",21:":",22:",",23:"[",24:"]"},productions_:[0,[3,1],[5,1],[7,1],[9,1],[9,1],[12,2],[13,1],[13,1],[13,1],[13,1],[13,1],[13,1],[15,2],[15,3],[20,3],[19,1],[19,3],[16,2],[16,3],[25,1],[25,3]],performAction:function(e,t,n,r,o,i,s){var a=i.length-1;switch(o){case 1:this.$=e.replace(/\\(\\|")/g,"$1").replace(/\\n/g,"\n").replace(/\\r/g,"\r").replace(/\\t/g,"\t").replace(/\\v/g,"\v").replace(/\\f/g,"\f").replace(/\\b/g,"\b");break;case 2:this.$=Number(e);break;case 3:this.$=null;break;case 4:this.$=!0;break;case 5:this.$=!1;break;case 6:return this.$=i[a-1];case 13:this.$={},Object.defineProperty(this.$,"__line__",{value:this._$.first_line,enumerable:!1});break;case 14:case 19:this.$=i[a-1],Object.defineProperty(this.$,"__line__",{value:this._$.first_line,enumerable:!1});break;case 15:this.$=[i[a-2],i[a]];break;case 16:this.$={},this.$[i[a][0]]=i[a][1];break;case 17:this.$=i[a-2],void 0!==i[a-2][i[a][0]]&&(this.$.__duplicateProperties__||Object.defineProperty(this.$,"__duplicateProperties__",{value:[],enumerable:!1}),this.$.__duplicateProperties__.push(i[a][0])),i[a-2][i[a][0]]=i[a][1];break;case 18:this.$=[],Object.defineProperty(this.$,"__line__",{value:this._$.first_line,enumerable:!1});break;case 20:this.$=[i[a]];break;case 21:this.$=i[a-2],i[a-2].push(i[a])}},table:[{3:5,4:n,5:6,6:r,7:3,8:o,9:4,10:i,11:s,12:1,13:2,15:7,16:8,17:a,23:u},{1:[3]},{14:[1,16]},t(c,[2,7]),t(c,[2,8]),t(c,[2,9]),t(c,[2,10]),t(c,[2,11]),t(c,[2,12]),t(c,[2,3]),t(c,[2,4]),t(c,[2,5]),t([14,18,21,22,24],[2,1]),t(c,[2,2]),{3:20,4:n,18:[1,17],19:18,20:19},{3:5,4:n,5:6,6:r,7:3,8:o,9:4,10:i,11:s,13:23,15:7,16:8,17:a,23:u,24:[1,21],25:22},{1:[2,6]},t(c,[2,13]),{18:[1,24],22:[1,25]},t(l,[2,16]),{21:[1,26]},t(c,[2,18]),{22:[1,28],24:[1,27]},t(p,[2,20]),t(c,[2,14]),{3:20,4:n,20:29},{3:5,4:n,5:6,6:r,7:3,8:o,9:4,10:i,11:s,13:30,15:7,16:8,17:a,23:u},t(c,[2,19]),{3:5,4:n,5:6,6:r,7:3,8:o,9:4,10:i,11:s,13:31,15:7,16:8,17:a,23:u},t(l,[2,17]),t(l,[2,15]),t(p,[2,21])],defaultActions:{16:[2,6]},parseError:function(e,t){function n(e,t){this.message=e,this.hash=t}if(!t.recoverable)throw n.prototype=Error,new n(e,t);this.trace(e)},parse:function(e){var t=this,n=[0],r=[null],o=[],i=this.table,s="",a=0,u=0,c=0,l=2,p=1,f=o.slice.call(arguments,1),d=Object.create(this.lexer),h={yy:{}};for(var y in this.yy)Object.prototype.hasOwnProperty.call(this.yy,y)&&(h.yy[y]=this.yy[y]);d.setInput(e,h.yy),h.yy.lexer=d,h.yy.parser=this,"undefined"==typeof d.yylloc&&(d.yylloc={});var g=d.yylloc;o.push(g);var m=d.options&&d.options.ranges;"function"==typeof h.yy.parseError?this.parseError=h.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;for(var _,v,b,E,T,O,x,I,S,L=function(){var e;return e=d.lex()||p,"number"!=typeof e&&(e=t.symbols_[e]||e),e},N={};;){if(b=n[n.length-1],this.defaultActions[b]?E=this.defaultActions[b]:(null!==_&&"undefined"!=typeof _||(_=L()),E=i[b]&&i[b][_]),"undefined"==typeof E||!E.length||!E[0]){var C="";S=[];for(O in i[b])this.terminals_[O]&&O>l&&S.push("'"+this.terminals_[O]+"'");C=d.showPosition?"Parse error on line "+(a+1)+":\n"+d.showPosition()+"\nExpecting "+S.join(", ")+", got '"+(this.terminals_[_]||_)+"'":"Parse error on line "+(a+1)+": Unexpected "+(_==p?"end of input":"'"+(this.terminals_[_]||_)+"'"),this.parseError(C,{text:d.match,token:this.terminals_[_]||_,line:d.yylineno,loc:g,expected:S})}if(E[0]instanceof Array&&E.length>1)throw new Error("Parse Error: multiple actions possible at state: "+b+", token: "+_);switch(E[0]){case 1:n.push(_),r.push(d.yytext),o.push(d.yylloc),n.push(E[1]),_=null,v?(_=v,v=null):(u=d.yyleng,s=d.yytext,a=d.yylineno,g=d.yylloc,c>0&&c--);break;case 2:if(x=this.productions_[E[1]][1],N.$=r[r.length-x],N._$={first_line:o[o.length-(x||1)].first_line,last_line:o[o.length-1].last_line,first_column:o[o.length-(x||1)].first_column,last_column:o[o.length-1].last_column},m&&(N._$.range=[o[o.length-(x||1)].range[0],o[o.length-1].range[1]]),T=this.performAction.apply(N,[s,u,a,h.yy,E[1],r,o].concat(f)),"undefined"!=typeof T)return T;x&&(n=n.slice(0,-1*x*2),r=r.slice(0,-1*x),o=o.slice(0,-1*x)),n.push(this.productions_[E[1]][0]),r.push(N.$),o.push(N._$),I=i[n[n.length-2]][n[n.length-1]],n.push(I);break;case 3:return!0}}return!0}},d=function(){var e={EOF:1,parseError:function(e,t){if(!this.yy.parser)throw new Error(e);this.yy.parser.parseError(e,t)},setInput:function(e,t){return this.yy=t||this.yy||{},this._input=e,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var e=this._input[0];this.yytext+=e,this.yyleng++,this.offset++,this.match+=e,this.matched+=e;var t=e.match(/(?:\r\n?|\n).*/g);return t?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),e},unput:function(e){var t=e.length,n=e.split(/(?:\r\n?|\n)/g);this._input=e+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-t),this.offset-=t;var r=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var o=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===r.length?this.yylloc.first_column:0)+r[r.length-n.length].length-n[0].length:this.yylloc.first_column-t},this.options.ranges&&(this.yylloc.range=[o[0],o[0]+this.yyleng-t]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},less:function(e){this.unput(this.match.slice(e))},pastInput:function(){var e=this.matched.substr(0,this.matched.length-this.match.length);return(e.length>20?"...":"")+e.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var e=this.match;return e.length<20&&(e+=this._input.substr(0,20-e.length)),(e.substr(0,20)+(e.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var e=this.pastInput(),t=new Array(e.length+1).join("-");return e+this.upcomingInput()+"\n"+t+"^"},test_match:function(e,t){var n,r,o;if(this.options.backtrack_lexer&&(o={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(o.yylloc.range=this.yylloc.range.slice(0))),r=e[0].match(/(?:\r\n?|\n).*/g),r&&(this.yylineno+=r.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:r?r[r.length-1].length-r[r.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+e[0].length},this.yytext+=e[0],this.match+=e[0],this.matches=e,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(e[0].length),this.matched+=e[0],n=this.performAction.call(this,this.yy,this,t,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var i in o)this[i]=o[i];return!1}return!1},next:function(){if(this.done)return this.EOF;this._input||(this.done=!0);var e,t,n,r;this._more||(this.yytext="",this.match="");for(var o=this._currentRules(),i=0;it[0].length)){if(t=n,r=i,this.options.backtrack_lexer){if(e=this.test_match(n,o[i]),e!==!1)return e;if(this._backtrack){t=!1;continue}return!1}if(!this.options.flex)break}return t?(e=this.test_match(t,o[r]),e!==!1&&e):""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var e=this.next();return e?e:this.lex()},begin:function(e){this.conditionStack.push(e)},popState:function(){var e=this.conditionStack.length-1;return e>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(e){return e=this.conditionStack.length-1-Math.abs(e||0),e>=0?this.conditionStack[e]:"INITIAL"},pushState:function(e){this.begin(e)},stateStackSize:function(){return this.conditionStack.length},options:{},performAction:function(e,t,n,r){switch(n){case 0:break;case 1:return 6;case 2:return t.yytext=t.yytext.substr(1,t.yyleng-2),4;case 3:return 17;case 4:return 18;case 5:return 23;case 6:return 24;case 7:return 22;case 8:return 21;case 9:return 10;case 10:return 11;case 11:return 8;case 12:return 14;case 13:return"INVALID"}},rules:[/^(?:\s+)/,/^(?:(-?([0-9]|[1-9][0-9]+))(\.[0-9]+)?([eE][-+]?[0-9]+)?\b)/,/^(?:"(?:\\[\\"bfnrt\/]|\\u[a-fA-F0-9]{4}|[^\\\0-\x09\x0a-\x1f"])*")/,/^(?:\{)/,/^(?:\})/,/^(?:\[)/,/^(?:\])/,/^(?:,)/,/^(?::)/,/^(?:true\b)/,/^(?:false\b)/,/^(?:null\b)/,/^(?:$)/,/^(?:.)/],conditions:{INITIAL:{rules:[0,1,2,3,4,5,6,7,8,9,10,11,12,13],inclusive:!0}}};return e}();return f.lexer=d,e.prototype=f,f.Parser=e,new e}();"undefined"!=typeof e&&"undefined"!=typeof n&&(n.parser=o,n.Parser=o.Parser,n.parse=function(){return o.parse.apply(o,arguments)},n.main=function(t){t[1]||(console.log("Usage: "+t[0]+" FILE"),r.exit(1));var o=e("fs").readFileSync(e("path").normalize(t[1]),"utf8");return n.parser.parse(o)},"undefined"!=typeof t&&e.main===t&&n.main(r.argv.slice(1)))}).call(this,e("_process"))},{_process:4,fs:2,path:3}],19:[function(e,t,n){var r=t.exports=function(e,t){if(t||(t=16),void 0===e&&(e=128),e<=0)return"0";for(var n=Math.log(Math.pow(2,e))/Math.log(t),o=2;n===1/0;o*=2)n=Math.log(Math.pow(2,e/o))/Math.log(t)*o;for(var i=n-Math.floor(n),s="",o=0;o=Math.pow(2,e)?r(e,t):s};r.rack=function(e,t,n){var o=function(o){var s=0;do{if(s++>10){if(!n)throw new Error("too many ID collisions, use more bits"); +e+=n}var a=r(e,t)}while(Object.hasOwnProperty.call(i,a));return i[a]=o,a},i=o.hats={};return o.get=function(e){return o.hats[e]},o.set=function(e,t){return o.hats[e]=t,o},o.bits=e||128,o.base=t||16,o}},{}],20:[function(e,t,n){(function(e){function r(e,t){for(var n=-1,r=e?e.length:0;++n-1}function T(e,t){var n=this.__data__,r=U(n,e);return r<0?n.push([e,t]):n[r][1]=t,this}function O(e){var t=-1,n=e?e.length:0;for(this.clear();++tu))return!1;var l=s.get(e);if(l&&s.get(t))return l==t;var p=-1,f=!0,d=i&he?new C:void 0;for(s.set(e,t),s.set(t,e);++p-1&&e%1==0&&e-1&&e%1==0&&e<=ge}function ce(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}function le(e){return!!e&&"object"==typeof e}function pe(e){return oe(e)?D(e):q(e)}var fe=200,de="__lodash_hash_undefined__",he=1,ye=2,ge=9007199254740991,me="[object Arguments]",_e="[object Array]",ve="[object Boolean]",be="[object Date]",Ee="[object Error]",Te="[object Function]",Oe="[object GeneratorFunction]",xe="[object Map]",Ie="[object Number]",Se="[object Object]",Le="[object Promise]",Ne="[object RegExp]",Ce="[object Set]",Ae="[object String]",Me="[object Symbol]",we="[object WeakMap]",Pe="[object ArrayBuffer]",je="[object DataView]",ke="[object Float32Array]",Re="[object Float64Array]",Fe="[object Int8Array]",De="[object Int16Array]",Ue="[object Int32Array]",Ge="[object Uint8Array]",$e="[object Uint8ClampedArray]",Be="[object Uint16Array]",Ve="[object Uint32Array]",Je=/[\\^$.*+?()[\]{}|]/g,qe=/^\[object .+?Constructor\]$/,Ye=/^(?:0|[1-9]\d*)$/,ze={};ze[ke]=ze[Re]=ze[Fe]=ze[De]=ze[Ue]=ze[Ge]=ze[$e]=ze[Be]=ze[Ve]=!0,ze[me]=ze[_e]=ze[Pe]=ze[ve]=ze[je]=ze[be]=ze[Ee]=ze[Te]=ze[xe]=ze[Ie]=ze[Se]=ze[Ne]=ze[Ce]=ze[Ae]=ze[we]=!1;var Xe="object"==typeof e&&e&&e.Object===Object&&e,We="object"==typeof self&&self&&self.Object===Object&&self,He=Xe||We||Function("return this")(),Ke="object"==typeof n&&n&&!n.nodeType&&n,Ze=Ke&&"object"==typeof t&&t&&!t.nodeType&&t,Qe=Ze&&Ze.exports===Ke,et=Qe&&Xe.process,tt=function(){try{return et&&et.binding("util")}catch(e){}}(),nt=tt&&tt.isTypedArray,rt=Array.prototype,ot=Function.prototype,it=Object.prototype,st=He["__core-js_shared__"],at=function(){var e=/[^.]+$/.exec(st&&st.keys&&st.keys.IE_PROTO||"");return e?"Symbol(src)_1."+e:""}(),ut=ot.toString,ct=it.hasOwnProperty,lt=it.toString,pt=RegExp("^"+ut.call(ct).replace(Je,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),ft=He.Symbol,dt=He.Uint8Array,ht=it.propertyIsEnumerable,yt=rt.splice,gt=c(Object.keys,Object),mt=H(He,"DataView"),_t=H(He,"Map"),vt=H(He,"Promise"),bt=H(He,"Set"),Et=H(He,"WeakMap"),Tt=H(Object,"create"),Ot=te(mt),xt=te(_t),It=te(vt),St=te(bt),Lt=te(Et),Nt=ft?ft.prototype:void 0,Ct=Nt?Nt.valueOf:void 0;p.prototype.clear=f,p.prototype.delete=d,p.prototype.get=h,p.prototype.has=y,p.prototype.set=g,m.prototype.clear=_,m.prototype.delete=v,m.prototype.get=b,m.prototype.has=E,m.prototype.set=T,O.prototype.clear=x,O.prototype.delete=I,O.prototype.get=S,O.prototype.has=L,O.prototype.set=N,C.prototype.add=C.prototype.push=A,C.prototype.has=M,w.prototype.clear=P,w.prototype.delete=j,w.prototype.get=k,w.prototype.has=R,w.prototype.set=F;var At=G;(mt&&At(new mt(new ArrayBuffer(1)))!=je||_t&&At(new _t)!=xe||vt&&At(vt.resolve())!=Le||bt&&At(new bt)!=Ce||Et&&At(new Et)!=we)&&(At=function(e){var t=lt.call(e),n=t==Se?e.constructor:void 0,r=n?te(n):void 0;if(r)switch(r){case Ot:return je;case xt:return xe;case It:return Le;case St:return Ce;case Lt:return we}return t});var Mt=Array.isArray,wt=nt?i(nt):J;t.exports=se}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],21:[function(e,t,n){"use strict";function r(e,t){this.x=e,this.y=t}t.exports=r,r.prototype={clone:function(){return new r(this.x,this.y)},add:function(e){return this.clone()._add(e)},sub:function(e){return this.clone()._sub(e)},mult:function(e){return this.clone()._mult(e)},div:function(e){return this.clone()._div(e)},rotate:function(e){return this.clone()._rotate(e)},matMult:function(e){return this.clone()._matMult(e)},unit:function(){return this.clone()._unit()},perp:function(){return this.clone()._perp()},round:function(){return this.clone()._round()},mag:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},equals:function(e){return this.x===e.x&&this.y===e.y},dist:function(e){return Math.sqrt(this.distSqr(e))},distSqr:function(e){var t=e.x-this.x,n=e.y-this.y;return t*t+n*n},angle:function(){return Math.atan2(this.y,this.x)},angleTo:function(e){return Math.atan2(this.y-e.y,this.x-e.x)},angleWith:function(e){return this.angleWithSep(e.x,e.y)},angleWithSep:function(e,t){return Math.atan2(this.x*t-this.y*e,this.x*e+this.y*t)},_matMult:function(e){var t=e[0]*this.x+e[1]*this.y,n=e[2]*this.x+e[3]*this.y;return this.x=t,this.y=n,this},_add:function(e){return this.x+=e.x,this.y+=e.y,this},_sub:function(e){return this.x-=e.x,this.y-=e.y,this},_mult:function(e){return this.x*=e,this.y*=e,this},_div:function(e){return this.x/=e,this.y/=e,this},_unit:function(){return this._div(this.mag()),this},_perp:function(){var e=this.y;return this.y=this.x,this.x=-e,this},_rotate:function(e){var t=Math.cos(e),n=Math.sin(e),r=t*this.x-n*this.y,o=n*this.x+t*this.y;return this.x=r,this.y=o,this},_round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}},r.convert=function(e){return e instanceof r?e:Array.isArray(e)?new r(e[0],e[1]):e}},{}],22:[function(e,t,n){function r(){for(var e={},t=0;t1&&void 0!==arguments[1]?arguments[1]:{};return n===c.modes.SIMPLE_SELECT&&t.getMode()===c.modes.SIMPLE_SELECT?a(r.featureIds||[],e.store.getSelectedIds())?t:(e.store.setSelected(r.featureIds,{silent:!0}),e.store.render(),t):n===c.modes.DIRECT_SELECT&&t.getMode()===c.modes.DIRECT_SELECT&&r.featureId===e.store.getSelectedIds()[0]?t:(e.events.changeMode(n,r,{silent:!0}),t)},t.getMode=function(){return e.events.getMode()},t.trash=function(){return e.events.trash({silent:!0}),t},t.combineFeatures=function(){return e.events.combineFeatures({silent:!0}),t},t.uncombineFeatures=function(){return e.events.uncombineFeatures({silent:!0}),t},t.setFeatureProperty=function(n,r,o){return e.store.setFeatureProperty(n,r,o),t},t}},{"./constants":24,"./feature_types/line_string":27,"./feature_types/multi_feature":28,"./feature_types/point":29,"./feature_types/polygon":30,"./lib/features_at":38,"./lib/string_set":47,"./lib/string_sets_are_equal":48,"geojson-normalize":14,geojsonhint:15,hat:19,"lodash.isequal":20}],24:[function(e,t,n){"use strict";t.exports={classes:{CONTROL_BASE:"mapboxgl-ctrl",CONTROL_PREFIX:"mapboxgl-ctrl-",CONTROL_BUTTON:"mapbox-gl-draw_ctrl-draw-btn",CONTROL_BUTTON_LINE:"mapbox-gl-draw_line",CONTROL_BUTTON_POLYGON:"mapbox-gl-draw_polygon",CONTROL_BUTTON_POINT:"mapbox-gl-draw_point",CONTROL_BUTTON_TRASH:"mapbox-gl-draw_trash",CONTROL_BUTTON_COMBINE_FEATURES:"mapbox-gl-draw_combine",CONTROL_BUTTON_UNCOMBINE_FEATURES:"mapbox-gl-draw_uncombine",CONTROL_GROUP:"mapboxgl-ctrl-group",ATTRIBUTION:"mapboxgl-ctrl-attrib",ACTIVE_BUTTON:"active",BOX_SELECT:"mapbox-gl-draw_boxselect"},sources:{HOT:"mapbox-gl-draw-hot",COLD:"mapbox-gl-draw-cold"},cursors:{ADD:"add",MOVE:"move",DRAG:"drag",POINTER:"pointer",NONE:"none"},types:{POLYGON:"polygon",LINE:"line_string",POINT:"point"},geojsonTypes:{FEATURE:"Feature",POLYGON:"Polygon",LINE_STRING:"LineString",POINT:"Point",FEATURE_COLLECTION:"FeatureCollection",MULTI_PREFIX:"Multi",MULTI_POINT:"MultiPoint",MULTI_LINE_STRING:"MultiLineString",MULTI_POLYGON:"MultiPolygon"},modes:{DRAW_LINE_STRING:"draw_line_string",DRAW_POLYGON:"draw_polygon",DRAW_POINT:"draw_point",SIMPLE_SELECT:"simple_select",DIRECT_SELECT:"direct_select",STATIC:"static"},events:{CREATE:"draw.create",DELETE:"draw.delete",UPDATE:"draw.update",SELECTION_CHANGE:"draw.selectionchange",MODE_CHANGE:"draw.modechange",ACTIONABLE:"draw.actionable",RENDER:"draw.render",COMBINE_FEATURES:"draw.combine",UNCOMBINE_FEATURES:"draw.uncombine"},updateActions:{MOVE:"move",CHANGE_COORDINATES:"change_coordinates"},meta:{FEATURE:"feature",MIDPOINT:"midpoint",VERTEX:"vertex"},activeStates:{ACTIVE:"true",INACTIVE:"false"},LAT_MIN:-90,LAT_RENDERED_MIN:-85,LAT_MAX:90,LAT_RENDERED_MAX:85,LNG_MIN:-270,LNG_MAX:270}},{}],25:[function(e,t,n){"use strict";function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var o,i=e("./lib/mode_handler"),s=e("./lib/get_features_and_set_cursor"),a=e("./lib/is_click"),u=e("./constants"),c=(o={},r(o,u.modes.SIMPLE_SELECT,e("./modes/simple_select")),r(o,u.modes.DIRECT_SELECT,e("./modes/direct_select")),r(o,u.modes.DRAW_POINT,e("./modes/draw_point")),r(o,u.modes.DRAW_LINE_STRING,e("./modes/draw_line_string")),r(o,u.modes.DRAW_POLYGON,e("./modes/draw_polygon")),r(o,u.modes.STATIC,e("./modes/static")),o);t.exports=function(e){function t(t,n){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};p.stop();var o=c[t];if(void 0===o)throw new Error(t+" is not valid");l=t;var s=o(e,n);p=i(s,e),r.silent||e.map.fire(u.events.MODE_CHANGE,{mode:t}),e.store.setDirty(),e.store.render()}function n(t){var n=!1;Object.keys(t).forEach(function(e){if(void 0===d[e])throw new Error("Invalid action type");d[e]!==t[e]&&(n=!0),d[e]=t[e]}),n&&e.map.fire(u.events.ACTIONABLE,{actions:d})}var r={},o={},l=u.modes.SIMPLE_SELECT,p=i(c.simple_select(e),e);o.drag=function(t){a(r,{point:t.point,time:(new Date).getTime()})?t.originalEvent.stopPropagation():(e.ui.queueMapClasses({mouse:u.cursors.DRAG}),p.drag(t))},o.mousemove=function(t){var n=void 0!==t.originalEvent.buttons?t.originalEvent.buttons:t.originalEvent.which;if(1===n)return o.drag(t);var r=s(t,e);t.featureTarget=r,p.mousemove(t)},o.mousedown=function(t){r={time:(new Date).getTime(),point:t.point};var n=s(t,e);t.featureTarget=n,p.mousedown(t)},o.mouseup=function(t){var n=s(t,e);t.featureTarget=n,a(r,{point:t.point,time:(new Date).getTime()})?p.click(t):p.mouseup(t)},o.mouseout=function(e){p.mouseout(e)};var f=function(e){return!(8===e||46===e||e>=48&&e<=57)};o.keydown=function(n){8!==n.keyCode&&46!==n.keyCode||!e.options.controls.trash?f(n.keyCode)?p.keydown(n):49===n.keyCode&&e.options.controls.point?t(u.modes.DRAW_POINT):50===n.keyCode&&e.options.controls.line_string?t(u.modes.DRAW_LINE_STRING):51===n.keyCode&&e.options.controls.polygon&&t(u.modes.DRAW_POLYGON):(n.preventDefault(),p.trash())},o.keyup=function(e){f(e.keyCode)&&p.keyup(e)},o.zoomend=function(){e.store.changeZoom()},o.data=function(t){"style"===t.dataType&&!function(){var t=e.setup,n=e.map,r=e.options,o=e.store,i=!!r.styles.find(function(e){return n.getLayer(e.id)});i||(t.addLayers(),o.setDirty(),o.render())}()};var d={trash:!1,combineFeatures:!1,uncombineFeatures:!1},h={changeMode:t,actionable:n,currentModeName:function(){return l},currentModeRender:function(e,t){return p.render(e,t)},fire:function(e,t){o[e]&&o[e](t)},addEventListeners:function(){e.map.on("mousemove",o.mousemove),e.map.on("mousedown",o.mousedown),e.map.on("mouseup",o.mouseup),e.map.on("data",o.data),e.container.addEventListener("mouseout",o.mouseout),e.options.keybindings&&(e.container.addEventListener("keydown",o.keydown),e.container.addEventListener("keyup",o.keyup))},removeEventListeners:function(){e.map.off("mousemove",o.mousemove),e.map.off("mousedown",o.mousedown),e.map.off("mouseup",o.mouseup),e.map.off("data",o.data),e.container.removeEventListener("mouseout",o.mouseout),e.options.keybindings&&(e.container.removeEventListener("keydown",o.keydown),e.container.removeEventListener("keyup",o.keyup))},trash:function(e){p.trash(e)},combineFeatures:function(){p.combineFeatures()},uncombineFeatures:function(){p.uncombineFeatures()},getMode:function(){return l}};return h}},{"./constants":24,"./lib/get_features_and_set_cursor":39,"./lib/is_click":40,"./lib/mode_handler":43,"./modes/direct_select":52,"./modes/draw_line_string":53,"./modes/draw_point":54,"./modes/draw_polygon":55,"./modes/simple_select":56,"./modes/static":57}],26:[function(e,t,n){"use strict";var r=e("hat"),o=e("../constants"),i=function(e,t){this.ctx=e,this.properties=t.properties||{},this.coordinates=t.geometry.coordinates,this.id=t.id||r(),this.type=t.geometry.type};i.prototype.changed=function(){this.ctx.store.featureChanged(this.id)},i.prototype.incomingCoords=function(e){this.setCoordinates(e)},i.prototype.setCoordinates=function(e){this.coordinates=e,this.changed()},i.prototype.getCoordinates=function(){return JSON.parse(JSON.stringify(this.coordinates))},i.prototype.setProperty=function(e,t){this.properties[e]=t},i.prototype.toGeoJSON=function(){return JSON.parse(JSON.stringify({id:this.id,type:o.geojsonTypes.FEATURE,properties:this.properties,geometry:{coordinates:this.getCoordinates(),type:this.type}}))},i.prototype.internal=function(e){var t={id:this.id,meta:o.meta.FEATURE,"meta:type":this.type,active:o.activeStates.INACTIVE,mode:e};if(this.ctx.options.userProperties)for(var n in this.properties)t["user_"+n]=this.properties[n];return{type:o.geojsonTypes.FEATURE,properties:t,geometry:{coordinates:this.getCoordinates(),type:this.type}}},t.exports=i},{"../constants":24,hat:19}],27:[function(e,t,n){"use strict";var r=e("./feature"),o=function(e,t){r.call(this,e,t)};o.prototype=Object.create(r.prototype),o.prototype.isValid=function(){return this.coordinates.length>1},o.prototype.addCoordinate=function(e,t,n){this.changed();var r=parseInt(e,10);this.coordinates.splice(r,0,[t,n])},o.prototype.getCoordinate=function(e){var t=parseInt(e,10);return JSON.parse(JSON.stringify(this.coordinates[t]))},o.prototype.removeCoordinate=function(e){this.changed(),this.coordinates.splice(parseInt(e,10),1)},o.prototype.updateCoordinate=function(e,t,n){var r=parseInt(e,10);this.coordinates[r]=[t,n],this.changed()},t.exports=o},{"./feature":26}],28:[function(e,t,n){"use strict";var r=e("./feature"),o=e("../constants"),i=e("hat"),s={MultiPoint:e("./point"),MultiLineString:e("./line_string"),MultiPolygon:e("./polygon")},a=function(e,t,n,r,o){var i=n.split("."),s=parseInt(i[0],10),a=i[1]?i.slice(1).join("."):null;return e[s][t](a,r,o)},u=function(e,t){if(r.call(this,e,t),delete this.coordinates,this.model=s[t.geometry.type],void 0===this.model)throw new TypeError(t.geometry.type+" is not a valid type");this.features=this._coordinatesToFeatures(t.geometry.coordinates)};u.prototype=Object.create(r.prototype),u.prototype._coordinatesToFeatures=function(e){var t=this,n=this.model.bind(this);return e.map(function(e){return new n(t.ctx,{id:i(),type:o.geojsonTypes.FEATURE,properties:{},geometry:{coordinates:e,type:t.type.replace("Multi","")}})})},u.prototype.isValid=function(){return this.features.every(function(e){return e.isValid()})},u.prototype.setCoordinates=function(e){this.features=this._coordinatesToFeatures(e),this.changed()},u.prototype.getCoordinate=function(e){return a(this.features,"getCoordinate",e)},u.prototype.getCoordinates=function(){return JSON.parse(JSON.stringify(this.features.map(function(e){return e.type===o.geojsonTypes.POLYGON?e.getCoordinates():e.coordinates})))},u.prototype.updateCoordinate=function(e,t,n){a(this.features,"updateCoordinate",e,t,n),this.changed()},u.prototype.addCoordinate=function(e,t,n){a(this.features,"addCoordinate",e,t,n),this.changed()},u.prototype.removeCoordinate=function(e){a(this.features,"removeCoordinate",e),this.changed()},u.prototype.getFeatures=function(){return this.features},t.exports=u},{"../constants":24,"./feature":26,"./line_string":27,"./point":29,"./polygon":30,hat:19}],29:[function(e,t,n){"use strict";var r=e("./feature"),o=function(e,t){r.call(this,e,t)};o.prototype=Object.create(r.prototype),o.prototype.isValid=function(){return"number"==typeof this.coordinates[0]&&"number"==typeof this.coordinates[1]},o.prototype.updateCoordinate=function(e,t,n){3===arguments.length?this.coordinates=[t,n]:this.coordinates=[e,t],this.changed()},o.prototype.getCoordinate=function(){return this.getCoordinates()},t.exports=o},{"./feature":26}],30:[function(e,t,n){"use strict";var r=e("./feature"),o=function(e,t){r.call(this,e,t),this.coordinates=this.coordinates.map(function(e){return e.slice(0,-1)})};o.prototype=Object.create(r.prototype),o.prototype.isValid=function(){return 0!==this.coordinates.length&&this.coordinates.every(function(e){return e.length>2})},o.prototype.incomingCoords=function(e){this.coordinates=e.map(function(e){return e.slice(0,-1)}),this.changed()},o.prototype.setCoordinates=function(e){this.coordinates=e,this.changed()},o.prototype.addCoordinate=function(e,t,n){this.changed();var r=e.split(".").map(function(e){return parseInt(e,10)}),o=this.coordinates[r[0]];o.splice(r[1],0,[t,n])},o.prototype.removeCoordinate=function(e){this.changed();var t=e.split(".").map(function(e){return parseInt(e,10)}),n=this.coordinates[t[0]];n&&(n.splice(t[1],1),n.length<3&&this.coordinates.splice(t[0],1))},o.prototype.getCoordinate=function(e){var t=e.split(".").map(function(e){return parseInt(e,10)}),n=this.coordinates[t[0]];return JSON.parse(JSON.stringify(n[t[1]]))},o.prototype.getCoordinates=function(){return this.coordinates.map(function(e){return e.concat([e[0]])})},o.prototype.updateCoordinate=function(e,t,n){this.changed();var r=e.split("."),o=parseInt(r[0],10),i=parseInt(r[1],10);void 0===this.coordinates[o]&&(this.coordinates[o]=[]),this.coordinates[o][i]=[t,n]},t.exports=o},{"./feature":26}],31:[function(e,t,n){"use strict";var r=e("../constants");t.exports={isOfMetaType:function(e){return function(t){var n=t.featureTarget;return!!n&&(!!n.properties&&n.properties.meta===e)}},isShiftMousedown:function(e){return!!e.originalEvent&&(!!e.originalEvent.shiftKey&&0===e.originalEvent.button)},isActiveFeature:function(e){return!!e.featureTarget&&(!!e.featureTarget.properties&&(e.featureTarget.properties.active===r.activeStates.ACTIVE&&e.featureTarget.properties.meta===r.meta.FEATURE))},isInactiveFeature:function(e){return!!e.featureTarget&&(!!e.featureTarget.properties&&(e.featureTarget.properties.active===r.activeStates.INACTIVE&&e.featureTarget.properties.meta===r.meta.FEATURE))},noTarget:function(e){return void 0===e.featureTarget},isFeature:function(e){return!!e.featureTarget&&(!!e.featureTarget.properties&&e.featureTarget.properties.meta===r.meta.FEATURE)},isVertex:function(e){var t=e.featureTarget;return!!t&&(!!t.properties&&t.properties.meta===r.meta.VERTEX)},isShiftDown:function(e){return!!e.originalEvent&&e.originalEvent.shiftKey===!0},isEscapeKey:function(e){return 27===e.keyCode},isEnterKey:function(e){return 13===e.keyCode},true:function(){return!0}}},{"../constants":24}],32:[function(e,t,n){"use strict";var r=e("geojson-extent"),o=e("../constants"),i=o.LAT_MIN,s=o.LAT_MAX,a=o.LAT_RENDERED_MIN,u=o.LAT_RENDERED_MAX,c=o.LNG_MIN,l=o.LNG_MAX;t.exports=function(e,t){var n=i,o=s,p=i,f=s,d=l,h=c;e.forEach(function(e){var t=r(e),i=t[1],s=t[3],a=t[0],u=t[2];i>n&&(n=i),sp&&(p=s),ih&&(h=u)});var y=t;return n+y.lat>u&&(y.lat=u-n),p+y.lat>s&&(y.lat=s-p),o+y.lat=l&&(y.lng-=360*Math.ceil(Math.abs(y.lng)/360)),y}},{"../constants":24,"geojson-extent":7}],33:[function(e,t,n){"use strict";var r=e("../constants");t.exports=function(e,t,n,o){var i=t.geometry.coordinates,s=n.geometry.coordinates;if(i[1]>r.LAT_RENDERED_MAX||i[1]r.LAT_RENDERED_MAX||s[1]1&&void 0!==arguments[1]?arguments[1]:{},c=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,l=e.geometry,p=l.type,f=l.coordinates,d=e.properties&&e.properties.id,h=[];return p===s.geojsonTypes.POINT?h.push(o(d,f,c,n(c))):p===s.geojsonTypes.POLYGON?f.forEach(function(e,n){t(e,null!==c?c+"."+n:String(n))}):p===s.geojsonTypes.LINE_STRING?t(f,c):0===p.indexOf(s.geojsonTypes.MULTI_PREFIX)&&a(),h}var o=e("./create_vertex"),i=e("./create_midpoint"),s=e("../constants");t.exports=r},{"../constants":24,"./create_midpoint":33,"./create_vertex":35}],35:[function(e,t,n){"use strict";var r=e("../constants");t.exports=function(e,t,n,o){return{type:r.geojsonTypes.FEATURE,properties:{meta:r.meta.VERTEX,parent:e,coord_path:n,active:o?r.activeStates.ACTIVE:r.activeStates.INACTIVE},geometry:{type:r.geojsonTypes.POINT,coordinates:t}}}},{"../constants":24}],36:[function(e,t,n){"use strict";t.exports={enable:function(e){setTimeout(function(){e.map&&e.map.doubleClickZoom&&e.map.doubleClickZoom.enable()},0)},disable:function(e){setTimeout(function(){e.map&&e.map.doubleClickZoom&&e.map.doubleClickZoom.disable()},0)}}},{}],37:[function(e,t,n){"use strict";t.exports=function(e,t){var n=e.x-t.x,r=e.y-t.y;return Math.sqrt(n*n+r*r)}},{}],38:[function(e,t,n){"use strict";var r=e("./sort_features"),o=e("./map_event_to_bounding_box"),i=e("../constants"),s=e("./string_set"),a=[i.meta.FEATURE,i.meta.MIDPOINT,i.meta.VERTEX];t.exports=function(e,t,n){if(null===n.map)return[];var i=e?o(e,n.options.clickBuffer):t,u={};n.options.styles&&(u.layers=n.options.styles.map(function(e){return e.id}));var c=n.map.queryRenderedFeatures(i,u).filter(function(e){return a.indexOf(e.properties.meta)!==-1}),l=new s,p=[];return c.forEach(function(e){var t=e.properties.id;l.has(t)||(l.add(t),p.push(e))}),r(p)}},{"../constants":24,"./map_event_to_bounding_box":42,"./sort_features":46,"./string_set":47}],39:[function(e,t,n){"use strict";var r=e("./features_at"),o=e("../constants");t.exports=function(e,t){var n=r(e,null,t),i={mouse:o.cursors.NONE};return n[0]&&(i.mouse=n[0].properties.active===o.activeStates.ACTIVE?o.cursors.MOVE:o.cursors.POINTER,i.feature=n[0].properties.meta),t.events.currentModeName().indexOf("draw")!==-1&&(i.mouse=o.cursors.ADD),t.ui.queueMapClasses(i),t.ui.updateMapClasses(),n[0]}},{"../constants":24,"./features_at":38}],40:[function(e,t,n){"use strict";var r=e("./euclidean_distance"),o=4,i=12,s=500;t.exports=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},a=null!=n.fineTolerance?n.fineTolerance:o,u=null!=n.grossTolerance?n.grossTolerance:i,c=null!=n.interval?n.interval:s;e.point=e.point||t.point,e.time=e.time||t.time;var l=r(e.point,t.point);return l1&&void 0!==arguments[1]?arguments[1]:0;return[[e.point.x-t,e.point.y-t],[e.point.x+t,e.point.y+t]]}t.exports=r},{}],43:[function(e,t,n){"use strict";var r=function(e,t){var n={drag:[],click:[],mousemove:[],mousedown:[],mouseup:[],mouseout:[],keydown:[],keyup:[]},r={on:function(e,t,r){if(void 0===n[e])throw new Error("Invalid event type: "+e);n[e].push({selector:t,fn:r})},render:function(e){t.store.featureChanged(e)}},o=function(e,o){for(var i=n[e],s=i.length;s--;){var a=i[s];if(a.selector(o)){a.fn.call(r,o), +t.store.render(),t.ui.updateMapClasses();break}}};return e.start.call(r),{render:e.render,stop:function(){e.stop&&e.stop()},trash:function(){e.trash&&(e.trash(),t.store.render())},combineFeatures:function(){e.combineFeatures&&e.combineFeatures()},uncombineFeatures:function(){e.uncombineFeatures&&e.uncombineFeatures()},drag:function(e){o("drag",e)},click:function(e){o("click",e)},mousemove:function(e){o("mousemove",e)},mousedown:function(e){o("mousedown",e)},mouseup:function(e){o("mouseup",e)},mouseout:function(e){o("mouseout",e)},keydown:function(e){o("keydown",e)},keyup:function(e){o("keyup",e)}}};t.exports=r},{}],44:[function(e,t,n){"use strict";function r(e,t){var n=t.getBoundingClientRect();return new o(e.clientX-n.left-t.clientLeft,e.clientY-n.top-t.clientTop)}var o=e("point-geometry");t.exports=r},{"point-geometry":21}],45:[function(e,t,n){"use strict";var r=e("./constrain_feature_movement"),o=e("../constants");t.exports=function(e,t){var n=r(e.map(function(e){return e.toGeoJSON()}),t);e.forEach(function(e){var t=e.getCoordinates(),r=function(e){var t={lng:e[0]+n.lng,lat:e[1]+n.lat};return[t.lng,t.lat]},i=function(e){return e.map(function(e){return r(e)})},s=function(e){return e.map(function(e){return i(e)})},a=void 0;e.type===o.geojsonTypes.POINT?a=r(t):e.type===o.geojsonTypes.LINE_STRING||e.type===o.geojsonTypes.MULTI_POINT?a=t.map(r):e.type===o.geojsonTypes.POLYGON||e.type===o.geojsonTypes.MULTI_LINE_STRING?a=t.map(i):e.type===o.geojsonTypes.MULTI_POLYGON&&(a=t.map(s)),e.incomingCoords(a)})}},{"../constants":24,"./constrain_feature_movement":32}],46:[function(e,t,n){"use strict";function r(e,t){var n=a[e.geometry.type]-a[t.geometry.type];return 0===n&&e.geometry.type===s.geojsonTypes.POLYGON?e.area-t.area:n}function o(e){return e.map(function(e){return e.geometry.type===s.geojsonTypes.POLYGON&&(e.area=i.geometry({type:s.geojsonTypes.FEATURE,property:{},geometry:e.geometry})),e}).sort(r).map(function(e){return delete e.area,e})}var i=e("geojson-area"),s=e("../constants"),a={Point:0,LineString:1,Polygon:2};t.exports=o},{"../constants":24,"geojson-area":5}],47:[function(e,t,n){"use strict";function r(e){if(this._items={},this._length=e?e.length:0,e)for(var t=0,n=e.length;t0})},E=function(t){e.map.dragPan.disable(),m=!0,i=t.lngLat},T=function(){e.map.dragPan.enable(),g=!1,m=!1,i=null},O=function(e){E(e);var t=e.featureTarget.properties,n=_.indexOf(t.coord_path);a(e)||n!==-1?a(e)&&n===-1&&_.push(t.coord_path):_=[t.coord_path],r.changed()},x=function(e){E(e);var t=e.featureTarget.properties;r.addCoordinate(t.coord_path,t.lng,t.lat),v(),_=[t.coord_path]},I=function(e){0===_.length?E(e):T()},S=function(t,n){d(e.store.getSelected(),n),i=t.lngLat},L=function(e,t){for(var n=_.map(function(e){return r.getCoordinate(e)}),o=n.map(function(e){return{type:p.geojsonTypes.FEATURE,properties:{},geometry:{type:p.geojsonTypes.POINT,coordinates:e}}}),i=c(o,t),s=0;s0?L(e,t):S(e,t),i=e.lngLat}),this.on("click",f.true,T),this.on("mouseup",f.true,function(){g&&v(),T()}),this.on("click",o,function(){e.events.changeMode(p.modes.SIMPLE_SELECT)}),this.on("click",s,function(){e.events.changeMode(p.modes.SIMPLE_SELECT)}),this.on("click",f.isActiveFeature,function(){_=[],r.changed()})},stop:function(){l.enable(e)},render:function(t,r){n===t.properties.id?(t.properties.active=p.activeStates.ACTIVE,r(t),u(t,{map:e.map,midpoints:!0,selectedPaths:_}).forEach(r)):(t.properties.active=p.activeStates.INACTIVE,r(t)),b()},trash:function(){_.sort().reverse().forEach(function(e){return r.removeCoordinate(e)}),e.map.fire(p.events.UPDATE,{action:p.updateActions.CHANGE_COORDINATES,features:e.store.getSelected().map(function(e){return e.toGeoJSON()})}),_=[],b(),r.isValid()===!1&&(e.store.delete([n]),e.events.changeMode(p.modes.SIMPLE_SELECT,{}))}}}},{"../constants":24,"../lib/common_selectors":31,"../lib/constrain_feature_movement":32,"../lib/create_supplementary_points":34,"../lib/double_click_zoom":36,"../lib/move_features":45}],53:[function(e,t,n){"use strict";var r=e("../lib/common_selectors"),o=e("../feature_types/line_string"),i=e("../lib/is_event_at_coordinates"),s=e("../lib/double_click_zoom"),a=e("../constants"),u=e("../lib/create_vertex");t.exports=function(e){var t=new o(e,{type:a.geojsonTypes.FEATURE,properties:{},geometry:{type:a.geojsonTypes.LINE_STRING,coordinates:[]}}),n=0;return e._test&&(e._test.line=t),e.store.add(t),{start:function(){e.store.clearSelected(),s.disable(e),e.ui.queueMapClasses({mouse:a.cursors.ADD}),e.ui.setActiveButton(a.types.LINE),this.on("mousemove",r.true,function(o){t.updateCoordinate(n,o.lngLat.lng,o.lngLat.lat),r.isVertex(o)&&e.ui.queueMapClasses({mouse:a.cursors.POINTER})}),this.on("click",r.true,function(r){return n>0&&i(r,t.coordinates[n-1])?e.events.changeMode(a.modes.SIMPLE_SELECT,{featureIds:[t.id]}):(e.ui.queueMapClasses({mouse:a.cursors.ADD}),t.updateCoordinate(n,r.lngLat.lng,r.lngLat.lat),void n++)}),this.on("click",r.isVertex,function(){return e.events.changeMode(a.modes.SIMPLE_SELECT,{featureIds:[t.id]})}),this.on("keyup",r.isEscapeKey,function(){e.store.delete([t.id],{silent:!0}),e.events.changeMode(a.modes.SIMPLE_SELECT)}),this.on("keyup",r.isEnterKey,function(){e.events.changeMode(a.modes.SIMPLE_SELECT,{featureIds:[t.id]})}),e.events.actionable({combineFeatures:!1,uncombineFeatures:!1,trash:!0})},stop:function(){s.enable(e),e.ui.setActiveButton(),void 0!==e.store.get(t.id)&&(t.removeCoordinate(""+n),t.isValid()?e.map.fire(a.events.CREATE,{features:[t.toGeoJSON()]}):(e.store.delete([t.id],{silent:!0}),e.events.changeMode(a.modes.SIMPLE_SELECT,{},{silent:!0})))},render:function(e,n){var r=e.properties.id===t.id;return e.properties.active=r?a.activeStates.ACTIVE:a.activeStates.INACTIVE,r?void(e.geometry.coordinates.length<2||(e.properties.meta=a.meta.FEATURE,e.geometry.coordinates.length>=3&&n(u(t.id,e.geometry.coordinates[e.geometry.coordinates.length-2],""+(e.geometry.coordinates.length-2),!1)),n(e))):n(e)},trash:function(){e.store.delete([t.id],{silent:!0}),e.events.changeMode(a.modes.SIMPLE_SELECT)}}}},{"../constants":24,"../feature_types/line_string":27,"../lib/common_selectors":31,"../lib/create_vertex":35,"../lib/double_click_zoom":36,"../lib/is_event_at_coordinates":41}],54:[function(e,t,n){"use strict";var r=e("../lib/common_selectors"),o=e("../feature_types/point"),i=e("../constants");t.exports=function(e){function t(){e.events.changeMode(i.modes.SIMPLE_SELECT),e.store.delete([s.id],{silent:!0})}function n(t){e.ui.queueMapClasses({mouse:i.cursors.MOVE}),s.updateCoordinate("",t.lngLat.lng,t.lngLat.lat),e.map.fire(i.events.CREATE,{features:[s.toGeoJSON()]}),e.events.changeMode(i.modes.SIMPLE_SELECT,{featureIds:[s.id]})}var s=new o(e,{type:i.geojsonTypes.FEATURE,properties:{},geometry:{type:i.geojsonTypes.POINT,coordinates:[]}});return e._test&&(e._test.point=s),e.store.add(s),{start:function(){e.store.clearSelected(),e.ui.queueMapClasses({mouse:i.cursors.ADD}),e.ui.setActiveButton(i.types.POINT),this.on("click",r.true,n),this.on("keyup",r.isEscapeKey,t),this.on("keyup",r.isEnterKey,t),e.events.actionable({combineFeatures:!1,uncombineFeatures:!1,trash:!0})},stop:function(){e.ui.setActiveButton(),s.getCoordinate().length||e.store.delete([s.id],{silent:!0})},render:function(e,t){var n=e.properties.id===s.id;if(e.properties.active=n?i.activeStates.ACTIVE:i.activeStates.INACTIVE,!n)return t(e)},trash:function(){t()}}}},{"../constants":24,"../feature_types/point":29,"../lib/common_selectors":31}],55:[function(e,t,n){"use strict";var r=e("../lib/common_selectors"),o=e("../feature_types/polygon"),i=e("../lib/double_click_zoom"),s=e("../constants"),a=e("../lib/is_event_at_coordinates"),u=e("../lib/create_vertex");t.exports=function(e){var t=new o(e,{type:s.geojsonTypes.FEATURE,properties:{},geometry:{type:s.geojsonTypes.POLYGON,coordinates:[[]]}}),n=0;return e._test&&(e._test.polygon=t),e.store.add(t),{start:function(){e.store.clearSelected(),i.disable(e),e.ui.queueMapClasses({mouse:s.cursors.ADD}),e.ui.setActiveButton(s.types.POLYGON),this.on("mousemove",r.true,function(o){t.updateCoordinate("0."+n,o.lngLat.lng,o.lngLat.lat),r.isVertex(o)&&e.ui.queueMapClasses({mouse:s.cursors.POINTER})}),this.on("click",r.true,function(r){return n>0&&a(r,t.coordinates[0][n-1])?e.events.changeMode(s.modes.SIMPLE_SELECT,{featureIds:[t.id]}):(e.ui.queueMapClasses({mouse:s.cursors.ADD}),t.updateCoordinate("0."+n,r.lngLat.lng,r.lngLat.lat),void n++)}),this.on("click",r.isVertex,function(){return e.events.changeMode(s.modes.SIMPLE_SELECT,{featureIds:[t.id]})}),this.on("keyup",r.isEscapeKey,function(){e.store.delete([t.id],{silent:!0}),e.events.changeMode(s.modes.SIMPLE_SELECT)}),this.on("keyup",r.isEnterKey,function(){e.events.changeMode(s.modes.SIMPLE_SELECT,{featureIds:[t.id]})}),e.events.actionable({combineFeatures:!1,uncombineFeatures:!1,trash:!0})},stop:function(){e.ui.queueMapClasses({mouse:s.cursors.NONE}),i.enable(e),e.ui.setActiveButton(),void 0!==e.store.get(t.id)&&(t.removeCoordinate("0."+n),t.isValid()?e.map.fire(s.events.CREATE,{features:[t.toGeoJSON()]}):(e.store.delete([t.id],{silent:!0}),e.events.changeMode(s.modes.SIMPLE_SELECT,{},{silent:!0})))},render:function(e,n){var r=e.properties.id===t.id;if(e.properties.active=r?s.activeStates.ACTIVE:s.activeStates.INACTIVE,!r)return n(e);if(0!==e.geometry.coordinates.length){var o=e.geometry.coordinates[0].length;if(!(o<3)){if(e.properties.meta=s.meta.FEATURE,o>4){n(u(t.id,e.geometry.coordinates[0][0],"0.0",!1));var i=e.geometry.coordinates[0].length-3;n(u(t.id,e.geometry.coordinates[0][i],"0."+i,!1))}if(o>3)return n(e);var a=[[e.geometry.coordinates[0][0][0],e.geometry.coordinates[0][0][1]],[e.geometry.coordinates[0][1][0],e.geometry.coordinates[0][1][1]]];return n({type:s.geojsonTypes.FEATURE,properties:e.properties,geometry:{coordinates:a,type:s.geojsonTypes.LINE_STRING}})}}},trash:function(){e.store.delete([t.id],{silent:!0}),e.events.changeMode(s.modes.SIMPLE_SELECT)}}}},{"../constants":24,"../feature_types/polygon":30,"../lib/common_selectors":31,"../lib/create_vertex":35,"../lib/double_click_zoom":36,"../lib/is_event_at_coordinates":41}],56:[function(e,t,n){"use strict";var r=e("../lib/common_selectors"),o=e("../lib/mouse_event_point"),i=e("../lib/features_at"),s=e("../lib/create_supplementary_points"),a=e("../lib/string_set"),u=e("../lib/double_click_zoom"),c=e("../lib/move_features"),l=e("../constants"),p=e("../feature_types/multi_feature");t.exports=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=null,f=null,d=void 0,h=!1,y=!1,g=!1,m=!1,_=t.featureIds||[],v=function(){e.map.fire(l.events.UPDATE,{action:l.updateActions.MOVE,features:e.store.getSelected().map(function(e){return e.toGeoJSON()})})},b=function(){var t=e.store.getSelected(),n=t.filter(function(e){return e instanceof p}),r=!1;t.length>1&&!function(){r=!0;var e=t[0].type.replace("Multi","");t.forEach(function(t){t.type.replace("Multi","")!==e&&(r=!1)})}();var o=n.length>0,i=t.length>0;e.events.actionable({combineFeatures:r,uncombineFeatures:o,trash:i})},E=function(e){if(!e.length)return[];var t=e.map(function(e){return e.properties.id}).filter(function(e){return void 0!==e}).reduce(function(e,t){return e.add(t),e},new a);return t.values()},T=function(){d&&(d.parentNode&&d.parentNode.removeChild(d),d=null),e.map.dragPan.enable(),h=!1,y=!1,g=!1,m=!1};return{stop:function(){u.enable(e)},start:function(){e.store&&(e.store.setSelected(_.filter(function(t){return void 0!==e.store.get(t)})),b()),this.on("mouseup",r.true,T),this.on("mousemove",r.true,T),this.on("mouseout",function(){return g},v),this.on("click",r.noTarget,function(){var t=this,n=e.store.getSelectedIds();n.length&&(e.store.clearSelected(),n.forEach(function(e){return t.render(e)})),u.enable(e),T()}),this.on("click",r.isOfMetaType(l.meta.VERTEX),function(t){e.events.changeMode(l.modes.DIRECT_SELECT,{featureId:t.featureTarget.properties.parent,coordPath:t.featureTarget.properties.coord_path,startPos:t.lngLat}),e.ui.queueMapClasses({mouse:l.cursors.MOVE})}),this.on("mousedown",r.isActiveFeature,function(t){T(),e.map.dragPan.disable(),this.render(t.featureTarget.properties.id),m=!0,n=t.lngLat}),this.on("click",r.isFeature,function(t){u.disable(e),T();var n=r.isShiftDown(t),o=e.store.getSelectedIds(),i=t.featureTarget.properties.id,s=e.store.isSelected(i);return!n&&s&&e.store.get(i).type!==l.geojsonTypes.POINT?e.events.changeMode(l.modes.DIRECT_SELECT,{featureId:i}):(s&&n?(e.store.deselect(i),e.ui.queueMapClasses({mouse:l.cursors.POINTER}),1===o.length&&u.enable(e)):!s&&n?(e.store.select(i),e.ui.queueMapClasses({mouse:l.cursors.MOVE})):s||n||(o.forEach(this.render),e.store.setSelected(i),e.ui.queueMapClasses({mouse:l.cursors.MOVE})),void this.render(i))}),this.on("drag",function(){return m},function(t){g=!0,t.originalEvent.stopPropagation();var r={lng:t.lngLat.lng-n.lng,lat:t.lngLat.lat-n.lat};c(e.store.getSelected(),r),n=t.lngLat}),this.on("mouseup",r.true,function(t){if(g)v();else if(h){var n=[f,o(t.originalEvent,e.container)],r=i(null,n,e),s=E(r).filter(function(t){return!e.store.isSelected(t)});s.length&&(e.store.select(s),s.forEach(this.render),e.ui.queueMapClasses({mouse:l.cursors.MOVE}))}T()}),e.options.boxSelect&&(this.on("mousedown",r.isShiftMousedown,function(t){T(),e.map.dragPan.disable(),f=o(t.originalEvent,e.container),y=!0}),this.on("drag",function(){return y},function(t){h=!0,e.ui.queueMapClasses({mouse:l.cursors.ADD}),d||(d=document.createElement("div"),d.classList.add(l.classes.BOX_SELECT),e.container.appendChild(d));var n=o(t.originalEvent,e.container),r=Math.min(f.x,n.x),i=Math.max(f.x,n.x),s=Math.min(f.y,n.y),a=Math.max(f.y,n.y),u="translate("+r+"px, "+s+"px)";d.style.transform=u,d.style.WebkitTransform=u,d.style.width=i-r+"px",d.style.height=a-s+"px"}))},render:function(t,n){t.properties.active=e.store.isSelected(t.properties.id)?l.activeStates.ACTIVE:l.activeStates.INACTIVE,n(t),b(),t.properties.active===l.activeStates.ACTIVE&&t.geometry.type!==l.geojsonTypes.POINT&&s(t).forEach(n)},trash:function(){e.store.delete(e.store.getSelectedIds()),b()},combineFeatures:function(){var t=e.store.getSelected();if(!(0===t.length||t.length<2)){for(var n=[],r=[],o=t[0].type.replace("Multi",""),i=0;i1){var a=new p(e,{type:l.geojsonTypes.FEATURE,properties:r[0].properties,geometry:{type:"Multi"+o,coordinates:n}});e.store.add(a),e.store.delete(e.store.getSelectedIds(),{silent:!0}),e.store.setSelected([a.id]),e.map.fire(l.events.COMBINE_FEATURES,{createdFeatures:[a.toGeoJSON()],deletedFeatures:r})}b()}},uncombineFeatures:function(){var t=e.store.getSelected();if(0!==t.length){for(var n=[],r=[],o=function(o){var i=t[o];i instanceof p&&(i.getFeatures().forEach(function(t){e.store.add(t),t.properties=i.properties,n.push(t.toGeoJSON()),e.store.select([t.id])}),e.store.delete(i.id,{silent:!0}),r.push(i.toGeoJSON()))},i=0;i1&&e.map.fire(l.events.UNCOMBINE_FEATURES,{createdFeatures:n,deletedFeatures:r}),b()}}}}},{"../constants":24,"../feature_types/multi_feature":28,"../lib/common_selectors":31,"../lib/create_supplementary_points":34,"../lib/double_click_zoom":36,"../lib/features_at":38,"../lib/mouse_event_point":44,"../lib/move_features":45,"../lib/string_set":47}],57:[function(e,t,n){"use strict";t.exports=function(e){return{stop:function(){},start:function(){e.events.actionable({combineFeatures:!1,uncombineFeatures:!1,trash:!1})},render:function(e,t){t(e)}}}},{}],58:[function(e,t,n){"use strict";function r(e,t){return e.map(function(e){return e.source?e:o(e,{id:e.id+"."+t,source:"hot"===t?i.sources.HOT:i.sources.COLD})})}var o=e("xtend"),i=e("./constants"),s={defaultMode:i.modes.SIMPLE_SELECT,keybindings:!0,clickBuffer:2,boxSelect:!0,displayControlsDefault:!0,styles:e("./lib/theme"),controls:{},userProperties:!1},a={point:!0,line_string:!0,polygon:!0,trash:!0,combine_features:!0,uncombine_features:!0},u={point:!1,line_string:!1,polygon:!1,trash:!1,combine_features:!1,uncombine_features:!1};t.exports=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=o(e);return e.controls||(t.controls={}),e.displayControlsDefault===!1?t.controls=o(u,e.controls):t.controls=o(a,e.controls),t=o(s,t),t.styles=r(t.styles,"cold").concat(r(t.styles,"hot")),t}},{"./constants":24,"./lib/theme":49,xtend:22}],59:[function(e,t,n){"use strict";var r=e("./constants");t.exports=function(){function e(e,t){var r=n.get(e),o=r.internal(i);n.ctx.events.currentModeRender(o,function(e){n.sources[t].push(e)})}function t(){n.isDirty=!1,n.clearChangedIds()}var n=this,o=n.ctx.map&&void 0!==n.ctx.map.getSource(r.sources.HOT);if(!o)return t();var i=n.ctx.events.currentModeName();n.ctx.ui.queueMapClasses({mode:i});var s=[],a=[];n.isDirty?a=n.getAllIds():(s=n.getChangedIds().filter(function(e){return void 0!==n.get(e)}),a=n.sources.hot.filter(function(e){return e.properties.id&&s.indexOf(e.properties.id)===-1&&void 0!==n.get(e.properties.id)}).map(function(e){return e.properties.id})),n.sources.hot=[];var u=n.sources.cold.length;n.sources.cold=n.isDirty?[]:n.sources.cold.filter(function(e){var t=e.properties.id||e.properties.parent;return s.indexOf(t)===-1});var c=u!==n.sources.cold.length||a.length>0;if(s.forEach(function(t){return e(t,"hot")}),a.forEach(function(t){return e(t,"cold")}),c&&n.ctx.map.getSource(r.sources.COLD).setData({type:r.geojsonTypes.FEATURE_COLLECTION,features:n.sources.cold}),n.ctx.map.getSource(r.sources.HOT).setData({type:r.geojsonTypes.FEATURE_COLLECTION,features:n.sources.hot}),n._emitSelectionChange&&(n.ctx.map.fire(r.events.SELECTION_CHANGE,{features:n.getSelected().map(function(e){return e.toGeoJSON()})}),n._emitSelectionChange=!1),n._deletedFeaturesToEmit.length){var l=n._deletedFeaturesToEmit.map(function(e){return e.toGeoJSON()});n._deletedFeaturesToEmit=[],n.ctx.map.fire(r.events.DELETE,{features:l})}n.ctx.map.fire(r.events.RENDER,{}),t()}},{"./constants":24}],60:[function(e,t,n){"use strict";var r=e("./events"),o=e("./store"),i=e("./ui"),s=e("./constants");t.exports=function(e){e.events=r(e),e.map=null,e.container=null,e.store=null,e.ui=i(e);var t=null,n={onRemove:function(){return n.removeLayers(),e.ui.removeButtons(),e.events.removeEventListeners(),e.map=null,e.container=null,e.store=null,t&&t.parentNode&&t.parentNode.removeChild(t),t=null,this},onAdd:function(r){e.map=r,e.container=r.getContainer(),e.store=new o(e),t=e.ui.addButtons(),e.options.boxSelect&&(r.boxZoom.disable(),r.dragPan.disable(),r.dragPan.enable());var i=null,s=function t(){r.off("load",t),clearInterval(i),n.addLayers(),e.events.addEventListeners()};return r.loaded()?s():(r.on("load",s),i=setInterval(function(){r.loaded()&&s()},16)),t},addLayers:function(){e.map.addSource(s.sources.COLD,{data:{type:s.geojsonTypes.FEATURE_COLLECTION,features:[]},type:"geojson"}),e.map.addSource(s.sources.HOT,{data:{type:s.geojsonTypes.FEATURE_COLLECTION,features:[]},type:"geojson"}),e.options.styles.forEach(function(t){e.map.addLayer(t)}),e.store.render()},removeLayers:function(){e.options.styles.forEach(function(t){e.map.removeLayer(t.id)}),e.map.removeSource(s.sources.COLD),e.map.removeSource(s.sources.HOT)}};return e.setup=n,n}},{"./constants":24,"./events":25,"./store":61,"./ui":62}],61:[function(e,t,n){"use strict";var r=e("./lib/throttle"),o=e("./lib/to_dense_array"),i=e("./lib/string_set"),s=e("./render"),a=t.exports=function(e){this._features={},this._featureIds=new i,this._selectedFeatureIds=new i,this._changedFeatureIds=new i,this._deletedFeaturesToEmit=[],this._emitSelectionChange=!1,this.ctx=e,this.sources={hot:[],cold:[]},this.render=r(s,16,this),this.isDirty=!1};a.prototype.createRenderBatch=function(){var e=this,t=this.render,n=0;return this.render=function(){n++},function(){e.render=t,n>0&&e.render()}},a.prototype.setDirty=function(){return this.isDirty=!0,this},a.prototype.featureChanged=function(e){return this._changedFeatureIds.add(e),this},a.prototype.getChangedIds=function(){return this._changedFeatureIds.values()},a.prototype.clearChangedIds=function(){return this._changedFeatureIds.clear(),this},a.prototype.getAllIds=function(){return this._featureIds.values()},a.prototype.add=function(e){return this.featureChanged(e.id),this._features[e.id]=e,this._featureIds.add(e.id),this},a.prototype.delete=function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return o(e).forEach(function(e){t._featureIds.has(e)&&(t._featureIds.delete(e),t._selectedFeatureIds.delete(e),n.silent||t._deletedFeaturesToEmit.indexOf(t._features[e])===-1&&t._deletedFeaturesToEmit.push(t._features[e]),delete t._features[e],t.isDirty=!0)}),this},a.prototype.get=function(e){return this._features[e]},a.prototype.getAll=function(){var e=this;return Object.keys(this._features).map(function(t){return e._features[t]})},a.prototype.select=function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return o(e).forEach(function(e){t._selectedFeatureIds.has(e)||(t._selectedFeatureIds.add(e),t._changedFeatureIds.add(e),n.silent||(t._emitSelectionChange=!0))}),this},a.prototype.deselect=function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return o(e).forEach(function(e){t._selectedFeatureIds.has(e)&&(t._selectedFeatureIds.delete(e),t._changedFeatureIds.add(e),n.silent||(t._emitSelectionChange=!0))}),this},a.prototype.clearSelected=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return this.deselect(this._selectedFeatureIds.values(),{silent:e.silent}),this},a.prototype.setSelected=function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return e=o(e),this.deselect(this._selectedFeatureIds.values().filter(function(t){return e.indexOf(t)===-1}),{silent:n.silent}),this.select(e.filter(function(e){return!t._selectedFeatureIds.has(e)}),{silent:n.silent}),this},a.prototype.getSelectedIds=function(){return this._selectedFeatureIds.values()},a.prototype.getSelected=function(){var e=this;return this._selectedFeatureIds.values().map(function(t){return e.get(t)})},a.prototype.isSelected=function(e){return this._selectedFeatureIds.has(e)},a.prototype.setFeatureProperty=function(e,t,n){this.get(e).setProperty(t,n),this.featureChanged(e)}},{"./lib/string_set":47,"./lib/throttle":50,"./lib/to_dense_array":51,"./render":59}],62:[function(e,t,n){"use strict";var r=e("xtend"),o=e("./constants"),i=["mode","feature","mouse"];t.exports=function(e){function t(e){h=r(h,e)}function n(){if(e.container){var t=[],n=[];i.forEach(function(e){h[e]!==d[e]&&(t.push(e+"-"+d[e]),null!==h[e]&&n.push(e+"-"+h[e]))}),t.length>0&&e.container.classList.remove.apply(e.container.classList,t),n.length>0&&e.container.classList.add.apply(e.container.classList,n),d=r(d,h)}}function s(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=document.createElement("button");return n.className=o.classes.CONTROL_BUTTON+" "+t.className,n.setAttribute("title",t.title),t.container.appendChild(n),n.addEventListener("click",function(n){n.preventDefault(),n.stopPropagation();var r=n.target;return r===f?void a():(u(e),void t.onActivate())},!0),n}function a(){f&&(f.classList.remove(o.classes.ACTIVE_BUTTON),f=null)}function u(e){a();var t=p[e];t&&t&&"trash"!==e&&(t.classList.add(o.classes.ACTIVE_BUTTON),f=t)}function c(){var t=e.options.controls,n=document.createElement("div");return n.className=o.classes.CONTROL_GROUP+" "+o.classes.CONTROL_BASE,t?(t[o.types.LINE]&&(p[o.types.LINE]=s(o.types.LINE,{container:n,className:o.classes.CONTROL_BUTTON_LINE,title:"LineString tool "+(e.options.keybindings&&"(l)"),onActivate:function(){return e.events.changeMode(o.modes.DRAW_LINE_STRING)}})),t[o.types.POLYGON]&&(p[o.types.POLYGON]=s(o.types.POLYGON,{container:n,className:o.classes.CONTROL_BUTTON_POLYGON,title:"Polygon tool "+(e.options.keybindings&&"(p)"),onActivate:function(){return e.events.changeMode(o.modes.DRAW_POLYGON)}})),t[o.types.POINT]&&(p[o.types.POINT]=s(o.types.POINT,{container:n,className:o.classes.CONTROL_BUTTON_POINT,title:"Marker tool "+(e.options.keybindings&&"(m)"),onActivate:function(){return e.events.changeMode(o.modes.DRAW_POINT)}})),t.trash&&(p.trash=s("trash",{container:n,className:o.classes.CONTROL_BUTTON_TRASH,title:"Delete",onActivate:function(){e.events.trash()}})),t.combine_features&&(p.combine_features=s("combineFeatures",{container:n,className:o.classes.CONTROL_BUTTON_COMBINE_FEATURES,title:"Combine",onActivate:function(){e.events.combineFeatures()}})),t.uncombine_features&&(p.uncombine_features=s("uncombineFeatures",{container:n,className:o.classes.CONTROL_BUTTON_UNCOMBINE_FEATURES,title:"Uncombine",onActivate:function(){e.events.uncombineFeatures()}})),n):n}function l(){Object.keys(p).forEach(function(e){var t=p[e];t.parentNode&&t.parentNode.removeChild(t),delete p[e]})}var p={},f=null,d={mode:null,feature:null,mouse:null},h={mode:null,feature:null,mouse:null};return{setActiveButton:u,queueMapClasses:t,updateMapClasses:n,addButtons:c,removeButtons:l}}},{"./constants":24,xtend:22}]},{},[1])(1)}); \ No newline at end of file diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.28.0/.editorconfig b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.28.0/.editorconfig new file mode 100644 index 000000000..d4a00b0b0 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.28.0/.editorconfig @@ -0,0 +1,16 @@ +# editorconfig.org +root = true + +[*] +end_of_line = lf +trim_trailing_whitespace = true +insert_final_newline = true +charset = utf-8 + +[*.{js,html,css}] +indent_style = space +indent_size = 4 + +[*.{json,yml}] +indent_style = space +indent_size = 2 diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.28.0/.eslintrc b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.28.0/.eslintrc new file mode 100644 index 000000000..18ecc2690 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.28.0/.eslintrc @@ -0,0 +1,32 @@ +{ + "extends": "mourner", + "parser": "babel-eslint", + "parserOptions": { + "sourceType": "script", + }, + "plugins": [ + "flowtype" + ], + "rules": { + "array-bracket-spacing": "off", + "block-scoped-var": "error", + "consistent-return": "off", + "global-require": "off", + "key-spacing": "off", + "no-eq-null": "off", + "no-new": "off", + "no-var": "error", + "no-warning-comments": "error", + "object-curly-spacing": "off", + "prefer-arrow-callback": "error", + "prefer-const": "error", + "prefer-template": "error", + "quotes": "off", + "space-before-function-paren": "off", + "template-curly-spacing": "error" + }, + "env": { + "es6": true, + "browser": false + } +} diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.28.0/.flowconfig b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.28.0/.flowconfig new file mode 100644 index 000000000..595ca3c13 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.28.0/.flowconfig @@ -0,0 +1,11 @@ +[ignore] + +.*/node_modules/.* + +[include] + +[libs] + +./interfaces/ + +[options] diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.28.0/.gitignore b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.28.0/.gitignore new file mode 100644 index 000000000..4f82b7d34 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.28.0/.gitignore @@ -0,0 +1,13 @@ +/docs/api/index.html +/_site +/dist/mapbox-gl-dev.js +/dist/mapbox-gl.js +*.js.map +/node_modules +npm-debug.log +*.sublime-* +coverage +.DS_Store +.nyc_output +*_generated.js +yarn.lock diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.28.0/.npmignore b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.28.0/.npmignore new file mode 100644 index 000000000..9f5f00804 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.28.0/.npmignore @@ -0,0 +1,7 @@ +_site +bench +coverage +debug +docs +test +.nyc_output diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.28.0/LICENSE.txt b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.28.0/LICENSE.txt new file mode 100644 index 000000000..3562d403a --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.28.0/LICENSE.txt @@ -0,0 +1,81 @@ +Copyright (c) 2016, Mapbox + +All rights reserved. + +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 Mapbox GL JS 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. + +------------------------------------------------------------------------------- + +Contains glmatrix.js + +Copyright (c) 2013, Brandon Jones, Colin MacKenzie IV. All rights reserved. + +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. + +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 HOLDER 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. + +------------------------------------------------------------------------------- + +Contains Hershey Simplex Font: http://paulbourke.net/dataformats/hershey/ + +------------------------------------------------------------------------------- + +Contains code from glfx.js + +Copyright (C) 2011 by Evan Wallace + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.28.0/dist/mapbox-gl.css b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.28.0/dist/mapbox-gl.css new file mode 100644 index 000000000..797956c72 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.28.0/dist/mapbox-gl.css @@ -0,0 +1,269 @@ +.mapboxgl-map { + font: 12px/20px 'Helvetica Neue', Arial, Helvetica, sans-serif; + overflow: hidden; + position: relative; + -webkit-tap-highlight-color: rgba(0,0,0,0); +} + +.mapboxgl-canvas-container.mapboxgl-interactive, +.mapboxgl-ctrl-nav-compass { + cursor: -webkit-grab; + cursor: -moz-grab; + cursor: grab; +} +.mapboxgl-canvas-container.mapboxgl-interactive:active, +.mapboxgl-ctrl-nav-compass:active { + cursor: -webkit-grabbing; + cursor: -moz-grabbing; + cursor: grabbing; +} + +.mapboxgl-ctrl-top-left, +.mapboxgl-ctrl-top-right, +.mapboxgl-ctrl-bottom-left, +.mapboxgl-ctrl-bottom-right { position:absolute; pointer-events:none; z-index:2; } +.mapboxgl-ctrl-top-left { top:0; left:0; } +.mapboxgl-ctrl-top-right { top:0; right:0; } +.mapboxgl-ctrl-bottom-left { bottom:0; left:0; } +.mapboxgl-ctrl-bottom-right { right:0; bottom:0; } + +.mapboxgl-ctrl { clear:both; pointer-events:auto } +.mapboxgl-ctrl-top-left .mapboxgl-ctrl { margin:10px 0 0 10px; float:left; } +.mapboxgl-ctrl-top-right .mapboxgl-ctrl{ margin:10px 10px 0 0; float:right; } +.mapboxgl-ctrl-bottom-left .mapboxgl-ctrl { margin:0 0 10px 10px; float:left; } +.mapboxgl-ctrl-bottom-right .mapboxgl-ctrl { margin:0 10px 10px 0; float:right; } + +.mapboxgl-ctrl-group { + border-radius: 4px; + -moz-box-shadow: 0px 0px 2px rgba(0,0,0,0.1); + -webkit-box-shadow: 0px 0px 2px rgba(0,0,0,0.1); + box-shadow: 0px 0px 0px 2px rgba(0,0,0,0.1); + overflow: hidden; + background: #fff; +} +.mapboxgl-ctrl-group > button { + width: 30px; + height: 30px; + display: block; + padding: 0; + outline: none; + border: none; + border-bottom: 1px solid #ddd; + box-sizing: border-box; + background-color: rgba(0,0,0,0); + cursor: pointer; +} +/* https://bugzilla.mozilla.org/show_bug.cgi?id=140562 */ +.mapboxgl-ctrl > button::-moz-focus-inner { + border: 0; + padding: 0; +} +.mapboxgl-ctrl > button:last-child { + border-bottom: 0; +} +.mapboxgl-ctrl > button:hover { + background-color: rgba(0,0,0,0.05); +} +.mapboxgl-ctrl-icon, +.mapboxgl-ctrl-icon > span.arrow { + speak: none; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.mapboxgl-ctrl-icon.mapboxgl-ctrl-zoom-out { + padding: 5px; + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg%20viewBox%3D%270%200%2020%2020%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%0A%20%20%3Cpath%20style%3D%27fill%3A%23333333%3B%27%20d%3D%27m%207%2C9%20c%20-0.554%2C0%20-1%2C0.446%20-1%2C1%200%2C0.554%200.446%2C1%201%2C1%20l%206%2C0%20c%200.554%2C0%201%2C-0.446%201%2C-1%200%2C-0.554%20-0.446%2C-1%20-1%2C-1%20z%27%20%2F%3E%0A%3C%2Fsvg%3E%0A"); +} +.mapboxgl-ctrl-icon.mapboxgl-ctrl-zoom-in { + padding: 5px; + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg%20viewBox%3D%270%200%2020%2020%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%0A%20%20%3Cpath%20style%3D%27fill%3A%23333333%3B%27%20d%3D%27M%2010%206%20C%209.446%206%209%206.4459904%209%207%20L%209%209%20L%207%209%20C%206.446%209%206%209.446%206%2010%20C%206%2010.554%206.446%2011%207%2011%20L%209%2011%20L%209%2013%20C%209%2013.55401%209.446%2014%2010%2014%20C%2010.554%2014%2011%2013.55401%2011%2013%20L%2011%2011%20L%2013%2011%20C%2013.554%2011%2014%2010.554%2014%2010%20C%2014%209.446%2013.554%209%2013%209%20L%2011%209%20L%2011%207%20C%2011%206.4459904%2010.554%206%2010%206%20z%27%20%2F%3E%0A%3C%2Fsvg%3E%0A"); +} +.mapboxgl-ctrl-icon.mapboxgl-ctrl-geolocate { + padding: 5px; + background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMCAyMCIgdmVyc2lvbj0iMS4xIj48cGF0aCBkPSJNMTAgNEM5IDQgOSA1IDkgNUw5IDUuMUE1IDUgMCAwIDAgNS4xIDlMNSA5QzUgOSA0IDkgNCAxMCA0IDExIDUgMTEgNSAxMUw1LjEgMTFBNSA1IDAgMCAwIDkgMTQuOUw5IDE1QzkgMTUgOSAxNiAxMCAxNiAxMSAxNiAxMSAxNSAxMSAxNUwxMSAxNC45QTUgNSAwIDAgMCAxNC45IDExTDE1IDExQzE1IDExIDE2IDExIDE2IDEwIDE2IDkgMTUgOSAxNSA5TDE0LjkgOUE1IDUgMCAwIDAgMTEgNS4xTDExIDVDMTEgNSAxMSA0IDEwIDR6TTEwIDYuNUEzLjUgMy41IDAgMCAxIDEzLjUgMTAgMy41IDMuNSAwIDAgMSAxMCAxMy41IDMuNSAzLjUgMCAwIDEgNi41IDEwIDMuNSAzLjUgMCAwIDEgMTAgNi41ek0xMCA4LjNBMS44IDEuOCAwIDAgMCA4LjMgMTAgMS44IDEuOCAwIDAgMCAxMCAxMS44IDEuOCAxLjggMCAwIDAgMTEuOCAxMCAxLjggMS44IDAgMCAwIDEwIDguM3oiIGZpbGw9IiMzMzMiLz48L3N2Zz4="); +} + +.mapboxgl-ctrl-icon.mapboxgl-ctrl-compass > span.arrow { + width: 20px; + height: 20px; + margin: 5px; + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%0A%09%3Cpolygon%20fill%3D%27%23333333%27%20points%3D%276%2C9%2010%2C1%2014%2C9%27%2F%3E%0A%09%3Cpolygon%20fill%3D%27%23CCCCCC%27%20points%3D%276%2C11%2010%2C19%2014%2C11%20%27%2F%3E%0A%3C%2Fsvg%3E"); + background-repeat: no-repeat; + display: inline-block; +} + +.mapboxgl-ctrl.mapboxgl-ctrl-attrib { + padding: 0 5px; + background-color: rgba(255,255,255,0.5); + margin: 0; +} +.mapboxgl-ctrl-attrib a { + color: rgba(0,0,0,0.75); + text-decoration: none; +} +.mapboxgl-ctrl-attrib a:hover { + color: inherit; + text-decoration: underline; +} +.mapboxgl-ctrl-attrib .mapbox-improve-map { + font-weight: bold; + margin-left: 2px; +} + +.mapboxgl-ctrl-scale { + background-color: rgba(255,255,255,0.75); + font-size: 10px; + border-width: medium 2px 2px; + border-style: none solid solid; + border-color: #333; + padding: 0 5px; + color: #333; +} + +.mapboxgl-popup { + position: absolute; + top: 0; + left: 0; + display: -webkit-flex; + display: flex; + will-change: transform; + pointer-events: none; +} +.mapboxgl-popup-anchor-top, +.mapboxgl-popup-anchor-top-left, +.mapboxgl-popup-anchor-top-right { + -webkit-flex-direction: column; + flex-direction: column; +} +.mapboxgl-popup-anchor-bottom, +.mapboxgl-popup-anchor-bottom-left, +.mapboxgl-popup-anchor-bottom-right { + -webkit-flex-direction: column-reverse; + flex-direction: column-reverse; +} +.mapboxgl-popup-anchor-left { + -webkit-flex-direction: row; + flex-direction: row; +} +.mapboxgl-popup-anchor-right { + -webkit-flex-direction: row-reverse; + flex-direction: row-reverse; +} +.mapboxgl-popup-tip { + width: 0; + height: 0; + border: 10px solid transparent; + z-index: 1; +} +.mapboxgl-popup-anchor-top .mapboxgl-popup-tip { + -webkit-align-self: center; + align-self: center; + border-top: none; + border-bottom-color: #fff; +} +.mapboxgl-popup-anchor-top-left .mapboxgl-popup-tip { + -webkit-align-self: flex-start; + align-self: flex-start; + border-top: none; + border-left: none; + border-bottom-color: #fff; +} +.mapboxgl-popup-anchor-top-right .mapboxgl-popup-tip { + -webkit-align-self: flex-end; + align-self: flex-end; + border-top: none; + border-right: none; + border-bottom-color: #fff; +} +.mapboxgl-popup-anchor-bottom .mapboxgl-popup-tip { + -webkit-align-self: center; + align-self: center; + border-bottom: none; + border-top-color: #fff; +} +.mapboxgl-popup-anchor-bottom-left .mapboxgl-popup-tip { + -webkit-align-self: flex-start; + align-self: flex-start; + border-bottom: none; + border-left: none; + border-top-color: #fff; +} +.mapboxgl-popup-anchor-bottom-right .mapboxgl-popup-tip { + -webkit-align-self: flex-end; + align-self: flex-end; + border-bottom: none; + border-right: none; + border-top-color: #fff; +} +.mapboxgl-popup-anchor-left .mapboxgl-popup-tip { + -webkit-align-self: center; + align-self: center; + border-left: none; + border-right-color: #fff; +} +.mapboxgl-popup-anchor-right .mapboxgl-popup-tip { + -webkit-align-self: center; + align-self: center; + border-right: none; + border-left-color: #fff; +} +.mapboxgl-popup-close-button { + position: absolute; + right: 0; + top: 0; + border: none; + border-radius: 0 3px 0 0; + cursor: pointer; + background-color: rgba(0,0,0,0); +} +.mapboxgl-popup-close-button:hover { + background-color: rgba(0,0,0,0.05); +} +.mapboxgl-popup-content { + position: relative; + background: #fff; + border-radius: 3px; + box-shadow: 0 1px 2px rgba(0,0,0,0.10); + padding: 10px 10px 15px; + pointer-events: auto; +} +.mapboxgl-popup-anchor-top-left .mapboxgl-popup-content { + border-top-left-radius: 0; +} +.mapboxgl-popup-anchor-top-right .mapboxgl-popup-content { + border-top-right-radius: 0; +} +.mapboxgl-popup-anchor-bottom-left .mapboxgl-popup-content { + border-bottom-left-radius: 0; +} +.mapboxgl-popup-anchor-bottom-right .mapboxgl-popup-content { + border-bottom-right-radius: 0; +} + +.mapboxgl-marker { + position: absolute; + top: 0; + left: 0; + will-change: transform; +} + +.mapboxgl-crosshair, +.mapboxgl-crosshair .mapboxgl-interactive, +.mapboxgl-crosshair .mapboxgl-interactive:active { + cursor: crosshair; +} +.mapboxgl-boxzoom { + position: absolute; + top: 0; + left: 0; + width: 0; + height: 0; + background: #fff; + border: 2px dotted #202020; + opacity: 0.5; +} +@media print { + .mapbox-improve-map { + display:none; + } +} diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.28.0/dist/svg/mapboxgl-ctrl-compass.svg b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.28.0/dist/svg/mapboxgl-ctrl-compass.svg new file mode 100644 index 000000000..dd5e2a880 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.28.0/dist/svg/mapboxgl-ctrl-compass.svg @@ -0,0 +1,4 @@ + + + + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.28.0/dist/svg/mapboxgl-ctrl-geolocate.svg b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.28.0/dist/svg/mapboxgl-ctrl-geolocate.svg new file mode 100644 index 000000000..efb9a3f79 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.28.0/dist/svg/mapboxgl-ctrl-geolocate.svg @@ -0,0 +1 @@ + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.28.0/dist/svg/mapboxgl-ctrl-zoom-in.svg b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.28.0/dist/svg/mapboxgl-ctrl-zoom-in.svg new file mode 100644 index 000000000..b26e3d162 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.28.0/dist/svg/mapboxgl-ctrl-zoom-in.svg @@ -0,0 +1,3 @@ + + + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.28.0/dist/svg/mapboxgl-ctrl-zoom-out.svg b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.28.0/dist/svg/mapboxgl-ctrl-zoom-out.svg new file mode 100644 index 000000000..ab6e9ff22 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.28.0/dist/svg/mapboxgl-ctrl-zoom-out.svg @@ -0,0 +1,3 @@ + + + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.28.0/js/mapbox-gl.js b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.28.0/js/mapbox-gl.js new file mode 100644 index 000000000..cbb578a67 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.28.0/js/mapbox-gl.js @@ -0,0 +1,443 @@ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.mapboxgl = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;oArrayGroup.MAX_VERTEX_ARRAY_LENGTH)&&(e=new Segment(this.layoutVertexArray.length,this.elementArray.length),this.segments.push(e)),e},ArrayGroup.prototype.prepareSegment2=function(r){var e=this.segments2[this.segments2.length-1];return(!e||e.vertexLength+r>ArrayGroup.MAX_VERTEX_ARRAY_LENGTH)&&(e=new Segment(this.layoutVertexArray.length,this.elementArray2.length),this.segments2.push(e)),e},ArrayGroup.prototype.populatePaintArrays=function(r){var e=this;for(var t in this.layerData){var a=e.layerData[t];0!==a.paintVertexArray.bytesPerElement&&a.programConfiguration.populatePaintArray(a.layer,a.paintVertexArray,e.layoutVertexArray.length,e.globalProperties,r)}},ArrayGroup.prototype.isEmpty=function(){return 0===this.layoutVertexArray.length},ArrayGroup.prototype.serialize=function(r){return{layoutVertexArray:this.layoutVertexArray.serialize(r),elementArray:this.elementArray&&this.elementArray.serialize(r),elementArray2:this.elementArray2&&this.elementArray2.serialize(r),paintVertexArrays:serializePaintVertexArrays(this.layerData,r),segments:this.segments,segments2:this.segments2}},ArrayGroup.MAX_VERTEX_ARRAY_LENGTH=Math.pow(2,16)-1,module.exports=ArrayGroup; +},{"./program_configuration":15}],2:[function(require,module,exports){ +"use strict";var ArrayGroup=require("./array_group"),BufferGroup=require("./buffer_group"),util=require("../util/util"),Bucket=function(r,e){this.zoom=r.zoom,this.overscaling=r.overscaling,this.layers=r.layers,this.index=r.index,r.arrays?this.buffers=new BufferGroup(e,r.layers,r.zoom,r.arrays):this.arrays=new ArrayGroup(e,r.layers,r.zoom)};Bucket.prototype.populate=function(r,e){for(var t=this,i=0,u=r;i=EXTENT||o<0||o>=EXTENT)){var n=r.prepareSegment(4),u=n.vertexLength;addCircleVertex(r.layoutVertexArray,l,o,-1,-1),addCircleVertex(r.layoutVertexArray,l,o,1,-1),addCircleVertex(r.layoutVertexArray,l,o,1,1),addCircleVertex(r.layoutVertexArray,l,o,-1,1),r.elementArray.emplaceBack(u,u+1,u+2),r.elementArray.emplaceBack(u,u+3,u+2),n.vertexLength+=4,n.primitiveLength+=2}}r.populatePaintArrays(e.properties)},r}(Bucket);module.exports=CircleBucket; +},{"../bucket":2,"../element_array_type":10,"../extent":11,"../load_geometry":13,"../vertex_array_type":17}],4:[function(require,module,exports){ +"use strict";var Bucket=require("../bucket"),createVertexArrayType=require("../vertex_array_type"),createElementArrayType=require("../element_array_type"),loadGeometry=require("../load_geometry"),earcut=require("earcut"),classifyRings=require("../../util/classify_rings"),EARCUT_MAX_RINGS=500,fillInterface={layoutVertexArrayType:createVertexArrayType([{name:"a_pos",components:2,type:"Int16"}]),elementArrayType:createElementArrayType(3),elementArrayType2:createElementArrayType(2),paintAttributes:[{property:"fill-color",type:"Uint8"},{property:"fill-outline-color",type:"Uint8"},{property:"fill-opacity",type:"Uint8",multiplier:255}]},FillBucket=function(e){function r(r){e.call(this,r,fillInterface)}return e&&(r.__proto__=e),r.prototype=Object.create(e&&e.prototype),r.prototype.constructor=r,r.prototype.addFeature=function(e){for(var r=this.arrays,t=0,a=classifyRings(loadGeometry(e),EARCUT_MAX_RINGS);tEXTENT)||e.y===r.y&&(e.y<0||e.y>EXTENT)}var Bucket=require("../bucket"),createVertexArrayType=require("../vertex_array_type"),createElementArrayType=require("../element_array_type"),loadGeometry=require("../load_geometry"),EXTENT=require("../extent"),earcut=require("earcut"),classifyRings=require("../../util/classify_rings"),EARCUT_MAX_RINGS=500,fillExtrusionInterface={layoutVertexArrayType:createVertexArrayType([{name:"a_pos",components:2,type:"Int16"},{name:"a_normal",components:3,type:"Int16"},{name:"a_edgedistance",components:1,type:"Int16"}]),elementArrayType:createElementArrayType(3),paintAttributes:[{property:"fill-extrusion-base",type:"Uint16"},{property:"fill-extrusion-height",type:"Uint16"},{property:"fill-extrusion-color",type:"Uint8"}]},FACTOR=Math.pow(2,13),FillExtrusionBucket=function(e){function r(r){e.call(this,r,fillExtrusionInterface)}return e&&(r.__proto__=e),r.prototype=Object.create(e&&e.prototype),r.prototype.constructor=r,r.prototype.addFeature=function(e){for(var r=this.arrays,t=0,a=classifyRings(loadGeometry(e),EARCUT_MAX_RINGS);t=1){var g=h[f-1];if(!isBoundaryEdge(A,g)){var _=A.sub(g)._perp()._unit();addVertex(r.layoutVertexArray,A.x,A.y,_.x,_.y,0,0,m),addVertex(r.layoutVertexArray,A.x,A.y,_.x,_.y,0,1,m),m+=g.dist(A),addVertex(r.layoutVertexArray,g.x,g.y,_.x,_.y,0,0,m),addVertex(r.layoutVertexArray,g.x,g.y,_.x,_.y,0,1,m);var v=p.vertexLength;r.elementArray.emplaceBack(v,v+1,v+2),r.elementArray.emplaceBack(v+1,v+2,v+3),p.vertexLength+=4,p.primitiveLength+=2}}u.push(A.x),u.push(A.y)}}}for(var T=earcut(u,c),E=0;E>6)}var Bucket=require("../bucket"),createVertexArrayType=require("../vertex_array_type"),createElementArrayType=require("../element_array_type"),loadGeometry=require("../load_geometry"),EXTENT=require("../extent"),EXTRUDE_SCALE=63,COS_HALF_SHARP_CORNER=Math.cos(37.5*(Math.PI/180)),SHARP_CORNER_OFFSET=15,LINE_DISTANCE_BUFFER_BITS=15,LINE_DISTANCE_SCALE=.5,MAX_LINE_DISTANCE=Math.pow(2,LINE_DISTANCE_BUFFER_BITS-1)/LINE_DISTANCE_SCALE,lineInterface={layoutVertexArrayType:createVertexArrayType([{name:"a_pos",components:2,type:"Int16"},{name:"a_data",components:4,type:"Uint8"}]),paintAttributes:[{property:"line-color",type:"Uint8"}],elementArrayType:createElementArrayType()},LineBucket=function(e){function t(t){e.call(this,t,lineInterface)}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.addFeature=function(e){for(var t=this,r=this.layers[0].layout,i=r["line-join"],a=r["line-cap"],n=r["line-miter-limit"],d=r["line-round-limit"],s=0,u=loadGeometry(e,LINE_DISTANCE_BUFFER_BITS);s2&&e[s-1].equals(e[s-2]);)s--;if(!(e.length<2)){"bevel"===r&&(a=1.05);var u=SHARP_CORNER_OFFSET*(EXTENT/(512*this.overscaling)),l=e[0],o=e[s-1],c=l.equals(o),_=this.arrays,h=_.prepareSegment(10*s);if(2!==s||!c){this.distance=0;var p,y,E,m,x,C,A,v=i,f=c?"butt":i,L=!0;this.e1=this.e2=this.e3=-1,c&&(p=e[s-2],x=l.sub(p)._unit()._perp());for(var S=0;S0){var b=p.dist(y);if(b>2*u){var R=p.sub(p.sub(y)._mult(u/b)._round());d.distance+=R.dist(y),d.addCurrentVertex(R,d.distance,m.mult(1),0,0,!1,h),y=R}}var g=y&&E,B=g?r:E?v:f;if(g&&"round"===B&&(Ia&&(B="bevel"),"bevel"===B&&(I>2&&(B="flipbevel"),I100)V=x.clone();else{var F=m.x*x.y-m.y*x.x>0?-1:1,k=I*m.add(x).mag()/m.sub(x).mag();V._perp()._mult(k*F)}d.addCurrentVertex(p,d.distance,V,0,0,!1,h),d.addCurrentVertex(p,d.distance,V.mult(-1),0,0,!1,h)}else if("bevel"===B||"fakeround"===B){var D=m.x*x.y-m.y*x.x>0,q=-Math.sqrt(I*I-1);if(D?(A=0,C=q):(C=0,A=q),L||d.addCurrentVertex(p,d.distance,m,C,A,!1,h),"fakeround"===B){for(var P,M=Math.floor(8*(.5-(T-.5))),O=0;O=0;U--)P=m.mult((U+1)/(M+1))._add(x)._unit(),d.addPieSliceVertex(p,d.distance,P,D,h)}E&&d.addCurrentVertex(p,d.distance,x,-C,-A,!1,h)}else"butt"===B?(L||d.addCurrentVertex(p,d.distance,m,0,0,!1,h),E&&d.addCurrentVertex(p,d.distance,x,0,0,!1,h)):"square"===B?(L||(d.addCurrentVertex(p,d.distance,m,1,1,!1,h),d.e1=d.e2=-1),E&&d.addCurrentVertex(p,d.distance,x,-1,-1,!1,h)):"round"===B&&(L||(d.addCurrentVertex(p,d.distance,m,0,0,!1,h),d.addCurrentVertex(p,d.distance,m,1,1,!0,h),d.e1=d.e2=-1),E&&(d.addCurrentVertex(p,d.distance,x,-1,-1,!0,h),d.addCurrentVertex(p,d.distance,x,0,0,!1,h)));if(N&&S2*u){var H=p.add(E.sub(p)._mult(u/X)._round());d.distance+=H.dist(p),d.addCurrentVertex(H,d.distance,x.mult(1),0,0,!1,h),p=H}}L=!1}_.populatePaintArrays(t)}}},t.prototype.addCurrentVertex=function(e,t,r,i,a,n,d){var s,u=n?1:0,l=this.arrays,o=l.layoutVertexArray,c=l.elementArray;s=r.clone(),i&&s._sub(r.perp()._mult(i)),addLineVertex(o,e,s,u,0,i,t),this.e3=d.vertexLength++,this.e1>=0&&this.e2>=0&&(c.emplaceBack(this.e1,this.e2,this.e3),d.primitiveLength++),this.e1=this.e2,this.e2=this.e3,s=r.mult(-1),a&&s._sub(r.perp()._mult(a)),addLineVertex(o,e,s,u,1,-a,t),this.e3=d.vertexLength++,this.e1>=0&&this.e2>=0&&(c.emplaceBack(this.e1,this.e2,this.e3),d.primitiveLength++),this.e1=this.e2,this.e2=this.e3,t>MAX_LINE_DISTANCE/2&&(this.distance=0,this.addCurrentVertex(e,this.distance,r,i,a,n,d))},t.prototype.addPieSliceVertex=function(e,t,r,i,a){var n=i?1:0;r=r.mult(i?-1:1);var d=this.arrays,s=d.layoutVertexArray,u=d.elementArray;addLineVertex(s,e,r,0,n,0,t),this.e3=a.vertexLength++,this.e1>=0&&this.e2>=0&&(u.emplaceBack(this.e1,this.e2,this.e3),a.primitiveLength++),i?this.e2=this.e3:this.e1=this.e3},t}(Bucket);module.exports=LineBucket; +},{"../bucket":2,"../element_array_type":10,"../extent":11,"../load_geometry":13,"../vertex_array_type":17}],7:[function(require,module,exports){ +"use strict";function addVertex(e,t,o,a,r,n,i,s,l,c,y){e.emplaceBack(t,o,Math.round(64*a),Math.round(64*r),n/4,i/4,10*(c||0),y,10*(s||0),10*Math.min(l||25,25))}function addCollisionBoxVertex(e,t,o,a,r){return e.emplaceBack(t.x,t.y,Math.round(o.x),Math.round(o.y),10*a,10*r)}var Point=require("point-geometry"),ArrayGroup=require("../array_group"),BufferGroup=require("../buffer_group"),createVertexArrayType=require("../vertex_array_type"),createElementArrayType=require("../element_array_type"),EXTENT=require("../extent"),Anchor=require("../../symbol/anchor"),getAnchors=require("../../symbol/get_anchors"),resolveTokens=require("../../util/token"),Quads=require("../../symbol/quads"),Shaping=require("../../symbol/shaping"),resolveText=require("../../symbol/resolve_text"),mergeLines=require("../../symbol/mergelines"),clipLine=require("../../symbol/clip_line"),util=require("../../util/util"),scriptDetection=require("../../util/script_detection"),loadGeometry=require("../load_geometry"),CollisionFeature=require("../../symbol/collision_feature"),findPoleOfInaccessibility=require("../../util/find_pole_of_inaccessibility"),classifyRings=require("../../util/classify_rings"),shapeText=Shaping.shapeText,shapeIcon=Shaping.shapeIcon,WritingMode=Shaping.WritingMode,getGlyphQuads=Quads.getGlyphQuads,getIconQuads=Quads.getIconQuads,elementArrayType=createElementArrayType(),layoutVertexArrayType=createVertexArrayType([{name:"a_pos",components:2,type:"Int16"},{name:"a_offset",components:2,type:"Int16"},{name:"a_texture_pos",components:2,type:"Uint16"},{name:"a_data",components:4,type:"Uint8"}]),symbolInterfaces={glyph:{layoutVertexArrayType:layoutVertexArrayType,elementArrayType:elementArrayType},icon:{layoutVertexArrayType:layoutVertexArrayType,elementArrayType:elementArrayType},collisionBox:{layoutVertexArrayType:createVertexArrayType([{name:"a_pos",components:2,type:"Int16"},{name:"a_extrude",components:2,type:"Int16"},{name:"a_data",components:2,type:"Uint8"}]),elementArrayType:createElementArrayType(2)}},SymbolBucket=function(e){var t=this;if(this.collisionBoxArray=e.collisionBoxArray,this.symbolQuadsArray=e.symbolQuadsArray,this.symbolInstancesArray=e.symbolInstancesArray,this.zoom=e.zoom,this.overscaling=e.overscaling,this.layers=e.layers,this.index=e.index,this.sdfIcons=e.sdfIcons,this.iconsNeedLinear=e.iconsNeedLinear,this.adjustedTextSize=e.adjustedTextSize,this.adjustedIconSize=e.adjustedIconSize,this.fontstack=e.fontstack,e.arrays){this.buffers={};for(var o in e.arrays)e.arrays[o]&&(t.buffers[o]=new BufferGroup(symbolInterfaces[o],e.layers,e.zoom,e.arrays[o]))}};SymbolBucket.prototype.populate=function(e,t){var o=this,a=this.layers[0].layout,r=a["text-field"],n=a["text-font"],i=a["icon-image"],s=r&&n,l=i;if(this.features=[],s||l){for(var c=t.iconDependencies,y=t.glyphDependencies,d=y[n]=y[n]||{},h=0;hEXTENT||P.y<0||P.y>EXTENT);if(!x||_){var w=_||b;a.addSymbolInstance(P,z,t,o,a.layers[0],w,a.symbolInstancesArray.length,a.collisionBoxArray,e.index,e.sourceLayerIndex,a.index,c,u,g,d,m,f,{zoom:a.zoom},e.properties)}}}}},SymbolBucket.prototype.findPolygonAnchors=function(e){var t=e[0];if(0===t.length)return[];if(t.length<3||!util.isClosedPolygon(t))return[new Anchor(t[0].x,t[0].y,0)];var o=null,a=findPoleOfInaccessibility(e,16);return o=[new Anchor(a.x,a.y,0)]},SymbolBucket.prototype.anchorIsTooClose=function(e,t,o){var a=this.compareText;if(e in a){for(var r=a[e],n=r.length-1;n>=0;n--)if(o.dist(r[n])7*Math.PI/4)continue}else if(r&&n&&m<=3*Math.PI/4||m>5*Math.PI/4)continue}else if(r&&n&&(m<=Math.PI/2||m>3*Math.PI/2))continue;var p=u.tl,g=u.tr,f=u.bl,b=u.br,I=u.tex,S=u.anchorPoint,v=Math.max(d+Math.log(u.minScale)/Math.LN2,h),A=Math.min(d+Math.log(u.maxScale)/Math.LN2,25);if(!(A<=v)){v===h&&(v=0);var M=Math.round(u.glyphAngle/(2*Math.PI)*256),B=e.prepareSegment(4),T=B.vertexLength;addVertex(y,S.x,S.y,p.x,p.y,I.x,I.y,v,A,h,M),addVertex(y,S.x,S.y,g.x,g.y,I.x+I.w,I.y,v,A,h,M),addVertex(y,S.x,S.y,f.x,f.y,I.x,I.y+I.h,v,A,h,M),addVertex(y,S.x,S.y,b.x,b.y,I.x+I.w,I.y+I.h,v,A,h,M),c.emplaceBack(T,T+1,T+2),c.emplaceBack(T+1,T+2,T+3),B.vertexLength+=4,B.primitiveLength+=2}}},SymbolBucket.prototype.addToDebugBuffers=function(e){for(var t=this,o=this.arrays.collisionBox,a=o.layoutVertexArray,r=o.elementArray,n=-e.angle,i=e.yStretch,s=this.symbolInstancesStartIndex;sSymbolBucket.MAX_QUADS&&util.warnOnce("Too many symbols being rendered in a tile. See https://github.com/mapbox/mapbox-gl-js/issues/2907"),k>SymbolBucket.MAX_QUADS&&util.warnOnce("Too many glyphs being rendered in a tile. See https://github.com/mapbox/mapbox-gl-js/issues/2907");var V=(o[WritingMode.vertical]?WritingMode.vertical:0)|(o[WritingMode.horizontal]?WritingMode.horizontal:0);return this.symbolInstancesArray.emplaceBack(E,P,L,Q,T,k,_,w,e.x,e.y,i,V)},SymbolBucket.prototype.addSymbolQuad=function(e){return this.symbolQuadsArray.emplaceBack(e.anchorPoint.x,e.anchorPoint.y,e.tl.x,e.tl.y,e.tr.x,e.tr.y,e.bl.x,e.bl.y,e.br.x,e.br.y,e.tex.h,e.tex.w,e.tex.x,e.tex.y,e.anchorAngle,e.glyphAngle,e.maxScale,e.minScale,e.writingMode)},SymbolBucket.MAX_QUADS=65535,module.exports=SymbolBucket; +},{"../../symbol/anchor":72,"../../symbol/clip_line":74,"../../symbol/collision_feature":76,"../../symbol/get_anchors":78,"../../symbol/mergelines":81,"../../symbol/quads":82,"../../symbol/resolve_text":83,"../../symbol/shaping":84,"../../util/classify_rings":110,"../../util/find_pole_of_inaccessibility":116,"../../util/script_detection":123,"../../util/token":125,"../../util/util":126,"../array_group":1,"../buffer_group":9,"../element_array_type":10,"../extent":11,"../load_geometry":13,"../vertex_array_type":17,"point-geometry":194}],8:[function(require,module,exports){ +"use strict";var AttributeType={Int8:"BYTE",Uint8:"UNSIGNED_BYTE",Int16:"SHORT",Uint16:"UNSIGNED_SHORT"},Buffer=function(e,t,r){this.arrayBuffer=e.arrayBuffer,this.length=e.length,this.attributes=t.members,this.itemSize=t.bytesPerElement,this.type=r,this.arrayType=t};Buffer.fromStructArray=function(e,t){return new Buffer(e.serialize(),e.constructor.serialize(),t)},Buffer.prototype.bind=function(e){var t=e[this.type];this.buffer?e.bindBuffer(t,this.buffer):(this.gl=e,this.buffer=e.createBuffer(),e.bindBuffer(t,this.buffer),e.bufferData(t,this.arrayBuffer,e.STATIC_DRAW),this.arrayBuffer=null)},Buffer.prototype.setVertexAttribPointers=function(e,t,r){for(var f=this,i=0;i0?e["line-gap-width"]+2*e["line-width"]:e["line-width"]}function translate(e,t,r,i,n){if(!t[0]&&!t[1])return e;t=Point.convert(t),"viewport"===r&&t._rotate(-i);for(var a=[],o=0;or.max||d.yr.max)&&util.warnOnce("Geometry exceeds allowed extent, reduce your vector tile buffer size")}return u}; +},{"../util/util":126,"./extent":11}],14:[function(require,module,exports){ +"use strict";var createStructArrayType=require("../util/struct_array"),PosArray=createStructArrayType({members:[{name:"a_pos",type:"Int16",components:2}]});module.exports=PosArray; +},{"../util/struct_array":124}],15:[function(require,module,exports){ +"use strict";function getPaintAttributeValue(t,e,r,i){if(!t.zoomStops)return e.getPaintValue(t.property,r,i);var a=t.zoomStops.map(function(a){return e.getPaintValue(t.property,util.extend({},r,{zoom:a}),i)});return 1===a.length?a[0]:a}function normalizePaintAttribute(t,e){var r=t.property.replace(e.type+"-","").replace(/-/g,"_"),i="color"===e._paintSpecifications[t.property].type;return util.extend({name:"a_"+r,components:i?4:1,multiplier:i?255:1},t)}var createVertexArrayType=require("./vertex_array_type"),util=require("../util/util"),ProgramConfiguration=function(){this.attributes=[],this.uniforms=[],this.interpolationUniforms=[],this.pragmas={vertex:{},fragment:{}},this.cacheKey=""};ProgramConfiguration.createDynamic=function(t,e,r){for(var i=new ProgramConfiguration,a=0,n=t;a90||this.lat<-90)throw new Error("Invalid LngLat latitude value: must be between -90 and 90")};LngLat.prototype.wrap=function(){return new LngLat(wrap(this.lng,-180,180),this.lat)},LngLat.prototype.toArray=function(){return[this.lng,this.lat]},LngLat.prototype.toString=function(){return"LngLat("+this.lng+", "+this.lat+")"},LngLat.convert=function(t){if(t instanceof LngLat)return t;if(t&&t.hasOwnProperty("lng")&&t.hasOwnProperty("lat"))return new LngLat(t.lng,t.lat);if(Array.isArray(t)&&2===t.length)return new LngLat(t[0],t[1]);throw new Error("`LngLatLike` argument must be specified as a LngLat instance, an object {lng: , lat: }, or an array of [, ]")},module.exports=LngLat; +},{"../util/util":126}],20:[function(require,module,exports){ +"use strict";var LngLat=require("./lng_lat"),LngLatBounds=function(t,n){t&&(n?this.setSouthWest(t).setNorthEast(n):4===t.length?this.setSouthWest([t[0],t[1]]).setNorthEast([t[2],t[3]]):this.setSouthWest(t[0]).setNorthEast(t[1]))};LngLatBounds.prototype.setNorthEast=function(t){return this._ne=LngLat.convert(t),this},LngLatBounds.prototype.setSouthWest=function(t){return this._sw=LngLat.convert(t),this},LngLatBounds.prototype.extend=function(t){var n,e,s=this._sw,o=this._ne;if(t instanceof LngLat)n=t,e=t;else{if(!(t instanceof LngLatBounds))return Array.isArray(t)?t.every(Array.isArray)?this.extend(LngLatBounds.convert(t)):this.extend(LngLat.convert(t)):this;if(n=t._sw,e=t._ne,!n||!e)return this}return s||o?(s.lng=Math.min(n.lng,s.lng),s.lat=Math.min(n.lat,s.lat),o.lng=Math.max(e.lng,o.lng),o.lat=Math.max(e.lat,o.lat)):(this._sw=new LngLat(n.lng,n.lat),this._ne=new LngLat(e.lng,e.lat)),this},LngLatBounds.prototype.getCenter=function(){return new LngLat((this._sw.lng+this._ne.lng)/2,(this._sw.lat+this._ne.lat)/2)},LngLatBounds.prototype.getSouthWest=function(){return this._sw},LngLatBounds.prototype.getNorthEast=function(){return this._ne},LngLatBounds.prototype.getNorthWest=function(){return new LngLat(this.getWest(),this.getNorth())},LngLatBounds.prototype.getSouthEast=function(){return new LngLat(this.getEast(),this.getSouth())},LngLatBounds.prototype.getWest=function(){return this._sw.lng},LngLatBounds.prototype.getSouth=function(){return this._sw.lat},LngLatBounds.prototype.getEast=function(){return this._ne.lng},LngLatBounds.prototype.getNorth=function(){return this._ne.lat},LngLatBounds.prototype.toArray=function(){return[this._sw.toArray(),this._ne.toArray()]},LngLatBounds.prototype.toString=function(){return"LngLatBounds("+this._sw.toString()+", "+this._ne.toString()+")"},LngLatBounds.convert=function(t){return!t||t instanceof LngLatBounds?t:new LngLatBounds(t)},module.exports=LngLatBounds; +},{"./lng_lat":19}],21:[function(require,module,exports){ +"use strict";var LngLat=require("./lng_lat"),Point=require("point-geometry"),Coordinate=require("./coordinate"),util=require("../util/util"),interp=require("../util/interpolate"),TileCoord=require("../source/tile_coord"),EXTENT=require("../data/extent"),glmatrix=require("gl-matrix"),vec4=glmatrix.vec4,mat4=glmatrix.mat4,mat2=glmatrix.mat2,Transform=function(t,i){this.tileSize=512,this._minZoom=t||0,this._maxZoom=i||22,this.latRange=[-85.05113,85.05113],this.width=0,this.height=0,this._center=new LngLat(0,0),this.zoom=0,this.angle=0,this._altitude=1.5,this._pitch=0,this._unmodified=!0},prototypeAccessors={minZoom:{},maxZoom:{},worldSize:{},centerPoint:{},size:{},bearing:{},pitch:{},altitude:{},zoom:{},center:{},unmodified:{},x:{},y:{},point:{}};prototypeAccessors.minZoom.get=function(){return this._minZoom},prototypeAccessors.minZoom.set=function(t){this._minZoom!==t&&(this._minZoom=t,this.zoom=Math.max(this.zoom,t))},prototypeAccessors.maxZoom.get=function(){return this._maxZoom},prototypeAccessors.maxZoom.set=function(t){this._maxZoom!==t&&(this._maxZoom=t,this.zoom=Math.min(this.zoom,t))},prototypeAccessors.worldSize.get=function(){return this.tileSize*this.scale},prototypeAccessors.centerPoint.get=function(){return this.size._div(2)},prototypeAccessors.size.get=function(){return new Point(this.width,this.height)},prototypeAccessors.bearing.get=function(){return-this.angle/Math.PI*180},prototypeAccessors.bearing.set=function(t){var i=-util.wrap(t,-180,180)*Math.PI/180;this.angle!==i&&(this._unmodified=!1,this.angle=i,this._calcMatrices(),this.rotationMatrix=mat2.create(),mat2.rotate(this.rotationMatrix,this.rotationMatrix,this.angle))},prototypeAccessors.pitch.get=function(){return this._pitch/Math.PI*180},prototypeAccessors.pitch.set=function(t){var i=util.clamp(t,0,60)/180*Math.PI;this._pitch!==i&&(this._unmodified=!1,this._pitch=i,this._calcMatrices())},prototypeAccessors.altitude.get=function(){return this._altitude},prototypeAccessors.altitude.set=function(t){var i=Math.max(.75,t);this._altitude!==i&&(this._unmodified=!1,this._altitude=i,this._calcMatrices())},prototypeAccessors.zoom.get=function(){return this._zoom},prototypeAccessors.zoom.set=function(t){var i=Math.min(Math.max(t,this.minZoom),this.maxZoom);this._zoom!==i&&(this._unmodified=!1,this._zoom=i,this.scale=this.zoomScale(i),this.tileZoom=Math.floor(i),this.zoomFraction=i-this.tileZoom,this._constrain(),this._calcMatrices())},prototypeAccessors.center.get=function(){return this._center},prototypeAccessors.center.set=function(t){t.lat===this._center.lat&&t.lng===this._center.lng||(this._unmodified=!1,this._center=t,this._constrain(),this._calcMatrices())},Transform.prototype.coveringZoomLevel=function(t){return(t.roundZoom?Math.round:Math.floor)(this.zoom+this.scaleZoom(this.tileSize/t.tileSize))},Transform.prototype.coveringTiles=function(t){var i=this.coveringZoomLevel(t),o=i;if(it.maxzoom&&(i=t.maxzoom);var e=this,r=e.locationCoordinate(e.center)._zoomTo(i),n=new Point(r.column-.5,r.row-.5);return TileCoord.cover(i,[e.pointCoordinate(new Point(0,0))._zoomTo(i),e.pointCoordinate(new Point(e.width,0))._zoomTo(i),e.pointCoordinate(new Point(e.width,e.height))._zoomTo(i),e.pointCoordinate(new Point(0,e.height))._zoomTo(i)],t.reparseOverscaled?o:i).sort(function(t,i){return n.dist(t)-n.dist(i)})},Transform.prototype.resize=function(t,i){this.width=t,this.height=i,this.pixelsToGLUnits=[2/t,-2/i],this._constrain(),this._calcMatrices()},prototypeAccessors.unmodified.get=function(){return this._unmodified},Transform.prototype.zoomScale=function(t){return Math.pow(2,t)},Transform.prototype.scaleZoom=function(t){return Math.log(t)/Math.LN2},Transform.prototype.project=function(t,i){return new Point(this.lngX(t.lng,i),this.latY(t.lat,i))},Transform.prototype.unproject=function(t,i){return new LngLat(this.xLng(t.x,i),this.yLat(t.y,i))},prototypeAccessors.x.get=function(){return this.lngX(this.center.lng)},prototypeAccessors.y.get=function(){return this.latY(this.center.lat)},prototypeAccessors.point.get=function(){return new Point(this.x,this.y)},Transform.prototype.lngX=function(t,i){return(180+t)*(i||this.worldSize)/360},Transform.prototype.latY=function(t,i){var o=180/Math.PI*Math.log(Math.tan(Math.PI/4+t*Math.PI/360));return(180-o)*(i||this.worldSize)/360},Transform.prototype.xLng=function(t,i){return 360*t/(i||this.worldSize)-180},Transform.prototype.yLat=function(t,i){var o=180-360*t/(i||this.worldSize);return 360/Math.PI*Math.atan(Math.exp(o*Math.PI/180))-90},Transform.prototype.panBy=function(t){var i=this.centerPoint._add(t);this.center=this.pointLocation(i)},Transform.prototype.setLocationAtPoint=function(t,i){var o=this.locationCoordinate(t),e=this.pointCoordinate(i),r=this.pointCoordinate(this.centerPoint),n=e._sub(o);this._unmodified=!1,this.center=this.coordinateLocation(r._sub(n))},Transform.prototype.locationPoint=function(t){return this.coordinatePoint(this.locationCoordinate(t))},Transform.prototype.pointLocation=function(t){return this.coordinateLocation(this.pointCoordinate(t))},Transform.prototype.locationCoordinate=function(t){var i=this.zoomScale(this.tileZoom)/this.worldSize,o=LngLat.convert(t);return new Coordinate(this.lngX(o.lng)*i,this.latY(o.lat)*i,this.tileZoom)},Transform.prototype.coordinateLocation=function(t){var i=this.zoomScale(t.zoom);return new LngLat(this.xLng(t.column,i),this.yLat(t.row,i))},Transform.prototype.pointCoordinate=function(t){var i=0,o=[t.x,t.y,0,1],e=[t.x,t.y,1,1];vec4.transformMat4(o,o,this.pixelMatrixInverse),vec4.transformMat4(e,e,this.pixelMatrixInverse);var r=o[3],n=e[3],s=o[0]/r,a=e[0]/n,h=o[1]/r,c=e[1]/n,m=o[2]/r,l=e[2]/n,p=m===l?0:(i-m)/(l-m),u=this.worldSize/this.zoomScale(this.tileZoom);return new Coordinate(interp(s,a,p)/u,interp(h,c,p)/u,this.tileZoom)},Transform.prototype.coordinatePoint=function(t){var i=this.worldSize/this.zoomScale(t.zoom),o=[t.column*i,t.row*i,0,1];return vec4.transformMat4(o,o,this.pixelMatrix),new Point(o[0]/o[3],o[1]/o[3])},Transform.prototype.calculatePosMatrix=function(t,i){void 0===i&&(i=1/0),t instanceof TileCoord&&(t=t.toCoordinate(i));var o=Math.min(t.zoom,i),e=this.worldSize/Math.pow(2,o),r=new Float64Array(16);return mat4.identity(r),mat4.translate(r,r,[t.column*e,t.row*e,0]),mat4.scale(r,r,[e/EXTENT,e/EXTENT,1]),mat4.multiply(r,this.projMatrix,r),new Float32Array(r)},Transform.prototype._constrain=function(){if(this.center&&this.width&&this.height&&!this._constraining){this._constraining=!0;var t,i,o,e,r,n,s,a,h=this.size,c=this._unmodified;this.latRange&&(t=this.latY(this.latRange[1]),i=this.latY(this.latRange[0]),r=i-ti&&(a=i-p)}if(this.lngRange){var u=this.x,d=h.x/2;u-de&&(s=e-d)}void 0===s&&void 0===a||(this.center=this.unproject(new Point(void 0!==s?s:this.x,void 0!==a?a:this.y))),this._unmodified=c,this._constraining=!1}},Transform.prototype._calcMatrices=function(){if(this.height){var t=Math.atan(.5/this.altitude),i=Math.sin(t)*this.altitude/Math.sin(Math.PI/2-this._pitch-t),o=Math.cos(Math.PI/2-this._pitch)*i+this.altitude,e=new Float64Array(16);mat4.perspective(e,2*Math.atan(this.height/2/this.altitude),this.width/this.height,.1,o),mat4.translate(e,e,[0,0,-this.altitude]),mat4.scale(e,e,[1,-1,1/this.height]),mat4.rotateX(e,e,this._pitch),mat4.rotateZ(e,e,this.angle),mat4.translate(e,e,[-this.x,-this.y,0]);var r=2*Math.PI*6378137;if(mat4.scale(e,e,[1,1,Math.pow(2,this.zoom)*this.tileSize/(r*Math.abs(Math.cos(this.center.lat*(Math.PI/180)))),1]),this.projMatrix=e,e=mat4.create(),mat4.scale(e,e,[this.width/2,-this.height/2,1]),mat4.translate(e,e,[1,-1,0]),this.pixelMatrix=mat4.multiply(new Float64Array(16),e,this.projMatrix),e=mat4.invert(new Float64Array(16),this.pixelMatrix),!e)throw new Error("failed to invert matrix");this.pixelMatrixInverse=e,e=mat2.create(),mat2.scale(e,e,[1,Math.cos(this._pitch)]),mat2.rotate(e,e,this.angle),this.lineAntialiasingMatrix=e;var n=Math.sqrt(this.height*this.height/4*(1+this.altitude*this.altitude));this.lineStretch=(n+this.height/2*Math.tan(this._pitch))/n-1}},Object.defineProperties(Transform.prototype,prototypeAccessors),module.exports=Transform; +},{"../data/extent":11,"../source/tile_coord":50,"../util/interpolate":118,"../util/util":126,"./coordinate":18,"./lng_lat":19,"gl-matrix":144,"point-geometry":194}],22:[function(require,module,exports){ +"use strict";var WorkerPool=require("./util/worker_pool"),globalWorkerPool;module.exports=function(){return globalWorkerPool||(globalWorkerPool=new WorkerPool),globalWorkerPool}; +},{"./util/worker_pool":129}],23:[function(require,module,exports){ +"use strict";var simplexFont={" ":[16,[]],"!":[10,[5,21,5,7,-1,-1,5,2,4,1,5,0,6,1,5,2]],'"':[16,[4,21,4,14,-1,-1,12,21,12,14]],"#":[21,[11,25,4,-7,-1,-1,17,25,10,-7,-1,-1,4,12,18,12,-1,-1,3,6,17,6]],$:[20,[8,25,8,-4,-1,-1,12,25,12,-4,-1,-1,17,18,15,20,12,21,8,21,5,20,3,18,3,16,4,14,5,13,7,12,13,10,15,9,16,8,17,6,17,3,15,1,12,0,8,0,5,1,3,3]],"%":[24,[21,21,3,0,-1,-1,8,21,10,19,10,17,9,15,7,14,5,14,3,16,3,18,4,20,6,21,8,21,10,20,13,19,16,19,19,20,21,21,-1,-1,17,7,15,6,14,4,14,2,16,0,18,0,20,1,21,3,21,5,19,7,17,7]],"&":[26,[23,12,23,13,22,14,21,14,20,13,19,11,17,6,15,3,13,1,11,0,7,0,5,1,4,2,3,4,3,6,4,8,5,9,12,13,13,14,14,16,14,18,13,20,11,21,9,20,8,18,8,16,9,13,11,10,16,3,18,1,20,0,22,0,23,1,23,2]],"'":[10,[5,19,4,20,5,21,6,20,6,18,5,16,4,15]],"(":[14,[11,25,9,23,7,20,5,16,4,11,4,7,5,2,7,-2,9,-5,11,-7]],")":[14,[3,25,5,23,7,20,9,16,10,11,10,7,9,2,7,-2,5,-5,3,-7]],"*":[16,[8,21,8,9,-1,-1,3,18,13,12,-1,-1,13,18,3,12]],"+":[26,[13,18,13,0,-1,-1,4,9,22,9]],",":[10,[6,1,5,0,4,1,5,2,6,1,6,-1,5,-3,4,-4]],"-":[26,[4,9,22,9]],".":[10,[5,2,4,1,5,0,6,1,5,2]],"/":[22,[20,25,2,-7]],0:[20,[9,21,6,20,4,17,3,12,3,9,4,4,6,1,9,0,11,0,14,1,16,4,17,9,17,12,16,17,14,20,11,21,9,21]],1:[20,[6,17,8,18,11,21,11,0]],2:[20,[4,16,4,17,5,19,6,20,8,21,12,21,14,20,15,19,16,17,16,15,15,13,13,10,3,0,17,0]],3:[20,[5,21,16,21,10,13,13,13,15,12,16,11,17,8,17,6,16,3,14,1,11,0,8,0,5,1,4,2,3,4]],4:[20,[13,21,3,7,18,7,-1,-1,13,21,13,0]],5:[20,[15,21,5,21,4,12,5,13,8,14,11,14,14,13,16,11,17,8,17,6,16,3,14,1,11,0,8,0,5,1,4,2,3,4]],6:[20,[16,18,15,20,12,21,10,21,7,20,5,17,4,12,4,7,5,3,7,1,10,0,11,0,14,1,16,3,17,6,17,7,16,10,14,12,11,13,10,13,7,12,5,10,4,7]],7:[20,[17,21,7,0,-1,-1,3,21,17,21]],8:[20,[8,21,5,20,4,18,4,16,5,14,7,13,11,12,14,11,16,9,17,7,17,4,16,2,15,1,12,0,8,0,5,1,4,2,3,4,3,7,4,9,6,11,9,12,13,13,15,14,16,16,16,18,15,20,12,21,8,21]],9:[20,[16,14,15,11,13,9,10,8,9,8,6,9,4,11,3,14,3,15,4,18,6,20,9,21,10,21,13,20,15,18,16,14,16,9,15,4,13,1,10,0,8,0,5,1,4,3]],":":[10,[5,14,4,13,5,12,6,13,5,14,-1,-1,5,2,4,1,5,0,6,1,5,2]],";":[10,[5,14,4,13,5,12,6,13,5,14,-1,-1,6,1,5,0,4,1,5,2,6,1,6,-1,5,-3,4,-4]],"<":[24,[20,18,4,9,20,0]],"=":[26,[4,12,22,12,-1,-1,4,6,22,6]],">":[24,[4,18,20,9,4,0]],"?":[18,[3,16,3,17,4,19,5,20,7,21,11,21,13,20,14,19,15,17,15,15,14,13,13,12,9,10,9,7,-1,-1,9,2,8,1,9,0,10,1,9,2]],"@":[27,[18,13,17,15,15,16,12,16,10,15,9,14,8,11,8,8,9,6,11,5,14,5,16,6,17,8,-1,-1,12,16,10,14,9,11,9,8,10,6,11,5,-1,-1,18,16,17,8,17,6,19,5,21,5,23,7,24,10,24,12,23,15,22,17,20,19,18,20,15,21,12,21,9,20,7,19,5,17,4,15,3,12,3,9,4,6,5,4,7,2,9,1,12,0,15,0,18,1,20,2,21,3,-1,-1,19,16,18,8,18,6,19,5]],A:[18,[9,21,1,0,-1,-1,9,21,17,0,-1,-1,4,7,14,7]],B:[21,[4,21,4,0,-1,-1,4,21,13,21,16,20,17,19,18,17,18,15,17,13,16,12,13,11,-1,-1,4,11,13,11,16,10,17,9,18,7,18,4,17,2,16,1,13,0,4,0]],C:[21,[18,16,17,18,15,20,13,21,9,21,7,20,5,18,4,16,3,13,3,8,4,5,5,3,7,1,9,0,13,0,15,1,17,3,18,5]],D:[21,[4,21,4,0,-1,-1,4,21,11,21,14,20,16,18,17,16,18,13,18,8,17,5,16,3,14,1,11,0,4,0]],E:[19,[4,21,4,0,-1,-1,4,21,17,21,-1,-1,4,11,12,11,-1,-1,4,0,17,0]],F:[18,[4,21,4,0,-1,-1,4,21,17,21,-1,-1,4,11,12,11]],G:[21,[18,16,17,18,15,20,13,21,9,21,7,20,5,18,4,16,3,13,3,8,4,5,5,3,7,1,9,0,13,0,15,1,17,3,18,5,18,8,-1,-1,13,8,18,8]],H:[22,[4,21,4,0,-1,-1,18,21,18,0,-1,-1,4,11,18,11]],I:[8,[4,21,4,0]],J:[16,[12,21,12,5,11,2,10,1,8,0,6,0,4,1,3,2,2,5,2,7]],K:[21,[4,21,4,0,-1,-1,18,21,4,7,-1,-1,9,12,18,0]],L:[17,[4,21,4,0,-1,-1,4,0,16,0]],M:[24,[4,21,4,0,-1,-1,4,21,12,0,-1,-1,20,21,12,0,-1,-1,20,21,20,0]],N:[22,[4,21,4,0,-1,-1,4,21,18,0,-1,-1,18,21,18,0]],O:[22,[9,21,7,20,5,18,4,16,3,13,3,8,4,5,5,3,7,1,9,0,13,0,15,1,17,3,18,5,19,8,19,13,18,16,17,18,15,20,13,21,9,21]],P:[21,[4,21,4,0,-1,-1,4,21,13,21,16,20,17,19,18,17,18,14,17,12,16,11,13,10,4,10]],Q:[22,[9,21,7,20,5,18,4,16,3,13,3,8,4,5,5,3,7,1,9,0,13,0,15,1,17,3,18,5,19,8,19,13,18,16,17,18,15,20,13,21,9,21,-1,-1,12,4,18,-2]],R:[21,[4,21,4,0,-1,-1,4,21,13,21,16,20,17,19,18,17,18,15,17,13,16,12,13,11,4,11,-1,-1,11,11,18,0]],S:[20,[17,18,15,20,12,21,8,21,5,20,3,18,3,16,4,14,5,13,7,12,13,10,15,9,16,8,17,6,17,3,15,1,12,0,8,0,5,1,3,3]],T:[16,[8,21,8,0,-1,-1,1,21,15,21]],U:[22,[4,21,4,6,5,3,7,1,10,0,12,0,15,1,17,3,18,6,18,21]],V:[18,[1,21,9,0,-1,-1,17,21,9,0]],W:[24,[2,21,7,0,-1,-1,12,21,7,0,-1,-1,12,21,17,0,-1,-1,22,21,17,0]],X:[20,[3,21,17,0,-1,-1,17,21,3,0]],Y:[18,[1,21,9,11,9,0,-1,-1,17,21,9,11]],Z:[20,[17,21,3,0,-1,-1,3,21,17,21,-1,-1,3,0,17,0]],"[":[14,[4,25,4,-7,-1,-1,5,25,5,-7,-1,-1,4,25,11,25,-1,-1,4,-7,11,-7]],"\\":[14,[0,21,14,-3]],"]":[14,[9,25,9,-7,-1,-1,10,25,10,-7,-1,-1,3,25,10,25,-1,-1,3,-7,10,-7]],"^":[16,[6,15,8,18,10,15,-1,-1,3,12,8,17,13,12,-1,-1,8,17,8,0]],_:[16,[0,-2,16,-2]],"`":[10,[6,21,5,20,4,18,4,16,5,15,6,16,5,17]],a:[19,[15,14,15,0,-1,-1,15,11,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3]],b:[19,[4,21,4,0,-1,-1,4,11,6,13,8,14,11,14,13,13,15,11,16,8,16,6,15,3,13,1,11,0,8,0,6,1,4,3]],c:[18,[15,11,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3]],d:[19,[15,21,15,0,-1,-1,15,11,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3]],e:[18,[3,8,15,8,15,10,14,12,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3]],f:[12,[10,21,8,21,6,20,5,17,5,0,-1,-1,2,14,9,14]],g:[19,[15,14,15,-2,14,-5,13,-6,11,-7,8,-7,6,-6,-1,-1,15,11,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3]],h:[19,[4,21,4,0,-1,-1,4,10,7,13,9,14,12,14,14,13,15,10,15,0]],i:[8,[3,21,4,20,5,21,4,22,3,21,-1,-1,4,14,4,0]],j:[10,[5,21,6,20,7,21,6,22,5,21,-1,-1,6,14,6,-3,5,-6,3,-7,1,-7]],k:[17,[4,21,4,0,-1,-1,14,14,4,4,-1,-1,8,8,15,0]],l:[8,[4,21,4,0]],m:[30,[4,14,4,0,-1,-1,4,10,7,13,9,14,12,14,14,13,15,10,15,0,-1,-1,15,10,18,13,20,14,23,14,25,13,26,10,26,0]],n:[19,[4,14,4,0,-1,-1,4,10,7,13,9,14,12,14,14,13,15,10,15,0]],o:[19,[8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3,16,6,16,8,15,11,13,13,11,14,8,14]],p:[19,[4,14,4,-7,-1,-1,4,11,6,13,8,14,11,14,13,13,15,11,16,8,16,6,15,3,13,1,11,0,8,0,6,1,4,3]],q:[19,[15,14,15,-7,-1,-1,15,11,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3]],r:[13,[4,14,4,0,-1,-1,4,8,5,11,7,13,9,14,12,14]],s:[17,[14,11,13,13,10,14,7,14,4,13,3,11,4,9,6,8,11,7,13,6,14,4,14,3,13,1,10,0,7,0,4,1,3,3]],t:[12,[5,21,5,4,6,1,8,0,10,0,-1,-1,2,14,9,14]],u:[19,[4,14,4,4,5,1,7,0,10,0,12,1,15,4,-1,-1,15,14,15,0]],v:[16,[2,14,8,0,-1,-1,14,14,8,0]],w:[22,[3,14,7,0,-1,-1,11,14,7,0,-1,-1,11,14,15,0,-1,-1,19,14,15,0]],x:[17,[3,14,14,0,-1,-1,14,14,3,0]],y:[16,[2,14,8,0,-1,-1,14,14,8,0,6,-4,4,-6,2,-7,1,-7]],z:[17,[14,14,3,0,-1,-1,3,14,14,14,-1,-1,3,0,14,0]],"{":[14,[9,25,7,24,6,23,5,21,5,19,6,17,7,16,8,14,8,12,6,10,-1,-1,7,24,6,22,6,20,7,18,8,17,9,15,9,13,8,11,4,9,8,7,9,5,9,3,8,1,7,0,6,-2,6,-4,7,-6,-1,-1,6,8,8,6,8,4,7,2,6,1,5,-1,5,-3,6,-5,7,-6,9,-7]],"|":[8,[4,25,4,-7]],"}":[14,[5,25,7,24,8,23,9,21,9,19,8,17,7,16,6,14,6,12,8,10,-1,-1,7,24,8,22,8,20,7,18,6,17,5,15,5,13,6,11,10,9,6,7,5,5,5,3,6,1,7,0,8,-2,8,-4,7,-6,-1,-1,8,8,6,6,6,4,7,2,8,1,9,-1,9,-3,8,-5,7,-6,5,-7]],"~":[24,[3,6,3,8,4,11,6,12,8,12,10,11,14,8,16,7,18,7,20,8,21,10,-1,-1,3,8,4,10,6,11,8,11,10,10,14,7,16,6,18,6,20,7,21,10,21,12]]};module.exports=function(l,n,t,e){e=e||1;var r,o,u,s,i,x,f,p,h=[];for(r=0,o=l.length;r0?1/(1-r):1+r}function saturationFactor(r){return r>0?1-1/(1.001-r):-r}function getOpacities(r,t,a,e){var i=[1,0],o=a.paint["raster-fade-duration"];if(r.sourceCache&&o>0){var n=Date.now(),u=(n-r.timeAdded)/o,s=t?(n-t.timeAdded)/o:-1,c=r.sourceCache.getSource(),f=e.coveringZoomLevel({tileSize:c.tileSize,roundZoom:c.roundZoom}),d=!t||Math.abs(t.coord.z-f)>Math.abs(r.coord.z-f);i[0]=util.clamp(d?u:1-s,0,1),i[1]=t?1-i[0]:0}var m=a.paint["raster-opacity"];return i[0]*=m,i[1]*=m,i}var util=require("../util/util");module.exports=drawRaster; +},{"../util/util":126}],33:[function(require,module,exports){ +"use strict";function drawSymbols(t,e,i,a){if(!t.isOpaquePass){var o=!(i.layout["text-allow-overlap"]||i.layout["icon-allow-overlap"]||i.layout["text-ignore-placement"]||i.layout["icon-ignore-placement"]),r=t.gl;o?r.disable(r.STENCIL_TEST):r.enable(r.STENCIL_TEST),t.setDepthSublayer(0),t.depthMask(!1),drawLayerSymbols(t,e,i,a,!1,i.paint["icon-translate"],i.paint["icon-translate-anchor"],i.layout["icon-rotation-alignment"],i.layout["icon-rotation-alignment"],i.layout["icon-size"],i.paint["icon-halo-width"],i.paint["icon-halo-color"],i.paint["icon-halo-blur"],i.paint["icon-opacity"],i.paint["icon-color"]),drawLayerSymbols(t,e,i,a,!0,i.paint["text-translate"],i.paint["text-translate-anchor"],i.layout["text-rotation-alignment"],i.layout["text-pitch-alignment"],i.layout["text-size"],i.paint["text-halo-width"],i.paint["text-halo-color"],i.paint["text-halo-blur"],i.paint["text-opacity"],i.paint["text-color"]),e.map.showCollisionBoxes&&drawCollisionDebug(t,e,i,a)}}function drawLayerSymbols(t,e,i,a,o,r,l,n,s,u,f,m,p,c,d){if(o||!t.style.sprite||t.style.sprite.loaded()){var h=t.gl,b="map"===n,x="map"===s,g=x;g?h.enable(h.DEPTH_TEST):h.disable(h.DEPTH_TEST);for(var _,y=0,T=a;ythis.previousZoom;a--)r.changeTimes[a]=e,r.changeOpacities[a]=r.opacities[a];for(a=0;a<256;a++){var s=e-r.changeTimes[a],o=255*(i?s/i:1);a<=t?r.opacities[a]=r.changeOpacities[a]+o:r.opacities[a]=r.changeOpacities[a]-o}this.changed=!0,this.previousZoom=t},FrameHistory.prototype.bind=function(e){this.texture?(e.bindTexture(e.TEXTURE_2D,this.texture),this.changed&&(e.texSubImage2D(e.TEXTURE_2D,0,0,0,256,1,e.ALPHA,e.UNSIGNED_BYTE,this.array),this.changed=!1)):(this.texture=e.createTexture(),e.bindTexture(e.TEXTURE_2D,this.texture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST),e.texImage2D(e.TEXTURE_2D,0,e.ALPHA,256,1,0,e.ALPHA,e.UNSIGNED_BYTE,this.array))},module.exports=FrameHistory; +},{}],35:[function(require,module,exports){ +"use strict";var util=require("../util/util"),LineAtlas=function(t,i){this.width=t,this.height=i,this.nextRow=0,this.bytes=4,this.data=new Uint8Array(this.width*this.height*this.bytes),this.positions={}};LineAtlas.prototype.setSprite=function(t){this.sprite=t},LineAtlas.prototype.getDash=function(t,i){var e=t.join(",")+i;return this.positions[e]||(this.positions[e]=this.addDash(t,i)),this.positions[e]},LineAtlas.prototype.addDash=function(t,i){var e=this,h=i?7:0,s=2*h+1,a=128;if(this.nextRow+s>this.height)return util.warnOnce("LineAtlas out of space"),null;for(var r=0,n=0;n0?a.pop():null}},Painter.prototype.getViewportTexture=function(e,r){if(this.reusableTextures.viewport){var t=this.reusableTextures.viewport.texture;return t.width===e&&t.height===r?t:(this.gl.deleteTexture(t),void(this.reusableTextures.viewport.texture=null))}},Painter.prototype.lineWidth=function(e){this.gl.lineWidth(util.clamp(e,this.lineWidthRange[0],this.lineWidthRange[1]))},Painter.prototype.showOverdrawInspector=function(e){if(e||this._showOverdrawInspector){this._showOverdrawInspector=e;var r=this.gl;if(e){r.blendFunc(r.CONSTANT_COLOR,r.ONE);var t=8,a=1/t;r.blendColor(a,a,a,0),r.clearColor(0,0,0,1),r.clear(r.COLOR_BUFFER_BIT)}else r.blendFunc(r.ONE,r.ONE_MINUS_SRC_ALPHA)}},Painter.prototype.createProgram=function(e,r){var t=this.gl,a=t.createProgram(),i=shaders[e],s="#define MAPBOX_GL_JS;\n";this._showOverdrawInspector&&(s+="#define OVERDRAW_INSPECTOR;\n");var o=t.createShader(t.FRAGMENT_SHADER);t.shaderSource(o,r.applyPragmas(s+shaders.prelude.fragmentSource+i.fragmentSource,"fragment")),t.compileShader(o),t.attachShader(a,o);var n=t.createShader(t.VERTEX_SHADER);t.shaderSource(n,r.applyPragmas(s+shaders.prelude.vertexSource+i.vertexSource,"vertex")),t.compileShader(n),t.attachShader(a,n),t.linkProgram(a);for(var l=t.getProgramParameter(a,t.ACTIVE_ATTRIBUTES),u={program:a,numAttributes:l},h=0;h>16,n>>16),o.uniform2f(i.u_pixel_coord_lower,65535&u,65535&n)}; +},{"../source/pixels_to_tile_units":44}],38:[function(require,module,exports){ +"use strict";var VertexArrayObject=function(){this.boundProgram=null,this.boundVertexBuffer=null,this.boundVertexBuffer2=null,this.boundElementBuffer=null,this.boundVertexOffset=null,this.vao=null};VertexArrayObject.prototype.bind=function(e,t,r,i,n,o){void 0===e.extVertexArrayObject&&(e.extVertexArrayObject=e.getExtension("OES_vertex_array_object"));var s=!this.vao||this.boundProgram!==t||this.boundVertexBuffer!==r||this.boundVertexBuffer2!==n||this.boundElementBuffer!==i||this.boundVertexOffset!==o;!e.extVertexArrayObject||s?(this.freshBind(e,t,r,i,n,o),this.gl=e):e.extVertexArrayObject.bindVertexArrayOES(this.vao)},VertexArrayObject.prototype.freshBind=function(e,t,r,i,n,o){var s,u=t.numAttributes;if(e.extVertexArrayObject)this.vao&&this.destroy(),this.vao=e.extVertexArrayObject.createVertexArrayOES(),e.extVertexArrayObject.bindVertexArrayOES(this.vao),s=0,this.boundProgram=t,this.boundVertexBuffer=r,this.boundVertexBuffer2=n,this.boundElementBuffer=i,this.boundVertexOffset=o;else{s=e.currentNumAttributes||0;for(var b=u;bthis.maxzoom?Math.pow(2,t.coord.z-this.maxzoom):1,r={type:this.type,uid:t.uid,coord:t.coord,zoom:t.coord.z,maxZoom:this.maxzoom,tileSize:this.tileSize,source:this.id,overscaling:i,angle:this.map.transform.angle,pitch:this.map.transform.pitch,showCollisionBoxes:this.map.showCollisionBoxes};t.workerID=this.dispatcher.send("loadTile",r,function(i,r){if(t.unloadVectorData(),!t.aborted)return i?e(i):(t.loadVectorData(r,o.map.painter),t.redoWhenDone&&(t.redoWhenDone=!1,t.redoPlacement(o)),e(null))},this.workerID)},e.prototype.abortTile=function(t){t.aborted=!0},e.prototype.unloadTile=function(t){t.unloadVectorData(),this.dispatcher.send("removeTile",{uid:t.uid,type:this.type,source:this.id},function(){},t.workerID)},e.prototype.serialize=function(){return{type:this.type,data:this._data}},e}(Evented);module.exports=GeoJSONSource; +},{"../data/extent":11,"../util/evented":115,"../util/util":126,"../util/window":109}],40:[function(require,module,exports){ +"use strict";var ajax=require("../util/ajax"),rewind=require("geojson-rewind"),GeoJSONWrapper=require("./geojson_wrapper"),vtpbf=require("vt-pbf"),supercluster=require("supercluster"),geojsonvt=require("geojson-vt"),VectorTileWorkerSource=require("./vector_tile_worker_source"),GeoJSONWorkerSource=function(e){function r(r,t,o){e.call(this,r,t),o&&(this.loadGeoJSON=o),this._geoJSONIndexes={}}return e&&(r.__proto__=e),r.prototype=Object.create(e&&e.prototype),r.prototype.constructor=r,r.prototype.loadVectorData=function(e,r){var t=e.source,o=e.coord;if(!this._geoJSONIndexes[t])return r(null,null);var n=this._geoJSONIndexes[t].getTile(Math.min(o.z,e.maxZoom),o.x,o.y);if(!n)return r(null,null);var a=new GeoJSONWrapper(n.features);a.name="_geojsonTileLayer";var u=vtpbf({layers:{_geojsonTileLayer:a}});0===u.byteOffset&&u.byteLength===u.buffer.byteLength||(u=new Uint8Array(u)),a.rawData=u.buffer,r(null,a)},r.prototype.loadData=function(e,r){var t=function(t,o){var n=this;return t?r(t):"object"!=typeof o?r(new Error("Input data is not a valid GeoJSON object.")):(rewind(o,!0),void this._indexData(o,e,function(t,o){return t?r(t):(n._geoJSONIndexes[e.source]=o,void r(null))}))}.bind(this);this.loadGeoJSON(e,t)},r.prototype.loadGeoJSON=function(e,r){if(e.url)ajax.getJSON(e.url,r);else{if("string"!=typeof e.data)return r(new Error("Input data is not a valid GeoJSON object."));try{return r(null,JSON.parse(e.data))}catch(e){return r(new Error("Input data is not a valid GeoJSON object."))}}},r.prototype._indexData=function(e,r,t){try{r.cluster?t(null,supercluster(r.superclusterOptions).load(e.features)):t(null,geojsonvt(e,r.geojsonVtOptions))}catch(e){return t(e)}},r}(VectorTileWorkerSource);module.exports=GeoJSONWorkerSource; +},{"../util/ajax":106,"./geojson_wrapper":41,"./vector_tile_worker_source":52,"geojson-rewind":135,"geojson-vt":139,"supercluster":198,"vt-pbf":208}],41:[function(require,module,exports){ +"use strict";var Point=require("point-geometry"),VectorTileFeature=require("vector-tile").VectorTileFeature,EXTENT=require("../data/extent"),FeatureWrapper=function(e){var t=this;if(this.type=e.type,1===e.type){this.rawGeometry=[];for(var r=0;rt)){var n=Math.pow(2,Math.min(a.coord.z,r._source.maxzoom)-Math.min(e.z,r._source.maxzoom));if(Math.floor(a.coord.x/n)===e.x&&Math.floor(a.coord.y/n)===e.y)for(o[s]=!0,i=!0;a&&a.coord.z-1>e.z;){var d=a.coord.parent(r._source.maxzoom).id;a=r._tiles[d],a&&a.hasData()&&(delete o[s],o[d]=!0)}}}return i},t.prototype.findLoadedParent=function(e,t,o){for(var r=this,i=e.z-1;i>=t;i--){e=e.parent(r._source.maxzoom);var s=r._tiles[e.id];if(s&&s.hasData())return o[e.id]=!0,s;if(r._cache.has(e.id))return r.addTile(e),o[e.id]=!0,r._tiles[e.id]}},t.prototype.updateCacheSize=function(e){var t=Math.ceil(e.width/e.tileSize)+1,o=Math.ceil(e.height/e.tileSize)+1,r=t*o,i=5;this._cache.setMaxSize(Math.floor(r*i))},t.prototype.update=function(e){var o=this;if(this._sourceLoaded){var r,i,s;this.updateCacheSize(e);var a=(this._source.roundZoom?Math.round:Math.floor)(this.getZoom(e)),n=Math.max(a-t.maxOverzooming,this._source.minzoom),d=Math.max(a+t.maxUnderzooming,this._source.minzoom),c={};this._coveredTiles={};var h;for(h=this.used?this._source.coord?[this._source.coord]:e.coveringTiles({tileSize:this._source.tileSize,minzoom:this._source.minzoom,maxzoom:this._source.maxzoom,roundZoom:this._source.roundZoom,reparseOverscaled:this._source.reparseOverscaled}):[],r=0;r=Date.now()&&(o.findLoadedChildren(i,d,c)&&(c[_]=!0),o.findLoadedParent(i,n,u))}var m;for(m in u)c[m]||(o._coveredTiles[m]=!0);for(m in u)c[m]=!0;var f=util.keysDifference(this._tiles,c);for(r=0;rthis._source.maxzoom?Math.pow(2,r-this._source.maxzoom):1;t=new Tile(o,this._source.tileSize*i,this._source.maxzoom),this.loadTile(t,this._tileLoaded.bind(this,t))}return t.uses++,this._tiles[e.id]=t,this._source.fire("dataloading",{tile:t,dataType:"tile"}),t},t.prototype.removeTile=function(e){var t=this._tiles[e];t&&(t.uses--,delete this._tiles[e],this._source.fire("data",{tile:t,dataType:"tile"}),t.uses>0||(t.hasData()?this._cache.add(t.coord.wrapped().id,t):(t.aborted=!0,this.abortTile(t),this.unloadTile(t))))},t.prototype.clearTiles=function(){var e=this;for(var t in this._tiles)e.removeTile(t);this._cache.reset()},t.prototype.tilesIn=function(e){for(var t=this,o={},r=this.getIds(),i=1/0,s=1/0,a=-(1/0),n=-(1/0),d=e[0].zoom,c=0;c=0&&_[1].y>=0){for(var m=[],f=0;fi.row){var o=t;t=i,i=o}return{x0:t.column,y0:t.row,x1:i.column,y1:i.row,dx:i.column-t.column,dy:i.row-t.row}}function scanSpans(t,i,o,r,e){var n=Math.max(o,Math.floor(i.y0)),h=Math.min(r,Math.ceil(i.y1));if(t.x0===i.x0&&t.y0===i.y0?t.x0+i.dy/t.dy*t.dx0,l=i.dx<0,u=n;ua.dy&&(h=s,s=a,a=h),s.dy>d.dy&&(h=s,s=d,d=h),a.dy>d.dy&&(h=a,a=d,d=h),s.dy&&scanSpans(d,s,r,e,n),a.dy&&scanSpans(d,a,r,e,n)}function getQuadkey(t,i,o){for(var r,e="",n=t;n>0;n--)r=1<t?new TileCoord(this.z-1,this.x,this.y,this.w):new TileCoord(this.z-1,Math.floor(this.x/2),Math.floor(this.y/2),this.w)},TileCoord.prototype.wrapped=function(){return new TileCoord(this.z,this.x,this.y,0)},TileCoord.prototype.children=function(t){if(this.z>=t)return[new TileCoord(this.z+1,this.x,this.y,this.w)];var i=this.z+1,o=2*this.x,r=2*this.y;return[new TileCoord(i,o,r,this.w),new TileCoord(i,o+1,r,this.w),new TileCoord(i,o,r+1,this.w),new TileCoord(i,o+1,r+1,this.w)]},TileCoord.cover=function(t,i,o){function r(t,i,r){var h,s,a;if(r>=0&&r<=e)for(h=t;hthis.maxzoom?Math.pow(2,e.coord.z-this.maxzoom):1,r={url:normalizeURL(e.coord.url(this.tiles,this.maxzoom,this.scheme),this.url),uid:e.uid,coord:e.coord,zoom:e.coord.z,tileSize:this.tileSize*o,type:this.type,source:this.id,overscaling:o,angle:this.map.transform.angle,pitch:this.map.transform.pitch,showCollisionBoxes:this.map.showCollisionBoxes};e.workerID?"loading"===e.state?e.reloadCallback=t:this.dispatcher.send("reloadTile",r,i.bind(this),e.workerID):e.workerID=this.dispatcher.send("loadTile",r,i.bind(this))},t.prototype.abortTile=function(e){this.dispatcher.send("abortTile",{uid:e.uid,type:this.type,source:this.id},null,e.workerID)},t.prototype.unloadTile=function(e){e.unloadVectorData(),this.dispatcher.send("removeTile",{uid:e.uid,type:this.type,source:this.id},null,e.workerID)},t}(Evented);module.exports=VectorTileSource; +},{"../util/evented":115,"../util/mapbox":122,"../util/util":126,"./load_tilejson":43}],52:[function(require,module,exports){ +"use strict";var ajax=require("../util/ajax"),vt=require("vector-tile"),Protobuf=require("pbf"),WorkerTile=require("./worker_tile"),util=require("../util/util"),VectorTileWorkerSource=function(e,r,o){this.actor=e,this.layerIndex=r,o&&(this.loadVectorData=o),this.loading={},this.loaded={}};VectorTileWorkerSource.prototype.loadTile=function(e,r){function o(e,o){return delete this.loading[t][i],e?r(e):o?(a.vectorTile=o,a.parse(o,this.layerIndex,this.actor,function(e,t,i){return e?r(e):void r(null,util.extend({rawTileData:o.rawData},t),i)}),this.loaded[t]=this.loaded[t]||{},void(this.loaded[t][i]=a)):r(null,null)}var t=e.source,i=e.uid;this.loading[t]||(this.loading[t]={});var a=this.loading[t][i]=new WorkerTile(e);a.abort=this.loadVectorData(e,o.bind(this))},VectorTileWorkerSource.prototype.reloadTile=function(e,r){var o=this.loaded[e.source],t=e.uid;if(o&&o[t]){var i=o[t];i.parse(i.vectorTile,this.layerIndex,this.actor,r)}},VectorTileWorkerSource.prototype.abortTile=function(e){var r=this.loading[e.source],o=e.uid;r&&r[o]&&r[o].abort&&(r[o].abort(),delete r[o])},VectorTileWorkerSource.prototype.removeTile=function(e){var r=this.loaded[e.source],o=e.uid;r&&r[o]&&delete r[o]},VectorTileWorkerSource.prototype.loadVectorData=function(e,r){function o(e,o){if(e)return r(e);var t=new vt.VectorTile(new Protobuf(o));t.rawData=o,r(e,t)}var t=ajax.getArrayBuffer(e.url,o.bind(this));return function(){t.abort()}},VectorTileWorkerSource.prototype.redoPlacement=function(e,r){var o=this.loaded[e.source],t=this.loading[e.source],i=e.uid;if(o&&o[i]){var a=o[i],l=a.redoPlacement(e.angle,e.pitch,e.showCollisionBoxes);l.result&&r(null,l.result,l.transferables)}else t&&t[i]&&(t[i].angle=e.angle)},module.exports=VectorTileWorkerSource; +},{"../util/ajax":106,"../util/util":126,"./worker_tile":55,"pbf":193,"vector-tile":204}],53:[function(require,module,exports){ +"use strict";var ajax=require("../util/ajax"),ImageSource=require("./image_source"),VideoSource=function(e){function t(t,o,i,r){e.call(this,t,o,i,r),this.roundZoom=!0}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype._load=function(e){var t=this;this.urls=e.urls,ajax.getVideo(e.urls,function(e,o){if(e)return t.fire("error",{error:e});t.video=o,t.video.loop=!0;var i;t.video.addEventListener("playing",function(){i=t.map.style.animationLoop.set(1/0),t.map._rerender()}),t.video.addEventListener("pause",function(){t.map.style.animationLoop.cancel(i)}),t.map&&t.video.play(),t._finishLoading()})},t.prototype.getVideo=function(){return this.video},t.prototype.onAdd=function(e){this.map||(this.map=e,this.video&&(this.video.play(),this.setCoordinates(this.coordinates)))},t.prototype.prepare=function(){!this.tile||this.video.readyState<2||this._prepareImage(this.map.painter.gl,this.video)},t.prototype.serialize=function(){return{type:"video",urls:this.urls,coordinates:this.coordinates}},t}(ImageSource);module.exports=VideoSource; +},{"../util/ajax":106,"./image_source":42}],54:[function(require,module,exports){ +"use strict";var Actor=require("../util/actor"),StyleLayerIndex=require("../style/style_layer_index"),VectorTileWorkerSource=require("./vector_tile_worker_source"),GeoJSONWorkerSource=require("./geojson_worker_source"),Worker=function(e){var r=this;this.self=e,this.actor=new Actor(e,this),this.layerIndexes={},this.workerSourceTypes={vector:VectorTileWorkerSource,geojson:GeoJSONWorkerSource},this.workerSources={},this.self.registerWorkerSource=function(e,o){if(r.workerSourceTypes[e])throw new Error('Worker source with name "'+e+'" already registered.');r.workerSourceTypes[e]=o}};Worker.prototype.setLayers=function(e,r){this.getLayerIndex(e).replace(r)},Worker.prototype.updateLayers=function(e,r){this.getLayerIndex(e).update(r.layers,r.removedIds,r.symbolOrder)},Worker.prototype.loadTile=function(e,r,o){this.getWorkerSource(e,r.type).loadTile(r,o)},Worker.prototype.reloadTile=function(e,r,o){this.getWorkerSource(e,r.type).reloadTile(r,o)},Worker.prototype.abortTile=function(e,r){this.getWorkerSource(e,r.type).abortTile(r)},Worker.prototype.removeTile=function(e,r){this.getWorkerSource(e,r.type).removeTile(r)},Worker.prototype.redoPlacement=function(e,r,o){this.getWorkerSource(e,r.type).redoPlacement(r,o)},Worker.prototype.loadWorkerSource=function(e,r,o){try{this.self.importScripts(r.url),o()}catch(e){o(e)}},Worker.prototype.getLayerIndex=function(e){var r=this.layerIndexes[e];return r||(r=this.layerIndexes[e]=new StyleLayerIndex),r},Worker.prototype.getWorkerSource=function(e,r){var o=this;if(this.workerSources[e]||(this.workerSources[e]={}),!this.workerSources[e][r]){var t={send:function(r,t,i,s){o.actor.send(r,t,i,s,e)}};this.workerSources[e][r]=new this.workerSourceTypes[r](t,this.getLayerIndex(e))}return this.workerSources[e][r]},module.exports=function(e){return new Worker(e)}; +},{"../style/style_layer_index":68,"../util/actor":105,"./geojson_worker_source":40,"./vector_tile_worker_source":52}],55:[function(require,module,exports){ +"use strict";function serializeBuckets(e,r){return e.filter(function(e){return!e.isEmpty()}).map(function(e){return e.serialize(r)})}var FeatureIndex=require("../data/feature_index"),CollisionTile=require("../symbol/collision_tile"),CollisionBoxArray=require("../symbol/collision_box"),DictionaryCoder=require("../util/dictionary_coder"),util=require("../util/util"),SymbolInstancesArray=require("../symbol/symbol_instances"),SymbolQuadsArray=require("../symbol/symbol_quads"),WorkerTile=function(e){this.coord=e.coord,this.uid=e.uid,this.zoom=e.zoom,this.tileSize=e.tileSize,this.source=e.source,this.overscaling=e.overscaling,this.angle=e.angle,this.pitch=e.pitch,this.showCollisionBoxes=e.showCollisionBoxes};WorkerTile.prototype.parse=function(e,r,o,s){var i=this;e.layers||(e={layers:{_geojsonTileLayer:e}}),this.status="parsing",this.data=e,this.collisionBoxArray=new CollisionBoxArray,this.symbolInstancesArray=new SymbolInstancesArray,this.symbolQuadsArray=new SymbolQuadsArray;var l=new CollisionTile(this.angle,this.pitch,this.collisionBoxArray),t=new DictionaryCoder(Object.keys(e.layers).sort()),a=new FeatureIndex(this.coord,this.overscaling,l,e.layers);a.bucketLayerIDs={};var n={},c=0,u={featureIndex:a,iconDependencies:{},glyphDependencies:{}},y=r.familiesBySource[this.source];for(var m in y){var h=e.layers[m];if(h){1===h.version&&util.warnOnce('Vector tile source "'+i.source+'" layer "'+m+'" does not use vector tile spec v2 and therefore may have some rendering errors.');for(var d=t.encode(m),b=[],f=0;f=z.maxzoom||z.layout&&"none"===z.layout.visibility)){for(var x=0,k=A;x=0;D--){var C=n[r.symbolOrder[D]];C&&i.symbolBuckets.push(C)}if(0===this.symbolBuckets.length)return w();var T=0,q=Object.keys(u.iconDependencies),O=util.mapObject(u.glyphDependencies,function(e){return Object.keys(e).map(Number)}),Q=function(e){if(e)return s(e);if(T++,2===T){for(var r=0,o=i.symbolBuckets;r=(new Date).getTime()}),!this.times.length},AnimationLoop.prototype.set=function(t){return this.times.push({id:this.n,time:t+(new Date).getTime()}),this.n++},AnimationLoop.prototype.cancel=function(t){this.times=this.times.filter(function(i){return i.id!==t})},module.exports=AnimationLoop; +},{}],57:[function(require,module,exports){ +"use strict";var Evented=require("../util/evented"),ajax=require("../util/ajax"),browser=require("../util/browser"),normalizeURL=require("../util/mapbox").normalizeSpriteURL,SpritePosition=function(){this.x=0,this.y=0,this.width=0,this.height=0,this.pixelRatio=1,this.sdf=!1},ImageSprite=function(t){function i(i){var e=this;t.call(this),this.base=i,this.retina=browser.devicePixelRatio>1;var a=this.retina?"@2x":"";ajax.getJSON(normalizeURL(i,a,".json"),function(t,i){return t?void e.fire("error",{error:t}):(e.data=i,void(e.imgData&&e.fire("data",{dataType:"style"})))}),ajax.getImage(normalizeURL(i,a,".png"),function(t,i){if(t)return void e.fire("error",{error:t});e.imgData=browser.getImageData(i);for(var a=0;a1!==this.retina){var e=new i(this.base);e.on("data",function(){t.data=e.data,t.imgData=e.imgData,t.width=e.width,t.retina=e.retina})}},i.prototype.getSpritePosition=function(t){if(!this.loaded())return new SpritePosition;var i=this.data&&this.data[t];return i&&this.imgData?i:new SpritePosition},i}(Evented);module.exports=ImageSprite; +},{"../util/ajax":106,"../util/browser":107,"../util/evented":115,"../util/mapbox":122}],58:[function(require,module,exports){ +"use strict";var styleSpec=require("./style_spec"),util=require("../util/util"),Evented=require("../util/evented"),validateStyle=require("./validate_style"),StyleDeclaration=require("./style_declaration"),StyleTransition=require("./style_transition"),TRANSITION_SUFFIX="-transition",Light=function(t){function i(i){t.call(this),this.properties=["anchor","color","position","intensity"],this._specifications=styleSpec.light,this.set(i)}return t&&(i.__proto__=t),i.prototype=Object.create(t&&t.prototype),i.prototype.constructor=i,i.prototype.set=function(t){var i=this;if(!this._validate(validateStyle.light,t)){this._declarations={},this._transitions={},this._transitionOptions={},this.calculated={},t=util.extend({anchor:this._specifications.anchor.default,color:this._specifications.color.default,position:this._specifications.position.default,intensity:this._specifications.intensity.default},t);for(var e=0,o=this.properties;eMath.floor(e)&&(t.lastIntegerZoom=Math.floor(e+1),t.lastIntegerZoomTime=Date.now()),t.lastZoom=e},t.prototype._checkLoaded=function(){if(!this._loaded)throw new Error("Style is not done loading")},t.prototype.update=function(e,t){var r=this;if(this._changed){var i=Object.keys(this._updatedLayers),s=Object.keys(this._removedLayers);(i.length||s.length||this._updatedSymbolOrder)&&this._updateWorkerLayers(i,s);for(var o in this._updatedSources)r._reloadSource(o);this._applyClasses(e,t),this._resetUpdates(),this.fire("data",{dataType:"style"})}},t.prototype._updateWorkerLayers=function(e,t){var r=this,i=this._updatedSymbolOrder?this._order.filter(function(e){return"symbol"===r._layers[e].type}):null;this.dispatcher.broadcast("updateLayers",{layers:this._serializeLayers(e),removedIds:t,symbolOrder:i})},t.prototype._resetUpdates=function(){this._changed=!1,this._updatedLayers={},this._removedLayers={},this._updatedSymbolOrder=!1,this._updatedSources={},this._updatedPaintProps={},this._updatedAllPaintProps=!1},t.prototype.addSource=function(e,t,r){if(this._checkLoaded(),void 0!==this.sourceCaches[e])throw new Error("There is already a source with this ID");if(!t.type)throw new Error("The type property must be defined, but the only the following properties were given: "+Object.keys(t)+".");var i=["vector","raster","geojson","video","image"],s=i.indexOf(t.type)>=0;if(!s||!this._validate(validateStyle.source,"sources."+e,t,null,r)){var o=this.sourceCaches[e]=new SourceCache(e,t,this.dispatcher);o.style=this,o.setEventedParent(this,{source:o.getSource()}),o.onAdd&&o.onAdd(this.map),this._changed=!0}},t.prototype.removeSource=function(e){if(this._checkLoaded(),void 0===this.sourceCaches[e])throw new Error("There is no source with this ID");var t=this.sourceCaches[e];delete this.sourceCaches[e],delete this._updatedSources[e],t.setEventedParent(null),t.clearTiles(),t.onRemove&&t.onRemove(this.map),this._changed=!0},t.prototype.getSource=function(e){return this.sourceCaches[e]&&this.sourceCaches[e].getSource()},t.prototype.addLayer=function(e,t,r){this._checkLoaded();var i=e.id;if(!this._validate(validateStyle.layer,"layers."+i,e,{arrayIndex:-1},r)){var s=StyleLayer.create(e);this._validateLayer(s),s.setEventedParent(this,{layer:{id:i}});var o=t?this._order.indexOf(t):this._order.length;this._order.splice(o,0,i),this._layers[i]=s,delete this._removedLayers[i],this._updateLayer(s),"symbol"===s.type&&(this._updatedSymbolOrder=!0),this.updateClasses(i)}},t.prototype.moveLayer=function(e,t){this._checkLoaded(),this._changed=!0;var r=this._layers[e];if(!r)throw new Error("Layer not found: "+e);var i=this._order.indexOf(e);this._order.splice(i,1);var s=t?this._order.indexOf(t):this._order.length;this._order.splice(s,0,e),"symbol"===r.type&&(this._updatedSymbolOrder=!0,r.source&&(this._updatedSources[r.source]=!0))},t.prototype.removeLayer=function(e){this._checkLoaded();var t=this._layers[e];if(!t)throw new Error("Layer not found: "+e);t.setEventedParent(null);var r=this._order.indexOf(e);this._order.splice(r,1),"symbol"===t.type&&(this._updatedSymbolOrder=!0),this._changed=!0,this._removedLayers[e]=!0,delete this._layers[e],delete this._updatedLayers[e],delete this._updatedPaintProps[e]},t.prototype.getLayer=function(e){return this._layers[e]},t.prototype.setLayerZoomRange=function(e,t,r){this._checkLoaded();var i=this.getLayer(e);i.minzoom===t&&i.maxzoom===r||(null!=t&&(i.minzoom=t),null!=r&&(i.maxzoom=r),this._updateLayer(i))},t.prototype.setFilter=function(e,t){this._checkLoaded();var r=this.getLayer(e);null!==t&&this._validate(validateStyle.filter,"layers."+r.id+".filter",t)||util.deepEqual(r.filter,t)||(r.filter=util.clone(t),this._updateLayer(r))},t.prototype.getFilter=function(e){return util.clone(this.getLayer(e).filter)},t.prototype.setLayoutProperty=function(e,t,r){this._checkLoaded();var i=this.getLayer(e);util.deepEqual(i.getLayoutProperty(t),r)||(i.setLayoutProperty(t,r),this._updateLayer(i))},t.prototype.getLayoutProperty=function(e,t){return this.getLayer(e).getLayoutProperty(t)},t.prototype.setPaintProperty=function(e,t,r,i){this._checkLoaded();var s=this.getLayer(e);if(!util.deepEqual(s.getPaintProperty(t,i),r)){var o=s.isPaintValueFeatureConstant(t);s.setPaintProperty(t,r,i);var a=!(r&&MapboxGLFunction.isFunctionDefinition(r)&&"$zoom"!==r.property&&void 0!==r.property);a&&o||this._updateLayer(s),this.updateClasses(e,t)}},t.prototype.getPaintProperty=function(e,t,r){return this.getLayer(e).getPaintProperty(t,r)},t.prototype.getTransition=function(){return util.extend({duration:300,delay:0},this.stylesheet&&this.stylesheet.transition)},t.prototype.updateClasses=function(e,t){if(this._changed=!0,e){var r=this._updatedPaintProps;r[e]||(r[e]={}),r[e][t||"all"]=!0}else this._updatedAllPaintProps=!0},t.prototype.serialize=function(){var e=this;return util.filterObject({version:this.stylesheet.version,name:this.stylesheet.name,metadata:this.stylesheet.metadata,light:this.stylesheet.light,center:this.stylesheet.center,zoom:this.stylesheet.zoom,bearing:this.stylesheet.bearing,pitch:this.stylesheet.pitch,sprite:this.stylesheet.sprite,glyphs:this.stylesheet.glyphs,transition:this.stylesheet.transition,sources:util.mapObject(this.sourceCaches,function(e){return e.serialize()}),layers:this._order.map(function(t){return e._layers[t].serialize()})},function(e){return void 0!==e})},t.prototype._updateLayer=function(e){this._updatedLayers[e.id]=!0,e.source&&(this._updatedSources[e.source]=!0),this._changed=!0},t.prototype._flattenRenderedFeatures=function(e){for(var t=this,r=[],i=this._order.length-1;i>=0;i--)for(var s=t._order[i],o=0,a=e;o=this.maxzoom)||"none"===this.layout.visibility)},i.prototype.updatePaintTransitions=function(t,i,a,e,n){for(var o=this,r=util.extend({},this._paintDeclarations[""]),s=0;s=this.endTime)return e;var a=this.oldTransition.calculate(t,i,this.startTime),n=util.easeCubicInOut((o-this.startTime-this.delay)/this.duration);return this.interp(a,e,n)},StyleTransition.prototype._calculateTargetValue=function(t,i){if(!this.zoomTransitioned)return this.declaration.calculate(t,i);var o=t.zoom,e=this.zoomHistory.lastIntegerZoom,a=o>e?2:.5,n=this.declaration.calculate({zoom:o>e?o-1:o+1},i),r=this.declaration.calculate({zoom:o},i),s=Math.min((Date.now()-this.zoomHistory.lastIntegerZoomTime)/this.duration,1),l=Math.abs(o-e),u=interpolate(s,1,l);return void 0!==n&&void 0!==r?{from:n,fromScale:a,to:r,toScale:1,t:u}:void 0},module.exports=StyleTransition; +},{"../util/interpolate":118,"../util/util":126}],71:[function(require,module,exports){ +"use strict";module.exports=require("mapbox-gl-style-spec/lib/validate_style.min"),module.exports.emitErrors=function(r,e){if(e&&e.length){for(var t=0;t-a/2;){if(s--,s<0)return!1;f-=e[s].dist(i),i=e[s]}f+=e[s].dist(e[s+1]),s++;for(var l=[],o=0;fr;)o-=l.shift().angleDelta;if(o>n)return!1;s++,f+=c.dist(g)}return!0}module.exports=checkMaxAngle; +},{}],74:[function(require,module,exports){ +"use strict";function clipLine(n,x,y,o,e){for(var r=[],t=0;t=o&&w.x>=o||(P.x>=o?P=new Point(o,P.y+(w.y-P.y)*((o-P.x)/(w.x-P.x)))._round():w.x>=o&&(w=new Point(o,P.y+(w.y-P.y)*((o-P.x)/(w.x-P.x)))._round()),P.y>=e&&w.y>=e||(P.y>=e?P=new Point(P.x+(w.x-P.x)*((e-P.y)/(w.y-P.y)),e)._round():w.y>=e&&(w=new Point(P.x+(w.x-P.x)*((e-P.y)/(w.y-P.y)),e)._round()),i&&P.equals(i[i.length-1])||(i=[P],r.push(i)),i.push(w)))))}return r}var Point=require("point-geometry");module.exports=clipLine; +},{"point-geometry":194}],75:[function(require,module,exports){ +"use strict";var createStructArrayType=require("../util/struct_array"),Point=require("point-geometry"),CollisionBoxArray=createStructArrayType({members:[{type:"Int16",name:"anchorPointX"},{type:"Int16",name:"anchorPointY"},{type:"Int16",name:"x1"},{type:"Int16",name:"y1"},{type:"Int16",name:"x2"},{type:"Int16",name:"y2"},{type:"Float32",name:"maxScale"},{type:"Uint32",name:"featureIndex"},{type:"Uint16",name:"sourceLayerIndex"},{type:"Uint16",name:"bucketIndex"},{type:"Int16",name:"bbox0"},{type:"Int16",name:"bbox1"},{type:"Int16",name:"bbox2"},{type:"Int16",name:"bbox3"},{type:"Float32",name:"placementScale"}]});Object.defineProperty(CollisionBoxArray.prototype.StructType.prototype,"anchorPoint",{get:function(){return new Point(this.anchorPointX,this.anchorPointY)}}),module.exports=CollisionBoxArray; +},{"../util/struct_array":124,"point-geometry":194}],76:[function(require,module,exports){ +"use strict";var CollisionFeature=function(t,e,i,o,s,a,n,r,l,d,u){var h=n.top*r-l,x=n.bottom*r+l,f=n.left*r-l,m=n.right*r+l;if(this.boxStartIndex=t.length,d){var _=x-h,b=m-f;if(_>0)if(_=Math.max(10*r,_),u){var v=e[i.segment+1].sub(e[i.segment])._unit()._mult(b),c=[i.sub(v),i.add(v)];this._addLineCollisionBoxes(t,c,i,0,b,_,o,s,a)}else this._addLineCollisionBoxes(t,e,i,i.segment,b,_,o,s,a)}else t.emplaceBack(i.x,i.y,f,h,m,x,1/0,o,s,a,0,0,0,0,0);this.boxEndIndex=t.length};CollisionFeature.prototype._addLineCollisionBoxes=function(t,e,i,o,s,a,n,r,l){var d=a/2,u=Math.floor(s/d),h=-a/2,x=this.boxes,f=i,m=o+1,_=h;do{if(m--,m<0)return x;_-=e[m].dist(f),f=e[m]}while(_>-s/2);for(var b=e[m].dist(e[m+1]),v=0;v=e.length)return x;b=e[m].dist(e[m+1])}var g=c-_,p=e[m],C=e[m+1],B=C.sub(p)._unit()._mult(g)._add(p)._round(),M=Math.max(Math.abs(c-h)-d/2,0),y=s/2/M;t.emplaceBack(B.x,B.y,-a/2,-a/2,a/2,a/2,y,n,r,l,0,0,0,0,0)}return x},module.exports=CollisionFeature; +},{}],77:[function(require,module,exports){ +"use strict";var Point=require("point-geometry"),EXTENT=require("../data/extent"),Grid=require("grid-index"),intersectionTests=require("../util/intersection_tests"),CollisionTile=function(t,e,i){if("object"==typeof t){var r=t;i=e,t=r.angle,e=r.pitch,this.grid=new Grid(r.grid),this.ignoredGrid=new Grid(r.ignoredGrid)}else this.grid=new Grid(EXTENT,12,6),this.ignoredGrid=new Grid(EXTENT,12,0);this.minScale=.5,this.maxScale=2,this.angle=t,this.pitch=e;var a=Math.sin(t),o=Math.cos(t);if(this.rotationMatrix=[o,-a,a,o],this.reverseRotationMatrix=[o,a,-a,o],this.yStretch=1/Math.cos(e/180*Math.PI),this.yStretch=Math.pow(this.yStretch,1.3),this.collisionBoxArray=i,0===i.length){i.emplaceBack();var n=32767;i.emplaceBack(0,0,0,-n,0,n,n,0,0,0,0,0,0,0,0,0),i.emplaceBack(EXTENT,0,0,-n,0,n,n,0,0,0,0,0,0,0,0,0),i.emplaceBack(0,0,-n,0,n,0,n,0,0,0,0,0,0,0,0,0),i.emplaceBack(0,EXTENT,-n,0,n,0,n,0,0,0,0,0,0,0,0,0)}this.tempCollisionBox=i.get(0),this.edges=[i.get(1),i.get(2),i.get(3),i.get(4)]};CollisionTile.prototype.serialize=function(t){var e=this.grid.toArrayBuffer(),i=this.ignoredGrid.toArrayBuffer();return t&&(t.push(e),t.push(i)),{angle:this.angle,pitch:this.pitch,grid:e,ignoredGrid:i}},CollisionTile.prototype.placeCollisionFeature=function(t,e,i){for(var r=this,a=this.collisionBoxArray,o=this.minScale,n=this.rotationMatrix,l=this.yStretch,h=t.boxStartIndex;h=r.maxScale)return o}if(i){var S;if(r.angle){var P=r.reverseRotationMatrix,b=new Point(s.x1,s.y1).matMult(P),T=new Point(s.x2,s.y1).matMult(P),w=new Point(s.x1,s.y2).matMult(P),N=new Point(s.x2,s.y2).matMult(P);S=r.tempCollisionBox,S.anchorPointX=s.anchorPoint.x,S.anchorPointY=s.anchorPoint.y,S.x1=Math.min(b.x,T.x,w.x,N.x),S.y1=Math.min(b.y,T.x,w.x,N.x),S.x2=Math.max(b.x,T.x,w.x,N.x),S.y2=Math.max(b.y,T.x,w.x,N.x),S.maxScale=s.maxScale}else S=s;for(var B=0;B=r.maxScale)return o}}}return o},CollisionTile.prototype.queryRenderedSymbols=function(t,e){var i={},r=[];if(0===t.length||0===this.grid.length&&0===this.ignoredGrid.length)return r;for(var a=this.collisionBoxArray,o=this.rotationMatrix,n=this.yStretch,l=[],h=1/0,s=1/0,x=-(1/0),c=-(1/0),g=0;gS.maxScale)){var T=S.anchorPoint.matMult(o),w=T.x+S.x1/e,N=T.y+S.y1/e*n,B=T.x+S.x2/e,G=T.y+S.y2/e*n,E=[new Point(w,N),new Point(B,N),new Point(B,G),new Point(w,G)];intersectionTests.polygonIntersectsPolygon(l,E)&&(i[P][b]=!0,r.push(u[v]))}}return r},CollisionTile.prototype.getPlacementScale=function(t,e,i,r,a){var o=e.x-r.x,n=e.y-r.y,l=(a.x1-i.x2)/o,h=(a.x2-i.x1)/o,s=(a.y1-i.y2)*this.yStretch/n,x=(a.y2-i.y1)*this.yStretch/n;(isNaN(l)||isNaN(h))&&(l=h=1),(isNaN(s)||isNaN(x))&&(s=x=1);var c=Math.min(Math.max(l,h),Math.max(s,x)),g=a.maxScale,y=i.maxScale;return c>g&&(c=g),c>y&&(c=y),c>t&&c>=a.placementScale&&(t=c),t},CollisionTile.prototype.insertCollisionFeature=function(t,e,i){for(var r=this,a=i?this.ignoredGrid:this.grid,o=this.collisionBoxArray,n=t.boxStartIndex;n=0&&k=0&&q=0&&p+c<=s){var M=new Anchor(k,q,y,f)._round();n&&!checkMaxAngle(e,M,l,n,a)||x.push(M)}}g+=A}return i||x.length||o||(x=resample(e,g/2,t,n,a,l,o,!0,h)),x}var interpolate=require("../util/interpolate"),Anchor=require("../symbol/anchor"),checkMaxAngle=require("./check_max_angle");module.exports=getAnchors; +},{"../symbol/anchor":72,"../util/interpolate":118,"./check_max_angle":73}],79:[function(require,module,exports){ +"use strict";var ShelfPack=require("shelf-pack"),util=require("../util/util"),SIZE_GROWTH_RATE=4,DEFAULT_SIZE=128,MAX_SIZE=2048,GlyphAtlas=function(){this.width=DEFAULT_SIZE,this.height=DEFAULT_SIZE,this.bin=new ShelfPack(this.width,this.height),this.index={},this.ids={},this.data=new Uint8Array(this.width*this.height)};GlyphAtlas.prototype.getGlyphs=function(){var t,i,e,h={};for(var r in this.ids)t=r.split("#"),i=t[0],e=t[1],h[i]||(h[i]=[]),h[i].push(e);return h},GlyphAtlas.prototype.getRects=function(){var t,i,e,h=this,r={};for(var s in this.ids)t=s.split("#"),i=t[0],e=t[1],r[i]||(r[i]={}),r[i][e]=h.index[s];return r},GlyphAtlas.prototype.addGlyph=function(t,i,e,h){var r=this;if(!e)return null;var s=i+"#"+e.id;if(this.index[s])return this.ids[s].indexOf(t)<0&&this.ids[s].push(t),this.index[s];if(!e.bitmap)return null;var a=e.width+2*h,n=e.height+2*h,E=1,T=a+2*E,u=n+2*E;T+=4-T%4,u+=4-u%4;var l=this.bin.packOne(T,u);if(l||(this.resize(),l=this.bin.packOne(T,u)),!l)return util.warnOnce("glyph bitmap overflow"),null;this.index[s]=l,this.ids[s]=[t];for(var d=this.data,A=e.bitmap,_=0;_=MAX_SIZE||e>=MAX_SIZE)){this.texture&&(this.gl&&this.gl.deleteTexture(this.texture),this.texture=null),this.width*=SIZE_GROWTH_RATE,this.height*=SIZE_GROWTH_RATE,this.bin.resize(this.width,this.height);for(var h=new ArrayBuffer(this.width*this.height),r=0;r65535)return a("glyphs > 65535 not supported");void 0===this.loading[t]&&(this.loading[t]={});var l=this.loading[t];if(l[e])l[e].push(a);else{l[e]=[a];var i=256*e+"-"+(256*e+255),r=glyphUrl(t,i,this.url);ajax.getArrayBuffer(r,function(t,a){for(var i=!t&&new Glyphs(new Protobuf(a)),r=0;rn||f[c].codePoint===newLine)){var y=f[c+1].x;g=Math.max(y,g);for(var b=c+1;b<=w;b++)f[b].y+=e,f[b].x-=y;if(a&&c>u){var M=c;invisible[f[c].codePoint]&&M--,justifyLine(f,t,u,M,a)}u=c+1,c=null,p+=y,d++}(l||breakable[P.codePoint]||scriptDetection.charAllowsIdeographicBreaking(P.codePoint))&&(c=w)}}var m=f[f.length-1],I=m.x+t[m.codePoint].advance;g=Math.max(g,I);var L=(d+1)*e;justifyLine(f,t,u,f.length-1,a),align(f,a,o,r,g,e,d,h),i.top+=-r*L,i.bottom=i.top+L,i.left+=-o*g,i.right=i.left+g}function justifyLine(i,t,e,n,o){for(var r=t[i[n].codePoint].advance,a=(i[n].x+r)*o,h=e;h<=n;h++)i[h].x-=a}function align(i,t,e,n,o,r,a,h){for(var l=(t-e)*o+h[0],s=(-n*(a+1)+.5)*r+h[1],c=0;c1?2:1,this.canvas&&(this.canvas.width=this.width*this.pixelRatio,this.canvas.height=this.height*this.pixelRatio)),this.sprite=t},SpriteAtlas.prototype.addIcons=function(t,i){for(var e=this,h=0;h1||(L?(clearTimeout(L),L=null,h("dblclick",t)):L=setTimeout(l,300))}function i(e){f("touchmove",e)}function c(e){f("touchend",e)}function d(e){f("touchcancel",e)}function l(){L=null}function s(e){var t=DOM.mousePos(g,e);t.equals(E)&&h("click",e)}function v(e){h("dblclick",e),e.preventDefault()}function m(e){p=e,e.preventDefault()}function h(t,n){var o=DOM.mousePos(g,n);return e.fire(t,{lngLat:e.unproject(o),point:o,originalEvent:n})}function f(t,n){var o=DOM.touchPos(g,n),r=o.reduce(function(e,t,n,o){return e.add(t.div(o.length))},new Point(0,0));return e.fire(t,{lngLat:e.unproject(r),point:r,lngLats:o.map(function(t){return e.unproject(t)},this),points:o,originalEvent:n})}var g=e.getCanvasContainer(),p=null,E=null,L=null;for(var b in handlers)e[b]=new handlers[b](e,t),t.interactive&&t[b]&&e[b].enable();g.addEventListener("mouseout",n,!1),g.addEventListener("mousedown",o,!1),g.addEventListener("mouseup",r,!1),g.addEventListener("mousemove",u,!1),g.addEventListener("touchstart",a,!1),g.addEventListener("touchend",c,!1),g.addEventListener("touchmove",i,!1),g.addEventListener("touchcancel",d,!1),g.addEventListener("click",s,!1),g.addEventListener("dblclick",v,!1),g.addEventListener("contextmenu",m,!1)}; +},{"../util/dom":114,"./handler/box_zoom":94,"./handler/dblclick_zoom":95,"./handler/drag_pan":96,"./handler/drag_rotate":97,"./handler/keyboard":98,"./handler/scroll_zoom":99,"./handler/touch_zoom_rotate":100,"point-geometry":194}],89:[function(require,module,exports){ +"use strict";var util=require("../util/util"),interpolate=require("../util/interpolate"),browser=require("../util/browser"),LngLat=require("../geo/lng_lat"),LngLatBounds=require("../geo/lng_lat_bounds"),Point=require("point-geometry"),Evented=require("../util/evented"),Camera=function(t){function i(i,e){t.call(this),this.transform=i,this._bearingSnap=e.bearingSnap}return t&&(i.__proto__=t),i.prototype=Object.create(t&&t.prototype),i.prototype.constructor=i,i.prototype.getCenter=function(){return this.transform.center},i.prototype.setCenter=function(t,i){return this.jumpTo({center:t},i),this},i.prototype.panBy=function(t,i,e){return this.panTo(this.transform.center,util.extend({offset:Point.convert(t).mult(-1)},i),e),this},i.prototype.panTo=function(t,i,e){return this.easeTo(util.extend({center:t},i),e)},i.prototype.getZoom=function(){return this.transform.zoom},i.prototype.setZoom=function(t,i){return this.jumpTo({zoom:t},i),this},i.prototype.zoomTo=function(t,i,e){return this.easeTo(util.extend({zoom:t},i),e)},i.prototype.zoomIn=function(t,i){return this.zoomTo(this.getZoom()+1,t,i),this},i.prototype.zoomOut=function(t,i){return this.zoomTo(this.getZoom()-1,t,i),this},i.prototype.getBearing=function(){return this.transform.bearing},i.prototype.setBearing=function(t,i){return this.jumpTo({bearing:t},i),this},i.prototype.rotateTo=function(t,i,e){return this.easeTo(util.extend({bearing:t},i),e)},i.prototype.resetNorth=function(t,i){return this.rotateTo(0,util.extend({duration:1e3},t),i),this},i.prototype.snapToNorth=function(t,i){return Math.abs(this.getBearing())180&&(s.center.lng>0&&c.lng<0?c.lng+=360:s.center.lng<0&&c.lng>0&&(c.lng-=360));var d=s.zoomScale(m-h),l=s.point,v="center"in t?s.project(c).sub(a.div(d)):l,b=s.worldSize,z=t.curve,y=Math.max(s.width,s.height),_=y/d,M=v.sub(l).mag();if("minZoom"in t){var T=util.clamp(Math.min(t.minZoom,h,m),s.minZoom,s.maxZoom),E=y/s.zoomScale(T-h);z=Math.sqrt(E/M*2)}var x=z*z,L=e(0),P=function(t){return n(L)/n(L+z*t)},Z=function(t){return y*((n(L)*r(L+z*t)-o(L))/x)/M},B=(e(1)-L)/z;if(Math.abs(M)<1e-6){if(Math.abs(y-_)<1e-6)return this.easeTo(t);var j=_=0)return!1;return!0}),this._container.innerHTML=t.join(" | "),this._editLink=null}},module.exports=AttributionControl; +},{"../../util/dom":114,"../../util/util":126}],91:[function(require,module,exports){ +"use strict";function checkGeolocationSupport(t){void 0!==supportsGeolocation?t(supportsGeolocation):void 0!==window.navigator.permissions?window.navigator.permissions.query({name:"geolocation"}).then(function(o){supportsGeolocation="denied"!==o.state,t(supportsGeolocation)}):(supportsGeolocation=!!window.navigator.geolocation,t(supportsGeolocation))}var Evented=require("../../util/evented"),DOM=require("../../util/dom"),window=require("../../util/window"),util=require("../../util/util"),geoOptions={enableHighAccuracy:!1,timeout:6e3},className="mapboxgl-ctrl",supportsGeolocation,GeolocateControl=function(t){function o(){t.call(this),util.bindAll(["_onSuccess","_onError","_finish","_setupUI"],this)}return t&&(o.__proto__=t),o.prototype=Object.create(t&&t.prototype),o.prototype.constructor=o,o.prototype.onAdd=function(t){return this._map=t,this._container=DOM.create("div",className+" "+className+"-group"),checkGeolocationSupport(this._setupUI),this._container},o.prototype.onRemove=function(){this._container.parentNode.removeChild(this._container),this._map=void 0},o.prototype._onSuccess=function(t){this._map.jumpTo({center:[t.coords.longitude,t.coords.latitude],zoom:17,bearing:0,pitch:0}),this.fire("geolocate",t),this._finish()},o.prototype._onError=function(t){this.fire("error",t),this._finish()},o.prototype._finish=function(){this._timeoutId&&clearTimeout(this._timeoutId),this._timeoutId=void 0},o.prototype._setupUI=function(t){t!==!1&&(this._container.addEventListener("contextmenu",function(t){return t.preventDefault()}),this._geolocateButton=DOM.create("button",className+"-icon "+className+"-geolocate",this._container),this._geolocateButton.type="button",this._geolocateButton.setAttribute("aria-label","Geolocate"),this._geolocateButton.addEventListener("click",this._onClickGeolocate.bind(this)))},o.prototype._onClickGeolocate=function(){window.navigator.geolocation.getCurrentPosition(this._onSuccess,this._onError,geoOptions),this._timeoutId=setTimeout(this._finish,1e4)},o}(Evented);module.exports=GeolocateControl; +},{"../../util/dom":114,"../../util/evented":115,"../../util/util":126,"../../util/window":109}],92:[function(require,module,exports){ +"use strict";function copyMouseEvent(t){return new window.MouseEvent(t.type,{button:2,buttons:2,bubbles:!0,cancelable:!0,detail:t.detail,view:t.view,screenX:t.screenX,screenY:t.screenY,clientX:t.clientX,clientY:t.clientY,movementX:t.movementX,movementY:t.movementY,ctrlKey:t.ctrlKey,shiftKey:t.shiftKey,altKey:t.altKey,metaKey:t.metaKey})}var DOM=require("../../util/dom"),window=require("../../util/window"),util=require("../../util/util"),className="mapboxgl-ctrl",NavigationControl=function(){util.bindAll(["_rotateCompassArrow"],this)};NavigationControl.prototype._rotateCompassArrow=function(){var t="rotate("+this._map.transform.angle*(180/Math.PI)+"deg)";this._compassArrow.style.transform=t},NavigationControl.prototype.onAdd=function(t){return this._map=t,this._container=DOM.create("div",className+" "+className+"-group",t.getContainer()),this._container.addEventListener("contextmenu",this._onContextMenu.bind(this)),this._zoomInButton=this._createButton(className+"-icon "+className+"-zoom-in","Zoom In",t.zoomIn.bind(t)),this._zoomOutButton=this._createButton(className+"-icon "+className+"-zoom-out","Zoom Out",t.zoomOut.bind(t)),this._compass=this._createButton(className+"-icon "+className+"-compass","Reset North",t.resetNorth.bind(t)),this._compassArrow=DOM.create("span","arrow",this._compass),this._compass.addEventListener("mousedown",this._onCompassDown.bind(this)),this._onCompassMove=this._onCompassMove.bind(this),this._onCompassUp=this._onCompassUp.bind(this),this._map.on("rotate",this._rotateCompassArrow),this._rotateCompassArrow(),this._container},NavigationControl.prototype.onRemove=function(){this._container.parentNode.removeChild(this._container),this._map.off("rotate",this._rotateCompassArrow),this._map=void 0},NavigationControl.prototype._onContextMenu=function(t){t.preventDefault()},NavigationControl.prototype._onCompassDown=function(t){0===t.button&&(DOM.disableDrag(),window.document.addEventListener("mousemove",this._onCompassMove),window.document.addEventListener("mouseup",this._onCompassUp),this._map.getCanvasContainer().dispatchEvent(copyMouseEvent(t)),t.stopPropagation())},NavigationControl.prototype._onCompassMove=function(t){0===t.button&&(this._map.getCanvasContainer().dispatchEvent(copyMouseEvent(t)),t.stopPropagation())},NavigationControl.prototype._onCompassUp=function(t){0===t.button&&(window.document.removeEventListener("mousemove",this._onCompassMove),window.document.removeEventListener("mouseup",this._onCompassUp),DOM.enableDrag(),this._map.getCanvasContainer().dispatchEvent(copyMouseEvent(t)),t.stopPropagation())},NavigationControl.prototype._createButton=function(t,o,e){var n=DOM.create("button",t,this._container);return n.type="button",n.setAttribute("aria-label",o),n.addEventListener("click",function(){e()}),n},module.exports=NavigationControl; +},{"../../util/dom":114,"../../util/util":126,"../../util/window":109}],93:[function(require,module,exports){ +"use strict";function updateScale(t,e,o){var n=o&&o.maxWidth||100,i=t._container.clientHeight/2,a=getDistance(t.unproject([0,i]),t.unproject([n,i]));if(o&&"imperial"===o.unit){var r=3.2808*a;if(r>5280){var l=r/5280;setScale(e,n,l,"mi")}else setScale(e,n,r,"ft")}else setScale(e,n,a,"m")}function setScale(t,e,o,n){var i=getRoundNum(o),a=i/o;"m"===n&&i>=1e3&&(i/=1e3,n="km"),t.style.width=e*a+"px",t.innerHTML=i+n}function getDistance(t,e){var o=6371e3,n=Math.PI/180,i=t.lat*n,a=e.lat*n,r=Math.sin(i)*Math.sin(a)+Math.cos(i)*Math.cos(a)*Math.cos((e.lng-t.lng)*n),l=o*Math.acos(Math.min(r,1));return l}function getRoundNum(t){var e=Math.pow(10,(""+Math.floor(t)).length-1),o=t/e;return o=o>=10?10:o>=5?5:o>=3?3:o>=2?2:1,e*o}var DOM=require("../../util/dom"),util=require("../../util/util"),ScaleControl=function(t){this.options=t,util.bindAll(["_onMove"],this)};ScaleControl.prototype.getDefaultPosition=function(){return"bottom-left"},ScaleControl.prototype._onMove=function(){updateScale(this._map,this._container,this.options)},ScaleControl.prototype.onAdd=function(t){return this._map=t,this._container=DOM.create("div","mapboxgl-ctrl mapboxgl-ctrl-scale",t.getContainer()),this._map.on("move",this._onMove),this._onMove(),this._container},ScaleControl.prototype.onRemove=function(){this._container.parentNode.removeChild(this._container),this._map.off("move",this._onMove),this._map=void 0},module.exports=ScaleControl; +},{"../../util/dom":114,"../../util/util":126}],94:[function(require,module,exports){ +"use strict";var DOM=require("../../util/dom"),LngLatBounds=require("../../geo/lng_lat_bounds"),util=require("../../util/util"),window=require("../../util/window"),BoxZoomHandler=function(o){this._map=o,this._el=o.getCanvasContainer(),this._container=o.getContainer(),util.bindAll(["_onMouseDown","_onMouseMove","_onMouseUp","_onKeyDown"],this)};BoxZoomHandler.prototype.isEnabled=function(){return!!this._enabled},BoxZoomHandler.prototype.isActive=function(){return!!this._active},BoxZoomHandler.prototype.enable=function(){this.isEnabled()||(this._el.addEventListener("mousedown",this._onMouseDown,!1),this._enabled=!0)},BoxZoomHandler.prototype.disable=function(){this.isEnabled()&&(this._el.removeEventListener("mousedown",this._onMouseDown),this._enabled=!1)},BoxZoomHandler.prototype._onMouseDown=function(o){o.shiftKey&&0===o.button&&(window.document.addEventListener("mousemove",this._onMouseMove,!1),window.document.addEventListener("keydown",this._onKeyDown,!1),window.document.addEventListener("mouseup",this._onMouseUp,!1),DOM.disableDrag(),this._startPos=DOM.mousePos(this._el,o),this._active=!0)},BoxZoomHandler.prototype._onMouseMove=function(o){var e=this._startPos,t=DOM.mousePos(this._el,o);this._box||(this._box=DOM.create("div","mapboxgl-boxzoom",this._container),this._container.classList.add("mapboxgl-crosshair"),this._fireEvent("boxzoomstart",o));var n=Math.min(e.x,t.x),i=Math.max(e.x,t.x),s=Math.min(e.y,t.y),r=Math.max(e.y,t.y);DOM.setTransform(this._box,"translate("+n+"px,"+s+"px)"),this._box.style.width=i-n+"px",this._box.style.height=r-s+"px"},BoxZoomHandler.prototype._onMouseUp=function(o){if(0===o.button){var e=this._startPos,t=DOM.mousePos(this._el,o),n=(new LngLatBounds).extend(this._map.unproject(e)).extend(this._map.unproject(t));this._finish(),e.x===t.x&&e.y===t.y?this._fireEvent("boxzoomcancel",o):this._map.fitBounds(n,{linear:!0}).fire("boxzoomend",{originalEvent:o,boxZoomBounds:n})}},BoxZoomHandler.prototype._onKeyDown=function(o){27===o.keyCode&&(this._finish(),this._fireEvent("boxzoomcancel",o))},BoxZoomHandler.prototype._finish=function(){this._active=!1,window.document.removeEventListener("mousemove",this._onMouseMove,!1),window.document.removeEventListener("keydown",this._onKeyDown,!1),window.document.removeEventListener("mouseup",this._onMouseUp,!1),this._container.classList.remove("mapboxgl-crosshair"),this._box&&(this._box.parentNode.removeChild(this._box),this._box=null),DOM.enableDrag()},BoxZoomHandler.prototype._fireEvent=function(o,e){return this._map.fire(o,{originalEvent:e})},module.exports=BoxZoomHandler; +},{"../../geo/lng_lat_bounds":20,"../../util/dom":114,"../../util/util":126,"../../util/window":109}],95:[function(require,module,exports){ +"use strict";var DoubleClickZoomHandler=function(o){this._map=o,this._onDblClick=this._onDblClick.bind(this)};DoubleClickZoomHandler.prototype.isEnabled=function(){return!!this._enabled},DoubleClickZoomHandler.prototype.enable=function(){this.isEnabled()||(this._map.on("dblclick",this._onDblClick),this._enabled=!0)},DoubleClickZoomHandler.prototype.disable=function(){this.isEnabled()&&(this._map.off("dblclick",this._onDblClick),this._enabled=!1)},DoubleClickZoomHandler.prototype._onDblClick=function(o){this._map.zoomTo(this._map.getZoom()+(o.originalEvent.shiftKey?-1:1),{around:o.lngLat},o)},module.exports=DoubleClickZoomHandler; +},{}],96:[function(require,module,exports){ +"use strict";var DOM=require("../../util/dom"),util=require("../../util/util"),window=require("../../util/window"),inertiaLinearity=.3,inertiaEasing=util.bezier(0,0,inertiaLinearity,1),inertiaMaxSpeed=1400,inertiaDeceleration=2500,DragPanHandler=function(t){this._map=t,this._el=t.getCanvasContainer(),util.bindAll(["_onDown","_onMove","_onUp","_onTouchEnd","_onMouseUp"],this)};DragPanHandler.prototype.isEnabled=function(){return!!this._enabled},DragPanHandler.prototype.isActive=function(){return!!this._active},DragPanHandler.prototype.enable=function(){this.isEnabled()||(this._el.addEventListener("mousedown",this._onDown),this._el.addEventListener("touchstart",this._onDown),this._enabled=!0)},DragPanHandler.prototype.disable=function(){this.isEnabled()&&(this._el.removeEventListener("mousedown",this._onDown),this._el.removeEventListener("touchstart",this._onDown),this._enabled=!1)},DragPanHandler.prototype._onDown=function(t){this._ignoreEvent(t)||this.isActive()||(t.touches?(window.document.addEventListener("touchmove",this._onMove),window.document.addEventListener("touchend",this._onTouchEnd)):(window.document.addEventListener("mousemove",this._onMove),window.document.addEventListener("mouseup",this._onMouseUp)),this._active=!1,this._startPos=this._pos=DOM.mousePos(this._el,t),this._inertia=[[Date.now(),this._pos]])},DragPanHandler.prototype._onMove=function(t){if(!this._ignoreEvent(t)){this.isActive()||(this._active=!0,this._fireEvent("dragstart",t),this._fireEvent("movestart",t));var e=DOM.mousePos(this._el,t),n=this._map;n.stop(),this._drainInertiaBuffer(),this._inertia.push([Date.now(),e]),n.transform.setLocationAtPoint(n.transform.pointLocation(this._pos),e),this._fireEvent("drag",t),this._fireEvent("move",t),this._pos=e,t.preventDefault()}},DragPanHandler.prototype._onUp=function(t){var e=this;if(this.isActive()){this._active=!1,this._fireEvent("dragend",t),this._drainInertiaBuffer();var n=function(){return e._fireEvent("moveend",t)},i=this._inertia;if(i.length<2)return void n();var o=i[i.length-1],r=i[0],a=o[1].sub(r[1]),s=(o[0]-r[0])/1e3;if(0===s||o[1].equals(r[1]))return void n();var u=a.mult(inertiaLinearity/s),h=u.mag();h>inertiaMaxSpeed&&(h=inertiaMaxSpeed,u._unit()._mult(h));var d=h/(inertiaDeceleration*inertiaLinearity),v=u.mult(-d/2);this._map.panBy(v,{duration:1e3*d,easing:inertiaEasing,noMoveStart:!0},{originalEvent:t})}},DragPanHandler.prototype._onMouseUp=function(t){this._ignoreEvent(t)||(this._onUp(t),window.document.removeEventListener("mousemove",this._onMove),window.document.removeEventListener("mouseup",this._onMouseUp))},DragPanHandler.prototype._onTouchEnd=function(t){this._ignoreEvent(t)||(this._onUp(t),window.document.removeEventListener("touchmove",this._onMove),window.document.removeEventListener("touchend",this._onTouchEnd))},DragPanHandler.prototype._fireEvent=function(t,e){return this._map.fire(t,{originalEvent:e})},DragPanHandler.prototype._ignoreEvent=function(t){var e=this._map;if(e.boxZoom&&e.boxZoom.isActive())return!0;if(e.dragRotate&&e.dragRotate.isActive())return!0;if(t.touches)return t.touches.length>1;if(t.ctrlKey)return!0;var n=1,i=0;return"mousemove"===t.type?t.buttons&0===n:t.button!==i},DragPanHandler.prototype._drainInertiaBuffer=function(){for(var t=this._inertia,e=Date.now(),n=160;t.length>0&&e-t[0][0]>n;)t.shift()},module.exports=DragPanHandler; +},{"../../util/dom":114,"../../util/util":126,"../../util/window":109}],97:[function(require,module,exports){ +"use strict";var DOM=require("../../util/dom"),util=require("../../util/util"),window=require("../../util/window"),inertiaLinearity=.25,inertiaEasing=util.bezier(0,0,inertiaLinearity,1),inertiaMaxSpeed=180,inertiaDeceleration=720,DragRotateHandler=function(t,e){this._map=t,this._el=t.getCanvasContainer(),this._bearingSnap=e.bearingSnap,this._pitchWithRotate=e.pitchWithRotate!==!1,util.bindAll(["_onDown","_onMove","_onUp"],this)};DragRotateHandler.prototype.isEnabled=function(){return!!this._enabled},DragRotateHandler.prototype.isActive=function(){return!!this._active},DragRotateHandler.prototype.enable=function(){this.isEnabled()||(this._el.addEventListener("mousedown",this._onDown),this._enabled=!0)},DragRotateHandler.prototype.disable=function(){this.isEnabled()&&(this._el.removeEventListener("mousedown",this._onDown),this._enabled=!1)},DragRotateHandler.prototype._onDown=function(t){this._ignoreEvent(t)||this.isActive()||(window.document.addEventListener("mousemove",this._onMove),window.document.addEventListener("mouseup",this._onUp),this._active=!1,this._inertia=[[Date.now(),this._map.getBearing()]],this._startPos=this._pos=DOM.mousePos(this._el,t),this._center=this._map.transform.centerPoint,t.preventDefault())},DragRotateHandler.prototype._onMove=function(t){if(!this._ignoreEvent(t)){this.isActive()||(this._active=!0,this._fireEvent("rotatestart",t),this._fireEvent("movestart",t));var e=this._map;e.stop();var i=this._pos,n=DOM.mousePos(this._el,t),r=.8*(i.x-n.x),a=(i.y-n.y)*-.5,o=e.getBearing()-r,s=e.getPitch()-a,h=this._inertia,_=h[h.length-1];this._drainInertiaBuffer(),h.push([Date.now(),e._normalizeBearing(o,_[1])]),e.transform.bearing=o,this._pitchWithRotate&&(e.transform.pitch=s),this._fireEvent("rotate",t),this._fireEvent("move",t),this._pos=n}},DragRotateHandler.prototype._onUp=function(t){var e=this;if(!this._ignoreEvent(t)&&(window.document.removeEventListener("mousemove",this._onMove),window.document.removeEventListener("mouseup",this._onUp),this.isActive())){this._active=!1,this._fireEvent("rotateend",t),this._drainInertiaBuffer();var i=this._map,n=i.getBearing(),r=this._inertia,a=function(){Math.abs(n)inertiaMaxSpeed&&(l=inertiaMaxSpeed);var p=l/(inertiaDeceleration*inertiaLinearity),g=u*l*(p/2);_+=g,Math.abs(i._normalizeBearing(_,0))1;var i=t.ctrlKey?1:2,n=t.ctrlKey?0:2;return"mousemove"===t.type?t.buttons&0===i:t.button!==n},DragRotateHandler.prototype._drainInertiaBuffer=function(){for(var t=this._inertia,e=Date.now(),i=160;t.length>0&&e-t[0][0]>i;)t.shift()},module.exports=DragRotateHandler; +},{"../../util/dom":114,"../../util/util":126,"../../util/window":109}],98:[function(require,module,exports){ +"use strict";function easeOut(e){return e*(2-e)}var panStep=100,bearingStep=15,pitchStep=10,KeyboardHandler=function(e){this._map=e,this._el=e.getCanvasContainer(),this._onKeyDown=this._onKeyDown.bind(this)};KeyboardHandler.prototype.isEnabled=function(){return!!this._enabled},KeyboardHandler.prototype.enable=function(){this.isEnabled()||(this._el.addEventListener("keydown",this._onKeyDown,!1),this._enabled=!0)},KeyboardHandler.prototype.disable=function(){this.isEnabled()&&(this._el.removeEventListener("keydown",this._onKeyDown),this._enabled=!1)},KeyboardHandler.prototype._onKeyDown=function(e){if(!(e.altKey||e.ctrlKey||e.metaKey)){var t=0,n=0,a=0,i=0,r=0;switch(e.keyCode){case 61:case 107:case 171:case 187:t=1;break;case 189:case 109:case 173:t=-1;break;case 37:e.shiftKey?n=-1:(e.preventDefault(),i=-1);break;case 39:e.shiftKey?n=1:(e.preventDefault(),i=1);break;case 38:e.shiftKey?a=1:(e.preventDefault(),r=-1);break;case 40:e.shiftKey?a=-1:(r=1,e.preventDefault())}var s=this._map,o=s.getZoom(),d={duration:300,delayEndEvents:500,easing:easeOut,zoom:t?Math.round(o)+t*(e.shiftKey?2:1):o,bearing:s.getBearing()+n*bearingStep,pitch:s.getPitch()+a*pitchStep,offset:[-i*panStep,-r*panStep],center:s.getCenter()};s.easeTo(d,{originalEvent:e})}},module.exports=KeyboardHandler; +},{}],99:[function(require,module,exports){ +"use strict";var DOM=require("../../util/dom"),util=require("../../util/util"),browser=require("../../util/browser"),window=require("../../util/window"),ua=window.navigator.userAgent.toLowerCase(),firefox=ua.indexOf("firefox")!==-1,safari=ua.indexOf("safari")!==-1&&ua.indexOf("chrom")===-1,ScrollZoomHandler=function(e){this._map=e,this._el=e.getCanvasContainer(),util.bindAll(["_onWheel","_onTimeout"],this)};ScrollZoomHandler.prototype.isEnabled=function(){return!!this._enabled},ScrollZoomHandler.prototype.enable=function(){this.isEnabled()||(this._el.addEventListener("wheel",this._onWheel,!1),this._el.addEventListener("mousewheel",this._onWheel,!1),this._enabled=!0)},ScrollZoomHandler.prototype.disable=function(){this.isEnabled()&&(this._el.removeEventListener("wheel",this._onWheel),this._el.removeEventListener("mousewheel",this._onWheel),this._enabled=!1)},ScrollZoomHandler.prototype._onWheel=function(e){var t;"wheel"===e.type?(t=e.deltaY,firefox&&e.deltaMode===window.WheelEvent.DOM_DELTA_PIXEL&&(t/=browser.devicePixelRatio),e.deltaMode===window.WheelEvent.DOM_DELTA_LINE&&(t*=40)):"mousewheel"===e.type&&(t=-e.wheelDeltaY,safari&&(t/=3));var o=browser.now(),i=o-(this._time||0);this._pos=DOM.mousePos(this._el,e),this._time=o,0!==t&&t%4.000244140625===0?this._type="wheel":0!==t&&Math.abs(t)<4?this._type="trackpad":i>400?(this._type=null,this._lastValue=t,this._timeout=setTimeout(this._onTimeout,40)):this._type||(this._type=Math.abs(i*t)<200?"trackpad":"wheel",this._timeout&&(clearTimeout(this._timeout),this._timeout=null,t+=this._lastValue)),e.shiftKey&&t&&(t/=4),this._type&&this._zoom(-t,e),e.preventDefault()},ScrollZoomHandler.prototype._onTimeout=function(){this._type="wheel",this._zoom(-this._lastValue)},ScrollZoomHandler.prototype._zoom=function(e,t){if(0!==e){var o=this._map,i=2/(1+Math.exp(-Math.abs(e/100)));e<0&&0!==i&&(i=1/i);var l=o.ease?o.ease.to:o.transform.scale,s=o.transform.scaleZoom(l*i);o.zoomTo(s,{duration:"wheel"===this._type?200:0,around:o.unproject(this._pos),delayEndEvents:200,smoothEasing:!0},{originalEvent:t})}},module.exports=ScrollZoomHandler; +},{"../../util/browser":107,"../../util/dom":114,"../../util/util":126,"../../util/window":109}],100:[function(require,module,exports){ +"use strict";var DOM=require("../../util/dom"),util=require("../../util/util"),window=require("../../util/window"),inertiaLinearity=.15,inertiaEasing=util.bezier(0,0,inertiaLinearity,1),inertiaDeceleration=12,inertiaMaxSpeed=2.5,significantScaleThreshold=.15,significantRotateThreshold=4,TouchZoomRotateHandler=function(t){this._map=t,this._el=t.getCanvasContainer(),util.bindAll(["_onStart","_onMove","_onEnd"],this)};TouchZoomRotateHandler.prototype.isEnabled=function(){return!!this._enabled},TouchZoomRotateHandler.prototype.enable=function(){this.isEnabled()||(this._el.addEventListener("touchstart",this._onStart,!1),this._enabled=!0)},TouchZoomRotateHandler.prototype.disable=function(){this.isEnabled()&&(this._el.removeEventListener("touchstart",this._onStart),this._enabled=!1)},TouchZoomRotateHandler.prototype.disableRotation=function(){this._rotationDisabled=!0},TouchZoomRotateHandler.prototype.enableRotation=function(){this._rotationDisabled=!1},TouchZoomRotateHandler.prototype._onStart=function(t){if(2===t.touches.length){var e=DOM.mousePos(this._el,t.touches[0]),i=DOM.mousePos(this._el,t.touches[1]);this._startVec=e.sub(i),this._startScale=this._map.transform.scale,this._startBearing=this._map.transform.bearing,this._gestureIntent=void 0,this._inertia=[],window.document.addEventListener("touchmove",this._onMove,!1),window.document.addEventListener("touchend",this._onEnd,!1)}},TouchZoomRotateHandler.prototype._onMove=function(t){if(2===t.touches.length){var e=DOM.mousePos(this._el,t.touches[0]),i=DOM.mousePos(this._el,t.touches[1]),o=e.add(i).div(2),n=e.sub(i),a=n.mag()/this._startVec.mag(),r=this._rotationDisabled?0:180*n.angleWith(this._startVec)/Math.PI,s=this._map;if(this._gestureIntent){var h={duration:0,around:s.unproject(o)};"rotate"===this._gestureIntent&&(h.bearing=this._startBearing+r),"zoom"!==this._gestureIntent&&"rotate"!==this._gestureIntent||(h.zoom=s.transform.scaleZoom(this._startScale*a)),s.stop(),this._drainInertiaBuffer(),this._inertia.push([Date.now(),a,o]),s.easeTo(h,{originalEvent:t})}else{var u=Math.abs(1-a)>significantScaleThreshold,l=Math.abs(r)>significantRotateThreshold;l?this._gestureIntent="rotate":u&&(this._gestureIntent="zoom"),this._gestureIntent&&(this._startVec=n,this._startScale=s.transform.scale,this._startBearing=s.transform.bearing)}t.preventDefault()}},TouchZoomRotateHandler.prototype._onEnd=function(t){window.document.removeEventListener("touchmove",this._onMove),window.document.removeEventListener("touchend",this._onEnd),this._drainInertiaBuffer();var e=this._inertia,i=this._map;if(e.length<2)return void i.snapToNorth({},{originalEvent:t});var o=e[e.length-1],n=e[0],a=i.transform.scaleZoom(this._startScale*o[1]),r=i.transform.scaleZoom(this._startScale*n[1]),s=a-r,h=(o[0]-n[0])/1e3,u=o[2];if(0===h||a===r)return void i.snapToNorth({},{originalEvent:t});var l=s*inertiaLinearity/h;Math.abs(l)>inertiaMaxSpeed&&(l=l>0?inertiaMaxSpeed:-inertiaMaxSpeed);var d=1e3*Math.abs(l/(inertiaDeceleration*inertiaLinearity)),c=a+l*d/2e3;c<0&&(c=0),i.easeTo({zoom:c,duration:d,easing:inertiaEasing,around:i.unproject(u)},{originalEvent:t})},TouchZoomRotateHandler.prototype._drainInertiaBuffer=function(){for(var t=this._inertia,e=Date.now(),i=160;t.length>2&&e-t[0][0]>i;)t.shift()},module.exports=TouchZoomRotateHandler; +},{"../../util/dom":114,"../../util/util":126,"../../util/window":109}],101:[function(require,module,exports){ +"use strict";var util=require("../util/util"),window=require("../util/window"),Hash=function(){util.bindAll(["_onHashChange","_updateHash"],this)};Hash.prototype.addTo=function(t){return this._map=t,window.addEventListener("hashchange",this._onHashChange,!1),this._map.on("moveend",this._updateHash),this},Hash.prototype.remove=function(){return window.removeEventListener("hashchange",this._onHashChange,!1),this._map.off("moveend",this._updateHash),delete this._map,this},Hash.prototype._onHashChange=function(){var t=window.location.hash.replace("#","").split("/");return t.length>=3&&(this._map.jumpTo({center:[+t[2],+t[1]],zoom:+t[0],bearing:+(t[3]||0),pitch:+(t[4]||0)}),!0)},Hash.prototype._updateHash=function(){var t=this._map.getCenter(),e=this._map.getZoom(),a=this._map.getBearing(),h=this._map.getPitch(),i=Math.max(0,Math.ceil(Math.log(e)/Math.LN2)),n="#"+Math.round(100*e)/100+"/"+t.lat.toFixed(i)+"/"+t.lng.toFixed(i);(a||h)&&(n+="/"+Math.round(10*a)/10),h&&(n+="/"+Math.round(h)),window.history.replaceState("","",n)},module.exports=Hash; +},{"../util/util":126,"../util/window":109}],102:[function(require,module,exports){ +"use strict";function removeNode(t){t.parentNode&&t.parentNode.removeChild(t)}var util=require("../util/util"),browser=require("../util/browser"),window=require("../util/window"),DOM=require("../util/dom"),Style=require("../style/style"),AnimationLoop=require("../style/animation_loop"),Painter=require("../render/painter"),Transform=require("../geo/transform"),Hash=require("./hash"),bindHandlers=require("./bind_handlers"),Camera=require("./camera"),LngLat=require("../geo/lng_lat"),LngLatBounds=require("../geo/lng_lat_bounds"),Point=require("point-geometry"),AttributionControl=require("./control/attribution_control"),isSupported=require("mapbox-gl-supported"),defaultMinZoom=0,defaultMaxZoom=20,defaultOptions={center:[0,0],zoom:0,bearing:0,pitch:0,minZoom:defaultMinZoom,maxZoom:defaultMaxZoom,interactive:!0,scrollZoom:!0,boxZoom:!0,dragRotate:!0,dragPan:!0,keyboard:!0,doubleClickZoom:!0,touchZoomRotate:!0,bearingSnap:7,hash:!1,attributionControl:!0,failIfMajorPerformanceCaveat:!1,preserveDrawingBuffer:!1,trackResize:!0},Map=function(t){function e(e){var o=this;e=util.extend({},defaultOptions,e);var i=new Transform(e.minZoom,e.maxZoom);t.call(this,i,e),this._interactive=e.interactive,this._failIfMajorPerformanceCaveat=e.failIfMajorPerformanceCaveat,this._preserveDrawingBuffer=e.preserveDrawingBuffer,this._trackResize=e.trackResize,this._bearingSnap=e.bearingSnap,"string"==typeof e.container?this._container=window.document.getElementById(e.container):this._container=e.container,this.animationLoop=new AnimationLoop,e.maxBounds&&this.setMaxBounds(e.maxBounds),util.bindAll(["_onWindowOnline","_onWindowResize","_contextLost","_contextRestored","_update","_render"],this),this._setupContainer(),this._setupPainter(),this.on("move",this._update.bind(this,!1)),this.on("zoom",this._update.bind(this,!0)),this.on("moveend",function(){o.animationLoop.set(300),o._rerender()}),"undefined"!=typeof window&&(window.addEventListener("online",this._onWindowOnline,!1),window.addEventListener("resize",this._onWindowResize,!1)),bindHandlers(this,e),this._hash=e.hash&&(new Hash).addTo(this),this._hash&&this._hash._onHashChange()||this.jumpTo({center:e.center,zoom:e.zoom,bearing:e.bearing,pitch:e.pitch}),this._classes=[],this.resize(),e.classes&&this.setClasses(e.classes),e.style&&this.setStyle(e.style),e.attributionControl&&this.addControl(new AttributionControl),this.on("style.load",function(){this.transform.unmodified&&this.jumpTo(this.style.stylesheet),this.style.update(this._classes,{transition:!1})}),this.on("data",function(t){"style"===t.dataType?this._update(!0):this._update()})}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var o={showTileBoundaries:{},showCollisionBoxes:{},showOverdrawInspector:{},repaint:{},vertices:{}};return e.prototype.addControl=function(t,e){void 0===e&&t.getDefaultPosition&&(e=t.getDefaultPosition()),void 0===e&&(e="top-right");var o=t.onAdd(this),i=this._controlPositions[e];return e.indexOf("bottom")!==-1?i.insertBefore(o,i.firstChild):i.appendChild(o),this},e.prototype.removeControl=function(t){return t.onRemove(this),this},e.prototype.addClass=function(t,e){return this._classes.indexOf(t)>=0||""===t?this:(this._classes.push(t),this._classOptions=e,this.style&&this.style.updateClasses(),this._update(!0))},e.prototype.removeClass=function(t,e){var o=this._classes.indexOf(t);return o<0||""===t?this:(this._classes.splice(o,1),this._classOptions=e,this.style&&this.style.updateClasses(),this._update(!0))},e.prototype.setClasses=function(t,e){for(var o={},i=0;i=0},e.prototype.getClasses=function(){return this._classes},e.prototype.resize=function(){var t=this._containerDimensions(),e=t[0],o=t[1];return this._resizeCanvas(e,o),this.transform.resize(e,o),this.painter.resize(e,o),this.fire("movestart").fire("move").fire("resize").fire("moveend")},e.prototype.getBounds=function(){var t=new LngLatBounds(this.transform.pointLocation(new Point(0,this.transform.height)),this.transform.pointLocation(new Point(this.transform.width,0)));return(this.transform.angle||this.transform.pitch)&&(t.extend(this.transform.pointLocation(new Point(this.transform.size.x,0))),t.extend(this.transform.pointLocation(new Point(0,this.transform.size.y)))),t},e.prototype.setMaxBounds=function(t){if(t){var e=LngLatBounds.convert(t);this.transform.lngRange=[e.getWest(),e.getEast()],this.transform.latRange=[e.getSouth(),e.getNorth()],this.transform._constrain(),this._update()}else null!==t&&void 0!==t||(this.transform.lngRange=[],this.transform.latRange=[],this._update());return this},e.prototype.setMinZoom=function(t){if(t=null===t||void 0===t?defaultMinZoom:t,t>=defaultMinZoom&&t<=this.transform.maxZoom)return this.transform.minZoom=t,this._update(),this.getZoom()=this.transform.minZoom&&t<=defaultMaxZoom)return this.transform.maxZoom=t,this._update(),this.getZoom()>t&&this.setZoom(t),this;throw new Error("maxZoom must be between the current minZoom and "+defaultMaxZoom+", inclusive")},e.prototype.getMaxZoom=function(){return this.transform.maxZoom},e.prototype.project=function(t){return this.transform.locationPoint(LngLat.convert(t))},e.prototype.unproject=function(t){return this.transform.pointLocation(Point.convert(t))},e.prototype.queryRenderedFeatures=function(){function t(t){return t instanceof Point||Array.isArray(t)}var e,o={};return 2===arguments.length?(e=arguments[0],o=arguments[1]):1===arguments.length&&t(arguments[0])?e=arguments[0]:1===arguments.length&&(o=arguments[0]),this.style.queryRenderedFeatures(this._makeQueryGeometry(e),o,this.transform.zoom,this.transform.angle)},e.prototype._makeQueryGeometry=function(t){var e=this;void 0===t&&(t=[Point.convert([0,0]),Point.convert([this.transform.width,this.transform.height])]);var o,i=t instanceof Point||"number"==typeof t[0];if(i){var s=Point.convert(t);o=[s]}else{var r=[Point.convert(t[0]),Point.convert(t[1])];o=[r[0],new Point(r[1].x,r[0].y),r[1],new Point(r[0].x,r[1].y),r[0]]}return o=o.map(function(t){return e.transform.pointCoordinate(t)})},e.prototype.querySourceFeatures=function(t,e){return this.style.querySourceFeatures(t,e)},e.prototype.setStyle=function(t){return this.style&&(this.style.setEventedParent(null),this.style._remove(),this.off("rotate",this.style._redoPlacement),this.off("pitch",this.style._redoPlacement)),t?(t instanceof Style?this.style=t:this.style=new Style(t,this),this.style.setEventedParent(this,{style:this.style}),this.on("rotate",this.style._redoPlacement),this.on("pitch",this.style._redoPlacement),this):(this.style=null,this)},e.prototype.getStyle=function(){if(this.style)return this.style.serialize()},e.prototype.addSource=function(t,e){return this.style.addSource(t,e),this._update(!0),this},e.prototype.addSourceType=function(t,e,o){return this.style.addSourceType(t,e,o)},e.prototype.removeSource=function(t){return this.style.removeSource(t),this._update(!0),this},e.prototype.getSource=function(t){return this.style.getSource(t)},e.prototype.addLayer=function(t,e){return this.style.addLayer(t,e),this._update(!0),this},e.prototype.moveLayer=function(t,e){return this.style.moveLayer(t,e),this._update(!0),this},e.prototype.removeLayer=function(t){return this.style.removeLayer(t),this._update(!0),this},e.prototype.getLayer=function(t){return this.style.getLayer(t)},e.prototype.setFilter=function(t,e){return this.style.setFilter(t,e),this._update(!0),this},e.prototype.setLayerZoomRange=function(t,e,o){return this.style.setLayerZoomRange(t,e,o),this._update(!0),this},e.prototype.getFilter=function(t){return this.style.getFilter(t)},e.prototype.setPaintProperty=function(t,e,o,i){return this.style.setPaintProperty(t,e,o,i),this._update(!0),this},e.prototype.getPaintProperty=function(t,e,o){return this.style.getPaintProperty(t,e,o)},e.prototype.setLayoutProperty=function(t,e,o){return this.style.setLayoutProperty(t,e,o),this._update(!0),this},e.prototype.getLayoutProperty=function(t,e){return this.style.getLayoutProperty(t,e)},e.prototype.setLight=function(t){return this.style.setLight(t),this._update(!0),this},e.prototype.getLight=function(){return this.style.getLight()},e.prototype.getContainer=function(){return this._container},e.prototype.getCanvasContainer=function(){return this._canvasContainer},e.prototype.getCanvas=function(){return this._canvas},e.prototype._containerDimensions=function(){var t=0,e=0;return this._container&&(t=this._container.offsetWidth||400,e=this._container.offsetHeight||300),[t,e]},e.prototype._setupContainer=function(){var t=this._container;t.classList.add("mapboxgl-map");var e=this._canvasContainer=DOM.create("div","mapboxgl-canvas-container",t);this._interactive&&e.classList.add("mapboxgl-interactive"),this._canvas=DOM.create("canvas","mapboxgl-canvas",e),this._canvas.style.position="absolute",this._canvas.addEventListener("webglcontextlost",this._contextLost,!1),this._canvas.addEventListener("webglcontextrestored",this._contextRestored,!1),this._canvas.setAttribute("tabindex",0);var o=this._containerDimensions();this._resizeCanvas(o[0],o[1]);var i=this._controlContainer=DOM.create("div","mapboxgl-control-container",t),s=this._controlPositions={};["top-left","top-right","bottom-left","bottom-right"].forEach(function(t){s[t]=DOM.create("div","mapboxgl-ctrl-"+t,i)})},e.prototype._resizeCanvas=function(t,e){var o=window.devicePixelRatio||1;this._canvas.width=o*t,this._canvas.height=o*e,this._canvas.style.width=t+"px",this._canvas.style.height=e+"px"},e.prototype._setupPainter=function(){var t=util.extend({failIfMajorPerformanceCaveat:this._failIfMajorPerformanceCaveat,preserveDrawingBuffer:this._preserveDrawingBuffer},isSupported.webGLContextAttributes),e=this._canvas.getContext("webgl",t)||this._canvas.getContext("experimental-webgl",t);return e?void(this.painter=new Painter(e,this.transform)):void this.fire("error",{error:new Error("Failed to initialize WebGL")})},e.prototype._contextLost=function(t){t.preventDefault(),this._frameId&&browser.cancelFrame(this._frameId),this.fire("webglcontextlost",{originalEvent:t})},e.prototype._contextRestored=function(t){this._setupPainter(),this.resize(),this._update(),this.fire("webglcontextrestored",{originalEvent:t})},e.prototype.loaded=function(){return!this._styleDirty&&!this._sourcesDirty&&!(!this.style||!this.style.loaded())},e.prototype._update=function(t){return this.style?(this._styleDirty=this._styleDirty||t,this._sourcesDirty=!0,this._rerender(),this):this},e.prototype._render=function(){return this.style&&this._styleDirty&&(this._styleDirty=!1,this.style.update(this._classes,this._classOptions),this._classOptions=null,this.style._recalculate(this.transform.zoom)),this.style&&this._sourcesDirty&&(this._sourcesDirty=!1,this.style._updateSources(this.transform)),this.painter.render(this.style,{showTileBoundaries:this.showTileBoundaries,showOverdrawInspector:this._showOverdrawInspector,rotating:this.rotating,zooming:this.zooming}),this.fire("render"),this.loaded()&&!this._loaded&&(this._loaded=!0,this.fire("load")),this._frameId=null,this.animationLoop.stopped()||(this._styleDirty=!0),(this._sourcesDirty||this._repaint||this._styleDirty)&&this._rerender(),this},e.prototype.remove=function(){this._hash&&this._hash.remove(),browser.cancelFrame(this._frameId),this.setStyle(null),"undefined"!=typeof window&&window.removeEventListener("resize",this._onWindowResize,!1);var t=this.painter.gl.getExtension("WEBGL_lose_context");t&&t.loseContext(),removeNode(this._canvasContainer),removeNode(this._controlContainer),this._container.classList.remove("mapboxgl-map"),this.fire("remove")},e.prototype._rerender=function(){this.style&&!this._frameId&&(this._frameId=browser.frame(this._render))},e.prototype._onWindowOnline=function(){this._update()},e.prototype._onWindowResize=function(){this._trackResize&&this.stop().resize()._update()},o.showTileBoundaries.get=function(){return!!this._showTileBoundaries},o.showTileBoundaries.set=function(t){this._showTileBoundaries!==t&&(this._showTileBoundaries=t,this._update())},o.showCollisionBoxes.get=function(){return!!this._showCollisionBoxes},o.showCollisionBoxes.set=function(t){this._showCollisionBoxes!==t&&(this._showCollisionBoxes=t,this.style._redoPlacement())},o.showOverdrawInspector.get=function(){return!!this._showOverdrawInspector},o.showOverdrawInspector.set=function(t){this._showOverdrawInspector!==t&&(this._showOverdrawInspector=t,this._update())},o.repaint.get=function(){return!!this._repaint},o.repaint.set=function(t){this._repaint=t,this._update()},o.vertices.get=function(){return!!this._vertices},o.vertices.set=function(t){this._vertices=t,this._update()},Object.defineProperties(e.prototype,o),e}(Camera);module.exports=Map; +},{"../geo/lng_lat":19,"../geo/lng_lat_bounds":20,"../geo/transform":21,"../render/painter":36,"../style/animation_loop":56,"../style/style":60,"../util/browser":107,"../util/dom":114,"../util/util":126,"../util/window":109,"./bind_handlers":88,"./camera":89,"./control/attribution_control":90,"./hash":101,"mapbox-gl-supported":190,"point-geometry":194}],103:[function(require,module,exports){ +"use strict";var DOM=require("../util/dom"),util=require("../util/util"),LngLat=require("../geo/lng_lat"),Point=require("point-geometry"),Popup=require("./popup"),Marker=function(t,e){this._offset=Point.convert(e&&e.offset||[0,0]),this._update=this._update.bind(this),this._onMapClick=this._onMapClick.bind(this),t||(t=DOM.create("div")),t.classList.add("mapboxgl-marker"),this._element=t,this._popup=null};Marker.prototype.addTo=function(t){return this.remove(),this._map=t,t.getCanvasContainer().appendChild(this._element),t.on("move",this._update),t.on("moveend",this._update),this._update(),this._map.on("click",this._onMapClick),this},Marker.prototype.remove=function(){return this._map&&(this._map.off("click",this._onMapClick),this._map.off("move",this._update),this._map.off("moveend",this._update),this._map=null),DOM.remove(this._element),this._popup&&this._popup.remove(),this},Marker.prototype.getLngLat=function(){return this._lngLat},Marker.prototype.setLngLat=function(t){return this._lngLat=LngLat.convert(t),this._popup&&this._popup.setLngLat(this._lngLat),this._update(),this},Marker.prototype.getElement=function(){return this._element},Marker.prototype.setPopup=function(t){return this._popup&&(this._popup.remove(),this._popup=null),t&&(this._popup=t,this._popup.setLngLat(this._lngLat)),this},Marker.prototype._onMapClick=function(t){var e=t.originalEvent.target,p=this._element;this._popup&&(e===p||p.contains(e))&&this.togglePopup()},Marker.prototype.getPopup=function(){return this._popup},Marker.prototype.togglePopup=function(){var t=this._popup;t&&(t.isOpen()?t.remove():t.addTo(this._map))},Marker.prototype._update=function(t){if(this._map){var e=this._map.project(this._lngLat)._add(this._offset);t&&"moveend"!==t.type||(e=e.round()),DOM.setTransform(this._element,"translate("+e.x+"px,"+e.y+"px)")}},module.exports=Marker; +},{"../geo/lng_lat":19,"../util/dom":114,"../util/util":126,"./popup":104,"point-geometry":194}],104:[function(require,module,exports){ +"use strict";function normalizeOffset(t){if(t){if("number"==typeof t){var o=Math.round(Math.sqrt(.5*Math.pow(t,2)));return{top:new Point(0,t),"top-left":new Point(o,o),"top-right":new Point(-o,o),bottom:new Point(0,-t),"bottom-left":new Point(o,-o),"bottom-right":new Point(-o,-o),left:new Point(t,0),right:new Point(-t,0)}}if(isPointLike(t)){var e=Point.convert(t);return{top:e,"top-left":e,"top-right":e,bottom:e,"bottom-left":e,"bottom-right":e,left:e,right:e}}return{top:Point.convert(t.top),"top-left":Point.convert(t["top-left"]),"top-right":Point.convert(t["top-right"]),bottom:Point.convert(t.bottom),"bottom-left":Point.convert(t["bottom-left"]),"bottom-right":Point.convert(t["bottom-right"]),left:Point.convert(t.left),right:Point.convert(t.right)}}return normalizeOffset(new Point(0,0))}function isPointLike(t){return t instanceof Point||Array.isArray(t)}var util=require("../util/util"),Evented=require("../util/evented"),DOM=require("../util/dom"),LngLat=require("../geo/lng_lat"),Point=require("point-geometry"),window=require("../util/window"),defaultOptions={closeButton:!0,closeOnClick:!0},Popup=function(t){function o(o){t.call(this),this.options=util.extend(Object.create(defaultOptions),o),util.bindAll(["_update","_onClickClose"],this)}return t&&(o.__proto__=t),o.prototype=Object.create(t&&t.prototype),o.prototype.constructor=o,o.prototype.addTo=function(t){return this._map=t,this._map.on("move",this._update),this.options.closeOnClick&&this._map.on("click",this._onClickClose),this._update(),this},o.prototype.isOpen=function(){return!!this._map},o.prototype.remove=function(){return this._content&&this._content.parentNode&&this._content.parentNode.removeChild(this._content),this._container&&(this._container.parentNode.removeChild(this._container),delete this._container),this._map&&(this._map.off("move",this._update),this._map.off("click",this._onClickClose),delete this._map),this.fire("close"),this},o.prototype.getLngLat=function(){return this._lngLat},o.prototype.setLngLat=function(t){return this._lngLat=LngLat.convert(t),this._update(),this},o.prototype.setText=function(t){return this.setDOMContent(window.document.createTextNode(t))},o.prototype.setHTML=function(t){var o,e=window.document.createDocumentFragment(),n=window.document.createElement("body");for(n.innerHTML=t;;){if(o=n.firstChild,!o)break;e.appendChild(o)}return this.setDOMContent(e)},o.prototype.setDOMContent=function(t){return this._createContent(),this._content.appendChild(t),this._update(),this},o.prototype._createContent=function(){this._content&&this._content.parentNode&&this._content.parentNode.removeChild(this._content),this._content=DOM.create("div","mapboxgl-popup-content",this._container),this.options.closeButton&&(this._closeButton=DOM.create("button","mapboxgl-popup-close-button",this._content),this._closeButton.type="button",this._closeButton.innerHTML="×",this._closeButton.addEventListener("click",this._onClickClose))},o.prototype._update=function(){if(this._map&&this._lngLat&&this._content){this._container||(this._container=DOM.create("div","mapboxgl-popup",this._map.getContainer()),this._tip=DOM.create("div","mapboxgl-popup-tip",this._container),this._container.appendChild(this._content));var t=this.options.anchor,o=normalizeOffset(this.options.offset),e=this._map.project(this._lngLat).round();if(!t){var n=this._container.offsetWidth,i=this._container.offsetHeight;t=e.y+o.bottom.ythis._map.transform.height-i?["bottom"]:[],e.xthis._map.transform.width-n/2&&t.push("right"),t=0===t.length?"bottom":t.join("-")}var r=e.add(o[t]),s={top:"translate(-50%,0)","top-left":"translate(0,0)","top-right":"translate(-100%,0)",bottom:"translate(-50%,-100%)","bottom-left":"translate(0,-100%)","bottom-right":"translate(-100%,-100%)",left:"translate(0,-50%)",right:"translate(-100%,-50%)"},p=this._container.classList;for(var a in s)p.remove("mapboxgl-popup-anchor-"+a);p.add("mapboxgl-popup-anchor-"+t),DOM.setTransform(this._container,s[t]+" translate("+r.x+"px,"+r.y+"px)")}},o.prototype._onClickClose=function(){this.remove()},o}(Evented);module.exports=Popup; +},{"../geo/lng_lat":19,"../util/dom":114,"../util/evented":115,"../util/util":126,"../util/window":109,"point-geometry":194}],105:[function(require,module,exports){ +"use strict";var Actor=function(t,e,a){this.target=t,this.parent=e,this.mapId=a,this.callbacks={},this.callbackID=0,this.receive=this.receive.bind(this),this.target.addEventListener("message",this.receive,!1)};Actor.prototype.send=function(t,e,a,r,s){var i=a?this.mapId+":"+this.callbackID++:null;a&&(this.callbacks[i]=a),this.target.postMessage({targetMapId:s,sourceMapId:this.mapId,type:t,id:String(i),data:e},r)},Actor.prototype.receive=function(t){var e,a=this,r=t.data,s=r.id;if(!r.targetMapId||this.mapId===r.targetMapId){var i=function(t,e,r){a.target.postMessage({sourceMapId:a.mapId,type:"",id:String(s),error:t?String(t):null,data:e},r)};if(""===r.type)e=this.callbacks[r.id],delete this.callbacks[r.id],e&&e(r.error||null,r.data);else if("undefined"!=typeof r.id&&this.parent[r.type])this.parent[r.type](r.sourceMapId,r.data,i);else if("undefined"!=typeof r.id&&this.parent.getWorkerSource){var p=r.type.split("."),d=this.parent.getWorkerSource(r.sourceMapId,p[0]);d[p[1]](r.data,i)}else this.parent[r.type](r.data)}},Actor.prototype.remove=function(){this.target.removeEventListener("message",this.receive,!1)},module.exports=Actor; +},{}],106:[function(require,module,exports){ +"use strict";function sameOrigin(e){var n=window.document.createElement("a");return n.href=e,n.protocol===window.document.location.protocol&&n.host===window.document.location.host}var window=require("./window");exports.getJSON=function(e,n){var t=new window.XMLHttpRequest;return t.open("GET",e,!0),t.setRequestHeader("Accept","application/json"),t.onerror=function(e){n(e)},t.onload=function(){if(t.status>=200&&t.status<300&&t.response){var e;try{e=JSON.parse(t.response)}catch(e){return n(e)}n(null,e)}else n(new Error(t.statusText))},t.send(),t},exports.getArrayBuffer=function(e,n){var t=new window.XMLHttpRequest;return t.open("GET",e,!0),t.responseType="arraybuffer",t.onerror=function(e){n(e)},t.onload=function(){return 0===t.response.byteLength&&200===t.status?n(new Error("http status 200 returned without content.")):void(t.status>=200&&t.status<300&&t.response?n(null,t.response):n(new Error(t.statusText)))},t.send(),t};var transparentPngUrl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQYV2NgAAIAAAUAAarVyFEAAAAASUVORK5CYII=";exports.getImage=function(e,n){return exports.getArrayBuffer(e,function(t,r){if(t)return n(t);var o=new window.Image;o.onload=function(){return n(null,o)},sameOrigin(e)||(o.crossOrigin="Anonymous"),o.src=r.byteLength?e:transparentPngUrl})},exports.getVideo=function(e,n){var t=window.document.createElement("video");t.onloadstart=function(){n(null,t)};for(var r=0;r=a+n?e.call(t,1):(e.call(t,(i-a)/n),exports.frame(o)))}if(!n)return e.call(t,1),null;var r=!1,a=module.exports.now();return exports.frame(o),function(){r=!0}},exports.getImageData=function(e){var n=window.document.createElement("canvas"),t=n.getContext("2d");return n.width=e.width,n.height=e.height,t.drawImage(e,0,0),t.getImageData(0,0,e.width,e.height).data},exports.supported=require("mapbox-gl-supported"),exports.hardwareConcurrency=window.navigator.hardwareConcurrency||4,Object.defineProperty(exports,"devicePixelRatio",{get:function(){return window.devicePixelRatio}}),exports.supportsWebp=!1;var webpImgTest=window.document.createElement("img");webpImgTest.onload=function(){exports.supportsWebp=!0},webpImgTest.src="data:image/webp;base64,UklGRh4AAABXRUJQVlA4TBEAAAAvAQAAAAfQ//73v/+BiOh/AAA="; +},{"./window":109,"mapbox-gl-supported":190}],108:[function(require,module,exports){ +"use strict";var WebWorkify=require("webworkify"),window=require("../window"),workerURL=window.URL.createObjectURL(new WebWorkify(require("../../source/worker"),{bare:!0}));module.exports=function(){return new window.Worker(workerURL)}; +},{"../../source/worker":54,"../window":109,"webworkify":211}],109:[function(require,module,exports){ +"use strict";module.exports=self; +},{}],110:[function(require,module,exports){ +"use strict";function compareAreas(e,r){return r.area-e.area}var quickselect=require("quickselect"),calculateSignedArea=require("./util").calculateSignedArea;module.exports=function(e,r){var a=e.length;if(a<=1)return[e];for(var t,u,c=[],i=0;i1)for(var n=0;ne.y!=h.y>e.y&&e.x<(h.x-a.x)*(e.y-a.y)/(h.y-a.y)+a.x&&(n=!n),r=Math.min(r,distToSegmentSquared(e,a,h))}return(n?1:-1)*Math.sqrt(r)}function getCentroidCell(e){for(var t=0,n=0,r=0,o=e[0],l=0,i=o.length,s=i-1;ll)&&(l=a.x),(!u||a.y>i)&&(i=a.y)}for(var h=l-r,p=i-o,y=Math.min(h,p),x=y/2,d=new Queue(null,compareMax),g=r;gm.d&&(m=v,n&&console.log("found best %d after %d probes",Math.round(1e4*v.d)/1e4,c)),v.max-m.d<=t||(x=v.h/2,d.push(new Cell(v.p.x-x,v.p.y-x,x,e)),d.push(new Cell(v.p.x+x,v.p.y-x,x,e)),d.push(new Cell(v.p.x-x,v.p.y+x,x,e)),d.push(new Cell(v.p.x+x,v.p.y+x,x,e)),c+=4)}return n&&(console.log("num probes: "+c),console.log("best distance: "+m.d)),m.p}; +},{"./intersection_tests":119,"point-geometry":194,"tinyqueue":199}],117:[function(require,module,exports){ +"use strict";function Glyphs(a,e){this.stacks=a.readFields(readFontstacks,[],e)}function readFontstacks(a,e,r){if(1===a){var t=r.readMessage(readFontstack,{glyphs:{}});e.push(t)}}function readFontstack(a,e,r){if(1===a)e.name=r.readString();else if(2===a)e.range=r.readString();else if(3===a){var t=r.readMessage(readGlyph,{});e.glyphs[t.id]=t}}function readGlyph(a,e,r){1===a?e.id=r.readVarint():2===a?e.bitmap=r.readBytes():3===a?e.width=r.readVarint():4===a?e.height=r.readVarint():5===a?e.left=r.readSVarint():6===a?e.top=r.readSVarint():7===a&&(e.advance=r.readVarint())}module.exports=Glyphs; +},{}],118:[function(require,module,exports){ +"use strict";function interpolate(t,e,n){return t*(1-n)+e*n}module.exports=interpolate,interpolate.number=interpolate,interpolate.vec2=function(t,e,n){return[interpolate(t[0],e[0],n),interpolate(t[1],e[1],n)]},interpolate.color=function(t,e,n){return[interpolate(t[0],e[0],n),interpolate(t[1],e[1],n),interpolate(t[2],e[2],n),interpolate(t[3],e[3],n)]},interpolate.array=function(t,e,n){return t.map(function(t,r){return interpolate(t,e[r],n)})}; +},{}],119:[function(require,module,exports){ +"use strict";function polygonIntersectsPolygon(n,t){for(var e=0;e=3)for(var u=0;u1){if(lineIntersectsLine(n,t))return!0;for(var r=0;r1?n.distSqr(e):n.distSqr(e.sub(t)._mult(o)._add(t))}function multiPolygonContainsPoint(n,t){for(var e,r,o,i=!1,l=0;lt.y!=o.y>t.y&&t.x<(o.x-r.x)*(t.y-r.y)/(o.y-r.y)+r.x&&(i=!i)}return i}function polygonContainsPoint(n,t){for(var e=!1,r=0,o=n.length-1;rt.y!=l.y>t.y&&t.x<(l.x-i.x)*(t.y-i.y)/(l.y-i.y)+i.x&&(e=!e)}return e}var isCounterClockwise=require("./util").isCounterClockwise;module.exports={multiPolygonIntersectsBufferedMultiPoint:multiPolygonIntersectsBufferedMultiPoint,multiPolygonIntersectsMultiPolygon:multiPolygonIntersectsMultiPolygon,multiPolygonIntersectsBufferedMultiLine:multiPolygonIntersectsBufferedMultiLine,polygonIntersectsPolygon:polygonIntersectsPolygon,distToSegmentSquared:distToSegmentSquared}; +},{"./util":126}],120:[function(require,module,exports){ +"use strict";module.exports={"Latin-1 Supplement":function(n){return n>=128&&n<=255},"Hangul Jamo":function(n){return n>=4352&&n<=4607},"Unified Canadian Aboriginal Syllabics":function(n){return n>=5120&&n<=5759},"Unified Canadian Aboriginal Syllabics Extended":function(n){return n>=6320&&n<=6399},"General Punctuation":function(n){return n>=8192&&n<=8303},"Letterlike Symbols":function(n){return n>=8448&&n<=8527},"Number Forms":function(n){return n>=8528&&n<=8591},"Miscellaneous Technical":function(n){return n>=8960&&n<=9215},"Control Pictures":function(n){return n>=9216&&n<=9279},"Optical Character Recognition":function(n){return n>=9280&&n<=9311},"Enclosed Alphanumerics":function(n){return n>=9312&&n<=9471},"Geometric Shapes":function(n){return n>=9632&&n<=9727},"Miscellaneous Symbols":function(n){return n>=9728&&n<=9983},"Miscellaneous Symbols and Arrows":function(n){return n>=11008&&n<=11263},"CJK Radicals Supplement":function(n){return n>=11904&&n<=12031},"Kangxi Radicals":function(n){return n>=12032&&n<=12255},"Ideographic Description Characters":function(n){return n>=12272&&n<=12287},"CJK Symbols and Punctuation":function(n){return n>=12288&&n<=12351},Hiragana:function(n){return n>=12352&&n<=12447},Katakana:function(n){return n>=12448&&n<=12543},Bopomofo:function(n){return n>=12544&&n<=12591},"Hangul Compatibility Jamo":function(n){return n>=12592&&n<=12687},Kanbun:function(n){return n>=12688&&n<=12703},"Bopomofo Extended":function(n){return n>=12704&&n<=12735},"CJK Strokes":function(n){return n>=12736&&n<=12783},"Katakana Phonetic Extensions":function(n){return n>=12784&&n<=12799},"Enclosed CJK Letters and Months":function(n){return n>=12800&&n<=13055},"CJK Compatibility":function(n){return n>=13056&&n<=13311},"CJK Unified Ideographs Extension A":function(n){return n>=13312&&n<=19903},"Yijing Hexagram Symbols":function(n){return n>=19904&&n<=19967},"CJK Unified Ideographs":function(n){return n>=19968&&n<=40959},"Yi Syllables":function(n){return n>=40960&&n<=42127},"Yi Radicals":function(n){return n>=42128&&n<=42191},"Hangul Jamo Extended-A":function(n){return n>=43360&&n<=43391},"Hangul Syllables":function(n){return n>=44032&&n<=55215},"Hangul Jamo Extended-B":function(n){return n>=55216&&n<=55295},"Private Use Area":function(n){return n>=57344&&n<=63743},"CJK Compatibility Ideographs":function(n){return n>=63744&&n<=64255},"Vertical Forms":function(n){return n>=65040&&n<=65055},"CJK Compatibility Forms":function(n){return n>=65072&&n<=65103},"Small Form Variants":function(n){return n>=65104&&n<=65135},"Halfwidth and Fullwidth Forms":function(n){return n>=65280&&n<=65519}}; +},{}],121:[function(require,module,exports){ +"use strict";var LRUCache=function(t,e){this.max=t,this.onRemove=e,this.reset()};LRUCache.prototype.reset=function(){var t=this;for(var e in this.data)t.onRemove(t.data[e]);return this.data={},this.order=[],this},LRUCache.prototype.add=function(t,e){if(this.has(t))this.order.splice(this.order.indexOf(t),1),this.data[t]=e,this.order.push(t);else if(this.data[t]=e,this.order.push(t),this.order.length>this.max){var r=this.get(this.order[0]);r&&this.onRemove(r)}return this},LRUCache.prototype.has=function(t){return t in this.data},LRUCache.prototype.keys=function(){return this.order},LRUCache.prototype.get=function(t){if(!this.has(t))return null;var e=this.data[t];return delete this.data[t],this.order.splice(this.order.indexOf(t),1),e},LRUCache.prototype.setMaxSize=function(t){var e=this;for(this.max=t;this.order.length>this.max;){var r=e.get(e.order[0]);r&&e.onRemove(r)}return this},module.exports=LRUCache; +},{}],122:[function(require,module,exports){ +"use strict";function makeAPIURL(r,e){var t=parseUrl(config.API_URL);if(r.protocol=t.protocol,r.authority=t.authority,!config.REQUIRE_ACCESS_TOKEN)return formatUrl(r);if(e=e||config.ACCESS_TOKEN,!e)throw new Error("An API access token is required to use Mapbox GL. "+help);if("s"===e[0])throw new Error("Use a public access token (pk.*) with Mapbox GL, not a secret access token (sk.*). "+help);return r.params.push("access_token="+e),formatUrl(r)}function isMapboxURL(r){return 0===r.indexOf("mapbox:")}function replaceTempAccessToken(r){for(var e=0;e=2||512===t?"@2x":"",s=browser.supportsWebp?".webp":"$1";return a.path=a.path.replace(imageExtensionRe,""+o+s),replaceTempAccessToken(a.params),formatUrl(a)};var urlRe=/^(\w+):\/\/([^\/?]+)(\/[^?]+)?\??(.+)?/; +},{"./browser":107,"./config":111}],123:[function(require,module,exports){ +"use strict";var isChar=require("./is_char_in_unicode_block");module.exports.allowsIdeographicBreaking=function(a){for(var i=0,r=a;i=65097&&a<=65103)||(!!isChar["CJK Compatibility Ideographs"](a)||(!!isChar["CJK Compatibility"](a)||(!!isChar["CJK Radicals Supplement"](a)||(!!isChar["CJK Strokes"](a)||(!(!isChar["CJK Symbols and Punctuation"](a)||a>=12296&&a<=12305||a>=12308&&a<=12319||12336===a)||(!!isChar["CJK Unified Ideographs Extension A"](a)||(!!isChar["CJK Unified Ideographs"](a)||(!!isChar["Enclosed CJK Letters and Months"](a)||(!!isChar["Hangul Compatibility Jamo"](a)||(!!isChar["Hangul Jamo Extended-A"](a)||(!!isChar["Hangul Jamo Extended-B"](a)||(!!isChar["Hangul Jamo"](a)||(!!isChar["Hangul Syllables"](a)||(!!isChar.Hiragana(a)||(!!isChar["Ideographic Description Characters"](a)||(!!isChar.Kanbun(a)||(!!isChar["Kangxi Radicals"](a)||(!!isChar["Katakana Phonetic Extensions"](a)||(!(!isChar.Katakana(a)||12540===a)||(!(!isChar["Halfwidth and Fullwidth Forms"](a)||65288===a||65289===a||65293===a||a>=65306&&a<=65310||65339===a||65341===a||65343===a||a>=65371&&a<=65503||65507===a||a>=65512&&a<=65519)||(!(!isChar["Small Form Variants"](a)||a>=65112&&a<=65118||a>=65123&&a<=65126)||(!!isChar["Unified Canadian Aboriginal Syllabics"](a)||(!!isChar["Unified Canadian Aboriginal Syllabics Extended"](a)||(!!isChar["Vertical Forms"](a)||(!!isChar["Yijing Hexagram Symbols"](a)||(!!isChar["Yi Syllables"](a)||!!isChar["Yi Radicals"](a))))))))))))))))))))))))))))))},exports.charHasNeutralVerticalOrientation=function(a){return!(!isChar["Latin-1 Supplement"](a)||167!==a&&169!==a&&174!==a&&177!==a&&188!==a&&189!==a&&190!==a&&215!==a&&247!==a)||(!(!isChar["General Punctuation"](a)||8214!==a&&8224!==a&&8225!==a&&8240!==a&&8241!==a&&8251!==a&&8252!==a&&8258!==a&&8263!==a&&8264!==a&&8265!==a&&8273!==a)||(!!isChar["Letterlike Symbols"](a)||(!!isChar["Number Forms"](a)||(!(!isChar["Miscellaneous Technical"](a)||!(a>=8960&&a<=8967||a>=8972&&a<=8991||a>=8996&&a<=9e3||9003===a||a>=9085&&a<=9114||a>=9150&&a<=9165||9167===a||a>=9169&&a<=9179||a>=9186&&a<=9215))||(!(!isChar["Control Pictures"](a)||9251===a)||(!!isChar["Optical Character Recognition"](a)||(!!isChar["Enclosed Alphanumerics"](a)||(!!isChar["Geometric Shapes"](a)||(!(!isChar["Miscellaneous Symbols"](a)||a>=9754&&a<=9759)||(!(!isChar["Miscellaneous Symbols and Arrows"](a)||!(a>=11026&&a<=11055||a>=11088&&a<=11097||a>=11192&&a<=11243))||(!!isChar["CJK Symbols and Punctuation"](a)||(!!isChar.Katakana(a)||(!!isChar["Private Use Area"](a)||(!!isChar["CJK Compatibility Forms"](a)||(!!isChar["Small Form Variants"](a)||(!!isChar["Halfwidth and Fullwidth Forms"](a)||(8734===a||8756===a||8757===a||a>=9984&&a<=10087||a>=10102&&a<=10131||65532===a||65533===a)))))))))))))))))},exports.charHasRotatedVerticalOrientation=function(a){return!(exports.charHasUprightVerticalOrientation(a)||exports.charHasNeutralVerticalOrientation(a))}; +},{"./is_char_in_unicode_block":120}],124:[function(require,module,exports){ +"use strict";function createStructArrayType(t){var e=JSON.stringify(t);if(structArrayTypeCache[e])return structArrayTypeCache[e];void 0===t.alignment&&(t.alignment=1);var r=0,i=0,n=["Uint8"],a=t.members.map(function(e){n.indexOf(e.type)<0&&n.push(e.type);var a=sizeOf(e.type),o=r=align(r,Math.max(t.alignment,a)),s=e.components||1;return i=Math.max(i,a),r+=a*s,{name:e.name,type:e.type,components:s,offset:o}}),o=align(r,Math.max(i,t.alignment)),s=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e}(Struct);s.prototype.alignment=t.alignment,s.prototype.size=o;for(var p=0,y=a;pthis.capacity){this.capacity=Math.max(t,Math.floor(this.capacity*RESIZE_MULTIPLIER),DEFAULT_CAPACITY),this.arrayBuffer=new ArrayBuffer(this.capacity*this.bytesPerElement);var e=this.uint8;this._refreshViews(),e&&this.uint8.set(e)}},StructArray.prototype._refreshViews=function(){for(var t=this,e=0,r=this._usedTypes;e=1)return 1;var e=r*r,n=e*r;return 4*(r<.5?n:3*(r-e)+n-.75)},exports.bezier=function(r,e,n,t){var o=new UnitBezier(r,e,n,t);return function(r){return o.solve(r)}},exports.ease=exports.bezier(.25,.1,.25,1),exports.clamp=function(r,e,n){return Math.min(n,Math.max(e,r))},exports.wrap=function(r,e,n){var t=n-e,o=((r-e)%t+t)%t+e;return o===e?n:o},exports.asyncAll=function(r,e,n){if(!r.length)return n(null,[]);var t=r.length,o=new Array(r.length),a=null;r.forEach(function(r,i){e(r,function(r,e){r&&(a=r),o[i]=e,0===--t&&n(a,o)})})},exports.values=function(r){var e=[];for(var n in r)e.push(r[n]);return e},exports.keysDifference=function(r,e){var n=[];for(var t in r)t in e||n.push(t);return n},exports.extend=function(r,e,n,t){for(var o=arguments,a=1;a=0)return!0;return!1};var warnOnceHistory={};exports.warnOnce=function(r){warnOnceHistory[r]||("undefined"!=typeof console&&console.warn(r),warnOnceHistory[r]=!0)},exports.isCounterClockwise=function(r,e,n){return(n.y-r.y)*(e.x-r.x)>(e.y-r.y)*(n.x-r.x)},exports.calculateSignedArea=function(r){for(var e,n,t=0,o=0,a=r.length,i=a-1;o0||Math.abs(e.y-n.y)>0)&&Math.abs(exports.calculateSignedArea(r))>.01},exports.sphericalToCartesian=function(r){var e=r[0],n=r[1],t=r[2];return n+=90,n*=Math.PI/180,t*=Math.PI/180,[e*Math.cos(n)*Math.sin(t),e*Math.sin(n)*Math.sin(t),e*Math.cos(t)]}; +},{"../geo/coordinate":18,"point-geometry":194,"unitbezier":200}],127:[function(require,module,exports){ +"use strict";var Feature=function(e,t,r,o){this.type="Feature",this._vectorTileFeature=e,e._z=t,e._x=r,e._y=o,this.properties=e.properties,null!=e.id&&(this.id=e.id)},prototypeAccessors={geometry:{}};prototypeAccessors.geometry.get=function(){return void 0===this._geometry&&(this._geometry=this._vectorTileFeature.toGeoJSON(this._vectorTileFeature._x,this._vectorTileFeature._y,this._vectorTileFeature._z).geometry),this._geometry},prototypeAccessors.geometry.set=function(e){this._geometry=e},Feature.prototype.toJSON=function(){var e=this,t={geometry:this.geometry};for(var r in this)"_geometry"!==r&&"_vectorTileFeature"!==r&&(t[r]=e[r]);return t},Object.defineProperties(Feature.prototype,prototypeAccessors),module.exports=Feature; +},{}],128:[function(require,module,exports){ +"use strict";var scriptDetection=require("./script_detection");module.exports=function(t){for(var o="",e=0;e":"ï¹€","?":"︖","@":"ï¼ ","[":"﹇","\\":"ï¼¼","]":"﹈","^":"ï¼¾",_:"︳","`":"ï½€","{":"︷","|":"―","}":"︸","~":"~","¢":"ï¿ ","£":"ï¿¡","Â¥":"ï¿¥","¦":"¦","¬":"ï¿¢","¯":"ï¿£","–":"︲","â€â€":"︱","‘":"﹃","’":"﹄","“":"ï¹Â","â€Â":"﹂","…":"︙","‧":"・","â‚©":"₩","ã€Â":"︑","。":"︒","〈":"︿","〉":"ï¹€","《":"︽","》":"︾","「":"ï¹Â","ã€Â":"﹂","『":"﹃","ã€Â":"﹄","ã€Â":"︻","】":"︼","ã€â€":"︹","〕":"︺","〖":"︗","〗":"︘","ï¼Â":"︕","(":"︵",")":"︶",",":"ï¸Â","ï¼Â":"︲",".":"・",":":"︓","ï¼›":"ï¸â€","<":"︿",">":"ï¹€","?":"︖","ï¼»":"﹇","ï¼½":"﹈","_":"︳","ï½›":"︷","|":"―","ï½Â":"︸","⦅":"︵","ï½ ":"︶","。":"︒","ï½¢":"ï¹Â","ï½£":"﹂"}; +},{"./script_detection":123}],129:[function(require,module,exports){ +"use strict";var WebWorker=require("./web_worker"),WorkerPool=function(){this.active={}};WorkerPool.prototype.acquire=function(r){var e=this;if(!this.workers){var o=require("../mapbox-gl").workerCount;for(this.workers=[];this.workers.length255?255:e}function clamp_css_float(e){return e<0?0:e>1?1:e}function parse_css_int(e){return clamp_css_byte("%"===e[e.length-1]?parseFloat(e)/100*255:parseInt(e))}function parse_css_float(e){return clamp_css_float("%"===e[e.length-1]?parseFloat(e)/100:parseFloat(e))}function css_hue_to_rgb(e,r,l){return l<0?l+=1:l>1&&(l-=1),6*l<1?e+(r-e)*l*6:2*l<1?r:3*l<2?e+(r-e)*(2/3-l)*6:e}function parseCSSColor(e){var r=e.replace(/ /g,"").toLowerCase();if(r in kCSSColorTable)return kCSSColorTable[r].slice();if("#"===r[0]){if(4===r.length){var l=parseInt(r.substr(1),16);return l>=0&&l<=4095?[(3840&l)>>4|(3840&l)>>8,240&l|(240&l)>>4,15&l|(15&l)<<4,1]:null}if(7===r.length){var l=parseInt(r.substr(1),16);return l>=0&&l<=16777215?[(16711680&l)>>16,(65280&l)>>8,255&l,1]:null}return null}var a=r.indexOf("("),t=r.indexOf(")");if(a!==-1&&t+1===r.length){var n=r.substr(0,a),s=r.substr(a+1,t-(a+1)).split(","),o=1;switch(n){case"rgba":if(4!==s.length)return null;o=parse_css_float(s.pop());case"rgb":return 3!==s.length?null:[parse_css_int(s[0]),parse_css_int(s[1]),parse_css_int(s[2]),o];case"hsla":if(4!==s.length)return null;o=parse_css_float(s.pop());case"hsl":if(3!==s.length)return null;var i=(parseFloat(s[0])%360+360)%360/360,u=parse_css_float(s[1]),g=parse_css_float(s[2]),d=g<=.5?g*(u+1):g+u-g*u,c=2*g-d;return[clamp_css_byte(255*css_hue_to_rgb(c,d,i+1/3)),clamp_css_byte(255*css_hue_to_rgb(c,d,i)),clamp_css_byte(255*css_hue_to_rgb(c,d,i-1/3)),o];default:return null}}return null}var kCSSColorTable={transparent:[0,0,0,0],aliceblue:[240,248,255,1],antiquewhite:[250,235,215,1],aqua:[0,255,255,1],aquamarine:[127,255,212,1],azure:[240,255,255,1],beige:[245,245,220,1],bisque:[255,228,196,1],black:[0,0,0,1],blanchedalmond:[255,235,205,1],blue:[0,0,255,1],blueviolet:[138,43,226,1],brown:[165,42,42,1],burlywood:[222,184,135,1],cadetblue:[95,158,160,1],chartreuse:[127,255,0,1],chocolate:[210,105,30,1],coral:[255,127,80,1],cornflowerblue:[100,149,237,1],cornsilk:[255,248,220,1],crimson:[220,20,60,1],cyan:[0,255,255,1],darkblue:[0,0,139,1],darkcyan:[0,139,139,1],darkgoldenrod:[184,134,11,1],darkgray:[169,169,169,1],darkgreen:[0,100,0,1],darkgrey:[169,169,169,1],darkkhaki:[189,183,107,1],darkmagenta:[139,0,139,1],darkolivegreen:[85,107,47,1],darkorange:[255,140,0,1],darkorchid:[153,50,204,1],darkred:[139,0,0,1],darksalmon:[233,150,122,1],darkseagreen:[143,188,143,1],darkslateblue:[72,61,139,1],darkslategray:[47,79,79,1],darkslategrey:[47,79,79,1],darkturquoise:[0,206,209,1],darkviolet:[148,0,211,1],deeppink:[255,20,147,1],deepskyblue:[0,191,255,1],dimgray:[105,105,105,1],dimgrey:[105,105,105,1],dodgerblue:[30,144,255,1],firebrick:[178,34,34,1],floralwhite:[255,250,240,1],forestgreen:[34,139,34,1],fuchsia:[255,0,255,1],gainsboro:[220,220,220,1],ghostwhite:[248,248,255,1],gold:[255,215,0,1],goldenrod:[218,165,32,1],gray:[128,128,128,1],green:[0,128,0,1],greenyellow:[173,255,47,1],grey:[128,128,128,1],honeydew:[240,255,240,1],hotpink:[255,105,180,1],indianred:[205,92,92,1],indigo:[75,0,130,1],ivory:[255,255,240,1],khaki:[240,230,140,1],lavender:[230,230,250,1],lavenderblush:[255,240,245,1],lawngreen:[124,252,0,1],lemonchiffon:[255,250,205,1],lightblue:[173,216,230,1],lightcoral:[240,128,128,1],lightcyan:[224,255,255,1],lightgoldenrodyellow:[250,250,210,1],lightgray:[211,211,211,1],lightgreen:[144,238,144,1],lightgrey:[211,211,211,1],lightpink:[255,182,193,1],lightsalmon:[255,160,122,1],lightseagreen:[32,178,170,1],lightskyblue:[135,206,250,1],lightslategray:[119,136,153,1],lightslategrey:[119,136,153,1],lightsteelblue:[176,196,222,1],lightyellow:[255,255,224,1],lime:[0,255,0,1],limegreen:[50,205,50,1],linen:[250,240,230,1],magenta:[255,0,255,1],maroon:[128,0,0,1],mediumaquamarine:[102,205,170,1],mediumblue:[0,0,205,1],mediumorchid:[186,85,211,1],mediumpurple:[147,112,219,1],mediumseagreen:[60,179,113,1],mediumslateblue:[123,104,238,1],mediumspringgreen:[0,250,154,1],mediumturquoise:[72,209,204,1],mediumvioletred:[199,21,133,1],midnightblue:[25,25,112,1],mintcream:[245,255,250,1],mistyrose:[255,228,225,1],moccasin:[255,228,181,1],navajowhite:[255,222,173,1],navy:[0,0,128,1],oldlace:[253,245,230,1],olive:[128,128,0,1],olivedrab:[107,142,35,1],orange:[255,165,0,1],orangered:[255,69,0,1],orchid:[218,112,214,1],palegoldenrod:[238,232,170,1],palegreen:[152,251,152,1],paleturquoise:[175,238,238,1],palevioletred:[219,112,147,1],papayawhip:[255,239,213,1],peachpuff:[255,218,185,1],peru:[205,133,63,1],pink:[255,192,203,1],plum:[221,160,221,1],powderblue:[176,224,230,1],purple:[128,0,128,1],rebeccapurple:[102,51,153,1],red:[255,0,0,1],rosybrown:[188,143,143,1],royalblue:[65,105,225,1],saddlebrown:[139,69,19,1],salmon:[250,128,114,1],sandybrown:[244,164,96,1],seagreen:[46,139,87,1],seashell:[255,245,238,1],sienna:[160,82,45,1],silver:[192,192,192,1],skyblue:[135,206,235,1],slateblue:[106,90,205,1],slategray:[112,128,144,1],slategrey:[112,128,144,1],snow:[255,250,250,1],springgreen:[0,255,127,1],steelblue:[70,130,180,1],tan:[210,180,140,1],teal:[0,128,128,1],thistle:[216,191,216,1],tomato:[255,99,71,1],turquoise:[64,224,208,1],violet:[238,130,238,1],wheat:[245,222,179,1],white:[255,255,255,1],whitesmoke:[245,245,245,1],yellow:[255,255,0,1],yellowgreen:[154,205,50,1]};try{exports.parseCSSColor=parseCSSColor}catch(e){} +},{}],131:[function(require,module,exports){ +"use strict";function earcut(e,n,r){r=r||2;var t=n&&n.length,i=t?n[0]*r:e.length,x=linkedList(e,0,i,r,!0),a=[];if(!x)return a;var o,l,u,s,v,f,y;if(t&&(x=eliminateHoles(e,n,x,r)),e.length>80*r){o=u=e[0],l=s=e[1];for(var d=r;du&&(u=v),f>s&&(s=f);y=Math.max(u-o,s-l)}return earcutLinked(x,a,r,o,l,y),a}function linkedList(e,n,r,t,i){var x,a;if(i===signedArea(e,n,r,t)>0)for(x=n;x=n;x-=t)a=insertNode(x,e[x],e[x+1],a);return a&&equals(a,a.next)&&(removeNode(a),a=a.next),a}function filterPoints(e,n){if(!e)return e;n||(n=e);var r,t=e;do if(r=!1,t.steiner||!equals(t,t.next)&&0!==area(t.prev,t,t.next))t=t.next;else{if(removeNode(t),t=n=t.prev,t===t.next)return null;r=!0}while(r||t!==n);return n}function earcutLinked(e,n,r,t,i,x,a){if(e){!a&&x&&indexCurve(e,t,i,x);for(var o,l,u=e;e.prev!==e.next;)if(o=e.prev,l=e.next,x?isEarHashed(e,t,i,x):isEar(e))n.push(o.i/r),n.push(e.i/r),n.push(l.i/r),removeNode(e),e=l.next,u=l.next;else if(e=l,e===u){a?1===a?(e=cureLocalIntersections(e,n,r),earcutLinked(e,n,r,t,i,x,2)):2===a&&splitEarcut(e,n,r,t,i,x):earcutLinked(filterPoints(e),n,r,t,i,x,1);break}}}function isEar(e){var n=e.prev,r=e,t=e.next;if(area(n,r,t)>=0)return!1;for(var i=e.next.next;i!==e.prev;){if(pointInTriangle(n.x,n.y,r.x,r.y,t.x,t.y,i.x,i.y)&&area(i.prev,i,i.next)>=0)return!1;i=i.next}return!0}function isEarHashed(e,n,r,t){var i=e.prev,x=e,a=e.next;if(area(i,x,a)>=0)return!1;for(var o=i.xx.x?i.x>a.x?i.x:a.x:x.x>a.x?x.x:a.x,s=i.y>x.y?i.y>a.y?i.y:a.y:x.y>a.y?x.y:a.y,v=zOrder(o,l,n,r,t),f=zOrder(u,s,n,r,t),y=e.nextZ;y&&y.z<=f;){if(y!==e.prev&&y!==e.next&&pointInTriangle(i.x,i.y,x.x,x.y,a.x,a.y,y.x,y.y)&&area(y.prev,y,y.next)>=0)return!1;y=y.nextZ}for(y=e.prevZ;y&&y.z>=v;){if(y!==e.prev&&y!==e.next&&pointInTriangle(i.x,i.y,x.x,x.y,a.x,a.y,y.x,y.y)&&area(y.prev,y,y.next)>=0)return!1;y=y.prevZ}return!0}function cureLocalIntersections(e,n,r){var t=e;do{var i=t.prev,x=t.next.next;!equals(i,x)&&intersects(i,t,t.next,x)&&locallyInside(i,x)&&locallyInside(x,i)&&(n.push(i.i/r),n.push(t.i/r),n.push(x.i/r),removeNode(t),removeNode(t.next),t=e=x),t=t.next}while(t!==e);return t}function splitEarcut(e,n,r,t,i,x){var a=e;do{for(var o=a.next.next;o!==a.prev;){if(a.i!==o.i&&isValidDiagonal(a,o)){var l=splitPolygon(a,o);return a=filterPoints(a,a.next),l=filterPoints(l,l.next),earcutLinked(a,n,r,t,i,x),void earcutLinked(l,n,r,t,i,x)}o=o.next}a=a.next}while(a!==e)}function eliminateHoles(e,n,r,t){var i,x,a,o,l,u=[];for(i=0,x=n.length;i=t.next.y){var o=t.x+(x-t.y)*(t.next.x-t.x)/(t.next.y-t.y);if(o<=i&&o>a){if(a=o,o===i){if(x===t.y)return t;if(x===t.next.y)return t.next}r=t.x=t.x&&t.x>=s&&pointInTriangle(xr.x)&&locallyInside(t,e)&&(r=t,f=l)),t=t.next;return r}function indexCurve(e,n,r,t){var i=e;do null===i.z&&(i.z=zOrder(i.x,i.y,n,r,t)),i.prevZ=i.prev,i.nextZ=i.next,i=i.next;while(i!==e);i.prevZ.nextZ=null,i.prevZ=null,sortLinked(i)}function sortLinked(e){var n,r,t,i,x,a,o,l,u=1;do{for(r=e,e=null,x=null,a=0;r;){for(a++,t=r,o=0,n=0;n0||l>0&&t;)0===o?(i=t,t=t.nextZ,l--):0!==l&&t?r.z<=t.z?(i=r,r=r.nextZ,o--):(i=t,t=t.nextZ,l--):(i=r,r=r.nextZ,o--),x?x.nextZ=i:e=i,i.prevZ=x,x=i;r=t}x.nextZ=null,u*=2}while(a>1);return e}function zOrder(e,n,r,t,i){return e=32767*(e-r)/i,n=32767*(n-t)/i,e=16711935&(e|e<<8),e=252645135&(e|e<<4),e=858993459&(e|e<<2),e=1431655765&(e|e<<1),n=16711935&(n|n<<8),n=252645135&(n|n<<4),n=858993459&(n|n<<2),n=1431655765&(n|n<<1),e|n<<1}function getLeftmost(e){var n=e,r=e;do n.x=0&&(e-a)*(t-o)-(r-a)*(n-o)>=0&&(r-a)*(x-o)-(i-a)*(t-o)>=0}function isValidDiagonal(e,n){return e.next.i!==n.i&&e.prev.i!==n.i&&!intersectsPolygon(e,n)&&locallyInside(e,n)&&locallyInside(n,e)&&middleInside(e,n)}function area(e,n,r){return(n.y-e.y)*(r.x-n.x)-(n.x-e.x)*(r.y-n.y)}function equals(e,n){return e.x===n.x&&e.y===n.y}function intersects(e,n,r,t){return!!(equals(e,n)&&equals(r,t)||equals(e,t)&&equals(r,n))||area(e,n,r)>0!=area(e,n,t)>0&&area(r,t,e)>0!=area(r,t,n)>0}function intersectsPolygon(e,n){var r=e;do{if(r.i!==e.i&&r.next.i!==e.i&&r.i!==n.i&&r.next.i!==n.i&&intersects(r,r.next,e,n))return!0;r=r.next}while(r!==e);return!1}function locallyInside(e,n){return area(e.prev,e,e.next)<0?area(e,n,e.next)>=0&&area(e,e.prev,n)>=0:area(e,n,e.prev)<0||area(e,e.next,n)<0}function middleInside(e,n){var r=e,t=!1,i=(e.x+n.x)/2,x=(e.y+n.y)/2;do r.y>x!=r.next.y>x&&i<(r.next.x-r.x)*(x-r.y)/(r.next.y-r.y)+r.x&&(t=!t),r=r.next;while(r!==e);return t}function splitPolygon(e,n){var r=new Node(e.i,e.x,e.y),t=new Node(n.i,n.x,n.y),i=e.next,x=n.prev;return e.next=n,n.prev=e,r.next=i,i.prev=r,t.next=r,r.prev=t,x.next=t,t.prev=x,t}function insertNode(e,n,r,t){var i=new Node(e,n,r);return t?(i.next=t.next,i.prev=t,t.next.prev=i,t.next=i):(i.prev=i,i.next=i),i}function removeNode(e){e.next.prev=e.prev,e.prev.next=e.next,e.prevZ&&(e.prevZ.nextZ=e.nextZ),e.nextZ&&(e.nextZ.prevZ=e.prevZ)}function Node(e,n,r){this.i=e,this.x=n,this.y=r,this.prev=null,this.next=null,this.z=null,this.prevZ=null,this.nextZ=null,this.steiner=!1}function signedArea(e,n,r,t){for(var i=0,x=n,a=r-t;x0&&(t+=e[i-1].length,r.holes.push(t))}return r}; +},{}],132:[function(require,module,exports){ +function sss(r){var e,t,s,n,u,a;switch(typeof r){case"object":if(null===r)return null;if(isArray(r)){for(s="[",t=r.length-1,e=0;e-1&&(s+=sss(r[e])),s+"]"}for(n=objKeys(r).sort(),t=n.length,s="{",u=n[e=0],a=t>0&&void 0!==r[u];e15?"\\u00"+e.toString(16):"\\u000"+e.toString(16)}};module.exports=function(r){if(void 0!==r)return""+sss(r)},module.exports.stringSearch=strReg,module.exports.stringReplace=strReplace; +},{}],133:[function(require,module,exports){ +"use strict";function createFilter(e){return new Function("f","var p = (f && f.properties || {}); return "+compile(e))}function compile(e){if(!e)return"true";var i=e[0];if(e.length<=1)return"any"===i?"false":"true";var n="=="===i?compileComparisonOp(e[1],e[2],"===",!1):"!="===i?compileComparisonOp(e[1],e[2],"!==",!1):"<"===i||">"===i||"<="===i||">="===i?compileComparisonOp(e[1],e[2],i,!0):"any"===i?compileLogicalOp(e.slice(1),"||"):"all"===i?compileLogicalOp(e.slice(1),"&&"):"none"===i?compileNegation(compileLogicalOp(e.slice(1),"||")):"in"===i?compileInOp(e[1],e.slice(2)):"!in"===i?compileNegation(compileInOp(e[1],e.slice(2))):"has"===i?compileHasOp(e[1]):"!has"===i?compileNegation(compileHasOp([e[1]])):"true";return"("+n+")"}function compilePropertyReference(e){return"$type"===e?"f.type":"$id"===e?"f.id":"p["+JSON.stringify(e)+"]"}function compileComparisonOp(e,i,n,r){var o=compilePropertyReference(e),t="$type"===e?types.indexOf(i):JSON.stringify(i);return(r?"typeof "+o+"=== typeof "+t+"&&":"")+o+n+t}function compileLogicalOp(e,i){return e.map(compile).join(i)}function compileInOp(e,i){"$type"===e&&(i=i.map(function(e){return types.indexOf(e)}));var n=JSON.stringify(i.sort(compare)),r=compilePropertyReference(e);return i.length<=200?n+".indexOf("+r+") !== -1":"function(v, a, i, j) {while (i <= j) { var m = (i + j) >> 1; if (a[m] === v) return true; if (a[m] > v) j = m - 1; else i = m + 1;}return false; }("+r+", "+n+",0,"+(i.length-1)+")"}function compileHasOp(e){return JSON.stringify(e)+" in p"}function compileNegation(e){return"!("+e+")"}function compare(e,i){return ei?1:0}module.exports=createFilter;var types=["Unknown","Point","LineString","Polygon"]; +},{}],134:[function(require,module,exports){ +function geometry(r){if("Polygon"===r.type)return polygonArea(r.coordinates);if("MultiPolygon"===r.type){for(var e=0,n=0;n0){e+=Math.abs(ringArea(r[0]));for(var n=1;n2){for(var n,t,o=0;o=0}var geojsonArea=require("geojson-area");module.exports=rewind; +},{"geojson-area":134}],136:[function(require,module,exports){ +"use strict";function clip(e,r,t,n,u,i,l,s){if(t/=r,n/=r,l>=t&&s<=n)return e;if(l>n||s=t&&c<=n)h.push(o);else if(!(a>n||c=r&&s<=t&&u.push(l)}return u}function clipGeometry(e,r,t,n,u,i){for(var l=[],s=0;st?(d.push(u(h,f,r),u(h,f,t)),i||(d=newSlice(l,d,v,m,w))):o>=r&&d.push(u(h,f,r)):c>t?ot&&(d.push(u(h,f,t)),i||(d=newSlice(l,d,v,m,w))));h=g[S-1],c=h[n],c>=r&&c<=t&&d.push(h),a=d[d.length-1],i&&a&&(d[0][0]!==a[0]||d[0][1]!==a[1])&&d.push(d[0]),newSlice(l,d,v,m,w)}return l}function newSlice(e,r,t,n,u){return r.length&&(r.area=t,r.dist=n,void 0!==u&&(r.outer=u),e.push(r)),[]}module.exports=clip;var createFeature=require("./feature"); +},{"./feature":138}],137:[function(require,module,exports){ +"use strict";function convert(e,t){var r=[];if("FeatureCollection"===e.type)for(var o=0;o1?1:o,[r,o,0]}function calcSize(e){for(var t,r,o=0,a=0,i=0;i1)return!1;var r=n.geometry[0].length;if(5!==r)return!1;for(var s=0;s1&&console.time("creation"),m=this.tiles[d]=createTile(e,p,i,o,f,t===a.maxZoom),this.tileCoords.push({z:t,x:i,y:o}),u)){u>1&&(console.log("tile z%d-%d-%d (features: %d, points: %d, simplified: %d)",t,i,o,m.numFeatures,m.numPoints,m.numSimplified),console.timeEnd("creation"));var h="z"+t;this.stats[h]=(this.stats[h]||0)+1,this.total++}if(m.source=e,n){if(t===a.maxZoom||t===n)continue;var x=1<1&&console.time("clipping");var g,v,M,T,b,y,S=.5*a.buffer/a.extent,Z=.5-S,q=.5+S,w=1+S;g=v=M=T=null,b=clip(e,p,i-S,i+q,0,intersectX,m.min[0],m.max[0]),y=clip(e,p,i+Z,i+w,0,intersectX,m.min[0],m.max[0]),b&&(g=clip(b,p,o-S,o+q,1,intersectY,m.min[1],m.max[1]),v=clip(b,p,o+Z,o+w,1,intersectY,m.min[1],m.max[1])),y&&(M=clip(y,p,o-S,o+q,1,intersectY,m.min[1],m.max[1]),T=clip(y,p,o+Z,o+w,1,intersectY,m.min[1],m.max[1])),u>1&&console.timeEnd("clipping"),e.length&&(l.push(g||[],t+1,2*i,2*o),l.push(v||[],t+1,2*i,2*o+1),l.push(M||[],t+1,2*i+1,2*o),l.push(T||[],t+1,2*i+1,2*o+1))}else n&&(c=t)}return c},GeoJSONVT.prototype.getTile=function(e,t,i){var o=this.options,n=o.extent,r=o.debug,s=1<1&&console.log("drilling down to z%d-%d-%d",e,t,i);for(var a,u=e,c=t,p=i;!a&&u>0;)u--,c=Math.floor(c/2),p=Math.floor(p/2),a=this.tiles[toID(u,c,p)];if(!a||!a.source)return null;if(r>1&&console.log("found parent tile z%d-%d-%d",u,c,p),isClippedSquare(a,n,o.buffer))return transform.tile(a,n);r>1&&console.time("drilling down");var d=this.splitTile(a.source,u,c,p,e,t,i);if(r>1&&console.timeEnd("drilling down"),null!==d){var m=1<p&&(s=e,p=r);p>o?(t[s][2]=p,g.push(u),g.push(s),u=s):(n=g.pop(),u=g.pop())}}function getSqSegDist(t,i,e){var p=i[0],r=i[1],s=e[0],o=e[1],f=t[0],u=t[1],n=s-p,g=o-r;if(0!==n||0!==g){var l=((f-p)*n+(u-r)*g)/(n*n+g*g);l>1?(p=s,r=o):l>0&&(p+=n*l,r+=g*l)}return n=f-p,g=u-r,n*n+g*g}module.exports=simplify; +},{}],141:[function(require,module,exports){ +"use strict";function createTile(e,n,r,i,t,u){for(var a={features:[],numPoints:0,numSimplified:0,numFeatures:0,source:null,x:r,y:i,z2:n,transformed:!1,min:[2,1],max:[-1,0]},m=0;ma.max[0]&&(a.max[0]=l[0]),l[1]>a.max[1]&&(a.max[1]=l[1])}return a}function addFeature(e,n,r,i){var t,u,a,m,s=n.geometry,l=n.type,o=[],f=r*r;if(1===l)for(t=0;tf)&&(d.push(m),e.numSimplified++),e.numPoints++;3===l&&rewind(d,a.outer),o.push(d)}else e.numPoints+=a.length;if(o.length){var g={geometry:o,type:l,tags:n.tags||null};null!==n.id&&(g.id=n.id),e.features.push(g)}}function rewind(e,n){var r=signedArea(e);r<0===n&&e.reverse()}function signedArea(e){for(var n,r,i=0,t=0,u=e.length,a=u-1;t0?(o=2*Math.sqrt(l+1),a[3]=.25*o,a[0]=(t[6]-t[9])/o,a[1]=(t[8]-t[2])/o,a[2]=(t[1]-t[4])/o):t[0]>t[5]&t[0]>t[10]?(o=2*Math.sqrt(1+t[0]-t[5]-t[10]),a[3]=(t[6]-t[9])/o,a[0]=.25*o,a[1]=(t[1]+t[4])/o,a[2]=(t[8]+t[2])/o):t[5]>t[10]?(o=2*Math.sqrt(1+t[5]-t[0]-t[10]),a[3]=(t[8]-t[2])/o,a[0]=(t[1]+t[4])/o,a[1]=.25*o,a[2]=(t[6]+t[9])/o):(o=2*Math.sqrt(1+t[10]-t[0]-t[5]),a[3]=(t[1]-t[4])/o,a[0]=(t[8]+t[2])/o,a[1]=(t[6]+t[9])/o,a[2]=.25*o),a},mat4.fromRotationTranslationScale=function(a,t,l,o){var M=t[0],S=t[1],x=t[2],I=t[3],D=M+M,F=S+S,r=x+x,s=M*D,u=M*F,e=M*r,m=S*F,n=S*r,i=x*r,h=I*D,d=I*F,z=I*r,f=o[0],c=o[1],b=o[2];return a[0]=(1-(m+i))*f,a[1]=(u+z)*f,a[2]=(e-d)*f,a[3]=0,a[4]=(u-z)*c,a[5]=(1-(s+i))*c,a[6]=(n+h)*c,a[7]=0,a[8]=(e+d)*b,a[9]=(n-h)*b,a[10]=(1-(s+m))*b,a[11]=0,a[12]=l[0],a[13]=l[1],a[14]=l[2],a[15]=1,a},mat4.fromRotationTranslationScaleOrigin=function(a,t,l,o,M){var S=t[0],x=t[1],I=t[2],D=t[3],F=S+S,r=x+x,s=I+I,u=S*F,e=S*r,m=S*s,n=x*r,i=x*s,h=I*s,d=D*F,z=D*r,f=D*s,c=o[0],b=o[1],w=o[2],v=M[0],p=M[1],g=M[2];return a[0]=(1-(n+h))*c,a[1]=(e+f)*c,a[2]=(m-z)*c,a[3]=0,a[4]=(e-f)*b,a[5]=(1-(u+h))*b,a[6]=(i+d)*b,a[7]=0,a[8]=(m+z)*w,a[9]=(i-d)*w,a[10]=(1-(u+n))*w,a[11]=0,a[12]=l[0]+v-(a[0]*v+a[4]*p+a[8]*g),a[13]=l[1]+p-(a[1]*v+a[5]*p+a[9]*g),a[14]=l[2]+g-(a[2]*v+a[6]*p+a[10]*g),a[15]=1,a},mat4.fromQuat=function(a,t){var l=t[0],o=t[1],M=t[2],S=t[3],x=l+l,I=o+o,D=M+M,F=l*x,r=o*x,s=o*I,u=M*x,e=M*I,m=M*D,n=S*x,i=S*I,h=S*D;return a[0]=1-s-m,a[1]=r+h,a[2]=u-i,a[3]=0,a[4]=r-h,a[5]=1-F-m,a[6]=e+n,a[7]=0,a[8]=u+i,a[9]=e-n,a[10]=1-F-s,a[11]=0,a[12]=0,a[13]=0,a[14]=0,a[15]=1,a},mat4.frustum=function(a,t,l,o,M,S,x){var I=1/(l-t),D=1/(M-o),F=1/(S-x);return a[0]=2*S*I,a[1]=0,a[2]=0,a[3]=0,a[4]=0,a[5]=2*S*D,a[6]=0,a[7]=0,a[8]=(l+t)*I,a[9]=(M+o)*D,a[10]=(x+S)*F,a[11]=-1,a[12]=0,a[13]=0,a[14]=x*S*2*F,a[15]=0,a},mat4.perspective=function(a,t,l,o,M){var S=1/Math.tan(t/2),x=1/(o-M);return a[0]=S/l,a[1]=0,a[2]=0,a[3]=0,a[4]=0,a[5]=S,a[6]=0,a[7]=0,a[8]=0,a[9]=0,a[10]=(M+o)*x,a[11]=-1,a[12]=0,a[13]=0,a[14]=2*M*o*x,a[15]=0,a},mat4.perspectiveFromFieldOfView=function(a,t,l,o){var M=Math.tan(t.upDegrees*Math.PI/180),S=Math.tan(t.downDegrees*Math.PI/180),x=Math.tan(t.leftDegrees*Math.PI/180),I=Math.tan(t.rightDegrees*Math.PI/180),D=2/(x+I),F=2/(M+S);return a[0]=D,a[1]=0,a[2]=0,a[3]=0,a[4]=0,a[5]=F,a[6]=0,a[7]=0,a[8]=-((x-I)*D*.5),a[9]=(M-S)*F*.5,a[10]=o/(l-o),a[11]=-1,a[12]=0,a[13]=0,a[14]=o*l/(l-o),a[15]=0,a},mat4.ortho=function(a,t,l,o,M,S,x){var I=1/(t-l),D=1/(o-M),F=1/(S-x);return a[0]=-2*I,a[1]=0,a[2]=0,a[3]=0,a[4]=0,a[5]=-2*D,a[6]=0,a[7]=0,a[8]=0,a[9]=0,a[10]=2*F,a[11]=0,a[12]=(t+l)*I,a[13]=(M+o)*D,a[14]=(x+S)*F,a[15]=1,a},mat4.lookAt=function(a,t,l,o){var M,S,x,I,D,F,r,s,u,e,m=t[0],n=t[1],i=t[2],h=o[0],d=o[1],z=o[2],f=l[0],c=l[1],b=l[2];return Math.abs(m-f).999999?(u[0]=0,u[1]=0,u[2]=0,u[3]=1,u):(vec3.cross(t,r,n),u[0]=t[0],u[1]=t[1],u[2]=t[2],u[3]=1+c,quat.normalize(u,u))}}(),quat.setAxes=function(){var t=mat3.create();return function(a,e,u,r){return t[0]=u[0],t[3]=u[1],t[6]=u[2],t[1]=r[0],t[4]=r[1],t[7]=r[2],t[2]=-e[0],t[5]=-e[1],t[8]=-e[2],quat.normalize(a,quat.fromMat3(a,t))}}(),quat.clone=vec4.clone,quat.fromValues=vec4.fromValues,quat.copy=vec4.copy,quat.set=vec4.set,quat.identity=function(t){return t[0]=0,t[1]=0,t[2]=0,t[3]=1,t},quat.setAxisAngle=function(t,a,e){e*=.5;var u=Math.sin(e);return t[0]=u*a[0],t[1]=u*a[1],t[2]=u*a[2],t[3]=Math.cos(e),t},quat.getAxisAngle=function(t,a){var e=2*Math.acos(a[3]),u=Math.sin(e/2);return 0!=u?(t[0]=a[0]/u,t[1]=a[1]/u,t[2]=a[2]/u):(t[0]=1,t[1]=0,t[2]=0),e},quat.add=vec4.add,quat.multiply=function(t,a,e){var u=a[0],r=a[1],n=a[2],c=a[3],q=e[0],s=e[1],o=e[2],i=e[3];return t[0]=u*i+c*q+r*o-n*s,t[1]=r*i+c*s+n*q-u*o,t[2]=n*i+c*o+u*s-r*q,t[3]=c*i-u*q-r*s-n*o,t},quat.mul=quat.multiply,quat.scale=vec4.scale,quat.rotateX=function(t,a,e){e*=.5;var u=a[0],r=a[1],n=a[2],c=a[3],q=Math.sin(e),s=Math.cos(e);return t[0]=u*s+c*q,t[1]=r*s+n*q,t[2]=n*s-r*q,t[3]=c*s-u*q,t},quat.rotateY=function(t,a,e){e*=.5;var u=a[0],r=a[1],n=a[2],c=a[3],q=Math.sin(e),s=Math.cos(e);return t[0]=u*s-n*q,t[1]=r*s+c*q,t[2]=n*s+u*q,t[3]=c*s-r*q,t},quat.rotateZ=function(t,a,e){e*=.5;var u=a[0],r=a[1],n=a[2],c=a[3],q=Math.sin(e),s=Math.cos(e);return t[0]=u*s+r*q,t[1]=r*s-u*q,t[2]=n*s+c*q,t[3]=c*s-n*q,t},quat.calculateW=function(t,a){var e=a[0],u=a[1],r=a[2];return t[0]=e,t[1]=u,t[2]=r,t[3]=Math.sqrt(Math.abs(1-e*e-u*u-r*r)),t},quat.dot=vec4.dot,quat.lerp=vec4.lerp,quat.slerp=function(t,a,e,u){var r,n,c,q,s,o=a[0],i=a[1],v=a[2],l=a[3],f=e[0],h=e[1],M=e[2],m=e[3];return n=o*f+i*h+v*M+l*m,n<0&&(n=-n,f=-f,h=-h,M=-M,m=-m),1-n>1e-6?(r=Math.acos(n),c=Math.sin(r),q=Math.sin((1-u)*r)/c,s=Math.sin(u*r)/c):(q=1-u,s=u),t[0]=q*o+s*f,t[1]=q*i+s*h,t[2]=q*v+s*M,t[3]=q*l+s*m,t},quat.sqlerp=function(){var t=quat.create(),a=quat.create();return function(e,u,r,n,c,q){return quat.slerp(t,u,c,q),quat.slerp(a,r,n,q),quat.slerp(e,t,a,2*q*(1-q)),e}}(),quat.invert=function(t,a){var e=a[0],u=a[1],r=a[2],n=a[3],c=e*e+u*u+r*r+n*n,q=c?1/c:0;return t[0]=-e*q,t[1]=-u*q,t[2]=-r*q,t[3]=n*q,t},quat.conjugate=function(t,a){return t[0]=-a[0],t[1]=-a[1],t[2]=-a[2],t[3]=a[3],t},quat.length=vec4.length,quat.len=quat.length,quat.squaredLength=vec4.squaredLength,quat.sqrLen=quat.squaredLength,quat.normalize=vec4.normalize,quat.fromMat3=function(t,a){var e,u=a[0]+a[4]+a[8];if(u>0)e=Math.sqrt(u+1),t[3]=.5*e,e=.5/e,t[0]=(a[5]-a[7])*e,t[1]=(a[6]-a[2])*e,t[2]=(a[1]-a[3])*e;else{var r=0;a[4]>a[0]&&(r=1),a[8]>a[3*r+r]&&(r=2);var n=(r+1)%3,c=(r+2)%3;e=Math.sqrt(a[3*r+r]-a[3*n+n]-a[3*c+c]+1),t[r]=.5*e,e=.5/e,t[3]=(a[3*n+c]-a[3*c+n])*e,t[n]=(a[3*n+r]+a[3*r+n])*e,t[c]=(a[3*c+r]+a[3*r+c])*e}return t},quat.str=function(t){return"quat("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+")"},quat.exactEquals=vec4.exactEquals,quat.equals=vec4.equals,module.exports=quat; +},{"./common.js":145,"./mat3.js":148,"./vec3.js":152,"./vec4.js":153}],151:[function(require,module,exports){ +var glMatrix=require("./common.js"),vec2={};vec2.create=function(){var n=new glMatrix.ARRAY_TYPE(2);return n[0]=0,n[1]=0,n},vec2.clone=function(n){var t=new glMatrix.ARRAY_TYPE(2);return t[0]=n[0],t[1]=n[1],t},vec2.fromValues=function(n,t){var r=new glMatrix.ARRAY_TYPE(2);return r[0]=n,r[1]=t,r},vec2.copy=function(n,t){return n[0]=t[0],n[1]=t[1],n},vec2.set=function(n,t,r){return n[0]=t,n[1]=r,n},vec2.add=function(n,t,r){return n[0]=t[0]+r[0],n[1]=t[1]+r[1],n},vec2.subtract=function(n,t,r){return n[0]=t[0]-r[0],n[1]=t[1]-r[1],n},vec2.sub=vec2.subtract,vec2.multiply=function(n,t,r){return n[0]=t[0]*r[0],n[1]=t[1]*r[1],n},vec2.mul=vec2.multiply,vec2.divide=function(n,t,r){return n[0]=t[0]/r[0],n[1]=t[1]/r[1],n},vec2.div=vec2.divide,vec2.ceil=function(n,t){return n[0]=Math.ceil(t[0]),n[1]=Math.ceil(t[1]),n},vec2.floor=function(n,t){return n[0]=Math.floor(t[0]),n[1]=Math.floor(t[1]),n},vec2.min=function(n,t,r){return n[0]=Math.min(t[0],r[0]),n[1]=Math.min(t[1],r[1]),n},vec2.max=function(n,t,r){return n[0]=Math.max(t[0],r[0]),n[1]=Math.max(t[1],r[1]),n},vec2.round=function(n,t){return n[0]=Math.round(t[0]),n[1]=Math.round(t[1]),n},vec2.scale=function(n,t,r){return n[0]=t[0]*r,n[1]=t[1]*r,n},vec2.scaleAndAdd=function(n,t,r,e){return n[0]=t[0]+r[0]*e,n[1]=t[1]+r[1]*e,n},vec2.distance=function(n,t){var r=t[0]-n[0],e=t[1]-n[1];return Math.sqrt(r*r+e*e)},vec2.dist=vec2.distance,vec2.squaredDistance=function(n,t){var r=t[0]-n[0],e=t[1]-n[1];return r*r+e*e},vec2.sqrDist=vec2.squaredDistance,vec2.length=function(n){var t=n[0],r=n[1];return Math.sqrt(t*t+r*r)},vec2.len=vec2.length,vec2.squaredLength=function(n){var t=n[0],r=n[1];return t*t+r*r},vec2.sqrLen=vec2.squaredLength,vec2.negate=function(n,t){return n[0]=-t[0],n[1]=-t[1],n},vec2.inverse=function(n,t){return n[0]=1/t[0],n[1]=1/t[1],n},vec2.normalize=function(n,t){var r=t[0],e=t[1],c=r*r+e*e;return c>0&&(c=1/Math.sqrt(c),n[0]=t[0]*c,n[1]=t[1]*c),n},vec2.dot=function(n,t){return n[0]*t[0]+n[1]*t[1]},vec2.cross=function(n,t,r){var e=t[0]*r[1]-t[1]*r[0];return n[0]=n[1]=0,n[2]=e,n},vec2.lerp=function(n,t,r,e){var c=t[0],a=t[1];return n[0]=c+e*(r[0]-c),n[1]=a+e*(r[1]-a),n},vec2.random=function(n,t){t=t||1;var r=2*glMatrix.RANDOM()*Math.PI;return n[0]=Math.cos(r)*t,n[1]=Math.sin(r)*t,n},vec2.transformMat2=function(n,t,r){var e=t[0],c=t[1];return n[0]=r[0]*e+r[2]*c,n[1]=r[1]*e+r[3]*c,n},vec2.transformMat2d=function(n,t,r){var e=t[0],c=t[1];return n[0]=r[0]*e+r[2]*c+r[4],n[1]=r[1]*e+r[3]*c+r[5],n},vec2.transformMat3=function(n,t,r){var e=t[0],c=t[1];return n[0]=r[0]*e+r[3]*c+r[6],n[1]=r[1]*e+r[4]*c+r[7],n},vec2.transformMat4=function(n,t,r){var e=t[0],c=t[1];return n[0]=r[0]*e+r[4]*c+r[12],n[1]=r[1]*e+r[5]*c+r[13],n},vec2.forEach=function(){var n=vec2.create();return function(t,r,e,c,a,u){var v,i;for(r||(r=2),e||(e=0),i=c?Math.min(c*r+e,t.length):t.length,v=e;v0&&(c=1/Math.sqrt(c),t[0]=n[0]*c,t[1]=n[1]*c,t[2]=n[2]*c),t},vec3.dot=function(t,n){return t[0]*n[0]+t[1]*n[1]+t[2]*n[2]},vec3.cross=function(t,n,r){var e=n[0],a=n[1],c=n[2],u=r[0],v=r[1],i=r[2];return t[0]=a*i-c*v,t[1]=c*u-e*i,t[2]=e*v-a*u,t},vec3.lerp=function(t,n,r,e){var a=n[0],c=n[1],u=n[2];return t[0]=a+e*(r[0]-a),t[1]=c+e*(r[1]-c),t[2]=u+e*(r[2]-u),t},vec3.hermite=function(t,n,r,e,a,c){var u=c*c,v=u*(2*c-3)+1,i=u*(c-2)+c,o=u*(c-1),M=u*(3-2*c);return t[0]=n[0]*v+r[0]*i+e[0]*o+a[0]*M,t[1]=n[1]*v+r[1]*i+e[1]*o+a[1]*M,t[2]=n[2]*v+r[2]*i+e[2]*o+a[2]*M,t},vec3.bezier=function(t,n,r,e,a,c){var u=1-c,v=u*u,i=c*c,o=v*u,M=3*c*v,s=3*i*u,h=i*c;return t[0]=n[0]*o+r[0]*M+e[0]*s+a[0]*h,t[1]=n[1]*o+r[1]*M+e[1]*s+a[1]*h,t[2]=n[2]*o+r[2]*M+e[2]*s+a[2]*h,t},vec3.random=function(t,n){n=n||1;var r=2*glMatrix.RANDOM()*Math.PI,e=2*glMatrix.RANDOM()-1,a=Math.sqrt(1-e*e)*n;return t[0]=Math.cos(r)*a,t[1]=Math.sin(r)*a,t[2]=e*n,t},vec3.transformMat4=function(t,n,r){var e=n[0],a=n[1],c=n[2],u=r[3]*e+r[7]*a+r[11]*c+r[15];return u=u||1,t[0]=(r[0]*e+r[4]*a+r[8]*c+r[12])/u,t[1]=(r[1]*e+r[5]*a+r[9]*c+r[13])/u,t[2]=(r[2]*e+r[6]*a+r[10]*c+r[14])/u,t},vec3.transformMat3=function(t,n,r){var e=n[0],a=n[1],c=n[2];return t[0]=e*r[0]+a*r[3]+c*r[6],t[1]=e*r[1]+a*r[4]+c*r[7],t[2]=e*r[2]+a*r[5]+c*r[8],t},vec3.transformQuat=function(t,n,r){var e=n[0],a=n[1],c=n[2],u=r[0],v=r[1],i=r[2],o=r[3],M=o*e+v*c-i*a,s=o*a+i*e-u*c,h=o*c+u*a-v*e,f=-u*e-v*a-i*c;return t[0]=M*o+f*-u+s*-i-h*-v,t[1]=s*o+f*-v+h*-u-M*-i,t[2]=h*o+f*-i+M*-v-s*-u,t},vec3.rotateX=function(t,n,r,e){var a=[],c=[];return a[0]=n[0]-r[0],a[1]=n[1]-r[1],a[2]=n[2]-r[2],c[0]=a[0],c[1]=a[1]*Math.cos(e)-a[2]*Math.sin(e),c[2]=a[1]*Math.sin(e)+a[2]*Math.cos(e),t[0]=c[0]+r[0],t[1]=c[1]+r[1],t[2]=c[2]+r[2],t},vec3.rotateY=function(t,n,r,e){var a=[],c=[];return a[0]=n[0]-r[0],a[1]=n[1]-r[1],a[2]=n[2]-r[2],c[0]=a[2]*Math.sin(e)+a[0]*Math.cos(e),c[1]=a[1],c[2]=a[2]*Math.cos(e)-a[0]*Math.sin(e),t[0]=c[0]+r[0],t[1]=c[1]+r[1],t[2]=c[2]+r[2],t},vec3.rotateZ=function(t,n,r,e){var a=[],c=[];return a[0]=n[0]-r[0],a[1]=n[1]-r[1],a[2]=n[2]-r[2],c[0]=a[0]*Math.cos(e)-a[1]*Math.sin(e),c[1]=a[0]*Math.sin(e)+a[1]*Math.cos(e),c[2]=a[2],t[0]=c[0]+r[0],t[1]=c[1]+r[1],t[2]=c[2]+r[2],t},vec3.forEach=function(){var t=vec3.create();return function(n,r,e,a,c,u){var v,i;for(r||(r=3),e||(e=0),i=a?Math.min(a*r+e,n.length):n.length,v=e;v1?0:Math.acos(a)},vec3.str=function(t){return"vec3("+t[0]+", "+t[1]+", "+t[2]+")"},vec3.exactEquals=function(t,n){return t[0]===n[0]&&t[1]===n[1]&&t[2]===n[2]},vec3.equals=function(t,n){var r=t[0],e=t[1],a=t[2],c=n[0],u=n[1],v=n[2];return Math.abs(r-c)<=glMatrix.EPSILON*Math.max(1,Math.abs(r),Math.abs(c))&&Math.abs(e-u)<=glMatrix.EPSILON*Math.max(1,Math.abs(e),Math.abs(u))&&Math.abs(a-v)<=glMatrix.EPSILON*Math.max(1,Math.abs(a),Math.abs(v))},module.exports=vec3; +},{"./common.js":145}],153:[function(require,module,exports){ +var glMatrix=require("./common.js"),vec4={};vec4.create=function(){var t=new glMatrix.ARRAY_TYPE(4);return t[0]=0,t[1]=0,t[2]=0,t[3]=0,t},vec4.clone=function(t){var n=new glMatrix.ARRAY_TYPE(4);return n[0]=t[0],n[1]=t[1],n[2]=t[2],n[3]=t[3],n},vec4.fromValues=function(t,n,e,r){var a=new glMatrix.ARRAY_TYPE(4);return a[0]=t,a[1]=n,a[2]=e,a[3]=r,a},vec4.copy=function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t},vec4.set=function(t,n,e,r,a){return t[0]=n,t[1]=e,t[2]=r,t[3]=a,t},vec4.add=function(t,n,e){return t[0]=n[0]+e[0],t[1]=n[1]+e[1],t[2]=n[2]+e[2],t[3]=n[3]+e[3],t},vec4.subtract=function(t,n,e){return t[0]=n[0]-e[0],t[1]=n[1]-e[1],t[2]=n[2]-e[2],t[3]=n[3]-e[3],t},vec4.sub=vec4.subtract,vec4.multiply=function(t,n,e){return t[0]=n[0]*e[0],t[1]=n[1]*e[1],t[2]=n[2]*e[2],t[3]=n[3]*e[3],t},vec4.mul=vec4.multiply,vec4.divide=function(t,n,e){return t[0]=n[0]/e[0],t[1]=n[1]/e[1],t[2]=n[2]/e[2],t[3]=n[3]/e[3],t},vec4.div=vec4.divide,vec4.ceil=function(t,n){return t[0]=Math.ceil(n[0]),t[1]=Math.ceil(n[1]),t[2]=Math.ceil(n[2]),t[3]=Math.ceil(n[3]),t},vec4.floor=function(t,n){return t[0]=Math.floor(n[0]),t[1]=Math.floor(n[1]),t[2]=Math.floor(n[2]),t[3]=Math.floor(n[3]),t},vec4.min=function(t,n,e){return t[0]=Math.min(n[0],e[0]),t[1]=Math.min(n[1],e[1]),t[2]=Math.min(n[2],e[2]),t[3]=Math.min(n[3],e[3]),t},vec4.max=function(t,n,e){return t[0]=Math.max(n[0],e[0]),t[1]=Math.max(n[1],e[1]),t[2]=Math.max(n[2],e[2]),t[3]=Math.max(n[3],e[3]),t},vec4.round=function(t,n){return t[0]=Math.round(n[0]),t[1]=Math.round(n[1]),t[2]=Math.round(n[2]),t[3]=Math.round(n[3]),t},vec4.scale=function(t,n,e){return t[0]=n[0]*e,t[1]=n[1]*e,t[2]=n[2]*e,t[3]=n[3]*e,t},vec4.scaleAndAdd=function(t,n,e,r){return t[0]=n[0]+e[0]*r,t[1]=n[1]+e[1]*r,t[2]=n[2]+e[2]*r,t[3]=n[3]+e[3]*r,t},vec4.distance=function(t,n){var e=n[0]-t[0],r=n[1]-t[1],a=n[2]-t[2],c=n[3]-t[3];return Math.sqrt(e*e+r*r+a*a+c*c)},vec4.dist=vec4.distance,vec4.squaredDistance=function(t,n){var e=n[0]-t[0],r=n[1]-t[1],a=n[2]-t[2],c=n[3]-t[3];return e*e+r*r+a*a+c*c},vec4.sqrDist=vec4.squaredDistance,vec4.length=function(t){var n=t[0],e=t[1],r=t[2],a=t[3];return Math.sqrt(n*n+e*e+r*r+a*a)},vec4.len=vec4.length,vec4.squaredLength=function(t){var n=t[0],e=t[1],r=t[2],a=t[3];return n*n+e*e+r*r+a*a},vec4.sqrLen=vec4.squaredLength,vec4.negate=function(t,n){return t[0]=-n[0],t[1]=-n[1],t[2]=-n[2],t[3]=-n[3],t},vec4.inverse=function(t,n){return t[0]=1/n[0],t[1]=1/n[1],t[2]=1/n[2],t[3]=1/n[3],t},vec4.normalize=function(t,n){var e=n[0],r=n[1],a=n[2],c=n[3],u=e*e+r*r+a*a+c*c;return u>0&&(u=1/Math.sqrt(u),t[0]=e*u,t[1]=r*u,t[2]=a*u,t[3]=c*u),t},vec4.dot=function(t,n){return t[0]*n[0]+t[1]*n[1]+t[2]*n[2]+t[3]*n[3]},vec4.lerp=function(t,n,e,r){var a=n[0],c=n[1],u=n[2],i=n[3];return t[0]=a+r*(e[0]-a),t[1]=c+r*(e[1]-c),t[2]=u+r*(e[2]-u),t[3]=i+r*(e[3]-i),t},vec4.random=function(t,n){return n=n||1,t[0]=glMatrix.RANDOM(),t[1]=glMatrix.RANDOM(),t[2]=glMatrix.RANDOM(),t[3]=glMatrix.RANDOM(),vec4.normalize(t,t),vec4.scale(t,t,n),t},vec4.transformMat4=function(t,n,e){var r=n[0],a=n[1],c=n[2],u=n[3];return t[0]=e[0]*r+e[4]*a+e[8]*c+e[12]*u,t[1]=e[1]*r+e[5]*a+e[9]*c+e[13]*u,t[2]=e[2]*r+e[6]*a+e[10]*c+e[14]*u,t[3]=e[3]*r+e[7]*a+e[11]*c+e[15]*u,t},vec4.transformQuat=function(t,n,e){var r=n[0],a=n[1],c=n[2],u=e[0],i=e[1],v=e[2],o=e[3],M=o*r+i*c-v*a,h=o*a+v*r-u*c,f=o*c+u*a-i*r,l=-u*r-i*a-v*c;return t[0]=M*o+l*-u+h*-v-f*-i,t[1]=h*o+l*-i+f*-u-M*-v,t[2]=f*o+l*-v+M*-i-h*-u,t[3]=n[3],t},vec4.forEach=function(){var t=vec4.create();return function(n,e,r,a,c,u){var i,v;for(e||(e=4),r||(r=0),v=a?Math.min(a*e+r,n.length):n.length,i=r;i=a[u+0]&&s>=a[u+1]?(n[f]=!0,h.push(l[f])):n[f]=!1}}},GridIndex.prototype._forEachCell=function(t,r,e,s,i,h,n){for(var o=this._convertToCellCoord(t),l=this._convertToCellCoord(r),a=this._convertToCellCoord(e),d=this._convertToCellCoord(s),f=o;f<=a;f++)for(var u=l;u<=d;u++){var y=this.d*u+f;if(i.call(this,t,r,e,s,y,h,n))return}},GridIndex.prototype._convertToCellCoord=function(t){return Math.max(0,Math.min(this.d-1,Math.floor(t*this.scale)+this.padding))},GridIndex.prototype.toArrayBuffer=function(){if(this.arrayBuffer)return this.arrayBuffer;for(var t=this.cells,r=NUM_PARAMS+this.cells.length+1+1,e=0,s=0;s>1,i=-7,N=t?h-1:0,n=t?-1:1,s=a[o+N];for(N+=n,M=s&(1<<-i)-1,s>>=-i,i+=w;i>0;M=256*M+a[o+N],N+=n,i-=8);for(p=M&(1<<-i)-1,M>>=-i,i+=r;i>0;p=256*p+a[o+N],N+=n,i-=8);if(0===M)M=1-e;else{if(M===f)return p?NaN:(s?-1:1)*(1/0);p+=Math.pow(2,r),M-=e}return(s?-1:1)*p*Math.pow(2,M-r)},exports.write=function(a,o,t,r,h,M){var p,w,f,e=8*M-h-1,i=(1<>1,n=23===h?Math.pow(2,-24)-Math.pow(2,-77):0,s=r?0:M-1,u=r?1:-1,l=o<0||0===o&&1/o<0?1:0;for(o=Math.abs(o),isNaN(o)||o===1/0?(w=isNaN(o)?1:0,p=i):(p=Math.floor(Math.log(o)/Math.LN2),o*(f=Math.pow(2,-p))<1&&(p--,f*=2),o+=p+N>=1?n/f:n*Math.pow(2,1-N),o*f>=2&&(p++,f/=2),p+N>=i?(w=0,p=i):p+N>=1?(w=(o*f-1)*Math.pow(2,h),p+=N):(w=o*Math.pow(2,N-1)*Math.pow(2,h),p=0));h>=8;a[t+s]=255&w,s+=u,w/=256,h-=8);for(p=p<0;a[t+s]=255&p,s+=u,p/=256,e-=8);a[t+s-u]|=128*l}; +},{}],156:[function(require,module,exports){ +"use strict";function kdbush(t,i,e,s,n){return new KDBush(t,i,e,s,n)}function KDBush(t,i,e,s,n){i=i||defaultGetX,e=e||defaultGetY,n=n||Array,this.nodeSize=s||64,this.points=t,this.ids=new n(t.length),this.coords=new n(2*t.length);for(var r=0;r=s&&a<=h&&t>=u&&t<=e&&f.push(p[i]);else{var c=Math.floor((g+v)/2);a=r[2*c],t=r[2*c+1],a>=s&&a<=h&&t>=u&&t<=e&&f.push(p[c]);var d=(l+1)%2;(0===l?s<=a:u<=t)&&(n.push(g),n.push(c-1),n.push(d)),(0===l?h>=a:e>=t)&&(n.push(c+1),n.push(v),n.push(d))}}return f}module.exports=range; +},{}],158:[function(require,module,exports){ +"use strict";function sortKD(t,a,o,s,r,e){if(!(r-s<=o)){var f=Math.floor((s+r)/2);select(t,a,f,s,r,e%2),sortKD(t,a,o,s,f-1,e+1),sortKD(t,a,o,f+1,r,e+1)}}function select(t,a,o,s,r,e){for(;r>s;){if(r-s>600){var f=r-s+1,p=o-s+1,w=Math.log(f),m=.5*Math.exp(2*w/3),n=.5*Math.sqrt(w*m*(f-m)/f)*(p-f/2<0?-1:1),c=Math.max(s,Math.floor(o-p*m/f+n)),h=Math.min(r,Math.floor(o+(f-p)*m/f+n));select(t,a,o,c,h,e)}var i=a[2*o+e],l=s,M=r;for(swapItem(t,a,s,o),a[2*r+e]>i&&swapItem(t,a,s,r);li;)M--}a[2*s+e]===i?swapItem(t,a,s,M):(M++,swapItem(t,a,M,r)),M<=o&&(s=M+1),o<=M&&(r=M-1)}}function swapItem(t,a,o,s){swap(t,o,s),swap(a,2*o,2*s),swap(a,2*o+1,2*s+1)}function swap(t,a,o){var s=t[a];t[a]=t[o],t[o]=s}module.exports=sortKD; +},{}],159:[function(require,module,exports){ +"use strict";function within(s,p,r,t,u,h){for(var i=[0,s.length-1,0],o=[],n=u*u;i.length;){var e=i.pop(),a=i.pop(),f=i.pop();if(a-f<=h)for(var v=f;v<=a;v++)sqDist(p[2*v],p[2*v+1],r,t)<=n&&o.push(s[v]);else{var l=Math.floor((f+a)/2),c=p[2*l],q=p[2*l+1];sqDist(c,q,r,t)<=n&&o.push(s[l]);var D=(e+1)%2;(0===e?r-u<=c:t-u<=q)&&(i.push(f),i.push(l-1),i.push(D)),(0===e?r+u>=c:t+u>=q)&&(i.push(l+1),i.push(a),i.push(D))}}return o}function sqDist(s,p,r,t){var u=s-r,h=p-t;return u*u+h*h}module.exports=within; +},{}],160:[function(require,module,exports){ +function xyz2lab(r){return r>t3?Math.pow(r,1/3):r/t2+t0}function lab2xyz(r){return r>t1?r*r*r:t2*(r-t0)}function xyz2rgb(r){return 255*(r<=.0031308?12.92*r:1.055*Math.pow(r,1/2.4)-.055)}function rgb2xyz(r){return(r/=255)<=.04045?r/12.92:Math.pow((r+.055)/1.055,2.4)}function rgbToLab(r){var t=rgb2xyz(r[0]),a=rgb2xyz(r[1]),n=rgb2xyz(r[2]),b=xyz2lab((.4124564*t+.3575761*a+.1804375*n)/Xn),o=xyz2lab((.2126729*t+.7151522*a+.072175*n)/Yn),g=xyz2lab((.0193339*t+.119192*a+.9503041*n)/Zn);return[116*o-16,500*(b-o),200*(o-g),r[3]]}function labToRgb(r){var t=(r[0]+16)/116,a=isNaN(r[1])?t:t+r[1]/500,n=isNaN(r[2])?t:t-r[2]/200;return t=Yn*lab2xyz(t),a=Xn*lab2xyz(a),n=Zn*lab2xyz(n),[xyz2rgb(3.2404542*a-1.5371385*t-.4985314*n),xyz2rgb(-.969266*a+1.8760108*t+.041556*n),xyz2rgb(.0556434*a-.2040259*t+1.0572252*n),r[3]]}function rgbToHcl(r){var t=rgbToLab(r),a=t[0],n=t[1],b=t[2],o=Math.atan2(b,n)*rad2deg;return[o<0?o+360:o,Math.sqrt(n*n+b*b),a,r[3]]}function hclToRgb(r){var t=r[0]*deg2rad,a=r[1],n=r[2];return labToRgb([n,Math.cos(t)*a,Math.sin(t)*a,r[3]])}var Kn=18,Xn=.95047,Yn=1,Zn=1.08883,t0=4/29,t1=6/29,t2=3*t1*t1,t3=t1*t1*t1,deg2rad=Math.PI/180,rad2deg=180/Math.PI;module.exports={lab:{forward:rgbToLab,reverse:labToRgb},hcl:{forward:rgbToHcl,reverse:hclToRgb}}; +},{}],161:[function(require,module,exports){ +"use strict";function identityFunction(t){return t}function createFunction(t,o){var e;if(isFunctionDefinition(t)){var n,r=t.stops&&"object"==typeof t.stops[0][0],i=r||void 0!==t.property,s=r||!i,a=t.stops&&typeof(r?t.stops[0][0].property:t.stops[0][0]),p=t.type||o||("string"===a?"categorical":"exponential");if("exponential"===p)n=evaluateExponentialFunction;else if("interval"===p)n=evaluateIntervalFunction;else if("categorical"===p)n=evaluateCategoricalFunction;else{if("identity"!==p)throw new Error('Unknown function type "'+p+'"');n=evaluateIdentityFunction}var u;if(t.colorSpace&&"rgb"!==t.colorSpace){if(!colorSpaces[t.colorSpace])throw new Error("Unknown color space: "+t.colorSpace);var c=colorSpaces[t.colorSpace];t=JSON.parse(JSON.stringify(t));for(var l=0;l=t.stops.length)break;if(o<=t.stops[n][0])break;n++}return 0===n?t.stops[n][1]:n===t.stops.length?t.stops[n-1][1]:interpolate(o,e,t.stops[n-1][0],t.stops[n][0],t.stops[n-1][1],t.stops[n][1])}function evaluateIdentityFunction(t,o){return o}function interpolate(t,o,e,n,r,i){return"function"==typeof r?function(){var s=r.apply(void 0,arguments),a=i.apply(void 0,arguments);return interpolate(t,o,e,n,s,a)}:r.length?interpolateArray(t,o,e,n,r,i):interpolateNumber(t,o,e,n,r,i)}function interpolateNumber(t,o,e,n,r,i){var s,a=n-e,p=t-e;return s=1===o?p/a:(Math.pow(o,p)-1)/(Math.pow(o,a)-1),r*(1-s)+i*s}function interpolateArray(t,o,e,n,r,i){for(var s=[],a=0;a u_zoom) {\n gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0) * alpha;\n }\n\n if (u_zoom >= v_max_zoom) {\n gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0) * alpha * 0.25;\n }\n\n if (v_placement_zoom >= u_maxzoom) {\n gl_FragColor = vec4(0.0, 0.0, 1.0, 1.0) * alpha * 0.2;\n }\n}\n",vertexSource:"attribute vec2 a_pos;\nattribute vec2 a_extrude;\nattribute vec2 a_data;\n\nuniform mat4 u_matrix;\nuniform float u_scale;\n\nvarying float v_max_zoom;\nvarying float v_placement_zoom;\n\nvoid main() {\n gl_Position = u_matrix * vec4(a_pos + a_extrude / u_scale, 0.0, 1.0);\n\n v_max_zoom = a_data.x;\n v_placement_zoom = a_data.y;\n}\n"},debug:{fragmentSource:"uniform lowp vec4 u_color;\n\nvoid main() {\n gl_FragColor = u_color;\n}\n",vertexSource:"attribute vec2 a_pos;\n\nuniform mat4 u_matrix;\n\nvoid main() {\n gl_Position = u_matrix * vec4(a_pos, step(32767.0, a_pos.x), 1);\n}\n"},fill:{fragmentSource:"#pragma mapbox: define lowp vec4 color\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize lowp vec4 color\n #pragma mapbox: initialize lowp float opacity\n\n gl_FragColor = color * opacity;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n",vertexSource:"attribute vec2 a_pos;\n\nuniform mat4 u_matrix;\n\n#pragma mapbox: define lowp vec4 color\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize lowp vec4 color\n #pragma mapbox: initialize lowp float opacity\n\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n}\n"},fillOutline:{fragmentSource:"#pragma mapbox: define lowp vec4 outline_color\n#pragma mapbox: define lowp float opacity\n\nvarying vec2 v_pos;\n\nvoid main() {\n #pragma mapbox: initialize lowp vec4 outline_color\n #pragma mapbox: initialize lowp float opacity\n\n float dist = length(v_pos - gl_FragCoord.xy);\n float alpha = smoothstep(1.0, 0.0, dist);\n gl_FragColor = outline_color * (alpha * opacity);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n",vertexSource:"attribute vec2 a_pos;\n\nuniform mat4 u_matrix;\nuniform vec2 u_world;\n\nvarying vec2 v_pos;\n\n#pragma mapbox: define lowp vec4 outline_color\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize lowp vec4 outline_color\n #pragma mapbox: initialize lowp float opacity\n\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n v_pos = (gl_Position.xy / gl_Position.w + 1.0) / 2.0 * u_world;\n}\n"},fillOutlinePattern:{fragmentSource:"uniform vec2 u_pattern_tl_a;\nuniform vec2 u_pattern_br_a;\nuniform vec2 u_pattern_tl_b;\nuniform vec2 u_pattern_br_b;\nuniform float u_mix;\n\nuniform sampler2D u_image;\n\nvarying vec2 v_pos_a;\nvarying vec2 v_pos_b;\nvarying vec2 v_pos;\n\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize lowp float opacity\n\n vec2 imagecoord = mod(v_pos_a, 1.0);\n vec2 pos = mix(u_pattern_tl_a, u_pattern_br_a, imagecoord);\n vec4 color1 = texture2D(u_image, pos);\n\n vec2 imagecoord_b = mod(v_pos_b, 1.0);\n vec2 pos2 = mix(u_pattern_tl_b, u_pattern_br_b, imagecoord_b);\n vec4 color2 = texture2D(u_image, pos2);\n\n // find distance to outline for alpha interpolation\n\n float dist = length(v_pos - gl_FragCoord.xy);\n float alpha = smoothstep(1.0, 0.0, dist);\n\n\n gl_FragColor = mix(color1, color2, u_mix) * alpha * opacity;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n",vertexSource:"uniform mat4 u_matrix;\nuniform vec2 u_world;\nuniform vec2 u_pattern_size_a;\nuniform vec2 u_pattern_size_b;\nuniform vec2 u_pixel_coord_upper;\nuniform vec2 u_pixel_coord_lower;\nuniform float u_scale_a;\nuniform float u_scale_b;\nuniform float u_tile_units_to_pixels;\n\nattribute vec2 a_pos;\n\nvarying vec2 v_pos_a;\nvarying vec2 v_pos_b;\nvarying vec2 v_pos;\n\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize lowp float opacity\n\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n\n v_pos_a = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, u_scale_a * u_pattern_size_a, u_tile_units_to_pixels, a_pos);\n v_pos_b = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, u_scale_b * u_pattern_size_b, u_tile_units_to_pixels, a_pos);\n\n v_pos = (gl_Position.xy / gl_Position.w + 1.0) / 2.0 * u_world;\n}\n"},fillPattern:{fragmentSource:"uniform vec2 u_pattern_tl_a;\nuniform vec2 u_pattern_br_a;\nuniform vec2 u_pattern_tl_b;\nuniform vec2 u_pattern_br_b;\nuniform float u_mix;\n\nuniform sampler2D u_image;\n\nvarying vec2 v_pos_a;\nvarying vec2 v_pos_b;\n\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize lowp float opacity\n\n vec2 imagecoord = mod(v_pos_a, 1.0);\n vec2 pos = mix(u_pattern_tl_a, u_pattern_br_a, imagecoord);\n vec4 color1 = texture2D(u_image, pos);\n\n vec2 imagecoord_b = mod(v_pos_b, 1.0);\n vec2 pos2 = mix(u_pattern_tl_b, u_pattern_br_b, imagecoord_b);\n vec4 color2 = texture2D(u_image, pos2);\n\n gl_FragColor = mix(color1, color2, u_mix) * opacity;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n",vertexSource:"uniform mat4 u_matrix;\nuniform vec2 u_pattern_size_a;\nuniform vec2 u_pattern_size_b;\nuniform vec2 u_pixel_coord_upper;\nuniform vec2 u_pixel_coord_lower;\nuniform float u_scale_a;\nuniform float u_scale_b;\nuniform float u_tile_units_to_pixels;\n\nattribute vec2 a_pos;\n\nvarying vec2 v_pos_a;\nvarying vec2 v_pos_b;\n\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize lowp float opacity\n\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n\n v_pos_a = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, u_scale_a * u_pattern_size_a, u_tile_units_to_pixels, a_pos);\n v_pos_b = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, u_scale_b * u_pattern_size_b, u_tile_units_to_pixels, a_pos);\n}\n"},fillExtrusion:{fragmentSource:"varying vec4 v_color;\n#pragma mapbox: define lowp float base\n#pragma mapbox: define lowp float height\n#pragma mapbox: define lowp vec4 color\n\nvoid main() {\n #pragma mapbox: initialize lowp float base\n #pragma mapbox: initialize lowp float height\n #pragma mapbox: initialize lowp vec4 color\n\n gl_FragColor = v_color;\n}\n",vertexSource:"uniform mat4 u_matrix;\nuniform vec3 u_lightcolor;\nuniform lowp vec3 u_lightpos;\nuniform lowp float u_lightintensity;\nuniform lowp vec4 u_outline_color;\n\nattribute vec2 a_pos;\nattribute vec3 a_normal;\nattribute float a_edgedistance;\n\nvarying vec4 v_color;\n\n#pragma mapbox: define lowp float base\n#pragma mapbox: define lowp float height\n\n#pragma mapbox: define lowp vec4 color\n\nvoid main() {\n #pragma mapbox: initialize lowp float base\n #pragma mapbox: initialize lowp float height\n #pragma mapbox: initialize lowp vec4 color\n\n float ed = a_edgedistance; // use each attrib in order to not trip a VAO assert\n float t = mod(a_normal.x, 2.0);\n\n gl_Position = u_matrix * vec4(a_pos, t > 0.0 ? height : base, 1);\n\n#ifdef OUTLINE\n color = u_outline_color;\n#endif\n\n // Relative luminance (how dark/bright is the surface color?)\n float colorvalue = color.r * 0.2126 + color.g * 0.7152 + color.b * 0.0722;\n\n v_color = vec4(0.0, 0.0, 0.0, 1.0);\n\n // Add slight ambient lighting so no extrusions are totally black\n vec4 ambientlight = vec4(0.03, 0.03, 0.03, 1.0);\n color += ambientlight;\n\n // Calculate cos(theta), where theta is the angle between surface normal and diffuse light ray\n float directional = clamp(dot(a_normal / 16384.0, u_lightpos), 0.0, 1.0);\n\n // Adjust directional so that\n // the range of values for highlight/shading is narrower\n // with lower light intensity\n // and with lighter/brighter surface colors\n directional = mix((1.0 - u_lightintensity), max((1.0 - colorvalue + u_lightintensity), 1.0), directional);\n\n // Add gradient along z axis of side surfaces\n if (a_normal.y != 0.0) {\n directional *= clamp((t + base) * pow(height / 150.0, 0.5), mix(0.7, 0.98, 1.0 - u_lightintensity), 1.0);\n }\n\n // Assign final color based on surface + ambient light color, diffuse light directional, and light color\n // with lower bounds adjusted to hue of light\n // so that shading is tinted with the complementary (opposite) color to the light color\n v_color.r += clamp(color.r * directional * u_lightcolor.r, mix(0.0, 0.3, 1.0 - u_lightcolor.r), 1.0);\n v_color.g += clamp(color.g * directional * u_lightcolor.g, mix(0.0, 0.3, 1.0 - u_lightcolor.g), 1.0);\n v_color.b += clamp(color.b * directional * u_lightcolor.b, mix(0.0, 0.3, 1.0 - u_lightcolor.b), 1.0);\n}\n"},fillExtrusionPattern:{fragmentSource:"uniform vec2 u_pattern_tl_a;\nuniform vec2 u_pattern_br_a;\nuniform vec2 u_pattern_tl_b;\nuniform vec2 u_pattern_br_b;\nuniform float u_mix;\n\nuniform sampler2D u_image;\n\nvarying vec2 v_pos_a;\nvarying vec2 v_pos_b;\nvarying vec4 v_lighting;\n\n#pragma mapbox: define lowp float base\n#pragma mapbox: define lowp float height\n\nvoid main() {\n #pragma mapbox: initialize lowp float base\n #pragma mapbox: initialize lowp float height\n\n vec2 imagecoord = mod(v_pos_a, 1.0);\n vec2 pos = mix(u_pattern_tl_a, u_pattern_br_a, imagecoord);\n vec4 color1 = texture2D(u_image, pos);\n\n vec2 imagecoord_b = mod(v_pos_b, 1.0);\n vec2 pos2 = mix(u_pattern_tl_b, u_pattern_br_b, imagecoord_b);\n vec4 color2 = texture2D(u_image, pos2);\n\n vec4 mixedColor = mix(color1, color2, u_mix);\n\n gl_FragColor = mixedColor * v_lighting;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n",vertexSource:"uniform mat4 u_matrix;\nuniform vec2 u_pattern_size_a;\nuniform vec2 u_pattern_size_b;\nuniform vec2 u_pixel_coord_upper;\nuniform vec2 u_pixel_coord_lower;\nuniform float u_scale_a;\nuniform float u_scale_b;\nuniform float u_tile_units_to_pixels;\nuniform float u_height_factor;\n\nuniform vec3 u_lightcolor;\nuniform lowp vec3 u_lightpos;\nuniform lowp float u_lightintensity;\n\nattribute vec2 a_pos;\nattribute vec3 a_normal;\nattribute float a_edgedistance;\n\nvarying vec2 v_pos_a;\nvarying vec2 v_pos_b;\nvarying vec4 v_lighting;\nvarying float v_directional;\n\n#pragma mapbox: define lowp float base\n#pragma mapbox: define lowp float height\n\nvoid main() {\n #pragma mapbox: initialize lowp float base\n #pragma mapbox: initialize lowp float height\n\n float t = mod(a_normal.x, 2.0);\n float z = t > 0.0 ? height : base;\n\n gl_Position = u_matrix * vec4(a_pos, z, 1);\n\n vec2 pos = a_normal.x == 1.0 && a_normal.y == 0.0 && a_normal.z == 16384.0\n ? a_pos // extrusion top\n : vec2(a_edgedistance, z * u_height_factor); // extrusion side\n\n v_pos_a = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, u_scale_a * u_pattern_size_a, u_tile_units_to_pixels, pos);\n v_pos_b = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, u_scale_b * u_pattern_size_b, u_tile_units_to_pixels, pos);\n\n v_lighting = vec4(0.0, 0.0, 0.0, 1.0);\n float directional = clamp(dot(a_normal / 16383.0, u_lightpos), 0.0, 1.0);\n directional = mix((1.0 - u_lightintensity), max((0.5 + u_lightintensity), 1.0), directional);\n\n if (a_normal.y != 0.0) {\n directional *= clamp((t + base) * pow(height / 150.0, 0.5), mix(0.7, 0.98, 1.0 - u_lightintensity), 1.0);\n }\n\n v_lighting.rgb += clamp(directional * u_lightcolor, mix(vec3(0.0), vec3(0.3), 1.0 - u_lightcolor), vec3(1.0));\n}\n"},extrusionTexture:{fragmentSource:"uniform sampler2D u_texture;\nuniform float u_opacity;\n\nvarying vec2 v_pos;\n\nvoid main() {\n gl_FragColor = texture2D(u_texture, v_pos) * u_opacity;\n}\n",vertexSource:"uniform mat4 u_matrix;\nuniform int u_xdim;\nuniform int u_ydim;\nattribute vec2 a_pos;\nvarying vec2 v_pos;\n\nvoid main() {\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n\n v_pos.x = a_pos.x / float(u_xdim);\n v_pos.y = 1.0 - a_pos.y / float(u_ydim);\n}\n"},line:{fragmentSource:"uniform lowp float u_opacity;\nuniform float u_blur;\n\n#pragma mapbox: define lowp vec4 color\n\nvarying vec2 v_linewidth;\nvarying vec2 v_normal;\nvarying float v_gamma_scale;\n\nvoid main() {\n #pragma mapbox: initialize lowp vec4 color\n\n // Calculate the distance of the pixel from the line in pixels.\n float dist = length(v_normal) * v_linewidth.s;\n\n // Calculate the antialiasing fade factor. This is either when fading in\n // the line in case of an offset line (v_linewidth.t) or when fading out\n // (v_linewidth.s)\n float blur = u_blur * v_gamma_scale;\n float alpha = clamp(min(dist - (v_linewidth.t - blur), v_linewidth.s - dist) / blur, 0.0, 1.0);\n\n gl_FragColor = color * (alpha * u_opacity);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n",vertexSource:"// floor(127 / 2) == 63.0\n// the maximum allowed miter limit is 2.0 at the moment. the extrude normal is\n// stored in a byte (-128..127). we scale regular normals up to length 63, but\n// there are also \"special\" normals that have a bigger length (of up to 126 in\n// this case).\n// #define scale 63.0\n#define scale 0.015873016\n\nattribute vec2 a_pos;\nattribute vec4 a_data;\n\nuniform mat4 u_matrix;\nuniform mediump float u_ratio;\nuniform mediump float u_linewidth;\nuniform mediump float u_gapwidth;\nuniform mediump float u_antialiasing;\nuniform mediump float u_extra;\nuniform mat2 u_antialiasingmatrix;\nuniform mediump float u_offset;\nuniform mediump float u_blur;\n\nvarying vec2 v_normal;\nvarying vec2 v_linewidth;\nvarying float v_gamma_scale;\n\n#pragma mapbox: define lowp vec4 color\n\nvoid main() {\n #pragma mapbox: initialize lowp vec4 color\n\n vec2 a_extrude = a_data.xy - 128.0;\n float a_direction = mod(a_data.z, 4.0) - 1.0;\n\n // We store the texture normals in the most insignificant bit\n // transform y so that 0 => -1 and 1 => 1\n // In the texture normal, x is 0 if the normal points straight up/down and 1 if it's a round cap\n // y is 1 if the normal points up, and -1 if it points down\n mediump vec2 normal = mod(a_pos, 2.0);\n normal.y = sign(normal.y - 0.5);\n v_normal = normal;\n\n float inset = u_gapwidth + (u_gapwidth > 0.0 ? u_antialiasing : 0.0);\n float outset = u_gapwidth + u_linewidth * (u_gapwidth > 0.0 ? 2.0 : 1.0) + u_antialiasing;\n\n // Scale the extrusion vector down to a normal and then up by the line width\n // of this vertex.\n mediump vec2 dist = outset * a_extrude * scale;\n\n // Calculate the offset when drawing a line that is to the side of the actual line.\n // We do this by creating a vector that points towards the extrude, but rotate\n // it when we're drawing round end points (a_direction = -1 or 1) since their\n // extrude vector points in another direction.\n mediump float u = 0.5 * a_direction;\n mediump float t = 1.0 - abs(u);\n mediump vec2 offset = u_offset * a_extrude * scale * normal.y * mat2(t, -u, u, t);\n\n // Remove the texture normal bit of the position before scaling it with the\n // model/view matrix.\n gl_Position = u_matrix * vec4(floor(a_pos * 0.5) + (offset + dist) / u_ratio, 0.0, 1.0);\n\n // position of y on the screen\n float y = gl_Position.y / gl_Position.w;\n\n // how much features are squished in the y direction by the tilt\n float squish_scale = length(a_extrude) / length(u_antialiasingmatrix * a_extrude);\n\n // how much features are squished in all directions by the perspectiveness\n float perspective_scale = 1.0 / (1.0 - min(y * u_extra, 0.9));\n\n v_linewidth = vec2(outset, inset);\n v_gamma_scale = perspective_scale * squish_scale;\n}\n"},linePattern:{fragmentSource:"uniform float u_blur;\n\nuniform vec2 u_pattern_size_a;\nuniform vec2 u_pattern_size_b;\nuniform vec2 u_pattern_tl_a;\nuniform vec2 u_pattern_br_a;\nuniform vec2 u_pattern_tl_b;\nuniform vec2 u_pattern_br_b;\nuniform float u_fade;\nuniform float u_opacity;\n\nuniform sampler2D u_image;\n\nvarying vec2 v_normal;\nvarying vec2 v_linewidth;\nvarying float v_linesofar;\nvarying float v_gamma_scale;\n\nvoid main() {\n // Calculate the distance of the pixel from the line in pixels.\n float dist = length(v_normal) * v_linewidth.s;\n\n // Calculate the antialiasing fade factor. This is either when fading in\n // the line in case of an offset line (v_linewidth.t) or when fading out\n // (v_linewidth.s)\n float blur = u_blur * v_gamma_scale;\n float alpha = clamp(min(dist - (v_linewidth.t - blur), v_linewidth.s - dist) / blur, 0.0, 1.0);\n\n float x_a = mod(v_linesofar / u_pattern_size_a.x, 1.0);\n float x_b = mod(v_linesofar / u_pattern_size_b.x, 1.0);\n float y_a = 0.5 + (v_normal.y * v_linewidth.s / u_pattern_size_a.y);\n float y_b = 0.5 + (v_normal.y * v_linewidth.s / u_pattern_size_b.y);\n vec2 pos_a = mix(u_pattern_tl_a, u_pattern_br_a, vec2(x_a, y_a));\n vec2 pos_b = mix(u_pattern_tl_b, u_pattern_br_b, vec2(x_b, y_b));\n\n vec4 color = mix(texture2D(u_image, pos_a), texture2D(u_image, pos_b), u_fade);\n\n alpha *= u_opacity;\n\n gl_FragColor = color * alpha;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n",vertexSource:"// floor(127 / 2) == 63.0\n// the maximum allowed miter limit is 2.0 at the moment. the extrude normal is\n// stored in a byte (-128..127). we scale regular normals up to length 63, but\n// there are also \"special\" normals that have a bigger length (of up to 126 in\n// this case).\n// #define scale 63.0\n#define scale 0.015873016\n\n// We scale the distance before adding it to the buffers so that we can store\n// long distances for long segments. Use this value to unscale the distance.\n#define LINE_DISTANCE_SCALE 2.0\n\nattribute vec2 a_pos;\nattribute vec4 a_data;\n\nuniform mat4 u_matrix;\nuniform mediump float u_ratio;\nuniform mediump float u_linewidth;\nuniform mediump float u_gapwidth;\nuniform mediump float u_antialiasing;\nuniform mediump float u_extra;\nuniform mat2 u_antialiasingmatrix;\nuniform mediump float u_offset;\n\nvarying vec2 v_normal;\nvarying vec2 v_linewidth;\nvarying float v_linesofar;\nvarying float v_gamma_scale;\n\nvoid main() {\n vec2 a_extrude = a_data.xy - 128.0;\n float a_direction = mod(a_data.z, 4.0) - 1.0;\n float a_linesofar = (floor(a_data.z / 4.0) + a_data.w * 64.0) * LINE_DISTANCE_SCALE;\n\n // We store the texture normals in the most insignificant bit\n // transform y so that 0 => -1 and 1 => 1\n // In the texture normal, x is 0 if the normal points straight up/down and 1 if it's a round cap\n // y is 1 if the normal points up, and -1 if it points down\n mediump vec2 normal = mod(a_pos, 2.0);\n normal.y = sign(normal.y - 0.5);\n v_normal = normal;\n\n float inset = u_gapwidth + (u_gapwidth > 0.0 ? u_antialiasing : 0.0);\n float outset = u_gapwidth + u_linewidth * (u_gapwidth > 0.0 ? 2.0 : 1.0) + u_antialiasing;\n\n // Scale the extrusion vector down to a normal and then up by the line width\n // of this vertex.\n mediump vec2 dist = outset * a_extrude * scale;\n\n // Calculate the offset when drawing a line that is to the side of the actual line.\n // We do this by creating a vector that points towards the extrude, but rotate\n // it when we're drawing round end points (a_direction = -1 or 1) since their\n // extrude vector points in another direction.\n mediump float u = 0.5 * a_direction;\n mediump float t = 1.0 - abs(u);\n mediump vec2 offset = u_offset * a_extrude * scale * normal.y * mat2(t, -u, u, t);\n\n // Remove the texture normal bit of the position before scaling it with the\n // model/view matrix.\n gl_Position = u_matrix * vec4(floor(a_pos * 0.5) + (offset + dist) / u_ratio, 0.0, 1.0);\n v_linesofar = a_linesofar;\n\n // position of y on the screen\n float y = gl_Position.y / gl_Position.w;\n\n // how much features are squished in the y direction by the tilt\n float squish_scale = length(a_extrude) / length(u_antialiasingmatrix * a_extrude);\n\n // how much features are squished in all directions by the perspectiveness\n float perspective_scale = 1.0 / (1.0 - min(y * u_extra, 0.9));\n\n v_linewidth = vec2(outset, inset);\n v_gamma_scale = perspective_scale * squish_scale;\n}\n"},lineSDF:{fragmentSource:"uniform lowp float u_opacity;\n\nuniform float u_blur;\nuniform sampler2D u_image;\nuniform float u_sdfgamma;\nuniform float u_mix;\n\nvarying vec2 v_normal;\nvarying vec2 v_linewidth;\nvarying vec2 v_tex_a;\nvarying vec2 v_tex_b;\nvarying float v_gamma_scale;\n\n#pragma mapbox: define lowp vec4 color\n\nvoid main() {\n #pragma mapbox: initialize lowp vec4 color\n\n // Calculate the distance of the pixel from the line in pixels.\n float dist = length(v_normal) * v_linewidth.s;\n\n // Calculate the antialiasing fade factor. This is either when fading in\n // the line in case of an offset line (v_linewidth.t) or when fading out\n // (v_linewidth.s)\n float blur = u_blur * v_gamma_scale;\n float alpha = clamp(min(dist - (v_linewidth.t - blur), v_linewidth.s - dist) / blur, 0.0, 1.0);\n\n float sdfdist_a = texture2D(u_image, v_tex_a).a;\n float sdfdist_b = texture2D(u_image, v_tex_b).a;\n float sdfdist = mix(sdfdist_a, sdfdist_b, u_mix);\n alpha *= smoothstep(0.5 - u_sdfgamma, 0.5 + u_sdfgamma, sdfdist);\n\n gl_FragColor = color * (alpha * u_opacity);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n",vertexSource:"// floor(127 / 2) == 63.0\n// the maximum allowed miter limit is 2.0 at the moment. the extrude normal is\n// stored in a byte (-128..127). we scale regular normals up to length 63, but\n// there are also \"special\" normals that have a bigger length (of up to 126 in\n// this case).\n// #define scale 63.0\n#define scale 0.015873016\n\n// We scale the distance before adding it to the buffers so that we can store\n// long distances for long segments. Use this value to unscale the distance.\n#define LINE_DISTANCE_SCALE 2.0\n\nattribute vec2 a_pos;\nattribute vec4 a_data;\n\nuniform mat4 u_matrix;\nuniform mediump float u_ratio;\nuniform mediump float u_linewidth;\nuniform mediump float u_gapwidth;\nuniform mediump float u_antialiasing;\nuniform vec2 u_patternscale_a;\nuniform float u_tex_y_a;\nuniform vec2 u_patternscale_b;\nuniform float u_tex_y_b;\nuniform float u_extra;\nuniform mat2 u_antialiasingmatrix;\nuniform mediump float u_offset;\n\nvarying vec2 v_normal;\nvarying vec2 v_linewidth;\nvarying vec2 v_tex_a;\nvarying vec2 v_tex_b;\nvarying float v_gamma_scale;\n\n#pragma mapbox: define lowp vec4 color\n\nvoid main() {\n #pragma mapbox: initialize lowp vec4 color\n\n vec2 a_extrude = a_data.xy - 128.0;\n float a_direction = mod(a_data.z, 4.0) - 1.0;\n float a_linesofar = (floor(a_data.z / 4.0) + a_data.w * 64.0) * LINE_DISTANCE_SCALE;\n\n // We store the texture normals in the most insignificant bit\n // transform y so that 0 => -1 and 1 => 1\n // In the texture normal, x is 0 if the normal points straight up/down and 1 if it's a round cap\n // y is 1 if the normal points up, and -1 if it points down\n mediump vec2 normal = mod(a_pos, 2.0);\n normal.y = sign(normal.y - 0.5);\n v_normal = normal;\n\n float inset = u_gapwidth + (u_gapwidth > 0.0 ? u_antialiasing : 0.0);\n float outset = u_gapwidth + u_linewidth * (u_gapwidth > 0.0 ? 2.0 : 1.0) + u_antialiasing;\n\n // Scale the extrusion vector down to a normal and then up by the line width\n // of this vertex.\n mediump vec2 dist = outset * a_extrude * scale;\n\n // Calculate the offset when drawing a line that is to the side of the actual line.\n // We do this by creating a vector that points towards the extrude, but rotate\n // it when we're drawing round end points (a_direction = -1 or 1) since their\n // extrude vector points in another direction.\n mediump float u = 0.5 * a_direction;\n mediump float t = 1.0 - abs(u);\n mediump vec2 offset = u_offset * a_extrude * scale * normal.y * mat2(t, -u, u, t);\n\n // Remove the texture normal bit of the position before scaling it with the\n // model/view matrix.\n gl_Position = u_matrix * vec4(floor(a_pos * 0.5) + (offset + dist) / u_ratio, 0.0, 1.0);\n\n v_tex_a = vec2(a_linesofar * u_patternscale_a.x, normal.y * u_patternscale_a.y + u_tex_y_a);\n v_tex_b = vec2(a_linesofar * u_patternscale_b.x, normal.y * u_patternscale_b.y + u_tex_y_b);\n\n // position of y on the screen\n float y = gl_Position.y / gl_Position.w;\n\n // how much features are squished in the y direction by the tilt\n float squish_scale = length(a_extrude) / length(u_antialiasingmatrix * a_extrude);\n\n // how much features are squished in all directions by the perspectiveness\n float perspective_scale = 1.0 / (1.0 - min(y * u_extra, 0.9));\n\n v_linewidth = vec2(outset, inset);\n v_gamma_scale = perspective_scale * squish_scale;\n}\n"},raster:{fragmentSource:"uniform float u_opacity0;\nuniform float u_opacity1;\nuniform sampler2D u_image0;\nuniform sampler2D u_image1;\nvarying vec2 v_pos0;\nvarying vec2 v_pos1;\n\nuniform float u_brightness_low;\nuniform float u_brightness_high;\n\nuniform float u_saturation_factor;\nuniform float u_contrast_factor;\nuniform vec3 u_spin_weights;\n\nvoid main() {\n\n // read and cross-fade colors from the main and parent tiles\n vec4 color0 = texture2D(u_image0, v_pos0);\n vec4 color1 = texture2D(u_image1, v_pos1);\n vec4 color = color0 * u_opacity0 + color1 * u_opacity1;\n vec3 rgb = color.rgb;\n\n // spin\n rgb = vec3(\n dot(rgb, u_spin_weights.xyz),\n dot(rgb, u_spin_weights.zxy),\n dot(rgb, u_spin_weights.yzx));\n\n // saturation\n float average = (color.r + color.g + color.b) / 3.0;\n rgb += (average - rgb) * u_saturation_factor;\n\n // contrast\n rgb = (rgb - 0.5) * u_contrast_factor + 0.5;\n\n // brightness\n vec3 u_high_vec = vec3(u_brightness_low, u_brightness_low, u_brightness_low);\n vec3 u_low_vec = vec3(u_brightness_high, u_brightness_high, u_brightness_high);\n\n gl_FragColor = vec4(mix(u_high_vec, u_low_vec, rgb), color.a);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n",vertexSource:"uniform mat4 u_matrix;\nuniform vec2 u_tl_parent;\nuniform float u_scale_parent;\nuniform float u_buffer_scale;\n\nattribute vec2 a_pos;\nattribute vec2 a_texture_pos;\n\nvarying vec2 v_pos0;\nvarying vec2 v_pos1;\n\nvoid main() {\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n v_pos0 = (((a_texture_pos / 32767.0) - 0.5) / u_buffer_scale ) + 0.5;\n v_pos1 = (v_pos0 * u_scale_parent) + u_tl_parent;\n}\n"},symbolIcon:{fragmentSource:"uniform sampler2D u_texture;\nuniform sampler2D u_fadetexture;\nuniform lowp float u_opacity;\n\nvarying vec2 v_tex;\nvarying vec2 v_fade_tex;\n\nvoid main() {\n lowp float alpha = texture2D(u_fadetexture, v_fade_tex).a * u_opacity;\n gl_FragColor = texture2D(u_texture, v_tex) * alpha;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n",vertexSource:"attribute vec2 a_pos;\nattribute vec2 a_offset;\nattribute vec2 a_texture_pos;\nattribute vec4 a_data;\n\n\n// matrix is for the vertex position.\nuniform mat4 u_matrix;\n\nuniform mediump float u_zoom;\nuniform bool u_rotate_with_map;\nuniform vec2 u_extrude_scale;\n\nuniform vec2 u_texsize;\n\nvarying vec2 v_tex;\nvarying vec2 v_fade_tex;\n\nvoid main() {\n vec2 a_tex = a_texture_pos.xy;\n mediump float a_labelminzoom = a_data[0];\n mediump vec2 a_zoom = a_data.pq;\n mediump float a_minzoom = a_zoom[0];\n mediump float a_maxzoom = a_zoom[1];\n\n // u_zoom is the current zoom level adjusted for the change in font size\n mediump float z = 2.0 - step(a_minzoom, u_zoom) - (1.0 - step(a_maxzoom, u_zoom));\n\n vec2 extrude = u_extrude_scale * (a_offset / 64.0);\n if (u_rotate_with_map) {\n gl_Position = u_matrix * vec4(a_pos + extrude, 0, 1);\n gl_Position.z += z * gl_Position.w;\n } else {\n gl_Position = u_matrix * vec4(a_pos, 0, 1) + vec4(extrude, 0, 0);\n }\n\n v_tex = a_tex / u_texsize;\n v_fade_tex = vec2(a_labelminzoom / 255.0, 0.0);\n}\n" +},symbolSDF:{fragmentSource:"uniform sampler2D u_texture;\nuniform sampler2D u_fadetexture;\nuniform lowp vec4 u_color;\nuniform lowp float u_opacity;\nuniform lowp float u_buffer;\nuniform lowp float u_gamma;\n\nvarying vec2 v_tex;\nvarying vec2 v_fade_tex;\nvarying float v_gamma_scale;\n\nvoid main() {\n lowp float dist = texture2D(u_texture, v_tex).a;\n lowp float fade_alpha = texture2D(u_fadetexture, v_fade_tex).a;\n lowp float gamma = u_gamma * v_gamma_scale;\n lowp float alpha = smoothstep(u_buffer - gamma, u_buffer + gamma, dist) * fade_alpha;\n\n gl_FragColor = u_color * (alpha * u_opacity);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n",vertexSource:"const float PI = 3.141592653589793;\n\nattribute vec2 a_pos;\nattribute vec2 a_offset;\nattribute vec2 a_texture_pos;\nattribute vec4 a_data;\n\n\n// matrix is for the vertex position.\nuniform mat4 u_matrix;\n\nuniform mediump float u_zoom;\nuniform bool u_rotate_with_map;\nuniform bool u_pitch_with_map;\nuniform mediump float u_pitch;\nuniform mediump float u_bearing;\nuniform mediump float u_aspect_ratio;\nuniform vec2 u_extrude_scale;\n\nuniform vec2 u_texsize;\n\nvarying vec2 v_tex;\nvarying vec2 v_fade_tex;\nvarying float v_gamma_scale;\n\nvoid main() {\n vec2 a_tex = a_texture_pos.xy;\n mediump float a_labelminzoom = a_data[0];\n mediump vec2 a_zoom = a_data.pq;\n mediump float a_minzoom = a_zoom[0];\n mediump float a_maxzoom = a_zoom[1];\n\n // u_zoom is the current zoom level adjusted for the change in font size\n mediump float z = 2.0 - step(a_minzoom, u_zoom) - (1.0 - step(a_maxzoom, u_zoom));\n\n // pitch-alignment: map\n // rotation-alignment: map | viewport\n if (u_pitch_with_map) {\n lowp float angle = u_rotate_with_map ? (a_data[1] / 256.0 * 2.0 * PI) : u_bearing;\n lowp float asin = sin(angle);\n lowp float acos = cos(angle);\n mat2 RotationMatrix = mat2(acos, asin, -1.0 * asin, acos);\n vec2 offset = RotationMatrix * a_offset;\n vec2 extrude = u_extrude_scale * (offset / 64.0);\n gl_Position = u_matrix * vec4(a_pos + extrude, 0, 1);\n gl_Position.z += z * gl_Position.w;\n // pitch-alignment: viewport\n // rotation-alignment: map\n } else if (u_rotate_with_map) {\n // foreshortening factor to apply on pitched maps\n // as a label goes from horizontal <=> vertical in angle\n // it goes from 0% foreshortening to up to around 70% foreshortening\n lowp float pitchfactor = 1.0 - cos(u_pitch * sin(u_pitch * 0.75));\n\n lowp float lineangle = a_data[1] / 256.0 * 2.0 * PI;\n\n // use the lineangle to position points a,b along the line\n // project the points and calculate the label angle in projected space\n // this calculation allows labels to be rendered unskewed on pitched maps\n vec4 a = u_matrix * vec4(a_pos, 0, 1);\n vec4 b = u_matrix * vec4(a_pos + vec2(cos(lineangle),sin(lineangle)), 0, 1);\n lowp float angle = atan((b[1]/b[3] - a[1]/a[3])/u_aspect_ratio, b[0]/b[3] - a[0]/a[3]);\n lowp float asin = sin(angle);\n lowp float acos = cos(angle);\n mat2 RotationMatrix = mat2(acos, -1.0 * asin, asin, acos);\n\n vec2 offset = RotationMatrix * (vec2((1.0-pitchfactor)+(pitchfactor*cos(angle*2.0)), 1.0) * a_offset);\n vec2 extrude = u_extrude_scale * (offset / 64.0);\n gl_Position = u_matrix * vec4(a_pos, 0, 1) + vec4(extrude, 0, 0);\n gl_Position.z += z * gl_Position.w;\n // pitch-alignment: viewport\n // rotation-alignment: viewport\n } else {\n vec2 extrude = u_extrude_scale * (a_offset / 64.0);\n gl_Position = u_matrix * vec4(a_pos, 0, 1) + vec4(extrude, 0, 0);\n }\n\n v_gamma_scale = (gl_Position.w - 0.5);\n\n v_tex = a_tex / u_texsize;\n v_fade_tex = vec2(a_labelminzoom / 255.0, 0.0);\n}\n"}}; +},{"path":191}],163:[function(require,module,exports){ +"use strict";function deref(r,e){var t={};for(var f in r)"ref"!==f&&(t[f]=r[f]);return refProperties.forEach(function(r){r in e&&(t[r]=e[r])}),t}var refProperties=require("./util/ref_properties");module.exports=function(r){r=r.slice();var e,t=Object.create(null);for(e=0;e7)return[new ValidationError(u,i,"constants have been deprecated as of v8")];if(!(i in l.constants))return[new ValidationError(u,i,'constant "%s" not found',i)];e=extend({},e,{value:l.constants[i]})}return n.function&&"object"===getType(i)?r(e):n.type&&a[n.type]?a[n.type](e):t(extend({},e,{valueSpec:n.type?o[n.type]:n}))}; +},{"../error/validation_error":164,"../util/extend":166,"../util/get_type":167,"./validate_array":171,"./validate_boolean":172,"./validate_color":173,"./validate_constants":174,"./validate_enum":175,"./validate_filter":176,"./validate_function":177,"./validate_layer":179,"./validate_number":182,"./validate_object":183,"./validate_source":185,"./validate_string":186}],171:[function(require,module,exports){ +"use strict";var getType=require("../util/get_type"),validate=require("./validate"),ValidationError=require("../error/validation_error");module.exports=function(e){var r=e.value,t=e.valueSpec,a=e.style,n=e.styleSpec,l=e.key,i=e.arrayElementValidator||validate;if("array"!==getType(r))return[new ValidationError(l,r,"array expected, %s found",getType(r))];if(t.length&&r.length!==t.length)return[new ValidationError(l,r,"array length %d expected, length %d found",t.length,r.length)];if(t["min-length"]&&r.length7)return t?[new ValidationError(e,t,"constants have been deprecated as of v8")]:[];var o=getType(t);if("object"!==o)return[new ValidationError(e,t,"object expected, %s found",o)];var n=[];for(var i in t)"@"!==i[0]&&n.push(new ValidationError(e+"."+i,t[i],'constants must start with "@"'));return n}; +},{"../error/validation_error":164,"../util/get_type":167}],175:[function(require,module,exports){ +"use strict";var ValidationError=require("../error/validation_error"),unbundle=require("../util/unbundle_jsonlint");module.exports=function(e){var r=e.key,n=e.value,u=e.valueSpec,o=[];return Array.isArray(u.values)?u.values.indexOf(unbundle(n))===-1&&o.push(new ValidationError(r,n,"expected one of [%s], %s found",u.values.join(", "),n)):Object.keys(u.values).indexOf(unbundle(n))===-1&&o.push(new ValidationError(r,n,"expected one of [%s], %s found",Object.keys(u.values).join(", "),n)),o}; +},{"../error/validation_error":164,"../util/unbundle_jsonlint":169}],176:[function(require,module,exports){ +"use strict";var ValidationError=require("../error/validation_error"),validateEnum=require("./validate_enum"),getType=require("../util/get_type"),unbundle=require("../util/unbundle_jsonlint");module.exports=function e(t){var r,a=t.value,n=t.key,l=t.styleSpec,s=[];if("array"!==getType(a))return[new ValidationError(n,a,"array expected, %s found",getType(a))];if(a.length<1)return[new ValidationError(n,a,"filter array must have at least 1 element")];switch(s=s.concat(validateEnum({key:n+"[0]",value:a[0],valueSpec:l.filter_operator,style:t.style,styleSpec:t.styleSpec})),unbundle(a[0])){case"<":case"<=":case">":case">=":a.length>=2&&"$type"==a[1]&&s.push(new ValidationError(n,a,'"$type" cannot be use with operator "%s"',a[0]));case"==":case"!=":3!=a.length&&s.push(new ValidationError(n,a,'filter array for operator "%s" must have 3 elements',a[0]));case"in":case"!in":a.length>=2&&(r=getType(a[1]),"string"!==r?s.push(new ValidationError(n+"[1]",a[1],"string expected, %s found",r)):"@"===a[1][0]&&s.push(new ValidationError(n+"[1]",a[1],"filter key cannot be a constant")));for(var o=2;o=8&&(i&&!e.valueSpec["property-function"]?s.push(new ValidationError(e.key,e.value,"property functions not supported")):u&&!e.valueSpec["zoom-function"]&&s.push(new ValidationError(e.key,e.value,"zoom functions not supported"))),s}; +},{"../error/validation_error":164,"../util/get_type":167,"../util/unbundle_jsonlint":169,"./validate":170,"./validate_array":171,"./validate_number":182,"./validate_object":183}],178:[function(require,module,exports){ +"use strict";var ValidationError=require("../error/validation_error"),validateString=require("./validate_string");module.exports=function(r){var e=r.value,t=r.key,a=validateString(r);return a.length?a:(e.indexOf("{fontstack}")===-1&&a.push(new ValidationError(t,e,'"glyphs" url must include a "{fontstack}" token')),e.indexOf("{range}")===-1&&a.push(new ValidationError(t,e,'"glyphs" url must include a "{range}" token')),a)}; +},{"../error/validation_error":164,"./validate_string":186}],179:[function(require,module,exports){ +"use strict";var ValidationError=require("../error/validation_error"),unbundle=require("../util/unbundle_jsonlint"),validateObject=require("./validate_object"),validateFilter=require("./validate_filter"),validatePaintProperty=require("./validate_paint_property"),validateLayoutProperty=require("./validate_layout_property"),extend=require("../util/extend");module.exports=function(e){var r=[],t=e.value,a=e.key,i=e.style,l=e.styleSpec;t.type||t.ref||r.push(new ValidationError(a,t,'either "type" or "ref" is required'));var o=unbundle(t.type),u=unbundle(t.ref);if(t.id)for(var n=0;nm.maximum?[new ValidationError(r,i,"%s is greater than the maximum value %s",i,m.maximum)]:[]}; +},{"../error/validation_error":164,"../util/get_type":167}],183:[function(require,module,exports){ +"use strict";var ValidationError=require("../error/validation_error"),getType=require("../util/get_type"),validate=require("./validate");module.exports=function(e){var r=e.key,t=e.value,i=e.valueSpec,o=e.objectElementValidators||{},a=e.style,l=e.styleSpec,n=[],u=getType(t);if("object"!==u)return[new ValidationError(r,t,"object expected, %s found",u)];for(var d in t){var p=d.split(".")[0],s=i&&(i[p]||i["*"]),c=o[p]||o["*"];s||c?n=n.concat((c||validate)({key:(r?r+".":r)+d,value:t[d],valueSpec:s,style:a,styleSpec:l,object:t,objectKey:d})):""!==r&&1!==r.split(".").length&&n.push(new ValidationError(r,t[d],'unknown property "%s"',d))}for(p in i)i[p].required&&void 0===i[p].default&&void 0===t[p]&&n.push(new ValidationError(r,t,'missing required property "%s"',p));return n}; +},{"../error/validation_error":164,"../util/get_type":167,"./validate":170}],184:[function(require,module,exports){ +"use strict";var validate=require("./validate"),ValidationError=require("../error/validation_error");module.exports=function(e){var r=e.key,a=e.style,t=e.styleSpec,i=e.value,l=e.objectKey,n=t["paint_"+e.layerType];if(!n)return[];var o=l.match(/^(.*)-transition$/);return o&&n[o[1]]&&n[o[1]].transition?validate({key:r,value:i,valueSpec:t.transition,style:a,styleSpec:t}):e.valueSpec||n[l]?validate({key:e.key,value:i,valueSpec:e.valueSpec||n[l],style:a,styleSpec:t}):[new ValidationError(r,i,'unknown property "%s"',l)]}; +},{"../error/validation_error":164,"./validate":170}],185:[function(require,module,exports){ +"use strict";var ValidationError=require("../error/validation_error"),unbundle=require("../util/unbundle_jsonlint"),validateObject=require("./validate_object"),validateEnum=require("./validate_enum");module.exports=function(e){var r=e.value,t=e.key,a=e.styleSpec,l=e.style;if(!r.type)return[new ValidationError(t,r,'"type" is required')];var u=unbundle(r.type);switch(u){case"vector":case"raster":var i=[];if(i=i.concat(validateObject({key:t,value:r,valueSpec:a.source_tile,style:e.style,styleSpec:a})),"url"in r)for(var s in r)["type","url","tileSize"].indexOf(s)<0&&i.push(new ValidationError(t+"."+s,r[s],'a source with a "url" property may not include a "%s" property',s));return i;case"geojson":return validateObject({key:t,value:r,valueSpec:a.source_geojson,style:l,styleSpec:a});case"video":return validateObject({key:t,value:r,valueSpec:a.source_video,style:l,styleSpec:a});case"image":return validateObject({key:t,value:r,valueSpec:a.source_image,style:l,styleSpec:a});default:return validateEnum({key:t+".type",value:r.type,valueSpec:{values:["vector","raster","geojson","video","image"]},style:l,styleSpec:a})}}; +},{"../error/validation_error":164,"../util/unbundle_jsonlint":169,"./validate_enum":175,"./validate_object":183}],186:[function(require,module,exports){ +"use strict";var getType=require("../util/get_type"),ValidationError=require("../error/validation_error");module.exports=function(r){var e=r.value,t=r.key,i=getType(e);return"string"!==i?[new ValidationError(t,e,"string expected, %s found",i)]:[]}; +},{"../error/validation_error":164,"../util/get_type":167}],187:[function(require,module,exports){ +"use strict";function validateStyleMin(e,a){a=a||latestStyleSpec;var t=[];return t=t.concat(validate({key:"",value:e,valueSpec:a.$root,styleSpec:a,style:e,objectElementValidators:{glyphs:validateGlyphsURL}})),a.$version>7&&e.constants&&(t=t.concat(validateConstants({key:"constants",value:e.constants,style:e,styleSpec:a}))),sortErrors(t)}function sortErrors(e){return[].concat(e).sort(function(e,a){return e.line-a.line})}function wrapCleanErrors(e){return function(){return sortErrors(e.apply(this,arguments))}}var validateConstants=require("./validate/validate_constants"),validate=require("./validate/validate"),latestStyleSpec=require("../reference/latest.min"),validateGlyphsURL=require("./validate/validate_glyphs_url");validateStyleMin.source=wrapCleanErrors(require("./validate/validate_source")),validateStyleMin.light=wrapCleanErrors(require("./validate/validate_light")),validateStyleMin.layer=wrapCleanErrors(require("./validate/validate_layer")),validateStyleMin.filter=wrapCleanErrors(require("./validate/validate_filter")),validateStyleMin.paintProperty=wrapCleanErrors(require("./validate/validate_paint_property")),validateStyleMin.layoutProperty=wrapCleanErrors(require("./validate/validate_layout_property")),module.exports=validateStyleMin; +},{"../reference/latest.min":188,"./validate/validate":170,"./validate/validate_constants":174,"./validate/validate_filter":176,"./validate/validate_glyphs_url":178,"./validate/validate_layer":179,"./validate/validate_layout_property":180,"./validate/validate_light":181,"./validate/validate_paint_property":184,"./validate/validate_source":185}],188:[function(require,module,exports){ +module.exports=require("./v8.min.json"); +},{"./v8.min.json":189}],189:[function(require,module,exports){ +module.exports={"$version":8,"$root":{"version":{"required":true,"type":"enum","values":[8]},"name":{"type":"string"},"metadata":{"type":"*"},"center":{"type":"array","value":"number"},"zoom":{"type":"number"},"bearing":{"type":"number","default":0,"period":360,"units":"degrees"},"pitch":{"type":"number","default":0,"units":"degrees"},"light":{"type":"light"},"sources":{"required":true,"type":"sources"},"sprite":{"type":"string"},"glyphs":{"type":"string"},"transition":{"type":"transition"},"layers":{"required":true,"type":"array","value":"layer"}},"sources":{"*":{"type":"source"}},"source":["source_tile","source_geojson","source_video","source_image"],"source_tile":{"type":{"required":true,"type":"enum","values":{"vector":{},"raster":{}}},"url":{"type":"string"},"tiles":{"type":"array","value":"string"},"minzoom":{"type":"number","default":0},"maxzoom":{"type":"number","default":22},"tileSize":{"type":"number","default":512,"units":"pixels"},"*":{"type":"*"}},"source_geojson":{"type":{"required":true,"type":"enum","values":{"geojson":{}}},"data":{"type":"*"},"maxzoom":{"type":"number","default":18},"buffer":{"type":"number","default":128,"maximum":512,"minimum":0},"tolerance":{"type":"number","default":0.375},"cluster":{"type":"boolean","default":false},"clusterRadius":{"type":"number","default":50,"minimum":0},"clusterMaxZoom":{"type":"number"}},"source_video":{"type":{"required":true,"type":"enum","values":{"video":{}}},"urls":{"required":true,"type":"array","value":"string"},"coordinates":{"required":true,"type":"array","length":4,"value":{"type":"array","length":2,"value":"number"}}},"source_image":{"type":{"required":true,"type":"enum","values":{"image":{}}},"url":{"required":true,"type":"string"},"coordinates":{"required":true,"type":"array","length":4,"value":{"type":"array","length":2,"value":"number"}}},"layer":{"id":{"type":"string","required":true},"type":{"type":"enum","values":{"fill":{},"line":{},"symbol":{},"circle":{},"fill-extrusion":{},"raster":{},"background":{}}},"metadata":{"type":"*"},"ref":{"type":"string"},"source":{"type":"string"},"source-layer":{"type":"string"},"minzoom":{"type":"number","minimum":0,"maximum":22},"maxzoom":{"type":"number","minimum":0,"maximum":22},"filter":{"type":"filter"},"layout":{"type":"layout"},"paint":{"type":"paint"},"paint.*":{"type":"paint"}},"layout":["layout_fill","layout_line","layout_circle","layout_fill-extrusion","layout_symbol","layout_raster","layout_background"],"layout_background":{"visibility":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"visible":{},"none":{}},"default":"visible"}},"layout_fill":{"visibility":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"visible":{},"none":{}},"default":"visible"}},"layout_circle":{"visibility":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"visible":{},"none":{}},"default":"visible"}},"layout_fill-extrusion":{"visibility":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"visible":{},"none":{}},"default":"visible"}},"layout_line":{"line-cap":{"type":"enum","function":"piecewise-constant","zoom-function":true,"property-function":true,"values":{"butt":{},"round":{},"square":{}},"default":"butt"},"line-join":{"type":"enum","function":"piecewise-constant","zoom-function":true,"property-function":true,"values":{"bevel":{},"round":{},"miter":{}},"default":"miter"},"line-miter-limit":{"type":"number","default":2,"function":"interpolated","zoom-function":true,"property-function":true,"requires":[{"line-join":"miter"}]},"line-round-limit":{"type":"number","default":1.05,"function":"interpolated","zoom-function":true,"property-function":true,"requires":[{"line-join":"round"}]},"visibility":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"visible":{},"none":{}},"default":"visible"}},"layout_symbol":{"symbol-placement":{"type":"enum","function":"piecewise-constant","zoom-function":true,"property-function":true,"values":{"point":{},"line":{}},"default":"point"},"symbol-spacing":{"type":"number","default":250,"minimum":1,"function":"interpolated","zoom-function":true,"property-function":true,"units":"pixels","requires":[{"symbol-placement":"line"}]},"symbol-avoid-edges":{"type":"boolean","function":"piecewise-constant","zoom-function":true,"property-function":true,"default":false},"icon-allow-overlap":{"type":"boolean","function":"piecewise-constant","zoom-function":true,"property-function":true,"default":false,"requires":["icon-image"]},"icon-ignore-placement":{"type":"boolean","function":"piecewise-constant","zoom-function":true,"property-function":true,"default":false,"requires":["icon-image"]},"icon-optional":{"type":"boolean","function":"piecewise-constant","zoom-function":true,"property-function":true,"default":false,"requires":["icon-image","text-field"]},"icon-rotation-alignment":{"type":"enum","function":"piecewise-constant","zoom-function":true,"property-function":true,"values":{"map":{},"viewport":{},"auto":{}},"default":"auto","requires":["icon-image"]},"icon-size":{"type":"number","default":1,"minimum":0,"function":"interpolated","zoom-function":true,"property-function":true,"requires":["icon-image"]},"icon-text-fit":{"type":"enum","function":"piecewise-constant","zoom-function":true,"property-function":false,"values":{"none":{},"width":{},"height":{},"both":{}},"default":"none","requires":["icon-image","text-field"]},"icon-text-fit-padding":{"type":"array","value":"number","length":4,"default":[0,0,0,0],"units":"pixels","function":"interpolated","zoom-function":true,"property-function":true,"requires":["icon-image","text-field",{"icon-text-fit":["both","width","height"]}]},"icon-image":{"type":"string","function":"piecewise-constant","zoom-function":true,"property-function":true,"tokens":true},"icon-rotate":{"type":"number","default":0,"period":360,"function":"interpolated","zoom-function":true,"property-function":true,"units":"degrees","requires":["icon-image"]},"icon-padding":{"type":"number","default":2,"minimum":0,"function":"interpolated","zoom-function":true,"property-function":true,"units":"pixels","requires":["icon-image"]},"icon-keep-upright":{"type":"boolean","function":"piecewise-constant","zoom-function":true,"property-function":true,"default":false,"requires":["icon-image",{"icon-rotation-alignment":"map"},{"symbol-placement":"line"}]},"icon-offset":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","zoom-function":true,"property-function":true,"requires":["icon-image"]},"text-pitch-alignment":{"type":"enum","function":"piecewise-constant","zoom-function":true,"property-function":true,"values":{"map":{},"viewport":{},"auto":{}},"default":"auto","requires":["text-field"]},"text-rotation-alignment":{"type":"enum","function":"piecewise-constant","zoom-function":true,"property-function":true,"values":{"map":{},"viewport":{},"auto":{}},"default":"auto","requires":["text-field"]},"text-field":{"type":"string","function":"piecewise-constant","zoom-function":true,"property-function":true,"default":"","tokens":true},"text-font":{"type":"array","value":"string","function":"piecewise-constant","zoom-function":true,"property-function":true,"default":["Open Sans Regular","Arial Unicode MS Regular"],"requires":["text-field"]},"text-size":{"type":"number","default":16,"minimum":0,"units":"pixels","function":"interpolated","zoom-function":true,"property-function":true,"requires":["text-field"]},"text-max-width":{"type":"number","default":10,"minimum":0,"units":"ems","function":"interpolated","zoom-function":true,"property-function":true,"requires":["text-field"]},"text-line-height":{"type":"number","default":1.2,"units":"ems","function":"interpolated","zoom-function":true,"property-function":true,"requires":["text-field"]},"text-letter-spacing":{"type":"number","default":0,"units":"ems","function":"interpolated","zoom-function":true,"property-function":true,"requires":["text-field"]},"text-justify":{"type":"enum","function":"piecewise-constant","zoom-function":true,"property-function":true,"values":{"left":{},"center":{},"right":{}},"default":"center","requires":["text-field"]},"text-anchor":{"type":"enum","function":"piecewise-constant","zoom-function":true,"property-function":true,"values":{"center":{},"left":{},"right":{},"top":{},"bottom":{},"top-left":{},"top-right":{},"bottom-left":{},"bottom-right":{}},"default":"center","requires":["text-field"]},"text-max-angle":{"type":"number","default":45,"units":"degrees","function":"interpolated","zoom-function":true,"property-function":true,"requires":["text-field",{"symbol-placement":"line"}]},"text-rotate":{"type":"number","default":0,"period":360,"units":"degrees","function":"interpolated","zoom-function":true,"property-function":true,"requires":["text-field"]},"text-padding":{"type":"number","default":2,"minimum":0,"units":"pixels","function":"interpolated","zoom-function":true,"property-function":true,"requires":["text-field"]},"text-keep-upright":{"type":"boolean","function":"piecewise-constant","zoom-function":true,"property-function":true,"default":true,"requires":["text-field",{"text-rotation-alignment":"map"},{"symbol-placement":"line"}]},"text-transform":{"type":"enum","function":"piecewise-constant","zoom-function":true,"property-function":true,"values":{"none":{},"uppercase":{},"lowercase":{}},"default":"none","requires":["text-field"]},"text-offset":{"type":"array","value":"number","units":"ems","function":"interpolated","zoom-function":true,"property-function":true,"length":2,"default":[0,0],"requires":["text-field"]},"text-allow-overlap":{"type":"boolean","function":"piecewise-constant","zoom-function":true,"property-function":true,"default":false,"requires":["text-field"]},"text-ignore-placement":{"type":"boolean","function":"piecewise-constant","zoom-function":true,"property-function":true,"default":false,"requires":["text-field"]},"text-optional":{"type":"boolean","function":"piecewise-constant","zoom-function":true,"property-function":true,"default":false,"requires":["text-field","icon-image"]},"visibility":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"visible":{},"none":{}},"default":"visible"}},"layout_raster":{"visibility":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"visible":{},"none":{}},"default":"visible"}},"filter":{"type":"array","value":"*"},"filter_operator":{"type":"enum","values":{"==":{},"!=":{},">":{},">=":{},"<":{},"<=":{},"in":{},"!in":{},"all":{},"any":{},"none":{},"has":{},"!has":{}}},"geometry_type":{"type":"enum","values":{"Point":{},"LineString":{},"Polygon":{}}},"function":{"stops":{"type":"array","value":"function_stop"},"base":{"type":"number","default":1,"minimum":0},"property":{"type":"string","default":"$zoom"},"type":{"type":"enum","values":{"identity":{},"exponential":{},"interval":{},"categorical":{}},"default":"exponential"},"colorSpace":{"type":"enum","values":{"rgb":{},"lab":{},"hcl":{}},"default":"rgb"}},"function_stop":{"type":"array","minimum":0,"maximum":22,"value":["number","color"],"length":2},"light":{"anchor":{"type":"enum","default":"viewport","values":{"map":{},"viewport":{}},"transition":false},"position":{"type":"array","default":[1.15,210,30],"length":3,"value":"number","transition":true,"function":"interpolated","zoom-function":true,"property-function":false},"color":{"type":"color","default":"#ffffff","function":"interpolated","zoom-function":true,"property-function":false,"transition":true},"intensity":{"type":"number","default":0.5,"minimum":0,"maximum":1,"function":"interpolated","zoom-function":true,"property-function":false,"transition":true}},"paint":["paint_fill","paint_line","paint_circle","paint_fill-extrusion","paint_symbol","paint_raster","paint_background"],"paint_fill":{"fill-antialias":{"type":"boolean","function":"piecewise-constant","zoom-function":true,"property-function":true,"default":true},"fill-opacity":{"type":"number","function":"interpolated","zoom-function":true,"property-function":true,"default":1,"minimum":0,"maximum":1,"transition":true},"fill-color":{"type":"color","default":"#000000","function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"requires":[{"!":"fill-pattern"}]},"fill-outline-color":{"type":"color","function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"requires":[{"!":"fill-pattern"},{"fill-antialias":true}]},"fill-translate":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"units":"pixels"},"fill-translate-anchor":{"type":"enum","function":"piecewise-constant","zoom-function":true,"property-function":true,"values":{"map":{},"viewport":{}},"default":"map","requires":["fill-translate"]},"fill-pattern":{"type":"string","function":"piecewise-constant","zoom-function":true,"property-function":true,"transition":true}},"paint_fill-extrusion":{"fill-extrusion-opacity":{"type":"number","function":"interpolated","zoom-function":true,"property-function":false,"default":1,"minimum":0,"maximum":1,"transition":true},"fill-extrusion-color":{"type":"color","default":"#000000","function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"requires":[{"!":"fill-pattern"}]},"fill-extrusion-translate":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","zoom-function":true,"property-function":false,"transition":true,"units":"pixels"},"fill-extrusion-translate-anchor":{"type":"enum","function":"piecewise-constant","zoom-function":true,"property-function":false,"values":{"map":{},"viewport":{}},"default":"map","requires":["fill-extrusion-translate"]},"fill-extrusion-pattern":{"type":"string","function":"piecewise-constant","zoom-function":true,"property-function":false,"transition":true},"fill-extrusion-height":{"type":"number","function":"interpolated","zoom-function":true,"property-function":true,"default":0,"minimum":0,"units":"meters","transition":true},"fill-extrusion-base":{"type":"number","function":"interpolated","zoom-function":true,"property-function":true,"default":0,"minimum":0,"units":"meters","transition":true,"requires":[{"<=":"fill-extrusion-height"}]}},"paint_line":{"line-opacity":{"type":"number","function":"interpolated","zoom-function":true,"property-function":true,"default":1,"minimum":0,"maximum":1,"transition":true},"line-color":{"type":"color","default":"#000000","function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"requires":[{"!":"line-pattern"}]},"line-translate":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"units":"pixels"},"line-translate-anchor":{"type":"enum","function":"piecewise-constant","zoom-function":true,"property-function":true,"values":{"map":{},"viewport":{}},"default":"map","requires":["line-translate"]},"line-width":{"type":"number","default":1,"minimum":0,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"units":"pixels"},"line-gap-width":{"type":"number","default":0,"minimum":0,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"units":"pixels"},"line-offset":{"type":"number","default":0,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"units":"pixels"},"line-blur":{"type":"number","default":0,"minimum":0,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"units":"pixels"},"line-dasharray":{"type":"array","value":"number","function":"piecewise-constant","zoom-function":true,"property-function":true,"minimum":0,"transition":true,"units":"line widths","requires":[{"!":"line-pattern"}]},"line-pattern":{"type":"string","function":"piecewise-constant","zoom-function":true,"property-function":true,"transition":true}},"paint_circle":{"circle-radius":{"type":"number","default":5,"minimum":0,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"units":"pixels"},"circle-color":{"type":"color","default":"#000000","function":"interpolated","zoom-function":true,"property-function":true,"transition":true},"circle-blur":{"type":"number","default":0,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true},"circle-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true},"circle-translate":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"units":"pixels"},"circle-translate-anchor":{"type":"enum","function":"piecewise-constant","zoom-function":true,"property-function":true,"values":{"map":{},"viewport":{}},"default":"map","requires":["circle-translate"]},"circle-pitch-scale":{"type":"enum","function":"piecewise-constant","zoom-function":true,"property-function":true,"values":{"map":{},"viewport":{}},"default":"map"}},"paint_symbol":{"icon-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"requires":["icon-image"]},"icon-color":{"type":"color","default":"#000000","function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"requires":["icon-image"]},"icon-halo-color":{"type":"color","default":"rgba(0, 0, 0, 0)","function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"requires":["icon-image"]},"icon-halo-width":{"type":"number","default":0,"minimum":0,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"units":"pixels","requires":["icon-image"]},"icon-halo-blur":{"type":"number","default":0,"minimum":0,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"units":"pixels","requires":["icon-image"]},"icon-translate":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"units":"pixels","requires":["icon-image"]},"icon-translate-anchor":{"type":"enum","function":"piecewise-constant","zoom-function":true,"property-function":true,"values":{"map":{},"viewport":{}},"default":"map","requires":["icon-image","icon-translate"]},"text-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"requires":["text-field"]},"text-color":{"type":"color","default":"#000000","function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"requires":["text-field"]},"text-halo-color":{"type":"color","default":"rgba(0, 0, 0, 0)","function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"requires":["text-field"]},"text-halo-width":{"type":"number","default":0,"minimum":0,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"units":"pixels","requires":["text-field"]},"text-halo-blur":{"type":"number","default":0,"minimum":0,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"units":"pixels","requires":["text-field"]},"text-translate":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"units":"pixels","requires":["text-field"]},"text-translate-anchor":{"type":"enum","function":"piecewise-constant","zoom-function":true,"property-function":true,"values":{"map":{},"viewport":{}},"default":"map","requires":["text-field","text-translate"]}},"paint_raster":{"raster-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"function":"interpolated","zoom-function":true,"transition":true},"raster-hue-rotate":{"type":"number","default":0,"period":360,"function":"interpolated","zoom-function":true,"transition":true,"units":"degrees"},"raster-brightness-min":{"type":"number","function":"interpolated","zoom-function":true,"default":0,"minimum":0,"maximum":1,"transition":true},"raster-brightness-max":{"type":"number","function":"interpolated","zoom-function":true,"default":1,"minimum":0,"maximum":1,"transition":true},"raster-saturation":{"type":"number","default":0,"minimum":-1,"maximum":1,"function":"interpolated","zoom-function":true,"transition":true},"raster-contrast":{"type":"number","default":0,"minimum":-1,"maximum":1,"function":"interpolated","zoom-function":true,"transition":true},"raster-fade-duration":{"type":"number","default":300,"minimum":0,"function":"interpolated","zoom-function":true,"transition":true,"units":"milliseconds"}},"paint_background":{"background-color":{"type":"color","default":"#000000","function":"interpolated","zoom-function":true,"transition":true,"requires":[{"!":"background-pattern"}]},"background-pattern":{"type":"string","function":"piecewise-constant","zoom-function":true,"transition":true},"background-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"function":"interpolated","zoom-function":true,"transition":true}},"transition":{"duration":{"type":"number","default":300,"minimum":0,"units":"milliseconds"},"delay":{"type":"number","default":0,"minimum":0,"units":"milliseconds"}}} +},{}],190:[function(require,module,exports){ +"use strict";function isSupported(e){return!!(isBrowser()&&isArraySupported()&&isFunctionSupported()&&isObjectSupported()&&isJSONSupported()&&isWorkerSupported()&&isUint8ClampedArraySupported()&&isWebGLSupportedCached(e&&e.failIfMajorPerformanceCaveat))}function isBrowser(){return"undefined"!=typeof window&&"undefined"!=typeof document}function isArraySupported(){return Array.prototype&&Array.prototype.every&&Array.prototype.filter&&Array.prototype.forEach&&Array.prototype.indexOf&&Array.prototype.lastIndexOf&&Array.prototype.map&&Array.prototype.some&&Array.prototype.reduce&&Array.prototype.reduceRight&&Array.isArray}function isFunctionSupported(){return Function.prototype&&Function.prototype.bind}function isObjectSupported(){return Object.keys&&Object.create&&Object.getPrototypeOf&&Object.getOwnPropertyNames&&Object.isSealed&&Object.isFrozen&&Object.isExtensible&&Object.getOwnPropertyDescriptor&&Object.defineProperty&&Object.defineProperties&&Object.seal&&Object.freeze&&Object.preventExtensions}function isJSONSupported(){return"JSON"in window&&"parse"in JSON&&"stringify"in JSON}function isWorkerSupported(){return"Worker"in window}function isUint8ClampedArraySupported(){return"Uint8ClampedArray"in window}function isWebGLSupportedCached(e){return void 0===isWebGLSupportedCache[e]&&(isWebGLSupportedCache[e]=isWebGLSupported(e)),isWebGLSupportedCache[e]}function isWebGLSupported(e){var t=document.createElement("canvas"),r=Object.create(isSupported.webGLContextAttributes);return r.failIfMajorPerformanceCaveat=e,t.probablySupportsContext?t.probablySupportsContext("webgl",r)||t.probablySupportsContext("experimental-webgl",r):t.supportsContext?t.supportsContext("webgl",r)||t.supportsContext("experimental-webgl",r):t.getContext("webgl",r)||t.getContext("experimental-webgl",r)}"undefined"!=typeof module&&module.exports?module.exports=isSupported:window&&(window.mapboxgl=window.mapboxgl||{},window.mapboxgl.supported=isSupported);var isWebGLSupportedCache={};isSupported.webGLContextAttributes={antialias:!1,alpha:!0,stencil:!0,depth:!0}; +},{}],191:[function(require,module,exports){ +(function (process){ +function normalizeArray(r,t){for(var e=0,n=r.length-1;n>=0;n--){var s=r[n];"."===s?r.splice(n,1):".."===s?(r.splice(n,1),e++):e&&(r.splice(n,1),e--)}if(t)for(;e--;e)r.unshift("..");return r}function filter(r,t){if(r.filter)return r.filter(t);for(var e=[],n=0;n=-1&&!t;e--){var n=e>=0?arguments[e]:process.cwd();if("string"!=typeof n)throw new TypeError("Arguments to path.resolve must be strings");n&&(r=n+"/"+r,t="/"===n.charAt(0))}return r=normalizeArray(filter(r.split("/"),function(r){return!!r}),!t).join("/"),(t?"/":"")+r||"."},exports.normalize=function(r){var t=exports.isAbsolute(r),e="/"===substr(r,-1);return r=normalizeArray(filter(r.split("/"),function(r){return!!r}),!t).join("/"),r||t||(r="."),r&&e&&(r+="/"),(t?"/":"")+r},exports.isAbsolute=function(r){return"/"===r.charAt(0)},exports.join=function(){var r=Array.prototype.slice.call(arguments,0);return exports.normalize(filter(r,function(r,t){if("string"!=typeof r)throw new TypeError("Arguments to path.join must be strings");return r}).join("/"))},exports.relative=function(r,t){function e(r){for(var t=0;t=0&&""===r[e];e--);return t>e?[]:r.slice(t,e-t+1)}r=exports.resolve(r).substr(1),t=exports.resolve(t).substr(1);for(var n=e(r.split("/")),s=e(t.split("/")),i=Math.min(n.length,s.length),o=i,u=0;u55295&&e<57344){if(!r){e>56319||o+1===n?i.push(239,191,189):r=e;continue}if(e<56320){i.push(239,191,189),r=e;continue}e=r-55296<<10|e-56320|65536,r=null}else r&&(i.push(239,191,189),r=null);e<128?i.push(e):e<2048?i.push(e>>6|192,63&e|128):e<65536?i.push(e>>12|224,e>>6&63|128,63&e|128):i.push(e>>18|240,e>>12&63|128,e>>6&63|128,63&e|128)}return i}module.exports=Buffer;var ieee754=require("ieee754"),BufferMethods,lastStr,lastStrEncoded;BufferMethods={readUInt32LE:function(t){return(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},writeUInt32LE:function(t,e){this[e]=t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24},readInt32LE:function(t){return(this[t]|this[t+1]<<8|this[t+2]<<16)+(this[t+3]<<24)},readFloatLE:function(t){return ieee754.read(this,t,!0,23,4)},readDoubleLE:function(t){return ieee754.read(this,t,!0,52,8)},writeFloatLE:function(t,e){return ieee754.write(this,t,e,!0,23,4)},writeDoubleLE:function(t,e){return ieee754.write(this,t,e,!0,52,8)},toString:function(t,e,r){var n="",i="";e=e||0,r=Math.min(this.length,r||this.length);for(var o=e;o=1;){if(i.pos>=e)throw new Error("Given varint doesn't fit into 10 bytes");var r=255&t;i.buf[i.pos++]=r|(t>=128?128:0),t/=128}}function reallocForRawMessage(t,i,e){var r=i<=16383?1:i<=2097151?2:i<=268435455?3:Math.ceil(Math.log(i)/(7*Math.LN2));e.realloc(r);for(var s=e.pos-1;s>=t;s--)e.buf[s+r]=e.buf[s]}function writePackedVarint(t,i){for(var e=0;e>3,n=this.pos;t(s,i,this),this.pos===n&&this.skip(r)}return i},readMessage:function(t,i){return this.readFields(t,i,this.readVarint()+this.pos)},readFixed32:function(){var t=this.buf.readUInt32LE(this.pos);return this.pos+=4,t},readSFixed32:function(){var t=this.buf.readInt32LE(this.pos);return this.pos+=4,t},readFixed64:function(){var t=this.buf.readUInt32LE(this.pos)+this.buf.readUInt32LE(this.pos+4)*SHIFT_LEFT_32;return this.pos+=8,t},readSFixed64:function(){var t=this.buf.readUInt32LE(this.pos)+this.buf.readInt32LE(this.pos+4)*SHIFT_LEFT_32;return this.pos+=8,t},readFloat:function(){var t=this.buf.readFloatLE(this.pos);return this.pos+=4,t},readDouble:function(){var t=this.buf.readDoubleLE(this.pos);return this.pos+=8,t},readVarint:function(){var t,i,e=this.buf;return i=e[this.pos++],t=127&i,i<128?t:(i=e[this.pos++],t|=(127&i)<<7,i<128?t:(i=e[this.pos++],t|=(127&i)<<14,i<128?t:(i=e[this.pos++],t|=(127&i)<<21,i<128?t:readVarintRemainder(t,this))))},readVarint64:function(){var t=this.pos,i=this.readVarint();if(i127;);else if(i===Pbf.Bytes)this.pos=this.readVarint()+this.pos;else if(i===Pbf.Fixed32)this.pos+=4;else{if(i!==Pbf.Fixed64)throw new Error("Unimplemented type: "+i);this.pos+=8}},writeTag:function(t,i){this.writeVarint(t<<3|i)},realloc:function(t){for(var i=this.length||16;i268435455?void writeBigVarint(t,this):(this.realloc(4),this.buf[this.pos++]=127&t|(t>127?128:0),void(t<=127||(this.buf[this.pos++]=127&(t>>>=7)|(t>127?128:0),t<=127||(this.buf[this.pos++]=127&(t>>>=7)|(t>127?128:0),t<=127||(this.buf[this.pos++]=t>>>7&127)))))},writeSVarint:function(t){this.writeVarint(t<0?2*-t-1:2*t)},writeBoolean:function(t){this.writeVarint(Boolean(t))},writeString:function(t){t=String(t);var i=Buffer.byteLength(t);this.writeVarint(i),this.realloc(i),this.buf.write(t,this.pos),this.pos+=i},writeFloat:function(t){this.realloc(4),this.buf.writeFloatLE(t,this.pos),this.pos+=4},writeDouble:function(t){this.realloc(8),this.buf.writeDoubleLE(t,this.pos),this.pos+=8},writeBytes:function(t){var i=t.length;this.writeVarint(i),this.realloc(i);for(var e=0;e=128&&reallocForRawMessage(e,r,this),this.pos=e-1,this.writeVarint(r),this.pos+=r},writeMessage:function(t,i,e){this.writeTag(t,Pbf.Bytes),this.writeRawMessage(i,e)},writePackedVarint:function(t,i){this.writeMessage(t,writePackedVarint,i)},writePackedSVarint:function(t,i){this.writeMessage(t,writePackedSVarint,i)},writePackedBoolean:function(t,i){this.writeMessage(t,writePackedBoolean,i)},writePackedFloat:function(t,i){this.writeMessage(t,writePackedFloat,i)},writePackedDouble:function(t,i){this.writeMessage(t,writePackedDouble,i)},writePackedFixed32:function(t,i){this.writeMessage(t,writePackedFixed32,i)},writePackedSFixed32:function(t,i){this.writeMessage(t,writePackedSFixed32,i)},writePackedFixed64:function(t,i){this.writeMessage(t,writePackedFixed64,i)},writePackedSFixed64:function(t,i){this.writeMessage(t,writePackedSFixed64,i)},writeBytesField:function(t,i){this.writeTag(t,Pbf.Bytes),this.writeBytes(i)},writeFixed32Field:function(t,i){this.writeTag(t,Pbf.Fixed32),this.writeFixed32(i)},writeSFixed32Field:function(t,i){this.writeTag(t,Pbf.Fixed32),this.writeSFixed32(i)},writeFixed64Field:function(t,i){this.writeTag(t,Pbf.Fixed64),this.writeFixed64(i)},writeSFixed64Field:function(t,i){this.writeTag(t,Pbf.Fixed64),this.writeSFixed64(i)},writeVarintField:function(t,i){this.writeTag(t,Pbf.Varint),this.writeVarint(i)},writeSVarintField:function(t,i){this.writeTag(t,Pbf.Varint),this.writeSVarint(i)},writeStringField:function(t,i){this.writeTag(t,Pbf.Bytes),this.writeString(i)},writeFloatField:function(t,i){this.writeTag(t,Pbf.Fixed32),this.writeFloat(i)},writeDoubleField:function(t,i){this.writeTag(t,Pbf.Fixed64),this.writeDouble(i)},writeBooleanField:function(t,i){this.writeVarintField(t,Boolean(i))}}; +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{"./buffer":192}],194:[function(require,module,exports){ +"use strict";function Point(t,n){this.x=t,this.y=n}module.exports=Point,Point.prototype={clone:function(){return new Point(this.x,this.y)},add:function(t){return this.clone()._add(t)},sub:function(t){return this.clone()._sub(t)},mult:function(t){return this.clone()._mult(t)},div:function(t){return this.clone()._div(t)},rotate:function(t){return this.clone()._rotate(t)},matMult:function(t){return this.clone()._matMult(t)},unit:function(){return this.clone()._unit()},perp:function(){return this.clone()._perp()},round:function(){return this.clone()._round()},mag:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},equals:function(t){return this.x===t.x&&this.y===t.y},dist:function(t){return Math.sqrt(this.distSqr(t))},distSqr:function(t){var n=t.x-this.x,i=t.y-this.y;return n*n+i*i},angle:function(){return Math.atan2(this.y,this.x)},angleTo:function(t){return Math.atan2(this.y-t.y,this.x-t.x)},angleWith:function(t){return this.angleWithSep(t.x,t.y)},angleWithSep:function(t,n){return Math.atan2(this.x*n-this.y*t,this.x*t+this.y*n)},_matMult:function(t){var n=t[0]*this.x+t[1]*this.y,i=t[2]*this.x+t[3]*this.y;return this.x=n,this.y=i,this},_add:function(t){return this.x+=t.x,this.y+=t.y,this},_sub:function(t){return this.x-=t.x,this.y-=t.y,this},_mult:function(t){return this.x*=t,this.y*=t,this},_div:function(t){return this.x/=t,this.y/=t,this},_unit:function(){return this._div(this.mag()),this},_perp:function(){var t=this.y;return this.y=this.x,this.x=-t,this},_rotate:function(t){var n=Math.cos(t),i=Math.sin(t),s=n*this.x-i*this.y,r=i*this.x+n*this.y;return this.x=s,this.y=r,this},_round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}},Point.convert=function(t){return t instanceof Point?t:Array.isArray(t)?new Point(t[0],t[1]):t}; +},{}],195:[function(require,module,exports){ +function defaultSetTimout(){throw new Error("setTimeout has not been defined")}function defaultClearTimeout(){throw new Error("clearTimeout has not been defined")}function runTimeout(e){if(cachedSetTimeout===setTimeout)return setTimeout(e,0);if((cachedSetTimeout===defaultSetTimout||!cachedSetTimeout)&&setTimeout)return cachedSetTimeout=setTimeout,setTimeout(e,0);try{return cachedSetTimeout(e,0)}catch(t){try{return cachedSetTimeout.call(null,e,0)}catch(t){return cachedSetTimeout.call(this,e,0)}}}function runClearTimeout(e){if(cachedClearTimeout===clearTimeout)return clearTimeout(e);if((cachedClearTimeout===defaultClearTimeout||!cachedClearTimeout)&&clearTimeout)return cachedClearTimeout=clearTimeout,clearTimeout(e);try{return cachedClearTimeout(e)}catch(t){try{return cachedClearTimeout.call(null,e)}catch(t){return cachedClearTimeout.call(this,e)}}}function cleanUpNextTick(){draining&¤tQueue&&(draining=!1,currentQueue.length?queue=currentQueue.concat(queue):queueIndex=-1,queue.length&&drainQueue())}function drainQueue(){if(!draining){var e=runTimeout(cleanUpNextTick);draining=!0;for(var t=queue.length;t;){for(currentQueue=queue,queue=[];++queueIndex1)for(var u=1;ur;){if(o-r>600){var f=o-r+1,e=t-r+1,l=Math.log(f),s=.5*Math.exp(2*l/3),i=.5*Math.sqrt(l*s*(f-s)/f)*(e-f/2<0?-1:1),n=Math.max(r,Math.floor(t-e*s/f+i)),h=Math.min(o,Math.floor(t+(f-e)*s/f+i));partialSort(a,t,n,h,p)}var u=a[t],M=r,w=o;for(swap(a,r,t),p(a[o],u)>0&&swap(a,r,o);M0;)w--}0===p(a[r],u)?swap(a,r,w):(w++,swap(a,w,o)),w<=t&&(r=w+1),t<=w&&(o=w-1)}}function swap(a,t,r){var o=a[t];a[t]=a[r],a[r]=o}function defaultCompare(a,t){return at?1:0}module.exports=partialSort; +},{}],197:[function(require,module,exports){ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):t.ShelfPack=e()}(this,function(){function t(t,e,s){s=s||{},this.w=t||64,this.h=e||64,this.autoResize=!!s.autoResize,this.shelves=[],this.stats={},this.count=function(t){this.stats[t]=(0|this.stats[t])+1}}function e(t,e,s){this.x=0,this.y=t,this.w=this.free=e,this.h=s}return t.prototype.pack=function(t,e){t=[].concat(t),e=e||{};for(var s,h,i,n=[],r=0;r0){for(var o=0,f=0,u=0;uh.h||t>h.free||sl)&&(a=2*Math.max(t,l)),(ff)&&(u=2*Math.max(s,f)),this.resize(a,u),this.packOne(t,s)}return null},t.prototype.clear=function(){this.shelves=[],this.stats={}},t.prototype.resize=function(t,e){this.w=t,this.h=e;for(var s=0;sthis.free||e>this.h)return null;var s=this.x;return this.x+=t,this.free-=t,{x:s,y:this.y,w:t,h:e,width:t,height:e}},e.prototype.resize=function(t){return this.free+=t-this.w,this.w=t,!0},t}); +},{}],198:[function(require,module,exports){ +"use strict";function supercluster(t){return new SuperCluster(t)}function SuperCluster(t){this.options=extend(Object.create(this.options),t),this.trees=new Array(this.options.maxZoom+1)}function createCluster(t,e,o,n){return{x:t,y:e,zoom:1/0,id:n,numPoints:o}}function createPointCluster(t,e){var o=t.geometry.coordinates;return createCluster(lngX(o[0]),latY(o[1]),1,e)}function getClusterJSON(t){return{type:"Feature",properties:getClusterProperties(t),geometry:{type:"Point",coordinates:[xLng(t.x),yLat(t.y)]}}}function getClusterProperties(t){var e=t.numPoints,o=e>=1e4?Math.round(e/1e3)+"k":e>=1e3?Math.round(e/100)/10+"k":e;return{cluster:!0,point_count:e,point_count_abbreviated:o}}function lngX(t){return t/360+.5}function latY(t){var e=Math.sin(t*Math.PI/180),o=.5-.25*Math.log((1+e)/(1-e))/Math.PI;return o<0?0:o>1?1:o}function xLng(t){return 360*(t-.5)}function yLat(t){var e=(180-360*t)*Math.PI/180;return 360*Math.atan(Math.exp(e))/Math.PI-90}function extend(t,e){for(var o in e)t[o]=e[o];return t}function getX(t){return t.x}function getY(t){return t.y}var kdbush=require("kdbush");module.exports=supercluster,SuperCluster.prototype={options:{minZoom:0,maxZoom:16,radius:40,extent:512,nodeSize:64,log:!1},load:function(t){var e=this.options.log;e&&console.time("total time");var o="prepare "+t.length+" points";e&&console.time(o),this.points=t;var n=t.map(createPointCluster);e&&console.timeEnd(o);for(var r=this.options.maxZoom;r>=this.options.minZoom;r--){var i=+Date.now();this.trees[r+1]=kdbush(n,getX,getY,this.options.nodeSize,Float32Array),n=this._cluster(n,r),e&&console.log("z%d: %d clusters in %dms",r,n.length,+Date.now()-i)}return this.trees[this.options.minZoom]=kdbush(n,getX,getY,this.options.nodeSize,Float32Array),e&&console.timeEnd("total time"),this},getClusters:function(t,e){for(var o=this.trees[this._limitZoom(e)],n=o.range(lngX(t[0]),latY(t[3]),lngX(t[2]),latY(t[1])),r=[],i=0;i=0;a--)this._down(a)}function defaultCompare(t,i){return ti?1:0}function swap(t,i,a){var n=t[i];t[i]=t[a],t[a]=n}module.exports=TinyQueue,TinyQueue.prototype={push:function(t){this.data.push(t),this.length++,this._up(this.length-1)},pop:function(){var t=this.data[0];return this.data[0]=this.data[this.length-1],this.length--,this.data.pop(),this._down(0),t},peek:function(){return this.data[0]},_up:function(t){for(var i=this.data,a=this.compare;t>0;){var n=Math.floor((t-1)/2);if(!(a(i[t],i[n])<0))break;swap(i,n,t),t=n}},_down:function(t){for(var i=this.data,a=this.compare,n=this.length;;){var e=2*t+1,h=e+1,s=t;if(er)return r;for(;eh?e=s:r=s,s=.5*(r-e)+e}return s},UnitBezier.prototype.solve=function(t,i){return this.sampleCurveY(this.solveCurveX(t,i))}; +},{}],201:[function(require,module,exports){ +"function"==typeof Object.create?module.exports=function(t,e){t.super_=e,t.prototype=Object.create(e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}})}:module.exports=function(t,e){t.super_=e;var o=function(){};o.prototype=e.prototype,t.prototype=new o,t.prototype.constructor=t}; +},{}],202:[function(require,module,exports){ +module.exports=function(o){return o&&"object"==typeof o&&"function"==typeof o.copy&&"function"==typeof o.fill&&"function"==typeof o.readUInt8}; +},{}],203:[function(require,module,exports){ +(function (process,global){ +function inspect(e,r){var t={seen:[],stylize:stylizeNoColor};return arguments.length>=3&&(t.depth=arguments[2]),arguments.length>=4&&(t.colors=arguments[3]),isBoolean(r)?t.showHidden=r:r&&exports._extend(t,r),isUndefined(t.showHidden)&&(t.showHidden=!1),isUndefined(t.depth)&&(t.depth=2),isUndefined(t.colors)&&(t.colors=!1),isUndefined(t.customInspect)&&(t.customInspect=!0),t.colors&&(t.stylize=stylizeWithColor),formatValue(t,e,t.depth)}function stylizeWithColor(e,r){var t=inspect.styles[r];return t?"["+inspect.colors[t][0]+"m"+e+"["+inspect.colors[t][1]+"m":e}function stylizeNoColor(e,r){return e}function arrayToHash(e){var r={};return e.forEach(function(e,t){r[e]=!0}),r}function formatValue(e,r,t){if(e.customInspect&&r&&isFunction(r.inspect)&&r.inspect!==exports.inspect&&(!r.constructor||r.constructor.prototype!==r)){var n=r.inspect(t,e);return isString(n)||(n=formatValue(e,n,t)),n}var i=formatPrimitive(e,r);if(i)return i;var o=Object.keys(r),s=arrayToHash(o);if(e.showHidden&&(o=Object.getOwnPropertyNames(r)),isError(r)&&(o.indexOf("message")>=0||o.indexOf("description")>=0))return formatError(r);if(0===o.length){if(isFunction(r)){var u=r.name?": "+r.name:"";return e.stylize("[Function"+u+"]","special")}if(isRegExp(r))return e.stylize(RegExp.prototype.toString.call(r),"regexp");if(isDate(r))return e.stylize(Date.prototype.toString.call(r),"date");if(isError(r))return formatError(r)}var c="",a=!1,l=["{","}"];if(isArray(r)&&(a=!0,l=["[","]"]),isFunction(r)){var p=r.name?": "+r.name:"";c=" [Function"+p+"]"}if(isRegExp(r)&&(c=" "+RegExp.prototype.toString.call(r)),isDate(r)&&(c=" "+Date.prototype.toUTCString.call(r)),isError(r)&&(c=" "+formatError(r)),0===o.length&&(!a||0==r.length))return l[0]+c+l[1];if(t<0)return isRegExp(r)?e.stylize(RegExp.prototype.toString.call(r),"regexp"):e.stylize("[Object]","special");e.seen.push(r);var f;return f=a?formatArray(e,r,t,s,o):o.map(function(n){return formatProperty(e,r,t,s,n,a)}),e.seen.pop(),reduceToSingleString(f,c,l)}function formatPrimitive(e,r){if(isUndefined(r))return e.stylize("undefined","undefined");if(isString(r)){var t="'"+JSON.stringify(r).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return e.stylize(t,"string")}return isNumber(r)?e.stylize(""+r,"number"):isBoolean(r)?e.stylize(""+r,"boolean"):isNull(r)?e.stylize("null","null"):void 0}function formatError(e){return"["+Error.prototype.toString.call(e)+"]"}function formatArray(e,r,t,n,i){for(var o=[],s=0,u=r.length;s-1&&(u=o?u.split("\n").map(function(e){return" "+e}).join("\n").substr(2):"\n"+u.split("\n").map(function(e){return" "+e}).join("\n"))):u=e.stylize("[Circular]","special")),isUndefined(s)){if(o&&i.match(/^\d+$/))return u;s=JSON.stringify(""+i),s.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(s=s.substr(1,s.length-2),s=e.stylize(s,"name")):(s=s.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),s=e.stylize(s,"string"))}return s+": "+u}function reduceToSingleString(e,r,t){var n=0,i=e.reduce(function(e,r){return n++,r.indexOf("\n")>=0&&n++,e+r.replace(/\u001b\[\d\d?m/g,"").length+1},0);return i>60?t[0]+(""===r?"":r+"\n ")+" "+e.join(",\n ")+" "+t[1]:t[0]+r+" "+e.join(", ")+" "+t[1]}function isArray(e){return Array.isArray(e)}function isBoolean(e){return"boolean"==typeof e}function isNull(e){return null===e}function isNullOrUndefined(e){return null==e}function isNumber(e){return"number"==typeof e}function isString(e){return"string"==typeof e}function isSymbol(e){return"symbol"==typeof e}function isUndefined(e){return void 0===e}function isRegExp(e){return isObject(e)&&"[object RegExp]"===objectToString(e)}function isObject(e){return"object"==typeof e&&null!==e}function isDate(e){return isObject(e)&&"[object Date]"===objectToString(e)}function isError(e){return isObject(e)&&("[object Error]"===objectToString(e)||e instanceof Error)}function isFunction(e){return"function"==typeof e}function isPrimitive(e){return null===e||"boolean"==typeof e||"number"==typeof e||"string"==typeof e||"symbol"==typeof e||"undefined"==typeof e}function objectToString(e){return Object.prototype.toString.call(e)}function pad(e){return e<10?"0"+e.toString(10):e.toString(10)}function timestamp(){var e=new Date,r=[pad(e.getHours()),pad(e.getMinutes()),pad(e.getSeconds())].join(":");return[e.getDate(),months[e.getMonth()],r].join(" ")}function hasOwnProperty(e,r){return Object.prototype.hasOwnProperty.call(e,r)}var formatRegExp=/%[sdj%]/g;exports.format=function(e){if(!isString(e)){for(var r=[],t=0;t=i)return e;switch(e){case"%s":return String(n[t++]);case"%d":return Number(n[t++]);case"%j":try{return JSON.stringify(n[t++])}catch(e){return"[Circular]"}default:return e}}),s=n[t];t>3}if(a--,1===i||2===i)o+=e.readSVarint(),n+=e.readSVarint(),1===i&&(t&&s.push(t),t=[]),t.push(new Point(o,n));else{if(7!==i)throw new Error("unknown command "+i);t&&t.push(t[0].clone())}}return t&&s.push(t),s},VectorTileFeature.prototype.bbox=function(){var e=this._pbf;e.pos=this._geometry;for(var t=e.readVarint()+e.pos,r=1,i=0,a=0,o=0,n=1/0,s=-(1/0),p=1/0,h=-(1/0);e.pos>3}if(i--,1===r||2===r)a+=e.readSVarint(),o+=e.readSVarint(),as&&(s=a),oh&&(h=o);else if(7!==r)throw new Error("unknown command "+r)}return[n,p,s,h]},VectorTileFeature.prototype.toGeoJSON=function(e,t,r){function i(e){for(var t=0;t>3;t=1===a?e.readString():2===a?e.readFloat():3===a?e.readDouble():4===a?e.readVarint64():5===a?e.readVarint():6===a?e.readSVarint():7===a?e.readBoolean():null}return t}var VectorTileFeature=require("./vectortilefeature.js");module.exports=VectorTileLayer,VectorTileLayer.prototype.feature=function(e){if(e<0||e>=this._features.length)throw new Error("feature index out of bounds");this._pbf.pos=this._features[e];var t=this._pbf.readVarint()+this._pbf.pos;return new VectorTileFeature(this._pbf,t,this.extent,this._keys,this._values)}; +},{"./vectortilefeature.js":206}],208:[function(require,module,exports){ +function fromVectorTileJs(e){var r=[];for(var o in e.layers)r.push(prepareLayer(e.layers[o]));var t=new Pbf;return vtpb.tile.write({layers:r},t),t.finish()}function fromGeojsonVt(e){var r={};for(var o in e)r[o]=new GeoJSONWrapper(e[o].features),r[o].name=o;return fromVectorTileJs({layers:r})}function prepareLayer(e){for(var r={name:e.name||"",version:e.version||1,extent:e.extent||4096,keys:[],values:[],features:[]},o={},t={},n=0;n>31}function encodeGeometry(e){for(var r=[],o=0,t=0,n=e.length,a=0;a button { + width: 30px; + height: 30px; + display: block; + padding: 0; + outline: none; + border: none; + border-bottom: 1px solid #ddd; + box-sizing: border-box; + background-color: rgba(0,0,0,0); + cursor: pointer; +} +/* https://bugzilla.mozilla.org/show_bug.cgi?id=140562 */ +.mapboxgl-ctrl > button::-moz-focus-inner { + border: 0; + padding: 0; +} +.mapboxgl-ctrl > button:last-child { + border-bottom: 0; +} +.mapboxgl-ctrl > button:hover { + background-color: rgba(0,0,0,0.05); +} +.mapboxgl-ctrl-icon, +.mapboxgl-ctrl-icon > span.arrow { + speak: none; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.mapboxgl-ctrl-icon { + padding: 5px; +} +.mapboxgl-ctrl-icon.mapboxgl-ctrl-zoom-out { + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg%20viewBox%3D%270%200%2020%2020%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%0A%20%20%3Cpath%20style%3D%27fill%3A%23333333%3B%27%20d%3D%27m%207%2C9%20c%20-0.554%2C0%20-1%2C0.446%20-1%2C1%200%2C0.554%200.446%2C1%201%2C1%20l%206%2C0%20c%200.554%2C0%201%2C-0.446%201%2C-1%200%2C-0.554%20-0.446%2C-1%20-1%2C-1%20z%27%20%2F%3E%0A%3C%2Fsvg%3E%0A"); +} +.mapboxgl-ctrl-icon.mapboxgl-ctrl-zoom-in { + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg%20viewBox%3D%270%200%2020%2020%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%0A%20%20%3Cpath%20style%3D%27fill%3A%23333333%3B%27%20d%3D%27M%2010%206%20C%209.446%206%209%206.4459904%209%207%20L%209%209%20L%207%209%20C%206.446%209%206%209.446%206%2010%20C%206%2010.554%206.446%2011%207%2011%20L%209%2011%20L%209%2013%20C%209%2013.55401%209.446%2014%2010%2014%20C%2010.554%2014%2011%2013.55401%2011%2013%20L%2011%2011%20L%2013%2011%20C%2013.554%2011%2014%2010.554%2014%2010%20C%2014%209.446%2013.554%209%2013%209%20L%2011%209%20L%2011%207%20C%2011%206.4459904%2010.554%206%2010%206%20z%27%20%2F%3E%0A%3C%2Fsvg%3E%0A"); +} +.mapboxgl-ctrl-icon.mapboxgl-ctrl-geolocate { + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D%270%200%2020%2020%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%0D%0A%20%20%3Cpath%20style%3D%27fill%3A%23333%3B%27%20d%3D%27M10%204C9%204%209%205%209%205L9%205.1A5%205%200%200%200%205.1%209L5%209C5%209%204%209%204%2010%204%2011%205%2011%205%2011L5.1%2011A5%205%200%200%200%209%2014.9L9%2015C9%2015%209%2016%2010%2016%2011%2016%2011%2015%2011%2015L11%2014.9A5%205%200%200%200%2014.9%2011L15%2011C15%2011%2016%2011%2016%2010%2016%209%2015%209%2015%209L14.9%209A5%205%200%200%200%2011%205.1L11%205C11%205%2011%204%2010%204zM10%206.5A3.5%203.5%200%200%201%2013.5%2010%203.5%203.5%200%200%201%2010%2013.5%203.5%203.5%200%200%201%206.5%2010%203.5%203.5%200%200%201%2010%206.5zM10%208.3A1.8%201.8%200%200%200%208.3%2010%201.8%201.8%200%200%200%2010%2011.8%201.8%201.8%200%200%200%2011.8%2010%201.8%201.8%200%200%200%2010%208.3z%27%20%2F%3E%0D%0A%3C%2Fsvg%3E"); +} +.mapboxgl-ctrl-icon.mapboxgl-ctrl-geolocate.watching { + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D%270%200%2020%2020%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%0D%0A%20%20%3Cpath%20style%3D%27fill%3A%2300f%3B%27%20d%3D%27M10%204C9%204%209%205%209%205L9%205.1A5%205%200%200%200%205.1%209L5%209C5%209%204%209%204%2010%204%2011%205%2011%205%2011L5.1%2011A5%205%200%200%200%209%2014.9L9%2015C9%2015%209%2016%2010%2016%2011%2016%2011%2015%2011%2015L11%2014.9A5%205%200%200%200%2014.9%2011L15%2011C15%2011%2016%2011%2016%2010%2016%209%2015%209%2015%209L14.9%209A5%205%200%200%200%2011%205.1L11%205C11%205%2011%204%2010%204zM10%206.5A3.5%203.5%200%200%201%2013.5%2010%203.5%203.5%200%200%201%2010%2013.5%203.5%203.5%200%200%201%206.5%2010%203.5%203.5%200%200%201%2010%206.5zM10%208.3A1.8%201.8%200%200%200%208.3%2010%201.8%201.8%200%200%200%2010%2011.8%201.8%201.8%200%200%200%2011.8%2010%201.8%201.8%200%200%200%2010%208.3z%27%20%2F%3E%0D%0A%3C%2Fsvg%3E"); +} + +.mapboxgl-ctrl-icon.mapboxgl-ctrl-compass > span.arrow { + width: 20px; + height: 20px; + margin: 5px; + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%0A%09%3Cpolygon%20fill%3D%27%23333333%27%20points%3D%276%2C9%2010%2C1%2014%2C9%27%2F%3E%0A%09%3Cpolygon%20fill%3D%27%23CCCCCC%27%20points%3D%276%2C11%2010%2C19%2014%2C11%20%27%2F%3E%0A%3C%2Fsvg%3E"); + background-repeat: no-repeat; + display: inline-block; +} + +.mapboxgl-ctrl.mapboxgl-ctrl-attrib { + padding: 0 5px; + background-color: rgba(255, 255, 255, .5); + margin: 0; +} +.mapboxgl-ctrl-attrib.compact { + padding-top: 2px; + padding-bottom: 2px; + margin: 0 10px 10px 10px; + position: relative; + padding-right: 24px; + background-color: #fff; + border-radius: 3px 12px 12px 3px; + visibility: hidden; +} +.mapboxgl-ctrl-attrib.compact:hover { + visibility: visible; +} +.mapboxgl-ctrl-attrib.compact:after { + content: ''; + cursor: pointer; + position: absolute; + bottom: 0; + right: 0; + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D%270%200%2020%2020%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%0D%0A%09%3Cpath%20fill%3D%27%23333333%27%20fill-rule%3D%27evenodd%27%20d%3D%27M4%2C10a6%2C6%200%201%2C0%2012%2C0a6%2C6%200%201%2C0%20-12%2C0%20M9%2C7a1%2C1%200%201%2C0%202%2C0a1%2C1%200%201%2C0%20-2%2C0%20M9%2C10a1%2C1%200%201%2C1%202%2C0l0%2C3a1%2C1%200%201%2C1%20-2%2C0%27%20%2F%3E%0D%0A%3C%2Fsvg%3E"); + background-color: rgba(255, 255, 255, .5); + width: 24px; + height: 24px; + box-sizing: border-box; + visibility: visible; + border-radius: 12px; +} +.mapboxgl-ctrl-attrib a { + color: rgba(0,0,0,0.75); + text-decoration: none; +} +.mapboxgl-ctrl-attrib a:hover { + color: inherit; + text-decoration: underline; +} +.mapboxgl-ctrl-attrib .mapbox-improve-map { + font-weight: bold; + margin-left: 2px; +} + +.mapboxgl-ctrl-scale { + background-color: rgba(255,255,255,0.75); + font-size: 10px; + border-width: medium 2px 2px; + border-style: none solid solid; + border-color: #333; + padding: 0 5px; + color: #333; +} + +.mapboxgl-popup { + position: absolute; + top: 0; + left: 0; + display: -webkit-flex; + display: flex; + will-change: transform; + pointer-events: none; +} +.mapboxgl-popup-anchor-top, +.mapboxgl-popup-anchor-top-left, +.mapboxgl-popup-anchor-top-right { + -webkit-flex-direction: column; + flex-direction: column; +} +.mapboxgl-popup-anchor-bottom, +.mapboxgl-popup-anchor-bottom-left, +.mapboxgl-popup-anchor-bottom-right { + -webkit-flex-direction: column-reverse; + flex-direction: column-reverse; +} +.mapboxgl-popup-anchor-left { + -webkit-flex-direction: row; + flex-direction: row; +} +.mapboxgl-popup-anchor-right { + -webkit-flex-direction: row-reverse; + flex-direction: row-reverse; +} +.mapboxgl-popup-tip { + width: 0; + height: 0; + border: 10px solid transparent; + z-index: 1; +} +.mapboxgl-popup-anchor-top .mapboxgl-popup-tip { + -webkit-align-self: center; + align-self: center; + border-top: none; + border-bottom-color: #fff; +} +.mapboxgl-popup-anchor-top-left .mapboxgl-popup-tip { + -webkit-align-self: flex-start; + align-self: flex-start; + border-top: none; + border-left: none; + border-bottom-color: #fff; +} +.mapboxgl-popup-anchor-top-right .mapboxgl-popup-tip { + -webkit-align-self: flex-end; + align-self: flex-end; + border-top: none; + border-right: none; + border-bottom-color: #fff; +} +.mapboxgl-popup-anchor-bottom .mapboxgl-popup-tip { + -webkit-align-self: center; + align-self: center; + border-bottom: none; + border-top-color: #fff; +} +.mapboxgl-popup-anchor-bottom-left .mapboxgl-popup-tip { + -webkit-align-self: flex-start; + align-self: flex-start; + border-bottom: none; + border-left: none; + border-top-color: #fff; +} +.mapboxgl-popup-anchor-bottom-right .mapboxgl-popup-tip { + -webkit-align-self: flex-end; + align-self: flex-end; + border-bottom: none; + border-right: none; + border-top-color: #fff; +} +.mapboxgl-popup-anchor-left .mapboxgl-popup-tip { + -webkit-align-self: center; + align-self: center; + border-left: none; + border-right-color: #fff; +} +.mapboxgl-popup-anchor-right .mapboxgl-popup-tip { + -webkit-align-self: center; + align-self: center; + border-right: none; + border-left-color: #fff; +} +.mapboxgl-popup-close-button { + position: absolute; + right: 0; + top: 0; + border: none; + border-radius: 0 3px 0 0; + cursor: pointer; + background-color: rgba(0,0,0,0); +} +.mapboxgl-popup-close-button:hover { + background-color: rgba(0,0,0,0.05); +} +.mapboxgl-popup-content { + position: relative; + background: #fff; + border-radius: 3px; + box-shadow: 0 1px 2px rgba(0,0,0,0.10); + padding: 10px 10px 15px; + pointer-events: auto; +} +.mapboxgl-popup-anchor-top-left .mapboxgl-popup-content { + border-top-left-radius: 0; +} +.mapboxgl-popup-anchor-top-right .mapboxgl-popup-content { + border-top-right-radius: 0; +} +.mapboxgl-popup-anchor-bottom-left .mapboxgl-popup-content { + border-bottom-left-radius: 0; +} +.mapboxgl-popup-anchor-bottom-right .mapboxgl-popup-content { + border-bottom-right-radius: 0; +} + +.mapboxgl-marker { + position: absolute; + top: 0; + left: 0; + will-change: transform; +} + +.mapboxgl-crosshair, +.mapboxgl-crosshair .mapboxgl-interactive, +.mapboxgl-crosshair .mapboxgl-interactive:active { + cursor: crosshair; +} +.mapboxgl-boxzoom { + position: absolute; + top: 0; + left: 0; + width: 0; + height: 0; + background: #fff; + border: 2px dotted #202020; + opacity: 0.5; +} +@media print { + .mapbox-improve-map { + display:none; + } +} \ No newline at end of file diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.29.0/dist/svg/mapboxgl-ctrl-attrib.svg b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.29.0/dist/svg/mapboxgl-ctrl-attrib.svg new file mode 100644 index 000000000..3bedbb0ea --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.29.0/dist/svg/mapboxgl-ctrl-attrib.svg @@ -0,0 +1,3 @@ + + + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.29.0/dist/svg/mapboxgl-ctrl-compass.svg b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.29.0/dist/svg/mapboxgl-ctrl-compass.svg new file mode 100644 index 000000000..dd5e2a880 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.29.0/dist/svg/mapboxgl-ctrl-compass.svg @@ -0,0 +1,4 @@ + + + + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.29.0/dist/svg/mapboxgl-ctrl-geolocate.svg b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.29.0/dist/svg/mapboxgl-ctrl-geolocate.svg new file mode 100644 index 000000000..efb9a3f79 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.29.0/dist/svg/mapboxgl-ctrl-geolocate.svg @@ -0,0 +1 @@ + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.29.0/dist/svg/mapboxgl-ctrl-zoom-in.svg b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.29.0/dist/svg/mapboxgl-ctrl-zoom-in.svg new file mode 100644 index 000000000..b26e3d162 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.29.0/dist/svg/mapboxgl-ctrl-zoom-in.svg @@ -0,0 +1,3 @@ + + + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.29.0/dist/svg/mapboxgl-ctrl-zoom-out.svg b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.29.0/dist/svg/mapboxgl-ctrl-zoom-out.svg new file mode 100644 index 000000000..ab6e9ff22 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.29.0/dist/svg/mapboxgl-ctrl-zoom-out.svg @@ -0,0 +1,3 @@ + + + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.29.0/js/mapbox-gl.js b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.29.0/js/mapbox-gl.js new file mode 100644 index 000000000..ca0dc0e47 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.29.0/js/mapbox-gl.js @@ -0,0 +1,443 @@ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.mapboxgl = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;oArrayGroup.MAX_VERTEX_ARRAY_LENGTH)&&(e=new Segment(this.layoutVertexArray.length,this.elementArray.length),this.segments.push(e)),e},ArrayGroup.prototype.prepareSegment2=function(r){var e=this.segments2[this.segments2.length-1];return(!e||e.vertexLength+r>ArrayGroup.MAX_VERTEX_ARRAY_LENGTH)&&(e=new Segment(this.layoutVertexArray.length,this.elementArray2.length),this.segments2.push(e)),e},ArrayGroup.prototype.populatePaintArrays=function(r){var e=this;for(var t in this.layerData){var a=e.layerData[t];0!==a.paintVertexArray.bytesPerElement&&a.programConfiguration.populatePaintArray(a.layer,a.paintVertexArray,e.layoutVertexArray.length,e.globalProperties,r)}},ArrayGroup.prototype.isEmpty=function(){return 0===this.layoutVertexArray.length},ArrayGroup.prototype.serialize=function(r){return{layoutVertexArray:this.layoutVertexArray.serialize(r),elementArray:this.elementArray&&this.elementArray.serialize(r),elementArray2:this.elementArray2&&this.elementArray2.serialize(r),paintVertexArrays:serializePaintVertexArrays(this.layerData,r),segments:this.segments,segments2:this.segments2}},ArrayGroup.MAX_VERTEX_ARRAY_LENGTH=Math.pow(2,16)-1,module.exports=ArrayGroup; +},{"./program_configuration":15}],2:[function(require,module,exports){ +"use strict";var ArrayGroup=require("./array_group"),BufferGroup=require("./buffer_group"),util=require("../util/util"),Bucket=function(r,e){this.zoom=r.zoom,this.overscaling=r.overscaling,this.layers=r.layers,this.index=r.index,r.arrays?this.buffers=new BufferGroup(e,r.layers,r.zoom,r.arrays):this.arrays=new ArrayGroup(e,r.layers,r.zoom)};Bucket.prototype.populate=function(r,e){for(var t=this,i=0,u=r;i=EXTENT||o<0||o>=EXTENT)){var n=r.prepareSegment(4),u=n.vertexLength;addCircleVertex(r.layoutVertexArray,l,o,-1,-1),addCircleVertex(r.layoutVertexArray,l,o,1,-1),addCircleVertex(r.layoutVertexArray,l,o,1,1),addCircleVertex(r.layoutVertexArray,l,o,-1,1),r.elementArray.emplaceBack(u,u+1,u+2),r.elementArray.emplaceBack(u,u+3,u+2),n.vertexLength+=4,n.primitiveLength+=2}}r.populatePaintArrays(e.properties)},r}(Bucket);module.exports=CircleBucket; +},{"../bucket":2,"../element_array_type":10,"../extent":11,"../load_geometry":13,"../vertex_array_type":17}],4:[function(require,module,exports){ +"use strict";var Bucket=require("../bucket"),createVertexArrayType=require("../vertex_array_type"),createElementArrayType=require("../element_array_type"),loadGeometry=require("../load_geometry"),earcut=require("earcut"),classifyRings=require("../../util/classify_rings"),EARCUT_MAX_RINGS=500,fillInterface={layoutVertexArrayType:createVertexArrayType([{name:"a_pos",components:2,type:"Int16"}]),elementArrayType:createElementArrayType(3),elementArrayType2:createElementArrayType(2),paintAttributes:[{property:"fill-color",type:"Uint8"},{property:"fill-outline-color",type:"Uint8"},{property:"fill-opacity",type:"Uint8",multiplier:255}]},FillBucket=function(e){function r(r){e.call(this,r,fillInterface)}return e&&(r.__proto__=e),r.prototype=Object.create(e&&e.prototype),r.prototype.constructor=r,r.prototype.addFeature=function(e){for(var r=this.arrays,t=0,a=classifyRings(loadGeometry(e),EARCUT_MAX_RINGS);tEXTENT)||e.y===r.y&&(e.y<0||e.y>EXTENT)}var Bucket=require("../bucket"),createVertexArrayType=require("../vertex_array_type"),createElementArrayType=require("../element_array_type"),loadGeometry=require("../load_geometry"),EXTENT=require("../extent"),earcut=require("earcut"),classifyRings=require("../../util/classify_rings"),EARCUT_MAX_RINGS=500,fillExtrusionInterface={layoutVertexArrayType:createVertexArrayType([{name:"a_pos",components:2,type:"Int16"},{name:"a_normal",components:3,type:"Int16"},{name:"a_edgedistance",components:1,type:"Int16"}]),elementArrayType:createElementArrayType(3),paintAttributes:[{property:"fill-extrusion-base",type:"Uint16"},{property:"fill-extrusion-height",type:"Uint16"},{property:"fill-extrusion-color",type:"Uint8"}]},FACTOR=Math.pow(2,13),FillExtrusionBucket=function(e){function r(r){e.call(this,r,fillExtrusionInterface)}return e&&(r.__proto__=e),r.prototype=Object.create(e&&e.prototype),r.prototype.constructor=r,r.prototype.addFeature=function(e){for(var r=this.arrays,t=0,a=classifyRings(loadGeometry(e),EARCUT_MAX_RINGS);t=1){var g=h[f-1];if(!isBoundaryEdge(A,g)){var _=A.sub(g)._perp()._unit();addVertex(r.layoutVertexArray,A.x,A.y,_.x,_.y,0,0,m),addVertex(r.layoutVertexArray,A.x,A.y,_.x,_.y,0,1,m),m+=g.dist(A),addVertex(r.layoutVertexArray,g.x,g.y,_.x,_.y,0,0,m),addVertex(r.layoutVertexArray,g.x,g.y,_.x,_.y,0,1,m);var v=p.vertexLength;r.elementArray.emplaceBack(v,v+1,v+2),r.elementArray.emplaceBack(v+1,v+2,v+3),p.vertexLength+=4,p.primitiveLength+=2}}u.push(A.x),u.push(A.y)}}}for(var T=earcut(u,c),E=0;E>6)}var Bucket=require("../bucket"),createVertexArrayType=require("../vertex_array_type"),createElementArrayType=require("../element_array_type"),loadGeometry=require("../load_geometry"),EXTENT=require("../extent"),EXTRUDE_SCALE=63,COS_HALF_SHARP_CORNER=Math.cos(37.5*(Math.PI/180)),SHARP_CORNER_OFFSET=15,LINE_DISTANCE_BUFFER_BITS=15,LINE_DISTANCE_SCALE=.5,MAX_LINE_DISTANCE=Math.pow(2,LINE_DISTANCE_BUFFER_BITS-1)/LINE_DISTANCE_SCALE,lineInterface={layoutVertexArrayType:createVertexArrayType([{name:"a_pos",components:2,type:"Int16"},{name:"a_data",components:4,type:"Uint8"}]),paintAttributes:[{property:"line-color",type:"Uint8"},{property:"line-blur",multiplier:10,type:"Uint8"},{property:"line-opacity",multiplier:10,type:"Uint8"},{property:"line-gap-width",multiplier:10,type:"Uint8",name:"a_gapwidth"},{property:"line-offset",multiplier:1,type:"Int8"}],elementArrayType:createElementArrayType()},LineBucket=function(e){function t(t){e.call(this,t,lineInterface)}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.addFeature=function(e){for(var t=this,r=this.layers[0].layout,i=r["line-join"],a=r["line-cap"],n=r["line-miter-limit"],d=r["line-round-limit"],s=0,u=loadGeometry(e,LINE_DISTANCE_BUFFER_BITS);s2&&e[s-1].equals(e[s-2]);)s--;if(!(e.length<2)){"bevel"===r&&(a=1.05);var u=SHARP_CORNER_OFFSET*(EXTENT/(512*this.overscaling)),l=e[0],p=e[s-1],o=l.equals(p),c=this.arrays,_=c.prepareSegment(10*s);if(2!==s||!o){this.distance=0;var h,y,m,E,x,C,A,f=i,v=o?"butt":i,L=!0;this.e1=this.e2=this.e3=-1,o&&(h=e[s-2],x=l.sub(h)._unit()._perp());for(var S=0;S0){var b=h.dist(y);if(b>2*u){var R=h.sub(h.sub(y)._mult(u/b)._round());d.distance+=R.dist(y),d.addCurrentVertex(R,d.distance,E.mult(1),0,0,!1,_),y=R}}var g=y&&m,B=g?r:m?f:v;if(g&&"round"===B&&(Ia&&(B="bevel"),"bevel"===B&&(I>2&&(B="flipbevel"),I100)V=x.clone();else{var F=E.x*x.y-E.y*x.x>0?-1:1,k=I*E.add(x).mag()/E.sub(x).mag();V._perp()._mult(k*F)}d.addCurrentVertex(h,d.distance,V,0,0,!1,_),d.addCurrentVertex(h,d.distance,V.mult(-1),0,0,!1,_)}else if("bevel"===B||"fakeround"===B){var D=E.x*x.y-E.y*x.x>0,U=-Math.sqrt(I*I-1);if(D?(A=0,C=U):(C=0,A=U),L||d.addCurrentVertex(h,d.distance,E,C,A,!1,_),"fakeround"===B){for(var q,P=Math.floor(8*(.5-(T-.5))),M=0;M=0;O--)q=E.mult((O+1)/(P+1))._add(x)._unit(),d.addPieSliceVertex(h,d.distance,q,D,_)}m&&d.addCurrentVertex(h,d.distance,x,-C,-A,!1,_)}else"butt"===B?(L||d.addCurrentVertex(h,d.distance,E,0,0,!1,_),m&&d.addCurrentVertex(h,d.distance,x,0,0,!1,_)):"square"===B?(L||(d.addCurrentVertex(h,d.distance,E,1,1,!1,_),d.e1=d.e2=-1),m&&d.addCurrentVertex(h,d.distance,x,-1,-1,!1,_)):"round"===B&&(L||(d.addCurrentVertex(h,d.distance,E,0,0,!1,_),d.addCurrentVertex(h,d.distance,E,1,1,!0,_),d.e1=d.e2=-1),m&&(d.addCurrentVertex(h,d.distance,x,-1,-1,!0,_),d.addCurrentVertex(h,d.distance,x,0,0,!1,_)));if(N&&S2*u){var H=h.add(m.sub(h)._mult(u/X)._round());d.distance+=H.dist(h),d.addCurrentVertex(H,d.distance,x.mult(1),0,0,!1,_),h=H}}L=!1}c.populatePaintArrays(t)}}},t.prototype.addCurrentVertex=function(e,t,r,i,a,n,d){var s,u=n?1:0,l=this.arrays,p=l.layoutVertexArray,o=l.elementArray;s=r.clone(),i&&s._sub(r.perp()._mult(i)),addLineVertex(p,e,s,u,0,i,t),this.e3=d.vertexLength++,this.e1>=0&&this.e2>=0&&(o.emplaceBack(this.e1,this.e2,this.e3),d.primitiveLength++),this.e1=this.e2,this.e2=this.e3,s=r.mult(-1),a&&s._sub(r.perp()._mult(a)),addLineVertex(p,e,s,u,1,-a,t),this.e3=d.vertexLength++,this.e1>=0&&this.e2>=0&&(o.emplaceBack(this.e1,this.e2,this.e3),d.primitiveLength++),this.e1=this.e2,this.e2=this.e3,t>MAX_LINE_DISTANCE/2&&(this.distance=0,this.addCurrentVertex(e,this.distance,r,i,a,n,d))},t.prototype.addPieSliceVertex=function(e,t,r,i,a){var n=i?1:0;r=r.mult(i?-1:1);var d=this.arrays,s=d.layoutVertexArray,u=d.elementArray;addLineVertex(s,e,r,0,n,0,t),this.e3=a.vertexLength++,this.e1>=0&&this.e2>=0&&(u.emplaceBack(this.e1,this.e2,this.e3),a.primitiveLength++),i?this.e2=this.e3:this.e1=this.e3},t}(Bucket);module.exports=LineBucket; +},{"../bucket":2,"../element_array_type":10,"../extent":11,"../load_geometry":13,"../vertex_array_type":17}],7:[function(require,module,exports){ +"use strict";function addVertex(e,t,o,a,r,n,i,s,l,y,c){e.emplaceBack(t,o,Math.round(64*a),Math.round(64*r),n/4,i/4,10*(y||0),c,10*(s||0),10*Math.min(l||25,25))}function addCollisionBoxVertex(e,t,o,a,r){return e.emplaceBack(t.x,t.y,Math.round(o.x),Math.round(o.y),10*a,10*r)}var Point=require("point-geometry"),ArrayGroup=require("../array_group"),BufferGroup=require("../buffer_group"),createVertexArrayType=require("../vertex_array_type"),createElementArrayType=require("../element_array_type"),EXTENT=require("../extent"),Anchor=require("../../symbol/anchor"),getAnchors=require("../../symbol/get_anchors"),resolveTokens=require("../../util/token"),Quads=require("../../symbol/quads"),Shaping=require("../../symbol/shaping"),resolveText=require("../../symbol/resolve_text"),mergeLines=require("../../symbol/mergelines"),clipLine=require("../../symbol/clip_line"),util=require("../../util/util"),scriptDetection=require("../../util/script_detection"),loadGeometry=require("../load_geometry"),CollisionFeature=require("../../symbol/collision_feature"),findPoleOfInaccessibility=require("../../util/find_pole_of_inaccessibility"),classifyRings=require("../../util/classify_rings"),VectorTileFeature=require("vector-tile").VectorTileFeature,shapeText=Shaping.shapeText,shapeIcon=Shaping.shapeIcon,WritingMode=Shaping.WritingMode,getGlyphQuads=Quads.getGlyphQuads,getIconQuads=Quads.getIconQuads,elementArrayType=createElementArrayType(),layoutVertexArrayType=createVertexArrayType([{name:"a_pos",components:2,type:"Int16"},{name:"a_offset",components:2,type:"Int16"},{name:"a_texture_pos",components:2,type:"Uint16"},{name:"a_data",components:4,type:"Uint8"}]),symbolInterfaces={glyph:{layoutVertexArrayType:layoutVertexArrayType,elementArrayType:elementArrayType},icon:{layoutVertexArrayType:layoutVertexArrayType,elementArrayType:elementArrayType},collisionBox:{layoutVertexArrayType:createVertexArrayType([{name:"a_pos",components:2,type:"Int16"},{name:"a_extrude",components:2,type:"Int16"},{name:"a_data",components:2,type:"Uint8"}]),elementArrayType:createElementArrayType(2)}},SymbolBucket=function(e){var t=this;if(this.collisionBoxArray=e.collisionBoxArray,this.symbolQuadsArray=e.symbolQuadsArray,this.symbolInstancesArray=e.symbolInstancesArray,this.zoom=e.zoom,this.overscaling=e.overscaling,this.layers=e.layers,this.index=e.index,this.sdfIcons=e.sdfIcons,this.iconsNeedLinear=e.iconsNeedLinear,this.adjustedTextSize=e.adjustedTextSize,this.adjustedIconSize=e.adjustedIconSize,this.fontstack=e.fontstack,e.arrays){this.buffers={};for(var o in e.arrays)e.arrays[o]&&(t.buffers[o]=new BufferGroup(symbolInterfaces[o],e.layers,e.zoom,e.arrays[o]))}};SymbolBucket.prototype.populate=function(e,t){var o=this,a=this.layers[0].layout,r=a["text-field"],n=a["text-font"],i=a["icon-image"],s=r&&n,l=i;if(this.features=[],s||l){for(var y=t.iconDependencies,c=t.glyphDependencies,d=c[n]=c[n]||{},h=0;hEXTENT||n.y<0||n.y>EXTENT);if(!h||i){var s=i||f;a.addSymbolInstance(n,r,t,o,a.layers[0],s,a.symbolInstancesArray.length,a.collisionBoxArray,e.index,e.sourceLayerIndex,a.index,l,x,p,c,u,g,{zoom:a.zoom},e.properties)}};if("line"===b)for(var S=0,A=clipLine(e.geometry,0,0,EXTENT,EXTENT);S=0;n--)if(o.dist(r[n])7*Math.PI/4)continue}else if(r&&n&&m<=3*Math.PI/4||m>5*Math.PI/4)continue}else if(r&&n&&(m<=Math.PI/2||m>3*Math.PI/2))continue;var p=u.tl,g=u.tr,f=u.bl,b=u.br,I=u.tex,v=u.anchorPoint,S=Math.max(d+Math.log(u.minScale)/Math.LN2,h),A=Math.min(d+Math.log(u.maxScale)/Math.LN2,25);if(!(A<=S)){S===h&&(S=0);var M=Math.round(u.glyphAngle/(2*Math.PI)*256),B=e.prepareSegment(4),T=B.vertexLength;addVertex(c,v.x,v.y,p.x,p.y,I.x,I.y,S,A,h,M),addVertex(c,v.x,v.y,g.x,g.y,I.x+I.w,I.y,S,A,h,M),addVertex(c,v.x,v.y,f.x,f.y,I.x,I.y+I.h,S,A,h,M),addVertex(c,v.x,v.y,b.x,b.y,I.x+I.w,I.y+I.h,S,A,h,M),y.emplaceBack(T,T+1,T+2),y.emplaceBack(T+1,T+2,T+3),B.vertexLength+=4,B.primitiveLength+=2}}},SymbolBucket.prototype.addToDebugBuffers=function(e){for(var t=this,o=this.arrays.collisionBox,a=o.layoutVertexArray,r=o.elementArray,n=-e.angle,i=e.yStretch,s=this.symbolInstancesStartIndex;sSymbolBucket.MAX_QUADS&&util.warnOnce("Too many symbols being rendered in a tile. See https://github.com/mapbox/mapbox-gl-js/issues/2907"),E>SymbolBucket.MAX_QUADS&&util.warnOnce("Too many glyphs being rendered in a tile. See https://github.com/mapbox/mapbox-gl-js/issues/2907");var Q=(o[WritingMode.vertical]?WritingMode.vertical:0)|(o[WritingMode.horizontal]?WritingMode.horizontal:0);return this.symbolInstancesArray.emplaceBack(k,P,V,_,T,E,L,w,e.x,e.y,i,Q)},SymbolBucket.prototype.addSymbolQuad=function(e){return this.symbolQuadsArray.emplaceBack(e.anchorPoint.x,e.anchorPoint.y,e.tl.x,e.tl.y,e.tr.x,e.tr.y,e.bl.x,e.bl.y,e.br.x,e.br.y,e.tex.h,e.tex.w,e.tex.x,e.tex.y,e.anchorAngle,e.glyphAngle,e.maxScale,e.minScale,e.writingMode)},SymbolBucket.MAX_QUADS=65535,module.exports=SymbolBucket; +},{"../../symbol/anchor":73,"../../symbol/clip_line":75,"../../symbol/collision_feature":77,"../../symbol/get_anchors":79,"../../symbol/mergelines":82,"../../symbol/quads":83,"../../symbol/resolve_text":84,"../../symbol/shaping":85,"../../util/classify_rings":111,"../../util/find_pole_of_inaccessibility":117,"../../util/script_detection":124,"../../util/token":126,"../../util/util":127,"../array_group":1,"../buffer_group":9,"../element_array_type":10,"../extent":11,"../load_geometry":13,"../vertex_array_type":17,"point-geometry":194,"vector-tile":204}],8:[function(require,module,exports){ +"use strict";var AttributeType={Int8:"BYTE",Uint8:"UNSIGNED_BYTE",Int16:"SHORT",Uint16:"UNSIGNED_SHORT"},Buffer=function(e,t,r){this.arrayBuffer=e.arrayBuffer,this.length=e.length,this.attributes=t.members,this.itemSize=t.bytesPerElement,this.type=r,this.arrayType=t};Buffer.fromStructArray=function(e,t){return new Buffer(e.serialize(),e.constructor.serialize(),t)},Buffer.prototype.bind=function(e){var t=e[this.type];this.buffer?e.bindBuffer(t,this.buffer):(this.gl=e,this.buffer=e.createBuffer(),e.bindBuffer(t,this.buffer),e.bufferData(t,this.arrayBuffer,e.STATIC_DRAW),this.arrayBuffer=null)},Buffer.prototype.setVertexAttribPointers=function(e,t,r){for(var f=this,i=0;i0?e["line-gap-width"]+2*e["line-width"]:e["line-width"]}function translate(e,t,r,i,n){if(!t[0]&&!t[1])return e;t=Point.convert(t),"viewport"===r&&t._rotate(-i);for(var a=[],o=0;or.max||d.yr.max)&&util.warnOnce("Geometry exceeds allowed extent, reduce your vector tile buffer size")}return u}; +},{"../util/util":127,"./extent":11}],14:[function(require,module,exports){ +"use strict";var createStructArrayType=require("../util/struct_array"),PosArray=createStructArrayType({members:[{name:"a_pos",type:"Int16",components:2}]});module.exports=PosArray; +},{"../util/struct_array":125}],15:[function(require,module,exports){ +"use strict";function getPaintAttributeValue(t,e,r,i){if(!t.zoomStops)return e.getPaintValue(t.property,r,i);var a=t.zoomStops.map(function(a){return e.getPaintValue(t.property,util.extend({},r,{zoom:a}),i)});return 1===a.length?a[0]:a}function normalizePaintAttribute(t,e){var r=t.property.replace(e.type+"-","").replace(/-/g,"_"),i="color"===e._paintSpecifications[t.property].type;return util.extend({name:"a_"+r,components:i?4:1,multiplier:i?255:1},t)}var createVertexArrayType=require("./vertex_array_type"),util=require("../util/util"),ProgramConfiguration=function(){this.attributes=[],this.uniforms=[],this.interpolationUniforms=[],this.pragmas={vertex:{},fragment:{}},this.cacheKey=""};ProgramConfiguration.createDynamic=function(t,e,r){for(var i=new ProgramConfiguration,a=0,n=t;a90||this.lat<-90)throw new Error("Invalid LngLat latitude value: must be between -90 and 90")};LngLat.prototype.wrap=function(){return new LngLat(wrap(this.lng,-180,180),this.lat)},LngLat.prototype.toArray=function(){return[this.lng,this.lat]},LngLat.prototype.toString=function(){return"LngLat("+this.lng+", "+this.lat+")"},LngLat.convert=function(t){if(t instanceof LngLat)return t;if(t&&t.hasOwnProperty("lng")&&t.hasOwnProperty("lat"))return new LngLat(t.lng,t.lat);if(Array.isArray(t)&&2===t.length)return new LngLat(t[0],t[1]);throw new Error("`LngLatLike` argument must be specified as a LngLat instance, an object {lng: , lat: }, or an array of [, ]")},module.exports=LngLat; +},{"../util/util":127}],20:[function(require,module,exports){ +"use strict";var LngLat=require("./lng_lat"),LngLatBounds=function(t,n){t&&(n?this.setSouthWest(t).setNorthEast(n):4===t.length?this.setSouthWest([t[0],t[1]]).setNorthEast([t[2],t[3]]):this.setSouthWest(t[0]).setNorthEast(t[1]))};LngLatBounds.prototype.setNorthEast=function(t){return this._ne=LngLat.convert(t),this},LngLatBounds.prototype.setSouthWest=function(t){return this._sw=LngLat.convert(t),this},LngLatBounds.prototype.extend=function(t){var n,e,s=this._sw,o=this._ne;if(t instanceof LngLat)n=t,e=t;else{if(!(t instanceof LngLatBounds))return Array.isArray(t)?t.every(Array.isArray)?this.extend(LngLatBounds.convert(t)):this.extend(LngLat.convert(t)):this;if(n=t._sw,e=t._ne,!n||!e)return this}return s||o?(s.lng=Math.min(n.lng,s.lng),s.lat=Math.min(n.lat,s.lat),o.lng=Math.max(e.lng,o.lng),o.lat=Math.max(e.lat,o.lat)):(this._sw=new LngLat(n.lng,n.lat),this._ne=new LngLat(e.lng,e.lat)),this},LngLatBounds.prototype.getCenter=function(){return new LngLat((this._sw.lng+this._ne.lng)/2,(this._sw.lat+this._ne.lat)/2)},LngLatBounds.prototype.getSouthWest=function(){return this._sw},LngLatBounds.prototype.getNorthEast=function(){return this._ne},LngLatBounds.prototype.getNorthWest=function(){return new LngLat(this.getWest(),this.getNorth())},LngLatBounds.prototype.getSouthEast=function(){return new LngLat(this.getEast(),this.getSouth())},LngLatBounds.prototype.getWest=function(){return this._sw.lng},LngLatBounds.prototype.getSouth=function(){return this._sw.lat},LngLatBounds.prototype.getEast=function(){return this._ne.lng},LngLatBounds.prototype.getNorth=function(){return this._ne.lat},LngLatBounds.prototype.toArray=function(){return[this._sw.toArray(),this._ne.toArray()]},LngLatBounds.prototype.toString=function(){return"LngLatBounds("+this._sw.toString()+", "+this._ne.toString()+")"},LngLatBounds.convert=function(t){return!t||t instanceof LngLatBounds?t:new LngLatBounds(t)},module.exports=LngLatBounds; +},{"./lng_lat":19}],21:[function(require,module,exports){ +"use strict";var LngLat=require("./lng_lat"),Point=require("point-geometry"),Coordinate=require("./coordinate"),util=require("../util/util"),interp=require("../util/interpolate"),TileCoord=require("../source/tile_coord"),EXTENT=require("../data/extent"),glmatrix=require("@mapbox/gl-matrix"),vec4=glmatrix.vec4,mat4=glmatrix.mat4,mat2=glmatrix.mat2,Transform=function(t,i){this.tileSize=512,this._minZoom=t||0,this._maxZoom=i||22,this.latRange=[-85.05113,85.05113],this.width=0,this.height=0,this._center=new LngLat(0,0),this.zoom=0,this.angle=0,this._fov=.6435011087932844,this._pitch=0,this._unmodified=!0},prototypeAccessors={minZoom:{},maxZoom:{},worldSize:{},centerPoint:{},size:{},bearing:{},pitch:{},fov:{},zoom:{},center:{},unmodified:{},x:{},y:{},point:{}};prototypeAccessors.minZoom.get=function(){return this._minZoom},prototypeAccessors.minZoom.set=function(t){this._minZoom!==t&&(this._minZoom=t,this.zoom=Math.max(this.zoom,t))},prototypeAccessors.maxZoom.get=function(){return this._maxZoom},prototypeAccessors.maxZoom.set=function(t){this._maxZoom!==t&&(this._maxZoom=t,this.zoom=Math.min(this.zoom,t))},prototypeAccessors.worldSize.get=function(){return this.tileSize*this.scale},prototypeAccessors.centerPoint.get=function(){return this.size._div(2)},prototypeAccessors.size.get=function(){return new Point(this.width,this.height)},prototypeAccessors.bearing.get=function(){return-this.angle/Math.PI*180},prototypeAccessors.bearing.set=function(t){var i=-util.wrap(t,-180,180)*Math.PI/180;this.angle!==i&&(this._unmodified=!1,this.angle=i,this._calcMatrices(),this.rotationMatrix=mat2.create(),mat2.rotate(this.rotationMatrix,this.rotationMatrix,this.angle))},prototypeAccessors.pitch.get=function(){return this._pitch/Math.PI*180},prototypeAccessors.pitch.set=function(t){var i=util.clamp(t,0,60)/180*Math.PI;this._pitch!==i&&(this._unmodified=!1,this._pitch=i,this._calcMatrices())},prototypeAccessors.fov.get=function(){return this._fov/Math.PI*180},prototypeAccessors.fov.set=function(t){t=Math.max(.01,Math.min(60,t)),this._fov!==t&&(this._unmodified=!1,this._fov=t/180*Math.PI,this._calcMatrices())},prototypeAccessors.zoom.get=function(){return this._zoom},prototypeAccessors.zoom.set=function(t){var i=Math.min(Math.max(t,this.minZoom),this.maxZoom);this._zoom!==i&&(this._unmodified=!1,this._zoom=i,this.scale=this.zoomScale(i),this.tileZoom=Math.floor(i),this.zoomFraction=i-this.tileZoom,this._constrain(),this._calcMatrices())},prototypeAccessors.center.get=function(){return this._center},prototypeAccessors.center.set=function(t){t.lat===this._center.lat&&t.lng===this._center.lng||(this._unmodified=!1,this._center=t,this._constrain(),this._calcMatrices())},Transform.prototype.coveringZoomLevel=function(t){return(t.roundZoom?Math.round:Math.floor)(this.zoom+this.scaleZoom(this.tileSize/t.tileSize))},Transform.prototype.coveringTiles=function(t){var i=this.coveringZoomLevel(t),o=i;if(it.maxzoom&&(i=t.maxzoom);var e=this.pointCoordinate(this.centerPoint,i),r=new Point(e.column-.5,e.row-.5),n=[this.pointCoordinate(new Point(0,0),i),this.pointCoordinate(new Point(this.width,0),i),this.pointCoordinate(new Point(this.width,this.height),i),this.pointCoordinate(new Point(0,this.height),i)];return TileCoord.cover(i,n,t.reparseOverscaled?o:i).sort(function(t,i){return r.dist(t)-r.dist(i)})},Transform.prototype.resize=function(t,i){this.width=t,this.height=i,this.pixelsToGLUnits=[2/t,-2/i],this._constrain(),this._calcMatrices()},prototypeAccessors.unmodified.get=function(){return this._unmodified},Transform.prototype.zoomScale=function(t){return Math.pow(2,t)},Transform.prototype.scaleZoom=function(t){return Math.log(t)/Math.LN2},Transform.prototype.project=function(t){return new Point(this.lngX(t.lng),this.latY(t.lat))},Transform.prototype.unproject=function(t){return new LngLat(this.xLng(t.x),this.yLat(t.y))},prototypeAccessors.x.get=function(){return this.lngX(this.center.lng)},prototypeAccessors.y.get=function(){return this.latY(this.center.lat)},prototypeAccessors.point.get=function(){return new Point(this.x,this.y)},Transform.prototype.lngX=function(t){return(180+t)*this.worldSize/360},Transform.prototype.latY=function(t){var i=180/Math.PI*Math.log(Math.tan(Math.PI/4+t*Math.PI/360));return(180-i)*this.worldSize/360},Transform.prototype.xLng=function(t){return 360*t/this.worldSize-180},Transform.prototype.yLat=function(t){var i=180-360*t/this.worldSize;return 360/Math.PI*Math.atan(Math.exp(i*Math.PI/180))-90},Transform.prototype.setLocationAtPoint=function(t,i){var o=this.pointCoordinate(i)._sub(this.pointCoordinate(this.centerPoint));this.center=this.coordinateLocation(this.locationCoordinate(t)._sub(o))},Transform.prototype.locationPoint=function(t){return this.coordinatePoint(this.locationCoordinate(t))},Transform.prototype.pointLocation=function(t){return this.coordinateLocation(this.pointCoordinate(t))},Transform.prototype.locationCoordinate=function(t){return new Coordinate(this.lngX(t.lng)/this.tileSize,this.latY(t.lat)/this.tileSize,this.zoom).zoomTo(this.tileZoom)},Transform.prototype.coordinateLocation=function(t){var i=t.zoomTo(this.zoom);return new LngLat(this.xLng(i.column*this.tileSize),this.yLat(i.row*this.tileSize))},Transform.prototype.pointCoordinate=function(t,i){void 0===i&&(i=this.tileZoom);var o=0,e=[t.x,t.y,0,1],r=[t.x,t.y,1,1];vec4.transformMat4(e,e,this.pixelMatrixInverse),vec4.transformMat4(r,r,this.pixelMatrixInverse);var n=e[3],s=r[3],a=e[0]/n,h=r[0]/s,c=e[1]/n,m=r[1]/s,p=e[2]/n,l=r[2]/s,u=p===l?0:(o-p)/(l-p);return new Coordinate(interp(a,h,u)/this.tileSize,interp(c,m,u)/this.tileSize,this.zoom)._zoomTo(i)},Transform.prototype.coordinatePoint=function(t){var i=t.zoomTo(this.zoom),o=[i.column*this.tileSize,i.row*this.tileSize,0,1];return vec4.transformMat4(o,o,this.pixelMatrix),new Point(o[0]/o[3],o[1]/o[3])},Transform.prototype.calculatePosMatrix=function(t,i){var o=t.toCoordinate(i),e=this.worldSize/this.zoomScale(o.zoom),r=mat4.identity(new Float64Array(16));return mat4.translate(r,r,[o.column*e,o.row*e,0]),mat4.scale(r,r,[e/EXTENT,e/EXTENT,1]),mat4.multiply(r,this.projMatrix,r),new Float32Array(r)},Transform.prototype._constrain=function(){if(this.center&&this.width&&this.height&&!this._constraining){this._constraining=!0;var t,i,o,e,r,n,s,a,h=this.size,c=this._unmodified;this.latRange&&(t=this.latY(this.latRange[1]),i=this.latY(this.latRange[0]),r=i-ti&&(a=i-l)}if(this.lngRange){var u=this.x,f=h.x/2;u-fe&&(s=e-f)}void 0===s&&void 0===a||(this.center=this.unproject(new Point(void 0!==s?s:this.x,void 0!==a?a:this.y))),this._unmodified=c,this._constraining=!1}},Transform.prototype._calcMatrices=function(){if(this.height){this.cameraToCenterDistance=.5/Math.tan(this._fov/2)*this.height;var t=this._fov/2,i=Math.PI/2+this._pitch,o=Math.sin(t)*this.cameraToCenterDistance/Math.sin(Math.PI-i-t),e=Math.cos(Math.PI/2-this._pitch)*o+this.cameraToCenterDistance,r=1.01*e,n=new Float64Array(16);mat4.perspective(n,this._fov,this.width/this.height,1,r),mat4.scale(n,n,[1,-1,1]),mat4.translate(n,n,[0,0,-this.cameraToCenterDistance]),mat4.rotateX(n,n,this._pitch),mat4.rotateZ(n,n,this.angle),mat4.translate(n,n,[-this.x,-this.y,0]);var s=this.worldSize/(2*Math.PI*6378137*Math.abs(Math.cos(this.center.lat*(Math.PI/180))));if(mat4.scale(n,n,[1,1,s,1]),this.projMatrix=n,n=mat4.create(),mat4.scale(n,n,[this.width/2,-this.height/2,1]),mat4.translate(n,n,[1,-1,0]),this.pixelMatrix=mat4.multiply(new Float64Array(16),n,this.projMatrix),n=mat4.invert(new Float64Array(16),this.pixelMatrix),!n)throw new Error("failed to invert matrix");this.pixelMatrixInverse=n}},Object.defineProperties(Transform.prototype,prototypeAccessors),module.exports=Transform; +},{"../data/extent":11,"../source/tile_coord":51,"../util/interpolate":119,"../util/util":127,"./coordinate":18,"./lng_lat":19,"@mapbox/gl-matrix":131,"point-geometry":194}],22:[function(require,module,exports){ +"use strict";var WorkerPool=require("./util/worker_pool"),globalWorkerPool;module.exports=function(){return globalWorkerPool||(globalWorkerPool=new WorkerPool),globalWorkerPool}; +},{"./util/worker_pool":130}],23:[function(require,module,exports){ +"use strict";var simplexFont={" ":[16,[]],"!":[10,[5,21,5,7,-1,-1,5,2,4,1,5,0,6,1,5,2]],'"':[16,[4,21,4,14,-1,-1,12,21,12,14]],"#":[21,[11,25,4,-7,-1,-1,17,25,10,-7,-1,-1,4,12,18,12,-1,-1,3,6,17,6]],$:[20,[8,25,8,-4,-1,-1,12,25,12,-4,-1,-1,17,18,15,20,12,21,8,21,5,20,3,18,3,16,4,14,5,13,7,12,13,10,15,9,16,8,17,6,17,3,15,1,12,0,8,0,5,1,3,3]],"%":[24,[21,21,3,0,-1,-1,8,21,10,19,10,17,9,15,7,14,5,14,3,16,3,18,4,20,6,21,8,21,10,20,13,19,16,19,19,20,21,21,-1,-1,17,7,15,6,14,4,14,2,16,0,18,0,20,1,21,3,21,5,19,7,17,7]],"&":[26,[23,12,23,13,22,14,21,14,20,13,19,11,17,6,15,3,13,1,11,0,7,0,5,1,4,2,3,4,3,6,4,8,5,9,12,13,13,14,14,16,14,18,13,20,11,21,9,20,8,18,8,16,9,13,11,10,16,3,18,1,20,0,22,0,23,1,23,2]],"'":[10,[5,19,4,20,5,21,6,20,6,18,5,16,4,15]],"(":[14,[11,25,9,23,7,20,5,16,4,11,4,7,5,2,7,-2,9,-5,11,-7]],")":[14,[3,25,5,23,7,20,9,16,10,11,10,7,9,2,7,-2,5,-5,3,-7]],"*":[16,[8,21,8,9,-1,-1,3,18,13,12,-1,-1,13,18,3,12]],"+":[26,[13,18,13,0,-1,-1,4,9,22,9]],",":[10,[6,1,5,0,4,1,5,2,6,1,6,-1,5,-3,4,-4]],"-":[26,[4,9,22,9]],".":[10,[5,2,4,1,5,0,6,1,5,2]],"/":[22,[20,25,2,-7]],0:[20,[9,21,6,20,4,17,3,12,3,9,4,4,6,1,9,0,11,0,14,1,16,4,17,9,17,12,16,17,14,20,11,21,9,21]],1:[20,[6,17,8,18,11,21,11,0]],2:[20,[4,16,4,17,5,19,6,20,8,21,12,21,14,20,15,19,16,17,16,15,15,13,13,10,3,0,17,0]],3:[20,[5,21,16,21,10,13,13,13,15,12,16,11,17,8,17,6,16,3,14,1,11,0,8,0,5,1,4,2,3,4]],4:[20,[13,21,3,7,18,7,-1,-1,13,21,13,0]],5:[20,[15,21,5,21,4,12,5,13,8,14,11,14,14,13,16,11,17,8,17,6,16,3,14,1,11,0,8,0,5,1,4,2,3,4]],6:[20,[16,18,15,20,12,21,10,21,7,20,5,17,4,12,4,7,5,3,7,1,10,0,11,0,14,1,16,3,17,6,17,7,16,10,14,12,11,13,10,13,7,12,5,10,4,7]],7:[20,[17,21,7,0,-1,-1,3,21,17,21]],8:[20,[8,21,5,20,4,18,4,16,5,14,7,13,11,12,14,11,16,9,17,7,17,4,16,2,15,1,12,0,8,0,5,1,4,2,3,4,3,7,4,9,6,11,9,12,13,13,15,14,16,16,16,18,15,20,12,21,8,21]],9:[20,[16,14,15,11,13,9,10,8,9,8,6,9,4,11,3,14,3,15,4,18,6,20,9,21,10,21,13,20,15,18,16,14,16,9,15,4,13,1,10,0,8,0,5,1,4,3]],":":[10,[5,14,4,13,5,12,6,13,5,14,-1,-1,5,2,4,1,5,0,6,1,5,2]],";":[10,[5,14,4,13,5,12,6,13,5,14,-1,-1,6,1,5,0,4,1,5,2,6,1,6,-1,5,-3,4,-4]],"<":[24,[20,18,4,9,20,0]],"=":[26,[4,12,22,12,-1,-1,4,6,22,6]],">":[24,[4,18,20,9,4,0]],"?":[18,[3,16,3,17,4,19,5,20,7,21,11,21,13,20,14,19,15,17,15,15,14,13,13,12,9,10,9,7,-1,-1,9,2,8,1,9,0,10,1,9,2]],"@":[27,[18,13,17,15,15,16,12,16,10,15,9,14,8,11,8,8,9,6,11,5,14,5,16,6,17,8,-1,-1,12,16,10,14,9,11,9,8,10,6,11,5,-1,-1,18,16,17,8,17,6,19,5,21,5,23,7,24,10,24,12,23,15,22,17,20,19,18,20,15,21,12,21,9,20,7,19,5,17,4,15,3,12,3,9,4,6,5,4,7,2,9,1,12,0,15,0,18,1,20,2,21,3,-1,-1,19,16,18,8,18,6,19,5]],A:[18,[9,21,1,0,-1,-1,9,21,17,0,-1,-1,4,7,14,7]],B:[21,[4,21,4,0,-1,-1,4,21,13,21,16,20,17,19,18,17,18,15,17,13,16,12,13,11,-1,-1,4,11,13,11,16,10,17,9,18,7,18,4,17,2,16,1,13,0,4,0]],C:[21,[18,16,17,18,15,20,13,21,9,21,7,20,5,18,4,16,3,13,3,8,4,5,5,3,7,1,9,0,13,0,15,1,17,3,18,5]],D:[21,[4,21,4,0,-1,-1,4,21,11,21,14,20,16,18,17,16,18,13,18,8,17,5,16,3,14,1,11,0,4,0]],E:[19,[4,21,4,0,-1,-1,4,21,17,21,-1,-1,4,11,12,11,-1,-1,4,0,17,0]],F:[18,[4,21,4,0,-1,-1,4,21,17,21,-1,-1,4,11,12,11]],G:[21,[18,16,17,18,15,20,13,21,9,21,7,20,5,18,4,16,3,13,3,8,4,5,5,3,7,1,9,0,13,0,15,1,17,3,18,5,18,8,-1,-1,13,8,18,8]],H:[22,[4,21,4,0,-1,-1,18,21,18,0,-1,-1,4,11,18,11]],I:[8,[4,21,4,0]],J:[16,[12,21,12,5,11,2,10,1,8,0,6,0,4,1,3,2,2,5,2,7]],K:[21,[4,21,4,0,-1,-1,18,21,4,7,-1,-1,9,12,18,0]],L:[17,[4,21,4,0,-1,-1,4,0,16,0]],M:[24,[4,21,4,0,-1,-1,4,21,12,0,-1,-1,20,21,12,0,-1,-1,20,21,20,0]],N:[22,[4,21,4,0,-1,-1,4,21,18,0,-1,-1,18,21,18,0]],O:[22,[9,21,7,20,5,18,4,16,3,13,3,8,4,5,5,3,7,1,9,0,13,0,15,1,17,3,18,5,19,8,19,13,18,16,17,18,15,20,13,21,9,21]],P:[21,[4,21,4,0,-1,-1,4,21,13,21,16,20,17,19,18,17,18,14,17,12,16,11,13,10,4,10]],Q:[22,[9,21,7,20,5,18,4,16,3,13,3,8,4,5,5,3,7,1,9,0,13,0,15,1,17,3,18,5,19,8,19,13,18,16,17,18,15,20,13,21,9,21,-1,-1,12,4,18,-2]],R:[21,[4,21,4,0,-1,-1,4,21,13,21,16,20,17,19,18,17,18,15,17,13,16,12,13,11,4,11,-1,-1,11,11,18,0]],S:[20,[17,18,15,20,12,21,8,21,5,20,3,18,3,16,4,14,5,13,7,12,13,10,15,9,16,8,17,6,17,3,15,1,12,0,8,0,5,1,3,3]],T:[16,[8,21,8,0,-1,-1,1,21,15,21]],U:[22,[4,21,4,6,5,3,7,1,10,0,12,0,15,1,17,3,18,6,18,21]],V:[18,[1,21,9,0,-1,-1,17,21,9,0]],W:[24,[2,21,7,0,-1,-1,12,21,7,0,-1,-1,12,21,17,0,-1,-1,22,21,17,0]],X:[20,[3,21,17,0,-1,-1,17,21,3,0]],Y:[18,[1,21,9,11,9,0,-1,-1,17,21,9,11]],Z:[20,[17,21,3,0,-1,-1,3,21,17,21,-1,-1,3,0,17,0]],"[":[14,[4,25,4,-7,-1,-1,5,25,5,-7,-1,-1,4,25,11,25,-1,-1,4,-7,11,-7]],"\\":[14,[0,21,14,-3]],"]":[14,[9,25,9,-7,-1,-1,10,25,10,-7,-1,-1,3,25,10,25,-1,-1,3,-7,10,-7]],"^":[16,[6,15,8,18,10,15,-1,-1,3,12,8,17,13,12,-1,-1,8,17,8,0]],_:[16,[0,-2,16,-2]],"`":[10,[6,21,5,20,4,18,4,16,5,15,6,16,5,17]],a:[19,[15,14,15,0,-1,-1,15,11,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3]],b:[19,[4,21,4,0,-1,-1,4,11,6,13,8,14,11,14,13,13,15,11,16,8,16,6,15,3,13,1,11,0,8,0,6,1,4,3]],c:[18,[15,11,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3]],d:[19,[15,21,15,0,-1,-1,15,11,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3]],e:[18,[3,8,15,8,15,10,14,12,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3]],f:[12,[10,21,8,21,6,20,5,17,5,0,-1,-1,2,14,9,14]],g:[19,[15,14,15,-2,14,-5,13,-6,11,-7,8,-7,6,-6,-1,-1,15,11,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3]],h:[19,[4,21,4,0,-1,-1,4,10,7,13,9,14,12,14,14,13,15,10,15,0]],i:[8,[3,21,4,20,5,21,4,22,3,21,-1,-1,4,14,4,0]],j:[10,[5,21,6,20,7,21,6,22,5,21,-1,-1,6,14,6,-3,5,-6,3,-7,1,-7]],k:[17,[4,21,4,0,-1,-1,14,14,4,4,-1,-1,8,8,15,0]],l:[8,[4,21,4,0]],m:[30,[4,14,4,0,-1,-1,4,10,7,13,9,14,12,14,14,13,15,10,15,0,-1,-1,15,10,18,13,20,14,23,14,25,13,26,10,26,0]],n:[19,[4,14,4,0,-1,-1,4,10,7,13,9,14,12,14,14,13,15,10,15,0]],o:[19,[8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3,16,6,16,8,15,11,13,13,11,14,8,14]],p:[19,[4,14,4,-7,-1,-1,4,11,6,13,8,14,11,14,13,13,15,11,16,8,16,6,15,3,13,1,11,0,8,0,6,1,4,3]],q:[19,[15,14,15,-7,-1,-1,15,11,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3]],r:[13,[4,14,4,0,-1,-1,4,8,5,11,7,13,9,14,12,14]],s:[17,[14,11,13,13,10,14,7,14,4,13,3,11,4,9,6,8,11,7,13,6,14,4,14,3,13,1,10,0,7,0,4,1,3,3]],t:[12,[5,21,5,4,6,1,8,0,10,0,-1,-1,2,14,9,14]],u:[19,[4,14,4,4,5,1,7,0,10,0,12,1,15,4,-1,-1,15,14,15,0]],v:[16,[2,14,8,0,-1,-1,14,14,8,0]],w:[22,[3,14,7,0,-1,-1,11,14,7,0,-1,-1,11,14,15,0,-1,-1,19,14,15,0]],x:[17,[3,14,14,0,-1,-1,14,14,3,0]],y:[16,[2,14,8,0,-1,-1,14,14,8,0,6,-4,4,-6,2,-7,1,-7]],z:[17,[14,14,3,0,-1,-1,3,14,14,14,-1,-1,3,0,14,0]],"{":[14,[9,25,7,24,6,23,5,21,5,19,6,17,7,16,8,14,8,12,6,10,-1,-1,7,24,6,22,6,20,7,18,8,17,9,15,9,13,8,11,4,9,8,7,9,5,9,3,8,1,7,0,6,-2,6,-4,7,-6,-1,-1,6,8,8,6,8,4,7,2,6,1,5,-1,5,-3,6,-5,7,-6,9,-7]],"|":[8,[4,25,4,-7]],"}":[14,[5,25,7,24,8,23,9,21,9,19,8,17,7,16,6,14,6,12,8,10,-1,-1,7,24,8,22,8,20,7,18,6,17,5,15,5,13,6,11,10,9,6,7,5,5,5,3,6,1,7,0,8,-2,8,-4,7,-6,-1,-1,8,8,6,6,6,4,7,2,8,1,9,-1,9,-3,8,-5,7,-6,5,-7]],"~":[24,[3,6,3,8,4,11,6,12,8,12,10,11,14,8,16,7,18,7,20,8,21,10,-1,-1,3,8,4,10,6,11,8,11,10,10,14,7,16,6,18,6,20,7,21,10,21,12]]};module.exports=function(l,n,t,e){e=e||1;var r,o,u,s,i,x,f,p,h=[];for(r=0,o=l.length;r0?1/(1-r):1+r}function saturationFactor(r){return r>0?1-1/(1.001-r):-r}function getOpacities(r,t,a,e){var i=[1,0],o=a.paint["raster-fade-duration"];if(r.sourceCache&&o>0){var n=Date.now(),u=(n-r.timeAdded)/o,s=t?(n-t.timeAdded)/o:-1,c=r.sourceCache.getSource(),f=e.coveringZoomLevel({tileSize:c.tileSize,roundZoom:c.roundZoom}),d=!t||Math.abs(t.coord.z-f)>Math.abs(r.coord.z-f);i[0]=util.clamp(d?u:1-s,0,1),i[1]=t?1-i[0]:0}var m=a.paint["raster-opacity"];return i[0]*=m,i[1]*=m,i}var util=require("../util/util");module.exports=drawRaster; +},{"../util/util":127}],33:[function(require,module,exports){ +"use strict";function drawSymbols(t,e,i,a){if(!t.isOpaquePass){var o=!(i.layout["text-allow-overlap"]||i.layout["icon-allow-overlap"]||i.layout["text-ignore-placement"]||i.layout["icon-ignore-placement"]),r=t.gl;o?r.disable(r.STENCIL_TEST):r.enable(r.STENCIL_TEST),t.setDepthSublayer(0),t.depthMask(!1),drawLayerSymbols(t,e,i,a,!1,i.paint["icon-translate"],i.paint["icon-translate-anchor"],i.layout["icon-rotation-alignment"],i.layout["icon-rotation-alignment"],i.layout["icon-size"],i.paint["icon-halo-width"],i.paint["icon-halo-color"],i.paint["icon-halo-blur"],i.paint["icon-opacity"],i.paint["icon-color"]),drawLayerSymbols(t,e,i,a,!0,i.paint["text-translate"],i.paint["text-translate-anchor"],i.layout["text-rotation-alignment"],i.layout["text-pitch-alignment"],i.layout["text-size"],i.paint["text-halo-width"],i.paint["text-halo-color"],i.paint["text-halo-blur"],i.paint["text-opacity"],i.paint["text-color"]),e.map.showCollisionBoxes&&drawCollisionDebug(t,e,i,a)}}function drawLayerSymbols(t,e,i,a,o,r,n,l,s,u,f,m,p,c,d){if(o||!t.style.sprite||t.style.sprite.loaded()){var h=t.gl,b="map"===l,x="map"===s,g=x;g?h.enable(h.DEPTH_TEST):h.disable(h.DEPTH_TEST);for(var _,y=0,T=a;ythis.previousZoom;a--)r.changeTimes[a]=e,r.changeOpacities[a]=r.opacities[a];for(a=0;a<256;a++){var s=e-r.changeTimes[a],o=255*(i?s/i:1);a<=t?r.opacities[a]=r.changeOpacities[a]+o:r.opacities[a]=r.changeOpacities[a]-o}this.changed=!0,this.previousZoom=t},FrameHistory.prototype.bind=function(e){this.texture?(e.bindTexture(e.TEXTURE_2D,this.texture),this.changed&&(e.texSubImage2D(e.TEXTURE_2D,0,0,0,256,1,e.ALPHA,e.UNSIGNED_BYTE,this.array),this.changed=!1)):(this.texture=e.createTexture(),e.bindTexture(e.TEXTURE_2D,this.texture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST),e.texImage2D(e.TEXTURE_2D,0,e.ALPHA,256,1,0,e.ALPHA,e.UNSIGNED_BYTE,this.array))},module.exports=FrameHistory; +},{}],35:[function(require,module,exports){ +"use strict";var util=require("../util/util"),LineAtlas=function(t,i){this.width=t,this.height=i,this.nextRow=0,this.bytes=4,this.data=new Uint8Array(this.width*this.height*this.bytes),this.positions={}};LineAtlas.prototype.setSprite=function(t){this.sprite=t},LineAtlas.prototype.getDash=function(t,i){var e=t.join(",")+i;return this.positions[e]||(this.positions[e]=this.addDash(t,i)),this.positions[e]},LineAtlas.prototype.addDash=function(t,i){var e=this,h=i?7:0,s=2*h+1,a=128;if(this.nextRow+s>this.height)return util.warnOnce("LineAtlas out of space"),null;for(var r=0,n=0;n0?a.pop():null}},Painter.prototype.getViewportTexture=function(e,r){if(this.reusableTextures.viewport){var t=this.reusableTextures.viewport.texture;return t.width===e&&t.height===r?t:(this.gl.deleteTexture(t),void(this.reusableTextures.viewport.texture=null))}},Painter.prototype.lineWidth=function(e){this.gl.lineWidth(util.clamp(e,this.lineWidthRange[0],this.lineWidthRange[1]))},Painter.prototype.showOverdrawInspector=function(e){if(e||this._showOverdrawInspector){this._showOverdrawInspector=e;var r=this.gl;if(e){r.blendFunc(r.CONSTANT_COLOR,r.ONE);var t=8,a=1/t;r.blendColor(a,a,a,0),r.clearColor(0,0,0,1),r.clear(r.COLOR_BUFFER_BIT)}else r.blendFunc(r.ONE,r.ONE_MINUS_SRC_ALPHA)}},Painter.prototype.createProgram=function(e,r){var t=this.gl,a=t.createProgram(),i=shaders[e],s="#define MAPBOX_GL_JS\n#define DEVICE_PIXEL_RATIO "+browser.devicePixelRatio.toFixed(1)+"\n";this._showOverdrawInspector&&(s+="#define OVERDRAW_INSPECTOR;\n");var o=t.createShader(t.FRAGMENT_SHADER);t.shaderSource(o,r.applyPragmas(s+shaders.prelude.fragmentSource+i.fragmentSource,"fragment")),t.compileShader(o),t.attachShader(a,o);var n=t.createShader(t.VERTEX_SHADER);t.shaderSource(n,r.applyPragmas(s+shaders.prelude.vertexSource+i.vertexSource,"vertex")),t.compileShader(n),t.attachShader(a,n),t.linkProgram(a);for(var l=t.getProgramParameter(a,t.ACTIVE_ATTRIBUTES),u={program:a,numAttributes:l},h=0;h>16,n>>16),o.uniform2f(i.u_pixel_coord_lower,65535&u,65535&n)}; +},{"../source/pixels_to_tile_units":45}],38:[function(require,module,exports){ +"use strict";var path=require("path");module.exports={prelude:{fragmentSource:"#ifdef GL_ES\nprecision mediump float;\n#else\n\n#if !defined(lowp)\n#define lowp\n#endif\n\n#if !defined(mediump)\n#define mediump\n#endif\n\n#if !defined(highp)\n#define highp\n#endif\n\n#endif\n",vertexSource:"#ifdef GL_ES\nprecision highp float;\n#else\n\n#if !defined(lowp)\n#define lowp\n#endif\n\n#if !defined(mediump)\n#define mediump\n#endif\n\n#if !defined(highp)\n#define highp\n#endif\n\n#endif\n\nfloat evaluate_zoom_function_1(const vec4 values, const float t) {\n if (t < 1.0) {\n return mix(values[0], values[1], t);\n } else if (t < 2.0) {\n return mix(values[1], values[2], t - 1.0);\n } else {\n return mix(values[2], values[3], t - 2.0);\n }\n}\nvec4 evaluate_zoom_function_4(const vec4 value0, const vec4 value1, const vec4 value2, const vec4 value3, const float t) {\n if (t < 1.0) {\n return mix(value0, value1, t);\n } else if (t < 2.0) {\n return mix(value1, value2, t - 1.0);\n } else {\n return mix(value2, value3, t - 2.0);\n }\n}\n\n// The offset depends on how many pixels are between the world origin and the edge of the tile:\n// vec2 offset = mod(pixel_coord, size)\n//\n// At high zoom levels there are a ton of pixels between the world origin and the edge of the tile.\n// The glsl spec only guarantees 16 bits of precision for highp floats. We need more than that.\n//\n// The pixel_coord is passed in as two 16 bit values:\n// pixel_coord_upper = floor(pixel_coord / 2^16)\n// pixel_coord_lower = mod(pixel_coord, 2^16)\n//\n// The offset is calculated in a series of steps that should preserve this precision:\nvec2 get_pattern_pos(const vec2 pixel_coord_upper, const vec2 pixel_coord_lower,\n const vec2 pattern_size, const float tile_units_to_pixels, const vec2 pos) {\n\n vec2 offset = mod(mod(mod(pixel_coord_upper, pattern_size) * 256.0, pattern_size) * 256.0 + pixel_coord_lower, pattern_size);\n return (tile_units_to_pixels * pos + offset) / pattern_size;\n}\n"},circle:{fragmentSource:"#pragma mapbox: define lowp vec4 color\n#pragma mapbox: define mediump float radius\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp vec4 stroke_color\n#pragma mapbox: define mediump float stroke_width\n#pragma mapbox: define lowp float stroke_opacity\n\nvarying vec2 v_extrude;\nvarying lowp float v_antialiasblur;\n\nvoid main() {\n #pragma mapbox: initialize lowp vec4 color\n #pragma mapbox: initialize mediump float radius\n #pragma mapbox: initialize lowp float blur\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize lowp vec4 stroke_color\n #pragma mapbox: initialize mediump float stroke_width\n #pragma mapbox: initialize lowp float stroke_opacity\n\n float extrude_length = length(v_extrude);\n float antialiased_blur = -max(blur, v_antialiasblur);\n\n float opacity_t = smoothstep(0.0, antialiased_blur, extrude_length - 1.0);\n\n float color_t = stroke_width < 0.01 ? 0.0 : smoothstep(\n antialiased_blur,\n 0.0,\n extrude_length - radius / (radius + stroke_width)\n );\n\n gl_FragColor = opacity_t * mix(color * opacity, stroke_color * stroke_opacity, color_t);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n",vertexSource:"uniform mat4 u_matrix;\nuniform bool u_scale_with_map;\nuniform vec2 u_extrude_scale;\n\nattribute vec2 a_pos;\n\n#pragma mapbox: define lowp vec4 color\n#pragma mapbox: define mediump float radius\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp vec4 stroke_color\n#pragma mapbox: define mediump float stroke_width\n#pragma mapbox: define lowp float stroke_opacity\n\nvarying vec2 v_extrude;\nvarying lowp float v_antialiasblur;\n\nvoid main(void) {\n #pragma mapbox: initialize lowp vec4 color\n #pragma mapbox: initialize mediump float radius\n #pragma mapbox: initialize lowp float blur\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize lowp vec4 stroke_color\n #pragma mapbox: initialize mediump float stroke_width\n #pragma mapbox: initialize lowp float stroke_opacity\n\n // unencode the extrusion vector that we snuck into the a_pos vector\n v_extrude = vec2(mod(a_pos, 2.0) * 2.0 - 1.0);\n\n vec2 extrude = v_extrude * (radius + stroke_width) * u_extrude_scale;\n // multiply a_pos by 0.5, since we had it * 2 in order to sneak\n // in extrusion data\n gl_Position = u_matrix * vec4(floor(a_pos * 0.5), 0, 1);\n\n if (u_scale_with_map) {\n gl_Position.xy += extrude;\n } else {\n gl_Position.xy += extrude * gl_Position.w;\n }\n\n // This is a minimum blur distance that serves as a faux-antialiasing for\n // the circle. since blur is a ratio of the circle's size and the intent is\n // to keep the blur at roughly 1px, the two are inversely related.\n v_antialiasblur = 1.0 / DEVICE_PIXEL_RATIO / (radius + stroke_width);\n}\n"},collisionBox:{fragmentSource:"uniform float u_zoom;\nuniform float u_maxzoom;\n\nvarying float v_max_zoom;\nvarying float v_placement_zoom;\n\nvoid main() {\n\n float alpha = 0.5;\n\n gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0) * alpha;\n\n if (v_placement_zoom > u_zoom) {\n gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0) * alpha;\n }\n\n if (u_zoom >= v_max_zoom) {\n gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0) * alpha * 0.25;\n }\n\n if (v_placement_zoom >= u_maxzoom) {\n gl_FragColor = vec4(0.0, 0.0, 1.0, 1.0) * alpha * 0.2;\n }\n}\n",vertexSource:"attribute vec2 a_pos;\nattribute vec2 a_extrude;\nattribute vec2 a_data;\n\nuniform mat4 u_matrix;\nuniform float u_scale;\n\nvarying float v_max_zoom;\nvarying float v_placement_zoom;\n\nvoid main() {\n gl_Position = u_matrix * vec4(a_pos + a_extrude / u_scale, 0.0, 1.0);\n\n v_max_zoom = a_data.x;\n v_placement_zoom = a_data.y;\n}\n"},debug:{fragmentSource:"uniform lowp vec4 u_color;\n\nvoid main() {\n gl_FragColor = u_color;\n}\n",vertexSource:"attribute vec2 a_pos;\n\nuniform mat4 u_matrix;\n\nvoid main() {\n gl_Position = u_matrix * vec4(a_pos, step(32767.0, a_pos.x), 1);\n}\n"},fill:{fragmentSource:"#pragma mapbox: define lowp vec4 color\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize lowp vec4 color\n #pragma mapbox: initialize lowp float opacity\n\n gl_FragColor = color * opacity;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n",vertexSource:"attribute vec2 a_pos;\n\nuniform mat4 u_matrix;\n\n#pragma mapbox: define lowp vec4 color\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize lowp vec4 color\n #pragma mapbox: initialize lowp float opacity\n\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n}\n"},fillOutline:{fragmentSource:"#pragma mapbox: define lowp vec4 outline_color\n#pragma mapbox: define lowp float opacity\n\nvarying vec2 v_pos;\n\nvoid main() {\n #pragma mapbox: initialize lowp vec4 outline_color\n #pragma mapbox: initialize lowp float opacity\n\n float dist = length(v_pos - gl_FragCoord.xy);\n float alpha = smoothstep(1.0, 0.0, dist);\n gl_FragColor = outline_color * (alpha * opacity);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n",vertexSource:"attribute vec2 a_pos;\n\nuniform mat4 u_matrix;\nuniform vec2 u_world;\n\nvarying vec2 v_pos;\n\n#pragma mapbox: define lowp vec4 outline_color\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize lowp vec4 outline_color\n #pragma mapbox: initialize lowp float opacity\n\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n v_pos = (gl_Position.xy / gl_Position.w + 1.0) / 2.0 * u_world;\n}\n"},fillOutlinePattern:{fragmentSource:"uniform vec2 u_pattern_tl_a;\nuniform vec2 u_pattern_br_a;\nuniform vec2 u_pattern_tl_b;\nuniform vec2 u_pattern_br_b;\nuniform float u_mix;\n\nuniform sampler2D u_image;\n\nvarying vec2 v_pos_a;\nvarying vec2 v_pos_b;\nvarying vec2 v_pos;\n\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize lowp float opacity\n\n vec2 imagecoord = mod(v_pos_a, 1.0);\n vec2 pos = mix(u_pattern_tl_a, u_pattern_br_a, imagecoord);\n vec4 color1 = texture2D(u_image, pos);\n\n vec2 imagecoord_b = mod(v_pos_b, 1.0);\n vec2 pos2 = mix(u_pattern_tl_b, u_pattern_br_b, imagecoord_b);\n vec4 color2 = texture2D(u_image, pos2);\n\n // find distance to outline for alpha interpolation\n\n float dist = length(v_pos - gl_FragCoord.xy);\n float alpha = smoothstep(1.0, 0.0, dist);\n\n\n gl_FragColor = mix(color1, color2, u_mix) * alpha * opacity;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n",vertexSource:"uniform mat4 u_matrix;\nuniform vec2 u_world;\nuniform vec2 u_pattern_size_a;\nuniform vec2 u_pattern_size_b;\nuniform vec2 u_pixel_coord_upper;\nuniform vec2 u_pixel_coord_lower;\nuniform float u_scale_a;\nuniform float u_scale_b;\nuniform float u_tile_units_to_pixels;\n\nattribute vec2 a_pos;\n\nvarying vec2 v_pos_a;\nvarying vec2 v_pos_b;\nvarying vec2 v_pos;\n\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize lowp float opacity\n\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n\n v_pos_a = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, u_scale_a * u_pattern_size_a, u_tile_units_to_pixels, a_pos);\n v_pos_b = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, u_scale_b * u_pattern_size_b, u_tile_units_to_pixels, a_pos);\n\n v_pos = (gl_Position.xy / gl_Position.w + 1.0) / 2.0 * u_world;\n}\n"},fillPattern:{fragmentSource:"uniform vec2 u_pattern_tl_a;\nuniform vec2 u_pattern_br_a;\nuniform vec2 u_pattern_tl_b;\nuniform vec2 u_pattern_br_b;\nuniform float u_mix;\n\nuniform sampler2D u_image;\n\nvarying vec2 v_pos_a;\nvarying vec2 v_pos_b;\n\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize lowp float opacity\n\n vec2 imagecoord = mod(v_pos_a, 1.0);\n vec2 pos = mix(u_pattern_tl_a, u_pattern_br_a, imagecoord);\n vec4 color1 = texture2D(u_image, pos);\n\n vec2 imagecoord_b = mod(v_pos_b, 1.0);\n vec2 pos2 = mix(u_pattern_tl_b, u_pattern_br_b, imagecoord_b);\n vec4 color2 = texture2D(u_image, pos2);\n\n gl_FragColor = mix(color1, color2, u_mix) * opacity;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n",vertexSource:"uniform mat4 u_matrix;\nuniform vec2 u_pattern_size_a;\nuniform vec2 u_pattern_size_b;\nuniform vec2 u_pixel_coord_upper;\nuniform vec2 u_pixel_coord_lower;\nuniform float u_scale_a;\nuniform float u_scale_b;\nuniform float u_tile_units_to_pixels;\n\nattribute vec2 a_pos;\n\nvarying vec2 v_pos_a;\nvarying vec2 v_pos_b;\n\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize lowp float opacity\n\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n\n v_pos_a = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, u_scale_a * u_pattern_size_a, u_tile_units_to_pixels, a_pos);\n v_pos_b = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, u_scale_b * u_pattern_size_b, u_tile_units_to_pixels, a_pos);\n}\n"},fillExtrusion:{fragmentSource:"varying vec4 v_color;\n#pragma mapbox: define lowp float base\n#pragma mapbox: define lowp float height\n#pragma mapbox: define lowp vec4 color\n\nvoid main() {\n #pragma mapbox: initialize lowp float base\n #pragma mapbox: initialize lowp float height\n #pragma mapbox: initialize lowp vec4 color\n\n gl_FragColor = v_color;\n}\n",vertexSource:"uniform mat4 u_matrix;\nuniform vec3 u_lightcolor;\nuniform lowp vec3 u_lightpos;\nuniform lowp float u_lightintensity;\nuniform lowp vec4 u_outline_color;\n\nattribute vec2 a_pos;\nattribute vec3 a_normal;\nattribute float a_edgedistance;\n\nvarying vec4 v_color;\n\n#pragma mapbox: define lowp float base\n#pragma mapbox: define lowp float height\n\n#pragma mapbox: define lowp vec4 color\n\nvoid main() {\n #pragma mapbox: initialize lowp float base\n #pragma mapbox: initialize lowp float height\n #pragma mapbox: initialize lowp vec4 color\n\n float ed = a_edgedistance; // use each attrib in order to not trip a VAO assert\n float t = mod(a_normal.x, 2.0);\n\n gl_Position = u_matrix * vec4(a_pos, t > 0.0 ? height : base, 1);\n\n#ifdef OUTLINE\n color = u_outline_color;\n#endif\n\n // Relative luminance (how dark/bright is the surface color?)\n float colorvalue = color.r * 0.2126 + color.g * 0.7152 + color.b * 0.0722;\n\n v_color = vec4(0.0, 0.0, 0.0, 1.0);\n\n // Add slight ambient lighting so no extrusions are totally black\n vec4 ambientlight = vec4(0.03, 0.03, 0.03, 1.0);\n color += ambientlight;\n\n // Calculate cos(theta), where theta is the angle between surface normal and diffuse light ray\n float directional = clamp(dot(a_normal / 16384.0, u_lightpos), 0.0, 1.0);\n\n // Adjust directional so that\n // the range of values for highlight/shading is narrower\n // with lower light intensity\n // and with lighter/brighter surface colors\n directional = mix((1.0 - u_lightintensity), max((1.0 - colorvalue + u_lightintensity), 1.0), directional);\n\n // Add gradient along z axis of side surfaces\n if (a_normal.y != 0.0) {\n directional *= clamp((t + base) * pow(height / 150.0, 0.5), mix(0.7, 0.98, 1.0 - u_lightintensity), 1.0);\n }\n\n // Assign final color based on surface + ambient light color, diffuse light directional, and light color\n // with lower bounds adjusted to hue of light\n // so that shading is tinted with the complementary (opposite) color to the light color\n v_color.r += clamp(color.r * directional * u_lightcolor.r, mix(0.0, 0.3, 1.0 - u_lightcolor.r), 1.0);\n v_color.g += clamp(color.g * directional * u_lightcolor.g, mix(0.0, 0.3, 1.0 - u_lightcolor.g), 1.0);\n v_color.b += clamp(color.b * directional * u_lightcolor.b, mix(0.0, 0.3, 1.0 - u_lightcolor.b), 1.0);\n}\n"},fillExtrusionPattern:{fragmentSource:"uniform vec2 u_pattern_tl_a;\nuniform vec2 u_pattern_br_a;\nuniform vec2 u_pattern_tl_b;\nuniform vec2 u_pattern_br_b;\nuniform float u_mix;\n\nuniform sampler2D u_image;\n\nvarying vec2 v_pos_a;\nvarying vec2 v_pos_b;\nvarying vec4 v_lighting;\n\n#pragma mapbox: define lowp float base\n#pragma mapbox: define lowp float height\n\nvoid main() {\n #pragma mapbox: initialize lowp float base\n #pragma mapbox: initialize lowp float height\n\n vec2 imagecoord = mod(v_pos_a, 1.0);\n vec2 pos = mix(u_pattern_tl_a, u_pattern_br_a, imagecoord);\n vec4 color1 = texture2D(u_image, pos);\n\n vec2 imagecoord_b = mod(v_pos_b, 1.0);\n vec2 pos2 = mix(u_pattern_tl_b, u_pattern_br_b, imagecoord_b);\n vec4 color2 = texture2D(u_image, pos2);\n\n vec4 mixedColor = mix(color1, color2, u_mix);\n\n gl_FragColor = mixedColor * v_lighting;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n",vertexSource:"uniform mat4 u_matrix;\nuniform vec2 u_pattern_size_a;\nuniform vec2 u_pattern_size_b;\nuniform vec2 u_pixel_coord_upper;\nuniform vec2 u_pixel_coord_lower;\nuniform float u_scale_a;\nuniform float u_scale_b;\nuniform float u_tile_units_to_pixels;\nuniform float u_height_factor;\n\nuniform vec3 u_lightcolor;\nuniform lowp vec3 u_lightpos;\nuniform lowp float u_lightintensity;\n\nattribute vec2 a_pos;\nattribute vec3 a_normal;\nattribute float a_edgedistance;\n\nvarying vec2 v_pos_a;\nvarying vec2 v_pos_b;\nvarying vec4 v_lighting;\nvarying float v_directional;\n\n#pragma mapbox: define lowp float base\n#pragma mapbox: define lowp float height\n\nvoid main() {\n #pragma mapbox: initialize lowp float base\n #pragma mapbox: initialize lowp float height\n\n float t = mod(a_normal.x, 2.0);\n float z = t > 0.0 ? height : base;\n\n gl_Position = u_matrix * vec4(a_pos, z, 1);\n\n vec2 pos = a_normal.x == 1.0 && a_normal.y == 0.0 && a_normal.z == 16384.0\n ? a_pos // extrusion top\n : vec2(a_edgedistance, z * u_height_factor); // extrusion side\n\n v_pos_a = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, u_scale_a * u_pattern_size_a, u_tile_units_to_pixels, pos);\n v_pos_b = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, u_scale_b * u_pattern_size_b, u_tile_units_to_pixels, pos);\n\n v_lighting = vec4(0.0, 0.0, 0.0, 1.0);\n float directional = clamp(dot(a_normal / 16383.0, u_lightpos), 0.0, 1.0);\n directional = mix((1.0 - u_lightintensity), max((0.5 + u_lightintensity), 1.0), directional);\n\n if (a_normal.y != 0.0) {\n directional *= clamp((t + base) * pow(height / 150.0, 0.5), mix(0.7, 0.98, 1.0 - u_lightintensity), 1.0);\n }\n\n v_lighting.rgb += clamp(directional * u_lightcolor, mix(vec3(0.0), vec3(0.3), 1.0 - u_lightcolor), vec3(1.0));\n}\n"},extrusionTexture:{fragmentSource:"uniform sampler2D u_texture;\nuniform float u_opacity;\n\nvarying vec2 v_pos;\n\nvoid main() {\n gl_FragColor = texture2D(u_texture, v_pos) * u_opacity;\n}\n",vertexSource:"uniform mat4 u_matrix;\nuniform int u_xdim;\nuniform int u_ydim;\nattribute vec2 a_pos;\nvarying vec2 v_pos;\n\nvoid main() {\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n\n v_pos.x = a_pos.x / float(u_xdim);\n v_pos.y = 1.0 - a_pos.y / float(u_ydim);\n}\n"},line:{fragmentSource:"#pragma mapbox: define lowp vec4 color\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n\nvarying vec2 v_width2;\nvarying vec2 v_normal;\nvarying float v_gamma_scale;\n\nvoid main() {\n #pragma mapbox: initialize lowp vec4 color\n #pragma mapbox: initialize lowp float blur\n #pragma mapbox: initialize lowp float opacity\n\n // Calculate the distance of the pixel from the line in pixels.\n float dist = length(v_normal) * v_width2.s;\n\n // Calculate the antialiasing fade factor. This is either when fading in\n // the line in case of an offset line (v_width2.t) or when fading out\n // (v_width2.s)\n float blur2 = (blur + 1.0 / DEVICE_PIXEL_RATIO) * v_gamma_scale;\n float alpha = clamp(min(dist - (v_width2.t - blur2), v_width2.s - dist) / blur2, 0.0, 1.0);\n\n gl_FragColor = color * (alpha * opacity);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n",vertexSource:"\n\n// the distance over which the line edge fades out.\n// Retina devices need a smaller distance to avoid aliasing.\n#define ANTIALIASING 1.0 / DEVICE_PIXEL_RATIO / 2.0\n\n// floor(127 / 2) == 63.0\n// the maximum allowed miter limit is 2.0 at the moment. the extrude normal is\n// stored in a byte (-128..127). we scale regular normals up to length 63, but\n// there are also \"special\" normals that have a bigger length (of up to 126 in\n// this case).\n// #define scale 63.0\n#define scale 0.015873016\n\nattribute vec2 a_pos;\nattribute vec4 a_data;\n\nuniform mat4 u_matrix;\nuniform mediump float u_ratio;\nuniform mediump float u_width;\nuniform vec2 u_gl_units_to_pixels;\n\nvarying vec2 v_normal;\nvarying vec2 v_width2;\nvarying float v_gamma_scale;\n\n#pragma mapbox: define lowp vec4 color\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define mediump float gapwidth\n#pragma mapbox: define lowp float offset\n\nvoid main() {\n #pragma mapbox: initialize lowp vec4 color\n #pragma mapbox: initialize lowp float blur\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize mediump float gapwidth\n #pragma mapbox: initialize lowp float offset\n\n vec2 a_extrude = a_data.xy - 128.0;\n float a_direction = mod(a_data.z, 4.0) - 1.0;\n\n // We store the texture normals in the most insignificant bit\n // transform y so that 0 => -1 and 1 => 1\n // In the texture normal, x is 0 if the normal points straight up/down and 1 if it's a round cap\n // y is 1 if the normal points up, and -1 if it points down\n mediump vec2 normal = mod(a_pos, 2.0);\n normal.y = sign(normal.y - 0.5);\n v_normal = normal;\n\n\n // these transformations used to be applied in the JS and native code bases. \n // moved them into the shader for clarity and simplicity. \n gapwidth = gapwidth / 2.0;\n float width = u_width / 2.0;\n offset = -1.0 * offset; \n\n float inset = gapwidth + (gapwidth > 0.0 ? ANTIALIASING : 0.0);\n float outset = gapwidth + width * (gapwidth > 0.0 ? 2.0 : 1.0) + ANTIALIASING;\n\n // Scale the extrusion vector down to a normal and then up by the line width\n // of this vertex.\n mediump vec2 dist = outset * a_extrude * scale;\n\n // Calculate the offset when drawing a line that is to the side of the actual line.\n // We do this by creating a vector that points towards the extrude, but rotate\n // it when we're drawing round end points (a_direction = -1 or 1) since their\n // extrude vector points in another direction.\n mediump float u = 0.5 * a_direction;\n mediump float t = 1.0 - abs(u);\n mediump vec2 offset2 = offset * a_extrude * scale * normal.y * mat2(t, -u, u, t);\n\n // Remove the texture normal bit to get the position\n vec2 pos = floor(a_pos * 0.5);\n\n vec4 projected_extrude = u_matrix * vec4(dist / u_ratio, 0.0, 0.0);\n gl_Position = u_matrix * vec4(pos + offset2 / u_ratio, 0.0, 1.0) + projected_extrude;\n\n // calculate how much the perspective view squishes or stretches the extrude\n float extrude_length_without_perspective = length(dist);\n float extrude_length_with_perspective = length(projected_extrude.xy / gl_Position.w * u_gl_units_to_pixels);\n v_gamma_scale = extrude_length_without_perspective / extrude_length_with_perspective;\n\n v_width2 = vec2(outset, inset);\n}\n"},linePattern:{fragmentSource:"uniform vec2 u_pattern_size_a;\nuniform vec2 u_pattern_size_b;\nuniform vec2 u_pattern_tl_a;\nuniform vec2 u_pattern_br_a;\nuniform vec2 u_pattern_tl_b;\nuniform vec2 u_pattern_br_b;\nuniform float u_fade;\n\nuniform sampler2D u_image;\n\nvarying vec2 v_normal;\nvarying vec2 v_width2;\nvarying float v_linesofar;\nvarying float v_gamma_scale;\n\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize lowp float blur\n #pragma mapbox: initialize lowp float opacity\n\n // Calculate the distance of the pixel from the line in pixels.\n float dist = length(v_normal) * v_width2.s;\n\n // Calculate the antialiasing fade factor. This is either when fading in\n // the line in case of an offset line (v_width2.t) or when fading out\n // (v_width2.s)\n float blur2 = (blur + 1.0 / DEVICE_PIXEL_RATIO) * v_gamma_scale;\n float alpha = clamp(min(dist - (v_width2.t - blur2), v_width2.s - dist) / blur2, 0.0, 1.0);\n\n float x_a = mod(v_linesofar / u_pattern_size_a.x, 1.0);\n float x_b = mod(v_linesofar / u_pattern_size_b.x, 1.0);\n float y_a = 0.5 + (v_normal.y * v_width2.s / u_pattern_size_a.y);\n float y_b = 0.5 + (v_normal.y * v_width2.s / u_pattern_size_b.y);\n vec2 pos_a = mix(u_pattern_tl_a, u_pattern_br_a, vec2(x_a, y_a));\n vec2 pos_b = mix(u_pattern_tl_b, u_pattern_br_b, vec2(x_b, y_b));\n\n vec4 color = mix(texture2D(u_image, pos_a), texture2D(u_image, pos_b), u_fade);\n\n gl_FragColor = color * alpha * opacity;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n",vertexSource:"// floor(127 / 2) == 63.0\n// the maximum allowed miter limit is 2.0 at the moment. the extrude normal is\n// stored in a byte (-128..127). we scale regular normals up to length 63, but\n// there are also \"special\" normals that have a bigger length (of up to 126 in\n// this case).\n// #define scale 63.0\n#define scale 0.015873016\n\n// We scale the distance before adding it to the buffers so that we can store\n// long distances for long segments. Use this value to unscale the distance.\n#define LINE_DISTANCE_SCALE 2.0\n\n// the distance over which the line edge fades out.\n// Retina devices need a smaller distance to avoid aliasing.\n#define ANTIALIASING 1.0 / DEVICE_PIXEL_RATIO / 2.0\n\nattribute vec2 a_pos;\nattribute vec4 a_data;\n\nuniform mat4 u_matrix;\nuniform mediump float u_ratio;\nuniform mediump float u_width;\nuniform vec2 u_gl_units_to_pixels;\n\nvarying vec2 v_normal;\nvarying vec2 v_width2;\nvarying float v_linesofar;\nvarying float v_gamma_scale;\n\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp float offset\n#pragma mapbox: define mediump float gapwidth\n\nvoid main() {\n #pragma mapbox: initialize lowp float blur\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize lowp float offset\n #pragma mapbox: initialize mediump float gapwidth\n\n vec2 a_extrude = a_data.xy - 128.0;\n float a_direction = mod(a_data.z, 4.0) - 1.0;\n float a_linesofar = (floor(a_data.z / 4.0) + a_data.w * 64.0) * LINE_DISTANCE_SCALE;\n\n // We store the texture normals in the most insignificant bit\n // transform y so that 0 => -1 and 1 => 1\n // In the texture normal, x is 0 if the normal points straight up/down and 1 if it's a round cap\n // y is 1 if the normal points up, and -1 if it points down\n mediump vec2 normal = mod(a_pos, 2.0);\n normal.y = sign(normal.y - 0.5);\n v_normal = normal;\n\n // these transformations used to be applied in the JS and native code bases. \n // moved them into the shader for clarity and simplicity. \n gapwidth = gapwidth / 2.0;\n float width = u_width / 2.0;\n offset = -1.0 * offset; \n\n float inset = gapwidth + (gapwidth > 0.0 ? ANTIALIASING : 0.0);\n float outset = gapwidth + width * (gapwidth > 0.0 ? 2.0 : 1.0) + ANTIALIASING;\n\n // Scale the extrusion vector down to a normal and then up by the line width\n // of this vertex.\n mediump vec2 dist = outset * a_extrude * scale;\n\n // Calculate the offset when drawing a line that is to the side of the actual line.\n // We do this by creating a vector that points towards the extrude, but rotate\n // it when we're drawing round end points (a_direction = -1 or 1) since their\n // extrude vector points in another direction.\n mediump float u = 0.5 * a_direction;\n mediump float t = 1.0 - abs(u);\n mediump vec2 offset2 = offset * a_extrude * scale * normal.y * mat2(t, -u, u, t);\n\n // Remove the texture normal bit to get the position\n vec2 pos = floor(a_pos * 0.5);\n\n vec4 projected_extrude = u_matrix * vec4(dist / u_ratio, 0.0, 0.0);\n gl_Position = u_matrix * vec4(pos + offset2 / u_ratio, 0.0, 1.0) + projected_extrude;\n\n // calculate how much the perspective view squishes or stretches the extrude\n float extrude_length_without_perspective = length(dist);\n float extrude_length_with_perspective = length(projected_extrude.xy / gl_Position.w * u_gl_units_to_pixels);\n v_gamma_scale = extrude_length_without_perspective / extrude_length_with_perspective;\n\n v_linesofar = a_linesofar;\n v_width2 = vec2(outset, inset);\n}\n"},lineSDF:{fragmentSource:"\nuniform sampler2D u_image;\nuniform float u_sdfgamma;\nuniform float u_mix;\n\nvarying vec2 v_normal;\nvarying vec2 v_width2;\nvarying vec2 v_tex_a;\nvarying vec2 v_tex_b;\nvarying float v_gamma_scale;\n\n#pragma mapbox: define lowp vec4 color\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize lowp vec4 color\n #pragma mapbox: initialize lowp float blur\n #pragma mapbox: initialize lowp float opacity\n\n // Calculate the distance of the pixel from the line in pixels.\n float dist = length(v_normal) * v_width2.s;\n\n // Calculate the antialiasing fade factor. This is either when fading in\n // the line in case of an offset line (v_width2.t) or when fading out\n // (v_width2.s)\n float blur2 = (blur + 1.0 / DEVICE_PIXEL_RATIO) * v_gamma_scale;\n float alpha = clamp(min(dist - (v_width2.t - blur2), v_width2.s - dist) / blur2, 0.0, 1.0);\n\n float sdfdist_a = texture2D(u_image, v_tex_a).a;\n float sdfdist_b = texture2D(u_image, v_tex_b).a;\n float sdfdist = mix(sdfdist_a, sdfdist_b, u_mix);\n alpha *= smoothstep(0.5 - u_sdfgamma, 0.5 + u_sdfgamma, sdfdist);\n\n gl_FragColor = color * (alpha * opacity);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n",vertexSource:"// floor(127 / 2) == 63.0\n// the maximum allowed miter limit is 2.0 at the moment. the extrude normal is\n// stored in a byte (-128..127). we scale regular normals up to length 63, but\n// there are also \"special\" normals that have a bigger length (of up to 126 in\n// this case).\n// #define scale 63.0\n#define scale 0.015873016\n\n// We scale the distance before adding it to the buffers so that we can store\n// long distances for long segments. Use this value to unscale the distance.\n#define LINE_DISTANCE_SCALE 2.0\n\n// the distance over which the line edge fades out.\n// Retina devices need a smaller distance to avoid aliasing.\n#define ANTIALIASING 1.0 / DEVICE_PIXEL_RATIO / 2.0\n\nattribute vec2 a_pos;\nattribute vec4 a_data;\n\nuniform mat4 u_matrix;\nuniform mediump float u_ratio;\nuniform vec2 u_patternscale_a;\nuniform float u_tex_y_a;\nuniform vec2 u_patternscale_b;\nuniform float u_tex_y_b;\nuniform vec2 u_gl_units_to_pixels;\nuniform mediump float u_width;\n\nvarying vec2 v_normal;\nvarying vec2 v_width2;\nvarying vec2 v_tex_a;\nvarying vec2 v_tex_b;\nvarying float v_gamma_scale;\n\n#pragma mapbox: define lowp vec4 color\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define mediump float gapwidth\n#pragma mapbox: define lowp float offset\n\nvoid main() {\n #pragma mapbox: initialize lowp vec4 color\n #pragma mapbox: initialize lowp float blur\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize mediump float gapwidth\n #pragma mapbox: initialize lowp float offset\n\n vec2 a_extrude = a_data.xy - 128.0;\n float a_direction = mod(a_data.z, 4.0) - 1.0;\n float a_linesofar = (floor(a_data.z / 4.0) + a_data.w * 64.0) * LINE_DISTANCE_SCALE;\n\n // We store the texture normals in the most insignificant bit\n // transform y so that 0 => -1 and 1 => 1\n // In the texture normal, x is 0 if the normal points straight up/down and 1 if it's a round cap\n // y is 1 if the normal points up, and -1 if it points down\n mediump vec2 normal = mod(a_pos, 2.0);\n normal.y = sign(normal.y - 0.5);\n v_normal = normal;\n\n // these transformations used to be applied in the JS and native code bases. \n // moved them into the shader for clarity and simplicity. \n gapwidth = gapwidth / 2.0;\n float width = u_width / 2.0;\n offset = -1.0 * offset;\n \n float inset = gapwidth + (gapwidth > 0.0 ? ANTIALIASING : 0.0);\n float outset = gapwidth + width * (gapwidth > 0.0 ? 2.0 : 1.0) + ANTIALIASING;\n\n // Scale the extrusion vector down to a normal and then up by the line width\n // of this vertex.\n mediump vec2 dist =outset * a_extrude * scale;\n\n // Calculate the offset when drawing a line that is to the side of the actual line.\n // We do this by creating a vector that points towards the extrude, but rotate\n // it when we're drawing round end points (a_direction = -1 or 1) since their\n // extrude vector points in another direction.\n mediump float u = 0.5 * a_direction;\n mediump float t = 1.0 - abs(u);\n mediump vec2 offset2 = offset * a_extrude * scale * normal.y * mat2(t, -u, u, t);\n\n // Remove the texture normal bit to get the position\n vec2 pos = floor(a_pos * 0.5);\n\n vec4 projected_extrude = u_matrix * vec4(dist / u_ratio, 0.0, 0.0);\n gl_Position = u_matrix * vec4(pos + offset2 / u_ratio, 0.0, 1.0) + projected_extrude;\n\n // calculate how much the perspective view squishes or stretches the extrude\n float extrude_length_without_perspective = length(dist);\n float extrude_length_with_perspective = length(projected_extrude.xy / gl_Position.w * u_gl_units_to_pixels);\n v_gamma_scale = extrude_length_without_perspective / extrude_length_with_perspective;\n\n v_tex_a = vec2(a_linesofar * u_patternscale_a.x, normal.y * u_patternscale_a.y + u_tex_y_a);\n v_tex_b = vec2(a_linesofar * u_patternscale_b.x, normal.y * u_patternscale_b.y + u_tex_y_b);\n\n v_width2 = vec2(outset, inset);\n}\n" +},raster:{fragmentSource:"uniform float u_opacity0;\nuniform float u_opacity1;\nuniform sampler2D u_image0;\nuniform sampler2D u_image1;\nvarying vec2 v_pos0;\nvarying vec2 v_pos1;\n\nuniform float u_brightness_low;\nuniform float u_brightness_high;\n\nuniform float u_saturation_factor;\nuniform float u_contrast_factor;\nuniform vec3 u_spin_weights;\n\nvoid main() {\n\n // read and cross-fade colors from the main and parent tiles\n vec4 color0 = texture2D(u_image0, v_pos0);\n vec4 color1 = texture2D(u_image1, v_pos1);\n vec4 color = color0 * u_opacity0 + color1 * u_opacity1;\n vec3 rgb = color.rgb;\n\n // spin\n rgb = vec3(\n dot(rgb, u_spin_weights.xyz),\n dot(rgb, u_spin_weights.zxy),\n dot(rgb, u_spin_weights.yzx));\n\n // saturation\n float average = (color.r + color.g + color.b) / 3.0;\n rgb += (average - rgb) * u_saturation_factor;\n\n // contrast\n rgb = (rgb - 0.5) * u_contrast_factor + 0.5;\n\n // brightness\n vec3 u_high_vec = vec3(u_brightness_low, u_brightness_low, u_brightness_low);\n vec3 u_low_vec = vec3(u_brightness_high, u_brightness_high, u_brightness_high);\n\n gl_FragColor = vec4(mix(u_high_vec, u_low_vec, rgb), color.a);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n",vertexSource:"uniform mat4 u_matrix;\nuniform vec2 u_tl_parent;\nuniform float u_scale_parent;\nuniform float u_buffer_scale;\n\nattribute vec2 a_pos;\nattribute vec2 a_texture_pos;\n\nvarying vec2 v_pos0;\nvarying vec2 v_pos1;\n\nvoid main() {\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n v_pos0 = (((a_texture_pos / 32767.0) - 0.5) / u_buffer_scale ) + 0.5;\n v_pos1 = (v_pos0 * u_scale_parent) + u_tl_parent;\n}\n"},symbolIcon:{fragmentSource:"uniform sampler2D u_texture;\nuniform sampler2D u_fadetexture;\nuniform lowp float u_opacity;\n\nvarying vec2 v_tex;\nvarying vec2 v_fade_tex;\n\nvoid main() {\n lowp float alpha = texture2D(u_fadetexture, v_fade_tex).a * u_opacity;\n gl_FragColor = texture2D(u_texture, v_tex) * alpha;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n",vertexSource:"attribute vec2 a_pos;\nattribute vec2 a_offset;\nattribute vec2 a_texture_pos;\nattribute vec4 a_data;\n\n\n// matrix is for the vertex position.\nuniform mat4 u_matrix;\n\nuniform mediump float u_zoom;\nuniform bool u_rotate_with_map;\nuniform vec2 u_extrude_scale;\n\nuniform vec2 u_texsize;\n\nvarying vec2 v_tex;\nvarying vec2 v_fade_tex;\n\nvoid main() {\n vec2 a_tex = a_texture_pos.xy;\n mediump float a_labelminzoom = a_data[0];\n mediump vec2 a_zoom = a_data.pq;\n mediump float a_minzoom = a_zoom[0];\n mediump float a_maxzoom = a_zoom[1];\n\n // u_zoom is the current zoom level adjusted for the change in font size\n mediump float z = 2.0 - step(a_minzoom, u_zoom) - (1.0 - step(a_maxzoom, u_zoom));\n\n vec2 extrude = u_extrude_scale * (a_offset / 64.0);\n if (u_rotate_with_map) {\n gl_Position = u_matrix * vec4(a_pos + extrude, 0, 1);\n gl_Position.z += z * gl_Position.w;\n } else {\n gl_Position = u_matrix * vec4(a_pos, 0, 1) + vec4(extrude, 0, 0);\n }\n\n v_tex = a_tex / u_texsize;\n v_fade_tex = vec2(a_labelminzoom / 255.0, 0.0);\n}\n"},symbolSDF:{fragmentSource:"uniform sampler2D u_texture;\nuniform sampler2D u_fadetexture;\nuniform lowp vec4 u_color;\nuniform lowp float u_opacity;\nuniform lowp float u_buffer;\nuniform lowp float u_gamma;\n\nvarying vec2 v_tex;\nvarying vec2 v_fade_tex;\nvarying float v_gamma_scale;\n\nvoid main() {\n lowp float dist = texture2D(u_texture, v_tex).a;\n lowp float fade_alpha = texture2D(u_fadetexture, v_fade_tex).a;\n lowp float gamma = u_gamma * v_gamma_scale;\n lowp float alpha = smoothstep(u_buffer - gamma, u_buffer + gamma, dist) * fade_alpha;\n\n gl_FragColor = u_color * (alpha * u_opacity);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n",vertexSource:"const float PI = 3.141592653589793;\n\nattribute vec2 a_pos;\nattribute vec2 a_offset;\nattribute vec2 a_texture_pos;\nattribute vec4 a_data;\n\n\n// matrix is for the vertex position.\nuniform mat4 u_matrix;\n\nuniform mediump float u_zoom;\nuniform bool u_rotate_with_map;\nuniform bool u_pitch_with_map;\nuniform mediump float u_pitch;\nuniform mediump float u_bearing;\nuniform mediump float u_aspect_ratio;\nuniform vec2 u_extrude_scale;\n\nuniform vec2 u_texsize;\n\nvarying vec2 v_tex;\nvarying vec2 v_fade_tex;\nvarying float v_gamma_scale;\n\nvoid main() {\n vec2 a_tex = a_texture_pos.xy;\n mediump float a_labelminzoom = a_data[0];\n mediump vec2 a_zoom = a_data.pq;\n mediump float a_minzoom = a_zoom[0];\n mediump float a_maxzoom = a_zoom[1];\n\n // u_zoom is the current zoom level adjusted for the change in font size\n mediump float z = 2.0 - step(a_minzoom, u_zoom) - (1.0 - step(a_maxzoom, u_zoom));\n\n // pitch-alignment: map\n // rotation-alignment: map | viewport\n if (u_pitch_with_map) {\n lowp float angle = u_rotate_with_map ? (a_data[1] / 256.0 * 2.0 * PI) : u_bearing;\n lowp float asin = sin(angle);\n lowp float acos = cos(angle);\n mat2 RotationMatrix = mat2(acos, asin, -1.0 * asin, acos);\n vec2 offset = RotationMatrix * a_offset;\n vec2 extrude = u_extrude_scale * (offset / 64.0);\n gl_Position = u_matrix * vec4(a_pos + extrude, 0, 1);\n gl_Position.z += z * gl_Position.w;\n // pitch-alignment: viewport\n // rotation-alignment: map\n } else if (u_rotate_with_map) {\n // foreshortening factor to apply on pitched maps\n // as a label goes from horizontal <=> vertical in angle\n // it goes from 0% foreshortening to up to around 70% foreshortening\n lowp float pitchfactor = 1.0 - cos(u_pitch * sin(u_pitch * 0.75));\n\n lowp float lineangle = a_data[1] / 256.0 * 2.0 * PI;\n\n // use the lineangle to position points a,b along the line\n // project the points and calculate the label angle in projected space\n // this calculation allows labels to be rendered unskewed on pitched maps\n vec4 a = u_matrix * vec4(a_pos, 0, 1);\n vec4 b = u_matrix * vec4(a_pos + vec2(cos(lineangle),sin(lineangle)), 0, 1);\n lowp float angle = atan((b[1]/b[3] - a[1]/a[3])/u_aspect_ratio, b[0]/b[3] - a[0]/a[3]);\n lowp float asin = sin(angle);\n lowp float acos = cos(angle);\n mat2 RotationMatrix = mat2(acos, -1.0 * asin, asin, acos);\n\n vec2 offset = RotationMatrix * (vec2((1.0-pitchfactor)+(pitchfactor*cos(angle*2.0)), 1.0) * a_offset);\n vec2 extrude = u_extrude_scale * (offset / 64.0);\n gl_Position = u_matrix * vec4(a_pos, 0, 1) + vec4(extrude, 0, 0);\n gl_Position.z += z * gl_Position.w;\n // pitch-alignment: viewport\n // rotation-alignment: viewport\n } else {\n vec2 extrude = u_extrude_scale * (a_offset / 64.0);\n gl_Position = u_matrix * vec4(a_pos, 0, 1) + vec4(extrude, 0, 0);\n }\n\n v_gamma_scale = gl_Position.w;\n\n v_tex = a_tex / u_texsize;\n v_fade_tex = vec2(a_labelminzoom / 255.0, 0.0);\n}\n"}}; +},{"path":191}],39:[function(require,module,exports){ +"use strict";var VertexArrayObject=function(){this.boundProgram=null,this.boundVertexBuffer=null,this.boundVertexBuffer2=null,this.boundElementBuffer=null,this.boundVertexOffset=null,this.vao=null};VertexArrayObject.prototype.bind=function(e,t,r,i,n,o){void 0===e.extVertexArrayObject&&(e.extVertexArrayObject=e.getExtension("OES_vertex_array_object"));var s=!this.vao||this.boundProgram!==t||this.boundVertexBuffer!==r||this.boundVertexBuffer2!==n||this.boundElementBuffer!==i||this.boundVertexOffset!==o;!e.extVertexArrayObject||s?(this.freshBind(e,t,r,i,n,o),this.gl=e):e.extVertexArrayObject.bindVertexArrayOES(this.vao)},VertexArrayObject.prototype.freshBind=function(e,t,r,i,n,o){var s,u=t.numAttributes;if(e.extVertexArrayObject)this.vao&&this.destroy(),this.vao=e.extVertexArrayObject.createVertexArrayOES(),e.extVertexArrayObject.bindVertexArrayOES(this.vao),s=0,this.boundProgram=t,this.boundVertexBuffer=r,this.boundVertexBuffer2=n,this.boundElementBuffer=i,this.boundVertexOffset=o;else{s=e.currentNumAttributes||0;for(var b=u;bthis.maxzoom?Math.pow(2,t.coord.z-this.maxzoom):1,r={type:this.type,uid:t.uid,coord:t.coord,zoom:t.coord.z,maxZoom:this.maxzoom,tileSize:this.tileSize,source:this.id,overscaling:i,angle:this.map.transform.angle,pitch:this.map.transform.pitch,showCollisionBoxes:this.map.showCollisionBoxes};t.workerID=this.dispatcher.send("loadTile",r,function(i,r){if(t.unloadVectorData(),!t.aborted)return i?e(i):(t.loadVectorData(r,o.map.painter),t.redoWhenDone&&(t.redoWhenDone=!1,t.redoPlacement(o)),e(null))},this.workerID)},e.prototype.abortTile=function(t){t.aborted=!0},e.prototype.unloadTile=function(t){t.unloadVectorData(),this.dispatcher.send("removeTile",{uid:t.uid,type:this.type,source:this.id},function(){},t.workerID)},e.prototype.onRemove=function(){this.dispatcher.broadcast("removeSource",{type:this.type,source:this.id},function(){})},e.prototype.serialize=function(){return{type:this.type,data:this._data}},e}(Evented);module.exports=GeoJSONSource; +},{"../data/extent":11,"../util/evented":116,"../util/util":127,"../util/window":110}],41:[function(require,module,exports){ +"use strict";var ajax=require("../util/ajax"),rewind=require("geojson-rewind"),GeoJSONWrapper=require("./geojson_wrapper"),vtpbf=require("vt-pbf"),supercluster=require("supercluster"),geojsonvt=require("geojson-vt"),VectorTileWorkerSource=require("./vector_tile_worker_source"),GeoJSONWorkerSource=function(e){function r(r,t,o){e.call(this,r,t),o&&(this.loadGeoJSON=o),this._geoJSONIndexes={}}return e&&(r.__proto__=e),r.prototype=Object.create(e&&e.prototype),r.prototype.constructor=r,r.prototype.loadVectorData=function(e,r){var t=e.source,o=e.coord;if(!this._geoJSONIndexes[t])return r(null,null);var n=this._geoJSONIndexes[t].getTile(Math.min(o.z,e.maxZoom),o.x,o.y);if(!n)return r(null,null);var u=new GeoJSONWrapper(n.features);u.name="_geojsonTileLayer";var a=vtpbf({layers:{_geojsonTileLayer:u}});0===a.byteOffset&&a.byteLength===a.buffer.byteLength||(a=new Uint8Array(a)),u.rawData=a.buffer,r(null,u)},r.prototype.loadData=function(e,r){var t=function(t,o){var n=this;return t?r(t):"object"!=typeof o?r(new Error("Input data is not a valid GeoJSON object.")):(rewind(o,!0),void this._indexData(o,e,function(t,o){return t?r(t):(n._geoJSONIndexes[e.source]=o,void r(null))}))}.bind(this);this.loadGeoJSON(e,t)},r.prototype.loadGeoJSON=function(e,r){if(e.url)ajax.getJSON(e.url,r);else{if("string"!=typeof e.data)return r(new Error("Input data is not a valid GeoJSON object."));try{return r(null,JSON.parse(e.data))}catch(e){return r(new Error("Input data is not a valid GeoJSON object."))}}},r.prototype.removeSource=function(e){this._geoJSONIndexes[e.source]&&delete this._geoJSONIndexes[e.source]},r.prototype._indexData=function(e,r,t){try{r.cluster?t(null,supercluster(r.superclusterOptions).load(e.features)):t(null,geojsonvt(e,r.geojsonVtOptions))}catch(e){return t(e)}},r}(VectorTileWorkerSource);module.exports=GeoJSONWorkerSource; +},{"../util/ajax":107,"./geojson_wrapper":42,"./vector_tile_worker_source":53,"geojson-rewind":137,"geojson-vt":141,"supercluster":198,"vt-pbf":208}],42:[function(require,module,exports){ +"use strict";var Point=require("point-geometry"),VectorTileFeature=require("vector-tile").VectorTileFeature,EXTENT=require("../data/extent"),FeatureWrapper=function(e){var t=this;if(this.type=e.type,1===e.type){this.rawGeometry=[];for(var r=0;ro)){var n=Math.pow(2,Math.min(a.coord.z,r._source.maxzoom)-Math.min(e.z,r._source.maxzoom));if(Math.floor(a.coord.x/n)===e.x&&Math.floor(a.coord.y/n)===e.y)for(t[s]=!0,i=!0;a&&a.coord.z-1>e.z;){var d=a.coord.parent(r._source.maxzoom).id;a=r._tiles[d],a&&a.hasData()&&(delete t[s],t[d]=!0)}}}return i},o.prototype.findLoadedParent=function(e,o,t){for(var r=this,i=e.z-1;i>=o;i--){e=e.parent(r._source.maxzoom);var s=r._tiles[e.id];if(s&&s.hasData())return t[e.id]=!0,s;if(r._cache.has(e.id))return r.addTile(e),t[e.id]=!0,r._tiles[e.id]}},o.prototype.updateCacheSize=function(e){var o=Math.ceil(e.width/e.tileSize)+1,t=Math.ceil(e.height/e.tileSize)+1,r=o*t,i=5;this._cache.setMaxSize(Math.floor(r*i))},o.prototype.update=function(e){var t=this;if(this._sourceLoaded){var r,i,s;this.updateCacheSize(e);var a=(this._source.roundZoom?Math.round:Math.floor)(this.getZoom(e)),n=Math.max(a-o.maxOverzooming,this._source.minzoom),d=Math.max(a+o.maxUnderzooming,this._source.minzoom),c={};this._coveredTiles={};var h;for(h=this.used?this._source.coord?[this._source.coord]:e.coveringTiles({tileSize:this._source.tileSize,minzoom:this._source.minzoom,maxzoom:this._source.maxzoom,roundZoom:this._source.roundZoom,reparseOverscaled:this._source.reparseOverscaled}):[],r=0;r=Date.now()&&(t.findLoadedChildren(i,d,c)&&(c[_]=!0),t.findLoadedParent(i,n,u))}var m;for(m in u)c[m]||(t._coveredTiles[m]=!0);for(m in u)c[m]=!0;var f=util.keysDifference(this._tiles,c);for(r=0;rthis._source.maxzoom?Math.pow(2,r-this._source.maxzoom):1;o=new Tile(t,this._source.tileSize*i,this._source.maxzoom),this.loadTile(o,this._tileLoaded.bind(this,o))}return o.uses++,this._tiles[e.id]=o,this._source.fire("dataloading",{tile:o,coord:o.coord,dataType:"tile"}),o},o.prototype.removeTile=function(e){var o=this._tiles[e];o&&(o.uses--,delete this._tiles[e],this._source.fire("data",{tile:o,coord:o.coord,dataType:"tile"}),o.uses>0||(o.hasData()?this._cache.add(o.coord.wrapped().id,o):(o.aborted=!0,this.abortTile(o),this.unloadTile(o))))},o.prototype.clearTiles=function(){var e=this;for(var o in this._tiles)e.removeTile(o);this._cache.reset()},o.prototype.tilesIn=function(e){for(var o=this,t={},r=this.getIds(),i=1/0,s=1/0,a=-(1/0),n=-(1/0),d=e[0].zoom,c=0;c=0&&_[1].y>=0){for(var m=[],f=0;fi.row){var o=t;t=i,i=o}return{x0:t.column,y0:t.row,x1:i.column,y1:i.row,dx:i.column-t.column,dy:i.row-t.row}}function scanSpans(t,i,o,r,e){var n=Math.max(o,Math.floor(i.y0)),h=Math.min(r,Math.ceil(i.y1));if(t.x0===i.x0&&t.y0===i.y0?t.x0+i.dy/t.dy*t.dx0,l=i.dx<0,u=n;ua.dy&&(h=s,s=a,a=h),s.dy>d.dy&&(h=s,s=d,d=h),a.dy>d.dy&&(h=a,a=d,d=h),s.dy&&scanSpans(d,s,r,e,n),a.dy&&scanSpans(d,a,r,e,n)}function getQuadkey(t,i,o){for(var r,e="",n=t;n>0;n--)r=1<t?new TileCoord(this.z-1,this.x,this.y,this.w):new TileCoord(this.z-1,Math.floor(this.x/2),Math.floor(this.y/2),this.w)},TileCoord.prototype.wrapped=function(){return new TileCoord(this.z,this.x,this.y,0)},TileCoord.prototype.children=function(t){if(this.z>=t)return[new TileCoord(this.z+1,this.x,this.y,this.w)];var i=this.z+1,o=2*this.x,r=2*this.y;return[new TileCoord(i,o,r,this.w),new TileCoord(i,o+1,r,this.w),new TileCoord(i,o,r+1,this.w),new TileCoord(i,o+1,r+1,this.w)]},TileCoord.cover=function(t,i,o){function r(t,i,r){var h,s,a;if(r>=0&&r<=e)for(h=t;hthis.maxzoom?Math.pow(2,e.coord.z-this.maxzoom):1,r={url:normalizeURL(e.coord.url(this.tiles,this.maxzoom,this.scheme),this.url),uid:e.uid,coord:e.coord,zoom:e.coord.z,tileSize:this.tileSize*o,type:this.type,source:this.id,overscaling:o,angle:this.map.transform.angle,pitch:this.map.transform.pitch,showCollisionBoxes:this.map.showCollisionBoxes};e.workerID?"loading"===e.state?e.reloadCallback=t:this.dispatcher.send("reloadTile",r,i.bind(this),e.workerID):e.workerID=this.dispatcher.send("loadTile",r,i.bind(this))},t.prototype.abortTile=function(e){this.dispatcher.send("abortTile",{uid:e.uid,type:this.type,source:this.id},null,e.workerID)},t.prototype.unloadTile=function(e){e.unloadVectorData(),this.dispatcher.send("removeTile",{uid:e.uid,type:this.type,source:this.id},null,e.workerID)},t}(Evented);module.exports=VectorTileSource; +},{"../util/evented":116,"../util/mapbox":123,"../util/util":127,"./load_tilejson":44}],53:[function(require,module,exports){ +"use strict";var ajax=require("../util/ajax"),vt=require("vector-tile"),Protobuf=require("pbf"),WorkerTile=require("./worker_tile"),util=require("../util/util"),VectorTileWorkerSource=function(e,r,t){this.actor=e,this.layerIndex=r,t&&(this.loadVectorData=t),this.loading={},this.loaded={}};VectorTileWorkerSource.prototype.loadTile=function(e,r){function t(e,t){return delete this.loading[o][i],e?r(e):t?(a.vectorTile=t,a.parse(t,this.layerIndex,this.actor,function(e,o,i){return e?r(e):void r(null,util.extend({rawTileData:t.rawData},o),i)}),this.loaded[o]=this.loaded[o]||{},void(this.loaded[o][i]=a)):r(null,null)}var o=e.source,i=e.uid;this.loading[o]||(this.loading[o]={});var a=this.loading[o][i]=new WorkerTile(e);a.abort=this.loadVectorData(e,t.bind(this))},VectorTileWorkerSource.prototype.reloadTile=function(e,r){function t(e,t){if(this.reloadCallback){var o=this.reloadCallback;delete this.reloadCallback,this.parse(this.vectorTile,a.layerIndex,a.actor,o)}r(e,t)}var o=this.loaded[e.source],i=e.uid,a=this;if(o&&o[i]){var l=o[i];"parsing"===l.status?l.reloadCallback=r:"done"===l.status&&l.parse(l.vectorTile,this.layerIndex,this.actor,t.bind(l))}},VectorTileWorkerSource.prototype.abortTile=function(e){var r=this.loading[e.source],t=e.uid;r&&r[t]&&r[t].abort&&(r[t].abort(),delete r[t])},VectorTileWorkerSource.prototype.removeTile=function(e){var r=this.loaded[e.source],t=e.uid;r&&r[t]&&delete r[t]},VectorTileWorkerSource.prototype.loadVectorData=function(e,r){function t(e,t){if(e)return r(e);var o=new vt.VectorTile(new Protobuf(t));o.rawData=t,r(e,o)}var o=ajax.getArrayBuffer(e.url,t.bind(this));return function(){o.abort()}},VectorTileWorkerSource.prototype.redoPlacement=function(e,r){var t=this.loaded[e.source],o=this.loading[e.source],i=e.uid;if(t&&t[i]){var a=t[i],l=a.redoPlacement(e.angle,e.pitch,e.showCollisionBoxes);l.result&&r(null,l.result,l.transferables)}else o&&o[i]&&(o[i].angle=e.angle)},module.exports=VectorTileWorkerSource; +},{"../util/ajax":107,"../util/util":127,"./worker_tile":56,"pbf":193,"vector-tile":204}],54:[function(require,module,exports){ +"use strict";var ajax=require("../util/ajax"),ImageSource=require("./image_source"),VideoSource=function(e){function t(t,o,i,r){e.call(this,t,o,i,r),this.roundZoom=!0}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype._load=function(e){var t=this;this.urls=e.urls,ajax.getVideo(e.urls,function(e,o){if(e)return t.fire("error",{error:e});t.video=o,t.video.loop=!0;var i;t.video.addEventListener("playing",function(){i=t.map.style.animationLoop.set(1/0),t.map._rerender()}),t.video.addEventListener("pause",function(){t.map.style.animationLoop.cancel(i)}),t.map&&t.video.play(),t._finishLoading()})},t.prototype.getVideo=function(){return this.video},t.prototype.onAdd=function(e){this.map||(this.map=e,this.video&&(this.video.play(),this.setCoordinates(this.coordinates)))},t.prototype.prepare=function(){!this.tile||this.video.readyState<2||this._prepareImage(this.map.painter.gl,this.video)},t.prototype.serialize=function(){return{type:"video",urls:this.urls,coordinates:this.coordinates}},t}(ImageSource);module.exports=VideoSource; +},{"../util/ajax":107,"./image_source":43}],55:[function(require,module,exports){ +"use strict";var Actor=require("../util/actor"),StyleLayerIndex=require("../style/style_layer_index"),VectorTileWorkerSource=require("./vector_tile_worker_source"),GeoJSONWorkerSource=require("./geojson_worker_source"),Worker=function(e){var r=this;this.self=e,this.actor=new Actor(e,this),this.layerIndexes={},this.workerSourceTypes={vector:VectorTileWorkerSource,geojson:GeoJSONWorkerSource},this.workerSources={},this.self.registerWorkerSource=function(e,o){if(r.workerSourceTypes[e])throw new Error('Worker source with name "'+e+'" already registered.');r.workerSourceTypes[e]=o}};Worker.prototype.setLayers=function(e,r){this.getLayerIndex(e).replace(r)},Worker.prototype.updateLayers=function(e,r){this.getLayerIndex(e).update(r.layers,r.removedIds,r.symbolOrder)},Worker.prototype.loadTile=function(e,r,o){this.getWorkerSource(e,r.type).loadTile(r,o)},Worker.prototype.reloadTile=function(e,r,o){this.getWorkerSource(e,r.type).reloadTile(r,o)},Worker.prototype.abortTile=function(e,r){this.getWorkerSource(e,r.type).abortTile(r)},Worker.prototype.removeTile=function(e,r){this.getWorkerSource(e,r.type).removeTile(r)},Worker.prototype.removeSource=function(e,r){var o=this.getWorkerSource(e,r.type);void 0!==o.removeSource&&o.removeSource(r)},Worker.prototype.redoPlacement=function(e,r,o){this.getWorkerSource(e,r.type).redoPlacement(r,o)},Worker.prototype.loadWorkerSource=function(e,r,o){try{this.self.importScripts(r.url),o()}catch(e){o(e)}},Worker.prototype.getLayerIndex=function(e){var r=this.layerIndexes[e];return r||(r=this.layerIndexes[e]=new StyleLayerIndex),r},Worker.prototype.getWorkerSource=function(e,r){var o=this;if(this.workerSources[e]||(this.workerSources[e]={}),!this.workerSources[e][r]){var t={send:function(r,t,i,s){o.actor.send(r,t,i,s,e)}};this.workerSources[e][r]=new this.workerSourceTypes[r](t,this.getLayerIndex(e))}return this.workerSources[e][r]},module.exports=function(e){return new Worker(e)}; +},{"../style/style_layer_index":69,"../util/actor":106,"./geojson_worker_source":41,"./vector_tile_worker_source":53}],56:[function(require,module,exports){ +"use strict";function recalculateLayers(e,r){for(var i=0,s=e.layers;i=x.maxzoom||x.layout&&"none"===x.layout.visibility)){for(var z=0,A=g;z=0;w--){var C=a[r.symbolOrder[w]];C&&o.symbolBuckets.push(C)}if(0===this.symbolBuckets.length)return I(new CollisionTile(this.angle,this.pitch,this.collisionBoxArray));var T=0,q=Object.keys(c.iconDependencies),D=util.mapObject(c.glyphDependencies,function(e){return Object.keys(e).map(Number)}),O=function(e){if(e)return s(e);if(T++,2===T){for(var r=new CollisionTile(o.angle,o.pitch,o.collisionBoxArray),i=0,l=o.symbolBuckets;i=(new Date).getTime()}),!this.times.length},AnimationLoop.prototype.set=function(t){return this.times.push({id:this.n,time:t+(new Date).getTime()}),this.n++},AnimationLoop.prototype.cancel=function(t){this.times=this.times.filter(function(i){return i.id!==t})},module.exports=AnimationLoop; +},{}],58:[function(require,module,exports){ +"use strict";var Evented=require("../util/evented"),ajax=require("../util/ajax"),browser=require("../util/browser"),normalizeURL=require("../util/mapbox").normalizeSpriteURL,SpritePosition=function(){this.x=0,this.y=0,this.width=0,this.height=0,this.pixelRatio=1,this.sdf=!1},ImageSprite=function(t){function i(i){var e=this;t.call(this),this.base=i,this.retina=browser.devicePixelRatio>1;var a=this.retina?"@2x":"";ajax.getJSON(normalizeURL(i,a,".json"),function(t,i){return t?void e.fire("error",{error:t}):(e.data=i,void(e.imgData&&e.fire("data",{dataType:"style"})))}),ajax.getImage(normalizeURL(i,a,".png"),function(t,i){if(t)return void e.fire("error",{error:t});e.imgData=browser.getImageData(i);for(var a=0;a1!==this.retina){var e=new i(this.base);e.on("data",function(){t.data=e.data,t.imgData=e.imgData,t.width=e.width,t.retina=e.retina})}},i.prototype.getSpritePosition=function(t){if(!this.loaded())return new SpritePosition;var i=this.data&&this.data[t];return i&&this.imgData?i:new SpritePosition},i}(Evented);module.exports=ImageSprite; +},{"../util/ajax":107,"../util/browser":108,"../util/evented":116,"../util/mapbox":123}],59:[function(require,module,exports){ +"use strict";var styleSpec=require("./style_spec"),util=require("../util/util"),Evented=require("../util/evented"),validateStyle=require("./validate_style"),StyleDeclaration=require("./style_declaration"),StyleTransition=require("./style_transition"),TRANSITION_SUFFIX="-transition",Light=function(t){function i(i){t.call(this),this.properties=["anchor","color","position","intensity"],this._specifications=styleSpec.light,this.set(i)}return t&&(i.__proto__=t),i.prototype=Object.create(t&&t.prototype),i.prototype.constructor=i,i.prototype.set=function(t){var i=this;if(!this._validate(validateStyle.light,t)){this._declarations={},this._transitions={},this._transitionOptions={},this.calculated={},t=util.extend({anchor:this._specifications.anchor.default,color:this._specifications.color.default,position:this._specifications.position.default,intensity:this._specifications.intensity.default},t);for(var e=0,o=this.properties;eMath.floor(e)&&(t.lastIntegerZoom=Math.floor(e+1),t.lastIntegerZoomTime=Date.now()),t.lastZoom=e},t.prototype._checkLoaded=function(){if(!this._loaded)throw new Error("Style is not done loading")},t.prototype.update=function(e,t){var r=this;if(this._changed){var i=Object.keys(this._updatedLayers),s=Object.keys(this._removedLayers);(i.length||s.length||this._updatedSymbolOrder)&&this._updateWorkerLayers(i,s);for(var o in this._updatedSources){var a=r._updatedSources[o];"reload"===a?r._reloadSource(o):"clear"===a&&r._clearSource(o)}this._applyClasses(e,t),this._resetUpdates(),this.fire("data",{dataType:"style"})}},t.prototype._updateWorkerLayers=function(e,t){var r=this,i=this._updatedSymbolOrder?this._order.filter(function(e){return"symbol"===r._layers[e].type}):null;this.dispatcher.broadcast("updateLayers",{layers:this._serializeLayers(e),removedIds:t,symbolOrder:i})},t.prototype._resetUpdates=function(){this._changed=!1,this._updatedLayers={},this._removedLayers={},this._updatedSymbolOrder=!1,this._updatedSources={},this._updatedPaintProps={},this._updatedAllPaintProps=!1},t.prototype.setState=function(e){var t=this;if(this._checkLoaded(),validateStyle.emitErrors(this,validateStyle(e)))return!1;e=util.extend({},e),e.layers=deref(e.layers);var r=diff(this.serialize(),e).filter(function(e){return!(e.command in ignoredDiffOperations)});if(0===r.length)return!1;var i=r.filter(function(e){return!(e.command in supportedDiffOperations)});if(i.length>0)throw new Error("Unimplemented: "+i.map(function(e){return e.command}).join(", ")+".");return r.forEach(function(e){"setTransition"!==e.command&&t[e.command].apply(t,e.args)}),this.stylesheet=e,!0},t.prototype.addSource=function(e,t,r){if(this._checkLoaded(),void 0!==this.sourceCaches[e])throw new Error("There is already a source with this ID");if(!t.type)throw new Error("The type property must be defined, but the only the following properties were given: "+Object.keys(t)+".");var i=["vector","raster","geojson","video","image"],s=i.indexOf(t.type)>=0;if(!s||!this._validate(validateStyle.source,"sources."+e,t,null,r)){var o=this.sourceCaches[e]=new SourceCache(e,t,this.dispatcher);o.style=this,o.setEventedParent(this,function(){return{isSourceLoaded:o.loaded(),source:o.serialize(),sourceId:e}}),o.onAdd(this.map),this._changed=!0}},t.prototype.removeSource=function(e){if(this._checkLoaded(),void 0===this.sourceCaches[e])throw new Error("There is no source with this ID");var t=this.sourceCaches[e];delete this.sourceCaches[e],delete this._updatedSources[e],t.setEventedParent(null),t.clearTiles(),t.onRemove&&t.onRemove(this.map),this._changed=!0},t.prototype.getSource=function(e){return this.sourceCaches[e]&&this.sourceCaches[e].getSource()},t.prototype.addLayer=function(e,t,r){this._checkLoaded();var i=e.id;if(!this._validate(validateStyle.layer,"layers."+i,e,{arrayIndex:-1},r)){var s=StyleLayer.create(e);this._validateLayer(s),s.setEventedParent(this,{layer:{id:i}});var o=t?this._order.indexOf(t):this._order.length;this._order.splice(o,0,i),this._layers[i]=s,this._removedLayers[i]&&(delete this._removedLayers[i],this._updatedSources[s.source]="clear"),this._updateLayer(s),"symbol"===s.type&&(this._updatedSymbolOrder=!0),this.updateClasses(i)}},t.prototype.moveLayer=function(e,t){this._checkLoaded(),this._changed=!0;var r=this._layers[e];if(!r)throw new Error("Layer not found: "+e);var i=this._order.indexOf(e);this._order.splice(i,1);var s=t?this._order.indexOf(t):this._order.length;this._order.splice(s,0,e),"symbol"===r.type&&(this._updatedSymbolOrder=!0,r.source&&!this._updatedSources[r.source]&&(this._updatedSources[r.source]="reload"))},t.prototype.removeLayer=function(e){this._checkLoaded();var t=this._layers[e];if(!t)throw new Error("Layer not found: "+e);t.setEventedParent(null);var r=this._order.indexOf(e);this._order.splice(r,1),"symbol"===t.type&&(this._updatedSymbolOrder=!0),this._changed=!0,this._removedLayers[e]=!0,delete this._layers[e],delete this._updatedLayers[e],delete this._updatedPaintProps[e]},t.prototype.getLayer=function(e){return this._layers[e]},t.prototype.setLayerZoomRange=function(e,t,r){this._checkLoaded();var i=this.getLayer(e);i.minzoom===t&&i.maxzoom===r||(null!=t&&(i.minzoom=t),null!=r&&(i.maxzoom=r),this._updateLayer(i))},t.prototype.setFilter=function(e,t){this._checkLoaded();var r=this.getLayer(e);null!==t&&void 0!==t&&this._validate(validateStyle.filter,"layers."+r.id+".filter",t)||util.deepEqual(r.filter,t)||(r.filter=util.clone(t),this._updateLayer(r))},t.prototype.getFilter=function(e){return util.clone(this.getLayer(e).filter)},t.prototype.setLayoutProperty=function(e,t,r){this._checkLoaded();var i=this.getLayer(e);util.deepEqual(i.getLayoutProperty(t),r)||(i.setLayoutProperty(t,r),this._updateLayer(i))},t.prototype.getLayoutProperty=function(e,t){return this.getLayer(e).getLayoutProperty(t)},t.prototype.setPaintProperty=function(e,t,r,i){this._checkLoaded();var s=this.getLayer(e);if(!util.deepEqual(s.getPaintProperty(t,i),r)){var o=s.isPaintValueFeatureConstant(t);s.setPaintProperty(t,r,i);var a=!(r&&MapboxGLFunction.isFunctionDefinition(r)&&"$zoom"!==r.property&&void 0!==r.property);a&&o||this._updateLayer(s),this.updateClasses(e,t)}},t.prototype.getPaintProperty=function(e,t,r){return this.getLayer(e).getPaintProperty(t,r)},t.prototype.getTransition=function(){return util.extend({duration:300,delay:0},this.stylesheet&&this.stylesheet.transition)},t.prototype.updateClasses=function(e,t){if(this._changed=!0,e){var r=this._updatedPaintProps;r[e]||(r[e]={}),r[e][t||"all"]=!0}else this._updatedAllPaintProps=!0},t.prototype.serialize=function(){var e=this;return util.filterObject({version:this.stylesheet.version,name:this.stylesheet.name,metadata:this.stylesheet.metadata,light:this.stylesheet.light,center:this.stylesheet.center,zoom:this.stylesheet.zoom,bearing:this.stylesheet.bearing,pitch:this.stylesheet.pitch,sprite:this.stylesheet.sprite,glyphs:this.stylesheet.glyphs,transition:this.stylesheet.transition,sources:util.mapObject(this.sourceCaches,function(e){return e.serialize()}),layers:this._order.map(function(t){return e._layers[t].serialize()})},function(e){return void 0!==e})},t.prototype._updateLayer=function(e){this._updatedLayers[e.id]=!0,e.source&&!this._updatedSources[e.source]&&(this._updatedSources[e.source]="reload"),this._changed=!0},t.prototype._flattenRenderedFeatures=function(e){for(var t=this,r=[],i=this._order.length-1;i>=0;i--)for(var s=t._order[i],o=0,a=e;o=this.maxzoom)||"none"===this.layout.visibility)},i.prototype.updatePaintTransitions=function(t,i,a,e,n){for(var o=this,r=util.extend({},this._paintDeclarations[""]),s=0;s=this.endTime)return e;var a=this.oldTransition.calculate(t,i,this.startTime),n=util.easeCubicInOut((o-this.startTime-this.delay)/this.duration);return this.interp(a,e,n)},StyleTransition.prototype._calculateTargetValue=function(t,i){if(!this.zoomTransitioned)return this.declaration.calculate(t,i);var o=t.zoom,e=this.zoomHistory.lastIntegerZoom,a=o>e?2:.5,n=this.declaration.calculate({zoom:o>e?o-1:o+1},i),r=this.declaration.calculate({zoom:o},i),s=Math.min((Date.now()-this.zoomHistory.lastIntegerZoomTime)/this.duration,1),l=Math.abs(o-e),u=interpolate(s,1,l);return void 0!==n&&void 0!==r?{from:n,fromScale:a,to:r,toScale:1,t:u}:void 0},module.exports=StyleTransition; +},{"../util/interpolate":119,"../util/util":127}],72:[function(require,module,exports){ +"use strict";module.exports=require("mapbox-gl-style-spec/lib/validate_style.min"),module.exports.emitErrors=function(r,e){if(e&&e.length){for(var t=0;t-a/2;){if(s--,s<0)return!1;f-=e[s].dist(i),i=e[s]}f+=e[s].dist(e[s+1]),s++;for(var l=[],o=0;fr;)o-=l.shift().angleDelta;if(o>n)return!1;s++,f+=c.dist(g)}return!0}module.exports=checkMaxAngle; +},{}],75:[function(require,module,exports){ +"use strict";function clipLine(n,x,y,o,e){for(var r=[],t=0;t=o&&w.x>=o||(P.x>=o?P=new Point(o,P.y+(w.y-P.y)*((o-P.x)/(w.x-P.x)))._round():w.x>=o&&(w=new Point(o,P.y+(w.y-P.y)*((o-P.x)/(w.x-P.x)))._round()),P.y>=e&&w.y>=e||(P.y>=e?P=new Point(P.x+(w.x-P.x)*((e-P.y)/(w.y-P.y)),e)._round():w.y>=e&&(w=new Point(P.x+(w.x-P.x)*((e-P.y)/(w.y-P.y)),e)._round()),i&&P.equals(i[i.length-1])||(i=[P],r.push(i)),i.push(w)))))}return r}var Point=require("point-geometry");module.exports=clipLine; +},{"point-geometry":194}],76:[function(require,module,exports){ +"use strict";var createStructArrayType=require("../util/struct_array"),Point=require("point-geometry"),CollisionBoxArray=createStructArrayType({members:[{type:"Int16",name:"anchorPointX"},{type:"Int16",name:"anchorPointY"},{type:"Int16",name:"x1"},{type:"Int16",name:"y1"},{type:"Int16",name:"x2"},{type:"Int16",name:"y2"},{type:"Float32",name:"maxScale"},{type:"Uint32",name:"featureIndex"},{type:"Uint16",name:"sourceLayerIndex"},{type:"Uint16",name:"bucketIndex"},{type:"Int16",name:"bbox0"},{type:"Int16",name:"bbox1"},{type:"Int16",name:"bbox2"},{type:"Int16",name:"bbox3"},{type:"Float32",name:"placementScale"}]});Object.defineProperty(CollisionBoxArray.prototype.StructType.prototype,"anchorPoint",{get:function(){return new Point(this.anchorPointX,this.anchorPointY)}}),module.exports=CollisionBoxArray; +},{"../util/struct_array":125,"point-geometry":194}],77:[function(require,module,exports){ +"use strict";var CollisionFeature=function(t,e,i,o,s,a,n,r,l,d,u){var h=n.top*r-l,x=n.bottom*r+l,f=n.left*r-l,m=n.right*r+l;if(this.boxStartIndex=t.length,d){var _=x-h,b=m-f;if(_>0)if(_=Math.max(10*r,_),u){var v=e[i.segment+1].sub(e[i.segment])._unit()._mult(b),c=[i.sub(v),i.add(v)];this._addLineCollisionBoxes(t,c,i,0,b,_,o,s,a)}else this._addLineCollisionBoxes(t,e,i,i.segment,b,_,o,s,a)}else t.emplaceBack(i.x,i.y,f,h,m,x,1/0,o,s,a,0,0,0,0,0);this.boxEndIndex=t.length};CollisionFeature.prototype._addLineCollisionBoxes=function(t,e,i,o,s,a,n,r,l){var d=a/2,u=Math.floor(s/d),h=-a/2,x=this.boxes,f=i,m=o+1,_=h;do{if(m--,m<0)return x;_-=e[m].dist(f),f=e[m]}while(_>-s/2);for(var b=e[m].dist(e[m+1]),v=0;v=e.length)return x;b=e[m].dist(e[m+1])}var g=c-_,p=e[m],C=e[m+1],B=C.sub(p)._unit()._mult(g)._add(p)._round(),M=Math.max(Math.abs(c-h)-d/2,0),y=s/2/M;t.emplaceBack(B.x,B.y,-a/2,-a/2,a/2,a/2,y,n,r,l,0,0,0,0,0)}return x},module.exports=CollisionFeature; +},{}],78:[function(require,module,exports){ +"use strict";var Point=require("point-geometry"),EXTENT=require("../data/extent"),Grid=require("grid-index"),intersectionTests=require("../util/intersection_tests"),CollisionTile=function(t,e,i){if("object"==typeof t){var r=t;i=e,t=r.angle,e=r.pitch,this.grid=new Grid(r.grid),this.ignoredGrid=new Grid(r.ignoredGrid)}else this.grid=new Grid(EXTENT,12,6),this.ignoredGrid=new Grid(EXTENT,12,0);this.minScale=.5,this.maxScale=2,this.angle=t,this.pitch=e;var a=Math.sin(t),o=Math.cos(t);if(this.rotationMatrix=[o,-a,a,o],this.reverseRotationMatrix=[o,a,-a,o],this.yStretch=1/Math.cos(e/180*Math.PI),this.yStretch=Math.pow(this.yStretch,1.3),this.collisionBoxArray=i,0===i.length){i.emplaceBack();var n=32767;i.emplaceBack(0,0,0,-n,0,n,n,0,0,0,0,0,0,0,0,0),i.emplaceBack(EXTENT,0,0,-n,0,n,n,0,0,0,0,0,0,0,0,0),i.emplaceBack(0,0,-n,0,n,0,n,0,0,0,0,0,0,0,0,0),i.emplaceBack(0,EXTENT,-n,0,n,0,n,0,0,0,0,0,0,0,0,0)}this.tempCollisionBox=i.get(0),this.edges=[i.get(1),i.get(2),i.get(3),i.get(4)]};CollisionTile.prototype.serialize=function(t){var e=this.grid.toArrayBuffer(),i=this.ignoredGrid.toArrayBuffer();return t&&(t.push(e),t.push(i)),{angle:this.angle,pitch:this.pitch,grid:e,ignoredGrid:i}},CollisionTile.prototype.placeCollisionFeature=function(t,e,i){for(var r=this,a=this.collisionBoxArray,o=this.minScale,n=this.rotationMatrix,l=this.yStretch,h=t.boxStartIndex;h=r.maxScale)return o}if(i){var S;if(r.angle){var P=r.reverseRotationMatrix,b=new Point(s.x1,s.y1).matMult(P),T=new Point(s.x2,s.y1).matMult(P),w=new Point(s.x1,s.y2).matMult(P),N=new Point(s.x2,s.y2).matMult(P);S=r.tempCollisionBox,S.anchorPointX=s.anchorPoint.x,S.anchorPointY=s.anchorPoint.y,S.x1=Math.min(b.x,T.x,w.x,N.x),S.y1=Math.min(b.y,T.x,w.x,N.x),S.x2=Math.max(b.x,T.x,w.x,N.x),S.y2=Math.max(b.y,T.x,w.x,N.x),S.maxScale=s.maxScale}else S=s;for(var B=0;B=r.maxScale)return o}}}return o},CollisionTile.prototype.queryRenderedSymbols=function(t,e){var i={},r=[];if(0===t.length||0===this.grid.length&&0===this.ignoredGrid.length)return r;for(var a=this.collisionBoxArray,o=this.rotationMatrix,n=this.yStretch,l=[],h=1/0,s=1/0,x=-(1/0),c=-(1/0),g=0;gS.maxScale)){var T=S.anchorPoint.matMult(o),w=T.x+S.x1/e,N=T.y+S.y1/e*n,B=T.x+S.x2/e,G=T.y+S.y2/e*n,E=[new Point(w,N),new Point(B,N),new Point(B,G),new Point(w,G)];intersectionTests.polygonIntersectsPolygon(l,E)&&(i[P][b]=!0,r.push(u[v]))}}return r},CollisionTile.prototype.getPlacementScale=function(t,e,i,r,a){var o=e.x-r.x,n=e.y-r.y,l=(a.x1-i.x2)/o,h=(a.x2-i.x1)/o,s=(a.y1-i.y2)*this.yStretch/n,x=(a.y2-i.y1)*this.yStretch/n;(isNaN(l)||isNaN(h))&&(l=h=1),(isNaN(s)||isNaN(x))&&(s=x=1);var c=Math.min(Math.max(l,h),Math.max(s,x)),g=a.maxScale,y=i.maxScale;return c>g&&(c=g),c>y&&(c=y),c>t&&c>=a.placementScale&&(t=c),t},CollisionTile.prototype.insertCollisionFeature=function(t,e,i){for(var r=this,a=i?this.ignoredGrid:this.grid,o=this.collisionBoxArray,n=t.boxStartIndex;n=0&&k=0&&q=0&&p+c<=s){var M=new Anchor(k,q,y,f)._round();n&&!checkMaxAngle(e,M,l,n,a)||x.push(M)}}g+=A}return i||x.length||o||(x=resample(e,g/2,t,n,a,l,o,!0,h)),x}var interpolate=require("../util/interpolate"),Anchor=require("../symbol/anchor"),checkMaxAngle=require("./check_max_angle");module.exports=getAnchors; +},{"../symbol/anchor":73,"../util/interpolate":119,"./check_max_angle":74}],80:[function(require,module,exports){ +"use strict";var ShelfPack=require("shelf-pack"),util=require("../util/util"),SIZE_GROWTH_RATE=4,DEFAULT_SIZE=128,MAX_SIZE=2048,GlyphAtlas=function(){this.width=DEFAULT_SIZE,this.height=DEFAULT_SIZE,this.bin=new ShelfPack(this.width,this.height),this.index={},this.ids={},this.data=new Uint8Array(this.width*this.height)};GlyphAtlas.prototype.getGlyphs=function(){var t,i,e,h={};for(var r in this.ids)t=r.split("#"),i=t[0],e=t[1],h[i]||(h[i]=[]),h[i].push(e);return h},GlyphAtlas.prototype.getRects=function(){var t,i,e,h=this,r={};for(var s in this.ids)t=s.split("#"),i=t[0],e=t[1],r[i]||(r[i]={}),r[i][e]=h.index[s];return r},GlyphAtlas.prototype.addGlyph=function(t,i,e,h){var r=this;if(!e)return null;var s=i+"#"+e.id;if(this.index[s])return this.ids[s].indexOf(t)<0&&this.ids[s].push(t),this.index[s];if(!e.bitmap)return null;var a=e.width+2*h,n=e.height+2*h,E=1,T=a+2*E,u=n+2*E;T+=4-T%4,u+=4-u%4;var l=this.bin.packOne(T,u);if(l||(this.resize(),l=this.bin.packOne(T,u)),!l)return util.warnOnce("glyph bitmap overflow"),null;this.index[s]=l,this.ids[s]=[t];for(var d=this.data,A=e.bitmap,_=0;_=MAX_SIZE||e>=MAX_SIZE)){this.texture&&(this.gl&&this.gl.deleteTexture(this.texture),this.texture=null),this.width*=SIZE_GROWTH_RATE,this.height*=SIZE_GROWTH_RATE,this.bin.resize(this.width,this.height);for(var h=new ArrayBuffer(this.width*this.height),r=0;r65535)return a("glyphs > 65535 not supported");void 0===this.loading[t]&&(this.loading[t]={});var l=this.loading[t];if(l[e])l[e].push(a);else{l[e]=[a];var i=256*e+"-"+(256*e+255),r=glyphUrl(t,i,this.url);ajax.getArrayBuffer(r,function(t,a){for(var i=!t&&new Glyphs(new Protobuf(a)),r=0;r1?2:1,this.canvas&&(this.canvas.width=this.width*this.pixelRatio,this.canvas.height=this.height*this.pixelRatio)),this.sprite=t},SpriteAtlas.prototype.addIcons=function(t,i){for(var e=this,h=0;h1||(b?(clearTimeout(b),b=null,h("dblclick",t)):b=setTimeout(l,300))}function i(e){f("touchmove",e)}function c(e){f("touchend",e)}function d(e){f("touchcancel",e)}function l(){b=null}function s(e){var t=DOM.mousePos(g,e);t.equals(L)&&h("click",e)}function v(e){h("dblclick",e),e.preventDefault()}function m(t){var n=e.dragRotate&&e.dragRotate.isActive();E||n?E&&(p=t):h("contextmenu",t),t.preventDefault()}function h(t,n){var o=DOM.mousePos(g,n);return e.fire(t,{lngLat:e.unproject(o),point:o,originalEvent:n})}function f(t,n){var o=DOM.touchPos(g,n),r=o.reduce(function(e,t,n,o){return e.add(t.div(o.length))},new Point(0,0));return e.fire(t,{lngLat:e.unproject(r),point:r,lngLats:o.map(function(t){return e.unproject(t)},this),points:o,originalEvent:n})}var g=e.getCanvasContainer(),p=null,E=!1,L=null,b=null;for(var q in handlers)e[q]=new handlers[q](e,t),t.interactive&&t[q]&&e[q].enable();g.addEventListener("mouseout",n,!1),g.addEventListener("mousedown",o,!1),g.addEventListener("mouseup",r,!1),g.addEventListener("mousemove",a,!1),g.addEventListener("touchstart",u,!1),g.addEventListener("touchend",c,!1),g.addEventListener("touchmove",i,!1),g.addEventListener("touchcancel",d,!1),g.addEventListener("click",s,!1),g.addEventListener("dblclick",v,!1),g.addEventListener("contextmenu",m,!1)}; +},{"../util/dom":115,"./handler/box_zoom":95,"./handler/dblclick_zoom":96,"./handler/drag_pan":97,"./handler/drag_rotate":98,"./handler/keyboard":99,"./handler/scroll_zoom":100,"./handler/touch_zoom_rotate":101,"point-geometry":194}],90:[function(require,module,exports){ +"use strict";var util=require("../util/util"),interpolate=require("../util/interpolate"),browser=require("../util/browser"),LngLat=require("../geo/lng_lat"),LngLatBounds=require("../geo/lng_lat_bounds"),Point=require("point-geometry"),Evented=require("../util/evented"),Camera=function(t){function i(i,e){t.call(this),this.transform=i,this._bearingSnap=e.bearingSnap}return t&&(i.__proto__=t),i.prototype=Object.create(t&&t.prototype),i.prototype.constructor=i,i.prototype.getCenter=function(){return this.transform.center},i.prototype.setCenter=function(t,i){return this.jumpTo({center:t},i),this},i.prototype.panBy=function(t,i,e){return this.panTo(this.transform.center,util.extend({offset:Point.convert(t).mult(-1)},i),e),this},i.prototype.panTo=function(t,i,e){return this.easeTo(util.extend({center:t},i),e)},i.prototype.getZoom=function(){return this.transform.zoom},i.prototype.setZoom=function(t,i){return this.jumpTo({zoom:t},i),this},i.prototype.zoomTo=function(t,i,e){return this.easeTo(util.extend({zoom:t},i),e)},i.prototype.zoomIn=function(t,i){return this.zoomTo(this.getZoom()+1,t,i),this},i.prototype.zoomOut=function(t,i){return this.zoomTo(this.getZoom()-1,t,i),this},i.prototype.getBearing=function(){return this.transform.bearing},i.prototype.setBearing=function(t,i){return this.jumpTo({bearing:t},i),this},i.prototype.rotateTo=function(t,i,e){return this.easeTo(util.extend({bearing:t},i),e)},i.prototype.resetNorth=function(t,i){return this.rotateTo(0,util.extend({duration:1e3},t),i),this},i.prototype.snapToNorth=function(t,i){return Math.abs(this.getBearing())180&&(s.center.lng>0&&c.lng<0?c.lng+=360:s.center.lng<0&&c.lng>0&&(c.lng-=360));var d=s.zoomScale(m-h),l=s.point,v="center"in t?s.project(c).sub(a.div(d)):l,b=t.curve,z=Math.max(s.width,s.height),y=z/d,_=v.sub(l).mag();if("minZoom"in t){var M=util.clamp(Math.min(t.minZoom,h,m),s.minZoom,s.maxZoom),T=z/s.zoomScale(M-h);b=Math.sqrt(T/_*2)}var E=b*b,x=e(0),L=function(t){return n(x)/n(x+b*t)},Z=function(t){return z*((n(x)*r(x+b*t)-o(x))/E)/_},P=(e(1)-x)/b;if(Math.abs(_)<1e-6){if(Math.abs(z-y)<1e-6)return this.easeTo(t);var B=y=0)return!1;return!0}),this._container.innerHTML=t.join(" | "),this._editLink=null}},AttributionControl.prototype._updateCompact=function(){var t=this._map.getCanvasContainer().offsetWidth<=640;this._container.classList[t?"add":"remove"]("compact")},module.exports=AttributionControl; +},{"../../util/dom":115,"../../util/util":127}],92:[function(require,module,exports){ +"use strict";function checkGeolocationSupport(t){void 0!==supportsGeolocation?t(supportsGeolocation):void 0!==window.navigator.permissions?window.navigator.permissions.query({name:"geolocation"}).then(function(o){supportsGeolocation="denied"!==o.state,t(supportsGeolocation)}):(supportsGeolocation=!!window.navigator.geolocation,t(supportsGeolocation))}var Evented=require("../../util/evented"),DOM=require("../../util/dom"),window=require("../../util/window"),util=require("../../util/util"),defaultGeoPositionOptions={enableHighAccuracy:!1,timeout:6e3},className="mapboxgl-ctrl",supportsGeolocation,GeolocateControl=function(t){function o(o){t.call(this),this.options=o,util.bindAll(["_onSuccess","_onError","_finish","_setupUI"],this)}return t&&(o.__proto__=t),o.prototype=Object.create(t&&t.prototype),o.prototype.constructor=o,o.prototype.onAdd=function(t){return this._map=t,this._container=DOM.create("div",className+" "+className+"-group"),checkGeolocationSupport(this._setupUI),this._container},o.prototype.onRemove=function(){this._container.parentNode.removeChild(this._container),this._map=void 0},o.prototype._onSuccess=function(t){this._map.jumpTo({center:[t.coords.longitude,t.coords.latitude],zoom:17,bearing:0,pitch:0}),this.fire("geolocate",t),this._finish()},o.prototype._onError=function(t){this.fire("error",t),this._finish()},o.prototype._finish=function(){this._timeoutId&&clearTimeout(this._timeoutId),this._timeoutId=void 0},o.prototype._setupUI=function(t){t!==!1&&(this._container.addEventListener("contextmenu",function(t){return t.preventDefault()}),this._geolocateButton=DOM.create("button",className+"-icon "+className+"-geolocate",this._container),this._geolocateButton.type="button",this._geolocateButton.setAttribute("aria-label","Geolocate"),this.options.watchPosition&&this._geolocateButton.setAttribute("aria-pressed",!1),this._geolocateButton.addEventListener("click",this._onClickGeolocate.bind(this)))},o.prototype._onClickGeolocate=function(){var t=util.extend(defaultGeoPositionOptions,this.options&&this.options.positionOptions||{});this.options.watchPosition?void 0!==this._geolocationWatchID?(this._geolocateButton.classList.remove("watching"),this._geolocateButton.setAttribute("aria-pressed",!1),window.navigator.geolocation.clearWatch(this._geolocationWatchID),this._geolocationWatchID=void 0):(this._geolocateButton.classList.add("watching"),this._geolocateButton.setAttribute("aria-pressed",!0),this._geolocationWatchID=window.navigator.geolocation.watchPosition(this._onSuccess,this._onError,t)):(window.navigator.geolocation.getCurrentPosition(this._onSuccess,this._onError,t),this._timeoutId=setTimeout(this._finish,1e4))},o}(Evented);module.exports=GeolocateControl; +},{"../../util/dom":115,"../../util/evented":116,"../../util/util":127,"../../util/window":110}],93:[function(require,module,exports){ +"use strict";function copyMouseEvent(t){return new window.MouseEvent(t.type,{button:2,buttons:2,bubbles:!0,cancelable:!0,detail:t.detail,view:t.view,screenX:t.screenX,screenY:t.screenY,clientX:t.clientX,clientY:t.clientY,movementX:t.movementX,movementY:t.movementY,ctrlKey:t.ctrlKey,shiftKey:t.shiftKey,altKey:t.altKey,metaKey:t.metaKey})}var DOM=require("../../util/dom"),window=require("../../util/window"),util=require("../../util/util"),className="mapboxgl-ctrl",NavigationControl=function(){util.bindAll(["_rotateCompassArrow"],this)};NavigationControl.prototype._rotateCompassArrow=function(){var t="rotate("+this._map.transform.angle*(180/Math.PI)+"deg)";this._compassArrow.style.transform=t},NavigationControl.prototype.onAdd=function(t){return this._map=t,this._container=DOM.create("div",className+" "+className+"-group",t.getContainer()),this._container.addEventListener("contextmenu",this._onContextMenu.bind(this)),this._zoomInButton=this._createButton(className+"-icon "+className+"-zoom-in","Zoom In",t.zoomIn.bind(t)),this._zoomOutButton=this._createButton(className+"-icon "+className+"-zoom-out","Zoom Out",t.zoomOut.bind(t)),this._compass=this._createButton(className+"-icon "+className+"-compass","Reset North",t.resetNorth.bind(t)),this._compassArrow=DOM.create("span","arrow",this._compass),this._compass.addEventListener("mousedown",this._onCompassDown.bind(this)),this._onCompassMove=this._onCompassMove.bind(this),this._onCompassUp=this._onCompassUp.bind(this),this._map.on("rotate",this._rotateCompassArrow),this._rotateCompassArrow(),this._container},NavigationControl.prototype.onRemove=function(){this._container.parentNode.removeChild(this._container),this._map.off("rotate",this._rotateCompassArrow),this._map=void 0},NavigationControl.prototype._onContextMenu=function(t){t.preventDefault()},NavigationControl.prototype._onCompassDown=function(t){0===t.button&&(DOM.disableDrag(),window.document.addEventListener("mousemove",this._onCompassMove),window.document.addEventListener("mouseup",this._onCompassUp),this._map.getCanvasContainer().dispatchEvent(copyMouseEvent(t)),t.stopPropagation())},NavigationControl.prototype._onCompassMove=function(t){0===t.button&&(this._map.getCanvasContainer().dispatchEvent(copyMouseEvent(t)),t.stopPropagation())},NavigationControl.prototype._onCompassUp=function(t){0===t.button&&(window.document.removeEventListener("mousemove",this._onCompassMove),window.document.removeEventListener("mouseup",this._onCompassUp),DOM.enableDrag(),this._map.getCanvasContainer().dispatchEvent(copyMouseEvent(t)),t.stopPropagation())},NavigationControl.prototype._createButton=function(t,o,e){var n=DOM.create("button",t,this._container);return n.type="button",n.setAttribute("aria-label",o),n.addEventListener("click",function(){e()}),n},module.exports=NavigationControl; +},{"../../util/dom":115,"../../util/util":127,"../../util/window":110}],94:[function(require,module,exports){ +"use strict";function updateScale(t,e,o){var n=o&&o.maxWidth||100,i=t._container.clientHeight/2,a=getDistance(t.unproject([0,i]),t.unproject([n,i]));if(o&&"imperial"===o.unit){var r=3.2808*a;if(r>5280){var l=r/5280;setScale(e,n,l,"mi")}else setScale(e,n,r,"ft")}else setScale(e,n,a,"m")}function setScale(t,e,o,n){var i=getRoundNum(o),a=i/o;"m"===n&&i>=1e3&&(i/=1e3,n="km"),t.style.width=e*a+"px",t.innerHTML=i+n}function getDistance(t,e){var o=6371e3,n=Math.PI/180,i=t.lat*n,a=e.lat*n,r=Math.sin(i)*Math.sin(a)+Math.cos(i)*Math.cos(a)*Math.cos((e.lng-t.lng)*n),l=o*Math.acos(Math.min(r,1));return l}function getRoundNum(t){var e=Math.pow(10,(""+Math.floor(t)).length-1),o=t/e;return o=o>=10?10:o>=5?5:o>=3?3:o>=2?2:1,e*o}var DOM=require("../../util/dom"),util=require("../../util/util"),ScaleControl=function(t){this.options=t,util.bindAll(["_onMove"],this)};ScaleControl.prototype.getDefaultPosition=function(){return"bottom-left"},ScaleControl.prototype._onMove=function(){updateScale(this._map,this._container,this.options)},ScaleControl.prototype.onAdd=function(t){return this._map=t,this._container=DOM.create("div","mapboxgl-ctrl mapboxgl-ctrl-scale",t.getContainer()),this._map.on("move",this._onMove),this._onMove(),this._container},ScaleControl.prototype.onRemove=function(){this._container.parentNode.removeChild(this._container),this._map.off("move",this._onMove),this._map=void 0},module.exports=ScaleControl; +},{"../../util/dom":115,"../../util/util":127}],95:[function(require,module,exports){ +"use strict";var DOM=require("../../util/dom"),LngLatBounds=require("../../geo/lng_lat_bounds"),util=require("../../util/util"),window=require("../../util/window"),BoxZoomHandler=function(o){this._map=o,this._el=o.getCanvasContainer(),this._container=o.getContainer(),util.bindAll(["_onMouseDown","_onMouseMove","_onMouseUp","_onKeyDown"],this)};BoxZoomHandler.prototype.isEnabled=function(){return!!this._enabled},BoxZoomHandler.prototype.isActive=function(){return!!this._active},BoxZoomHandler.prototype.enable=function(){this.isEnabled()||(this._el.addEventListener("mousedown",this._onMouseDown,!1),this._enabled=!0)},BoxZoomHandler.prototype.disable=function(){this.isEnabled()&&(this._el.removeEventListener("mousedown",this._onMouseDown),this._enabled=!1)},BoxZoomHandler.prototype._onMouseDown=function(o){o.shiftKey&&0===o.button&&(window.document.addEventListener("mousemove",this._onMouseMove,!1),window.document.addEventListener("keydown",this._onKeyDown,!1),window.document.addEventListener("mouseup",this._onMouseUp,!1),DOM.disableDrag(),this._startPos=DOM.mousePos(this._el,o),this._active=!0)},BoxZoomHandler.prototype._onMouseMove=function(o){var e=this._startPos,t=DOM.mousePos(this._el,o);this._box||(this._box=DOM.create("div","mapboxgl-boxzoom",this._container),this._container.classList.add("mapboxgl-crosshair"),this._fireEvent("boxzoomstart",o));var n=Math.min(e.x,t.x),i=Math.max(e.x,t.x),s=Math.min(e.y,t.y),r=Math.max(e.y,t.y);DOM.setTransform(this._box,"translate("+n+"px,"+s+"px)"),this._box.style.width=i-n+"px",this._box.style.height=r-s+"px"},BoxZoomHandler.prototype._onMouseUp=function(o){if(0===o.button){var e=this._startPos,t=DOM.mousePos(this._el,o),n=(new LngLatBounds).extend(this._map.unproject(e)).extend(this._map.unproject(t));this._finish(),e.x===t.x&&e.y===t.y?this._fireEvent("boxzoomcancel",o):this._map.fitBounds(n,{linear:!0}).fire("boxzoomend",{originalEvent:o,boxZoomBounds:n})}},BoxZoomHandler.prototype._onKeyDown=function(o){27===o.keyCode&&(this._finish(),this._fireEvent("boxzoomcancel",o))},BoxZoomHandler.prototype._finish=function(){this._active=!1,window.document.removeEventListener("mousemove",this._onMouseMove,!1),window.document.removeEventListener("keydown",this._onKeyDown,!1),window.document.removeEventListener("mouseup",this._onMouseUp,!1),this._container.classList.remove("mapboxgl-crosshair"),this._box&&(this._box.parentNode.removeChild(this._box),this._box=null),DOM.enableDrag()},BoxZoomHandler.prototype._fireEvent=function(o,e){return this._map.fire(o,{originalEvent:e})},module.exports=BoxZoomHandler; +},{"../../geo/lng_lat_bounds":20,"../../util/dom":115,"../../util/util":127,"../../util/window":110}],96:[function(require,module,exports){ +"use strict";var DoubleClickZoomHandler=function(o){this._map=o,this._onDblClick=this._onDblClick.bind(this)};DoubleClickZoomHandler.prototype.isEnabled=function(){return!!this._enabled},DoubleClickZoomHandler.prototype.enable=function(){this.isEnabled()||(this._map.on("dblclick",this._onDblClick),this._enabled=!0)},DoubleClickZoomHandler.prototype.disable=function(){this.isEnabled()&&(this._map.off("dblclick",this._onDblClick),this._enabled=!1)},DoubleClickZoomHandler.prototype._onDblClick=function(o){this._map.zoomTo(this._map.getZoom()+(o.originalEvent.shiftKey?-1:1),{around:o.lngLat},o)},module.exports=DoubleClickZoomHandler; +},{}],97:[function(require,module,exports){ +"use strict";var DOM=require("../../util/dom"),util=require("../../util/util"),window=require("../../util/window"),inertiaLinearity=.3,inertiaEasing=util.bezier(0,0,inertiaLinearity,1),inertiaMaxSpeed=1400,inertiaDeceleration=2500,DragPanHandler=function(t){this._map=t,this._el=t.getCanvasContainer(),util.bindAll(["_onDown","_onMove","_onUp","_onTouchEnd","_onMouseUp"],this)};DragPanHandler.prototype.isEnabled=function(){return!!this._enabled},DragPanHandler.prototype.isActive=function(){return!!this._active},DragPanHandler.prototype.enable=function(){this.isEnabled()||(this._el.addEventListener("mousedown",this._onDown),this._el.addEventListener("touchstart",this._onDown),this._enabled=!0)},DragPanHandler.prototype.disable=function(){this.isEnabled()&&(this._el.removeEventListener("mousedown",this._onDown),this._el.removeEventListener("touchstart",this._onDown),this._enabled=!1)},DragPanHandler.prototype._onDown=function(t){this._ignoreEvent(t)||this.isActive()||(t.touches?(window.document.addEventListener("touchmove",this._onMove),window.document.addEventListener("touchend",this._onTouchEnd)):(window.document.addEventListener("mousemove",this._onMove),window.document.addEventListener("mouseup",this._onMouseUp)),this._active=!1,this._startPos=this._pos=DOM.mousePos(this._el,t),this._inertia=[[Date.now(),this._pos]])},DragPanHandler.prototype._onMove=function(t){if(!this._ignoreEvent(t)){this.isActive()||(this._active=!0,this._fireEvent("dragstart",t),this._fireEvent("movestart",t));var e=DOM.mousePos(this._el,t),n=this._map;n.stop(),this._drainInertiaBuffer(),this._inertia.push([Date.now(),e]),n.transform.setLocationAtPoint(n.transform.pointLocation(this._pos),e),this._fireEvent("drag",t),this._fireEvent("move",t),this._pos=e,t.preventDefault()}},DragPanHandler.prototype._onUp=function(t){var e=this;if(this.isActive()){this._active=!1,this._fireEvent("dragend",t),this._drainInertiaBuffer();var n=function(){return e._fireEvent("moveend",t)},i=this._inertia;if(i.length<2)return void n();var o=i[i.length-1],r=i[0],a=o[1].sub(r[1]),s=(o[0]-r[0])/1e3;if(0===s||o[1].equals(r[1]))return void n();var u=a.mult(inertiaLinearity/s),h=u.mag();h>inertiaMaxSpeed&&(h=inertiaMaxSpeed,u._unit()._mult(h));var d=h/(inertiaDeceleration*inertiaLinearity),v=u.mult(-d/2);this._map.panBy(v,{duration:1e3*d,easing:inertiaEasing,noMoveStart:!0},{originalEvent:t})}},DragPanHandler.prototype._onMouseUp=function(t){this._ignoreEvent(t)||(this._onUp(t),window.document.removeEventListener("mousemove",this._onMove),window.document.removeEventListener("mouseup",this._onMouseUp))},DragPanHandler.prototype._onTouchEnd=function(t){this._ignoreEvent(t)||(this._onUp(t),window.document.removeEventListener("touchmove",this._onMove),window.document.removeEventListener("touchend",this._onTouchEnd))},DragPanHandler.prototype._fireEvent=function(t,e){return this._map.fire(t,{originalEvent:e})},DragPanHandler.prototype._ignoreEvent=function(t){var e=this._map;if(e.boxZoom&&e.boxZoom.isActive())return!0;if(e.dragRotate&&e.dragRotate.isActive())return!0;if(t.touches)return t.touches.length>1;if(t.ctrlKey)return!0;var n=1,i=0;return"mousemove"===t.type?t.buttons&0===n:t.button!==i},DragPanHandler.prototype._drainInertiaBuffer=function(){for(var t=this._inertia,e=Date.now(),n=160;t.length>0&&e-t[0][0]>n;)t.shift()},module.exports=DragPanHandler; +},{"../../util/dom":115,"../../util/util":127,"../../util/window":110}],98:[function(require,module,exports){ +"use strict";var DOM=require("../../util/dom"),util=require("../../util/util"),window=require("../../util/window"),inertiaLinearity=.25,inertiaEasing=util.bezier(0,0,inertiaLinearity,1),inertiaMaxSpeed=180,inertiaDeceleration=720,DragRotateHandler=function(t,e){this._map=t,this._el=t.getCanvasContainer(),this._bearingSnap=e.bearingSnap,this._pitchWithRotate=e.pitchWithRotate!==!1,util.bindAll(["_onDown","_onMove","_onUp"],this)};DragRotateHandler.prototype.isEnabled=function(){return!!this._enabled},DragRotateHandler.prototype.isActive=function(){return!!this._active},DragRotateHandler.prototype.enable=function(){this.isEnabled()||(this._el.addEventListener("mousedown",this._onDown),this._enabled=!0)},DragRotateHandler.prototype.disable=function(){this.isEnabled()&&(this._el.removeEventListener("mousedown",this._onDown),this._enabled=!1)},DragRotateHandler.prototype._onDown=function(t){this._ignoreEvent(t)||this.isActive()||(window.document.addEventListener("mousemove",this._onMove),window.document.addEventListener("mouseup",this._onUp),this._active=!1,this._inertia=[[Date.now(),this._map.getBearing()]],this._startPos=this._pos=DOM.mousePos(this._el,t),this._center=this._map.transform.centerPoint,t.preventDefault())},DragRotateHandler.prototype._onMove=function(t){if(!this._ignoreEvent(t)){this.isActive()||(this._active=!0,this._fireEvent("rotatestart",t),this._fireEvent("movestart",t));var e=this._map;e.stop();var i=this._pos,n=DOM.mousePos(this._el,t),r=.8*(i.x-n.x),a=(i.y-n.y)*-.5,o=e.getBearing()-r,s=e.getPitch()-a,h=this._inertia,_=h[h.length-1];this._drainInertiaBuffer(),h.push([Date.now(),e._normalizeBearing(o,_[1])]),e.transform.bearing=o,this._pitchWithRotate&&(e.transform.pitch=s),this._fireEvent("rotate",t),this._fireEvent("move",t),this._pos=n}},DragRotateHandler.prototype._onUp=function(t){var e=this;if(!this._ignoreEvent(t)&&(window.document.removeEventListener("mousemove",this._onMove),window.document.removeEventListener("mouseup",this._onUp),this.isActive())){this._active=!1,this._fireEvent("rotateend",t),this._drainInertiaBuffer();var i=this._map,n=i.getBearing(),r=this._inertia,a=function(){Math.abs(n)inertiaMaxSpeed&&(l=inertiaMaxSpeed);var p=l/(inertiaDeceleration*inertiaLinearity),g=u*l*(p/2);_+=g,Math.abs(i._normalizeBearing(_,0))1;var i=t.ctrlKey?1:2,n=t.ctrlKey?0:2,r=t.button;return"undefined"!=typeof InstallTrigger&&2===t.button&&t.ctrlKey&&window.navigator.platform.toUpperCase().indexOf("MAC")>=0&&(r=0),"mousemove"===t.type?t.buttons&0===i:r!==n},DragRotateHandler.prototype._drainInertiaBuffer=function(){for(var t=this._inertia,e=Date.now(),i=160;t.length>0&&e-t[0][0]>i;)t.shift()},module.exports=DragRotateHandler; +},{"../../util/dom":115,"../../util/util":127,"../../util/window":110}],99:[function(require,module,exports){ +"use strict";function easeOut(e){return e*(2-e)}var panStep=100,bearingStep=15,pitchStep=10,KeyboardHandler=function(e){this._map=e,this._el=e.getCanvasContainer(),this._onKeyDown=this._onKeyDown.bind(this)};KeyboardHandler.prototype.isEnabled=function(){return!!this._enabled},KeyboardHandler.prototype.enable=function(){this.isEnabled()||(this._el.addEventListener("keydown",this._onKeyDown,!1),this._enabled=!0)},KeyboardHandler.prototype.disable=function(){this.isEnabled()&&(this._el.removeEventListener("keydown",this._onKeyDown),this._enabled=!1)},KeyboardHandler.prototype._onKeyDown=function(e){if(!(e.altKey||e.ctrlKey||e.metaKey)){var t=0,n=0,a=0,i=0,r=0;switch(e.keyCode){case 61:case 107:case 171:case 187:t=1;break;case 189:case 109:case 173:t=-1;break;case 37:e.shiftKey?n=-1:(e.preventDefault(),i=-1);break;case 39:e.shiftKey?n=1:(e.preventDefault(),i=1);break;case 38:e.shiftKey?a=1:(e.preventDefault(),r=-1);break;case 40:e.shiftKey?a=-1:(r=1,e.preventDefault())}var s=this._map,o=s.getZoom(),d={duration:300,delayEndEvents:500,easing:easeOut,zoom:t?Math.round(o)+t*(e.shiftKey?2:1):o,bearing:s.getBearing()+n*bearingStep,pitch:s.getPitch()+a*pitchStep,offset:[-i*panStep,-r*panStep],center:s.getCenter()};s.easeTo(d,{originalEvent:e})}},module.exports=KeyboardHandler; +},{}],100:[function(require,module,exports){ +"use strict";var DOM=require("../../util/dom"),util=require("../../util/util"),browser=require("../../util/browser"),window=require("../../util/window"),ua=window.navigator.userAgent.toLowerCase(),firefox=ua.indexOf("firefox")!==-1,safari=ua.indexOf("safari")!==-1&&ua.indexOf("chrom")===-1,ScrollZoomHandler=function(e){this._map=e,this._el=e.getCanvasContainer(),util.bindAll(["_onWheel","_onTimeout"],this)};ScrollZoomHandler.prototype.isEnabled=function(){return!!this._enabled},ScrollZoomHandler.prototype.enable=function(){this.isEnabled()||(this._el.addEventListener("wheel",this._onWheel,!1),this._el.addEventListener("mousewheel",this._onWheel,!1),this._enabled=!0)},ScrollZoomHandler.prototype.disable=function(){this.isEnabled()&&(this._el.removeEventListener("wheel",this._onWheel),this._el.removeEventListener("mousewheel",this._onWheel),this._enabled=!1)},ScrollZoomHandler.prototype._onWheel=function(e){var t;"wheel"===e.type?(t=e.deltaY,firefox&&e.deltaMode===window.WheelEvent.DOM_DELTA_PIXEL&&(t/=browser.devicePixelRatio),e.deltaMode===window.WheelEvent.DOM_DELTA_LINE&&(t*=40)):"mousewheel"===e.type&&(t=-e.wheelDeltaY,safari&&(t/=3));var o=browser.now(),i=o-(this._time||0);this._pos=DOM.mousePos(this._el,e),this._time=o,0!==t&&t%4.000244140625===0?this._type="wheel":0!==t&&Math.abs(t)<4?this._type="trackpad":i>400?(this._type=null,this._lastValue=t,this._timeout=setTimeout(this._onTimeout,40)):this._type||(this._type=Math.abs(i*t)<200?"trackpad":"wheel",this._timeout&&(clearTimeout(this._timeout),this._timeout=null,t+=this._lastValue)),e.shiftKey&&t&&(t/=4),this._type&&this._zoom(-t,e),e.preventDefault()},ScrollZoomHandler.prototype._onTimeout=function(){this._type="wheel",this._zoom(-this._lastValue)},ScrollZoomHandler.prototype._zoom=function(e,t){if(0!==e){var o=this._map,i=2/(1+Math.exp(-Math.abs(e/100)));e<0&&0!==i&&(i=1/i);var l=o.ease?o.ease.to:o.transform.scale,s=o.transform.scaleZoom(l*i);o.zoomTo(s,{duration:"wheel"===this._type?200:0,around:o.unproject(this._pos),delayEndEvents:200,smoothEasing:!0},{originalEvent:t})}},module.exports=ScrollZoomHandler; +},{"../../util/browser":108,"../../util/dom":115,"../../util/util":127,"../../util/window":110}],101:[function(require,module,exports){ +"use strict";var DOM=require("../../util/dom"),util=require("../../util/util"),window=require("../../util/window"),inertiaLinearity=.15,inertiaEasing=util.bezier(0,0,inertiaLinearity,1),inertiaDeceleration=12,inertiaMaxSpeed=2.5,significantScaleThreshold=.15,significantRotateThreshold=4,TouchZoomRotateHandler=function(t){this._map=t,this._el=t.getCanvasContainer(),util.bindAll(["_onStart","_onMove","_onEnd"],this)};TouchZoomRotateHandler.prototype.isEnabled=function(){return!!this._enabled},TouchZoomRotateHandler.prototype.enable=function(){this.isEnabled()||(this._el.addEventListener("touchstart",this._onStart,!1),this._enabled=!0)},TouchZoomRotateHandler.prototype.disable=function(){this.isEnabled()&&(this._el.removeEventListener("touchstart",this._onStart),this._enabled=!1)},TouchZoomRotateHandler.prototype.disableRotation=function(){this._rotationDisabled=!0},TouchZoomRotateHandler.prototype.enableRotation=function(){this._rotationDisabled=!1},TouchZoomRotateHandler.prototype._onStart=function(t){if(2===t.touches.length){var e=DOM.mousePos(this._el,t.touches[0]),i=DOM.mousePos(this._el,t.touches[1]);this._startVec=e.sub(i),this._startScale=this._map.transform.scale,this._startBearing=this._map.transform.bearing,this._gestureIntent=void 0,this._inertia=[],window.document.addEventListener("touchmove",this._onMove,!1),window.document.addEventListener("touchend",this._onEnd,!1)}},TouchZoomRotateHandler.prototype._onMove=function(t){if(2===t.touches.length){var e=DOM.mousePos(this._el,t.touches[0]),i=DOM.mousePos(this._el,t.touches[1]),o=e.add(i).div(2),n=e.sub(i),a=n.mag()/this._startVec.mag(),r=this._rotationDisabled?0:180*n.angleWith(this._startVec)/Math.PI,s=this._map;if(this._gestureIntent){var h={duration:0,around:s.unproject(o)};"rotate"===this._gestureIntent&&(h.bearing=this._startBearing+r),"zoom"!==this._gestureIntent&&"rotate"!==this._gestureIntent||(h.zoom=s.transform.scaleZoom(this._startScale*a)),s.stop(),this._drainInertiaBuffer(),this._inertia.push([Date.now(),a,o]),s.easeTo(h,{originalEvent:t})}else{var u=Math.abs(1-a)>significantScaleThreshold,l=Math.abs(r)>significantRotateThreshold;l?this._gestureIntent="rotate":u&&(this._gestureIntent="zoom"),this._gestureIntent&&(this._startVec=n,this._startScale=s.transform.scale,this._startBearing=s.transform.bearing)}t.preventDefault()}},TouchZoomRotateHandler.prototype._onEnd=function(t){window.document.removeEventListener("touchmove",this._onMove),window.document.removeEventListener("touchend",this._onEnd),this._drainInertiaBuffer();var e=this._inertia,i=this._map;if(e.length<2)return void i.snapToNorth({},{originalEvent:t});var o=e[e.length-1],n=e[0],a=i.transform.scaleZoom(this._startScale*o[1]),r=i.transform.scaleZoom(this._startScale*n[1]),s=a-r,h=(o[0]-n[0])/1e3,u=o[2];if(0===h||a===r)return void i.snapToNorth({},{originalEvent:t});var l=s*inertiaLinearity/h;Math.abs(l)>inertiaMaxSpeed&&(l=l>0?inertiaMaxSpeed:-inertiaMaxSpeed);var d=1e3*Math.abs(l/(inertiaDeceleration*inertiaLinearity)),c=a+l*d/2e3;c<0&&(c=0),i.easeTo({zoom:c,duration:d,easing:inertiaEasing,around:i.unproject(u)},{originalEvent:t})},TouchZoomRotateHandler.prototype._drainInertiaBuffer=function(){for(var t=this._inertia,e=Date.now(),i=160;t.length>2&&e-t[0][0]>i;)t.shift()},module.exports=TouchZoomRotateHandler; +},{"../../util/dom":115,"../../util/util":127,"../../util/window":110}],102:[function(require,module,exports){ +"use strict";var util=require("../util/util"),window=require("../util/window"),Hash=function(){util.bindAll(["_onHashChange","_updateHash"],this)};Hash.prototype.addTo=function(t){return this._map=t,window.addEventListener("hashchange",this._onHashChange,!1),this._map.on("moveend",this._updateHash),this},Hash.prototype.remove=function(){return window.removeEventListener("hashchange",this._onHashChange,!1),this._map.off("moveend",this._updateHash),delete this._map,this},Hash.prototype._onHashChange=function(){var t=window.location.hash.replace("#","").split("/");return t.length>=3&&(this._map.jumpTo({center:[+t[2],+t[1]],zoom:+t[0],bearing:+(t[3]||0),pitch:+(t[4]||0)}),!0)},Hash.prototype._updateHash=function(){var t=this._map.getCenter(),e=this._map.getZoom(),a=this._map.getBearing(),h=this._map.getPitch(),i=Math.max(0,Math.ceil(Math.log(e)/Math.LN2)),n="#"+Math.round(100*e)/100+"/"+t.lat.toFixed(i)+"/"+t.lng.toFixed(i);(a||h)&&(n+="/"+Math.round(10*a)/10),h&&(n+="/"+Math.round(h)),window.history.replaceState("","",n)},module.exports=Hash; +},{"../util/util":127,"../util/window":110}],103:[function(require,module,exports){ +"use strict";function removeNode(t){t.parentNode&&t.parentNode.removeChild(t)}var util=require("../util/util"),browser=require("../util/browser"),window=require("../util/window"),DOM=require("../util/dom"),Style=require("../style/style"),AnimationLoop=require("../style/animation_loop"),Painter=require("../render/painter"),Transform=require("../geo/transform"),Hash=require("./hash"),bindHandlers=require("./bind_handlers"),Camera=require("./camera"),LngLat=require("../geo/lng_lat"),LngLatBounds=require("../geo/lng_lat_bounds"),Point=require("point-geometry"),AttributionControl=require("./control/attribution_control"),isSupported=require("mapbox-gl-supported"),defaultMinZoom=0,defaultMaxZoom=20,defaultOptions={center:[0,0],zoom:0,bearing:0,pitch:0,minZoom:defaultMinZoom,maxZoom:defaultMaxZoom,interactive:!0,scrollZoom:!0,boxZoom:!0,dragRotate:!0,dragPan:!0,keyboard:!0,doubleClickZoom:!0,touchZoomRotate:!0,bearingSnap:7,hash:!1,attributionControl:!0,failIfMajorPerformanceCaveat:!1,preserveDrawingBuffer:!1,trackResize:!0},Map=function(t){function e(e){var i=this;e=util.extend({},defaultOptions,e);var o=new Transform(e.minZoom,e.maxZoom);if(t.call(this,o,e),this._interactive=e.interactive,this._failIfMajorPerformanceCaveat=e.failIfMajorPerformanceCaveat,this._preserveDrawingBuffer=e.preserveDrawingBuffer,this._trackResize=e.trackResize,this._bearingSnap=e.bearingSnap,"string"==typeof e.container){if(this._container=window.document.getElementById(e.container),!this._container)throw new Error("Container '"+e.container+"' not found.")}else this._container=e.container;this.animationLoop=new AnimationLoop,e.maxBounds&&this.setMaxBounds(e.maxBounds),util.bindAll(["_onWindowOnline","_onWindowResize","_contextLost","_contextRestored","_update","_render","_onData","_onDataLoading"],this),this._setupContainer(),this._setupPainter(),this.on("move",this._update.bind(this,!1)),this.on("zoom",this._update.bind(this,!0)),this.on("moveend",function(){i.animationLoop.set(300),i._rerender()}),"undefined"!=typeof window&&(window.addEventListener("online",this._onWindowOnline,!1),window.addEventListener("resize",this._onWindowResize,!1)),bindHandlers(this,e),this._hash=e.hash&&(new Hash).addTo(this),this._hash&&this._hash._onHashChange()||this.jumpTo({center:e.center,zoom:e.zoom,bearing:e.bearing,pitch:e.pitch}),this._classes=[],this.resize(),e.classes&&this.setClasses(e.classes),e.style&&this.setStyle(e.style),e.attributionControl&&this.addControl(new AttributionControl),this.on("style.load",function(){this.transform.unmodified&&this.jumpTo(this.style.stylesheet),this.style.update(this._classes,{transition:!1})}),this.on("data",this._onData),this.on("dataloading",this._onDataLoading)}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var i={showTileBoundaries:{},showCollisionBoxes:{},showOverdrawInspector:{},repaint:{},vertices:{}};return e.prototype.addControl=function(t,e){void 0===e&&t.getDefaultPosition&&(e=t.getDefaultPosition()),void 0===e&&(e="top-right");var i=t.onAdd(this),o=this._controlPositions[e];return e.indexOf("bottom")!==-1?o.insertBefore(i,o.firstChild):o.appendChild(i),this},e.prototype.removeControl=function(t){return t.onRemove(this),this},e.prototype.addClass=function(t,e){return this._classes.indexOf(t)>=0||""===t?this:(this._classes.push(t),this._classOptions=e,this.style&&this.style.updateClasses(),this._update(!0))},e.prototype.removeClass=function(t,e){var i=this._classes.indexOf(t);return i<0||""===t?this:(this._classes.splice(i,1),this._classOptions=e,this.style&&this.style.updateClasses(),this._update(!0))},e.prototype.setClasses=function(t,e){for(var i={},o=0;o=0},e.prototype.getClasses=function(){return this._classes},e.prototype.resize=function(){var t=this._containerDimensions(),e=t[0],i=t[1];return this._resizeCanvas(e,i),this.transform.resize(e,i),this.painter.resize(e,i),this.fire("movestart").fire("move").fire("resize").fire("moveend")},e.prototype.getBounds=function(){var t=new LngLatBounds(this.transform.pointLocation(new Point(0,this.transform.height)),this.transform.pointLocation(new Point(this.transform.width,0)));return(this.transform.angle||this.transform.pitch)&&(t.extend(this.transform.pointLocation(new Point(this.transform.size.x,0))),t.extend(this.transform.pointLocation(new Point(0,this.transform.size.y)))),t},e.prototype.setMaxBounds=function(t){if(t){var e=LngLatBounds.convert(t);this.transform.lngRange=[e.getWest(),e.getEast()],this.transform.latRange=[e.getSouth(),e.getNorth()],this.transform._constrain(),this._update()}else null!==t&&void 0!==t||(this.transform.lngRange=[],this.transform.latRange=[],this._update());return this},e.prototype.setMinZoom=function(t){if(t=null===t||void 0===t?defaultMinZoom:t,t>=defaultMinZoom&&t<=this.transform.maxZoom)return this.transform.minZoom=t,this._update(),this.getZoom()=this.transform.minZoom)return this.transform.maxZoom=t,this._update(),this.getZoom()>t&&this.setZoom(t),this;throw new Error("maxZoom must be greater than the current minZoom")},e.prototype.getMaxZoom=function(){return this.transform.maxZoom},e.prototype.project=function(t){return this.transform.locationPoint(LngLat.convert(t))},e.prototype.unproject=function(t){return this.transform.pointLocation(Point.convert(t))},e.prototype.queryRenderedFeatures=function(){function t(t){return t instanceof Point||Array.isArray(t)}var e,i={};return 2===arguments.length?(e=arguments[0],i=arguments[1]):1===arguments.length&&t(arguments[0])?e=arguments[0]:1===arguments.length&&(i=arguments[0]),this.style.queryRenderedFeatures(this._makeQueryGeometry(e),i,this.transform.zoom,this.transform.angle)},e.prototype._makeQueryGeometry=function(t){var e=this;void 0===t&&(t=[Point.convert([0,0]),Point.convert([this.transform.width,this.transform.height])]);var i,o=t instanceof Point||"number"==typeof t[0];if(o){var s=Point.convert(t);i=[s]}else{var r=[Point.convert(t[0]),Point.convert(t[1])];i=[r[0],new Point(r[1].x,r[0].y),r[1],new Point(r[0].x,r[1].y),r[0]]}return i=i.map(function(t){return e.transform.pointCoordinate(t)})},e.prototype.querySourceFeatures=function(t,e){return this.style.querySourceFeatures(t,e)},e.prototype.setStyle=function(t,e){var i=(!e||e.diff!==!1)&&this.style&&t&&!(t instanceof Style)&&"string"!=typeof t;if(i)try{return this.style.setState(t)&&this._update(!0),this}catch(t){util.warnOnce("Unable to perform style diff: "+(t.message||t.error||t)+". Rebuilding the style from scratch.")}return this.style&&(this.style.setEventedParent(null),this.style._remove(),this.off("rotate",this.style._redoPlacement),this.off("pitch",this.style._redoPlacement)),t?(t instanceof Style?this.style=t:this.style=new Style(t,this),this.style.setEventedParent(this,{style:this.style}),this.on("rotate",this.style._redoPlacement),this.on("pitch",this.style._redoPlacement),this):(this.style=null,this)},e.prototype.getStyle=function(){if(this.style)return this.style.serialize()},e.prototype.addSource=function(t,e){return this.style.addSource(t,e),this._update(!0),this},e.prototype.addSourceType=function(t,e,i){return this.style.addSourceType(t,e,i)},e.prototype.removeSource=function(t){return this.style.removeSource(t),this._update(!0),this},e.prototype.getSource=function(t){return this.style.getSource(t)},e.prototype.addLayer=function(t,e){return this.style.addLayer(t,e),this._update(!0),this},e.prototype.moveLayer=function(t,e){return this.style.moveLayer(t,e),this._update(!0),this},e.prototype.removeLayer=function(t){return this.style.removeLayer(t),this._update(!0),this},e.prototype.getLayer=function(t){return this.style.getLayer(t)},e.prototype.setFilter=function(t,e){return this.style.setFilter(t,e),this._update(!0),this},e.prototype.setLayerZoomRange=function(t,e,i){return this.style.setLayerZoomRange(t,e,i),this._update(!0),this},e.prototype.getFilter=function(t){return this.style.getFilter(t)},e.prototype.setPaintProperty=function(t,e,i,o){return this.style.setPaintProperty(t,e,i,o),this._update(!0),this},e.prototype.getPaintProperty=function(t,e,i){return this.style.getPaintProperty(t,e,i)},e.prototype.setLayoutProperty=function(t,e,i){return this.style.setLayoutProperty(t,e,i),this._update(!0),this},e.prototype.getLayoutProperty=function(t,e){return this.style.getLayoutProperty(t,e)},e.prototype.setLight=function(t){return this.style.setLight(t),this._update(!0),this},e.prototype.getLight=function(){return this.style.getLight()},e.prototype.getContainer=function(){return this._container},e.prototype.getCanvasContainer=function(){return this._canvasContainer},e.prototype.getCanvas=function(){return this._canvas},e.prototype._containerDimensions=function(){var t=0,e=0;return this._container&&(t=this._container.offsetWidth||400,e=this._container.offsetHeight||300),[t,e]},e.prototype._setupContainer=function(){var t=this._container;t.classList.add("mapboxgl-map");var e=this._canvasContainer=DOM.create("div","mapboxgl-canvas-container",t);this._interactive&&e.classList.add("mapboxgl-interactive"),this._canvas=DOM.create("canvas","mapboxgl-canvas",e),this._canvas.style.position="absolute",this._canvas.addEventListener("webglcontextlost",this._contextLost,!1),this._canvas.addEventListener("webglcontextrestored",this._contextRestored,!1),this._canvas.setAttribute("tabindex",0),this._canvas.setAttribute("aria-label","Map");var i=this._containerDimensions();this._resizeCanvas(i[0],i[1]);var o=this._controlContainer=DOM.create("div","mapboxgl-control-container",t),s=this._controlPositions={};["top-left","top-right","bottom-left","bottom-right"].forEach(function(t){s[t]=DOM.create("div","mapboxgl-ctrl-"+t,o)})},e.prototype._resizeCanvas=function(t,e){var i=window.devicePixelRatio||1;this._canvas.width=i*t,this._canvas.height=i*e,this._canvas.style.width=t+"px",this._canvas.style.height=e+"px"},e.prototype._setupPainter=function(){var t=util.extend({failIfMajorPerformanceCaveat:this._failIfMajorPerformanceCaveat,preserveDrawingBuffer:this._preserveDrawingBuffer},isSupported.webGLContextAttributes),e=this._canvas.getContext("webgl",t)||this._canvas.getContext("experimental-webgl",t);return e?void(this.painter=new Painter(e,this.transform)):void this.fire("error",{error:new Error("Failed to initialize WebGL")})},e.prototype._contextLost=function(t){t.preventDefault(),this._frameId&&browser.cancelFrame(this._frameId),this.fire("webglcontextlost",{originalEvent:t})},e.prototype._contextRestored=function(t){this._setupPainter(),this.resize(),this._update(),this.fire("webglcontextrestored",{originalEvent:t})},e.prototype.loaded=function(){return!this._styleDirty&&!this._sourcesDirty&&!(!this.style||!this.style.loaded())},e.prototype._update=function(t){return this.style?(this._styleDirty=this._styleDirty||t,this._sourcesDirty=!0,this._rerender(),this):this},e.prototype._render=function(){return this.style&&this._styleDirty&&(this._styleDirty=!1,this.style.update(this._classes,this._classOptions),this._classOptions=null,this.style._recalculate(this.transform.zoom)),this.style&&this._sourcesDirty&&(this._sourcesDirty=!1,this.style._updateSources(this.transform)),this.painter.render(this.style,{showTileBoundaries:this.showTileBoundaries,showOverdrawInspector:this._showOverdrawInspector,rotating:this.rotating,zooming:this.zooming}),this.fire("render"),this.loaded()&&!this._loaded&&(this._loaded=!0,this.fire("load")),this._frameId=null,this.animationLoop.stopped()||(this._styleDirty=!0),(this._sourcesDirty||this._repaint||this._styleDirty)&&this._rerender(),this},e.prototype.remove=function(){this._hash&&this._hash.remove(),browser.cancelFrame(this._frameId),this.setStyle(null),"undefined"!=typeof window&&window.removeEventListener("resize",this._onWindowResize,!1);var t=this.painter.gl.getExtension("WEBGL_lose_context");t&&t.loseContext(),removeNode(this._canvasContainer),removeNode(this._controlContainer),this._container.classList.remove("mapboxgl-map"),this.fire("remove")},e.prototype._rerender=function(){this.style&&!this._frameId&&(this._frameId=browser.frame(this._render))},e.prototype._onWindowOnline=function(){this._update()},e.prototype._onWindowResize=function(){this._trackResize&&this.stop().resize()._update()},i.showTileBoundaries.get=function(){return!!this._showTileBoundaries},i.showTileBoundaries.set=function(t){this._showTileBoundaries!==t&&(this._showTileBoundaries=t,this._update())},i.showCollisionBoxes.get=function(){return!!this._showCollisionBoxes},i.showCollisionBoxes.set=function(t){this._showCollisionBoxes!==t&&(this._showCollisionBoxes=t,this.style._redoPlacement())},i.showOverdrawInspector.get=function(){return!!this._showOverdrawInspector},i.showOverdrawInspector.set=function(t){this._showOverdrawInspector!==t&&(this._showOverdrawInspector=t,this._update())},i.repaint.get=function(){return!!this._repaint},i.repaint.set=function(t){this._repaint=t,this._update()},i.vertices.get=function(){return!!this._vertices},i.vertices.set=function(t){this._vertices=t,this._update()},e.prototype._onData=function(t){this._update("style"===t.dataType),this.fire(t.dataType+"data",t)},e.prototype._onDataLoading=function(t){this.fire(t.dataType+"dataloading",t)},Object.defineProperties(e.prototype,i),e}(Camera);module.exports=Map; +},{"../geo/lng_lat":19,"../geo/lng_lat_bounds":20,"../geo/transform":21,"../render/painter":36,"../style/animation_loop":57,"../style/style":61,"../util/browser":108,"../util/dom":115,"../util/util":127,"../util/window":110,"./bind_handlers":89,"./camera":90,"./control/attribution_control":91,"./hash":102,"mapbox-gl-supported":190,"point-geometry":194}],104:[function(require,module,exports){ +"use strict";var DOM=require("../util/dom"),LngLat=require("../geo/lng_lat"),Point=require("point-geometry"),Marker=function(t,e){this._offset=Point.convert(e&&e.offset||[0,0]),this._update=this._update.bind(this),this._onMapClick=this._onMapClick.bind(this),t||(t=DOM.create("div")),t.classList.add("mapboxgl-marker"),this._element=t,this._popup=null};Marker.prototype.addTo=function(t){return this.remove(),this._map=t,t.getCanvasContainer().appendChild(this._element),t.on("move",this._update),t.on("moveend",this._update),this._update(),this._map.on("click",this._onMapClick),this},Marker.prototype.remove=function(){return this._map&&(this._map.off("click",this._onMapClick),this._map.off("move",this._update),this._map.off("moveend",this._update),this._map=null),DOM.remove(this._element),this._popup&&this._popup.remove(),this},Marker.prototype.getLngLat=function(){return this._lngLat},Marker.prototype.setLngLat=function(t){return this._lngLat=LngLat.convert(t),this._popup&&this._popup.setLngLat(this._lngLat),this._update(),this},Marker.prototype.getElement=function(){return this._element},Marker.prototype.setPopup=function(t){return this._popup&&(this._popup.remove(),this._popup=null),t&&(this._popup=t,this._popup.setLngLat(this._lngLat)),this},Marker.prototype._onMapClick=function(t){var e=t.originalEvent.target,p=this._element;this._popup&&(e===p||p.contains(e))&&this.togglePopup()},Marker.prototype.getPopup=function(){return this._popup},Marker.prototype.togglePopup=function(){var t=this._popup;t&&(t.isOpen()?t.remove():t.addTo(this._map))},Marker.prototype._update=function(t){if(this._map){var e=this._map.project(this._lngLat)._add(this._offset);t&&"moveend"!==t.type||(e=e.round()),DOM.setTransform(this._element,"translate("+e.x+"px, "+e.y+"px)")}},module.exports=Marker; +},{"../geo/lng_lat":19,"../util/dom":115,"point-geometry":194}],105:[function(require,module,exports){ +"use strict";function normalizeOffset(t){if(t){if("number"==typeof t){var o=Math.round(Math.sqrt(.5*Math.pow(t,2)));return{top:new Point(0,t),"top-left":new Point(o,o),"top-right":new Point(-o,o),bottom:new Point(0,-t),"bottom-left":new Point(o,-o),"bottom-right":new Point(-o,-o),left:new Point(t,0),right:new Point(-t,0)}}if(isPointLike(t)){var e=Point.convert(t);return{top:e,"top-left":e,"top-right":e,bottom:e,"bottom-left":e,"bottom-right":e,left:e,right:e}}return{top:Point.convert(t.top),"top-left":Point.convert(t["top-left"]),"top-right":Point.convert(t["top-right"]),bottom:Point.convert(t.bottom),"bottom-left":Point.convert(t["bottom-left"]),"bottom-right":Point.convert(t["bottom-right"]),left:Point.convert(t.left),right:Point.convert(t.right)}}return normalizeOffset(new Point(0,0))}function isPointLike(t){return t instanceof Point||Array.isArray(t)}var util=require("../util/util"),Evented=require("../util/evented"),DOM=require("../util/dom"),LngLat=require("../geo/lng_lat"),Point=require("point-geometry"),window=require("../util/window"),defaultOptions={closeButton:!0,closeOnClick:!0},Popup=function(t){function o(o){t.call(this),this.options=util.extend(Object.create(defaultOptions),o),util.bindAll(["_update","_onClickClose"],this)}return t&&(o.__proto__=t),o.prototype=Object.create(t&&t.prototype),o.prototype.constructor=o,o.prototype.addTo=function(t){return this._map=t,this._map.on("move",this._update),this.options.closeOnClick&&this._map.on("click",this._onClickClose),this._update(),this},o.prototype.isOpen=function(){return!!this._map},o.prototype.remove=function(){return this._content&&this._content.parentNode&&this._content.parentNode.removeChild(this._content),this._container&&(this._container.parentNode.removeChild(this._container),delete this._container),this._map&&(this._map.off("move",this._update),this._map.off("click",this._onClickClose),delete this._map),this.fire("close"),this},o.prototype.getLngLat=function(){return this._lngLat},o.prototype.setLngLat=function(t){return this._lngLat=LngLat.convert(t),this._update(),this},o.prototype.setText=function(t){return this.setDOMContent(window.document.createTextNode(t))},o.prototype.setHTML=function(t){var o,e=window.document.createDocumentFragment(),n=window.document.createElement("body");for(n.innerHTML=t;;){if(o=n.firstChild,!o)break;e.appendChild(o)}return this.setDOMContent(e)},o.prototype.setDOMContent=function(t){return this._createContent(),this._content.appendChild(t),this._update(),this},o.prototype._createContent=function(){this._content&&this._content.parentNode&&this._content.parentNode.removeChild(this._content),this._content=DOM.create("div","mapboxgl-popup-content",this._container),this.options.closeButton&&(this._closeButton=DOM.create("button","mapboxgl-popup-close-button",this._content),this._closeButton.type="button",this._closeButton.innerHTML="×",this._closeButton.addEventListener("click",this._onClickClose))},o.prototype._update=function(){if(this._map&&this._lngLat&&this._content){this._container||(this._container=DOM.create("div","mapboxgl-popup",this._map.getContainer()),this._tip=DOM.create("div","mapboxgl-popup-tip",this._container),this._container.appendChild(this._content));var t=this.options.anchor,o=normalizeOffset(this.options.offset),e=this._map.project(this._lngLat).round();if(!t){var n=this._container.offsetWidth,i=this._container.offsetHeight;t=e.y+o.bottom.ythis._map.transform.height-i?["bottom"]:[],e.xthis._map.transform.width-n/2&&t.push("right"),t=0===t.length?"bottom":t.join("-")}var r=e.add(o[t]),s={top:"translate(-50%,0)","top-left":"translate(0,0)","top-right":"translate(-100%,0)",bottom:"translate(-50%,-100%)","bottom-left":"translate(0,-100%)","bottom-right":"translate(-100%,-100%)",left:"translate(0,-50%)",right:"translate(-100%,-50%)"},p=this._container.classList;for(var a in s)p.remove("mapboxgl-popup-anchor-"+a);p.add("mapboxgl-popup-anchor-"+t),DOM.setTransform(this._container,s[t]+" translate("+r.x+"px,"+r.y+"px)")}},o.prototype._onClickClose=function(){this.remove()},o}(Evented);module.exports=Popup; +},{"../geo/lng_lat":19,"../util/dom":115,"../util/evented":116,"../util/util":127,"../util/window":110,"point-geometry":194}],106:[function(require,module,exports){ +"use strict";var Actor=function(t,e,a){this.target=t,this.parent=e,this.mapId=a,this.callbacks={},this.callbackID=0,this.receive=this.receive.bind(this),this.target.addEventListener("message",this.receive,!1)};Actor.prototype.send=function(t,e,a,r,s){var i=a?this.mapId+":"+this.callbackID++:null;a&&(this.callbacks[i]=a),this.target.postMessage({targetMapId:s,sourceMapId:this.mapId,type:t,id:String(i),data:e},r)},Actor.prototype.receive=function(t){var e,a=this,r=t.data,s=r.id;if(!r.targetMapId||this.mapId===r.targetMapId){var i=function(t,e,r){a.target.postMessage({sourceMapId:a.mapId,type:"",id:String(s),error:t?String(t):null,data:e},r)};if(""===r.type)e=this.callbacks[r.id],delete this.callbacks[r.id],e&&e(r.error||null,r.data);else if("undefined"!=typeof r.id&&this.parent[r.type])this.parent[r.type](r.sourceMapId,r.data,i);else if("undefined"!=typeof r.id&&this.parent.getWorkerSource){var p=r.type.split("."),d=this.parent.getWorkerSource(r.sourceMapId,p[0]);d[p[1]](r.data,i)}else this.parent[r.type](r.data)}},Actor.prototype.remove=function(){this.target.removeEventListener("message",this.receive,!1)},module.exports=Actor; +},{}],107:[function(require,module,exports){ +"use strict";function sameOrigin(e){var n=window.document.createElement("a");return n.href=e,n.protocol===window.document.location.protocol&&n.host===window.document.location.host}var window=require("./window");exports.getJSON=function(e,n){var t=new window.XMLHttpRequest;return t.open("GET",e,!0),t.setRequestHeader("Accept","application/json"),t.onerror=function(e){n(e)},t.onload=function(){if(t.status>=200&&t.status<300&&t.response){var e;try{e=JSON.parse(t.response)}catch(e){return n(e)}n(null,e)}else n(new Error(t.statusText))},t.send(),t},exports.getArrayBuffer=function(e,n){var t=new window.XMLHttpRequest;return t.open("GET",e,!0),t.responseType="arraybuffer",t.onerror=function(e){n(e)},t.onload=function(){return 0===t.response.byteLength&&200===t.status?n(new Error("http status 200 returned without content.")):void(t.status>=200&&t.status<300&&t.response?n(null,t.response):n(new Error(t.statusText)))},t.send(),t};var transparentPngUrl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQYV2NgAAIAAAUAAarVyFEAAAAASUVORK5CYII=";exports.getImage=function(e,n){return exports.getArrayBuffer(e,function(e,t){if(e)return n(e);var r=new window.Image,o=window.URL||window.webkitURL;r.onload=function(){n(null,r),o.revokeObjectURL(r.src)};var s=new window.Blob([new Uint8Array(t)],{type:"image/png"});r.src=t.byteLength?o.createObjectURL(s):transparentPngUrl})},exports.getVideo=function(e,n){var t=window.document.createElement("video");t.onloadstart=function(){n(null,t)};for(var r=0;r=a+n?e.call(t,1):(e.call(t,(i-a)/n),exports.frame(o)))}if(!n)return e.call(t,1),null;var r=!1,a=module.exports.now();return exports.frame(o),function(){r=!0}},exports.getImageData=function(e){var n=window.document.createElement("canvas"),t=n.getContext("2d");return n.width=e.width,n.height=e.height,t.drawImage(e,0,0),t.getImageData(0,0,e.width,e.height).data},exports.supported=require("mapbox-gl-supported"),exports.hardwareConcurrency=window.navigator.hardwareConcurrency||4,Object.defineProperty(exports,"devicePixelRatio",{get:function(){return window.devicePixelRatio}}),exports.supportsWebp=!1;var webpImgTest=window.document.createElement("img");webpImgTest.onload=function(){exports.supportsWebp=!0},webpImgTest.src="data:image/webp;base64,UklGRh4AAABXRUJQVlA4TBEAAAAvAQAAAAfQ//73v/+BiOh/AAA="; +},{"./window":110,"mapbox-gl-supported":190}],109:[function(require,module,exports){ +"use strict";var WebWorkify=require("webworkify"),window=require("../window"),workerURL=window.URL.createObjectURL(new WebWorkify(require("../../source/worker"),{bare:!0}));module.exports=function(){return new window.Worker(workerURL)}; +},{"../../source/worker":55,"../window":110,"webworkify":211}],110:[function(require,module,exports){ +"use strict";module.exports=self; +},{}],111:[function(require,module,exports){ +"use strict";function compareAreas(e,r){return r.area-e.area}var quickselect=require("quickselect"),calculateSignedArea=require("./util").calculateSignedArea;module.exports=function(e,r){var a=e.length;if(a<=1)return[e];for(var t,u,c=[],i=0;i1)for(var n=0;ne.y!=h.y>e.y&&e.x<(h.x-a.x)*(e.y-a.y)/(h.y-a.y)+a.x&&(n=!n),r=Math.min(r,distToSegmentSquared(e,a,h))}return(n?1:-1)*Math.sqrt(r)}function getCentroidCell(e){for(var t=0,n=0,r=0,o=e[0],l=0,i=o.length,s=i-1;ll)&&(l=a.x),(!u||a.y>i)&&(i=a.y)}for(var h=l-r,p=i-o,y=Math.min(h,p),x=y/2,d=new Queue(null,compareMax),g=r;gm.d&&(m=v,n&&console.log("found best %d after %d probes",Math.round(1e4*v.d)/1e4,c)),v.max-m.d<=t||(x=v.h/2,d.push(new Cell(v.p.x-x,v.p.y-x,x,e)),d.push(new Cell(v.p.x+x,v.p.y-x,x,e)),d.push(new Cell(v.p.x-x,v.p.y+x,x,e)),d.push(new Cell(v.p.x+x,v.p.y+x,x,e)),c+=4)}return n&&(console.log("num probes: "+c),console.log("best distance: "+m.d)),m.p}; +},{"./intersection_tests":120,"point-geometry":194,"tinyqueue":199}],118:[function(require,module,exports){ +"use strict";function Glyphs(a,e){this.stacks=a.readFields(readFontstacks,[],e)}function readFontstacks(a,e,r){if(1===a){var t=r.readMessage(readFontstack,{glyphs:{}});e.push(t)}}function readFontstack(a,e,r){if(1===a)e.name=r.readString();else if(2===a)e.range=r.readString();else if(3===a){var t=r.readMessage(readGlyph,{});e.glyphs[t.id]=t}}function readGlyph(a,e,r){1===a?e.id=r.readVarint():2===a?e.bitmap=r.readBytes():3===a?e.width=r.readVarint():4===a?e.height=r.readVarint():5===a?e.left=r.readSVarint():6===a?e.top=r.readSVarint():7===a&&(e.advance=r.readVarint())}module.exports=Glyphs; +},{}],119:[function(require,module,exports){ +"use strict";function interpolate(t,e,n){return t*(1-n)+e*n}module.exports=interpolate,interpolate.number=interpolate,interpolate.vec2=function(t,e,n){return[interpolate(t[0],e[0],n),interpolate(t[1],e[1],n)]},interpolate.color=function(t,e,n){return[interpolate(t[0],e[0],n),interpolate(t[1],e[1],n),interpolate(t[2],e[2],n),interpolate(t[3],e[3],n)]},interpolate.array=function(t,e,n){return t.map(function(t,r){return interpolate(t,e[r],n)})}; +},{}],120:[function(require,module,exports){ +"use strict";function polygonIntersectsPolygon(n,t){for(var e=0;e=3)for(var u=0;u1){if(lineIntersectsLine(n,t))return!0;for(var r=0;r1?n.distSqr(e):n.distSqr(e.sub(t)._mult(o)._add(t))}function multiPolygonContainsPoint(n,t){for(var e,r,o,i=!1,l=0;lt.y!=o.y>t.y&&t.x<(o.x-r.x)*(t.y-r.y)/(o.y-r.y)+r.x&&(i=!i)}return i}function polygonContainsPoint(n,t){for(var e=!1,r=0,o=n.length-1;rt.y!=l.y>t.y&&t.x<(l.x-i.x)*(t.y-i.y)/(l.y-i.y)+i.x&&(e=!e)}return e}var isCounterClockwise=require("./util").isCounterClockwise;module.exports={multiPolygonIntersectsBufferedMultiPoint:multiPolygonIntersectsBufferedMultiPoint,multiPolygonIntersectsMultiPolygon:multiPolygonIntersectsMultiPolygon,multiPolygonIntersectsBufferedMultiLine:multiPolygonIntersectsBufferedMultiLine,polygonIntersectsPolygon:polygonIntersectsPolygon,distToSegmentSquared:distToSegmentSquared}; +},{"./util":127}],121:[function(require,module,exports){ +"use strict";var unicodeBlockLookup={"Latin-1 Supplement":function(n){return n>=128&&n<=255},"Hangul Jamo":function(n){return n>=4352&&n<=4607},"Unified Canadian Aboriginal Syllabics":function(n){return n>=5120&&n<=5759},"Unified Canadian Aboriginal Syllabics Extended":function(n){return n>=6320&&n<=6399},"General Punctuation":function(n){return n>=8192&&n<=8303},"Letterlike Symbols":function(n){return n>=8448&&n<=8527},"Number Forms":function(n){return n>=8528&&n<=8591},"Miscellaneous Technical":function(n){return n>=8960&&n<=9215},"Control Pictures":function(n){return n>=9216&&n<=9279},"Optical Character Recognition":function(n){return n>=9280&&n<=9311},"Enclosed Alphanumerics":function(n){return n>=9312&&n<=9471},"Geometric Shapes":function(n){return n>=9632&&n<=9727},"Miscellaneous Symbols":function(n){return n>=9728&&n<=9983},"Miscellaneous Symbols and Arrows":function(n){return n>=11008&&n<=11263},"CJK Radicals Supplement":function(n){return n>=11904&&n<=12031},"Kangxi Radicals":function(n){return n>=12032&&n<=12255},"Ideographic Description Characters":function(n){return n>=12272&&n<=12287},"CJK Symbols and Punctuation":function(n){return n>=12288&&n<=12351},Hiragana:function(n){return n>=12352&&n<=12447},Katakana:function(n){return n>=12448&&n<=12543},Bopomofo:function(n){return n>=12544&&n<=12591},"Hangul Compatibility Jamo":function(n){return n>=12592&&n<=12687},Kanbun:function(n){return n>=12688&&n<=12703},"Bopomofo Extended":function(n){return n>=12704&&n<=12735},"CJK Strokes":function(n){return n>=12736&&n<=12783},"Katakana Phonetic Extensions":function(n){return n>=12784&&n<=12799},"Enclosed CJK Letters and Months":function(n){return n>=12800&&n<=13055},"CJK Compatibility":function(n){return n>=13056&&n<=13311},"CJK Unified Ideographs Extension A":function(n){return n>=13312&&n<=19903},"Yijing Hexagram Symbols":function(n){return n>=19904&&n<=19967},"CJK Unified Ideographs":function(n){return n>=19968&&n<=40959},"Yi Syllables":function(n){return n>=40960&&n<=42127},"Yi Radicals":function(n){return n>=42128&&n<=42191},"Hangul Jamo Extended-A":function(n){return n>=43360&&n<=43391},"Hangul Syllables":function(n){return n>=44032&&n<=55215},"Hangul Jamo Extended-B":function(n){return n>=55216&&n<=55295},"Private Use Area":function(n){return n>=57344&&n<=63743},"CJK Compatibility Ideographs":function(n){return n>=63744&&n<=64255},"Vertical Forms":function(n){return n>=65040&&n<=65055},"CJK Compatibility Forms":function(n){return n>=65072&&n<=65103},"Small Form Variants":function(n){return n>=65104&&n<=65135},"Halfwidth and Fullwidth Forms":function(n){return n>=65280&&n<=65519}};module.exports=unicodeBlockLookup; +},{}],122:[function(require,module,exports){ +"use strict";var LRUCache=function(t,e){this.max=t,this.onRemove=e,this.reset()};LRUCache.prototype.reset=function(){var t=this;for(var e in this.data)t.onRemove(t.data[e]);return this.data={},this.order=[],this},LRUCache.prototype.add=function(t,e){if(this.has(t))this.order.splice(this.order.indexOf(t),1),this.data[t]=e,this.order.push(t);else if(this.data[t]=e,this.order.push(t),this.order.length>this.max){var r=this.get(this.order[0]);r&&this.onRemove(r)}return this},LRUCache.prototype.has=function(t){return t in this.data},LRUCache.prototype.keys=function(){return this.order},LRUCache.prototype.get=function(t){if(!this.has(t))return null;var e=this.data[t];return delete this.data[t],this.order.splice(this.order.indexOf(t),1),e},LRUCache.prototype.setMaxSize=function(t){var e=this;for(this.max=t;this.order.length>this.max;){var r=e.get(e.order[0]);r&&e.onRemove(r)}return this},module.exports=LRUCache; +},{}],123:[function(require,module,exports){ +"use strict";function makeAPIURL(r,e){var t=parseUrl(config.API_URL);if(r.protocol=t.protocol,r.authority=t.authority,!config.REQUIRE_ACCESS_TOKEN)return formatUrl(r);if(e=e||config.ACCESS_TOKEN,!e)throw new Error("An API access token is required to use Mapbox GL. "+help);if("s"===e[0])throw new Error("Use a public access token (pk.*) with Mapbox GL, not a secret access token (sk.*). "+help);return r.params.push("access_token="+e),formatUrl(r)}function isMapboxURL(r){return 0===r.indexOf("mapbox:")}function replaceTempAccessToken(r){for(var e=0;e=2||512===t?"@2x":"",s=browser.supportsWebp?".webp":"$1";return o.path=o.path.replace(imageExtensionRe,""+a+s),replaceTempAccessToken(o.params),formatUrl(o)};var urlRe=/^(\w+):\/\/([^\/?]+)(\/[^?]+)?\??(.+)?/; +},{"./browser":108,"./config":112}],124:[function(require,module,exports){ +"use strict";var isChar=require("./is_char_in_unicode_block");module.exports.allowsIdeographicBreaking=function(a){for(var i=0,r=a;i=65097&&a<=65103)||(!!isChar["CJK Compatibility Ideographs"](a)||(!!isChar["CJK Compatibility"](a)||(!!isChar["CJK Radicals Supplement"](a)||(!!isChar["CJK Strokes"](a)||(!(!isChar["CJK Symbols and Punctuation"](a)||a>=12296&&a<=12305||a>=12308&&a<=12319||12336===a)||(!!isChar["CJK Unified Ideographs Extension A"](a)||(!!isChar["CJK Unified Ideographs"](a)||(!!isChar["Enclosed CJK Letters and Months"](a)||(!!isChar["Hangul Compatibility Jamo"](a)||(!!isChar["Hangul Jamo Extended-A"](a)||(!!isChar["Hangul Jamo Extended-B"](a)||(!!isChar["Hangul Jamo"](a)||(!!isChar["Hangul Syllables"](a)||(!!isChar.Hiragana(a)||(!!isChar["Ideographic Description Characters"](a)||(!!isChar.Kanbun(a)||(!!isChar["Kangxi Radicals"](a)||(!!isChar["Katakana Phonetic Extensions"](a)||(!(!isChar.Katakana(a)||12540===a)||(!(!isChar["Halfwidth and Fullwidth Forms"](a)||65288===a||65289===a||65293===a||a>=65306&&a<=65310||65339===a||65341===a||65343===a||a>=65371&&a<=65503||65507===a||a>=65512&&a<=65519)||(!(!isChar["Small Form Variants"](a)||a>=65112&&a<=65118||a>=65123&&a<=65126)||(!!isChar["Unified Canadian Aboriginal Syllabics"](a)||(!!isChar["Unified Canadian Aboriginal Syllabics Extended"](a)||(!!isChar["Vertical Forms"](a)||(!!isChar["Yijing Hexagram Symbols"](a)||(!!isChar["Yi Syllables"](a)||!!isChar["Yi Radicals"](a))))))))))))))))))))))))))))))},exports.charHasNeutralVerticalOrientation=function(a){return!(!isChar["Latin-1 Supplement"](a)||167!==a&&169!==a&&174!==a&&177!==a&&188!==a&&189!==a&&190!==a&&215!==a&&247!==a)||(!(!isChar["General Punctuation"](a)||8214!==a&&8224!==a&&8225!==a&&8240!==a&&8241!==a&&8251!==a&&8252!==a&&8258!==a&&8263!==a&&8264!==a&&8265!==a&&8273!==a)||(!!isChar["Letterlike Symbols"](a)||(!!isChar["Number Forms"](a)||(!(!isChar["Miscellaneous Technical"](a)||!(a>=8960&&a<=8967||a>=8972&&a<=8991||a>=8996&&a<=9e3||9003===a||a>=9085&&a<=9114||a>=9150&&a<=9165||9167===a||a>=9169&&a<=9179||a>=9186&&a<=9215))||(!(!isChar["Control Pictures"](a)||9251===a)||(!!isChar["Optical Character Recognition"](a)||(!!isChar["Enclosed Alphanumerics"](a)||(!!isChar["Geometric Shapes"](a)||(!(!isChar["Miscellaneous Symbols"](a)||a>=9754&&a<=9759)||(!(!isChar["Miscellaneous Symbols and Arrows"](a)||!(a>=11026&&a<=11055||a>=11088&&a<=11097||a>=11192&&a<=11243))||(!!isChar["CJK Symbols and Punctuation"](a)||(!!isChar.Katakana(a)||(!!isChar["Private Use Area"](a)||(!!isChar["CJK Compatibility Forms"](a)||(!!isChar["Small Form Variants"](a)||(!!isChar["Halfwidth and Fullwidth Forms"](a)||(8734===a||8756===a||8757===a||a>=9984&&a<=10087||a>=10102&&a<=10131||65532===a||65533===a)))))))))))))))))},exports.charHasRotatedVerticalOrientation=function(a){return!(exports.charHasUprightVerticalOrientation(a)||exports.charHasNeutralVerticalOrientation(a))}; +},{"./is_char_in_unicode_block":121}],125:[function(require,module,exports){ +"use strict";function createStructArrayType(t){var e=JSON.stringify(t);if(structArrayTypeCache[e])return structArrayTypeCache[e];var r=void 0===t.alignment?1:t.alignment,i=0,n=0,a=["Uint8"],o=t.members.map(function(t){a.indexOf(t.type)<0&&a.push(t.type);var e=sizeOf(t.type),o=i=align(i,Math.max(r,e)),s=t.components||1;return n=Math.max(n,e),i+=e*s,{name:t.name,type:t.type,components:s,offset:o}}),s=align(i,Math.max(n,r)),p=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e}(Struct);p.prototype.alignment=r,p.prototype.size=s;for(var y=0,c=o;ythis.capacity){this.capacity=Math.max(t,Math.floor(this.capacity*RESIZE_MULTIPLIER),DEFAULT_CAPACITY),this.arrayBuffer=new ArrayBuffer(this.capacity*this.bytesPerElement);var e=this.uint8;this._refreshViews(),e&&this.uint8.set(e)}},StructArray.prototype._refreshViews=function(){for(var t=this,e=0,r=this._usedTypes;e=1)return 1;var e=r*r,n=e*r;return 4*(r<.5?n:3*(r-e)+n-.75)},exports.bezier=function(r,e,n,t){var o=new UnitBezier(r,e,n,t);return function(r){return o.solve(r)}},exports.ease=exports.bezier(.25,.1,.25,1),exports.clamp=function(r,e,n){return Math.min(n,Math.max(e,r))},exports.wrap=function(r,e,n){var t=n-e,o=((r-e)%t+t)%t+e;return o===e?n:o},exports.asyncAll=function(r,e,n){if(!r.length)return n(null,[]);var t=r.length,o=new Array(r.length),a=null;r.forEach(function(r,i){e(r,function(r,e){r&&(a=r),o[i]=e,0===--t&&n(a,o)})})},exports.values=function(r){var e=[];for(var n in r)e.push(r[n]);return e},exports.keysDifference=function(r,e){var n=[];for(var t in r)t in e||n.push(t);return n},exports.extend=function(r,e,n,t){for(var o=arguments,a=1;a=0)return!0;return!1};var warnOnceHistory={};exports.warnOnce=function(r){warnOnceHistory[r]||("undefined"!=typeof console&&console.warn(r),warnOnceHistory[r]=!0)},exports.isCounterClockwise=function(r,e,n){return(n.y-r.y)*(e.x-r.x)>(e.y-r.y)*(n.x-r.x)},exports.calculateSignedArea=function(r){for(var e,n,t=0,o=0,a=r.length,i=a-1;o0||Math.abs(e.y-n.y)>0)&&Math.abs(exports.calculateSignedArea(r))>.01},exports.sphericalToCartesian=function(r){var e=r[0],n=r[1],t=r[2];return n+=90,n*=Math.PI/180,t*=Math.PI/180,[e*Math.cos(n)*Math.sin(t),e*Math.sin(n)*Math.sin(t),e*Math.cos(t)]}; +},{"../geo/coordinate":18,"point-geometry":194,"unitbezier":200}],128:[function(require,module,exports){ +"use strict";var Feature=function(e,t,r,o){this.type="Feature",this._vectorTileFeature=e,e._z=t,e._x=r,e._y=o,this.properties=e.properties,null!=e.id&&(this.id=e.id)},prototypeAccessors={geometry:{}};prototypeAccessors.geometry.get=function(){return void 0===this._geometry&&(this._geometry=this._vectorTileFeature.toGeoJSON(this._vectorTileFeature._x,this._vectorTileFeature._y,this._vectorTileFeature._z).geometry),this._geometry},prototypeAccessors.geometry.set=function(e){this._geometry=e},Feature.prototype.toJSON=function(){var e=this,t={geometry:this.geometry};for(var r in this)"_geometry"!==r&&"_vectorTileFeature"!==r&&(t[r]=e[r]);return t},Object.defineProperties(Feature.prototype,prototypeAccessors),module.exports=Feature; +},{}],129:[function(require,module,exports){ +"use strict";var scriptDetection=require("./script_detection");module.exports=function(t){for(var o="",e=0;e":"ï¹€","?":"︖","@":"ï¼ ","[":"﹇","\\":"ï¼¼","]":"﹈","^":"ï¼¾",_:"︳","`":"ï½€","{":"︷","|":"―","}":"︸","~":"~","¢":"ï¿ ","£":"ï¿¡","Â¥":"ï¿¥","¦":"¦","¬":"ï¿¢","¯":"ï¿£","–":"︲","â€â€":"︱","‘":"﹃","’":"﹄","“":"ï¹Â","â€Â":"﹂","…":"︙","‧":"・","â‚©":"₩","ã€Â":"︑","。":"︒","〈":"︿","〉":"ï¹€","《":"︽","》":"︾","「":"ï¹Â","ã€Â":"﹂","『":"﹃","ã€Â":"﹄","ã€Â":"︻","】":"︼","ã€â€":"︹","〕":"︺","〖":"︗","〗":"︘","ï¼Â":"︕","(":"︵",")":"︶",",":"ï¸Â","ï¼Â":"︲",".":"・",":":"︓","ï¼›":"ï¸â€","<":"︿",">":"ï¹€","?":"︖","ï¼»":"﹇","ï¼½":"﹈","_":"︳","ï½›":"︷","|":"―","ï½Â":"︸","⦅":"︵","ï½ ":"︶","。":"︒","ï½¢":"ï¹Â","ï½£":"﹂"}; +},{"./script_detection":124}],130:[function(require,module,exports){ +"use strict";var WebWorker=require("./web_worker"),WorkerPool=function(){this.active={}};WorkerPool.prototype.acquire=function(r){var e=this;if(!this.workers){var o=require("../mapbox-gl").workerCount;for(this.workers=[];this.workers.length255?255:e}function clamp_css_float(e){return e<0?0:e>1?1:e}function parse_css_int(e){return clamp_css_byte("%"===e[e.length-1]?parseFloat(e)/100*255:parseInt(e))}function parse_css_float(e){return clamp_css_float("%"===e[e.length-1]?parseFloat(e)/100:parseFloat(e))}function css_hue_to_rgb(e,r,l){return l<0?l+=1:l>1&&(l-=1),6*l<1?e+(r-e)*l*6:2*l<1?r:3*l<2?e+(r-e)*(2/3-l)*6:e}function parseCSSColor(e){var r=e.replace(/ /g,"").toLowerCase();if(r in kCSSColorTable)return kCSSColorTable[r].slice();if("#"===r[0]){if(4===r.length){var l=parseInt(r.substr(1),16);return l>=0&&l<=4095?[(3840&l)>>4|(3840&l)>>8,240&l|(240&l)>>4,15&l|(15&l)<<4,1]:null}if(7===r.length){var l=parseInt(r.substr(1),16);return l>=0&&l<=16777215?[(16711680&l)>>16,(65280&l)>>8,255&l,1]:null}return null}var a=r.indexOf("("),t=r.indexOf(")");if(a!==-1&&t+1===r.length){var n=r.substr(0,a),s=r.substr(a+1,t-(a+1)).split(","),o=1;switch(n){case"rgba":if(4!==s.length)return null;o=parse_css_float(s.pop());case"rgb":return 3!==s.length?null:[parse_css_int(s[0]),parse_css_int(s[1]),parse_css_int(s[2]),o];case"hsla":if(4!==s.length)return null;o=parse_css_float(s.pop());case"hsl":if(3!==s.length)return null;var i=(parseFloat(s[0])%360+360)%360/360,u=parse_css_float(s[1]),g=parse_css_float(s[2]),d=g<=.5?g*(u+1):g+u-g*u,c=2*g-d;return[clamp_css_byte(255*css_hue_to_rgb(c,d,i+1/3)),clamp_css_byte(255*css_hue_to_rgb(c,d,i)),clamp_css_byte(255*css_hue_to_rgb(c,d,i-1/3)),o];default:return null}}return null}var kCSSColorTable={transparent:[0,0,0,0],aliceblue:[240,248,255,1],antiquewhite:[250,235,215,1],aqua:[0,255,255,1],aquamarine:[127,255,212,1],azure:[240,255,255,1],beige:[245,245,220,1],bisque:[255,228,196,1],black:[0,0,0,1],blanchedalmond:[255,235,205,1],blue:[0,0,255,1],blueviolet:[138,43,226,1],brown:[165,42,42,1],burlywood:[222,184,135,1],cadetblue:[95,158,160,1],chartreuse:[127,255,0,1],chocolate:[210,105,30,1],coral:[255,127,80,1],cornflowerblue:[100,149,237,1],cornsilk:[255,248,220,1],crimson:[220,20,60,1],cyan:[0,255,255,1],darkblue:[0,0,139,1],darkcyan:[0,139,139,1],darkgoldenrod:[184,134,11,1],darkgray:[169,169,169,1],darkgreen:[0,100,0,1],darkgrey:[169,169,169,1],darkkhaki:[189,183,107,1],darkmagenta:[139,0,139,1],darkolivegreen:[85,107,47,1],darkorange:[255,140,0,1],darkorchid:[153,50,204,1],darkred:[139,0,0,1],darksalmon:[233,150,122,1],darkseagreen:[143,188,143,1],darkslateblue:[72,61,139,1],darkslategray:[47,79,79,1],darkslategrey:[47,79,79,1],darkturquoise:[0,206,209,1],darkviolet:[148,0,211,1],deeppink:[255,20,147,1],deepskyblue:[0,191,255,1],dimgray:[105,105,105,1],dimgrey:[105,105,105,1],dodgerblue:[30,144,255,1],firebrick:[178,34,34,1],floralwhite:[255,250,240,1],forestgreen:[34,139,34,1],fuchsia:[255,0,255,1],gainsboro:[220,220,220,1],ghostwhite:[248,248,255,1],gold:[255,215,0,1],goldenrod:[218,165,32,1],gray:[128,128,128,1],green:[0,128,0,1],greenyellow:[173,255,47,1],grey:[128,128,128,1],honeydew:[240,255,240,1],hotpink:[255,105,180,1],indianred:[205,92,92,1],indigo:[75,0,130,1],ivory:[255,255,240,1],khaki:[240,230,140,1],lavender:[230,230,250,1],lavenderblush:[255,240,245,1],lawngreen:[124,252,0,1],lemonchiffon:[255,250,205,1],lightblue:[173,216,230,1],lightcoral:[240,128,128,1],lightcyan:[224,255,255,1],lightgoldenrodyellow:[250,250,210,1],lightgray:[211,211,211,1],lightgreen:[144,238,144,1],lightgrey:[211,211,211,1],lightpink:[255,182,193,1],lightsalmon:[255,160,122,1],lightseagreen:[32,178,170,1],lightskyblue:[135,206,250,1],lightslategray:[119,136,153,1],lightslategrey:[119,136,153,1],lightsteelblue:[176,196,222,1],lightyellow:[255,255,224,1],lime:[0,255,0,1],limegreen:[50,205,50,1],linen:[250,240,230,1],magenta:[255,0,255,1],maroon:[128,0,0,1],mediumaquamarine:[102,205,170,1],mediumblue:[0,0,205,1],mediumorchid:[186,85,211,1],mediumpurple:[147,112,219,1],mediumseagreen:[60,179,113,1],mediumslateblue:[123,104,238,1],mediumspringgreen:[0,250,154,1],mediumturquoise:[72,209,204,1],mediumvioletred:[199,21,133,1],midnightblue:[25,25,112,1],mintcream:[245,255,250,1],mistyrose:[255,228,225,1],moccasin:[255,228,181,1],navajowhite:[255,222,173,1],navy:[0,0,128,1],oldlace:[253,245,230,1],olive:[128,128,0,1],olivedrab:[107,142,35,1],orange:[255,165,0,1],orangered:[255,69,0,1],orchid:[218,112,214,1],palegoldenrod:[238,232,170,1],palegreen:[152,251,152,1],paleturquoise:[175,238,238,1],palevioletred:[219,112,147,1],papayawhip:[255,239,213,1],peachpuff:[255,218,185,1],peru:[205,133,63,1],pink:[255,192,203,1],plum:[221,160,221,1],powderblue:[176,224,230,1],purple:[128,0,128,1],rebeccapurple:[102,51,153,1],red:[255,0,0,1],rosybrown:[188,143,143,1],royalblue:[65,105,225,1],saddlebrown:[139,69,19,1],salmon:[250,128,114,1],sandybrown:[244,164,96,1],seagreen:[46,139,87,1],seashell:[255,245,238,1],sienna:[160,82,45,1],silver:[192,192,192,1],skyblue:[135,206,235,1],slateblue:[106,90,205,1],slategray:[112,128,144,1],slategrey:[112,128,144,1],snow:[255,250,250,1],springgreen:[0,255,127,1],steelblue:[70,130,180,1],tan:[210,180,140,1],teal:[0,128,128,1],thistle:[216,191,216,1],tomato:[255,99,71,1],turquoise:[64,224,208,1],violet:[238,130,238,1],wheat:[245,222,179,1],white:[255,255,255,1],whitesmoke:[245,245,245,1],yellow:[255,255,0,1],yellowgreen:[154,205,50,1]};try{exports.parseCSSColor=parseCSSColor}catch(e){} +},{}],133:[function(require,module,exports){ +"use strict";function earcut(e,n,r){r=r||2;var t=n&&n.length,i=t?n[0]*r:e.length,x=linkedList(e,0,i,r,!0),a=[];if(!x)return a;var o,l,u,s,v,f,y;if(t&&(x=eliminateHoles(e,n,x,r)),e.length>80*r){o=u=e[0],l=s=e[1];for(var d=r;du&&(u=v),f>s&&(s=f);y=Math.max(u-o,s-l)}return earcutLinked(x,a,r,o,l,y),a}function linkedList(e,n,r,t,i){var x,a;if(i===signedArea(e,n,r,t)>0)for(x=n;x=n;x-=t)a=insertNode(x,e[x],e[x+1],a);return a&&equals(a,a.next)&&(removeNode(a),a=a.next),a}function filterPoints(e,n){if(!e)return e;n||(n=e);var r,t=e;do if(r=!1,t.steiner||!equals(t,t.next)&&0!==area(t.prev,t,t.next))t=t.next;else{if(removeNode(t),t=n=t.prev,t===t.next)return null;r=!0}while(r||t!==n);return n}function earcutLinked(e,n,r,t,i,x,a){if(e){!a&&x&&indexCurve(e,t,i,x);for(var o,l,u=e;e.prev!==e.next;)if(o=e.prev,l=e.next,x?isEarHashed(e,t,i,x):isEar(e))n.push(o.i/r),n.push(e.i/r),n.push(l.i/r),removeNode(e),e=l.next,u=l.next;else if(e=l,e===u){a?1===a?(e=cureLocalIntersections(e,n,r),earcutLinked(e,n,r,t,i,x,2)):2===a&&splitEarcut(e,n,r,t,i,x):earcutLinked(filterPoints(e),n,r,t,i,x,1);break}}}function isEar(e){var n=e.prev,r=e,t=e.next;if(area(n,r,t)>=0)return!1;for(var i=e.next.next;i!==e.prev;){if(pointInTriangle(n.x,n.y,r.x,r.y,t.x,t.y,i.x,i.y)&&area(i.prev,i,i.next)>=0)return!1;i=i.next}return!0}function isEarHashed(e,n,r,t){var i=e.prev,x=e,a=e.next;if(area(i,x,a)>=0)return!1;for(var o=i.xx.x?i.x>a.x?i.x:a.x:x.x>a.x?x.x:a.x,s=i.y>x.y?i.y>a.y?i.y:a.y:x.y>a.y?x.y:a.y,v=zOrder(o,l,n,r,t),f=zOrder(u,s,n,r,t),y=e.nextZ;y&&y.z<=f;){if(y!==e.prev&&y!==e.next&&pointInTriangle(i.x,i.y,x.x,x.y,a.x,a.y,y.x,y.y)&&area(y.prev,y,y.next)>=0)return!1;y=y.nextZ}for(y=e.prevZ;y&&y.z>=v;){if(y!==e.prev&&y!==e.next&&pointInTriangle(i.x,i.y,x.x,x.y,a.x,a.y,y.x,y.y)&&area(y.prev,y,y.next)>=0)return!1;y=y.prevZ}return!0}function cureLocalIntersections(e,n,r){var t=e;do{var i=t.prev,x=t.next.next;!equals(i,x)&&intersects(i,t,t.next,x)&&locallyInside(i,x)&&locallyInside(x,i)&&(n.push(i.i/r),n.push(t.i/r),n.push(x.i/r),removeNode(t),removeNode(t.next),t=e=x),t=t.next}while(t!==e);return t}function splitEarcut(e,n,r,t,i,x){var a=e;do{for(var o=a.next.next;o!==a.prev;){if(a.i!==o.i&&isValidDiagonal(a,o)){var l=splitPolygon(a,o);return a=filterPoints(a,a.next),l=filterPoints(l,l.next),earcutLinked(a,n,r,t,i,x),void earcutLinked(l,n,r,t,i,x)}o=o.next}a=a.next}while(a!==e)}function eliminateHoles(e,n,r,t){var i,x,a,o,l,u=[];for(i=0,x=n.length;i=t.next.y){var o=t.x+(x-t.y)*(t.next.x-t.x)/(t.next.y-t.y);if(o<=i&&o>a){if(a=o,o===i){if(x===t.y)return t;if(x===t.next.y)return t.next}r=t.x=t.x&&t.x>=s&&pointInTriangle(xr.x)&&locallyInside(t,e)&&(r=t,f=l)),t=t.next;return r}function indexCurve(e,n,r,t){var i=e;do null===i.z&&(i.z=zOrder(i.x,i.y,n,r,t)),i.prevZ=i.prev,i.nextZ=i.next,i=i.next;while(i!==e);i.prevZ.nextZ=null,i.prevZ=null,sortLinked(i)}function sortLinked(e){var n,r,t,i,x,a,o,l,u=1;do{for(r=e,e=null,x=null,a=0;r;){for(a++,t=r,o=0,n=0;n0||l>0&&t;)0===o?(i=t,t=t.nextZ,l--):0!==l&&t?r.z<=t.z?(i=r,r=r.nextZ,o--):(i=t,t=t.nextZ,l--):(i=r,r=r.nextZ,o--),x?x.nextZ=i:e=i,i.prevZ=x,x=i;r=t}x.nextZ=null,u*=2}while(a>1);return e}function zOrder(e,n,r,t,i){return e=32767*(e-r)/i,n=32767*(n-t)/i,e=16711935&(e|e<<8),e=252645135&(e|e<<4),e=858993459&(e|e<<2),e=1431655765&(e|e<<1),n=16711935&(n|n<<8),n=252645135&(n|n<<4),n=858993459&(n|n<<2),n=1431655765&(n|n<<1),e|n<<1}function getLeftmost(e){var n=e,r=e;do n.x=0&&(e-a)*(t-o)-(r-a)*(n-o)>=0&&(r-a)*(x-o)-(i-a)*(t-o)>=0}function isValidDiagonal(e,n){return e.next.i!==n.i&&e.prev.i!==n.i&&!intersectsPolygon(e,n)&&locallyInside(e,n)&&locallyInside(n,e)&&middleInside(e,n)}function area(e,n,r){return(n.y-e.y)*(r.x-n.x)-(n.x-e.x)*(r.y-n.y)}function equals(e,n){return e.x===n.x&&e.y===n.y}function intersects(e,n,r,t){return!!(equals(e,n)&&equals(r,t)||equals(e,t)&&equals(r,n))||area(e,n,r)>0!=area(e,n,t)>0&&area(r,t,e)>0!=area(r,t,n)>0}function intersectsPolygon(e,n){var r=e;do{if(r.i!==e.i&&r.next.i!==e.i&&r.i!==n.i&&r.next.i!==n.i&&intersects(r,r.next,e,n))return!0;r=r.next}while(r!==e);return!1}function locallyInside(e,n){return area(e.prev,e,e.next)<0?area(e,n,e.next)>=0&&area(e,e.prev,n)>=0:area(e,n,e.prev)<0||area(e,e.next,n)<0}function middleInside(e,n){var r=e,t=!1,i=(e.x+n.x)/2,x=(e.y+n.y)/2;do r.y>x!=r.next.y>x&&i<(r.next.x-r.x)*(x-r.y)/(r.next.y-r.y)+r.x&&(t=!t),r=r.next;while(r!==e);return t}function splitPolygon(e,n){var r=new Node(e.i,e.x,e.y),t=new Node(n.i,n.x,n.y),i=e.next,x=n.prev;return e.next=n,n.prev=e,r.next=i,i.prev=r,t.next=r,r.prev=t,x.next=t,t.prev=x,t}function insertNode(e,n,r,t){var i=new Node(e,n,r);return t?(i.next=t.next,i.prev=t,t.next.prev=i,t.next=i):(i.prev=i,i.next=i),i}function removeNode(e){e.next.prev=e.prev,e.prev.next=e.next,e.prevZ&&(e.prevZ.nextZ=e.nextZ),e.nextZ&&(e.nextZ.prevZ=e.prevZ)}function Node(e,n,r){this.i=e,this.x=n,this.y=r,this.prev=null,this.next=null,this.z=null,this.prevZ=null,this.nextZ=null,this.steiner=!1}function signedArea(e,n,r,t){for(var i=0,x=n,a=r-t;x0&&(t+=e[i-1].length,r.holes.push(t))}return r}; +},{}],134:[function(require,module,exports){ +function sss(r){var e,t,s,n,u,a;switch(typeof r){case"object":if(null===r)return null;if(isArray(r)){for(s="[",t=r.length-1,e=0;e-1&&(s+=sss(r[e])),s+"]"}for(n=objKeys(r).sort(),t=n.length,s="{",u=n[e=0],a=t>0&&void 0!==r[u];e15?"\\u00"+e.toString(16):"\\u000"+e.toString(16)}};module.exports=function(r){if(void 0!==r)return""+sss(r)},module.exports.stringSearch=strReg,module.exports.stringReplace=strReplace; +},{}],135:[function(require,module,exports){ +"use strict";function createFilter(e){return new Function("f","var p = (f && f.properties || {}); return "+compile(e))}function compile(e){if(!e)return"true";var i=e[0];if(e.length<=1)return"any"===i?"false":"true";var n="=="===i?compileComparisonOp(e[1],e[2],"===",!1):"!="===i?compileComparisonOp(e[1],e[2],"!==",!1):"<"===i||">"===i||"<="===i||">="===i?compileComparisonOp(e[1],e[2],i,!0):"any"===i?compileLogicalOp(e.slice(1),"||"):"all"===i?compileLogicalOp(e.slice(1),"&&"):"none"===i?compileNegation(compileLogicalOp(e.slice(1),"||")):"in"===i?compileInOp(e[1],e.slice(2)):"!in"===i?compileNegation(compileInOp(e[1],e.slice(2))):"has"===i?compileHasOp(e[1]):"!has"===i?compileNegation(compileHasOp([e[1]])):"true";return"("+n+")"}function compilePropertyReference(e){return"$type"===e?"f.type":"$id"===e?"f.id":"p["+JSON.stringify(e)+"]"}function compileComparisonOp(e,i,n,r){var o=compilePropertyReference(e),t="$type"===e?types.indexOf(i):JSON.stringify(i);return(r?"typeof "+o+"=== typeof "+t+"&&":"")+o+n+t}function compileLogicalOp(e,i){return e.map(compile).join(i)}function compileInOp(e,i){"$type"===e&&(i=i.map(function(e){return types.indexOf(e)}));var n=JSON.stringify(i.sort(compare)),r=compilePropertyReference(e);return i.length<=200?n+".indexOf("+r+") !== -1":"function(v, a, i, j) {while (i <= j) { var m = (i + j) >> 1; if (a[m] === v) return true; if (a[m] > v) j = m - 1; else i = m + 1;}return false; }("+r+", "+n+",0,"+(i.length-1)+")"}function compileHasOp(e){return JSON.stringify(e)+" in p"}function compileNegation(e){return"!("+e+")"}function compare(e,i){return ei?1:0}module.exports=createFilter;var types=["Unknown","Point","LineString","Polygon"]; +},{}],136:[function(require,module,exports){ +function geometry(r){if("Polygon"===r.type)return polygonArea(r.coordinates);if("MultiPolygon"===r.type){for(var e=0,n=0;n0){e+=Math.abs(ringArea(r[0]));for(var n=1;n2){for(var n,t,o=0;o=0}var geojsonArea=require("geojson-area");module.exports=rewind; +},{"geojson-area":136}],138:[function(require,module,exports){ +"use strict";function clip(e,r,t,n,u,i,l,s){if(t/=r,n/=r,l>=t&&s<=n)return e;if(l>n||s=t&&c<=n)h.push(o);else if(!(a>n||c=r&&s<=t&&u.push(l)}return u}function clipGeometry(e,r,t,n,u,i){for(var l=[],s=0;st?(d.push(u(h,f,r),u(h,f,t)),i||(d=newSlice(l,d,v,m,w))):o>=r&&d.push(u(h,f,r)):c>t?ot&&(d.push(u(h,f,t)),i||(d=newSlice(l,d,v,m,w))));h=g[S-1],c=h[n],c>=r&&c<=t&&d.push(h),a=d[d.length-1],i&&a&&(d[0][0]!==a[0]||d[0][1]!==a[1])&&d.push(d[0]),newSlice(l,d,v,m,w)}return l}function newSlice(e,r,t,n,u){return r.length&&(r.area=t,r.dist=n,void 0!==u&&(r.outer=u),e.push(r)),[]}module.exports=clip;var createFeature=require("./feature"); +},{"./feature":140}],139:[function(require,module,exports){ +"use strict";function convert(e,t){var r=[];if("FeatureCollection"===e.type)for(var o=0;o1?1:o,[r,o,0]}function calcSize(e){for(var t,r,o=0,a=0,i=0;i1)return!1;var r=n.geometry[0].length;if(5!==r)return!1;for(var s=0;s1&&console.time("creation"),m=this.tiles[d]=createTile(e,p,i,o,f,t===a.maxZoom),this.tileCoords.push({z:t,x:i,y:o}),u)){u>1&&(console.log("tile z%d-%d-%d (features: %d, points: %d, simplified: %d)",t,i,o,m.numFeatures,m.numPoints,m.numSimplified),console.timeEnd("creation"));var h="z"+t;this.stats[h]=(this.stats[h]||0)+1,this.total++}if(m.source=e,n){if(t===a.maxZoom||t===n)continue;var x=1<1&&console.time("clipping");var g,v,M,T,b,y,S=.5*a.buffer/a.extent,Z=.5-S,q=.5+S,w=1+S;g=v=M=T=null,b=clip(e,p,i-S,i+q,0,intersectX,m.min[0],m.max[0]),y=clip(e,p,i+Z,i+w,0,intersectX,m.min[0],m.max[0]),b&&(g=clip(b,p,o-S,o+q,1,intersectY,m.min[1],m.max[1]),v=clip(b,p,o+Z,o+w,1,intersectY,m.min[1],m.max[1])),y&&(M=clip(y,p,o-S,o+q,1,intersectY,m.min[1],m.max[1]),T=clip(y,p,o+Z,o+w,1,intersectY,m.min[1],m.max[1])),u>1&&console.timeEnd("clipping"),e.length&&(l.push(g||[],t+1,2*i,2*o),l.push(v||[],t+1,2*i,2*o+1),l.push(M||[],t+1,2*i+1,2*o),l.push(T||[],t+1,2*i+1,2*o+1))}else n&&(c=t)}return c},GeoJSONVT.prototype.getTile=function(e,t,i){var o=this.options,n=o.extent,r=o.debug,s=1<1&&console.log("drilling down to z%d-%d-%d",e,t,i);for(var a,u=e,c=t,p=i;!a&&u>0;)u--,c=Math.floor(c/2),p=Math.floor(p/2),a=this.tiles[toID(u,c,p)];if(!a||!a.source)return null;if(r>1&&console.log("found parent tile z%d-%d-%d",u,c,p),isClippedSquare(a,n,o.buffer))return transform.tile(a,n);r>1&&console.time("drilling down");var d=this.splitTile(a.source,u,c,p,e,t,i);if(r>1&&console.timeEnd("drilling down"),null!==d){var m=1<p&&(s=e,p=r);p>o?(t[s][2]=p,g.push(u),g.push(s),u=s):(n=g.pop(),u=g.pop())}}function getSqSegDist(t,i,e){var p=i[0],r=i[1],s=e[0],o=e[1],f=t[0],u=t[1],n=s-p,g=o-r;if(0!==n||0!==g){var l=((f-p)*n+(u-r)*g)/(n*n+g*g);l>1?(p=s,r=o):l>0&&(p+=n*l,r+=g*l)}return n=f-p,g=u-r,n*n+g*g}module.exports=simplify; +},{}],143:[function(require,module,exports){ +"use strict";function createTile(e,n,r,i,t,u){for(var a={features:[],numPoints:0,numSimplified:0,numFeatures:0,source:null,x:r,y:i,z2:n,transformed:!1,min:[2,1],max:[-1,0]},m=0;ma.max[0]&&(a.max[0]=l[0]),l[1]>a.max[1]&&(a.max[1]=l[1])}return a}function addFeature(e,n,r,i){var t,u,a,m,s=n.geometry,l=n.type,o=[],f=r*r;if(1===l)for(t=0;tf)&&(d.push(m),e.numSimplified++),e.numPoints++;3===l&&rewind(d,a.outer),o.push(d)}else e.numPoints+=a.length;if(o.length){var g={geometry:o,type:l,tags:n.tags||null};null!==n.id&&(g.id=n.id),e.features.push(g)}}function rewind(e,n){var r=signedArea(e);r<0===n&&e.reverse()}function signedArea(e){for(var n,r,i=0,t=0,u=e.length,a=u-1;t=a[u+0]&&s>=a[u+1]?(n[f]=!0,h.push(l[f])):n[f]=!1}}},GridIndex.prototype._forEachCell=function(t,r,e,s,i,h,n){for(var o=this._convertToCellCoord(t),l=this._convertToCellCoord(r),a=this._convertToCellCoord(e),d=this._convertToCellCoord(s),f=o;f<=a;f++)for(var u=l;u<=d;u++){var y=this.d*u+f;if(i.call(this,t,r,e,s,y,h,n))return}},GridIndex.prototype._convertToCellCoord=function(t){return Math.max(0,Math.min(this.d-1,Math.floor(t*this.scale)+this.padding))},GridIndex.prototype.toArrayBuffer=function(){if(this.arrayBuffer)return this.arrayBuffer;for(var t=this.cells,r=NUM_PARAMS+this.cells.length+1+1,e=0,s=0;s>1,i=-7,N=t?h-1:0,n=t?-1:1,s=a[o+N];for(N+=n,M=s&(1<<-i)-1,s>>=-i,i+=w;i>0;M=256*M+a[o+N],N+=n,i-=8);for(p=M&(1<<-i)-1,M>>=-i,i+=r;i>0;p=256*p+a[o+N],N+=n,i-=8);if(0===M)M=1-e;else{if(M===f)return p?NaN:(s?-1:1)*(1/0);p+=Math.pow(2,r),M-=e}return(s?-1:1)*p*Math.pow(2,M-r)},exports.write=function(a,o,t,r,h,M){var p,w,f,e=8*M-h-1,i=(1<>1,n=23===h?Math.pow(2,-24)-Math.pow(2,-77):0,s=r?0:M-1,u=r?1:-1,l=o<0||0===o&&1/o<0?1:0;for(o=Math.abs(o),isNaN(o)||o===1/0?(w=isNaN(o)?1:0,p=i):(p=Math.floor(Math.log(o)/Math.LN2),o*(f=Math.pow(2,-p))<1&&(p--,f*=2),o+=p+N>=1?n/f:n*Math.pow(2,1-N),o*f>=2&&(p++,f/=2),p+N>=i?(w=0,p=i):p+N>=1?(w=(o*f-1)*Math.pow(2,h),p+=N):(w=o*Math.pow(2,N-1)*Math.pow(2,h),p=0));h>=8;a[t+s]=255&w,s+=u,w/=256,h-=8);for(p=p<0;a[t+s]=255&p,s+=u,p/=256,e-=8);a[t+s-u]|=128*l}; +},{}],148:[function(require,module,exports){ +"use strict";function kdbush(t,i,e,s,n){return new KDBush(t,i,e,s,n)}function KDBush(t,i,e,s,n){i=i||defaultGetX,e=e||defaultGetY,n=n||Array,this.nodeSize=s||64,this.points=t,this.ids=new n(t.length),this.coords=new n(2*t.length);for(var r=0;r=s&&a<=h&&t>=u&&t<=e&&f.push(p[i]);else{var c=Math.floor((g+v)/2);a=r[2*c],t=r[2*c+1],a>=s&&a<=h&&t>=u&&t<=e&&f.push(p[c]);var d=(l+1)%2;(0===l?s<=a:u<=t)&&(n.push(g),n.push(c-1),n.push(d)),(0===l?h>=a:e>=t)&&(n.push(c+1),n.push(v),n.push(d))}}return f}module.exports=range; +},{}],150:[function(require,module,exports){ +"use strict";function sortKD(t,a,o,s,r,e){if(!(r-s<=o)){var f=Math.floor((s+r)/2);select(t,a,f,s,r,e%2),sortKD(t,a,o,s,f-1,e+1),sortKD(t,a,o,f+1,r,e+1)}}function select(t,a,o,s,r,e){for(;r>s;){if(r-s>600){var f=r-s+1,p=o-s+1,w=Math.log(f),m=.5*Math.exp(2*w/3),n=.5*Math.sqrt(w*m*(f-m)/f)*(p-f/2<0?-1:1),c=Math.max(s,Math.floor(o-p*m/f+n)),h=Math.min(r,Math.floor(o+(f-p)*m/f+n));select(t,a,o,c,h,e)}var i=a[2*o+e],l=s,M=r;for(swapItem(t,a,s,o),a[2*r+e]>i&&swapItem(t,a,s,r);li;)M--}a[2*s+e]===i?swapItem(t,a,s,M):(M++,swapItem(t,a,M,r)),M<=o&&(s=M+1),o<=M&&(r=M-1)}}function swapItem(t,a,o,s){swap(t,o,s),swap(a,2*o,2*s),swap(a,2*o+1,2*s+1)}function swap(t,a,o){var s=t[a];t[a]=t[o],t[o]=s}module.exports=sortKD; +},{}],151:[function(require,module,exports){ +"use strict";function within(s,p,r,t,u,h){for(var i=[0,s.length-1,0],o=[],n=u*u;i.length;){var e=i.pop(),a=i.pop(),f=i.pop();if(a-f<=h)for(var v=f;v<=a;v++)sqDist(p[2*v],p[2*v+1],r,t)<=n&&o.push(s[v]);else{var l=Math.floor((f+a)/2),c=p[2*l],q=p[2*l+1];sqDist(c,q,r,t)<=n&&o.push(s[l]);var D=(e+1)%2;(0===e?r-u<=c:t-u<=q)&&(i.push(f),i.push(l-1),i.push(D)),(0===e?r+u>=c:t+u>=q)&&(i.push(l+1),i.push(a),i.push(D))}}return o}function sqDist(s,p,r,t){var u=s-r,h=p-t;return u*u+h*h}module.exports=within; +},{}],152:[function(require,module,exports){ +function isObjectLike(r){return!!r&&"object"==typeof r}function arraySome(r,e){for(var a=-1,t=r.length;++as))return!1;for(;++c-1&&t%1==0&&t<=MAX_SAFE_INTEGER}function isObject(t){var e=typeof t;return!!t&&("object"==e||"function"==e)}function isObjectLike(t){return!!t&&"object"==typeof t}var MAX_SAFE_INTEGER=9007199254740991,argsTag="[object Arguments]",funcTag="[object Function]",genTag="[object GeneratorFunction]",objectProto=Object.prototype,hasOwnProperty=objectProto.hasOwnProperty,objectToString=objectProto.toString,propertyIsEnumerable=objectProto.propertyIsEnumerable;module.exports=isArguments; +},{}],156:[function(require,module,exports){ +function isObjectLike(t){return!!t&&"object"==typeof t}function getNative(t,r){var e=null==t?void 0:t[r];return isNative(e)?e:void 0}function isLength(t){return"number"==typeof t&&t>-1&&t%1==0&&t<=MAX_SAFE_INTEGER}function isFunction(t){return isObject(t)&&objToString.call(t)==funcTag}function isObject(t){var r=typeof t;return!!t&&("object"==r||"function"==r)}function isNative(t){return null!=t&&(isFunction(t)?reIsNative.test(fnToString.call(t)):isObjectLike(t)&&reIsHostCtor.test(t))}var arrayTag="[object Array]",funcTag="[object Function]",reIsHostCtor=/^\[object .+?Constructor\]$/,objectProto=Object.prototype,fnToString=Function.prototype.toString,hasOwnProperty=objectProto.hasOwnProperty,objToString=objectProto.toString,reIsNative=RegExp("^"+fnToString.call(hasOwnProperty).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),nativeIsArray=getNative(Array,"isArray"),MAX_SAFE_INTEGER=9007199254740991,isArray=nativeIsArray||function(t){return isObjectLike(t)&&isLength(t.length)&&objToString.call(t)==arrayTag};module.exports=isArray; +},{}],157:[function(require,module,exports){ +function isLength(a){return"number"==typeof a&&a>-1&&a%1==0&&a<=MAX_SAFE_INTEGER}function isObjectLike(a){return!!a&&"object"==typeof a}function isTypedArray(a){return isObjectLike(a)&&isLength(a.length)&&!!typedArrayTags[objectToString.call(a)]}var MAX_SAFE_INTEGER=9007199254740991,argsTag="[object Arguments]",arrayTag="[object Array]",boolTag="[object Boolean]",dateTag="[object Date]",errorTag="[object Error]",funcTag="[object Function]",mapTag="[object Map]",numberTag="[object Number]",objectTag="[object Object]",regexpTag="[object RegExp]",setTag="[object Set]",stringTag="[object String]",weakMapTag="[object WeakMap]",arrayBufferTag="[object ArrayBuffer]",dataViewTag="[object DataView]",float32Tag="[object Float32Array]",float64Tag="[object Float64Array]",int8Tag="[object Int8Array]",int16Tag="[object Int16Array]",int32Tag="[object Int32Array]",uint8Tag="[object Uint8Array]",uint8ClampedTag="[object Uint8ClampedArray]",uint16Tag="[object Uint16Array]",uint32Tag="[object Uint32Array]",typedArrayTags={};typedArrayTags[float32Tag]=typedArrayTags[float64Tag]=typedArrayTags[int8Tag]=typedArrayTags[int16Tag]=typedArrayTags[int32Tag]=typedArrayTags[uint8Tag]=typedArrayTags[uint8ClampedTag]=typedArrayTags[uint16Tag]=typedArrayTags[uint32Tag]=!0,typedArrayTags[argsTag]=typedArrayTags[arrayTag]=typedArrayTags[arrayBufferTag]=typedArrayTags[boolTag]=typedArrayTags[dataViewTag]=typedArrayTags[dateTag]=typedArrayTags[errorTag]=typedArrayTags[funcTag]=typedArrayTags[mapTag]=typedArrayTags[numberTag]=typedArrayTags[objectTag]=typedArrayTags[regexpTag]=typedArrayTags[setTag]=typedArrayTags[stringTag]=typedArrayTags[weakMapTag]=!1;var objectProto=Object.prototype,objectToString=objectProto.toString;module.exports=isTypedArray; +},{}],158:[function(require,module,exports){ +function baseProperty(e){return function(t){return null==t?void 0:t[e]}}function isArrayLike(e){return null!=e&&isLength(getLength(e))}function isIndex(e,t){return e="number"==typeof e||reIsUint.test(e)?+e:-1,t=null==t?MAX_SAFE_INTEGER:t,e>-1&&e%1==0&&e-1&&e%1==0&&e<=MAX_SAFE_INTEGER}function shimKeys(e){for(var t=keysIn(e),r=t.length,n=r&&e.length,s=!!n&&isLength(n)&&(isArray(e)||isArguments(e)),o=-1,i=[];++o0;++nt3?Math.pow(r,1/3):r/t2+t0}function lab2xyz(r){return r>t1?r*r*r:t2*(r-t0)}function xyz2rgb(r){return 255*(r<=.0031308?12.92*r:1.055*Math.pow(r,1/2.4)-.055)}function rgb2xyz(r){return(r/=255)<=.04045?r/12.92:Math.pow((r+.055)/1.055,2.4)}function rgbToLab(r){var t=rgb2xyz(r[0]),a=rgb2xyz(r[1]),n=rgb2xyz(r[2]),b=xyz2lab((.4124564*t+.3575761*a+.1804375*n)/Xn),o=xyz2lab((.2126729*t+.7151522*a+.072175*n)/Yn),g=xyz2lab((.0193339*t+.119192*a+.9503041*n)/Zn);return[116*o-16,500*(b-o),200*(o-g),r[3]]}function labToRgb(r){var t=(r[0]+16)/116,a=isNaN(r[1])?t:t+r[1]/500,n=isNaN(r[2])?t:t-r[2]/200;return t=Yn*lab2xyz(t),a=Xn*lab2xyz(a),n=Zn*lab2xyz(n),[xyz2rgb(3.2404542*a-1.5371385*t-.4985314*n),xyz2rgb(-.969266*a+1.8760108*t+.041556*n),xyz2rgb(.0556434*a-.2040259*t+1.0572252*n),r[3]]}function rgbToHcl(r){var t=rgbToLab(r),a=t[0],n=t[1],b=t[2],o=Math.atan2(b,n)*rad2deg;return[o<0?o+360:o,Math.sqrt(n*n+b*b),a,r[3]]}function hclToRgb(r){var t=r[0]*deg2rad,a=r[1],n=r[2];return labToRgb([n,Math.cos(t)*a,Math.sin(t)*a,r[3]])}var Kn=18,Xn=.95047,Yn=1,Zn=1.08883,t0=4/29,t1=6/29,t2=3*t1*t1,t3=t1*t1*t1,deg2rad=Math.PI/180,rad2deg=180/Math.PI;module.exports={lab:{forward:rgbToLab,reverse:labToRgb},hcl:{forward:rgbToHcl,reverse:hclToRgb}}; +},{}],160:[function(require,module,exports){ +"use strict";function identityFunction(t){return t}function createFunction(t,o){var e;if(isFunctionDefinition(t)){var n,r=t.stops&&"object"==typeof t.stops[0][0],i=r||void 0!==t.property,s=r||!i,a=t.stops&&typeof(r?t.stops[0][0].property:t.stops[0][0]),p=t.type||o||("string"===a?"categorical":"exponential");if("exponential"===p)n=evaluateExponentialFunction;else if("interval"===p)n=evaluateIntervalFunction;else if("categorical"===p)n=evaluateCategoricalFunction;else{if("identity"!==p)throw new Error('Unknown function type "'+p+'"');n=evaluateIdentityFunction}var u;if(t.colorSpace&&"rgb"!==t.colorSpace){if(!colorSpaces[t.colorSpace])throw new Error("Unknown color space: "+t.colorSpace);var c=colorSpaces[t.colorSpace];t=JSON.parse(JSON.stringify(t));for(var l=0;l=t.stops[e-1][0])return t.stops[e-1][1];var n=binarySearchForIndex(t.stops,o);return t.stops[n][1]}function evaluateExponentialFunction(t,o){var e=void 0!==t.base?t.base:1,n=t.stops.length;if(1===n)return t.stops[0][1];if(void 0===o||null===o)return t.stops[n-1][1];if(o<=t.stops[0][0])return t.stops[0][1];if(o>=t.stops[n-1][0])return t.stops[n-1][1];var r=binarySearchForIndex(t.stops,o);return interpolate(o,e,t.stops[r][0],t.stops[r+1][0],t.stops[r][1],t.stops[r+1][1])}function evaluateIdentityFunction(t,o){return o}function binarySearchForIndex(t,o){for(var e,n=t.length,r=0,i=n-1,s=0;r<=i;){if(s=Math.floor((r+i)/2),e=t[s][0],e===o){s+=1;break}eo&&(i=s-1)}return Math.max(s-1,0)}function interpolate(t,o,e,n,r,i){return"function"==typeof r?function(){var s=r.apply(void 0,arguments),a=i.apply(void 0,arguments);return interpolate(t,o,e,n,s,a)}:r.length?interpolateArray(t,o,e,n,r,i):interpolateNumber(t,o,e,n,r,i)}function interpolateNumber(t,o,e,n,r,i){var s,a=n-e,p=t-e;return s=1===o?p/a:(Math.pow(o,p)-1)/(Math.pow(o,a)-1),r*(1-s)+i*s}function interpolateArray(t,o,e,n,r,i){for(var s=[],a=0;a7)return[new ValidationError(u,a,"constants have been deprecated as of v8")];if(!(a in l.constants))return[new ValidationError(u,a,'constant "%s" not found',a)];e=extend({},e,{value:l.constants[a]})}return n.function&&"object"===getType(a)?r(e):n.type&&i[n.type]?i[n.type](e):t(extend({},e,{valueSpec:n.type?o[n.type]:n}))}; +},{"../error/validation_error":163,"../util/extend":165,"../util/get_type":166,"./validate_array":170,"./validate_boolean":171,"./validate_color":172,"./validate_constants":173,"./validate_enum":174,"./validate_filter":175,"./validate_function":176,"./validate_layer":178,"./validate_light":180,"./validate_number":181,"./validate_object":182,"./validate_source":184,"./validate_string":185}],170:[function(require,module,exports){ +"use strict";var getType=require("../util/get_type"),validate=require("./validate"),ValidationError=require("../error/validation_error");module.exports=function(e){var r=e.value,t=e.valueSpec,a=e.style,n=e.styleSpec,l=e.key,i=e.arrayElementValidator||validate;if("array"!==getType(r))return[new ValidationError(l,r,"array expected, %s found",getType(r))];if(t.length&&r.length!==t.length)return[new ValidationError(l,r,"array length %d expected, length %d found",t.length,r.length)];if(t["min-length"]&&r.length7)return t?[new ValidationError(e,t,"constants have been deprecated as of v8")]:[];var o=getType(t);if("object"!==o)return[new ValidationError(e,t,"object expected, %s found",o)];var n=[];for(var i in t)"@"!==i[0]&&n.push(new ValidationError(e+"."+i,t[i],'constants must start with "@"'));return n}; +},{"../error/validation_error":163,"../util/get_type":166}],174:[function(require,module,exports){ +"use strict";var ValidationError=require("../error/validation_error"),unbundle=require("../util/unbundle_jsonlint");module.exports=function(e){var r=e.key,n=e.value,u=e.valueSpec,o=[];return Array.isArray(u.values)?u.values.indexOf(unbundle(n))===-1&&o.push(new ValidationError(r,n,"expected one of [%s], %s found",u.values.join(", "),n)):Object.keys(u.values).indexOf(unbundle(n))===-1&&o.push(new ValidationError(r,n,"expected one of [%s], %s found",Object.keys(u.values).join(", "),n)),o}; +},{"../error/validation_error":163,"../util/unbundle_jsonlint":168}],175:[function(require,module,exports){ +"use strict";var ValidationError=require("../error/validation_error"),validateEnum=require("./validate_enum"),getType=require("../util/get_type"),unbundle=require("../util/unbundle_jsonlint");module.exports=function e(t){var r,a=t.value,n=t.key,l=t.styleSpec,s=[];if("array"!==getType(a))return[new ValidationError(n,a,"array expected, %s found",getType(a))];if(a.length<1)return[new ValidationError(n,a,"filter array must have at least 1 element")];switch(s=s.concat(validateEnum({key:n+"[0]",value:a[0],valueSpec:l.filter_operator,style:t.style,styleSpec:t.styleSpec})),unbundle(a[0])){case"<":case"<=":case">":case">=":a.length>=2&&"$type"==a[1]&&s.push(new ValidationError(n,a,'"$type" cannot be use with operator "%s"',a[0]));case"==":case"!=":3!=a.length&&s.push(new ValidationError(n,a,'filter array for operator "%s" must have 3 elements',a[0]));case"in":case"!in":a.length>=2&&(r=getType(a[1]),"string"!==r?s.push(new ValidationError(n+"[1]",a[1],"string expected, %s found",r)):"@"===a[1][0]&&s.push(new ValidationError(n+"[1]",a[1],"filter key cannot be a constant")));for(var o=2;o=8&&(u&&!e.valueSpec["property-function"]?p.push(new ValidationError(e.key,e.value,"property functions not supported")):i&&!e.valueSpec["zoom-function"]&&p.push(new ValidationError(e.key,e.value,"zoom functions not supported"))),p}; +},{"../error/validation_error":163,"../util/get_type":166,"../util/unbundle_jsonlint":168,"./validate":169,"./validate_array":170,"./validate_number":181,"./validate_object":182}],177:[function(require,module,exports){ +"use strict";var ValidationError=require("../error/validation_error"),validateString=require("./validate_string");module.exports=function(r){var e=r.value,t=r.key,a=validateString(r);return a.length?a:(e.indexOf("{fontstack}")===-1&&a.push(new ValidationError(t,e,'"glyphs" url must include a "{fontstack}" token')),e.indexOf("{range}")===-1&&a.push(new ValidationError(t,e,'"glyphs" url must include a "{range}" token')),a)}; +},{"../error/validation_error":163,"./validate_string":185}],178:[function(require,module,exports){ +"use strict";var ValidationError=require("../error/validation_error"),unbundle=require("../util/unbundle_jsonlint"),validateObject=require("./validate_object"),validateFilter=require("./validate_filter"),validatePaintProperty=require("./validate_paint_property"),validateLayoutProperty=require("./validate_layout_property"),extend=require("../util/extend");module.exports=function(e){var r=[],t=e.value,a=e.key,i=e.style,l=e.styleSpec;t.type||t.ref||r.push(new ValidationError(a,t,'either "type" or "ref" is required'));var o=unbundle(t.type),u=unbundle(t.ref);if(t.id)for(var n=0;nm.maximum?[new ValidationError(r,i,"%s is greater than the maximum value %s",i,m.maximum)]:[]}; +},{"../error/validation_error":163,"../util/get_type":166}],182:[function(require,module,exports){ +"use strict";var ValidationError=require("../error/validation_error"),getType=require("../util/get_type"),validateSpec=require("./validate");module.exports=function(e){var r=e.key,t=e.value,i=e.valueSpec||{},a=e.objectElementValidators||{},o=e.style,l=e.styleSpec,n=[],u=getType(t);if("object"!==u)return[new ValidationError(r,t,"object expected, %s found",u)];for(var p in t){var s,c=p.split(".")[0],d=i[c]||i["*"];if(a[c])s=a[c];else if(i[c])s=validateSpec;else if(a["*"])s=a["*"];else{if(!i["*"]){n.push(new ValidationError(r,t[p],'unknown property "%s"',p));continue}s=validateSpec}n=n.concat(s({key:(r?r+".":r)+p,value:t[p],valueSpec:d,style:o,styleSpec:l,object:t,objectKey:p}))}for(c in i)i[c].required&&void 0===i[c].default&&void 0===t[c]&&n.push(new ValidationError(r,t,'missing required property "%s"',c));return n}; +},{"../error/validation_error":163,"../util/get_type":166,"./validate":169}],183:[function(require,module,exports){ +"use strict";var validate=require("./validate"),ValidationError=require("../error/validation_error");module.exports=function(e){var r=e.key,a=e.style,t=e.styleSpec,i=e.value,l=e.objectKey,n=t["paint_"+e.layerType];if(!n)return[];var o=l.match(/^(.*)-transition$/);return o&&n[o[1]]&&n[o[1]].transition?validate({key:r,value:i,valueSpec:t.transition,style:a,styleSpec:t}):e.valueSpec||n[l]?validate({key:e.key,value:i,valueSpec:e.valueSpec||n[l],style:a,styleSpec:t}):[new ValidationError(r,i,'unknown property "%s"',l)]}; +},{"../error/validation_error":163,"./validate":169}],184:[function(require,module,exports){ +"use strict";var ValidationError=require("../error/validation_error"),unbundle=require("../util/unbundle_jsonlint"),validateObject=require("./validate_object"),validateEnum=require("./validate_enum");module.exports=function(e){var r=e.value,t=e.key,a=e.styleSpec,l=e.style;if(!r.type)return[new ValidationError(t,r,'"type" is required')];var u=unbundle(r.type);switch(u){case"vector":case"raster":var i=[];if(i=i.concat(validateObject({key:t,value:r,valueSpec:a.source_tile,style:e.style,styleSpec:a})),"url"in r)for(var s in r)["type","url","tileSize"].indexOf(s)<0&&i.push(new ValidationError(t+"."+s,r[s],'a source with a "url" property may not include a "%s" property',s));return i;case"geojson":return validateObject({key:t,value:r,valueSpec:a.source_geojson,style:l,styleSpec:a});case"video":return validateObject({key:t,value:r,valueSpec:a.source_video,style:l,styleSpec:a});case"image":return validateObject({key:t,value:r,valueSpec:a.source_image,style:l,styleSpec:a});default:return validateEnum({key:t+".type",value:r.type,valueSpec:{values:["vector","raster","geojson","video","image"]},style:l,styleSpec:a})}}; +},{"../error/validation_error":163,"../util/unbundle_jsonlint":168,"./validate_enum":174,"./validate_object":182}],185:[function(require,module,exports){ +"use strict";var getType=require("../util/get_type"),ValidationError=require("../error/validation_error");module.exports=function(r){var e=r.value,t=r.key,i=getType(e);return"string"!==i?[new ValidationError(t,e,"string expected, %s found",i)]:[]}; +},{"../error/validation_error":163,"../util/get_type":166}],186:[function(require,module,exports){ +"use strict";function validateStyleMin(e,a){a=a||latestStyleSpec;var t=[];return t=t.concat(validate({key:"",value:e,valueSpec:a.$root,styleSpec:a,style:e,objectElementValidators:{glyphs:validateGlyphsURL,"*":function(){return[]}}})),a.$version>7&&e.constants&&(t=t.concat(validateConstants({key:"constants",value:e.constants,style:e,styleSpec:a}))),sortErrors(t)}function sortErrors(e){return[].concat(e).sort(function(e,a){return e.line-a.line})}function wrapCleanErrors(e){return function(){return sortErrors(e.apply(this,arguments))}}var validateConstants=require("./validate/validate_constants"),validate=require("./validate/validate"),latestStyleSpec=require("../reference/latest.min"),validateGlyphsURL=require("./validate/validate_glyphs_url");validateStyleMin.source=wrapCleanErrors(require("./validate/validate_source")),validateStyleMin.light=wrapCleanErrors(require("./validate/validate_light")),validateStyleMin.layer=wrapCleanErrors(require("./validate/validate_layer")),validateStyleMin.filter=wrapCleanErrors(require("./validate/validate_filter")),validateStyleMin.paintProperty=wrapCleanErrors(require("./validate/validate_paint_property")),validateStyleMin.layoutProperty=wrapCleanErrors(require("./validate/validate_layout_property")),module.exports=validateStyleMin; +},{"../reference/latest.min":188,"./validate/validate":169,"./validate/validate_constants":173,"./validate/validate_filter":175,"./validate/validate_glyphs_url":177,"./validate/validate_layer":178,"./validate/validate_layout_property":179,"./validate/validate_light":180,"./validate/validate_paint_property":183,"./validate/validate_source":184}],187:[function(require,module,exports){ +function isEqual(a,l,i,e){i="function"==typeof i?bindCallback(i,e,3):void 0;var s=i?i(a,l):void 0;return void 0===s?baseIsEqual(a,l,i):!!s}var baseIsEqual=require("lodash._baseisequal"),bindCallback=require("lodash._bindcallback");module.exports=isEqual; +},{"lodash._baseisequal":152,"lodash._bindcallback":153}],188:[function(require,module,exports){ +module.exports=require("./v8.min.json"); +},{"./v8.min.json":189}],189:[function(require,module,exports){ +module.exports={"$version":8,"$root":{"version":{"required":true,"type":"enum","values":[8]},"name":{"type":"string"},"metadata":{"type":"*"},"center":{"type":"array","value":"number"},"zoom":{"type":"number"},"bearing":{"type":"number","default":0,"period":360,"units":"degrees"},"pitch":{"type":"number","default":0,"units":"degrees"},"light":{"type":"light"},"sources":{"required":true,"type":"sources"},"sprite":{"type":"string"},"glyphs":{"type":"string"},"transition":{"type":"transition"},"layers":{"required":true,"type":"array","value":"layer"}},"sources":{"*":{"type":"source"}},"source":["source_tile","source_geojson","source_video","source_image"],"source_tile":{"type":{"required":true,"type":"enum","values":{"vector":{},"raster":{}}},"url":{"type":"string"},"tiles":{"type":"array","value":"string"},"minzoom":{"type":"number","default":0},"maxzoom":{"type":"number","default":22},"tileSize":{"type":"number","default":512,"units":"pixels"},"*":{"type":"*"}},"source_geojson":{"type":{"required":true,"type":"enum","values":{"geojson":{}}},"data":{"type":"*"},"maxzoom":{"type":"number","default":18},"buffer":{"type":"number","default":128,"maximum":512,"minimum":0},"tolerance":{"type":"number","default":0.375},"cluster":{"type":"boolean","default":false},"clusterRadius":{"type":"number","default":50,"minimum":0},"clusterMaxZoom":{"type":"number"}},"source_video":{"type":{"required":true,"type":"enum","values":{"video":{}}},"urls":{"required":true,"type":"array","value":"string"},"coordinates":{"required":true,"type":"array","length":4,"value":{"type":"array","length":2,"value":"number"}}},"source_image":{"type":{"required":true,"type":"enum","values":{"image":{}}},"url":{"required":true,"type":"string"},"coordinates":{"required":true,"type":"array","length":4,"value":{"type":"array","length":2,"value":"number"}}},"layer":{"id":{"type":"string","required":true},"type":{"type":"enum","values":{"fill":{},"line":{},"symbol":{},"circle":{},"fill-extrusion":{},"raster":{},"background":{}}},"metadata":{"type":"*"},"ref":{"type":"string"},"source":{"type":"string"},"source-layer":{"type":"string"},"minzoom":{"type":"number","minimum":0,"maximum":24},"maxzoom":{"type":"number","minimum":0,"maximum":24},"filter":{"type":"filter"},"layout":{"type":"layout"},"paint":{"type":"paint"},"paint.*":{"type":"paint"}},"layout":["layout_fill","layout_line","layout_circle","layout_fill-extrusion","layout_symbol","layout_raster","layout_background"],"layout_background":{"visibility":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"visible":{},"none":{}},"default":"visible"}},"layout_fill":{"visibility":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"visible":{},"none":{}},"default":"visible"}},"layout_circle":{"visibility":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"visible":{},"none":{}},"default":"visible"}},"layout_fill-extrusion":{"visibility":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"visible":{},"none":{}},"default":"visible"}},"layout_line":{"line-cap":{"type":"enum","function":"piecewise-constant","zoom-function":true,"property-function":true,"values":{"butt":{},"round":{},"square":{}},"default":"butt"},"line-join":{"type":"enum","function":"piecewise-constant","zoom-function":true,"property-function":true,"values":{"bevel":{},"round":{},"miter":{}},"default":"miter"},"line-miter-limit":{"type":"number","default":2,"function":"interpolated","zoom-function":true,"property-function":true,"requires":[{"line-join":"miter"}]},"line-round-limit":{"type":"number","default":1.05,"function":"interpolated","zoom-function":true,"property-function":true,"requires":[{"line-join":"round"}]},"visibility":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"visible":{},"none":{}},"default":"visible"}},"layout_symbol":{"symbol-placement":{"type":"enum","function":"piecewise-constant","zoom-function":true,"property-function":true,"values":{"point":{},"line":{}},"default":"point"},"symbol-spacing":{"type":"number","default":250,"minimum":1,"function":"interpolated","zoom-function":true,"property-function":true,"units":"pixels","requires":[{"symbol-placement":"line"}]},"symbol-avoid-edges":{"type":"boolean","function":"piecewise-constant","zoom-function":true,"property-function":true,"default":false},"icon-allow-overlap":{"type":"boolean","function":"piecewise-constant","zoom-function":true,"property-function":true,"default":false,"requires":["icon-image"]},"icon-ignore-placement":{"type":"boolean","function":"piecewise-constant","zoom-function":true,"property-function":true,"default":false,"requires":["icon-image"]},"icon-optional":{"type":"boolean","function":"piecewise-constant","zoom-function":true,"property-function":true,"default":false,"requires":["icon-image","text-field"]},"icon-rotation-alignment":{"type":"enum","function":"piecewise-constant","zoom-function":true,"property-function":true,"values":{"map":{},"viewport":{},"auto":{}},"default":"auto","requires":["icon-image"]},"icon-size":{"type":"number","default":1,"minimum":0,"function":"interpolated","zoom-function":true,"property-function":true,"requires":["icon-image"]},"icon-text-fit":{"type":"enum","function":"piecewise-constant","zoom-function":true,"property-function":false,"values":{"none":{},"width":{},"height":{},"both":{}},"default":"none","requires":["icon-image","text-field"]},"icon-text-fit-padding":{"type":"array","value":"number","length":4,"default":[0,0,0,0],"units":"pixels","function":"interpolated","zoom-function":true,"property-function":true,"requires":["icon-image","text-field",{"icon-text-fit":["both","width","height"]}]},"icon-image":{"type":"string","function":"piecewise-constant","zoom-function":true,"property-function":true,"tokens":true},"icon-rotate":{"type":"number","default":0,"period":360,"function":"interpolated","zoom-function":true,"property-function":true,"units":"degrees","requires":["icon-image"]},"icon-padding":{"type":"number","default":2,"minimum":0,"function":"interpolated","zoom-function":true,"property-function":true,"units":"pixels","requires":["icon-image"]},"icon-keep-upright":{"type":"boolean","function":"piecewise-constant","zoom-function":true,"property-function":true,"default":false,"requires":["icon-image",{"icon-rotation-alignment":"map"},{"symbol-placement":"line"}]},"icon-offset":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","zoom-function":true,"property-function":true,"requires":["icon-image"]},"text-pitch-alignment":{"type":"enum","function":"piecewise-constant","zoom-function":true,"property-function":true,"values":{"map":{},"viewport":{},"auto":{}},"default":"auto","requires":["text-field"]},"text-rotation-alignment":{"type":"enum","function":"piecewise-constant","zoom-function":true,"property-function":true,"values":{"map":{},"viewport":{},"auto":{}},"default":"auto","requires":["text-field"]},"text-field":{"type":"string","function":"piecewise-constant","zoom-function":true,"property-function":true,"default":"","tokens":true},"text-font":{"type":"array","value":"string","function":"piecewise-constant","zoom-function":true,"property-function":true,"default":["Open Sans Regular","Arial Unicode MS Regular"],"requires":["text-field"]},"text-size":{"type":"number","default":16,"minimum":0,"units":"pixels","function":"interpolated","zoom-function":true,"property-function":true,"requires":["text-field"]},"text-max-width":{"type":"number","default":10,"minimum":0,"units":"ems","function":"interpolated","zoom-function":true,"property-function":true,"requires":["text-field"]},"text-line-height":{"type":"number","default":1.2,"units":"ems","function":"interpolated","zoom-function":true,"property-function":true,"requires":["text-field"]},"text-letter-spacing":{"type":"number","default":0,"units":"ems","function":"interpolated","zoom-function":true,"property-function":true,"requires":["text-field"]},"text-justify":{"type":"enum","function":"piecewise-constant","zoom-function":true,"property-function":true,"values":{"left":{},"center":{},"right":{}},"default":"center","requires":["text-field"]},"text-anchor":{"type":"enum","function":"piecewise-constant","zoom-function":true,"property-function":true,"values":{"center":{},"left":{},"right":{},"top":{},"bottom":{},"top-left":{},"top-right":{},"bottom-left":{},"bottom-right":{}},"default":"center","requires":["text-field"]},"text-max-angle":{"type":"number","default":45,"units":"degrees","function":"interpolated","zoom-function":true,"property-function":true,"requires":["text-field",{"symbol-placement":"line"}]},"text-rotate":{"type":"number","default":0,"period":360,"units":"degrees","function":"interpolated","zoom-function":true,"property-function":true,"requires":["text-field"]},"text-padding":{"type":"number","default":2,"minimum":0,"units":"pixels","function":"interpolated","zoom-function":true,"property-function":true,"requires":["text-field"]},"text-keep-upright":{"type":"boolean","function":"piecewise-constant","zoom-function":true,"property-function":true,"default":true,"requires":["text-field",{"text-rotation-alignment":"map"},{"symbol-placement":"line"}]},"text-transform":{"type":"enum","function":"piecewise-constant","zoom-function":true,"property-function":true,"values":{"none":{},"uppercase":{},"lowercase":{}},"default":"none","requires":["text-field"]},"text-offset":{"type":"array","value":"number","units":"ems","function":"interpolated","zoom-function":true,"property-function":true,"length":2,"default":[0,0],"requires":["text-field"]},"text-allow-overlap":{"type":"boolean","function":"piecewise-constant","zoom-function":true,"property-function":true,"default":false,"requires":["text-field"]},"text-ignore-placement":{"type":"boolean","function":"piecewise-constant","zoom-function":true,"property-function":true,"default":false,"requires":["text-field"]},"text-optional":{"type":"boolean","function":"piecewise-constant","zoom-function":true,"property-function":true,"default":false,"requires":["text-field","icon-image"]},"visibility":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"visible":{},"none":{}},"default":"visible"}},"layout_raster":{"visibility":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"visible":{},"none":{}},"default":"visible"}},"filter":{"type":"array","value":"*"},"filter_operator":{"type":"enum","values":{"==":{},"!=":{},">":{},">=":{},"<":{},"<=":{},"in":{},"!in":{},"all":{},"any":{},"none":{},"has":{},"!has":{}}},"geometry_type":{"type":"enum","values":{"Point":{},"LineString":{},"Polygon":{}}},"function":{"stops":{"type":"array","value":"function_stop"},"base":{"type":"number","default":1,"minimum":0},"property":{"type":"string","default":"$zoom"},"type":{"type":"enum","values":{"identity":{},"exponential":{},"interval":{},"categorical":{}},"default":"exponential"},"colorSpace":{"type":"enum","values":{"rgb":{},"lab":{},"hcl":{}},"default":"rgb"}},"function_stop":{"type":"array","minimum":0,"maximum":22,"value":["number","color"],"length":2},"light":{"anchor":{"type":"enum","default":"viewport","values":{"map":{},"viewport":{}},"transition":false},"position":{"type":"array","default":[1.15,210,30],"length":3,"value":"number","transition":true,"function":"interpolated","zoom-function":true,"property-function":false},"color":{"type":"color","default":"#ffffff","function":"interpolated","zoom-function":true,"property-function":false,"transition":true},"intensity":{"type":"number","default":0.5,"minimum":0,"maximum":1,"function":"interpolated","zoom-function":true,"property-function":false,"transition":true}},"paint":["paint_fill","paint_line","paint_circle","paint_fill-extrusion","paint_symbol","paint_raster","paint_background"],"paint_fill":{"fill-antialias":{"type":"boolean","function":"piecewise-constant","zoom-function":true,"property-function":true,"default":true},"fill-opacity":{"type":"number","function":"interpolated","zoom-function":true,"property-function":true,"default":1,"minimum":0,"maximum":1,"transition":true},"fill-color":{"type":"color","default":"#000000","function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"requires":[{"!":"fill-pattern"}]},"fill-outline-color":{"type":"color","function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"requires":[{"!":"fill-pattern"},{"fill-antialias":true}]},"fill-translate":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"units":"pixels"},"fill-translate-anchor":{"type":"enum","function":"piecewise-constant","zoom-function":true,"property-function":true,"values":{"map":{},"viewport":{}},"default":"map","requires":["fill-translate"]},"fill-pattern":{"type":"string","function":"piecewise-constant","zoom-function":true,"property-function":true,"transition":true}},"paint_fill-extrusion":{"fill-extrusion-opacity":{"type":"number","function":"interpolated","zoom-function":true,"property-function":false,"default":1,"minimum":0,"maximum":1,"transition":true},"fill-extrusion-color":{"type":"color","default":"#000000","function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"requires":[{"!":"fill-pattern"}]},"fill-extrusion-translate":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","zoom-function":true,"property-function":false,"transition":true,"units":"pixels"},"fill-extrusion-translate-anchor":{"type":"enum","function":"piecewise-constant","zoom-function":true,"property-function":false,"values":{"map":{},"viewport":{}},"default":"map","requires":["fill-extrusion-translate"]},"fill-extrusion-pattern":{"type":"string","function":"piecewise-constant","zoom-function":true,"property-function":false,"transition":true},"fill-extrusion-height":{"type":"number","function":"interpolated","zoom-function":true,"property-function":true,"default":0,"minimum":0,"units":"meters","transition":true},"fill-extrusion-base":{"type":"number","function":"interpolated","zoom-function":true,"property-function":true,"default":0,"minimum":0,"units":"meters","transition":true,"requires":[{"<=":"fill-extrusion-height"}]}},"paint_line":{"line-opacity":{"type":"number","function":"interpolated","zoom-function":true,"property-function":true,"default":1,"minimum":0,"maximum":1,"transition":true},"line-color":{"type":"color","default":"#000000","function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"requires":[{"!":"line-pattern"}]},"line-translate":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"units":"pixels"},"line-translate-anchor":{"type":"enum","function":"piecewise-constant","zoom-function":true,"property-function":true,"values":{"map":{},"viewport":{}},"default":"map","requires":["line-translate"]},"line-width":{"type":"number","default":1,"minimum":0,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"units":"pixels"},"line-gap-width":{"type":"number","default":0,"minimum":0,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"units":"pixels"},"line-offset":{"type":"number","default":0,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"units":"pixels"},"line-blur":{"type":"number","default":0,"minimum":0,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"units":"pixels"},"line-dasharray":{"type":"array","value":"number","function":"piecewise-constant","zoom-function":true,"property-function":true,"minimum":0,"transition":true,"units":"line widths","requires":[{"!":"line-pattern"}]},"line-pattern":{"type":"string","function":"piecewise-constant","zoom-function":true,"property-function":true,"transition":true}},"paint_circle":{"circle-radius":{"type":"number","default":5,"minimum":0,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"units":"pixels"},"circle-color":{"type":"color","default":"#000000","function":"interpolated","zoom-function":true,"property-function":true,"transition":true},"circle-blur":{"type":"number","default":0,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true},"circle-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true},"circle-translate":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"units":"pixels"},"circle-translate-anchor":{"type":"enum","function":"piecewise-constant","zoom-function":true,"property-function":true,"values":{"map":{},"viewport":{}},"default":"map","requires":["circle-translate"]},"circle-pitch-scale":{"type":"enum","function":"piecewise-constant","zoom-function":true,"property-function":true,"values":{"map":{},"viewport":{}},"default":"map"},"circle-stroke-width":{"type":"number","default":0,"minimum":0,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"units":"pixels"},"circle-stroke-color":{"type":"color","default":"#000000","function":"interpolated","zoom-function":true,"property-function":true,"transition":true},"circle-stroke-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true}},"paint_symbol":{"icon-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"requires":["icon-image"]},"icon-color":{"type":"color","default":"#000000","function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"requires":["icon-image"]},"icon-halo-color":{"type":"color","default":"rgba(0, 0, 0, 0)","function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"requires":["icon-image"]},"icon-halo-width":{"type":"number","default":0,"minimum":0,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"units":"pixels","requires":["icon-image"]},"icon-halo-blur":{"type":"number","default":0,"minimum":0,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"units":"pixels","requires":["icon-image"]},"icon-translate":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"units":"pixels","requires":["icon-image"]},"icon-translate-anchor":{"type":"enum","function":"piecewise-constant","zoom-function":true,"property-function":true,"values":{"map":{},"viewport":{}},"default":"map","requires":["icon-image","icon-translate"]},"text-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"requires":["text-field"]},"text-color":{"type":"color","default":"#000000","function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"requires":["text-field"]},"text-halo-color":{"type":"color","default":"rgba(0, 0, 0, 0)","function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"requires":["text-field"]},"text-halo-width":{"type":"number","default":0,"minimum":0,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"units":"pixels","requires":["text-field"]},"text-halo-blur":{"type":"number","default":0,"minimum":0,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"units":"pixels","requires":["text-field"]},"text-translate":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"units":"pixels","requires":["text-field"]},"text-translate-anchor":{"type":"enum","function":"piecewise-constant","zoom-function":true,"property-function":true,"values":{"map":{},"viewport":{}},"default":"map","requires":["text-field","text-translate"]}},"paint_raster":{"raster-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"function":"interpolated","zoom-function":true,"transition":true},"raster-hue-rotate":{"type":"number","default":0,"period":360,"function":"interpolated","zoom-function":true,"transition":true,"units":"degrees"},"raster-brightness-min":{"type":"number","function":"interpolated","zoom-function":true,"default":0,"minimum":0,"maximum":1,"transition":true},"raster-brightness-max":{"type":"number","function":"interpolated","zoom-function":true,"default":1,"minimum":0,"maximum":1,"transition":true},"raster-saturation":{"type":"number","default":0,"minimum":-1,"maximum":1,"function":"interpolated","zoom-function":true,"transition":true},"raster-contrast":{"type":"number","default":0,"minimum":-1,"maximum":1,"function":"interpolated","zoom-function":true,"transition":true},"raster-fade-duration":{"type":"number","default":300,"minimum":0,"function":"interpolated","zoom-function":true,"transition":true,"units":"milliseconds"}},"paint_background":{"background-color":{"type":"color","default":"#000000","function":"interpolated","zoom-function":true,"transition":true,"requires":[{"!":"background-pattern"}]},"background-pattern":{"type":"string","function":"piecewise-constant","zoom-function":true,"transition":true},"background-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"function":"interpolated","zoom-function":true,"transition":true}},"transition":{"duration":{"type":"number","default":300,"minimum":0,"units":"milliseconds"},"delay":{"type":"number","default":0,"minimum":0,"units":"milliseconds"}}} +},{}],190:[function(require,module,exports){ +"use strict";function isSupported(e){return!!(isBrowser()&&isArraySupported()&&isFunctionSupported()&&isObjectSupported()&&isJSONSupported()&&isWorkerSupported()&&isUint8ClampedArraySupported()&&isWebGLSupportedCached(e&&e.failIfMajorPerformanceCaveat))}function isBrowser(){return"undefined"!=typeof window&&"undefined"!=typeof document}function isArraySupported(){return Array.prototype&&Array.prototype.every&&Array.prototype.filter&&Array.prototype.forEach&&Array.prototype.indexOf&&Array.prototype.lastIndexOf&&Array.prototype.map&&Array.prototype.some&&Array.prototype.reduce&&Array.prototype.reduceRight&&Array.isArray}function isFunctionSupported(){return Function.prototype&&Function.prototype.bind}function isObjectSupported(){return Object.keys&&Object.create&&Object.getPrototypeOf&&Object.getOwnPropertyNames&&Object.isSealed&&Object.isFrozen&&Object.isExtensible&&Object.getOwnPropertyDescriptor&&Object.defineProperty&&Object.defineProperties&&Object.seal&&Object.freeze&&Object.preventExtensions}function isJSONSupported(){return"JSON"in window&&"parse"in JSON&&"stringify"in JSON}function isWorkerSupported(){return"Worker"in window}function isUint8ClampedArraySupported(){return"Uint8ClampedArray"in window}function isWebGLSupportedCached(e){return void 0===isWebGLSupportedCache[e]&&(isWebGLSupportedCache[e]=isWebGLSupported(e)),isWebGLSupportedCache[e]}function isWebGLSupported(e){var t=document.createElement("canvas"),r=Object.create(isSupported.webGLContextAttributes);return r.failIfMajorPerformanceCaveat=e,t.probablySupportsContext?t.probablySupportsContext("webgl",r)||t.probablySupportsContext("experimental-webgl",r):t.supportsContext?t.supportsContext("webgl",r)||t.supportsContext("experimental-webgl",r):t.getContext("webgl",r)||t.getContext("experimental-webgl",r)}"undefined"!=typeof module&&module.exports?module.exports=isSupported:window&&(window.mapboxgl=window.mapboxgl||{},window.mapboxgl.supported=isSupported);var isWebGLSupportedCache={};isSupported.webGLContextAttributes={antialias:!1,alpha:!0,stencil:!0,depth:!0}; +},{}],191:[function(require,module,exports){ +(function (process){ +function normalizeArray(r,t){for(var e=0,n=r.length-1;n>=0;n--){var s=r[n];"."===s?r.splice(n,1):".."===s?(r.splice(n,1),e++):e&&(r.splice(n,1),e--)}if(t)for(;e--;e)r.unshift("..");return r}function filter(r,t){if(r.filter)return r.filter(t);for(var e=[],n=0;n=-1&&!t;e--){var n=e>=0?arguments[e]:process.cwd();if("string"!=typeof n)throw new TypeError("Arguments to path.resolve must be strings");n&&(r=n+"/"+r,t="/"===n.charAt(0))}return r=normalizeArray(filter(r.split("/"),function(r){return!!r}),!t).join("/"),(t?"/":"")+r||"."},exports.normalize=function(r){var t=exports.isAbsolute(r),e="/"===substr(r,-1);return r=normalizeArray(filter(r.split("/"),function(r){return!!r}),!t).join("/"),r||t||(r="."),r&&e&&(r+="/"),(t?"/":"")+r},exports.isAbsolute=function(r){return"/"===r.charAt(0)},exports.join=function(){var r=Array.prototype.slice.call(arguments,0);return exports.normalize(filter(r,function(r,t){if("string"!=typeof r)throw new TypeError("Arguments to path.join must be strings");return r}).join("/"))},exports.relative=function(r,t){function e(r){for(var t=0;t=0&&""===r[e];e--);return t>e?[]:r.slice(t,e-t+1)}r=exports.resolve(r).substr(1),t=exports.resolve(t).substr(1);for(var n=e(r.split("/")),s=e(t.split("/")),i=Math.min(n.length,s.length),o=i,u=0;u55295&&e<57344){if(!r){e>56319||o+1===n?i.push(239,191,189):r=e;continue}if(e<56320){i.push(239,191,189),r=e;continue}e=r-55296<<10|e-56320|65536,r=null}else r&&(i.push(239,191,189),r=null);e<128?i.push(e):e<2048?i.push(e>>6|192,63&e|128):e<65536?i.push(e>>12|224,e>>6&63|128,63&e|128):i.push(e>>18|240,e>>12&63|128,e>>6&63|128,63&e|128)}return i}module.exports=Buffer;var ieee754=require("ieee754"),BufferMethods,lastStr,lastStrEncoded;BufferMethods={readUInt32LE:function(t){return(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},writeUInt32LE:function(t,e){this[e]=t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24},readInt32LE:function(t){return(this[t]|this[t+1]<<8|this[t+2]<<16)+(this[t+3]<<24)},readFloatLE:function(t){return ieee754.read(this,t,!0,23,4)},readDoubleLE:function(t){return ieee754.read(this,t,!0,52,8)},writeFloatLE:function(t,e){return ieee754.write(this,t,e,!0,23,4)},writeDoubleLE:function(t,e){return ieee754.write(this,t,e,!0,52,8)},toString:function(t,e,r){var n="",i="";e=e||0,r=Math.min(this.length,r||this.length);for(var o=e;o=1;){if(i.pos>=e)throw new Error("Given varint doesn't fit into 10 bytes");var r=255&t;i.buf[i.pos++]=r|(t>=128?128:0),t/=128}}function reallocForRawMessage(t,i,e){var r=i<=16383?1:i<=2097151?2:i<=268435455?3:Math.ceil(Math.log(i)/(7*Math.LN2));e.realloc(r);for(var s=e.pos-1;s>=t;s--)e.buf[s+r]=e.buf[s]}function writePackedVarint(t,i){for(var e=0;e>3,n=this.pos;t(s,i,this),this.pos===n&&this.skip(r)}return i},readMessage:function(t,i){return this.readFields(t,i,this.readVarint()+this.pos)},readFixed32:function(){var t=this.buf.readUInt32LE(this.pos);return this.pos+=4,t},readSFixed32:function(){var t=this.buf.readInt32LE(this.pos);return this.pos+=4,t},readFixed64:function(){var t=this.buf.readUInt32LE(this.pos)+this.buf.readUInt32LE(this.pos+4)*SHIFT_LEFT_32;return this.pos+=8,t},readSFixed64:function(){var t=this.buf.readUInt32LE(this.pos)+this.buf.readInt32LE(this.pos+4)*SHIFT_LEFT_32;return this.pos+=8,t},readFloat:function(){var t=this.buf.readFloatLE(this.pos);return this.pos+=4,t},readDouble:function(){var t=this.buf.readDoubleLE(this.pos);return this.pos+=8,t},readVarint:function(){var t,i,e=this.buf;return i=e[this.pos++],t=127&i,i<128?t:(i=e[this.pos++],t|=(127&i)<<7,i<128?t:(i=e[this.pos++],t|=(127&i)<<14,i<128?t:(i=e[this.pos++],t|=(127&i)<<21,i<128?t:readVarintRemainder(t,this))))},readVarint64:function(){var t=this.pos,i=this.readVarint();if(i127;);else if(i===Pbf.Bytes)this.pos=this.readVarint()+this.pos;else if(i===Pbf.Fixed32)this.pos+=4;else{if(i!==Pbf.Fixed64)throw new Error("Unimplemented type: "+i);this.pos+=8}},writeTag:function(t,i){this.writeVarint(t<<3|i)},realloc:function(t){for(var i=this.length||16;i268435455?void writeBigVarint(t,this):(this.realloc(4),this.buf[this.pos++]=127&t|(t>127?128:0),void(t<=127||(this.buf[this.pos++]=127&(t>>>=7)|(t>127?128:0),t<=127||(this.buf[this.pos++]=127&(t>>>=7)|(t>127?128:0),t<=127||(this.buf[this.pos++]=t>>>7&127)))))},writeSVarint:function(t){this.writeVarint(t<0?2*-t-1:2*t)},writeBoolean:function(t){this.writeVarint(Boolean(t))},writeString:function(t){t=String(t);var i=Buffer.byteLength(t);this.writeVarint(i),this.realloc(i),this.buf.write(t,this.pos),this.pos+=i},writeFloat:function(t){this.realloc(4),this.buf.writeFloatLE(t,this.pos),this.pos+=4},writeDouble:function(t){this.realloc(8),this.buf.writeDoubleLE(t,this.pos),this.pos+=8},writeBytes:function(t){var i=t.length;this.writeVarint(i),this.realloc(i);for(var e=0;e=128&&reallocForRawMessage(e,r,this),this.pos=e-1,this.writeVarint(r),this.pos+=r},writeMessage:function(t,i,e){this.writeTag(t,Pbf.Bytes),this.writeRawMessage(i,e)},writePackedVarint:function(t,i){this.writeMessage(t,writePackedVarint,i)},writePackedSVarint:function(t,i){this.writeMessage(t,writePackedSVarint,i)},writePackedBoolean:function(t,i){this.writeMessage(t,writePackedBoolean,i)},writePackedFloat:function(t,i){this.writeMessage(t,writePackedFloat,i)},writePackedDouble:function(t,i){this.writeMessage(t,writePackedDouble,i)},writePackedFixed32:function(t,i){this.writeMessage(t,writePackedFixed32,i)},writePackedSFixed32:function(t,i){this.writeMessage(t,writePackedSFixed32,i)},writePackedFixed64:function(t,i){this.writeMessage(t,writePackedFixed64,i)},writePackedSFixed64:function(t,i){this.writeMessage(t,writePackedSFixed64,i)},writeBytesField:function(t,i){this.writeTag(t,Pbf.Bytes),this.writeBytes(i)},writeFixed32Field:function(t,i){this.writeTag(t,Pbf.Fixed32),this.writeFixed32(i)},writeSFixed32Field:function(t,i){this.writeTag(t,Pbf.Fixed32),this.writeSFixed32(i)},writeFixed64Field:function(t,i){this.writeTag(t,Pbf.Fixed64),this.writeFixed64(i)},writeSFixed64Field:function(t,i){this.writeTag(t,Pbf.Fixed64),this.writeSFixed64(i)},writeVarintField:function(t,i){this.writeTag(t,Pbf.Varint),this.writeVarint(i)},writeSVarintField:function(t,i){this.writeTag(t,Pbf.Varint),this.writeSVarint(i)},writeStringField:function(t,i){this.writeTag(t,Pbf.Bytes),this.writeString(i)},writeFloatField:function(t,i){this.writeTag(t,Pbf.Fixed32),this.writeFloat(i)},writeDoubleField:function(t,i){this.writeTag(t,Pbf.Fixed64),this.writeDouble(i)},writeBooleanField:function(t,i){this.writeVarintField(t,Boolean(i))}}; +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{"./buffer":192}],194:[function(require,module,exports){ +"use strict";function Point(t,n){this.x=t,this.y=n}module.exports=Point,Point.prototype={clone:function(){return new Point(this.x,this.y)},add:function(t){return this.clone()._add(t)},sub:function(t){return this.clone()._sub(t)},mult:function(t){return this.clone()._mult(t)},div:function(t){return this.clone()._div(t)},rotate:function(t){return this.clone()._rotate(t)},matMult:function(t){return this.clone()._matMult(t)},unit:function(){return this.clone()._unit()},perp:function(){return this.clone()._perp()},round:function(){return this.clone()._round()},mag:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},equals:function(t){return this.x===t.x&&this.y===t.y},dist:function(t){return Math.sqrt(this.distSqr(t))},distSqr:function(t){var n=t.x-this.x,i=t.y-this.y;return n*n+i*i},angle:function(){return Math.atan2(this.y,this.x)},angleTo:function(t){return Math.atan2(this.y-t.y,this.x-t.x)},angleWith:function(t){return this.angleWithSep(t.x,t.y)},angleWithSep:function(t,n){return Math.atan2(this.x*n-this.y*t,this.x*t+this.y*n)},_matMult:function(t){var n=t[0]*this.x+t[1]*this.y,i=t[2]*this.x+t[3]*this.y;return this.x=n,this.y=i,this},_add:function(t){return this.x+=t.x,this.y+=t.y,this},_sub:function(t){return this.x-=t.x,this.y-=t.y,this},_mult:function(t){return this.x*=t,this.y*=t,this},_div:function(t){return this.x/=t,this.y/=t,this},_unit:function(){return this._div(this.mag()),this},_perp:function(){var t=this.y;return this.y=this.x,this.x=-t,this},_rotate:function(t){var n=Math.cos(t),i=Math.sin(t),s=n*this.x-i*this.y,r=i*this.x+n*this.y;return this.x=s,this.y=r,this},_round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}},Point.convert=function(t){return t instanceof Point?t:Array.isArray(t)?new Point(t[0],t[1]):t}; +},{}],195:[function(require,module,exports){ +function defaultSetTimout(){throw new Error("setTimeout has not been defined")}function defaultClearTimeout(){throw new Error("clearTimeout has not been defined")}function runTimeout(e){if(cachedSetTimeout===setTimeout)return setTimeout(e,0);if((cachedSetTimeout===defaultSetTimout||!cachedSetTimeout)&&setTimeout)return cachedSetTimeout=setTimeout,setTimeout(e,0);try{return cachedSetTimeout(e,0)}catch(t){try{return cachedSetTimeout.call(null,e,0)}catch(t){return cachedSetTimeout.call(this,e,0)}}}function runClearTimeout(e){if(cachedClearTimeout===clearTimeout)return clearTimeout(e);if((cachedClearTimeout===defaultClearTimeout||!cachedClearTimeout)&&clearTimeout)return cachedClearTimeout=clearTimeout,clearTimeout(e);try{return cachedClearTimeout(e)}catch(t){try{return cachedClearTimeout.call(null,e)}catch(t){return cachedClearTimeout.call(this,e)}}}function cleanUpNextTick(){draining&¤tQueue&&(draining=!1,currentQueue.length?queue=currentQueue.concat(queue):queueIndex=-1,queue.length&&drainQueue())}function drainQueue(){if(!draining){var e=runTimeout(cleanUpNextTick);draining=!0;for(var t=queue.length;t;){for(currentQueue=queue,queue=[];++queueIndex1)for(var u=1;ur;){if(o-r>600){var f=o-r+1,e=t-r+1,l=Math.log(f),s=.5*Math.exp(2*l/3),i=.5*Math.sqrt(l*s*(f-s)/f)*(e-f/2<0?-1:1),n=Math.max(r,Math.floor(t-e*s/f+i)),h=Math.min(o,Math.floor(t+(f-e)*s/f+i));partialSort(a,t,n,h,p)}var u=a[t],M=r,w=o;for(swap(a,r,t),p(a[o],u)>0&&swap(a,r,o);M0;)w--}0===p(a[r],u)?swap(a,r,w):(w++,swap(a,w,o)),w<=t&&(r=w+1),t<=w&&(o=w-1)}}function swap(a,t,r){var o=a[t];a[t]=a[r],a[r]=o}function defaultCompare(a,t){return at?1:0}module.exports=partialSort; +},{}],197:[function(require,module,exports){ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):t.ShelfPack=e()}(this,function(){function t(t,e,s){s=s||{},this.w=t||64,this.h=e||64,this.autoResize=!!s.autoResize,this.shelves=[],this.stats={},this.count=function(t){this.stats[t]=(0|this.stats[t])+1}}function e(t,e,s){this.x=0,this.y=t,this.w=this.free=e,this.h=s}return t.prototype.pack=function(t,e){t=[].concat(t),e=e||{};for(var s,h,i,n=[],r=0;r0){for(var o=0,f=0,u=0;uh.h||t>h.free||sl)&&(a=2*Math.max(t,l)),(ff)&&(u=2*Math.max(s,f)),this.resize(a,u),this.packOne(t,s)}return null},t.prototype.clear=function(){this.shelves=[],this.stats={}},t.prototype.resize=function(t,e){this.w=t,this.h=e;for(var s=0;sthis.free||e>this.h)return null;var s=this.x;return this.x+=t,this.free-=t,{x:s,y:this.y,w:t,h:e,width:t,height:e}},e.prototype.resize=function(t){return this.free+=t-this.w,this.w=t,!0},t}); +},{}],198:[function(require,module,exports){ +"use strict";function supercluster(t){return new SuperCluster(t)}function SuperCluster(t){this.options=extend(Object.create(this.options),t),this.trees=new Array(this.options.maxZoom+1)}function createCluster(t,e,o,n){return{x:t,y:e,zoom:1/0,id:n,numPoints:o}}function createPointCluster(t,e){var o=t.geometry.coordinates;return createCluster(lngX(o[0]),latY(o[1]),1,e)}function getClusterJSON(t){return{type:"Feature",properties:getClusterProperties(t),geometry:{type:"Point",coordinates:[xLng(t.x),yLat(t.y)]}}}function getClusterProperties(t){var e=t.numPoints,o=e>=1e4?Math.round(e/1e3)+"k":e>=1e3?Math.round(e/100)/10+"k":e;return{cluster:!0,point_count:e,point_count_abbreviated:o}}function lngX(t){return t/360+.5}function latY(t){var e=Math.sin(t*Math.PI/180),o=.5-.25*Math.log((1+e)/(1-e))/Math.PI;return o<0?0:o>1?1:o}function xLng(t){return 360*(t-.5)}function yLat(t){var e=(180-360*t)*Math.PI/180;return 360*Math.atan(Math.exp(e))/Math.PI-90}function extend(t,e){for(var o in e)t[o]=e[o];return t}function getX(t){return t.x}function getY(t){return t.y}var kdbush=require("kdbush");module.exports=supercluster,SuperCluster.prototype={options:{minZoom:0,maxZoom:16,radius:40,extent:512,nodeSize:64,log:!1},load:function(t){var e=this.options.log;e&&console.time("total time");var o="prepare "+t.length+" points";e&&console.time(o),this.points=t;var n=t.map(createPointCluster);e&&console.timeEnd(o);for(var r=this.options.maxZoom;r>=this.options.minZoom;r--){var i=+Date.now();this.trees[r+1]=kdbush(n,getX,getY,this.options.nodeSize,Float32Array),n=this._cluster(n,r),e&&console.log("z%d: %d clusters in %dms",r,n.length,+Date.now()-i)}return this.trees[this.options.minZoom]=kdbush(n,getX,getY,this.options.nodeSize,Float32Array),e&&console.timeEnd("total time"),this},getClusters:function(t,e){for(var o=this.trees[this._limitZoom(e)],n=o.range(lngX(t[0]),latY(t[3]),lngX(t[2]),latY(t[1])),r=[],i=0;i=0;a--)this._down(a)}function defaultCompare(t,i){return ti?1:0}function swap(t,i,a){var n=t[i];t[i]=t[a],t[a]=n}module.exports=TinyQueue,TinyQueue.prototype={push:function(t){this.data.push(t),this.length++,this._up(this.length-1)},pop:function(){var t=this.data[0];return this.data[0]=this.data[this.length-1],this.length--,this.data.pop(),this._down(0),t},peek:function(){return this.data[0]},_up:function(t){for(var i=this.data,a=this.compare;t>0;){var n=Math.floor((t-1)/2);if(!(a(i[t],i[n])<0))break;swap(i,n,t),t=n}},_down:function(t){for(var i=this.data,a=this.compare,n=this.length;;){var e=2*t+1,h=e+1,s=t;if(er)return r;for(;eh?e=s:r=s,s=.5*(r-e)+e}return s},UnitBezier.prototype.solve=function(t,i){return this.sampleCurveY(this.solveCurveX(t,i))}; +},{}],201:[function(require,module,exports){ +"function"==typeof Object.create?module.exports=function(t,e){t.super_=e,t.prototype=Object.create(e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}})}:module.exports=function(t,e){t.super_=e;var o=function(){};o.prototype=e.prototype,t.prototype=new o,t.prototype.constructor=t}; +},{}],202:[function(require,module,exports){ +module.exports=function(o){return o&&"object"==typeof o&&"function"==typeof o.copy&&"function"==typeof o.fill&&"function"==typeof o.readUInt8}; +},{}],203:[function(require,module,exports){ +(function (process,global){ +function inspect(e,r){var t={seen:[],stylize:stylizeNoColor};return arguments.length>=3&&(t.depth=arguments[2]),arguments.length>=4&&(t.colors=arguments[3]),isBoolean(r)?t.showHidden=r:r&&exports._extend(t,r),isUndefined(t.showHidden)&&(t.showHidden=!1),isUndefined(t.depth)&&(t.depth=2),isUndefined(t.colors)&&(t.colors=!1),isUndefined(t.customInspect)&&(t.customInspect=!0),t.colors&&(t.stylize=stylizeWithColor),formatValue(t,e,t.depth)}function stylizeWithColor(e,r){var t=inspect.styles[r];return t?"["+inspect.colors[t][0]+"m"+e+"["+inspect.colors[t][1]+"m":e}function stylizeNoColor(e,r){return e}function arrayToHash(e){var r={};return e.forEach(function(e,t){r[e]=!0}),r}function formatValue(e,r,t){if(e.customInspect&&r&&isFunction(r.inspect)&&r.inspect!==exports.inspect&&(!r.constructor||r.constructor.prototype!==r)){var n=r.inspect(t,e);return isString(n)||(n=formatValue(e,n,t)),n}var i=formatPrimitive(e,r);if(i)return i;var o=Object.keys(r),s=arrayToHash(o);if(e.showHidden&&(o=Object.getOwnPropertyNames(r)),isError(r)&&(o.indexOf("message")>=0||o.indexOf("description")>=0))return formatError(r);if(0===o.length){if(isFunction(r)){var u=r.name?": "+r.name:"";return e.stylize("[Function"+u+"]","special")}if(isRegExp(r))return e.stylize(RegExp.prototype.toString.call(r),"regexp");if(isDate(r))return e.stylize(Date.prototype.toString.call(r),"date");if(isError(r))return formatError(r)}var c="",a=!1,l=["{","}"];if(isArray(r)&&(a=!0,l=["[","]"]),isFunction(r)){var p=r.name?": "+r.name:"";c=" [Function"+p+"]"}if(isRegExp(r)&&(c=" "+RegExp.prototype.toString.call(r)),isDate(r)&&(c=" "+Date.prototype.toUTCString.call(r)),isError(r)&&(c=" "+formatError(r)),0===o.length&&(!a||0==r.length))return l[0]+c+l[1];if(t<0)return isRegExp(r)?e.stylize(RegExp.prototype.toString.call(r),"regexp"):e.stylize("[Object]","special");e.seen.push(r);var f;return f=a?formatArray(e,r,t,s,o):o.map(function(n){return formatProperty(e,r,t,s,n,a)}),e.seen.pop(),reduceToSingleString(f,c,l)}function formatPrimitive(e,r){if(isUndefined(r))return e.stylize("undefined","undefined");if(isString(r)){var t="'"+JSON.stringify(r).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return e.stylize(t,"string")}return isNumber(r)?e.stylize(""+r,"number"):isBoolean(r)?e.stylize(""+r,"boolean"):isNull(r)?e.stylize("null","null"):void 0}function formatError(e){return"["+Error.prototype.toString.call(e)+"]"}function formatArray(e,r,t,n,i){for(var o=[],s=0,u=r.length;s-1&&(u=o?u.split("\n").map(function(e){return" "+e}).join("\n").substr(2):"\n"+u.split("\n").map(function(e){return" "+e}).join("\n"))):u=e.stylize("[Circular]","special")),isUndefined(s)){if(o&&i.match(/^\d+$/))return u;s=JSON.stringify(""+i),s.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(s=s.substr(1,s.length-2),s=e.stylize(s,"name")):(s=s.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),s=e.stylize(s,"string"))}return s+": "+u}function reduceToSingleString(e,r,t){var n=0,i=e.reduce(function(e,r){return n++,r.indexOf("\n")>=0&&n++,e+r.replace(/\u001b\[\d\d?m/g,"").length+1},0);return i>60?t[0]+(""===r?"":r+"\n ")+" "+e.join(",\n ")+" "+t[1]:t[0]+r+" "+e.join(", ")+" "+t[1]}function isArray(e){return Array.isArray(e)}function isBoolean(e){return"boolean"==typeof e}function isNull(e){return null===e}function isNullOrUndefined(e){return null==e}function isNumber(e){return"number"==typeof e}function isString(e){return"string"==typeof e}function isSymbol(e){return"symbol"==typeof e}function isUndefined(e){return void 0===e}function isRegExp(e){return isObject(e)&&"[object RegExp]"===objectToString(e)}function isObject(e){return"object"==typeof e&&null!==e}function isDate(e){return isObject(e)&&"[object Date]"===objectToString(e)}function isError(e){return isObject(e)&&("[object Error]"===objectToString(e)||e instanceof Error)}function isFunction(e){return"function"==typeof e}function isPrimitive(e){return null===e||"boolean"==typeof e||"number"==typeof e||"string"==typeof e||"symbol"==typeof e||"undefined"==typeof e}function objectToString(e){return Object.prototype.toString.call(e)}function pad(e){return e<10?"0"+e.toString(10):e.toString(10)}function timestamp(){var e=new Date,r=[pad(e.getHours()),pad(e.getMinutes()),pad(e.getSeconds())].join(":");return[e.getDate(),months[e.getMonth()],r].join(" ")}function hasOwnProperty(e,r){return Object.prototype.hasOwnProperty.call(e,r)}var formatRegExp=/%[sdj%]/g;exports.format=function(e){if(!isString(e)){for(var r=[],t=0;t=i)return e;switch(e){case"%s":return String(n[t++]);case"%d":return Number(n[t++]);case"%j":try{return JSON.stringify(n[t++])}catch(e){return"[Circular]"}default:return e}}),s=n[t];t>3}if(a--,1===i||2===i)o+=e.readSVarint(),n+=e.readSVarint(),1===i&&(t&&s.push(t),t=[]),t.push(new Point(o,n));else{if(7!==i)throw new Error("unknown command "+i);t&&t.push(t[0].clone())}}return t&&s.push(t),s},VectorTileFeature.prototype.bbox=function(){var e=this._pbf;e.pos=this._geometry;for(var t=e.readVarint()+e.pos,r=1,i=0,a=0,o=0,n=1/0,s=-(1/0),p=1/0,h=-(1/0);e.pos>3}if(i--,1===r||2===r)a+=e.readSVarint(),o+=e.readSVarint(),as&&(s=a),oh&&(h=o);else if(7!==r)throw new Error("unknown command "+r)}return[n,p,s,h]},VectorTileFeature.prototype.toGeoJSON=function(e,t,r){function i(e){for(var t=0;t>3;t=1===a?e.readString():2===a?e.readFloat():3===a?e.readDouble():4===a?e.readVarint64():5===a?e.readVarint():6===a?e.readSVarint():7===a?e.readBoolean():null}return t}var VectorTileFeature=require("./vectortilefeature.js");module.exports=VectorTileLayer,VectorTileLayer.prototype.feature=function(e){if(e<0||e>=this._features.length)throw new Error("feature index out of bounds");this._pbf.pos=this._features[e];var t=this._pbf.readVarint()+this._pbf.pos;return new VectorTileFeature(this._pbf,t,this.extent,this._keys,this._values)}; +},{"./vectortilefeature.js":206}],208:[function(require,module,exports){ +function fromVectorTileJs(e){var r=[];for(var o in e.layers)r.push(prepareLayer(e.layers[o]));var t=new Pbf;return vtpb.tile.write({layers:r},t),t.finish()}function fromGeojsonVt(e){var r={};for(var o in e)r[o]=new GeoJSONWrapper(e[o].features),r[o].name=o;return fromVectorTileJs({layers:r})}function prepareLayer(e){for(var r={name:e.name||"",version:e.version||1,extent:e.extent||4096,keys:[],values:[],features:[]},o={},t={},n=0;n>31}function encodeGeometry(e){for(var r=[],o=0,t=0,n=e.length,a=0;a button { + width: 30px; + height: 30px; + display: block; + padding: 0; + outline: none; + border: none; + border-bottom: 1px solid #ddd; + box-sizing: border-box; + background-color: rgba(0,0,0,0); + cursor: pointer; +} +/* https://bugzilla.mozilla.org/show_bug.cgi?id=140562 */ +.mapboxgl-ctrl > button::-moz-focus-inner { + border: 0; + padding: 0; +} +.mapboxgl-ctrl > button:last-child { + border-bottom: 0; +} +.mapboxgl-ctrl > button:hover { + background-color: rgba(0,0,0,0.05); +} +.mapboxgl-ctrl-icon, +.mapboxgl-ctrl-icon > span.arrow { + speak: none; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.mapboxgl-ctrl-icon { + padding: 5px; +} +.mapboxgl-ctrl-icon.mapboxgl-ctrl-zoom-out { + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg%20viewBox%3D%270%200%2020%2020%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%0A%20%20%3Cpath%20style%3D%27fill%3A%23333333%3B%27%20d%3D%27m%207%2C9%20c%20-0.554%2C0%20-1%2C0.446%20-1%2C1%200%2C0.554%200.446%2C1%201%2C1%20l%206%2C0%20c%200.554%2C0%201%2C-0.446%201%2C-1%200%2C-0.554%20-0.446%2C-1%20-1%2C-1%20z%27%20%2F%3E%0A%3C%2Fsvg%3E%0A"); +} +.mapboxgl-ctrl-icon.mapboxgl-ctrl-zoom-in { + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg%20viewBox%3D%270%200%2020%2020%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%0A%20%20%3Cpath%20style%3D%27fill%3A%23333333%3B%27%20d%3D%27M%2010%206%20C%209.446%206%209%206.4459904%209%207%20L%209%209%20L%207%209%20C%206.446%209%206%209.446%206%2010%20C%206%2010.554%206.446%2011%207%2011%20L%209%2011%20L%209%2013%20C%209%2013.55401%209.446%2014%2010%2014%20C%2010.554%2014%2011%2013.55401%2011%2013%20L%2011%2011%20L%2013%2011%20C%2013.554%2011%2014%2010.554%2014%2010%20C%2014%209.446%2013.554%209%2013%209%20L%2011%209%20L%2011%207%20C%2011%206.4459904%2010.554%206%2010%206%20z%27%20%2F%3E%0A%3C%2Fsvg%3E%0A"); +} +.mapboxgl-ctrl-icon.mapboxgl-ctrl-geolocate { + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D%270%200%2020%2020%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%0D%0A%20%20%3Cpath%20style%3D%27fill%3A%23333%3B%27%20d%3D%27M10%204C9%204%209%205%209%205L9%205.1A5%205%200%200%200%205.1%209L5%209C5%209%204%209%204%2010%204%2011%205%2011%205%2011L5.1%2011A5%205%200%200%200%209%2014.9L9%2015C9%2015%209%2016%2010%2016%2011%2016%2011%2015%2011%2015L11%2014.9A5%205%200%200%200%2014.9%2011L15%2011C15%2011%2016%2011%2016%2010%2016%209%2015%209%2015%209L14.9%209A5%205%200%200%200%2011%205.1L11%205C11%205%2011%204%2010%204zM10%206.5A3.5%203.5%200%200%201%2013.5%2010%203.5%203.5%200%200%201%2010%2013.5%203.5%203.5%200%200%201%206.5%2010%203.5%203.5%200%200%201%2010%206.5zM10%208.3A1.8%201.8%200%200%200%208.3%2010%201.8%201.8%200%200%200%2010%2011.8%201.8%201.8%200%200%200%2011.8%2010%201.8%201.8%200%200%200%2010%208.3z%27%20%2F%3E%0D%0A%3C%2Fsvg%3E"); +} +.mapboxgl-ctrl-icon.mapboxgl-ctrl-geolocate.watching { + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D%270%200%2020%2020%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%0D%0A%20%20%3Cpath%20style%3D%27fill%3A%2300f%3B%27%20d%3D%27M10%204C9%204%209%205%209%205L9%205.1A5%205%200%200%200%205.1%209L5%209C5%209%204%209%204%2010%204%2011%205%2011%205%2011L5.1%2011A5%205%200%200%200%209%2014.9L9%2015C9%2015%209%2016%2010%2016%2011%2016%2011%2015%2011%2015L11%2014.9A5%205%200%200%200%2014.9%2011L15%2011C15%2011%2016%2011%2016%2010%2016%209%2015%209%2015%209L14.9%209A5%205%200%200%200%2011%205.1L11%205C11%205%2011%204%2010%204zM10%206.5A3.5%203.5%200%200%201%2013.5%2010%203.5%203.5%200%200%201%2010%2013.5%203.5%203.5%200%200%201%206.5%2010%203.5%203.5%200%200%201%2010%206.5zM10%208.3A1.8%201.8%200%200%200%208.3%2010%201.8%201.8%200%200%200%2010%2011.8%201.8%201.8%200%200%200%2011.8%2010%201.8%201.8%200%200%200%2010%208.3z%27%20%2F%3E%0D%0A%3C%2Fsvg%3E"); +} + +.mapboxgl-ctrl-icon.mapboxgl-ctrl-compass > span.arrow { + width: 20px; + height: 20px; + margin: 5px; + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%0A%09%3Cpolygon%20fill%3D%27%23333333%27%20points%3D%276%2C9%2010%2C1%2014%2C9%27%2F%3E%0A%09%3Cpolygon%20fill%3D%27%23CCCCCC%27%20points%3D%276%2C11%2010%2C19%2014%2C11%20%27%2F%3E%0A%3C%2Fsvg%3E"); + background-repeat: no-repeat; + display: inline-block; +} + +.mapboxgl-ctrl.mapboxgl-ctrl-attrib { + padding: 0 5px; + background-color: rgba(255, 255, 255, .5); + margin: 0; +} +.mapboxgl-ctrl-attrib.compact { + padding-top: 2px; + padding-bottom: 2px; + margin: 0 10px 10px 10px; + position: relative; + padding-right: 24px; + background-color: #fff; + border-radius: 3px 12px 12px 3px; + visibility: hidden; +} +.mapboxgl-ctrl-attrib.compact:hover { + visibility: visible; +} +.mapboxgl-ctrl-attrib.compact:after { + content: ''; + cursor: pointer; + position: absolute; + bottom: 0; + right: 0; + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D%270%200%2020%2020%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%0D%0A%09%3Cpath%20fill%3D%27%23333333%27%20fill-rule%3D%27evenodd%27%20d%3D%27M4%2C10a6%2C6%200%201%2C0%2012%2C0a6%2C6%200%201%2C0%20-12%2C0%20M9%2C7a1%2C1%200%201%2C0%202%2C0a1%2C1%200%201%2C0%20-2%2C0%20M9%2C10a1%2C1%200%201%2C1%202%2C0l0%2C3a1%2C1%200%201%2C1%20-2%2C0%27%20%2F%3E%0D%0A%3C%2Fsvg%3E"); + background-color: rgba(255, 255, 255, .5); + width: 24px; + height: 24px; + box-sizing: border-box; + visibility: visible; + border-radius: 12px; +} +.mapboxgl-ctrl-attrib a { + color: rgba(0,0,0,0.75); + text-decoration: none; +} +.mapboxgl-ctrl-attrib a:hover { + color: inherit; + text-decoration: underline; +} +.mapboxgl-ctrl-attrib .mapbox-improve-map { + font-weight: bold; + margin-left: 2px; +} + +.mapboxgl-ctrl-scale { + background-color: rgba(255,255,255,0.75); + font-size: 10px; + border-width: medium 2px 2px; + border-style: none solid solid; + border-color: #333; + padding: 0 5px; + color: #333; +} + +.mapboxgl-popup { + position: absolute; + top: 0; + left: 0; + display: -webkit-flex; + display: flex; + will-change: transform; + pointer-events: none; +} +.mapboxgl-popup-anchor-top, +.mapboxgl-popup-anchor-top-left, +.mapboxgl-popup-anchor-top-right { + -webkit-flex-direction: column; + flex-direction: column; +} +.mapboxgl-popup-anchor-bottom, +.mapboxgl-popup-anchor-bottom-left, +.mapboxgl-popup-anchor-bottom-right { + -webkit-flex-direction: column-reverse; + flex-direction: column-reverse; +} +.mapboxgl-popup-anchor-left { + -webkit-flex-direction: row; + flex-direction: row; +} +.mapboxgl-popup-anchor-right { + -webkit-flex-direction: row-reverse; + flex-direction: row-reverse; +} +.mapboxgl-popup-tip { + width: 0; + height: 0; + border: 10px solid transparent; + z-index: 1; +} +.mapboxgl-popup-anchor-top .mapboxgl-popup-tip { + -webkit-align-self: center; + align-self: center; + border-top: none; + border-bottom-color: #fff; +} +.mapboxgl-popup-anchor-top-left .mapboxgl-popup-tip { + -webkit-align-self: flex-start; + align-self: flex-start; + border-top: none; + border-left: none; + border-bottom-color: #fff; +} +.mapboxgl-popup-anchor-top-right .mapboxgl-popup-tip { + -webkit-align-self: flex-end; + align-self: flex-end; + border-top: none; + border-right: none; + border-bottom-color: #fff; +} +.mapboxgl-popup-anchor-bottom .mapboxgl-popup-tip { + -webkit-align-self: center; + align-self: center; + border-bottom: none; + border-top-color: #fff; +} +.mapboxgl-popup-anchor-bottom-left .mapboxgl-popup-tip { + -webkit-align-self: flex-start; + align-self: flex-start; + border-bottom: none; + border-left: none; + border-top-color: #fff; +} +.mapboxgl-popup-anchor-bottom-right .mapboxgl-popup-tip { + -webkit-align-self: flex-end; + align-self: flex-end; + border-bottom: none; + border-right: none; + border-top-color: #fff; +} +.mapboxgl-popup-anchor-left .mapboxgl-popup-tip { + -webkit-align-self: center; + align-self: center; + border-left: none; + border-right-color: #fff; +} +.mapboxgl-popup-anchor-right .mapboxgl-popup-tip { + -webkit-align-self: center; + align-self: center; + border-right: none; + border-left-color: #fff; +} +.mapboxgl-popup-close-button { + position: absolute; + right: 0; + top: 0; + border: none; + border-radius: 0 3px 0 0; + cursor: pointer; + background-color: rgba(0,0,0,0); +} +.mapboxgl-popup-close-button:hover { + background-color: rgba(0,0,0,0.05); +} +.mapboxgl-popup-content { + position: relative; + background: #fff; + border-radius: 3px; + box-shadow: 0 1px 2px rgba(0,0,0,0.10); + padding: 10px 10px 15px; + pointer-events: auto; +} +.mapboxgl-popup-anchor-top-left .mapboxgl-popup-content { + border-top-left-radius: 0; +} +.mapboxgl-popup-anchor-top-right .mapboxgl-popup-content { + border-top-right-radius: 0; +} +.mapboxgl-popup-anchor-bottom-left .mapboxgl-popup-content { + border-bottom-left-radius: 0; +} +.mapboxgl-popup-anchor-bottom-right .mapboxgl-popup-content { + border-bottom-right-radius: 0; +} + +.mapboxgl-marker { + position: absolute; + top: 0; + left: 0; + will-change: transform; +} + +.mapboxgl-crosshair, +.mapboxgl-crosshair .mapboxgl-interactive, +.mapboxgl-crosshair .mapboxgl-interactive:active { + cursor: crosshair; +} +.mapboxgl-boxzoom { + position: absolute; + top: 0; + left: 0; + width: 0; + height: 0; + background: #fff; + border: 2px dotted #202020; + opacity: 0.5; +} +@media print { + .mapbox-improve-map { + display:none; + } +} \ No newline at end of file diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.32.1/dist/svg/mapboxgl-ctrl-attrib.svg b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.32.1/dist/svg/mapboxgl-ctrl-attrib.svg new file mode 100644 index 000000000..3bedbb0ea --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.32.1/dist/svg/mapboxgl-ctrl-attrib.svg @@ -0,0 +1,3 @@ + + + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.32.1/dist/svg/mapboxgl-ctrl-compass.svg b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.32.1/dist/svg/mapboxgl-ctrl-compass.svg new file mode 100644 index 000000000..dd5e2a880 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.32.1/dist/svg/mapboxgl-ctrl-compass.svg @@ -0,0 +1,4 @@ + + + + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.32.1/dist/svg/mapboxgl-ctrl-geolocate.svg b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.32.1/dist/svg/mapboxgl-ctrl-geolocate.svg new file mode 100644 index 000000000..efb9a3f79 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.32.1/dist/svg/mapboxgl-ctrl-geolocate.svg @@ -0,0 +1 @@ + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.32.1/dist/svg/mapboxgl-ctrl-zoom-in.svg b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.32.1/dist/svg/mapboxgl-ctrl-zoom-in.svg new file mode 100644 index 000000000..b26e3d162 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.32.1/dist/svg/mapboxgl-ctrl-zoom-in.svg @@ -0,0 +1,3 @@ + + + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.32.1/dist/svg/mapboxgl-ctrl-zoom-out.svg b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.32.1/dist/svg/mapboxgl-ctrl-zoom-out.svg new file mode 100644 index 000000000..ab6e9ff22 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.32.1/dist/svg/mapboxgl-ctrl-zoom-out.svg @@ -0,0 +1,3 @@ + + + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.32.1/js/mapbox-gl-dev.js b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.32.1/js/mapbox-gl-dev.js new file mode 100644 index 000000000..33a1f6deb --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.32.1/js/mapbox-gl-dev.js @@ -0,0 +1,31488 @@ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.mapboxgl = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o ArrayGroup.MAX_VERTEX_ARRAY_LENGTH) { + segment = new Segment(this.layoutVertexArray.length, this.elementArray.length); + this.segments.push(segment); + } + return segment; +}; + +ArrayGroup.prototype.prepareSegment2 = function prepareSegment2 (numVertices) { + var segment = this.segments2[this.segments2.length - 1]; + if (!segment || segment.vertexLength + numVertices > ArrayGroup.MAX_VERTEX_ARRAY_LENGTH) { + segment = new Segment(this.layoutVertexArray.length, this.elementArray2.length); + this.segments2.push(segment); + } + return segment; +}; + +ArrayGroup.prototype.populatePaintArrays = function populatePaintArrays (featureProperties) { + var this$1 = this; + + for (var key in this.layerData) { + var layerData = this$1.layerData[key]; + if (layerData.paintVertexArray.bytesPerElement === 0) continue; + layerData.programConfiguration.populatePaintArray( + layerData.layer, + layerData.paintVertexArray, + this$1.layoutVertexArray.length, + this$1.globalProperties, + featureProperties); + } +}; + +ArrayGroup.prototype.isEmpty = function isEmpty () { + return this.layoutVertexArray.length === 0; +}; + +ArrayGroup.prototype.serialize = function serialize (transferables) { + return { + layoutVertexArray: this.layoutVertexArray.serialize(transferables), + elementArray: this.elementArray && this.elementArray.serialize(transferables), + elementArray2: this.elementArray2 && this.elementArray2.serialize(transferables), + paintVertexArrays: serializePaintVertexArrays(this.layerData, transferables), + segments: this.segments, + segments2: this.segments2 + }; +}; + +function serializePaintVertexArrays(layerData, transferables) { + var paintVertexArrays = {}; + for (var layerId in layerData) { + var inputArray = layerData[layerId].paintVertexArray; + if (inputArray.length === 0) continue; + var array = inputArray.serialize(transferables); + var type = inputArray.constructor.serialize(); + paintVertexArrays[layerId] = {array: array, type: type}; + } + return paintVertexArrays; +} + +/** + * The maximum size of a vertex array. This limit is imposed by WebGL's 16 bit + * addressing of vertex buffers. + * @private + * @readonly + */ +ArrayGroup.MAX_VERTEX_ARRAY_LENGTH = Math.pow(2, 16) - 1; + +module.exports = ArrayGroup; + +},{"./program_configuration":15}],2:[function(require,module,exports){ +'use strict'; + +var ArrayGroup = require('./array_group'); +var BufferGroup = require('./buffer_group'); +var util = require('../util/util'); + +/** + * The `Bucket` class is the single point of knowledge about turning vector + * tiles into WebGL buffers. + * + * `Bucket` is an abstract class. A subclass exists for each style layer type. + * Create a bucket via the `StyleLayer#createBucket` method. + * + * @private + */ +var Bucket = function Bucket (options, programInterface) { + this.zoom = options.zoom; + this.overscaling = options.overscaling; + this.layers = options.layers; + this.index = options.index; + + if (options.arrays) { + this.buffers = new BufferGroup(programInterface, options.layers, options.zoom, options.arrays); + } else { + this.arrays = new ArrayGroup(programInterface, options.layers, options.zoom); + } +}; + +Bucket.prototype.populate = function populate (features, options) { + var this$1 = this; + + for (var i = 0, list = features; i < list.length; i += 1) { + var feature = list[i]; + + if (this$1.layers[0].filter(feature)) { + this$1.addFeature(feature); + options.featureIndex.insert(feature, this$1.index); + } + } +}; + +Bucket.prototype.isEmpty = function isEmpty () { + return this.arrays.isEmpty(); +}; + +Bucket.prototype.serialize = function serialize (transferables) { + return { + zoom: this.zoom, + layerIds: this.layers.map(function (l) { return l.id; }), + arrays: this.arrays.serialize(transferables) + }; +}; + +/** + * Release the WebGL resources associated with the buffers. Note that because + * buckets are shared between layers having the same layout properties, they + * must be destroyed in groups (all buckets for a tile, or all symbol buckets). + * + * @private + */ +Bucket.prototype.destroy = function destroy () { + if (this.buffers) { + this.buffers.destroy(); + this.buffers = null; + } +}; + +module.exports = Bucket; + +Bucket.deserialize = function(input, style) { + // Guard against the case where the map's style has been set to null while + // this bucket has been parsing. + if (!style) return; + + var output = {}; + + for (var i = 0, list = input; i < list.length; i += 1) { + var serialized = list[i]; + + var layers = serialized.layerIds + .map(function (id) { return style.getLayer(id); }) + .filter(Boolean); + + if (layers.length === 0) { + continue; + } + + var bucket = layers[0].createBucket(util.extend({layers: layers}, serialized)); + for (var i$1 = 0, list$1 = layers; i$1 < list$1.length; i$1 += 1) { + var layer = list$1[i$1]; + + output[layer.id] = bucket; + } + } + + return output; +}; + +},{"../util/util":129,"./array_group":1,"./buffer_group":9}],3:[function(require,module,exports){ +'use strict'; + +var Bucket = require('../bucket'); +var createVertexArrayType = require('../vertex_array_type'); +var createElementArrayType = require('../element_array_type'); +var loadGeometry = require('../load_geometry'); +var EXTENT = require('../extent'); + +var circleInterface = { + layoutVertexArrayType: createVertexArrayType([ + {name: 'a_pos', components: 2, type: 'Int16'} + ]), + elementArrayType: createElementArrayType(), + + paintAttributes: [ + {property: 'circle-color', type: 'Uint8'}, + {property: 'circle-radius', type: 'Uint16', multiplier: 10}, + {property: 'circle-blur', type: 'Uint16', multiplier: 10}, + {property: 'circle-opacity', type: 'Uint8', multiplier: 255}, + {property: 'circle-stroke-color', type: 'Uint8'}, + {property: 'circle-stroke-width', type: 'Uint16', multiplier: 10}, + {property: 'circle-stroke-opacity', type: 'Uint8', multiplier: 255} + ] +}; + +function addCircleVertex(layoutVertexArray, x, y, extrudeX, extrudeY) { + layoutVertexArray.emplaceBack( + (x * 2) + ((extrudeX + 1) / 2), + (y * 2) + ((extrudeY + 1) / 2)); +} + +/** + * Circles are represented by two triangles. + * + * Each corner has a pos that is the center of the circle and an extrusion + * vector that is where it points. + * @private + */ +var CircleBucket = (function (Bucket) { + function CircleBucket(options) { + Bucket.call(this, options, circleInterface); + } + + if ( Bucket ) CircleBucket.__proto__ = Bucket; + CircleBucket.prototype = Object.create( Bucket && Bucket.prototype ); + CircleBucket.prototype.constructor = CircleBucket; + + CircleBucket.prototype.addFeature = function addFeature (feature) { + var arrays = this.arrays; + + for (var i = 0, list = loadGeometry(feature); i < list.length; i += 1) { + var ring = list[i]; + + for (var i$1 = 0, list$1 = ring; i$1 < list$1.length; i$1 += 1) { + var point = list$1[i$1]; + + var x = point.x; + var y = point.y; + + // Do not include points that are outside the tile boundaries. + if (x < 0 || x >= EXTENT || y < 0 || y >= EXTENT) continue; + + // this geometry will be of the Point type, and we'll derive + // two triangles from it. + // + // ââ€Å’ââ€â‚¬Ã¢â€â‚¬Ã¢â€â‚¬Ã¢â€â‚¬Ã¢â€â‚¬Ã¢â€â‚¬Ã¢â€â‚¬Ã¢â€â‚¬Ã¢â€â‚¬Ã¢â€Â + // ââ€â€š 3 2 ââ€â€š + // ââ€â€š ââ€â€š + // ââ€â€š 0 1 ââ€â€š + // ââ€â€Ã¢â€â‚¬Ã¢â€â‚¬Ã¢â€â‚¬Ã¢â€â‚¬Ã¢â€â‚¬Ã¢â€â‚¬Ã¢â€â‚¬Ã¢â€â‚¬Ã¢â€â‚¬Ã¢â€Ëœ + + var segment = arrays.prepareSegment(4); + var index = segment.vertexLength; + + addCircleVertex(arrays.layoutVertexArray, x, y, -1, -1); + addCircleVertex(arrays.layoutVertexArray, x, y, 1, -1); + addCircleVertex(arrays.layoutVertexArray, x, y, 1, 1); + addCircleVertex(arrays.layoutVertexArray, x, y, -1, 1); + + arrays.elementArray.emplaceBack(index, index + 1, index + 2); + arrays.elementArray.emplaceBack(index, index + 3, index + 2); + + segment.vertexLength += 4; + segment.primitiveLength += 2; + } + } + + arrays.populatePaintArrays(feature.properties); + }; + + return CircleBucket; +}(Bucket)); + +module.exports = CircleBucket; + +},{"../bucket":2,"../element_array_type":10,"../extent":11,"../load_geometry":13,"../vertex_array_type":17}],4:[function(require,module,exports){ +'use strict'; + +var Bucket = require('../bucket'); +var createVertexArrayType = require('../vertex_array_type'); +var createElementArrayType = require('../element_array_type'); +var loadGeometry = require('../load_geometry'); +var earcut = require('earcut'); +var classifyRings = require('../../util/classify_rings'); +var assert = require('assert'); +var EARCUT_MAX_RINGS = 500; + +var fillInterface = { + layoutVertexArrayType: createVertexArrayType([ + {name: 'a_pos', components: 2, type: 'Int16'} + ]), + elementArrayType: createElementArrayType(3), + elementArrayType2: createElementArrayType(2), + + paintAttributes: [ + {property: 'fill-color', type: 'Uint8'}, + {property: 'fill-outline-color', type: 'Uint8'}, + {property: 'fill-opacity', type: 'Uint8', multiplier: 255} + ] +}; + +var FillBucket = (function (Bucket) { + function FillBucket(options) { + Bucket.call(this, options, fillInterface); + } + + if ( Bucket ) FillBucket.__proto__ = Bucket; + FillBucket.prototype = Object.create( Bucket && Bucket.prototype ); + FillBucket.prototype.constructor = FillBucket; + + FillBucket.prototype.addFeature = function addFeature (feature) { + var arrays = this.arrays; + + for (var i$2 = 0, list = classifyRings(loadGeometry(feature), EARCUT_MAX_RINGS); i$2 < list.length; i$2 += 1) { + var polygon = list[i$2]; + + var numVertices = 0; + for (var i$3 = 0, list$1 = polygon; i$3 < list$1.length; i$3 += 1) { + var ring = list$1[i$3]; + + numVertices += ring.length; + } + + var triangleSegment = arrays.prepareSegment(numVertices); + var triangleIndex = triangleSegment.vertexLength; + + var flattened = []; + var holeIndices = []; + + for (var i$4 = 0, list$2 = polygon; i$4 < list$2.length; i$4 += 1) { + var ring$1 = list$2[i$4]; + + if (ring$1.length === 0) { + continue; + } + + if (ring$1 !== polygon[0]) { + holeIndices.push(flattened.length / 2); + } + + var lineSegment = arrays.prepareSegment2(ring$1.length); + var lineIndex = lineSegment.vertexLength; + + arrays.layoutVertexArray.emplaceBack(ring$1[0].x, ring$1[0].y); + arrays.elementArray2.emplaceBack(lineIndex + ring$1.length - 1, lineIndex); + flattened.push(ring$1[0].x); + flattened.push(ring$1[0].y); + + for (var i = 1; i < ring$1.length; i++) { + arrays.layoutVertexArray.emplaceBack(ring$1[i].x, ring$1[i].y); + arrays.elementArray2.emplaceBack(lineIndex + i - 1, lineIndex + i); + flattened.push(ring$1[i].x); + flattened.push(ring$1[i].y); + } + + lineSegment.vertexLength += ring$1.length; + lineSegment.primitiveLength += ring$1.length; + } + + var indices = earcut(flattened, holeIndices); + assert(indices.length % 3 === 0); + + for (var i$1 = 0; i$1 < indices.length; i$1 += 3) { + arrays.elementArray.emplaceBack( + triangleIndex + indices[i$1], + triangleIndex + indices[i$1 + 1], + triangleIndex + indices[i$1 + 2]); + } + + triangleSegment.vertexLength += numVertices; + triangleSegment.primitiveLength += indices.length / 3; + } + + arrays.populatePaintArrays(feature.properties); + }; + + return FillBucket; +}(Bucket)); + +module.exports = FillBucket; + +},{"../../util/classify_rings":113,"../bucket":2,"../element_array_type":10,"../load_geometry":13,"../vertex_array_type":17,"assert":135,"earcut":137}],5:[function(require,module,exports){ +'use strict'; + +var Bucket = require('../bucket'); +var createVertexArrayType = require('../vertex_array_type'); +var createElementArrayType = require('../element_array_type'); +var loadGeometry = require('../load_geometry'); +var EXTENT = require('../extent'); +var earcut = require('earcut'); +var classifyRings = require('../../util/classify_rings'); +var assert = require('assert'); +var EARCUT_MAX_RINGS = 500; + +var fillExtrusionInterface = { + layoutVertexArrayType: createVertexArrayType([ + {name: 'a_pos', components: 2, type: 'Int16'}, + {name: 'a_normal', components: 3, type: 'Int16'}, + {name: 'a_edgedistance', components: 1, type: 'Int16'} + ]), + elementArrayType: createElementArrayType(3), + + paintAttributes: [ + {property: 'fill-extrusion-base', type: 'Uint16'}, + {property: 'fill-extrusion-height', type: 'Uint16'}, + {property: 'fill-extrusion-color', type: 'Uint8'} + ] +}; + +var FACTOR = Math.pow(2, 13); + +function addVertex(vertexArray, x, y, nx, ny, nz, t, e) { + vertexArray.emplaceBack( + // a_pos + x, + y, + // a_normal + Math.floor(nx * FACTOR) * 2 + t, + ny * FACTOR * 2, + nz * FACTOR * 2, + + // a_edgedistance + Math.round(e) + ); +} + +var FillExtrusionBucket = (function (Bucket) { + function FillExtrusionBucket(options) { + Bucket.call(this, options, fillExtrusionInterface); + } + + if ( Bucket ) FillExtrusionBucket.__proto__ = Bucket; + FillExtrusionBucket.prototype = Object.create( Bucket && Bucket.prototype ); + FillExtrusionBucket.prototype.constructor = FillExtrusionBucket; + + FillExtrusionBucket.prototype.addFeature = function addFeature (feature) { + var arrays = this.arrays; + + for (var i = 0, list = classifyRings(loadGeometry(feature), EARCUT_MAX_RINGS); i < list.length; i += 1) { + var polygon = list[i]; + + var numVertices = 0; + for (var i$1 = 0, list$1 = polygon; i$1 < list$1.length; i$1 += 1) { + var ring = list$1[i$1]; + + numVertices += ring.length; + } + + var segment = arrays.prepareSegment(numVertices * 5); + + var flattened = []; + var holeIndices = []; + var indices = []; + + for (var i$2 = 0, list$2 = polygon; i$2 < list$2.length; i$2 += 1) { + var ring$1 = list$2[i$2]; + + if (ring$1.length === 0) { + continue; + } + + if (ring$1 !== polygon[0]) { + holeIndices.push(flattened.length / 2); + } + + var edgeDistance = 0; + + for (var p = 0; p < ring$1.length; p++) { + var p1 = ring$1[p]; + + addVertex(arrays.layoutVertexArray, p1.x, p1.y, 0, 0, 1, 1, 0); + indices.push(segment.vertexLength++); + + if (p >= 1) { + var p2 = ring$1[p - 1]; + + if (!isBoundaryEdge(p1, p2)) { + var perp = p1.sub(p2)._perp()._unit(); + + addVertex(arrays.layoutVertexArray, p1.x, p1.y, perp.x, perp.y, 0, 0, edgeDistance); + addVertex(arrays.layoutVertexArray, p1.x, p1.y, perp.x, perp.y, 0, 1, edgeDistance); + + edgeDistance += p2.dist(p1); + + addVertex(arrays.layoutVertexArray, p2.x, p2.y, perp.x, perp.y, 0, 0, edgeDistance); + addVertex(arrays.layoutVertexArray, p2.x, p2.y, perp.x, perp.y, 0, 1, edgeDistance); + + var bottomRight = segment.vertexLength; + + arrays.elementArray.emplaceBack(bottomRight, bottomRight + 1, bottomRight + 2); + arrays.elementArray.emplaceBack(bottomRight + 1, bottomRight + 2, bottomRight + 3); + + segment.vertexLength += 4; + segment.primitiveLength += 2; + } + } + + // convert to format used by earcut + flattened.push(p1.x); + flattened.push(p1.y); + } + } + + var triangleIndices = earcut(flattened, holeIndices); + assert(triangleIndices.length % 3 === 0); + + for (var j = 0; j < triangleIndices.length; j += 3) { + arrays.elementArray.emplaceBack( + indices[triangleIndices[j]], + indices[triangleIndices[j + 1]], + indices[triangleIndices[j + 2]]); + } + + segment.primitiveLength += triangleIndices.length / 3; + } + + arrays.populatePaintArrays(feature.properties); + }; + + return FillExtrusionBucket; +}(Bucket)); + +module.exports = FillExtrusionBucket; + +function isBoundaryEdge(p1, p2) { + return (p1.x === p2.x && (p1.x < 0 || p1.x > EXTENT)) || + (p1.y === p2.y && (p1.y < 0 || p1.y > EXTENT)); +} + +},{"../../util/classify_rings":113,"../bucket":2,"../element_array_type":10,"../extent":11,"../load_geometry":13,"../vertex_array_type":17,"assert":135,"earcut":137}],6:[function(require,module,exports){ +'use strict'; + +var Bucket = require('../bucket'); +var createVertexArrayType = require('../vertex_array_type'); +var createElementArrayType = require('../element_array_type'); +var loadGeometry = require('../load_geometry'); +var EXTENT = require('../extent'); + +// NOTE ON EXTRUDE SCALE: +// scale the extrusion vector so that the normal length is this value. +// contains the "texture" normals (-1..1). this is distinct from the extrude +// normals for line joins, because the x-value remains 0 for the texture +// normal array, while the extrude normal actually moves the vertex to create +// the acute/bevelled line join. +var EXTRUDE_SCALE = 63; + +/* + * Sharp corners cause dashed lines to tilt because the distance along the line + * is the same at both the inner and outer corners. To improve the appearance of + * dashed lines we add extra points near sharp corners so that a smaller part + * of the line is tilted. + * + * COS_HALF_SHARP_CORNER controls how sharp a corner has to be for us to add an + * extra vertex. The default is 75 degrees. + * + * The newly created vertices are placed SHARP_CORNER_OFFSET pixels from the corner. + */ +var COS_HALF_SHARP_CORNER = Math.cos(75 / 2 * (Math.PI / 180)); +var SHARP_CORNER_OFFSET = 15; + +// The number of bits that is used to store the line distance in the buffer. +var LINE_DISTANCE_BUFFER_BITS = 15; + +// We don't have enough bits for the line distance as we'd like to have, so +// use this value to scale the line distance (in tile units) down to a smaller +// value. This lets us store longer distances while sacrificing precision. +var LINE_DISTANCE_SCALE = 1 / 2; + +// The maximum line distance, in tile units, that fits in the buffer. +var MAX_LINE_DISTANCE = Math.pow(2, LINE_DISTANCE_BUFFER_BITS - 1) / LINE_DISTANCE_SCALE; + +var lineInterface = { + layoutVertexArrayType: createVertexArrayType([ + {name: 'a_pos', components: 2, type: 'Int16'}, + {name: 'a_data', components: 4, type: 'Uint8'} + ]), + paintAttributes: [ + {property: 'line-color', type: 'Uint8'}, + {property: 'line-blur', multiplier: 10, type: 'Uint8'}, + {property: 'line-opacity', multiplier: 10, type: 'Uint8'}, + {property: 'line-gap-width', multiplier: 10, type: 'Uint8', name: 'a_gapwidth'}, + {property: 'line-offset', multiplier: 1, type: 'Int8'}, + ], + elementArrayType: createElementArrayType() +}; + +function addLineVertex(layoutVertexBuffer, point, extrude, tx, ty, dir, linesofar) { + layoutVertexBuffer.emplaceBack( + // a_pos + (point.x << 1) | tx, + (point.y << 1) | ty, + // a_data + // add 128 to store a byte in an unsigned byte + Math.round(EXTRUDE_SCALE * extrude.x) + 128, + Math.round(EXTRUDE_SCALE * extrude.y) + 128, + // Encode the -1/0/1 direction value into the first two bits of .z of a_data. + // Combine it with the lower 6 bits of `linesofar` (shifted by 2 bites to make + // room for the direction value). The upper 8 bits of `linesofar` are placed in + // the `w` component. `linesofar` is scaled down by `LINE_DISTANCE_SCALE` so that + // we can store longer distances while sacrificing precision. + ((dir === 0 ? 0 : (dir < 0 ? -1 : 1)) + 1) | (((linesofar * LINE_DISTANCE_SCALE) & 0x3F) << 2), + (linesofar * LINE_DISTANCE_SCALE) >> 6); +} + +/** + * @private + */ +var LineBucket = (function (Bucket) { + function LineBucket(options) { + Bucket.call(this, options, lineInterface); + } + + if ( Bucket ) LineBucket.__proto__ = Bucket; + LineBucket.prototype = Object.create( Bucket && Bucket.prototype ); + LineBucket.prototype.constructor = LineBucket; + + LineBucket.prototype.addFeature = function addFeature (feature) { + var this$1 = this; + + var layout = this.layers[0].layout; + var join = layout['line-join']; + var cap = layout['line-cap']; + var miterLimit = layout['line-miter-limit']; + var roundLimit = layout['line-round-limit']; + + for (var i = 0, list = loadGeometry(feature, LINE_DISTANCE_BUFFER_BITS); i < list.length; i += 1) { + var line = list[i]; + + this$1.addLine(line, feature.properties, join, cap, miterLimit, roundLimit); + } + }; + + LineBucket.prototype.addLine = function addLine (vertices, featureProperties, join, cap, miterLimit, roundLimit) { + var this$1 = this; + + + var len = vertices.length; + // If the line has duplicate vertices at the end, adjust length to remove them. + while (len > 2 && vertices[len - 1].equals(vertices[len - 2])) { + len--; + } + + // a line must have at least two vertices + if (vertices.length < 2) return; + + if (join === 'bevel') miterLimit = 1.05; + + var sharpCornerOffset = SHARP_CORNER_OFFSET * (EXTENT / (512 * this.overscaling)); + + var firstVertex = vertices[0], + lastVertex = vertices[len - 1], + closed = firstVertex.equals(lastVertex); + + var arrays = this.arrays; + + // we could be more precise, but it would only save a negligible amount of space + var segment = arrays.prepareSegment(len * 10); + + // a line may not have coincident points + if (len === 2 && closed) return; + + this.distance = 0; + + var beginCap = cap, + endCap = closed ? 'butt' : cap; + var startOfLine = true; + var currentVertex, prevVertex, nextVertex, prevNormal, nextNormal, offsetA, offsetB; + + // the last three vertices added + this.e1 = this.e2 = this.e3 = -1; + + if (closed) { + currentVertex = vertices[len - 2]; + nextNormal = firstVertex.sub(currentVertex)._unit()._perp(); + } + + for (var i = 0; i < len; i++) { + + nextVertex = closed && i === len - 1 ? + vertices[1] : // if the line is closed, we treat the last vertex like the first + vertices[i + 1]; // just the next vertex + + // if two consecutive vertices exist, skip the current one + if (nextVertex && vertices[i].equals(nextVertex)) continue; + + if (nextNormal) prevNormal = nextNormal; + if (currentVertex) prevVertex = currentVertex; + + currentVertex = vertices[i]; + + // Calculate the normal towards the next vertex in this line. In case + // there is no next vertex, pretend that the line is continuing straight, + // meaning that we are just using the previous normal. + nextNormal = nextVertex ? nextVertex.sub(currentVertex)._unit()._perp() : prevNormal; + + // If we still don't have a previous normal, this is the beginning of a + // non-closed line, so we're doing a straight "join". + prevNormal = prevNormal || nextNormal; + + // Determine the normal of the join extrusion. It is the angle bisector + // of the segments between the previous line and the next line. + // In the case of 180° angles, the prev and next normals cancel each other out: + // prevNormal + nextNormal = (0, 0), its magnitude is 0, so the unit vector would be + // undefined. In that case, we're keeping the joinNormal at (0, 0), so that the cosHalfAngle + // below will also become 0 and miterLength will become Infinity. + var joinNormal = prevNormal.add(nextNormal); + if (joinNormal.x !== 0 || joinNormal.y !== 0) { + joinNormal._unit(); + } + /* joinNormal prevNormal + * ↖ ↑ + * .________. prevVertex + * | + * nextNormal ↠| currentVertex + * | + * nextVertex ! + * + */ + + // Calculate the length of the miter (the ratio of the miter to the width). + // Find the cosine of the angle between the next and join normals + // using dot product. The inverse of that is the miter length. + var cosHalfAngle = joinNormal.x * nextNormal.x + joinNormal.y * nextNormal.y; + var miterLength = cosHalfAngle !== 0 ? 1 / cosHalfAngle : Infinity; + + var isSharpCorner = cosHalfAngle < COS_HALF_SHARP_CORNER && prevVertex && nextVertex; + + if (isSharpCorner && i > 0) { + var prevSegmentLength = currentVertex.dist(prevVertex); + if (prevSegmentLength > 2 * sharpCornerOffset) { + var newPrevVertex = currentVertex.sub(currentVertex.sub(prevVertex)._mult(sharpCornerOffset / prevSegmentLength)._round()); + this$1.distance += newPrevVertex.dist(prevVertex); + this$1.addCurrentVertex(newPrevVertex, this$1.distance, prevNormal.mult(1), 0, 0, false, segment); + prevVertex = newPrevVertex; + } + } + + // The join if a middle vertex, otherwise the cap. + var middleVertex = prevVertex && nextVertex; + var currentJoin = middleVertex ? join : nextVertex ? beginCap : endCap; + + if (middleVertex && currentJoin === 'round') { + if (miterLength < roundLimit) { + currentJoin = 'miter'; + } else if (miterLength <= 2) { + currentJoin = 'fakeround'; + } + } + + if (currentJoin === 'miter' && miterLength > miterLimit) { + currentJoin = 'bevel'; + } + + if (currentJoin === 'bevel') { + // The maximum extrude length is 128 / 63 = 2 times the width of the line + // so if miterLength >= 2 we need to draw a different type of bevel here. + if (miterLength > 2) currentJoin = 'flipbevel'; + + // If the miterLength is really small and the line bevel wouldn't be visible, + // just draw a miter join to save a triangle. + if (miterLength < miterLimit) currentJoin = 'miter'; + } + + // Calculate how far along the line the currentVertex is + if (prevVertex) this$1.distance += currentVertex.dist(prevVertex); + + if (currentJoin === 'miter') { + + joinNormal._mult(miterLength); + this$1.addCurrentVertex(currentVertex, this$1.distance, joinNormal, 0, 0, false, segment); + + } else if (currentJoin === 'flipbevel') { + // miter is too big, flip the direction to make a beveled join + + if (miterLength > 100) { + // Almost parallel lines + joinNormal = nextNormal.clone().mult(-1); + + } else { + var direction = prevNormal.x * nextNormal.y - prevNormal.y * nextNormal.x > 0 ? -1 : 1; + var bevelLength = miterLength * prevNormal.add(nextNormal).mag() / prevNormal.sub(nextNormal).mag(); + joinNormal._perp()._mult(bevelLength * direction); + } + this$1.addCurrentVertex(currentVertex, this$1.distance, joinNormal, 0, 0, false, segment); + this$1.addCurrentVertex(currentVertex, this$1.distance, joinNormal.mult(-1), 0, 0, false, segment); + + } else if (currentJoin === 'bevel' || currentJoin === 'fakeround') { + var lineTurnsLeft = (prevNormal.x * nextNormal.y - prevNormal.y * nextNormal.x) > 0; + var offset = -Math.sqrt(miterLength * miterLength - 1); + if (lineTurnsLeft) { + offsetB = 0; + offsetA = offset; + } else { + offsetA = 0; + offsetB = offset; + } + + // Close previous segment with a bevel + if (!startOfLine) { + this$1.addCurrentVertex(currentVertex, this$1.distance, prevNormal, offsetA, offsetB, false, segment); + } + + if (currentJoin === 'fakeround') { + // The join angle is sharp enough that a round join would be visible. + // Bevel joins fill the gap between segments with a single pie slice triangle. + // Create a round join by adding multiple pie slices. The join isn't actually round, but + // it looks like it is at the sizes we render lines at. + + // Add more triangles for sharper angles. + // This math is just a good enough approximation. It isn't "correct". + var n = Math.floor((0.5 - (cosHalfAngle - 0.5)) * 8); + var approxFractionalJoinNormal; + + for (var m = 0; m < n; m++) { + approxFractionalJoinNormal = nextNormal.mult((m + 1) / (n + 1))._add(prevNormal)._unit(); + this$1.addPieSliceVertex(currentVertex, this$1.distance, approxFractionalJoinNormal, lineTurnsLeft, segment); + } + + this$1.addPieSliceVertex(currentVertex, this$1.distance, joinNormal, lineTurnsLeft, segment); + + for (var k = n - 1; k >= 0; k--) { + approxFractionalJoinNormal = prevNormal.mult((k + 1) / (n + 1))._add(nextNormal)._unit(); + this$1.addPieSliceVertex(currentVertex, this$1.distance, approxFractionalJoinNormal, lineTurnsLeft, segment); + } + } + + // Start next segment + if (nextVertex) { + this$1.addCurrentVertex(currentVertex, this$1.distance, nextNormal, -offsetA, -offsetB, false, segment); + } + + } else if (currentJoin === 'butt') { + if (!startOfLine) { + // Close previous segment with a butt + this$1.addCurrentVertex(currentVertex, this$1.distance, prevNormal, 0, 0, false, segment); + } + + // Start next segment with a butt + if (nextVertex) { + this$1.addCurrentVertex(currentVertex, this$1.distance, nextNormal, 0, 0, false, segment); + } + + } else if (currentJoin === 'square') { + + if (!startOfLine) { + // Close previous segment with a square cap + this$1.addCurrentVertex(currentVertex, this$1.distance, prevNormal, 1, 1, false, segment); + + // The segment is done. Unset vertices to disconnect segments. + this$1.e1 = this$1.e2 = -1; + } + + // Start next segment + if (nextVertex) { + this$1.addCurrentVertex(currentVertex, this$1.distance, nextNormal, -1, -1, false, segment); + } + + } else if (currentJoin === 'round') { + + if (!startOfLine) { + // Close previous segment with butt + this$1.addCurrentVertex(currentVertex, this$1.distance, prevNormal, 0, 0, false, segment); + + // Add round cap or linejoin at end of segment + this$1.addCurrentVertex(currentVertex, this$1.distance, prevNormal, 1, 1, true, segment); + + // The segment is done. Unset vertices to disconnect segments. + this$1.e1 = this$1.e2 = -1; + } + + + // Start next segment with a butt + if (nextVertex) { + // Add round cap before first segment + this$1.addCurrentVertex(currentVertex, this$1.distance, nextNormal, -1, -1, true, segment); + + this$1.addCurrentVertex(currentVertex, this$1.distance, nextNormal, 0, 0, false, segment); + } + } + + if (isSharpCorner && i < len - 1) { + var nextSegmentLength = currentVertex.dist(nextVertex); + if (nextSegmentLength > 2 * sharpCornerOffset) { + var newCurrentVertex = currentVertex.add(nextVertex.sub(currentVertex)._mult(sharpCornerOffset / nextSegmentLength)._round()); + this$1.distance += newCurrentVertex.dist(currentVertex); + this$1.addCurrentVertex(newCurrentVertex, this$1.distance, nextNormal.mult(1), 0, 0, false, segment); + currentVertex = newCurrentVertex; + } + } + + startOfLine = false; + } + + arrays.populatePaintArrays(featureProperties); + }; + + /** + * Add two vertices to the buffers. + * + * @param {Object} currentVertex the line vertex to add buffer vertices for + * @param {number} distance the distance from the beginning of the line to the vertex + * @param {number} endLeft extrude to shift the left vertex along the line + * @param {number} endRight extrude to shift the left vertex along the line + * @param {boolean} round whether this is a round cap + * @private + */ + LineBucket.prototype.addCurrentVertex = function addCurrentVertex (currentVertex, distance, normal, endLeft, endRight, round, segment) { + var tx = round ? 1 : 0; + var extrude; + var arrays = this.arrays; + var layoutVertexArray = arrays.layoutVertexArray; + var elementArray = arrays.elementArray; + + extrude = normal.clone(); + if (endLeft) extrude._sub(normal.perp()._mult(endLeft)); + addLineVertex(layoutVertexArray, currentVertex, extrude, tx, 0, endLeft, distance); + this.e3 = segment.vertexLength++; + if (this.e1 >= 0 && this.e2 >= 0) { + elementArray.emplaceBack(this.e1, this.e2, this.e3); + segment.primitiveLength++; + } + this.e1 = this.e2; + this.e2 = this.e3; + + extrude = normal.mult(-1); + if (endRight) extrude._sub(normal.perp()._mult(endRight)); + addLineVertex(layoutVertexArray, currentVertex, extrude, tx, 1, -endRight, distance); + this.e3 = segment.vertexLength++; + if (this.e1 >= 0 && this.e2 >= 0) { + elementArray.emplaceBack(this.e1, this.e2, this.e3); + segment.primitiveLength++; + } + this.e1 = this.e2; + this.e2 = this.e3; + + // There is a maximum "distance along the line" that we can store in the buffers. + // When we get close to the distance, reset it to zero and add the vertex again with + // a distance of zero. The max distance is determined by the number of bits we allocate + // to `linesofar`. + if (distance > MAX_LINE_DISTANCE / 2) { + this.distance = 0; + this.addCurrentVertex(currentVertex, this.distance, normal, endLeft, endRight, round, segment); + } + }; + + /** + * Add a single new vertex and a triangle using two previous vertices. + * This adds a pie slice triangle near a join to simulate round joins + * + * @param {Object} currentVertex the line vertex to add buffer vertices for + * @param {number} distance the distance from the beggining of the line to the vertex + * @param {Object} extrude the offset of the new vertex from the currentVertex + * @param {boolean} whether the line is turning left or right at this angle + * @private + */ + LineBucket.prototype.addPieSliceVertex = function addPieSliceVertex (currentVertex, distance, extrude, lineTurnsLeft, segment) { + var ty = lineTurnsLeft ? 1 : 0; + extrude = extrude.mult(lineTurnsLeft ? -1 : 1); + var arrays = this.arrays; + var layoutVertexArray = arrays.layoutVertexArray; + var elementArray = arrays.elementArray; + + addLineVertex(layoutVertexArray, currentVertex, extrude, 0, ty, 0, distance); + this.e3 = segment.vertexLength++; + if (this.e1 >= 0 && this.e2 >= 0) { + elementArray.emplaceBack(this.e1, this.e2, this.e3); + segment.primitiveLength++; + } + + if (lineTurnsLeft) { + this.e2 = this.e3; + } else { + this.e1 = this.e3; + } + }; + + return LineBucket; +}(Bucket)); + +module.exports = LineBucket; + +},{"../bucket":2,"../element_array_type":10,"../extent":11,"../load_geometry":13,"../vertex_array_type":17}],7:[function(require,module,exports){ +'use strict'; + +var Point = require('point-geometry'); +var ArrayGroup = require('../array_group'); +var BufferGroup = require('../buffer_group'); +var createVertexArrayType = require('../vertex_array_type'); +var createElementArrayType = require('../element_array_type'); +var EXTENT = require('../extent'); +var Anchor = require('../../symbol/anchor'); +var getAnchors = require('../../symbol/get_anchors'); +var resolveTokens = require('../../util/token'); +var Quads = require('../../symbol/quads'); +var Shaping = require('../../symbol/shaping'); +var resolveText = require('../../symbol/resolve_text'); +var mergeLines = require('../../symbol/mergelines'); +var clipLine = require('../../symbol/clip_line'); +var util = require('../../util/util'); +var scriptDetection = require('../../util/script_detection'); +var loadGeometry = require('../load_geometry'); +var CollisionFeature = require('../../symbol/collision_feature'); +var findPoleOfInaccessibility = require('../../util/find_pole_of_inaccessibility'); +var classifyRings = require('../../util/classify_rings'); +var VectorTileFeature = require('vector-tile').VectorTileFeature; +var rtlTextPlugin = require('../../source/rtl_text_plugin'); + +var shapeText = Shaping.shapeText; +var shapeIcon = Shaping.shapeIcon; +var WritingMode = Shaping.WritingMode; +var getGlyphQuads = Quads.getGlyphQuads; +var getIconQuads = Quads.getIconQuads; + +var elementArrayType = createElementArrayType(); + +var layoutVertexArrayType = createVertexArrayType([ + {name: 'a_pos', components: 2, type: 'Int16'}, + {name: 'a_offset', components: 2, type: 'Int16'}, + {name: 'a_texture_pos', components: 2, type: 'Uint16'}, + {name: 'a_data', components: 4, type: 'Uint8'} +]); + +var symbolInterfaces = { + glyph: { + layoutVertexArrayType: layoutVertexArrayType, + elementArrayType: elementArrayType + }, + icon: { + layoutVertexArrayType: layoutVertexArrayType, + elementArrayType: elementArrayType + }, + collisionBox: { + layoutVertexArrayType: createVertexArrayType([ + {name: 'a_pos', components: 2, type: 'Int16'}, + {name: 'a_extrude', components: 2, type: 'Int16'}, + {name: 'a_data', components: 2, type: 'Uint8'} + ]), + elementArrayType: createElementArrayType(2) + } +}; + +function addVertex(array, x, y, ox, oy, tx, ty, minzoom, maxzoom, labelminzoom, labelangle) { + array.emplaceBack( + // a_pos + x, + y, + + // a_offset + Math.round(ox * 64), + Math.round(oy * 64), + + // a_texture_pos + tx / 4, // x coordinate of symbol on glyph atlas texture + ty / 4, // y coordinate of symbol on glyph atlas texture + + // a_data + (labelminzoom || 0) * 10, // labelminzoom + labelangle, // labelangle + (minzoom || 0) * 10, // minzoom + Math.min(maxzoom || 25, 25) * 10); // maxzoom +} + +function addCollisionBoxVertex(layoutVertexArray, point, extrude, maxZoom, placementZoom) { + return layoutVertexArray.emplaceBack( + // pos + point.x, + point.y, + // extrude + Math.round(extrude.x), + Math.round(extrude.y), + // data + maxZoom * 10, + placementZoom * 10); +} + +var SymbolBucket = function SymbolBucket(options) { + var this$1 = this; + + this.collisionBoxArray = options.collisionBoxArray; + this.symbolQuadsArray = options.symbolQuadsArray; + this.symbolInstancesArray = options.symbolInstancesArray; + + this.zoom = options.zoom; + this.overscaling = options.overscaling; + this.layers = options.layers; + this.index = options.index; + this.sdfIcons = options.sdfIcons; + this.iconsNeedLinear = options.iconsNeedLinear; + this.adjustedTextSize = options.adjustedTextSize; + this.adjustedIconSize = options.adjustedIconSize; + this.fontstack = options.fontstack; + + if (options.arrays) { + this.buffers = {}; + for (var id in options.arrays) { + if (options.arrays[id]) { + this$1.buffers[id] = new BufferGroup(symbolInterfaces[id], options.layers, options.zoom, options.arrays[id]); + } + } + } +}; + +SymbolBucket.prototype.populate = function populate (features, options) { + var this$1 = this; + + var layout = this.layers[0].layout; + var textField = layout['text-field']; + var textFont = layout['text-font']; + var iconImage = layout['icon-image']; + + var hasText = textField && textFont; + var hasIcon = iconImage; + + this.features = []; + + if (!hasText && !hasIcon) { + return; + } + + var icons = options.iconDependencies; + var stacks = options.glyphDependencies; + var stack = stacks[textFont] = stacks[textFont] || {}; + + for (var i = 0; i < features.length; i++) { + var feature = features[i]; + if (!this$1.layers[0].filter(feature)) { + continue; + } + + var text; + if (hasText) { + if (rtlTextPlugin.applyArabicShaping) { + text = rtlTextPlugin.applyArabicShaping(resolveText(feature, layout)); + } else { + text = resolveText(feature, layout); + } + } + + var icon; + if (hasIcon) { + icon = resolveTokens(feature.properties, iconImage); + } + + if (!text && !icon) { + continue; + } + + this$1.features.push({ + text: text, + icon: icon, + index: i, + sourceLayerIndex: feature.sourceLayerIndex, + geometry: loadGeometry(feature), + properties: feature.properties, + type: VectorTileFeature.types[feature.type] + }); + + if (icon) { + icons[icon] = true; + } + + if (text) { + for (var i$1 = 0; i$1 < text.length; i$1++) { + stack[text.charCodeAt(i$1)] = true; + } + } + } + + if (layout['symbol-placement'] === 'line') { + // Merge adjacent lines with the same text to improve labelling. + // It's better to place labels on one long line than on many short segments. + this.features = mergeLines(this.features); + } +}; + +SymbolBucket.prototype.isEmpty = function isEmpty () { + return this.arrays.icon.isEmpty() && + this.arrays.glyph.isEmpty() && + this.arrays.collisionBox.isEmpty(); +}; + +SymbolBucket.prototype.serialize = function serialize (transferables) { + return { + zoom: this.zoom, + layerIds: this.layers.map(function (l) { return l.id; }), + sdfIcons: this.sdfIcons, + iconsNeedLinear: this.iconsNeedLinear, + adjustedTextSize: this.adjustedTextSize, + adjustedIconSize: this.adjustedIconSize, + fontstack: this.fontstack, + arrays: util.mapObject(this.arrays, function (a) { return a.isEmpty() ? null : a.serialize(transferables); }) + }; +}; + +SymbolBucket.prototype.destroy = function destroy () { + if (this.buffers) { + if (this.buffers.icon) this.buffers.icon.destroy(); + if (this.buffers.glyph) this.buffers.glyph.destroy(); + if (this.buffers.collisionBox) this.buffers.collisionBox.destroy(); + this.buffers = null; + } +}; + +SymbolBucket.prototype.createArrays = function createArrays () { + var this$1 = this; + + this.arrays = util.mapObject(symbolInterfaces, function (programInterface) { + return new ArrayGroup(programInterface, this$1.layers, this$1.zoom); + }); +}; + +SymbolBucket.prototype.prepare = function prepare (stacks, icons) { + var this$1 = this; + + this.createArrays(); + + // To reduce the number of labels that jump around when zooming we need + // to use a text-size value that is the same for all zoom levels. + // This calculates text-size at a high zoom level so that all tiles can + // use the same value when calculating anchor positions. + this.adjustedTextMaxSize = this.layers[0].getLayoutValue('text-size', {zoom: 18}); + this.adjustedTextSize = this.layers[0].getLayoutValue('text-size', {zoom: this.zoom + 1}); + this.adjustedIconMaxSize = this.layers[0].getLayoutValue('icon-size', {zoom: 18}); + this.adjustedIconSize = this.layers[0].getLayoutValue('icon-size', {zoom: this.zoom + 1}); + + var tileSize = 512 * this.overscaling; + this.tilePixelRatio = EXTENT / tileSize; + this.compareText = {}; + this.iconsNeedLinear = false; + this.symbolInstancesStartIndex = this.symbolInstancesArray.length; + + var layout = this.layers[0].layout; + + var horizontalAlign = 0.5, + verticalAlign = 0.5; + + switch (layout['text-anchor']) { + case 'right': + case 'top-right': + case 'bottom-right': + horizontalAlign = 1; + break; + case 'left': + case 'top-left': + case 'bottom-left': + horizontalAlign = 0; + break; + } + + switch (layout['text-anchor']) { + case 'bottom': + case 'bottom-right': + case 'bottom-left': + verticalAlign = 1; + break; + case 'top': + case 'top-right': + case 'top-left': + verticalAlign = 0; + break; + } + + var justify = layout['text-justify'] === 'right' ? 1 : + layout['text-justify'] === 'left' ? 0 : + 0.5; + + var oneEm = 24; + var lineHeight = layout['text-line-height'] * oneEm; + var maxWidth = layout['symbol-placement'] !== 'line' ? layout['text-max-width'] * oneEm : 0; + var spacing = layout['text-letter-spacing'] * oneEm; + var textOffset = [layout['text-offset'][0] * oneEm, layout['text-offset'][1] * oneEm]; + var fontstack = this.fontstack = layout['text-font'].join(','); + var textAlongLine = layout['text-rotation-alignment'] === 'map' && layout['symbol-placement'] === 'line'; + + for (var i = 0, list = this.features; i < list.length; i += 1) { + + var feature = list[i]; + + var shapedTextOrientations; + if (feature.text) { + var allowsVerticalWritingMode = scriptDetection.allowsVerticalWritingMode(feature.text); + + shapedTextOrientations = {}; + shapedTextOrientations[WritingMode.horizontal] = shapeText(feature.text, stacks[fontstack], maxWidth, lineHeight, horizontalAlign, verticalAlign, justify, spacing, textOffset, oneEm, WritingMode.horizontal); + shapedTextOrientations[WritingMode.vertical] = allowsVerticalWritingMode && textAlongLine && shapeText(feature.text, stacks[fontstack], maxWidth, lineHeight, horizontalAlign, verticalAlign, justify, spacing, textOffset, oneEm, WritingMode.vertical); + } else { + shapedTextOrientations = {}; + } + + var shapedIcon; + if (feature.icon) { + var image = icons[feature.icon]; + var iconOffset = this$1.layers[0].getLayoutValue('icon-offset', {zoom: this$1.zoom}, feature.properties); + shapedIcon = shapeIcon(image, iconOffset); + + if (image) { + if (this$1.sdfIcons === undefined) { + this$1.sdfIcons = image.sdf; + } else if (this$1.sdfIcons !== image.sdf) { + util.warnOnce('Style sheet warning: Cannot mix SDF and non-SDF icons in one buffer'); + } + if (image.pixelRatio !== 1) { + this$1.iconsNeedLinear = true; + } else if (layout['icon-rotate'] !== 0 || !this$1.layers[0].isLayoutValueFeatureConstant('icon-rotate')) { + this$1.iconsNeedLinear = true; + } + } + } + + if (shapedTextOrientations[WritingMode.horizontal] || shapedIcon) { + this$1.addFeature(feature, shapedTextOrientations, shapedIcon); + } + } + this.symbolInstancesEndIndex = this.symbolInstancesArray.length; +}; + +SymbolBucket.prototype.addFeature = function addFeature (feature, shapedTextOrientations, shapedIcon) { + var this$1 = this; + + var layout = this.layers[0].layout, + glyphSize = 24, + fontScale = this.adjustedTextSize / glyphSize, + textMaxSize = this.adjustedTextMaxSize !== undefined ? this.adjustedTextMaxSize : this.adjustedTextSize, + textBoxScale = this.tilePixelRatio * fontScale, + textMaxBoxScale = this.tilePixelRatio * textMaxSize / glyphSize, + iconBoxScale = this.tilePixelRatio * this.adjustedIconSize, + symbolMinDistance = this.tilePixelRatio * layout['symbol-spacing'], + avoidEdges = layout['symbol-avoid-edges'], + textPadding = layout['text-padding'] * this.tilePixelRatio, + iconPadding = layout['icon-padding'] * this.tilePixelRatio, + textMaxAngle = layout['text-max-angle'] / 180 * Math.PI, + textAlongLine = layout['text-rotation-alignment'] === 'map' && layout['symbol-placement'] === 'line', + iconAlongLine = layout['icon-rotation-alignment'] === 'map' && layout['symbol-placement'] === 'line', + mayOverlap = layout['text-allow-overlap'] || layout['icon-allow-overlap'] || + layout['text-ignore-placement'] || layout['icon-ignore-placement'], + symbolPlacement = layout['symbol-placement'], + textRepeatDistance = symbolMinDistance / 2; + + var addSymbolInstance = function (line, anchor) { + var inside = !(anchor.x < 0 || anchor.x > EXTENT || anchor.y < 0 || anchor.y > EXTENT); + + if (avoidEdges && !inside) return; + + // Normally symbol layers are drawn across tile boundaries. Only symbols + // with their anchors within the tile boundaries are added to the buffers + // to prevent symbols from being drawn twice. + // + // Symbols in layers with overlap are sorted in the y direction so that + // symbols lower on the canvas are drawn on top of symbols near the top. + // To preserve this order across tile boundaries these symbols can't + // be drawn across tile boundaries. Instead they need to be included in + // the buffers for both tiles and clipped to tile boundaries at draw time. + var addToBuffers = inside || mayOverlap; + this$1.addSymbolInstance(anchor, line, shapedTextOrientations, shapedIcon, this$1.layers[0], + addToBuffers, this$1.symbolInstancesArray.length, this$1.collisionBoxArray, feature.index, feature.sourceLayerIndex, this$1.index, + textBoxScale, textPadding, textAlongLine, + iconBoxScale, iconPadding, iconAlongLine, {zoom: this$1.zoom}, feature.properties); + }; + + if (symbolPlacement === 'line') { + for (var i = 0, list = clipLine(feature.geometry, 0, 0, EXTENT, EXTENT); i < list.length; i += 1) { + var line = list[i]; + + var anchors = getAnchors( + line, + symbolMinDistance, + textMaxAngle, + shapedTextOrientations[WritingMode.vertical] || shapedTextOrientations[WritingMode.horizontal], + shapedIcon, + glyphSize, + textMaxBoxScale, + this$1.overscaling, + EXTENT + ); + for (var i$1 = 0, list$1 = anchors; i$1 < list$1.length; i$1 += 1) { + var anchor = list$1[i$1]; + + var shapedText = shapedTextOrientations[WritingMode.horizontal]; + if (!shapedText || !this$1.anchorIsTooClose(shapedText.text, textRepeatDistance, anchor)) { + addSymbolInstance(line, anchor); + } + } + } + } else if (feature.type === 'Polygon') { + for (var i$2 = 0, list$2 = classifyRings(feature.geometry, 0); i$2 < list$2.length; i$2 += 1) { + // 16 here represents 2 pixels + var polygon = list$2[i$2]; + + var poi = findPoleOfInaccessibility(polygon, 16); + addSymbolInstance(polygon[0], new Anchor(poi.x, poi.y, 0)); + } + } else if (feature.type === 'LineString') { + // https://github.com/mapbox/mapbox-gl-js/issues/3808 + for (var i$3 = 0, list$3 = feature.geometry; i$3 < list$3.length; i$3 += 1) { + var line$1 = list$3[i$3]; + + addSymbolInstance(line$1, new Anchor(line$1[0].x, line$1[0].y, 0)); + } + } else if (feature.type === 'Point') { + for (var i$4 = 0, list$4 = feature.geometry; i$4 < list$4.length; i$4 += 1) { + var points = list$4[i$4]; + + for (var i$5 = 0, list$5 = points; i$5 < list$5.length; i$5 += 1) { + var point = list$5[i$5]; + + addSymbolInstance([point], new Anchor(point.x, point.y, 0)); + } + } + } +}; + +SymbolBucket.prototype.anchorIsTooClose = function anchorIsTooClose (text, repeatDistance, anchor) { + var compareText = this.compareText; + if (!(text in compareText)) { + compareText[text] = []; + } else { + var otherAnchors = compareText[text]; + for (var k = otherAnchors.length - 1; k >= 0; k--) { + if (anchor.dist(otherAnchors[k]) < repeatDistance) { + // If it's within repeatDistance of one anchor, stop looking + return true; + } + } + } + // If anchor is not within repeatDistance of any other anchor, add to array + compareText[text].push(anchor); + return false; +}; + +SymbolBucket.prototype.place = function place (collisionTile, showCollisionBoxes) { + var this$1 = this; + + // Calculate which labels can be shown and when they can be shown and + // create the bufers used for rendering. + + this.createArrays(); + + var layout = this.layers[0].layout; + + var maxScale = collisionTile.maxScale; + + var textAlongLine = layout['text-rotation-alignment'] === 'map' && layout['symbol-placement'] === 'line'; + var iconAlongLine = layout['icon-rotation-alignment'] === 'map' && layout['symbol-placement'] === 'line'; + + var mayOverlap = layout['text-allow-overlap'] || layout['icon-allow-overlap'] || + layout['text-ignore-placement'] || layout['icon-ignore-placement']; + + // Sort symbols by their y position on the canvas so that the lower symbols + // are drawn on top of higher symbols. + // Don't sort symbols that won't overlap because it isn't necessary and + // because it causes more labels to pop in and out when rotating. + if (mayOverlap) { + // Only need the symbol instances from the current tile to sort, so convert those instances into an array + // of `StructType`s to enable sorting + var symbolInstancesStructTypeArray = this.symbolInstancesArray.toArray(this.symbolInstancesStartIndex, this.symbolInstancesEndIndex); + + var angle = collisionTile.angle; + + var sin = Math.sin(angle), + cos = Math.cos(angle); + + this.sortedSymbolInstances = symbolInstancesStructTypeArray.sort(function (a, b) { + var aRotated = (sin * a.anchorPointX + cos * a.anchorPointY) | 0; + var bRotated = (sin * b.anchorPointX + cos * b.anchorPointY) | 0; + return (aRotated - bRotated) || (b.index - a.index); + }); + } + + for (var p = this.symbolInstancesStartIndex; p < this.symbolInstancesEndIndex; p++) { + var symbolInstance = this$1.sortedSymbolInstances ? this$1.sortedSymbolInstances[p - this$1.symbolInstancesStartIndex] : this$1.symbolInstancesArray.get(p); + var textCollisionFeature = { + boxStartIndex: symbolInstance.textBoxStartIndex, + boxEndIndex: symbolInstance.textBoxEndIndex + }; + var iconCollisionFeature = { + boxStartIndex: symbolInstance.iconBoxStartIndex, + boxEndIndex: symbolInstance.iconBoxEndIndex + }; + + var hasText = !(symbolInstance.textBoxStartIndex === symbolInstance.textBoxEndIndex); + var hasIcon = !(symbolInstance.iconBoxStartIndex === symbolInstance.iconBoxEndIndex); + + var iconWithoutText = layout['text-optional'] || !hasText, + textWithoutIcon = layout['icon-optional'] || !hasIcon; + + + // Calculate the scales at which the text and icon can be placed without collision. + + var glyphScale = hasText ? + collisionTile.placeCollisionFeature(textCollisionFeature, + layout['text-allow-overlap'], layout['symbol-avoid-edges']) : + collisionTile.minScale; + + var iconScale = hasIcon ? + collisionTile.placeCollisionFeature(iconCollisionFeature, + layout['icon-allow-overlap'], layout['symbol-avoid-edges']) : + collisionTile.minScale; + + + // Combine the scales for icons and text. + + if (!iconWithoutText && !textWithoutIcon) { + iconScale = glyphScale = Math.max(iconScale, glyphScale); + } else if (!textWithoutIcon && glyphScale) { + glyphScale = Math.max(iconScale, glyphScale); + } else if (!iconWithoutText && iconScale) { + iconScale = Math.max(iconScale, glyphScale); + } + + + // Insert final placement into collision tree and add glyphs/icons to buffers + + if (hasText) { + collisionTile.insertCollisionFeature(textCollisionFeature, glyphScale, layout['text-ignore-placement']); + if (glyphScale <= maxScale) { + this$1.addSymbols(this$1.arrays.glyph, symbolInstance.glyphQuadStartIndex, symbolInstance.glyphQuadEndIndex, glyphScale, layout['text-keep-upright'], textAlongLine, collisionTile.angle, symbolInstance.writingModes); + } + } + + if (hasIcon) { + collisionTile.insertCollisionFeature(iconCollisionFeature, iconScale, layout['icon-ignore-placement']); + if (iconScale <= maxScale) { + this$1.addSymbols(this$1.arrays.icon, symbolInstance.iconQuadStartIndex, symbolInstance.iconQuadEndIndex, iconScale, layout['icon-keep-upright'], iconAlongLine, collisionTile.angle); + } + } + + } + + if (showCollisionBoxes) this.addToDebugBuffers(collisionTile); +}; + +SymbolBucket.prototype.addSymbols = function addSymbols (arrays, quadsStart, quadsEnd, scale, keepUpright, alongLine, placementAngle, writingModes) { + var this$1 = this; + + var elementArray = arrays.elementArray; + var layoutVertexArray = arrays.layoutVertexArray; + + var zoom = this.zoom; + var placementZoom = Math.max(Math.log(scale) / Math.LN2 + zoom, 0); + + for (var k = quadsStart; k < quadsEnd; k++) { + + var symbol = this$1.symbolQuadsArray.get(k).SymbolQuad; + + // drop incorrectly oriented glyphs + var a = (symbol.anchorAngle + placementAngle + Math.PI) % (Math.PI * 2); + if (writingModes & WritingMode.vertical) { + if (alongLine && symbol.writingMode === WritingMode.vertical) { + if (keepUpright && alongLine && a <= (Math.PI * 5 / 4) || a > (Math.PI * 7 / 4)) continue; + } else if (keepUpright && alongLine && a <= (Math.PI * 3 / 4) || a > (Math.PI * 5 / 4)) continue; + } else if (keepUpright && alongLine && (a <= Math.PI / 2 || a > Math.PI * 3 / 2)) continue; + + var tl = symbol.tl, + tr = symbol.tr, + bl = symbol.bl, + br = symbol.br, + tex = symbol.tex, + anchorPoint = symbol.anchorPoint; + + var minZoom = Math.max(zoom + Math.log(symbol.minScale) / Math.LN2, placementZoom); + var maxZoom = Math.min(zoom + Math.log(symbol.maxScale) / Math.LN2, 25); + + if (maxZoom <= minZoom) continue; + + // Lower min zoom so that while fading out the label it can be shown outside of collision-free zoom levels + if (minZoom === placementZoom) minZoom = 0; + + // Encode angle of glyph + var glyphAngle = Math.round((symbol.glyphAngle / (Math.PI * 2)) * 256); + + var segment = arrays.prepareSegment(4); + var index = segment.vertexLength; + + addVertex(layoutVertexArray, anchorPoint.x, anchorPoint.y, tl.x, tl.y, tex.x, tex.y, minZoom, maxZoom, placementZoom, glyphAngle); + addVertex(layoutVertexArray, anchorPoint.x, anchorPoint.y, tr.x, tr.y, tex.x + tex.w, tex.y, minZoom, maxZoom, placementZoom, glyphAngle); + addVertex(layoutVertexArray, anchorPoint.x, anchorPoint.y, bl.x, bl.y, tex.x, tex.y + tex.h, minZoom, maxZoom, placementZoom, glyphAngle); + addVertex(layoutVertexArray, anchorPoint.x, anchorPoint.y, br.x, br.y, tex.x + tex.w, tex.y + tex.h, minZoom, maxZoom, placementZoom, glyphAngle); + + elementArray.emplaceBack(index, index + 1, index + 2); + elementArray.emplaceBack(index + 1, index + 2, index + 3); + + segment.vertexLength += 4; + segment.primitiveLength += 2; + } +}; + +SymbolBucket.prototype.addToDebugBuffers = function addToDebugBuffers (collisionTile) { + var this$1 = this; + + var arrays = this.arrays.collisionBox; + var layoutVertexArray = arrays.layoutVertexArray; + var elementArray = arrays.elementArray; + + var angle = -collisionTile.angle; + var yStretch = collisionTile.yStretch; + + for (var j = this.symbolInstancesStartIndex; j < this.symbolInstancesEndIndex; j++) { + var symbolInstance = this$1.symbolInstancesArray.get(j); + symbolInstance.textCollisionFeature = {boxStartIndex: symbolInstance.textBoxStartIndex, boxEndIndex: symbolInstance.textBoxEndIndex}; + symbolInstance.iconCollisionFeature = {boxStartIndex: symbolInstance.iconBoxStartIndex, boxEndIndex: symbolInstance.iconBoxEndIndex}; + + for (var i = 0; i < 2; i++) { + var feature = symbolInstance[i === 0 ? 'textCollisionFeature' : 'iconCollisionFeature']; + if (!feature) continue; + + for (var b = feature.boxStartIndex; b < feature.boxEndIndex; b++) { + var box = this$1.collisionBoxArray.get(b); + var anchorPoint = box.anchorPoint; + + var tl = new Point(box.x1, box.y1 * yStretch)._rotate(angle); + var tr = new Point(box.x2, box.y1 * yStretch)._rotate(angle); + var bl = new Point(box.x1, box.y2 * yStretch)._rotate(angle); + var br = new Point(box.x2, box.y2 * yStretch)._rotate(angle); + + var maxZoom = Math.max(0, Math.min(25, this$1.zoom + Math.log(box.maxScale) / Math.LN2)); + var placementZoom = Math.max(0, Math.min(25, this$1.zoom + Math.log(box.placementScale) / Math.LN2)); + + var segment = arrays.prepareSegment(4); + var index = segment.vertexLength; + + addCollisionBoxVertex(layoutVertexArray, anchorPoint, tl, maxZoom, placementZoom); + addCollisionBoxVertex(layoutVertexArray, anchorPoint, tr, maxZoom, placementZoom); + addCollisionBoxVertex(layoutVertexArray, anchorPoint, br, maxZoom, placementZoom); + addCollisionBoxVertex(layoutVertexArray, anchorPoint, bl, maxZoom, placementZoom); + + elementArray.emplaceBack(index, index + 1); + elementArray.emplaceBack(index + 1, index + 2); + elementArray.emplaceBack(index + 2, index + 3); + elementArray.emplaceBack(index + 3, index); + + segment.vertexLength += 4; + segment.primitiveLength += 4; + } + } + } +}; + +SymbolBucket.prototype.addSymbolInstance = function addSymbolInstance (anchor, line, shapedTextOrientations, shapedIcon, layer, addToBuffers, index, collisionBoxArray, featureIndex, sourceLayerIndex, bucketIndex, + textBoxScale, textPadding, textAlongLine, + iconBoxScale, iconPadding, iconAlongLine, globalProperties, featureProperties) { + var this$1 = this; + + + var textCollisionFeature, iconCollisionFeature, iconQuads; + var glyphQuads = []; + for (var writingModeString in shapedTextOrientations) { + var writingMode = parseInt(writingModeString, 10); + if (!shapedTextOrientations[writingMode]) continue; + glyphQuads = glyphQuads.concat(addToBuffers ? getGlyphQuads(anchor, shapedTextOrientations[writingMode], textBoxScale, line, layer, textAlongLine, writingMode) : []); + textCollisionFeature = new CollisionFeature(collisionBoxArray, line, anchor, featureIndex, sourceLayerIndex, bucketIndex, shapedTextOrientations[writingMode], textBoxScale, textPadding, textAlongLine, false); + } + + var glyphQuadStartIndex = this.symbolQuadsArray.length; + if (glyphQuads && glyphQuads.length) { + for (var i = 0; i < glyphQuads.length; i++) { + this$1.addSymbolQuad(glyphQuads[i]); + } + } + var glyphQuadEndIndex = this.symbolQuadsArray.length; + + var textBoxStartIndex = textCollisionFeature ? textCollisionFeature.boxStartIndex : this.collisionBoxArray.length; + var textBoxEndIndex = textCollisionFeature ? textCollisionFeature.boxEndIndex : this.collisionBoxArray.length; + + if (shapedIcon) { + iconQuads = addToBuffers ? getIconQuads(anchor, shapedIcon, iconBoxScale, line, layer, iconAlongLine, shapedTextOrientations[WritingMode.horizontal], globalProperties, featureProperties) : []; + iconCollisionFeature = new CollisionFeature(collisionBoxArray, line, anchor, featureIndex, sourceLayerIndex, bucketIndex, shapedIcon, iconBoxScale, iconPadding, iconAlongLine, true); + } + + var iconQuadStartIndex = this.symbolQuadsArray.length; + if (iconQuads && iconQuads.length === 1) { + this.addSymbolQuad(iconQuads[0]); + } + var iconQuadEndIndex = this.symbolQuadsArray.length; + + var iconBoxStartIndex = iconCollisionFeature ? iconCollisionFeature.boxStartIndex : this.collisionBoxArray.length; + var iconBoxEndIndex = iconCollisionFeature ? iconCollisionFeature.boxEndIndex : this.collisionBoxArray.length; + if (iconQuadEndIndex > SymbolBucket.MAX_QUADS) util.warnOnce("Too many symbols being rendered in a tile. See https://github.com/mapbox/mapbox-gl-js/issues/2907"); + if (glyphQuadEndIndex > SymbolBucket.MAX_QUADS) util.warnOnce("Too many glyphs being rendered in a tile. See https://github.com/mapbox/mapbox-gl-js/issues/2907"); + + var writingModes = ( + (shapedTextOrientations[WritingMode.vertical] ? WritingMode.vertical : 0) | + (shapedTextOrientations[WritingMode.horizontal] ? WritingMode.horizontal : 0) + ); + + return this.symbolInstancesArray.emplaceBack( + textBoxStartIndex, + textBoxEndIndex, + iconBoxStartIndex, + iconBoxEndIndex, + glyphQuadStartIndex, + glyphQuadEndIndex, + iconQuadStartIndex, + iconQuadEndIndex, + anchor.x, + anchor.y, + index, + writingModes + ); +}; + +SymbolBucket.prototype.addSymbolQuad = function addSymbolQuad (symbolQuad) { + return this.symbolQuadsArray.emplaceBack( + // anchorPoints + symbolQuad.anchorPoint.x, + symbolQuad.anchorPoint.y, + // corners + symbolQuad.tl.x, + symbolQuad.tl.y, + symbolQuad.tr.x, + symbolQuad.tr.y, + symbolQuad.bl.x, + symbolQuad.bl.y, + symbolQuad.br.x, + symbolQuad.br.y, + // texture + symbolQuad.tex.h, + symbolQuad.tex.w, + symbolQuad.tex.x, + symbolQuad.tex.y, + //angle + symbolQuad.anchorAngle, + symbolQuad.glyphAngle, + // scales + symbolQuad.maxScale, + symbolQuad.minScale, + // writing mode + symbolQuad.writingMode); +}; + +// this constant is based on the size of the glyphQuadEndIndex and iconQuadEndIndex +// in the symbol_instances StructArrayType +// eg the max valid UInt16 is 65,535 +SymbolBucket.MAX_QUADS = 65535; + +module.exports = SymbolBucket; + +},{"../../source/rtl_text_plugin":49,"../../symbol/anchor":75,"../../symbol/clip_line":77,"../../symbol/collision_feature":79,"../../symbol/get_anchors":81,"../../symbol/mergelines":84,"../../symbol/quads":85,"../../symbol/resolve_text":86,"../../symbol/shaping":87,"../../util/classify_rings":113,"../../util/find_pole_of_inaccessibility":119,"../../util/script_detection":126,"../../util/token":128,"../../util/util":129,"../array_group":1,"../buffer_group":9,"../element_array_type":10,"../extent":11,"../load_geometry":13,"../vertex_array_type":17,"point-geometry":198,"vector-tile":207}],8:[function(require,module,exports){ +'use strict'; + +/** + * @enum {string} AttributeType + * @private + * @readonly + */ +var AttributeType = { + Int8: 'BYTE', + Uint8: 'UNSIGNED_BYTE', + Int16: 'SHORT', + Uint16: 'UNSIGNED_SHORT' +}; + +/** + * The `Buffer` class turns a `StructArray` into a WebGL buffer. Each member of the StructArray's + * Struct type is converted to a WebGL atribute. + * @private + */ +var Buffer = function Buffer(array, arrayType, type) { + this.arrayBuffer = array.arrayBuffer; + this.length = array.length; + this.attributes = arrayType.members; + this.itemSize = arrayType.bytesPerElement; + this.type = type; + this.arrayType = arrayType; +}; + +Buffer.fromStructArray = function fromStructArray (array, type) { + return new Buffer(array.serialize(), array.constructor.serialize(), type); +}; + +/** + * Bind this buffer to a WebGL context. + * @param gl The WebGL context + */ +Buffer.prototype.bind = function bind (gl) { + var type = gl[this.type]; + + if (!this.buffer) { + this.gl = gl; + this.buffer = gl.createBuffer(); + gl.bindBuffer(type, this.buffer); + gl.bufferData(type, this.arrayBuffer, gl.STATIC_DRAW); + + // dump array buffer once it's bound to gl + this.arrayBuffer = null; + } else { + gl.bindBuffer(type, this.buffer); + } +}; + +/** + * Set the attribute pointers in a WebGL context + * @param gl The WebGL context + * @param program The active WebGL program + * @param vertexOffset Index of the starting vertex of the segment + */ +Buffer.prototype.setVertexAttribPointers = function setVertexAttribPointers (gl, program, vertexOffset) { + var this$1 = this; + + for (var j = 0; j < this.attributes.length; j++) { + var member = this$1.attributes[j]; + var attribIndex = program[member.name]; + + if (attribIndex !== undefined) { + gl.vertexAttribPointer( + attribIndex, + member.components, + gl[AttributeType[member.type]], + false, + this$1.arrayType.bytesPerElement, + member.offset + (this$1.arrayType.bytesPerElement * vertexOffset || 0) + ); + } + } +}; + +/** + * Destroy the GL buffer bound to the given WebGL context + * @param gl The WebGL context + */ +Buffer.prototype.destroy = function destroy () { + if (this.buffer) { + this.gl.deleteBuffer(this.buffer); + } +}; + +/** + * @enum {string} BufferType + * @private + * @readonly + */ +Buffer.BufferType = { + VERTEX: 'ARRAY_BUFFER', + ELEMENT: 'ELEMENT_ARRAY_BUFFER' +}; + +module.exports = Buffer; + +},{}],9:[function(require,module,exports){ +'use strict'; + +var util = require('../util/util'); +var Buffer = require('./buffer'); +var ProgramConfiguration = require('./program_configuration'); +var VertexArrayObject = require('../render/vertex_array_object'); + +var BufferGroup = function BufferGroup(programInterface, layers, zoom, arrays) { + var this$1 = this; + + this.layoutVertexBuffer = new Buffer(arrays.layoutVertexArray, + programInterface.layoutVertexArrayType.serialize(), Buffer.BufferType.VERTEX); + + if (arrays.elementArray) { + this.elementBuffer = new Buffer(arrays.elementArray, + programInterface.elementArrayType.serialize(), Buffer.BufferType.ELEMENT); + } + + if (arrays.elementArray2) { + this.elementBuffer2 = new Buffer(arrays.elementArray2, + programInterface.elementArrayType2.serialize(), Buffer.BufferType.ELEMENT); + } + + this.layerData = {}; + for (var i = 0, list = layers; i < list.length; i += 1) { + var layer = list[i]; + + var array = arrays.paintVertexArrays && arrays.paintVertexArrays[layer.id]; + var programConfiguration = ProgramConfiguration.createDynamic(programInterface.paintAttributes || [], layer, zoom); + var paintVertexBuffer = array ? new Buffer(array.array, array.type, Buffer.BufferType.VERTEX) : null; + this$1.layerData[layer.id] = {programConfiguration: programConfiguration, paintVertexBuffer: paintVertexBuffer}; + } + + this.segments = arrays.segments; + this.segments2 = arrays.segments2; + + for (var i$1 = 0, list$1 = [this.segments, this.segments2]; i$1 < list$1.length; i$1 += 1) { + var segments = list$1[i$1]; + + for (var i$2 = 0, list$2 = segments || []; i$2 < list$2.length; i$2 += 1) { + var segment = list$2[i$2]; + + segment.vaos = util.mapObject(this$1.layerData, function () { return new VertexArrayObject(); }); + } + } +}; + +BufferGroup.prototype.destroy = function destroy () { + var this$1 = this; + + this.layoutVertexBuffer.destroy(); + + if (this.elementBuffer) { + this.elementBuffer.destroy(); + } + if (this.elementBuffer2) { + this.elementBuffer2.destroy(); + } + for (var layerId in this.layerData) { + var paintVertexBuffer = this$1.layerData[layerId].paintVertexBuffer; + if (paintVertexBuffer) { + paintVertexBuffer.destroy(); + } + } + for (var i = 0, list = [this.segments, this.segments2]; i < list.length; i += 1) { + var segments = list[i]; + + for (var i$1 = 0, list$1 = segments || []; i$1 < list$1.length; i$1 += 1) { + var segment = list$1[i$1]; + + for (var k in segment.vaos) { + segment.vaos[k].destroy(); + } + } + } +}; + +module.exports = BufferGroup; + +},{"../render/vertex_array_object":39,"../util/util":129,"./buffer":8,"./program_configuration":15}],10:[function(require,module,exports){ +'use strict'; + +var createStructArrayType = require('../util/struct_array'); + +module.exports = createElementArrayType; + +/** + * An element array stores Uint16 indicies of vertexes in a corresponding vertex array. With no + * arguments, it defaults to three components per element, forming triangles. + * @private + */ +function createElementArrayType(components) { + return createStructArrayType({ + members: [{ + type: 'Uint16', + name: 'vertices', + components: components || 3 + }] + }); +} + +},{"../util/struct_array":127}],11:[function(require,module,exports){ +'use strict'; + +/** + * The maximum value of a coordinate in the internal tile coordinate system. Coordinates of + * all source features normalized to this extent upon load. + * + * The value is a consequence of the following: + * + * * Vertex buffer store positions as signed 16 bit integers. + * * One bit is lost for signedness to support tile buffers. + * * One bit is lost because the line vertex buffer packs 1 bit of other data into the int. + * * One bit is lost to support features extending past the extent on the right edge of the tile. + * * This leaves us with 2^13 = 8192 + * + * @private + * @readonly + */ +module.exports = 8192; + +},{}],12:[function(require,module,exports){ +'use strict'; + +var Point = require('point-geometry'); +var loadGeometry = require('./load_geometry'); +var EXTENT = require('./extent'); +var featureFilter = require('feature-filter'); +var createStructArrayType = require('../util/struct_array'); +var Grid = require('grid-index'); +var DictionaryCoder = require('../util/dictionary_coder'); +var vt = require('vector-tile'); +var Protobuf = require('pbf'); +var GeoJSONFeature = require('../util/vectortile_to_geojson'); +var arraysIntersect = require('../util/util').arraysIntersect; + +var intersection = require('../util/intersection_tests'); +var multiPolygonIntersectsBufferedMultiPoint = intersection.multiPolygonIntersectsBufferedMultiPoint; +var multiPolygonIntersectsMultiPolygon = intersection.multiPolygonIntersectsMultiPolygon; +var multiPolygonIntersectsBufferedMultiLine = intersection.multiPolygonIntersectsBufferedMultiLine; + +var FeatureIndexArray = createStructArrayType({ + members: [ + // the index of the feature in the original vectortile + { type: 'Uint32', name: 'featureIndex' }, + // the source layer the feature appears in + { type: 'Uint16', name: 'sourceLayerIndex' }, + // the bucket the feature appears in + { type: 'Uint16', name: 'bucketIndex' } + ] +}); + +var FeatureIndex = function FeatureIndex(coord, overscaling, collisionTile) { + if (coord.grid) { + var serialized = coord; + var rawTileData = overscaling; + coord = serialized.coord; + overscaling = serialized.overscaling; + this.grid = new Grid(serialized.grid); + this.featureIndexArray = new FeatureIndexArray(serialized.featureIndexArray); + this.rawTileData = rawTileData; + this.bucketLayerIDs = serialized.bucketLayerIDs; + } else { + this.grid = new Grid(EXTENT, 16, 0); + this.featureIndexArray = new FeatureIndexArray(); + } + this.coord = coord; + this.overscaling = overscaling; + this.x = coord.x; + this.y = coord.y; + this.z = coord.z - Math.log(overscaling) / Math.LN2; + this.setCollisionTile(collisionTile); +}; + +FeatureIndex.prototype.insert = function insert (feature, bucketIndex) { + var this$1 = this; + + var key = this.featureIndexArray.length; + this.featureIndexArray.emplaceBack(feature.index, feature.sourceLayerIndex, bucketIndex); + var geometry = loadGeometry(feature); + + for (var r = 0; r < geometry.length; r++) { + var ring = geometry[r]; + + var bbox = [Infinity, Infinity, -Infinity, -Infinity]; + for (var i = 0; i < ring.length; i++) { + var p = ring[i]; + bbox[0] = Math.min(bbox[0], p.x); + bbox[1] = Math.min(bbox[1], p.y); + bbox[2] = Math.max(bbox[2], p.x); + bbox[3] = Math.max(bbox[3], p.y); + } + + this$1.grid.insert(key, bbox[0], bbox[1], bbox[2], bbox[3]); + } +}; + +FeatureIndex.prototype.setCollisionTile = function setCollisionTile (collisionTile) { + this.collisionTile = collisionTile; +}; + +FeatureIndex.prototype.serialize = function serialize (transferables) { + var grid = this.grid.toArrayBuffer(); + if (transferables) { + transferables.push(grid); + } + return { + coord: this.coord, + overscaling: this.overscaling, + grid: grid, + featureIndexArray: this.featureIndexArray.serialize(transferables), + bucketLayerIDs: this.bucketLayerIDs + }; +}; + +// Finds features in this tile at a particular position. +FeatureIndex.prototype.query = function query (args, styleLayers) { + if (!this.vtLayers) { + this.vtLayers = new vt.VectorTile(new Protobuf(this.rawTileData)).layers; + this.sourceLayerCoder = new DictionaryCoder(this.vtLayers ? Object.keys(this.vtLayers).sort() : ['_geojsonTileLayer']); + } + + var result = {}; + + var params = args.params || {}, + pixelsToTileUnits = EXTENT / args.tileSize / args.scale, + filter = featureFilter(params.filter); + + // Features are indexed their original geometries. The rendered geometries may + // be buffered, translated or offset. Figure out how much the search radius needs to be + // expanded by to include these features. + var additionalRadius = 0; + for (var id in styleLayers) { + var styleLayer = styleLayers[id]; + var paint = styleLayer.paint; + + var styleLayerDistance = 0; + if (styleLayer.type === 'line') { + styleLayerDistance = getLineWidth(paint) / 2 + Math.abs(paint['line-offset']) + translateDistance(paint['line-translate']); + } else if (styleLayer.type === 'fill') { + styleLayerDistance = translateDistance(paint['fill-translate']); + } else if (styleLayer.type === 'fill-extrusion') { + styleLayerDistance = translateDistance(paint['fill-extrusion-translate']); + } else if (styleLayer.type === 'circle') { + styleLayerDistance = paint['circle-radius'] + translateDistance(paint['circle-translate']); + } + additionalRadius = Math.max(additionalRadius, styleLayerDistance * pixelsToTileUnits); + } + + var queryGeometry = args.queryGeometry.map(function (q) { + return q.map(function (p) { + return new Point(p.x, p.y); + }); + }); + + var minX = Infinity; + var minY = Infinity; + var maxX = -Infinity; + var maxY = -Infinity; + for (var i = 0; i < queryGeometry.length; i++) { + var ring = queryGeometry[i]; + for (var k = 0; k < ring.length; k++) { + var p = ring[k]; + minX = Math.min(minX, p.x); + minY = Math.min(minY, p.y); + maxX = Math.max(maxX, p.x); + maxY = Math.max(maxY, p.y); + } + } + + var matching = this.grid.query(minX - additionalRadius, minY - additionalRadius, maxX + additionalRadius, maxY + additionalRadius); + matching.sort(topDownFeatureComparator); + this.filterMatching(result, matching, this.featureIndexArray, queryGeometry, filter, params.layers, styleLayers, args.bearing, pixelsToTileUnits); + + var matchingSymbols = this.collisionTile.queryRenderedSymbols(queryGeometry, args.scale); + matchingSymbols.sort(); + this.filterMatching(result, matchingSymbols, this.collisionTile.collisionBoxArray, queryGeometry, filter, params.layers, styleLayers, args.bearing, pixelsToTileUnits); + + return result; +}; + +FeatureIndex.prototype.filterMatching = function filterMatching (result, matching, array, queryGeometry, filter, filterLayerIDs, styleLayers, bearing, pixelsToTileUnits) { + var this$1 = this; + + var previousIndex; + for (var k = 0; k < matching.length; k++) { + var index = matching[k]; + + // don't check the same feature more than once + if (index === previousIndex) continue; + previousIndex = index; + + var match = array.get(index); + + var layerIDs = this$1.bucketLayerIDs[match.bucketIndex]; + if (filterLayerIDs && !arraysIntersect(filterLayerIDs, layerIDs)) continue; + + var sourceLayerName = this$1.sourceLayerCoder.decode(match.sourceLayerIndex); + var sourceLayer = this$1.vtLayers[sourceLayerName]; + var feature = sourceLayer.feature(match.featureIndex); + + if (!filter(feature)) continue; + + var geometry = null; + + for (var l = 0; l < layerIDs.length; l++) { + var layerID = layerIDs[l]; + + if (filterLayerIDs && filterLayerIDs.indexOf(layerID) < 0) { + continue; + } + + var styleLayer = styleLayers[layerID]; + if (!styleLayer) continue; + + var translatedPolygon; + if (styleLayer.type !== 'symbol') { + // all symbols already match the style + + if (!geometry) geometry = loadGeometry(feature); + + var paint = styleLayer.paint; + + if (styleLayer.type === 'line') { + translatedPolygon = translate(queryGeometry, + paint['line-translate'], paint['line-translate-anchor'], + bearing, pixelsToTileUnits); + var halfWidth = getLineWidth(paint) / 2 * pixelsToTileUnits; + if (paint['line-offset']) { + geometry = offsetLine(geometry, paint['line-offset'] * pixelsToTileUnits); + } + if (!multiPolygonIntersectsBufferedMultiLine(translatedPolygon, geometry, halfWidth)) continue; + + } else if (styleLayer.type === 'fill' || styleLayer.type === 'fill-extrusion') { + var typePrefix = styleLayer.type; + translatedPolygon = translate(queryGeometry, + paint[(typePrefix + "-translate")], paint[(typePrefix + "-translate-anchor")], + bearing, pixelsToTileUnits); + if (!multiPolygonIntersectsMultiPolygon(translatedPolygon, geometry)) continue; + + } else if (styleLayer.type === 'circle') { + translatedPolygon = translate(queryGeometry, + paint['circle-translate'], paint['circle-translate-anchor'], + bearing, pixelsToTileUnits); + var circleRadius = paint['circle-radius'] * pixelsToTileUnits; + if (!multiPolygonIntersectsBufferedMultiPoint(translatedPolygon, geometry, circleRadius)) continue; + } + } + + var geojsonFeature = new GeoJSONFeature(feature, this$1.z, this$1.x, this$1.y); + geojsonFeature.layer = styleLayer.serialize(); + var layerResult = result[layerID]; + if (layerResult === undefined) { + layerResult = result[layerID] = []; + } + layerResult.push(geojsonFeature); + } + } +}; + +module.exports = FeatureIndex; + +function translateDistance(translate) { + return Math.sqrt(translate[0] * translate[0] + translate[1] * translate[1]); +} + +function topDownFeatureComparator(a, b) { + return b - a; +} + +function getLineWidth(paint) { + if (paint['line-gap-width'] > 0) { + return paint['line-gap-width'] + 2 * paint['line-width']; + } else { + return paint['line-width']; + } +} + +function translate(queryGeometry, translate, translateAnchor, bearing, pixelsToTileUnits) { + if (!translate[0] && !translate[1]) { + return queryGeometry; + } + + translate = Point.convert(translate); + + if (translateAnchor === "viewport") { + translate._rotate(-bearing); + } + + var translated = []; + for (var i = 0; i < queryGeometry.length; i++) { + var ring = queryGeometry[i]; + var translatedRing = []; + for (var k = 0; k < ring.length; k++) { + translatedRing.push(ring[k].sub(translate._mult(pixelsToTileUnits))); + } + translated.push(translatedRing); + } + return translated; +} + +function offsetLine(rings, offset) { + var newRings = []; + var zero = new Point(0, 0); + for (var k = 0; k < rings.length; k++) { + var ring = rings[k]; + var newRing = []; + for (var i = 0; i < ring.length; i++) { + var a = ring[i - 1]; + var b = ring[i]; + var c = ring[i + 1]; + var aToB = i === 0 ? zero : b.sub(a)._unit()._perp(); + var bToC = i === ring.length - 1 ? zero : c.sub(b)._unit()._perp(); + var extrude = aToB._add(bToC)._unit(); + + var cosHalfAngle = extrude.x * bToC.x + extrude.y * bToC.y; + extrude._mult(1 / cosHalfAngle); + + newRing.push(extrude._mult(offset)._add(b)); + } + newRings.push(newRing); + } + return newRings; +} + +},{"../util/dictionary_coder":115,"../util/intersection_tests":122,"../util/struct_array":127,"../util/util":129,"../util/vectortile_to_geojson":130,"./extent":11,"./load_geometry":13,"feature-filter":139,"grid-index":150,"pbf":197,"point-geometry":198,"vector-tile":207}],13:[function(require,module,exports){ +'use strict'; + +var util = require('../util/util'); +var EXTENT = require('./extent'); +var assert = require('assert'); + + +// These bounds define the minimum and maximum supported coordinate values. +// While visible coordinates are within [0, EXTENT], tiles may theoretically +// contain cordinates within [-Infinity, Infinity]. Our range is limited by the +// number of bits used to represent the coordinate. +function createBounds(bits) { + return { + min: -1 * Math.pow(2, bits - 1), + max: Math.pow(2, bits - 1) - 1 + }; +} + +var boundsLookup = { + 15: createBounds(15), + 16: createBounds(16) +}; + +/** + * Loads a geometry from a VectorTileFeature and scales it to the common extent + * used internally. + * @param {VectorTileFeature} feature + * @param {number} [bits=16] The number of signed integer bits available to store + * each coordinate. A warning will be issued if any coordinate will not fits + * in the specified number of bits. + * @private + */ +module.exports = function loadGeometry(feature, bits) { + var bounds = boundsLookup[bits || 16]; + assert(bounds); + + var scale = EXTENT / feature.extent; + var geometry = feature.loadGeometry(); + for (var r = 0; r < geometry.length; r++) { + var ring = geometry[r]; + for (var p = 0; p < ring.length; p++) { + var point = ring[p]; + // round here because mapbox-gl-native uses integers to represent + // points and we need to do the same to avoid renering differences. + point.x = Math.round(point.x * scale); + point.y = Math.round(point.y * scale); + + if (point.x < bounds.min || point.x > bounds.max || point.y < bounds.min || point.y > bounds.max) { + util.warnOnce('Geometry exceeds allowed extent, reduce your vector tile buffer size'); + } + } + } + return geometry; +}; + +},{"../util/util":129,"./extent":11,"assert":135}],14:[function(require,module,exports){ +'use strict'; + +var createStructArrayType = require('../util/struct_array'); + +var PosArray = createStructArrayType({ + members: [{ name: 'a_pos', type: 'Int16', components: 2 }] +}); + +module.exports = PosArray; + +},{"../util/struct_array":127}],15:[function(require,module,exports){ +'use strict'; + +var createVertexArrayType = require('./vertex_array_type'); +var util = require('../util/util'); + +/** + * ProgramConfiguration contains the logic for binding style layer properties and tile + * layer feature data into GL program uniforms and vertex attributes. + * + * Non-data-driven property values are bound to shader uniforms. Data-driven property + * values are bound to vertex attributes. In order to support a uniform GLSL syntax over + * both, [Mapbox GL Shaders](https://github.com/mapbox/mapbox-gl-shaders) defines a `#pragma` + * abstraction, which ProgramConfiguration is responsible for implementing. At runtime, + * it examines the attributes of a particular layer, combines this with fixed knowledge + * about how layers of the particular type are implemented, and determines which uniforms + * and vertex attributes will be required. It can then substitute the appropriate text + * into the shader source code, create and link a program, and bind the uniforms and + * vertex attributes in preparation for drawing. + * + * @private + */ +var ProgramConfiguration = function ProgramConfiguration() { + this.attributes = []; + this.uniforms = []; + this.interpolationUniforms = []; + this.pragmas = {vertex: {}, fragment: {}}; + this.cacheKey = ''; +}; + +ProgramConfiguration.createDynamic = function createDynamic (attributes, layer, zoom) { + var self = new ProgramConfiguration(); + + for (var i = 0, list = attributes; i < list.length; i += 1) { + var attributeConfig = list[i]; + + var attribute = normalizePaintAttribute(attributeConfig, layer); + var name = attribute.name.slice(2); + + if (layer.isPaintValueFeatureConstant(attribute.property)) { + self.addZoomAttribute(name, attribute); + } else if (layer.isPaintValueZoomConstant(attribute.property)) { + self.addPropertyAttribute(name, attribute); + } else { + self.addZoomAndPropertyAttribute(name, attribute, layer, zoom); + } + } + self.PaintVertexArray = createVertexArrayType(self.attributes); + + return self; +}; + +ProgramConfiguration.createStatic = function createStatic (uniformNames) { + var self = new ProgramConfiguration(); + + for (var i = 0, list = uniformNames; i < list.length; i += 1) { + var name = list[i]; + + self.addUniform(name, ("u_" + name)); + } + return self; +}; + +ProgramConfiguration.prototype.addUniform = function addUniform (name, inputName) { + var pragmas = this.getPragmas(name); + + pragmas.define.push(("uniform {precision} {type} " + inputName + ";")); + pragmas.initialize.push(("{precision} {type} " + name + " = " + inputName + ";")); + + this.cacheKey += "/u_" + name; +}; + +ProgramConfiguration.prototype.addZoomAttribute = function addZoomAttribute (name, attribute) { + this.uniforms.push(attribute); + this.addUniform(name, attribute.name); +}; + +ProgramConfiguration.prototype.addPropertyAttribute = function addPropertyAttribute (name, attribute) { + var pragmas = this.getPragmas(name); + + this.attributes.push(attribute); + + pragmas.define.push(("varying {precision} {type} " + name + ";")); + + pragmas.vertex.define.push(("attribute {precision} {type} " + (attribute.name) + ";")); + pragmas.vertex.initialize.push((name + " = " + (attribute.name) + " / " + (attribute.multiplier) + ".0;")); + + this.cacheKey += "/a_" + name; +}; + +ProgramConfiguration.prototype.addZoomAndPropertyAttribute = function addZoomAndPropertyAttribute (name, attribute, layer, zoom) { + var this$1 = this; + + var pragmas = this.getPragmas(name); + + pragmas.define.push(("varying {precision} {type} " + name + ";")); + + // Pick the index of the first offset to add to the buffers. + var numStops = 0; + var zoomLevels = layer.getPaintValueStopZoomLevels(attribute.property); + while (numStops < zoomLevels.length && zoomLevels[numStops] < zoom) numStops++; + var stopOffset = Math.max(0, Math.min(zoomLevels.length - 4, numStops - 2)); + + var tName = "u_" + name + "_t"; + + pragmas.vertex.define.push(("uniform lowp float " + tName + ";")); + + this.interpolationUniforms.push({ + name: tName, + property: attribute.property, + stopOffset: stopOffset + }); + + // Find the four closest stops, ideally with two on each side of the zoom level. + var zoomStops = []; + for (var s = 0; s < 4; s++) { + zoomStops.push(zoomLevels[Math.min(stopOffset + s, zoomLevels.length - 1)]); + } + + var componentNames = []; + + if (attribute.components === 1) { + this.attributes.push(util.extend({}, attribute, { + components: 4, + zoomStops: zoomStops + })); + pragmas.vertex.define.push(("attribute {precision} vec4 " + (attribute.name) + ";")); + componentNames.push(attribute.name); + + } else { + for (var k = 0; k < 4; k++) { + var componentName = attribute.name + k; + componentNames.push(componentName); + + this$1.attributes.push(util.extend({}, attribute, { + name: componentName, + zoomStops: [zoomStops[k]] + })); + pragmas.vertex.define.push(("attribute {precision} {type} " + componentName + ";")); + } + } + pragmas.vertex.initialize.push((name + " = evaluate_zoom_function_" + (attribute.components) + "( " + (componentNames.join(', ')) + ", " + tName + ") / " + (attribute.multiplier) + ".0;")); + + this.cacheKey += "/z_" + name; +}; + +ProgramConfiguration.prototype.getPragmas = function getPragmas (name) { + if (!this.pragmas[name]) { + this.pragmas[name] = {define: [], initialize: []}; + this.pragmas[name].fragment = {define: [], initialize: []}; + this.pragmas[name].vertex = {define: [], initialize: []}; + } + return this.pragmas[name]; +}; + + ProgramConfiguration.prototype.applyPragmas = function applyPragmas (source, shaderType) { + var this$1 = this; + + return source.replace(/#pragma mapbox: ([\w]+) ([\w]+) ([\w]+) ([\w]+)/g, function (match, operation, precision, type, name) { + return this$1.pragmas[name][operation].concat(this$1.pragmas[name][shaderType][operation]) + .join('\n') + .replace(/{type}/g, type) + .replace(/{precision}/g, precision); + }); + }; + +ProgramConfiguration.prototype.populatePaintArray = function populatePaintArray (layer, paintArray, length, globalProperties, featureProperties) { + var start = paintArray.length; + paintArray.resize(length); + + for (var i$1 = 0, list = this.attributes; i$1 < list.length; i$1 += 1) { + var attribute = list[i$1]; + + var value = getPaintAttributeValue(attribute, layer, globalProperties, featureProperties); + + for (var i = start; i < length; i++) { + var vertex = paintArray.get(i); + if (attribute.components === 4) { + for (var c = 0; c < 4; c++) { + vertex[attribute.name + c] = value[c] * attribute.multiplier; + } + } else { + vertex[attribute.name] = value * attribute.multiplier; + } + } + } +}; + +ProgramConfiguration.prototype.setUniforms = function setUniforms (gl, program, layer, globalProperties) { + for (var i = 0, list = this.uniforms; i < list.length; i += 1) { + var uniform = list[i]; + + var value = layer.getPaintValue(uniform.property, globalProperties); + if (uniform.components === 4) { + gl.uniform4fv(program[uniform.name], value); + } else { + gl.uniform1f(program[uniform.name], value); + } + } + for (var i$1 = 0, list$1 = this.interpolationUniforms; i$1 < list$1.length; i$1 += 1) { + // stopInterp indicates which stops need to be interpolated. + // If stopInterp is 3.5 then interpolate half way between stops 3 and 4. + var uniform$1 = list$1[i$1]; + + var stopInterp = layer.getPaintInterpolationT(uniform$1.property, globalProperties); + // We can only store four stop values in the buffers. stopOffset is the number of stops that come + // before the stops that were added to the buffers. + gl.uniform1f(program[uniform$1.name], Math.max(0, Math.min(4, stopInterp - uniform$1.stopOffset))); + } +}; + +function getPaintAttributeValue(attribute, layer, globalProperties, featureProperties) { + if (!attribute.zoomStops) { + return layer.getPaintValue(attribute.property, globalProperties, featureProperties); + } + // add one multi-component value like color0, or pack multiple single-component values into a four component attribute + var values = attribute.zoomStops.map(function (zoom) { return layer.getPaintValue( + attribute.property, util.extend({}, globalProperties, {zoom: zoom}), featureProperties); }); + + return values.length === 1 ? values[0] : values; +} + +function normalizePaintAttribute(attribute, layer) { + var name = attribute.property.replace(((layer.type) + "-"), '').replace(/-/g, '_'); + var isColor = layer._paintSpecifications[attribute.property].type === 'color'; + + return util.extend({ + name: ("a_" + name), + components: isColor ? 4 : 1, + multiplier: isColor ? 255 : 1 + }, attribute); +} + +module.exports = ProgramConfiguration; + +},{"../util/util":129,"./vertex_array_type":17}],16:[function(require,module,exports){ +'use strict'; + +var createStructArrayType = require('../util/struct_array'); + +var RasterBoundsArray = createStructArrayType({ + members: [ + { name: 'a_pos', type: 'Int16', components: 2 }, + { name: 'a_texture_pos', type: 'Int16', components: 2 } + ] +}); + +module.exports = RasterBoundsArray; + +},{"../util/struct_array":127}],17:[function(require,module,exports){ +'use strict'; + +var createStructArrayType = require('../util/struct_array'); + +module.exports = createVertexArrayType; + +/** + * A vertex array stores data for each vertex in a geometry. Elements are aligned to 4 byte + * boundaries for best performance in WebGL. + * @private + */ +function createVertexArrayType(members) { + return createStructArrayType({ + members: members, + alignment: 4 + }); +} + +},{"../util/struct_array":127}],18:[function(require,module,exports){ +'use strict'; +// + +/** + * A coordinate is a column, row, zoom combination, often used + * as the data component of a tile. + * + * @param {number} column + * @param {number} row + * @param {number} zoom + * @private + */ +var Coordinate = function Coordinate(column , row , zoom ) { + this.column = column; + this.row = row; + this.zoom = zoom; +}; + +/** + * Create a clone of this coordinate that can be mutated without + * changing the original coordinate + * + * @returns {Coordinate} clone + * @private + * var coord = new Coordinate(0, 0, 0); + * var c2 = coord.clone(); + * // since coord is cloned, modifying a property of c2 does + * // not modify it. + * c2.zoom = 2; + */ +Coordinate.prototype.clone = function clone () { + return new Coordinate(this.column, this.row, this.zoom); +}; + +/** + * Zoom this coordinate to a given zoom level. This returns a new + * coordinate object, not mutating the old one. + * + * @param {number} zoom + * @returns {Coordinate} zoomed coordinate + * @private + * @example + * var coord = new Coordinate(0, 0, 0); + * var c2 = coord.zoomTo(1); + * c2 // equals new Coordinate(0, 0, 1); + */ +Coordinate.prototype.zoomTo = function zoomTo (zoom ) { return this.clone()._zoomTo(zoom); }; + +/** + * Subtract the column and row values of this coordinate from those + * of another coordinate. The other coordinat will be zoomed to the + * same level as `this` before the subtraction occurs + * + * @param {Coordinate} c other coordinate + * @returns {Coordinate} result + * @private + */ +Coordinate.prototype.sub = function sub (c ) { return this.clone()._sub(c); }; + +Coordinate.prototype._zoomTo = function _zoomTo (zoom ) { + var scale = Math.pow(2, zoom - this.zoom); + this.column *= scale; + this.row *= scale; + this.zoom = zoom; + return this; +}; + +Coordinate.prototype._sub = function _sub (c ) { + c = c.zoomTo(this.zoom); + this.column -= c.column; + this.row -= c.row; + return this; +}; + +module.exports = Coordinate; + +},{}],19:[function(require,module,exports){ +'use strict'; + +var wrap = require('../util/util').wrap; + +/** + * A `LngLat` object represents a given longitude and latitude coordinate, measured in degrees. + * + * Mapbox GL uses longitude, latitude coordinate order (as opposed to latitude, longitude) to match GeoJSON. + * + * Note that any Mapbox GL method that accepts a `LngLat` object as an argument or option + * can also accept an `Array` of two numbers and will perform an implicit conversion. + * This flexible type is documented as [`LngLatLike`](#LngLatLike). + * + * @param {number} lng Longitude, measured in degrees. + * @param {number} lat Latitude, measured in degrees. + * @example + * var ll = new mapboxgl.LngLat(-73.9749, 40.7736); + * @see [Get coordinates of the mouse pointer](https://www.mapbox.com/mapbox-gl-js/example/mouse-position/) + * @see [Display a popup](https://www.mapbox.com/mapbox-gl-js/example/popup/) + * @see [Highlight features within a bounding box](https://www.mapbox.com/mapbox-gl-js/example/using-box-queryrenderedfeatures/) + * @see [Create a timeline animation](https://www.mapbox.com/mapbox-gl-js/example/timeline-animation/) + */ +var LngLat = function LngLat(lng, lat) { + if (isNaN(lng) || isNaN(lat)) { + throw new Error(("Invalid LngLat object: (" + lng + ", " + lat + ")")); + } + this.lng = +lng; + this.lat = +lat; + if (this.lat > 90 || this.lat < -90) { + throw new Error('Invalid LngLat latitude value: must be between -90 and 90'); + } +}; + +/** + * Returns a new `LngLat` object whose longitude is wrapped to the range (-180, 180). + * + * @returns {LngLat} The wrapped `LngLat` object. + * @example + * var ll = new mapboxgl.LngLat(286.0251, 40.7736); + * var wrapped = ll.wrap(); + * wrapped.lng; // = -73.9749 + */ +LngLat.prototype.wrap = function wrap$1 () { + return new LngLat(wrap(this.lng, -180, 180), this.lat); +}; + +/** + * Returns the coordinates represented as an array of two numbers. + * + * @returns {Array} The coordinates represeted as an array of longitude and latitude. + * @example + * var ll = new mapboxgl.LngLat(-73.9749, 40.7736); + * ll.toArray(); // = [-73.9749, 40.7736] + */ +LngLat.prototype.toArray = function toArray () { + return [this.lng, this.lat]; +}; + +/** + * Returns the coordinates represent as a string. + * + * @returns {string} The coordinates represented as a string of the format `'LngLat(lng, lat)'`. + * @example + * var ll = new mapboxgl.LngLat(-73.9749, 40.7736); + * ll.toString(); // = "LngLat(-73.9749, 40.7736)" + */ +LngLat.prototype.toString = function toString () { + return ("LngLat(" + (this.lng) + ", " + (this.lat) + ")"); +}; + +/** + * Converts an array of two numbers to a `LngLat` object. + * + * If a `LngLat` object is passed in, the function returns it unchanged. + * + * @param {LngLatLike} input An array of two numbers to convert, or a `LngLat` object to return. + * @returns {LngLat} A new `LngLat` object, if a conversion occurred, or the original `LngLat` object. + * @example + * var arr = [-73.9749, 40.7736]; + * var ll = mapboxgl.LngLat.convert(arr); + * ll; // = LngLat {lng: -73.9749, lat: 40.7736} + */ +LngLat.convert = function (input) { + if (input instanceof LngLat) { + return input; + } else if (input && input.hasOwnProperty('lng') && input.hasOwnProperty('lat')) { + return new LngLat(input.lng, input.lat); + } else if (Array.isArray(input) && input.length === 2) { + return new LngLat(input[0], input[1]); + } else { + throw new Error("`LngLatLike` argument must be specified as a LngLat instance, an object {lng: , lat: }, or an array of [, ]"); + } +}; + +module.exports = LngLat; + +},{"../util/util":129}],20:[function(require,module,exports){ +'use strict'; + +var LngLat = require('./lng_lat'); + +/** + * A `LngLatBounds` object represents a geographical bounding box, + * defined by its southwest and northeast points in longitude and latitude. + * + * If no arguments are provided to the constructor, a `null` bounding box is created. + * + * Note that any Mapbox GL method that accepts a `LngLatBounds` object as an argument or option + * can also accept an `Array` of two [`LngLatLike`](#LngLatLike) constructs and will perform an implicit conversion. + * This flexible type is documented as [`LngLatBoundsLike`](#LngLatBoundsLike). + * + * @param {LngLatLike} [sw] The southwest corner of the bounding box. + * @param {LngLatLike} [ne] The northeast corner of the bounding box. + * @example + * var sw = new mapboxgl.LngLat(-73.9876, 40.7661); + * var ne = new mapboxgl.LngLat(-73.9397, 40.8002); + * var llb = new mapboxgl.LngLatBounds(sw, ne); + */ +var LngLatBounds = function LngLatBounds(sw, ne) { + if (!sw) { + return; + } else if (ne) { + this.setSouthWest(sw).setNorthEast(ne); + } else if (sw.length === 4) { + this.setSouthWest([sw[0], sw[1]]).setNorthEast([sw[2], sw[3]]); + } else { + this.setSouthWest(sw[0]).setNorthEast(sw[1]); + } +}; + +/** + * Set the northeast corner of the bounding box + * + * @param {LngLatLike} ne + * @returns {LngLatBounds} `this` + */ +LngLatBounds.prototype.setNorthEast = function setNorthEast (ne) { + this._ne = LngLat.convert(ne); + return this; +}; + +/** + * Set the southwest corner of the bounding box + * + * @param {LngLatLike} sw + * @returns {LngLatBounds} `this` + */ +LngLatBounds.prototype.setSouthWest = function setSouthWest (sw) { + this._sw = LngLat.convert(sw); + return this; +}; + +/** + * Extend the bounds to include a given LngLat or LngLatBounds. + * + * @param {LngLat|LngLatBounds} obj object to extend to + * @returns {LngLatBounds} `this` + */ +LngLatBounds.prototype.extend = function extend (obj) { + var sw = this._sw, + ne = this._ne; + var sw2, ne2; + + if (obj instanceof LngLat) { + sw2 = obj; + ne2 = obj; + + } else if (obj instanceof LngLatBounds) { + sw2 = obj._sw; + ne2 = obj._ne; + + if (!sw2 || !ne2) return this; + + } else { + if (Array.isArray(obj)) { + if (obj.every(Array.isArray)) { + return this.extend(LngLatBounds.convert(obj)); + } else { + return this.extend(LngLat.convert(obj)); + } + } + return this; + } + + if (!sw && !ne) { + this._sw = new LngLat(sw2.lng, sw2.lat); + this._ne = new LngLat(ne2.lng, ne2.lat); + + } else { + sw.lng = Math.min(sw2.lng, sw.lng); + sw.lat = Math.min(sw2.lat, sw.lat); + ne.lng = Math.max(ne2.lng, ne.lng); + ne.lat = Math.max(ne2.lat, ne.lat); + } + + return this; +}; + +/** + * Returns the geographical coordinate equidistant from the bounding box's corners. + * + * @returns {LngLat} The bounding box's center. + * @example + * var llb = new mapboxgl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]); + * llb.getCenter(); // = LngLat {lng: -73.96365, lat: 40.78315} + */ +LngLatBounds.prototype.getCenter = function getCenter () { + return new LngLat((this._sw.lng + this._ne.lng) / 2, (this._sw.lat + this._ne.lat) / 2); +}; + +/** + * Returns the southwest corner of the bounding box. + * + * @returns {LngLat} The southwest corner of the bounding box. + */ +LngLatBounds.prototype.getSouthWest = function getSouthWest () { return this._sw; }; + +/** +* Returns the northeast corner of the bounding box. +* +* @returns {LngLat} The northeast corner of the bounding box. + */ +LngLatBounds.prototype.getNorthEast = function getNorthEast () { return this._ne; }; + +/** +* Returns the northwest corner of the bounding box. +* +* @returns {LngLat} The northwest corner of the bounding box. + */ +LngLatBounds.prototype.getNorthWest = function getNorthWest () { return new LngLat(this.getWest(), this.getNorth()); }; + +/** +* Returns the southeast corner of the bounding box. +* +* @returns {LngLat} The southeast corner of the bounding box. + */ +LngLatBounds.prototype.getSouthEast = function getSouthEast () { return new LngLat(this.getEast(), this.getSouth()); }; + +/** +* Returns the west edge of the bounding box. +* +* @returns {number} The west edge of the bounding box. + */ +LngLatBounds.prototype.getWest = function getWest () { return this._sw.lng; }; + +/** +* Returns the south edge of the bounding box. +* +* @returns {number} The south edge of the bounding box. + */ +LngLatBounds.prototype.getSouth = function getSouth () { return this._sw.lat; }; + +/** +* Returns the east edge of the bounding box. +* +* @returns {number} The east edge of the bounding box. + */ +LngLatBounds.prototype.getEast = function getEast () { return this._ne.lng; }; + +/** +* Returns the north edge of the bounding box. +* +* @returns {number} The north edge of the bounding box. + */ +LngLatBounds.prototype.getNorth = function getNorth () { return this._ne.lat; }; + +/** + * Returns the bounding box represented as an array. + * + * @returns {Array>} The bounding box represented as an array, consisting of the + * southwest and northeast coordinates of the bounding represented as arrays of numbers. + * @example + * var llb = new mapboxgl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]); + * llb.toArray(); // = [[-73.9876, 40.7661], [-73.9397, 40.8002]] + */ +LngLatBounds.prototype.toArray = function toArray () { + return [this._sw.toArray(), this._ne.toArray()]; +}; + +/** + * Return the bounding box represented as a string. + * + * @returns {string} The bounding box represents as a string of the format + * `'LngLatBounds(LngLat(lng, lat), LngLat(lng, lat))'`. + * @example + * var llb = new mapboxgl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]); + * llb.toString(); // = "LngLatBounds(LngLat(-73.9876, 40.7661), LngLat(-73.9397, 40.8002))" + */ +LngLatBounds.prototype.toString = function toString () { + return ("LngLatBounds(" + (this._sw.toString()) + ", " + (this._ne.toString()) + ")"); +}; + +/** + * Converts an array to a `LngLatBounds` object. + * + * If a `LngLatBounds` object is passed in, the function returns it unchanged. + * + * Internally, the function calls `LngLat#convert` to convert arrays to `LngLat` values. + * + * @param {LngLatBoundsLike} input An array of two coordinates to convert, or a `LngLatBounds` object to return. + * @returns {LngLatBounds} A new `LngLatBounds` object, if a conversion occurred, or the original `LngLatBounds` object. + * @example + * var arr = [[-73.9876, 40.7661], [-73.9397, 40.8002]]; + * var llb = mapboxgl.LngLatBounds.convert(arr); + * llb; // = LngLatBounds {_sw: LngLat {lng: -73.9876, lat: 40.7661}, _ne: LngLat {lng: -73.9397, lat: 40.8002}} + */ +LngLatBounds.convert = function (input) { + if (!input || input instanceof LngLatBounds) return input; + return new LngLatBounds(input); +}; + +module.exports = LngLatBounds; + +},{"./lng_lat":19}],21:[function(require,module,exports){ +'use strict'; + +var LngLat = require('./lng_lat'), + Point = require('point-geometry'), + Coordinate = require('./coordinate'), + util = require('../util/util'), + interp = require('../util/interpolate'), + TileCoord = require('../source/tile_coord'), + EXTENT = require('../data/extent'), + glmatrix = require('@mapbox/gl-matrix'); + +var vec4 = glmatrix.vec4, + mat4 = glmatrix.mat4, + mat2 = glmatrix.mat2; + +/** + * A single transform, generally used for a single tile to be + * scaled, rotated, and zoomed. + * @private + */ +var Transform = function Transform(minZoom, maxZoom, renderWorldCopies) { + this.tileSize = 512; // constant + + this._renderWorldCopies = renderWorldCopies === undefined ? true : renderWorldCopies; + this._minZoom = minZoom || 0; + this._maxZoom = maxZoom || 22; + + this.latRange = [-85.05113, 85.05113]; + + this.width = 0; + this.height = 0; + this._center = new LngLat(0, 0); + this.zoom = 0; + this.angle = 0; + this._fov = 0.6435011087932844; + this._pitch = 0; + this._unmodified = true; +}; + +var prototypeAccessors = { minZoom: {},maxZoom: {},worldSize: {},centerPoint: {},size: {},bearing: {},pitch: {},fov: {},zoom: {},center: {},unmodified: {},x: {},y: {},point: {} }; + +prototypeAccessors.minZoom.get = function () { return this._minZoom; }; +prototypeAccessors.minZoom.set = function (zoom) { + if (this._minZoom === zoom) return; + this._minZoom = zoom; + this.zoom = Math.max(this.zoom, zoom); +}; + +prototypeAccessors.maxZoom.get = function () { return this._maxZoom; }; +prototypeAccessors.maxZoom.set = function (zoom) { + if (this._maxZoom === zoom) return; + this._maxZoom = zoom; + this.zoom = Math.min(this.zoom, zoom); +}; + +prototypeAccessors.worldSize.get = function () { + return this.tileSize * this.scale; +}; + +prototypeAccessors.centerPoint.get = function () { + return this.size._div(2); +}; + +prototypeAccessors.size.get = function () { + return new Point(this.width, this.height); +}; + +prototypeAccessors.bearing.get = function () { + return -this.angle / Math.PI * 180; +}; +prototypeAccessors.bearing.set = function (bearing) { + var b = -util.wrap(bearing, -180, 180) * Math.PI / 180; + if (this.angle === b) return; + this._unmodified = false; + this.angle = b; + this._calcMatrices(); + + // 2x2 matrix for rotating points + this.rotationMatrix = mat2.create(); + mat2.rotate(this.rotationMatrix, this.rotationMatrix, this.angle); +}; + +prototypeAccessors.pitch.get = function () { + return this._pitch / Math.PI * 180; +}; +prototypeAccessors.pitch.set = function (pitch) { + var p = util.clamp(pitch, 0, 60) / 180 * Math.PI; + if (this._pitch === p) return; + this._unmodified = false; + this._pitch = p; + this._calcMatrices(); +}; + +prototypeAccessors.fov.get = function () { + return this._fov / Math.PI * 180; +}; +prototypeAccessors.fov.set = function (fov) { + fov = Math.max(0.01, Math.min(60, fov)); + if (this._fov === fov) return; + this._unmodified = false; + this._fov = fov / 180 * Math.PI; + this._calcMatrices(); +}; + +prototypeAccessors.zoom.get = function () { return this._zoom; }; +prototypeAccessors.zoom.set = function (zoom) { + var z = Math.min(Math.max(zoom, this.minZoom), this.maxZoom); + if (this._zoom === z) return; + this._unmodified = false; + this._zoom = z; + this.scale = this.zoomScale(z); + this.tileZoom = Math.floor(z); + this.zoomFraction = z - this.tileZoom; + this._constrain(); + this._calcMatrices(); +}; + +prototypeAccessors.center.get = function () { return this._center; }; +prototypeAccessors.center.set = function (center) { + if (center.lat === this._center.lat && center.lng === this._center.lng) return; + this._unmodified = false; + this._center = center; + this._constrain(); + this._calcMatrices(); +}; + +/** + * Return a zoom level that will cover all tiles the transform + * @param {Object} options + * @param {number} options.tileSize + * @param {boolean} options.roundZoom + * @returns {number} zoom level + */ +Transform.prototype.coveringZoomLevel = function coveringZoomLevel (options) { + return (options.roundZoom ? Math.round : Math.floor)( + this.zoom + this.scaleZoom(this.tileSize / options.tileSize) + ); +}; + +/** + * Return all coordinates that could cover this transform for a covering + * zoom level. + * @param {Object} options + * @param {number} options.tileSize + * @param {number} options.minzoom + * @param {number} options.maxzoom + * @param {boolean} options.roundZoom + * @param {boolean} options.reparseOverscaled + * @param {boolean} options.renderWorldCopies + * @returns {Array} tiles + */ +Transform.prototype.coveringTiles = function coveringTiles (options) { + var z = this.coveringZoomLevel(options); + var actualZ = z; + + if (z < options.minzoom) return []; + if (z > options.maxzoom) z = options.maxzoom; + + var centerCoord = this.pointCoordinate(this.centerPoint, z); + var centerPoint = new Point(centerCoord.column - 0.5, centerCoord.row - 0.5); + var cornerCoords = [ + this.pointCoordinate(new Point(0, 0), z), + this.pointCoordinate(new Point(this.width, 0), z), + this.pointCoordinate(new Point(this.width, this.height), z), + this.pointCoordinate(new Point(0, this.height), z) + ]; + return TileCoord.cover(z, cornerCoords, options.reparseOverscaled ? actualZ : z, this._renderWorldCopies) + .sort(function (a, b) { return centerPoint.dist(a) - centerPoint.dist(b); }); +}; + +Transform.prototype.resize = function resize (width, height) { + this.width = width; + this.height = height; + + this.pixelsToGLUnits = [2 / width, -2 / height]; + this._constrain(); + this._calcMatrices(); +}; + +prototypeAccessors.unmodified.get = function () { return this._unmodified; }; + +Transform.prototype.zoomScale = function zoomScale (zoom) { return Math.pow(2, zoom); }; +Transform.prototype.scaleZoom = function scaleZoom (scale) { return Math.log(scale) / Math.LN2; }; + +Transform.prototype.project = function project (lnglat) { + return new Point( + this.lngX(lnglat.lng), + this.latY(lnglat.lat)); +}; + +Transform.prototype.unproject = function unproject (point) { + return new LngLat( + this.xLng(point.x), + this.yLat(point.y)); +}; + +prototypeAccessors.x.get = function () { return this.lngX(this.center.lng); }; +prototypeAccessors.y.get = function () { return this.latY(this.center.lat); }; + +prototypeAccessors.point.get = function () { return new Point(this.x, this.y); }; + +/** + * latitude to absolute x coord + * @param {number} lon + * @returns {number} pixel coordinate + */ +Transform.prototype.lngX = function lngX (lng) { + return (180 + lng) * this.worldSize / 360; +}; +/** + * latitude to absolute y coord + * @param {number} lat + * @returns {number} pixel coordinate + */ +Transform.prototype.latY = function latY (lat) { + var y = 180 / Math.PI * Math.log(Math.tan(Math.PI / 4 + lat * Math.PI / 360)); + return (180 - y) * this.worldSize / 360; +}; + +Transform.prototype.xLng = function xLng (x) { + return x * 360 / this.worldSize - 180; +}; +Transform.prototype.yLat = function yLat (y) { + var y2 = 180 - y * 360 / this.worldSize; + return 360 / Math.PI * Math.atan(Math.exp(y2 * Math.PI / 180)) - 90; +}; + +Transform.prototype.setLocationAtPoint = function setLocationAtPoint (lnglat, point) { + var translate = this.pointCoordinate(point)._sub(this.pointCoordinate(this.centerPoint)); + this.center = this.coordinateLocation(this.locationCoordinate(lnglat)._sub(translate)); +}; + +/** + * Given a location, return the screen point that corresponds to it + * @param {LngLat} lnglat location + * @returns {Point} screen point + */ +Transform.prototype.locationPoint = function locationPoint (lnglat) { + return this.coordinatePoint(this.locationCoordinate(lnglat)); +}; + +/** + * Given a point on screen, return its lnglat + * @param {Point} p screen point + * @returns {LngLat} lnglat location + */ +Transform.prototype.pointLocation = function pointLocation (p) { + return this.coordinateLocation(this.pointCoordinate(p)); +}; + +/** + * Given a geographical lnglat, return an unrounded + * coordinate that represents it at this transform's zoom level. + * @param {LngLat} lnglat + * @returns {Coordinate} + */ +Transform.prototype.locationCoordinate = function locationCoordinate (lnglat) { + return new Coordinate( + this.lngX(lnglat.lng) / this.tileSize, + this.latY(lnglat.lat) / this.tileSize, + this.zoom).zoomTo(this.tileZoom); +}; + +/** + * Given a Coordinate, return its geographical position. + * @param {Coordinate} coord + * @returns {LngLat} lnglat + */ +Transform.prototype.coordinateLocation = function coordinateLocation (coord) { + var zoomedCoord = coord.zoomTo(this.zoom); + return new LngLat( + this.xLng(zoomedCoord.column * this.tileSize), + this.yLat(zoomedCoord.row * this.tileSize)); +}; + +Transform.prototype.pointCoordinate = function pointCoordinate (p, zoom) { + if (zoom === undefined) zoom = this.tileZoom; + + var targetZ = 0; + // since we don't know the correct projected z value for the point, + // unproject two points to get a line and then find the point on that + // line with z=0 + + var coord0 = [p.x, p.y, 0, 1]; + var coord1 = [p.x, p.y, 1, 1]; + + vec4.transformMat4(coord0, coord0, this.pixelMatrixInverse); + vec4.transformMat4(coord1, coord1, this.pixelMatrixInverse); + + var w0 = coord0[3]; + var w1 = coord1[3]; + var x0 = coord0[0] / w0; + var x1 = coord1[0] / w1; + var y0 = coord0[1] / w0; + var y1 = coord1[1] / w1; + var z0 = coord0[2] / w0; + var z1 = coord1[2] / w1; + + var t = z0 === z1 ? 0 : (targetZ - z0) / (z1 - z0); + + return new Coordinate( + interp(x0, x1, t) / this.tileSize, + interp(y0, y1, t) / this.tileSize, + this.zoom)._zoomTo(zoom); +}; + +/** + * Given a coordinate, return the screen point that corresponds to it + * @param {Coordinate} coord + * @returns {Point} screen point + */ +Transform.prototype.coordinatePoint = function coordinatePoint (coord) { + var zoomedCoord = coord.zoomTo(this.zoom); + var p = [zoomedCoord.column * this.tileSize, zoomedCoord.row * this.tileSize, 0, 1]; + vec4.transformMat4(p, p, this.pixelMatrix); + return new Point(p[0] / p[3], p[1] / p[3]); +}; + +/** + * Calculate the posMatrix that, given a tile coordinate, would be used to display the tile on a map. + * @param {TileCoord} tileCoord + * @param {number} maxZoom maximum source zoom to account for overscaling + */ +Transform.prototype.calculatePosMatrix = function calculatePosMatrix (tileCoord, maxZoom) { + // if z > maxzoom then the tile is actually a overscaled maxzoom tile, + // so calculate the matrix the maxzoom tile would use. + var coord = tileCoord.toCoordinate(maxZoom); + var scale = this.worldSize / this.zoomScale(coord.zoom); + + var posMatrix = mat4.identity(new Float64Array(16)); + mat4.translate(posMatrix, posMatrix, [coord.column * scale, coord.row * scale, 0]); + mat4.scale(posMatrix, posMatrix, [scale / EXTENT, scale / EXTENT, 1]); + mat4.multiply(posMatrix, this.projMatrix, posMatrix); + + return new Float32Array(posMatrix); +}; + +Transform.prototype._constrain = function _constrain () { + if (!this.center || !this.width || !this.height || this._constraining) return; + + this._constraining = true; + + var minY, maxY, minX, maxX, sy, sx, x2, y2; + var size = this.size, + unmodified = this._unmodified; + + if (this.latRange) { + minY = this.latY(this.latRange[1]); + maxY = this.latY(this.latRange[0]); + sy = maxY - minY < size.y ? size.y / (maxY - minY) : 0; + } + + if (this.lngRange) { + minX = this.lngX(this.lngRange[0]); + maxX = this.lngX(this.lngRange[1]); + sx = maxX - minX < size.x ? size.x / (maxX - minX) : 0; + } + + // how much the map should scale to fit the screen into given latitude/longitude ranges + var s = Math.max(sx || 0, sy || 0); + + if (s) { + this.center = this.unproject(new Point( + sx ? (maxX + minX) / 2 : this.x, + sy ? (maxY + minY) / 2 : this.y)); + this.zoom += this.scaleZoom(s); + this._unmodified = unmodified; + this._constraining = false; + return; + } + + if (this.latRange) { + var y = this.y, + h2 = size.y / 2; + + if (y - h2 < minY) y2 = minY + h2; + if (y + h2 > maxY) y2 = maxY - h2; + } + + if (this.lngRange) { + var x = this.x, + w2 = size.x / 2; + + if (x - w2 < minX) x2 = minX + w2; + if (x + w2 > maxX) x2 = maxX - w2; + } + + // pan the map if the screen goes off the range + if (x2 !== undefined || y2 !== undefined) { + this.center = this.unproject(new Point( + x2 !== undefined ? x2 : this.x, + y2 !== undefined ? y2 : this.y)); + } + + this._unmodified = unmodified; + this._constraining = false; +}; + +Transform.prototype._calcMatrices = function _calcMatrices () { + if (!this.height) return; + + this.cameraToCenterDistance = 0.5 / Math.tan(this._fov / 2) * this.height; + + // Find the distance from the center point [width/2, height/2] to the + // center top point [width/2, 0] in Z units, using the law of sines. + // 1 Z unit is equivalent to 1 horizontal px at the center of the map + // (the distance between[width/2, height/2] and [width/2 + 1, height/2]) + var halfFov = this._fov / 2; + var groundAngle = Math.PI / 2 + this._pitch; + var topHalfSurfaceDistance = Math.sin(halfFov) * this.cameraToCenterDistance / Math.sin(Math.PI - groundAngle - halfFov); + + // Calculate z distance of the farthest fragment that should be rendered. + var furthestDistance = Math.cos(Math.PI / 2 - this._pitch) * topHalfSurfaceDistance + this.cameraToCenterDistance; + // Add a bit extra to avoid precision problems when a fragment's distance is exactly `furthestDistance` + var farZ = furthestDistance * 1.01; + + // matrix for conversion from location to GL coordinates (-1 .. 1) + var m = new Float64Array(16); + mat4.perspective(m, this._fov, this.width / this.height, 1, farZ); + + mat4.scale(m, m, [1, -1, 1]); + mat4.translate(m, m, [0, 0, -this.cameraToCenterDistance]); + mat4.rotateX(m, m, this._pitch); + mat4.rotateZ(m, m, this.angle); + mat4.translate(m, m, [-this.x, -this.y, 0]); + + // scale vertically to meters per pixel (inverse of ground resolution): + // worldSize / (circumferenceOfEarth * cos(lat * À / 180)) + var verticalScale = this.worldSize / (2 * Math.PI * 6378137 * Math.abs(Math.cos(this.center.lat * (Math.PI / 180)))); + mat4.scale(m, m, [1, 1, verticalScale, 1]); + + this.projMatrix = m; + + // matrix for conversion from location to screen coordinates + m = mat4.create(); + mat4.scale(m, m, [this.width / 2, -this.height / 2, 1]); + mat4.translate(m, m, [1, -1, 0]); + this.pixelMatrix = mat4.multiply(new Float64Array(16), m, this.projMatrix); + + // inverse matrix for conversion from screen coordinaes to location + m = mat4.invert(new Float64Array(16), this.pixelMatrix); + if (!m) throw new Error("failed to invert matrix"); + this.pixelMatrixInverse = m; + +}; + +Object.defineProperties( Transform.prototype, prototypeAccessors ); + +module.exports = Transform; + +},{"../data/extent":11,"../source/tile_coord":53,"../util/interpolate":121,"../util/util":129,"./coordinate":18,"./lng_lat":19,"@mapbox/gl-matrix":133,"point-geometry":198}],22:[function(require,module,exports){ +'use strict'; +var WorkerPool = require('./util/worker_pool'); + +var globalWorkerPool; + +/** + * Creates (if necessary) and returns the single, global WorkerPool instance + * to be shared across each Map + * @private + */ +module.exports = function getGlobalWorkerPool () { + if (!globalWorkerPool) { + globalWorkerPool = new WorkerPool(); + } + return globalWorkerPool; +}; + +},{"./util/worker_pool":132}],23:[function(require,module,exports){ +'use strict'; + +// Font data From Hershey Simplex Font +// http://paulbourke.net/dataformats/hershey/ +var simplexFont = { + " ": [16, []], + "!": [10, [5, 21, 5, 7, -1, -1, 5, 2, 4, 1, 5, 0, 6, 1, 5, 2]], + "\"": [16, [4, 21, 4, 14, -1, -1, 12, 21, 12, 14]], + "#": [21, [11, 25, 4, -7, -1, -1, 17, 25, 10, -7, -1, -1, 4, 12, 18, 12, -1, -1, 3, 6, 17, 6]], + "$": [20, [8, 25, 8, -4, -1, -1, 12, 25, 12, -4, -1, -1, 17, 18, 15, 20, 12, 21, 8, 21, 5, 20, 3, 18, 3, 16, 4, 14, 5, 13, 7, 12, 13, 10, 15, 9, 16, 8, 17, 6, 17, 3, 15, 1, 12, 0, 8, 0, 5, 1, 3, 3]], + "%": [24, [21, 21, 3, 0, -1, -1, 8, 21, 10, 19, 10, 17, 9, 15, 7, 14, 5, 14, 3, 16, 3, 18, 4, 20, 6, 21, 8, 21, 10, 20, 13, 19, 16, 19, 19, 20, 21, 21, -1, -1, 17, 7, 15, 6, 14, 4, 14, 2, 16, 0, 18, 0, 20, 1, 21, 3, 21, 5, 19, 7, 17, 7]], + "&": [26, [23, 12, 23, 13, 22, 14, 21, 14, 20, 13, 19, 11, 17, 6, 15, 3, 13, 1, 11, 0, 7, 0, 5, 1, 4, 2, 3, 4, 3, 6, 4, 8, 5, 9, 12, 13, 13, 14, 14, 16, 14, 18, 13, 20, 11, 21, 9, 20, 8, 18, 8, 16, 9, 13, 11, 10, 16, 3, 18, 1, 20, 0, 22, 0, 23, 1, 23, 2]], + "'": [10, [5, 19, 4, 20, 5, 21, 6, 20, 6, 18, 5, 16, 4, 15]], + "(": [14, [11, 25, 9, 23, 7, 20, 5, 16, 4, 11, 4, 7, 5, 2, 7, -2, 9, -5, 11, -7]], + ")": [14, [3, 25, 5, 23, 7, 20, 9, 16, 10, 11, 10, 7, 9, 2, 7, -2, 5, -5, 3, -7]], + "*": [16, [8, 21, 8, 9, -1, -1, 3, 18, 13, 12, -1, -1, 13, 18, 3, 12]], + "+": [26, [13, 18, 13, 0, -1, -1, 4, 9, 22, 9]], + ",": [10, [6, 1, 5, 0, 4, 1, 5, 2, 6, 1, 6, -1, 5, -3, 4, -4]], + "-": [26, [4, 9, 22, 9]], + ".": [10, [5, 2, 4, 1, 5, 0, 6, 1, 5, 2]], + "/": [22, [20, 25, 2, -7]], + "0": [20, [9, 21, 6, 20, 4, 17, 3, 12, 3, 9, 4, 4, 6, 1, 9, 0, 11, 0, 14, 1, 16, 4, 17, 9, 17, 12, 16, 17, 14, 20, 11, 21, 9, 21]], + "1": [20, [6, 17, 8, 18, 11, 21, 11, 0]], + "2": [20, [4, 16, 4, 17, 5, 19, 6, 20, 8, 21, 12, 21, 14, 20, 15, 19, 16, 17, 16, 15, 15, 13, 13, 10, 3, 0, 17, 0]], + "3": [20, [5, 21, 16, 21, 10, 13, 13, 13, 15, 12, 16, 11, 17, 8, 17, 6, 16, 3, 14, 1, 11, 0, 8, 0, 5, 1, 4, 2, 3, 4]], + "4": [20, [13, 21, 3, 7, 18, 7, -1, -1, 13, 21, 13, 0]], + "5": [20, [15, 21, 5, 21, 4, 12, 5, 13, 8, 14, 11, 14, 14, 13, 16, 11, 17, 8, 17, 6, 16, 3, 14, 1, 11, 0, 8, 0, 5, 1, 4, 2, 3, 4]], + "6": [20, [16, 18, 15, 20, 12, 21, 10, 21, 7, 20, 5, 17, 4, 12, 4, 7, 5, 3, 7, 1, 10, 0, 11, 0, 14, 1, 16, 3, 17, 6, 17, 7, 16, 10, 14, 12, 11, 13, 10, 13, 7, 12, 5, 10, 4, 7]], + "7": [20, [17, 21, 7, 0, -1, -1, 3, 21, 17, 21]], + "8": [20, [8, 21, 5, 20, 4, 18, 4, 16, 5, 14, 7, 13, 11, 12, 14, 11, 16, 9, 17, 7, 17, 4, 16, 2, 15, 1, 12, 0, 8, 0, 5, 1, 4, 2, 3, 4, 3, 7, 4, 9, 6, 11, 9, 12, 13, 13, 15, 14, 16, 16, 16, 18, 15, 20, 12, 21, 8, 21]], + "9": [20, [16, 14, 15, 11, 13, 9, 10, 8, 9, 8, 6, 9, 4, 11, 3, 14, 3, 15, 4, 18, 6, 20, 9, 21, 10, 21, 13, 20, 15, 18, 16, 14, 16, 9, 15, 4, 13, 1, 10, 0, 8, 0, 5, 1, 4, 3]], + ":": [10, [5, 14, 4, 13, 5, 12, 6, 13, 5, 14, -1, -1, 5, 2, 4, 1, 5, 0, 6, 1, 5, 2]], + ";": [10, [5, 14, 4, 13, 5, 12, 6, 13, 5, 14, -1, -1, 6, 1, 5, 0, 4, 1, 5, 2, 6, 1, 6, -1, 5, -3, 4, -4]], + "<": [24, [20, 18, 4, 9, 20, 0]], + "=": [26, [4, 12, 22, 12, -1, -1, 4, 6, 22, 6]], + ">": [24, [4, 18, 20, 9, 4, 0]], + "?": [18, [3, 16, 3, 17, 4, 19, 5, 20, 7, 21, 11, 21, 13, 20, 14, 19, 15, 17, 15, 15, 14, 13, 13, 12, 9, 10, 9, 7, -1, -1, 9, 2, 8, 1, 9, 0, 10, 1, 9, 2]], + "@": [27, [18, 13, 17, 15, 15, 16, 12, 16, 10, 15, 9, 14, 8, 11, 8, 8, 9, 6, 11, 5, 14, 5, 16, 6, 17, 8, -1, -1, 12, 16, 10, 14, 9, 11, 9, 8, 10, 6, 11, 5, -1, -1, 18, 16, 17, 8, 17, 6, 19, 5, 21, 5, 23, 7, 24, 10, 24, 12, 23, 15, 22, 17, 20, 19, 18, 20, 15, 21, 12, 21, 9, 20, 7, 19, 5, 17, 4, 15, 3, 12, 3, 9, 4, 6, 5, 4, 7, 2, 9, 1, 12, 0, 15, 0, 18, 1, 20, 2, 21, 3, -1, -1, 19, 16, 18, 8, 18, 6, 19, 5]], + "A": [18, [9, 21, 1, 0, -1, -1, 9, 21, 17, 0, -1, -1, 4, 7, 14, 7]], + "B": [21, [4, 21, 4, 0, -1, -1, 4, 21, 13, 21, 16, 20, 17, 19, 18, 17, 18, 15, 17, 13, 16, 12, 13, 11, -1, -1, 4, 11, 13, 11, 16, 10, 17, 9, 18, 7, 18, 4, 17, 2, 16, 1, 13, 0, 4, 0]], + "C": [21, [18, 16, 17, 18, 15, 20, 13, 21, 9, 21, 7, 20, 5, 18, 4, 16, 3, 13, 3, 8, 4, 5, 5, 3, 7, 1, 9, 0, 13, 0, 15, 1, 17, 3, 18, 5]], + "D": [21, [4, 21, 4, 0, -1, -1, 4, 21, 11, 21, 14, 20, 16, 18, 17, 16, 18, 13, 18, 8, 17, 5, 16, 3, 14, 1, 11, 0, 4, 0]], + "E": [19, [4, 21, 4, 0, -1, -1, 4, 21, 17, 21, -1, -1, 4, 11, 12, 11, -1, -1, 4, 0, 17, 0]], + "F": [18, [4, 21, 4, 0, -1, -1, 4, 21, 17, 21, -1, -1, 4, 11, 12, 11]], + "G": [21, [18, 16, 17, 18, 15, 20, 13, 21, 9, 21, 7, 20, 5, 18, 4, 16, 3, 13, 3, 8, 4, 5, 5, 3, 7, 1, 9, 0, 13, 0, 15, 1, 17, 3, 18, 5, 18, 8, -1, -1, 13, 8, 18, 8]], + "H": [22, [4, 21, 4, 0, -1, -1, 18, 21, 18, 0, -1, -1, 4, 11, 18, 11]], + "I": [8, [4, 21, 4, 0]], + "J": [16, [12, 21, 12, 5, 11, 2, 10, 1, 8, 0, 6, 0, 4, 1, 3, 2, 2, 5, 2, 7]], + "K": [21, [4, 21, 4, 0, -1, -1, 18, 21, 4, 7, -1, -1, 9, 12, 18, 0]], + "L": [17, [4, 21, 4, 0, -1, -1, 4, 0, 16, 0]], + "M": [24, [4, 21, 4, 0, -1, -1, 4, 21, 12, 0, -1, -1, 20, 21, 12, 0, -1, -1, 20, 21, 20, 0]], + "N": [22, [4, 21, 4, 0, -1, -1, 4, 21, 18, 0, -1, -1, 18, 21, 18, 0]], + "O": [22, [9, 21, 7, 20, 5, 18, 4, 16, 3, 13, 3, 8, 4, 5, 5, 3, 7, 1, 9, 0, 13, 0, 15, 1, 17, 3, 18, 5, 19, 8, 19, 13, 18, 16, 17, 18, 15, 20, 13, 21, 9, 21]], + "P": [21, [4, 21, 4, 0, -1, -1, 4, 21, 13, 21, 16, 20, 17, 19, 18, 17, 18, 14, 17, 12, 16, 11, 13, 10, 4, 10]], + "Q": [22, [9, 21, 7, 20, 5, 18, 4, 16, 3, 13, 3, 8, 4, 5, 5, 3, 7, 1, 9, 0, 13, 0, 15, 1, 17, 3, 18, 5, 19, 8, 19, 13, 18, 16, 17, 18, 15, 20, 13, 21, 9, 21, -1, -1, 12, 4, 18, -2]], + "R": [21, [4, 21, 4, 0, -1, -1, 4, 21, 13, 21, 16, 20, 17, 19, 18, 17, 18, 15, 17, 13, 16, 12, 13, 11, 4, 11, -1, -1, 11, 11, 18, 0]], + "S": [20, [17, 18, 15, 20, 12, 21, 8, 21, 5, 20, 3, 18, 3, 16, 4, 14, 5, 13, 7, 12, 13, 10, 15, 9, 16, 8, 17, 6, 17, 3, 15, 1, 12, 0, 8, 0, 5, 1, 3, 3]], + "T": [16, [8, 21, 8, 0, -1, -1, 1, 21, 15, 21]], + "U": [22, [4, 21, 4, 6, 5, 3, 7, 1, 10, 0, 12, 0, 15, 1, 17, 3, 18, 6, 18, 21]], + "V": [18, [1, 21, 9, 0, -1, -1, 17, 21, 9, 0]], + "W": [24, [2, 21, 7, 0, -1, -1, 12, 21, 7, 0, -1, -1, 12, 21, 17, 0, -1, -1, 22, 21, 17, 0]], + "X": [20, [3, 21, 17, 0, -1, -1, 17, 21, 3, 0]], + "Y": [18, [1, 21, 9, 11, 9, 0, -1, -1, 17, 21, 9, 11]], + "Z": [20, [17, 21, 3, 0, -1, -1, 3, 21, 17, 21, -1, -1, 3, 0, 17, 0]], + "[": [14, [4, 25, 4, -7, -1, -1, 5, 25, 5, -7, -1, -1, 4, 25, 11, 25, -1, -1, 4, -7, 11, -7]], + "\\": [14, [0, 21, 14, -3]], + "]": [14, [9, 25, 9, -7, -1, -1, 10, 25, 10, -7, -1, -1, 3, 25, 10, 25, -1, -1, 3, -7, 10, -7]], + "^": [16, [6, 15, 8, 18, 10, 15, -1, -1, 3, 12, 8, 17, 13, 12, -1, -1, 8, 17, 8, 0]], + "_": [16, [0, -2, 16, -2]], + "`": [10, [6, 21, 5, 20, 4, 18, 4, 16, 5, 15, 6, 16, 5, 17]], + "a": [19, [15, 14, 15, 0, -1, -1, 15, 11, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]], + "b": [19, [4, 21, 4, 0, -1, -1, 4, 11, 6, 13, 8, 14, 11, 14, 13, 13, 15, 11, 16, 8, 16, 6, 15, 3, 13, 1, 11, 0, 8, 0, 6, 1, 4, 3]], + "c": [18, [15, 11, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]], + "d": [19, [15, 21, 15, 0, -1, -1, 15, 11, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]], + "e": [18, [3, 8, 15, 8, 15, 10, 14, 12, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]], + "f": [12, [10, 21, 8, 21, 6, 20, 5, 17, 5, 0, -1, -1, 2, 14, 9, 14]], + "g": [19, [15, 14, 15, -2, 14, -5, 13, -6, 11, -7, 8, -7, 6, -6, -1, -1, 15, 11, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]], + "h": [19, [4, 21, 4, 0, -1, -1, 4, 10, 7, 13, 9, 14, 12, 14, 14, 13, 15, 10, 15, 0]], + "i": [8, [3, 21, 4, 20, 5, 21, 4, 22, 3, 21, -1, -1, 4, 14, 4, 0]], + "j": [10, [5, 21, 6, 20, 7, 21, 6, 22, 5, 21, -1, -1, 6, 14, 6, -3, 5, -6, 3, -7, 1, -7]], + "k": [17, [4, 21, 4, 0, -1, -1, 14, 14, 4, 4, -1, -1, 8, 8, 15, 0]], + "l": [8, [4, 21, 4, 0]], + "m": [30, [4, 14, 4, 0, -1, -1, 4, 10, 7, 13, 9, 14, 12, 14, 14, 13, 15, 10, 15, 0, -1, -1, 15, 10, 18, 13, 20, 14, 23, 14, 25, 13, 26, 10, 26, 0]], + "n": [19, [4, 14, 4, 0, -1, -1, 4, 10, 7, 13, 9, 14, 12, 14, 14, 13, 15, 10, 15, 0]], + "o": [19, [8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3, 16, 6, 16, 8, 15, 11, 13, 13, 11, 14, 8, 14]], + "p": [19, [4, 14, 4, -7, -1, -1, 4, 11, 6, 13, 8, 14, 11, 14, 13, 13, 15, 11, 16, 8, 16, 6, 15, 3, 13, 1, 11, 0, 8, 0, 6, 1, 4, 3]], + "q": [19, [15, 14, 15, -7, -1, -1, 15, 11, 13, 13, 11, 14, 8, 14, 6, 13, 4, 11, 3, 8, 3, 6, 4, 3, 6, 1, 8, 0, 11, 0, 13, 1, 15, 3]], + "r": [13, [4, 14, 4, 0, -1, -1, 4, 8, 5, 11, 7, 13, 9, 14, 12, 14]], + "s": [17, [14, 11, 13, 13, 10, 14, 7, 14, 4, 13, 3, 11, 4, 9, 6, 8, 11, 7, 13, 6, 14, 4, 14, 3, 13, 1, 10, 0, 7, 0, 4, 1, 3, 3]], + "t": [12, [5, 21, 5, 4, 6, 1, 8, 0, 10, 0, -1, -1, 2, 14, 9, 14]], + "u": [19, [4, 14, 4, 4, 5, 1, 7, 0, 10, 0, 12, 1, 15, 4, -1, -1, 15, 14, 15, 0]], + "v": [16, [2, 14, 8, 0, -1, -1, 14, 14, 8, 0]], + "w": [22, [3, 14, 7, 0, -1, -1, 11, 14, 7, 0, -1, -1, 11, 14, 15, 0, -1, -1, 19, 14, 15, 0]], + "x": [17, [3, 14, 14, 0, -1, -1, 14, 14, 3, 0]], + "y": [16, [2, 14, 8, 0, -1, -1, 14, 14, 8, 0, 6, -4, 4, -6, 2, -7, 1, -7]], + "z": [17, [14, 14, 3, 0, -1, -1, 3, 14, 14, 14, -1, -1, 3, 0, 14, 0]], + "{": [14, [9, 25, 7, 24, 6, 23, 5, 21, 5, 19, 6, 17, 7, 16, 8, 14, 8, 12, 6, 10, -1, -1, 7, 24, 6, 22, 6, 20, 7, 18, 8, 17, 9, 15, 9, 13, 8, 11, 4, 9, 8, 7, 9, 5, 9, 3, 8, 1, 7, 0, 6, -2, 6, -4, 7, -6, -1, -1, 6, 8, 8, 6, 8, 4, 7, 2, 6, 1, 5, -1, 5, -3, 6, -5, 7, -6, 9, -7]], + "|": [8, [4, 25, 4, -7]], + "}": [14, [5, 25, 7, 24, 8, 23, 9, 21, 9, 19, 8, 17, 7, 16, 6, 14, 6, 12, 8, 10, -1, -1, 7, 24, 8, 22, 8, 20, 7, 18, 6, 17, 5, 15, 5, 13, 6, 11, 10, 9, 6, 7, 5, 5, 5, 3, 6, 1, 7, 0, 8, -2, 8, -4, 7, -6, -1, -1, 8, 8, 6, 6, 6, 4, 7, 2, 8, 1, 9, -1, 9, -3, 8, -5, 7, -6, 5, -7]], + "~": [24, [3, 6, 3, 8, 4, 11, 6, 12, 8, 12, 10, 11, 14, 8, 16, 7, 18, 7, 20, 8, 21, 10, -1, -1, 3, 8, 4, 10, 6, 11, 8, 11, 10, 10, 14, 7, 16, 6, 18, 6, 20, 7, 21, 10, 21, 12]] +}; + +module.exports = function textVertices(text, left, baseline, scale) { + scale = scale || 1; + + var strokes = []; + var i, len, j, len2, glyph, x, y, prev; + + for (i = 0, len = text.length; i < len; i++) { + glyph = simplexFont[text[i]]; + if (!glyph) continue; + prev = null; + + for (j = 0, len2 = glyph[1].length; j < len2; j += 2) { + if (glyph[1][j] === -1 && glyph[1][j + 1] === -1) { + prev = null; + + } else { + x = left + glyph[1][j] * scale; + y = baseline - glyph[1][j + 1] * scale; + if (prev) { + strokes.push(prev.x, prev.y, x, y); + } + prev = {x: x, y: y}; + } + } + left += glyph[0] * scale; + } + + return strokes; +}; + +},{}],24:[function(require,module,exports){ +'use strict'; + +var browser = require('./util/browser'); + +// jshint -W079 +var mapboxgl = module.exports = {}; + +mapboxgl.version = require('../package.json').version; +mapboxgl.workerCount = Math.max(Math.floor(browser.hardwareConcurrency / 2), 1); + +mapboxgl.Map = require('./ui/map'); +mapboxgl.NavigationControl = require('./ui/control/navigation_control'); +mapboxgl.GeolocateControl = require('./ui/control/geolocate_control'); +mapboxgl.AttributionControl = require('./ui/control/attribution_control'); +mapboxgl.ScaleControl = require('./ui/control/scale_control'); +mapboxgl.Popup = require('./ui/popup'); +mapboxgl.Marker = require('./ui/marker'); + +mapboxgl.Style = require('./style/style'); + +mapboxgl.LngLat = require('./geo/lng_lat'); +mapboxgl.LngLatBounds = require('./geo/lng_lat_bounds'); +mapboxgl.Point = require('point-geometry'); + +mapboxgl.Evented = require('./util/evented'); +mapboxgl.util = require('./util/util'); + +mapboxgl.supported = require('./util/browser').supported; + +var ajax = require('./util/ajax'); +mapboxgl.util.getJSON = ajax.getJSON; +mapboxgl.util.getArrayBuffer = ajax.getArrayBuffer; + +var config = require('./util/config'); +mapboxgl.config = config; + +var rtlTextPlugin = require('./source/rtl_text_plugin'); + +mapboxgl.setRTLTextPlugin = rtlTextPlugin.setRTLTextPlugin; + + /** + * Sets the map's [RTL text plugin](https://www.mapbox.com/mapbox-gl-js/plugins/#mapbox-gl-rtl-text). + * Necessary for supporting languages like Arabic and Hebrew that are written right-to-left. + * + * @function setRTLTextPlugin + * @param {string} pluginURL URL pointing to the Mapbox RTL text plugin source. + * @param {Function} callback Called with an error argument if there is an error. + * @example + * mapboxgl.setRTLTextPlugin('https://api.mapbox.com/mapbox-gl-js/plugins/mapbox-gl-rtl-text/v0.1.0/mapbox-gl-rtl-text.js'); + * @see [Add support for right-to-left scripts](https://www.mapbox.com/mapbox-gl-js/example/mapbox-gl-rtl-text/) + */ + +Object.defineProperty(mapboxgl, 'accessToken', { + get: function() { return config.ACCESS_TOKEN; }, + set: function(token) { config.ACCESS_TOKEN = token; } +}); + +/** + * Gets and sets the map's [access token](https://www.mapbox.com/help/define-access-token/). + * + * @var {string} accessToken + * @example + * mapboxgl.accessToken = myAccessToken; + * @see [Display a map](https://www.mapbox.com/mapbox-gl-js/examples/) + */ + +/** + * The version of Mapbox GL JS in use as specified in `package.json`, + * `CHANGELOG.md`, and the GitHub release. + * + * @var {string} version + */ + +/** + * Returns a Boolean indicating whether the browser [supports Mapbox GL JS](https://www.mapbox.com/help/mapbox-browser-support/#mapbox-gl-js). + * + * @function supported + * @param {Object} options + * @param {boolean} [options.failIfMajorPerformanceCaveat=false] If `true`, + * the function will return `false` if the performance of Mapbox GL JS would + * be dramatically worse than expected (i.e. a software renderer would be used). + * @return {boolean} + * @example + * mapboxgl.supported() // = true + * @see [Check for browser support](https://www.mapbox.com/mapbox-gl-js/example/check-for-support/) + */ + +},{"../package.json":217,"./geo/lng_lat":19,"./geo/lng_lat_bounds":20,"./source/rtl_text_plugin":49,"./style/style":63,"./ui/control/attribution_control":93,"./ui/control/geolocate_control":94,"./ui/control/navigation_control":95,"./ui/control/scale_control":96,"./ui/map":105,"./ui/marker":106,"./ui/popup":107,"./util/ajax":109,"./util/browser":110,"./util/config":114,"./util/evented":118,"./util/util":129,"point-geometry":198}],25:[function(require,module,exports){ +'use strict'; + +var pattern = require('./pattern'); + +module.exports = drawBackground; + +function drawBackground(painter, sourceCache, layer) { + var gl = painter.gl; + var transform = painter.transform; + var tileSize = transform.tileSize; + var color = layer.paint['background-color']; + var image = layer.paint['background-pattern']; + var opacity = layer.paint['background-opacity']; + + var isOpaque = !image && color[3] === 1 && opacity === 1; + if (painter.isOpaquePass !== isOpaque) return; + + gl.disable(gl.STENCIL_TEST); + + painter.setDepthSublayer(0); + + var program; + if (image) { + program = painter.useProgram('fillPattern', painter.basicFillProgramConfiguration); + pattern.prepare(image, painter, program); + painter.tileExtentPatternVAO.bind(gl, program, painter.tileExtentBuffer); + } else { + program = painter.useProgram('fill', painter.basicFillProgramConfiguration); + gl.uniform4fv(program.u_color, color); + painter.tileExtentVAO.bind(gl, program, painter.tileExtentBuffer); + } + + gl.uniform1f(program.u_opacity, opacity); + + var coords = transform.coveringTiles({tileSize: tileSize}); + + for (var i = 0, list = coords; i < list.length; i += 1) { + var coord = list[i]; + + if (image) { + pattern.setTile({coord: coord, tileSize: tileSize}, painter, program); + } + gl.uniformMatrix4fv(program.u_matrix, false, painter.transform.calculatePosMatrix(coord)); + gl.drawArrays(gl.TRIANGLE_STRIP, 0, painter.tileExtentBuffer.length); + } +} + +},{"./pattern":37}],26:[function(require,module,exports){ +'use strict'; + +var browser = require('../util/browser'); + +module.exports = drawCircles; + +function drawCircles(painter, sourceCache, layer, coords) { + if (painter.isOpaquePass) return; + + var gl = painter.gl; + + painter.setDepthSublayer(0); + painter.depthMask(false); + + // Allow circles to be drawn across boundaries, so that + // large circles are not clipped to tiles + gl.disable(gl.STENCIL_TEST); + + for (var i = 0; i < coords.length; i++) { + var coord = coords[i]; + + var tile = sourceCache.getTile(coord); + var bucket = tile.getBucket(layer); + if (!bucket) continue; + + var buffers = bucket.buffers; + var layerData = buffers.layerData[layer.id]; + var programConfiguration = layerData.programConfiguration; + var program = painter.useProgram('circle', programConfiguration); + programConfiguration.setUniforms(gl, program, layer, {zoom: painter.transform.zoom}); + + if (layer.paint['circle-pitch-scale'] === 'map') { + gl.uniform1i(program.u_scale_with_map, true); + gl.uniform2f(program.u_extrude_scale, + painter.transform.pixelsToGLUnits[0] * painter.transform.cameraToCenterDistance, + painter.transform.pixelsToGLUnits[1] * painter.transform.cameraToCenterDistance); + } else { + gl.uniform1i(program.u_scale_with_map, false); + gl.uniform2fv(program.u_extrude_scale, painter.transform.pixelsToGLUnits); + } + + gl.uniform1f(program.u_devicepixelratio, browser.devicePixelRatio); + + gl.uniformMatrix4fv(program.u_matrix, false, painter.translatePosMatrix( + coord.posMatrix, + tile, + layer.paint['circle-translate'], + layer.paint['circle-translate-anchor'] + )); + + for (var i$1 = 0, list = buffers.segments; i$1 < list.length; i$1 += 1) { + var segment = list[i$1]; + + segment.vaos[layer.id].bind(gl, program, buffers.layoutVertexBuffer, buffers.elementBuffer, layerData.paintVertexBuffer, segment.vertexOffset); + gl.drawElements(gl.TRIANGLES, segment.primitiveLength * 3, gl.UNSIGNED_SHORT, segment.primitiveOffset * 3 * 2); + } + } +} + +},{"../util/browser":110}],27:[function(require,module,exports){ +'use strict'; + +module.exports = drawCollisionDebug; + +function drawCollisionDebug(painter, sourceCache, layer, coords) { + var gl = painter.gl; + gl.enable(gl.STENCIL_TEST); + var program = painter.useProgram('collisionBox'); + + for (var i = 0; i < coords.length; i++) { + var coord = coords[i]; + var tile = sourceCache.getTile(coord); + var bucket = tile.getBucket(layer); + if (!bucket) continue; + var buffers = bucket.buffers.collisionBox; + if (!buffers) continue; + + gl.uniformMatrix4fv(program.u_matrix, false, coord.posMatrix); + + painter.enableTileClippingMask(coord); + + painter.lineWidth(1); + gl.uniform1f(program.u_scale, Math.pow(2, painter.transform.zoom - tile.coord.z)); + gl.uniform1f(program.u_zoom, painter.transform.zoom * 10); + gl.uniform1f(program.u_maxzoom, (tile.coord.z + 1) * 10); + + for (var i$1 = 0, list = buffers.segments; i$1 < list.length; i$1 += 1) { + var segment = list[i$1]; + + segment.vaos[layer.id].bind(gl, program, buffers.layoutVertexBuffer, buffers.elementBuffer, null, segment.vertexOffset); + gl.drawElements(gl.LINES, segment.primitiveLength * 2, gl.UNSIGNED_SHORT, segment.primitiveOffset * 2 * 2); + } + } +} + +},{}],28:[function(require,module,exports){ +'use strict'; + +var textVertices = require('../lib/debugtext'); +var browser = require('../util/browser'); +var mat4 = require('@mapbox/gl-matrix').mat4; +var EXTENT = require('../data/extent'); +var Buffer = require('../data/buffer'); +var VertexArrayObject = require('./vertex_array_object'); +var PosArray = require('../data/pos_array'); + +module.exports = drawDebug; + +function drawDebug(painter, sourceCache, coords) { + for (var i = 0; i < coords.length; i++) { + drawDebugTile(painter, sourceCache, coords[i]); + } +} + +function drawDebugTile(painter, sourceCache, coord) { + var gl = painter.gl; + + gl.disable(gl.STENCIL_TEST); + painter.lineWidth(1 * browser.devicePixelRatio); + + var posMatrix = coord.posMatrix; + var program = painter.useProgram('debug'); + + gl.uniformMatrix4fv(program.u_matrix, false, posMatrix); + gl.uniform4f(program.u_color, 1, 0, 0, 1); + painter.debugVAO.bind(gl, program, painter.debugBuffer); + gl.drawArrays(gl.LINE_STRIP, 0, painter.debugBuffer.length); + + var vertices = textVertices(coord.toString(), 50, 200, 5); + var debugTextArray = new PosArray(); + for (var v = 0; v < vertices.length; v += 2) { + debugTextArray.emplaceBack(vertices[v], vertices[v + 1]); + } + var debugTextBuffer = Buffer.fromStructArray(debugTextArray, Buffer.BufferType.VERTEX); + var debugTextVAO = new VertexArrayObject(); + debugTextVAO.bind(gl, program, debugTextBuffer); + gl.uniform4f(program.u_color, 1, 1, 1, 1); + + // Draw the halo with multiple 1px lines instead of one wider line because + // the gl spec doesn't guarantee support for lines with width > 1. + var tileSize = sourceCache.getTile(coord).tileSize; + var onePixel = EXTENT / (Math.pow(2, painter.transform.zoom - coord.z) * tileSize); + var translations = [[-1, -1], [-1, 1], [1, -1], [1, 1]]; + for (var i = 0; i < translations.length; i++) { + var translation = translations[i]; + gl.uniformMatrix4fv(program.u_matrix, false, mat4.translate([], posMatrix, [onePixel * translation[0], onePixel * translation[1], 0])); + gl.drawArrays(gl.LINES, 0, debugTextBuffer.length); + } + + gl.uniform4f(program.u_color, 0, 0, 0, 1); + gl.uniformMatrix4fv(program.u_matrix, false, posMatrix); + gl.drawArrays(gl.LINES, 0, debugTextBuffer.length); +} + +},{"../data/buffer":8,"../data/extent":11,"../data/pos_array":14,"../lib/debugtext":23,"../util/browser":110,"./vertex_array_object":39,"@mapbox/gl-matrix":133}],29:[function(require,module,exports){ +'use strict'; + +var pattern = require('./pattern'); + +module.exports = drawFill; + +function drawFill(painter, sourceCache, layer, coords) { + var gl = painter.gl; + gl.enable(gl.STENCIL_TEST); + + var isOpaque = + !layer.paint['fill-pattern'] && + layer.isPaintValueFeatureConstant('fill-color') && + layer.isPaintValueFeatureConstant('fill-opacity') && + layer.paint['fill-color'][3] === 1 && + layer.paint['fill-opacity'] === 1; + + // Draw fill + if (painter.isOpaquePass === isOpaque) { + // Once we switch to earcut drawing we can pull most of the WebGL setup + // outside of this coords loop. + painter.setDepthSublayer(1); + drawFillTiles(painter, sourceCache, layer, coords, drawFillTile); + } + + // Draw stroke + if (!painter.isOpaquePass && layer.paint['fill-antialias']) { + painter.lineWidth(2); + painter.depthMask(false); + + // If we defined a different color for the fill outline, we are + // going to ignore the bits in 0x07 and just care about the global + // clipping mask. + // Otherwise, we only want to drawFill the antialiased parts that are + // *outside* the current shape. This is important in case the fill + // or stroke color is translucent. If we wouldn't clip to outside + // the current shape, some pixels from the outline stroke overlapped + // the (non-antialiased) fill. + painter.setDepthSublayer(layer.getPaintProperty('fill-outline-color') ? 2 : 0); + drawFillTiles(painter, sourceCache, layer, coords, drawStrokeTile); + } +} + +function drawFillTiles(painter, sourceCache, layer, coords, drawFn) { + var firstTile = true; + for (var i = 0, list = coords; i < list.length; i += 1) { + var coord = list[i]; + + var tile = sourceCache.getTile(coord); + var bucket = tile.getBucket(layer); + if (!bucket) continue; + + painter.enableTileClippingMask(coord); + drawFn(painter, sourceCache, layer, tile, coord, bucket.buffers, firstTile); + firstTile = false; + } +} + +function drawFillTile(painter, sourceCache, layer, tile, coord, buffers, firstTile) { + var gl = painter.gl; + var layerData = buffers.layerData[layer.id]; + + var program = setFillProgram('fill', layer.paint['fill-pattern'], painter, layerData, layer, tile, coord, firstTile); + + for (var i = 0, list = buffers.segments; i < list.length; i += 1) { + var segment = list[i]; + + segment.vaos[layer.id].bind(gl, program, buffers.layoutVertexBuffer, buffers.elementBuffer, layerData.paintVertexBuffer, segment.vertexOffset); + gl.drawElements(gl.TRIANGLES, segment.primitiveLength * 3, gl.UNSIGNED_SHORT, segment.primitiveOffset * 3 * 2); + } +} + +function drawStrokeTile(painter, sourceCache, layer, tile, coord, buffers, firstTile) { + var gl = painter.gl; + var layerData = buffers.layerData[layer.id]; + var usePattern = layer.paint['fill-pattern'] && !layer.getPaintProperty('fill-outline-color'); + + var program = setFillProgram('fillOutline', usePattern, painter, layerData, layer, tile, coord, firstTile); + gl.uniform2f(program.u_world, gl.drawingBufferWidth, gl.drawingBufferHeight); + + for (var i = 0, list = buffers.segments2; i < list.length; i += 1) { + var segment = list[i]; + + segment.vaos[layer.id].bind(gl, program, buffers.layoutVertexBuffer, buffers.elementBuffer2, layerData.paintVertexBuffer, segment.vertexOffset); + gl.drawElements(gl.LINES, segment.primitiveLength * 2, gl.UNSIGNED_SHORT, segment.primitiveOffset * 2 * 2); + } +} + +function setFillProgram(programId, usePattern, painter, layerData, layer, tile, coord, firstTile) { + var program; + var prevProgram = painter.currentProgram; + if (!usePattern) { + program = painter.useProgram(programId, layerData.programConfiguration); + if (firstTile || program !== prevProgram) { + layerData.programConfiguration.setUniforms(painter.gl, program, layer, {zoom: painter.transform.zoom}); + } + } else { + program = painter.useProgram((programId + "Pattern"), layerData.programConfiguration); + if (firstTile || program !== prevProgram) { + layerData.programConfiguration.setUniforms(painter.gl, program, layer, {zoom: painter.transform.zoom}); + pattern.prepare(layer.paint['fill-pattern'], painter, program); + } + pattern.setTile(tile, painter, program); + } + painter.gl.uniformMatrix4fv(program.u_matrix, false, painter.translatePosMatrix( + coord.posMatrix, tile, + layer.paint['fill-translate'], + layer.paint['fill-translate-anchor'] + )); + return program; +} + +},{"./pattern":37}],30:[function(require,module,exports){ +'use strict'; + +var glMatrix = require('@mapbox/gl-matrix'); +var Buffer = require('../data/buffer'); +var VertexArrayObject = require('./vertex_array_object'); +var PosArray = require('../data/pos_array'); +var pattern = require('./pattern'); +var mat3 = glMatrix.mat3; +var mat4 = glMatrix.mat4; +var vec3 = glMatrix.vec3; + +module.exports = draw; + +function draw(painter, source, layer, coords) { + if (layer.paint['fill-extrusion-opacity'] === 0) return; + var gl = painter.gl; + gl.disable(gl.STENCIL_TEST); + gl.enable(gl.DEPTH_TEST); + painter.depthMask(true); + + // Create a new texture to which to render the extrusion layer. This approach + // allows us to adjust opacity on a per-layer basis (eliminating the interior + // walls per-feature opacity problem) + var texture = new ExtrusionTexture(gl, painter, layer); + texture.bindFramebuffer(); + + gl.clearColor(0, 0, 0, 0); + gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); + + for (var i = 0; i < coords.length; i++) { + drawExtrusion(painter, source, layer, coords[i]); + } + + // Unbind the framebuffer as a render target and render it to the map + texture.unbindFramebuffer(); + texture.renderToMap(); +} + +function ExtrusionTexture(gl, painter, layer) { + this.gl = gl; + this.width = painter.width; + this.height = painter.height; + this.painter = painter; + this.layer = layer; + + this.texture = null; + this.fbo = null; + this.fbos = this.painter.preFbos[this.width] && this.painter.preFbos[this.width][this.height]; +} + +ExtrusionTexture.prototype.bindFramebuffer = function() { + var gl = this.gl; + + this.texture = this.painter.getViewportTexture(this.width, this.height); + + gl.activeTexture(gl.TEXTURE1); + if (!this.texture) { + this.texture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.texture); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + this.texture.width = this.width; + this.texture.height = this.height; + } else { + gl.bindTexture(gl.TEXTURE_2D, this.texture); + } + + if (!this.fbos) { + this.fbo = gl.createFramebuffer(); + var stencil = gl.createRenderbuffer(); + var depthRenderBuffer = gl.createRenderbuffer(); + gl.bindRenderbuffer(gl.RENDERBUFFER, stencil); + gl.bindRenderbuffer(gl.RENDERBUFFER, depthRenderBuffer); + gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGBA4, this.width, this.height); + gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT16, this.width, this.height); + gl.bindFramebuffer(gl.FRAMEBUFFER, this.fbo); + gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, stencil); + gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, depthRenderBuffer); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.texture, 0); + } else { + this.fbo = this.fbos.pop(); + gl.bindFramebuffer(gl.FRAMEBUFFER, this.fbo); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.texture, 0); + } +}; + +ExtrusionTexture.prototype.unbindFramebuffer = function() { + this.painter.bindDefaultFramebuffer(); + if (this.fbos) { + this.fbos.push(this.fbo); + } else { + if (!this.painter.preFbos[this.width]) this.painter.preFbos[this.width] = {}; + this.painter.preFbos[this.width][this.height] = [this.fbo]; + } + this.painter.saveViewportTexture(this.texture); +}; + +ExtrusionTexture.prototype.renderToMap = function() { + var gl = this.gl; + var painter = this.painter; + var program = painter.useProgram('extrusionTexture'); + + gl.activeTexture(gl.TEXTURE0); + gl.bindTexture(gl.TEXTURE_2D, this.texture); + + gl.uniform1f(program.u_opacity, this.layer.paint['fill-extrusion-opacity']); + gl.uniform1i(program.u_texture, 1); + + gl.uniformMatrix4fv(program.u_matrix, false, mat4.ortho( + mat4.create(), + 0, + painter.width, + painter.height, + 0, + 0, + 1) + ); + + gl.disable(gl.DEPTH_TEST); + + gl.uniform1i(program.u_xdim, painter.width); + gl.uniform1i(program.u_ydim, painter.height); + + var array = new PosArray(); + array.emplaceBack(0, 0); + array.emplaceBack(painter.width, 0); + array.emplaceBack(0, painter.height); + array.emplaceBack(painter.width, painter.height); + var buffer = Buffer.fromStructArray(array, Buffer.BufferType.VERTEX); + + var vao = new VertexArrayObject(); + vao.bind(gl, program, buffer); + gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4); + + gl.enable(gl.DEPTH_TEST); +}; + +function drawExtrusion(painter, source, layer, coord) { + if (painter.isOpaquePass) return; + + var tile = source.getTile(coord); + var bucket = tile.getBucket(layer); + if (!bucket) return; + + var buffers = bucket.buffers; + var gl = painter.gl; + + var image = layer.paint['fill-extrusion-pattern']; + + var layerData = buffers.layerData[layer.id]; + var programConfiguration = layerData.programConfiguration; + var program = painter.useProgram(image ? 'fillExtrusionPattern' : 'fillExtrusion', programConfiguration); + programConfiguration.setUniforms(gl, program, layer, {zoom: painter.transform.zoom}); + + if (image) { + pattern.prepare(image, painter, program); + pattern.setTile(tile, painter, program); + gl.uniform1f(program.u_height_factor, -Math.pow(2, coord.z) / tile.tileSize / 8); + } + + painter.gl.uniformMatrix4fv(program.u_matrix, false, painter.translatePosMatrix( + coord.posMatrix, + tile, + layer.paint['fill-extrusion-translate'], + layer.paint['fill-extrusion-translate-anchor'] + )); + + setLight(program, painter); + + for (var i = 0, list = buffers.segments; i < list.length; i += 1) { + var segment = list[i]; + + segment.vaos[layer.id].bind(gl, program, buffers.layoutVertexBuffer, buffers.elementBuffer, layerData.paintVertexBuffer, segment.vertexOffset); + gl.drawElements(gl.TRIANGLES, segment.primitiveLength * 3, gl.UNSIGNED_SHORT, segment.primitiveOffset * 3 * 2); + } +} + +function setLight(program, painter) { + var gl = painter.gl; + var light = painter.style.light; + + var _lp = light.calculated.position, + lightPos = [_lp.x, _lp.y, _lp.z]; + var lightMat = mat3.create(); + if (light.calculated.anchor === 'viewport') mat3.fromRotation(lightMat, -painter.transform.angle); + vec3.transformMat3(lightPos, lightPos, lightMat); + + gl.uniform3fv(program.u_lightpos, lightPos); + gl.uniform1f(program.u_lightintensity, light.calculated.intensity); + gl.uniform3fv(program.u_lightcolor, light.calculated.color.slice(0, 3)); +} + +},{"../data/buffer":8,"../data/pos_array":14,"./pattern":37,"./vertex_array_object":39,"@mapbox/gl-matrix":133}],31:[function(require,module,exports){ +'use strict'; + +var browser = require('../util/browser'); +var pixelsToTileUnits = require('../source/pixels_to_tile_units'); + +/** + * Draw a line. Under the hood this will read elements from + * a tile, dash textures from a lineAtlas, and style properties from a layer. + * @param {Object} painter + * @param {Object} layer + * @param {Object} posMatrix + * @param {Tile} tile + * @returns {undefined} draws with the painter + * @private + */ +module.exports = function drawLine(painter, sourceCache, layer, coords) { + if (painter.isOpaquePass) return; + painter.setDepthSublayer(0); + painter.depthMask(false); + + var gl = painter.gl; + gl.enable(gl.STENCIL_TEST); + + // don't draw zero-width lines + if (layer.paint['line-width'] <= 0) return; + + var programId = + layer.paint['line-dasharray'] ? 'lineSDF' : + layer.paint['line-pattern'] ? 'linePattern' : 'line'; + + var prevTileZoom; + var firstTile = true; + + for (var i = 0, list = coords; i < list.length; i += 1) { + var coord = list[i]; + + var tile = sourceCache.getTile(coord); + var bucket = tile.getBucket(layer); + if (!bucket) continue; + + var layerData = bucket.buffers.layerData[layer.id]; + var prevProgram = painter.currentProgram; + var program = painter.useProgram(programId, layerData.programConfiguration); + var programChanged = firstTile || program !== prevProgram; + var tileRatioChanged = prevTileZoom !== tile.coord.z; + + if (programChanged) { + layerData.programConfiguration.setUniforms(painter.gl, program, layer, {zoom: painter.transform.zoom}); + } + drawLineTile(program, painter, tile, bucket.buffers, layer, coord, layerData, programChanged, tileRatioChanged); + prevTileZoom = tile.coord.z; + firstTile = false; + } +}; + +function drawLineTile(program, painter, tile, buffers, layer, coord, layerData, programChanged, tileRatioChanged) { + var gl = painter.gl; + var dasharray = layer.paint['line-dasharray']; + var image = layer.paint['line-pattern']; + + var posA, posB, imagePosA, imagePosB; + + if (programChanged || tileRatioChanged) { + var tileRatio = 1 / pixelsToTileUnits(tile, 1, painter.transform.tileZoom); + + if (dasharray) { + posA = painter.lineAtlas.getDash(dasharray.from, layer.layout['line-cap'] === 'round'); + posB = painter.lineAtlas.getDash(dasharray.to, layer.layout['line-cap'] === 'round'); + + var widthA = posA.width * dasharray.fromScale; + var widthB = posB.width * dasharray.toScale; + + gl.uniform2f(program.u_patternscale_a, tileRatio / widthA, -posA.height / 2); + gl.uniform2f(program.u_patternscale_b, tileRatio / widthB, -posB.height / 2); + gl.uniform1f(program.u_sdfgamma, painter.lineAtlas.width / (Math.min(widthA, widthB) * 256 * browser.devicePixelRatio) / 2); + + } else if (image) { + imagePosA = painter.spriteAtlas.getPosition(image.from, true); + imagePosB = painter.spriteAtlas.getPosition(image.to, true); + if (!imagePosA || !imagePosB) return; + + gl.uniform2f(program.u_pattern_size_a, imagePosA.size[0] * image.fromScale / tileRatio, imagePosB.size[1]); + gl.uniform2f(program.u_pattern_size_b, imagePosB.size[0] * image.toScale / tileRatio, imagePosB.size[1]); + } + + gl.uniform2f(program.u_gl_units_to_pixels, 1 / painter.transform.pixelsToGLUnits[0], 1 / painter.transform.pixelsToGLUnits[1]); + } + + if (programChanged) { + + if (dasharray) { + gl.uniform1i(program.u_image, 0); + gl.activeTexture(gl.TEXTURE0); + painter.lineAtlas.bind(gl); + + gl.uniform1f(program.u_tex_y_a, posA.y); + gl.uniform1f(program.u_tex_y_b, posB.y); + gl.uniform1f(program.u_mix, dasharray.t); + + } else if (image) { + gl.uniform1i(program.u_image, 0); + gl.activeTexture(gl.TEXTURE0); + painter.spriteAtlas.bind(gl, true); + + gl.uniform2fv(program.u_pattern_tl_a, imagePosA.tl); + gl.uniform2fv(program.u_pattern_br_a, imagePosA.br); + gl.uniform2fv(program.u_pattern_tl_b, imagePosB.tl); + gl.uniform2fv(program.u_pattern_br_b, imagePosB.br); + gl.uniform1f(program.u_fade, image.t); + } + gl.uniform1f(program.u_width, layer.paint['line-width']); + } + + painter.enableTileClippingMask(coord); + + var posMatrix = painter.translatePosMatrix(coord.posMatrix, tile, layer.paint['line-translate'], layer.paint['line-translate-anchor']); + gl.uniformMatrix4fv(program.u_matrix, false, posMatrix); + + gl.uniform1f(program.u_ratio, 1 / pixelsToTileUnits(tile, 1, painter.transform.zoom)); + + for (var i = 0, list = buffers.segments; i < list.length; i += 1) { + var segment = list[i]; + + segment.vaos[layer.id].bind(gl, program, buffers.layoutVertexBuffer, buffers.elementBuffer, layerData.paintVertexBuffer, segment.vertexOffset); + gl.drawElements(gl.TRIANGLES, segment.primitiveLength * 3, gl.UNSIGNED_SHORT, segment.primitiveOffset * 3 * 2); + } +} + +},{"../source/pixels_to_tile_units":46,"../util/browser":110}],32:[function(require,module,exports){ +'use strict'; + +var util = require('../util/util'); + +module.exports = drawRaster; + +function drawRaster(painter, sourceCache, layer, coords) { + if (painter.isOpaquePass) return; + + var gl = painter.gl; + + gl.enable(gl.DEPTH_TEST); + painter.depthMask(true); + + // Change depth function to prevent double drawing in areas where tiles overlap. + gl.depthFunc(gl.LESS); + + var minTileZ = coords.length && coords[0].z; + + for (var i = 0; i < coords.length; i++) { + var coord = coords[i]; + // set the lower zoom level to sublayer 0, and higher zoom levels to higher sublayers + painter.setDepthSublayer(coord.z - minTileZ); + drawRasterTile(painter, sourceCache, layer, coord); + } + + gl.depthFunc(gl.LEQUAL); +} + +function drawRasterTile(painter, sourceCache, layer, coord) { + + var gl = painter.gl; + + gl.disable(gl.STENCIL_TEST); + + var tile = sourceCache.getTile(coord); + var posMatrix = painter.transform.calculatePosMatrix(coord, sourceCache.getSource().maxzoom); + + tile.registerFadeDuration(painter.style.animationLoop, layer.paint['raster-fade-duration']); + + var program = painter.useProgram('raster'); + gl.uniformMatrix4fv(program.u_matrix, false, posMatrix); + + // color parameters + gl.uniform1f(program.u_brightness_low, layer.paint['raster-brightness-min']); + gl.uniform1f(program.u_brightness_high, layer.paint['raster-brightness-max']); + gl.uniform1f(program.u_saturation_factor, saturationFactor(layer.paint['raster-saturation'])); + gl.uniform1f(program.u_contrast_factor, contrastFactor(layer.paint['raster-contrast'])); + gl.uniform3fv(program.u_spin_weights, spinWeights(layer.paint['raster-hue-rotate'])); + + var parentTile = tile.sourceCache && tile.sourceCache.findLoadedParent(coord, 0, {}), + fade = getFadeValues(tile, parentTile, layer, painter.transform); + + var parentScaleBy, parentTL; + + gl.activeTexture(gl.TEXTURE0); + gl.bindTexture(gl.TEXTURE_2D, tile.texture); + + gl.activeTexture(gl.TEXTURE1); + + if (parentTile) { + gl.bindTexture(gl.TEXTURE_2D, parentTile.texture); + parentScaleBy = Math.pow(2, parentTile.coord.z - tile.coord.z); + parentTL = [tile.coord.x * parentScaleBy % 1, tile.coord.y * parentScaleBy % 1]; + + } else { + gl.bindTexture(gl.TEXTURE_2D, tile.texture); + } + + // cross-fade parameters + gl.uniform2fv(program.u_tl_parent, parentTL || [0, 0]); + gl.uniform1f(program.u_scale_parent, parentScaleBy || 1); + gl.uniform1f(program.u_buffer_scale, 1); + gl.uniform1f(program.u_fade_t, fade.mix); + gl.uniform1f(program.u_opacity, fade.opacity * layer.paint['raster-opacity']); + gl.uniform1i(program.u_image0, 0); + gl.uniform1i(program.u_image1, 1); + + var buffer = tile.boundsBuffer || painter.rasterBoundsBuffer; + var vao = tile.boundsVAO || painter.rasterBoundsVAO; + vao.bind(gl, program, buffer); + gl.drawArrays(gl.TRIANGLE_STRIP, 0, buffer.length); +} + +function spinWeights(angle) { + angle *= Math.PI / 180; + var s = Math.sin(angle); + var c = Math.cos(angle); + return [ + (2 * c + 1) / 3, + (-Math.sqrt(3) * s - c + 1) / 3, + (Math.sqrt(3) * s - c + 1) / 3 + ]; +} + +function contrastFactor(contrast) { + return contrast > 0 ? + 1 / (1 - contrast) : + 1 + contrast; +} + +function saturationFactor(saturation) { + return saturation > 0 ? + 1 - 1 / (1.001 - saturation) : + -saturation; +} + +function getFadeValues(tile, parentTile, layer, transform) { + var fadeDuration = layer.paint['raster-fade-duration']; + + if (tile.sourceCache && fadeDuration > 0) { + var now = Date.now(); + var sinceTile = (now - tile.timeAdded) / fadeDuration; + var sinceParent = parentTile ? (now - parentTile.timeAdded) / fadeDuration : -1; + + var source = tile.sourceCache.getSource(); + var idealZ = transform.coveringZoomLevel({ + tileSize: source.tileSize, + roundZoom: source.roundZoom + }); + + // if no parent or parent is older, fade in; if parent is younger, fade out + var fadeIn = !parentTile || Math.abs(parentTile.coord.z - idealZ) > Math.abs(tile.coord.z - idealZ); + + var childOpacity = util.clamp(fadeIn ? sinceTile : 1 - sinceParent, 0, 1); + + if (parentTile) { + return { + opacity: 1, + mix: 1 - childOpacity + }; + } else { + return { + opacity: childOpacity, + mix: 0 + }; + } + } else { + return { + opacity: 1, + mix: 0 + }; + } +} + +},{"../util/util":129}],33:[function(require,module,exports){ +'use strict'; + +var browser = require('../util/browser'); +var drawCollisionDebug = require('./draw_collision_debug'); +var pixelsToTileUnits = require('../source/pixels_to_tile_units'); + +module.exports = drawSymbols; + +var sdfPx = 8; +var blurOffset = 1.19; +var haloOffset = 6; +var gamma = 0.105 / browser.devicePixelRatio; + +function drawSymbols(painter, sourceCache, layer, coords) { + if (painter.isOpaquePass) return; + + var drawAcrossEdges = + !layer.layout['text-allow-overlap'] && + !layer.layout['icon-allow-overlap'] && + !layer.layout['text-ignore-placement'] && + !layer.layout['icon-ignore-placement']; + + var gl = painter.gl; + + // Disable the stencil test so that labels aren't clipped to tile boundaries. + // + // Layers with features that may be drawn overlapping aren't clipped. These + // layers are sorted in the y direction, and to draw the correct ordering near + // tile edges the icons are included in both tiles and clipped when drawing. + if (drawAcrossEdges) { + gl.disable(gl.STENCIL_TEST); + } else { + gl.enable(gl.STENCIL_TEST); + } + + painter.setDepthSublayer(0); + painter.depthMask(false); + + drawLayerSymbols(painter, sourceCache, layer, coords, false, + layer.paint['icon-translate'], + layer.paint['icon-translate-anchor'], + layer.layout['icon-rotation-alignment'], + // icon-pitch-alignment is not yet implemented + // and we simply inherit the rotation alignment + layer.layout['icon-rotation-alignment'], + layer.layout['icon-size'], + layer.paint['icon-halo-width'], + layer.paint['icon-halo-color'], + layer.paint['icon-halo-blur'], + layer.paint['icon-opacity'], + layer.paint['icon-color'] + ); + + drawLayerSymbols(painter, sourceCache, layer, coords, true, + layer.paint['text-translate'], + layer.paint['text-translate-anchor'], + layer.layout['text-rotation-alignment'], + layer.layout['text-pitch-alignment'], + layer.layout['text-size'], + layer.paint['text-halo-width'], + layer.paint['text-halo-color'], + layer.paint['text-halo-blur'], + layer.paint['text-opacity'], + layer.paint['text-color'] + ); + + if (sourceCache.map.showCollisionBoxes) { + drawCollisionDebug(painter, sourceCache, layer, coords); + } +} + +function drawLayerSymbols(painter, sourceCache, layer, coords, isText, translate, translateAnchor, + rotationAlignment, pitchAlignment, size, haloWidth, haloColor, haloBlur, opacity, color) { + + if (!isText && painter.style.sprite && !painter.style.sprite.loaded()) + return; + + var gl = painter.gl; + + var rotateWithMap = rotationAlignment === 'map'; + var pitchWithMap = pitchAlignment === 'map'; + + var depthOn = pitchWithMap; + + if (depthOn) { + gl.enable(gl.DEPTH_TEST); + } else { + gl.disable(gl.DEPTH_TEST); + } + + var program, prevFontstack; + + for (var i = 0, list = coords; i < list.length; i += 1) { + var coord = list[i]; + + var tile = sourceCache.getTile(coord); + var bucket = tile.getBucket(layer); + if (!bucket) continue; + var buffers = isText ? bucket.buffers.glyph : bucket.buffers.icon; + if (!buffers || !buffers.segments.length) continue; + + var isSDF = isText || bucket.sdfIcons; + + if (!program || bucket.fontstack !== prevFontstack) { + program = painter.useProgram(isSDF ? 'symbolSDF' : 'symbolIcon'); + + setSymbolDrawState(program, painter, isText, isSDF, rotateWithMap, pitchWithMap, bucket.fontstack, size, + bucket.iconsNeedLinear, isText ? bucket.adjustedTextSize : bucket.adjustedIconSize, opacity); + } + + painter.enableTileClippingMask(coord); + + gl.uniformMatrix4fv(program.u_matrix, false, + painter.translatePosMatrix(coord.posMatrix, tile, translate, translateAnchor)); + + drawTileSymbols(program, painter, layer, tile, buffers, isText, isSDF, + pitchWithMap, size, haloWidth, haloColor, haloBlur, color); + + prevFontstack = bucket.fontstack; + } + + if (!depthOn) gl.enable(gl.DEPTH_TEST); +} + +function setSymbolDrawState(program, painter, isText, isSDF, rotateWithMap, pitchWithMap, fontstack, size, + iconsNeedLinear, adjustedSize, opacity) { + + var gl = painter.gl; + var tr = painter.transform; + + gl.uniform1i(program.u_rotate_with_map, rotateWithMap); + gl.uniform1i(program.u_pitch_with_map, pitchWithMap); + + gl.activeTexture(gl.TEXTURE0); + gl.uniform1i(program.u_texture, 0); + + if (isText) { + // use the fonstack used when parsing the tile, not the fontstack + // at the current zoom level (layout['text-font']). + var glyphAtlas = fontstack && painter.glyphSource.getGlyphAtlas(fontstack); + if (!glyphAtlas) return; + + glyphAtlas.updateTexture(gl); + gl.uniform2f(program.u_texsize, glyphAtlas.width / 4, glyphAtlas.height / 4); + } else { + var mapMoving = painter.options.rotating || painter.options.zooming; + var iconScaled = size !== 1 || browser.devicePixelRatio !== painter.spriteAtlas.pixelRatio || iconsNeedLinear; + var iconTransformed = pitchWithMap || tr.pitch; + painter.spriteAtlas.bind(gl, isSDF || mapMoving || iconScaled || iconTransformed); + gl.uniform2f(program.u_texsize, painter.spriteAtlas.width / 4, painter.spriteAtlas.height / 4); + } + + gl.activeTexture(gl.TEXTURE1); + painter.frameHistory.bind(gl); + gl.uniform1i(program.u_fadetexture, 1); + + // adjust min/max zooms for variable font sizes + var zoomAdjust = Math.log(size / adjustedSize) / Math.LN2 || 0; + gl.uniform1f(program.u_zoom, (tr.zoom - zoomAdjust) * 10); // current zoom level + + gl.uniform1f(program.u_pitch, tr.pitch / 360 * 2 * Math.PI); + gl.uniform1f(program.u_bearing, tr.bearing / 360 * 2 * Math.PI); + gl.uniform1f(program.u_aspect_ratio, tr.width / tr.height); + + gl.uniform1f(program.u_opacity, opacity); +} + +function drawTileSymbols(program, painter, layer, tile, buffers, isText, isSDF, + pitchWithMap, size, haloWidth, haloColor, haloBlur, color) { + + var gl = painter.gl; + var tr = painter.transform; + + var fontScale = size / (isText ? 24 : 1); + + if (pitchWithMap) { + var s = pixelsToTileUnits(tile, fontScale, tr.zoom); + gl.uniform2f(program.u_extrude_scale, s, s); + } else { + var s$1 = tr.cameraToCenterDistance * fontScale; + gl.uniform2f(program.u_extrude_scale, tr.pixelsToGLUnits[0] * s$1, tr.pixelsToGLUnits[1] * s$1); + } + + if (isSDF) { + var gammaScale = fontScale * (pitchWithMap ? Math.cos(tr._pitch) : 1) * tr.cameraToCenterDistance; + + if (haloWidth) { // Draw halo underneath the text. + gl.uniform1f(program.u_gamma, (haloBlur * blurOffset / sdfPx + gamma) / gammaScale); + gl.uniform4fv(program.u_color, haloColor); + gl.uniform1f(program.u_buffer, (haloOffset - haloWidth / fontScale) / sdfPx); + + drawSymbolElements(buffers, layer, gl, program); + } + + gl.uniform1f(program.u_gamma, gamma / gammaScale); + gl.uniform4fv(program.u_color, color); + gl.uniform1f(program.u_buffer, (256 - 64) / 256); + } + + drawSymbolElements(buffers, layer, gl, program); +} + +function drawSymbolElements(buffers, layer, gl, program) { + for (var i = 0, list = buffers.segments; i < list.length; i += 1) { + var segment = list[i]; + + segment.vaos[layer.id].bind(gl, program, buffers.layoutVertexBuffer, buffers.elementBuffer, null, segment.vertexOffset); + gl.drawElements(gl.TRIANGLES, segment.primitiveLength * 3, gl.UNSIGNED_SHORT, segment.primitiveOffset * 3 * 2); + } +} + +},{"../source/pixels_to_tile_units":46,"../util/browser":110,"./draw_collision_debug":27}],34:[function(require,module,exports){ +'use strict'; + +var FrameHistory = function FrameHistory() { + this.changeTimes = new Float64Array(256); + this.changeOpacities = new Uint8Array(256); + this.opacities = new Uint8ClampedArray(256); + this.array = new Uint8Array(this.opacities.buffer); + + this.previousZoom = 0; + this.firstFrame = true; +}; + +FrameHistory.prototype.record = function record (now, zoom, duration) { + var this$1 = this; + + if (this.firstFrame) { + now = 0; + this.firstFrame = false; + } + + zoom = Math.floor(zoom * 10); + + var z; + if (zoom < this.previousZoom) { + for (z = zoom + 1; z <= this.previousZoom; z++) { + this$1.changeTimes[z] = now; + this$1.changeOpacities[z] = this$1.opacities[z]; + } + } else { + for (z = zoom; z > this.previousZoom; z--) { + this$1.changeTimes[z] = now; + this$1.changeOpacities[z] = this$1.opacities[z]; + } + } + + for (z = 0; z < 256; z++) { + var timeSince = now - this$1.changeTimes[z]; + var opacityChange = (duration ? timeSince / duration : 1) * 255; + if (z <= zoom) { + this$1.opacities[z] = this$1.changeOpacities[z] + opacityChange; + } else { + this$1.opacities[z] = this$1.changeOpacities[z] - opacityChange; + } + } + + this.changed = true; + this.previousZoom = zoom; +}; + +FrameHistory.prototype.bind = function bind (gl) { + if (!this.texture) { + this.texture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.texture); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.ALPHA, 256, 1, 0, gl.ALPHA, gl.UNSIGNED_BYTE, this.array); + + } else { + gl.bindTexture(gl.TEXTURE_2D, this.texture); + if (this.changed) { + gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, 256, 1, gl.ALPHA, gl.UNSIGNED_BYTE, this.array); + this.changed = false; + } + } +}; + +module.exports = FrameHistory; + +},{}],35:[function(require,module,exports){ +'use strict'; + +var util = require('../util/util'); + +/** + * A LineAtlas lets us reuse rendered dashed lines + * by writing many of them to a texture and then fetching their positions + * using .getDash. + * + * @param {number} width + * @param {number} height + * @private + */ +var LineAtlas = function LineAtlas(width, height) { + this.width = width; + this.height = height; + this.nextRow = 0; + + this.bytes = 4; + this.data = new Uint8Array(this.width * this.height * this.bytes); + + this.positions = {}; +}; + +LineAtlas.prototype.setSprite = function setSprite (sprite) { + this.sprite = sprite; +}; + +/** + * Get or create a dash line pattern. + * + * @param {Array} dasharray + * @param {boolean} round whether to add circle caps in between dash segments + * @returns {Object} position of dash texture in { y, height, width } + * @private + */ +LineAtlas.prototype.getDash = function getDash (dasharray, round) { + var key = dasharray.join(",") + round; + + if (!this.positions[key]) { + this.positions[key] = this.addDash(dasharray, round); + } + return this.positions[key]; +}; + +LineAtlas.prototype.addDash = function addDash (dasharray, round) { + var this$1 = this; + + + var n = round ? 7 : 0; + var height = 2 * n + 1; + var offset = 128; + + if (this.nextRow + height > this.height) { + util.warnOnce('LineAtlas out of space'); + return null; + } + + var length = 0; + for (var i = 0; i < dasharray.length; i++) { + length += dasharray[i]; + } + + var stretch = this.width / length; + var halfWidth = stretch / 2; + + // If dasharray has an odd length, both the first and last parts + // are dashes and should be joined seamlessly. + var oddLength = dasharray.length % 2 === 1; + + for (var y = -n; y <= n; y++) { + var row = this$1.nextRow + n + y; + var index = this$1.width * row; + + var left = oddLength ? -dasharray[dasharray.length - 1] : 0; + var right = dasharray[0]; + var partIndex = 1; + + for (var x = 0; x < this.width; x++) { + + while (right < x / stretch) { + left = right; + right = right + dasharray[partIndex]; + + if (oddLength && partIndex === dasharray.length - 1) { + right += dasharray[0]; + } + + partIndex++; + } + + var distLeft = Math.abs(x - left * stretch); + var distRight = Math.abs(x - right * stretch); + var dist = Math.min(distLeft, distRight); + var inside = (partIndex % 2) === 1; + var signedDistance; + + if (round) { + // Add circle caps + var distMiddle = n ? y / n * (halfWidth + 1) : 0; + if (inside) { + var distEdge = halfWidth - Math.abs(distMiddle); + signedDistance = Math.sqrt(dist * dist + distEdge * distEdge); + } else { + signedDistance = halfWidth - Math.sqrt(dist * dist + distMiddle * distMiddle); + } + } else { + signedDistance = (inside ? 1 : -1) * dist; + } + + this$1.data[3 + (index + x) * 4] = Math.max(0, Math.min(255, signedDistance + offset)); + } + } + + var pos = { + y: (this.nextRow + n + 0.5) / this.height, + height: 2 * n / this.height, + width: length + }; + + this.nextRow += height; + this.dirty = true; + + return pos; +}; + +LineAtlas.prototype.bind = function bind (gl) { + if (!this.texture) { + this.texture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.texture); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, this.data); + + } else { + gl.bindTexture(gl.TEXTURE_2D, this.texture); + + if (this.dirty) { + this.dirty = false; + gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, this.width, this.height, gl.RGBA, gl.UNSIGNED_BYTE, this.data); + } + } +}; + +module.exports = LineAtlas; + +},{"../util/util":129}],36:[function(require,module,exports){ +'use strict'; + +var browser = require('../util/browser'); +var mat4 = require('@mapbox/gl-matrix').mat4; +var FrameHistory = require('./frame_history'); +var SourceCache = require('../source/source_cache'); +var EXTENT = require('../data/extent'); +var pixelsToTileUnits = require('../source/pixels_to_tile_units'); +var util = require('../util/util'); +var Buffer = require('../data/buffer'); +var VertexArrayObject = require('./vertex_array_object'); +var RasterBoundsArray = require('../data/raster_bounds_array'); +var PosArray = require('../data/pos_array'); +var ProgramConfiguration = require('../data/program_configuration'); +var shaders = require('./shaders'); +var assert = require('assert'); + +var draw = { + symbol: require('./draw_symbol'), + circle: require('./draw_circle'), + line: require('./draw_line'), + fill: require('./draw_fill'), + 'fill-extrusion': require('./draw_fill_extrusion'), + raster: require('./draw_raster'), + background: require('./draw_background'), + debug: require('./draw_debug') +}; + +/** + * Initialize a new painter object. + * + * @param {Canvas} gl an experimental-webgl drawing context + * @private + */ +var Painter = function Painter(gl, transform) { + this.gl = gl; + this.transform = transform; + + this.reusableTextures = { + tiles: {}, + viewport: null + }; + this.preFbos = {}; + + this.frameHistory = new FrameHistory(); + + this.setup(); + + // Within each layer there are multiple distinct z-planes that can be drawn to. + // This is implemented using the WebGL depth buffer. + this.numSublayers = SourceCache.maxUnderzooming + SourceCache.maxOverzooming + 1; + this.depthEpsilon = 1 / Math.pow(2, 16); + + this.lineWidthRange = gl.getParameter(gl.ALIASED_LINE_WIDTH_RANGE); + + this.basicFillProgramConfiguration = ProgramConfiguration.createStatic(['color', 'opacity']); + this.emptyProgramConfiguration = new ProgramConfiguration(); +}; + +/* + * Update the GL viewport, projection matrix, and transforms to compensate + * for a new width and height value. + */ +Painter.prototype.resize = function resize (width, height) { + var gl = this.gl; + + this.width = width * browser.devicePixelRatio; + this.height = height * browser.devicePixelRatio; + gl.viewport(0, 0, this.width, this.height); +}; + +Painter.prototype.setup = function setup () { + var gl = this.gl; + + gl.verbose = true; + + // We are blending the new pixels *behind* the existing pixels. That way we can + // draw front-to-back and use then stencil buffer to cull opaque pixels early. + gl.enable(gl.BLEND); + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + + gl.enable(gl.STENCIL_TEST); + + gl.enable(gl.DEPTH_TEST); + gl.depthFunc(gl.LEQUAL); + + this._depthMask = false; + gl.depthMask(false); + + var tileExtentArray = new PosArray(); + tileExtentArray.emplaceBack(0, 0); + tileExtentArray.emplaceBack(EXTENT, 0); + tileExtentArray.emplaceBack(0, EXTENT); + tileExtentArray.emplaceBack(EXTENT, EXTENT); + this.tileExtentBuffer = Buffer.fromStructArray(tileExtentArray, Buffer.BufferType.VERTEX); + this.tileExtentVAO = new VertexArrayObject(); + this.tileExtentPatternVAO = new VertexArrayObject(); + + var debugArray = new PosArray(); + debugArray.emplaceBack(0, 0); + debugArray.emplaceBack(EXTENT, 0); + debugArray.emplaceBack(EXTENT, EXTENT); + debugArray.emplaceBack(0, EXTENT); + debugArray.emplaceBack(0, 0); + this.debugBuffer = Buffer.fromStructArray(debugArray, Buffer.BufferType.VERTEX); + this.debugVAO = new VertexArrayObject(); + + var rasterBoundsArray = new RasterBoundsArray(); + rasterBoundsArray.emplaceBack(0, 0, 0, 0); + rasterBoundsArray.emplaceBack(EXTENT, 0, 32767, 0); + rasterBoundsArray.emplaceBack(0, EXTENT, 0, 32767); + rasterBoundsArray.emplaceBack(EXTENT, EXTENT, 32767, 32767); + this.rasterBoundsBuffer = Buffer.fromStructArray(rasterBoundsArray, Buffer.BufferType.VERTEX); + this.rasterBoundsVAO = new VertexArrayObject(); +}; + +/* + * Reset the color buffers of the drawing canvas. + */ +Painter.prototype.clearColor = function clearColor () { + var gl = this.gl; + gl.clearColor(0, 0, 0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); +}; + +/* + * Reset the drawing canvas by clearing the stencil buffer so that we can draw + * new tiles at the same location, while retaining previously drawn pixels. + */ +Painter.prototype.clearStencil = function clearStencil () { + var gl = this.gl; + gl.clearStencil(0x0); + gl.stencilMask(0xFF); + gl.clear(gl.STENCIL_BUFFER_BIT); +}; + +Painter.prototype.clearDepth = function clearDepth () { + var gl = this.gl; + gl.clearDepth(1); + this.depthMask(true); + gl.clear(gl.DEPTH_BUFFER_BIT); +}; + +Painter.prototype._renderTileClippingMasks = function _renderTileClippingMasks (coords) { + var this$1 = this; + + var gl = this.gl; + gl.colorMask(false, false, false, false); + this.depthMask(false); + gl.disable(gl.DEPTH_TEST); + gl.enable(gl.STENCIL_TEST); + + // Only write clipping IDs to the last 5 bits. The first three are used for drawing fills. + gl.stencilMask(0xF8); + // Tests will always pass, and ref value will be written to stencil buffer. + gl.stencilOp(gl.KEEP, gl.KEEP, gl.REPLACE); + + var idNext = 1; + this._tileClippingMaskIDs = {}; + + for (var i = 0, list = coords; i < list.length; i += 1) { + var coord = list[i]; + + var id = this$1._tileClippingMaskIDs[coord.id] = (idNext++) << 3; + + gl.stencilFunc(gl.ALWAYS, id, 0xF8); + + var program = this$1.useProgram('fill', this$1.basicFillProgramConfiguration); + gl.uniformMatrix4fv(program.u_matrix, false, coord.posMatrix); + + // Draw the clipping mask + this$1.tileExtentVAO.bind(gl, program, this$1.tileExtentBuffer); + gl.drawArrays(gl.TRIANGLE_STRIP, 0, this$1.tileExtentBuffer.length); + } + + gl.stencilMask(0x00); + gl.colorMask(true, true, true, true); + this.depthMask(true); + gl.enable(gl.DEPTH_TEST); +}; + +Painter.prototype.enableTileClippingMask = function enableTileClippingMask (coord) { + var gl = this.gl; + gl.stencilFunc(gl.EQUAL, this._tileClippingMaskIDs[coord.id], 0xF8); +}; + +// Overridden by headless tests. +Painter.prototype.prepareBuffers = function prepareBuffers () {}; + +Painter.prototype.bindDefaultFramebuffer = function bindDefaultFramebuffer () { + var gl = this.gl; + gl.bindFramebuffer(gl.FRAMEBUFFER, null); +}; + +Painter.prototype.render = function render (style, options) { + this.style = style; + this.options = options; + + this.lineAtlas = style.lineAtlas; + + this.spriteAtlas = style.spriteAtlas; + this.spriteAtlas.setSprite(style.sprite); + + this.glyphSource = style.glyphSource; + + this.frameHistory.record(Date.now(), this.transform.zoom, style.getTransition().duration); + + this.prepareBuffers(); + this.clearColor(); + this.clearDepth(); + + this.showOverdrawInspector(options.showOverdrawInspector); + + this.depthRange = (style._order.length + 2) * this.numSublayers * this.depthEpsilon; + + this.isOpaquePass = true; + this.renderPass(); + this.isOpaquePass = false; + this.renderPass(); + + if (this.options.showTileBoundaries) { + var sourceCache = this.style.sourceCaches[Object.keys(this.style.sourceCaches)[0]]; + if (sourceCache) { + draw.debug(this, sourceCache, sourceCache.getVisibleCoordinates()); + } + } +}; + +Painter.prototype.renderPass = function renderPass () { + var this$1 = this; + + var layerIds = this.style._order; + + var sourceCache, coords; + + this.currentLayer = this.isOpaquePass ? layerIds.length - 1 : 0; + + if (this.isOpaquePass) { + if (!this._showOverdrawInspector) { + this.gl.disable(this.gl.BLEND); + } + } else { + this.gl.enable(this.gl.BLEND); + } + + for (var i = 0; i < layerIds.length; i++) { + var layer = this$1.style._layers[layerIds[this$1.currentLayer]]; + + if (layer.source !== (sourceCache && sourceCache.id)) { + sourceCache = this$1.style.sourceCaches[layer.source]; + coords = []; + + if (sourceCache) { + if (sourceCache.prepare) sourceCache.prepare(); + this$1.clearStencil(); + coords = sourceCache.getVisibleCoordinates(); + if (sourceCache.getSource().isTileClipped) { + this$1._renderTileClippingMasks(coords); + } + } + + if (!this$1.isOpaquePass) { + coords.reverse(); + } + } + + this$1.renderLayer(this$1, sourceCache, layer, coords); + this$1.currentLayer += this$1.isOpaquePass ? -1 : 1; + } +}; + +Painter.prototype.depthMask = function depthMask (mask) { + if (mask !== this._depthMask) { + this._depthMask = mask; + this.gl.depthMask(mask); + } +}; + +Painter.prototype.renderLayer = function renderLayer (painter, sourceCache, layer, coords) { + if (layer.isHidden(this.transform.zoom)) return; + if (layer.type !== 'background' && !coords.length) return; + this.id = layer.id; + + draw[layer.type](painter, sourceCache, layer, coords); +}; + +Painter.prototype.setDepthSublayer = function setDepthSublayer (n) { + var farDepth = 1 - ((1 + this.currentLayer) * this.numSublayers + n) * this.depthEpsilon; + var nearDepth = farDepth - 1 + this.depthRange; + this.gl.depthRange(nearDepth, farDepth); +}; + +Painter.prototype.translatePosMatrix = function translatePosMatrix (matrix, tile, translate, anchor) { + if (!translate[0] && !translate[1]) return matrix; + + if (anchor === 'viewport') { + var sinA = Math.sin(-this.transform.angle); + var cosA = Math.cos(-this.transform.angle); + translate = [ + translate[0] * cosA - translate[1] * sinA, + translate[0] * sinA + translate[1] * cosA + ]; + } + + var translation = [ + pixelsToTileUnits(tile, translate[0], this.transform.zoom), + pixelsToTileUnits(tile, translate[1], this.transform.zoom), + 0 + ]; + + var translatedMatrix = new Float32Array(16); + mat4.translate(translatedMatrix, matrix, translation); + return translatedMatrix; +}; + +Painter.prototype.saveTileTexture = function saveTileTexture (texture) { + var textures = this.reusableTextures.tiles[texture.size]; + if (!textures) { + this.reusableTextures.tiles[texture.size] = [texture]; + } else { + textures.push(texture); + } +}; + +Painter.prototype.saveViewportTexture = function saveViewportTexture (texture) { + this.reusableTextures.viewport = texture; +}; + +Painter.prototype.getTileTexture = function getTileTexture (size) { + var textures = this.reusableTextures.tiles[size]; + return textures && textures.length > 0 ? textures.pop() : null; +}; + +Painter.prototype.getViewportTexture = function getViewportTexture (width, height) { + var texture = this.reusableTextures.viewport; + if (!texture) return; + + if (texture.width === width && texture.height === height) { + return texture; + } else { + this.gl.deleteTexture(texture); + this.reusableTextures.viewport = null; + return; + } +}; + +Painter.prototype.lineWidth = function lineWidth (width) { + this.gl.lineWidth(util.clamp(width, this.lineWidthRange[0], this.lineWidthRange[1])); +}; + +Painter.prototype.showOverdrawInspector = function showOverdrawInspector (enabled) { + if (!enabled && !this._showOverdrawInspector) return; + this._showOverdrawInspector = enabled; + + var gl = this.gl; + if (enabled) { + gl.blendFunc(gl.CONSTANT_COLOR, gl.ONE); + var numOverdrawSteps = 8; + var a = 1 / numOverdrawSteps; + gl.blendColor(a, a, a, 0); + gl.clearColor(0, 0, 0, 1); + gl.clear(gl.COLOR_BUFFER_BIT); + } else { + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + } +}; + +Painter.prototype.createProgram = function createProgram (name, configuration) { + var gl = this.gl; + var program = gl.createProgram(); + var definition = shaders[name]; + + var definesSource = "#define MAPBOX_GL_JS\n#define DEVICE_PIXEL_RATIO " + (browser.devicePixelRatio.toFixed(1)) + "\n"; + if (this._showOverdrawInspector) { + definesSource += '#define OVERDRAW_INSPECTOR;\n'; + } + + var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER); + gl.shaderSource(fragmentShader, configuration.applyPragmas(definesSource + shaders.prelude.fragmentSource + definition.fragmentSource, 'fragment')); + gl.compileShader(fragmentShader); + assert(gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS), gl.getShaderInfoLog(fragmentShader)); + gl.attachShader(program, fragmentShader); + + var vertexShader = gl.createShader(gl.VERTEX_SHADER); + gl.shaderSource(vertexShader, configuration.applyPragmas(definesSource + shaders.prelude.vertexSource + definition.vertexSource, 'vertex')); + gl.compileShader(vertexShader); + assert(gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS), gl.getShaderInfoLog(vertexShader)); + gl.attachShader(program, vertexShader); + + gl.linkProgram(program); + assert(gl.getProgramParameter(program, gl.LINK_STATUS), gl.getProgramInfoLog(program)); + + var numAttributes = gl.getProgramParameter(program, gl.ACTIVE_ATTRIBUTES); + var result = {program: program, numAttributes: numAttributes}; + + for (var i = 0; i < numAttributes; i++) { + var attribute = gl.getActiveAttrib(program, i); + result[attribute.name] = gl.getAttribLocation(program, attribute.name); + } + var numUniforms = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS); + for (var i$1 = 0; i$1 < numUniforms; i$1++) { + var uniform = gl.getActiveUniform(program, i$1); + result[uniform.name] = gl.getUniformLocation(program, uniform.name); + } + return result; +}; + +Painter.prototype._createProgramCached = function _createProgramCached (name, programConfiguration) { + this.cache = this.cache || {}; + var key = "" + name + (programConfiguration.cacheKey || '') + (this._showOverdrawInspector ? '/overdraw' : ''); + if (!this.cache[key]) { + this.cache[key] = this.createProgram(name, programConfiguration); + } + return this.cache[key]; +}; + +Painter.prototype.useProgram = function useProgram (name, programConfiguration) { + var gl = this.gl; + var nextProgram = this._createProgramCached(name, programConfiguration || this.emptyProgramConfiguration); + + if (this.currentProgram !== nextProgram) { + gl.useProgram(nextProgram.program); + this.currentProgram = nextProgram; + } + + return nextProgram; +}; + +module.exports = Painter; + +},{"../data/buffer":8,"../data/extent":11,"../data/pos_array":14,"../data/program_configuration":15,"../data/raster_bounds_array":16,"../source/pixels_to_tile_units":46,"../source/source_cache":51,"../util/browser":110,"../util/util":129,"./draw_background":25,"./draw_circle":26,"./draw_debug":28,"./draw_fill":29,"./draw_fill_extrusion":30,"./draw_line":31,"./draw_raster":32,"./draw_symbol":33,"./frame_history":34,"./shaders":38,"./vertex_array_object":39,"@mapbox/gl-matrix":133,"assert":135}],37:[function(require,module,exports){ +'use strict'; + +var pixelsToTileUnits = require('../source/pixels_to_tile_units'); + +exports.prepare = function (image, painter, program) { + var gl = painter.gl; + + var imagePosA = painter.spriteAtlas.getPosition(image.from, true); + var imagePosB = painter.spriteAtlas.getPosition(image.to, true); + if (!imagePosA || !imagePosB) return; + + gl.uniform1i(program.u_image, 0); + gl.uniform2fv(program.u_pattern_tl_a, imagePosA.tl); + gl.uniform2fv(program.u_pattern_br_a, imagePosA.br); + gl.uniform2fv(program.u_pattern_tl_b, imagePosB.tl); + gl.uniform2fv(program.u_pattern_br_b, imagePosB.br); + gl.uniform1f(program.u_mix, image.t); + gl.uniform2fv(program.u_pattern_size_a, imagePosA.size); + gl.uniform2fv(program.u_pattern_size_b, imagePosB.size); + gl.uniform1f(program.u_scale_a, image.fromScale); + gl.uniform1f(program.u_scale_b, image.toScale); + + gl.activeTexture(gl.TEXTURE0); + painter.spriteAtlas.bind(gl, true); +}; + +exports.setTile = function (tile, painter, program) { + var gl = painter.gl; + + gl.uniform1f(program.u_tile_units_to_pixels, 1 / pixelsToTileUnits(tile, 1, painter.transform.tileZoom)); + + var numTiles = Math.pow(2, tile.coord.z); + var tileSizeAtNearestZoom = tile.tileSize * Math.pow(2, painter.transform.tileZoom) / numTiles; + + var pixelX = tileSizeAtNearestZoom * (tile.coord.x + tile.coord.w * numTiles); + var pixelY = tileSizeAtNearestZoom * tile.coord.y; + + // split the pixel coord into two pairs of 16 bit numbers. The glsl spec only guarantees 16 bits of precision. + gl.uniform2f(program.u_pixel_coord_upper, pixelX >> 16, pixelY >> 16); + gl.uniform2f(program.u_pixel_coord_lower, pixelX & 0xFFFF, pixelY & 0xFFFF); +}; + +},{"../source/pixels_to_tile_units":46}],38:[function(require,module,exports){ +'use strict'; + + +var path = require('path'); + +// readFileSync calls must be written out long-form for brfs. +module.exports = { + prelude: { + fragmentSource: "#ifdef GL_ES\nprecision mediump float;\n#else\n\n#if !defined(lowp)\n#define lowp\n#endif\n\n#if !defined(mediump)\n#define mediump\n#endif\n\n#if !defined(highp)\n#define highp\n#endif\n\n#endif\n", + vertexSource: "#ifdef GL_ES\nprecision highp float;\n#else\n\n#if !defined(lowp)\n#define lowp\n#endif\n\n#if !defined(mediump)\n#define mediump\n#endif\n\n#if !defined(highp)\n#define highp\n#endif\n\n#endif\n\nfloat evaluate_zoom_function_1(const vec4 values, const float t) {\n if (t < 1.0) {\n return mix(values[0], values[1], t);\n } else if (t < 2.0) {\n return mix(values[1], values[2], t - 1.0);\n } else {\n return mix(values[2], values[3], t - 2.0);\n }\n}\nvec4 evaluate_zoom_function_4(const vec4 value0, const vec4 value1, const vec4 value2, const vec4 value3, const float t) {\n if (t < 1.0) {\n return mix(value0, value1, t);\n } else if (t < 2.0) {\n return mix(value1, value2, t - 1.0);\n } else {\n return mix(value2, value3, t - 2.0);\n }\n}\n\n// The offset depends on how many pixels are between the world origin and the edge of the tile:\n// vec2 offset = mod(pixel_coord, size)\n//\n// At high zoom levels there are a ton of pixels between the world origin and the edge of the tile.\n// The glsl spec only guarantees 16 bits of precision for highp floats. We need more than that.\n//\n// The pixel_coord is passed in as two 16 bit values:\n// pixel_coord_upper = floor(pixel_coord / 2^16)\n// pixel_coord_lower = mod(pixel_coord, 2^16)\n//\n// The offset is calculated in a series of steps that should preserve this precision:\nvec2 get_pattern_pos(const vec2 pixel_coord_upper, const vec2 pixel_coord_lower,\n const vec2 pattern_size, const float tile_units_to_pixels, const vec2 pos) {\n\n vec2 offset = mod(mod(mod(pixel_coord_upper, pattern_size) * 256.0, pattern_size) * 256.0 + pixel_coord_lower, pattern_size);\n return (tile_units_to_pixels * pos + offset) / pattern_size;\n}\n" + }, + circle: { + fragmentSource: "#pragma mapbox: define lowp vec4 color\n#pragma mapbox: define mediump float radius\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp vec4 stroke_color\n#pragma mapbox: define mediump float stroke_width\n#pragma mapbox: define lowp float stroke_opacity\n\nvarying vec2 v_extrude;\nvarying lowp float v_antialiasblur;\n\nvoid main() {\n #pragma mapbox: initialize lowp vec4 color\n #pragma mapbox: initialize mediump float radius\n #pragma mapbox: initialize lowp float blur\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize lowp vec4 stroke_color\n #pragma mapbox: initialize mediump float stroke_width\n #pragma mapbox: initialize lowp float stroke_opacity\n\n float extrude_length = length(v_extrude);\n float antialiased_blur = -max(blur, v_antialiasblur);\n\n float opacity_t = smoothstep(0.0, antialiased_blur, extrude_length - 1.0);\n\n float color_t = stroke_width < 0.01 ? 0.0 : smoothstep(\n antialiased_blur,\n 0.0,\n extrude_length - radius / (radius + stroke_width)\n );\n\n gl_FragColor = opacity_t * mix(color * opacity, stroke_color * stroke_opacity, color_t);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n", + vertexSource: "uniform mat4 u_matrix;\nuniform bool u_scale_with_map;\nuniform vec2 u_extrude_scale;\n\nattribute vec2 a_pos;\n\n#pragma mapbox: define lowp vec4 color\n#pragma mapbox: define mediump float radius\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp vec4 stroke_color\n#pragma mapbox: define mediump float stroke_width\n#pragma mapbox: define lowp float stroke_opacity\n\nvarying vec2 v_extrude;\nvarying lowp float v_antialiasblur;\n\nvoid main(void) {\n #pragma mapbox: initialize lowp vec4 color\n #pragma mapbox: initialize mediump float radius\n #pragma mapbox: initialize lowp float blur\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize lowp vec4 stroke_color\n #pragma mapbox: initialize mediump float stroke_width\n #pragma mapbox: initialize lowp float stroke_opacity\n\n // unencode the extrusion vector that we snuck into the a_pos vector\n v_extrude = vec2(mod(a_pos, 2.0) * 2.0 - 1.0);\n\n vec2 extrude = v_extrude * (radius + stroke_width) * u_extrude_scale;\n // multiply a_pos by 0.5, since we had it * 2 in order to sneak\n // in extrusion data\n gl_Position = u_matrix * vec4(floor(a_pos * 0.5), 0, 1);\n\n if (u_scale_with_map) {\n gl_Position.xy += extrude;\n } else {\n gl_Position.xy += extrude * gl_Position.w;\n }\n\n // This is a minimum blur distance that serves as a faux-antialiasing for\n // the circle. since blur is a ratio of the circle's size and the intent is\n // to keep the blur at roughly 1px, the two are inversely related.\n v_antialiasblur = 1.0 / DEVICE_PIXEL_RATIO / (radius + stroke_width);\n}\n" + }, + collisionBox: { + fragmentSource: "uniform float u_zoom;\nuniform float u_maxzoom;\n\nvarying float v_max_zoom;\nvarying float v_placement_zoom;\n\nvoid main() {\n\n float alpha = 0.5;\n\n gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0) * alpha;\n\n if (v_placement_zoom > u_zoom) {\n gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0) * alpha;\n }\n\n if (u_zoom >= v_max_zoom) {\n gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0) * alpha * 0.25;\n }\n\n if (v_placement_zoom >= u_maxzoom) {\n gl_FragColor = vec4(0.0, 0.0, 1.0, 1.0) * alpha * 0.2;\n }\n}\n", + vertexSource: "attribute vec2 a_pos;\nattribute vec2 a_extrude;\nattribute vec2 a_data;\n\nuniform mat4 u_matrix;\nuniform float u_scale;\n\nvarying float v_max_zoom;\nvarying float v_placement_zoom;\n\nvoid main() {\n gl_Position = u_matrix * vec4(a_pos + a_extrude / u_scale, 0.0, 1.0);\n\n v_max_zoom = a_data.x;\n v_placement_zoom = a_data.y;\n}\n" + }, + debug: { + fragmentSource: "uniform lowp vec4 u_color;\n\nvoid main() {\n gl_FragColor = u_color;\n}\n", + vertexSource: "attribute vec2 a_pos;\n\nuniform mat4 u_matrix;\n\nvoid main() {\n gl_Position = u_matrix * vec4(a_pos, step(32767.0, a_pos.x), 1);\n}\n" + }, + fill: { + fragmentSource: "#pragma mapbox: define lowp vec4 color\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize lowp vec4 color\n #pragma mapbox: initialize lowp float opacity\n\n gl_FragColor = color * opacity;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n", + vertexSource: "attribute vec2 a_pos;\n\nuniform mat4 u_matrix;\n\n#pragma mapbox: define lowp vec4 color\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize lowp vec4 color\n #pragma mapbox: initialize lowp float opacity\n\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n}\n" + }, + fillOutline: { + fragmentSource: "#pragma mapbox: define lowp vec4 outline_color\n#pragma mapbox: define lowp float opacity\n\nvarying vec2 v_pos;\n\nvoid main() {\n #pragma mapbox: initialize lowp vec4 outline_color\n #pragma mapbox: initialize lowp float opacity\n\n float dist = length(v_pos - gl_FragCoord.xy);\n float alpha = smoothstep(1.0, 0.0, dist);\n gl_FragColor = outline_color * (alpha * opacity);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n", + vertexSource: "attribute vec2 a_pos;\n\nuniform mat4 u_matrix;\nuniform vec2 u_world;\n\nvarying vec2 v_pos;\n\n#pragma mapbox: define lowp vec4 outline_color\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize lowp vec4 outline_color\n #pragma mapbox: initialize lowp float opacity\n\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n v_pos = (gl_Position.xy / gl_Position.w + 1.0) / 2.0 * u_world;\n}\n" + }, + fillOutlinePattern: { + fragmentSource: "uniform vec2 u_pattern_tl_a;\nuniform vec2 u_pattern_br_a;\nuniform vec2 u_pattern_tl_b;\nuniform vec2 u_pattern_br_b;\nuniform float u_mix;\n\nuniform sampler2D u_image;\n\nvarying vec2 v_pos_a;\nvarying vec2 v_pos_b;\nvarying vec2 v_pos;\n\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize lowp float opacity\n\n vec2 imagecoord = mod(v_pos_a, 1.0);\n vec2 pos = mix(u_pattern_tl_a, u_pattern_br_a, imagecoord);\n vec4 color1 = texture2D(u_image, pos);\n\n vec2 imagecoord_b = mod(v_pos_b, 1.0);\n vec2 pos2 = mix(u_pattern_tl_b, u_pattern_br_b, imagecoord_b);\n vec4 color2 = texture2D(u_image, pos2);\n\n // find distance to outline for alpha interpolation\n\n float dist = length(v_pos - gl_FragCoord.xy);\n float alpha = smoothstep(1.0, 0.0, dist);\n\n\n gl_FragColor = mix(color1, color2, u_mix) * alpha * opacity;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n", + vertexSource: "uniform mat4 u_matrix;\nuniform vec2 u_world;\nuniform vec2 u_pattern_size_a;\nuniform vec2 u_pattern_size_b;\nuniform vec2 u_pixel_coord_upper;\nuniform vec2 u_pixel_coord_lower;\nuniform float u_scale_a;\nuniform float u_scale_b;\nuniform float u_tile_units_to_pixels;\n\nattribute vec2 a_pos;\n\nvarying vec2 v_pos_a;\nvarying vec2 v_pos_b;\nvarying vec2 v_pos;\n\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize lowp float opacity\n\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n\n v_pos_a = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, u_scale_a * u_pattern_size_a, u_tile_units_to_pixels, a_pos);\n v_pos_b = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, u_scale_b * u_pattern_size_b, u_tile_units_to_pixels, a_pos);\n\n v_pos = (gl_Position.xy / gl_Position.w + 1.0) / 2.0 * u_world;\n}\n" + }, + fillPattern: { + fragmentSource: "uniform vec2 u_pattern_tl_a;\nuniform vec2 u_pattern_br_a;\nuniform vec2 u_pattern_tl_b;\nuniform vec2 u_pattern_br_b;\nuniform float u_mix;\n\nuniform sampler2D u_image;\n\nvarying vec2 v_pos_a;\nvarying vec2 v_pos_b;\n\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize lowp float opacity\n\n vec2 imagecoord = mod(v_pos_a, 1.0);\n vec2 pos = mix(u_pattern_tl_a, u_pattern_br_a, imagecoord);\n vec4 color1 = texture2D(u_image, pos);\n\n vec2 imagecoord_b = mod(v_pos_b, 1.0);\n vec2 pos2 = mix(u_pattern_tl_b, u_pattern_br_b, imagecoord_b);\n vec4 color2 = texture2D(u_image, pos2);\n\n gl_FragColor = mix(color1, color2, u_mix) * opacity;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n", + vertexSource: "uniform mat4 u_matrix;\nuniform vec2 u_pattern_size_a;\nuniform vec2 u_pattern_size_b;\nuniform vec2 u_pixel_coord_upper;\nuniform vec2 u_pixel_coord_lower;\nuniform float u_scale_a;\nuniform float u_scale_b;\nuniform float u_tile_units_to_pixels;\n\nattribute vec2 a_pos;\n\nvarying vec2 v_pos_a;\nvarying vec2 v_pos_b;\n\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize lowp float opacity\n\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n\n v_pos_a = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, u_scale_a * u_pattern_size_a, u_tile_units_to_pixels, a_pos);\n v_pos_b = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, u_scale_b * u_pattern_size_b, u_tile_units_to_pixels, a_pos);\n}\n" + }, + fillExtrusion: { + fragmentSource: "varying vec4 v_color;\n#pragma mapbox: define lowp float base\n#pragma mapbox: define lowp float height\n#pragma mapbox: define lowp vec4 color\n\nvoid main() {\n #pragma mapbox: initialize lowp float base\n #pragma mapbox: initialize lowp float height\n #pragma mapbox: initialize lowp vec4 color\n\n gl_FragColor = v_color;\n}\n", + vertexSource: "uniform mat4 u_matrix;\nuniform vec3 u_lightcolor;\nuniform lowp vec3 u_lightpos;\nuniform lowp float u_lightintensity;\nuniform lowp vec4 u_outline_color;\n\nattribute vec2 a_pos;\nattribute vec3 a_normal;\nattribute float a_edgedistance;\n\nvarying vec4 v_color;\n\n#pragma mapbox: define lowp float base\n#pragma mapbox: define lowp float height\n\n#pragma mapbox: define lowp vec4 color\n\nvoid main() {\n #pragma mapbox: initialize lowp float base\n #pragma mapbox: initialize lowp float height\n #pragma mapbox: initialize lowp vec4 color\n\n float ed = a_edgedistance; // use each attrib in order to not trip a VAO assert\n float t = mod(a_normal.x, 2.0);\n\n gl_Position = u_matrix * vec4(a_pos, t > 0.0 ? height : base, 1);\n\n#ifdef OUTLINE\n color = u_outline_color;\n#endif\n\n // Relative luminance (how dark/bright is the surface color?)\n float colorvalue = color.r * 0.2126 + color.g * 0.7152 + color.b * 0.0722;\n\n v_color = vec4(0.0, 0.0, 0.0, 1.0);\n\n // Add slight ambient lighting so no extrusions are totally black\n vec4 ambientlight = vec4(0.03, 0.03, 0.03, 1.0);\n color += ambientlight;\n\n // Calculate cos(theta), where theta is the angle between surface normal and diffuse light ray\n float directional = clamp(dot(a_normal / 16384.0, u_lightpos), 0.0, 1.0);\n\n // Adjust directional so that\n // the range of values for highlight/shading is narrower\n // with lower light intensity\n // and with lighter/brighter surface colors\n directional = mix((1.0 - u_lightintensity), max((1.0 - colorvalue + u_lightintensity), 1.0), directional);\n\n // Add gradient along z axis of side surfaces\n if (a_normal.y != 0.0) {\n directional *= clamp((t + base) * pow(height / 150.0, 0.5), mix(0.7, 0.98, 1.0 - u_lightintensity), 1.0);\n }\n\n // Assign final color based on surface + ambient light color, diffuse light directional, and light color\n // with lower bounds adjusted to hue of light\n // so that shading is tinted with the complementary (opposite) color to the light color\n v_color.r += clamp(color.r * directional * u_lightcolor.r, mix(0.0, 0.3, 1.0 - u_lightcolor.r), 1.0);\n v_color.g += clamp(color.g * directional * u_lightcolor.g, mix(0.0, 0.3, 1.0 - u_lightcolor.g), 1.0);\n v_color.b += clamp(color.b * directional * u_lightcolor.b, mix(0.0, 0.3, 1.0 - u_lightcolor.b), 1.0);\n}\n" + }, + fillExtrusionPattern: { + fragmentSource: "uniform vec2 u_pattern_tl_a;\nuniform vec2 u_pattern_br_a;\nuniform vec2 u_pattern_tl_b;\nuniform vec2 u_pattern_br_b;\nuniform float u_mix;\n\nuniform sampler2D u_image;\n\nvarying vec2 v_pos_a;\nvarying vec2 v_pos_b;\nvarying vec4 v_lighting;\n\n#pragma mapbox: define lowp float base\n#pragma mapbox: define lowp float height\n\nvoid main() {\n #pragma mapbox: initialize lowp float base\n #pragma mapbox: initialize lowp float height\n\n vec2 imagecoord = mod(v_pos_a, 1.0);\n vec2 pos = mix(u_pattern_tl_a, u_pattern_br_a, imagecoord);\n vec4 color1 = texture2D(u_image, pos);\n\n vec2 imagecoord_b = mod(v_pos_b, 1.0);\n vec2 pos2 = mix(u_pattern_tl_b, u_pattern_br_b, imagecoord_b);\n vec4 color2 = texture2D(u_image, pos2);\n\n vec4 mixedColor = mix(color1, color2, u_mix);\n\n gl_FragColor = mixedColor * v_lighting;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n", + vertexSource: "uniform mat4 u_matrix;\nuniform vec2 u_pattern_size_a;\nuniform vec2 u_pattern_size_b;\nuniform vec2 u_pixel_coord_upper;\nuniform vec2 u_pixel_coord_lower;\nuniform float u_scale_a;\nuniform float u_scale_b;\nuniform float u_tile_units_to_pixels;\nuniform float u_height_factor;\n\nuniform vec3 u_lightcolor;\nuniform lowp vec3 u_lightpos;\nuniform lowp float u_lightintensity;\n\nattribute vec2 a_pos;\nattribute vec3 a_normal;\nattribute float a_edgedistance;\n\nvarying vec2 v_pos_a;\nvarying vec2 v_pos_b;\nvarying vec4 v_lighting;\nvarying float v_directional;\n\n#pragma mapbox: define lowp float base\n#pragma mapbox: define lowp float height\n\nvoid main() {\n #pragma mapbox: initialize lowp float base\n #pragma mapbox: initialize lowp float height\n\n float t = mod(a_normal.x, 2.0);\n float z = t > 0.0 ? height : base;\n\n gl_Position = u_matrix * vec4(a_pos, z, 1);\n\n vec2 pos = a_normal.x == 1.0 && a_normal.y == 0.0 && a_normal.z == 16384.0\n ? a_pos // extrusion top\n : vec2(a_edgedistance, z * u_height_factor); // extrusion side\n\n v_pos_a = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, u_scale_a * u_pattern_size_a, u_tile_units_to_pixels, pos);\n v_pos_b = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, u_scale_b * u_pattern_size_b, u_tile_units_to_pixels, pos);\n\n v_lighting = vec4(0.0, 0.0, 0.0, 1.0);\n float directional = clamp(dot(a_normal / 16383.0, u_lightpos), 0.0, 1.0);\n directional = mix((1.0 - u_lightintensity), max((0.5 + u_lightintensity), 1.0), directional);\n\n if (a_normal.y != 0.0) {\n directional *= clamp((t + base) * pow(height / 150.0, 0.5), mix(0.7, 0.98, 1.0 - u_lightintensity), 1.0);\n }\n\n v_lighting.rgb += clamp(directional * u_lightcolor, mix(vec3(0.0), vec3(0.3), 1.0 - u_lightcolor), vec3(1.0));\n}\n" + }, + extrusionTexture: { + fragmentSource: "uniform sampler2D u_texture;\nuniform float u_opacity;\n\nvarying vec2 v_pos;\n\nvoid main() {\n gl_FragColor = texture2D(u_texture, v_pos) * u_opacity;\n}\n", + vertexSource: "uniform mat4 u_matrix;\nuniform int u_xdim;\nuniform int u_ydim;\nattribute vec2 a_pos;\nvarying vec2 v_pos;\n\nvoid main() {\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n\n v_pos.x = a_pos.x / float(u_xdim);\n v_pos.y = 1.0 - a_pos.y / float(u_ydim);\n}\n" + }, + line: { + fragmentSource: "#pragma mapbox: define lowp vec4 color\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n\nvarying vec2 v_width2;\nvarying vec2 v_normal;\nvarying float v_gamma_scale;\n\nvoid main() {\n #pragma mapbox: initialize lowp vec4 color\n #pragma mapbox: initialize lowp float blur\n #pragma mapbox: initialize lowp float opacity\n\n // Calculate the distance of the pixel from the line in pixels.\n float dist = length(v_normal) * v_width2.s;\n\n // Calculate the antialiasing fade factor. This is either when fading in\n // the line in case of an offset line (v_width2.t) or when fading out\n // (v_width2.s)\n float blur2 = (blur + 1.0 / DEVICE_PIXEL_RATIO) * v_gamma_scale;\n float alpha = clamp(min(dist - (v_width2.t - blur2), v_width2.s - dist) / blur2, 0.0, 1.0);\n\n gl_FragColor = color * (alpha * opacity);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n", + vertexSource: "\n\n// the distance over which the line edge fades out.\n// Retina devices need a smaller distance to avoid aliasing.\n#define ANTIALIASING 1.0 / DEVICE_PIXEL_RATIO / 2.0\n\n// floor(127 / 2) == 63.0\n// the maximum allowed miter limit is 2.0 at the moment. the extrude normal is\n// stored in a byte (-128..127). we scale regular normals up to length 63, but\n// there are also \"special\" normals that have a bigger length (of up to 126 in\n// this case).\n// #define scale 63.0\n#define scale 0.015873016\n\nattribute vec2 a_pos;\nattribute vec4 a_data;\n\nuniform mat4 u_matrix;\nuniform mediump float u_ratio;\nuniform mediump float u_width;\nuniform vec2 u_gl_units_to_pixels;\n\nvarying vec2 v_normal;\nvarying vec2 v_width2;\nvarying float v_gamma_scale;\n\n#pragma mapbox: define lowp vec4 color\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define mediump float gapwidth\n#pragma mapbox: define lowp float offset\n\nvoid main() {\n #pragma mapbox: initialize lowp vec4 color\n #pragma mapbox: initialize lowp float blur\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize mediump float gapwidth\n #pragma mapbox: initialize lowp float offset\n\n vec2 a_extrude = a_data.xy - 128.0;\n float a_direction = mod(a_data.z, 4.0) - 1.0;\n\n // We store the texture normals in the most insignificant bit\n // transform y so that 0 => -1 and 1 => 1\n // In the texture normal, x is 0 if the normal points straight up/down and 1 if it's a round cap\n // y is 1 if the normal points up, and -1 if it points down\n mediump vec2 normal = mod(a_pos, 2.0);\n normal.y = sign(normal.y - 0.5);\n v_normal = normal;\n\n\n // these transformations used to be applied in the JS and native code bases. \n // moved them into the shader for clarity and simplicity. \n gapwidth = gapwidth / 2.0;\n float width = u_width / 2.0;\n offset = -1.0 * offset; \n\n float inset = gapwidth + (gapwidth > 0.0 ? ANTIALIASING : 0.0);\n float outset = gapwidth + width * (gapwidth > 0.0 ? 2.0 : 1.0) + ANTIALIASING;\n\n // Scale the extrusion vector down to a normal and then up by the line width\n // of this vertex.\n mediump vec2 dist = outset * a_extrude * scale;\n\n // Calculate the offset when drawing a line that is to the side of the actual line.\n // We do this by creating a vector that points towards the extrude, but rotate\n // it when we're drawing round end points (a_direction = -1 or 1) since their\n // extrude vector points in another direction.\n mediump float u = 0.5 * a_direction;\n mediump float t = 1.0 - abs(u);\n mediump vec2 offset2 = offset * a_extrude * scale * normal.y * mat2(t, -u, u, t);\n\n // Remove the texture normal bit to get the position\n vec2 pos = floor(a_pos * 0.5);\n\n vec4 projected_extrude = u_matrix * vec4(dist / u_ratio, 0.0, 0.0);\n gl_Position = u_matrix * vec4(pos + offset2 / u_ratio, 0.0, 1.0) + projected_extrude;\n\n // calculate how much the perspective view squishes or stretches the extrude\n float extrude_length_without_perspective = length(dist);\n float extrude_length_with_perspective = length(projected_extrude.xy / gl_Position.w * u_gl_units_to_pixels);\n v_gamma_scale = extrude_length_without_perspective / extrude_length_with_perspective;\n\n v_width2 = vec2(outset, inset);\n}\n" + }, + linePattern: { + fragmentSource: "uniform vec2 u_pattern_size_a;\nuniform vec2 u_pattern_size_b;\nuniform vec2 u_pattern_tl_a;\nuniform vec2 u_pattern_br_a;\nuniform vec2 u_pattern_tl_b;\nuniform vec2 u_pattern_br_b;\nuniform float u_fade;\n\nuniform sampler2D u_image;\n\nvarying vec2 v_normal;\nvarying vec2 v_width2;\nvarying float v_linesofar;\nvarying float v_gamma_scale;\n\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize lowp float blur\n #pragma mapbox: initialize lowp float opacity\n\n // Calculate the distance of the pixel from the line in pixels.\n float dist = length(v_normal) * v_width2.s;\n\n // Calculate the antialiasing fade factor. This is either when fading in\n // the line in case of an offset line (v_width2.t) or when fading out\n // (v_width2.s)\n float blur2 = (blur + 1.0 / DEVICE_PIXEL_RATIO) * v_gamma_scale;\n float alpha = clamp(min(dist - (v_width2.t - blur2), v_width2.s - dist) / blur2, 0.0, 1.0);\n\n float x_a = mod(v_linesofar / u_pattern_size_a.x, 1.0);\n float x_b = mod(v_linesofar / u_pattern_size_b.x, 1.0);\n float y_a = 0.5 + (v_normal.y * v_width2.s / u_pattern_size_a.y);\n float y_b = 0.5 + (v_normal.y * v_width2.s / u_pattern_size_b.y);\n vec2 pos_a = mix(u_pattern_tl_a, u_pattern_br_a, vec2(x_a, y_a));\n vec2 pos_b = mix(u_pattern_tl_b, u_pattern_br_b, vec2(x_b, y_b));\n\n vec4 color = mix(texture2D(u_image, pos_a), texture2D(u_image, pos_b), u_fade);\n\n gl_FragColor = color * alpha * opacity;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n", + vertexSource: "// floor(127 / 2) == 63.0\n// the maximum allowed miter limit is 2.0 at the moment. the extrude normal is\n// stored in a byte (-128..127). we scale regular normals up to length 63, but\n// there are also \"special\" normals that have a bigger length (of up to 126 in\n// this case).\n// #define scale 63.0\n#define scale 0.015873016\n\n// We scale the distance before adding it to the buffers so that we can store\n// long distances for long segments. Use this value to unscale the distance.\n#define LINE_DISTANCE_SCALE 2.0\n\n// the distance over which the line edge fades out.\n// Retina devices need a smaller distance to avoid aliasing.\n#define ANTIALIASING 1.0 / DEVICE_PIXEL_RATIO / 2.0\n\nattribute vec2 a_pos;\nattribute vec4 a_data;\n\nuniform mat4 u_matrix;\nuniform mediump float u_ratio;\nuniform mediump float u_width;\nuniform vec2 u_gl_units_to_pixels;\n\nvarying vec2 v_normal;\nvarying vec2 v_width2;\nvarying float v_linesofar;\nvarying float v_gamma_scale;\n\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp float offset\n#pragma mapbox: define mediump float gapwidth\n\nvoid main() {\n #pragma mapbox: initialize lowp float blur\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize lowp float offset\n #pragma mapbox: initialize mediump float gapwidth\n\n vec2 a_extrude = a_data.xy - 128.0;\n float a_direction = mod(a_data.z, 4.0) - 1.0;\n float a_linesofar = (floor(a_data.z / 4.0) + a_data.w * 64.0) * LINE_DISTANCE_SCALE;\n\n // We store the texture normals in the most insignificant bit\n // transform y so that 0 => -1 and 1 => 1\n // In the texture normal, x is 0 if the normal points straight up/down and 1 if it's a round cap\n // y is 1 if the normal points up, and -1 if it points down\n mediump vec2 normal = mod(a_pos, 2.0);\n normal.y = sign(normal.y - 0.5);\n v_normal = normal;\n\n // these transformations used to be applied in the JS and native code bases. \n // moved them into the shader for clarity and simplicity. \n gapwidth = gapwidth / 2.0;\n float width = u_width / 2.0;\n offset = -1.0 * offset; \n\n float inset = gapwidth + (gapwidth > 0.0 ? ANTIALIASING : 0.0);\n float outset = gapwidth + width * (gapwidth > 0.0 ? 2.0 : 1.0) + ANTIALIASING;\n\n // Scale the extrusion vector down to a normal and then up by the line width\n // of this vertex.\n mediump vec2 dist = outset * a_extrude * scale;\n\n // Calculate the offset when drawing a line that is to the side of the actual line.\n // We do this by creating a vector that points towards the extrude, but rotate\n // it when we're drawing round end points (a_direction = -1 or 1) since their\n // extrude vector points in another direction.\n mediump float u = 0.5 * a_direction;\n mediump float t = 1.0 - abs(u);\n mediump vec2 offset2 = offset * a_extrude * scale * normal.y * mat2(t, -u, u, t);\n\n // Remove the texture normal bit to get the position\n vec2 pos = floor(a_pos * 0.5);\n\n vec4 projected_extrude = u_matrix * vec4(dist / u_ratio, 0.0, 0.0);\n gl_Position = u_matrix * vec4(pos + offset2 / u_ratio, 0.0, 1.0) + projected_extrude;\n\n // calculate how much the perspective view squishes or stretches the extrude\n float extrude_length_without_perspective = length(dist);\n float extrude_length_with_perspective = length(projected_extrude.xy / gl_Position.w * u_gl_units_to_pixels);\n v_gamma_scale = extrude_length_without_perspective / extrude_length_with_perspective;\n\n v_linesofar = a_linesofar;\n v_width2 = vec2(outset, inset);\n}\n" + }, + lineSDF: { + fragmentSource: "\nuniform sampler2D u_image;\nuniform float u_sdfgamma;\nuniform float u_mix;\n\nvarying vec2 v_normal;\nvarying vec2 v_width2;\nvarying vec2 v_tex_a;\nvarying vec2 v_tex_b;\nvarying float v_gamma_scale;\n\n#pragma mapbox: define lowp vec4 color\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize lowp vec4 color\n #pragma mapbox: initialize lowp float blur\n #pragma mapbox: initialize lowp float opacity\n\n // Calculate the distance of the pixel from the line in pixels.\n float dist = length(v_normal) * v_width2.s;\n\n // Calculate the antialiasing fade factor. This is either when fading in\n // the line in case of an offset line (v_width2.t) or when fading out\n // (v_width2.s)\n float blur2 = (blur + 1.0 / DEVICE_PIXEL_RATIO) * v_gamma_scale;\n float alpha = clamp(min(dist - (v_width2.t - blur2), v_width2.s - dist) / blur2, 0.0, 1.0);\n\n float sdfdist_a = texture2D(u_image, v_tex_a).a;\n float sdfdist_b = texture2D(u_image, v_tex_b).a;\n float sdfdist = mix(sdfdist_a, sdfdist_b, u_mix);\n alpha *= smoothstep(0.5 - u_sdfgamma, 0.5 + u_sdfgamma, sdfdist);\n\n gl_FragColor = color * (alpha * opacity);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n", + vertexSource: "// floor(127 / 2) == 63.0\n// the maximum allowed miter limit is 2.0 at the moment. the extrude normal is\n// stored in a byte (-128..127). we scale regular normals up to length 63, but\n// there are also \"special\" normals that have a bigger length (of up to 126 in\n// this case).\n// #define scale 63.0\n#define scale 0.015873016\n\n// We scale the distance before adding it to the buffers so that we can store\n// long distances for long segments. Use this value to unscale the distance.\n#define LINE_DISTANCE_SCALE 2.0\n\n// the distance over which the line edge fades out.\n// Retina devices need a smaller distance to avoid aliasing.\n#define ANTIALIASING 1.0 / DEVICE_PIXEL_RATIO / 2.0\n\nattribute vec2 a_pos;\nattribute vec4 a_data;\n\nuniform mat4 u_matrix;\nuniform mediump float u_ratio;\nuniform vec2 u_patternscale_a;\nuniform float u_tex_y_a;\nuniform vec2 u_patternscale_b;\nuniform float u_tex_y_b;\nuniform vec2 u_gl_units_to_pixels;\nuniform mediump float u_width;\n\nvarying vec2 v_normal;\nvarying vec2 v_width2;\nvarying vec2 v_tex_a;\nvarying vec2 v_tex_b;\nvarying float v_gamma_scale;\n\n#pragma mapbox: define lowp vec4 color\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define mediump float gapwidth\n#pragma mapbox: define lowp float offset\n\nvoid main() {\n #pragma mapbox: initialize lowp vec4 color\n #pragma mapbox: initialize lowp float blur\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize mediump float gapwidth\n #pragma mapbox: initialize lowp float offset\n\n vec2 a_extrude = a_data.xy - 128.0;\n float a_direction = mod(a_data.z, 4.0) - 1.0;\n float a_linesofar = (floor(a_data.z / 4.0) + a_data.w * 64.0) * LINE_DISTANCE_SCALE;\n\n // We store the texture normals in the most insignificant bit\n // transform y so that 0 => -1 and 1 => 1\n // In the texture normal, x is 0 if the normal points straight up/down and 1 if it's a round cap\n // y is 1 if the normal points up, and -1 if it points down\n mediump vec2 normal = mod(a_pos, 2.0);\n normal.y = sign(normal.y - 0.5);\n v_normal = normal;\n\n // these transformations used to be applied in the JS and native code bases. \n // moved them into the shader for clarity and simplicity. \n gapwidth = gapwidth / 2.0;\n float width = u_width / 2.0;\n offset = -1.0 * offset;\n \n float inset = gapwidth + (gapwidth > 0.0 ? ANTIALIASING : 0.0);\n float outset = gapwidth + width * (gapwidth > 0.0 ? 2.0 : 1.0) + ANTIALIASING;\n\n // Scale the extrusion vector down to a normal and then up by the line width\n // of this vertex.\n mediump vec2 dist =outset * a_extrude * scale;\n\n // Calculate the offset when drawing a line that is to the side of the actual line.\n // We do this by creating a vector that points towards the extrude, but rotate\n // it when we're drawing round end points (a_direction = -1 or 1) since their\n // extrude vector points in another direction.\n mediump float u = 0.5 * a_direction;\n mediump float t = 1.0 - abs(u);\n mediump vec2 offset2 = offset * a_extrude * scale * normal.y * mat2(t, -u, u, t);\n\n // Remove the texture normal bit to get the position\n vec2 pos = floor(a_pos * 0.5);\n\n vec4 projected_extrude = u_matrix * vec4(dist / u_ratio, 0.0, 0.0);\n gl_Position = u_matrix * vec4(pos + offset2 / u_ratio, 0.0, 1.0) + projected_extrude;\n\n // calculate how much the perspective view squishes or stretches the extrude\n float extrude_length_without_perspective = length(dist);\n float extrude_length_with_perspective = length(projected_extrude.xy / gl_Position.w * u_gl_units_to_pixels);\n v_gamma_scale = extrude_length_without_perspective / extrude_length_with_perspective;\n\n v_tex_a = vec2(a_linesofar * u_patternscale_a.x, normal.y * u_patternscale_a.y + u_tex_y_a);\n v_tex_b = vec2(a_linesofar * u_patternscale_b.x, normal.y * u_patternscale_b.y + u_tex_y_b);\n\n v_width2 = vec2(outset, inset);\n}\n" + }, + raster: { + fragmentSource: "uniform float u_fade_t;\nuniform float u_opacity;\nuniform sampler2D u_image0;\nuniform sampler2D u_image1;\nvarying vec2 v_pos0;\nvarying vec2 v_pos1;\n\nuniform float u_brightness_low;\nuniform float u_brightness_high;\n\nuniform float u_saturation_factor;\nuniform float u_contrast_factor;\nuniform vec3 u_spin_weights;\n\nvoid main() {\n\n // read and cross-fade colors from the main and parent tiles\n vec4 color0 = texture2D(u_image0, v_pos0);\n vec4 color1 = texture2D(u_image1, v_pos1);\n vec4 color = mix(color0, color1, u_fade_t);\n color.a *= u_opacity;\n vec3 rgb = color.rgb;\n\n // spin\n rgb = vec3(\n dot(rgb, u_spin_weights.xyz),\n dot(rgb, u_spin_weights.zxy),\n dot(rgb, u_spin_weights.yzx));\n\n // saturation\n float average = (color.r + color.g + color.b) / 3.0;\n rgb += (average - rgb) * u_saturation_factor;\n\n // contrast\n rgb = (rgb - 0.5) * u_contrast_factor + 0.5;\n\n // brightness\n vec3 u_high_vec = vec3(u_brightness_low, u_brightness_low, u_brightness_low);\n vec3 u_low_vec = vec3(u_brightness_high, u_brightness_high, u_brightness_high);\n\n gl_FragColor = vec4(mix(u_high_vec, u_low_vec, rgb) * color.a, color.a);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n", + vertexSource: "uniform mat4 u_matrix;\nuniform vec2 u_tl_parent;\nuniform float u_scale_parent;\nuniform float u_buffer_scale;\n\nattribute vec2 a_pos;\nattribute vec2 a_texture_pos;\n\nvarying vec2 v_pos0;\nvarying vec2 v_pos1;\n\nvoid main() {\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n v_pos0 = (((a_texture_pos / 32767.0) - 0.5) / u_buffer_scale ) + 0.5;\n v_pos1 = (v_pos0 * u_scale_parent) + u_tl_parent;\n}\n" + }, + symbolIcon: { + fragmentSource: "uniform sampler2D u_texture;\nuniform sampler2D u_fadetexture;\nuniform lowp float u_opacity;\n\nvarying vec2 v_tex;\nvarying vec2 v_fade_tex;\n\nvoid main() {\n lowp float alpha = texture2D(u_fadetexture, v_fade_tex).a * u_opacity;\n gl_FragColor = texture2D(u_texture, v_tex) * alpha;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n", + vertexSource: "attribute vec2 a_pos;\nattribute vec2 a_offset;\nattribute vec2 a_texture_pos;\nattribute vec4 a_data;\n\n\n// matrix is for the vertex position.\nuniform mat4 u_matrix;\n\nuniform mediump float u_zoom;\nuniform bool u_rotate_with_map;\nuniform vec2 u_extrude_scale;\n\nuniform vec2 u_texsize;\n\nvarying vec2 v_tex;\nvarying vec2 v_fade_tex;\n\nvoid main() {\n vec2 a_tex = a_texture_pos.xy;\n mediump float a_labelminzoom = a_data[0];\n mediump vec2 a_zoom = a_data.pq;\n mediump float a_minzoom = a_zoom[0];\n mediump float a_maxzoom = a_zoom[1];\n\n // u_zoom is the current zoom level adjusted for the change in font size\n mediump float z = 2.0 - step(a_minzoom, u_zoom) - (1.0 - step(a_maxzoom, u_zoom));\n\n vec2 extrude = u_extrude_scale * (a_offset / 64.0);\n if (u_rotate_with_map) {\n gl_Position = u_matrix * vec4(a_pos + extrude, 0, 1);\n gl_Position.z += z * gl_Position.w;\n } else {\n gl_Position = u_matrix * vec4(a_pos, 0, 1) + vec4(extrude, 0, 0);\n }\n\n v_tex = a_tex / u_texsize;\n v_fade_tex = vec2(a_labelminzoom / 255.0, 0.0);\n}\n" + }, + symbolSDF: { + fragmentSource: "uniform sampler2D u_texture;\nuniform sampler2D u_fadetexture;\nuniform lowp vec4 u_color;\nuniform lowp float u_opacity;\nuniform lowp float u_buffer;\nuniform lowp float u_gamma;\n\nvarying vec2 v_tex;\nvarying vec2 v_fade_tex;\nvarying float v_gamma_scale;\n\nvoid main() {\n lowp float dist = texture2D(u_texture, v_tex).a;\n lowp float fade_alpha = texture2D(u_fadetexture, v_fade_tex).a;\n lowp float gamma = u_gamma * v_gamma_scale;\n lowp float alpha = smoothstep(u_buffer - gamma, u_buffer + gamma, dist) * fade_alpha;\n\n gl_FragColor = u_color * (alpha * u_opacity);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n", + vertexSource: "const float PI = 3.141592653589793;\n\nattribute vec2 a_pos;\nattribute vec2 a_offset;\nattribute vec2 a_texture_pos;\nattribute vec4 a_data;\n\n\n// matrix is for the vertex position.\nuniform mat4 u_matrix;\n\nuniform mediump float u_zoom;\nuniform bool u_rotate_with_map;\nuniform bool u_pitch_with_map;\nuniform mediump float u_pitch;\nuniform mediump float u_bearing;\nuniform mediump float u_aspect_ratio;\nuniform vec2 u_extrude_scale;\n\nuniform vec2 u_texsize;\n\nvarying vec2 v_tex;\nvarying vec2 v_fade_tex;\nvarying float v_gamma_scale;\n\nvoid main() {\n vec2 a_tex = a_texture_pos.xy;\n mediump float a_labelminzoom = a_data[0];\n mediump vec2 a_zoom = a_data.pq;\n mediump float a_minzoom = a_zoom[0];\n mediump float a_maxzoom = a_zoom[1];\n\n // u_zoom is the current zoom level adjusted for the change in font size\n mediump float z = 2.0 - step(a_minzoom, u_zoom) - (1.0 - step(a_maxzoom, u_zoom));\n\n // pitch-alignment: map\n // rotation-alignment: map | viewport\n if (u_pitch_with_map) {\n lowp float angle = u_rotate_with_map ? (a_data[1] / 256.0 * 2.0 * PI) : u_bearing;\n lowp float asin = sin(angle);\n lowp float acos = cos(angle);\n mat2 RotationMatrix = mat2(acos, asin, -1.0 * asin, acos);\n vec2 offset = RotationMatrix * a_offset;\n vec2 extrude = u_extrude_scale * (offset / 64.0);\n gl_Position = u_matrix * vec4(a_pos + extrude, 0, 1);\n gl_Position.z += z * gl_Position.w;\n // pitch-alignment: viewport\n // rotation-alignment: map\n } else if (u_rotate_with_map) {\n // foreshortening factor to apply on pitched maps\n // as a label goes from horizontal <=> vertical in angle\n // it goes from 0% foreshortening to up to around 70% foreshortening\n lowp float pitchfactor = 1.0 - cos(u_pitch * sin(u_pitch * 0.75));\n\n lowp float lineangle = a_data[1] / 256.0 * 2.0 * PI;\n\n // use the lineangle to position points a,b along the line\n // project the points and calculate the label angle in projected space\n // this calculation allows labels to be rendered unskewed on pitched maps\n vec4 a = u_matrix * vec4(a_pos, 0, 1);\n vec4 b = u_matrix * vec4(a_pos + vec2(cos(lineangle),sin(lineangle)), 0, 1);\n lowp float angle = atan((b[1]/b[3] - a[1]/a[3])/u_aspect_ratio, b[0]/b[3] - a[0]/a[3]);\n lowp float asin = sin(angle);\n lowp float acos = cos(angle);\n mat2 RotationMatrix = mat2(acos, -1.0 * asin, asin, acos);\n\n vec2 offset = RotationMatrix * (vec2((1.0-pitchfactor)+(pitchfactor*cos(angle*2.0)), 1.0) * a_offset);\n vec2 extrude = u_extrude_scale * (offset / 64.0);\n gl_Position = u_matrix * vec4(a_pos, 0, 1) + vec4(extrude, 0, 0);\n gl_Position.z += z * gl_Position.w;\n // pitch-alignment: viewport\n // rotation-alignment: viewport\n } else {\n vec2 extrude = u_extrude_scale * (a_offset / 64.0);\n gl_Position = u_matrix * vec4(a_pos, 0, 1) + vec4(extrude, 0, 0);\n }\n\n v_gamma_scale = gl_Position.w;\n\n v_tex = a_tex / u_texsize;\n v_fade_tex = vec2(a_labelminzoom / 255.0, 0.0);\n}\n" + } +}; + +},{"path":195}],39:[function(require,module,exports){ +'use strict'; + +var assert = require('assert'); + +var VertexArrayObject = function VertexArrayObject() { + this.boundProgram = null; + this.boundVertexBuffer = null; + this.boundVertexBuffer2 = null; + this.boundElementBuffer = null; + this.boundVertexOffset = null; + this.vao = null; +}; + +VertexArrayObject.prototype.bind = function bind (gl, program, layoutVertexBuffer, elementBuffer, vertexBuffer2, vertexOffset) { + + if (gl.extVertexArrayObject === undefined) { + gl.extVertexArrayObject = gl.getExtension("OES_vertex_array_object"); + } + + var isFreshBindRequired = ( + !this.vao || + this.boundProgram !== program || + this.boundVertexBuffer !== layoutVertexBuffer || + this.boundVertexBuffer2 !== vertexBuffer2 || + this.boundElementBuffer !== elementBuffer || + this.boundVertexOffset !== vertexOffset + ); + + if (!gl.extVertexArrayObject || isFreshBindRequired) { + this.freshBind(gl, program, layoutVertexBuffer, elementBuffer, vertexBuffer2, vertexOffset); + this.gl = gl; + } else { + gl.extVertexArrayObject.bindVertexArrayOES(this.vao); + } +}; + +VertexArrayObject.prototype.freshBind = function freshBind (gl, program, layoutVertexBuffer, elementBuffer, vertexBuffer2, vertexOffset) { + var numPrevAttributes; + var numNextAttributes = program.numAttributes; + + if (gl.extVertexArrayObject) { + if (this.vao) this.destroy(); + this.vao = gl.extVertexArrayObject.createVertexArrayOES(); + gl.extVertexArrayObject.bindVertexArrayOES(this.vao); + numPrevAttributes = 0; + + // store the arguments so that we can verify them when the vao is bound again + this.boundProgram = program; + this.boundVertexBuffer = layoutVertexBuffer; + this.boundVertexBuffer2 = vertexBuffer2; + this.boundElementBuffer = elementBuffer; + this.boundVertexOffset = vertexOffset; + + } else { + numPrevAttributes = gl.currentNumAttributes || 0; + + // Disable all attributes from the previous program that aren't used in + // the new program. Note: attribute indices are *not* program specific! + for (var i = numNextAttributes; i < numPrevAttributes; i++) { + // WebGL breaks if you disable attribute 0. + // http://stackoverflow.com/questions/20305231 + assert(i !== 0); + gl.disableVertexAttribArray(i); + } + } + + // Enable all attributes for the new program. + for (var j = numPrevAttributes; j < numNextAttributes; j++) { + gl.enableVertexAttribArray(j); + } + + layoutVertexBuffer.bind(gl); + layoutVertexBuffer.setVertexAttribPointers(gl, program, vertexOffset); + if (vertexBuffer2) { + vertexBuffer2.bind(gl); + vertexBuffer2.setVertexAttribPointers(gl, program, vertexOffset); + } + if (elementBuffer) { + elementBuffer.bind(gl); + } + + gl.currentNumAttributes = numNextAttributes; +}; + +VertexArrayObject.prototype.destroy = function destroy () { + if (this.vao) { + this.gl.extVertexArrayObject.deleteVertexArrayOES(this.vao); + this.vao = null; + } +}; + +module.exports = VertexArrayObject; + +},{"assert":135}],40:[function(require,module,exports){ +'use strict'; + +var ImageSource = require('./image_source'); +var window = require('../util/window'); + +/** + * A data source containing the contents of an HTML canvas. + * (See the [Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/#sources-canvas) for detailed documentation of options.) + * @interface CanvasSource + * @example + * // add to map + * map.addSource('some id', { + * type: 'canvas', + * canvas: 'idOfMyHTMLCanvas', + * animate: true, + * coordinates: [ + * [-76.54, 39.18], + * [-76.52, 39.18], + * [-76.52, 39.17], + * [-76.54, 39.17] + * ] + * }); + * + * // update + * var mySource = map.getSource('some id'); + * mySource.setCoordinates([ + * [-76.54335737228394, 39.18579907229748], + * [-76.52803659439087, 39.1838364847587], + * [-76.5295386314392, 39.17683392507606], + * [-76.54520273208618, 39.17876344106642] + * ]); + * + * map.removeSource('some id'); // remove + */ +var CanvasSource = (function (ImageSource) { + function CanvasSource(id, options, dispatcher, eventedParent) { + ImageSource.call(this, id, options, dispatcher, eventedParent); + this.options = options; + this.animate = options.hasOwnProperty('animate') ? options.animate : true; + } + + if ( ImageSource ) CanvasSource.__proto__ = ImageSource; + CanvasSource.prototype = Object.create( ImageSource && ImageSource.prototype ); + CanvasSource.prototype.constructor = CanvasSource; + + CanvasSource.prototype.load = function load () { + this.canvas = this.canvas || window.document.getElementById(this.options.canvas); + this.width = this.canvas.width; + this.height = this.canvas.height; + if (this._hasInvalidDimensions(this.canvas)) return this.fire('error', new Error('Canvas dimensions cannot be less than or equal to zero.')); + + var loopID; + + this.play = function() { + loopID = this.map.style.animationLoop.set(Infinity); + this.map._rerender(); + }; + + this.pause = function() { + this.map.style.animationLoop.cancel(loopID); + }; + + this._finishLoading(); + }; + + /** + * Returns the HTML `canvas` element. + * + * @returns {HTMLCanvasElement} The HTML `canvas` element. + */ + CanvasSource.prototype.getCanvas = function getCanvas () { + return this.canvas; + }; + + CanvasSource.prototype.onAdd = function onAdd (map) { + if (this.map) return; + this.map = map; + this.load(); + if (this.canvas) { + if (this.animate) this.play(); + this.setCoordinates(this.coordinates); + } + }; + + /** + * Sets the canvas's coordinates and re-renders the map. + * + * @method setCoordinates + * @param {Array>} coordinates Four geographical coordinates, + * represented as arrays of longitude and latitude numbers, which define the corners of the canvas. + * The coordinates start at the top left corner of the canvas and proceed in clockwise order. + * They do not have to represent a rectangle. + * @returns {CanvasSource} this + */ + // setCoordinates inherited from ImageSource + + CanvasSource.prototype.prepare = function prepare () { + var resize = false; + if (this.canvas.width !== this.width) { + this.width = this.canvas.width; + resize = true; + } + if (this.canvas.height !== this.height) { + this.height = this.canvas.height; + resize = true; + } + if (this._hasInvalidDimensions()) return; + + if (!this.tile) return; // not enough data for current position + this._prepareImage(this.map.painter.gl, this.canvas, resize); + }; + + CanvasSource.prototype.serialize = function serialize () { + return { + type: 'canvas', + canvas: this.canvas, + coordinates: this.coordinates + }; + }; + + CanvasSource.prototype._hasInvalidDimensions = function _hasInvalidDimensions () { + for (var i = 0, list = [this.canvas.width, this.canvas.height]; i < list.length; i += 1) { + var x = list[i]; + + if (isNaN(x) || x <= 0) return true; + } + return false; + }; + + return CanvasSource; +}(ImageSource)); + +module.exports = CanvasSource; + +},{"../util/window":112,"./image_source":44}],41:[function(require,module,exports){ +'use strict'; + +var Evented = require('../util/evented'); +var util = require('../util/util'); +var window = require('../util/window'); +var EXTENT = require('../data/extent'); + +/** + * A source containing GeoJSON. + * (See the [Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/#sources-geojson) for detailed documentation of options.) + * + * @interface GeoJSONSource + * @example + * + * map.addSource('some id', { + * type: 'geojson', + * data: 'https://d2ad6b4ur7yvpq.cloudfront.net/naturalearth-3.3.0/ne_10m_ports.geojson' + * }); + * + * @example + * map.addSource('some id', { + * type: 'geojson', + * data: { + * "type": "FeatureCollection", + * "features": [{ + * "type": "Feature", + * "properties": {}, + * "geometry": { + * "type": "Point", + * "coordinates": [ + * -76.53063297271729, + * 39.18174077994108 + * ] + * } + * }] + * } + * }); + * + * @example + * map.getSource('some id').setData({ + * "type": "FeatureCollection", + * "features": [{ + * "type": "Feature", + * "properties": { "name": "Null Island" }, + * "geometry": { + * "type": "Point", + * "coordinates": [ 0, 0 ] + * } + * }] + * }); + * @see [Draw GeoJSON points](https://www.mapbox.com/mapbox-gl-js/example/geojson-markers/) + * @see [Add a GeoJSON line](https://www.mapbox.com/mapbox-gl-js/example/geojson-line/) + * @see [Create a heatmap from points](https://www.mapbox.com/mapbox-gl-js/example/heatmap/) + */ +var GeoJSONSource = (function (Evented) { + function GeoJSONSource(id, options, dispatcher, eventedParent) { + Evented.call(this); + options = options || {}; + this.id = id; + + // `type` is a property rather than a constant to make it easy for 3rd + // parties to use GeoJSONSource to build their own source types. + this.type = 'geojson'; + + this.minzoom = 0; + this.maxzoom = 18; + this.tileSize = 512; + this.isTileClipped = true; + this.reparseOverscaled = true; + + this.dispatcher = dispatcher; + this.setEventedParent(eventedParent); + + this._data = options.data; + + if (options.maxzoom !== undefined) this.maxzoom = options.maxzoom; + if (options.type) this.type = options.type; + + var scale = EXTENT / this.tileSize; + + // sent to the worker, along with `url: ...` or `data: literal geojson`, + // so that it can load/parse/index the geojson data + // extending with `options.workerOptions` helps to make it easy for + // third-party sources to hack/reuse GeoJSONSource. + this.workerOptions = util.extend({ + source: this.id, + cluster: options.cluster || false, + geojsonVtOptions: { + buffer: (options.buffer !== undefined ? options.buffer : 128) * scale, + tolerance: (options.tolerance !== undefined ? options.tolerance : 0.375) * scale, + extent: EXTENT, + maxZoom: this.maxzoom + }, + superclusterOptions: { + maxZoom: Math.min(options.clusterMaxZoom, this.maxzoom - 1) || (this.maxzoom - 1), + extent: EXTENT, + radius: (options.clusterRadius || 50) * scale, + log: false + } + }, options.workerOptions); + } + + if ( Evented ) GeoJSONSource.__proto__ = Evented; + GeoJSONSource.prototype = Object.create( Evented && Evented.prototype ); + GeoJSONSource.prototype.constructor = GeoJSONSource; + + GeoJSONSource.prototype.load = function load () { + var this$1 = this; + + this.fire('dataloading', {dataType: 'source'}); + this._updateWorkerData(function (err) { + if (err) { + this$1.fire('error', {error: err}); + return; + } + this$1.fire('data', {dataType: 'source'}); + this$1.fire('source.load'); + }); + }; + + GeoJSONSource.prototype.onAdd = function onAdd (map) { + this.load(); + this.map = map; + }; + + /** + * Sets the GeoJSON data and re-renders the map. + * + * @param {Object|string} data A GeoJSON data object or a URL to one. The latter is preferable in the case of large GeoJSON files. + * @returns {GeoJSONSource} this + */ + GeoJSONSource.prototype.setData = function setData (data) { + var this$1 = this; + + this._data = data; + + this.fire('dataloading', {dataType: 'source'}); + this._updateWorkerData(function (err) { + if (err) { + return this$1.fire('error', { error: err }); + } + this$1.fire('data', {dataType: 'source'}); + }); + + return this; + }; + + /* + * Responsible for invoking WorkerSource's geojson.loadData target, which + * handles loading the geojson data and preparing to serve it up as tiles, + * using geojson-vt or supercluster as appropriate. + */ + GeoJSONSource.prototype._updateWorkerData = function _updateWorkerData (callback) { + var this$1 = this; + + var options = util.extend({}, this.workerOptions); + var data = this._data; + if (typeof data === 'string') { + options.url = resolveURL(data); + } else { + options.data = JSON.stringify(data); + } + + // target {this.type}.loadData rather than literally geojson.loadData, + // so that other geojson-like source types can easily reuse this + // implementation + this.workerID = this.dispatcher.send(((this.type) + ".loadData"), options, function (err) { + this$1._loaded = true; + callback(err); + + }); + }; + + GeoJSONSource.prototype.loadTile = function loadTile (tile, callback) { + var this$1 = this; + + var overscaling = tile.coord.z > this.maxzoom ? Math.pow(2, tile.coord.z - this.maxzoom) : 1; + var params = { + type: this.type, + uid: tile.uid, + coord: tile.coord, + zoom: tile.coord.z, + maxZoom: this.maxzoom, + tileSize: this.tileSize, + source: this.id, + overscaling: overscaling, + angle: this.map.transform.angle, + pitch: this.map.transform.pitch, + showCollisionBoxes: this.map.showCollisionBoxes + }; + + tile.workerID = this.dispatcher.send('loadTile', params, function (err, data) { + + tile.unloadVectorData(); + + if (tile.aborted) + return; + + if (err) { + return callback(err); + } + + tile.loadVectorData(data, this$1.map.painter); + + if (tile.redoWhenDone) { + tile.redoWhenDone = false; + tile.redoPlacement(this$1); + } + + return callback(null); + + }, this.workerID); + }; + + GeoJSONSource.prototype.abortTile = function abortTile (tile) { + tile.aborted = true; + }; + + GeoJSONSource.prototype.unloadTile = function unloadTile (tile) { + tile.unloadVectorData(); + this.dispatcher.send('removeTile', { uid: tile.uid, type: this.type, source: this.id }, function () {}, tile.workerID); + }; + + GeoJSONSource.prototype.onRemove = function onRemove () { + this.dispatcher.broadcast('removeSource', { type: this.type, source: this.id }, function () {}); + }; + + GeoJSONSource.prototype.serialize = function serialize () { + return { + type: this.type, + data: this._data + }; + }; + + return GeoJSONSource; +}(Evented)); + +function resolveURL(url) { + var a = window.document.createElement('a'); + a.href = url; + return a.href; +} + +module.exports = GeoJSONSource; + +},{"../data/extent":11,"../util/evented":118,"../util/util":129,"../util/window":112}],42:[function(require,module,exports){ +'use strict'; + +var ajax = require('../util/ajax'); +var rewind = require('geojson-rewind'); +var GeoJSONWrapper = require('./geojson_wrapper'); +var vtpbf = require('vt-pbf'); +var supercluster = require('supercluster'); +var geojsonvt = require('geojson-vt'); + +var VectorTileWorkerSource = require('./vector_tile_worker_source'); + +/** + * The {@link WorkerSource} implementation that supports {@link GeoJSONSource}. + * This class is designed to be easily reused to support custom source types + * for data formats that can be parsed/converted into an in-memory GeoJSON + * representation. To do so, create it with + * `new GeoJSONWorkerSource(actor, layerIndex, customLoadGeoJSONFunction)`. For a full example, see [mapbox-gl-topojson](https://github.com/developmentseed/mapbox-gl-topojson). + * + * @private + */ +var GeoJSONWorkerSource = (function (VectorTileWorkerSource) { + function GeoJSONWorkerSource (actor, layerIndex, loadGeoJSON) { + VectorTileWorkerSource.call(this, actor, layerIndex); + if (loadGeoJSON) { + this.loadGeoJSON = loadGeoJSON; + } + // object mapping source ids to geojson-vt-like tile indexes + this._geoJSONIndexes = {}; + } + + if ( VectorTileWorkerSource ) GeoJSONWorkerSource.__proto__ = VectorTileWorkerSource; + GeoJSONWorkerSource.prototype = Object.create( VectorTileWorkerSource && VectorTileWorkerSource.prototype ); + GeoJSONWorkerSource.prototype.constructor = GeoJSONWorkerSource; + + /** + * See {@link VectorTileWorkerSource#loadTile}. + */ + GeoJSONWorkerSource.prototype.loadVectorData = function loadVectorData (params, callback) { + var source = params.source, + coord = params.coord; + + if (!this._geoJSONIndexes[source]) { + return callback(null, null); // we couldn't load the file + } + + var geoJSONTile = this._geoJSONIndexes[source].getTile(Math.min(coord.z, params.maxZoom), coord.x, coord.y); + if (!geoJSONTile) { + return callback(null, null); // nothing in the given tile + } + + var geojsonWrapper = new GeoJSONWrapper(geoJSONTile.features); + geojsonWrapper.name = '_geojsonTileLayer'; + var pbf = vtpbf({ layers: { '_geojsonTileLayer': geojsonWrapper }}); + if (pbf.byteOffset !== 0 || pbf.byteLength !== pbf.buffer.byteLength) { + // Compatibility with node Buffer (https://github.com/mapbox/pbf/issues/35) + pbf = new Uint8Array(pbf); + } + geojsonWrapper.rawData = pbf.buffer; + callback(null, geojsonWrapper); + }; + + /** + * Fetches (if appropriate), parses, and index geojson data into tiles. This + * preparatory method must be called before {@link GeoJSONWorkerSource#loadTile} + * can correctly serve up tiles. + * + * Defers to {@link GeoJSONWorkerSource#loadGeoJSON} for the fetching/parsing, + * expecting `callback(error, data)` to be called with either an error or a + * parsed GeoJSON object. + * @param {Object} params + * @param {string} params.source The id of the source. + * @param {Function} callback + */ + GeoJSONWorkerSource.prototype.loadData = function loadData (params, callback) { + var handleData = function(err, data) { + var this$1 = this; + + if (err) return callback(err); + if (typeof data != 'object') { + return callback(new Error("Input data is not a valid GeoJSON object.")); + } + rewind(data, true); + this._indexData(data, params, function (err, indexed) { + if (err) { return callback(err); } + this$1._geoJSONIndexes[params.source] = indexed; + callback(null); + }); + }.bind(this); + + this.loadGeoJSON(params, handleData); + }; + + /** + * Fetch and parse GeoJSON according to the given params. Calls `callback` + * with `(err, data)`, where `data` is a parsed GeoJSON object. + * + * GeoJSON is loaded and parsed from `params.url` if it exists, or else + * expected as a literal (string or object) `params.data`. + * + * @param {Object} params + * @param {string} [params.url] A URL to the remote GeoJSON data. + * @param {Object} [params.data] Literal GeoJSON data. Must be provided if `params.url` is not. + */ + GeoJSONWorkerSource.prototype.loadGeoJSON = function loadGeoJSON (params, callback) { + // Because of same origin issues, urls must either include an explicit + // origin or absolute path. + // ie: /foo/bar.json or http://example.com/bar.json + // but not ../foo/bar.json + if (params.url) { + ajax.getJSON(params.url, callback); + } else if (typeof params.data === 'string') { + try { + return callback(null, JSON.parse(params.data)); + } catch (e) { + return callback(new Error("Input data is not a valid GeoJSON object.")); + } + } else { + return callback(new Error("Input data is not a valid GeoJSON object.")); + } + }; + + GeoJSONWorkerSource.prototype.removeSource = function removeSource (params) { + if (this._geoJSONIndexes[params.source]) { + delete this._geoJSONIndexes[params.source]; + } + }; + + /** + * Index the data using either geojson-vt or supercluster + * @param {GeoJSON} data + * @param {Object} params forwarded from loadTile. + * @param {callback} (err, indexedData) + * @private + */ + GeoJSONWorkerSource.prototype._indexData = function _indexData (data, params, callback) { + try { + if (params.cluster) { + callback(null, supercluster(params.superclusterOptions).load(data.features)); + } else { + callback(null, geojsonvt(data, params.geojsonVtOptions)); + } + } catch (err) { + return callback(err); + } + }; + + return GeoJSONWorkerSource; +}(VectorTileWorkerSource)); + +module.exports = GeoJSONWorkerSource; + +},{"../util/ajax":109,"./geojson_wrapper":43,"./vector_tile_worker_source":55,"geojson-rewind":141,"geojson-vt":145,"supercluster":202,"vt-pbf":211}],43:[function(require,module,exports){ +'use strict'; + +var Point = require('point-geometry'); +var VectorTileFeature = require('vector-tile').VectorTileFeature; +var EXTENT = require('../data/extent'); + +var FeatureWrapper = function FeatureWrapper(feature) { + var this$1 = this; + + this.type = feature.type; + if (feature.type === 1) { + this.rawGeometry = []; + for (var i = 0; i < feature.geometry.length; i++) { + this$1.rawGeometry.push([feature.geometry[i]]); + } + } else { + this.rawGeometry = feature.geometry; + } + this.properties = feature.tags; + this.extent = EXTENT; +}; + +FeatureWrapper.prototype.loadGeometry = function loadGeometry () { + var this$1 = this; + + var rings = this.rawGeometry; + this.geometry = []; + + for (var i = 0; i < rings.length; i++) { + var ring = rings[i], + newRing = []; + for (var j = 0; j < ring.length; j++) { + newRing.push(new Point(ring[j][0], ring[j][1])); + } + this$1.geometry.push(newRing); + } + return this.geometry; +}; + +FeatureWrapper.prototype.bbox = function bbox () { + if (!this.geometry) this.loadGeometry(); + + var rings = this.geometry; + var x1 = Infinity, + x2 = -Infinity, + y1 = Infinity, + y2 = -Infinity; + + for (var i = 0; i < rings.length; i++) { + var ring = rings[i]; + + for (var j = 0; j < ring.length; j++) { + var coord = ring[j]; + + x1 = Math.min(x1, coord.x); + x2 = Math.max(x2, coord.x); + y1 = Math.min(y1, coord.y); + y2 = Math.max(y2, coord.y); + } + } + + return [x1, y1, x2, y2]; +}; + +FeatureWrapper.prototype.toGeoJSON = function toGeoJSON () { + VectorTileFeature.prototype.toGeoJSON.call(this); +}; + +// conform to vectortile api +var GeoJSONWrapper = function GeoJSONWrapper(features) { + this.features = features; + this.length = features.length; + this.extent = EXTENT; +}; + +GeoJSONWrapper.prototype.feature = function feature (i) { + return new FeatureWrapper(this.features[i]); +}; + +module.exports = GeoJSONWrapper; + +},{"../data/extent":11,"point-geometry":198,"vector-tile":207}],44:[function(require,module,exports){ +'use strict'; + +var util = require('../util/util'); +var window = require('../util/window'); +var TileCoord = require('./tile_coord'); +var LngLat = require('../geo/lng_lat'); +var Point = require('point-geometry'); +var Evented = require('../util/evented'); +var ajax = require('../util/ajax'); +var EXTENT = require('../data/extent'); +var RasterBoundsArray = require('../data/raster_bounds_array'); +var Buffer = require('../data/buffer'); +var VertexArrayObject = require('../render/vertex_array_object'); + +/** + * A data source containing an image. + * (See the [Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/#sources-image) for detailed documentation of options.) + * + * @interface ImageSource + * @example + * // add to map + * map.addSource('some id', { + * type: 'image', + * url: 'https://www.mapbox.com/images/foo.png', + * coordinates: [ + * [-76.54, 39.18], + * [-76.52, 39.18], + * [-76.52, 39.17], + * [-76.54, 39.17] + * ] + * }); + * + * // update + * var mySource = map.getSource('some id'); + * mySource.setCoordinates([ + * [-76.54335737228394, 39.18579907229748], + * [-76.52803659439087, 39.1838364847587], + * [-76.5295386314392, 39.17683392507606], + * [-76.54520273208618, 39.17876344106642] + * ]); + * + * map.removeSource('some id'); // remove + * @see [Add an image](https://www.mapbox.com/mapbox-gl-js/example/image-on-a-map/) + */ +var ImageSource = (function (Evented) { + function ImageSource(id, options, dispatcher, eventedParent) { + Evented.call(this); + this.id = id; + this.dispatcher = dispatcher; + this.coordinates = options.coordinates; + + this.type = 'image'; + this.minzoom = 0; + this.maxzoom = 22; + this.tileSize = 512; + + this.setEventedParent(eventedParent); + + this.options = options; + } + + if ( Evented ) ImageSource.__proto__ = Evented; + ImageSource.prototype = Object.create( Evented && Evented.prototype ); + ImageSource.prototype.constructor = ImageSource; + + ImageSource.prototype.load = function load () { + var this$1 = this; + + this.fire('dataloading', {dataType: 'source'}); + + this.url = this.options.url; + + ajax.getImage(this.options.url, function (err, image) { + if (err) return this$1.fire('error', {error: err}); + + this$1.image = image; + + this$1._finishLoading(); + }); + }; + + ImageSource.prototype._finishLoading = function _finishLoading () { + this.fire('source.load'); + + if (this.map) { + this.setCoordinates(this.coordinates); + } + }; + + ImageSource.prototype.onAdd = function onAdd (map) { + this.load(); + this.map = map; + if (this.image) { + this.setCoordinates(this.coordinates); + } + }; + + /** + * Sets the image's coordinates and re-renders the map. + * + * @param {Array>} coordinates Four geographical coordinates, + * represented as arrays of longitude and latitude numbers, which define the corners of the image. + * The coordinates start at the top left corner of the image and proceed in clockwise order. + * They do not have to represent a rectangle. + * @returns {ImageSource} this + */ + ImageSource.prototype.setCoordinates = function setCoordinates (coordinates) { + this.coordinates = coordinates; + + // Calculate which mercator tile is suitable for rendering the video in + // and create a buffer with the corner coordinates. These coordinates + // may be outside the tile, because raster tiles aren't clipped when rendering. + + var map = this.map; + var cornerZ0Coords = coordinates.map(function (coord) { + return map.transform.locationCoordinate(LngLat.convert(coord)).zoomTo(0); + }); + + var centerCoord = this.centerCoord = util.getCoordinatesCenter(cornerZ0Coords); + centerCoord.column = Math.round(centerCoord.column); + centerCoord.row = Math.round(centerCoord.row); + + this.minzoom = this.maxzoom = centerCoord.zoom; + this.coord = new TileCoord(centerCoord.zoom, centerCoord.column, centerCoord.row); + this._tileCoords = cornerZ0Coords.map(function (coord) { + var zoomedCoord = coord.zoomTo(centerCoord.zoom); + return new Point( + Math.round((zoomedCoord.column - centerCoord.column) * EXTENT), + Math.round((zoomedCoord.row - centerCoord.row) * EXTENT)); + }); + + this.fire('data', {dataType: 'source'}); + return this; + }; + + ImageSource.prototype._setTile = function _setTile (tile) { + this.tile = tile; + var maxInt16 = 32767; + var array = new RasterBoundsArray(); + array.emplaceBack(this._tileCoords[0].x, this._tileCoords[0].y, 0, 0); + array.emplaceBack(this._tileCoords[1].x, this._tileCoords[1].y, maxInt16, 0); + array.emplaceBack(this._tileCoords[3].x, this._tileCoords[3].y, 0, maxInt16); + array.emplaceBack(this._tileCoords[2].x, this._tileCoords[2].y, maxInt16, maxInt16); + + this.tile.buckets = {}; + + this.tile.boundsBuffer = Buffer.fromStructArray(array, Buffer.BufferType.VERTEX); + this.tile.boundsVAO = new VertexArrayObject(); + }; + + ImageSource.prototype.prepare = function prepare () { + if (!this.tile || !this.image) return; + this._prepareImage(this.map.painter.gl, this.image); + }; + + ImageSource.prototype._prepareImage = function _prepareImage (gl, image, resize) { + if (this.tile.state !== 'loaded') { + this.tile.state = 'loaded'; + this.tile.texture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.tile.texture); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image); + } else if (resize) { + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image); + } else if (image instanceof window.HTMLVideoElement || image instanceof window.ImageData || image instanceof window.HTMLCanvasElement) { + gl.bindTexture(gl.TEXTURE_2D, this.tile.texture); + gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, gl.RGBA, gl.UNSIGNED_BYTE, image); + } + }; + + ImageSource.prototype.loadTile = function loadTile (tile, callback) { + // We have a single tile -- whoose coordinates are this.coord -- that + // covers the image we want to render. If that's the one being + // requested, set it up with the image; otherwise, mark the tile as + // `errored` to indicate that we have no data for it. + if (this.coord && this.coord.toString() === tile.coord.toString()) { + this._setTile(tile); + callback(null); + } else { + tile.state = 'errored'; + callback(null); + } + }; + + ImageSource.prototype.serialize = function serialize () { + return { + type: 'image', + urls: this.url, + coordinates: this.coordinates + }; + }; + + return ImageSource; +}(Evented)); + +module.exports = ImageSource; + +},{"../data/buffer":8,"../data/extent":11,"../data/raster_bounds_array":16,"../geo/lng_lat":19,"../render/vertex_array_object":39,"../util/ajax":109,"../util/evented":118,"../util/util":129,"../util/window":112,"./tile_coord":53,"point-geometry":198}],45:[function(require,module,exports){ +'use strict'; +var util = require('../util/util'); +var ajax = require('../util/ajax'); +var browser = require('../util/browser'); +var normalizeURL = require('../util/mapbox').normalizeSourceURL; + +module.exports = function(options, callback) { + var loaded = function(err, tileJSON) { + if (err) { + return callback(err); + } + + var result = util.pick(tileJSON, ['tiles', 'minzoom', 'maxzoom', 'attribution']); + + if (tileJSON.vector_layers) { + result.vectorLayers = tileJSON.vector_layers; + result.vectorLayerIds = result.vectorLayers.map(function (layer) { return layer.id; }); + } + + callback(null, result); + }; + + if (options.url) { + ajax.getJSON(normalizeURL(options.url), loaded); + } else { + browser.frame(loaded.bind(null, null, options)); + } +}; + +},{"../util/ajax":109,"../util/browser":110,"../util/mapbox":125,"../util/util":129}],46:[function(require,module,exports){ +'use strict'; + +var EXTENT = require('../data/extent'); + +/** + * Converts a pixel value at a the given zoom level to tile units. + * + * The shaders mostly calculate everything in tile units so style + * properties need to be converted from pixels to tile units using this. + * + * For example, a translation by 30 pixels at zoom 6.5 will be a + * translation by pixelsToTileUnits(30, 6.5) tile units. + * + * @param {Object} tile a {Tile object} will work well, but any object that follows the format {coord: {TileCord object}, tileSize: {number}} will work + * @param {number} pixelValue + * @param {number} z + * @returns {number} value in tile units + * @private + */ +module.exports = function(tile, pixelValue, z) { + return pixelValue * (EXTENT / (tile.tileSize * Math.pow(2, z - tile.coord.z))); +}; + +},{"../data/extent":11}],47:[function(require,module,exports){ +'use strict'; +var TileCoord = require('./tile_coord'); + +exports.rendered = function(sourceCache, styleLayers, queryGeometry, params, zoom, bearing) { + var tilesIn = sourceCache.tilesIn(queryGeometry); + + tilesIn.sort(sortTilesIn); + + var renderedFeatureLayers = []; + for (var r = 0; r < tilesIn.length; r++) { + var tileIn = tilesIn[r]; + if (!tileIn.tile.featureIndex) continue; + + renderedFeatureLayers.push(tileIn.tile.featureIndex.query({ + queryGeometry: tileIn.queryGeometry, + scale: tileIn.scale, + tileSize: tileIn.tile.tileSize, + bearing: bearing, + params: params + }, styleLayers)); + } + return mergeRenderedFeatureLayers(renderedFeatureLayers); +}; + +exports.source = function(sourceCache, params) { + var tiles = sourceCache.getRenderableIds().map(function (id) { + return sourceCache.getTileByID(id); + }); + + var result = []; + + var dataTiles = {}; + for (var i = 0; i < tiles.length; i++) { + var tile = tiles[i]; + var dataID = new TileCoord(Math.min(tile.sourceMaxZoom, tile.coord.z), tile.coord.x, tile.coord.y, 0).id; + if (!dataTiles[dataID]) { + dataTiles[dataID] = true; + tile.querySourceFeatures(result, params); + } + } + + return result; +}; + +function sortTilesIn(a, b) { + var coordA = a.coord; + var coordB = b.coord; + return (coordA.z - coordB.z) || (coordA.y - coordB.y) || (coordA.w - coordB.w) || (coordA.x - coordB.x); +} + +function mergeRenderedFeatureLayers(tiles) { + var result = tiles[0] || {}; + for (var i = 1; i < tiles.length; i++) { + var tile = tiles[i]; + for (var layerID in tile) { + var tileFeatures = tile[layerID]; + var resultFeatures = result[layerID]; + if (resultFeatures === undefined) { + resultFeatures = result[layerID] = tileFeatures; + } else { + for (var f = 0; f < tileFeatures.length; f++) { + resultFeatures.push(tileFeatures[f]); + } + } + } + } + return result; +} + +},{"./tile_coord":53}],48:[function(require,module,exports){ +'use strict'; + +var util = require('../util/util'); +var ajax = require('../util/ajax'); +var Evented = require('../util/evented'); +var loadTileJSON = require('./load_tilejson'); +var normalizeURL = require('../util/mapbox').normalizeTileURL; + +var RasterTileSource = (function (Evented) { + function RasterTileSource(id, options, dispatcher, eventedParent) { + Evented.call(this); + this.id = id; + this.dispatcher = dispatcher; + this.setEventedParent(eventedParent); + + this.type = 'raster'; + this.minzoom = 0; + this.maxzoom = 22; + this.roundZoom = true; + this.scheme = 'xyz'; + this.tileSize = 512; + this._loaded = false; + this.options = options; + util.extend(this, util.pick(options, ['url', 'scheme', 'tileSize'])); + } + + if ( Evented ) RasterTileSource.__proto__ = Evented; + RasterTileSource.prototype = Object.create( Evented && Evented.prototype ); + RasterTileSource.prototype.constructor = RasterTileSource; + + RasterTileSource.prototype.load = function load () { + var this$1 = this; + + this.fire('dataloading', {dataType: 'source'}); + loadTileJSON(this.options, function (err, tileJSON) { + if (err) { + return this$1.fire('error', err); + } + util.extend(this$1, tileJSON); + this$1.fire('data', {dataType: 'source'}); + this$1.fire('source.load'); + }); + }; + + RasterTileSource.prototype.onAdd = function onAdd (map) { + this.load(); + this.map = map; + }; + + RasterTileSource.prototype.serialize = function serialize () { + return { + type: 'raster', + url: this.url, + tileSize: this.tileSize, + tiles: this.tiles + }; + }; + + RasterTileSource.prototype.loadTile = function loadTile (tile, callback) { + var url = normalizeURL(tile.coord.url(this.tiles, null, this.scheme), this.url, this.tileSize); + + tile.request = ajax.getImage(url, done.bind(this)); + + function done(err, img) { + delete tile.request; + + if (tile.aborted) { + this.state = 'unloaded'; + return callback(null); + } + + if (err) { + this.state = 'errored'; + return callback(err); + } + + tile.setExpiryData(img); + delete img.cacheControl; + delete img.expires; + + var gl = this.map.painter.gl; + tile.texture = this.map.painter.getTileTexture(img.width); + if (tile.texture) { + gl.bindTexture(gl.TEXTURE_2D, tile.texture); + gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, gl.RGBA, gl.UNSIGNED_BYTE, img); + } else { + tile.texture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, tile.texture); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_NEAREST); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, img); + tile.texture.size = img.width; + } + gl.generateMipmap(gl.TEXTURE_2D); + + tile.state = 'loaded'; + + callback(null); + } + }; + + RasterTileSource.prototype.abortTile = function abortTile (tile) { + if (tile.request) { + tile.request.abort(); + delete tile.request; + } + }; + + RasterTileSource.prototype.unloadTile = function unloadTile (tile) { + if (tile.texture) this.map.painter.saveTileTexture(tile.texture); + }; + + return RasterTileSource; +}(Evented)); + +module.exports = RasterTileSource; + +},{"../util/ajax":109,"../util/evented":118,"../util/mapbox":125,"../util/util":129,"./load_tilejson":45}],49:[function(require,module,exports){ +'use strict'; + +var ajax = require('../util/ajax'); +var window = require('../util/window'); + +var pluginAvailableCallbacks = []; +var pluginRequested = false; +var pluginBlobURL = null; + +module.exports.registerForPluginAvailability = function(callback) { + if (pluginBlobURL) { + callback(pluginBlobURL); + } else { + pluginAvailableCallbacks.push(callback); + } +}; + +module.exports.errorCallback = null; + +module.exports.setRTLTextPlugin = function(pluginURL, callback) { + if (pluginRequested) { + throw new Error('setRTLTextPlugin cannot be called multiple times.'); + } + pluginRequested = true; + module.exports.errorCallback = callback; + ajax.getArrayBuffer(pluginURL, function (err, response) { + if (err) { + callback(err); + } else { + pluginBlobURL = + window.URL.createObjectURL(new window.Blob([response.data]), {type: "text/javascript"}); + + for (var i = 0, list = pluginAvailableCallbacks; i < list.length; i += 1) { + var pluginAvailableCallback = list[i]; + + pluginAvailableCallback(pluginBlobURL); + } + } + }); +}; + +},{"../util/ajax":109,"../util/window":112}],50:[function(require,module,exports){ +'use strict'; + +var util = require('../util/util'); + +var sourceTypes = { + 'vector': require('../source/vector_tile_source'), + 'raster': require('../source/raster_tile_source'), + 'geojson': require('../source/geojson_source'), + 'video': require('../source/video_source'), + 'image': require('../source/image_source'), + 'canvas': require('../source/canvas_source') +}; + +/* + * Creates a tiled data source instance given an options object. + * + * @param {string} id + * @param {Object} source A source definition object compliant with [`mapbox-gl-style-spec`](https://www.mapbox.com/mapbox-gl-style-spec/#sources) or, for a third-party source type, with that type's requirements. + * @param {string} options.type A source type like `raster`, `vector`, `video`, etc. + * @param {Dispatcher} dispatcher + * @returns {Source} + */ +exports.create = function(id, source, dispatcher, eventedParent) { + source = new sourceTypes[source.type](id, source, dispatcher, eventedParent); + + if (source.id !== id) { + throw new Error(("Expected Source id to be " + id + " instead of " + (source.id))); + } + + util.bindAll(['load', 'abort', 'unload', 'serialize', 'prepare'], source); + return source; +}; + +exports.getType = function (name) { + return sourceTypes[name]; +}; + +exports.setType = function (name, type) { + sourceTypes[name] = type; +}; + +/** + * The `Source` interface must be implemented by each source type, including "core" types (`vector`, `raster`, `video`, etc.) and all custom, third-party types. + * + * @class Source + * @private + * + * @param {string} id The id for the source. Must not be used by any existing source. + * @param {Object} options Source options, specific to the source type (except for `options.type`, which is always required). + * @param {string} options.type The source type, matching the value of `name` used in {@link Style#addSourceType}. + * @param {Dispatcher} dispatcher A {@link Dispatcher} instance, which can be used to send messages to the workers. + * + * @fires load to indicate source data has been loaded, so that it's okay to call `loadTile` + * @fires change to indicate source data has changed, so that any current caches should be flushed + * @property {string} id The id for the source. Must match the id passed to the constructor. + * @property {number} minzoom + * @property {number} maxzoom + * @property {boolean} isTileClipped `false` if tiles can be drawn outside their boundaries, `true` if they cannot. + * @property {boolean} reparseOverscaled `true` if tiles should be sent back to the worker for each overzoomed zoom level, `false` if not. + * @property {boolean} roundZoom `true` if zoom levels are rounded to the nearest integer in the source data, `false` if they are floor-ed to the nearest integer. + */ + +/** + * An optional URL to a script which, when run by a Worker, registers a {@link WorkerSource} implementation for this Source type by calling `self.registerWorkerSource(workerSource: WorkerSource)`. + * + * @member {URL|undefined} workerSourceURL + * @memberof Source + * @static + */ + +/** + * @method + * @name loadTile + * @param {Tile} tile + * @param {Funtion} callback Called when tile has been loaded + * @memberof Source + * @instance + */ + +/** + * @method + * @name abortTile + * @param {Tile} tile + * @memberof Source + * @instance + */ + +/** + * @method + * @name unloadTile + * @param {Tile} tile + * @memberof Source + * @instance + */ + +/** + * @method + * @name serialize + * @returns {Object} A plain (stringifiable) JS object representing the current state of the source. Creating a source using the returned object as the `options` should result in a Source that is equivalent to this one. + * @memberof Source + * @instance + */ + +/** + * @method + * @name prepare + * @memberof Source + * @instance + */ + + + +/** + * May be implemented by custom source types to provide code that can be run on + * the WebWorkers. In addition to providing a custom + * {@link WorkerSource#loadTile}, any other methods attached to a `WorkerSource` + * implementation may also be targeted by the {@link Source} via + * `dispatcher.send('source-type.methodname', params, callback)`. + * + * @see {@link Map#addSourceType} + * @private + * + * @class WorkerSource + * @param {Actor} actor + * @param {StyleLayerIndex} layerIndex + */ + +/** + * Loads a tile from the given params and parse it into buckets ready to send + * back to the main thread for rendering. Should call the callback with: + * `{ buckets, featureIndex, collisionTile, symbolInstancesArray, symbolQuadsArray, rawTileData}`. + * + * @method + * @name loadTile + * @param {Object} params Parameters sent by the main-thread Source identifying the tile to load. + * @param {Function} callback + * @memberof WorkerSource + * @instance + */ + +/** + * Re-parses a tile that has already been loaded. Yields the same data as + * {@link WorkerSource#loadTile}. + * + * @method + * @name reloadTile + * @param {Object} params + * @param {Function} callback + * @memberof WorkerSource + * @instance + */ + +/** + * Aborts loading a tile that is in progress. + * @method + * @name abortTile + * @param {Object} params + * @memberof WorkerSource + * @instance + */ + +/** + * Removes this tile from any local caches. + * @method + * @name removeTile + * @memberof WorkerSource + * @instance + */ + +},{"../source/canvas_source":40,"../source/geojson_source":41,"../source/image_source":44,"../source/raster_tile_source":48,"../source/vector_tile_source":54,"../source/video_source":56,"../util/util":129}],51:[function(require,module,exports){ +'use strict'; + +var Source = require('./source'); +var Tile = require('./tile'); +var Evented = require('../util/evented'); +var TileCoord = require('./tile_coord'); +var Cache = require('../util/lru_cache'); +var Coordinate = require('../geo/coordinate'); +var util = require('../util/util'); +var EXTENT = require('../data/extent'); + +/** + * `SourceCache` is responsible for + * + * - creating an instance of `Source` + * - forwarding events from `Source` + * - caching tiles loaded from an instance of `Source` + * - loading the tiles needed to render a given viewport + * - unloading the cached tiles not needed to render a given viewport + * + * @private + */ +var SourceCache = (function (Evented) { + function SourceCache(id, options, dispatcher) { + Evented.call(this); + this.id = id; + this.dispatcher = dispatcher; + + this.on('source.load', function() { + this._sourceLoaded = true; + }); + + this.on('error', function() { + this._sourceErrored = true; + }); + + this.on('data', function(event) { + if (this._sourceLoaded && event.dataType === 'source') { + this.reload(); + if (this.transform) { + this.update(this.transform); + } + } + }); + + this._source = Source.create(id, options, dispatcher, this); + + this._tiles = {}; + this._cache = new Cache(0, this.unloadTile.bind(this)); + this._timers = {}; + this._cacheTimers = {}; + + this._isIdRenderable = this._isIdRenderable.bind(this); + } + + if ( Evented ) SourceCache.__proto__ = Evented; + SourceCache.prototype = Object.create( Evented && Evented.prototype ); + SourceCache.prototype.constructor = SourceCache; + + SourceCache.prototype.onAdd = function onAdd (map) { + this.map = map; + if (this._source && this._source.onAdd) { + this._source.onAdd(map); + } + }; + + SourceCache.prototype.onRemove = function onRemove (map) { + if (this._source && this._source.onRemove) { + this._source.onRemove(map); + } + }; + + /** + * Return true if no tile data is pending, tiles will not change unless + * an additional API call is received. + * @returns {boolean} + * @private + */ + SourceCache.prototype.loaded = function loaded () { + var this$1 = this; + + if (this._sourceErrored) { return true; } + if (!this._sourceLoaded) { return false; } + for (var t in this._tiles) { + var tile = this$1._tiles[t]; + if (tile.state !== 'loaded' && tile.state !== 'errored') + return false; + } + return true; + }; + + /** + * @returns {Source} The underlying source object + * @private + */ + SourceCache.prototype.getSource = function getSource () { + return this._source; + }; + + SourceCache.prototype.loadTile = function loadTile (tile, callback) { + return this._source.loadTile(tile, callback); + }; + + SourceCache.prototype.unloadTile = function unloadTile (tile) { + if (this._source.unloadTile) + return this._source.unloadTile(tile); + }; + + SourceCache.prototype.abortTile = function abortTile (tile) { + if (this._source.abortTile) + return this._source.abortTile(tile); + }; + + SourceCache.prototype.serialize = function serialize () { + return this._source.serialize(); + }; + + SourceCache.prototype.prepare = function prepare () { + if (this._sourceLoaded && this._source.prepare) + return this._source.prepare(); + }; + + /** + * Return all tile ids ordered with z-order, and cast to numbers + * @returns {Array} ids + * @private + */ + SourceCache.prototype.getIds = function getIds () { + return Object.keys(this._tiles).map(Number).sort(compareKeyZoom); + }; + + SourceCache.prototype.getRenderableIds = function getRenderableIds () { + return this.getIds().filter(this._isIdRenderable); + }; + + SourceCache.prototype._isIdRenderable = function _isIdRenderable (id) { + return this._tiles[id].hasData() && !this._coveredTiles[id]; + }; + + SourceCache.prototype.reload = function reload () { + var this$1 = this; + + this._cache.reset(); + for (var i in this._tiles) { + this$1.reloadTile(i, 'reloading'); + } + }; + + SourceCache.prototype.reloadTile = function reloadTile (id, state) { + var tile = this._tiles[id]; + + // The difference between "loading" tiles and "reloading" or "expired" + // tiles is that "reloading"/"expired" tiles are "renderable". + // Therefore, a "loading" tile cannot become a "reloading" tile without + // first becoming a "loaded" tile. + if (tile.state !== 'loading') { + tile.state = state; + } + + this.loadTile(tile, this._tileLoaded.bind(this, tile, id)); + }; + + SourceCache.prototype._tileLoaded = function _tileLoaded (tile, id, err) { + if (err) { + tile.state = 'errored'; + this._source.fire('error', {tile: tile, error: err}); + return; + } + + tile.sourceCache = this; + tile.timeAdded = new Date().getTime(); + this._setTileReloadTimer(id, tile); + this._source.fire('data', {tile: tile, coord: tile.coord, dataType: 'tile'}); + + // HACK this is necessary to fix https://github.com/mapbox/mapbox-gl-js/issues/2986 + if (this.map) this.map.painter.tileExtentVAO.vao = null; + }; + + /** + * Get a specific tile by TileCoordinate + * @param {TileCoordinate} coord + * @returns {Object} tile + * @private + */ + SourceCache.prototype.getTile = function getTile (coord) { + return this.getTileByID(coord.id); + }; + + /** + * Get a specific tile by id + * @param {number|string} id + * @returns {Object} tile + * @private + */ + SourceCache.prototype.getTileByID = function getTileByID (id) { + return this._tiles[id]; + }; + + /** + * get the zoom level adjusted for the difference in map and source tilesizes + * @param {Object} transform + * @returns {number} zoom level + * @private + */ + SourceCache.prototype.getZoom = function getZoom (transform) { + return transform.zoom + transform.scaleZoom(transform.tileSize / this._source.tileSize); + }; + + /** + * Recursively find children of the given tile (up to maxCoveringZoom) that are already loaded; + * adds found tiles to retain object; returns true if any child is found. + * + * @param {Coordinate} coord + * @param {number} maxCoveringZoom + * @param {boolean} retain + * @returns {boolean} whether the operation was complete + * @private + */ + SourceCache.prototype.findLoadedChildren = function findLoadedChildren (coord, maxCoveringZoom, retain) { + var this$1 = this; + + var found = false; + + for (var id in this._tiles) { + var tile = this$1._tiles[id]; + + // only consider renderable tiles on higher zoom levels (up to maxCoveringZoom) + if (retain[id] || !tile.hasData() || tile.coord.z <= coord.z || tile.coord.z > maxCoveringZoom) continue; + + // disregard tiles that are not descendants of the given tile coordinate + var z2 = Math.pow(2, Math.min(tile.coord.z, this$1._source.maxzoom) - Math.min(coord.z, this$1._source.maxzoom)); + if (Math.floor(tile.coord.x / z2) !== coord.x || + Math.floor(tile.coord.y / z2) !== coord.y) + continue; + + // found loaded child + retain[id] = true; + found = true; + + // loop through parents; retain the topmost loaded one if found + while (tile && tile.coord.z - 1 > coord.z) { + var parentId = tile.coord.parent(this$1._source.maxzoom).id; + tile = this$1._tiles[parentId]; + + if (tile && tile.hasData()) { + delete retain[id]; + retain[parentId] = true; + } + } + } + return found; + }; + + /** + * Find a loaded parent of the given tile (up to minCoveringZoom); + * adds the found tile to retain object and returns the tile if found + * + * @param {Coordinate} coord + * @param {number} minCoveringZoom + * @param {boolean} retain + * @returns {Tile} tile object + * @private + */ + SourceCache.prototype.findLoadedParent = function findLoadedParent (coord, minCoveringZoom, retain) { + var this$1 = this; + + for (var z = coord.z - 1; z >= minCoveringZoom; z--) { + coord = coord.parent(this$1._source.maxzoom); + var tile = this$1._tiles[coord.id]; + if (tile && tile.hasData()) { + retain[coord.id] = true; + return tile; + } + if (this$1._cache.has(coord.id)) { + retain[coord.id] = true; + return this$1._cache.get(coord.id); + } + } + }; + + /** + * Resizes the tile cache based on the current viewport's size. + * + * Larger viewports use more tiles and need larger caches. Larger viewports + * are more likely to be found on devices with more memory and on pages where + * the map is more important. + * + * @private + */ + SourceCache.prototype.updateCacheSize = function updateCacheSize (transform) { + var widthInTiles = Math.ceil(transform.width / transform.tileSize) + 1; + var heightInTiles = Math.ceil(transform.height / transform.tileSize) + 1; + var approxTilesInView = widthInTiles * heightInTiles; + var commonZoomRange = 5; + this._cache.setMaxSize(Math.floor(approxTilesInView * commonZoomRange)); + }; + + /** + * Removes tiles that are outside the viewport and adds new tiles that + * are inside the viewport. + * @private + */ + SourceCache.prototype.update = function update (transform) { + var this$1 = this; + + if (!this._sourceLoaded) { return; } + var i; + var coord; + var tile; + var parentTile; + + this.updateCacheSize(transform); + + // Determine the overzooming/underzooming amounts. + var zoom = (this._source.roundZoom ? Math.round : Math.floor)(this.getZoom(transform)); + var minCoveringZoom = Math.max(zoom - SourceCache.maxOverzooming, this._source.minzoom); + var maxCoveringZoom = Math.max(zoom + SourceCache.maxUnderzooming, this._source.minzoom); + + // Retain is a list of tiles that we shouldn't delete, even if they are not + // the most ideal tile for the current viewport. This may include tiles like + // parent or child tiles that are *already* loaded. + var retain = {}; + + // Covered is a list of retained tiles who's areas are full covered by other, + // better, retained tiles. They are not drawn separately. + this._coveredTiles = {}; + + var visibleCoords; + if (!this.used) { + visibleCoords = []; + } else if (this._source.coord) { + visibleCoords = [this._source.coord]; + } else { + visibleCoords = transform.coveringTiles({ + tileSize: this._source.tileSize, + minzoom: this._source.minzoom, + maxzoom: this._source.maxzoom, + roundZoom: this._source.roundZoom, + reparseOverscaled: this._source.reparseOverscaled + }); + } + + for (i = 0; i < visibleCoords.length; i++) { + coord = visibleCoords[i]; + tile = this$1.addTile(coord); + + retain[coord.id] = true; + + if (tile.hasData()) + continue; + + // The tile we require is not yet loaded. + // Retain child or parent tiles that cover the same area. + if (!this$1.findLoadedChildren(coord, maxCoveringZoom, retain)) { + parentTile = this$1.findLoadedParent(coord, minCoveringZoom, retain); + if (parentTile) { + this$1.addTile(parentTile.coord); + } + } + } + + var parentsForFading = {}; + + if (isRasterType(this._source.type)) { + var ids = Object.keys(retain); + for (var k = 0; k < ids.length; k++) { + var id = ids[k]; + coord = TileCoord.fromID(id); + tile = this$1._tiles[id]; + if (!tile) continue; + + // If the drawRasterTile has never seen this tile, then + // tile.fadeEndTime may be unset. In that case, or if + // fadeEndTime is in the future, then this tile is still + // fading in. Find tiles to cross-fade with it. + if (typeof tile.fadeEndTime === 'undefined' || tile.fadeEndTime >= Date.now()) { + if (this$1.findLoadedChildren(coord, maxCoveringZoom, retain)) { + retain[id] = true; + } + parentTile = this$1.findLoadedParent(coord, minCoveringZoom, parentsForFading); + if (parentTile) { + this$1.addTile(parentTile.coord); + } + } + } + } + + var fadedParent; + for (fadedParent in parentsForFading) { + if (!retain[fadedParent]) { + // If a tile is only needed for fading, mark it as covered so that it isn't rendered on it's own. + this$1._coveredTiles[fadedParent] = true; + } + } + for (fadedParent in parentsForFading) { + retain[fadedParent] = true; + } + + // Remove the tiles we don't need anymore. + var remove = util.keysDifference(this._tiles, retain); + for (i = 0; i < remove.length; i++) { + this$1.removeTile(+remove[i]); + } + + this.transform = transform; + }; + + /** + * Add a tile, given its coordinate, to the pyramid. + * @param {Coordinate} coord + * @returns {Coordinate} the coordinate. + * @private + */ + SourceCache.prototype.addTile = function addTile (coord) { + var tile = this._tiles[coord.id]; + if (tile) + return tile; + + var wrapped = coord.wrapped(); + tile = this._tiles[wrapped.id]; + + if (!tile) { + tile = this._cache.get(wrapped.id); + if (tile) { + tile.redoPlacement(this._source); + if (this._cacheTimers[wrapped.id]) { + clearTimeout(this._cacheTimers[wrapped.id]); + this._cacheTimers[wrapped.id] = undefined; + this._setTileReloadTimer(wrapped.id, tile); + } + } + } + + if (!tile) { + var zoom = coord.z; + var overscaling = zoom > this._source.maxzoom ? Math.pow(2, zoom - this._source.maxzoom) : 1; + tile = new Tile(wrapped, this._source.tileSize * overscaling, this._source.maxzoom); + this.loadTile(tile, this._tileLoaded.bind(this, tile, coord.id)); + } + + tile.uses++; + this._tiles[coord.id] = tile; + this._source.fire('dataloading', {tile: tile, coord: tile.coord, dataType: 'tile'}); + + return tile; + }; + + SourceCache.prototype._setTileReloadTimer = function _setTileReloadTimer (id, tile) { + var this$1 = this; + + var tileExpires = tile.getExpiry(); + if (tileExpires) { + this._timers[id] = setTimeout(function () { + this$1.reloadTile(id, 'expired'); + this$1._timers[id] = undefined; + }, tileExpires - new Date().getTime()); + } + }; + + SourceCache.prototype._setCacheInvalidationTimer = function _setCacheInvalidationTimer (id, tile) { + var this$1 = this; + + var tileExpires = tile.getExpiry(); + if (tileExpires) { + this._cacheTimers[id] = setTimeout(function () { + this$1._cache.remove(id); + this$1._cacheTimers[id] = undefined; + }, tileExpires - new Date().getTime()); + } + }; + + /** + * Remove a tile, given its id, from the pyramid + * @param {string|number} id tile id + * @returns {undefined} nothing + * @private + */ + SourceCache.prototype.removeTile = function removeTile (id) { + var tile = this._tiles[id]; + if (!tile) + return; + + tile.uses--; + delete this._tiles[id]; + if (this._timers[id]) { + clearTimeout(this._timers[id]); + this._timers[id] = undefined; + } + this._source.fire('data', { tile: tile, coord: tile.coord, dataType: 'tile' }); + + if (tile.uses > 0) + return; + + if (tile.hasData()) { + var wrappedId = tile.coord.wrapped().id; + this._cache.add(wrappedId, tile); + this._setCacheInvalidationTimer(wrappedId, tile); + } else { + tile.aborted = true; + this.abortTile(tile); + this.unloadTile(tile); + } + }; + + /** + * Remove all tiles from this pyramid + * @private + */ + SourceCache.prototype.clearTiles = function clearTiles () { + var this$1 = this; + + for (var id in this._tiles) + this$1.removeTile(id); + this._cache.reset(); + }; + + /** + * Search through our current tiles and attempt to find the tiles that + * cover the given bounds. + * @param {Array} queryGeometry coordinates of the corners of bounding rectangle + * @returns {Array} result items have {tile, minX, maxX, minY, maxY}, where min/max bounding values are the given bounds transformed in into the coordinate space of this tile. + * @private + */ + SourceCache.prototype.tilesIn = function tilesIn (queryGeometry) { + var this$1 = this; + + var tileResults = {}; + var ids = this.getIds(); + + var minX = Infinity; + var minY = Infinity; + var maxX = -Infinity; + var maxY = -Infinity; + var z = queryGeometry[0].zoom; + + for (var k = 0; k < queryGeometry.length; k++) { + var p = queryGeometry[k]; + minX = Math.min(minX, p.column); + minY = Math.min(minY, p.row); + maxX = Math.max(maxX, p.column); + maxY = Math.max(maxY, p.row); + } + + for (var i = 0; i < ids.length; i++) { + var tile = this$1._tiles[ids[i]]; + var coord = TileCoord.fromID(ids[i]); + + var tileSpaceBounds = [ + coordinateToTilePoint(coord, tile.sourceMaxZoom, new Coordinate(minX, minY, z)), + coordinateToTilePoint(coord, tile.sourceMaxZoom, new Coordinate(maxX, maxY, z)) + ]; + + if (tileSpaceBounds[0].x < EXTENT && tileSpaceBounds[0].y < EXTENT && + tileSpaceBounds[1].x >= 0 && tileSpaceBounds[1].y >= 0) { + + var tileSpaceQueryGeometry = []; + for (var j = 0; j < queryGeometry.length; j++) { + tileSpaceQueryGeometry.push(coordinateToTilePoint(coord, tile.sourceMaxZoom, queryGeometry[j])); + } + + var tileResult = tileResults[tile.coord.id]; + if (tileResult === undefined) { + tileResult = tileResults[tile.coord.id] = { + tile: tile, + coord: coord, + queryGeometry: [], + scale: Math.pow(2, this$1.transform.zoom - tile.coord.z) + }; + } + + // Wrapped tiles share one tileResult object but can have multiple queryGeometry parts + tileResult.queryGeometry.push(tileSpaceQueryGeometry); + } + } + + var results = []; + for (var t in tileResults) { + results.push(tileResults[t]); + } + return results; + }; + + SourceCache.prototype.redoPlacement = function redoPlacement () { + var this$1 = this; + + var ids = this.getIds(); + for (var i = 0; i < ids.length; i++) { + var tile = this$1.getTileByID(ids[i]); + tile.redoPlacement(this$1._source); + } + }; + + SourceCache.prototype.getVisibleCoordinates = function getVisibleCoordinates () { + var this$1 = this; + + var coords = this.getRenderableIds().map(TileCoord.fromID); + for (var i = 0, list = coords; i < list.length; i += 1) { + var coord = list[i]; + + coord.posMatrix = this$1.transform.calculatePosMatrix(coord, this$1._source.maxzoom); + } + return coords; + }; + + return SourceCache; +}(Evented)); + +SourceCache.maxOverzooming = 10; +SourceCache.maxUnderzooming = 3; + +/** + * Convert a coordinate to a point in a tile's coordinate space. + * @param {Coordinate} tileCoord + * @param {Coordinate} coord + * @returns {Object} position + * @private + */ +function coordinateToTilePoint(tileCoord, sourceMaxZoom, coord) { + var zoomedCoord = coord.zoomTo(Math.min(tileCoord.z, sourceMaxZoom)); + return { + x: (zoomedCoord.column - (tileCoord.x + tileCoord.w * Math.pow(2, tileCoord.z))) * EXTENT, + y: (zoomedCoord.row - tileCoord.y) * EXTENT + }; + +} + +function compareKeyZoom(a, b) { + return (a % 32) - (b % 32); +} + +function isRasterType(type) { + return type === 'raster' || type === 'image' || type === 'video'; +} + +module.exports = SourceCache; + +},{"../data/extent":11,"../geo/coordinate":18,"../util/evented":118,"../util/lru_cache":124,"../util/util":129,"./source":50,"./tile":52,"./tile_coord":53}],52:[function(require,module,exports){ +'use strict'; + +var util = require('../util/util'); +var Bucket = require('../data/bucket'); +var FeatureIndex = require('../data/feature_index'); +var vt = require('vector-tile'); +var Protobuf = require('pbf'); +var GeoJSONFeature = require('../util/vectortile_to_geojson'); +var featureFilter = require('feature-filter'); +var CollisionTile = require('../symbol/collision_tile'); +var CollisionBoxArray = require('../symbol/collision_box'); +var SymbolInstancesArray = require('../symbol/symbol_instances'); +var SymbolQuadsArray = require('../symbol/symbol_quads'); + +/** + * A tile object is the combination of a Coordinate, which defines + * its place, as well as a unique ID and data tracking for its content + * + * @private + */ +var Tile = function Tile(coord, size, sourceMaxZoom) { + this.coord = coord; + this.uid = util.uniqueId(); + this.uses = 0; + this.tileSize = size; + this.sourceMaxZoom = sourceMaxZoom; + this.buckets = {}; + this.expires = null; + this.cacheControl = null; + + // `this.state` must be one of + // + // - `loading`: Tile data is in the process of loading. + // - `loaded`:Tile data has been loaded. Tile can be rendered. + // - `reloading`: Tile data has been loaded and is being updated. Tile can be rendered. + // - `unloaded`: Tile data has been deleted. + // - `errored`: Tile data was not loaded because of an error. + // - `expired`: Tile data was previously loaded, but has expired per its HTTP headers and is in the process of refreshing. + this.state = 'loading'; +}; + +Tile.prototype.registerFadeDuration = function registerFadeDuration (animationLoop, duration) { + var fadeEndTime = duration + this.timeAdded; + if (fadeEndTime < Date.now()) return; + if (this.fadeEndTime && fadeEndTime < this.fadeEndTime) return; + + this.fadeEndTime = fadeEndTime; + animationLoop.set(this.fadeEndTime - Date.now()); +}; + +/** + * Given a data object with a 'buffers' property, load it into + * this tile's elementGroups and buffers properties and set loaded + * to true. If the data is null, like in the case of an empty + * GeoJSON tile, no-op but still set loaded to true. + * @param {Object} data + * @returns {undefined} + * @private + */ +Tile.prototype.loadVectorData = function loadVectorData (data, painter) { + if (this.hasData()) { + this.unloadVectorData(painter); + } + + this.state = 'loaded'; + + // empty GeoJSON tile + if (!data) return; + + // If we are redoing placement for the same tile, we will not recieve + // a new "rawTileData" object. If we are loading a new tile, we will + // recieve a new "rawTileData" object. + if (data.rawTileData) { + this.rawTileData = data.rawTileData; + } + + this.collisionBoxArray = new CollisionBoxArray(data.collisionBoxArray); + this.collisionTile = new CollisionTile(data.collisionTile, this.collisionBoxArray); + this.symbolInstancesArray = new SymbolInstancesArray(data.symbolInstancesArray); + this.symbolQuadsArray = new SymbolQuadsArray(data.symbolQuadsArray); + this.featureIndex = new FeatureIndex(data.featureIndex, this.rawTileData, this.collisionTile); + this.buckets = Bucket.deserialize(data.buckets, painter.style); +}; + +/** + * Replace this tile's symbol buckets with fresh data. + * @param {Object} data + * @param {Style} style + * @returns {undefined} + * @private + */ +Tile.prototype.reloadSymbolData = function reloadSymbolData (data, style) { + var this$1 = this; + + if (this.state === 'unloaded') return; + + this.collisionTile = new CollisionTile(data.collisionTile, this.collisionBoxArray); + this.featureIndex.setCollisionTile(this.collisionTile); + + for (var id in this.buckets) { + var bucket = this$1.buckets[id]; + if (bucket.layers[0].type === 'symbol') { + bucket.destroy(); + delete this$1.buckets[id]; + } + } + + // Add new symbol buckets + util.extend(this.buckets, Bucket.deserialize(data.buckets, style)); +}; + +/** + * Release any data or WebGL resources referenced by this tile. + * @returns {undefined} + * @private + */ +Tile.prototype.unloadVectorData = function unloadVectorData () { + var this$1 = this; + + for (var id in this.buckets) { + this$1.buckets[id].destroy(); + } + this.buckets = {}; + + this.collisionBoxArray = null; + this.symbolQuadsArray = null; + this.symbolInstancesArray = null; + this.collisionTile = null; + this.featureIndex = null; + this.state = 'unloaded'; +}; + +Tile.prototype.redoPlacement = function redoPlacement (source) { + var this$1 = this; + + if (source.type !== 'vector' && source.type !== 'geojson') { + return; + } + if (this.state !== 'loaded') { + this.redoWhenDone = true; + return; + } + if (!this.collisionTile) { // empty tile + return; + } + + this.state = 'reloading'; + + source.dispatcher.send('redoPlacement', { + type: source.type, + uid: this.uid, + source: source.id, + angle: source.map.transform.angle, + pitch: source.map.transform.pitch, + showCollisionBoxes: source.map.showCollisionBoxes + }, function (_, data) { + this$1.reloadSymbolData(data, source.map.style); + source.fire('data', {tile: this$1, coord: this$1.coord, dataType: 'tile'}); + + // HACK this is nescessary to fix https://github.com/mapbox/mapbox-gl-js/issues/2986 + if (source.map) source.map.painter.tileExtentVAO.vao = null; + + this$1.state = 'loaded'; + + if (this$1.redoWhenDone) { + this$1.redoWhenDone = false; + this$1.redoPlacement(source); + } + }, this.workerID); +}; + +Tile.prototype.getBucket = function getBucket (layer) { + return this.buckets[layer.id]; +}; + +Tile.prototype.querySourceFeatures = function querySourceFeatures (result, params) { + var this$1 = this; + + if (!this.rawTileData) return; + + if (!this.vtLayers) { + this.vtLayers = new vt.VectorTile(new Protobuf(this.rawTileData)).layers; + } + + var layer = this.vtLayers._geojsonTileLayer || this.vtLayers[params.sourceLayer]; + + if (!layer) return; + + var filter = featureFilter(params && params.filter); + var coord = { z: this.coord.z, x: this.coord.x, y: this.coord.y }; + + for (var i = 0; i < layer.length; i++) { + var feature = layer.feature(i); + if (filter(feature)) { + var geojsonFeature = new GeoJSONFeature(feature, this$1.coord.z, this$1.coord.x, this$1.coord.y); + geojsonFeature.tile = coord; + result.push(geojsonFeature); + } + } +}; + +Tile.prototype.hasData = function hasData () { + return this.state === 'loaded' || this.state === 'reloading' || this.state === 'expired'; +}; + +Tile.prototype.setExpiryData = function setExpiryData (data) { + if (data.cacheControl) this.cacheControl = data.cacheControl; + if (data.expires) this.expires = data.expires; +}; + +Tile.prototype.getExpiry = function getExpiry () { + if (this.cacheControl) { + // Cache-Control headers set max age (in seconds) from the time of request + var parsedCC = util.parseCacheControl(this.cacheControl); + if (parsedCC['max-age']) return this.timeAdded + parsedCC['max-age'] * 1000; + } else if (this.expires) { + // Expires headers set absolute expiration times + return new Date(this.expires).getTime(); + } +}; + +module.exports = Tile; + +},{"../data/bucket":2,"../data/feature_index":12,"../symbol/collision_box":78,"../symbol/collision_tile":80,"../symbol/symbol_instances":89,"../symbol/symbol_quads":90,"../util/util":129,"../util/vectortile_to_geojson":130,"feature-filter":139,"pbf":197,"vector-tile":207}],53:[function(require,module,exports){ +'use strict'; + +var assert = require('assert'); +var WhooTS = require('whoots-js'); +var Coordinate = require('../geo/coordinate'); + +var TileCoord = function TileCoord(z, x, y, w) { + assert(!isNaN(z) && z >= 0 && z % 1 === 0); + assert(!isNaN(x) && x >= 0 && x % 1 === 0); + assert(!isNaN(y) && y >= 0 && y % 1 === 0); + + if (isNaN(w)) w = 0; + + this.z = +z; + this.x = +x; + this.y = +y; + this.w = +w; + + // calculate id + w *= 2; + if (w < 0) w = w * -1 - 1; + var dim = 1 << this.z; + this.id = ((dim * dim * w + dim * this.y + this.x) * 32) + this.z; + + // for caching pos matrix calculation when rendering + this.posMatrix = null; +}; + +TileCoord.prototype.toString = function toString () { + return ((this.z) + "/" + (this.x) + "/" + (this.y)); +}; + +TileCoord.prototype.toCoordinate = function toCoordinate (sourceMaxZoom) { + var zoom = Math.min(this.z, sourceMaxZoom === undefined ? this.z : sourceMaxZoom); + var tileScale = Math.pow(2, zoom); + var row = this.y; + var column = this.x + tileScale * this.w; + return new Coordinate(column, row, zoom); +}; + +// given a list of urls, choose a url template and return a tile URL +TileCoord.prototype.url = function url (urls, sourceMaxZoom, scheme) { + var bbox = WhooTS.getTileBBox(this.x, this.y, this.z); + var quadkey = getQuadkey(this.z, this.x, this.y); + + return urls[(this.x + this.y) % urls.length] + .replace('{prefix}', (this.x % 16).toString(16) + (this.y % 16).toString(16)) + .replace('{z}', Math.min(this.z, sourceMaxZoom || this.z)) + .replace('{x}', this.x) + .replace('{y}', scheme === 'tms' ? (Math.pow(2, this.z) - this.y - 1) : this.y) + .replace('{quadkey}', quadkey) + .replace('{bbox-epsg-3857}', bbox); +}; + +// Return the coordinate of the parent tile +TileCoord.prototype.parent = function parent (sourceMaxZoom) { + if (this.z === 0) return null; + + // the id represents an overscaled tile, return the same coordinates with a lower z + if (this.z > sourceMaxZoom) { + return new TileCoord(this.z - 1, this.x, this.y, this.w); + } + + return new TileCoord(this.z - 1, Math.floor(this.x / 2), Math.floor(this.y / 2), this.w); +}; + +TileCoord.prototype.wrapped = function wrapped () { + return new TileCoord(this.z, this.x, this.y, 0); +}; + +// Return the coordinates of the tile's children +TileCoord.prototype.children = function children (sourceMaxZoom) { + + if (this.z >= sourceMaxZoom) { + // return a single tile coord representing a an overscaled tile + return [new TileCoord(this.z + 1, this.x, this.y, this.w)]; + } + + var z = this.z + 1; + var x = this.x * 2; + var y = this.y * 2; + return [ + new TileCoord(z, x, y, this.w), + new TileCoord(z, x + 1, y, this.w), + new TileCoord(z, x, y + 1, this.w), + new TileCoord(z, x + 1, y + 1, this.w) + ]; +}; + +// Taken from polymaps src/Layer.js +// https://github.com/simplegeo/polymaps/blob/master/src/Layer.js#L333-L383 + +function edge(a, b) { + if (a.row > b.row) { var t = a; a = b; b = t; } + return { + x0: a.column, + y0: a.row, + x1: b.column, + y1: b.row, + dx: b.column - a.column, + dy: b.row - a.row + }; +} + +function scanSpans(e0, e1, ymin, ymax, scanLine) { + var y0 = Math.max(ymin, Math.floor(e1.y0)); + var y1 = Math.min(ymax, Math.ceil(e1.y1)); + + // sort edges by x-coordinate + if ((e0.x0 === e1.x0 && e0.y0 === e1.y0) ? + (e0.x0 + e1.dy / e0.dy * e0.dx < e1.x1) : + (e0.x1 - e1.dy / e0.dy * e0.dx < e1.x0)) { + var t = e0; e0 = e1; e1 = t; + } + + // scan lines! + var m0 = e0.dx / e0.dy; + var m1 = e1.dx / e1.dy; + var d0 = e0.dx > 0; // use y + 1 to compute x0 + var d1 = e1.dx < 0; // use y + 1 to compute x1 + for (var y = y0; y < y1; y++) { + var x0 = m0 * Math.max(0, Math.min(e0.dy, y + d0 - e0.y0)) + e0.x0; + var x1 = m1 * Math.max(0, Math.min(e1.dy, y + d1 - e1.y0)) + e1.x0; + scanLine(Math.floor(x1), Math.ceil(x0), y); + } +} + +function scanTriangle(a, b, c, ymin, ymax, scanLine) { + var ab = edge(a, b), + bc = edge(b, c), + ca = edge(c, a); + + var t; + + // sort edges by y-length + if (ab.dy > bc.dy) { t = ab; ab = bc; bc = t; } + if (ab.dy > ca.dy) { t = ab; ab = ca; ca = t; } + if (bc.dy > ca.dy) { t = bc; bc = ca; ca = t; } + + // scan span! scan span! + if (ab.dy) scanSpans(ca, ab, ymin, ymax, scanLine); + if (bc.dy) scanSpans(ca, bc, ymin, ymax, scanLine); +} + +TileCoord.cover = function(z, bounds, actualZ, renderWorldCopies) { + if (renderWorldCopies === undefined) { + renderWorldCopies = true; + } + var tiles = 1 << z; + var t = {}; + + function scanLine(x0, x1, y) { + var x, w, wx, coord; + if (y >= 0 && y <= tiles) { + for (x = x0; x < x1; x++) { + w = Math.floor(x / tiles); + wx = (x % tiles + tiles) % tiles; + if (w === 0 || renderWorldCopies === true) { + coord = new TileCoord(actualZ, wx, y, w); + t[coord.id] = coord; + } + } + } + } + + // Divide the screen up in two triangles and scan each of them: + // +---/ + // | / | + // /---+ + scanTriangle(bounds[0], bounds[1], bounds[2], 0, tiles, scanLine); + scanTriangle(bounds[2], bounds[3], bounds[0], 0, tiles, scanLine); + + return Object.keys(t).map(function (id) { + return t[id]; + }); +}; + +// Parse a packed integer id into a TileCoord object +TileCoord.fromID = function(id) { + var z = id % 32, dim = 1 << z; + var xy = ((id - z) / 32); + var x = xy % dim, y = ((xy - x) / dim) % dim; + var w = Math.floor(xy / (dim * dim)); + if (w % 2 !== 0) w = w * -1 - 1; + w /= 2; + return new TileCoord(z, x, y, w); +}; + +function getQuadkey(z, x, y) { + var quadkey = '', mask; + for (var i = z; i > 0; i--) { + mask = 1 << (i - 1); + quadkey += ((x & mask ? 1 : 0) + (y & mask ? 2 : 0)); + } + return quadkey; +} + +module.exports = TileCoord; + +},{"../geo/coordinate":18,"assert":135,"whoots-js":216}],54:[function(require,module,exports){ +'use strict'; + +var Evented = require('../util/evented'); +var util = require('../util/util'); +var loadTileJSON = require('./load_tilejson'); +var normalizeURL = require('../util/mapbox').normalizeTileURL; + +var VectorTileSource = (function (Evented) { + function VectorTileSource(id, options, dispatcher, eventedParent) { + Evented.call(this); + this.id = id; + this.dispatcher = dispatcher; + + this.type = 'vector'; + this.minzoom = 0; + this.maxzoom = 22; + this.scheme = 'xyz'; + this.tileSize = 512; + this.reparseOverscaled = true; + this.isTileClipped = true; + util.extend(this, util.pick(options, ['url', 'scheme', 'tileSize'])); + + this._options = util.extend({ type: 'vector' }, options); + + if (this.tileSize !== 512) { + throw new Error('vector tile sources must have a tileSize of 512'); + } + + this.setEventedParent(eventedParent); + } + + if ( Evented ) VectorTileSource.__proto__ = Evented; + VectorTileSource.prototype = Object.create( Evented && Evented.prototype ); + VectorTileSource.prototype.constructor = VectorTileSource; + + VectorTileSource.prototype.load = function load () { + var this$1 = this; + + this.fire('dataloading', {dataType: 'source'}); + + loadTileJSON(this._options, function (err, tileJSON) { + if (err) { + this$1.fire('error', err); + return; + } + util.extend(this$1, tileJSON); + this$1.fire('data', {dataType: 'source'}); + this$1.fire('source.load'); + }); + }; + + VectorTileSource.prototype.onAdd = function onAdd (map) { + this.load(); + this.map = map; + }; + + VectorTileSource.prototype.serialize = function serialize () { + return util.extend({}, this._options); + }; + + VectorTileSource.prototype.loadTile = function loadTile (tile, callback) { + var overscaling = tile.coord.z > this.maxzoom ? Math.pow(2, tile.coord.z - this.maxzoom) : 1; + var params = { + url: normalizeURL(tile.coord.url(this.tiles, this.maxzoom, this.scheme), this.url), + uid: tile.uid, + coord: tile.coord, + zoom: tile.coord.z, + tileSize: this.tileSize * overscaling, + type: this.type, + source: this.id, + overscaling: overscaling, + angle: this.map.transform.angle, + pitch: this.map.transform.pitch, + showCollisionBoxes: this.map.showCollisionBoxes + }; + + if (!tile.workerID || tile.state === 'expired') { + tile.workerID = this.dispatcher.send('loadTile', params, done.bind(this)); + } else if (tile.state === 'loading') { + // schedule tile reloading after it has been loaded + tile.reloadCallback = callback; + } else { + this.dispatcher.send('reloadTile', params, done.bind(this), tile.workerID); + } + + function done(err, data) { + if (tile.aborted) + return; + + if (err) { + return callback(err); + } + + tile.setExpiryData(data); + tile.loadVectorData(data, this.map.painter); + + if (tile.redoWhenDone) { + tile.redoWhenDone = false; + tile.redoPlacement(this); + } + + callback(null); + + if (tile.reloadCallback) { + this.loadTile(tile, tile.reloadCallback); + tile.reloadCallback = null; + } + } + }; + + VectorTileSource.prototype.abortTile = function abortTile (tile) { + this.dispatcher.send('abortTile', { uid: tile.uid, type: this.type, source: this.id }, null, tile.workerID); + }; + + VectorTileSource.prototype.unloadTile = function unloadTile (tile) { + tile.unloadVectorData(); + this.dispatcher.send('removeTile', { uid: tile.uid, type: this.type, source: this.id }, null, tile.workerID); + }; + + return VectorTileSource; +}(Evented)); + +module.exports = VectorTileSource; + +},{"../util/evented":118,"../util/mapbox":125,"../util/util":129,"./load_tilejson":45}],55:[function(require,module,exports){ +'use strict'; +var ajax = require('../util/ajax'); +var vt = require('vector-tile'); +var Protobuf = require('pbf'); +var WorkerTile = require('./worker_tile'); +var util = require('../util/util'); + +/** + * The {@link WorkerSource} implementation that supports {@link VectorTileSource}. + * This class is designed to be easily reused to support custom source types + * for data formats that can be parsed/converted into an in-memory VectorTile + * representation. To do so, create it with + * `new VectorTileWorkerSource(actor, styleLayers, customLoadVectorDataFunction)`. + * + * @private + */ +var VectorTileWorkerSource = function VectorTileWorkerSource(actor, layerIndex, loadVectorData) { + this.actor = actor; + this.layerIndex = layerIndex; + + if (loadVectorData) { this.loadVectorData = loadVectorData; } + + this.loading = {}; + this.loaded = {}; +}; + +/** + * Implements {@link WorkerSource#loadTile}. Delegates to {@link VectorTileWorkerSource#loadVectorData} (which by default expects a `params.url` property) for fetching and producing a VectorTile object. + * + * @param {Object} params + * @param {string} params.source The id of the source for which we're loading this tile. + * @param {string} params.uid The UID for this tile. + * @param {TileCoord} params.coord + * @param {number} params.zoom + * @param {number} params.overscaling + * @param {number} params.angle + * @param {number} params.pitch + * @param {boolean} params.showCollisionBoxes + */ +VectorTileWorkerSource.prototype.loadTile = function loadTile (params, callback) { + var source = params.source, + uid = params.uid; + + if (!this.loading[source]) + this.loading[source] = {}; + + var workerTile = this.loading[source][uid] = new WorkerTile(params); + workerTile.abort = this.loadVectorData(params, done.bind(this)); + + function done(err, vectorTile) { + delete this.loading[source][uid]; + + if (err) return callback(err); + if (!vectorTile) return callback(null, null); + + workerTile.vectorTile = vectorTile; + workerTile.parse(vectorTile, this.layerIndex, this.actor, function (err, result, transferrables) { + if (err) return callback(err); + + var cacheControl = {}; + if (vectorTile.expires) cacheControl.expires = vectorTile.expires; + if (vectorTile.cacheControl) cacheControl.cacheControl = vectorTile.cacheControl; + + // Not transferring rawTileData because the worker needs to retain its copy. + callback(null, + util.extend({rawTileData: vectorTile.rawData}, result, cacheControl), + transferrables); + }); + + this.loaded[source] = this.loaded[source] || {}; + this.loaded[source][uid] = workerTile; + } +}; + +/** + * Implements {@link WorkerSource#reloadTile}. + * + * @param {Object} params + * @param {string} params.source The id of the source for which we're loading this tile. + * @param {string} params.uid The UID for this tile. + */ +VectorTileWorkerSource.prototype.reloadTile = function reloadTile (params, callback) { + var loaded = this.loaded[params.source], + uid = params.uid, + vtSource = this; + if (loaded && loaded[uid]) { + var workerTile = loaded[uid]; + + if (workerTile.status === 'parsing') { + workerTile.reloadCallback = callback; + } else if (workerTile.status === 'done') { + workerTile.parse(workerTile.vectorTile, this.layerIndex, this.actor, done.bind(workerTile)); + } + + } + + function done(err, data) { + if (this.reloadCallback) { + var reloadCallback = this.reloadCallback; + delete this.reloadCallback; + this.parse(this.vectorTile, vtSource.layerIndex, vtSource.actor, reloadCallback); + } + + callback(err, data); + } +}; + +/** + * Implements {@link WorkerSource#abortTile}. + * + * @param {Object} params + * @param {string} params.source The id of the source for which we're loading this tile. + * @param {string} params.uid The UID for this tile. + */ +VectorTileWorkerSource.prototype.abortTile = function abortTile (params) { + var loading = this.loading[params.source], + uid = params.uid; + if (loading && loading[uid] && loading[uid].abort) { + loading[uid].abort(); + delete loading[uid]; + } +}; + +/** + * Implements {@link WorkerSource#removeTile}. + * + * @param {Object} params + * @param {string} params.source The id of the source for which we're loading this tile. + * @param {string} params.uid The UID for this tile. + */ +VectorTileWorkerSource.prototype.removeTile = function removeTile (params) { + var loaded = this.loaded[params.source], + uid = params.uid; + if (loaded && loaded[uid]) { + delete loaded[uid]; + } +}; + +/** + * The result passed to the `loadVectorData` callback must conform to the interface established + * by the `VectorTile` class from the [vector-tile](https://www.npmjs.com/package/vector-tile) + * npm package. In addition, it must have a `rawData` property containing an `ArrayBuffer` + * with protobuf data conforming to the + * [Mapbox Vector Tile specification](https://github.com/mapbox/vector-tile-spec). + * + * @class VectorTile + * @property {ArrayBuffer} rawData + * @private + */ + +/** + * @callback LoadVectorDataCallback + * @param {Error?} error + * @param {VectorTile?} vectorTile + * @private + */ + +/** + * @param {Object} params + * @param {string} params.url The URL of the tile PBF to load. + * @param {LoadVectorDataCallback} callback + */ +VectorTileWorkerSource.prototype.loadVectorData = function loadVectorData (params, callback) { + var xhr = ajax.getArrayBuffer(params.url, done.bind(this)); + return function abort () { xhr.abort(); }; + function done(err, response) { + if (err) { return callback(err); } + var vectorTile = new vt.VectorTile(new Protobuf(response.data)); + vectorTile.rawData = response.data; + vectorTile.cacheControl = response.cacheControl; + vectorTile.expires = response.expires; + callback(err, vectorTile); + } +}; + +VectorTileWorkerSource.prototype.redoPlacement = function redoPlacement (params, callback) { + var loaded = this.loaded[params.source], + loading = this.loading[params.source], + uid = params.uid; + + if (loaded && loaded[uid]) { + var workerTile = loaded[uid]; + var result = workerTile.redoPlacement(params.angle, params.pitch, params.showCollisionBoxes); + + if (result.result) { + callback(null, result.result, result.transferables); + } + + } else if (loading && loading[uid]) { + loading[uid].angle = params.angle; + } +}; + +module.exports = VectorTileWorkerSource; + +},{"../util/ajax":109,"../util/util":129,"./worker_tile":58,"pbf":197,"vector-tile":207}],56:[function(require,module,exports){ +'use strict'; + +var ajax = require('../util/ajax'); +var ImageSource = require('./image_source'); + +/** + * A data source containing video. + * (See the [Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/#sources-video) for detailed documentation of options.) + * @interface VideoSource + * @example + * // add to map + * map.addSource('some id', { + * type: 'video', + * url: [ + * 'https://www.mapbox.com/blog/assets/baltimore-smoke.mp4', + * 'https://www.mapbox.com/blog/assets/baltimore-smoke.webm' + * ], + * coordinates: [ + * [-76.54, 39.18], + * [-76.52, 39.18], + * [-76.52, 39.17], + * [-76.54, 39.17] + * ] + * }); + * + * // update + * var mySource = map.getSource('some id'); + * mySource.setCoordinates([ + * [-76.54335737228394, 39.18579907229748], + * [-76.52803659439087, 39.1838364847587], + * [-76.5295386314392, 39.17683392507606], + * [-76.54520273208618, 39.17876344106642] + * ]); + * + * map.removeSource('some id'); // remove + * @see [Add a video](https://www.mapbox.com/mapbox-gl-js/example/video-on-a-map/) + */ +var VideoSource = (function (ImageSource) { + function VideoSource(id, options, dispatcher, eventedParent) { + ImageSource.call(this, id, options, dispatcher, eventedParent); + this.roundZoom = true; + this.type = 'video'; + this.options = options; + } + + if ( ImageSource ) VideoSource.__proto__ = ImageSource; + VideoSource.prototype = Object.create( ImageSource && ImageSource.prototype ); + VideoSource.prototype.constructor = VideoSource; + + VideoSource.prototype.load = function load () { + var this$1 = this; + + var options = this.options; + this.urls = options.urls; + + ajax.getVideo(options.urls, function (err, video) { + if (err) return this$1.fire('error', {error: err}); + + this$1.video = video; + this$1.video.loop = true; + + var loopID; + + // start repainting when video starts playing + this$1.video.addEventListener('playing', function () { + loopID = this$1.map.style.animationLoop.set(Infinity); + this$1.map._rerender(); + }); + + // stop repainting when video stops + this$1.video.addEventListener('pause', function () { + this$1.map.style.animationLoop.cancel(loopID); + }); + + if (this$1.map) { + this$1.video.play(); + } + + this$1._finishLoading(); + }); + }; + + /** + * Returns the HTML `video` element. + * + * @returns {HTMLVideoElement} The HTML `video` element. + */ + VideoSource.prototype.getVideo = function getVideo () { + return this.video; + }; + + VideoSource.prototype.onAdd = function onAdd (map) { + if (this.map) return; + this.load(); + this.map = map; + if (this.video) { + this.video.play(); + this.setCoordinates(this.coordinates); + } + }; + + /** + * Sets the video's coordinates and re-renders the map. + * + * @method setCoordinates + * @param {Array>} coordinates Four geographical coordinates, + * represented as arrays of longitude and latitude numbers, which define the corners of the video. + * The coordinates start at the top left corner of the video and proceed in clockwise order. + * They do not have to represent a rectangle. + * @returns {VideoSource} this + */ + // setCoordinates inherited from ImageSource + + VideoSource.prototype.prepare = function prepare () { + if (!this.tile || this.video.readyState < 2) return; // not enough data for current position + this._prepareImage(this.map.painter.gl, this.video); + }; + + VideoSource.prototype.serialize = function serialize () { + return { + type: 'video', + urls: this.urls, + coordinates: this.coordinates + }; + }; + + return VideoSource; +}(ImageSource)); + +module.exports = VideoSource; + +},{"../util/ajax":109,"./image_source":44}],57:[function(require,module,exports){ +'use strict'; + +var Actor = require('../util/actor'); +var StyleLayerIndex = require('../style/style_layer_index'); + +var VectorTileWorkerSource = require('./vector_tile_worker_source'); +var GeoJSONWorkerSource = require('./geojson_worker_source'); +var assert = require('assert'); + +var globalRTLTextPlugin = require('./rtl_text_plugin'); + +/** + * @private + */ +var Worker = function Worker(self) { + var this$1 = this; + + this.self = self; + this.actor = new Actor(self, this); + + this.layerIndexes = {}; + + this.workerSourceTypes = { + vector: VectorTileWorkerSource, + geojson: GeoJSONWorkerSource + }; + + // [mapId][sourceType] => worker source instance + this.workerSources = {}; + + this.self.registerWorkerSource = function (name, WorkerSource) { + if (this$1.workerSourceTypes[name]) { + throw new Error(("Worker source with name \"" + name + "\" already registered.")); + } + this$1.workerSourceTypes[name] = WorkerSource; + }; + + this.self.registerRTLTextPlugin = function (rtlTextPlugin) { + if (globalRTLTextPlugin.applyArabicShaping || globalRTLTextPlugin.processBidirectionalText) { + throw new Error('RTL text plugin already registered.'); + } + globalRTLTextPlugin['applyArabicShaping'] = rtlTextPlugin.applyArabicShaping; + globalRTLTextPlugin['processBidirectionalText'] = rtlTextPlugin.processBidirectionalText; + }; +}; + +Worker.prototype.setLayers = function setLayers (mapId, layers) { + this.getLayerIndex(mapId).replace(layers); +}; + +Worker.prototype.updateLayers = function updateLayers (mapId, params) { + this.getLayerIndex(mapId).update(params.layers, params.removedIds, params.symbolOrder); +}; + +Worker.prototype.loadTile = function loadTile (mapId, params, callback) { + assert(params.type); + this.getWorkerSource(mapId, params.type).loadTile(params, callback); +}; + +Worker.prototype.reloadTile = function reloadTile (mapId, params, callback) { + assert(params.type); + this.getWorkerSource(mapId, params.type).reloadTile(params, callback); +}; + +Worker.prototype.abortTile = function abortTile (mapId, params) { + assert(params.type); + this.getWorkerSource(mapId, params.type).abortTile(params); + }; + + Worker.prototype.removeTile = function removeTile (mapId, params) { + assert(params.type); + this.getWorkerSource(mapId, params.type).removeTile(params); +}; + +Worker.prototype.removeSource = function removeSource (mapId, params) { + assert(params.type); + var worker = this.getWorkerSource(mapId, params.type); + if (worker.removeSource !== undefined) { + worker.removeSource(params); + } +}; + +Worker.prototype.redoPlacement = function redoPlacement (mapId, params, callback) { + assert(params.type); + this.getWorkerSource(mapId, params.type).redoPlacement(params, callback); +}; + +/** + * Load a {@link WorkerSource} script at params.url. The script is run + * (using importScripts) with `registerWorkerSource` in scope, which is a + * function taking `(name, workerSourceObject)`. + * @private + */ +Worker.prototype.loadWorkerSource = function loadWorkerSource (map, params, callback) { + try { + this.self.importScripts(params.url); + callback(); + } catch (e) { + callback(e); + } +}; + +Worker.prototype.loadRTLTextPlugin = function loadRTLTextPlugin (map, pluginURL, callback) { + try { + if (!globalRTLTextPlugin.applyArabicShaping && !globalRTLTextPlugin.processBidirectionalText) { + this.self.importScripts(pluginURL); + } + } catch (e) { + callback(e); + } +}; + +Worker.prototype.getLayerIndex = function getLayerIndex (mapId) { + var layerIndexes = this.layerIndexes[mapId]; + if (!layerIndexes) { + layerIndexes = this.layerIndexes[mapId] = new StyleLayerIndex(); + } + return layerIndexes; +}; + +Worker.prototype.getWorkerSource = function getWorkerSource (mapId, type) { + var this$1 = this; + + if (!this.workerSources[mapId]) + this.workerSources[mapId] = {}; + if (!this.workerSources[mapId][type]) { + // use a wrapped actor so that we can attach a target mapId param + // to any messages invoked by the WorkerSource + var actor = { + send: function (type, data, callback, buffers) { + this$1.actor.send(type, data, callback, buffers, mapId); + } + }; + + this.workerSources[mapId][type] = new this.workerSourceTypes[type](actor, this.getLayerIndex(mapId)); + } + + return this.workerSources[mapId][type]; +}; + +module.exports = function createWorker(self) { + return new Worker(self); +}; + +},{"../style/style_layer_index":71,"../util/actor":108,"./geojson_worker_source":42,"./rtl_text_plugin":49,"./vector_tile_worker_source":55,"assert":135}],58:[function(require,module,exports){ +'use strict'; + +var FeatureIndex = require('../data/feature_index'); +var CollisionTile = require('../symbol/collision_tile'); +var CollisionBoxArray = require('../symbol/collision_box'); +var DictionaryCoder = require('../util/dictionary_coder'); +var util = require('../util/util'); +var SymbolInstancesArray = require('../symbol/symbol_instances'); +var SymbolQuadsArray = require('../symbol/symbol_quads'); +var assert = require('assert'); + +var WorkerTile = function WorkerTile(params) { + this.coord = params.coord; + this.uid = params.uid; + this.zoom = params.zoom; + this.tileSize = params.tileSize; + this.source = params.source; + this.overscaling = params.overscaling; + this.angle = params.angle; + this.pitch = params.pitch; + this.showCollisionBoxes = params.showCollisionBoxes; +}; + +WorkerTile.prototype.parse = function parse (data, layerIndex, actor, callback) { + var this$1 = this; + + // Normalize GeoJSON data. + if (!data.layers) { + data = { layers: { '_geojsonTileLayer': data } }; + } + + this.status = 'parsing'; + this.data = data; + + this.collisionBoxArray = new CollisionBoxArray(); + this.symbolInstancesArray = new SymbolInstancesArray(); + this.symbolQuadsArray = new SymbolQuadsArray(); + var sourceLayerCoder = new DictionaryCoder(Object.keys(data.layers).sort()); + + var featureIndex = new FeatureIndex(this.coord, this.overscaling); + featureIndex.bucketLayerIDs = {}; + + var buckets = {}; + var bucketIndex = 0; + + var options = { + featureIndex: featureIndex, + iconDependencies: {}, + glyphDependencies: {} + }; + + var layerFamilies = layerIndex.familiesBySource[this.source]; + for (var sourceLayerId in layerFamilies) { + var sourceLayer = data.layers[sourceLayerId]; + if (!sourceLayer) { + continue; + } + + if (sourceLayer.version === 1) { + util.warnOnce( + "Vector tile source \"" + (this$1.source) + "\" layer \"" + sourceLayerId + "\" does not use vector tile spec v2 " + + "and therefore may have some rendering errors." + ); + } + + var sourceLayerIndex = sourceLayerCoder.encode(sourceLayerId); + var features = []; + for (var i = 0; i < sourceLayer.length; i++) { + var feature = sourceLayer.feature(i); + feature.index = i; + feature.sourceLayerIndex = sourceLayerIndex; + features.push(feature); + } + + for (var i$2 = 0, list = layerFamilies[sourceLayerId]; i$2 < list.length; i$2 += 1) { + var family = list[i$2]; + + var layer = family[0]; + + assert(layer.source === this$1.source); + + if (layer.minzoom && this$1.zoom < layer.minzoom) continue; + if (layer.maxzoom && this$1.zoom >= layer.maxzoom) continue; + if (layer.layout && layer.layout.visibility === 'none') continue; + + for (var i$3 = 0, list$1 = family; i$3 < list$1.length; i$3 += 1) { + var layer$1 = list$1[i$3]; + + layer$1.recalculate(this$1.zoom); + } + + var bucket = buckets[layer.id] = layer.createBucket({ + index: bucketIndex, + layers: family, + zoom: this$1.zoom, + overscaling: this$1.overscaling, + collisionBoxArray: this$1.collisionBoxArray, + symbolQuadsArray: this$1.symbolQuadsArray, + symbolInstancesArray: this$1.symbolInstancesArray + }); + + bucket.populate(features, options); + featureIndex.bucketLayerIDs[bucketIndex] = family.map(function (l) { return l.id; }); + + bucketIndex++; + } + } + + + var done = function (collisionTile) { + this$1.status = 'done'; + + var transferables = []; + callback(null, { + buckets: serializeBuckets(util.values(buckets), transferables), + featureIndex: featureIndex.serialize(transferables), + collisionTile: collisionTile.serialize(transferables), + collisionBoxArray: this$1.collisionBoxArray.serialize(), + symbolInstancesArray: this$1.symbolInstancesArray.serialize(), + symbolQuadsArray: this$1.symbolQuadsArray.serialize() + }, transferables); + }; + + // Symbol buckets must be placed in reverse order. + this.symbolBuckets = []; + for (var i$1 = layerIndex.symbolOrder.length - 1; i$1 >= 0; i$1--) { + var bucket$1 = buckets[layerIndex.symbolOrder[i$1]]; + if (bucket$1) { + this$1.symbolBuckets.push(bucket$1); + } + } + + if (this.symbolBuckets.length === 0) { + return done(new CollisionTile(this.angle, this.pitch, this.collisionBoxArray)); + } + + var deps = 0; + var icons = Object.keys(options.iconDependencies); + var stacks = util.mapObject(options.glyphDependencies, function (glyphs) { return Object.keys(glyphs).map(Number); }); + + var gotDependency = function (err) { + if (err) return callback(err); + deps++; + if (deps === 2) { + var collisionTile = new CollisionTile(this$1.angle, this$1.pitch, this$1.collisionBoxArray); + + for (var i = 0, list = this$1.symbolBuckets; i < list.length; i += 1) { + var bucket = list[i]; + + recalculateLayers(bucket, this$1.zoom); + + bucket.prepare(stacks, icons); + bucket.place(collisionTile, this$1.showCollisionBoxes); + } + + done(collisionTile); + } + }; + + if (Object.keys(stacks).length) { + actor.send('getGlyphs', {uid: this.uid, stacks: stacks}, function (err, newStacks) { + stacks = newStacks; + gotDependency(err); + }); + } else { + gotDependency(); + } + + if (icons.length) { + actor.send('getIcons', {icons: icons}, function (err, newIcons) { + icons = newIcons; + gotDependency(err); + }); + } else { + gotDependency(); + } +}; + +WorkerTile.prototype.redoPlacement = function redoPlacement (angle, pitch, showCollisionBoxes) { + var this$1 = this; + + this.angle = angle; + this.pitch = pitch; + + if (this.status !== 'done') { + return {}; + } + + var collisionTile = new CollisionTile(this.angle, this.pitch, this.collisionBoxArray); + + for (var i = 0, list = this.symbolBuckets; i < list.length; i += 1) { + var bucket = list[i]; + + recalculateLayers(bucket, this$1.zoom); + + bucket.place(collisionTile, showCollisionBoxes); + } + + var transferables = []; + return { + result: { + buckets: serializeBuckets(this.symbolBuckets, transferables), + collisionTile: collisionTile.serialize(transferables) + }, + transferables: transferables + }; +}; + +function recalculateLayers(bucket, zoom) { + // Layers are shared and may have been used by a WorkerTile with a different zoom. + for (var i = 0, list = bucket.layers; i < list.length; i += 1) { + var layer = list[i]; + + layer.recalculate(zoom); + } +} + +function serializeBuckets(buckets, transferables) { + return buckets + .filter(function (b) { return !b.isEmpty(); }) + .map(function (b) { return b.serialize(transferables); }); +} + +module.exports = WorkerTile; + +},{"../data/feature_index":12,"../symbol/collision_box":78,"../symbol/collision_tile":80,"../symbol/symbol_instances":89,"../symbol/symbol_quads":90,"../util/dictionary_coder":115,"../util/util":129,"assert":135}],59:[function(require,module,exports){ +'use strict'; + +var AnimationLoop = function AnimationLoop() { + this.n = 0; + this.times = []; +}; + +// Are all animations done? +AnimationLoop.prototype.stopped = function stopped () { + this.times = this.times.filter(function (t) { + return t.time >= (new Date()).getTime(); + }); + return !this.times.length; +}; + +// Add a new animation that will run t milliseconds +// Returns an id that can be used to cancel it layer +AnimationLoop.prototype.set = function set (t) { + this.times.push({ id: this.n, time: t + (new Date()).getTime() }); + return this.n++; +}; + +// Cancel an animation +AnimationLoop.prototype.cancel = function cancel (n) { + this.times = this.times.filter(function (t) { + return t.id !== n; + }); +}; + +module.exports = AnimationLoop; + +},{}],60:[function(require,module,exports){ +'use strict'; + +var Evented = require('../util/evented'); +var ajax = require('../util/ajax'); +var browser = require('../util/browser'); +var normalizeURL = require('../util/mapbox').normalizeSpriteURL; + +var SpritePosition = function SpritePosition() { + this.x = 0; + this.y = 0; + this.width = 0; + this.height = 0; + this.pixelRatio = 1; + this.sdf = false; +}; + +var ImageSprite = (function (Evented) { + function ImageSprite(base, eventedParent) { + var this$1 = this; + + Evented.call(this); + this.base = base; + this.retina = browser.devicePixelRatio > 1; + this.setEventedParent(eventedParent); + + var format = this.retina ? '@2x' : ''; + + ajax.getJSON(normalizeURL(base, format, '.json'), function (err, data) { + if (err) { + this$1.fire('error', {error: err}); + return; + } + + this$1.data = data; + if (this$1.imgData) this$1.fire('data', {dataType: 'style'}); + }); + + ajax.getImage(normalizeURL(base, format, '.png'), function (err, img) { + if (err) { + this$1.fire('error', {error: err}); + return; + } + + this$1.imgData = browser.getImageData(img); + + // premultiply the sprite + for (var i = 0; i < this$1.imgData.length; i += 4) { + var alpha = this$1.imgData[i + 3] / 255; + this$1.imgData[i + 0] *= alpha; + this$1.imgData[i + 1] *= alpha; + this$1.imgData[i + 2] *= alpha; + } + + this$1.width = img.width; + + if (this$1.data) this$1.fire('data', {dataType: 'style'}); + }); + } + + if ( Evented ) ImageSprite.__proto__ = Evented; + ImageSprite.prototype = Object.create( Evented && Evented.prototype ); + ImageSprite.prototype.constructor = ImageSprite; + + ImageSprite.prototype.toJSON = function toJSON () { + return this.base; + }; + + ImageSprite.prototype.loaded = function loaded () { + return !!(this.data && this.imgData); + }; + + ImageSprite.prototype.resize = function resize (/*gl*/) { + var this$1 = this; + + if (browser.devicePixelRatio > 1 !== this.retina) { + var newSprite = new ImageSprite(this.base); + newSprite.on('data', function () { + this$1.data = newSprite.data; + this$1.imgData = newSprite.imgData; + this$1.width = newSprite.width; + this$1.retina = newSprite.retina; + }); + } + }; + + ImageSprite.prototype.getSpritePosition = function getSpritePosition (name) { + if (!this.loaded()) return new SpritePosition(); + + var pos = this.data && this.data[name]; + if (pos && this.imgData) return pos; + + return new SpritePosition(); + }; + + return ImageSprite; +}(Evented)); + +module.exports = ImageSprite; + +},{"../util/ajax":109,"../util/browser":110,"../util/evented":118,"../util/mapbox":125}],61:[function(require,module,exports){ +'use strict'; + +var styleSpec = require('./style_spec'); +var util = require('../util/util'); +var Evented = require('../util/evented'); +var validateStyle = require('./validate_style'); +var StyleDeclaration = require('./style_declaration'); +var StyleTransition = require('./style_transition'); + +var TRANSITION_SUFFIX = '-transition'; + +/* + * Represents the light used to light extruded features. + */ +var Light = (function (Evented) { + function Light(lightOptions) { + Evented.call(this); + this.properties = ['anchor', 'color', 'position', 'intensity']; + this._specifications = styleSpec.light; + this.set(lightOptions); + } + + if ( Evented ) Light.__proto__ = Evented; + Light.prototype = Object.create( Evented && Evented.prototype ); + Light.prototype.constructor = Light; + + Light.prototype.set = function set (lightOpts) { + var this$1 = this; + + if (this._validate(validateStyle.light, lightOpts)) return; + this._declarations = {}; + this._transitions = {}; + this._transitionOptions = {}; + this.calculated = {}; + + lightOpts = util.extend({ + anchor: this._specifications.anchor.default, + color: this._specifications.color.default, + position: this._specifications.position.default, + intensity: this._specifications.intensity.default + }, lightOpts); + + for (var i = 0, list = this.properties; i < list.length; i += 1) { + var prop = list[i]; + + this$1._declarations[prop] = new StyleDeclaration(this$1._specifications[prop], lightOpts[prop]); + } + + return this; + }; + + Light.prototype.getLight = function getLight () { + return { + anchor: this.getLightProperty('anchor'), + color: this.getLightProperty('color'), + position: this.getLightProperty('position'), + intensity: this.getLightProperty('intensity') + }; + }; + + Light.prototype.getLightProperty = function getLightProperty (property) { + if (util.endsWith(property, TRANSITION_SUFFIX)) { + return ( + this._transitionOptions[property] + ); + } else { + return ( + this._declarations[property] && + this._declarations[property].value + ); + } + }; + + Light.prototype.getLightValue = function getLightValue (property, globalProperties) { + if (property === 'position') { + var calculated = this._transitions[property].calculate(globalProperties), + cartesian = util.sphericalToCartesian(calculated); + return { + x: cartesian[0], + y: cartesian[1], + z: cartesian[2] + }; + } + + return this._transitions[property].calculate(globalProperties); + }; + + Light.prototype.setLight = function setLight (options) { + var this$1 = this; + + if (this._validate(validateStyle.light, options)) return; + + for (var key in options) { + var value = options[key]; + + if (util.endsWith(key, TRANSITION_SUFFIX)) { + this$1._transitionOptions[key] = value; + } else if (value === null || value === undefined) { + delete this$1._declarations[key]; + } else { + this$1._declarations[key] = new StyleDeclaration(this$1._specifications[key], value); + } + } + }; + + Light.prototype.recalculate = function recalculate (zoom) { + var this$1 = this; + + for (var property in this._declarations) { + this$1.calculated[property] = this$1.getLightValue(property, {zoom: zoom}); + } + }; + + Light.prototype._applyLightDeclaration = function _applyLightDeclaration (property, declaration, options, globalOptions, animationLoop) { + var oldTransition = options.transition ? this._transitions[property] : undefined; + var spec = this._specifications[property]; + + if (declaration === null || declaration === undefined) { + declaration = new StyleDeclaration(spec, spec.default); + } + + if (oldTransition && oldTransition.declaration.json === declaration.json) return; + + var transitionOptions = util.extend({ + duration: 300, + delay: 0 + }, globalOptions, this.getLightProperty(property + TRANSITION_SUFFIX)); + var newTransition = this._transitions[property] = + new StyleTransition(spec, declaration, oldTransition, transitionOptions); + if (!newTransition.instant()) { + newTransition.loopID = animationLoop.set(newTransition.endTime - Date.now()); + } + + if (oldTransition) { + animationLoop.cancel(oldTransition.loopID); + } + }; + + Light.prototype.updateLightTransitions = function updateLightTransitions (options, globalOptions, animationLoop) { + var this$1 = this; + + var property; + for (property in this._declarations) { + this$1._applyLightDeclaration(property, this$1._declarations[property], options, globalOptions, animationLoop); + } + }; + + Light.prototype._validate = function _validate (validate, value) { + return validateStyle.emitErrors(this, validate.call(validateStyle, util.extend({ + value: value, + // Workaround for https://github.com/mapbox/mapbox-gl-js/issues/2407 + style: {glyphs: true, sprite: true}, + styleSpec: styleSpec + }))); + }; + + return Light; +}(Evented)); + +module.exports = Light; + +},{"../util/evented":118,"../util/util":129,"./style_declaration":64,"./style_spec":72,"./style_transition":73,"./validate_style":74}],62:[function(require,module,exports){ +'use strict'; + +var parseColorString = require('csscolorparser').parseCSSColor; +var util = require('../util/util'); +var MapboxGLFunction = require('mapbox-gl-function'); + +var cache = {}; + +module.exports = function parseColor(input) { + + if (input && MapboxGLFunction.isFunctionDefinition(input)) { + + if (!input.stops) return input; + else return util.extend({}, input, { + stops: input.stops.map(function (stop) { + return [stop[0], parseColor(stop[1])]; + }) + }); + + } else if (typeof input === 'string') { + + if (!cache[input]) { + var rgba = parseColorString(input); + if (!rgba) { throw new Error(("Invalid color " + input)); } + + // GL expects all components to be in the range [0, 1] and to be + // multipled by the alpha value. + cache[input] = [ + rgba[0] / 255 * rgba[3], + rgba[1] / 255 * rgba[3], + rgba[2] / 255 * rgba[3], + rgba[3] + ]; + } + + return cache[input]; + + } else if (Array.isArray(input)) { + return input; + + } else { + throw new Error(("Invalid color " + input)); + } +}; + +},{"../util/util":129,"csscolorparser":136,"mapbox-gl-function":164}],63:[function(require,module,exports){ +'use strict'; + +var assert = require('assert'); +var Evented = require('../util/evented'); +var StyleLayer = require('./style_layer'); +var ImageSprite = require('./image_sprite'); +var Light = require('./light'); +var GlyphSource = require('../symbol/glyph_source'); +var SpriteAtlas = require('../symbol/sprite_atlas'); +var LineAtlas = require('../render/line_atlas'); +var util = require('../util/util'); +var ajax = require('../util/ajax'); +var mapbox = require('../util/mapbox'); +var browser = require('../util/browser'); +var Dispatcher = require('../util/dispatcher'); +var AnimationLoop = require('./animation_loop'); +var validateStyle = require('./validate_style'); +var Source = require('../source/source'); +var QueryFeatures = require('../source/query_features'); +var SourceCache = require('../source/source_cache'); +var styleSpec = require('./style_spec'); +var MapboxGLFunction = require('mapbox-gl-function'); +var getWorkerPool = require('../global_worker_pool'); +var deref = require('mapbox-gl-style-spec/lib/deref'); +var diff = require('mapbox-gl-style-spec/lib/diff'); +var rtlTextPlugin = require('../source/rtl_text_plugin'); + +var supportedDiffOperations = util.pick(diff.operations, [ + 'addLayer', + 'removeLayer', + 'setPaintProperty', + 'setLayoutProperty', + 'setFilter', + 'addSource', + 'removeSource', + 'setLayerZoomRange', + 'setLight', + 'setTransition' + // 'setGlyphs', + // 'setSprite', +]); + +var ignoredDiffOperations = util.pick(diff.operations, [ + 'setCenter', + 'setZoom', + 'setBearing', + 'setPitch' +]); + +/** + * @private + */ +var Style = (function (Evented) { + function Style(stylesheet, map, options) { + var this$1 = this; + + Evented.call(this); + this.map = map; + this.animationLoop = (map && map.animationLoop) || new AnimationLoop(); + this.dispatcher = new Dispatcher(getWorkerPool(), this); + this.spriteAtlas = new SpriteAtlas(1024, 1024); + this.lineAtlas = new LineAtlas(256, 512); + + this._layers = {}; + this._order = []; + this.sourceCaches = {}; + this.zoomHistory = {}; + this._loaded = false; + + util.bindAll(['_redoPlacement'], this); + + this._resetUpdates(); + + options = util.extend({ + validate: typeof stylesheet === 'string' ? !mapbox.isMapboxURL(stylesheet) : true + }, options); + + this.setEventedParent(map); + this.fire('dataloading', {dataType: 'style'}); + + var self = this; + rtlTextPlugin.registerForPluginAvailability(function (pluginBlobURL) { + self.dispatcher.broadcast('loadRTLTextPlugin', pluginBlobURL, rtlTextPlugin.errorCallback); + for (var id in self.sourceCaches) { + self.sourceCaches[id].reload(); // Should be a no-op if the plugin loads before any tiles load + } + }); + + var stylesheetLoaded = function (err, stylesheet) { + if (err) { + this$1.fire('error', {error: err}); + return; + } + + if (options.validate && validateStyle.emitErrors(this$1, validateStyle(stylesheet))) return; + + this$1._loaded = true; + this$1.stylesheet = stylesheet; + + this$1.updateClasses(); + + for (var id in stylesheet.sources) { + this$1.addSource(id, stylesheet.sources[id], options); + } + + if (stylesheet.sprite) { + this$1.sprite = new ImageSprite(stylesheet.sprite, this$1); + } + + this$1.glyphSource = new GlyphSource(stylesheet.glyphs); + this$1._resolve(); + this$1.fire('data', {dataType: 'style'}); + this$1.fire('style.load'); + }; + + if (typeof stylesheet === 'string') { + ajax.getJSON(mapbox.normalizeStyleURL(stylesheet), stylesheetLoaded); + } else { + browser.frame(stylesheetLoaded.bind(this, null, stylesheet)); + } + + this.on('source.load', function (event) { + var source = this$1.sourceCaches[event.sourceId].getSource(); + if (source && source.vectorLayerIds) { + for (var layerId in this$1._layers) { + var layer = this$1._layers[layerId]; + if (layer.source === source.id) { + this$1._validateLayer(layer); + } + } + } + }); + } + + if ( Evented ) Style.__proto__ = Evented; + Style.prototype = Object.create( Evented && Evented.prototype ); + Style.prototype.constructor = Style; + + Style.prototype._validateLayer = function _validateLayer (layer) { + var sourceCache = this.sourceCaches[layer.source]; + + if (!layer.sourceLayer) return; + if (!sourceCache) return; + var source = sourceCache.getSource(); + + if (source.type === 'geojson' || (source.vectorLayerIds && + source.vectorLayerIds.indexOf(layer.sourceLayer) === -1)) { + this.fire('error', { + error: new Error( + "Source layer \"" + (layer.sourceLayer) + "\" " + + "does not exist on source \"" + (source.id) + "\" " + + "as specified by style layer \"" + (layer.id) + "\"" + ) + }); + } + }; + + Style.prototype.loaded = function loaded () { + var this$1 = this; + + if (!this._loaded) + return false; + + if (Object.keys(this._updatedSources).length) + return false; + + for (var id in this.sourceCaches) + if (!this$1.sourceCaches[id].loaded()) + return false; + + if (this.sprite && !this.sprite.loaded()) + return false; + + return true; + }; + + Style.prototype._resolve = function _resolve () { + var this$1 = this; + + var layers = deref(this.stylesheet.layers); + + this._order = layers.map(function (layer) { return layer.id; }); + + this._layers = {}; + for (var i = 0, list = layers; i < list.length; i += 1) { + var layer = list[i]; + + layer = StyleLayer.create(layer); + layer.setEventedParent(this$1, {layer: {id: layer.id}}); + this$1._layers[layer.id] = layer; + } + + this.dispatcher.broadcast('setLayers', this._serializeLayers(this._order)); + + this.light = new Light(this.stylesheet.light); + }; + + Style.prototype._serializeLayers = function _serializeLayers (ids) { + var this$1 = this; + + return ids.map(function (id) { return this$1._layers[id].serialize(); }); + }; + + Style.prototype._applyClasses = function _applyClasses (classes, options) { + var this$1 = this; + + if (!this._loaded) return; + + classes = classes || []; + options = options || {transition: true}; + var transition = this.stylesheet.transition || {}; + + var layers = this._updatedAllPaintProps ? this._layers : this._updatedPaintProps; + + for (var id in layers) { + var layer = this$1._layers[id]; + var props = this$1._updatedPaintProps[id]; + + if (this$1._updatedAllPaintProps || props.all) { + layer.updatePaintTransitions(classes, options, transition, this$1.animationLoop, this$1.zoomHistory); + } else { + for (var paintName in props) { + this$1._layers[id].updatePaintTransition(paintName, classes, options, transition, this$1.animationLoop, this$1.zoomHistory); + } + } + } + + this.light.updateLightTransitions(options, transition, this.animationLoop); + }; + + Style.prototype._recalculate = function _recalculate (z) { + var this$1 = this; + + if (!this._loaded) return; + + for (var sourceId in this.sourceCaches) + this$1.sourceCaches[sourceId].used = false; + + this._updateZoomHistory(z); + + for (var i = 0, list = this._order; i < list.length; i += 1) { + var layerId = list[i]; + + var layer = this$1._layers[layerId]; + + layer.recalculate(z); + if (!layer.isHidden(z) && layer.source) { + this$1.sourceCaches[layer.source].used = true; + } + } + + this.light.recalculate(z); + + var maxZoomTransitionDuration = 300; + if (Math.floor(this.z) !== Math.floor(z)) { + this.animationLoop.set(maxZoomTransitionDuration); + } + + this.z = z; + }; + + Style.prototype._updateZoomHistory = function _updateZoomHistory (z) { + + var zh = this.zoomHistory; + + if (zh.lastIntegerZoom === undefined) { + // first time + zh.lastIntegerZoom = Math.floor(z); + zh.lastIntegerZoomTime = 0; + zh.lastZoom = z; + } + + // check whether an integer zoom level as passed since the last frame + // and if yes, record it with the time. Used for transitioning patterns. + if (Math.floor(zh.lastZoom) < Math.floor(z)) { + zh.lastIntegerZoom = Math.floor(z); + zh.lastIntegerZoomTime = Date.now(); + + } else if (Math.floor(zh.lastZoom) > Math.floor(z)) { + zh.lastIntegerZoom = Math.floor(z + 1); + zh.lastIntegerZoomTime = Date.now(); + } + + zh.lastZoom = z; + }; + + Style.prototype._checkLoaded = function _checkLoaded () { + if (!this._loaded) { + throw new Error('Style is not done loading'); + } + }; + + /** + * Apply queued style updates in a batch + */ + Style.prototype.update = function update (classes, options) { + var this$1 = this; + + if (!this._changed) return; + + var updatedIds = Object.keys(this._updatedLayers); + var removedIds = Object.keys(this._removedLayers); + + if (updatedIds.length || removedIds.length || this._updatedSymbolOrder) { + this._updateWorkerLayers(updatedIds, removedIds); + } + for (var id in this._updatedSources) { + var action = this$1._updatedSources[id]; + assert(action === 'reload' || action === 'clear'); + if (action === 'reload') { + this$1._reloadSource(id); + } else if (action === 'clear') { + this$1._clearSource(id); + } + } + + this._applyClasses(classes, options); + this._resetUpdates(); + + this.fire('data', {dataType: 'style'}); + }; + + Style.prototype._updateWorkerLayers = function _updateWorkerLayers (updatedIds, removedIds) { + var this$1 = this; + + var symbolOrder = this._updatedSymbolOrder ? this._order.filter(function (id) { return this$1._layers[id].type === 'symbol'; }) : null; + + this.dispatcher.broadcast('updateLayers', { + layers: this._serializeLayers(updatedIds), + removedIds: removedIds, + symbolOrder: symbolOrder + }); + }; + + Style.prototype._resetUpdates = function _resetUpdates () { + this._changed = false; + + this._updatedLayers = {}; + this._removedLayers = {}; + this._updatedSymbolOrder = false; + + this._updatedSources = {}; + + this._updatedPaintProps = {}; + this._updatedAllPaintProps = false; + }; + + /** + * Update this style's state to match the given style JSON, performing only + * the necessary mutations. + * + * May throw an Error ('Unimplemented: METHOD') if the mapbox-gl-style-spec + * diff algorithm produces an operation that is not supported. + * + * @returns {boolean} true if any changes were made; false otherwise + * @private + */ + Style.prototype.setState = function setState (nextState) { + var this$1 = this; + + this._checkLoaded(); + + if (validateStyle.emitErrors(this, validateStyle(nextState))) return false; + + nextState = util.extend({}, nextState); + nextState.layers = deref(nextState.layers); + + var changes = diff(this.serialize(), nextState) + .filter(function (op) { return !(op.command in ignoredDiffOperations); }); + + if (changes.length === 0) { + return false; + } + + var unimplementedOps = changes.filter(function (op) { return !(op.command in supportedDiffOperations); }); + if (unimplementedOps.length > 0) { + throw new Error(("Unimplemented: " + (unimplementedOps.map(function (op) { return op.command; }).join(', ')) + ".")); + } + + changes.forEach(function (op) { + if (op.command === 'setTransition') { + // `transition` is always read directly off of + // `this.stylesheet`, which we update below + return; + } + this$1[op.command].apply(this$1, op.args); + }); + + this.stylesheet = nextState; + + return true; + }; + + Style.prototype.addSource = function addSource (id, source, options) { + this._checkLoaded(); + + if (this.sourceCaches[id] !== undefined) { + throw new Error('There is already a source with this ID'); + } + + if (!source.type) { + throw new Error(("The type property must be defined, but the only the following properties were given: " + (Object.keys(source)) + ".")); + } + + var builtIns = ['vector', 'raster', 'geojson', 'video', 'image', 'canvas']; + var shouldValidate = builtIns.indexOf(source.type) >= 0; + if (shouldValidate && this._validate(validateStyle.source, ("sources." + id), source, null, options)) return; + + var sourceCache = this.sourceCaches[id] = new SourceCache(id, source, this.dispatcher); + sourceCache.style = this; + sourceCache.setEventedParent(this, function () { return ({ + isSourceLoaded: sourceCache.loaded(), + source: sourceCache.serialize(), + sourceId: id + }); }); + + sourceCache.onAdd(this.map); + this._changed = true; + }; + + /** + * Remove a source from this stylesheet, given its id. + * @param {string} id id of the source to remove + * @throws {Error} if no source is found with the given ID + */ + Style.prototype.removeSource = function removeSource (id) { + this._checkLoaded(); + + if (this.sourceCaches[id] === undefined) { + throw new Error('There is no source with this ID'); + } + var sourceCache = this.sourceCaches[id]; + delete this.sourceCaches[id]; + delete this._updatedSources[id]; + sourceCache.setEventedParent(null); + sourceCache.clearTiles(); + + if (sourceCache.onRemove) sourceCache.onRemove(this.map); + this._changed = true; + }; + + /** + * Get a source by id. + * @param {string} id id of the desired source + * @returns {Object} source + */ + Style.prototype.getSource = function getSource (id) { + return this.sourceCaches[id] && this.sourceCaches[id].getSource(); + }; + + /** + * Add a layer to the map style. The layer will be inserted before the layer with + * ID `before`, or appended if `before` is omitted. + * @param {StyleLayer|Object} layer + * @param {string=} before ID of an existing layer to insert before + */ + Style.prototype.addLayer = function addLayer (layerObject, before, options) { + this._checkLoaded(); + + var id = layerObject.id; + + if (typeof layerObject.source === 'object') { + this.addSource(id, layerObject.source); + layerObject = util.extend(layerObject, { source: id }); + } + + // this layer is not in the style.layers array, so we pass an impossible array index + if (this._validate(validateStyle.layer, + ("layers." + id), layerObject, {arrayIndex: -1}, options)) return; + + var layer = StyleLayer.create(layerObject); + this._validateLayer(layer); + + layer.setEventedParent(this, {layer: {id: id}}); + + var index = before ? this._order.indexOf(before) : this._order.length; + this._order.splice(index, 0, id); + + this._layers[id] = layer; + + if (this._removedLayers[id] && layer.source) { + // If, in the current batch, we have already removed this layer + // and we are now re-adding it with a different `type`, then we + // need to clear (rather than just reload) the underyling source's + // tiles. Otherwise, tiles marked 'reloading' will have buckets / + // buffers that are set up for the _previous_ version of this + // layer, causing, e.g.: + // https://github.com/mapbox/mapbox-gl-js/issues/3633 + var removed = this._removedLayers[id]; + delete this._removedLayers[id]; + this._updatedSources[layer.source] = removed.type !== layer.type ? 'clear' : 'reload'; + } + this._updateLayer(layer); + + if (layer.type === 'symbol') { + this._updatedSymbolOrder = true; + } + + this.updateClasses(id); + }; + + /** + * Add a layer to the map style. The layer will be inserted before the layer with + * ID `before`, or appended if `before` is omitted. + * @param {StyleLayer|Object} layer + * @param {string=} before ID of an existing layer to insert before + */ + Style.prototype.moveLayer = function moveLayer (id, before) { + this._checkLoaded(); + this._changed = true; + + var layer = this._layers[id]; + if (!layer) { + this.fire('error', { + error: new Error( + "The layer '" + id + "' does not exist in " + + "the map's style and cannot be moved." + ) + }); + return; + } + + var index = this._order.indexOf(id); + this._order.splice(index, 1); + + var newIndex = before ? this._order.indexOf(before) : this._order.length; + this._order.splice(newIndex, 0, id); + + if (layer.type === 'symbol') { + this._updatedSymbolOrder = true; + if (layer.source && !this._updatedSources[layer.source]) { + this._updatedSources[layer.source] = 'reload'; + } + } + }; + + /** + * Remove a layer from this stylesheet, given its id. + * @param {string} id id of the layer to remove + * @throws {Error} if no layer is found with the given ID + */ + Style.prototype.removeLayer = function removeLayer (id) { + this._checkLoaded(); + + var layer = this._layers[id]; + if (!layer) { + this.fire('error', { + error: new Error( + "The layer '" + id + "' does not exist in " + + "the map's style and cannot be removed." + ) + }); + return; + } + + layer.setEventedParent(null); + + var index = this._order.indexOf(id); + this._order.splice(index, 1); + + if (layer.type === 'symbol') { + this._updatedSymbolOrder = true; + } + + this._changed = true; + this._removedLayers[id] = layer; + delete this._layers[id]; + delete this._updatedLayers[id]; + delete this._updatedPaintProps[id]; + }; + + /** + * Return the style layer object with the given `id`. + * + * @param {string} id - id of the desired layer + * @returns {?Object} a layer, if one with the given `id` exists + */ + Style.prototype.getLayer = function getLayer (id) { + return this._layers[id]; + }; + + Style.prototype.setLayerZoomRange = function setLayerZoomRange (layerId, minzoom, maxzoom) { + this._checkLoaded(); + + var layer = this.getLayer(layerId); + if (!layer) { + this.fire('error', { + error: new Error( + "The layer '" + layerId + "' does not exist in " + + "the map's style and cannot have zoom extent." + ) + }); + return; + } + + if (layer.minzoom === minzoom && layer.maxzoom === maxzoom) return; + + if (minzoom != null) { + layer.minzoom = minzoom; + } + if (maxzoom != null) { + layer.maxzoom = maxzoom; + } + this._updateLayer(layer); + }; + + Style.prototype.setFilter = function setFilter (layerId, filter) { + this._checkLoaded(); + + var layer = this.getLayer(layerId); + if (!layer) { + this.fire('error', { + error: new Error( + "The layer '" + layerId + "' does not exist in " + + "the map's style and cannot be filtered." + ) + }); + return; + } + + if (filter !== null && filter !== undefined && this._validate(validateStyle.filter, ("layers." + (layer.id) + ".filter"), filter)) return; + + if (util.deepEqual(layer.filter, filter)) return; + layer.filter = util.clone(filter); + + this._updateLayer(layer); + }; + + /** + * Get a layer's filter object + * @param {string} layer the layer to inspect + * @returns {*} the layer's filter, if any + */ + Style.prototype.getFilter = function getFilter (layer) { + return util.clone(this.getLayer(layer).filter); + }; + + Style.prototype.setLayoutProperty = function setLayoutProperty (layerId, name, value) { + this._checkLoaded(); + + var layer = this.getLayer(layerId); + if (!layer) { + this.fire('error', { + error: new Error( + "The layer '" + layerId + "' does not exist in " + + "the map's style and cannot be styled." + ) + }); + return; + } + + if (util.deepEqual(layer.getLayoutProperty(name), value)) return; + + layer.setLayoutProperty(name, value); + this._updateLayer(layer); + }; + + /** + * Get a layout property's value from a given layer + * @param {string} layer the layer to inspect + * @param {string} name the name of the layout property + * @returns {*} the property value + */ + Style.prototype.getLayoutProperty = function getLayoutProperty (layer, name) { + return this.getLayer(layer).getLayoutProperty(name); + }; + + Style.prototype.setPaintProperty = function setPaintProperty (layerId, name, value, klass) { + this._checkLoaded(); + + var layer = this.getLayer(layerId); + if (!layer) { + this.fire('error', { + error: new Error( + "The layer '" + layerId + "' does not exist in " + + "the map's style and cannot be styled." + ) + }); + return; + } + + if (util.deepEqual(layer.getPaintProperty(name, klass), value)) return; + + var wasFeatureConstant = layer.isPaintValueFeatureConstant(name); + layer.setPaintProperty(name, value, klass); + + var isFeatureConstant = !( + value && + MapboxGLFunction.isFunctionDefinition(value) && + value.property !== '$zoom' && + value.property !== undefined + ); + + if (!isFeatureConstant || !wasFeatureConstant) { + this._updateLayer(layer); + } + + this.updateClasses(layerId, name); + }; + + Style.prototype.getPaintProperty = function getPaintProperty (layer, name, klass) { + return this.getLayer(layer).getPaintProperty(name, klass); + }; + + Style.prototype.getTransition = function getTransition () { + return util.extend({ duration: 300, delay: 0 }, + this.stylesheet && this.stylesheet.transition); + }; + + Style.prototype.updateClasses = function updateClasses (layerId, paintName) { + this._changed = true; + if (!layerId) { + this._updatedAllPaintProps = true; + } else { + var props = this._updatedPaintProps; + if (!props[layerId]) props[layerId] = {}; + props[layerId][paintName || 'all'] = true; + } + }; + + Style.prototype.serialize = function serialize () { + var this$1 = this; + + return util.filterObject({ + version: this.stylesheet.version, + name: this.stylesheet.name, + metadata: this.stylesheet.metadata, + light: this.stylesheet.light, + center: this.stylesheet.center, + zoom: this.stylesheet.zoom, + bearing: this.stylesheet.bearing, + pitch: this.stylesheet.pitch, + sprite: this.stylesheet.sprite, + glyphs: this.stylesheet.glyphs, + transition: this.stylesheet.transition, + sources: util.mapObject(this.sourceCaches, function (source) { return source.serialize(); }), + layers: this._order.map(function (id) { return this$1._layers[id].serialize(); }) + }, function (value) { return value !== undefined; }); + }; + + Style.prototype._updateLayer = function _updateLayer (layer) { + this._updatedLayers[layer.id] = true; + if (layer.source && !this._updatedSources[layer.source]) { + this._updatedSources[layer.source] = 'reload'; + } + this._changed = true; + }; + + Style.prototype._flattenRenderedFeatures = function _flattenRenderedFeatures (sourceResults) { + var this$1 = this; + + var features = []; + for (var l = this._order.length - 1; l >= 0; l--) { + var layerId = this$1._order[l]; + for (var i = 0, list = sourceResults; i < list.length; i += 1) { + var sourceResult = list[i]; + + var layerFeatures = sourceResult[layerId]; + if (layerFeatures) { + for (var i$1 = 0, list$1 = layerFeatures; i$1 < list$1.length; i$1 += 1) { + var feature = list$1[i$1]; + + features.push(feature); + } + } + } + } + return features; + }; + + Style.prototype.queryRenderedFeatures = function queryRenderedFeatures (queryGeometry, params, zoom, bearing) { + var this$1 = this; + + if (params && params.filter) { + this._validate(validateStyle.filter, 'queryRenderedFeatures.filter', params.filter); + } + + var includedSources = {}; + if (params && params.layers) { + for (var i = 0, list = params.layers; i < list.length; i += 1) { + var layerId = list[i]; + + var layer = this$1._layers[layerId]; + if (!layer) { + // this layer is not in the style.layers array + this$1.fire('error', {error: ("The layer '" + layerId + "' does not exist in the map's style and cannot be queried for features.")}); + return; + } + includedSources[layer.source] = true; + } + } + + var sourceResults = []; + for (var id in this.sourceCaches) { + if (params.layers && !includedSources[id]) continue; + var results = QueryFeatures.rendered(this$1.sourceCaches[id], this$1._layers, queryGeometry, params, zoom, bearing); + sourceResults.push(results); + } + return this._flattenRenderedFeatures(sourceResults); + }; + + Style.prototype.querySourceFeatures = function querySourceFeatures (sourceID, params) { + if (params && params.filter) { + this._validate(validateStyle.filter, 'querySourceFeatures.filter', params.filter); + } + var sourceCache = this.sourceCaches[sourceID]; + return sourceCache ? QueryFeatures.source(sourceCache, params) : []; + }; + + Style.prototype.addSourceType = function addSourceType (name, SourceType, callback) { + if (Source.getType(name)) { + return callback(new Error(("A source type called \"" + name + "\" already exists."))); + } + + Source.setType(name, SourceType); + + if (!SourceType.workerSourceURL) { + return callback(null, null); + } + + this.dispatcher.broadcast('loadWorkerSource', { + name: name, + url: SourceType.workerSourceURL + }, callback); + }; + + Style.prototype.getLight = function getLight () { + return this.light.getLight(); + }; + + Style.prototype.setLight = function setLight (lightOptions, transitionOptions) { + this._checkLoaded(); + + var light = this.light.getLight(); + var _update = false; + for (var key in lightOptions) { + if (!util.deepEqual(lightOptions[key], light[key])) { + _update = true; + break; + } + } + if (!_update) return; + + var transition = this.stylesheet.transition || {}; + + this.light.setLight(lightOptions); + this.light.updateLightTransitions(transitionOptions || {transition: true}, transition, this.animationLoop); + }; + + Style.prototype._validate = function _validate (validate, key, value, props, options) { + if (options && options.validate === false) { + return false; + } + return validateStyle.emitErrors(this, validate.call(validateStyle, util.extend({ + key: key, + style: this.serialize(), + value: value, + styleSpec: styleSpec + }, props))); + }; + + Style.prototype._remove = function _remove () { + var this$1 = this; + + for (var id in this.sourceCaches) { + this$1.sourceCaches[id].clearTiles(); + } + this.dispatcher.remove(); + }; + + Style.prototype._clearSource = function _clearSource (id) { + this.sourceCaches[id].clearTiles(); + }; + + Style.prototype._reloadSource = function _reloadSource (id) { + this.sourceCaches[id].reload(); + }; + + Style.prototype._updateSources = function _updateSources (transform) { + var this$1 = this; + + for (var id in this.sourceCaches) { + this$1.sourceCaches[id].update(transform); + } + }; + + Style.prototype._redoPlacement = function _redoPlacement () { + var this$1 = this; + + for (var id in this.sourceCaches) { + this$1.sourceCaches[id].redoPlacement(); + } + }; + + // Callbacks from web workers + + Style.prototype.getIcons = function getIcons (mapId, params, callback) { + var this$1 = this; + + var updateSpriteAtlas = function () { + this$1.spriteAtlas.setSprite(this$1.sprite); + this$1.spriteAtlas.addIcons(params.icons, callback); + }; + if (this.sprite.loaded()) { + updateSpriteAtlas(); + } else { + this.sprite.on('data', updateSpriteAtlas); + } + }; + + Style.prototype.getGlyphs = function getGlyphs (mapId, params, callback) { + var this$1 = this; + + var stacks = params.stacks; + var remaining = Object.keys(stacks).length; + var allGlyphs = {}; + + for (var fontName in stacks) { + this$1.glyphSource.getSimpleGlyphs(fontName, stacks[fontName], params.uid, done); + } + + function done(err, glyphs, fontName) { + if (err) console.error(err); + + allGlyphs[fontName] = glyphs; + remaining--; + + if (remaining === 0) + callback(null, allGlyphs); + } + }; + + return Style; +}(Evented)); + +module.exports = Style; + +},{"../global_worker_pool":22,"../render/line_atlas":35,"../source/query_features":47,"../source/rtl_text_plugin":49,"../source/source":50,"../source/source_cache":51,"../symbol/glyph_source":83,"../symbol/sprite_atlas":88,"../util/ajax":109,"../util/browser":110,"../util/dispatcher":116,"../util/evented":118,"../util/mapbox":125,"../util/util":129,"./animation_loop":59,"./image_sprite":60,"./light":61,"./style_layer":65,"./style_spec":72,"./validate_style":74,"assert":135,"mapbox-gl-function":164,"mapbox-gl-style-spec/lib/deref":165,"mapbox-gl-style-spec/lib/diff":166}],64:[function(require,module,exports){ +'use strict'; + +var MapboxGLFunction = require('mapbox-gl-function'); +var parseColor = require('./parse_color'); +var util = require('../util/util'); + +var StyleDeclaration = function StyleDeclaration(reference, value) { + var this$1 = this; + + this.value = util.clone(value); + this.isFunction = MapboxGLFunction.isFunctionDefinition(value); + + // immutable representation of value. used for comparison + this.json = JSON.stringify(this.value); + + this.minimum = reference.minimum; + this.isColor = reference.type === 'color'; + + var parsedValue = this.isColor && this.value ? parseColor(this.value) : value; + var specDefault = reference.default; + if (specDefault && reference.type === 'color') specDefault = parseColor(specDefault); + + this.function = MapboxGLFunction[reference.function || 'piecewise-constant'](parsedValue, specDefault); + this.isFeatureConstant = this.function.isFeatureConstant; + this.isZoomConstant = this.function.isZoomConstant; + + if (!this.isFeatureConstant && !this.isZoomConstant) { + this.stopZoomLevels = []; + var interpolationAmountStops = []; + for (var i = 0, list = this.value.stops; i < list.length; i += 1) { + var stop = list[i]; + + var zoom = stop[0].zoom; + if (this$1.stopZoomLevels.indexOf(zoom) < 0) { + this$1.stopZoomLevels.push(zoom); + interpolationAmountStops.push([zoom, interpolationAmountStops.length]); + } + } + + this.functionInterpolationT = MapboxGLFunction.interpolated({ + stops: interpolationAmountStops, + base: value.base, + colorSpace: value.colorSpace + }); + } +}; + +StyleDeclaration.prototype.calculate = function calculate (globalProperties, featureProperties) { + var value = this.function(globalProperties && globalProperties.zoom, featureProperties || {}); + if (this.isColor && value) { + return parseColor(value); + } + if (this.minimum !== undefined && value < this.minimum) { + return this.minimum; + } + return value; +}; + +StyleDeclaration.prototype.calculateInterpolationT = function calculateInterpolationT (globalProperties, featureProperties) { + return this.functionInterpolationT(globalProperties && globalProperties.zoom, featureProperties || {}); +}; + +module.exports = StyleDeclaration; + +},{"../util/util":129,"./parse_color":62,"mapbox-gl-function":164}],65:[function(require,module,exports){ +'use strict'; + +var util = require('../util/util'); +var StyleTransition = require('./style_transition'); +var StyleDeclaration = require('./style_declaration'); +var styleSpec = require('./style_spec'); +var validateStyle = require('./validate_style'); +var parseColor = require('./parse_color'); +var Evented = require('../util/evented'); + +var TRANSITION_SUFFIX = '-transition'; + +var StyleLayer = (function (Evented) { + function StyleLayer(layer) { + var this$1 = this; + + Evented.call(this); + + this.id = layer.id; + this.metadata = layer.metadata; + this.type = layer.type; + this.source = layer.source; + this.sourceLayer = layer['source-layer']; + this.minzoom = layer.minzoom; + this.maxzoom = layer.maxzoom; + this.filter = layer.filter; + + this.paint = {}; + this.layout = {}; + + this._paintSpecifications = styleSpec[("paint_" + (this.type))]; + this._layoutSpecifications = styleSpec[("layout_" + (this.type))]; + + this._paintTransitions = {}; // {[propertyName]: StyleTransition} + this._paintTransitionOptions = {}; // {[className]: {[propertyName]: { duration:Number, delay:Number }}} + this._paintDeclarations = {}; // {[className]: {[propertyName]: StyleDeclaration}} + this._layoutDeclarations = {}; // {[propertyName]: StyleDeclaration} + this._layoutFunctions = {}; // {[propertyName]: Boolean} + + var paintName, layoutName; + var options = {validate: false}; + + // Resolve paint declarations + for (var key in layer) { + var match = key.match(/^paint(?:\.(.*))?$/); + if (match) { + var klass = match[1] || ''; + for (paintName in layer[key]) { + this$1.setPaintProperty(paintName, layer[key][paintName], klass, options); + } + } + } + + // Resolve layout declarations + for (layoutName in layer.layout) { + this$1.setLayoutProperty(layoutName, layer.layout[layoutName], options); + } + + // set initial layout/paint values + for (paintName in this._paintSpecifications) { + this$1.paint[paintName] = this$1.getPaintValue(paintName); + } + for (layoutName in this._layoutSpecifications) { + this$1._updateLayoutValue(layoutName); + } + } + + if ( Evented ) StyleLayer.__proto__ = Evented; + StyleLayer.prototype = Object.create( Evented && Evented.prototype ); + StyleLayer.prototype.constructor = StyleLayer; + + StyleLayer.prototype.setLayoutProperty = function setLayoutProperty (name, value, options) { + + if (value == null) { + delete this._layoutDeclarations[name]; + } else { + var key = "layers." + (this.id) + ".layout." + name; + if (this._validate(validateStyle.layoutProperty, key, name, value, options)) return; + this._layoutDeclarations[name] = new StyleDeclaration(this._layoutSpecifications[name], value); + } + this._updateLayoutValue(name); + }; + + StyleLayer.prototype.getLayoutProperty = function getLayoutProperty (name) { + return ( + this._layoutDeclarations[name] && + this._layoutDeclarations[name].value + ); + }; + + StyleLayer.prototype.getLayoutValue = function getLayoutValue (name, globalProperties, featureProperties) { + var specification = this._layoutSpecifications[name]; + var declaration = this._layoutDeclarations[name]; + + if (declaration) { + return declaration.calculate(globalProperties, featureProperties); + } else { + return specification.default; + } + }; + + StyleLayer.prototype.setPaintProperty = function setPaintProperty (name, value, klass, options) { + var validateStyleKey = "layers." + (this.id) + (klass ? ("[\"paint." + klass + "\"].") : '.paint.') + name; + + if (util.endsWith(name, TRANSITION_SUFFIX)) { + if (!this._paintTransitionOptions[klass || '']) { + this._paintTransitionOptions[klass || ''] = {}; + } + if (value === null || value === undefined) { + delete this._paintTransitionOptions[klass || ''][name]; + } else { + if (this._validate(validateStyle.paintProperty, validateStyleKey, name, value, options)) return; + this._paintTransitionOptions[klass || ''][name] = value; + } + } else { + if (!this._paintDeclarations[klass || '']) { + this._paintDeclarations[klass || ''] = {}; + } + if (value === null || value === undefined) { + delete this._paintDeclarations[klass || ''][name]; + } else { + if (this._validate(validateStyle.paintProperty, validateStyleKey, name, value, options)) return; + this._paintDeclarations[klass || ''][name] = new StyleDeclaration(this._paintSpecifications[name], value); + } + } + }; + + StyleLayer.prototype.getPaintProperty = function getPaintProperty (name, klass) { + klass = klass || ''; + if (util.endsWith(name, TRANSITION_SUFFIX)) { + return ( + this._paintTransitionOptions[klass] && + this._paintTransitionOptions[klass][name] + ); + } else { + return ( + this._paintDeclarations[klass] && + this._paintDeclarations[klass][name] && + this._paintDeclarations[klass][name].value + ); + } + }; + + StyleLayer.prototype.getPaintValue = function getPaintValue (name, globalProperties, featureProperties) { + var specification = this._paintSpecifications[name]; + var transition = this._paintTransitions[name]; + + if (transition) { + return transition.calculate(globalProperties, featureProperties); + } else if (specification.type === 'color' && specification.default) { + return parseColor(specification.default); + } else { + return specification.default; + } + }; + + StyleLayer.prototype.getPaintValueStopZoomLevels = function getPaintValueStopZoomLevels (name) { + var transition = this._paintTransitions[name]; + if (transition) { + return transition.declaration.stopZoomLevels; + } else { + return []; + } + }; + + StyleLayer.prototype.getPaintInterpolationT = function getPaintInterpolationT (name, globalProperties) { + var transition = this._paintTransitions[name]; + return transition.declaration.calculateInterpolationT(globalProperties); + }; + + StyleLayer.prototype.isPaintValueFeatureConstant = function isPaintValueFeatureConstant (name) { + var transition = this._paintTransitions[name]; + + if (transition) { + return transition.declaration.isFeatureConstant; + } else { + return true; + } + }; + + StyleLayer.prototype.isLayoutValueFeatureConstant = function isLayoutValueFeatureConstant (name) { + var declaration = this._layoutDeclarations[name]; + + if (declaration) { + return declaration.isFeatureConstant; + } else { + return true; + } + }; + + StyleLayer.prototype.isPaintValueZoomConstant = function isPaintValueZoomConstant (name) { + var transition = this._paintTransitions[name]; + + if (transition) { + return transition.declaration.isZoomConstant; + } else { + return true; + } + }; + + StyleLayer.prototype.isHidden = function isHidden (zoom) { + if (this.minzoom && zoom < this.minzoom) return true; + if (this.maxzoom && zoom >= this.maxzoom) return true; + if (this.layout['visibility'] === 'none') return true; + + return false; + }; + + StyleLayer.prototype.updatePaintTransitions = function updatePaintTransitions (classes, options, globalOptions, animationLoop, zoomHistory) { + var this$1 = this; + + var declarations = util.extend({}, this._paintDeclarations['']); + for (var i = 0; i < classes.length; i++) { + util.extend(declarations, this$1._paintDeclarations[classes[i]]); + } + + var name; + for (name in declarations) { // apply new declarations + this$1._applyPaintDeclaration(name, declarations[name], options, globalOptions, animationLoop, zoomHistory); + } + for (name in this._paintTransitions) { + if (!(name in declarations)) // apply removed declarations + this$1._applyPaintDeclaration(name, null, options, globalOptions, animationLoop, zoomHistory); + } + }; + + StyleLayer.prototype.updatePaintTransition = function updatePaintTransition (name, classes, options, globalOptions, animationLoop, zoomHistory) { + var this$1 = this; + + var declaration = this._paintDeclarations[''][name]; + for (var i = 0; i < classes.length; i++) { + var classPaintDeclarations = this$1._paintDeclarations[classes[i]]; + if (classPaintDeclarations && classPaintDeclarations[name]) { + declaration = classPaintDeclarations[name]; + } + } + this._applyPaintDeclaration(name, declaration, options, globalOptions, animationLoop, zoomHistory); + }; + + // update all zoom-dependent layout/paint values + StyleLayer.prototype.recalculate = function recalculate (zoom) { + var this$1 = this; + + for (var paintName in this._paintTransitions) { + this$1.paint[paintName] = this$1.getPaintValue(paintName, {zoom: zoom}); + } + for (var layoutName in this._layoutFunctions) { + this$1.layout[layoutName] = this$1.getLayoutValue(layoutName, {zoom: zoom}); + } + }; + + StyleLayer.prototype.serialize = function serialize () { + var this$1 = this; + + var output = { + 'id': this.id, + 'type': this.type, + 'source': this.source, + 'source-layer': this.sourceLayer, + 'metadata': this.metadata, + 'minzoom': this.minzoom, + 'maxzoom': this.maxzoom, + 'filter': this.filter, + 'layout': util.mapObject(this._layoutDeclarations, getDeclarationValue) + }; + + for (var klass in this._paintDeclarations) { + var key = klass === '' ? 'paint' : ("paint." + klass); + output[key] = util.mapObject(this$1._paintDeclarations[klass], getDeclarationValue); + } + + return util.filterObject(output, function (value, key) { + return value !== undefined && !(key === 'layout' && !Object.keys(value).length); + }); + }; + + // set paint transition based on a given paint declaration + StyleLayer.prototype._applyPaintDeclaration = function _applyPaintDeclaration (name, declaration, options, globalOptions, animationLoop, zoomHistory) { + var oldTransition = options.transition ? this._paintTransitions[name] : undefined; + var spec = this._paintSpecifications[name]; + + if (declaration === null || declaration === undefined) { + declaration = new StyleDeclaration(spec, spec.default); + } + + if (oldTransition && oldTransition.declaration.json === declaration.json) return; + + var transitionOptions = util.extend({ + duration: 300, + delay: 0 + }, globalOptions, this.getPaintProperty(name + TRANSITION_SUFFIX)); + + var newTransition = this._paintTransitions[name] = + new StyleTransition(spec, declaration, oldTransition, transitionOptions, zoomHistory); + + if (!newTransition.instant()) { + newTransition.loopID = animationLoop.set(newTransition.endTime - Date.now()); + } + if (oldTransition) { + animationLoop.cancel(oldTransition.loopID); + } + }; + + // update layout value if it's constant, or mark it as zoom-dependent + StyleLayer.prototype._updateLayoutValue = function _updateLayoutValue (name) { + var declaration = this._layoutDeclarations[name]; + + if (declaration && declaration.isFunction) { + this._layoutFunctions[name] = true; + } else { + delete this._layoutFunctions[name]; + this.layout[name] = this.getLayoutValue(name); + } + }; + + StyleLayer.prototype._validate = function _validate (validate, key, name, value, options) { + if (options && options.validate === false) { + return false; + } + return validateStyle.emitErrors(this, validate.call(validateStyle, { + key: key, + layerType: this.type, + objectKey: name, + value: value, + styleSpec: styleSpec, + // Workaround for https://github.com/mapbox/mapbox-gl-js/issues/2407 + style: {glyphs: true, sprite: true} + })); + }; + + return StyleLayer; +}(Evented)); + +module.exports = StyleLayer; + +var subclasses = { + 'circle': require('./style_layer/circle_style_layer'), + 'fill': require('./style_layer/fill_style_layer'), + 'fill-extrusion': require('./style_layer/fill_extrusion_style_layer'), + 'line': require('./style_layer/line_style_layer'), + 'symbol': require('./style_layer/symbol_style_layer') +}; + +StyleLayer.create = function(layer) { + var LayerClass = subclasses[layer.type] || StyleLayer; + return new LayerClass(layer); +}; + +function getDeclarationValue(declaration) { + return declaration.value; +} + +},{"../util/evented":118,"../util/util":129,"./parse_color":62,"./style_declaration":64,"./style_layer/circle_style_layer":66,"./style_layer/fill_extrusion_style_layer":67,"./style_layer/fill_style_layer":68,"./style_layer/line_style_layer":69,"./style_layer/symbol_style_layer":70,"./style_spec":72,"./style_transition":73,"./validate_style":74}],66:[function(require,module,exports){ +'use strict'; + +var StyleLayer = require('../style_layer'); +var CircleBucket = require('../../data/bucket/circle_bucket'); + +var CircleStyleLayer = (function (StyleLayer) { + function CircleStyleLayer () { + StyleLayer.apply(this, arguments); + } + + if ( StyleLayer ) CircleStyleLayer.__proto__ = StyleLayer; + CircleStyleLayer.prototype = Object.create( StyleLayer && StyleLayer.prototype ); + CircleStyleLayer.prototype.constructor = CircleStyleLayer; + + CircleStyleLayer.prototype.createBucket = function createBucket (options) { + return new CircleBucket(options); + }; + + return CircleStyleLayer; +}(StyleLayer)); + +module.exports = CircleStyleLayer; + +},{"../../data/bucket/circle_bucket":3,"../style_layer":65}],67:[function(require,module,exports){ +'use strict'; + +var StyleLayer = require('../style_layer'); +var FillExtrusionBucket = require('../../data/bucket/fill_extrusion_bucket'); + +var FillExtrusionStyleLayer = (function (StyleLayer) { + function FillExtrusionStyleLayer () { + StyleLayer.apply(this, arguments); + } + + if ( StyleLayer ) FillExtrusionStyleLayer.__proto__ = StyleLayer; + FillExtrusionStyleLayer.prototype = Object.create( StyleLayer && StyleLayer.prototype ); + FillExtrusionStyleLayer.prototype.constructor = FillExtrusionStyleLayer; + + FillExtrusionStyleLayer.prototype.getPaintValue = function getPaintValue (name, globalProperties, featureProperties) { + var value = StyleLayer.prototype.getPaintValue.call(this, name, globalProperties, featureProperties); + if (name === 'fill-extrusion-color' && value) { + value[3] = 1; + } + return value; + }; + + FillExtrusionStyleLayer.prototype.createBucket = function createBucket (options) { + return new FillExtrusionBucket(options); + }; + + return FillExtrusionStyleLayer; +}(StyleLayer)); + +module.exports = FillExtrusionStyleLayer; + +},{"../../data/bucket/fill_extrusion_bucket":5,"../style_layer":65}],68:[function(require,module,exports){ +'use strict'; + +var StyleLayer = require('../style_layer'); +var FillBucket = require('../../data/bucket/fill_bucket'); + +var FillStyleLayer = (function (StyleLayer) { + function FillStyleLayer () { + StyleLayer.apply(this, arguments); + } + + if ( StyleLayer ) FillStyleLayer.__proto__ = StyleLayer; + FillStyleLayer.prototype = Object.create( StyleLayer && StyleLayer.prototype ); + FillStyleLayer.prototype.constructor = FillStyleLayer; + + FillStyleLayer.prototype.getPaintValue = function getPaintValue (name, globalProperties, featureProperties) { + var this$1 = this; + + if (name === 'fill-outline-color') { + // Special-case handling of undefined fill-outline-color values + if (this.getPaintProperty('fill-outline-color') === undefined) { + return StyleLayer.prototype.getPaintValue.call(this, 'fill-color', globalProperties, featureProperties); + } + + // Handle transitions from fill-outline-color: undefined + var transition = this._paintTransitions['fill-outline-color']; + while (transition) { + var declaredValue = ( + transition && + transition.declaration && + transition.declaration.value + ); + + if (!declaredValue) { + return StyleLayer.prototype.getPaintValue.call(this$1, 'fill-color', globalProperties, featureProperties); + } + + transition = transition.oldTransition; + } + } + + return StyleLayer.prototype.getPaintValue.call(this, name, globalProperties, featureProperties); + }; + + FillStyleLayer.prototype.getPaintValueStopZoomLevels = function getPaintValueStopZoomLevels (name) { + if (name === 'fill-outline-color' && this.getPaintProperty('fill-outline-color') === undefined) { + return StyleLayer.prototype.getPaintValueStopZoomLevels.call(this, 'fill-color'); + } else { + return StyleLayer.prototype.getPaintValueStopZoomLevels.call(this, name); + } + }; + + FillStyleLayer.prototype.getPaintInterpolationT = function getPaintInterpolationT (name, globalProperties) { + if (name === 'fill-outline-color' && this.getPaintProperty('fill-outline-color') === undefined) { + return StyleLayer.prototype.getPaintInterpolationT.call(this, 'fill-color', globalProperties); + } else { + return StyleLayer.prototype.getPaintInterpolationT.call(this, name, globalProperties); + } + }; + + FillStyleLayer.prototype.isPaintValueFeatureConstant = function isPaintValueFeatureConstant (name) { + if (name === 'fill-outline-color' && this.getPaintProperty('fill-outline-color') === undefined) { + return StyleLayer.prototype.isPaintValueFeatureConstant.call(this, 'fill-color'); + } else { + return StyleLayer.prototype.isPaintValueFeatureConstant.call(this, name); + } + }; + + FillStyleLayer.prototype.isPaintValueZoomConstant = function isPaintValueZoomConstant (name) { + if (name === 'fill-outline-color' && this.getPaintProperty('fill-outline-color') === undefined) { + return StyleLayer.prototype.isPaintValueZoomConstant.call(this, 'fill-color'); + } else { + return StyleLayer.prototype.isPaintValueZoomConstant.call(this, name); + } + }; + + FillStyleLayer.prototype.createBucket = function createBucket (options) { + return new FillBucket(options); + }; + + return FillStyleLayer; +}(StyleLayer)); + +module.exports = FillStyleLayer; + +},{"../../data/bucket/fill_bucket":4,"../style_layer":65}],69:[function(require,module,exports){ +'use strict'; + +var StyleLayer = require('../style_layer'); +var LineBucket = require('../../data/bucket/line_bucket'); +var util = require('../../util/util'); + +var LineStyleLayer = (function (StyleLayer) { + function LineStyleLayer () { + StyleLayer.apply(this, arguments); + } + + if ( StyleLayer ) LineStyleLayer.__proto__ = StyleLayer; + LineStyleLayer.prototype = Object.create( StyleLayer && StyleLayer.prototype ); + LineStyleLayer.prototype.constructor = LineStyleLayer; + + LineStyleLayer.prototype.getPaintValue = function getPaintValue (name, globalProperties, featureProperties) { + var value = StyleLayer.prototype.getPaintValue.call(this, name, globalProperties, featureProperties); + + // If the line is dashed, scale the dash lengths by the line + // width at the previous round zoom level. + if (value && name === 'line-dasharray') { + var width = this.getPaintValue('line-width', + util.extend({}, globalProperties, {zoom: Math.floor(globalProperties.zoom)}), featureProperties); + value.fromScale *= width; + value.toScale *= width; + } + + return value; + }; + + LineStyleLayer.prototype.createBucket = function createBucket (options) { + return new LineBucket(options); + }; + + return LineStyleLayer; +}(StyleLayer)); + +module.exports = LineStyleLayer; + +},{"../../data/bucket/line_bucket":6,"../../util/util":129,"../style_layer":65}],70:[function(require,module,exports){ +'use strict'; + +var StyleLayer = require('../style_layer'); +var SymbolBucket = require('../../data/bucket/symbol_bucket'); + +var SymbolStyleLayer = (function (StyleLayer) { + function SymbolStyleLayer () { + StyleLayer.apply(this, arguments); + } + + if ( StyleLayer ) SymbolStyleLayer.__proto__ = StyleLayer; + SymbolStyleLayer.prototype = Object.create( StyleLayer && StyleLayer.prototype ); + SymbolStyleLayer.prototype.constructor = SymbolStyleLayer; + + SymbolStyleLayer.prototype.getLayoutValue = function getLayoutValue (name, globalProperties, featureProperties) { + var value = StyleLayer.prototype.getLayoutValue.call(this, name, globalProperties, featureProperties); + if (value !== 'auto') { + return value; + } + + switch (name) { + case 'text-rotation-alignment': + case 'icon-rotation-alignment': + return this.getLayoutValue('symbol-placement', globalProperties, featureProperties) === 'line' ? 'map' : 'viewport'; + case 'text-pitch-alignment': + return this.getLayoutValue('text-rotation-alignment', globalProperties, featureProperties); + default: + return value; + } + }; + + SymbolStyleLayer.prototype.createBucket = function createBucket (options) { + return new SymbolBucket(options); + }; + + return SymbolStyleLayer; +}(StyleLayer)); + +module.exports = SymbolStyleLayer; + +},{"../../data/bucket/symbol_bucket":7,"../style_layer":65}],71:[function(require,module,exports){ +'use strict'; + +var StyleLayer = require('./style_layer'); +var util = require('../util/util'); +var featureFilter = require('feature-filter'); +var groupByLayout = require('mapbox-gl-style-spec/lib/group_by_layout'); + +var StyleLayerIndex = function StyleLayerIndex(layerConfigs) { + if (layerConfigs) { + this.replace(layerConfigs); + } +}; + +StyleLayerIndex.prototype.replace = function replace (layerConfigs) { + var this$1 = this; + + this.symbolOrder = []; + for (var i = 0, list = layerConfigs; i < list.length; i += 1) { + var layerConfig = list[i]; + + if (layerConfig.type === 'symbol') { + this$1.symbolOrder.push(layerConfig.id); + } + } + this._layerConfigs = {}; + this._layers = {}; + this.update(layerConfigs, []); +}; + +StyleLayerIndex.prototype.update = function update (layerConfigs, removedIds, symbolOrder) { + var this$1 = this; + + for (var i = 0, list = layerConfigs; i < list.length; i += 1) { + var layerConfig = list[i]; + + this$1._layerConfigs[layerConfig.id] = layerConfig; + + var layer = this$1._layers[layerConfig.id] = StyleLayer.create(layerConfig); + layer.updatePaintTransitions({}, {transition: false}); + layer.filter = featureFilter(layer.filter); + } + for (var i$1 = 0, list$1 = removedIds; i$1 < list$1.length; i$1 += 1) { + var id = list$1[i$1]; + + delete this$1._layerConfigs[id]; + delete this$1._layers[id]; + } + if (symbolOrder) { + this.symbolOrder = symbolOrder; + } + + this.familiesBySource = {}; + + var groups = groupByLayout(util.values(this._layerConfigs)); + + for (var i$2 = 0, list$2 = groups; i$2 < list$2.length; i$2 += 1) { + var layerConfigs$1 = list$2[i$2]; + + var layers = layerConfigs$1.map(function (layerConfig) { return this$1._layers[layerConfig.id]; }); + + var layer$1 = layers[0]; + if (layer$1.layout && layer$1.layout.visibility === 'none') { + continue; + } + + var sourceId = layer$1.source || ''; + var sourceGroup = this$1.familiesBySource[sourceId]; + if (!sourceGroup) { + sourceGroup = this$1.familiesBySource[sourceId] = {}; + } + + var sourceLayerId = layer$1.sourceLayer || '_geojsonTileLayer'; + var sourceLayerFamilies = sourceGroup[sourceLayerId]; + if (!sourceLayerFamilies) { + sourceLayerFamilies = sourceGroup[sourceLayerId] = []; + } + + sourceLayerFamilies.push(layers); + } +}; + +module.exports = StyleLayerIndex; + +},{"../util/util":129,"./style_layer":65,"feature-filter":139,"mapbox-gl-style-spec/lib/group_by_layout":168}],72:[function(require,module,exports){ +'use strict'; + +module.exports = require('mapbox-gl-style-spec/reference/latest.min'); + +},{"mapbox-gl-style-spec/reference/latest.min":192}],73:[function(require,module,exports){ +'use strict'; + +var util = require('../util/util'); +var interpolate = require('../util/interpolate'); + +var fakeZoomHistory = { lastIntegerZoom: 0, lastIntegerZoomTime: 0, lastZoom: 0 }; + +/* + * Represents a transition between two declarations + */ +var StyleTransition = function StyleTransition(reference, declaration, oldTransition, options, zoomHistory) { + this.declaration = declaration; + this.startTime = this.endTime = (new Date()).getTime(); + + this.oldTransition = oldTransition; + this.duration = options.duration || 0; + this.delay = options.delay || 0; + + this.zoomTransitioned = reference.function === 'piecewise-constant' && reference.transition; + this.interp = this.zoomTransitioned ? interpZoomTransitioned : interpolate[reference.type]; + this.zoomHistory = zoomHistory || fakeZoomHistory; + + if (!this.instant()) { + this.endTime = this.startTime + this.duration + this.delay; + } + + if (oldTransition && oldTransition.endTime <= this.startTime) { + // Old transition is done running, so we can + // delete its reference to its old transition. + delete oldTransition.oldTransition; + } +}; + +StyleTransition.prototype.instant = function instant () { + return !this.oldTransition || !this.interp || (this.duration === 0 && this.delay === 0); +}; + +/* + * Return the value of the transitioning property. + */ +StyleTransition.prototype.calculate = function calculate (globalProperties, featureProperties, time) { + var value = this._calculateTargetValue(globalProperties, featureProperties); + + if (this.instant()) + return value; + + time = time || Date.now(); + + if (time >= this.endTime) + return value; + + var oldValue = this.oldTransition.calculate(globalProperties, featureProperties, this.startTime); + var t = util.easeCubicInOut((time - this.startTime - this.delay) / this.duration); + return this.interp(oldValue, value, t); +}; + +StyleTransition.prototype._calculateTargetValue = function _calculateTargetValue (globalProperties, featureProperties) { + if (!this.zoomTransitioned) + return this.declaration.calculate(globalProperties, featureProperties); + + // calculate zoom transition between discrete values, such as images and dasharrays. + var z = globalProperties.zoom; + var lastIntegerZoom = this.zoomHistory.lastIntegerZoom; + + var fromScale = z > lastIntegerZoom ? 2 : 0.5; + var from = this.declaration.calculate({zoom: z > lastIntegerZoom ? z - 1 : z + 1}, featureProperties); + var to = this.declaration.calculate({zoom: z}, featureProperties); + + var timeFraction = Math.min((Date.now() - this.zoomHistory.lastIntegerZoomTime) / this.duration, 1); + var zoomFraction = Math.abs(z - lastIntegerZoom); + var t = interpolate(timeFraction, 1, zoomFraction); + + if (from === undefined || to === undefined) + return undefined; + + return { from: from, fromScale: fromScale, to: to, toScale: 1, t: t }; +}; + +module.exports = StyleTransition; + +// interpolate between two values that transition with zoom, such as images and dasharrays +function interpZoomTransitioned(from, to, t) { + if (from === undefined || to === undefined) + return undefined; + + return { + from: from.to, + fromScale: from.toScale, + to: to.to, + toScale: to.toScale, + t: t + }; +} + +},{"../util/interpolate":121,"../util/util":129}],74:[function(require,module,exports){ +'use strict'; + +module.exports = require('mapbox-gl-style-spec/lib/validate_style.min'); + +module.exports.emitErrors = function (emitter, errors) { + if (errors && errors.length) { + for (var i = 0; i < errors.length; i++) { + emitter.fire('error', { error: new Error(errors[i].message) }); + } + return true; + } else { + return false; + } +}; + +},{"mapbox-gl-style-spec/lib/validate_style.min":190}],75:[function(require,module,exports){ +'use strict'; + +var Point = require('point-geometry'); + +var Anchor = (function (Point) { + function Anchor(x, y, angle, segment) { + Point.call(this, x, y); + this.angle = angle; + if (segment !== undefined) { + this.segment = segment; + } + } + + if ( Point ) Anchor.__proto__ = Point; + Anchor.prototype = Object.create( Point && Point.prototype ); + Anchor.prototype.constructor = Anchor; + + Anchor.prototype.clone = function clone () { + return new Anchor(this.x, this.y, this.angle, this.segment); + }; + + return Anchor; +}(Point)); + +module.exports = Anchor; + +},{"point-geometry":198}],76:[function(require,module,exports){ +'use strict'; + +module.exports = checkMaxAngle; + +/** + * Labels placed around really sharp angles aren't readable. Check if any + * part of the potential label has a combined angle that is too big. + * + * @param {Array} line + * @param {Anchor} anchor The point on the line around which the label is anchored. + * @param {number} labelLength The length of the label in geometry units. + * @param {number} windowSize The check fails if the combined angles within a part of the line that is `windowSize` long is too big. + * @param {number} maxAngle The maximum combined angle that any window along the label is allowed to have. + * + * @returns {boolean} whether the label should be placed + * @private + */ +function checkMaxAngle(line, anchor, labelLength, windowSize, maxAngle) { + + // horizontal labels always pass + if (anchor.segment === undefined) return true; + + var p = anchor; + var index = anchor.segment + 1; + var anchorDistance = 0; + + // move backwards along the line to the first segment the label appears on + while (anchorDistance > -labelLength / 2) { + index--; + + // there isn't enough room for the label after the beginning of the line + if (index < 0) return false; + + anchorDistance -= line[index].dist(p); + p = line[index]; + } + + anchorDistance += line[index].dist(line[index + 1]); + index++; + + // store recent corners and their total angle difference + var recentCorners = []; + var recentAngleDelta = 0; + + // move forwards by the length of the label and check angles along the way + while (anchorDistance < labelLength / 2) { + var prev = line[index - 1]; + var current = line[index]; + var next = line[index + 1]; + + // there isn't enough room for the label before the end of the line + if (!next) return false; + + var angleDelta = prev.angleTo(current) - current.angleTo(next); + // restrict angle to -pi..pi range + angleDelta = Math.abs(((angleDelta + 3 * Math.PI) % (Math.PI * 2)) - Math.PI); + + recentCorners.push({ + distance: anchorDistance, + angleDelta: angleDelta + }); + recentAngleDelta += angleDelta; + + // remove corners that are far enough away from the list of recent anchors + while (anchorDistance - recentCorners[0].distance > windowSize) { + recentAngleDelta -= recentCorners.shift().angleDelta; + } + + // the sum of angles within the window area exceeds the maximum allowed value. check fails. + if (recentAngleDelta > maxAngle) return false; + + index++; + anchorDistance += current.dist(next); + } + + // no part of the line had an angle greater than the maximum allowed. check passes. + return true; +} + +},{}],77:[function(require,module,exports){ +'use strict'; + +var Point = require('point-geometry'); + +module.exports = clipLine; + +/** + * Returns the part of a multiline that intersects with the provided rectangular box. + * + * @param {Array>} lines + * @param {number} x1 the left edge of the box + * @param {number} y1 the top edge of the box + * @param {number} x2 the right edge of the box + * @param {number} y2 the bottom edge of the box + * @returns {Array>} lines + * @private + */ +function clipLine(lines, x1, y1, x2, y2) { + var clippedLines = []; + + for (var l = 0; l < lines.length; l++) { + var line = lines[l]; + var clippedLine; + + for (var i = 0; i < line.length - 1; i++) { + var p0 = line[i]; + var p1 = line[i + 1]; + + + if (p0.x < x1 && p1.x < x1) { + continue; + } else if (p0.x < x1) { + p0 = new Point(x1, p0.y + (p1.y - p0.y) * ((x1 - p0.x) / (p1.x - p0.x)))._round(); + } else if (p1.x < x1) { + p1 = new Point(x1, p0.y + (p1.y - p0.y) * ((x1 - p0.x) / (p1.x - p0.x)))._round(); + } + + if (p0.y < y1 && p1.y < y1) { + continue; + } else if (p0.y < y1) { + p0 = new Point(p0.x + (p1.x - p0.x) * ((y1 - p0.y) / (p1.y - p0.y)), y1)._round(); + } else if (p1.y < y1) { + p1 = new Point(p0.x + (p1.x - p0.x) * ((y1 - p0.y) / (p1.y - p0.y)), y1)._round(); + } + + if (p0.x >= x2 && p1.x >= x2) { + continue; + } else if (p0.x >= x2) { + p0 = new Point(x2, p0.y + (p1.y - p0.y) * ((x2 - p0.x) / (p1.x - p0.x)))._round(); + } else if (p1.x >= x2) { + p1 = new Point(x2, p0.y + (p1.y - p0.y) * ((x2 - p0.x) / (p1.x - p0.x)))._round(); + } + + if (p0.y >= y2 && p1.y >= y2) { + continue; + } else if (p0.y >= y2) { + p0 = new Point(p0.x + (p1.x - p0.x) * ((y2 - p0.y) / (p1.y - p0.y)), y2)._round(); + } else if (p1.y >= y2) { + p1 = new Point(p0.x + (p1.x - p0.x) * ((y2 - p0.y) / (p1.y - p0.y)), y2)._round(); + } + + if (!clippedLine || !p0.equals(clippedLine[clippedLine.length - 1])) { + clippedLine = [p0]; + clippedLines.push(clippedLine); + } + + clippedLine.push(p1); + } + } + + return clippedLines; +} + +},{"point-geometry":198}],78:[function(require,module,exports){ +'use strict'; + +var createStructArrayType = require('../util/struct_array'); +var Point = require('point-geometry'); + +/** + * A collision box represents an area of the map that that is covered by a + * label. CollisionFeature uses one or more of these collision boxes to + * represent all the area covered by a single label. They are used to + * prevent collisions between labels. + * + * A collision box actually represents a 3d volume. The first two dimensions, + * x and y, are specified with `anchor` along with `x1`, `y1`, `x2`, `y2`. + * The third dimension, zoom, is limited by `maxScale` which determines + * how far in the z dimensions the box extends. + * + * As you zoom in on a map, all points on the map get further and further apart + * but labels stay roughly the same size. Labels cover less real world area on + * the map at higher zoom levels than they do at lower zoom levels. This is why + * areas are are represented with an anchor point and offsets from that point + * instead of just using four absolute points. + * + * Line labels are represented by a set of these boxes spaced out along a line. + * When you zoom in, line labels cover less real world distance along the line + * than they used to. Collision boxes near the edges that used to cover label + * no longer do. If a box doesn't cover the label anymore it should be ignored + * when doing collision checks. `maxScale` is how much you can scale the map + * before the label isn't within the box anymore. + * For example + * lower zoom: + * https://cloud.githubusercontent.com/assets/1421652/8060094/4d975f76-0e91-11e5-84b1-4edeb30a5875.png + * slightly higher zoom: + * https://cloud.githubusercontent.com/assets/1421652/8060061/26ae1c38-0e91-11e5-8c5a-9f380bf29f0a.png + * In the zoomed in image the two grey boxes on either side don't cover the + * label anymore. Their maxScale is smaller than the current scale. + * + * + * @class CollisionBoxArray + * @private + */ + +var CollisionBoxArray = createStructArrayType({ + members: [ + // the box is centered around the anchor point + { type: 'Int16', name: 'anchorPointX' }, + { type: 'Int16', name: 'anchorPointY' }, + + // distances to the edges from the anchor + { type: 'Int16', name: 'x1' }, + { type: 'Int16', name: 'y1' }, + { type: 'Int16', name: 'x2' }, + { type: 'Int16', name: 'y2' }, + + // the box is only valid for scales < maxScale. + // The box does not block other boxes at scales >= maxScale; + { type: 'Float32', name: 'maxScale' }, + + // the index of the feature in the original vectortile + { type: 'Uint32', name: 'featureIndex' }, + // the source layer the feature appears in + { type: 'Uint16', name: 'sourceLayerIndex' }, + // the bucket the feature appears in + { type: 'Uint16', name: 'bucketIndex' }, + + // rotated and scaled bbox used for indexing + { type: 'Int16', name: 'bbox0' }, + { type: 'Int16', name: 'bbox1' }, + { type: 'Int16', name: 'bbox2' }, + { type: 'Int16', name: 'bbox3' }, + + { type: 'Float32', name: 'placementScale' } + ] +}); + +Object.defineProperty(CollisionBoxArray.prototype.StructType.prototype, 'anchorPoint', { + get: function get() { return new Point(this.anchorPointX, this.anchorPointY); } +}); + +module.exports = CollisionBoxArray; + +},{"../util/struct_array":127,"point-geometry":198}],79:[function(require,module,exports){ +'use strict'; + +/** + * A CollisionFeature represents the area of the tile covered by a single label. + * It is used with CollisionTile to check if the label overlaps with any + * previous labels. A CollisionFeature is mostly just a set of CollisionBox + * objects. + * + * @private + */ +var CollisionFeature = function CollisionFeature(collisionBoxArray, line, anchor, featureIndex, sourceLayerIndex, bucketIndex, shaped, boxScale, padding, alignLine, straight) { + var y1 = shaped.top * boxScale - padding; + var y2 = shaped.bottom * boxScale + padding; + var x1 = shaped.left * boxScale - padding; + var x2 = shaped.right * boxScale + padding; + + this.boxStartIndex = collisionBoxArray.length; + + if (alignLine) { + + var height = y2 - y1; + var length = x2 - x1; + + if (height > 0) { + // set minimum box height to avoid very many small labels + height = Math.max(10 * boxScale, height); + + if (straight) { + // used for icon labels that are aligned with the line, but don't curve along it + var vector = line[anchor.segment + 1].sub(line[anchor.segment])._unit()._mult(length); + var straightLine = [anchor.sub(vector), anchor.add(vector)]; + this._addLineCollisionBoxes(collisionBoxArray, straightLine, anchor, 0, length, height, featureIndex, sourceLayerIndex, bucketIndex); + } else { + // used for text labels that curve along a line + this._addLineCollisionBoxes(collisionBoxArray, line, anchor, anchor.segment, length, height, featureIndex, sourceLayerIndex, bucketIndex); + } + } + + } else { + collisionBoxArray.emplaceBack(anchor.x, anchor.y, x1, y1, x2, y2, Infinity, featureIndex, sourceLayerIndex, bucketIndex, + 0, 0, 0, 0, 0); + } + + this.boxEndIndex = collisionBoxArray.length; +}; + +/** + * Create a set of CollisionBox objects for a line. + * + * @param {Array} line + * @param {Anchor} anchor + * @param {number} labelLength The length of the label in geometry units. + * @param {Anchor} anchor The point along the line around which the label is anchored. + * @param {VectorTileFeature} feature The VectorTileFeature that this CollisionFeature was created for. + * @param {number} boxSize The size of the collision boxes that will be created. + * + * @private + */ +CollisionFeature.prototype._addLineCollisionBoxes = function _addLineCollisionBoxes (collisionBoxArray, line, anchor, segment, labelLength, boxSize, featureIndex, sourceLayerIndex, bucketIndex) { + var step = boxSize / 2; + var nBoxes = Math.floor(labelLength / step); + + // offset the center of the first box by half a box so that the edge of the + // box is at the edge of the label. + var firstBoxOffset = -boxSize / 2; + + var bboxes = this.boxes; + + var p = anchor; + var index = segment + 1; + var anchorDistance = firstBoxOffset; + + // move backwards along the line to the first segment the label appears on + do { + index--; + + // there isn't enough room for the label after the beginning of the line + // checkMaxAngle should have already caught this + if (index < 0) return bboxes; + + anchorDistance -= line[index].dist(p); + p = line[index]; + } while (anchorDistance > -labelLength / 2); + + var segmentLength = line[index].dist(line[index + 1]); + + for (var i = 0; i < nBoxes; i++) { + // the distance the box will be from the anchor + var boxDistanceToAnchor = -labelLength / 2 + i * step; + + // the box is not on the current segment. Move to the next segment. + while (anchorDistance + segmentLength < boxDistanceToAnchor) { + anchorDistance += segmentLength; + index++; + + // There isn't enough room before the end of the line. + if (index + 1 >= line.length) return bboxes; + + segmentLength = line[index].dist(line[index + 1]); + } + + // the distance the box will be from the beginning of the segment + var segmentBoxDistance = boxDistanceToAnchor - anchorDistance; + + var p0 = line[index]; + var p1 = line[index + 1]; + var boxAnchorPoint = p1.sub(p0)._unit()._mult(segmentBoxDistance)._add(p0)._round(); + + var distanceToInnerEdge = Math.max(Math.abs(boxDistanceToAnchor - firstBoxOffset) - step / 2, 0); + var maxScale = labelLength / 2 / distanceToInnerEdge; + + collisionBoxArray.emplaceBack(boxAnchorPoint.x, boxAnchorPoint.y, + -boxSize / 2, -boxSize / 2, boxSize / 2, boxSize / 2, maxScale, + featureIndex, sourceLayerIndex, bucketIndex, + 0, 0, 0, 0, 0); + } + + return bboxes; +}; + +module.exports = CollisionFeature; + +},{}],80:[function(require,module,exports){ +'use strict'; + +var Point = require('point-geometry'); +var EXTENT = require('../data/extent'); +var Grid = require('grid-index'); + +var intersectionTests = require('../util/intersection_tests'); + +/** + * A collision tile used to prevent symbols from overlapping. It keep tracks of + * where previous symbols have been placed and is used to check if a new + * symbol overlaps with any previously added symbols. + * + * @private + */ +var CollisionTile = function CollisionTile(angle, pitch, collisionBoxArray) { + if (typeof angle === 'object') { + var serialized = angle; + collisionBoxArray = pitch; + angle = serialized.angle; + pitch = serialized.pitch; + this.grid = new Grid(serialized.grid); + this.ignoredGrid = new Grid(serialized.ignoredGrid); + } else { + this.grid = new Grid(EXTENT, 12, 6); + this.ignoredGrid = new Grid(EXTENT, 12, 0); + } + + this.minScale = 0.5; + this.maxScale = 2; + + this.angle = angle; + this.pitch = pitch; + + var sin = Math.sin(angle), + cos = Math.cos(angle); + this.rotationMatrix = [cos, -sin, sin, cos]; + this.reverseRotationMatrix = [cos, sin, -sin, cos]; + + // Stretch boxes in y direction to account for the map tilt. + this.yStretch = 1 / Math.cos(pitch / 180 * Math.PI); + + // The amount the map is squished depends on the y position. + // Sort of account for this by making all boxes a bit bigger. + this.yStretch = Math.pow(this.yStretch, 1.3); + + this.collisionBoxArray = collisionBoxArray; + if (collisionBoxArray.length === 0) { + // the first collisionBoxArray is passed to a CollisionTile + + // tempCollisionBox + collisionBoxArray.emplaceBack(); + + var maxInt16 = 32767; + //left + collisionBoxArray.emplaceBack(0, 0, 0, -maxInt16, 0, maxInt16, maxInt16, + 0, 0, 0, 0, 0, 0, 0, 0, + 0); + // right + collisionBoxArray.emplaceBack(EXTENT, 0, 0, -maxInt16, 0, maxInt16, maxInt16, + 0, 0, 0, 0, 0, 0, 0, 0, + 0); + // top + collisionBoxArray.emplaceBack(0, 0, -maxInt16, 0, maxInt16, 0, maxInt16, + 0, 0, 0, 0, 0, 0, 0, 0, + 0); + // bottom + collisionBoxArray.emplaceBack(0, EXTENT, -maxInt16, 0, maxInt16, 0, maxInt16, + 0, 0, 0, 0, 0, 0, 0, 0, + 0); + } + + this.tempCollisionBox = collisionBoxArray.get(0); + this.edges = [ + collisionBoxArray.get(1), + collisionBoxArray.get(2), + collisionBoxArray.get(3), + collisionBoxArray.get(4) + ]; +}; + +CollisionTile.prototype.serialize = function serialize (transferables) { + var grid = this.grid.toArrayBuffer(); + var ignoredGrid = this.ignoredGrid.toArrayBuffer(); + if (transferables) { + transferables.push(grid); + transferables.push(ignoredGrid); + } + return { + angle: this.angle, + pitch: this.pitch, + grid: grid, + ignoredGrid: ignoredGrid + }; +}; + +/** + * Find the scale at which the collisionFeature can be shown without + * overlapping with other features. + * + * @param {CollisionFeature} collisionFeature + * @returns {number} placementScale + * @private + */ +CollisionTile.prototype.placeCollisionFeature = function placeCollisionFeature (collisionFeature, allowOverlap, avoidEdges) { + var this$1 = this; + + + var collisionBoxArray = this.collisionBoxArray; + var minPlacementScale = this.minScale; + var rotationMatrix = this.rotationMatrix; + var yStretch = this.yStretch; + + for (var b = collisionFeature.boxStartIndex; b < collisionFeature.boxEndIndex; b++) { + + var box = collisionBoxArray.get(b); + + var anchorPoint = box.anchorPoint._matMult(rotationMatrix); + var x = anchorPoint.x; + var y = anchorPoint.y; + + var x1 = x + box.x1; + var y1 = y + box.y1 * yStretch; + var x2 = x + box.x2; + var y2 = y + box.y2 * yStretch; + + box.bbox0 = x1; + box.bbox1 = y1; + box.bbox2 = x2; + box.bbox3 = y2; + + if (!allowOverlap) { + var blockingBoxes = this$1.grid.query(x1, y1, x2, y2); + + for (var i = 0; i < blockingBoxes.length; i++) { + var blocking = collisionBoxArray.get(blockingBoxes[i]); + var blockingAnchorPoint = blocking.anchorPoint._matMult(rotationMatrix); + + minPlacementScale = this$1.getPlacementScale(minPlacementScale, anchorPoint, box, blockingAnchorPoint, blocking); + if (minPlacementScale >= this$1.maxScale) { + return minPlacementScale; + } + } + } + + if (avoidEdges) { + var rotatedCollisionBox; + + if (this$1.angle) { + var reverseRotationMatrix = this$1.reverseRotationMatrix; + var tl = new Point(box.x1, box.y1).matMult(reverseRotationMatrix); + var tr = new Point(box.x2, box.y1).matMult(reverseRotationMatrix); + var bl = new Point(box.x1, box.y2).matMult(reverseRotationMatrix); + var br = new Point(box.x2, box.y2).matMult(reverseRotationMatrix); + + rotatedCollisionBox = this$1.tempCollisionBox; + rotatedCollisionBox.anchorPointX = box.anchorPoint.x; + rotatedCollisionBox.anchorPointY = box.anchorPoint.y; + rotatedCollisionBox.x1 = Math.min(tl.x, tr.x, bl.x, br.x); + rotatedCollisionBox.y1 = Math.min(tl.y, tr.x, bl.x, br.x); + rotatedCollisionBox.x2 = Math.max(tl.x, tr.x, bl.x, br.x); + rotatedCollisionBox.y2 = Math.max(tl.y, tr.x, bl.x, br.x); + rotatedCollisionBox.maxScale = box.maxScale; + } else { + rotatedCollisionBox = box; + } + + for (var k = 0; k < this.edges.length; k++) { + var edgeBox = this$1.edges[k]; + minPlacementScale = this$1.getPlacementScale(minPlacementScale, box.anchorPoint, rotatedCollisionBox, edgeBox.anchorPoint, edgeBox); + if (minPlacementScale >= this$1.maxScale) { + return minPlacementScale; + } + } + } + } + + return minPlacementScale; +}; + +CollisionTile.prototype.queryRenderedSymbols = function queryRenderedSymbols (queryGeometry, scale) { + var sourceLayerFeatures = {}; + var result = []; + + if (queryGeometry.length === 0 || (this.grid.length === 0 && this.ignoredGrid.length === 0)) { + return result; + } + + var collisionBoxArray = this.collisionBoxArray; + var rotationMatrix = this.rotationMatrix; + var yStretch = this.yStretch; + + // Generate a rotated geometry out of the original query geometry. + // Scale has already been handled by the prior conversions. + var rotatedQuery = []; + var minX = Infinity; + var minY = Infinity; + var maxX = -Infinity; + var maxY = -Infinity; + for (var i = 0; i < queryGeometry.length; i++) { + var ring = queryGeometry[i]; + for (var k = 0; k < ring.length; k++) { + var p = ring[k].matMult(rotationMatrix); + minX = Math.min(minX, p.x); + minY = Math.min(minY, p.y); + maxX = Math.max(maxX, p.x); + maxY = Math.max(maxY, p.y); + rotatedQuery.push(p); + } + } + + var features = this.grid.query(minX, minY, maxX, maxY); + var ignoredFeatures = this.ignoredGrid.query(minX, minY, maxX, maxY); + for (var i$1 = 0; i$1 < ignoredFeatures.length; i$1++) { + features.push(ignoredFeatures[i$1]); + } + + // Account for the rounding done when updating symbol shader variables. + var roundedScale = Math.pow(2, Math.ceil(Math.log(scale) / Math.LN2 * 10) / 10); + + for (var i$2 = 0; i$2 < features.length; i$2++) { + var blocking = collisionBoxArray.get(features[i$2]); + var sourceLayer = blocking.sourceLayerIndex; + var featureIndex = blocking.featureIndex; + + // Skip already seen features. + if (sourceLayerFeatures[sourceLayer] === undefined) { + sourceLayerFeatures[sourceLayer] = {}; + } + if (sourceLayerFeatures[sourceLayer][featureIndex]) continue; + + // Check if feature is rendered (collision free) at current scale. + if (roundedScale < blocking.placementScale || roundedScale > blocking.maxScale) continue; + + // Check if query intersects with the feature box at current scale. + var anchor = blocking.anchorPoint.matMult(rotationMatrix); + var x1 = anchor.x + blocking.x1 / scale; + var y1 = anchor.y + blocking.y1 / scale * yStretch; + var x2 = anchor.x + blocking.x2 / scale; + var y2 = anchor.y + blocking.y2 / scale * yStretch; + var bbox = [ + new Point(x1, y1), + new Point(x2, y1), + new Point(x2, y2), + new Point(x1, y2) + ]; + if (!intersectionTests.polygonIntersectsPolygon(rotatedQuery, bbox)) continue; + + sourceLayerFeatures[sourceLayer][featureIndex] = true; + result.push(features[i$2]); + } + + return result; +}; + +CollisionTile.prototype.getPlacementScale = function getPlacementScale (minPlacementScale, anchorPoint, box, blockingAnchorPoint, blocking) { + + // Find the lowest scale at which the two boxes can fit side by side without overlapping. + // Original algorithm: + var anchorDiffX = anchorPoint.x - blockingAnchorPoint.x; + var anchorDiffY = anchorPoint.y - blockingAnchorPoint.y; + var s1 = (blocking.x1 - box.x2) / anchorDiffX; // scale at which new box is to the left of old box + var s2 = (blocking.x2 - box.x1) / anchorDiffX; // scale at which new box is to the right of old box + var s3 = (blocking.y1 - box.y2) * this.yStretch / anchorDiffY; // scale at which new box is to the top of old box + var s4 = (blocking.y2 - box.y1) * this.yStretch / anchorDiffY; // scale at which new box is to the bottom of old box + + if (isNaN(s1) || isNaN(s2)) s1 = s2 = 1; + if (isNaN(s3) || isNaN(s4)) s3 = s4 = 1; + + var collisionFreeScale = Math.min(Math.max(s1, s2), Math.max(s3, s4)); + var blockingMaxScale = blocking.maxScale; + var boxMaxScale = box.maxScale; + + if (collisionFreeScale > blockingMaxScale) { + // After a box's maxScale the label has shrunk enough that the box is no longer needed to cover it, + // so unblock the new box at the scale that the old box disappears. + collisionFreeScale = blockingMaxScale; + } + + if (collisionFreeScale > boxMaxScale) { + // If the box can only be shown after it is visible, then the box can never be shown. + // But the label can be shown after this box is not visible. + collisionFreeScale = boxMaxScale; + } + + if (collisionFreeScale > minPlacementScale && + collisionFreeScale >= blocking.placementScale) { + // If this collision occurs at a lower scale than previously found collisions + // and the collision occurs while the other label is visible + + // this this is the lowest scale at which the label won't collide with anything + minPlacementScale = collisionFreeScale; + } + + return minPlacementScale; +}; + + +/** + * Remember this collisionFeature and what scale it was placed at to block + * later features from overlapping with it. + * + * @param {CollisionFeature} collisionFeature + * @param {number} minPlacementScale + * @private + */ +CollisionTile.prototype.insertCollisionFeature = function insertCollisionFeature (collisionFeature, minPlacementScale, ignorePlacement) { + var this$1 = this; + + + var grid = ignorePlacement ? this.ignoredGrid : this.grid; + var collisionBoxArray = this.collisionBoxArray; + + for (var k = collisionFeature.boxStartIndex; k < collisionFeature.boxEndIndex; k++) { + var box = collisionBoxArray.get(k); + box.placementScale = minPlacementScale; + if (minPlacementScale < this$1.maxScale) { + grid.insert(k, box.bbox0, box.bbox1, box.bbox2, box.bbox3); + } + } +}; + +module.exports = CollisionTile; + +},{"../data/extent":11,"../util/intersection_tests":122,"grid-index":150,"point-geometry":198}],81:[function(require,module,exports){ +'use strict'; + +var interpolate = require('../util/interpolate'); +var Anchor = require('../symbol/anchor'); +var checkMaxAngle = require('./check_max_angle'); + +module.exports = getAnchors; + +function getAnchors(line, spacing, maxAngle, shapedText, shapedIcon, glyphSize, boxScale, overscaling, tileExtent) { + + // Resample a line to get anchor points for labels and check that each + // potential label passes text-max-angle check and has enough froom to fit + // on the line. + + var angleWindowSize = shapedText ? + 3 / 5 * glyphSize * boxScale : + 0; + + var labelLength = Math.max( + shapedText ? shapedText.right - shapedText.left : 0, + shapedIcon ? shapedIcon.right - shapedIcon.left : 0); + + // Is the line continued from outside the tile boundary? + var isLineContinued = line[0].x === 0 || line[0].x === tileExtent || line[0].y === 0 || line[0].y === tileExtent; + + // Is the label long, relative to the spacing? + // If so, adjust the spacing so there is always a minimum space of `spacing / 4` between label edges. + if (spacing - labelLength * boxScale < spacing / 4) { + spacing = labelLength * boxScale + spacing / 4; + } + + // Offset the first anchor by: + // Either half the label length plus a fixed extra offset if the line is not continued + // Or half the spacing if the line is continued. + + // For non-continued lines, add a bit of fixed extra offset to avoid collisions at T intersections. + var fixedExtraOffset = glyphSize * 2; + + var offset = !isLineContinued ? + ((labelLength / 2 + fixedExtraOffset) * boxScale * overscaling) % spacing : + (spacing / 2 * overscaling) % spacing; + + return resample(line, offset, spacing, angleWindowSize, maxAngle, labelLength * boxScale, isLineContinued, false, tileExtent); +} + + +function resample(line, offset, spacing, angleWindowSize, maxAngle, labelLength, isLineContinued, placeAtMiddle, tileExtent) { + + var halfLabelLength = labelLength / 2; + var lineLength = 0; + for (var k = 0; k < line.length - 1; k++) { + lineLength += line[k].dist(line[k + 1]); + } + + var distance = 0, + markedDistance = offset - spacing; + + var anchors = []; + + for (var i = 0; i < line.length - 1; i++) { + + var a = line[i], + b = line[i + 1]; + + var segmentDist = a.dist(b), + angle = b.angleTo(a); + + while (markedDistance + spacing < distance + segmentDist) { + markedDistance += spacing; + + var t = (markedDistance - distance) / segmentDist, + x = interpolate(a.x, b.x, t), + y = interpolate(a.y, b.y, t); + + // Check that the point is within the tile boundaries and that + // the label would fit before the beginning and end of the line + // if placed at this point. + if (x >= 0 && x < tileExtent && y >= 0 && y < tileExtent && + markedDistance - halfLabelLength >= 0 && + markedDistance + halfLabelLength <= lineLength) { + var anchor = new Anchor(x, y, angle, i)._round(); + + if (!angleWindowSize || checkMaxAngle(line, anchor, labelLength, angleWindowSize, maxAngle)) { + anchors.push(anchor); + } + } + } + + distance += segmentDist; + } + + if (!placeAtMiddle && !anchors.length && !isLineContinued) { + // The first attempt at finding anchors at which labels can be placed failed. + // Try again, but this time just try placing one anchor at the middle of the line. + // This has the most effect for short lines in overscaled tiles, since the + // initial offset used in overscaled tiles is calculated to align labels with positions in + // parent tiles instead of placing the label as close to the beginning as possible. + anchors = resample(line, distance / 2, spacing, angleWindowSize, maxAngle, labelLength, isLineContinued, true, tileExtent); + } + + return anchors; +} + +},{"../symbol/anchor":75,"../util/interpolate":121,"./check_max_angle":76}],82:[function(require,module,exports){ +'use strict'; + +var ShelfPack = require('shelf-pack'); +var util = require('../util/util'); + +var SIZE_GROWTH_RATE = 4; +var DEFAULT_SIZE = 128; +// must be "DEFAULT_SIZE * SIZE_GROWTH_RATE ^ n" for some integer n +var MAX_SIZE = 2048; + +var GlyphAtlas = function GlyphAtlas() { + this.width = DEFAULT_SIZE; + this.height = DEFAULT_SIZE; + + this.bin = new ShelfPack(this.width, this.height); + this.index = {}; + this.ids = {}; + this.data = new Uint8Array(this.width * this.height); +}; + +GlyphAtlas.prototype.getGlyphs = function getGlyphs () { + var glyphs = {}; + var split, + name, + id; + + for (var key in this.ids) { + split = key.split('#'); + name = split[0]; + id = split[1]; + + if (!glyphs[name]) glyphs[name] = []; + glyphs[name].push(id); + } + + return glyphs; +}; + +GlyphAtlas.prototype.getRects = function getRects () { + var this$1 = this; + + var rects = {}; + var split, + name, + id; + + for (var key in this.ids) { + split = key.split('#'); + name = split[0]; + id = split[1]; + + if (!rects[name]) rects[name] = {}; + rects[name][id] = this$1.index[key]; + } + + return rects; +}; + +GlyphAtlas.prototype.addGlyph = function addGlyph (id, name, glyph, buffer) { + var this$1 = this; + + if (!glyph) return null; + + var key = name + "#" + (glyph.id); + + // The glyph is already in this texture. + if (this.index[key]) { + if (this.ids[key].indexOf(id) < 0) { + this.ids[key].push(id); + } + return this.index[key]; + } + + // The glyph bitmap has zero width. + if (!glyph.bitmap) { + return null; + } + + var bufferedWidth = glyph.width + buffer * 2; + var bufferedHeight = glyph.height + buffer * 2; + + // Add a 1px border around every image. + var padding = 1; + var packWidth = bufferedWidth + 2 * padding; + var packHeight = bufferedHeight + 2 * padding; + + // Increase to next number divisible by 4, but at least 1. + // This is so we can scale down the texture coordinates and pack them + // into fewer bytes. + packWidth += (4 - packWidth % 4); + packHeight += (4 - packHeight % 4); + + var rect = this.bin.packOne(packWidth, packHeight); + if (!rect) { + this.resize(); + rect = this.bin.packOne(packWidth, packHeight); + } + if (!rect) { + util.warnOnce('glyph bitmap overflow'); + return null; + } + + this.index[key] = rect; + this.ids[key] = [id]; + + var target = this.data; + var source = glyph.bitmap; + for (var y = 0; y < bufferedHeight; y++) { + var y1 = this$1.width * (rect.y + y + padding) + rect.x + padding; + var y2 = bufferedWidth * y; + for (var x = 0; x < bufferedWidth; x++) { + target[y1 + x] = source[y2 + x]; + } + } + + this.dirty = true; + + return rect; +}; + +GlyphAtlas.prototype.resize = function resize () { + var this$1 = this; + + var prevWidth = this.width; + var prevHeight = this.height; + + if (prevWidth >= MAX_SIZE || prevHeight >= MAX_SIZE) return; + + if (this.texture) { + if (this.gl) { + this.gl.deleteTexture(this.texture); + } + this.texture = null; + } + + this.width *= SIZE_GROWTH_RATE; + this.height *= SIZE_GROWTH_RATE; + this.bin.resize(this.width, this.height); + + var buf = new ArrayBuffer(this.width * this.height); + for (var i = 0; i < prevHeight; i++) { + var src = new Uint8Array(this$1.data.buffer, prevHeight * i, prevWidth); + var dst = new Uint8Array(buf, prevHeight * i * SIZE_GROWTH_RATE, prevWidth); + dst.set(src); + } + this.data = new Uint8Array(buf); +}; + +GlyphAtlas.prototype.bind = function bind (gl) { + this.gl = gl; + if (!this.texture) { + this.texture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.texture); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.ALPHA, this.width, this.height, 0, gl.ALPHA, gl.UNSIGNED_BYTE, null); + + } else { + gl.bindTexture(gl.TEXTURE_2D, this.texture); + } +}; + +GlyphAtlas.prototype.updateTexture = function updateTexture (gl) { + this.bind(gl); + if (this.dirty) { + gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, this.width, this.height, gl.ALPHA, gl.UNSIGNED_BYTE, this.data); + this.dirty = false; + } +}; + +module.exports = GlyphAtlas; + +},{"../util/util":129,"shelf-pack":201}],83:[function(require,module,exports){ +'use strict'; + +var normalizeURL = require('../util/mapbox').normalizeGlyphsURL; +var ajax = require('../util/ajax'); +var verticalizePunctuation = require('../util/verticalize_punctuation'); +var Glyphs = require('../util/glyphs'); +var GlyphAtlas = require('../symbol/glyph_atlas'); +var Protobuf = require('pbf'); + +// A simplified representation of the glyph containing only the properties needed for shaping. +var SimpleGlyph = function SimpleGlyph(glyph, rect, buffer) { + var padding = 1; + this.advance = glyph.advance; + this.left = glyph.left - buffer - padding; + this.top = glyph.top + buffer + padding; + this.rect = rect; +}; + +/** + * A glyph source has a URL from which to load new glyphs and manages + * GlyphAtlases in which to store glyphs used by the requested fontstacks + * and ranges. + * + * @private + */ +var GlyphSource = function GlyphSource(url) { + this.url = url && normalizeURL(url); + this.atlases = {}; + this.stacks = {}; + this.loading = {}; +}; + +GlyphSource.prototype.getSimpleGlyphs = function getSimpleGlyphs (fontstack, glyphIDs, uid, callback) { + var this$1 = this; + + if (this.stacks[fontstack] === undefined) { + this.stacks[fontstack] = {}; + } + if (this.atlases[fontstack] === undefined) { + this.atlases[fontstack] = new GlyphAtlas(); + } + + var glyphs = {}; + var stack = this.stacks[fontstack]; + var atlas = this.atlases[fontstack]; + + // the number of pixels the sdf bitmaps are padded by + var buffer = 3; + + var missing = {}; + var remaining = 0; + + var getGlyph = function (glyphID) { + var range = Math.floor(glyphID / 256); + + if (stack[range]) { + var glyph = stack[range].glyphs[glyphID]; + var rect = atlas.addGlyph(uid, fontstack, glyph, buffer); + if (glyph) glyphs[glyphID] = new SimpleGlyph(glyph, rect, buffer); + } else { + if (missing[range] === undefined) { + missing[range] = []; + remaining++; + } + missing[range].push(glyphID); + } + }; + + for (var i = 0; i < glyphIDs.length; i++) { + var glyphID = glyphIDs[i]; + var string = String.fromCharCode(glyphID); + getGlyph(glyphID); + if (verticalizePunctuation.lookup[string]) { + getGlyph(verticalizePunctuation.lookup[string].charCodeAt(0)); + } + } + + if (!remaining) callback(undefined, glyphs, fontstack); + + var onRangeLoaded = function (err, range, data) { + if (!err) { + var stack = this$1.stacks[fontstack][range] = data.stacks[0]; + for (var i = 0; i < missing[range].length; i++) { + var glyphID = missing[range][i]; + var glyph = stack.glyphs[glyphID]; + var rect = atlas.addGlyph(uid, fontstack, glyph, buffer); + if (glyph) glyphs[glyphID] = new SimpleGlyph(glyph, rect, buffer); + } + } + remaining--; + if (!remaining) callback(undefined, glyphs, fontstack); + }; + + for (var r in missing) { + this$1.loadRange(fontstack, r, onRangeLoaded); + } +}; + +GlyphSource.prototype.loadRange = function loadRange (fontstack, range, callback) { + if (range * 256 > 65535) return callback('glyphs > 65535 not supported'); + + if (this.loading[fontstack] === undefined) { + this.loading[fontstack] = {}; + } + var loading = this.loading[fontstack]; + + if (loading[range]) { + loading[range].push(callback); + } else { + loading[range] = [callback]; + + var rangeName = (range * 256) + "-" + (range * 256 + 255); + var url = glyphUrl(fontstack, rangeName, this.url); + + ajax.getArrayBuffer(url, function (err, response) { + var glyphs = !err && new Glyphs(new Protobuf(response.data)); + for (var i = 0; i < loading[range].length; i++) { + loading[range][i](err, range, glyphs); + } + delete loading[range]; + }); + } +}; + +GlyphSource.prototype.getGlyphAtlas = function getGlyphAtlas (fontstack) { + return this.atlases[fontstack]; +}; + +/** + * Use CNAME sharding to load a specific glyph range over a randomized + * but consistent subdomain. + * @param {string} fontstack comma-joined fonts + * @param {string} range comma-joined range + * @param {url} url templated url + * @param {string} [subdomains=abc] subdomains as a string where each letter is one. + * @returns {string} a url to load that section of glyphs + * @private + */ +function glyphUrl(fontstack, range, url, subdomains) { + subdomains = subdomains || 'abc'; + + return url + .replace('{s}', subdomains[fontstack.length % subdomains.length]) + .replace('{fontstack}', fontstack) + .replace('{range}', range); +} + +module.exports = GlyphSource; + +},{"../symbol/glyph_atlas":82,"../util/ajax":109,"../util/glyphs":120,"../util/mapbox":125,"../util/verticalize_punctuation":131,"pbf":197}],84:[function(require,module,exports){ +'use strict'; + +module.exports = function (features) { + var leftIndex = {}; + var rightIndex = {}; + var mergedFeatures = []; + var mergedIndex = 0; + + function add(k) { + mergedFeatures.push(features[k]); + mergedIndex++; + } + + function mergeFromRight(leftKey, rightKey, geom) { + var i = rightIndex[leftKey]; + delete rightIndex[leftKey]; + rightIndex[rightKey] = i; + + mergedFeatures[i].geometry[0].pop(); + mergedFeatures[i].geometry[0] = mergedFeatures[i].geometry[0].concat(geom[0]); + return i; + } + + function mergeFromLeft(leftKey, rightKey, geom) { + var i = leftIndex[rightKey]; + delete leftIndex[rightKey]; + leftIndex[leftKey] = i; + + mergedFeatures[i].geometry[0].shift(); + mergedFeatures[i].geometry[0] = geom[0].concat(mergedFeatures[i].geometry[0]); + return i; + } + + function getKey(text, geom, onRight) { + var point = onRight ? geom[0][geom[0].length - 1] : geom[0][0]; + return (text + ":" + (point.x) + ":" + (point.y)); + } + + for (var k = 0; k < features.length; k++) { + var feature = features[k]; + var geom = feature.geometry; + var text = feature.text; + + if (!text) { + add(k); + continue; + } + + var leftKey = getKey(text, geom), + rightKey = getKey(text, geom, true); + + if ((leftKey in rightIndex) && (rightKey in leftIndex) && (rightIndex[leftKey] !== leftIndex[rightKey])) { + // found lines with the same text adjacent to both ends of the current line, merge all three + var j = mergeFromLeft(leftKey, rightKey, geom); + var i = mergeFromRight(leftKey, rightKey, mergedFeatures[j].geometry); + + delete leftIndex[leftKey]; + delete rightIndex[rightKey]; + + rightIndex[getKey(text, mergedFeatures[i].geometry, true)] = i; + mergedFeatures[j].geometry = null; + + } else if (leftKey in rightIndex) { + // found mergeable line adjacent to the start of the current line, merge + mergeFromRight(leftKey, rightKey, geom); + + } else if (rightKey in leftIndex) { + // found mergeable line adjacent to the end of the current line, merge + mergeFromLeft(leftKey, rightKey, geom); + + } else { + // no adjacent lines, add as a new item + add(k); + leftIndex[leftKey] = mergedIndex - 1; + rightIndex[rightKey] = mergedIndex - 1; + } + } + + return mergedFeatures.filter(function (f) { return f.geometry; }); +}; + +},{}],85:[function(require,module,exports){ +'use strict'; + +var Point = require('point-geometry'); + +module.exports = { + getIconQuads: getIconQuads, + getGlyphQuads: getGlyphQuads, + SymbolQuad: SymbolQuad +}; + +var minScale = 0.5; // underscale by 1 zoom level + +/** + * A textured quad for rendering a single icon or glyph. + * + * The zoom range the glyph can be shown is defined by minScale and maxScale. + * + * @param {Point} anchorPoint the point the symbol is anchored around + * @param {Point} tl The offset of the top left corner from the anchor. + * @param {Point} tr The offset of the top right corner from the anchor. + * @param {Point} bl The offset of the bottom left corner from the anchor. + * @param {Point} br The offset of the bottom right corner from the anchor. + * @param {Object} tex The texture coordinates. + * @param {number} anchorAngle The angle of the label at it's center, not the angle of this quad. + * @param {number} glyphAngle The angle of the glyph to be positioned in the quad. + * @param {number} minScale The minimum scale, relative to the tile's intended scale, that the glyph can be shown at. + * @param {number} maxScale The maximum scale, relative to the tile's intended scale, that the glyph can be shown at. + * + * @class SymbolQuad + * @private + */ +function SymbolQuad(anchorPoint, tl, tr, bl, br, tex, anchorAngle, glyphAngle, minScale, maxScale, writingMode) { + this.anchorPoint = anchorPoint; + this.tl = tl; + this.tr = tr; + this.bl = bl; + this.br = br; + this.tex = tex; + this.anchorAngle = anchorAngle; + this.glyphAngle = glyphAngle; + this.minScale = minScale; + this.maxScale = maxScale; + this.writingMode = writingMode; +} + +/** + * Create the quads used for rendering an icon. + * + * @param {Anchor} anchor + * @param {PositionedIcon} shapedIcon + * @param {number} boxScale A magic number for converting glyph metric units to geometry units. + * @param {Array>} line + * @param {StyleLayer} layer + * @param {boolean} alongLine Whether the icon should be placed along the line. + * @param {Shaping} shapedText Shaping for corresponding text + * @returns {Array} + * @private + */ +function getIconQuads(anchor, shapedIcon, boxScale, line, layer, alongLine, shapedText, globalProperties, featureProperties) { + var rect = shapedIcon.image.rect; + var layout = layer.layout; + + var border = 1; + var left = shapedIcon.left - border; + var right = left + rect.w / shapedIcon.image.pixelRatio; + var top = shapedIcon.top - border; + var bottom = top + rect.h / shapedIcon.image.pixelRatio; + var tl, tr, br, bl; + + // text-fit mode + if (layout['icon-text-fit'] !== 'none' && shapedText) { + var iconWidth = (right - left), + iconHeight = (bottom - top), + size = layout['text-size'] / 24, + textLeft = shapedText.left * size, + textRight = shapedText.right * size, + textTop = shapedText.top * size, + textBottom = shapedText.bottom * size, + textWidth = textRight - textLeft, + textHeight = textBottom - textTop, + padT = layout['icon-text-fit-padding'][0], + padR = layout['icon-text-fit-padding'][1], + padB = layout['icon-text-fit-padding'][2], + padL = layout['icon-text-fit-padding'][3], + offsetY = layout['icon-text-fit'] === 'width' ? (textHeight - iconHeight) * 0.5 : 0, + offsetX = layout['icon-text-fit'] === 'height' ? (textWidth - iconWidth) * 0.5 : 0, + width = layout['icon-text-fit'] === 'width' || layout['icon-text-fit'] === 'both' ? textWidth : iconWidth, + height = layout['icon-text-fit'] === 'height' || layout['icon-text-fit'] === 'both' ? textHeight : iconHeight; + tl = new Point(textLeft + offsetX - padL, textTop + offsetY - padT); + tr = new Point(textLeft + offsetX + padR + width, textTop + offsetY - padT); + br = new Point(textLeft + offsetX + padR + width, textTop + offsetY + padB + height); + bl = new Point(textLeft + offsetX - padL, textTop + offsetY + padB + height); + // Normal icon size mode + } else { + tl = new Point(left, top); + tr = new Point(right, top); + br = new Point(right, bottom); + bl = new Point(left, bottom); + } + + var angle = layer.getLayoutValue('icon-rotate', globalProperties, featureProperties) * Math.PI / 180; + if (alongLine) { + var prev = line[anchor.segment]; + if (anchor.y === prev.y && anchor.x === prev.x && anchor.segment + 1 < line.length) { + var next = line[anchor.segment + 1]; + angle += Math.atan2(anchor.y - next.y, anchor.x - next.x) + Math.PI; + } else { + angle += Math.atan2(anchor.y - prev.y, anchor.x - prev.x); + } + } + + if (angle) { + var sin = Math.sin(angle), + cos = Math.cos(angle), + matrix = [cos, -sin, sin, cos]; + + tl = tl.matMult(matrix); + tr = tr.matMult(matrix); + bl = bl.matMult(matrix); + br = br.matMult(matrix); + } + + return [new SymbolQuad(new Point(anchor.x, anchor.y), tl, tr, bl, br, shapedIcon.image.rect, 0, 0, minScale, Infinity)]; +} + +/** + * Create the quads used for rendering a text label. + * + * @param {Anchor} anchor + * @param {Shaping} shaping + * @param {number} boxScale A magic number for converting from glyph metric units to geometry units. + * @param {Array>} line + * @param {StyleLayer} layer + * @param {boolean} alongLine Whether the label should be placed along the line. + * @returns {Array} + * @private + */ +function getGlyphQuads(anchor, shaping, boxScale, line, layer, alongLine) { + + var textRotate = layer.layout['text-rotate'] * Math.PI / 180; + var keepUpright = layer.layout['text-keep-upright']; + + var positionedGlyphs = shaping.positionedGlyphs; + var quads = []; + + for (var k = 0; k < positionedGlyphs.length; k++) { + var positionedGlyph = positionedGlyphs[k]; + var glyph = positionedGlyph.glyph; + if (!glyph) continue; + + var rect = glyph.rect; + if (!rect) continue; + + var centerX = (positionedGlyph.x + glyph.advance / 2) * boxScale; + + var glyphInstances; + var labelMinScale = minScale; + if (alongLine) { + glyphInstances = []; + labelMinScale = getSegmentGlyphs(glyphInstances, anchor, centerX, line, anchor.segment, true); + if (keepUpright) { + labelMinScale = Math.min(labelMinScale, getSegmentGlyphs(glyphInstances, anchor, centerX, line, anchor.segment, false)); + } + + } else { + glyphInstances = [{ + anchorPoint: new Point(anchor.x, anchor.y), + offset: 0, + angle: 0, + maxScale: Infinity, + minScale: minScale + }]; + } + + var x1 = positionedGlyph.x + glyph.left; + var y1 = positionedGlyph.y - glyph.top; + var x2 = x1 + rect.w; + var y2 = y1 + rect.h; + + var center = new Point(positionedGlyph.x, glyph.advance / 2); + + var otl = new Point(x1, y1); + var otr = new Point(x2, y1); + var obl = new Point(x1, y2); + var obr = new Point(x2, y2); + + if (positionedGlyph.angle !== 0) { + otl._sub(center)._rotate(positionedGlyph.angle)._add(center); + otr._sub(center)._rotate(positionedGlyph.angle)._add(center); + obl._sub(center)._rotate(positionedGlyph.angle)._add(center); + obr._sub(center)._rotate(positionedGlyph.angle)._add(center); + } + + for (var i = 0; i < glyphInstances.length; i++) { + + var instance = glyphInstances[i]; + var tl = otl, + tr = otr, + bl = obl, + br = obr; + + if (textRotate) { + var sin = Math.sin(textRotate), + cos = Math.cos(textRotate), + matrix = [cos, -sin, sin, cos]; + + tl = tl.matMult(matrix); + tr = tr.matMult(matrix); + bl = bl.matMult(matrix); + br = br.matMult(matrix); + } + + // Prevent label from extending past the end of the line + var glyphMinScale = Math.max(instance.minScale, labelMinScale); + + var anchorAngle = (anchor.angle + instance.offset + 2 * Math.PI) % (2 * Math.PI); + var glyphAngle = (instance.angle + instance.offset + 2 * Math.PI) % (2 * Math.PI); + quads.push(new SymbolQuad(instance.anchorPoint, tl, tr, bl, br, rect, anchorAngle, glyphAngle, glyphMinScale, instance.maxScale, shaping.writingMode)); + } + } + + return quads; +} + +/** + * We can only render glyph quads that slide along a straight line. To draw + * curved lines we need an instance of a glyph for each segment it appears on. + * This creates all the instances of a glyph that are necessary to render a label. + * + * We need a + * @param {Array} glyphInstances An empty array that glyphInstances are added to. + * @param {Anchor} anchor + * @param {number} offset The glyph's offset from the center of the label. + * @param {Array} line + * @param {number} segment The index of the segment of the line on which the anchor exists. + * @param {boolean} forward If true get the glyphs that come later on the line, otherwise get the glyphs that come earlier. + * + * @returns {Array} glyphInstances + * @private + */ +function getSegmentGlyphs(glyphs, anchor, offset, line, segment, forward) { + var upsideDown = !forward; + + if (offset < 0) forward = !forward; + + if (forward) segment++; + + var newAnchorPoint = new Point(anchor.x, anchor.y); + var end = line[segment]; + var prevScale = Infinity; + + offset = Math.abs(offset); + + var placementScale = minScale; + + while (true) { + var distance = newAnchorPoint.dist(end); + var scale = offset / distance; + + // Get the angle of the line segment + var angle = Math.atan2(end.y - newAnchorPoint.y, end.x - newAnchorPoint.x); + if (!forward) angle += Math.PI; + + glyphs.push({ + anchorPoint: newAnchorPoint, + offset: upsideDown ? Math.PI : 0, + minScale: scale, + maxScale: prevScale, + angle: (angle + 2 * Math.PI) % (2 * Math.PI) + }); + + if (scale <= placementScale) break; + + newAnchorPoint = end; + + // skip duplicate nodes + while (newAnchorPoint.equals(end)) { + segment += forward ? 1 : -1; + end = line[segment]; + if (!end) { + return scale; + } + } + + var unit = end.sub(newAnchorPoint)._unit(); + newAnchorPoint = newAnchorPoint.sub(unit._mult(distance)); + + prevScale = scale; + } + + return placementScale; +} + +},{"point-geometry":198}],86:[function(require,module,exports){ +'use strict'; + +var resolveTokens = require('../util/token'); + +module.exports = function resolveText(feature, layout) { + var text = resolveTokens(feature.properties, layout['text-field']); + if (!text) { + return; + } + text = text.toString(); + + var transform = layout['text-transform']; + if (transform === 'uppercase') { + text = text.toLocaleUpperCase(); + } else if (transform === 'lowercase') { + text = text.toLocaleLowerCase(); + } + + return text; +}; + +},{"../util/token":128}],87:[function(require,module,exports){ +'use strict'; + +var scriptDetection = require('../util/script_detection'); +var verticalizePunctuation = require('../util/verticalize_punctuation'); +var rtlTextPlugin = require('../source/rtl_text_plugin'); + +var WritingMode = { + horizontal: 1, + vertical: 2 +}; + +module.exports = { + shapeText: shapeText, + shapeIcon: shapeIcon, + WritingMode: WritingMode +}; + + +// The position of a glyph relative to the text's anchor point. +function PositionedGlyph(codePoint, x, y, glyph, angle) { + this.codePoint = codePoint; + this.x = x; + this.y = y; + this.glyph = glyph || null; + this.angle = angle; +} + +// A collection of positioned glyphs and some metadata +function Shaping(positionedGlyphs, text, top, bottom, left, right, writingMode) { + this.positionedGlyphs = positionedGlyphs; + this.text = text; + this.top = top; + this.bottom = bottom; + this.left = left; + this.right = right; + this.writingMode = writingMode; +} + +function breakLines(text, lineBreakPoints) { + var lines = []; + var start = 0; + for (var i = 0, list = lineBreakPoints; i < list.length; i += 1) { + var lineBreak = list[i]; + + lines.push(text.substring(start, lineBreak)); + start = lineBreak; + } + + if (start < text.length) { + lines.push(text.substring(start, text.length)); + } + return lines; +} + +function shapeText(text, glyphs, maxWidth, lineHeight, horizontalAlign, verticalAlign, justify, spacing, translate, verticalHeight, writingMode) { + var logicalInput = text.trim(); + if (writingMode === WritingMode.vertical) logicalInput = verticalizePunctuation(logicalInput); + + var positionedGlyphs = []; + var shaping = new Shaping(positionedGlyphs, logicalInput, translate[1], translate[1], translate[0], translate[0], writingMode); + + var lines; + if (rtlTextPlugin.processBidirectionalText) { + lines = rtlTextPlugin.processBidirectionalText(logicalInput, determineLineBreaks(logicalInput, spacing, maxWidth, glyphs)); + } else { + lines = breakLines(logicalInput, determineLineBreaks(logicalInput, spacing, maxWidth, glyphs)); + } + + shapeLines(shaping, glyphs, lines, lineHeight, horizontalAlign, verticalAlign, justify, translate, writingMode, spacing, verticalHeight); + + if (!positionedGlyphs.length) + return false; + + return shaping; +} + +var whitespace = { + 0x09: true, // tab + 0x0a: true, // newline + 0x0b: true, // vertical tab + 0x0c: true, // form feed + 0x0d: true, // carriage return + 0x20: true, // space +}; + +var breakable = { + 0x0a: true, // newline + 0x20: true, // space + 0x26: true, // ampersand + 0x28: true, // left parenthesis + 0x29: true, // right parenthesis + 0x2b: true, // plus sign + 0x2d: true, // hyphen-minus + 0x2f: true, // solidus + 0xad: true, // soft hyphen + 0xb7: true, // middle dot + 0x200b: true, // zero-width space + 0x2010: true, // hyphen + 0x2013: true, // en dash + 0x2027: true // interpunct + // Many other characters may be reasonable breakpoints + // Consider "neutral orientation" characters at scriptDetection.charHasNeutralVerticalOrientation + // See https://github.com/mapbox/mapbox-gl-js/issues/3658 +}; + +function determineAverageLineWidth(logicalInput, spacing, maxWidth, glyphs) { + var totalWidth = 0; + + for (var index in logicalInput) { + var glyph = glyphs[logicalInput.charCodeAt(index)]; + if (!glyph) + continue; + totalWidth += glyph.advance + spacing; + } + + var lineCount = Math.max(1, Math.ceil(totalWidth / maxWidth)); + return totalWidth / lineCount; +} + +function calculateBadness(lineWidth, targetWidth, penalty, isLastBreak) { + var raggedness = Math.pow(lineWidth - targetWidth, 2); + if (isLastBreak) { + // Favor finals lines shorter than average over longer than average + if (lineWidth < targetWidth) { + return raggedness / 2; + } else { + return raggedness * 2; + } + } + + return raggedness + Math.abs(penalty) * penalty; +} + +function calculatePenalty(codePoint, nextCodePoint) { + var penalty = 0; + // Force break on newline + if (codePoint === 0x0a) { + penalty -= 10000; + } + // Penalize open parenthesis at end of line + if (codePoint === 0x28 || codePoint === 0xff08) { + penalty += 50; + } + + // Penalize close parenthesis at beginning of line + if (nextCodePoint === 0x29 || nextCodePoint === 0xff09) { + penalty += 50; + } + return penalty; +} + +function evaluateBreak(breakIndex, breakX, targetWidth, potentialBreaks, penalty, isLastBreak) { + // We could skip evaluating breaks where the line length (breakX - priorBreak.x) > maxWidth + // ...but in fact we allow lines longer than maxWidth (if there's no break points) + // ...and when targetWidth and maxWidth are close, strictly enforcing maxWidth can give + // more lopsided results. + + var bestPriorBreak = null; + var bestBreakBadness = calculateBadness(breakX, targetWidth, penalty, isLastBreak); + + for (var i = 0, list = potentialBreaks; i < list.length; i += 1) { + var potentialBreak = list[i]; + + var lineWidth = breakX - potentialBreak.x; + var breakBadness = + calculateBadness(lineWidth, targetWidth, penalty, isLastBreak) + potentialBreak.badness; + if (breakBadness <= bestBreakBadness) { + bestPriorBreak = potentialBreak; + bestBreakBadness = breakBadness; + } + } + + return { + index: breakIndex, + x: breakX, + priorBreak: bestPriorBreak, + badness: bestBreakBadness + }; +} + +function leastBadBreaks(lastLineBreak) { + if (!lastLineBreak) { + return []; + } + return leastBadBreaks(lastLineBreak.priorBreak).concat(lastLineBreak.index); +} + +function determineLineBreaks(logicalInput, spacing, maxWidth, glyphs) { + if (!maxWidth) + return []; + + if (!logicalInput) + return []; + + var potentialLineBreaks = []; + var targetWidth = determineAverageLineWidth(logicalInput, spacing, maxWidth, glyphs); + + var currentX = 0; + + for (var i = 0; i < logicalInput.length; i++) { + var codePoint = logicalInput.charCodeAt(i); + var glyph = glyphs[codePoint]; + + if (glyph && !whitespace[codePoint]) + currentX += glyph.advance + spacing; + + // Ideographic characters, spaces, and word-breaking punctuation that often appear without + // surrounding spaces. + if ((i < logicalInput.length - 1) && + (breakable[codePoint] || + scriptDetection.charAllowsIdeographicBreaking(codePoint))) { + + potentialLineBreaks.push( + evaluateBreak( + i + 1, + currentX, + targetWidth, + potentialLineBreaks, + calculatePenalty(codePoint, logicalInput.charCodeAt(i + 1)), + false)); + } + + + } + + return leastBadBreaks( + evaluateBreak( + logicalInput.length, + currentX, + targetWidth, + potentialLineBreaks, + 0, + true)); +} + +function shapeLines(shaping, glyphs, lines, lineHeight, horizontalAlign, verticalAlign, justify, translate, writingMode, spacing, verticalHeight) { + // the y offset *should* be part of the font metadata + var yOffset = -17; + + var x = 0; + var y = yOffset; + + var maxLineLength = 0; + var positionedGlyphs = shaping.positionedGlyphs; + + for (var i in lines) { + var line = lines[i].trim(); + + if (!line.length) { + y += lineHeight; // Still need a line feed after empty line + continue; + } + + var lineStartIndex = positionedGlyphs.length; + for (var i$1 = 0; i$1 < line.length; i$1++) { + var codePoint = line.charCodeAt(i$1); + var glyph = glyphs[codePoint]; + + if (!glyph) continue; + + if (!scriptDetection.charHasUprightVerticalOrientation(codePoint) || writingMode === WritingMode.horizontal) { + positionedGlyphs.push(new PositionedGlyph(codePoint, x, y, glyph, 0)); + x += glyph.advance + spacing; + } else { + positionedGlyphs.push(new PositionedGlyph(codePoint, x, 0, glyph, -Math.PI / 2)); + x += verticalHeight + spacing; + } + } + + // Only justify if we placed at least one glyph + if (positionedGlyphs.length !== lineStartIndex) { + var lineLength = x - spacing; + maxLineLength = Math.max(lineLength, maxLineLength); + + justifyLine(positionedGlyphs, glyphs, lineStartIndex, positionedGlyphs.length - 1, justify); + } + + x = 0; + y += lineHeight; + } + + align(positionedGlyphs, justify, horizontalAlign, verticalAlign, maxLineLength, lineHeight, lines.length, translate); + + // Calculate the bounding box + var height = lines.length * lineHeight; + + shaping.top += -verticalAlign * height; + shaping.bottom = shaping.top + height; + shaping.left += -horizontalAlign * maxLineLength; + shaping.right = shaping.left + maxLineLength; +} + +// justify left = 0, right = 1, center = .5 +function justifyLine(positionedGlyphs, glyphs, start, end, justify) { + if (!justify) + return; + + var lastAdvance = glyphs[positionedGlyphs[end].codePoint].advance; + var lineIndent = (positionedGlyphs[end].x + lastAdvance) * justify; + + for (var j = start; j <= end; j++) { + positionedGlyphs[j].x -= lineIndent; + } +} + +function align(positionedGlyphs, justify, horizontalAlign, verticalAlign, maxLineLength, lineHeight, lineCount, translate) { + var shiftX = (justify - horizontalAlign) * maxLineLength + translate[0]; + var shiftY = (-verticalAlign * lineCount + 0.5) * lineHeight + translate[1]; + + for (var j = 0; j < positionedGlyphs.length; j++) { + positionedGlyphs[j].x += shiftX; + positionedGlyphs[j].y += shiftY; + } +} + +function shapeIcon(image, iconOffset) { + if (!image || !image.rect) return null; + + var dx = iconOffset[0]; + var dy = iconOffset[1]; + var x1 = dx - image.width / 2; + var x2 = x1 + image.width; + var y1 = dy - image.height / 2; + var y2 = y1 + image.height; + + return new PositionedIcon(image, y1, y2, x1, x2); +} + +function PositionedIcon(image, top, bottom, left, right) { + this.image = image; + this.top = top; + this.bottom = bottom; + this.left = left; + this.right = right; +} + +},{"../source/rtl_text_plugin":49,"../util/script_detection":126,"../util/verticalize_punctuation":131}],88:[function(require,module,exports){ +'use strict'; + +var ShelfPack = require('shelf-pack'); +var browser = require('../util/browser'); +var util = require('../util/util'); + +var AtlasImage = function AtlasImage(rect, width, height, sdf, pixelRatio) { + this.rect = rect; + this.width = width; + this.height = height; + this.sdf = sdf; + this.pixelRatio = pixelRatio; +}; + +var SpriteAtlas = function SpriteAtlas(width, height) { + this.width = width; + this.height = height; + + this.bin = new ShelfPack(width, height); + this.images = {}; + this.data = false; + this.texture = 0; // WebGL ID + this.filter = 0; // WebGL ID + this.pixelRatio = 1; + this.dirty = true; +}; + +SpriteAtlas.prototype.allocateImage = function allocateImage (pixelWidth, pixelHeight) { + pixelWidth = pixelWidth / this.pixelRatio; + pixelHeight = pixelHeight / this.pixelRatio; + + // Increase to next number divisible by 4, but at least 1. + // This is so we can scale down the texture coordinates and pack them + // into 2 bytes rather than 4 bytes. + // Pad icons to prevent them from polluting neighbours during linear interpolation + var padding = 2; + var packWidth = pixelWidth + padding + (4 - (pixelWidth + padding) % 4); + var packHeight = pixelHeight + padding + (4 - (pixelHeight + padding) % 4);// + 4; + + var rect = this.bin.packOne(packWidth, packHeight); + if (!rect) { + util.warnOnce('SpriteAtlas out of space.'); + return null; + } + + return rect; +}; + +SpriteAtlas.prototype.getImage = function getImage (name, wrap) { + if (this.images[name]) { + return this.images[name]; + } + + if (!this.sprite) { + return null; + } + + var pos = this.sprite.getSpritePosition(name); + if (!pos.width || !pos.height) { + return null; + } + + var rect = this.allocateImage(pos.width, pos.height); + if (!rect) { + return null; + } + + var image = new AtlasImage(rect, pos.width / pos.pixelRatio, pos.height / pos.pixelRatio, pos.sdf, pos.pixelRatio / this.pixelRatio); + this.images[name] = image; + + this.copy(rect, pos, wrap); + + return image; +}; + +// Return position of a repeating fill pattern. +SpriteAtlas.prototype.getPosition = function getPosition (name, repeating) { + var image = this.getImage(name, repeating); + var rect = image && image.rect; + + if (!rect) { + return null; + } + + var width = image.width * image.pixelRatio; + var height = image.height * image.pixelRatio; + var padding = 1; + + return { + size: [image.width, image.height], + tl: [(rect.x + padding) / this.width, (rect.y + padding) / this.height], + br: [(rect.x + padding + width) / this.width, (rect.y + padding + height) / this.height] + }; +}; + +SpriteAtlas.prototype.allocate = function allocate () { + var this$1 = this; + + if (!this.data) { + var w = Math.floor(this.width * this.pixelRatio); + var h = Math.floor(this.height * this.pixelRatio); + this.data = new Uint32Array(w * h); + for (var i = 0; i < this.data.length; i++) { + this$1.data[i] = 0; + } + } +}; + +SpriteAtlas.prototype.copy = function copy (dst, src, wrap) { + if (!this.sprite.imgData) return; + var srcImg = new Uint32Array(this.sprite.imgData.buffer); + + this.allocate(); + var dstImg = this.data; + + var padding = 1; + + copyBitmap( + /* source buffer */ srcImg, + /* source stride */ this.sprite.width, + /* source x */ src.x, + /* source y */ src.y, + /* dest buffer */dstImg, + /* dest stride */this.width * this.pixelRatio, + /* dest x */ (dst.x + padding) * this.pixelRatio, + /* dest y */ (dst.y + padding) * this.pixelRatio, + /* icon dimension */ src.width, + /* icon dimension */ src.height, + /* wrap */ wrap + ); + + this.dirty = true; +}; + +SpriteAtlas.prototype.setSprite = function setSprite (sprite) { + if (sprite) { + this.pixelRatio = browser.devicePixelRatio > 1 ? 2 : 1; + + if (this.canvas) { + this.canvas.width = this.width * this.pixelRatio; + this.canvas.height = this.height * this.pixelRatio; + } + } + this.sprite = sprite; +}; + +SpriteAtlas.prototype.addIcons = function addIcons (icons, callback) { + var this$1 = this; + + for (var i = 0; i < icons.length; i++) { + this$1.getImage(icons[i]); + } + + callback(null, this.images); +}; + +SpriteAtlas.prototype.bind = function bind (gl, linear) { + var first = false; + if (!this.texture) { + this.texture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.texture); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + first = true; + } else { + gl.bindTexture(gl.TEXTURE_2D, this.texture); + } + + var filterVal = linear ? gl.LINEAR : gl.NEAREST; + if (filterVal !== this.filter) { + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filterVal); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filterVal); + this.filter = filterVal; + } + + if (this.dirty) { + this.allocate(); + + if (first) { + gl.texImage2D( + gl.TEXTURE_2D, // enum target + 0, // ind level + gl.RGBA, // ind internalformat + this.width * this.pixelRatio, // GLsizei width + this.height * this.pixelRatio, // GLsizei height + 0, // ind border + gl.RGBA, // enum format + gl.UNSIGNED_BYTE, // enum type + new Uint8Array(this.data.buffer) // Object data + ); + } else { + gl.texSubImage2D( + gl.TEXTURE_2D, // enum target + 0, // int level + 0, // int xoffset + 0, // int yoffset + this.width * this.pixelRatio, // long width + this.height * this.pixelRatio, // long height + gl.RGBA, // enum format + gl.UNSIGNED_BYTE, // enum type + new Uint8Array(this.data.buffer) // Object pixels + ); + } + + this.dirty = false; + } +}; + +module.exports = SpriteAtlas; + +function copyBitmap(src, srcStride, srcX, srcY, dst, dstStride, dstX, dstY, width, height, wrap) { + var srcI = srcY * srcStride + srcX; + var dstI = dstY * dstStride + dstX; + var x, y; + + if (wrap) { + // add 1 pixel wrapped padding on each side of the image + dstI -= dstStride; + for (y = -1; y <= height; y++, srcI = ((y + height) % height + srcY) * srcStride + srcX, dstI += dstStride) { + for (x = -1; x <= width; x++) { + dst[dstI + x] = src[srcI + ((x + width) % width)]; + } + } + + } else { + for (y = 0; y < height; y++, srcI += srcStride, dstI += dstStride) { + for (x = 0; x < width; x++) { + dst[dstI + x] = src[srcI + x]; + } + } + } +} + +},{"../util/browser":110,"../util/util":129,"shelf-pack":201}],89:[function(require,module,exports){ +'use strict'; + +var createStructArrayType = require('../util/struct_array'); +var Point = require('point-geometry'); + +/* + * + * A StructArray implementation of symbolInstances from data/bucket/symbol_bucket.js + * this will allow symbolInstances to be transferred between the worker and main threads + * + * @class SymbolInstanceArray + * @private + */ + +var SymbolInstancesArray = createStructArrayType({ + members: [ + + { type: 'Uint16', name: 'textBoxStartIndex' }, + { type: 'Uint16', name: 'textBoxEndIndex' }, + { type: 'Uint16', name: 'iconBoxStartIndex' }, + { type: 'Uint16', name: 'iconBoxEndIndex' }, + { type: 'Uint16', name: 'glyphQuadStartIndex' }, + { type: 'Uint16', name: 'glyphQuadEndIndex' }, + { type: 'Uint16', name: 'iconQuadStartIndex' }, + { type: 'Uint16', name: 'iconQuadEndIndex' }, + + // each symbolInstance is centered around the anchor point + { type: 'Int16', name: 'anchorPointX' }, + { type: 'Int16', name: 'anchorPointY' }, + + // index -- not sure if we need this -@mollymerp + { type: 'Int8', name: 'index' }, + + // Bitmask indicating all available writing modes + { type: 'Uint8', name: 'writingModes' } + ] +}); + +Object.defineProperty(SymbolInstancesArray.prototype.StructType.prototype, 'anchorPoint', { + get: function get() { return new Point(this.anchorPointX, this.anchorPointY); } +}); + +module.exports = SymbolInstancesArray; + +},{"../util/struct_array":127,"point-geometry":198}],90:[function(require,module,exports){ +'use strict'; + +var createStructArrayType = require('../util/struct_array'); +var Point = require('point-geometry'); +var SymbolQuad = require('./quads').SymbolQuad; + +// notes from ansis on slack: +// it would be best if they are added to a buffer in advance so that they are only created once. There would be a separate buffer with all the individual collision boxes and then SymbolInstance would store the beginning and end indexes of a feature's collisionboxes. CollisionFeature wouldn't really exist as a standalone thing, it would just be a range of boxes in the big collision box buffer + +/* + * + * A StructArray implementation of glyphQuad from symbol/quads + * this will allow glyph quads to be transferred between the worker and main threads along with the rest of + * the symbolInstances + * + * @class SymbolQuadsArray + * @private + */ + +var SymbolQuadsArray = createStructArrayType({ + members: [ + // the quad is centered around the anchor point + { type: 'Int16', name: 'anchorPointX' }, + { type: 'Int16', name: 'anchorPointY' }, + + // the offsets of the tl (top-left), tr, bl, br corners from the anchor point + // do these need to be floats? + { type: 'Float32', name: 'tlX' }, + { type: 'Float32', name: 'tlY' }, + { type: 'Float32', name: 'trX' }, + { type: 'Float32', name: 'trY' }, + { type: 'Float32', name: 'blX' }, + { type: 'Float32', name: 'blY' }, + { type: 'Float32', name: 'brX' }, + { type: 'Float32', name: 'brY' }, + + // texture coordinates (height, width, x, and y) + { type: 'Int16', name: 'texH' }, + { type: 'Int16', name: 'texW' }, + { type: 'Int16', name: 'texX' }, + { type: 'Int16', name: 'texY' }, + + // the angle of the label at it's center, not the angle of this quad. + { type: 'Float32', name: 'anchorAngle' }, + // the angle of this quad. + { type: 'Float32', name: 'glyphAngle' }, + + // quad is only valid for scales < maxScale && scale > minScale. + { type: 'Float32', name: 'maxScale' }, + { type: 'Float32', name: 'minScale' }, + + { type: 'Uint8', name: 'writingMode' } + ] +}); + +Object.defineProperty(SymbolQuadsArray.prototype.StructType.prototype, 'anchorPoint', { + get: function get() { return new Point(this.anchorPointX, this.anchorPointY); } +}); + +Object.defineProperty(SymbolQuadsArray.prototype.StructType.prototype, 'SymbolQuad', { + get: function get$1() { + return new SymbolQuad(this.anchorPoint, + new Point(this.tlX, this.tlY), + new Point(this.trX, this.trY), + new Point(this.blX, this.blY), + new Point(this.brX, this.brY), + { x: this.texX, y: this.texY, h: this.texH, w: this.texW, height: this.texH, width: this.texW }, + this.anchorAngle, + this.glyphAngle, + this.minScale, + this.maxScale, + this.writingMode); + } +}); + +module.exports = SymbolQuadsArray; + +},{"../util/struct_array":127,"./quads":85,"point-geometry":198}],91:[function(require,module,exports){ +'use strict'; + +var DOM = require('../util/dom'); +var Point = require('point-geometry'); + +var handlers = { + scrollZoom: require('./handler/scroll_zoom'), + boxZoom: require('./handler/box_zoom'), + dragRotate: require('./handler/drag_rotate'), + dragPan: require('./handler/drag_pan'), + keyboard: require('./handler/keyboard'), + doubleClickZoom: require('./handler/dblclick_zoom'), + touchZoomRotate: require('./handler/touch_zoom_rotate') +}; + +module.exports = function bindHandlers(map, options) { + var el = map.getCanvasContainer(); + var contextMenuEvent = null; + var mouseDown = false; + var startPos = null; + var tapped = null; + + for (var name in handlers) { + map[name] = new handlers[name](map, options); + if (options.interactive && options[name]) { + map[name].enable(options[name]); + } + } + + el.addEventListener('mouseout', onMouseOut, false); + el.addEventListener('mousedown', onMouseDown, false); + el.addEventListener('mouseup', onMouseUp, false); + el.addEventListener('mousemove', onMouseMove, false); + el.addEventListener('touchstart', onTouchStart, false); + el.addEventListener('touchend', onTouchEnd, false); + el.addEventListener('touchmove', onTouchMove, false); + el.addEventListener('touchcancel', onTouchCancel, false); + el.addEventListener('click', onClick, false); + el.addEventListener('dblclick', onDblClick, false); + el.addEventListener('contextmenu', onContextMenu, false); + + function onMouseOut(e) { + fireMouseEvent('mouseout', e); + } + + function onMouseDown(e) { + map.stop(); + startPos = DOM.mousePos(el, e); + fireMouseEvent('mousedown', e); + + mouseDown = true; + } + + function onMouseUp(e) { + var rotating = map.dragRotate && map.dragRotate.isActive(); + + if (contextMenuEvent && !rotating) { + // This will be the case for Mac + fireMouseEvent('contextmenu', contextMenuEvent); + } + + contextMenuEvent = null; + mouseDown = false; + fireMouseEvent('mouseup', e); + } + + function onMouseMove(e) { + if (map.dragPan && map.dragPan.isActive()) return; + if (map.dragRotate && map.dragRotate.isActive()) return; + + var target = e.toElement || e.target; + while (target && target !== el) target = target.parentNode; + if (target !== el) return; + + fireMouseEvent('mousemove', e); + } + + function onTouchStart(e) { + map.stop(); + fireTouchEvent('touchstart', e); + + if (!e.touches || e.touches.length > 1) return; + + if (!tapped) { + tapped = setTimeout(onTouchTimeout, 300); + + } else { + clearTimeout(tapped); + tapped = null; + fireMouseEvent('dblclick', e); + } + } + + function onTouchMove(e) { + fireTouchEvent('touchmove', e); + } + + function onTouchEnd(e) { + fireTouchEvent('touchend', e); + } + + function onTouchCancel(e) { + fireTouchEvent('touchcancel', e); + } + + function onTouchTimeout() { + tapped = null; + } + + function onClick(e) { + var pos = DOM.mousePos(el, e); + + if (pos.equals(startPos)) { + fireMouseEvent('click', e); + } + } + + function onDblClick(e) { + fireMouseEvent('dblclick', e); + e.preventDefault(); + } + + function onContextMenu(e) { + var rotating = map.dragRotate && map.dragRotate.isActive(); + if (!mouseDown && !rotating) { + // Windows: contextmenu fired on mouseup, so fire event now + fireMouseEvent('contextmenu', e); + } else if (mouseDown) { + // Mac: contextmenu fired on mousedown; we save it until mouseup for consistency's sake + contextMenuEvent = e; + } + + e.preventDefault(); + } + + function fireMouseEvent(type, e) { + var pos = DOM.mousePos(el, e); + + return map.fire(type, { + lngLat: map.unproject(pos), + point: pos, + originalEvent: e + }); + } + + function fireTouchEvent(type, e) { + var touches = DOM.touchPos(el, e); + var singular = touches.reduce(function (prev, curr, i, arr) { + return prev.add(curr.div(arr.length)); + }, new Point(0, 0)); + + return map.fire(type, { + lngLat: map.unproject(singular), + point: singular, + lngLats: touches.map(function (t) { return map.unproject(t); }, this), + points: touches, + originalEvent: e + }); + } +}; + +/** + * @typedef {Object} MapMouseEvent + * @property {string} type The event type. + * @property {Map} target The `Map` object that fired the event. + * @property {MouseEvent} originalEvent + * @property {Point} point The pixel coordinates of the mouse event target, relative to the map + * and measured from the top left corner. + * @property {LngLat} lngLat The geographic location on the map of the mouse event target. + */ + +/** + * @typedef {Object} MapTouchEvent + * @property {string} type The event type. + * @property {Map} target The `Map` object that fired the event. + * @property {TouchEvent} originalEvent + * @property {Point} point The pixel coordinates of the center of the touch event points, relative to the map + * and measured from the top left corner. + * @property {LngLat} lngLat The geographic location on the map of the center of the touch event points. + * @property {Array} points The array of pixel coordinates corresponding to + * a [touch event's `touches`](https://developer.mozilla.org/en-US/docs/Web/API/TouchEvent/touches) + * property. + * @property {Array} lngLats The geographical locations on the map corresponding to + * a [touch event's `touches`](https://developer.mozilla.org/en-US/docs/Web/API/TouchEvent/touches) + * property. + */ + +},{"../util/dom":117,"./handler/box_zoom":97,"./handler/dblclick_zoom":98,"./handler/drag_pan":99,"./handler/drag_rotate":100,"./handler/keyboard":101,"./handler/scroll_zoom":102,"./handler/touch_zoom_rotate":103,"point-geometry":198}],92:[function(require,module,exports){ +'use strict'; + +var util = require('../util/util'); +var interpolate = require('../util/interpolate'); +var browser = require('../util/browser'); +var LngLat = require('../geo/lng_lat'); +var LngLatBounds = require('../geo/lng_lat_bounds'); +var Point = require('point-geometry'); +var Evented = require('../util/evented'); + +/** + * Options common to {@link Map#jumpTo}, {@link Map#easeTo}, and {@link Map#flyTo}, + * controlling the destination's location, zoom level, bearing, and pitch. + * All properties are optional. Unspecified + * options will default to the map's current value for that property. + * + * @typedef {Object} CameraOptions + * @property {LngLatLike} center The destination's center. + * @property {number} zoom The destination's zoom level. + * @property {number} bearing The destination's bearing (rotation), measured in degrees counter-clockwise from north. + * @property {number} pitch The destination's pitch (tilt), measured in degrees. + * @property {LngLatLike} around If a `zoom` is specified, `around` determines the zoom center (defaults to the center of the map). + */ + +/** + * Options common to map movement methods that involve animation, such as {@link Map#panBy} and + * {@link Map#easeTo}, controlling the duration and easing function of the animation. All properties + * are optional. + * + * @typedef {Object} AnimationOptions + * @property {number} duration The animation's duration, measured in milliseconds. + * @property {Function} easing The animation's easing function. + * @property {PointLike} offset `x` and `y` coordinates representing the animation's origin of movement relative to the map's center. + * @property {boolean} animate If `false`, no animation will occur. + */ + +var Camera = (function (Evented) { + function Camera(transform, options) { + Evented.call(this); + this.moving = false; + this.transform = transform; + this._bearingSnap = options.bearingSnap; + } + + if ( Evented ) Camera.__proto__ = Evented; + Camera.prototype = Object.create( Evented && Evented.prototype ); + Camera.prototype.constructor = Camera; + + /** + * Returns the map's geographical centerpoint. + * + * @memberof Map# + * @returns {LngLat} The map's geographical centerpoint. + */ + Camera.prototype.getCenter = function getCenter () { return this.transform.center; }; + + /** + * Sets the map's geographical centerpoint. Equivalent to `jumpTo({center: center})`. + * + * @memberof Map# + * @param {LngLatLike} center The centerpoint to set. + * @param {Object} [eventData] Data to propagate to any event listeners. + * @fires movestart + * @fires moveend + * @returns {Map} `this` + * @example + * map.setCenter([-74, 38]); + * @see [Move symbol with the keyboard](https://www.mapbox.com/mapbox-gl-js/example/rotating-controllable-marker/) + */ + Camera.prototype.setCenter = function setCenter (center, eventData) { + this.jumpTo({center: center}, eventData); + return this; + }; + + /** + * Pans the map by the specified offest. + * + * @memberof Map# + * @param {Array} offset `x` and `y` coordinates by which to pan the map. + * @param {AnimationOptions} [options] + * @param {Object} [eventData] Data to propagate to any event listeners. + * @fires movestart + * @fires moveend + * @returns {Map} `this` + * @see [Navigate the map with game-like controls](https://www.mapbox.com/mapbox-gl-js/example/game-controls/) + */ + Camera.prototype.panBy = function panBy (offset, options, eventData) { + this.panTo(this.transform.center, + util.extend({offset: Point.convert(offset).mult(-1)}, options), eventData); + return this; + }; + + /** + * Pans the map to the specified location, with an animated transition. + * + * @memberof Map# + * @param {LngLatLike} lnglat The location to pan the map to. + * @param {AnimationOptions} [options] + * @param {Object} [eventData] Data to propagate to any event listeners. + * @fires movestart + * @fires moveend + * @returns {Map} `this` + */ + Camera.prototype.panTo = function panTo (lnglat, options, eventData) { + return this.easeTo(util.extend({ + center: lnglat + }, options), eventData); + }; + + /** + * Returns the map's current zoom level. + * + * @memberof Map# + * @returns {number} The map's current zoom level. + */ + Camera.prototype.getZoom = function getZoom () { return this.transform.zoom; }; + + /** + * Sets the map's zoom level. Equivalent to `jumpTo({zoom: zoom})`. + * + * @memberof Map# + * @param {number} zoom The zoom level to set (0-20). + * @param {Object} [eventData] Data to propagate to any event listeners. + * @fires movestart + * @fires zoomstart + * @fires move + * @fires zoom + * @fires moveend + * @fires zoomend + * @returns {Map} `this` + * @example + * // zoom the map to 5 + * map.setZoom(5); + */ + Camera.prototype.setZoom = function setZoom (zoom, eventData) { + this.jumpTo({zoom: zoom}, eventData); + return this; + }; + + /** + * Zooms the map to the specified zoom level, with an animated transition. + * + * @memberof Map# + * @param {number} zoom The zoom level to transition to. + * @param {AnimationOptions} [options] + * @param {Object} [eventData] Data to propagate to any event listeners. + * @fires movestart + * @fires zoomstart + * @fires move + * @fires zoom + * @fires moveend + * @fires zoomend + * @returns {Map} `this` + */ + Camera.prototype.zoomTo = function zoomTo (zoom, options, eventData) { + return this.easeTo(util.extend({ + zoom: zoom + }, options), eventData); + }; + + /** + * Increases the map's zoom level by 1. + * + * @memberof Map# + * @param {AnimationOptions} [options] + * @param {Object} [eventData] Data to propagate to any event listeners. + * @fires movestart + * @fires zoomstart + * @fires move + * @fires zoom + * @fires moveend + * @fires zoomend + * @returns {Map} `this` + */ + Camera.prototype.zoomIn = function zoomIn (options, eventData) { + this.zoomTo(this.getZoom() + 1, options, eventData); + return this; + }; + + /** + * Decreases the map's zoom level by 1. + * + * @memberof Map# + * @param {AnimationOptions} [options] + * @param {Object} [eventData] Data to propagate to any event listeners. + * @fires movestart + * @fires zoomstart + * @fires move + * @fires zoom + * @fires moveend + * @fires zoomend + * @returns {Map} `this` + */ + Camera.prototype.zoomOut = function zoomOut (options, eventData) { + this.zoomTo(this.getZoom() - 1, options, eventData); + return this; + }; + + /** + * Returns the map's current bearing (rotation). + * + * @memberof Map# + * @returns {number} The map's current bearing, measured in degrees counter-clockwise from north. + * @see [Navigate the map with game-like controls](https://www.mapbox.com/mapbox-gl-js/example/game-controls/) + */ + Camera.prototype.getBearing = function getBearing () { return this.transform.bearing; }; + + /** + * Sets the maps' bearing (rotation). Equivalent to `jumpTo({bearing: bearing})`. + * + * @memberof Map# + * @param {number} bearing The bearing to set, measured in degrees counter-clockwise from north. + * @param {Object} [eventData] Data to propagate to any event listeners. + * @fires movestart + * @fires moveend + * @returns {Map} `this` + * @example + * // rotate the map to 90 degrees + * map.setBearing(90); + */ + Camera.prototype.setBearing = function setBearing (bearing, eventData) { + this.jumpTo({bearing: bearing}, eventData); + return this; + }; + + /** + * Rotates the map to the specified bearing, with an animated transition. + * + * @memberof Map# + * @param {number} bearing The bearing to rotate the map to, measured in degrees counter-clockwise from north. + * @param {AnimationOptions} [options] + * @param {Object} [eventData] Data to propagate to any event listeners. + * @fires movestart + * @fires moveend + * @returns {Map} `this` + */ + Camera.prototype.rotateTo = function rotateTo (bearing, options, eventData) { + return this.easeTo(util.extend({ + bearing: bearing + }, options), eventData); + }; + + /** + * Rotates the map to a bearing of 0 (due north), with an animated transition. + * + * @memberof Map# + * @param {AnimationOptions} [options] + * @param {Object} [eventData] Data to propagate to any event listeners. + * @fires movestart + * @fires moveend + * @returns {Map} `this` + */ + Camera.prototype.resetNorth = function resetNorth (options, eventData) { + this.rotateTo(0, util.extend({duration: 1000}, options), eventData); + return this; + }; + + /** + * Snaps the map's bearing to 0 (due north), if the current bearing is close enough to it (i.e. within the `bearingSnap` threshold). + * + * @memberof Map# + * @param {AnimationOptions} [options] + * @param {Object} [eventData] Data to propagate to any event listeners. + * @fires movestart + * @fires moveend + * @returns {Map} `this` + */ + Camera.prototype.snapToNorth = function snapToNorth (options, eventData) { + if (Math.abs(this.getBearing()) < this._bearingSnap) { + return this.resetNorth(options, eventData); + } + return this; + }; + + /** + * Returns the map's current pitch (tilt). + * + * @memberof Map# + * @returns {number} The map's current pitch, measured in degrees away from the plane of the screen. + */ + Camera.prototype.getPitch = function getPitch () { return this.transform.pitch; }; + + /** + * Sets the map's pitch (tilt). Equivalent to `jumpTo({pitch: pitch})`. + * + * @memberof Map# + * @param {number} pitch The pitch to set, measured in degrees away from the plane of the screen (0-60). + * @param {Object} [eventData] Data to propagate to any event listeners. + * @fires movestart + * @fires moveend + * @returns {Map} `this` + */ + Camera.prototype.setPitch = function setPitch (pitch, eventData) { + this.jumpTo({pitch: pitch}, eventData); + return this; + }; + + + /** + * Pans and zooms the map to contain its visible area within the specified geographical bounds. + * + * @memberof Map# + * @param {LngLatBoundsLike} bounds Center these bounds in the viewport and use the highest + * zoom level up to and including `Map#getMaxZoom()` that fits them in the viewport. + * @param {Object} [options] + * @param {boolean} [options.linear=false] If `true`, the map transitions using + * {@link Map#easeTo}. If `false`, the map transitions using {@link Map#flyTo}. See + * {@link Map#flyTo} for information about the options specific to that animated transition. + * @param {Function} [options.easing] An easing function for the animated transition. + * @param {number} [options.padding=0] The amount of padding, in pixels, to allow around the specified bounds. + * @param {PointLike} [options.offset=[0, 0]] The center of the given bounds relative to the map's center, measured in pixels. + * @param {number} [options.maxZoom] The maximum zoom level to allow when the map view transitions to the specified bounds. + * @param {Object} [eventData] Data to propagate to any event listeners. + * @fires movestart + * @fires moveend + * @returns {Map} `this` + * @see [Fit a map to a bounding box](https://www.mapbox.com/mapbox-gl-js/example/fitbounds/) + */ + Camera.prototype.fitBounds = function fitBounds (bounds, options, eventData) { + + options = util.extend({ + padding: 0, + offset: [0, 0], + maxZoom: this.getMaxZoom() + }, options); + + bounds = LngLatBounds.convert(bounds); + + var offset = Point.convert(options.offset), + tr = this.transform, + nw = tr.project(bounds.getNorthWest()), + se = tr.project(bounds.getSouthEast()), + size = se.sub(nw), + scaleX = (tr.width - options.padding * 2 - Math.abs(offset.x) * 2) / size.x, + scaleY = (tr.height - options.padding * 2 - Math.abs(offset.y) * 2) / size.y; + + options.center = tr.unproject(nw.add(se).div(2)); + options.zoom = Math.min(tr.scaleZoom(tr.scale * Math.min(scaleX, scaleY)), options.maxZoom); + options.bearing = 0; + + return options.linear ? + this.easeTo(options, eventData) : + this.flyTo(options, eventData); + }; + + /** + * Changes any combination of center, zoom, bearing, and pitch, without + * an animated transition. The map will retain its current values for any + * details not specified in `options`. + * + * @memberof Map# + * @param {CameraOptions} options + * @param {Object} [eventData] Data to propagate to any event listeners. + * @fires movestart + * @fires zoomstart + * @fires move + * @fires zoom + * @fires rotate + * @fires pitch + * @fires zoomend + * @fires moveend + * @returns {Map} `this` + */ + Camera.prototype.jumpTo = function jumpTo (options, eventData) { + this.stop(); + + var tr = this.transform; + var zoomChanged = false, + bearingChanged = false, + pitchChanged = false; + + if ('zoom' in options && tr.zoom !== +options.zoom) { + zoomChanged = true; + tr.zoom = +options.zoom; + } + + if ('center' in options) { + tr.center = LngLat.convert(options.center); + } + + if ('bearing' in options && tr.bearing !== +options.bearing) { + bearingChanged = true; + tr.bearing = +options.bearing; + } + + if ('pitch' in options && tr.pitch !== +options.pitch) { + pitchChanged = true; + tr.pitch = +options.pitch; + } + + this.fire('movestart', eventData) + .fire('move', eventData); + + if (zoomChanged) { + this.fire('zoomstart', eventData) + .fire('zoom', eventData) + .fire('zoomend', eventData); + } + + if (bearingChanged) { + this.fire('rotate', eventData); + } + + if (pitchChanged) { + this.fire('pitch', eventData); + } + + return this.fire('moveend', eventData); + }; + + /** + * Changes any combination of center, zoom, bearing, and pitch, with an animated transition + * between old and new values. The map will retain its current values for any + * details not specified in `options`. + * + * @memberof Map# + * @param {CameraOptions|AnimationOptions} options Options describing the destination and animation of the transition. + * @param {Object} [eventData] Data to propagate to any event listeners. + * @fires movestart + * @fires zoomstart + * @fires move + * @fires zoom + * @fires rotate + * @fires pitch + * @fires zoomend + * @fires moveend + * @returns {Map} `this` + * @see [Navigate the map with game-like controls](https://www.mapbox.com/mapbox-gl-js/example/game-controls/) + */ + Camera.prototype.easeTo = function easeTo (options, eventData) { + var this$1 = this; + + this.stop(); + + options = util.extend({ + offset: [0, 0], + duration: 500, + easing: util.ease + }, options); + + var tr = this.transform, + offset = Point.convert(options.offset), + startZoom = this.getZoom(), + startBearing = this.getBearing(), + startPitch = this.getPitch(), + + zoom = 'zoom' in options ? +options.zoom : startZoom, + bearing = 'bearing' in options ? this._normalizeBearing(options.bearing, startBearing) : startBearing, + pitch = 'pitch' in options ? +options.pitch : startPitch; + + var toLngLat, + toPoint; + + if ('center' in options) { + toLngLat = LngLat.convert(options.center); + toPoint = tr.centerPoint.add(offset); + } else if ('around' in options) { + toLngLat = LngLat.convert(options.around); + toPoint = tr.locationPoint(toLngLat); + } else { + toPoint = tr.centerPoint.add(offset); + toLngLat = tr.pointLocation(toPoint); + } + + var fromPoint = tr.locationPoint(toLngLat); + + if (options.animate === false) options.duration = 0; + + this.zooming = (zoom !== startZoom); + this.rotating = (startBearing !== bearing); + this.pitching = (pitch !== startPitch); + + if (options.smoothEasing && options.duration !== 0) { + options.easing = this._smoothOutEasing(options.duration); + } + + if (!options.noMoveStart) { + this.moving = true; + this.fire('movestart', eventData); + } + if (this.zooming) { + this.fire('zoomstart', eventData); + } + + clearTimeout(this._onEaseEnd); + + this._ease(function (k) { + if (this.zooming) { + tr.zoom = interpolate(startZoom, zoom, k); + } + + if (this.rotating) { + tr.bearing = interpolate(startBearing, bearing, k); + } + + if (this.pitching) { + tr.pitch = interpolate(startPitch, pitch, k); + } + + tr.setLocationAtPoint(toLngLat, fromPoint.add(toPoint.sub(fromPoint)._mult(k))); + + this.fire('move', eventData); + if (this.zooming) { + this.fire('zoom', eventData); + } + if (this.rotating) { + this.fire('rotate', eventData); + } + if (this.pitching) { + this.fire('pitch', eventData); + } + }, function () { + if (options.delayEndEvents) { + this$1._onEaseEnd = setTimeout(this$1._easeToEnd.bind(this$1, eventData), options.delayEndEvents); + } else { + this$1._easeToEnd(eventData); + } + }, options); + + return this; + }; + + Camera.prototype._easeToEnd = function _easeToEnd (eventData) { + var wasZooming = this.zooming; + this.moving = false; + this.zooming = false; + this.rotating = false; + this.pitching = false; + + if (wasZooming) { + this.fire('zoomend', eventData); + } + this.fire('moveend', eventData); + + }; + + /** + * Changes any combination of center, zoom, bearing, and pitch, animating the transition along a curve that + * evokes flight. The animation seamlessly incorporates zooming and panning to help + * the user maintain her bearings even after traversing a great distance. + * + * @memberof Map# + * @param {Object} options Options describing the destination and animation of the transition. + * Accepts [CameraOptions](#CameraOptions), [AnimationOptions](#AnimationOptions), + * and the following additional options. + * @param {number} [options.curve=1.42] The zooming "curve" that will occur along the + * flight path. A high value maximizes zooming for an exaggerated animation, while a low + * value minimizes zooming for an effect closer to {@link Map#easeTo}. 1.42 is the average + * value selected by participants in the user study discussed in + * [van Wijk (2003)](https://www.win.tue.nl/~vanwijk/zoompan.pdf). A value of + * `Math.pow(6, 0.25)` would be equivalent to the root mean squared average velocity. A + * value of 1 would produce a circular motion. + * @param {number} [options.minZoom] The zero-based zoom level at the peak of the flight path. If + * `options.curve` is specified, this option is ignored. + * @param {number} [options.speed=1.2] The average speed of the animation defined in relation to + * `options.curve`. A speed of 1.2 means that the map appears to move along the flight path + * by 1.2 times `options.curve` screenfuls every second. A _screenful_ is the map's visible span. + * It does not correspond to a fixed physical distance, but varies by zoom level. + * @param {number} [options.screenSpeed] The average speed of the animation measured in screenfuls + * per second, assuming a linear timing curve. If `options.speed` is specified, this option is ignored. + * @param {Function} [options.easing] An easing function for the animated transition. + * @param {Object} [eventData] Data to propagate to any event listeners. + * @fires movestart + * @fires zoomstart + * @fires move + * @fires zoom + * @fires rotate + * @fires pitch + * @fires zoomend + * @fires moveend + * @returns {Map} `this` + * @example + * // fly with default options to null island + * map.flyTo({center: [0, 0], zoom: 9}); + * // using flyTo options + * map.flyTo({ + * center: [0, 0], + * zoom: 9, + * speed: 0.2, + * curve: 1, + * easing(t) { + * return t; + * } + * }); + * @see [Fly to a location](https://www.mapbox.com/mapbox-gl-js/example/flyto/) + * @see [Slowly fly to a location](https://www.mapbox.com/mapbox-gl-js/example/flyto-options/) + * @see [Fly to a location based on scroll position](https://www.mapbox.com/mapbox-gl-js/example/scroll-fly-to/) + */ + Camera.prototype.flyTo = function flyTo (options, eventData) { + // This method implements an “optimal path†animation, as detailed in: + // + // Van Wijk, Jarke J.; Nuij, Wim A. A. “Smooth and efficient zooming and panning.†INFOVIS + // ’03. pp. 15–22. . + // + // Where applicable, local variable documentation begins with the associated variable or + // function in van Wijk (2003). + + this.stop(); + + options = util.extend({ + offset: [0, 0], + speed: 1.2, + curve: 1.42, + easing: util.ease + }, options); + + var tr = this.transform, + offset = Point.convert(options.offset), + startZoom = this.getZoom(), + startBearing = this.getBearing(), + startPitch = this.getPitch(); + + var center = 'center' in options ? LngLat.convert(options.center) : this.getCenter(); + var zoom = 'zoom' in options ? +options.zoom : startZoom; + var bearing = 'bearing' in options ? this._normalizeBearing(options.bearing, startBearing) : startBearing; + var pitch = 'pitch' in options ? +options.pitch : startPitch; + + // If a path crossing the antimeridian would be shorter, extend the final coordinate so that + // interpolating between the two endpoints will cross it. + if (Math.abs(tr.center.lng) + Math.abs(center.lng) > 180) { + if (tr.center.lng > 0 && center.lng < 0) { + center.lng += 360; + } else if (tr.center.lng < 0 && center.lng > 0) { + center.lng -= 360; + } + } + + var scale = tr.zoomScale(zoom - startZoom), + from = tr.point, + to = 'center' in options ? tr.project(center).sub(offset.div(scale)) : from; + + var rho = options.curve; + + // wâ‚€: Initial visible span, measured in pixels at the initial scale. + var w0 = Math.max(tr.width, tr.height), + // wâ‚Â: Final visible span, measured in pixels with respect to the initial scale. + w1 = w0 / scale, + // Length of the flight path as projected onto the ground plane, measured in pixels from + // the world image origin at the initial scale. + u1 = to.sub(from).mag(); + + if ('minZoom' in options) { + var minZoom = util.clamp(Math.min(options.minZoom, startZoom, zoom), tr.minZoom, tr.maxZoom); + // wm: Maximum visible span, measured in pixels with respect to the initial + // scale. + var wMax = w0 / tr.zoomScale(minZoom - startZoom); + rho = Math.sqrt(wMax / u1 * 2); + } + + // ò + var rho2 = rho * rho; + + /** + * ráµ¢: Returns the zoom-out factor at one end of the animation. + * + * @param i 0 for the ascent or 1 for the descent. + * @private + */ + function r(i) { + var b = (w1 * w1 - w0 * w0 + (i ? -1 : 1) * rho2 * rho2 * u1 * u1) / (2 * (i ? w1 : w0) * rho2 * u1); + return Math.log(Math.sqrt(b * b + 1) - b); + } + + function sinh(n) { return (Math.exp(n) - Math.exp(-n)) / 2; } + function cosh(n) { return (Math.exp(n) + Math.exp(-n)) / 2; } + function tanh(n) { return sinh(n) / cosh(n); } + + // râ‚€: Zoom-out factor during ascent. + var r0 = r(0); + /** + * w(s): Returns the visible span on the ground, measured in pixels with respect to the + * initial scale. + * + * Assumes an angular field of view of 2 arctan ½ ≈ 53°. + * @private + */ + var w = function (s) { return (cosh(r0) / cosh(r0 + rho * s)); }, + /** + * u(s): Returns the distance along the flight path as projected onto the ground plane, + * measured in pixels from the world image origin at the initial scale. + * @private + */ + u = function (s) { return w0 * ((cosh(r0) * tanh(r0 + rho * s) - sinh(r0)) / rho2) / u1; }, + // S: Total length of the flight path, measured in ÃÂ-screenfuls. + S = (r(1) - r0) / rho; + + // When uâ‚€ = uâ‚Â, the optimal path doesn’t require both ascent and descent. + if (Math.abs(u1) < 0.000001) { + // Perform a more or less instantaneous transition if the path is too short. + if (Math.abs(w0 - w1) < 0.000001) return this.easeTo(options); + + var k = w1 < w0 ? -1 : 1; + S = Math.abs(Math.log(w1 / w0)) / rho; + + u = function() { return 0; }; + w = function(s) { return Math.exp(k * rho * s); }; + } + + if ('duration' in options) { + options.duration = +options.duration; + } else { + var V = 'screenSpeed' in options ? +options.screenSpeed / rho : +options.speed; + options.duration = 1000 * S / V; + } + + this.moving = true; + this.zooming = true; + if (startBearing !== bearing) this.rotating = true; + if (startPitch !== pitch) this.pitching = true; + + this.fire('movestart', eventData); + this.fire('zoomstart', eventData); + + this._ease(function (k) { + // s: The distance traveled along the flight path, measured in ÃÂ-screenfuls. + var s = k * S, + us = u(s); + + var scale = 1 / w(s); + tr.zoom = startZoom + tr.scaleZoom(scale); + tr.center = tr.unproject(from.add(to.sub(from).mult(us)).mult(scale)); + + if (this.rotating) { + tr.bearing = interpolate(startBearing, bearing, k); + } + if (this.pitching) { + tr.pitch = interpolate(startPitch, pitch, k); + } + + this.fire('move', eventData); + this.fire('zoom', eventData); + if (this.rotating) { + this.fire('rotate', eventData); + } + if (this.pitching) { + this.fire('pitch', eventData); + } + }, function() { + this.moving = false; + this.zooming = false; + this.rotating = false; + this.pitching = false; + + this.fire('zoomend', eventData); + this.fire('moveend', eventData); + }, options); + + return this; + }; + + Camera.prototype.isEasing = function isEasing () { + return !!this._abortFn; + }; + + /** + * Returns a Boolean indicating whether the camera is moving. + * + * @memberof Map# + * @returns {boolean} A Boolean indicating whether the camera is moving. + */ + Camera.prototype.isMoving = function isMoving () { + return this.moving; + }; + + /** + * Stops any animated transition underway. + * + * @memberof Map# + * @returns {Map} `this` + */ + Camera.prototype.stop = function stop () { + if (this._abortFn) { + this._abortFn(); + this._finishEase(); + } + return this; + }; + + Camera.prototype._ease = function _ease (frame, finish, options) { + this._finishFn = finish; + this._abortFn = browser.timed(function (t) { + frame.call(this, options.easing(t)); + if (t === 1) { + this._finishEase(); + } + }, options.animate === false ? 0 : options.duration, this); + }; + + Camera.prototype._finishEase = function _finishEase () { + delete this._abortFn; + // The finish function might emit events which trigger new eases, which + // set a new _finishFn. Ensure we don't delete it unintentionally. + var finish = this._finishFn; + delete this._finishFn; + finish.call(this); + }; + + // convert bearing so that it's numerically close to the current one so that it interpolates properly + Camera.prototype._normalizeBearing = function _normalizeBearing (bearing, currentBearing) { + bearing = util.wrap(bearing, -180, 180); + var diff = Math.abs(bearing - currentBearing); + if (Math.abs(bearing - 360 - currentBearing) < diff) bearing -= 360; + if (Math.abs(bearing + 360 - currentBearing) < diff) bearing += 360; + return bearing; + }; + + // only used on mouse-wheel zoom to smooth out animation + Camera.prototype._smoothOutEasing = function _smoothOutEasing (duration) { + var easing = util.ease; + + if (this._prevEase) { + var ease = this._prevEase, + t = (Date.now() - ease.start) / ease.duration, + speed = ease.easing(t + 0.01) - ease.easing(t), + + // Quick hack to make new bezier that is continuous with last + x = 0.27 / Math.sqrt(speed * speed + 0.0001) * 0.01, + y = Math.sqrt(0.27 * 0.27 - x * x); + + easing = util.bezier(x, y, 0.25, 1); + } + + this._prevEase = { + start: (new Date()).getTime(), + duration: duration, + easing: easing + }; + + return easing; + }; + + return Camera; +}(Evented)); + +/** + * Fired whenever the map's pitch (tilt) changes. + * + * @event pitch + * @memberof Map + * @instance + * @property {MapEventData} data + */ + +module.exports = Camera; + +},{"../geo/lng_lat":19,"../geo/lng_lat_bounds":20,"../util/browser":110,"../util/evented":118,"../util/interpolate":121,"../util/util":129,"point-geometry":198}],93:[function(require,module,exports){ +'use strict'; + +var DOM = require('../../util/dom'); +var util = require('../../util/util'); + +/** + * An `AttributionControl` control presents the map's [attribution information](https://www.mapbox.com/help/attribution/). + * + * @implements {IControl} + * @param {Object} [options] + * @param {boolean} [options.compact] If `true` force a compact attribution that shows the full attribution on mouse hover, or if `false` force the full attribution control. The default is a responsive attribution that collapses when the map is less than 640 pixels wide. + * @example + * var map = new mapboxgl.Map({attributionControl: false}) + * .addControl(new mapboxgl.AttributionControl({ + * compact: true + * })); + */ +var AttributionControl = function AttributionControl(options) { + this.options = options; + + util.bindAll([ + '_updateEditLink', + '_updateData', + '_updateCompact' + ], this); +}; + +AttributionControl.prototype.getDefaultPosition = function getDefaultPosition () { + return 'bottom-right'; +}; + +AttributionControl.prototype.onAdd = function onAdd (map) { + var compact = this.options && this.options.compact; + + this._map = map; + this._container = DOM.create('div', 'mapboxgl-ctrl mapboxgl-ctrl-attrib'); + + if (compact) { + this._container.classList.add('compact'); + } + + this._updateAttributions(); + this._updateEditLink(); + + this._map.on('data', this._updateData); + this._map.on('moveend', this._updateEditLink); + + if (compact === undefined) { + this._map.on('resize', this._updateCompact); + this._updateCompact(); + } + + return this._container; +}; + +AttributionControl.prototype.onRemove = function onRemove () { + this._container.parentNode.removeChild(this._container); + + this._map.off('data', this._updateData); + this._map.off('moveend', this._updateEditLink); + this._map.off('resize', this._updateCompact); + + this._map = undefined; +}; + +AttributionControl.prototype._updateEditLink = function _updateEditLink () { + if (!this._editLink) this._editLink = this._container.querySelector('.mapbox-improve-map'); + if (this._editLink) { + var center = this._map.getCenter(); + this._editLink.href = "https://www.mapbox.com/map-feedback/#/" + (center.lng) + "/" + (center.lat) + "/" + (Math.round(this._map.getZoom() + 1)); + } +}; + +AttributionControl.prototype._updateData = function _updateData (event) { + if (event.dataType === 'source') { + this._updateAttributions(); + this._updateEditLink(); + } +}; + +AttributionControl.prototype._updateAttributions = function _updateAttributions () { + if (!this._map.style) return; + + var attributions = []; + + var sourceCaches = this._map.style.sourceCaches; + for (var id in sourceCaches) { + var source = sourceCaches[id].getSource(); + if (source.attribution && attributions.indexOf(source.attribution) < 0) { + attributions.push(source.attribution); + } + } + + // remove any entries that are substrings of another entry. + // first sort by length so that substrings come first + attributions.sort(function (a, b) { return a.length - b.length; }); + attributions = attributions.filter(function (attrib, i) { + for (var j = i + 1; j < attributions.length; j++) { + if (attributions[j].indexOf(attrib) >= 0) { return false; } + } + return true; + }); + this._container.innerHTML = attributions.join(' | '); + // remove old DOM node from _editLink + this._editLink = null; +}; + +AttributionControl.prototype._updateCompact = function _updateCompact () { + var compact = this._map.getCanvasContainer().offsetWidth <= 640; + + this._container.classList[compact ? 'add' : 'remove']('compact'); +}; + +module.exports = AttributionControl; + +},{"../../util/dom":117,"../../util/util":129}],94:[function(require,module,exports){ +'use strict'; + +var Evented = require('../../util/evented'); +var DOM = require('../../util/dom'); +var window = require('../../util/window'); +var util = require('../../util/util'); + +var defaultGeoPositionOptions = { enableHighAccuracy: false, timeout: 6000 /* 6sec */ }; +var className = 'mapboxgl-ctrl'; + +var supportsGeolocation; + +function checkGeolocationSupport(callback) { + if (supportsGeolocation !== undefined) { + callback(supportsGeolocation); + + } else if (window.navigator.permissions !== undefined) { + // navigator.permissions has incomplete browser support + // http://caniuse.com/#feat=permissions-api + // Test for the case where a browser disables Geolocation because of an + // insecure origin + window.navigator.permissions.query({ name: 'geolocation' }).then(function (p) { + supportsGeolocation = p.state !== 'denied'; + callback(supportsGeolocation); + }); + + } else { + supportsGeolocation = !!window.navigator.geolocation; + callback(supportsGeolocation); + } +} + +/** + * A `GeolocateControl` control provides a button that uses the browser's geolocation + * API to locate the user on the map. + * + * Not all browsers support geolocation, + * and some users may disable the feature. Geolocation support for modern + * browsers including Chrome requires sites to be served over HTTPS. If + * geolocation support is not available, the GeolocateControl will not + * be visible. + * + * @implements {IControl} + * @param {Object} [options] + * @param {Object} [options.positionOptions={enableHighAccuracy: false, timeout: 6000}] A [PositionOptions](https://developer.mozilla.org/en-US/docs/Web/API/PositionOptions) object. + * @param {Object} [options.watchPosition=false] If `true` the map will reposition each time the position of the device changes and the control becomes a toggle. + * @example + * map.addControl(new mapboxgl.GeolocateControl({ + * positionOptions: { + * enableHighAccuracy: true + * } + * })); + */ +var GeolocateControl = (function (Evented) { + function GeolocateControl(options) { + Evented.call(this); + this.options = options || {}; + util.bindAll([ + '_onSuccess', + '_onError', + '_finish', + '_setupUI' + ], this); + } + + if ( Evented ) GeolocateControl.__proto__ = Evented; + GeolocateControl.prototype = Object.create( Evented && Evented.prototype ); + GeolocateControl.prototype.constructor = GeolocateControl; + + GeolocateControl.prototype.onAdd = function onAdd (map) { + this._map = map; + this._container = DOM.create('div', (className + " " + className + "-group")); + checkGeolocationSupport(this._setupUI); + return this._container; + }; + + GeolocateControl.prototype.onRemove = function onRemove () { + this._container.parentNode.removeChild(this._container); + this._map = undefined; + }; + + GeolocateControl.prototype._onSuccess = function _onSuccess (position) { + this._map.jumpTo({ + center: [position.coords.longitude, position.coords.latitude], + zoom: 17, + bearing: 0, + pitch: 0 + }); + + this.fire('geolocate', position); + this._finish(); + }; + + GeolocateControl.prototype._onError = function _onError (error) { + this.fire('error', error); + this._finish(); + }; + + GeolocateControl.prototype._finish = function _finish () { + if (this._timeoutId) { clearTimeout(this._timeoutId); } + this._timeoutId = undefined; + }; + + GeolocateControl.prototype._setupUI = function _setupUI (supported) { + if (supported === false) return; + this._container.addEventListener('contextmenu', + function (e) { return e.preventDefault(); }); + this._geolocateButton = DOM.create('button', + (className + "-icon " + className + "-geolocate"), + this._container); + this._geolocateButton.type = 'button'; + this._geolocateButton.setAttribute('aria-label', 'Geolocate'); + if (this.options.watchPosition) this._geolocateButton.setAttribute('aria-pressed', false); + this._geolocateButton.addEventListener('click', + this._onClickGeolocate.bind(this)); + }; + + GeolocateControl.prototype._onClickGeolocate = function _onClickGeolocate () { + var positionOptions = util.extend(defaultGeoPositionOptions, this.options && this.options.positionOptions || {}); + + // toggle watching the device location + if (this.options.watchPosition) { + if (this._geolocationWatchID !== undefined) { + // clear watchPosition + this._geolocateButton.classList.remove('watching'); + this._geolocateButton.setAttribute('aria-pressed', false); + window.navigator.geolocation.clearWatch(this._geolocationWatchID); + this._geolocationWatchID = undefined; + } else { + // enable watchPosition + this._geolocateButton.classList.add('watching'); + this._geolocateButton.setAttribute('aria-pressed', true); + this._geolocationWatchID = window.navigator.geolocation.watchPosition( + this._onSuccess, this._onError, positionOptions); + } + } else { + window.navigator.geolocation.getCurrentPosition( + this._onSuccess, this._onError, positionOptions); + + // This timeout ensures that we still call finish() even if + // the user declines to share their location in Firefox + this._timeoutId = setTimeout(this._finish, 10000 /* 10sec */); + } + }; + + return GeolocateControl; +}(Evented)); + +module.exports = GeolocateControl; + +/** + * geolocate event. + * + * @event geolocate + * @memberof GeolocateControl + * @instance + * @property {Position} data The returned [Position](https://developer.mozilla.org/en-US/docs/Web/API/Position) object from the callback in [Geolocation.getCurrentPosition()](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/getCurrentPosition). + * + */ + +/** + * error event. + * + * @event error + * @memberof GeolocateControl + * @instance + * @property {PositionError} data The returned [PositionError](https://developer.mozilla.org/en-US/docs/Web/API/PositionError) object from the callback in [Geolocation.getCurrentPosition()](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/getCurrentPosition). + * + */ + +},{"../../util/dom":117,"../../util/evented":118,"../../util/util":129,"../../util/window":112}],95:[function(require,module,exports){ +'use strict'; + +var DOM = require('../../util/dom'); +var window = require('../../util/window'); +var util = require('../../util/util'); + +var className = 'mapboxgl-ctrl'; + +/** + * A `NavigationControl` control contains zoom buttons and a compass. + * + * @implements {IControl} + * @example + * var nav = new mapboxgl.NavigationControl(); + * map.addControl(nav, 'top-left'); + * @see [Display map navigation controls](https://www.mapbox.com/mapbox-gl-js/example/navigation/) + * @see [Add a third party vector tile source](https://www.mapbox.com/mapbox-gl-js/example/third-party/) + */ +var NavigationControl = function NavigationControl() { + util.bindAll([ + '_rotateCompassArrow' + ], this); +}; + +NavigationControl.prototype._rotateCompassArrow = function _rotateCompassArrow () { + var rotate = "rotate(" + (this._map.transform.angle * (180 / Math.PI)) + "deg)"; + this._compassArrow.style.transform = rotate; +}; + +NavigationControl.prototype.onAdd = function onAdd (map) { + this._map = map; + this._container = DOM.create('div', (className + " " + className + "-group"), map.getContainer()); + this._container.addEventListener('contextmenu', this._onContextMenu.bind(this)); + + this._zoomInButton = this._createButton((className + "-icon " + className + "-zoom-in"), 'Zoom In', map.zoomIn.bind(map)); + this._zoomOutButton = this._createButton((className + "-icon " + className + "-zoom-out"), 'Zoom Out', map.zoomOut.bind(map)); + this._compass = this._createButton((className + "-icon " + className + "-compass"), 'Reset North', map.resetNorth.bind(map)); + + this._compassArrow = DOM.create('span', 'arrow', this._compass); + + this._compass.addEventListener('mousedown', this._onCompassDown.bind(this)); + this._onCompassMove = this._onCompassMove.bind(this); + this._onCompassUp = this._onCompassUp.bind(this); + + this._map.on('rotate', this._rotateCompassArrow); + this._rotateCompassArrow(); + + return this._container; +}; + +NavigationControl.prototype.onRemove = function onRemove () { + this._container.parentNode.removeChild(this._container); + this._map.off('rotate', this._rotateCompassArrow); + this._map = undefined; +}; + +NavigationControl.prototype._onContextMenu = function _onContextMenu (e) { + e.preventDefault(); + }; + +NavigationControl.prototype._onCompassDown = function _onCompassDown (e) { + if (e.button !== 0) return; + + DOM.disableDrag(); + window.document.addEventListener('mousemove', this._onCompassMove); + window.document.addEventListener('mouseup', this._onCompassUp); + + this._map.getCanvasContainer().dispatchEvent(copyMouseEvent(e)); + e.stopPropagation(); +}; + +NavigationControl.prototype._onCompassMove = function _onCompassMove (e) { + if (e.button !== 0) return; + + this._map.getCanvasContainer().dispatchEvent(copyMouseEvent(e)); + e.stopPropagation(); +}; + +NavigationControl.prototype._onCompassUp = function _onCompassUp (e) { + if (e.button !== 0) return; + + window.document.removeEventListener('mousemove', this._onCompassMove); + window.document.removeEventListener('mouseup', this._onCompassUp); + DOM.enableDrag(); + + this._map.getCanvasContainer().dispatchEvent(copyMouseEvent(e)); + e.stopPropagation(); +}; + +NavigationControl.prototype._createButton = function _createButton (className, ariaLabel, fn) { + var a = DOM.create('button', className, this._container); + a.type = 'button'; + a.setAttribute('aria-label', ariaLabel); + a.addEventListener('click', function () { fn(); }); + return a; +}; + +module.exports = NavigationControl; + +function copyMouseEvent(e) { + return new window.MouseEvent(e.type, { + button: 2, // right click + buttons: 2, // right click + bubbles: true, + cancelable: true, + detail: e.detail, + view: e.view, + screenX: e.screenX, + screenY: e.screenY, + clientX: e.clientX, + clientY: e.clientY, + movementX: e.movementX, + movementY: e.movementY, + ctrlKey: e.ctrlKey, + shiftKey: e.shiftKey, + altKey: e.altKey, + metaKey: e.metaKey + }); +} + +},{"../../util/dom":117,"../../util/util":129,"../../util/window":112}],96:[function(require,module,exports){ +'use strict'; + +var DOM = require('../../util/dom'); +var util = require('../../util/util'); + +/** + * A `ScaleControl` control displays the ratio of a distance on the map to the corresponding distance on the ground. + * + * @implements {IControl} + * @param {Object} [options] + * @param {number} [options.maxWidth='150'] The maximum length of the scale control in pixels. + * @param {string} [options.unit='metric'] Unit of the distance (`'imperial'` or `'metric'`). + * @example + * map.addControl(new mapboxgl.ScaleControl({ + * maxWidth: 80, + * unit: 'imperial' + * })); + */ +var ScaleControl = function ScaleControl(options) { + this.options = options; + + util.bindAll([ + '_onMove' + ], this); +}; + +ScaleControl.prototype.getDefaultPosition = function getDefaultPosition () { + return 'bottom-left'; +}; + +ScaleControl.prototype._onMove = function _onMove () { + updateScale(this._map, this._container, this.options); +}; + +ScaleControl.prototype.onAdd = function onAdd (map) { + this._map = map; + this._container = DOM.create('div', 'mapboxgl-ctrl mapboxgl-ctrl-scale', map.getContainer()); + + this._map.on('move', this._onMove); + this._onMove(); + + return this._container; +}; + +ScaleControl.prototype.onRemove = function onRemove () { + this._container.parentNode.removeChild(this._container); + this._map.off('move', this._onMove); + this._map = undefined; +}; + +module.exports = ScaleControl; + +function updateScale(map, container, options) { + // A horizontal scale is imagined to be present at center of the map + // container with maximum length (Default) as 100px. + // Using spherical law of cosines approximation, the real distance is + // found between the two coordinates. + var maxWidth = options && options.maxWidth || 100; + + var y = map._container.clientHeight / 2; + var maxMeters = getDistance(map.unproject([0, y]), map.unproject([maxWidth, y])); + // The real distance corresponding to 100px scale length is rounded off to + // near pretty number and the scale length for the same is found out. + // Default unit of the scale is based on User's locale. + if (options && options.unit === 'imperial') { + var maxFeet = 3.2808 * maxMeters; + if (maxFeet > 5280) { + var maxMiles = maxFeet / 5280; + setScale(container, maxWidth, maxMiles, 'mi'); + } else { + setScale(container, maxWidth, maxFeet, 'ft'); + } + } else { + setScale(container, maxWidth, maxMeters, 'm'); + } +} + +function setScale(container, maxWidth, maxDistance, unit) { + var distance = getRoundNum(maxDistance); + var ratio = distance / maxDistance; + + if (unit === 'm' && distance >= 1000) { + distance = distance / 1000; + unit = 'km'; + } + + container.style.width = (maxWidth * ratio) + "px"; + container.innerHTML = distance + unit; +} + +function getDistance(latlng1, latlng2) { + // Uses spherical law of cosines approximation. + var R = 6371000; + + var rad = Math.PI / 180, + lat1 = latlng1.lat * rad, + lat2 = latlng2.lat * rad, + a = Math.sin(lat1) * Math.sin(lat2) + + Math.cos(lat1) * Math.cos(lat2) * Math.cos((latlng2.lng - latlng1.lng) * rad); + + var maxMeters = R * Math.acos(Math.min(a, 1)); + return maxMeters; + +} + +function getRoundNum(num) { + var pow10 = Math.pow(10, (("" + (Math.floor(num)))).length - 1); + var d = num / pow10; + + d = d >= 10 ? 10 : + d >= 5 ? 5 : + d >= 3 ? 3 : + d >= 2 ? 2 : 1; + + return pow10 * d; +} + +},{"../../util/dom":117,"../../util/util":129}],97:[function(require,module,exports){ +'use strict'; + +var DOM = require('../../util/dom'); +var LngLatBounds = require('../../geo/lng_lat_bounds'); +var util = require('../../util/util'); +var window = require('../../util/window'); + +/** + * The `BoxZoomHandler` allows the user to zoom the map to fit within a bounding box. + * The bounding box is defined by clicking and holding `shift` while dragging the cursor. + * + * @param {Map} map The Mapbox GL JS map to add the handler to. + */ +var BoxZoomHandler = function BoxZoomHandler(map) { + this._map = map; + this._el = map.getCanvasContainer(); + this._container = map.getContainer(); + + util.bindAll([ + '_onMouseDown', + '_onMouseMove', + '_onMouseUp', + '_onKeyDown' + ], this); +}; + +/** + * Returns a Boolean indicating whether the "box zoom" interaction is enabled. + * + * @returns {boolean} `true` if the "box zoom" interaction is enabled. + */ +BoxZoomHandler.prototype.isEnabled = function isEnabled () { + return !!this._enabled; +}; + +/** + * Returns a Boolean indicating whether the "box zoom" interaction is active, i.e. currently being used. + * + * @returns {boolean} `true` if the "box zoom" interaction is active. + */ +BoxZoomHandler.prototype.isActive = function isActive () { + return !!this._active; +}; + +/** + * Enables the "box zoom" interaction. + * + * @example + * map.boxZoom.enable(); + */ +BoxZoomHandler.prototype.enable = function enable () { + if (this.isEnabled()) return; + this._el.addEventListener('mousedown', this._onMouseDown, false); + this._enabled = true; +}; + +/** + * Disables the "box zoom" interaction. + * + * @example + * map.boxZoom.disable(); + */ +BoxZoomHandler.prototype.disable = function disable () { + if (!this.isEnabled()) return; + this._el.removeEventListener('mousedown', this._onMouseDown); + this._enabled = false; +}; + +BoxZoomHandler.prototype._onMouseDown = function _onMouseDown (e) { + if (!(e.shiftKey && e.button === 0)) return; + + window.document.addEventListener('mousemove', this._onMouseMove, false); + window.document.addEventListener('keydown', this._onKeyDown, false); + window.document.addEventListener('mouseup', this._onMouseUp, false); + + DOM.disableDrag(); + this._startPos = DOM.mousePos(this._el, e); + this._active = true; +}; + +BoxZoomHandler.prototype._onMouseMove = function _onMouseMove (e) { + var p0 = this._startPos, + p1 = DOM.mousePos(this._el, e); + + if (!this._box) { + this._box = DOM.create('div', 'mapboxgl-boxzoom', this._container); + this._container.classList.add('mapboxgl-crosshair'); + this._fireEvent('boxzoomstart', e); + } + + var minX = Math.min(p0.x, p1.x), + maxX = Math.max(p0.x, p1.x), + minY = Math.min(p0.y, p1.y), + maxY = Math.max(p0.y, p1.y); + + DOM.setTransform(this._box, ("translate(" + minX + "px," + minY + "px)")); + + this._box.style.width = (maxX - minX) + "px"; + this._box.style.height = (maxY - minY) + "px"; +}; + +BoxZoomHandler.prototype._onMouseUp = function _onMouseUp (e) { + if (e.button !== 0) return; + + var p0 = this._startPos, + p1 = DOM.mousePos(this._el, e), + bounds = new LngLatBounds() + .extend(this._map.unproject(p0)) + .extend(this._map.unproject(p1)); + + this._finish(); + + if (p0.x === p1.x && p0.y === p1.y) { + this._fireEvent('boxzoomcancel', e); + } else { + this._map + .fitBounds(bounds, {linear: true}) + .fire('boxzoomend', { originalEvent: e, boxZoomBounds: bounds }); + } +}; + +BoxZoomHandler.prototype._onKeyDown = function _onKeyDown (e) { + if (e.keyCode === 27) { + this._finish(); + this._fireEvent('boxzoomcancel', e); + } +}; + +BoxZoomHandler.prototype._finish = function _finish () { + this._active = false; + + window.document.removeEventListener('mousemove', this._onMouseMove, false); + window.document.removeEventListener('keydown', this._onKeyDown, false); + window.document.removeEventListener('mouseup', this._onMouseUp, false); + + this._container.classList.remove('mapboxgl-crosshair'); + + if (this._box) { + this._box.parentNode.removeChild(this._box); + this._box = null; + } + + DOM.enableDrag(); +}; + +BoxZoomHandler.prototype._fireEvent = function _fireEvent (type, e) { + return this._map.fire(type, { originalEvent: e }); +}; + +module.exports = BoxZoomHandler; + +/** + * @typedef {Object} MapBoxZoomEvent + * @property {MouseEvent} originalEvent + * @property {LngLatBounds} boxZoomBounds The bounding box of the "box zoom" interaction. + * This property is only provided for `boxzoomend` events. + */ + +/** + * Fired when a "box zoom" interaction starts. See [`BoxZoomHandler`](#BoxZoomHandler). + * + * @event boxzoomstart + * @memberof Map + * @instance + * @property {MapBoxZoomEvent} data + */ + +/** + * Fired when a "box zoom" interaction ends. See [`BoxZoomHandler`](#BoxZoomHandler). + * + * @event boxzoomend + * @memberof Map + * @instance + * @type {Object} + * @property {MapBoxZoomEvent} data + */ + +/** + * Fired when the user cancels a "box zoom" interaction, or when the bounding box does not meet the minimum size threshold. + * See [`BoxZoomHandler`](#BoxZoomHandler). + * + * @event boxzoomcancel + * @memberof Map + * @instance + * @property {MapBoxZoomEvent} data + */ + +},{"../../geo/lng_lat_bounds":20,"../../util/dom":117,"../../util/util":129,"../../util/window":112}],98:[function(require,module,exports){ +'use strict'; + +/** + * The `DoubleClickZoomHandler` allows the user to zoom the map at a point by + * double clicking. + * + * @param {Map} map The Mapbox GL JS map to add the handler to. + */ +var DoubleClickZoomHandler = function DoubleClickZoomHandler(map) { + this._map = map; + this._onDblClick = this._onDblClick.bind(this); +}; + +/** + * Returns a Boolean indicating whether the "double click to zoom" interaction is enabled. + * + * @returns {boolean} `true` if the "double click to zoom" interaction is enabled. + */ +DoubleClickZoomHandler.prototype.isEnabled = function isEnabled () { + return !!this._enabled; +}; + +/** + * Enables the "double click to zoom" interaction. + * + * @example + * map.doubleClickZoom.enable(); + */ +DoubleClickZoomHandler.prototype.enable = function enable () { + if (this.isEnabled()) return; + this._map.on('dblclick', this._onDblClick); + this._enabled = true; +}; + +/** + * Disables the "double click to zoom" interaction. + * + * @example + * map.doubleClickZoom.disable(); + */ +DoubleClickZoomHandler.prototype.disable = function disable () { + if (!this.isEnabled()) return; + this._map.off('dblclick', this._onDblClick); + this._enabled = false; +}; + +DoubleClickZoomHandler.prototype._onDblClick = function _onDblClick (e) { + this._map.zoomTo( + this._map.getZoom() + (e.originalEvent.shiftKey ? -1 : 1), + {around: e.lngLat}, + e + ); +}; + +module.exports = DoubleClickZoomHandler; + +},{}],99:[function(require,module,exports){ +'use strict'; + +var DOM = require('../../util/dom'); +var util = require('../../util/util'); +var window = require('../../util/window'); + +var inertiaLinearity = 0.3, + inertiaEasing = util.bezier(0, 0, inertiaLinearity, 1), + inertiaMaxSpeed = 1400, // px/s + inertiaDeceleration = 2500; // px/s^2 + +/** + * The `DragPanHandler` allows the user to pan the map by clicking and dragging + * the cursor. + * + * @param {Map} map The Mapbox GL JS map to add the handler to. + */ +var DragPanHandler = function DragPanHandler(map) { + this._map = map; + this._el = map.getCanvasContainer(); + + util.bindAll([ + '_onDown', + '_onMove', + '_onUp', + '_onTouchEnd', + '_onMouseUp' + ], this); +}; + +/** + * Returns a Boolean indicating whether the "drag to pan" interaction is enabled. + * + * @returns {boolean} `true` if the "drag to pan" interaction is enabled. + */ +DragPanHandler.prototype.isEnabled = function isEnabled () { + return !!this._enabled; +}; + +/** + * Returns a Boolean indicating whether the "drag to pan" interaction is active, i.e. currently being used. + * + * @returns {boolean} `true` if the "drag to pan" interaction is active. + */ +DragPanHandler.prototype.isActive = function isActive () { + return !!this._active; +}; + +/** + * Enables the "drag to pan" interaction. + * + * @example + * map.dragPan.enable(); + */ +DragPanHandler.prototype.enable = function enable () { + if (this.isEnabled()) return; + this._el.addEventListener('mousedown', this._onDown); + this._el.addEventListener('touchstart', this._onDown); + this._enabled = true; +}; + +/** + * Disables the "drag to pan" interaction. + * + * @example + * map.dragPan.disable(); + */ +DragPanHandler.prototype.disable = function disable () { + if (!this.isEnabled()) return; + this._el.removeEventListener('mousedown', this._onDown); + this._el.removeEventListener('touchstart', this._onDown); + this._enabled = false; +}; + +DragPanHandler.prototype._onDown = function _onDown (e) { + if (this._ignoreEvent(e)) return; + if (this.isActive()) return; + + if (e.touches) { + window.document.addEventListener('touchmove', this._onMove); + window.document.addEventListener('touchend', this._onTouchEnd); + } else { + window.document.addEventListener('mousemove', this._onMove); + window.document.addEventListener('mouseup', this._onMouseUp); + } + + this._active = false; + this._startPos = this._pos = DOM.mousePos(this._el, e); + this._inertia = [[Date.now(), this._pos]]; +}; + +DragPanHandler.prototype._onMove = function _onMove (e) { + if (this._ignoreEvent(e)) return; + + if (!this.isActive()) { + this._active = true; + this._fireEvent('dragstart', e); + this._fireEvent('movestart', e); + } + + var pos = DOM.mousePos(this._el, e), + map = this._map; + + map.stop(); + this._drainInertiaBuffer(); + this._inertia.push([Date.now(), pos]); + + map.transform.setLocationAtPoint(map.transform.pointLocation(this._pos), pos); + + this._fireEvent('drag', e); + this._fireEvent('move', e); + + this._pos = pos; + + e.preventDefault(); +}; + +DragPanHandler.prototype._onUp = function _onUp (e) { + var this$1 = this; + + if (!this.isActive()) return; + + this._active = false; + this._fireEvent('dragend', e); + this._drainInertiaBuffer(); + + var finish = function () { return this$1._fireEvent('moveend', e); }; + + var inertia = this._inertia; + if (inertia.length < 2) { + finish(); + return; + } + + var last = inertia[inertia.length - 1], + first = inertia[0], + flingOffset = last[1].sub(first[1]), + flingDuration = (last[0] - first[0]) / 1000; + + if (flingDuration === 0 || last[1].equals(first[1])) { + finish(); + return; + } + + // calculate px/s velocity & adjust for increased initial animation speed when easing out + var velocity = flingOffset.mult(inertiaLinearity / flingDuration); + var speed = velocity.mag(); // px/s + + if (speed > inertiaMaxSpeed) { + speed = inertiaMaxSpeed; + velocity._unit()._mult(speed); + } + + var duration = speed / (inertiaDeceleration * inertiaLinearity), + offset = velocity.mult(-duration / 2); + + this._map.panBy(offset, { + duration: duration * 1000, + easing: inertiaEasing, + noMoveStart: true + }, { originalEvent: e }); +}; + +DragPanHandler.prototype._onMouseUp = function _onMouseUp (e) { + if (this._ignoreEvent(e)) return; + this._onUp(e); + window.document.removeEventListener('mousemove', this._onMove); + window.document.removeEventListener('mouseup', this._onMouseUp); +}; + +DragPanHandler.prototype._onTouchEnd = function _onTouchEnd (e) { + if (this._ignoreEvent(e)) return; + this._onUp(e); + window.document.removeEventListener('touchmove', this._onMove); + window.document.removeEventListener('touchend', this._onTouchEnd); +}; + +DragPanHandler.prototype._fireEvent = function _fireEvent (type, e) { + return this._map.fire(type, { originalEvent: e }); +}; + +DragPanHandler.prototype._ignoreEvent = function _ignoreEvent (e) { + var map = this._map; + + if (map.boxZoom && map.boxZoom.isActive()) return true; + if (map.dragRotate && map.dragRotate.isActive()) return true; + if (e.touches) { + return (e.touches.length > 1); + } else { + if (e.ctrlKey) return true; + var buttons = 1, // left button + button = 0; // left button + return (e.type === 'mousemove' ? e.buttons & buttons === 0 : e.button !== button); + } +}; + +DragPanHandler.prototype._drainInertiaBuffer = function _drainInertiaBuffer () { + var inertia = this._inertia, + now = Date.now(), + cutoff = 160; // msec + + while (inertia.length > 0 && now - inertia[0][0] > cutoff) inertia.shift(); +}; + +module.exports = DragPanHandler; + +/** + * Fired when a "drag to pan" interaction starts. See [`DragPanHandler`](#DragPanHandler). + * + * @event dragstart + * @memberof Map + * @instance + * @property {{originalEvent: DragEvent}} data + */ + +/** + * Fired repeatedly during a "drag to pan" interaction. See [`DragPanHandler`](#DragPanHandler). + * + * @event drag + * @memberof Map + * @instance + * @property {MapMouseEvent | MapTouchEvent} data + */ + +/** + * Fired when a "drag to pan" interaction ends. See [`DragPanHandler`](#DragPanHandler). + * + * @event dragend + * @memberof Map + * @instance + * @property {{originalEvent: DragEvent}} data + */ + +},{"../../util/dom":117,"../../util/util":129,"../../util/window":112}],100:[function(require,module,exports){ +'use strict'; + +var DOM = require('../../util/dom'); +var util = require('../../util/util'); +var window = require('../../util/window'); + +var inertiaLinearity = 0.25, + inertiaEasing = util.bezier(0, 0, inertiaLinearity, 1), + inertiaMaxSpeed = 180, // deg/s + inertiaDeceleration = 720; // deg/s^2 + +/** + * The `DragRotateHandler` allows the user to rotate the map by clicking and + * dragging the cursor while holding the right mouse button or `ctrl` key. + * + * @param {Map} map The Mapbox GL JS map to add the handler to. + * @param {Object} [options] + * @param {number} [options.bearingSnap] The threshold, measured in degrees, that determines when the map's + * bearing (rotation) will snap to north. + * @param {bool} [options.pitchWithRotate=true] Control the map pitch in addition to the bearing + */ +var DragRotateHandler = function DragRotateHandler(map, options) { + this._map = map; + this._el = map.getCanvasContainer(); + this._bearingSnap = options.bearingSnap; + this._pitchWithRotate = options.pitchWithRotate !== false; + + util.bindAll([ + '_onDown', + '_onMove', + '_onUp' + ], this); + +}; + +/** + * Returns a Boolean indicating whether the "drag to rotate" interaction is enabled. + * + * @returns {boolean} `true` if the "drag to rotate" interaction is enabled. + */ +DragRotateHandler.prototype.isEnabled = function isEnabled () { + return !!this._enabled; +}; + +/** + * Returns a Boolean indicating whether the "drag to rotate" interaction is active, i.e. currently being used. + * + * @returns {boolean} `true` if the "drag to rotate" interaction is active. + */ +DragRotateHandler.prototype.isActive = function isActive () { + return !!this._active; +}; + +/** + * Enables the "drag to rotate" interaction. + * + * @example + * map.dragRotate.enable(); + */ +DragRotateHandler.prototype.enable = function enable () { + if (this.isEnabled()) return; + this._el.addEventListener('mousedown', this._onDown); + this._enabled = true; +}; + +/** + * Disables the "drag to rotate" interaction. + * + * @example + * map.dragRotate.disable(); + */ +DragRotateHandler.prototype.disable = function disable () { + if (!this.isEnabled()) return; + this._el.removeEventListener('mousedown', this._onDown); + this._enabled = false; +}; + +DragRotateHandler.prototype._onDown = function _onDown (e) { + if (this._ignoreEvent(e)) return; + if (this.isActive()) return; + + window.document.addEventListener('mousemove', this._onMove); + window.document.addEventListener('mouseup', this._onUp); + + this._active = false; + this._inertia = [[Date.now(), this._map.getBearing()]]; + this._startPos = this._pos = DOM.mousePos(this._el, e); + this._center = this._map.transform.centerPoint; // Center of rotation + + e.preventDefault(); +}; + +DragRotateHandler.prototype._onMove = function _onMove (e) { + if (this._ignoreEvent(e)) return; + + if (!this.isActive()) { + this._active = true; + this._fireEvent('rotatestart', e); + this._fireEvent('movestart', e); + } + + var map = this._map; + map.stop(); + + var p1 = this._pos, + p2 = DOM.mousePos(this._el, e), + bearingDiff = (p1.x - p2.x) * 0.8, + pitchDiff = (p1.y - p2.y) * -0.5, + bearing = map.getBearing() - bearingDiff, + pitch = map.getPitch() - pitchDiff, + inertia = this._inertia, + last = inertia[inertia.length - 1]; + + this._drainInertiaBuffer(); + inertia.push([Date.now(), map._normalizeBearing(bearing, last[1])]); + + map.transform.bearing = bearing; + if (this._pitchWithRotate) map.transform.pitch = pitch; + + this._fireEvent('rotate', e); + this._fireEvent('move', e); + + this._pos = p2; +}; + +DragRotateHandler.prototype._onUp = function _onUp (e) { + var this$1 = this; + + if (this._ignoreEvent(e)) return; + window.document.removeEventListener('mousemove', this._onMove); + window.document.removeEventListener('mouseup', this._onUp); + + if (!this.isActive()) return; + + this._active = false; + this._fireEvent('rotateend', e); + this._drainInertiaBuffer(); + + var map = this._map, + mapBearing = map.getBearing(), + inertia = this._inertia; + + var finish = function () { + if (Math.abs(mapBearing) < this$1._bearingSnap) { + map.resetNorth({noMoveStart: true}, { originalEvent: e }); + } else { + this$1._fireEvent('moveend', e); + } + }; + + if (inertia.length < 2) { + finish(); + return; + } + + var first = inertia[0], + last = inertia[inertia.length - 1], + previous = inertia[inertia.length - 2]; + var bearing = map._normalizeBearing(mapBearing, previous[1]); + var flingDiff = last[1] - first[1], + sign = flingDiff < 0 ? -1 : 1, + flingDuration = (last[0] - first[0]) / 1000; + + if (flingDiff === 0 || flingDuration === 0) { + finish(); + return; + } + + var speed = Math.abs(flingDiff * (inertiaLinearity / flingDuration)); // deg/s + if (speed > inertiaMaxSpeed) { + speed = inertiaMaxSpeed; + } + + var duration = speed / (inertiaDeceleration * inertiaLinearity), + offset = sign * speed * (duration / 2); + + bearing += offset; + + if (Math.abs(map._normalizeBearing(bearing, 0)) < this._bearingSnap) { + bearing = map._normalizeBearing(0, bearing); + } + + map.rotateTo(bearing, { + duration: duration * 1000, + easing: inertiaEasing, + noMoveStart: true + }, { originalEvent: e }); +}; + +DragRotateHandler.prototype._fireEvent = function _fireEvent (type, e) { + return this._map.fire(type, { originalEvent: e }); +}; + +DragRotateHandler.prototype._ignoreEvent = function _ignoreEvent (e) { + var map = this._map; + + if (map.boxZoom && map.boxZoom.isActive()) return true; + if (map.dragPan && map.dragPan.isActive()) return true; + if (e.touches) { + return (e.touches.length > 1); + } else { + var buttons = (e.ctrlKey ? 1 : 2), // ? ctrl+left button : right button + button = (e.ctrlKey ? 0 : 2); // ? ctrl+left button : right button + var eventButton = e.button; + if (typeof InstallTrigger !== 'undefined' && e.button === 2 && e.ctrlKey && + window.navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // Fix for https://github.com/mapbox/mapbox-gl-js/issues/3131: + // Firefox (detected by InstallTrigger) on Mac determines e.button = 2 when + // using Control + left click + eventButton = 0; + } + return (e.type === 'mousemove' ? e.buttons & buttons === 0 : eventButton !== button); + } +}; + +DragRotateHandler.prototype._drainInertiaBuffer = function _drainInertiaBuffer () { + var inertia = this._inertia, + now = Date.now(), + cutoff = 160; //msec + + while (inertia.length > 0 && now - inertia[0][0] > cutoff) + inertia.shift(); +}; + +module.exports = DragRotateHandler; + +/** + * Fired when a "drag to rotate" interaction starts. See [`DragRotateHandler`](#DragRotateHandler). + * + * @event rotatestart + * @memberof Map + * @instance + * @property {MapMouseEvent | MapTouchEvent} data + */ + +/** + * Fired repeatedly during a "drag to rotate" interaction. See [`DragRotateHandler`](#DragRotateHandler). + * + * @event rotate + * @memberof Map + * @instance + * @property {MapMouseEvent | MapTouchEvent} data + */ + +/** + * Fired when a "drag to rotate" interaction ends. See [`DragRotateHandler`](#DragRotateHandler). + * + * @event rotateend + * @memberof Map + * @instance + * @property {MapMouseEvent | MapTouchEvent} data + */ + +},{"../../util/dom":117,"../../util/util":129,"../../util/window":112}],101:[function(require,module,exports){ +'use strict'; + +var panStep = 100, + bearingStep = 15, + pitchStep = 10; + +/** + * The `KeyboardHandler` allows the user to zoom, rotate, and pan the map using + * the following keyboard shortcuts: + * + * - `=` / `+`: Increase the zoom level by 1. + * - `Shift-=` / `Shift-+`: Increase the zoom level by 2. + * - `-`: Decrease the zoom level by 1. + * - `Shift--`: Decrease the zoom level by 2. + * - Arrow keys: Pan by 100 pixels. + * - `Shift+⇢`: Increase the rotation by 15 degrees. + * - `Shift+⇠`: Decrease the rotation by 15 degrees. + * - `Shift+⇡`: Increase the pitch by 10 degrees. + * - `Shift+⇣`: Decrease the pitch by 10 degrees. + * + * @param {Map} map The Mapbox GL JS map to add the handler to. + */ +var KeyboardHandler = function KeyboardHandler(map) { + this._map = map; + this._el = map.getCanvasContainer(); + + this._onKeyDown = this._onKeyDown.bind(this); +}; + +/** + * Returns a Boolean indicating whether keyboard interaction is enabled. + * + * @returns {boolean} `true` if keyboard interaction is enabled. + */ +KeyboardHandler.prototype.isEnabled = function isEnabled () { + return !!this._enabled; +}; + +/** + * Enables keyboard interaction. + * + * @example + * map.keyboard.enable(); + */ +KeyboardHandler.prototype.enable = function enable () { + if (this.isEnabled()) return; + this._el.addEventListener('keydown', this._onKeyDown, false); + this._enabled = true; +}; + +/** + * Disables keyboard interaction. + * + * @example + * map.keyboard.disable(); + */ +KeyboardHandler.prototype.disable = function disable () { + if (!this.isEnabled()) return; + this._el.removeEventListener('keydown', this._onKeyDown); + this._enabled = false; +}; + +KeyboardHandler.prototype._onKeyDown = function _onKeyDown (e) { + if (e.altKey || e.ctrlKey || e.metaKey) return; + + var zoomDir = 0; + var bearingDir = 0; + var pitchDir = 0; + var xDir = 0; + var yDir = 0; + + switch (e.keyCode) { + case 61: + case 107: + case 171: + case 187: + zoomDir = 1; + break; + + case 189: + case 109: + case 173: + zoomDir = -1; + break; + + case 37: + if (e.shiftKey) { + bearingDir = -1; + } else { + e.preventDefault(); + xDir = -1; + } + break; + + case 39: + if (e.shiftKey) { + bearingDir = 1; + } else { + e.preventDefault(); + xDir = 1; + } + break; + + case 38: + if (e.shiftKey) { + pitchDir = 1; + } else { + e.preventDefault(); + yDir = -1; + } + break; + + case 40: + if (e.shiftKey) { + pitchDir = -1; + } else { + yDir = 1; + e.preventDefault(); + } + break; + } + + var map = this._map; + var zoom = map.getZoom(); + + var easeOptions = { + duration: 300, + delayEndEvents: 500, + easing: easeOut, + + zoom: zoomDir ? Math.round(zoom) + zoomDir * (e.shiftKey ? 2 : 1) : zoom, + bearing: map.getBearing() + bearingDir * bearingStep, + pitch: map.getPitch() + pitchDir * pitchStep, + offset: [-xDir * panStep, -yDir * panStep], + center: map.getCenter() + }; + + map.easeTo(easeOptions, {originalEvent: e}); +}; + +function easeOut(t) { + return t * (2 - t); +} + +module.exports = KeyboardHandler; + +},{}],102:[function(require,module,exports){ +'use strict'; + +var DOM = require('../../util/dom'); +var util = require('../../util/util'); +var browser = require('../../util/browser'); +var window = require('../../util/window'); + +var ua = window.navigator.userAgent.toLowerCase(), + firefox = ua.indexOf('firefox') !== -1, + safari = ua.indexOf('safari') !== -1 && ua.indexOf('chrom') === -1; + +/** + * The `ScrollZoomHandler` allows the user to zoom the map by scrolling. + * + * @param {Map} map The Mapbox GL JS map to add the handler to. + */ +var ScrollZoomHandler = function ScrollZoomHandler(map) { + this._map = map; + this._el = map.getCanvasContainer(); + + util.bindAll([ + '_onWheel', + '_onTimeout' + ], this); +}; + +/** + * Returns a Boolean indicating whether the "scroll to zoom" interaction is enabled. + * + * @returns {boolean} `true` if the "scroll to zoom" interaction is enabled. + */ +ScrollZoomHandler.prototype.isEnabled = function isEnabled () { + return !!this._enabled; +}; + +/** + * Enables the "scroll to zoom" interaction. + * + * @param {Object} [options] + * @param {string} [options.around] If "center" is passed, map will zoom around center of map + * + * @example + * map.scrollZoom.enable(); + * @example + * map.scrollZoom.enable({ around: 'center' }) + */ +ScrollZoomHandler.prototype.enable = function enable (options) { + if (this.isEnabled()) return; + this._el.addEventListener('wheel', this._onWheel, false); + this._el.addEventListener('mousewheel', this._onWheel, false); + this._enabled = true; + this._aroundCenter = options && options.around === 'center'; +}; + +/** + * Disables the "scroll to zoom" interaction. + * + * @example + * map.scrollZoom.disable(); + */ +ScrollZoomHandler.prototype.disable = function disable () { + if (!this.isEnabled()) return; + this._el.removeEventListener('wheel', this._onWheel); + this._el.removeEventListener('mousewheel', this._onWheel); + this._enabled = false; +}; + +ScrollZoomHandler.prototype._onWheel = function _onWheel (e) { + var value; + + if (e.type === 'wheel') { + value = e.deltaY; + // Firefox doubles the values on retina screens... + if (firefox && e.deltaMode === window.WheelEvent.DOM_DELTA_PIXEL) value /= browser.devicePixelRatio; + if (e.deltaMode === window.WheelEvent.DOM_DELTA_LINE) value *= 40; + + } else if (e.type === 'mousewheel') { + value = -e.wheelDeltaY; + if (safari) value = value / 3; + } + + var now = browser.now(), + timeDelta = now - (this._time || 0); + + this._pos = DOM.mousePos(this._el, e); + this._time = now; + + if (value !== 0 && (value % 4.000244140625) === 0) { + // This one is definitely a mouse wheel event. + this._type = 'wheel'; + + } else if (value !== 0 && Math.abs(value) < 4) { + // This one is definitely a trackpad event because it is so small. + this._type = 'trackpad'; + + } else if (timeDelta > 400) { + // This is likely a new scroll action. + this._type = null; + this._lastValue = value; + + // Start a timeout in case this was a singular event, and dely it by up to 40ms. + this._timeout = setTimeout(this._onTimeout, 40); + + } else if (!this._type) { + // This is a repeating event, but we don't know the type of event just yet. + // If the delta per time is small, we assume it's a fast trackpad; otherwise we switch into wheel mode. + this._type = (Math.abs(timeDelta * value) < 200) ? 'trackpad' : 'wheel'; + + // Make sure our delayed event isn't fired again, because we accumulate + // the previous event (which was less than 40ms ago) into this event. + if (this._timeout) { + clearTimeout(this._timeout); + this._timeout = null; + value += this._lastValue; + } + } + + // Slow down zoom if shift key is held for more precise zooming + if (e.shiftKey && value) value = value / 4; + + // Only fire the callback if we actually know what type of scrolling device the user uses. + if (this._type) this._zoom(-value, e); + + e.preventDefault(); +}; + +ScrollZoomHandler.prototype._onTimeout = function _onTimeout () { + this._type = 'wheel'; + this._zoom(-this._lastValue); +}; + +ScrollZoomHandler.prototype._zoom = function _zoom (delta, e) { + if (delta === 0) return; + var map = this._map; + + // Scale by sigmoid of scroll wheel delta. + var scale = 2 / (1 + Math.exp(-Math.abs(delta / 100))); + if (delta < 0 && scale !== 0) scale = 1 / scale; + + var fromScale = map.ease ? map.ease.to : map.transform.scale, + targetZoom = map.transform.scaleZoom(fromScale * scale); + + map.zoomTo(targetZoom, { + duration: this._type === 'wheel' ? 200 : 0, + around: this._aroundCenter ? map.getCenter() : map.unproject(this._pos), + delayEndEvents: 200, + smoothEasing: true + }, { originalEvent: e }); +}; + +module.exports = ScrollZoomHandler; + +/** + * Fired just before the map begins a transition from one zoom level to another, + * as the result of either user interaction or methods such as [Map#flyTo](#Map#flyTo). + * + * @event zoomstart + * @memberof Map + * @instance + * @property {MapMouseEvent | MapTouchEvent} data + */ + +/** + * Fired repeatedly during an animated transition from one zoom level to another, + * as the result of either user interaction or methods such as [Map#flyTo](#Map#flyTo). + * + * @event zoom + * @memberof Map + * @instance + * @property {MapMouseEvent | MapTouchEvent} data + * @see [Update a choropleth layer by zoom level](https://www.mapbox.com/mapbox-gl-js/example/updating-choropleth/) + */ + +/** + * Fired just after the map completes a transition from one zoom level to another, + * as the result of either user interaction or methods such as [Map#flyTo](#Map#flyTo). + * + * @event zoomend + * @memberof Map + * @instance + * @property {MapMouseEvent | MapTouchEvent} data + */ + +},{"../../util/browser":110,"../../util/dom":117,"../../util/util":129,"../../util/window":112}],103:[function(require,module,exports){ +'use strict'; + +var DOM = require('../../util/dom'); +var util = require('../../util/util'); +var window = require('../../util/window'); + +var inertiaLinearity = 0.15, + inertiaEasing = util.bezier(0, 0, inertiaLinearity, 1), + inertiaDeceleration = 12, // scale / s^2 + inertiaMaxSpeed = 2.5, // scale / s + significantScaleThreshold = 0.15, + significantRotateThreshold = 4; + +/** + * The `TouchZoomRotateHandler` allows the user to zoom and rotate the map by + * pinching on a touchscreen. + * + * @param {Map} map The Mapbox GL JS map to add the handler to. + */ +var TouchZoomRotateHandler = function TouchZoomRotateHandler(map) { + this._map = map; + this._el = map.getCanvasContainer(); + + util.bindAll([ + '_onStart', + '_onMove', + '_onEnd' + ], this); +}; + +/** + * Returns a Boolean indicating whether the "pinch to rotate and zoom" interaction is enabled. + * + * @returns {boolean} `true` if the "pinch to rotate and zoom" interaction is enabled. + */ +TouchZoomRotateHandler.prototype.isEnabled = function isEnabled () { + return !!this._enabled; +}; + +/** + * Enables the "pinch to rotate and zoom" interaction. + * + * @param {Object} [options] + * @param {string} [options.around] If "center" is passed, map will zoom around the center + * + * @example + * map.touchZoomRotate.enable(); + * @example + * map.touchZoomRotate.enable({ around: 'center' }); + */ +TouchZoomRotateHandler.prototype.enable = function enable (options) { + if (this.isEnabled()) return; + this._el.addEventListener('touchstart', this._onStart, false); + this._enabled = true; + this._aroundCenter = options && options.around === 'center'; +}; + +/** + * Disables the "pinch to rotate and zoom" interaction. + * + * @example + * map.touchZoomRotate.disable(); + */ +TouchZoomRotateHandler.prototype.disable = function disable () { + if (!this.isEnabled()) return; + this._el.removeEventListener('touchstart', this._onStart); + this._enabled = false; +}; + +/** + * Disables the "pinch to rotate" interaction, leaving the "pinch to zoom" + * interaction enabled. + * + * @example + * map.touchZoomRotate.disableRotation(); + */ +TouchZoomRotateHandler.prototype.disableRotation = function disableRotation () { + this._rotationDisabled = true; +}; + +/** + * Enables the "pinch to rotate" interaction. + * + * @example + * map.touchZoomRotate.enable(); + * map.touchZoomRotate.enableRotation(); + */ +TouchZoomRotateHandler.prototype.enableRotation = function enableRotation () { + this._rotationDisabled = false; +}; + +TouchZoomRotateHandler.prototype._onStart = function _onStart (e) { + if (e.touches.length !== 2) return; + + var p0 = DOM.mousePos(this._el, e.touches[0]), + p1 = DOM.mousePos(this._el, e.touches[1]); + + this._startVec = p0.sub(p1); + this._startScale = this._map.transform.scale; + this._startBearing = this._map.transform.bearing; + this._gestureIntent = undefined; + this._inertia = []; + + window.document.addEventListener('touchmove', this._onMove, false); + window.document.addEventListener('touchend', this._onEnd, false); +}; + +TouchZoomRotateHandler.prototype._onMove = function _onMove (e) { + if (e.touches.length !== 2) return; + + var p0 = DOM.mousePos(this._el, e.touches[0]), + p1 = DOM.mousePos(this._el, e.touches[1]), + p = p0.add(p1).div(2), + vec = p0.sub(p1), + scale = vec.mag() / this._startVec.mag(), + bearing = this._rotationDisabled ? 0 : vec.angleWith(this._startVec) * 180 / Math.PI, + map = this._map; + + // Determine 'intent' by whichever threshold is surpassed first, + // then keep that state for the duration of this gesture. + if (!this._gestureIntent) { + var scalingSignificantly = (Math.abs(1 - scale) > significantScaleThreshold), + rotatingSignificantly = (Math.abs(bearing) > significantRotateThreshold); + + if (rotatingSignificantly) { + this._gestureIntent = 'rotate'; + } else if (scalingSignificantly) { + this._gestureIntent = 'zoom'; + } + + if (this._gestureIntent) { + this._startVec = vec; + this._startScale = map.transform.scale; + this._startBearing = map.transform.bearing; + } + + } else { + var param = { duration: 0, around: map.unproject(p) }; + + if (this._gestureIntent === 'rotate') { + param.bearing = this._startBearing + bearing; + } + if (this._gestureIntent === 'zoom' || this._gestureIntent === 'rotate') { + param.zoom = map.transform.scaleZoom(this._startScale * scale); + } + + map.stop(); + this._drainInertiaBuffer(); + this._inertia.push([Date.now(), scale, p]); + + map.easeTo(param, { originalEvent: e }); + } + + e.preventDefault(); +}; + +TouchZoomRotateHandler.prototype._onEnd = function _onEnd (e) { + window.document.removeEventListener('touchmove', this._onMove); + window.document.removeEventListener('touchend', this._onEnd); + this._drainInertiaBuffer(); + + var inertia = this._inertia, + map = this._map; + + if (inertia.length < 2) { + map.snapToNorth({}, { originalEvent: e }); + return; + } + + var last = inertia[inertia.length - 1], + first = inertia[0], + lastScale = map.transform.scaleZoom(this._startScale * last[1]), + firstScale = map.transform.scaleZoom(this._startScale * first[1]), + scaleOffset = lastScale - firstScale, + scaleDuration = (last[0] - first[0]) / 1000, + p = last[2]; + + if (scaleDuration === 0 || lastScale === firstScale) { + map.snapToNorth({}, { originalEvent: e }); + return; + } + + // calculate scale/s speed and adjust for increased initial animation speed when easing + var speed = scaleOffset * inertiaLinearity / scaleDuration; // scale/s + + if (Math.abs(speed) > inertiaMaxSpeed) { + if (speed > 0) { + speed = inertiaMaxSpeed; + } else { + speed = -inertiaMaxSpeed; + } + } + + var duration = Math.abs(speed / (inertiaDeceleration * inertiaLinearity)) * 1000; + var targetScale = lastScale + speed * duration / 2000; + + if (targetScale < 0) { + targetScale = 0; + } + + map.easeTo({ + zoom: targetScale, + duration: duration, + easing: inertiaEasing, + around: this._aroundCenter ? map.getCenter() : map.unproject(p) + }, { originalEvent: e }); +}; + +TouchZoomRotateHandler.prototype._drainInertiaBuffer = function _drainInertiaBuffer () { + var inertia = this._inertia, + now = Date.now(), + cutoff = 160; // msec + + while (inertia.length > 2 && now - inertia[0][0] > cutoff) inertia.shift(); +}; + +module.exports = TouchZoomRotateHandler; + +},{"../../util/dom":117,"../../util/util":129,"../../util/window":112}],104:[function(require,module,exports){ +'use strict'; + +var util = require('../util/util'); +var window = require('../util/window'); + +/* + * Adds the map's position to its page's location hash. + * Passed as an option to the map object. + * + * @returns {Hash} `this` + */ +var Hash = function Hash() { + util.bindAll([ + '_onHashChange', + '_updateHash' + ], this); +}; + +/* + * Map element to listen for coordinate changes + * + * @param {Object} map + * @returns {Hash} `this` + */ +Hash.prototype.addTo = function addTo (map) { + this._map = map; + window.addEventListener('hashchange', this._onHashChange, false); + this._map.on('moveend', this._updateHash); + return this; +}; + +/* + * Removes hash + * + * @returns {Popup} `this` + */ +Hash.prototype.remove = function remove () { + window.removeEventListener('hashchange', this._onHashChange, false); + this._map.off('moveend', this._updateHash); + delete this._map; + return this; +}; + +Hash.prototype._onHashChange = function _onHashChange () { + var loc = window.location.hash.replace('#', '').split('/'); + if (loc.length >= 3) { + this._map.jumpTo({ + center: [+loc[2], +loc[1]], + zoom: +loc[0], + bearing: +(loc[3] || 0), + pitch: +(loc[4] || 0) + }); + return true; + } + return false; +}; + +Hash.prototype._updateHash = function _updateHash () { + var center = this._map.getCenter(), + zoom = this._map.getZoom(), + bearing = this._map.getBearing(), + pitch = this._map.getPitch(), + precision = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2)); + + var hash = "#" + (Math.round(zoom * 100) / 100) + "/" + (center.lat.toFixed(precision)) + "/" + (center.lng.toFixed(precision)); + + if (bearing || pitch) hash += (("/" + (Math.round(bearing * 10) / 10))); + if (pitch) hash += (("/" + (Math.round(pitch)))); + + window.history.replaceState('', '', hash); +}; + +module.exports = Hash; + +},{"../util/util":129,"../util/window":112}],105:[function(require,module,exports){ +'use strict'; + +var util = require('../util/util'); +var browser = require('../util/browser'); +var window = require('../util/window'); +var DOM = require('../util/dom'); + +var Style = require('../style/style'); +var AnimationLoop = require('../style/animation_loop'); +var Painter = require('../render/painter'); + +var Transform = require('../geo/transform'); +var Hash = require('./hash'); + +var bindHandlers = require('./bind_handlers'); + +var Camera = require('./camera'); +var LngLat = require('../geo/lng_lat'); +var LngLatBounds = require('../geo/lng_lat_bounds'); +var Point = require('point-geometry'); +var AttributionControl = require('./control/attribution_control'); +var isSupported = require('mapbox-gl-supported'); + +var defaultMinZoom = 0; +var defaultMaxZoom = 20; +var defaultOptions = { + center: [0, 0], + zoom: 0, + bearing: 0, + pitch: 0, + + minZoom: defaultMinZoom, + maxZoom: defaultMaxZoom, + + interactive: true, + + scrollZoom: true, + boxZoom: true, + dragRotate: true, + dragPan: true, + keyboard: true, + doubleClickZoom: true, + touchZoomRotate: true, + + bearingSnap: 7, + + hash: false, + + attributionControl: true, + + failIfMajorPerformanceCaveat: false, + preserveDrawingBuffer: false, + + trackResize: true, + + renderWorldCopies: true +}; + +/** + * The `Map` object represents the map on your page. It exposes methods + * and properties that enable you to programmatically change the map, + * and fires events as users interact with it. + * + * You create a `Map` by specifying a `container` and other options. + * Then Mapbox GL JS initializes the map on the page and returns your `Map` + * object. + * + * @extends Evented + * @param {Object} options + * @param {HTMLElement|string} options.container The HTML element in which Mapbox GL JS will render the map, or the element's string `id`. + * @param {number} [options.minZoom=0] The minimum zoom level of the map (1-20). + * @param {number} [options.maxZoom=20] The maximum zoom level of the map (1-20). + * @param {Object|string} [options.style] The map's Mapbox style. This must be an a JSON object conforming to + * the schema described in the [Mapbox Style Specification](https://mapbox.com/mapbox-gl-style-spec/), or a URL to + * such JSON. + * + * To load a style from the Mapbox API, you can use a URL of the form `mapbox://styles/:owner/:style`, + * where `:owner` is your Mapbox account name and `:style` is the style ID. Or you can use one of the following + * [the predefined Mapbox styles](https://www.mapbox.com/maps/): + * + * * `mapbox://styles/mapbox/streets-v9` + * * `mapbox://styles/mapbox/outdoors-v9` + * * `mapbox://styles/mapbox/light-v9` + * * `mapbox://styles/mapbox/dark-v9` + * * `mapbox://styles/mapbox/satellite-v9` + * * `mapbox://styles/mapbox/satellite-streets-v9` + * + * Tilesets hosted with Mapbox can be style-optimized if you append `?optimize=true` to the end of your style URL, like `mapbox://styles/mapbox/streets-v9?optimize=true`. + * Learn more about style-optimized vector tiles in our [API documentation](https://www.mapbox.com/api-documentation/#retrieve-tiles). + * + * @param {boolean} [options.hash=false] If `true`, the map's position (zoom, center latitude, center longitude, bearing, and pitch) will be synced with the hash fragment of the page's URL. + * For example, `http://path/to/my/page.html#2.59/39.26/53.07/-24.1/60`. + * @param {boolean} [options.interactive=true] If `false`, no mouse, touch, or keyboard listeners will be attached to the map, so it will not respond to interaction. + * @param {number} [options.bearingSnap=7] The threshold, measured in degrees, that determines when the map's + * bearing (rotation) will snap to north. For example, with a `bearingSnap` of 7, if the user rotates + * the map within 7 degrees of north, the map will automatically snap to exact north. + * @param {Array} [options.classes] Mapbox style class names with which to initialize the map. + * Keep in mind that these classes are used for controlling a style layer's paint properties, so are *not* reflected + * in an HTML element's `class` attribute. To learn more about Mapbox style classes, read about + * [Layers](https://www.mapbox.com/mapbox-gl-style-spec/#layers) in the style specification. + * @param {boolean} [options.attributionControl=true] If `true`, an [AttributionControl](#AttributionControl) will be added to the map. + * @param {boolean} [options.failIfMajorPerformanceCaveat=false] If `true`, map creation will fail if the performance of Mapbox + * GL JS would be dramatically worse than expected (i.e. a software renderer would be used). + * @param {boolean} [options.preserveDrawingBuffer=false] If `true`, the map's canvas can be exported to a PNG using `map.getCanvas().toDataURL()`. This is `false` by default as a performance optimization. + * @param {LngLatBoundsLike} [options.maxBounds] If set, the map will be constrained to the given bounds. + * @param {boolean|Object} [options.scrollZoom=true] If `true`, the "scroll to zoom" interaction is enabled. An `Object` value is passed as options to [`ScrollZoomHandler#enable`](#ScrollZoomHandler#enable). + * @param {boolean} [options.boxZoom=true] If `true`, the "box zoom" interaction is enabled (see [`BoxZoomHandler`](#BoxZoomHandler)). + * @param {boolean} [options.dragRotate=true] If `true`, the "drag to rotate" interaction is enabled (see [`DragRotateHandler`](#DragRotateHandler)). + * @param {boolean} [options.dragPan=true] If `true`, the "drag to pan" interaction is enabled (see [`DragPanHandler`](#DragPanHandler)). + * @param {boolean} [options.keyboard=true] If `true`, keyboard shortcuts are enabled (see [`KeyboardHandler`](#KeyboardHandler)). + * @param {boolean} [options.doubleClickZoom=true] If `true`, the "double click to zoom" interaction is enabled (see [`DoubleClickZoomHandler`](#DoubleClickZoomHandler)). + * @param {boolean|Object} [options.touchZoomRotate=true] If `true`, the "pinch to rotate and zoom" interaction is enabled. An `Object` value is passed as options to [`TouchZoomRotateHandler#enable`](#TouchZoomRotateHandler#enable). + * @param {boolean} [options.trackResize=true] If `true`, the map will automatically resize when the browser window resizes. + * @param {LngLatLike} [options.center=[0, 0]] The inital geographical centerpoint of the map. If `center` is not specified in the constructor options, Mapbox GL JS will look for it in the map's style object. If it is not specified in the style, either, it will default to `[0, 0]`. + * @param {number} [options.zoom=0] The initial zoom level of the map. If `zoom` is not specified in the constructor options, Mapbox GL JS will look for it in the map's style object. If it is not specified in the style, either, it will default to `0`. + * @param {number} [options.bearing=0] The initial bearing (rotation) of the map, measured in degrees counter-clockwise from north. If `bearing` is not specified in the constructor options, Mapbox GL JS will look for it in the map's style object. If it is not specified in the style, either, it will default to `0`. + * @param {number} [options.pitch=0] The initial pitch (tilt) of the map, measured in degrees away from the plane of the screen (0-60). If `pitch` is not specified in the constructor options, Mapbox GL JS will look for it in the map's style object. If it is not specified in the style, either, it will default to `0`. + * @param {boolean} [options.renderWorldCopies=true] If `true`, multiple copies of the world will be rendered, when zoomed out. + * @example + * var map = new mapboxgl.Map({ + * container: 'map', + * center: [-122.420679, 37.772537], + * zoom: 13, + * style: style_object, + * hash: true + * }); + * @see [Display a map](https://www.mapbox.com/mapbox-gl-js/examples/) + */ +var Map = (function (Camera) { + function Map(options) { + var this$1 = this; + + options = util.extend({}, defaultOptions, options); + + var transform = new Transform(options.minZoom, options.maxZoom, options.renderWorldCopies); + Camera.call(this, transform, options); + + this._interactive = options.interactive; + this._failIfMajorPerformanceCaveat = options.failIfMajorPerformanceCaveat; + this._preserveDrawingBuffer = options.preserveDrawingBuffer; + this._trackResize = options.trackResize; + this._bearingSnap = options.bearingSnap; + + if (typeof options.container === 'string') { + this._container = window.document.getElementById(options.container); + if (!this._container) throw new Error(("Container '" + (options.container) + "' not found.")); + } else { + this._container = options.container; + } + + this.animationLoop = new AnimationLoop(); + + if (options.maxBounds) { + this.setMaxBounds(options.maxBounds); + } + + util.bindAll([ + '_onWindowOnline', + '_onWindowResize', + '_contextLost', + '_contextRestored', + '_update', + '_render', + '_onData', + '_onDataLoading' + ], this); + + this._setupContainer(); + this._setupPainter(); + + this.on('move', this._update.bind(this, false)); + this.on('zoom', this._update.bind(this, true)); + this.on('moveend', function () { + this$1.animationLoop.set(300); // text fading + this$1._rerender(); + }); + + if (typeof window !== 'undefined') { + window.addEventListener('online', this._onWindowOnline, false); + window.addEventListener('resize', this._onWindowResize, false); + } + + bindHandlers(this, options); + + this._hash = options.hash && (new Hash()).addTo(this); + // don't set position from options if set through hash + if (!this._hash || !this._hash._onHashChange()) { + this.jumpTo({ + center: options.center, + zoom: options.zoom, + bearing: options.bearing, + pitch: options.pitch + }); + } + + this._classes = []; + + this.resize(); + + if (options.classes) this.setClasses(options.classes); + if (options.style) this.setStyle(options.style); + + if (options.attributionControl) this.addControl(new AttributionControl()); + + this.on('style.load', function() { + if (this.transform.unmodified) { + this.jumpTo(this.style.stylesheet); + } + this.style.update(this._classes, {transition: false}); + }); + + this.on('data', this._onData); + this.on('dataloading', this._onDataLoading); + } + + if ( Camera ) Map.__proto__ = Camera; + Map.prototype = Object.create( Camera && Camera.prototype ); + Map.prototype.constructor = Map; + + var prototypeAccessors = { showTileBoundaries: {},showCollisionBoxes: {},showOverdrawInspector: {},repaint: {},vertices: {} }; + + /** + * Adds a [`IControl`](#IControl) to the map, calling `control.onAdd(this)`. + * + * @param {IControl} control The [`IControl`](#IControl) to add. + * @param {string} [position] position on the map to which the control will be added. + * Valid values are `'top-left'`, `'top-right'`, `'bottom-left'`, and `'bottom-right'`. Defaults to `'top-right'`. + * @returns {Map} `this` + * @see [Display map navigation controls](https://www.mapbox.com/mapbox-gl-js/example/navigation/) + */ + Map.prototype.addControl = function addControl (control, position) { + if (position === undefined && control.getDefaultPosition) { + position = control.getDefaultPosition(); + } + if (position === undefined) { + position = 'top-right'; + } + var controlElement = control.onAdd(this); + var positionContainer = this._controlPositions[position]; + if (position.indexOf('bottom') !== -1) { + positionContainer.insertBefore(controlElement, positionContainer.firstChild); + } else { + positionContainer.appendChild(controlElement); + } + return this; + }; + + /** + * Removes the control from the map. + * + * @param {IControl} control The [`IControl`](#IControl) to remove. + * @returns {Map} `this` + */ + Map.prototype.removeControl = function removeControl (control) { + control.onRemove(this); + return this; + }; + + /** + * Adds a Mapbox style class to the map. + * + * Keep in mind that these classes are used for controlling a style layer's paint properties, so are *not* reflected + * in an HTML element's `class` attribute. To learn more about Mapbox style classes, read about + * [Layers](https://www.mapbox.com/mapbox-gl-style-spec/#layers) in the style specification. + * + * **Note:** Style classes are deprecated and will be removed in an upcoming release of Mapbox GL JS. + * + * @param {string} klass The style class to add. + * @param {StyleOptions} [options] + * @fires change + * @returns {Map} `this` + */ + Map.prototype.addClass = function addClass (klass, options) { + util.warnOnce('Style classes are deprecated and will be removed in an upcoming release of Mapbox GL JS.'); + if (this._classes.indexOf(klass) >= 0 || klass === '') return this; + this._classes.push(klass); + this._classOptions = options; + + if (this.style) this.style.updateClasses(); + return this._update(true); + }; + + /** + * Removes a Mapbox style class from the map. + * + * **Note:** Style classes are deprecated and will be removed in an upcoming release of Mapbox GL JS. + * + * @param {string} klass The style class to remove. + * @param {StyleOptions} [options] + * @fires change + * @returns {Map} `this` + */ + Map.prototype.removeClass = function removeClass (klass, options) { + util.warnOnce('Style classes are deprecated and will be removed in an upcoming release of Mapbox GL JS.'); + var i = this._classes.indexOf(klass); + if (i < 0 || klass === '') return this; + this._classes.splice(i, 1); + this._classOptions = options; + + if (this.style) this.style.updateClasses(); + return this._update(true); + }; + + /** + * Replaces the map's existing Mapbox style classes with a new array of classes. + * + * **Note:** Style classes are deprecated and will be removed in an upcoming release of Mapbox GL JS. + * + * @param {Array} klasses The style classes to set. + * @param {StyleOptions} [options] + * @fires change + * @returns {Map} `this` + */ + Map.prototype.setClasses = function setClasses (klasses, options) { + util.warnOnce('Style classes are deprecated and will be removed in an upcoming release of Mapbox GL JS.'); + var uniqueClasses = {}; + for (var i = 0; i < klasses.length; i++) { + if (klasses[i] !== '') uniqueClasses[klasses[i]] = true; + } + this._classes = Object.keys(uniqueClasses); + this._classOptions = options; + + if (this.style) this.style.updateClasses(); + return this._update(true); + }; + + /** + * Returns a Boolean indicating whether the map has the + * specified Mapbox style class. + * + * **Note:** Style classes are deprecated and will be removed in an upcoming release of Mapbox GL JS. + * + * @param {string} klass The style class to test. + * @returns {boolean} `true` if the map has the specified style class. + */ + Map.prototype.hasClass = function hasClass (klass) { + util.warnOnce('Style classes are deprecated and will be removed in an upcoming release of Mapbox GL JS.'); + return this._classes.indexOf(klass) >= 0; + }; + + /** + * Returns the map's Mapbox style classes. + * + * **Note:** Style classes are deprecated and will be removed in an upcoming release of Mapbox GL JS. + * + * @returns {Array} The map's style classes. + */ + Map.prototype.getClasses = function getClasses () { + util.warnOnce('Style classes are deprecated and will be removed in an upcoming release of Mapbox GL JS.'); + return this._classes; + }; + + /** + * Resizes the map according to the dimensions of its + * `container` element. + * + * This method must be called after the map's `container` is resized by another script, + * or when the map is shown after being initially hidden with CSS. + * + * @returns {Map} `this` + */ + Map.prototype.resize = function resize () { + var dimensions = this._containerDimensions(); + var width = dimensions[0]; + var height = dimensions[1]; + + this._resizeCanvas(width, height); + this.transform.resize(width, height); + this.painter.resize(width, height); + + var gl = this.painter.gl; + var maxSize = gl.getParameter(gl.MAX_RENDERBUFFER_SIZE) / 2; + if (this._canvas.width > maxSize || this._canvas.height > maxSize) { + util.warnOnce( + "Map is larger than maximum size supported by this system " + + "(" + maxSize + "px by " + maxSize + "px)." + ); + } + + return this + .fire('movestart') + .fire('move') + .fire('resize') + .fire('moveend'); + }; + + /** + * Returns the map's geographical bounds. + * + * @returns {LngLatBounds} The map's geographical bounds. + */ + Map.prototype.getBounds = function getBounds () { + var bounds = new LngLatBounds( + this.transform.pointLocation(new Point(0, this.transform.height)), + this.transform.pointLocation(new Point(this.transform.width, 0))); + + if (this.transform.angle || this.transform.pitch) { + bounds.extend(this.transform.pointLocation(new Point(this.transform.size.x, 0))); + bounds.extend(this.transform.pointLocation(new Point(0, this.transform.size.y))); + } + + return bounds; + }; + + /** + * Sets or clears the map's geographical bounds. + * + * Pan and zoom operations are constrained within these bounds. + * If a pan or zoom is performed that would + * display regions outside these bounds, the map will + * instead display a position and zoom level + * as close as possible to the operation's request while still + * remaining within the bounds. + * + * @param {LngLatBoundsLike | null | undefined} lnglatbounds The maximum bounds to set. If `null` or `undefined` is provided, the function removes the map's maximum bounds. + * @returns {Map} `this` + */ + Map.prototype.setMaxBounds = function setMaxBounds (lnglatbounds) { + if (lnglatbounds) { + var b = LngLatBounds.convert(lnglatbounds); + this.transform.lngRange = [b.getWest(), b.getEast()]; + this.transform.latRange = [b.getSouth(), b.getNorth()]; + this.transform._constrain(); + this._update(); + } else if (lnglatbounds === null || lnglatbounds === undefined) { + this.transform.lngRange = []; + this.transform.latRange = []; + this._update(); + } + return this; + + }; + /** + * Sets or clears the map's minimum zoom level. + * If the map's current zoom level is lower than the new minimum, + * the map will zoom to the new minimum. + * + * @param {?number} minZoom The minimum zoom level to set (0-20). + * If `null` or `undefined` is provided, the function removes the current minimum zoom (i.e. sets it to 0). + * @returns {Map} `this` + */ + Map.prototype.setMinZoom = function setMinZoom (minZoom) { + + minZoom = minZoom === null || minZoom === undefined ? defaultMinZoom : minZoom; + + if (minZoom >= defaultMinZoom && minZoom <= this.transform.maxZoom) { + this.transform.minZoom = minZoom; + this._update(); + + if (this.getZoom() < minZoom) this.setZoom(minZoom); + + return this; + + } else throw new Error(("minZoom must be between " + defaultMinZoom + " and the current maxZoom, inclusive")); + }; + + /** + * Returns the map's minimum allowable zoom level. + * + * @returns {number} minZoom + */ + Map.prototype.getMinZoom = function getMinZoom () { return this.transform.minZoom; }; + + /** + * Sets or clears the map's maximum zoom level. + * If the map's current zoom level is higher than the new maximum, + * the map will zoom to the new maximum. + * + * @param {?number} maxZoom The maximum zoom level to set. + * If `null` or `undefined` is provided, the function removes the current maximum zoom (sets it to 20). + * @returns {Map} `this` + */ + Map.prototype.setMaxZoom = function setMaxZoom (maxZoom) { + + maxZoom = maxZoom === null || maxZoom === undefined ? defaultMaxZoom : maxZoom; + + if (maxZoom >= this.transform.minZoom) { + this.transform.maxZoom = maxZoom; + this._update(); + + if (this.getZoom() > maxZoom) this.setZoom(maxZoom); + + return this; + + } else throw new Error("maxZoom must be greater than the current minZoom"); + }; + + /** + * Returns the map's maximum allowable zoom level. + * + * @returns {number} maxZoom + */ + Map.prototype.getMaxZoom = function getMaxZoom () { return this.transform.maxZoom; }; + + /** + * Returns a [`Point`](#Point) representing pixel coordinates, relative to the map's `container`, + * that correspond to the specified geographical location. + * + * @param {LngLatLike} lnglat The geographical location to project. + * @returns {Point} The [`Point`](#Point) corresponding to `lnglat`, relative to the map's `container`. + */ + Map.prototype.project = function project (lnglat) { + return this.transform.locationPoint(LngLat.convert(lnglat)); + }; + + /** + * Returns a [`LngLat`](#LngLat) representing geographical coordinates that correspond + * to the specified pixel coordinates. + * + * @param {PointLike} point The pixel coordinates to unproject. + * @returns {LngLat} The [`LngLat`](#LngLat) corresponding to `point`. + * @see [Show polygon information on click](https://www.mapbox.com/mapbox-gl-js/example/polygon-popup-on-click/) + */ + Map.prototype.unproject = function unproject (point) { + return this.transform.pointLocation(Point.convert(point)); + }; + + /** + * Returns an array of [GeoJSON](http://geojson.org/) + * [Feature objects](http://geojson.org/geojson-spec.html#feature-objects) + * representing visible features that satisfy the query parameters. + * + * @param {PointLike|Array} [geometry] - The geometry of the query region: + * either a single point or southwest and northeast points describing a bounding box. + * Omitting this parameter (i.e. calling [`Map#queryRenderedFeatures`](#Map#queryRenderedFeatures) with zero arguments, + * or with only a `parameters` argument) is equivalent to passing a bounding box encompassing the entire + * map viewport. + * @param {Object} [parameters] + * @param {Array} [parameters.layers] An array of style layer IDs for the query to inspect. + * Only features within these layers will be returned. If this parameter is undefined, all layers will be checked. + * @param {Array} [parameters.filter] A [filter](https://www.mapbox.com/mapbox-gl-style-spec/#types-filter) + * to limit query results. + * + * @returns {Array} An array of [GeoJSON](http://geojson.org/) + * [feature objects](http://geojson.org/geojson-spec.html#feature-objects). + * + * The `properties` value of each returned feature object contains the properties of its source feature. For GeoJSON sources, only + * string and numeric property values are supported (i.e. `null`, `Array`, and `Object` values are not supported). + * + * Each feature includes a top-level `layer` property whose value is an object representing the style layer to + * which the feature belongs. Layout and paint properties in this object contain values which are fully evaluated + * for the given zoom level and feature. + * + * Features from layers whose `visibility` property is `"none"`, or from layers whose zoom range excludes the + * current zoom level are not included. Symbol features that have been hidden due to text or icon collision are + * not included. Features from all other layers are included, including features that may have no visible + * contribution to the rendered result; for example, because the layer's opacity or color alpha component is set to + * 0. + * + * The topmost rendered feature appears first in the returned array, and subsequent features are sorted by + * descending z-order. Features that are rendered multiple times (due to wrapping across the antimeridian at low + * zoom levels) are returned only once (though subject to the following caveat). + * + * Because features come from tiled vector data or GeoJSON data that is converted to tiles internally, feature + * geometries may be split or duplicated across tile boundaries and, as a result, features may appear multiple + * times in query results. For example, suppose there is a highway running through the bounding rectangle of a query. + * The results of the query will be those parts of the highway that lie within the map tiles covering the bounding + * rectangle, even if the highway extends into other tiles, and the portion of the highway within each map tile + * will be returned as a separate feature. Similarly, a point feature near a tile boundary may appear in multiple + * tiles due to tile buffering. + * + * @example + * // Find all features at a point + * var features = map.queryRenderedFeatures( + * [20, 35], + * { layers: ['my-layer-name'] } + * ); + * + * @example + * // Find all features within a static bounding box + * var features = map.queryRenderedFeatures( + * [[10, 20], [30, 50]], + * { layers: ['my-layer-name'] } + * ); + * + * @example + * // Find all features within a bounding box around a point + * var width = 10; + * var height = 20; + * var features = map.queryRenderedFeatures([ + * [point.x - width / 2, point.y - height / 2], + * [point.x + width / 2, point.y + height / 2] + * ], { layers: ['my-layer-name'] }); + * + * @example + * // Query all rendered features from a single layer + * var features = map.queryRenderedFeatures({ layers: ['my-layer-name'] }); + * @see [Get features under the mouse pointer](https://www.mapbox.com/mapbox-gl-js/example/queryrenderedfeatures/) + * @see [Highlight features within a bounding box](https://www.mapbox.com/mapbox-gl-js/example/using-box-queryrenderedfeatures/) + * @see [Center the map on a clicked symbol](https://www.mapbox.com/mapbox-gl-js/example/center-on-symbol/) + */ + Map.prototype.queryRenderedFeatures = function queryRenderedFeatures () { + var params = {}; + var geometry; + + if (arguments.length === 2) { + geometry = arguments[0]; + params = arguments[1]; + } else if (arguments.length === 1 && isPointLike(arguments[0])) { + geometry = arguments[0]; + } else if (arguments.length === 1) { + params = arguments[0]; + } + + return this.style.queryRenderedFeatures( + this._makeQueryGeometry(geometry), + params, + this.transform.zoom, + this.transform.angle + ); + + function isPointLike(input) { + return input instanceof Point || Array.isArray(input); + } + }; + + Map.prototype._makeQueryGeometry = function _makeQueryGeometry (pointOrBox) { + var this$1 = this; + + if (pointOrBox === undefined) { + // bounds was omitted: use full viewport + pointOrBox = [ + Point.convert([0, 0]), + Point.convert([this.transform.width, this.transform.height]) + ]; + } + + var queryGeometry; + var isPoint = pointOrBox instanceof Point || typeof pointOrBox[0] === 'number'; + + if (isPoint) { + var point = Point.convert(pointOrBox); + queryGeometry = [point]; + } else { + var box = [Point.convert(pointOrBox[0]), Point.convert(pointOrBox[1])]; + queryGeometry = [ + box[0], + new Point(box[1].x, box[0].y), + box[1], + new Point(box[0].x, box[1].y), + box[0] + ]; + } + + queryGeometry = queryGeometry.map(function (p) { + return this$1.transform.pointCoordinate(p); + }); + + return queryGeometry; + }; + + /** + * Returns an array of [GeoJSON](http://geojson.org/) + * [Feature objects](http://geojson.org/geojson-spec.html#feature-objects) + * representing features within the specified vector tile or GeoJSON source that satisfy the query parameters. + * + * @param {string} sourceID The ID of the vector tile or GeoJSON source to query. + * @param {Object} [parameters] + * @param {string} [parameters.sourceLayer] The name of the vector tile layer to query. *For vector tile + * sources, this parameter is required.* For GeoJSON sources, it is ignored. + * @param {Array} [parameters.filter] A [filter](https://www.mapbox.com/mapbox-gl-style-spec/#types-filter) + * to limit query results. + * + * @returns {Array} An array of [GeoJSON](http://geojson.org/) + * [Feature objects](http://geojson.org/geojson-spec.html#feature-objects). + * + * In contrast to [`Map#queryRenderedFeatures`](#Map#queryRenderedFeatures), this function + * returns all features matching the query parameters, + * whether or not they are rendered by the current style (i.e. visible). The domain of the query includes all currently-loaded + * vector tiles and GeoJSON source tiles: this function does not check tiles outside the currently + * visible viewport. + * + * Because features come from tiled vector data or GeoJSON data that is converted to tiles internally, feature + * geometries may be split or duplicated across tile boundaries and, as a result, features may appear multiple + * times in query results. For example, suppose there is a highway running through the bounding rectangle of a query. + * The results of the query will be those parts of the highway that lie within the map tiles covering the bounding + * rectangle, even if the highway extends into other tiles, and the portion of the highway within each map tile + * will be returned as a separate feature. Similarly, a point feature near a tile boundary may appear in multiple + * tiles due to tile buffering. + * @see [Filter features within map view](https://www.mapbox.com/mapbox-gl-js/example/filter-features-within-map-view/) + * @see [Highlight features containing similar data](https://www.mapbox.com/mapbox-gl-js/example/query-similar-features/) + */ + Map.prototype.querySourceFeatures = function querySourceFeatures (sourceID, parameters) { + return this.style.querySourceFeatures(sourceID, parameters); + }; + + /** + * Updates the map's Mapbox style object with a new value. If the given + * value is style JSON object, compares it against the the map's current + * state and perform only the changes necessary to make the map style match + * the desired state. + * + * @param {Object|string} style A JSON object conforming to the schema described in the + * [Mapbox Style Specification](https://mapbox.com/mapbox-gl-style-spec/), or a URL to such JSON. + * @param {Object} [options] + * @param {boolean} [options.diff=true] If false, force a 'full' update, removing the current style + * and adding building the given one instead of attempting a diff-based update. + * @returns {Map} `this` + * @see [Change a map's style](https://www.mapbox.com/mapbox-gl-js/example/setstyle/) + */ + Map.prototype.setStyle = function setStyle (style, options) { + var shouldTryDiff = (!options || options.diff !== false) && this.style && style && + !(style instanceof Style) && typeof style !== 'string'; + if (shouldTryDiff) { + try { + if (this.style.setState(style)) { + this._update(true); + } + return this; + } catch (e) { + util.warnOnce(("Unable to perform style diff: " + (e.message || e.error || e) + ". Rebuilding the style from scratch.")); + } + } + + if (this.style) { + this.style.setEventedParent(null); + this.style._remove(); + this.off('rotate', this.style._redoPlacement); + this.off('pitch', this.style._redoPlacement); + } + + if (!style) { + this.style = null; + return this; + } else if (style instanceof Style) { + this.style = style; + } else { + this.style = new Style(style, this); + } + + this.style.setEventedParent(this, {style: this.style}); + + this.on('rotate', this.style._redoPlacement); + this.on('pitch', this.style._redoPlacement); + + return this; + }; + + /** + * Returns the map's Mapbox style object, which can be used to recreate the map's style. + * + * @returns {Object} The map's style object. + */ + Map.prototype.getStyle = function getStyle () { + if (this.style) { + return this.style.serialize(); + } + }; + + /** + * Adds a source to the map's style. + * + * @param {string} id The ID of the source to add. Must not conflict with existing sources. + * @param {Object} source The source object, conforming to the + * Mapbox Style Specification's [source definition](https://www.mapbox.com/mapbox-gl-style-spec/#sources). + * @param {string} source.type The source type, which must be either one of the core Mapbox GL source types defined in the style specification or a custom type that has been added to the map with {@link Map#addSourceType}. + * @fires source.add + * @returns {Map} `this` + * @see [Draw GeoJSON points](https://www.mapbox.com/mapbox-gl-js/example/geojson-markers/) + * @see [Style circles using data-driven styling](https://www.mapbox.com/mapbox-gl-js/example/data-driven-circle-colors/) + * @see [Set a point after Geocoder result](https://www.mapbox.com/mapbox-gl-js/example/point-from-geocoder-result/) + */ + Map.prototype.addSource = function addSource (id, source) { + this.style.addSource(id, source); + this._update(true); + return this; + }; + + /** + * Returns a Boolean indicating whether the source is loaded. + * + * @param {string} id The ID of the source to be checked. + * @returns {boolean} A Boolean indicating whether the source is loaded. + */ + Map.prototype.isSourceLoaded = function isSourceLoaded (id) { + var source = this.style && this.style.sourceCaches[id]; + if (source === undefined) { + this.fire('error', { + error: new Error(("There is no source with ID '" + id + "'")) + }); + return; + } + return source.loaded(); + }; + + /** + * Adds a [custom source type](#Custom Sources), making it available for use with + * {@link Map#addSource}. + * @private + * @param {string} name The name of the source type; source definition objects use this name in the `{type: ...}` field. + * @param {Function} SourceType A {@link Source} constructor. + * @param {Function} callback Called when the source type is ready or with an error argument if there is an error. + */ + Map.prototype.addSourceType = function addSourceType (name, SourceType, callback) { + return this.style.addSourceType(name, SourceType, callback); + }; + + /** + * Removes a source from the map's style. + * + * @param {string} id The ID of the source to remove. + * @returns {Map} `this` + */ + Map.prototype.removeSource = function removeSource (id) { + this.style.removeSource(id); + this._update(true); + return this; + }; + + /** + * Returns the source with the specified ID in the map's style. + * + * @param {string} id The ID of the source to get. + * @returns {?Object} The style source with the specified ID, or `undefined` + * if the ID corresponds to no existing sources. + * @see [Create a draggable point](https://www.mapbox.com/mapbox-gl-js/example/drag-a-point/) + * @see [Animate a point](https://www.mapbox.com/mapbox-gl-js/example/animate-point-along-line/) + * @see [Add live realtime data](https://www.mapbox.com/mapbox-gl-js/example/live-geojson/) + */ + Map.prototype.getSource = function getSource (id) { + return this.style.getSource(id); + }; + + /** + * Adds a [Mapbox style layer](https://www.mapbox.com/mapbox-gl-style-spec/#layers) + * to the map's style. + * + * A layer defines styling for data from a specified source. + * + * @param {Object} layer The style layer to add, conforming to the Mapbox Style Specification's + * [layer definition](https://www.mapbox.com/mapbox-gl-style-spec/#layers). + * @param {string} [before] The ID of an existing layer to insert the new layer before. + * If this argument is omitted, the layer will be appended to the end of the layers array. + * @returns {Map} `this` + * @see [Create and style clusters](https://www.mapbox.com/mapbox-gl-js/example/cluster/) + * @see [Add a vector tile source](https://www.mapbox.com/mapbox-gl-js/example/vector-source/) + * @see [Add a WMS source](https://www.mapbox.com/mapbox-gl-js/example/wms/) + */ + Map.prototype.addLayer = function addLayer (layer, before) { + this.style.addLayer(layer, before); + this._update(true); + return this; + }; + + /** + * Moves a layer to a different z-position. + * + * @param {string} id The ID of the layer to move. + * @param {string} [beforeId] The ID of an existing layer to insert the new layer before. + * If this argument is omitted, the layer will be appended to the end of the layers array. + * @returns {Map} `this` + */ + Map.prototype.moveLayer = function moveLayer (id, beforeId) { + this.style.moveLayer(id, beforeId); + this._update(true); + return this; + }; + + /** + * Removes a layer from the map's style. + * + * @param {string} id The ID of the layer to remove. + * @throws {Error} if no layer with the specified `id` exists. + * @returns {Map} `this` + */ + Map.prototype.removeLayer = function removeLayer (id) { + this.style.removeLayer(id); + this._update(true); + return this; + }; + + /** + * Returns the layer with the specified ID in the map's style. + * + * @param {string} id The ID of the layer to get. + * @returns {?Object} The layer with the specified ID, or `undefined` + * if the ID corresponds to no existing layers. + * @see [Filter symbols by toggling a list](https://www.mapbox.com/mapbox-gl-js/example/filter-markers/) + * @see [Filter symbols by text input](https://www.mapbox.com/mapbox-gl-js/example/filter-markers-by-input/) + */ + Map.prototype.getLayer = function getLayer (id) { + return this.style.getLayer(id); + }; + + /** + * Sets the filter for the specified style layer. + * + * @param {string} layer The ID of the layer to which the filter will be applied. + * @param {Array} filter The filter, conforming to the Mapbox Style Specification's + * [filter definition](https://www.mapbox.com/mapbox-gl-style-spec/#types-filter). + * @returns {Map} `this` + * @example + * map.setFilter('my-layer', ['==', 'name', 'USA']); + * @see [Filter features within map view](https://www.mapbox.com/mapbox-gl-js/example/filter-features-within-map-view/) + * @see [Highlight features containing similar data](https://www.mapbox.com/mapbox-gl-js/example/query-similar-features/) + * @see [Create a timeline animation](https://www.mapbox.com/mapbox-gl-js/example/timeline-animation/) + */ + Map.prototype.setFilter = function setFilter (layer, filter) { + this.style.setFilter(layer, filter); + this._update(true); + return this; + }; + + /** + * Sets the zoom extent for the specified style layer. + * + * @param {string} layerId The ID of the layer to which the zoom extent will be applied. + * @param {number} minzoom The minimum zoom to set (0-20). + * @param {number} maxzoom The maximum zoom to set (0-20). + * @returns {Map} `this` + * @example + * map.setLayerZoomRange('my-layer', 2, 5); + */ + Map.prototype.setLayerZoomRange = function setLayerZoomRange (layerId, minzoom, maxzoom) { + this.style.setLayerZoomRange(layerId, minzoom, maxzoom); + this._update(true); + return this; + }; + + /** + * Returns the filter applied to the specified style layer. + * + * @param {string} layer The ID of the style layer whose filter to get. + * @returns {Array} The layer's filter. + */ + Map.prototype.getFilter = function getFilter (layer) { + return this.style.getFilter(layer); + }; + + /** + * Sets the value of a paint property in the specified style layer. + * + * @param {string} layer The ID of the layer to set the paint property in. + * @param {string} name The name of the paint property to set. + * @param {*} value The value of the paint propery to set. + * Must be of a type appropriate for the property, as defined in the [Mapbox Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/). + * @param {string=} klass A style class specifier for the paint property. + * @returns {Map} `this` + * @example + * map.setPaintProperty('my-layer', 'fill-color', '#faafee'); + * @see [Change a layer's color with buttons](https://www.mapbox.com/mapbox-gl-js/example/color-switcher/) + * @see [Adjust a layer's opacity](https://www.mapbox.com/mapbox-gl-js/example/adjust-layer-opacity/) + * @see [Create a draggable point](https://www.mapbox.com/mapbox-gl-js/example/drag-a-point/) + */ + Map.prototype.setPaintProperty = function setPaintProperty (layer, name, value, klass) { + this.style.setPaintProperty(layer, name, value, klass); + this._update(true); + return this; + }; + + /** + * Returns the value of a paint property in the specified style layer. + * + * @param {string} layer The ID of the layer to get the paint property from. + * @param {string} name The name of a paint property to get. + * @param {string=} klass A class specifier for the paint property. + * @returns {*} The value of the specified paint property. + */ + Map.prototype.getPaintProperty = function getPaintProperty (layer, name, klass) { + return this.style.getPaintProperty(layer, name, klass); + }; + + /** + * Sets the value of a layout property in the specified style layer. + * + * @param {string} layer The ID of the layer to set the layout property in. + * @param {string} name The name of the layout property to set. + * @param {*} value The value of the layout propery. Must be of a type appropriate for the property, as defined in the [Mapbox Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/). + * @returns {Map} `this` + * @example + * map.setLayoutProperty('my-layer', 'visibility', 'none'); + */ + Map.prototype.setLayoutProperty = function setLayoutProperty (layer, name, value) { + this.style.setLayoutProperty(layer, name, value); + this._update(true); + return this; + }; + + /** + * Returns the value of a layout property in the specified style layer. + * + * @param {string} layer The ID of the layer to get the layout property from. + * @param {string} name The name of the layout property to get. + * @returns {*} The value of the specified layout property. + */ + Map.prototype.getLayoutProperty = function getLayoutProperty (layer, name) { + return this.style.getLayoutProperty(layer, name); + }; + + /** + * Sets the any combination of light values. + * + * @param {Object} options Light properties to set. Must conform to the [Mapbox Style Specification](https://www.mapbox.com/mapbox-gl-style-spec/). + * @returns {Map} `this` + */ + Map.prototype.setLight = function setLight (lightOptions) { + this.style.setLight(lightOptions); + this._update(true); + return this; + }; + + /** + * Returns the value of the light object. + * + * @returns {Object} light Light properties of the style. + */ + Map.prototype.getLight = function getLight () { + return this.style.getLight(); + }; + + /** + * Returns the map's containing HTML element. + * + * @returns {HTMLElement} The map's container. + */ + Map.prototype.getContainer = function getContainer () { + return this._container; + }; + + /** + * Returns the HTML element containing the map's `` element. + * + * If you want to add non-GL overlays to the map, you should append them to this element. + * + * This is the element to which event bindings for map interactivity (such as panning and zooming) are + * attached. It will receive bubbled events from child elements such as the ``, but not from + * map controls. + * + * @returns {HTMLElement} The container of the map's ``. + * @see [Create a draggable point](https://www.mapbox.com/mapbox-gl-js/example/drag-a-point/) + * @see [Highlight features within a bounding box](https://www.mapbox.com/mapbox-gl-js/example/using-box-queryrenderedfeatures/) + */ + Map.prototype.getCanvasContainer = function getCanvasContainer () { + return this._canvasContainer; + }; + + /** + * Returns the map's `` element. + * + * @returns {HTMLCanvasElement} The map's `` element. + * @see [Measure distances](https://www.mapbox.com/mapbox-gl-js/example/measure/) + * @see [Display a popup on hover](https://www.mapbox.com/mapbox-gl-js/example/popup-on-hover/) + * @see [Center the map on a clicked symbol](https://www.mapbox.com/mapbox-gl-js/example/center-on-symbol/) + */ + Map.prototype.getCanvas = function getCanvas () { + return this._canvas; + }; + + Map.prototype._containerDimensions = function _containerDimensions () { + var width = 0; + var height = 0; + + if (this._container) { + width = this._container.offsetWidth || 400; + height = this._container.offsetHeight || 300; + } + + return [width, height]; + }; + + Map.prototype._setupContainer = function _setupContainer () { + var container = this._container; + container.classList.add('mapboxgl-map'); + + var canvasContainer = this._canvasContainer = DOM.create('div', 'mapboxgl-canvas-container', container); + if (this._interactive) { + canvasContainer.classList.add('mapboxgl-interactive'); + } + + this._canvas = DOM.create('canvas', 'mapboxgl-canvas', canvasContainer); + this._canvas.style.position = 'absolute'; + this._canvas.addEventListener('webglcontextlost', this._contextLost, false); + this._canvas.addEventListener('webglcontextrestored', this._contextRestored, false); + this._canvas.setAttribute('tabindex', 0); + this._canvas.setAttribute('aria-label', 'Map'); + + var dimensions = this._containerDimensions(); + this._resizeCanvas(dimensions[0], dimensions[1]); + + var controlContainer = this._controlContainer = DOM.create('div', 'mapboxgl-control-container', container); + var positions = this._controlPositions = {}; + ['top-left', 'top-right', 'bottom-left', 'bottom-right'].forEach(function (positionName) { + positions[positionName] = DOM.create('div', ("mapboxgl-ctrl-" + positionName), controlContainer); + }); + }; + + Map.prototype._resizeCanvas = function _resizeCanvas (width, height) { + var pixelRatio = window.devicePixelRatio || 1; + + // Request the required canvas size taking the pixelratio into account. + this._canvas.width = pixelRatio * width; + this._canvas.height = pixelRatio * height; + + // Maintain the same canvas size, potentially downscaling it for HiDPI displays + this._canvas.style.width = width + "px"; + this._canvas.style.height = height + "px"; + }; + + Map.prototype._setupPainter = function _setupPainter () { + var attributes = util.extend({ + failIfMajorPerformanceCaveat: this._failIfMajorPerformanceCaveat, + preserveDrawingBuffer: this._preserveDrawingBuffer + }, isSupported.webGLContextAttributes); + + var gl = this._canvas.getContext('webgl', attributes) || + this._canvas.getContext('experimental-webgl', attributes); + + if (!gl) { + this.fire('error', { error: new Error('Failed to initialize WebGL') }); + return; + } + + this.painter = new Painter(gl, this.transform); + }; + + /** + * Fired when the WebGL context is lost. + * + * @event webglcontextlost + * @memberof Map + * @instance + * @type {Object} + * @property {WebGLContextEvent} originalEvent The original DOM event. + */ + Map.prototype._contextLost = function _contextLost (event) { + event.preventDefault(); + if (this._frameId) { + browser.cancelFrame(this._frameId); + } + this.fire('webglcontextlost', {originalEvent: event}); + }; + + /** + * Fired when the WebGL context is restored. + * + * @event webglcontextrestored + * @memberof Map + * @instance + * @type {Object} + * @property {WebGLContextEvent} originalEvent The original DOM event. + */ + Map.prototype._contextRestored = function _contextRestored (event) { + this._setupPainter(); + this.resize(); + this._update(); + this.fire('webglcontextrestored', {originalEvent: event}); + }; + + /** + * Returns a Boolean indicating whether the map is fully loaded. + * + * Returns `false` if the style is not yet fully loaded, + * or if there has been a change to the sources or style that + * has not yet fully loaded. + * + * @returns {boolean} A Boolean indicating whether the map is fully loaded. + */ + Map.prototype.loaded = function loaded () { + if (this._styleDirty || this._sourcesDirty) + return false; + if (!this.style || !this.style.loaded()) + return false; + return true; + }; + + /** + * Update this map's style and sources, and re-render the map. + * + * @param {boolean} updateStyle mark the map's style for reprocessing as + * well as its sources + * @returns {Map} this + * @private + */ + Map.prototype._update = function _update (updateStyle) { + if (!this.style) return this; + + this._styleDirty = this._styleDirty || updateStyle; + this._sourcesDirty = true; + + this._rerender(); + + return this; + }; + + /** + * Call when a (re-)render of the map is required, e.g. when the + * user panned or zoomed,f or new data is available. + * @returns {Map} this + * @private + */ + Map.prototype._render = function _render () { + if (this.style && this._styleDirty) { + this._styleDirty = false; + this.style.update(this._classes, this._classOptions); + this._classOptions = null; + this.style._recalculate(this.transform.zoom); + } + + if (this.style && this._sourcesDirty) { + this._sourcesDirty = false; + this.style._updateSources(this.transform); + } + + this.painter.render(this.style, { + showTileBoundaries: this.showTileBoundaries, + showOverdrawInspector: this._showOverdrawInspector, + rotating: this.rotating, + zooming: this.zooming + }); + + this.fire('render'); + + if (this.loaded() && !this._loaded) { + this._loaded = true; + this.fire('load'); + } + + this._frameId = null; + + if (!this.animationLoop.stopped()) { + this._styleDirty = true; + } + + if (this._sourcesDirty || this._repaint || this._styleDirty) { + this._rerender(); + } + + return this; + }; + + /** + * Destroys the map's underlying resources, including web workers and DOM elements. + * + * After calling this method, you must not call any other methods on the map. + */ + Map.prototype.remove = function remove () { + if (this._hash) this._hash.remove(); + browser.cancelFrame(this._frameId); + this.setStyle(null); + if (typeof window !== 'undefined') { + window.removeEventListener('resize', this._onWindowResize, false); + } + var extension = this.painter.gl.getExtension('WEBGL_lose_context'); + if (extension) extension.loseContext(); + removeNode(this._canvasContainer); + removeNode(this._controlContainer); + this._container.classList.remove('mapboxgl-map'); + this.fire('remove'); + }; + + Map.prototype._rerender = function _rerender () { + if (this.style && !this._frameId) { + this._frameId = browser.frame(this._render); + } + }; + + Map.prototype._onWindowOnline = function _onWindowOnline () { + this._update(); + }; + + Map.prototype._onWindowResize = function _onWindowResize () { + if (this._trackResize) { + this.stop().resize()._update(); + } + }; + + /** + * Gets and sets a Boolean indicating whether the map will render an outline + * around each tile. These tile boundaries are useful for debugging. + * + * @name showTileBoundaries + * @type {boolean} + * @instance + * @memberof Map + */ + prototypeAccessors.showTileBoundaries.get = function () { return !!this._showTileBoundaries; }; + prototypeAccessors.showTileBoundaries.set = function (value) { + if (this._showTileBoundaries === value) return; + this._showTileBoundaries = value; + this._update(); + }; + + /** + * Gets and sets a Boolean indicating whether the map will render boxes + * around all symbols in the data source, revealing which symbols + * were rendered or which were hidden due to collisions. + * This information is useful for debugging. + * + * @name showCollisionBoxes + * @type {boolean} + * @instance + * @memberof Map + */ + prototypeAccessors.showCollisionBoxes.get = function () { return !!this._showCollisionBoxes; }; + prototypeAccessors.showCollisionBoxes.set = function (value) { + if (this._showCollisionBoxes === value) return; + this._showCollisionBoxes = value; + this.style._redoPlacement(); + }; + + /* + * Gets and sets a Boolean indicating whether the map should color-code + * each fragment to show how many times it has been shaded. + * White fragments have been shaded 8 or more times. + * Black fragments have been shaded 0 times. + * This information is useful for debugging. + * + * @name showOverdraw + * @type {boolean} + * @instance + * @memberof Map + */ + prototypeAccessors.showOverdrawInspector.get = function () { return !!this._showOverdrawInspector; }; + prototypeAccessors.showOverdrawInspector.set = function (value) { + if (this._showOverdrawInspector === value) return; + this._showOverdrawInspector = value; + this._update(); + }; + + /** + * Gets and sets a Boolean indicating whether the map will + * continuously repaint. This information is useful for analyzing performance. + * + * @name repaint + * @type {boolean} + * @instance + * @memberof Map + */ + prototypeAccessors.repaint.get = function () { return !!this._repaint; }; + prototypeAccessors.repaint.set = function (value) { this._repaint = value; this._update(); }; + + // show vertices + prototypeAccessors.vertices.get = function () { return !!this._vertices; }; + prototypeAccessors.vertices.set = function (value) { this._vertices = value; this._update(); }; + + Map.prototype._onData = function _onData (event) { + this._update(event.dataType === 'style'); + this.fire(((event.dataType) + "data"), event); + }; + + Map.prototype._onDataLoading = function _onDataLoading (event) { + this.fire(((event.dataType) + "dataloading"), event); + }; + + Object.defineProperties( Map.prototype, prototypeAccessors ); + + return Map; +}(Camera)); + +module.exports = Map; + +function removeNode(node) { + if (node.parentNode) { + node.parentNode.removeChild(node); + } +} + +/** + * Interface for interactive controls added to the map. This is an + * specification for implementers to model: it is not + * an exported method or class. + * + * Controls must implement `onAdd` and `onRemove`, and must own an + * element, which is often a `div` element. To use Mapbox GL JS's + * default control styling, add the `mapboxgl-ctrl` class to your control's + * node. + * + * @interface IControl + * @example + * // Control implemented as ES6 class + * class HelloWorldControl { + * onAdd(map) { + * this._map = map; + * this._container = document.createElement('div'); + * this._container.className = 'mapboxgl-ctrl'; + * this._container.textContent = 'Hello, world'; + * return this._container; + * } + * + * onRemove() { + * this._container.parentNode.removeChild(this._container); + * this._map = undefined; + * } + * } + * + * // Control implemented as ES5 prototypical class + * function HelloWorldControl() { } + * + * HelloWorldControl.prototype.onAdd = function(map) { + * this._map = map; + * this._container = document.createElement('div'); + * this._container.className = 'mapboxgl-ctrl'; + * this._container.textContent = 'Hello, world'; + * return this._container; + * }; + * + * HelloWorldControl.prototype.onRemove() { + * this._container.parentNode.removeChild(this._container); + * this._map = undefined; + * }; + */ + +/** + * Register a control on the map and give it a chance to register event listeners + * and resources. This method is called by {@link Map#addControl} + * internally. + * + * @function + * @memberof IControl + * @instance + * @name onAdd + * @param {Map} map the Map this control will be added to + * @returns {HTMLElement} The control's container element. This should + * be created by the control and returned by onAdd without being attached + * to the DOM: the map will insert the control's element into the DOM + * as necessary. + */ + +/** + * Unregister a control on the map and give it a chance to detach event listeners + * and resources. This method is called by {@link Map#removeControl} + * internally. + * + * @function + * @memberof IControl + * @instance + * @name onRemove + * @param {Map} map the Map this control will be removed from + * @returns {undefined} there is no required return value for this method + */ + +/** + * Optionally provide a default position for this control. If this method + * is implemented and {@link Map#addControl} is called without the `position` + * parameter, the value returned by getDefaultPosition will be used as the + * control's position. + * + * @function + * @memberof IControl + * @instance + * @name getDefaultPosition + * @returns {string} a control position, one of the values valid in addControl. + */ + +/** + * A [`LngLat`](#LngLat) object or an array of two numbers representing longitude and latitude. + * + * @typedef {(LngLat | Array)} LngLatLike + * @example + * var v1 = new mapboxgl.LngLat(-122.420679, 37.772537); + * var v2 = [-122.420679, 37.772537]; + */ + +/** + * A [`LngLatBounds`](#LngLatBounds) object or an array of [`LngLatLike`](#LngLatLike) objects. + * + * @typedef {(LngLatBounds | Array)} LngLatBoundsLike + * @example + * var v1 = new mapboxgl.LngLatBounds( + * new mapboxgl.LngLat(-73.9876, 40.7661), + * new mapboxgl.LngLat(-73.9397, 40.8002) + * ); + * var v2 = new mapboxgl.LngLatBounds([-73.9876, 40.7661], [-73.9397, 40.8002]) + * var v3 = [[-73.9876, 40.7661], [-73.9397, 40.8002]]; + */ + +/** + * A [`Point` geometry](https://github.com/mapbox/point-geometry) object, which has + * `x` and `y` properties representing screen coordinates in pixels. + * + * @typedef {Object} Point + */ + +/** + * A [`Point`](#Point) or an array of two numbers representing `x` and `y` screen coordinates in pixels. + * + * @typedef {(Point | Array)} PointLike + */ + +/** + * Options common to {@link Map#addClass}, {@link Map#removeClass}, + * and {@link Map#setClasses}, controlling + * whether or not to smoothly transition property changes triggered by a class change. + * + * @typedef {Object} StyleOptions + * @property {boolean} transition If `true`, property changes will smootly transition. + */ + +/** + * Fired whenever the map is drawn to the screen, as the result of + * + * - a change to the map's position, zoom, pitch, or bearing + * - a change to the map's style + * - a change to a GeoJSON source + * - the loading of a vector tile, GeoJSON file, glyph, or sprite + * + * @event render + * @memberof Map + * @instance + */ + +/** + * Fired when a point device (usually a mouse) leaves the map's canvas. + * + * @event mouseout + * @memberof Map + * @instance + * @property {MapMouseEvent} data + * @see [Highlight features under the mouse pointer](https://www.mapbox.com/mapbox-gl-js/example/hover-styles/) + */ + +/** + * Fired when a pointing device (usually a mouse) is pressed within the map. + * + * @event mousedown + * @memberof Map + * @instance + * @property {MapMouseEvent} data + * @see [Highlight features within a bounding box](https://www.mapbox.com/mapbox-gl-js/example/using-box-queryrenderedfeatures/) + * @see [Create a draggable point](https://www.mapbox.com/mapbox-gl-js/example/drag-a-point/) + */ + +/** + * Fired when a pointing device (usually a mouse) is released within the map. + * + * @event mouseup + * @memberof Map + * @instance + * @property {MapMouseEvent} data + * @see [Highlight features within a bounding box](https://www.mapbox.com/mapbox-gl-js/example/using-box-queryrenderedfeatures/) + * @see [Create a draggable point](https://www.mapbox.com/mapbox-gl-js/example/drag-a-point/) + */ + +/** + * Fired when a pointing device (usually a mouse) is moved within the map. + * + * @event mousemove + * @memberof Map + * @instance + * @property {MapMouseEvent} data + * @see [Get coordinates of the mouse pointer](https://www.mapbox.com/mapbox-gl-js/example/mouse-position/) + * @see [Highlight features under the mouse pointer](https://www.mapbox.com/mapbox-gl-js/example/hover-styles/) + * @see [Display a popup on hover](https://www.mapbox.com/mapbox-gl-js/example/popup-on-hover/) + */ + +/** + * Fired when a touch point is placed on the map. + * + * @event touchstart + * @memberof Map + * @instance + * @property {MapTouchEvent} data + */ + +/** + * Fired when a touch point is removed from the map. + * + * @event touchend + * @memberof Map + * @instance + * @property {MapTouchEvent} data + */ + +/** + * Fired when a touch point is moved within the map. + * + * @event touchmove + * @memberof Map + * @instance + * @property {MapTouchEvent} data + */ + +/** + * Fired when a touch point has been disrupted. + * + * @event touchcancel + * @memberof Map + * @instance + * @property {MapTouchEvent} data + */ + +/** + * Fired when a pointing device (usually a mouse) is pressed and released at the same point on the map. + * + * @event click + * @memberof Map + * @instance + * @property {MapMouseEvent} data + * @see [Measure distances](https://www.mapbox.com/mapbox-gl-js/example/measure/) + * @see [Center the map on a clicked symbol](https://www.mapbox.com/mapbox-gl-js/example/center-on-symbol/) + */ + +/** + * Fired when a pointing device (usually a mouse) is clicked twice at the same point on the map. + * + * @event dblclick + * @memberof Map + * @instance + * @property {MapMouseEvent} data + */ + +/** + * Fired when the right button of the mouse is clicked or the context menu key is pressed within the map. + * + * @event contextmenu + * @memberof Map + * @instance + * @property {MapMouseEvent} data + */ + +/** + * Fired immediately after all necessary resources have been downloaded + * and the first visually complete rendering of the map has occurred. + * + * @event load + * @memberof Map + * @instance + * @type {Object} + * @see [Draw GeoJSON points](https://www.mapbox.com/mapbox-gl-js/example/geojson-markers/) + * @see [Add live realtime data](https://www.mapbox.com/mapbox-gl-js/example/live-geojson/) + * @see [Animate a point](https://www.mapbox.com/mapbox-gl-js/example/animate-point-along-line/) + */ + +/** + * Fired just before the map begins a transition from one + * view to another, as the result of either user interaction or methods such as [Map#jumpTo](#Map#jumpTo). + * + * @event movestart + * @memberof Map + * @instance + * @property {{originalEvent: DragEvent}} data + */ + +/** + * Fired repeatedly during an animated transition from one view to + * another, as the result of either user interaction or methods such as [Map#flyTo](#Map#flyTo). + * + * @event move + * @memberof Map + * @instance + * @property {MapMouseEvent | MapTouchEvent} data + */ + +/** + * Fired just after the map completes a transition from one + * view to another, as the result of either user interaction or methods such as [Map#jumpTo](#Map#jumpTo). + * + * @event moveend + * @memberof Map + * @instance + * @property {{originalEvent: DragEvent}} data + * @see [Play map locations as a slideshow](https://www.mapbox.com/mapbox-gl-js/example/playback-locations/) + * @see [Filter features within map view](https://www.mapbox.com/mapbox-gl-js/example/filter-features-within-map-view/) + */ + + /** + * Fired when an error occurs. This is GL JS's primary error reporting + * mechanism. We use an event instead of `throw` to better accommodate + * asyncronous operations. If no listeners are bound to the `error` event, the + * error will be printed to the console. + * + * @event error + * @memberof Map + * @instance + * @property {{error: {message: string}}} data + */ + +/** + * Fired when any map data loads or changes. See [`MapDataEvent`](#MapDataEvent) + * for more information. + * + * @event data + * @memberof Map + * @instance + * @property {MapDataEvent} data + */ + +/** + * Fired when the map's style loads or changes. See + * [`MapDataEvent`](#MapDataEvent) for more information. + * + * @event styledata + * @memberof Map + * @instance + * @property {MapDataEvent} data + */ + +/** + * Fired when one of the map's sources loads or changes. This event is not fired + * if a tile belonging to a source loads or changes (that is handled by + * `tiledata`). See [`MapDataEvent`](#MapDataEvent) for more information. + * + * @event sourcedata + * @memberof Map + * @instance + * @property {MapDataEvent} data + */ + + /** + * Fired when one of the map's sources' tiles loads or changes. See + * [`MapDataEvent`](#MapDataEvent) for more information. + * + * @event tiledata + * @memberof Map + * @instance + * @property {MapDataEvent} data + */ + +/** + * Fired when any map data (style, source, tile, etc) begins loading or + * changing asyncronously. All `dataloading` events are followed by a `data` + * or `error` event. See [`MapDataEvent`](#MapDataEvent) for more information. + * + * @event dataloading + * @memberof Map + * @instance + * @property {MapDataEvent} data + */ + +/** + * Fired when the map's style begins loading or changing asyncronously. + * All `styledataloading` events are followed by a `styledata` + * or `error` event. See [`MapDataEvent`](#MapDataEvent) for more information. + * + * @event styledataloading + * @memberof Map + * @instance + * @property {MapDataEvent} data + */ + +/** + * Fired when one of the map's sources begins loading or changing asyncronously. + * This event is not fired if a tile belonging to a source begins loading or + * changing (that is handled by `tiledataloading`). All `sourcedataloading` + * events are followed by a `sourcedata` or `error` event. See + * [`MapDataEvent`](#MapDataEvent) for more information. + * + * @event sourcedataloading + * @memberof Map + * @instance + * @property {MapDataEvent} data + */ + +/** + * Fired when one of the map's sources' tiles begins loading or changing + * asyncronously. All `tiledataloading` events are followed by a `tiledata` + * or `error` event. See [`MapDataEvent`](#MapDataEvent) for more information. + * + * @event tiledataloading + * @memberof Map + * @instance + * @property {MapDataEvent} data + */ + + /** + * A `MapDataEvent` object is emitted with the [`Map#data`](#Map.event:data) + * and [`Map#dataloading`](#Map.event:dataloading) events. Possible values for + * `dataType`s are: + * + * - `'source'`: The non-tile data associated with any source + * - `'style'`: The [style](https://www.mapbox.com/mapbox-gl-style-spec/) used by the map + * - `'tile'`: A vector or raster tile + * + * @typedef {Object} MapDataEvent + * @property {string} type The event type. + * @property {string} dataType The type of data that has changed. One of `'source'`, `'style'`. + * @property {boolean} [isSourceLoaded] True if the event has a `dataType` of `source` and the source has no outstanding network requests. + * @property {Object} [source] The [style spec representation of the source](https://www.mapbox.com/mapbox-gl-style-spec/#sources) if the event has a `dataType` of `source`. + * @property {Coordinate} [coord] The coordinate of the tile if the event has a `dataType` of `tile`. + */ + + /** + * Fired immediately after the map has been removed with [`Map#remove`](#Map#remove). + * + * @event remove + * @memberof Map + * @instance + */ + + /** + * Fired immediately after the map has been resized. + * + * @event resize + * @memberof Map + * @instance + */ + +},{"../geo/lng_lat":19,"../geo/lng_lat_bounds":20,"../geo/transform":21,"../render/painter":36,"../style/animation_loop":59,"../style/style":63,"../util/browser":110,"../util/dom":117,"../util/util":129,"../util/window":112,"./bind_handlers":91,"./camera":92,"./control/attribution_control":93,"./hash":104,"mapbox-gl-supported":194,"point-geometry":198}],106:[function(require,module,exports){ +'use strict'; + +var DOM = require('../util/dom'); +var LngLat = require('../geo/lng_lat'); +var Point = require('point-geometry'); + +/** + * Creates a marker component + * @param {HTMLElement=} element DOM element to use as a marker (creates a div element by default) + * @param {Object=} options + * @param {PointLike=} options.offset The offset in pixels as a [`PointLike`](#PointLike) object to apply relative to the element's top left corner. Negatives indicate left and up. + * @example + * var marker = new mapboxgl.Marker() + * .setLngLat([30.5, 50.5]) + * .addTo(map); + * @see [Add custom icons with Markers](https://www.mapbox.com/mapbox-gl-js/example/custom-marker-icons/) + */ +var Marker = function Marker(element, options) { + this._offset = Point.convert(options && options.offset || [0, 0]); + + this._update = this._update.bind(this); + this._onMapClick = this._onMapClick.bind(this); + + if (!element) element = DOM.create('div'); + element.classList.add('mapboxgl-marker'); + this._element = element; + + this._popup = null; +}; + +/** + * Attaches the marker to a map + * @param {Map} map + * @returns {Marker} `this` + */ +Marker.prototype.addTo = function addTo (map) { + this.remove(); + this._map = map; + map.getCanvasContainer().appendChild(this._element); + map.on('move', this._update); + map.on('moveend', this._update); + this._update(); + + // If we attached the `click` listener to the marker element, the popup + // would close once the event propogated to `map` due to the + // `Popup#_onClickClose` listener. + this._map.on('click', this._onMapClick); + + return this; +}; + +/** + * Removes the marker from a map + * @example + * var marker = new mapboxgl.Marker().addTo(map); + * marker.remove(); + * @returns {Marker} `this` + */ +Marker.prototype.remove = function remove () { + if (this._map) { + this._map.off('click', this._onMapClick); + this._map.off('move', this._update); + this._map.off('moveend', this._update); + this._map = null; + } + DOM.remove(this._element); + if (this._popup) this._popup.remove(); + return this; +}; + +/** + * Get the marker's geographical location + * @returns {LngLat} + */ +Marker.prototype.getLngLat = function getLngLat () { + return this._lngLat; +}; + +/** + * Set the marker's geographical position and move it. + * @param {LngLat} lnglat + * @returns {Marker} `this` + */ +Marker.prototype.setLngLat = function setLngLat (lnglat) { + this._lngLat = LngLat.convert(lnglat); + if (this._popup) this._popup.setLngLat(this._lngLat); + this._update(); + return this; +}; + +Marker.prototype.getElement = function getElement () { + return this._element; +}; + +/** + * Binds a Popup to the Marker + * @param {Popup=} popup an instance of the `Popup` class. If undefined or null, any popup + * set on this `Marker` instance is unset + * @returns {Marker} `this` + */ + +Marker.prototype.setPopup = function setPopup (popup) { + if (this._popup) { + this._popup.remove(); + this._popup = null; + } + + if (popup) { + this._popup = popup; + this._popup.setLngLat(this._lngLat); + } + + return this; +}; + +Marker.prototype._onMapClick = function _onMapClick (event) { + var targetElement = event.originalEvent.target; + var element = this._element; + + if (this._popup && (targetElement === element || element.contains(targetElement))) { + this.togglePopup(); + } +}; + +/** + * Returns the Popup instance that is bound to the Marker + * @returns {Popup} popup + */ +Marker.prototype.getPopup = function getPopup () { + return this._popup; +}; + +/** + * Opens or closes the bound popup, depending on the current state + * @returns {Marker} `this` + */ +Marker.prototype.togglePopup = function togglePopup () { + var popup = this._popup; + + if (!popup) return; + else if (popup.isOpen()) popup.remove(); + else popup.addTo(this._map); +}; + +Marker.prototype._update = function _update (e) { + if (!this._map) return; + var pos = this._map.project(this._lngLat)._add(this._offset); + // because rouding the coordinates at every `move` event causes stuttered zooming + // we only round them when _update is called with `moveend` or when its called with + // no arguments (when the Marker is initialized or Marker#setLngLat is invoked). + if (!e || e.type === "moveend") pos = pos.round(); + DOM.setTransform(this._element, ("translate(" + (pos.x) + "px, " + (pos.y) + "px)")); +}; + +module.exports = Marker; + +},{"../geo/lng_lat":19,"../util/dom":117,"point-geometry":198}],107:[function(require,module,exports){ +'use strict'; + +var util = require('../util/util'); +var Evented = require('../util/evented'); +var DOM = require('../util/dom'); +var LngLat = require('../geo/lng_lat'); +var Point = require('point-geometry'); +var window = require('../util/window'); + +var defaultOptions = { + closeButton: true, + closeOnClick: true +}; + +/** + * A popup component. + * + * @param {Object} [options] + * @param {boolean} [options.closeButton=true] If `true`, a close button will appear in the + * top right corner of the popup. + * @param {boolean} [options.closeOnClick=true] If `true`, the popup will closed when the + * map is clicked. + * @param {string} [options.anchor] - A string indicating the popup's location relative to + * the coordinate set via [Popup#setLngLat](#Popup#setLngLat). + * Options are `'top'`, `'bottom'`, `'left'`, `'right'`, `'top-left'`, + * `'top-right'`, `'bottom-left'`, and `'bottom-right'`. If unset the anchor will be + * dynamically set to ensure the popup falls within the map container with a preference + * for `'bottom'`. + * @param {number|PointLike|Object} [options.offset] - + * A pixel offset applied to the popup's location specified as: + * - a single number specifying a distance from the popup's location + * - a [`PointLike`](#PointLike) specifying a constant offset + * - an object of [`PointLike`](#PointLike)s specifing an offset for each anchor position + * Negative offsets indicate left and up. + * @example + * var markerHeight = 50, markerRadius = 10, linearOffset = 25; + * var popupOffsets = { + * 'top': [0, 0], + * 'top-left': [0,0], + * 'top-right': [0,0], + * 'bottom': [0, -markerHeight], + * 'bottom-left': [linearOffset, (markerHeight - markerRadius + linearOffset) * -1], + * 'bottom-right': [-linearOffset, (markerHeight - markerRadius + linearOffset) * -1], + * 'left': [markerRadius, (markerHeight - markerRadius) * -1], + * 'right': [-markerRadius, (markerHeight - markerRadius) * -1] + * }; + * var popup = new mapboxgl.Popup({offset:popupOffsets}) + * .setLngLat(e.lngLat) + * .setHTML("

Hello World!

") + * .addTo(map); + * @see [Display a popup](https://www.mapbox.com/mapbox-gl-js/example/popup/) + * @see [Display a popup on hover](https://www.mapbox.com/mapbox-gl-js/example/popup-on-hover/) + * @see [Display a popup on click](https://www.mapbox.com/mapbox-gl-js/example/popup-on-click/) + */ +var Popup = (function (Evented) { + function Popup(options) { + Evented.call(this); + this.options = util.extend(Object.create(defaultOptions), options); + util.bindAll([ + '_update', + '_onClickClose'], + this); + } + + if ( Evented ) Popup.__proto__ = Evented; + Popup.prototype = Object.create( Evented && Evented.prototype ); + Popup.prototype.constructor = Popup; + + /** + * Adds the popup to a map. + * + * @param {Map} map The Mapbox GL JS map to add the popup to. + * @returns {Popup} `this` + */ + Popup.prototype.addTo = function addTo (map) { + this._map = map; + this._map.on('move', this._update); + if (this.options.closeOnClick) { + this._map.on('click', this._onClickClose); + } + this._update(); + return this; + }; + + /** + * @returns {boolean} `true` if the popup is open, `false` if it is closed. + */ + Popup.prototype.isOpen = function isOpen () { + return !!this._map; + }; + + /** + * Removes the popup from the map it has been added to. + * + * @example + * var popup = new mapboxgl.Popup().addTo(map); + * popup.remove(); + * @returns {Popup} `this` + */ + Popup.prototype.remove = function remove () { + if (this._content && this._content.parentNode) { + this._content.parentNode.removeChild(this._content); + } + + if (this._container) { + this._container.parentNode.removeChild(this._container); + delete this._container; + } + + if (this._map) { + this._map.off('move', this._update); + this._map.off('click', this._onClickClose); + delete this._map; + } + + /** + * Fired when the popup is closed manually or programatically. + * + * @event close + * @memberof Popup + * @instance + * @type {Object} + * @property {Popup} popup object that was closed + */ + this.fire('close'); + + return this; + }; + + /** + * Returns the geographical location of the popup's anchor. + * + * @returns {LngLat} The geographical location of the popup's anchor. + */ + Popup.prototype.getLngLat = function getLngLat () { + return this._lngLat; + }; + + /** + * Sets the geographical location of the popup's anchor, and moves the popup to it. + * + * @param {LngLatLike} lnglat The geographical location to set as the popup's anchor. + * @returns {Popup} `this` + */ + Popup.prototype.setLngLat = function setLngLat (lnglat) { + this._lngLat = LngLat.convert(lnglat); + this._update(); + return this; + }; + + /** + * Sets the popup's content to a string of text. + * + * This function creates a [Text](https://developer.mozilla.org/en-US/docs/Web/API/Text) node in the DOM, + * so it cannot insert raw HTML. Use this method for security against XSS + * if the popup content is user-provided. + * + * @param {string} text Textual content for the popup. + * @returns {Popup} `this` + * @example + * var popup = new mapboxgl.Popup() + * .setLngLat(e.lngLat) + * .setText('Hello, world!') + * .addTo(map); + */ + Popup.prototype.setText = function setText (text) { + return this.setDOMContent(window.document.createTextNode(text)); + }; + + /** + * Sets the popup's content to the HTML provided as a string. + * + * This method does not perform HTML filtering or sanitization, and must be + * used only with trusted content. Consider [`setText`](#Popup#setText) if + * the content is an untrusted text string. + * + * @param {string} html A string representing HTML content for the popup. + * @returns {Popup} `this` + */ + Popup.prototype.setHTML = function setHTML (html) { + var frag = window.document.createDocumentFragment(); + var temp = window.document.createElement('body'); + var child; + temp.innerHTML = html; + while (true) { + child = temp.firstChild; + if (!child) break; + frag.appendChild(child); + } + + return this.setDOMContent(frag); + }; + + /** + * Sets the popup's content to the element provided as a DOM node. + * + * @param {Node} htmlNode A DOM node to be used as content for the popup. + * @returns {Popup} `this` + * @example + * // create an element with the popup content + * var div = window.document.createElement('div'); + * div.innerHTML = 'Hello, world!'; + * var popup = new mapboxgl.Popup() + * .setLngLat(e.lngLat) + * .setDOMContent(div) + * .addTo(map); + */ + Popup.prototype.setDOMContent = function setDOMContent (htmlNode) { + this._createContent(); + this._content.appendChild(htmlNode); + this._update(); + return this; + }; + + Popup.prototype._createContent = function _createContent () { + if (this._content && this._content.parentNode) { + this._content.parentNode.removeChild(this._content); + } + + this._content = DOM.create('div', 'mapboxgl-popup-content', this._container); + + if (this.options.closeButton) { + this._closeButton = DOM.create('button', 'mapboxgl-popup-close-button', this._content); + this._closeButton.type = 'button'; + this._closeButton.innerHTML = '×'; + this._closeButton.addEventListener('click', this._onClickClose); + } + }; + + Popup.prototype._update = function _update () { + if (!this._map || !this._lngLat || !this._content) { return; } + + if (!this._container) { + this._container = DOM.create('div', 'mapboxgl-popup', this._map.getContainer()); + this._tip = DOM.create('div', 'mapboxgl-popup-tip', this._container); + this._container.appendChild(this._content); + } + + var anchor = this.options.anchor; + var offset = normalizeOffset(this.options.offset); + var pos = this._map.project(this._lngLat).round(); + + if (!anchor) { + var width = this._container.offsetWidth, + height = this._container.offsetHeight; + + if (pos.y + offset.bottom.y < height) { + anchor = ['top']; + } else if (pos.y > this._map.transform.height - height) { + anchor = ['bottom']; + } else { + anchor = []; + } + + if (pos.x < width / 2) { + anchor.push('left'); + } else if (pos.x > this._map.transform.width - width / 2) { + anchor.push('right'); + } + + if (anchor.length === 0) { + anchor = 'bottom'; + } else { + anchor = anchor.join('-'); + } + } + + var offsetedPos = pos.add(offset[anchor]); + + var anchorTranslate = { + 'top': 'translate(-50%,0)', + 'top-left': 'translate(0,0)', + 'top-right': 'translate(-100%,0)', + 'bottom': 'translate(-50%,-100%)', + 'bottom-left': 'translate(0,-100%)', + 'bottom-right': 'translate(-100%,-100%)', + 'left': 'translate(0,-50%)', + 'right': 'translate(-100%,-50%)' + }; + + var classList = this._container.classList; + for (var key in anchorTranslate) { + classList.remove(("mapboxgl-popup-anchor-" + key)); + } + classList.add(("mapboxgl-popup-anchor-" + anchor)); + + DOM.setTransform(this._container, ((anchorTranslate[anchor]) + " translate(" + (offsetedPos.x) + "px," + (offsetedPos.y) + "px)")); + }; + + Popup.prototype._onClickClose = function _onClickClose () { + this.remove(); + }; + + return Popup; +}(Evented)); + +function normalizeOffset(offset) { + + if (!offset) { + return normalizeOffset(new Point(0, 0)); + + } else if (typeof offset === 'number') { + // input specifies a radius from which to calculate offsets at all positions + var cornerOffset = Math.round(Math.sqrt(0.5 * Math.pow(offset, 2))); + return { + 'top': new Point(0, offset), + 'top-left': new Point(cornerOffset, cornerOffset), + 'top-right': new Point(-cornerOffset, cornerOffset), + 'bottom': new Point(0, -offset), + 'bottom-left': new Point(cornerOffset, -cornerOffset), + 'bottom-right': new Point(-cornerOffset, -cornerOffset), + 'left': new Point(offset, 0), + 'right': new Point(-offset, 0) + }; + + } else if (isPointLike(offset)) { + // input specifies a single offset to be applied to all positions + var convertedOffset = Point.convert(offset); + return { + 'top': convertedOffset, + 'top-left': convertedOffset, + 'top-right': convertedOffset, + 'bottom': convertedOffset, + 'bottom-left': convertedOffset, + 'bottom-right': convertedOffset, + 'left': convertedOffset, + 'right': convertedOffset + }; + + } else { + // input specifies an offset per position + return { + 'top': Point.convert(offset['top'] || [0, 0]), + 'top-left': Point.convert(offset['top-left'] || [0, 0]), + 'top-right': Point.convert(offset['top-right'] || [0, 0]), + 'bottom': Point.convert(offset['bottom'] || [0, 0]), + 'bottom-left': Point.convert(offset['bottom-left'] || [0, 0]), + 'bottom-right': Point.convert(offset['bottom-right'] || [0, 0]), + 'left': Point.convert(offset['left'] || [0, 0]), + 'right': Point.convert(offset['right'] || [0, 0]) + }; + } +} + +function isPointLike(input) { + return input instanceof Point || Array.isArray(input); +} + +module.exports = Popup; + +},{"../geo/lng_lat":19,"../util/dom":117,"../util/evented":118,"../util/util":129,"../util/window":112,"point-geometry":198}],108:[function(require,module,exports){ +'use strict'; + +/** + * An implementation of the [Actor design pattern](http://en.wikipedia.org/wiki/Actor_model) + * that maintains the relationship between asynchronous tasks and the objects + * that spin them off - in this case, tasks like parsing parts of styles, + * owned by the styles + * + * @param {WebWorker} target + * @param {WebWorker} parent + * @param {string|number} mapId A unique identifier for the Map instance using this Actor. + * @private + */ +var Actor = function Actor(target, parent, mapId) { + this.target = target; + this.parent = parent; + this.mapId = mapId; + this.callbacks = {}; + this.callbackID = 0; + this.receive = this.receive.bind(this); + this.target.addEventListener('message', this.receive, false); +}; + +/** + * Sends a message from a main-thread map to a Worker or from a Worker back to + * a main-thread map instance. + * + * @param {string} type The name of the target method to invoke or '[source-type].name' for a method on a WorkerSource. + * @param {Object} data + * @param {Function} [callback] + * @param {Array} [buffers] A list of buffers to "transfer" (see https://developer.mozilla.org/en-US/docs/Web/API/Transferable) + * @param {string} [targetMapId] A particular mapId to which to send this message. + * @private + */ +Actor.prototype.send = function send (type, data, callback, buffers, targetMapId) { + var id = callback ? ((this.mapId) + ":" + (this.callbackID++)) : null; + if (callback) this.callbacks[id] = callback; + this.target.postMessage({ + targetMapId: targetMapId, + sourceMapId: this.mapId, + type: type, + id: String(id), + data: data + }, buffers); +}; + +Actor.prototype.receive = function receive (message) { + var this$1 = this; + + var data = message.data, + id = data.id; + var callback; + + if (data.targetMapId && this.mapId !== data.targetMapId) + return; + + var done = function (err, data, buffers) { + this$1.target.postMessage({ + sourceMapId: this$1.mapId, + type: '', + id: String(id), + error: err ? String(err) : null, + data: data + }, buffers); + }; + + if (data.type === '') { + callback = this.callbacks[data.id]; + delete this.callbacks[data.id]; + if (callback) callback(data.error || null, data.data); + } else if (typeof data.id !== 'undefined' && this.parent[data.type]) { + // data.type == 'loadTile', 'removeTile', etc. + this.parent[data.type](data.sourceMapId, data.data, done); + } else if (typeof data.id !== 'undefined' && this.parent.getWorkerSource) { + // data.type == sourcetype.method + var keys = data.type.split('.'); + var workerSource = this.parent.getWorkerSource(data.sourceMapId, keys[0]); + workerSource[keys[1]](data.data, done); + } else { + this.parent[data.type](data.data); + } +}; + +Actor.prototype.remove = function remove () { + this.target.removeEventListener('message', this.receive, false); +}; + +module.exports = Actor; + +},{}],109:[function(require,module,exports){ +'use strict'; + +var window = require('./window'); + +exports.getJSON = function(url, callback) { + var xhr = new window.XMLHttpRequest(); + xhr.open('GET', url, true); + xhr.setRequestHeader('Accept', 'application/json'); + xhr.onerror = function(e) { + callback(e); + }; + xhr.onload = function() { + if (xhr.status >= 200 && xhr.status < 300 && xhr.response) { + var data; + try { + data = JSON.parse(xhr.response); + } catch (err) { + return callback(err); + } + callback(null, data); + } else { + callback(new Error(xhr.statusText)); + } + }; + xhr.send(); + return xhr; +}; + +exports.getArrayBuffer = function(url, callback) { + var xhr = new window.XMLHttpRequest(); + xhr.open('GET', url, true); + xhr.responseType = 'arraybuffer'; + xhr.onerror = function(e) { + callback(e); + }; + xhr.onload = function() { + if (xhr.response.byteLength === 0 && xhr.status === 200) { + return callback(new Error('http status 200 returned without content.')); + } + if (xhr.status >= 200 && xhr.status < 300 && xhr.response) { + callback(null, { + data: xhr.response, + cacheControl: xhr.getResponseHeader('Cache-Control'), + expires: xhr.getResponseHeader('Expires') + }); + } else { + callback(new Error(xhr.statusText)); + } + }; + xhr.send(); + return xhr; +}; + +function sameOrigin(url) { + var a = window.document.createElement('a'); + a.href = url; + return a.protocol === window.document.location.protocol && a.host === window.document.location.host; +} + +var transparentPngUrl = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQYV2NgAAIAAAUAAarVyFEAAAAASUVORK5CYII='; + +exports.getImage = function(url, callback) { + // request the image with XHR to work around caching issues + // see https://github.com/mapbox/mapbox-gl-js/issues/1470 + return exports.getArrayBuffer(url, function (err, imgData) { + if (err) return callback(err); + var img = new window.Image(); + var URL = window.URL || window.webkitURL; + img.onload = function () { + callback(null, img); + URL.revokeObjectURL(img.src); + }; + var blob = new window.Blob([new Uint8Array(imgData.data)], { type: 'image/png' }); + img.cacheControl = imgData.cacheControl; + img.expires = imgData.expires; + img.src = imgData.data.byteLength ? URL.createObjectURL(blob) : transparentPngUrl; + }); +}; + +exports.getVideo = function(urls, callback) { + var video = window.document.createElement('video'); + video.onloadstart = function() { + callback(null, video); + }; + for (var i = 0; i < urls.length; i++) { + var s = window.document.createElement('source'); + if (!sameOrigin(urls[i])) { + video.crossOrigin = 'Anonymous'; + } + s.src = urls[i]; + video.appendChild(s); + } + return video; +}; + +},{"./window":112}],110:[function(require,module,exports){ +'use strict'; + +/** + * @module browser + * @private + */ + +var window = require('./window'); + +/** + * Provides a function that outputs milliseconds: either performance.now() + * or a fallback to Date.now() + */ +module.exports.now = (function() { + if (window.performance && + window.performance.now) { + return window.performance.now.bind(window.performance); + } else { + return Date.now.bind(Date); + } +}()); + +var frame = window.requestAnimationFrame || + window.mozRequestAnimationFrame || + window.webkitRequestAnimationFrame || + window.msRequestAnimationFrame; + +exports.frame = function(fn) { + return frame(fn); +}; + +var cancel = window.cancelAnimationFrame || + window.mozCancelAnimationFrame || + window.webkitCancelAnimationFrame || + window.msCancelAnimationFrame; + +exports.cancelFrame = function(id) { + cancel(id); +}; + +exports.timed = function (fn, dur, ctx) { + if (!dur) { + fn.call(ctx, 1); + return null; + } + + var abort = false; + var start = module.exports.now(); + + function tick(now) { + if (abort) return; + now = module.exports.now(); + + if (now >= start + dur) { + fn.call(ctx, 1); + } else { + fn.call(ctx, (now - start) / dur); + exports.frame(tick); + } + } + + exports.frame(tick); + + return function() { abort = true; }; +}; + +exports.getImageData = function (img) { + var canvas = window.document.createElement('canvas'); + var context = canvas.getContext('2d'); + canvas.width = img.width; + canvas.height = img.height; + context.drawImage(img, 0, 0); + return context.getImageData(0, 0, img.width, img.height).data; +}; + +/** + * Test if the current browser supports Mapbox GL JS + * @param {Object} options + * @param {boolean} [options.failIfMajorPerformanceCaveat=false] Return `false` + * if the performance of Mapbox GL JS would be dramatically worse than + * expected (i.e. a software renderer would be used) + * @return {boolean} + */ +exports.supported = require('mapbox-gl-supported'); + +exports.hardwareConcurrency = window.navigator.hardwareConcurrency || 4; + +Object.defineProperty(exports, 'devicePixelRatio', { + get: function() { return window.devicePixelRatio; } +}); + +exports.supportsWebp = false; + +var webpImgTest = window.document.createElement('img'); +webpImgTest.onload = function() { + exports.supportsWebp = true; +}; +webpImgTest.src = 'data:image/webp;base64,UklGRh4AAABXRUJQVlA4TBEAAAAvAQAAAAfQ//73v/+BiOh/AAA='; + +},{"./window":112,"mapbox-gl-supported":194}],111:[function(require,module,exports){ +'use strict'; + +var WebWorkify = require('webworkify'); +var window = require('../window'); +var workerURL = window.URL.createObjectURL(new WebWorkify(require('../../source/worker'), {bare: true})); + +module.exports = function () { + return new window.Worker(workerURL); +}; + +},{"../../source/worker":57,"../window":112,"webworkify":214}],112:[function(require,module,exports){ +'use strict'; + +/* eslint-env browser */ +module.exports = self; + +},{}],113:[function(require,module,exports){ +'use strict'; + +var quickselect = require('quickselect'); +var calculateSignedArea = require('./util').calculateSignedArea; + +// classifies an array of rings into polygons with outer rings and holes +module.exports = function classifyRings(rings, maxRings) { + var len = rings.length; + + if (len <= 1) return [rings]; + + var polygons = []; + var polygon, + ccw; + + for (var i = 0; i < len; i++) { + var area = calculateSignedArea(rings[i]); + if (area === 0) continue; + + rings[i].area = Math.abs(area); + + if (ccw === undefined) ccw = area < 0; + + if (ccw === area < 0) { + if (polygon) polygons.push(polygon); + polygon = [rings[i]]; + + } else { + polygon.push(rings[i]); + } + } + if (polygon) polygons.push(polygon); + + // Earcut performance degrages with the # of rings in a polygon. For this + // reason, we limit strip out all but the `maxRings` largest rings. + if (maxRings > 1) { + for (var j = 0; j < polygons.length; j++) { + if (polygons[j].length <= maxRings) continue; + quickselect(polygons[j], maxRings, 1, polygons[j].length - 1, compareAreas); + polygons[j] = polygons[j].slice(0, maxRings); + } + } + + return polygons; +}; + +function compareAreas(a, b) { + return b.area - a.area; +} + +},{"./util":129,"quickselect":200}],114:[function(require,module,exports){ +'use strict'; +// + + + + + + + +var config = { + API_URL: 'https://api.mapbox.com', + REQUIRE_ACCESS_TOKEN: true, + ACCESS_TOKEN: null +}; + +module.exports = config; + +},{}],115:[function(require,module,exports){ +'use strict'; + +var assert = require('assert'); + +var DictionaryCoder = function DictionaryCoder(strings) { + var this$1 = this; + + this._stringToNumber = {}; + this._numberToString = []; + for (var i = 0; i < strings.length; i++) { + var string = strings[i]; + this$1._stringToNumber[string] = i; + this$1._numberToString[i] = string; + } +}; + +DictionaryCoder.prototype.encode = function encode (string) { + assert(string in this._stringToNumber); + return this._stringToNumber[string]; +}; + +DictionaryCoder.prototype.decode = function decode (n) { + assert(n < this._numberToString.length); + return this._numberToString[n]; +}; + +module.exports = DictionaryCoder; + +},{"assert":135}],116:[function(require,module,exports){ +'use strict'; + +var util = require('./util'); +var Actor = require('./actor'); + +/** + * Responsible for sending messages from a {@link Source} to an associated + * {@link WorkerSource}. + * + * @interface Dispatcher + * @private + */ +var Dispatcher = function Dispatcher(workerPool, parent) { + var this$1 = this; + + this.workerPool = workerPool; + this.actors = []; + this.currentActor = 0; + this.id = util.uniqueId(); + var workers = this.workerPool.acquire(this.id); + for (var i = 0; i < workers.length; i++) { + var worker = workers[i]; + var actor = new Actor(worker, parent, this$1.id); + actor.name = "Worker " + i; + this$1.actors.push(actor); + } +}; + +/** + * Broadcast a message to all Workers. + * @method + * @name broadcast + * @param {string} type + * @param {Object} data + * @param {Function} callback + * @memberof Dispatcher + * @instance + */ +Dispatcher.prototype.broadcast = function broadcast (type, data, cb) { + cb = cb || function () {}; + util.asyncAll(this.actors, function (actor, done) { + actor.send(type, data, done); + }, cb); +}; + +/** + * Send a message to a Worker. + * @method + * @name send + * @param {string} type + * @param {Object} data + * @param {Function} callback + * @param {number|undefined} [targetID] The ID of the Worker to which to send this message. Omit to allow the dispatcher to choose. + * @returns {number} The ID of the worker to which the message was sent. + * @memberof Dispatcher + * @instance + */ +Dispatcher.prototype.send = function send (type, data, callback, targetID, buffers) { + if (typeof targetID !== 'number' || isNaN(targetID)) { + // Use round robin to send requests to web workers. + targetID = this.currentActor = (this.currentActor + 1) % this.actors.length; + } + + this.actors[targetID].send(type, data, callback, buffers); + return targetID; +}; + +Dispatcher.prototype.remove = function remove () { + this.actors.forEach(function (actor) { actor.remove(); }); + this.actors = []; + this.workerPool.release(this.id); +}; + +module.exports = Dispatcher; + +},{"./actor":108,"./util":129}],117:[function(require,module,exports){ +'use strict'; + +var Point = require('point-geometry'); +var window = require('./window'); + +exports.create = function (tagName, className, container) { + var el = window.document.createElement(tagName); + if (className) el.className = className; + if (container) container.appendChild(el); + return el; +}; + +var docStyle = window.document.documentElement.style; + +function testProp(props) { + for (var i = 0; i < props.length; i++) { + if (props[i] in docStyle) { + return props[i]; + } + } + return props[0]; +} + +var selectProp = testProp(['userSelect', 'MozUserSelect', 'WebkitUserSelect', 'msUserSelect']); +var userSelect; +exports.disableDrag = function () { + if (selectProp) { + userSelect = docStyle[selectProp]; + docStyle[selectProp] = 'none'; + } +}; +exports.enableDrag = function () { + if (selectProp) { + docStyle[selectProp] = userSelect; + } +}; + +var transformProp = testProp(['transform', 'WebkitTransform']); +exports.setTransform = function(el, value) { + el.style[transformProp] = value; +}; + +// Suppress the next click, but only if it's immediate. +function suppressClick(e) { + e.preventDefault(); + e.stopPropagation(); + window.removeEventListener('click', suppressClick, true); +} +exports.suppressClick = function() { + window.addEventListener('click', suppressClick, true); + window.setTimeout(function () { + window.removeEventListener('click', suppressClick, true); + }, 0); +}; + +exports.mousePos = function (el, e) { + var rect = el.getBoundingClientRect(); + e = e.touches ? e.touches[0] : e; + return new Point( + e.clientX - rect.left - el.clientLeft, + e.clientY - rect.top - el.clientTop + ); +}; + +exports.touchPos = function (el, e) { + var rect = el.getBoundingClientRect(), + points = []; + var touches = (e.type === 'touchend') ? e.changedTouches : e.touches; + for (var i = 0; i < touches.length; i++) { + points.push(new Point( + touches[i].clientX - rect.left - el.clientLeft, + touches[i].clientY - rect.top - el.clientTop + )); + } + return points; +}; + +exports.remove = function(node) { + if (node.parentNode) { + node.parentNode.removeChild(node); + } +}; + +},{"./window":112,"point-geometry":198}],118:[function(require,module,exports){ +'use strict'; + +var util = require('./util'); + +/** + * Methods mixed in to other classes for event capabilities. + * + * @mixin Evented + */ +var Evented = function Evented () {}; + +Evented.prototype.on = function on (type, listener) { + this._listeners = this._listeners || {}; + this._listeners[type] = this._listeners[type] || []; + this._listeners[type].push(listener); + + return this; +}; + +/** + * Removes a previously registered event listener. + * + * @param {string} type The event type to remove listeners for. + * @param {Function} listener The listener function to remove. + * @returns {Object} `this` + */ +Evented.prototype.off = function off (type, listener) { + if (this._listeners && this._listeners[type]) { + var index = this._listeners[type].indexOf(listener); + if (index !== -1) { + this._listeners[type].splice(index, 1); + } + } + + return this; +}; + +/** + * Adds a listener that will be called only once to a specified event type. + * + * The listener will be called first time the event fires after the listener is registered. + * + * @param {string} type The event type to listen for. + * @param {Function} listener The function to be called when the event is fired the first time. + * @returns {Object} `this` + */ +Evented.prototype.once = function once (type, listener) { + var this$1 = this; + + var wrapper = function (data) { + this$1.off(type, wrapper); + listener.call(this$1, data); + }; + this.on(type, wrapper); + return this; +}; + +/** + * Fires an event of the specified type. + * + * @param {string} type The type of event to fire. + * @param {Object} [data] Data to be passed to any listeners. + * @returns {Object} `this` + */ +Evented.prototype.fire = function fire (type, data) { + var this$1 = this; + + if (this.listens(type)) { + + data = util.extend({}, data, {type: type, target: this}); + + // make sure adding or removing listeners inside other listeners won't cause an infinite loop + var listeners = this._listeners && this._listeners[type] ? this._listeners[type].slice() : []; + + for (var i = 0; i < listeners.length; i++) { + listeners[i].call(this$1, data); + } + + if (this._eventedParent) { + this._eventedParent.fire(type, util.extend({}, data, this._eventedParentData)); + } + + // To ensure that no error events are dropped, print them to the + // console if they have no listeners. + } else if (util.endsWith(type, 'error')) { + console.error((data && data.error) || data || 'Empty error event'); + } + + return this; +}; + +/** + * Returns a true if this instance of Evented or any forwardeed instances of Evented have a listener for the specified type. + * + * @param {string} type The event type + * @returns {boolean} `true` if there is at least one registered listener for specified event type, `false` otherwise + */ +Evented.prototype.listens = function listens (type) { + return ( + (this._listeners && this._listeners[type]) || + (this._eventedParent && this._eventedParent.listens(type)) + ); +}; + +/** + * Bubble all events fired by this instance of Evented to this parent instance of Evented. + * + * @private + * @param {parent} + * @param {data} + * @returns {Object} `this` + */ +Evented.prototype.setEventedParent = function setEventedParent (parent, data) { + this._eventedParent = parent; + this._eventedParentData = typeof data === 'function' ? data() : data; + + return this; +}; + +module.exports = Evented; + +},{"./util":129}],119:[function(require,module,exports){ +'use strict'; +var Queue = require('tinyqueue'); +var Point = require('point-geometry'); +var distToSegmentSquared = require('./intersection_tests').distToSegmentSquared; + +/** + * Finds an approximation of a polygon's Pole Of Inaccessibiliy https://en.wikipedia.org/wiki/Pole_of_inaccessibility + * This is a copy of http://github.com/mapbox/polylabel adapted to use Points + * + * @param {Array>} List of polygon rings first item in array is the outer ring followed optionally by the list of holes, should be an element of the result of util/classify_rings + * @param {number} [precision=1] Specified in input coordinate units. If 0 returns after first run, if > 0 repeatedly narrows the search space until the radius of the area searched for the best pole is less than precision + * @param {bool} [debug=false] Print some statistics to the console during execution + * + * @returns {Point} Pole of Inaccessibiliy. + * @private + */ +module.exports = function (polygonRings, precision, debug) { + precision = precision || 1.0; + + // find the bounding box of the outer ring + var minX, minY, maxX, maxY; + var outerRing = polygonRings[0]; + for (var i = 0; i < outerRing.length; i++) { + var p = outerRing[i]; + if (!i || p.x < minX) minX = p.x; + if (!i || p.y < minY) minY = p.y; + if (!i || p.x > maxX) maxX = p.x; + if (!i || p.y > maxY) maxY = p.y; + } + + var width = maxX - minX; + var height = maxY - minY; + var cellSize = Math.min(width, height); + var h = cellSize / 2; + + // a priority queue of cells in order of their "potential" (max distance to polygon) + var cellQueue = new Queue(null, compareMax); + + // cover polygon with initial cells + for (var x = minX; x < maxX; x += cellSize) { + for (var y = minY; y < maxY; y += cellSize) { + cellQueue.push(new Cell(x + h, y + h, h, polygonRings)); + } + } + + // take centroid as the first best guess + var bestCell = getCentroidCell(polygonRings); + var numProbes = cellQueue.length; + + while (cellQueue.length) { + // pick the most promising cell from the queue + var cell = cellQueue.pop(); + + // update the best cell if we found a better one + if (cell.d > bestCell.d) { + bestCell = cell; + if (debug) console.log('found best %d after %d probes', Math.round(1e4 * cell.d) / 1e4, numProbes); + } + + // do not drill down further if there's no chance of a better solution + if (cell.max - bestCell.d <= precision) continue; + + // split the cell into four cells + h = cell.h / 2; + cellQueue.push(new Cell(cell.p.x - h, cell.p.y - h, h, polygonRings)); + cellQueue.push(new Cell(cell.p.x + h, cell.p.y - h, h, polygonRings)); + cellQueue.push(new Cell(cell.p.x - h, cell.p.y + h, h, polygonRings)); + cellQueue.push(new Cell(cell.p.x + h, cell.p.y + h, h, polygonRings)); + numProbes += 4; + } + + if (debug) { + console.log(("num probes: " + numProbes)); + console.log(("best distance: " + (bestCell.d))); + } + + return bestCell.p; +}; + +function compareMax(a, b) { + return b.max - a.max; +} + +function Cell(x, y, h, polygon) { + this.p = new Point(x, y); + this.h = h; // half the cell size + this.d = pointToPolygonDist(this.p, polygon); // distance from cell center to polygon + this.max = this.d + this.h * Math.SQRT2; // max distance to polygon within a cell +} + +// signed distance from point to polygon outline (negative if point is outside) +function pointToPolygonDist(p, polygon) { + var inside = false; + var minDistSq = Infinity; + + for (var k = 0; k < polygon.length; k++) { + var ring = polygon[k]; + + for (var i = 0, len = ring.length, j = len - 1; i < len; j = i++) { + var a = ring[i]; + var b = ring[j]; + + if ((a.y > p.y !== b.y > p.y) && + (p.x < (b.x - a.x) * (p.y - a.y) / (b.y - a.y) + a.x)) inside = !inside; + + minDistSq = Math.min(minDistSq, distToSegmentSquared(p, a, b)); + } + } + + return (inside ? 1 : -1) * Math.sqrt(minDistSq); +} + +// get polygon centroid +function getCentroidCell(polygon) { + var area = 0; + var x = 0; + var y = 0; + var points = polygon[0]; + for (var i = 0, len = points.length, j = len - 1; i < len; j = i++) { + var a = points[i]; + var b = points[j]; + var f = a.x * b.y - b.x * a.y; + x += (a.x + b.x) * f; + y += (a.y + b.y) * f; + area += f * 3; + } + return new Cell(x / area, y / area, 0, polygon); +} + +},{"./intersection_tests":122,"point-geometry":198,"tinyqueue":203}],120:[function(require,module,exports){ +'use strict'; + +module.exports = Glyphs; + +function Glyphs(pbf, end) { + this.stacks = pbf.readFields(readFontstacks, [], end); +} + +function readFontstacks(tag, stacks, pbf) { + if (tag === 1) { + var fontstack = pbf.readMessage(readFontstack, {glyphs: {}}); + stacks.push(fontstack); + } +} + +function readFontstack(tag, fontstack, pbf) { + if (tag === 1) fontstack.name = pbf.readString(); + else if (tag === 2) fontstack.range = pbf.readString(); + else if (tag === 3) { + var glyph = pbf.readMessage(readGlyph, {}); + fontstack.glyphs[glyph.id] = glyph; + } +} + +function readGlyph(tag, glyph, pbf) { + if (tag === 1) glyph.id = pbf.readVarint(); + else if (tag === 2) glyph.bitmap = pbf.readBytes(); + else if (tag === 3) glyph.width = pbf.readVarint(); + else if (tag === 4) glyph.height = pbf.readVarint(); + else if (tag === 5) glyph.left = pbf.readSVarint(); + else if (tag === 6) glyph.top = pbf.readSVarint(); + else if (tag === 7) glyph.advance = pbf.readVarint(); +} + +},{}],121:[function(require,module,exports){ +'use strict'; + +module.exports = interpolate; + +function interpolate(a, b, t) { + return (a * (1 - t)) + (b * t); +} + +interpolate.number = interpolate; + +interpolate.vec2 = function(from, to, t) { + return [ + interpolate(from[0], to[0], t), + interpolate(from[1], to[1], t) + ]; +}; + +/* + * Interpolate between two colors given as 4-element arrays. + * + * @param {Color} from + * @param {Color} to + * @param {number} t interpolation factor between 0 and 1 + * @returns {Color} interpolated color + */ +interpolate.color = function(from, to, t) { + return [ + interpolate(from[0], to[0], t), + interpolate(from[1], to[1], t), + interpolate(from[2], to[2], t), + interpolate(from[3], to[3], t) + ]; +}; + +interpolate.array = function(from, to, t) { + return from.map(function (d, i) { + return interpolate(d, to[i], t); + }); +}; + +},{}],122:[function(require,module,exports){ +'use strict'; + +var isCounterClockwise = require('./util').isCounterClockwise; + +module.exports = { + multiPolygonIntersectsBufferedMultiPoint: multiPolygonIntersectsBufferedMultiPoint, + multiPolygonIntersectsMultiPolygon: multiPolygonIntersectsMultiPolygon, + multiPolygonIntersectsBufferedMultiLine: multiPolygonIntersectsBufferedMultiLine, + polygonIntersectsPolygon: polygonIntersectsPolygon, + distToSegmentSquared: distToSegmentSquared +}; + +function polygonIntersectsPolygon(polygonA, polygonB) { + for (var i = 0; i < polygonA.length; i++) { + if (polygonContainsPoint(polygonB, polygonA[i])) return true; + } + + for (var i$1 = 0; i$1 < polygonB.length; i$1++) { + if (polygonContainsPoint(polygonA, polygonB[i$1])) return true; + } + + if (lineIntersectsLine(polygonA, polygonB)) return true; + + return false; +} + +function multiPolygonIntersectsBufferedMultiPoint(multiPolygon, rings, radius) { + for (var j = 0; j < multiPolygon.length; j++) { + var polygon = multiPolygon[j]; + for (var i = 0; i < rings.length; i++) { + var ring = rings[i]; + for (var k = 0; k < ring.length; k++) { + var point = ring[k]; + if (polygonContainsPoint(polygon, point)) return true; + if (pointIntersectsBufferedLine(point, polygon, radius)) return true; + } + } + } + return false; +} + +function multiPolygonIntersectsMultiPolygon(multiPolygonA, multiPolygonB) { + + if (multiPolygonA.length === 1 && multiPolygonA[0].length === 1) { + return multiPolygonContainsPoint(multiPolygonB, multiPolygonA[0][0]); + } + + for (var m = 0; m < multiPolygonB.length; m++) { + var ring = multiPolygonB[m]; + for (var n = 0; n < ring.length; n++) { + if (multiPolygonContainsPoint(multiPolygonA, ring[n])) return true; + } + } + + for (var j = 0; j < multiPolygonA.length; j++) { + var polygon = multiPolygonA[j]; + for (var i = 0; i < polygon.length; i++) { + if (multiPolygonContainsPoint(multiPolygonB, polygon[i])) return true; + } + + for (var k = 0; k < multiPolygonB.length; k++) { + if (lineIntersectsLine(polygon, multiPolygonB[k])) return true; + } + } + + return false; +} + +function multiPolygonIntersectsBufferedMultiLine(multiPolygon, multiLine, radius) { + for (var i = 0; i < multiLine.length; i++) { + var line = multiLine[i]; + + for (var j = 0; j < multiPolygon.length; j++) { + var polygon = multiPolygon[j]; + + if (polygon.length >= 3) { + for (var k = 0; k < line.length; k++) { + if (polygonContainsPoint(polygon, line[k])) return true; + } + } + + if (lineIntersectsBufferedLine(polygon, line, radius)) return true; + } + } + return false; +} + +function lineIntersectsBufferedLine(lineA, lineB, radius) { + + if (lineA.length > 1) { + if (lineIntersectsLine(lineA, lineB)) return true; + + // Check whether any point in either line is within radius of the other line + for (var j = 0; j < lineB.length; j++) { + if (pointIntersectsBufferedLine(lineB[j], lineA, radius)) return true; + } + } + + for (var k = 0; k < lineA.length; k++) { + if (pointIntersectsBufferedLine(lineA[k], lineB, radius)) return true; + } + + return false; +} + +function lineIntersectsLine(lineA, lineB) { + if (lineA.length === 0 || lineB.length === 0) return false; + for (var i = 0; i < lineA.length - 1; i++) { + var a0 = lineA[i]; + var a1 = lineA[i + 1]; + for (var j = 0; j < lineB.length - 1; j++) { + var b0 = lineB[j]; + var b1 = lineB[j + 1]; + if (lineSegmentIntersectsLineSegment(a0, a1, b0, b1)) return true; + } + } + return false; +} + +function lineSegmentIntersectsLineSegment(a0, a1, b0, b1) { + return isCounterClockwise(a0, b0, b1) !== isCounterClockwise(a1, b0, b1) && + isCounterClockwise(a0, a1, b0) !== isCounterClockwise(a0, a1, b1); +} + +function pointIntersectsBufferedLine(p, line, radius) { + var radiusSquared = radius * radius; + + if (line.length === 1) return p.distSqr(line[0]) < radiusSquared; + + for (var i = 1; i < line.length; i++) { + // Find line segments that have a distance <= radius^2 to p + // In that case, we treat the line as "containing point p". + var v = line[i - 1], w = line[i]; + if (distToSegmentSquared(p, v, w) < radiusSquared) return true; + } + return false; +} + +// Code from http://stackoverflow.com/a/1501725/331379. +function distToSegmentSquared(p, v, w) { + var l2 = v.distSqr(w); + if (l2 === 0) return p.distSqr(v); + var t = ((p.x - v.x) * (w.x - v.x) + (p.y - v.y) * (w.y - v.y)) / l2; + if (t < 0) return p.distSqr(v); + if (t > 1) return p.distSqr(w); + return p.distSqr(w.sub(v)._mult(t)._add(v)); +} + +// point in polygon ray casting algorithm +function multiPolygonContainsPoint(rings, p) { + var c = false, + ring, p1, p2; + + for (var k = 0; k < rings.length; k++) { + ring = rings[k]; + for (var i = 0, j = ring.length - 1; i < ring.length; j = i++) { + p1 = ring[i]; + p2 = ring[j]; + if (((p1.y > p.y) !== (p2.y > p.y)) && (p.x < (p2.x - p1.x) * (p.y - p1.y) / (p2.y - p1.y) + p1.x)) { + c = !c; + } + } + } + return c; +} + +function polygonContainsPoint(ring, p) { + var c = false; + for (var i = 0, j = ring.length - 1; i < ring.length; j = i++) { + var p1 = ring[i]; + var p2 = ring[j]; + if (((p1.y > p.y) !== (p2.y > p.y)) && (p.x < (p2.x - p1.x) * (p.y - p1.y) / (p2.y - p1.y) + p1.x)) { + c = !c; + } + } + return c; +} + +},{"./util":129}],123:[function(require,module,exports){ +'use strict'; +// + +// The following table comes from . +// Keep it synchronized with . + + + +var unicodeBlockLookup = { + // 'Basic Latin': (char) => char >= 0x0000 && char <= 0x007F, + 'Latin-1 Supplement': function (char) { return char >= 0x0080 && char <= 0x00FF; }, + // 'Latin Extended-A': (char) => char >= 0x0100 && char <= 0x017F, + // 'Latin Extended-B': (char) => char >= 0x0180 && char <= 0x024F, + // 'IPA Extensions': (char) => char >= 0x0250 && char <= 0x02AF, + // 'Spacing Modifier Letters': (char) => char >= 0x02B0 && char <= 0x02FF, + // 'Combining Diacritical Marks': (char) => char >= 0x0300 && char <= 0x036F, + // 'Greek and Coptic': (char) => char >= 0x0370 && char <= 0x03FF, + // 'Cyrillic': (char) => char >= 0x0400 && char <= 0x04FF, + // 'Cyrillic Supplement': (char) => char >= 0x0500 && char <= 0x052F, + // 'Armenian': (char) => char >= 0x0530 && char <= 0x058F, + // 'Hebrew': (char) => char >= 0x0590 && char <= 0x05FF, + // 'Arabic': (char) => char >= 0x0600 && char <= 0x06FF, + // 'Syriac': (char) => char >= 0x0700 && char <= 0x074F, + // 'Arabic Supplement': (char) => char >= 0x0750 && char <= 0x077F, + // 'Thaana': (char) => char >= 0x0780 && char <= 0x07BF, + // 'NKo': (char) => char >= 0x07C0 && char <= 0x07FF, + // 'Samaritan': (char) => char >= 0x0800 && char <= 0x083F, + // 'Mandaic': (char) => char >= 0x0840 && char <= 0x085F, + // 'Arabic Extended-A': (char) => char >= 0x08A0 && char <= 0x08FF, + // 'Devanagari': (char) => char >= 0x0900 && char <= 0x097F, + // 'Bengali': (char) => char >= 0x0980 && char <= 0x09FF, + // 'Gurmukhi': (char) => char >= 0x0A00 && char <= 0x0A7F, + // 'Gujarati': (char) => char >= 0x0A80 && char <= 0x0AFF, + // 'Oriya': (char) => char >= 0x0B00 && char <= 0x0B7F, + // 'Tamil': (char) => char >= 0x0B80 && char <= 0x0BFF, + // 'Telugu': (char) => char >= 0x0C00 && char <= 0x0C7F, + // 'Kannada': (char) => char >= 0x0C80 && char <= 0x0CFF, + // 'Malayalam': (char) => char >= 0x0D00 && char <= 0x0D7F, + // 'Sinhala': (char) => char >= 0x0D80 && char <= 0x0DFF, + // 'Thai': (char) => char >= 0x0E00 && char <= 0x0E7F, + // 'Lao': (char) => char >= 0x0E80 && char <= 0x0EFF, + // 'Tibetan': (char) => char >= 0x0F00 && char <= 0x0FFF, + // 'Myanmar': (char) => char >= 0x1000 && char <= 0x109F, + // 'Georgian': (char) => char >= 0x10A0 && char <= 0x10FF, + 'Hangul Jamo': function (char) { return char >= 0x1100 && char <= 0x11FF; }, + // 'Ethiopic': (char) => char >= 0x1200 && char <= 0x137F, + // 'Ethiopic Supplement': (char) => char >= 0x1380 && char <= 0x139F, + // 'Cherokee': (char) => char >= 0x13A0 && char <= 0x13FF, + 'Unified Canadian Aboriginal Syllabics': function (char) { return char >= 0x1400 && char <= 0x167F; }, + // 'Ogham': (char) => char >= 0x1680 && char <= 0x169F, + // 'Runic': (char) => char >= 0x16A0 && char <= 0x16FF, + // 'Tagalog': (char) => char >= 0x1700 && char <= 0x171F, + // 'Hanunoo': (char) => char >= 0x1720 && char <= 0x173F, + // 'Buhid': (char) => char >= 0x1740 && char <= 0x175F, + // 'Tagbanwa': (char) => char >= 0x1760 && char <= 0x177F, + // 'Khmer': (char) => char >= 0x1780 && char <= 0x17FF, + // 'Mongolian': (char) => char >= 0x1800 && char <= 0x18AF, + 'Unified Canadian Aboriginal Syllabics Extended': function (char) { return char >= 0x18B0 && char <= 0x18FF; }, + // 'Limbu': (char) => char >= 0x1900 && char <= 0x194F, + // 'Tai Le': (char) => char >= 0x1950 && char <= 0x197F, + // 'New Tai Lue': (char) => char >= 0x1980 && char <= 0x19DF, + // 'Khmer Symbols': (char) => char >= 0x19E0 && char <= 0x19FF, + // 'Buginese': (char) => char >= 0x1A00 && char <= 0x1A1F, + // 'Tai Tham': (char) => char >= 0x1A20 && char <= 0x1AAF, + // 'Combining Diacritical Marks Extended': (char) => char >= 0x1AB0 && char <= 0x1AFF, + // 'Balinese': (char) => char >= 0x1B00 && char <= 0x1B7F, + // 'Sundanese': (char) => char >= 0x1B80 && char <= 0x1BBF, + // 'Batak': (char) => char >= 0x1BC0 && char <= 0x1BFF, + // 'Lepcha': (char) => char >= 0x1C00 && char <= 0x1C4F, + // 'Ol Chiki': (char) => char >= 0x1C50 && char <= 0x1C7F, + // 'Cyrillic Extended-C': (char) => char >= 0x1C80 && char <= 0x1C8F, + // 'Sundanese Supplement': (char) => char >= 0x1CC0 && char <= 0x1CCF, + // 'Vedic Extensions': (char) => char >= 0x1CD0 && char <= 0x1CFF, + // 'Phonetic Extensions': (char) => char >= 0x1D00 && char <= 0x1D7F, + // 'Phonetic Extensions Supplement': (char) => char >= 0x1D80 && char <= 0x1DBF, + // 'Combining Diacritical Marks Supplement': (char) => char >= 0x1DC0 && char <= 0x1DFF, + // 'Latin Extended Additional': (char) => char >= 0x1E00 && char <= 0x1EFF, + // 'Greek Extended': (char) => char >= 0x1F00 && char <= 0x1FFF, + 'General Punctuation': function (char) { return char >= 0x2000 && char <= 0x206F; }, + // 'Superscripts and Subscripts': (char) => char >= 0x2070 && char <= 0x209F, + // 'Currency Symbols': (char) => char >= 0x20A0 && char <= 0x20CF, + // 'Combining Diacritical Marks for Symbols': (char) => char >= 0x20D0 && char <= 0x20FF, + 'Letterlike Symbols': function (char) { return char >= 0x2100 && char <= 0x214F; }, + 'Number Forms': function (char) { return char >= 0x2150 && char <= 0x218F; }, + // 'Arrows': (char) => char >= 0x2190 && char <= 0x21FF, + // 'Mathematical Operators': (char) => char >= 0x2200 && char <= 0x22FF, + 'Miscellaneous Technical': function (char) { return char >= 0x2300 && char <= 0x23FF; }, + 'Control Pictures': function (char) { return char >= 0x2400 && char <= 0x243F; }, + 'Optical Character Recognition': function (char) { return char >= 0x2440 && char <= 0x245F; }, + 'Enclosed Alphanumerics': function (char) { return char >= 0x2460 && char <= 0x24FF; }, + // 'Box Drawing': (char) => char >= 0x2500 && char <= 0x257F, + // 'Block Elements': (char) => char >= 0x2580 && char <= 0x259F, + 'Geometric Shapes': function (char) { return char >= 0x25A0 && char <= 0x25FF; }, + 'Miscellaneous Symbols': function (char) { return char >= 0x2600 && char <= 0x26FF; }, + // 'Dingbats': (char) => char >= 0x2700 && char <= 0x27BF, + // 'Miscellaneous Mathematical Symbols-A': (char) => char >= 0x27C0 && char <= 0x27EF, + // 'Supplemental Arrows-A': (char) => char >= 0x27F0 && char <= 0x27FF, + // 'Braille Patterns': (char) => char >= 0x2800 && char <= 0x28FF, + // 'Supplemental Arrows-B': (char) => char >= 0x2900 && char <= 0x297F, + // 'Miscellaneous Mathematical Symbols-B': (char) => char >= 0x2980 && char <= 0x29FF, + // 'Supplemental Mathematical Operators': (char) => char >= 0x2A00 && char <= 0x2AFF, + 'Miscellaneous Symbols and Arrows': function (char) { return char >= 0x2B00 && char <= 0x2BFF; }, + // 'Glagolitic': (char) => char >= 0x2C00 && char <= 0x2C5F, + // 'Latin Extended-C': (char) => char >= 0x2C60 && char <= 0x2C7F, + // 'Coptic': (char) => char >= 0x2C80 && char <= 0x2CFF, + // 'Georgian Supplement': (char) => char >= 0x2D00 && char <= 0x2D2F, + // 'Tifinagh': (char) => char >= 0x2D30 && char <= 0x2D7F, + // 'Ethiopic Extended': (char) => char >= 0x2D80 && char <= 0x2DDF, + // 'Cyrillic Extended-A': (char) => char >= 0x2DE0 && char <= 0x2DFF, + // 'Supplemental Punctuation': (char) => char >= 0x2E00 && char <= 0x2E7F, + 'CJK Radicals Supplement': function (char) { return char >= 0x2E80 && char <= 0x2EFF; }, + 'Kangxi Radicals': function (char) { return char >= 0x2F00 && char <= 0x2FDF; }, + 'Ideographic Description Characters': function (char) { return char >= 0x2FF0 && char <= 0x2FFF; }, + 'CJK Symbols and Punctuation': function (char) { return char >= 0x3000 && char <= 0x303F; }, + 'Hiragana': function (char) { return char >= 0x3040 && char <= 0x309F; }, + 'Katakana': function (char) { return char >= 0x30A0 && char <= 0x30FF; }, + 'Bopomofo': function (char) { return char >= 0x3100 && char <= 0x312F; }, + 'Hangul Compatibility Jamo': function (char) { return char >= 0x3130 && char <= 0x318F; }, + 'Kanbun': function (char) { return char >= 0x3190 && char <= 0x319F; }, + 'Bopomofo Extended': function (char) { return char >= 0x31A0 && char <= 0x31BF; }, + 'CJK Strokes': function (char) { return char >= 0x31C0 && char <= 0x31EF; }, + 'Katakana Phonetic Extensions': function (char) { return char >= 0x31F0 && char <= 0x31FF; }, + 'Enclosed CJK Letters and Months': function (char) { return char >= 0x3200 && char <= 0x32FF; }, + 'CJK Compatibility': function (char) { return char >= 0x3300 && char <= 0x33FF; }, + 'CJK Unified Ideographs Extension A': function (char) { return char >= 0x3400 && char <= 0x4DBF; }, + 'Yijing Hexagram Symbols': function (char) { return char >= 0x4DC0 && char <= 0x4DFF; }, + 'CJK Unified Ideographs': function (char) { return char >= 0x4E00 && char <= 0x9FFF; }, + 'Yi Syllables': function (char) { return char >= 0xA000 && char <= 0xA48F; }, + 'Yi Radicals': function (char) { return char >= 0xA490 && char <= 0xA4CF; }, + // 'Lisu': (char) => char >= 0xA4D0 && char <= 0xA4FF, + // 'Vai': (char) => char >= 0xA500 && char <= 0xA63F, + // 'Cyrillic Extended-B': (char) => char >= 0xA640 && char <= 0xA69F, + // 'Bamum': (char) => char >= 0xA6A0 && char <= 0xA6FF, + // 'Modifier Tone Letters': (char) => char >= 0xA700 && char <= 0xA71F, + // 'Latin Extended-D': (char) => char >= 0xA720 && char <= 0xA7FF, + // 'Syloti Nagri': (char) => char >= 0xA800 && char <= 0xA82F, + // 'Common Indic Number Forms': (char) => char >= 0xA830 && char <= 0xA83F, + // 'Phags-pa': (char) => char >= 0xA840 && char <= 0xA87F, + // 'Saurashtra': (char) => char >= 0xA880 && char <= 0xA8DF, + // 'Devanagari Extended': (char) => char >= 0xA8E0 && char <= 0xA8FF, + // 'Kayah Li': (char) => char >= 0xA900 && char <= 0xA92F, + // 'Rejang': (char) => char >= 0xA930 && char <= 0xA95F, + 'Hangul Jamo Extended-A': function (char) { return char >= 0xA960 && char <= 0xA97F; }, + // 'Javanese': (char) => char >= 0xA980 && char <= 0xA9DF, + // 'Myanmar Extended-B': (char) => char >= 0xA9E0 && char <= 0xA9FF, + // 'Cham': (char) => char >= 0xAA00 && char <= 0xAA5F, + // 'Myanmar Extended-A': (char) => char >= 0xAA60 && char <= 0xAA7F, + // 'Tai Viet': (char) => char >= 0xAA80 && char <= 0xAADF, + // 'Meetei Mayek Extensions': (char) => char >= 0xAAE0 && char <= 0xAAFF, + // 'Ethiopic Extended-A': (char) => char >= 0xAB00 && char <= 0xAB2F, + // 'Latin Extended-E': (char) => char >= 0xAB30 && char <= 0xAB6F, + // 'Cherokee Supplement': (char) => char >= 0xAB70 && char <= 0xABBF, + // 'Meetei Mayek': (char) => char >= 0xABC0 && char <= 0xABFF, + 'Hangul Syllables': function (char) { return char >= 0xAC00 && char <= 0xD7AF; }, + 'Hangul Jamo Extended-B': function (char) { return char >= 0xD7B0 && char <= 0xD7FF; }, + // 'High Surrogates': (char) => char >= 0xD800 && char <= 0xDB7F, + // 'High Private Use Surrogates': (char) => char >= 0xDB80 && char <= 0xDBFF, + // 'Low Surrogates': (char) => char >= 0xDC00 && char <= 0xDFFF, + 'Private Use Area': function (char) { return char >= 0xE000 && char <= 0xF8FF; }, + 'CJK Compatibility Ideographs': function (char) { return char >= 0xF900 && char <= 0xFAFF; }, + // 'Alphabetic Presentation Forms': (char) => char >= 0xFB00 && char <= 0xFB4F, + // 'Arabic Presentation Forms-A': (char) => char >= 0xFB50 && char <= 0xFDFF, + // 'Variation Selectors': (char) => char >= 0xFE00 && char <= 0xFE0F, + 'Vertical Forms': function (char) { return char >= 0xFE10 && char <= 0xFE1F; }, + // 'Combining Half Marks': (char) => char >= 0xFE20 && char <= 0xFE2F, + 'CJK Compatibility Forms': function (char) { return char >= 0xFE30 && char <= 0xFE4F; }, + 'Small Form Variants': function (char) { return char >= 0xFE50 && char <= 0xFE6F; }, + // 'Arabic Presentation Forms-B': (char) => char >= 0xFE70 && char <= 0xFEFF, + 'Halfwidth and Fullwidth Forms': function (char) { return char >= 0xFF00 && char <= 0xFFEF; } + // 'Specials': (char) => char >= 0xFFF0 && char <= 0xFFFF, + // 'Linear B Syllabary': (char) => char >= 0x10000 && char <= 0x1007F, + // 'Linear B Ideograms': (char) => char >= 0x10080 && char <= 0x100FF, + // 'Aegean Numbers': (char) => char >= 0x10100 && char <= 0x1013F, + // 'Ancient Greek Numbers': (char) => char >= 0x10140 && char <= 0x1018F, + // 'Ancient Symbols': (char) => char >= 0x10190 && char <= 0x101CF, + // 'Phaistos Disc': (char) => char >= 0x101D0 && char <= 0x101FF, + // 'Lycian': (char) => char >= 0x10280 && char <= 0x1029F, + // 'Carian': (char) => char >= 0x102A0 && char <= 0x102DF, + // 'Coptic Epact Numbers': (char) => char >= 0x102E0 && char <= 0x102FF, + // 'Old Italic': (char) => char >= 0x10300 && char <= 0x1032F, + // 'Gothic': (char) => char >= 0x10330 && char <= 0x1034F, + // 'Old Permic': (char) => char >= 0x10350 && char <= 0x1037F, + // 'Ugaritic': (char) => char >= 0x10380 && char <= 0x1039F, + // 'Old Persian': (char) => char >= 0x103A0 && char <= 0x103DF, + // 'Deseret': (char) => char >= 0x10400 && char <= 0x1044F, + // 'Shavian': (char) => char >= 0x10450 && char <= 0x1047F, + // 'Osmanya': (char) => char >= 0x10480 && char <= 0x104AF, + // 'Osage': (char) => char >= 0x104B0 && char <= 0x104FF, + // 'Elbasan': (char) => char >= 0x10500 && char <= 0x1052F, + // 'Caucasian Albanian': (char) => char >= 0x10530 && char <= 0x1056F, + // 'Linear A': (char) => char >= 0x10600 && char <= 0x1077F, + // 'Cypriot Syllabary': (char) => char >= 0x10800 && char <= 0x1083F, + // 'Imperial Aramaic': (char) => char >= 0x10840 && char <= 0x1085F, + // 'Palmyrene': (char) => char >= 0x10860 && char <= 0x1087F, + // 'Nabataean': (char) => char >= 0x10880 && char <= 0x108AF, + // 'Hatran': (char) => char >= 0x108E0 && char <= 0x108FF, + // 'Phoenician': (char) => char >= 0x10900 && char <= 0x1091F, + // 'Lydian': (char) => char >= 0x10920 && char <= 0x1093F, + // 'Meroitic Hieroglyphs': (char) => char >= 0x10980 && char <= 0x1099F, + // 'Meroitic Cursive': (char) => char >= 0x109A0 && char <= 0x109FF, + // 'Kharoshthi': (char) => char >= 0x10A00 && char <= 0x10A5F, + // 'Old South Arabian': (char) => char >= 0x10A60 && char <= 0x10A7F, + // 'Old North Arabian': (char) => char >= 0x10A80 && char <= 0x10A9F, + // 'Manichaean': (char) => char >= 0x10AC0 && char <= 0x10AFF, + // 'Avestan': (char) => char >= 0x10B00 && char <= 0x10B3F, + // 'Inscriptional Parthian': (char) => char >= 0x10B40 && char <= 0x10B5F, + // 'Inscriptional Pahlavi': (char) => char >= 0x10B60 && char <= 0x10B7F, + // 'Psalter Pahlavi': (char) => char >= 0x10B80 && char <= 0x10BAF, + // 'Old Turkic': (char) => char >= 0x10C00 && char <= 0x10C4F, + // 'Old Hungarian': (char) => char >= 0x10C80 && char <= 0x10CFF, + // 'Rumi Numeral Symbols': (char) => char >= 0x10E60 && char <= 0x10E7F, + // 'Brahmi': (char) => char >= 0x11000 && char <= 0x1107F, + // 'Kaithi': (char) => char >= 0x11080 && char <= 0x110CF, + // 'Sora Sompeng': (char) => char >= 0x110D0 && char <= 0x110FF, + // 'Chakma': (char) => char >= 0x11100 && char <= 0x1114F, + // 'Mahajani': (char) => char >= 0x11150 && char <= 0x1117F, + // 'Sharada': (char) => char >= 0x11180 && char <= 0x111DF, + // 'Sinhala Archaic Numbers': (char) => char >= 0x111E0 && char <= 0x111FF, + // 'Khojki': (char) => char >= 0x11200 && char <= 0x1124F, + // 'Multani': (char) => char >= 0x11280 && char <= 0x112AF, + // 'Khudawadi': (char) => char >= 0x112B0 && char <= 0x112FF, + // 'Grantha': (char) => char >= 0x11300 && char <= 0x1137F, + // 'Newa': (char) => char >= 0x11400 && char <= 0x1147F, + // 'Tirhuta': (char) => char >= 0x11480 && char <= 0x114DF, + // 'Siddham': (char) => char >= 0x11580 && char <= 0x115FF, + // 'Modi': (char) => char >= 0x11600 && char <= 0x1165F, + // 'Mongolian Supplement': (char) => char >= 0x11660 && char <= 0x1167F, + // 'Takri': (char) => char >= 0x11680 && char <= 0x116CF, + // 'Ahom': (char) => char >= 0x11700 && char <= 0x1173F, + // 'Warang Citi': (char) => char >= 0x118A0 && char <= 0x118FF, + // 'Pau Cin Hau': (char) => char >= 0x11AC0 && char <= 0x11AFF, + // 'Bhaiksuki': (char) => char >= 0x11C00 && char <= 0x11C6F, + // 'Marchen': (char) => char >= 0x11C70 && char <= 0x11CBF, + // 'Cuneiform': (char) => char >= 0x12000 && char <= 0x123FF, + // 'Cuneiform Numbers and Punctuation': (char) => char >= 0x12400 && char <= 0x1247F, + // 'Early Dynastic Cuneiform': (char) => char >= 0x12480 && char <= 0x1254F, + // 'Egyptian Hieroglyphs': (char) => char >= 0x13000 && char <= 0x1342F, + // 'Anatolian Hieroglyphs': (char) => char >= 0x14400 && char <= 0x1467F, + // 'Bamum Supplement': (char) => char >= 0x16800 && char <= 0x16A3F, + // 'Mro': (char) => char >= 0x16A40 && char <= 0x16A6F, + // 'Bassa Vah': (char) => char >= 0x16AD0 && char <= 0x16AFF, + // 'Pahawh Hmong': (char) => char >= 0x16B00 && char <= 0x16B8F, + // 'Miao': (char) => char >= 0x16F00 && char <= 0x16F9F, + // 'Ideographic Symbols and Punctuation': (char) => char >= 0x16FE0 && char <= 0x16FFF, + // 'Tangut': (char) => char >= 0x17000 && char <= 0x187FF, + // 'Tangut Components': (char) => char >= 0x18800 && char <= 0x18AFF, + // 'Kana Supplement': (char) => char >= 0x1B000 && char <= 0x1B0FF, + // 'Duployan': (char) => char >= 0x1BC00 && char <= 0x1BC9F, + // 'Shorthand Format Controls': (char) => char >= 0x1BCA0 && char <= 0x1BCAF, + // 'Byzantine Musical Symbols': (char) => char >= 0x1D000 && char <= 0x1D0FF, + // 'Musical Symbols': (char) => char >= 0x1D100 && char <= 0x1D1FF, + // 'Ancient Greek Musical Notation': (char) => char >= 0x1D200 && char <= 0x1D24F, + // 'Tai Xuan Jing Symbols': (char) => char >= 0x1D300 && char <= 0x1D35F, + // 'Counting Rod Numerals': (char) => char >= 0x1D360 && char <= 0x1D37F, + // 'Mathematical Alphanumeric Symbols': (char) => char >= 0x1D400 && char <= 0x1D7FF, + // 'Sutton SignWriting': (char) => char >= 0x1D800 && char <= 0x1DAAF, + // 'Glagolitic Supplement': (char) => char >= 0x1E000 && char <= 0x1E02F, + // 'Mende Kikakui': (char) => char >= 0x1E800 && char <= 0x1E8DF, + // 'Adlam': (char) => char >= 0x1E900 && char <= 0x1E95F, + // 'Arabic Mathematical Alphabetic Symbols': (char) => char >= 0x1EE00 && char <= 0x1EEFF, + // 'Mahjong Tiles': (char) => char >= 0x1F000 && char <= 0x1F02F, + // 'Domino Tiles': (char) => char >= 0x1F030 && char <= 0x1F09F, + // 'Playing Cards': (char) => char >= 0x1F0A0 && char <= 0x1F0FF, + // 'Enclosed Alphanumeric Supplement': (char) => char >= 0x1F100 && char <= 0x1F1FF, + // 'Enclosed Ideographic Supplement': (char) => char >= 0x1F200 && char <= 0x1F2FF, + // 'Miscellaneous Symbols and Pictographs': (char) => char >= 0x1F300 && char <= 0x1F5FF, + // 'Emoticons': (char) => char >= 0x1F600 && char <= 0x1F64F, + // 'Ornamental Dingbats': (char) => char >= 0x1F650 && char <= 0x1F67F, + // 'Transport and Map Symbols': (char) => char >= 0x1F680 && char <= 0x1F6FF, + // 'Alchemical Symbols': (char) => char >= 0x1F700 && char <= 0x1F77F, + // 'Geometric Shapes Extended': (char) => char >= 0x1F780 && char <= 0x1F7FF, + // 'Supplemental Arrows-C': (char) => char >= 0x1F800 && char <= 0x1F8FF, + // 'Supplemental Symbols and Pictographs': (char) => char >= 0x1F900 && char <= 0x1F9FF, + // 'CJK Unified Ideographs Extension B': (char) => char >= 0x20000 && char <= 0x2A6DF, + // 'CJK Unified Ideographs Extension C': (char) => char >= 0x2A700 && char <= 0x2B73F, + // 'CJK Unified Ideographs Extension D': (char) => char >= 0x2B740 && char <= 0x2B81F, + // 'CJK Unified Ideographs Extension E': (char) => char >= 0x2B820 && char <= 0x2CEAF, + // 'CJK Compatibility Ideographs Supplement': (char) => char >= 0x2F800 && char <= 0x2FA1F, + // 'Tags': (char) => char >= 0xE0000 && char <= 0xE007F, + // 'Variation Selectors Supplement': (char) => char >= 0xE0100 && char <= 0xE01EF, + // 'Supplementary Private Use Area-A': (char) => char >= 0xF0000 && char <= 0xFFFFF, + // 'Supplementary Private Use Area-B': (char) => char >= 0x100000 && char <= 0x10FFFF, +}; + +module.exports = unicodeBlockLookup; + +},{}],124:[function(require,module,exports){ +'use strict'; +// + +/** + * A [least-recently-used cache](http://en.wikipedia.org/wiki/Cache_algorithms) + * with hash lookup made possible by keeping a list of keys in parallel to + * an array of dictionary of values + * + * @private + */ +var LRUCache = function LRUCache(max , onRemove ) { + this.max = max; + this.onRemove = onRemove; + this.reset(); +}; + +/** + * Clear the cache + * + * @returns {LRUCache} this cache + * @private + */ +LRUCache.prototype.reset = function reset () { + var this$1 = this; + + for (var key in this.data) { + this$1.onRemove(this$1.data[key]); + } + + this.data = {}; + this.order = []; + + return this; +}; + +/** + * Add a key, value combination to the cache, trimming its size if this pushes + * it over max length. + * + * @param {string} key lookup key for the item + * @param {*} data any value + * + * @returns {LRUCache} this cache + * @private + */ +LRUCache.prototype.add = function add (key , data ) { + + if (this.has(key)) { + this.order.splice(this.order.indexOf(key), 1); + this.data[key] = data; + this.order.push(key); + + } else { + this.data[key] = data; + this.order.push(key); + + if (this.order.length > this.max) { + var removedData = this.get(this.order[0]); + if (removedData) this.onRemove(removedData); + } + } + + return this; +}; + +/** + * Determine whether the value attached to `key` is present + * + * @param {string} key the key to be looked-up + * @returns {boolean} whether the cache has this value + * @private + */ +LRUCache.prototype.has = function has (key ) { + return key in this.data; +}; + +/** + * List all keys in the cache + * + * @returns {Array} an array of keys in this cache. + * @private + */ +LRUCache.prototype.keys = function keys () { + return this.order; +}; + +/** + * Get the value attached to a specific key. If the key is not found, + * returns `null` + * + * @param {string} key the key to look up + * @returns {*} the data, or null if it isn't found + * @private + */ +LRUCache.prototype.get = function get (key ) { + if (!this.has(key)) { return null; } + + var data = this.data[key]; + + delete this.data[key]; + this.order.splice(this.order.indexOf(key), 1); + + return data; +}; + +/** + * Remove a key/value combination from the cache. + * + * @param {string} key the key for the pair to delete + * @returns {LRUCache} this cache + * @private + */ +LRUCache.prototype.remove = function remove (key ) { + if (!this.has(key)) { return this; } + + var data = this.data[key]; + delete this.data[key]; + this.onRemove(data); + this.order.splice(this.order.indexOf(key), 1); + + return this; +}; + +/** + * Change the max size of the cache. + * + * @param {number} max the max size of the cache + * @returns {LRUCache} this cache + * @private + */ +LRUCache.prototype.setMaxSize = function setMaxSize (max ) { + var this$1 = this; + + this.max = max; + + while (this.order.length > this.max) { + var removedData = this$1.get(this$1.order[0]); + if (removedData) this$1.onRemove(removedData); + } + + return this; +}; + +module.exports = LRUCache; + +},{}],125:[function(require,module,exports){ +'use strict'; +// + +var config = require('./config'); +var browser = require('./browser'); + +var help = 'See https://www.mapbox.com/developers/api/#access-tokens'; + + + + + + + + +function makeAPIURL(urlObject , accessToken) { + var apiUrlObject = parseUrl(config.API_URL); + urlObject.protocol = apiUrlObject.protocol; + urlObject.authority = apiUrlObject.authority; + + if (!config.REQUIRE_ACCESS_TOKEN) return formatUrl(urlObject); + + accessToken = accessToken || config.ACCESS_TOKEN; + if (!accessToken) + throw new Error(("An API access token is required to use Mapbox GL. " + help)); + if (accessToken[0] === 's') + throw new Error(("Use a public access token (pk.*) with Mapbox GL, not a secret access token (sk.*). " + help)); + + urlObject.params.push(("access_token=" + accessToken)); + return formatUrl(urlObject); +} + +function isMapboxURL(url ) { + return url.indexOf('mapbox:') === 0; +} + +exports.isMapboxURL = isMapboxURL; + +exports.normalizeStyleURL = function(url , accessToken ) { + if (!isMapboxURL(url)) return url; + var urlObject = parseUrl(url); + urlObject.path = "/styles/v1" + (urlObject.path); + return makeAPIURL(urlObject, accessToken); +}; + +exports.normalizeGlyphsURL = function(url , accessToken ) { + if (!isMapboxURL(url)) return url; + var urlObject = parseUrl(url); + urlObject.path = "/fonts/v1" + (urlObject.path); + return makeAPIURL(urlObject, accessToken); +}; + +exports.normalizeSourceURL = function(url , accessToken ) { + if (!isMapboxURL(url)) return url; + var urlObject = parseUrl(url); + urlObject.path = "/v4/" + (urlObject.authority) + ".json"; + // TileJSON requests need a secure flag appended to their URLs so + // that the server knows to send SSL-ified resource references. + urlObject.params.push('secure'); + return makeAPIURL(urlObject, accessToken); +}; + +exports.normalizeSpriteURL = function(url , format , extension , accessToken ) { + var urlObject = parseUrl(url); + if (!isMapboxURL(url)) { + urlObject.path += "" + format + extension; + return formatUrl(urlObject); + } + urlObject.path = "/styles/v1" + (urlObject.path) + "/sprite" + format + extension; + return makeAPIURL(urlObject, accessToken); +}; + +var imageExtensionRe = /(\.(png|jpg)\d*)(?=$)/; + +exports.normalizeTileURL = function(tileURL , sourceURL , tileSize ) { + if (!sourceURL || !isMapboxURL(sourceURL)) return tileURL; + + var urlObject = parseUrl(tileURL); + + // The v4 mapbox tile API supports 512x512 image tiles only when @2x + // is appended to the tile URL. If `tileSize: 512` is specified for + // a Mapbox raster source force the @2x suffix even if a non hidpi device. + var suffix = browser.devicePixelRatio >= 2 || tileSize === 512 ? '@2x' : ''; + var extension = browser.supportsWebp ? '.webp' : '$1'; + urlObject.path = urlObject.path.replace(imageExtensionRe, ("" + suffix + extension)); + + replaceTempAccessToken(urlObject.params); + return formatUrl(urlObject); +}; + +function replaceTempAccessToken(params ) { + for (var i = 0; i < params.length; i++) { + if (params[i].indexOf('access_token=tk.') === 0) { + params[i] = "access_token=" + (config.ACCESS_TOKEN || ''); + } + } +} + +var urlRe = /^(\w+):\/\/([^/?]+)(\/[^?]+)?\??(.+)?/; + +function parseUrl(url ) { + var parts = url.match(urlRe); + if (!parts) { + throw new Error('Unable to parse URL object'); + } + return { + protocol: parts[1], + authority: parts[2], + path: parts[3] || '/', + params: parts[4] ? parts[4].split('&') : [] + }; +} + +function formatUrl(obj ) { + var params = obj.params.length ? ("?" + (obj.params.join('&'))) : ''; + return ((obj.protocol) + "://" + (obj.authority) + (obj.path) + params); +} + +},{"./browser":110,"./config":114}],126:[function(require,module,exports){ +'use strict'; +/* eslint-disable new-cap */ + +var isChar = require('./is_char_in_unicode_block'); + +module.exports.allowsIdeographicBreaking = function(chars) { + for (var i = 0, list = chars; i < list.length; i += 1) { + var char = list[i]; + + if (!exports.charAllowsIdeographicBreaking(char.charCodeAt(0))) return false; + } + return true; +}; + +module.exports.allowsVerticalWritingMode = function(chars) { + for (var i = 0, list = chars; i < list.length; i += 1) { + var char = list[i]; + + if (exports.charHasUprightVerticalOrientation(char.charCodeAt(0))) return true; + } + return false; +}; + +module.exports.charAllowsIdeographicBreaking = function(char) { + // Return early for characters outside all ideographic ranges. + if (char < 0x2E80) return false; + + if (isChar['Bopomofo Extended'](char)) return true; + if (isChar['Bopomofo'](char)) return true; + if (isChar['CJK Compatibility Forms'](char)) return true; + if (isChar['CJK Compatibility Ideographs'](char)) return true; + if (isChar['CJK Compatibility'](char)) return true; + if (isChar['CJK Radicals Supplement'](char)) return true; + if (isChar['CJK Strokes'](char)) return true; + if (isChar['CJK Symbols and Punctuation'](char)) return true; + if (isChar['CJK Unified Ideographs Extension A'](char)) return true; + if (isChar['CJK Unified Ideographs'](char)) return true; + if (isChar['Enclosed CJK Letters and Months'](char)) return true; + if (isChar['Halfwidth and Fullwidth Forms'](char)) return true; + if (isChar['Hiragana'](char)) return true; + if (isChar['Ideographic Description Characters'](char)) return true; + if (isChar['Kangxi Radicals'](char)) return true; + if (isChar['Katakana Phonetic Extensions'](char)) return true; + if (isChar['Katakana'](char)) return true; + if (isChar['Vertical Forms'](char)) return true; + if (isChar['Yi Radicals'](char)) return true; + if (isChar['Yi Syllables'](char)) return true; + + return false; +}; + +// The following logic comes from +// . +// The data file denotes with “U†or “Tu†any codepoint that may be drawn +// upright in vertical text but does not distinguish between upright and +// “neutral†characters. + +// Blocks in the Unicode supplementary planes are excluded from this module due +// to . + +/** + * Returns true if the given Unicode codepoint identifies a character with + * upright orientation. + * + * A character has upright orientation if it is drawn upright (unrotated) + * whether the line is oriented horizontally or vertically, even if both + * adjacent characters can be rotated. For example, a Chinese character is + * always drawn upright. An uprightly oriented character causes an adjacent + * “neutral†character to be drawn upright as well. + */ +exports.charHasUprightVerticalOrientation = function(char) { + if (char === 0x02EA /* modifier letter yin departing tone mark */ || + char === 0x02EB /* modifier letter yang departing tone mark */) { + return true; + } + + // Return early for characters outside all ranges whose characters remain + // upright in vertical writing mode. + if (char < 0x1100) return false; + + if (isChar['Bopomofo Extended'](char)) return true; + if (isChar['Bopomofo'](char)) return true; + if (isChar['CJK Compatibility Forms'](char)) { + if (!(char >= 0xFE49 /* dashed overline */ && char <= 0xFE4F /* wavy low line */)) { + return true; + } + } + if (isChar['CJK Compatibility Ideographs'](char)) return true; + if (isChar['CJK Compatibility'](char)) return true; + if (isChar['CJK Radicals Supplement'](char)) return true; + if (isChar['CJK Strokes'](char)) return true; + if (isChar['CJK Symbols and Punctuation'](char)) { + if (!(char >= 0x3008 /* left angle bracket */ && char <= 0x3011 /* right black lenticular bracket */) && + !(char >= 0x3014 /* left tortoise shell bracket */ && char <= 0x301F /* low double prime quotation mark */) && + char !== 0x3030 /* wavy dash */) { + return true; + } + } + if (isChar['CJK Unified Ideographs Extension A'](char)) return true; + if (isChar['CJK Unified Ideographs'](char)) return true; + if (isChar['Enclosed CJK Letters and Months'](char)) return true; + if (isChar['Hangul Compatibility Jamo'](char)) return true; + if (isChar['Hangul Jamo Extended-A'](char)) return true; + if (isChar['Hangul Jamo Extended-B'](char)) return true; + if (isChar['Hangul Jamo'](char)) return true; + if (isChar['Hangul Syllables'](char)) return true; + if (isChar['Hiragana'](char)) return true; + if (isChar['Ideographic Description Characters'](char)) return true; + if (isChar['Kanbun'](char)) return true; + if (isChar['Kangxi Radicals'](char)) return true; + if (isChar['Katakana Phonetic Extensions'](char)) return true; + if (isChar['Katakana'](char)) { + if (char !== 0x30FC /* katakana-hiragana prolonged sound mark */) { + return true; + } + } + if (isChar['Halfwidth and Fullwidth Forms'](char)) { + if (char !== 0xFF08 /* fullwidth left parenthesis */ && + char !== 0xFF09 /* fullwidth right parenthesis */ && + char !== 0xFF0D /* fullwidth hyphen-minus */ && + !(char >= 0xFF1A /* fullwidth colon */ && char <= 0xFF1E /* fullwidth greater-than sign */) && + char !== 0xFF3B /* fullwidth left square bracket */ && + char !== 0xFF3D /* fullwidth right square bracket */ && + char !== 0xFF3F /* fullwidth low line */ && + !(char >= 0xFF5B /* fullwidth left curly bracket */ && char <= 0xFFDF) && + char !== 0xFFE3 /* fullwidth macron */ && + !(char >= 0xFFE8 /* halfwidth forms light vertical */ && char <= 0xFFEF)) { + return true; + } + } + if (isChar['Small Form Variants'](char)) { + if (!(char >= 0xFE58 /* small em dash */ && char <= 0xFE5E /* small right tortoise shell bracket */) && + !(char >= 0xFE63 /* small hyphen-minus */ && char <= 0xFE66 /* small equals sign */)) { + return true; + } + } + if (isChar['Unified Canadian Aboriginal Syllabics'](char)) return true; + if (isChar['Unified Canadian Aboriginal Syllabics Extended'](char)) return true; + if (isChar['Vertical Forms'](char)) return true; + if (isChar['Yijing Hexagram Symbols'](char)) return true; + if (isChar['Yi Syllables'](char)) return true; + if (isChar['Yi Radicals'](char)) return true; + + return false; +}; + +/** + * Returns true if the given Unicode codepoint identifies a character with + * neutral orientation. + * + * A character has neutral orientation if it may be drawn rotated or unrotated + * when the line is oriented vertically, depending on the orientation of the + * adjacent characters. For example, along a verticlly oriented line, the vulgar + * fraction ½ is drawn upright among Chinese characters but rotated among Latin + * letters. A neutrally oriented character does not influence whether an + * adjacent character is drawn upright or rotated. + */ +exports.charHasNeutralVerticalOrientation = function(char) { + if (isChar['Latin-1 Supplement'](char)) { + if (char === 0x00A7 /* section sign */ || + char === 0x00A9 /* copyright sign */ || + char === 0x00AE /* registered sign */ || + char === 0x00B1 /* plus-minus sign */ || + char === 0x00BC /* vulgar fraction one quarter */ || + char === 0x00BD /* vulgar fraction one half */ || + char === 0x00BE /* vulgar fraction three quarters */ || + char === 0x00D7 /* multiplication sign */ || + char === 0x00F7 /* division sign */) { + return true; + } + } + if (isChar['General Punctuation'](char)) { + if (char === 0x2016 /* double vertical line */ || + char === 0x2020 /* dagger */ || + char === 0x2021 /* double dagger */ || + char === 0x2030 /* per mille sign */ || + char === 0x2031 /* per ten thousand sign */ || + char === 0x203B /* reference mark */ || + char === 0x203C /* double exclamation mark */ || + char === 0x2042 /* asterism */ || + char === 0x2047 /* double question mark */ || + char === 0x2048 /* question exclamation mark */ || + char === 0x2049 /* exclamation question mark */ || + char === 0x2051 /* two asterisks aligned vertically */) { + return true; + } + } + if (isChar['Letterlike Symbols'](char)) return true; + if (isChar['Number Forms'](char)) return true; + if (isChar['Miscellaneous Technical'](char)) { + if ((char >= 0x2300 /* diameter sign */ && char <= 0x2307 /* wavy line */) || + (char >= 0x230C /* bottom right crop */ && char <= 0x231F /* bottom right corner */) || + (char >= 0x2324 /* up arrowhead between two horizontal bars */ && char <= 0x2328 /* keyboard */) || + char === 0x232B /* erase to the left */ || + (char >= 0x237D /* shouldered open box */ && char <= 0x239A /* clear screen symbol */) || + (char >= 0x23BE /* dentistry symbol light vertical and top right */ && char <= 0x23CD /* square foot */) || + char === 0x23CF /* eject symbol */ || + (char >= 0x23D1 /* metrical breve */ && char <= 0x23DB /* fuse */) || + (char >= 0x23E2 /* white trapezium */ && char <= 0x23FF)) { + return true; + } + } + if (isChar['Control Pictures'](char) && char !== 0x2423 /* open box */) return true; + if (isChar['Optical Character Recognition'](char)) return true; + if (isChar['Enclosed Alphanumerics'](char)) return true; + if (isChar['Geometric Shapes'](char)) return true; + if (isChar['Miscellaneous Symbols'](char)) { + if (!(char >= 0x261A /* black left pointing index */ && char <= 0x261F /* white down pointing index */)) { + return true; + } + } + if (isChar['Miscellaneous Symbols and Arrows'](char)) { + if ((char >= 0x2B12 /* square with top half black */ && char <= 0x2B2F /* white vertical ellipse */) || + (char >= 0x2B50 /* white medium star */ && char <= 0x2B59 /* heavy circled saltire */) || + (char >= 0x2BB8 /* upwards white arrow from bar with horizontal bar */ && char <= 0x2BEB)) { + return true; + } + } + if (isChar['CJK Symbols and Punctuation'](char)) return true; + if (isChar['Katakana'](char)) return true; + if (isChar['Private Use Area'](char)) return true; + if (isChar['CJK Compatibility Forms'](char)) return true; + if (isChar['Small Form Variants'](char)) return true; + if (isChar['Halfwidth and Fullwidth Forms'](char)) return true; + + if (char === 0x221E /* infinity */ || + char === 0x2234 /* therefore */ || + char === 0x2235 /* because */ || + (char >= 0x2700 /* black safety scissors */ && char <= 0x2767 /* rotated floral heart bullet */) || + (char >= 0x2776 /* dingbat negative circled digit one */ && char <= 0x2793 /* dingbat negative circled sans-serif number ten */) || + char === 0xFFFC /* object replacement character */ || + char === 0xFFFD /* replacement character */) { + return true; + } + + return false; +}; + +/** + * Returns true if the given Unicode codepoint identifies a character with + * rotated orientation. + * + * A character has rotated orientation if it is drawn rotated when the line is + * oriented vertically, even if both adjacent characters are upright. For + * example, a Latin letter is drawn rotated along a vertical line. A rotated + * character causes an adjacent “neutral†character to be drawn rotated as well. + */ +exports.charHasRotatedVerticalOrientation = function(char) { + return !(exports.charHasUprightVerticalOrientation(char) || + exports.charHasNeutralVerticalOrientation(char)); +}; + +},{"./is_char_in_unicode_block":123}],127:[function(require,module,exports){ +'use strict'; +// + +// Note: all "sizes" are measured in bytes + +var assert = require('assert'); + +module.exports = createStructArrayType; + +var viewTypes = { + 'Int8': Int8Array, + 'Uint8': Uint8Array, + 'Uint8Clamped': Uint8ClampedArray, + 'Int16': Int16Array, + 'Uint16': Uint16Array, + 'Int32': Int32Array, + 'Uint32': Uint32Array, + 'Float32': Float32Array, + 'Float64': Float64Array +}; + +/* eslint-disable no-undef */ + +/* eslint-enable no-undef */ + +/** + * @typedef {Object} StructMember + * @private + * @property {string} name + * @property {string} type + * @property {number} components + */ + +/** + * @private + */ +var Struct = function Struct(structArray, index) { + this._structArray = structArray; + this._pos1 = index * this.size; + this._pos2 = this._pos1 / 2; + this._pos4 = this._pos1 / 4; + this._pos8 = this._pos1 / 8; + }; + +var DEFAULT_CAPACITY = 128; +var RESIZE_MULTIPLIER = 5; + + + + + + + + +/** + * The StructArray class is inherited by the custom StructArrayType classes created with + * `createStructArrayType(members, options)`. + * @private + */ +var StructArray = function StructArray(serialized ) { + this.isTransferred = false; + + if (serialized !== undefined) { + // Create from an serialized StructArray + this.arrayBuffer = serialized.arrayBuffer; + this.length = serialized.length; + this.capacity = this.arrayBuffer.byteLength / this.bytesPerElement; + this._refreshViews(); + + // Create a new StructArray + } else { + this.capacity = -1; + this.resize(0); + } + }; + + /** + * Serialize the StructArray type. This serializes the *type* not an instance of the type. + */ + StructArray.serialize = function serialize () { + return { + members: this.prototype.members, + alignment: this.prototype.StructType.prototype.alignment, + bytesPerElement: this.prototype.bytesPerElement + }; + }; + + /** + * Serialize this StructArray instance + */ + StructArray.prototype.serialize = function serialize (transferables ) { + assert(!this.isTransferred); + + this._trim(); + + if (transferables) { + this.isTransferred = true; + transferables.push(this.arrayBuffer); + } + return { + length: this.length, + arrayBuffer: this.arrayBuffer + }; + }; + + /** + * Return the Struct at the given location in the array. + * @param {number} index The index of the element. + */ + StructArray.prototype.get = function get (index ) { + assert(!this.isTransferred); + return new this.StructType(this, index); + }; + + /** + * Resize the array to discard unused capacity. + */ + StructArray.prototype._trim = function _trim () { + if (this.length !== this.capacity) { + this.capacity = this.length; + this.arrayBuffer = this.arrayBuffer.slice(0, this.length * this.bytesPerElement); + this._refreshViews(); + } + }; + + /** + * Resize the array. + * If `n` is greater than the current length then additional elements with undefined values are added. + * If `n` is less than the current length then the array will be reduced to the first `n` elements. + * @param {number} n The new size of the array. + */ + StructArray.prototype.resize = function resize (n ) { + assert(!this.isTransferred); + + this.length = n; + if (n > this.capacity) { + this.capacity = Math.max(n, Math.floor(this.capacity * RESIZE_MULTIPLIER), DEFAULT_CAPACITY); + this.arrayBuffer = new ArrayBuffer(this.capacity * this.bytesPerElement); + + var oldUint8Array = this.uint8; + this._refreshViews(); + if (oldUint8Array) this.uint8.set(oldUint8Array); + } + }; + + /** + * Create TypedArray views for the current ArrayBuffer. + */ + StructArray.prototype._refreshViews = function _refreshViews () { + var this$1 = this; + + for (var i = 0, list = this._usedTypes; i < list.length; i += 1) { + // $FlowFixMe + var type = list[i]; + + this$1[getArrayViewName(type)] = new viewTypes[type](this$1.arrayBuffer); + } + }; + + /** + * Output the `StructArray` between indices `startIndex` and `endIndex` as an array of `StructTypes` to enable sorting + * @param {number} startIndex + * @param {number} endIndex + */ + StructArray.prototype.toArray = function toArray (startIndex , endIndex ) { + var this$1 = this; + + assert(!this.isTransferred); + + var array = []; + + for (var i = startIndex; i < endIndex; i++) { + var struct = this$1.get(i); + array.push(struct); + } + + return array; + }; + +var structArrayTypeCache = {}; + +/** + * `createStructArrayType` is used to create new `StructArray` types. + * + * `StructArray` provides an abstraction over `ArrayBuffer` and `TypedArray` making it behave like + * an array of typed structs. A StructArray is comprised of elements. Each element has a set of + * members that are defined when the `StructArrayType` is created. + * + * StructArrays useful for creating large arrays that: + * - can be transferred from workers as a Transferable object + * - can be copied cheaply + * - use less memory for lower-precision members + * - can be used as buffers in WebGL. + * + * @class + * @param {Object} options + * @param {number} options.alignment Use `4` to align members to 4 byte boundaries. Default is 1. + * @param {Array} options.members + * @example + * + * var PointArrayType = createStructArrayType({ + * members: [ + * { type: 'Int16', name: 'x' }, + * { type: 'Int16', name: 'y' } + * ]}); + * + * var pointArray = new PointArrayType(); + * pointArray.emplaceBack(10, 15); + * pointArray.emplaceBack(20, 35); + * + * point = pointArray.get(0); + * assert(point.x === 10); + * assert(point.y === 15); + * + * @private + */ + +function createStructArrayType(options + + + ) { + + var key = JSON.stringify(options); + + if (structArrayTypeCache[key]) { + return structArrayTypeCache[key]; + } + + var alignment = (options.alignment === undefined) ? + 1 : options.alignment; + + var offset = 0; + var maxSize = 0; + var usedTypes = ['Uint8']; + + var members = options.members.map(function (member) { + assert(member.name.length); + assert(member.type in viewTypes); + + if (usedTypes.indexOf(member.type) < 0) usedTypes.push(member.type); + + var typeSize = sizeOf(member.type); + var memberOffset = offset = align(offset, Math.max(alignment, typeSize)); + var components = member.components || 1; + + maxSize = Math.max(maxSize, typeSize); + offset += typeSize * components; + + return { + name: member.name, + type: member.type, + components: components, + offset: memberOffset + }; + }); + + var size = align(offset, Math.max(maxSize, alignment)); + + var StructType = (function (Struct) { + function StructType () { + Struct.apply(this, arguments); + }if ( Struct ) StructType.__proto__ = Struct; + StructType.prototype = Object.create( Struct && Struct.prototype ); + StructType.prototype.constructor = StructType; + + + + return StructType; + }(Struct)); + + StructType.prototype.alignment = alignment; + StructType.prototype.size = size; + + for (var i = 0, list = members; i < list.length; i += 1) { + var member = list[i]; + + for (var c = 0; c < member.components; c++) { + var name = member.name + (member.components === 1 ? '' : c); + Object.defineProperty(StructType.prototype, name, { + get: createGetter(member, c), + set: createSetter(member, c) + }); + } + } + + var StructArrayType = (function (StructArray) { + function StructArrayType () { + StructArray.apply(this, arguments); + }if ( StructArray ) StructArrayType.__proto__ = StructArray; + StructArrayType.prototype = Object.create( StructArray && StructArray.prototype ); + StructArrayType.prototype.constructor = StructArrayType; + + + + return StructArrayType; + }(StructArray)); + + StructArrayType.prototype.members = members; + StructArrayType.prototype.StructType = StructType; + StructArrayType.prototype.bytesPerElement = size; + StructArrayType.prototype.emplaceBack = createEmplaceBack(members, size); + StructArrayType.prototype._usedTypes = usedTypes; + + structArrayTypeCache[key] = StructArrayType; + + return StructArrayType; +} + +function align(offset , size ) { + return Math.ceil(offset / size) * size; +} + +function sizeOf(type ) { + return viewTypes[type].BYTES_PER_ELEMENT; +} + +function getArrayViewName(type ) { + return type.toLowerCase(); +} + +/* + * > I saw major perf gains by shortening the source of these generated methods (i.e. renaming + * > elementIndex to i) (likely due to v8 inlining heuristics). + * - lucaswoj + */ +function createEmplaceBack(members, bytesPerElement) { + var usedTypeSizes = []; + var argNames = []; + var body = + 'var i = this.length;\n' + + 'this.resize(this.length + 1);\n'; + + for (var i = 0, list = members; i < list.length; i += 1) { + var member = list[i]; + + var size = sizeOf(member.type); + + // array offsets to the end of current data for each type size + // var o{SIZE} = i * ROUNDED(bytesPerElement / size); + if (usedTypeSizes.indexOf(size) < 0) { + usedTypeSizes.push(size); + body += "var o" + (size.toFixed(0)) + " = i * " + ((bytesPerElement / size).toFixed(0)) + ";\n"; + } + + for (var c = 0; c < member.components; c++) { + // arguments v0, v1, v2, ... are, in order, the components of + // member 0, then the components of member 1, etc. + var argName = "v" + (argNames.length); + // The index for `member` component `c` into the appropriate type array is: + // this.{TYPE}[o{SIZE} + MEMBER_OFFSET + {c}] = v{X} + // where MEMBER_OFFSET = ROUND(member.offset / size) is the per-element + // offset of this member into the array + var index = "o" + (size.toFixed(0)) + " + " + ((member.offset / size + c).toFixed(0)); + body += "this." + (getArrayViewName(member.type)) + "[" + index + "] = " + argName + ";\n"; + argNames.push(argName); + } + } + + body += 'return i;'; + + return new Function(argNames.toString(), body); +} + +function createMemberComponentString(member, component) { + var elementOffset = "this._pos" + (sizeOf(member.type).toFixed(0)); + var componentOffset = (member.offset / sizeOf(member.type) + component).toFixed(0); + var index = elementOffset + " + " + componentOffset; + return ("this._structArray." + (getArrayViewName(member.type)) + "[" + index + "]"); +} + +function createGetter(member, c) { + return new Function(("return " + (createMemberComponentString(member, c)) + ";")); +} + +function createSetter(member, c) { + return new Function('x', ((createMemberComponentString(member, c)) + " = x;")); +} + +},{"assert":135}],128:[function(require,module,exports){ +'use strict'; + +// + +module.exports = resolveTokens; + +/** + * Replace tokens in a string template with values in an object + * + * @param {Object} properties a key/value relationship between tokens and replacements + * @param {string} text the template string + * @returns {string} the template with tokens replaced + * @private + */ +function resolveTokens(properties , text ) { + return text.replace(/{([^{}]+)}/g, function (match, key ) { + return key in properties ? properties[key] : ''; + }); +} + +},{}],129:[function(require,module,exports){ +'use strict'; +// + +var UnitBezier = require('@mapbox/unitbezier'); +var Coordinate = require('../geo/coordinate'); +var Point = require('point-geometry'); + +/** + * Given a value `t` that varies between 0 and 1, return + * an interpolation function that eases between 0 and 1 in a pleasing + * cubic in-out fashion. + * + * @private + */ +exports.easeCubicInOut = function(t ) { + if (t <= 0) return 0; + if (t >= 1) return 1; + var t2 = t * t, + t3 = t2 * t; + return 4 * (t < 0.5 ? t3 : 3 * (t - t2) + t3 - 0.75); +}; + +/** + * Given given (x, y), (x1, y1) control points for a bezier curve, + * return a function that interpolates along that curve. + * + * @param p1x control point 1 x coordinate + * @param p1y control point 1 y coordinate + * @param p2x control point 2 x coordinate + * @param p2y control point 2 y coordinate + * @private + */ +exports.bezier = function(p1x , p1y , p2x , p2y ) { + var bezier = new UnitBezier(p1x, p1y, p2x, p2y); + return function(t ) { + return bezier.solve(t); + }; +}; + +/** + * A default bezier-curve powered easing function with + * control points (0.25, 0.1) and (0.25, 1) + * + * @private + */ +exports.ease = exports.bezier(0.25, 0.1, 0.25, 1); + +/** + * constrain n to the given range via min + max + * + * @param n value + * @param min the minimum value to be returned + * @param max the maximum value to be returned + * @returns the clamped value + * @private + */ +exports.clamp = function (n , min , max ) { + return Math.min(max, Math.max(min, n)); +}; + +/** + * constrain n to the given range, excluding the minimum, via modular arithmetic + * + * @param n value + * @param min the minimum value to be returned, exclusive + * @param max the maximum value to be returned, inclusive + * @returns constrained number + * @private + */ +exports.wrap = function (n , min , max ) { + var d = max - min; + var w = ((n - min) % d + d) % d + min; + return (w === min) ? max : w; +}; + +/* + * Call an asynchronous function on an array of arguments, + * calling `callback` with the completed results of all calls. + * + * @param array input to each call of the async function. + * @param fn an async function with signature (data, callback) + * @param callback a callback run after all async work is done. + * called with an array, containing the results of each async call. + * @private + */ +exports.asyncAll = function (array , fn , callback ) { + if (!array.length) { return callback(null, []); } + var remaining = array.length; + var results = new Array(array.length); + var error = null; + array.forEach(function (item, i) { + fn(item, function (err, result) { + if (err) error = err; + results[i] = result; + if (--remaining === 0) callback(error, results); + }); + }); +}; + +/* + * Polyfill for Object.values. Not fully spec compliant, but we don't + * need it to be. + * + * @private + */ +exports.values = function (obj ) { + var result = []; + for (var k in obj) { + result.push(obj[k]); + } + return result; +}; + +/* + * Compute the difference between the keys in one object and the keys + * in another object. + * + * @returns keys difference + * @private + */ +exports.keysDifference = function (obj , other ) { + var difference = []; + for (var i in obj) { + if (!(i in other)) { + difference.push(i); + } + } + return difference; +}; + +/** + * Given a destination object and optionally many source objects, + * copy all properties from the source objects into the destination. + * The last source object given overrides properties from previous + * source objects. + * + * @param dest destination object + * @param {...Object} sources sources from which properties are pulled + * @private + */ +// eslint-disable-next-line no-unused-vars +exports.extend = function (dest , source0 , source1 , source2 ) { + var arguments$1 = arguments; + + for (var i = 1; i < arguments.length; i++) { + var src = arguments$1[i]; + for (var k in src) { + dest[k] = src[k]; + } + } + return dest; +}; + +/** + * Given an object and a number of properties as strings, return version + * of that object with only those properties. + * + * @param src the object + * @param properties an array of property names chosen + * to appear on the resulting object. + * @returns object with limited properties. + * @example + * var foo = { name: 'Charlie', age: 10 }; + * var justName = pick(foo, ['name']); + * // justName = { name: 'Charlie' } + * @private + */ +exports.pick = function (src , properties ) { + var result = {}; + for (var i = 0; i < properties.length; i++) { + var k = properties[i]; + if (k in src) { + result[k] = src[k]; + } + } + return result; +}; + +var id = 1; + +/** + * Return a unique numeric id, starting at 1 and incrementing with + * each call. + * + * @returns unique numeric id. + * @private + */ +exports.uniqueId = function () { + return id++; +}; + +/** + * Given an array of member function names as strings, replace all of them + * with bound versions that will always refer to `context` as `this`. This + * is useful for classes where otherwise event bindings would reassign + * `this` to the evented object or some other value: this lets you ensure + * the `this` value always. + * + * @param fns list of member function names + * @param context the context value + * @example + * function MyClass() { + * bindAll(['ontimer'], this); + * this.name = 'Tom'; + * } + * MyClass.prototype.ontimer = function() { + * alert(this.name); + * }; + * var myClass = new MyClass(); + * setTimeout(myClass.ontimer, 100); + * @private + */ +exports.bindAll = function(fns , context ) { + fns.forEach(function (fn) { + if (!context[fn]) { return; } + context[fn] = context[fn].bind(context); + }); +}; + +/** + * Given a list of coordinates, get their center as a coordinate. + * + * @returns centerpoint + * @private + */ +exports.getCoordinatesCenter = function(coords ) { + var minX = Infinity; + var minY = Infinity; + var maxX = -Infinity; + var maxY = -Infinity; + + for (var i = 0; i < coords.length; i++) { + minX = Math.min(minX, coords[i].column); + minY = Math.min(minY, coords[i].row); + maxX = Math.max(maxX, coords[i].column); + maxY = Math.max(maxY, coords[i].row); + } + + var dx = maxX - minX; + var dy = maxY - minY; + var dMax = Math.max(dx, dy); + return new Coordinate((minX + maxX) / 2, (minY + maxY) / 2, 0) + .zoomTo(Math.floor(-Math.log(dMax) / Math.LN2)); +}; + +/** + * Determine if a string ends with a particular substring + * + * @private + */ +exports.endsWith = function(string , suffix ) { + return string.indexOf(suffix, string.length - suffix.length) !== -1; +}; + +/** + * Create an object by mapping all the values of an existing object while + * preserving their keys. + * + * @private + */ +exports.mapObject = function(input , iterator , context ) { + var this$1 = this; + + var output = {}; + for (var key in input) { + output[key] = iterator.call(context || this$1, input[key], key, input); + } + return output; +}; + +/** + * Create an object by filtering out values of an existing object. + * + * @private + */ +exports.filterObject = function(input , iterator , context ) { + var this$1 = this; + + var output = {}; + for (var key in input) { + if (iterator.call(context || this$1, input[key], key, input)) { + output[key] = input[key]; + } + } + return output; +}; + +/** + * Deeply compares two object literals. + * + * @private + */ +exports.deepEqual = function(a , b ) { + if (Array.isArray(a)) { + if (!Array.isArray(b) || a.length !== b.length) return false; + for (var i = 0; i < a.length; i++) { + if (!exports.deepEqual(a[i], b[i])) return false; + } + return true; + } + if (typeof a === 'object' && a !== null && b !== null) { + if (!(typeof b === 'object')) return false; + var keys = Object.keys(a); + if (keys.length !== Object.keys(b).length) return false; + for (var key in a) { + if (!exports.deepEqual(a[key], b[key])) return false; + } + return true; + } + return a === b; +}; + +/** + * Deeply clones two objects. + * + * @private + */ +exports.clone = function (input ) { + if (Array.isArray(input)) { + return input.map(exports.clone); + } else if (typeof input === 'object' && input) { + return ((exports.mapObject(input, exports.clone) ) ); + } else { + return input; + } +}; + +/** + * Check if two arrays have at least one common element. + * + * @private + */ +exports.arraysIntersect = function(a , b ) { + for (var l = 0; l < a.length; l++) { + if (b.indexOf(a[l]) >= 0) return true; + } + return false; +}; + +/** + * Print a warning message to the console and ensure duplicate warning messages + * are not printed. + * + * @private + */ +var warnOnceHistory = {}; +exports.warnOnce = function(message ) { + if (!warnOnceHistory[message]) { + // console isn't defined in some WebWorkers, see #2558 + if (typeof console !== "undefined") console.warn(message); + warnOnceHistory[message] = true; + } +}; + +/** + * Indicates if the provided Points are in a counter clockwise (true) or clockwise (false) order + * + * @returns true for a counter clockwise set of points + */ +// http://bryceboe.com/2006/10/23/line-segment-intersection-algorithm/ +exports.isCounterClockwise = function(a , b , c ) { + return (c.y - a.y) * (b.x - a.x) > (b.y - a.y) * (c.x - a.x); +}; + +/** + * Returns the signed area for the polygon ring. Postive areas are exterior rings and + * have a clockwise winding. Negative areas are interior rings and have a counter clockwise + * ordering. + * + * @param ring Exterior or interior ring + */ +exports.calculateSignedArea = function(ring ) { + var sum = 0; + for (var i = 0, len = ring.length, j = len - 1, p1, p2; i < len; j = i++) { + p1 = ring[i]; + p2 = ring[j]; + sum += (p2.x - p1.x) * (p1.y + p2.y); + } + return sum; +}; + +/** + * Detects closed polygons, first + last point are equal + * + * @param points array of points + * @return true if the points are a closed polygon + */ +exports.isClosedPolygon = function(points ) { + // If it is 2 points that are the same then it is a point + // If it is 3 points with start and end the same then it is a line + if (points.length < 4) + return false; + + var p1 = points[0]; + var p2 = points[points.length - 1]; + + if (Math.abs(p1.x - p2.x) > 0 || + Math.abs(p1.y - p2.y) > 0) { + return false; + } + + // polygon simplification can produce polygons with zero area and more than 3 points + return (Math.abs(exports.calculateSignedArea(points)) > 0.01); +}; + +/** + * Converts spherical coordinates to cartesian coordinates. + * + * @param spherical Spherical coordinates, in [radial, azimuthal, polar] + * @return cartesian coordinates in [x, y, z] + */ + +exports.sphericalToCartesian = function(spherical ) { + var r = spherical[0]; + var azimuthal = spherical[1], + polar = spherical[2]; + // We abstract "north"/"up" (compass-wise) to be 0° when really this is 90° (À/2): + // correct for that here + azimuthal += 90; + + // Convert azimuthal and polar angles to radians + azimuthal *= Math.PI / 180; + polar *= Math.PI / 180; + + // spherical to cartesian (x, y, z) + return [ + r * Math.cos(azimuthal) * Math.sin(polar), + r * Math.sin(azimuthal) * Math.sin(polar), + r * Math.cos(polar) + ]; +}; + +/** + * Parses data from 'Cache-Control' headers. + * + * @param cacheControl Value of 'Cache-Control' header + * @return object containing parsed header info. + */ + +exports.parseCacheControl = function(cacheControl ) { + // Taken from [Wreck](https://github.com/hapijs/wreck) + var re = /(?:^|(?:\s*\,\s*))([^\x00-\x20\(\)<>@\,;\:\\"\/\[\]\?\=\{\}\x7F]+)(?:\=(?:([^\x00-\x20\(\)<>@\,;\:\\"\/\[\]\?\=\{\}\x7F]+)|(?:\"((?:[^"\\]|\\.)*)\")))?/g; + + var header = {}; + cacheControl.replace(re, function ($0, $1, $2, $3) { + var value = $2 || $3; + header[$1] = value ? value.toLowerCase() : true; + return ''; + }); + + if (header['max-age']) { + var maxAge = parseInt(header['max-age'], 10); + if (isNaN(maxAge)) delete header['max-age']; + else header['max-age'] = maxAge; + } + + return header; +}; + +},{"../geo/coordinate":18,"@mapbox/unitbezier":134,"point-geometry":198}],130:[function(require,module,exports){ +'use strict'; + +var Feature = function Feature(vectorTileFeature, z, x, y) { + this.type = 'Feature'; + + this._vectorTileFeature = vectorTileFeature; + vectorTileFeature._z = z; + vectorTileFeature._x = x; + vectorTileFeature._y = y; + + this.properties = vectorTileFeature.properties; + + if (vectorTileFeature.id != null) { + this.id = vectorTileFeature.id; + } +}; + +var prototypeAccessors = { geometry: {} }; + +prototypeAccessors.geometry.get = function () { + if (this._geometry === undefined) { + this._geometry = this._vectorTileFeature.toGeoJSON( + this._vectorTileFeature._x, + this._vectorTileFeature._y, + this._vectorTileFeature._z).geometry; + } + return this._geometry; +}; + +prototypeAccessors.geometry.set = function (g) { + this._geometry = g; +}; + +Feature.prototype.toJSON = function toJSON () { + var this$1 = this; + + var json = { + geometry: this.geometry + }; + for (var i in this) { + if (i === '_geometry' || i === '_vectorTileFeature') continue; + json[i] = this$1[i]; + } + return json; +}; + +Object.defineProperties( Feature.prototype, prototypeAccessors ); + +module.exports = Feature; + +},{}],131:[function(require,module,exports){ +'use strict'; + +var scriptDetection = require('./script_detection'); + +module.exports = function verticalizePunctuation(input) { + var output = ''; + + for (var i = 0; i < input.length; i++) { + var nextCharCode = input.charCodeAt(i + 1) || null; + var prevCharCode = input.charCodeAt(i - 1) || null; + + var canReplacePunctuation = ( + (!nextCharCode || !scriptDetection.charHasRotatedVerticalOrientation(nextCharCode) || module.exports.lookup[input[i + 1]]) && + (!prevCharCode || !scriptDetection.charHasRotatedVerticalOrientation(prevCharCode) || module.exports.lookup[input[i - 1]]) + ); + + if (canReplacePunctuation && module.exports.lookup[input[i]]) { + output += module.exports.lookup[input[i]]; + } else { + output += input[i]; + } + } + + return output; +}; + +module.exports.lookup = { + '!': '︕', + '#': '#', + '$': '$', + '%': 'ï¼…', + '&': '&', + '(': '︵', + ')': '︶', + '*': '*', + '+': '+', + ',': 'ï¸Â', + '-': '︲', + '.': '・', + '/': 'ï¼Â', + ':': '︓', + ';': 'ï¸â€', + '<': '︿', + '=': 'ï¼Â', + '>': 'ï¹€', + '?': '︖', + '@': 'ï¼ ', + '[': '﹇', + '\\': 'ï¼¼', + ']': '﹈', + '^': 'ï¼¾', + '_': '︳', + '`': 'ï½€', + '{': '︷', + '|': '―', + '}': '︸', + '~': '~', + '¢': 'ï¿ ', + '£': 'ï¿¡', + 'Â¥': 'ï¿¥', + '¦': '¦', + '¬': 'ï¿¢', + '¯': 'ï¿£', + '–': '︲', + 'â€â€': '︱', + '‘': '﹃', + '’': '﹄', + '“': 'ï¹Â', + 'â€Â': '﹂', + '…': '︙', + '‧': '・', + 'â‚©': '₩', + 'ã€Â': '︑', + '。': '︒', + '〈': '︿', + '〉': 'ï¹€', + '《': '︽', + '》': '︾', + '「': 'ï¹Â', + 'ã€Â': '﹂', + '『': '﹃', + 'ã€Â': '﹄', + 'ã€Â': '︻', + '】': '︼', + 'ã€â€': '︹', + '〕': '︺', + '〖': '︗', + '〗': '︘', + 'ï¼Â': '︕', + '(': '︵', + ')': '︶', + ',': 'ï¸Â', + 'ï¼Â': '︲', + '.': '・', + ':': '︓', + 'ï¼›': 'ï¸â€', + '<': '︿', + '>': 'ï¹€', + '?': '︖', + 'ï¼»': '﹇', + 'ï¼½': '﹈', + '_': '︳', + 'ï½›': '︷', + '|': '―', + 'ï½Â': '︸', + '⦅': '︵', + 'ï½ ': '︶', + '。': '︒', + 'ï½¢': 'ï¹Â', + 'ï½£': '﹂' +}; + +},{"./script_detection":126}],132:[function(require,module,exports){ +'use strict'; + +var assert = require('assert'); +var WebWorker = require('./web_worker'); + +/** + * Constructs a worker pool. + * @private + */ +var WorkerPool = function WorkerPool() { + this.active = {}; +}; + +WorkerPool.prototype.acquire = function acquire (mapId) { + var this$1 = this; + + if (!this.workers) { + // Lazily look up the value of mapboxgl.workerCount. This allows + // client code a chance to set it while circumventing cyclic + // dependency problems + var workerCount = require('../mapbox-gl').workerCount; + assert(typeof workerCount === 'number' && workerCount < Infinity); + + this.workers = []; + while (this.workers.length < workerCount) { + this$1.workers.push(new WebWorker()); + } + } + + this.active[mapId] = true; + return this.workers.slice(); +}; + +WorkerPool.prototype.release = function release (mapId) { + delete this.active[mapId]; + if (Object.keys(this.active).length === 0) { + this.workers.forEach(function (w) { + w.terminate(); + }); + this.workers = null; + } +}; + +module.exports = WorkerPool; + +},{"../mapbox-gl":24,"./web_worker":111,"assert":135}],133:[function(require,module,exports){ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global.glMatrix = factory()); +}(this, (function () { 'use strict'; + +function create() { + var out = new Float32Array(3); + out[0] = 0; + out[1] = 0; + out[2] = 0; + return out; +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +function transformMat3(out, a, m) { + var x = a[0], y = a[1], z = a[2]; + out[0] = x * m[0] + y * m[3] + z * m[6]; + out[1] = x * m[1] + y * m[4] + z * m[7]; + out[2] = x * m[2] + y * m[5] + z * m[8]; + return out; +} + + + + +var vec = create(); + +function create$1() { + var out = new Float32Array(4); + out[0] = 0; + out[1] = 0; + out[2] = 0; + out[3] = 0; + return out; +} + + + + + + + + + + + + + +function scale$1(out, a, b) { + out[0] = a[0] * b; + out[1] = a[1] * b; + out[2] = a[2] * b; + out[3] = a[3] * b; + return out; +} + + + + + + + +function normalize$1(out, a) { + var x = a[0], + y = a[1], + z = a[2], + w = a[3]; + var len = x * x + y * y + z * z + w * w; + if (len > 0) { + len = 1 / Math.sqrt(len); + out[0] = x * len; + out[1] = y * len; + out[2] = z * len; + out[3] = w * len; + } + return out; +} + + + +function transformMat4$1(out, a, m) { + var x = a[0], y = a[1], z = a[2], w = a[3]; + out[0] = m[0] * x + m[4] * y + m[8] * z + m[12] * w; + out[1] = m[1] * x + m[5] * y + m[9] * z + m[13] * w; + out[2] = m[2] * x + m[6] * y + m[10] * z + m[14] * w; + out[3] = m[3] * x + m[7] * y + m[11] * z + m[15] * w; + return out; +} + +var vec$1 = create$1(); + +function create$2() { + var out = new Float32Array(4); + out[0] = 1; + out[1] = 0; + out[2] = 0; + out[3] = 1; + return out; +} + + + + + + + + + + +function rotate(out, a, rad) { + var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], + s = Math.sin(rad), + c = Math.cos(rad); + out[0] = a0 * c + a2 * s; + out[1] = a1 * c + a3 * s; + out[2] = a0 * -s + a2 * c; + out[3] = a1 * -s + a3 * c; + return out; +} +function scale$2(out, a, v) { + var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], + v0 = v[0], v1 = v[1]; + out[0] = a0 * v0; + out[1] = a1 * v0; + out[2] = a2 * v1; + out[3] = a3 * v1; + return out; +} + +function create$3() { + var out = new Float32Array(9); + out[0] = 1; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 1; + out[5] = 0; + out[6] = 0; + out[7] = 0; + out[8] = 1; + return out; +} + + + + + + + + + + + + + + + +function fromRotation$1(out, rad) { + var s = Math.sin(rad), c = Math.cos(rad); + out[0] = c; + out[1] = s; + out[2] = 0; + out[3] = -s; + out[4] = c; + out[5] = 0; + out[6] = 0; + out[7] = 0; + out[8] = 1; + return out; +} + +function create$4() { + var out = new Float32Array(16); + out[0] = 1; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 0; + out[5] = 1; + out[6] = 0; + out[7] = 0; + out[8] = 0; + out[9] = 0; + out[10] = 1; + out[11] = 0; + out[12] = 0; + out[13] = 0; + out[14] = 0; + out[15] = 1; + return out; +} + + + + +function identity$2(out) { + out[0] = 1; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 0; + out[5] = 1; + out[6] = 0; + out[7] = 0; + out[8] = 0; + out[9] = 0; + out[10] = 1; + out[11] = 0; + out[12] = 0; + out[13] = 0; + out[14] = 0; + out[15] = 1; + return out; +} + +function invert$2(out, a) { + var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3], + a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7], + a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11], + a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15], + b00 = a00 * a11 - a01 * a10, + b01 = a00 * a12 - a02 * a10, + b02 = a00 * a13 - a03 * a10, + b03 = a01 * a12 - a02 * a11, + b04 = a01 * a13 - a03 * a11, + b05 = a02 * a13 - a03 * a12, + b06 = a20 * a31 - a21 * a30, + b07 = a20 * a32 - a22 * a30, + b08 = a20 * a33 - a23 * a30, + b09 = a21 * a32 - a22 * a31, + b10 = a21 * a33 - a23 * a31, + b11 = a22 * a33 - a23 * a32, + det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06; + if (!det) { + return null; + } + det = 1.0 / det; + out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det; + out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det; + out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det; + out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det; + out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det; + out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det; + out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det; + out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det; + out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det; + out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det; + out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det; + out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det; + out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det; + out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det; + out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det; + out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det; + return out; +} + + +function multiply$4(out, a, b) { + var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3], + a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7], + a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11], + a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15]; + var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3]; + out[0] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30; + out[1] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31; + out[2] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32; + out[3] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33; + b0 = b[4]; b1 = b[5]; b2 = b[6]; b3 = b[7]; + out[4] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30; + out[5] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31; + out[6] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32; + out[7] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33; + b0 = b[8]; b1 = b[9]; b2 = b[10]; b3 = b[11]; + out[8] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30; + out[9] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31; + out[10] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32; + out[11] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33; + b0 = b[12]; b1 = b[13]; b2 = b[14]; b3 = b[15]; + out[12] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30; + out[13] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31; + out[14] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32; + out[15] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33; + return out; +} +function translate$1(out, a, v) { + var x = v[0], y = v[1], z = v[2], + a00, a01, a02, a03, + a10, a11, a12, a13, + a20, a21, a22, a23; + if (a === out) { + out[12] = a[0] * x + a[4] * y + a[8] * z + a[12]; + out[13] = a[1] * x + a[5] * y + a[9] * z + a[13]; + out[14] = a[2] * x + a[6] * y + a[10] * z + a[14]; + out[15] = a[3] * x + a[7] * y + a[11] * z + a[15]; + } else { + a00 = a[0]; a01 = a[1]; a02 = a[2]; a03 = a[3]; + a10 = a[4]; a11 = a[5]; a12 = a[6]; a13 = a[7]; + a20 = a[8]; a21 = a[9]; a22 = a[10]; a23 = a[11]; + out[0] = a00; out[1] = a01; out[2] = a02; out[3] = a03; + out[4] = a10; out[5] = a11; out[6] = a12; out[7] = a13; + out[8] = a20; out[9] = a21; out[10] = a22; out[11] = a23; + out[12] = a00 * x + a10 * y + a20 * z + a[12]; + out[13] = a01 * x + a11 * y + a21 * z + a[13]; + out[14] = a02 * x + a12 * y + a22 * z + a[14]; + out[15] = a03 * x + a13 * y + a23 * z + a[15]; + } + return out; +} +function scale$4(out, a, v) { + var x = v[0], y = v[1], z = v[2]; + out[0] = a[0] * x; + out[1] = a[1] * x; + out[2] = a[2] * x; + out[3] = a[3] * x; + out[4] = a[4] * y; + out[5] = a[5] * y; + out[6] = a[6] * y; + out[7] = a[7] * y; + out[8] = a[8] * z; + out[9] = a[9] * z; + out[10] = a[10] * z; + out[11] = a[11] * z; + out[12] = a[12]; + out[13] = a[13]; + out[14] = a[14]; + out[15] = a[15]; + return out; +} + +function rotateX$1(out, a, rad) { + var s = Math.sin(rad), + c = Math.cos(rad), + a10 = a[4], + a11 = a[5], + a12 = a[6], + a13 = a[7], + a20 = a[8], + a21 = a[9], + a22 = a[10], + a23 = a[11]; + if (a !== out) { + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + out[12] = a[12]; + out[13] = a[13]; + out[14] = a[14]; + out[15] = a[15]; + } + out[4] = a10 * c + a20 * s; + out[5] = a11 * c + a21 * s; + out[6] = a12 * c + a22 * s; + out[7] = a13 * c + a23 * s; + out[8] = a20 * c - a10 * s; + out[9] = a21 * c - a11 * s; + out[10] = a22 * c - a12 * s; + out[11] = a23 * c - a13 * s; + return out; +} + +function rotateZ$1(out, a, rad) { + var s = Math.sin(rad), + c = Math.cos(rad), + a00 = a[0], + a01 = a[1], + a02 = a[2], + a03 = a[3], + a10 = a[4], + a11 = a[5], + a12 = a[6], + a13 = a[7]; + if (a !== out) { + out[8] = a[8]; + out[9] = a[9]; + out[10] = a[10]; + out[11] = a[11]; + out[12] = a[12]; + out[13] = a[13]; + out[14] = a[14]; + out[15] = a[15]; + } + out[0] = a00 * c + a10 * s; + out[1] = a01 * c + a11 * s; + out[2] = a02 * c + a12 * s; + out[3] = a03 * c + a13 * s; + out[4] = a10 * c - a00 * s; + out[5] = a11 * c - a01 * s; + out[6] = a12 * c - a02 * s; + out[7] = a13 * c - a03 * s; + return out; +} + + + + + + + + + + + + + + +function perspective(out, fovy, aspect, near, far) { + var f = 1.0 / Math.tan(fovy / 2), + nf = 1 / (near - far); + out[0] = f / aspect; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 0; + out[5] = f; + out[6] = 0; + out[7] = 0; + out[8] = 0; + out[9] = 0; + out[10] = (far + near) * nf; + out[11] = -1; + out[12] = 0; + out[13] = 0; + out[14] = (2 * far * near) * nf; + out[15] = 0; + return out; +} + +function ortho(out, left, right, bottom, top, near, far) { + var lr = 1 / (left - right), + bt = 1 / (bottom - top), + nf = 1 / (near - far); + out[0] = -2 * lr; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 0; + out[5] = -2 * bt; + out[6] = 0; + out[7] = 0; + out[8] = 0; + out[9] = 0; + out[10] = 2 * nf; + out[11] = 0; + out[12] = (left + right) * lr; + out[13] = (top + bottom) * bt; + out[14] = (far + near) * nf; + out[15] = 1; + return out; +} + +var mapboxBuild = { + vec3: { + transformMat3: transformMat3 + }, + vec4: { + transformMat4: transformMat4$1 + }, + mat2: { + create: create$2, + rotate: rotate, + scale: scale$2 + }, + mat3: { + create: create$3, + fromRotation: fromRotation$1 + }, + mat4: { + create: create$4, + identity: identity$2, + translate: translate$1, + scale: scale$4, + multiply: multiply$4, + perspective: perspective, + rotateX: rotateX$1, + rotateZ: rotateZ$1, + invert: invert$2, + ortho: ortho + } +}; + +return mapboxBuild; + +}))); + +},{}],134:[function(require,module,exports){ +/* + * Copyright (C) 2008 Apple Inc. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``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 APPLE INC. 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. + * + * Ported from Webkit + * http://svn.webkit.org/repository/webkit/trunk/Source/WebCore/platform/graphics/UnitBezier.h + */ + +module.exports = UnitBezier; + +function UnitBezier(p1x, p1y, p2x, p2y) { + // Calculate the polynomial coefficients, implicit first and last control points are (0,0) and (1,1). + this.cx = 3.0 * p1x; + this.bx = 3.0 * (p2x - p1x) - this.cx; + this.ax = 1.0 - this.cx - this.bx; + + this.cy = 3.0 * p1y; + this.by = 3.0 * (p2y - p1y) - this.cy; + this.ay = 1.0 - this.cy - this.by; + + this.p1x = p1x; + this.p1y = p2y; + this.p2x = p2x; + this.p2y = p2y; +} + +UnitBezier.prototype.sampleCurveX = function(t) { + // `ax t^3 + bx t^2 + cx t' expanded using Horner's rule. + return ((this.ax * t + this.bx) * t + this.cx) * t; +}; + +UnitBezier.prototype.sampleCurveY = function(t) { + return ((this.ay * t + this.by) * t + this.cy) * t; +}; + +UnitBezier.prototype.sampleCurveDerivativeX = function(t) { + return (3.0 * this.ax * t + 2.0 * this.bx) * t + this.cx; +}; + +UnitBezier.prototype.solveCurveX = function(x, epsilon) { + if (typeof epsilon === 'undefined') epsilon = 1e-6; + + var t0, t1, t2, x2, i; + + // First try a few iterations of Newton's method -- normally very fast. + for (t2 = x, i = 0; i < 8; i++) { + + x2 = this.sampleCurveX(t2) - x; + if (Math.abs(x2) < epsilon) return t2; + + var d2 = this.sampleCurveDerivativeX(t2); + if (Math.abs(d2) < 1e-6) break; + + t2 = t2 - x2 / d2; + } + + // Fall back to the bisection method for reliability. + t0 = 0.0; + t1 = 1.0; + t2 = x; + + if (t2 < t0) return t0; + if (t2 > t1) return t1; + + while (t0 < t1) { + + x2 = this.sampleCurveX(t2); + if (Math.abs(x2 - x) < epsilon) return t2; + + if (x > x2) { + t0 = t2; + } else { + t1 = t2; + } + + t2 = (t1 - t0) * 0.5 + t0; + } + + // Failure. + return t2; +}; + +UnitBezier.prototype.solve = function(x, epsilon) { + return this.sampleCurveY(this.solveCurveX(x, epsilon)); +}; + +},{}],135:[function(require,module,exports){ +(function (global){ +'use strict'; + +// compare and isBuffer taken from https://github.com/feross/buffer/blob/680e9e5e488f22aac27599a57dc844a6315928dd/index.js +// original notice: + +/*! + * The buffer module from node.js, for the browser. + * + * @author Feross Aboukhadijeh + * @license MIT + */ +function compare(a, b) { + if (a === b) { + return 0; + } + + var x = a.length; + var y = b.length; + + for (var i = 0, len = Math.min(x, y); i < len; ++i) { + if (a[i] !== b[i]) { + x = a[i]; + y = b[i]; + break; + } + } + + if (x < y) { + return -1; + } + if (y < x) { + return 1; + } + return 0; +} +function isBuffer(b) { + if (global.Buffer && typeof global.Buffer.isBuffer === 'function') { + return global.Buffer.isBuffer(b); + } + return !!(b != null && b._isBuffer); +} + +// based on node assert, original notice: + +// http://wiki.commonjs.org/wiki/Unit_Testing/1.0 +// +// THIS IS NOT TESTED NOR LIKELY TO WORK OUTSIDE V8! +// +// Originally from narwhal.js (http://narwhaljs.org) +// Copyright (c) 2009 Thomas Robinson <280north.com> +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the 'Software'), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +var util = require('util/'); +var hasOwn = Object.prototype.hasOwnProperty; +var pSlice = Array.prototype.slice; +var functionsHaveNames = (function () { + return function foo() {}.name === 'foo'; +}()); +function pToString (obj) { + return Object.prototype.toString.call(obj); +} +function isView(arrbuf) { + if (isBuffer(arrbuf)) { + return false; + } + if (typeof global.ArrayBuffer !== 'function') { + return false; + } + if (typeof ArrayBuffer.isView === 'function') { + return ArrayBuffer.isView(arrbuf); + } + if (!arrbuf) { + return false; + } + if (arrbuf instanceof DataView) { + return true; + } + if (arrbuf.buffer && arrbuf.buffer instanceof ArrayBuffer) { + return true; + } + return false; +} +// 1. The assert module provides functions that throw +// AssertionError's when particular conditions are not met. The +// assert module must conform to the following interface. + +var assert = module.exports = ok; + +// 2. The AssertionError is defined in assert. +// new assert.AssertionError({ message: message, +// actual: actual, +// expected: expected }) + +var regex = /\s*function\s+([^\(\s]*)\s*/; +// based on https://github.com/ljharb/function.prototype.name/blob/adeeeec8bfcc6068b187d7d9fb3d5bb1d3a30899/implementation.js +function getName(func) { + if (!util.isFunction(func)) { + return; + } + if (functionsHaveNames) { + return func.name; + } + var str = func.toString(); + var match = str.match(regex); + return match && match[1]; +} +assert.AssertionError = function AssertionError(options) { + this.name = 'AssertionError'; + this.actual = options.actual; + this.expected = options.expected; + this.operator = options.operator; + if (options.message) { + this.message = options.message; + this.generatedMessage = false; + } else { + this.message = getMessage(this); + this.generatedMessage = true; + } + var stackStartFunction = options.stackStartFunction || fail; + if (Error.captureStackTrace) { + Error.captureStackTrace(this, stackStartFunction); + } else { + // non v8 browsers so we can have a stacktrace + var err = new Error(); + if (err.stack) { + var out = err.stack; + + // try to strip useless frames + var fn_name = getName(stackStartFunction); + var idx = out.indexOf('\n' + fn_name); + if (idx >= 0) { + // once we have located the function frame + // we need to strip out everything before it (and its line) + var next_line = out.indexOf('\n', idx + 1); + out = out.substring(next_line + 1); + } + + this.stack = out; + } + } +}; + +// assert.AssertionError instanceof Error +util.inherits(assert.AssertionError, Error); + +function truncate(s, n) { + if (typeof s === 'string') { + return s.length < n ? s : s.slice(0, n); + } else { + return s; + } +} +function inspect(something) { + if (functionsHaveNames || !util.isFunction(something)) { + return util.inspect(something); + } + var rawname = getName(something); + var name = rawname ? ': ' + rawname : ''; + return '[Function' + name + ']'; +} +function getMessage(self) { + return truncate(inspect(self.actual), 128) + ' ' + + self.operator + ' ' + + truncate(inspect(self.expected), 128); +} + +// At present only the three keys mentioned above are used and +// understood by the spec. Implementations or sub modules can pass +// other keys to the AssertionError's constructor - they will be +// ignored. + +// 3. All of the following functions must throw an AssertionError +// when a corresponding condition is not met, with a message that +// may be undefined if not provided. All assertion methods provide +// both the actual and expected values to the assertion error for +// display purposes. + +function fail(actual, expected, message, operator, stackStartFunction) { + throw new assert.AssertionError({ + message: message, + actual: actual, + expected: expected, + operator: operator, + stackStartFunction: stackStartFunction + }); +} + +// EXTENSION! allows for well behaved errors defined elsewhere. +assert.fail = fail; + +// 4. Pure assertion tests whether a value is truthy, as determined +// by !!guard. +// assert.ok(guard, message_opt); +// This statement is equivalent to assert.equal(true, !!guard, +// message_opt);. To test strictly for the value true, use +// assert.strictEqual(true, guard, message_opt);. + +function ok(value, message) { + if (!value) fail(value, true, message, '==', assert.ok); +} +assert.ok = ok; + +// 5. The equality assertion tests shallow, coercive equality with +// ==. +// assert.equal(actual, expected, message_opt); + +assert.equal = function equal(actual, expected, message) { + if (actual != expected) fail(actual, expected, message, '==', assert.equal); +}; + +// 6. The non-equality assertion tests for whether two objects are not equal +// with != assert.notEqual(actual, expected, message_opt); + +assert.notEqual = function notEqual(actual, expected, message) { + if (actual == expected) { + fail(actual, expected, message, '!=', assert.notEqual); + } +}; + +// 7. The equivalence assertion tests a deep equality relation. +// assert.deepEqual(actual, expected, message_opt); + +assert.deepEqual = function deepEqual(actual, expected, message) { + if (!_deepEqual(actual, expected, false)) { + fail(actual, expected, message, 'deepEqual', assert.deepEqual); + } +}; + +assert.deepStrictEqual = function deepStrictEqual(actual, expected, message) { + if (!_deepEqual(actual, expected, true)) { + fail(actual, expected, message, 'deepStrictEqual', assert.deepStrictEqual); + } +}; + +function _deepEqual(actual, expected, strict, memos) { + // 7.1. All identical values are equivalent, as determined by ===. + if (actual === expected) { + return true; + } else if (isBuffer(actual) && isBuffer(expected)) { + return compare(actual, expected) === 0; + + // 7.2. If the expected value is a Date object, the actual value is + // equivalent if it is also a Date object that refers to the same time. + } else if (util.isDate(actual) && util.isDate(expected)) { + return actual.getTime() === expected.getTime(); + + // 7.3 If the expected value is a RegExp object, the actual value is + // equivalent if it is also a RegExp object with the same source and + // properties (`global`, `multiline`, `lastIndex`, `ignoreCase`). + } else if (util.isRegExp(actual) && util.isRegExp(expected)) { + return actual.source === expected.source && + actual.global === expected.global && + actual.multiline === expected.multiline && + actual.lastIndex === expected.lastIndex && + actual.ignoreCase === expected.ignoreCase; + + // 7.4. Other pairs that do not both pass typeof value == 'object', + // equivalence is determined by ==. + } else if ((actual === null || typeof actual !== 'object') && + (expected === null || typeof expected !== 'object')) { + return strict ? actual === expected : actual == expected; + + // If both values are instances of typed arrays, wrap their underlying + // ArrayBuffers in a Buffer each to increase performance + // This optimization requires the arrays to have the same type as checked by + // Object.prototype.toString (aka pToString). Never perform binary + // comparisons for Float*Arrays, though, since e.g. +0 === -0 but their + // bit patterns are not identical. + } else if (isView(actual) && isView(expected) && + pToString(actual) === pToString(expected) && + !(actual instanceof Float32Array || + actual instanceof Float64Array)) { + return compare(new Uint8Array(actual.buffer), + new Uint8Array(expected.buffer)) === 0; + + // 7.5 For all other Object pairs, including Array objects, equivalence is + // determined by having the same number of owned properties (as verified + // with Object.prototype.hasOwnProperty.call), the same set of keys + // (although not necessarily the same order), equivalent values for every + // corresponding key, and an identical 'prototype' property. Note: this + // accounts for both named and indexed properties on Arrays. + } else if (isBuffer(actual) !== isBuffer(expected)) { + return false; + } else { + memos = memos || {actual: [], expected: []}; + + var actualIndex = memos.actual.indexOf(actual); + if (actualIndex !== -1) { + if (actualIndex === memos.expected.indexOf(expected)) { + return true; + } + } + + memos.actual.push(actual); + memos.expected.push(expected); + + return objEquiv(actual, expected, strict, memos); + } +} + +function isArguments(object) { + return Object.prototype.toString.call(object) == '[object Arguments]'; +} + +function objEquiv(a, b, strict, actualVisitedObjects) { + if (a === null || a === undefined || b === null || b === undefined) + return false; + // if one is a primitive, the other must be same + if (util.isPrimitive(a) || util.isPrimitive(b)) + return a === b; + if (strict && Object.getPrototypeOf(a) !== Object.getPrototypeOf(b)) + return false; + var aIsArgs = isArguments(a); + var bIsArgs = isArguments(b); + if ((aIsArgs && !bIsArgs) || (!aIsArgs && bIsArgs)) + return false; + if (aIsArgs) { + a = pSlice.call(a); + b = pSlice.call(b); + return _deepEqual(a, b, strict); + } + var ka = objectKeys(a); + var kb = objectKeys(b); + var key, i; + // having the same number of owned properties (keys incorporates + // hasOwnProperty) + if (ka.length !== kb.length) + return false; + //the same set of keys (although not necessarily the same order), + ka.sort(); + kb.sort(); + //~~~cheap key test + for (i = ka.length - 1; i >= 0; i--) { + if (ka[i] !== kb[i]) + return false; + } + //equivalent values for every corresponding key, and + //~~~possibly expensive deep test + for (i = ka.length - 1; i >= 0; i--) { + key = ka[i]; + if (!_deepEqual(a[key], b[key], strict, actualVisitedObjects)) + return false; + } + return true; +} + +// 8. The non-equivalence assertion tests for any deep inequality. +// assert.notDeepEqual(actual, expected, message_opt); + +assert.notDeepEqual = function notDeepEqual(actual, expected, message) { + if (_deepEqual(actual, expected, false)) { + fail(actual, expected, message, 'notDeepEqual', assert.notDeepEqual); + } +}; + +assert.notDeepStrictEqual = notDeepStrictEqual; +function notDeepStrictEqual(actual, expected, message) { + if (_deepEqual(actual, expected, true)) { + fail(actual, expected, message, 'notDeepStrictEqual', notDeepStrictEqual); + } +} + + +// 9. The strict equality assertion tests strict equality, as determined by ===. +// assert.strictEqual(actual, expected, message_opt); + +assert.strictEqual = function strictEqual(actual, expected, message) { + if (actual !== expected) { + fail(actual, expected, message, '===', assert.strictEqual); + } +}; + +// 10. The strict non-equality assertion tests for strict inequality, as +// determined by !==. assert.notStrictEqual(actual, expected, message_opt); + +assert.notStrictEqual = function notStrictEqual(actual, expected, message) { + if (actual === expected) { + fail(actual, expected, message, '!==', assert.notStrictEqual); + } +}; + +function expectedException(actual, expected) { + if (!actual || !expected) { + return false; + } + + if (Object.prototype.toString.call(expected) == '[object RegExp]') { + return expected.test(actual); + } + + try { + if (actual instanceof expected) { + return true; + } + } catch (e) { + // Ignore. The instanceof check doesn't work for arrow functions. + } + + if (Error.isPrototypeOf(expected)) { + return false; + } + + return expected.call({}, actual) === true; +} + +function _tryBlock(block) { + var error; + try { + block(); + } catch (e) { + error = e; + } + return error; +} + +function _throws(shouldThrow, block, expected, message) { + var actual; + + if (typeof block !== 'function') { + throw new TypeError('"block" argument must be a function'); + } + + if (typeof expected === 'string') { + message = expected; + expected = null; + } + + actual = _tryBlock(block); + + message = (expected && expected.name ? ' (' + expected.name + ').' : '.') + + (message ? ' ' + message : '.'); + + if (shouldThrow && !actual) { + fail(actual, expected, 'Missing expected exception' + message); + } + + var userProvidedMessage = typeof message === 'string'; + var isUnwantedException = !shouldThrow && util.isError(actual); + var isUnexpectedException = !shouldThrow && actual && !expected; + + if ((isUnwantedException && + userProvidedMessage && + expectedException(actual, expected)) || + isUnexpectedException) { + fail(actual, expected, 'Got unwanted exception' + message); + } + + if ((shouldThrow && actual && expected && + !expectedException(actual, expected)) || (!shouldThrow && actual)) { + throw actual; + } +} + +// 11. Expected to throw an error: +// assert.throws(block, Error_opt, message_opt); + +assert.throws = function(block, /*optional*/error, /*optional*/message) { + _throws(true, block, error, message); +}; + +// EXTENSION! This is annoying to write outside this module. +assert.doesNotThrow = function(block, /*optional*/error, /*optional*/message) { + _throws(false, block, error, message); +}; + +assert.ifError = function(err) { if (err) throw err; }; + +var objectKeys = Object.keys || function (obj) { + var keys = []; + for (var key in obj) { + if (hasOwn.call(obj, key)) keys.push(key); + } + return keys; +}; + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{"util/":206}],136:[function(require,module,exports){ +// (c) Dean McNamee , 2012. +// +// https://github.com/deanm/css-color-parser-js +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. + +// http://www.w3.org/TR/css3-color/ +var kCSSColorTable = { + "transparent": [0,0,0,0], "aliceblue": [240,248,255,1], + "antiquewhite": [250,235,215,1], "aqua": [0,255,255,1], + "aquamarine": [127,255,212,1], "azure": [240,255,255,1], + "beige": [245,245,220,1], "bisque": [255,228,196,1], + "black": [0,0,0,1], "blanchedalmond": [255,235,205,1], + "blue": [0,0,255,1], "blueviolet": [138,43,226,1], + "brown": [165,42,42,1], "burlywood": [222,184,135,1], + "cadetblue": [95,158,160,1], "chartreuse": [127,255,0,1], + "chocolate": [210,105,30,1], "coral": [255,127,80,1], + "cornflowerblue": [100,149,237,1], "cornsilk": [255,248,220,1], + "crimson": [220,20,60,1], "cyan": [0,255,255,1], + "darkblue": [0,0,139,1], "darkcyan": [0,139,139,1], + "darkgoldenrod": [184,134,11,1], "darkgray": [169,169,169,1], + "darkgreen": [0,100,0,1], "darkgrey": [169,169,169,1], + "darkkhaki": [189,183,107,1], "darkmagenta": [139,0,139,1], + "darkolivegreen": [85,107,47,1], "darkorange": [255,140,0,1], + "darkorchid": [153,50,204,1], "darkred": [139,0,0,1], + "darksalmon": [233,150,122,1], "darkseagreen": [143,188,143,1], + "darkslateblue": [72,61,139,1], "darkslategray": [47,79,79,1], + "darkslategrey": [47,79,79,1], "darkturquoise": [0,206,209,1], + "darkviolet": [148,0,211,1], "deeppink": [255,20,147,1], + "deepskyblue": [0,191,255,1], "dimgray": [105,105,105,1], + "dimgrey": [105,105,105,1], "dodgerblue": [30,144,255,1], + "firebrick": [178,34,34,1], "floralwhite": [255,250,240,1], + "forestgreen": [34,139,34,1], "fuchsia": [255,0,255,1], + "gainsboro": [220,220,220,1], "ghostwhite": [248,248,255,1], + "gold": [255,215,0,1], "goldenrod": [218,165,32,1], + "gray": [128,128,128,1], "green": [0,128,0,1], + "greenyellow": [173,255,47,1], "grey": [128,128,128,1], + "honeydew": [240,255,240,1], "hotpink": [255,105,180,1], + "indianred": [205,92,92,1], "indigo": [75,0,130,1], + "ivory": [255,255,240,1], "khaki": [240,230,140,1], + "lavender": [230,230,250,1], "lavenderblush": [255,240,245,1], + "lawngreen": [124,252,0,1], "lemonchiffon": [255,250,205,1], + "lightblue": [173,216,230,1], "lightcoral": [240,128,128,1], + "lightcyan": [224,255,255,1], "lightgoldenrodyellow": [250,250,210,1], + "lightgray": [211,211,211,1], "lightgreen": [144,238,144,1], + "lightgrey": [211,211,211,1], "lightpink": [255,182,193,1], + "lightsalmon": [255,160,122,1], "lightseagreen": [32,178,170,1], + "lightskyblue": [135,206,250,1], "lightslategray": [119,136,153,1], + "lightslategrey": [119,136,153,1], "lightsteelblue": [176,196,222,1], + "lightyellow": [255,255,224,1], "lime": [0,255,0,1], + "limegreen": [50,205,50,1], "linen": [250,240,230,1], + "magenta": [255,0,255,1], "maroon": [128,0,0,1], + "mediumaquamarine": [102,205,170,1], "mediumblue": [0,0,205,1], + "mediumorchid": [186,85,211,1], "mediumpurple": [147,112,219,1], + "mediumseagreen": [60,179,113,1], "mediumslateblue": [123,104,238,1], + "mediumspringgreen": [0,250,154,1], "mediumturquoise": [72,209,204,1], + "mediumvioletred": [199,21,133,1], "midnightblue": [25,25,112,1], + "mintcream": [245,255,250,1], "mistyrose": [255,228,225,1], + "moccasin": [255,228,181,1], "navajowhite": [255,222,173,1], + "navy": [0,0,128,1], "oldlace": [253,245,230,1], + "olive": [128,128,0,1], "olivedrab": [107,142,35,1], + "orange": [255,165,0,1], "orangered": [255,69,0,1], + "orchid": [218,112,214,1], "palegoldenrod": [238,232,170,1], + "palegreen": [152,251,152,1], "paleturquoise": [175,238,238,1], + "palevioletred": [219,112,147,1], "papayawhip": [255,239,213,1], + "peachpuff": [255,218,185,1], "peru": [205,133,63,1], + "pink": [255,192,203,1], "plum": [221,160,221,1], + "powderblue": [176,224,230,1], "purple": [128,0,128,1], + "rebeccapurple": [102,51,153,1], + "red": [255,0,0,1], "rosybrown": [188,143,143,1], + "royalblue": [65,105,225,1], "saddlebrown": [139,69,19,1], + "salmon": [250,128,114,1], "sandybrown": [244,164,96,1], + "seagreen": [46,139,87,1], "seashell": [255,245,238,1], + "sienna": [160,82,45,1], "silver": [192,192,192,1], + "skyblue": [135,206,235,1], "slateblue": [106,90,205,1], + "slategray": [112,128,144,1], "slategrey": [112,128,144,1], + "snow": [255,250,250,1], "springgreen": [0,255,127,1], + "steelblue": [70,130,180,1], "tan": [210,180,140,1], + "teal": [0,128,128,1], "thistle": [216,191,216,1], + "tomato": [255,99,71,1], "turquoise": [64,224,208,1], + "violet": [238,130,238,1], "wheat": [245,222,179,1], + "white": [255,255,255,1], "whitesmoke": [245,245,245,1], + "yellow": [255,255,0,1], "yellowgreen": [154,205,50,1]} + +function clamp_css_byte(i) { // Clamp to integer 0 .. 255. + i = Math.round(i); // Seems to be what Chrome does (vs truncation). + return i < 0 ? 0 : i > 255 ? 255 : i; +} + +function clamp_css_float(f) { // Clamp to float 0.0 .. 1.0. + return f < 0 ? 0 : f > 1 ? 1 : f; +} + +function parse_css_int(str) { // int or percentage. + if (str[str.length - 1] === '%') + return clamp_css_byte(parseFloat(str) / 100 * 255); + return clamp_css_byte(parseInt(str)); +} + +function parse_css_float(str) { // float or percentage. + if (str[str.length - 1] === '%') + return clamp_css_float(parseFloat(str) / 100); + return clamp_css_float(parseFloat(str)); +} + +function css_hue_to_rgb(m1, m2, h) { + if (h < 0) h += 1; + else if (h > 1) h -= 1; + + if (h * 6 < 1) return m1 + (m2 - m1) * h * 6; + if (h * 2 < 1) return m2; + if (h * 3 < 2) return m1 + (m2 - m1) * (2/3 - h) * 6; + return m1; +} + +function parseCSSColor(css_str) { + // Remove all whitespace, not compliant, but should just be more accepting. + var str = css_str.replace(/ /g, '').toLowerCase(); + + // Color keywords (and transparent) lookup. + if (str in kCSSColorTable) return kCSSColorTable[str].slice(); // dup. + + // #abc and #abc123 syntax. + if (str[0] === '#') { + if (str.length === 4) { + var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing. + if (!(iv >= 0 && iv <= 0xfff)) return null; // Covers NaN. + return [((iv & 0xf00) >> 4) | ((iv & 0xf00) >> 8), + (iv & 0xf0) | ((iv & 0xf0) >> 4), + (iv & 0xf) | ((iv & 0xf) << 4), + 1]; + } else if (str.length === 7) { + var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing. + if (!(iv >= 0 && iv <= 0xffffff)) return null; // Covers NaN. + return [(iv & 0xff0000) >> 16, + (iv & 0xff00) >> 8, + iv & 0xff, + 1]; + } + + return null; + } + + var op = str.indexOf('('), ep = str.indexOf(')'); + if (op !== -1 && ep + 1 === str.length) { + var fname = str.substr(0, op); + var params = str.substr(op+1, ep-(op+1)).split(','); + var alpha = 1; // To allow case fallthrough. + switch (fname) { + case 'rgba': + if (params.length !== 4) return null; + alpha = parse_css_float(params.pop()); + // Fall through. + case 'rgb': + if (params.length !== 3) return null; + return [parse_css_int(params[0]), + parse_css_int(params[1]), + parse_css_int(params[2]), + alpha]; + case 'hsla': + if (params.length !== 4) return null; + alpha = parse_css_float(params.pop()); + // Fall through. + case 'hsl': + if (params.length !== 3) return null; + var h = (((parseFloat(params[0]) % 360) + 360) % 360) / 360; // 0 .. 1 + // NOTE(deanm): According to the CSS spec s/l should only be + // percentages, but we don't bother and let float or percentage. + var s = parse_css_float(params[1]); + var l = parse_css_float(params[2]); + var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s; + var m1 = l * 2 - m2; + return [clamp_css_byte(css_hue_to_rgb(m1, m2, h+1/3) * 255), + clamp_css_byte(css_hue_to_rgb(m1, m2, h) * 255), + clamp_css_byte(css_hue_to_rgb(m1, m2, h-1/3) * 255), + alpha]; + default: + return null; + } + } + + return null; +} + +try { exports.parseCSSColor = parseCSSColor } catch(e) { } + +},{}],137:[function(require,module,exports){ +'use strict'; + +module.exports = earcut; + +function earcut(data, holeIndices, dim) { + + dim = dim || 2; + + var hasHoles = holeIndices && holeIndices.length, + outerLen = hasHoles ? holeIndices[0] * dim : data.length, + outerNode = linkedList(data, 0, outerLen, dim, true), + triangles = []; + + if (!outerNode) return triangles; + + var minX, minY, maxX, maxY, x, y, size; + + if (hasHoles) outerNode = eliminateHoles(data, holeIndices, outerNode, dim); + + // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox + if (data.length > 80 * dim) { + minX = maxX = data[0]; + minY = maxY = data[1]; + + for (var i = dim; i < outerLen; i += dim) { + x = data[i]; + y = data[i + 1]; + if (x < minX) minX = x; + if (y < minY) minY = y; + if (x > maxX) maxX = x; + if (y > maxY) maxY = y; + } + + // minX, minY and size are later used to transform coords into integers for z-order calculation + size = Math.max(maxX - minX, maxY - minY); + } + + earcutLinked(outerNode, triangles, dim, minX, minY, size); + + return triangles; +} + +// create a circular doubly linked list from polygon points in the specified winding order +function linkedList(data, start, end, dim, clockwise) { + var i, last; + + if (clockwise === (signedArea(data, start, end, dim) > 0)) { + for (i = start; i < end; i += dim) last = insertNode(i, data[i], data[i + 1], last); + } else { + for (i = end - dim; i >= start; i -= dim) last = insertNode(i, data[i], data[i + 1], last); + } + + if (last && equals(last, last.next)) { + removeNode(last); + last = last.next; + } + + return last; +} + +// eliminate colinear or duplicate points +function filterPoints(start, end) { + if (!start) return start; + if (!end) end = start; + + var p = start, + again; + do { + again = false; + + if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) { + removeNode(p); + p = end = p.prev; + if (p === p.next) return null; + again = true; + + } else { + p = p.next; + } + } while (again || p !== end); + + return end; +} + +// main ear slicing loop which triangulates a polygon (given as a linked list) +function earcutLinked(ear, triangles, dim, minX, minY, size, pass) { + if (!ear) return; + + // interlink polygon nodes in z-order + if (!pass && size) indexCurve(ear, minX, minY, size); + + var stop = ear, + prev, next; + + // iterate through ears, slicing them one by one + while (ear.prev !== ear.next) { + prev = ear.prev; + next = ear.next; + + if (size ? isEarHashed(ear, minX, minY, size) : isEar(ear)) { + // cut off the triangle + triangles.push(prev.i / dim); + triangles.push(ear.i / dim); + triangles.push(next.i / dim); + + removeNode(ear); + + // skipping the next vertice leads to less sliver triangles + ear = next.next; + stop = next.next; + + continue; + } + + ear = next; + + // if we looped through the whole remaining polygon and can't find any more ears + if (ear === stop) { + // try filtering points and slicing again + if (!pass) { + earcutLinked(filterPoints(ear), triangles, dim, minX, minY, size, 1); + + // if this didn't work, try curing all small self-intersections locally + } else if (pass === 1) { + ear = cureLocalIntersections(ear, triangles, dim); + earcutLinked(ear, triangles, dim, minX, minY, size, 2); + + // as a last resort, try splitting the remaining polygon into two + } else if (pass === 2) { + splitEarcut(ear, triangles, dim, minX, minY, size); + } + + break; + } + } +} + +// check whether a polygon node forms a valid ear with adjacent nodes +function isEar(ear) { + var a = ear.prev, + b = ear, + c = ear.next; + + if (area(a, b, c) >= 0) return false; // reflex, can't be an ear + + // now make sure we don't have other points inside the potential ear + var p = ear.next.next; + + while (p !== ear.prev) { + if (pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) && + area(p.prev, p, p.next) >= 0) return false; + p = p.next; + } + + return true; +} + +function isEarHashed(ear, minX, minY, size) { + var a = ear.prev, + b = ear, + c = ear.next; + + if (area(a, b, c) >= 0) return false; // reflex, can't be an ear + + // triangle bbox; min & max are calculated like this for speed + var minTX = a.x < b.x ? (a.x < c.x ? a.x : c.x) : (b.x < c.x ? b.x : c.x), + minTY = a.y < b.y ? (a.y < c.y ? a.y : c.y) : (b.y < c.y ? b.y : c.y), + maxTX = a.x > b.x ? (a.x > c.x ? a.x : c.x) : (b.x > c.x ? b.x : c.x), + maxTY = a.y > b.y ? (a.y > c.y ? a.y : c.y) : (b.y > c.y ? b.y : c.y); + + // z-order range for the current triangle bbox; + var minZ = zOrder(minTX, minTY, minX, minY, size), + maxZ = zOrder(maxTX, maxTY, minX, minY, size); + + // first look for points inside the triangle in increasing z-order + var p = ear.nextZ; + + while (p && p.z <= maxZ) { + if (p !== ear.prev && p !== ear.next && + pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) && + area(p.prev, p, p.next) >= 0) return false; + p = p.nextZ; + } + + // then look for points in decreasing z-order + p = ear.prevZ; + + while (p && p.z >= minZ) { + if (p !== ear.prev && p !== ear.next && + pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) && + area(p.prev, p, p.next) >= 0) return false; + p = p.prevZ; + } + + return true; +} + +// go through all polygon nodes and cure small local self-intersections +function cureLocalIntersections(start, triangles, dim) { + var p = start; + do { + var a = p.prev, + b = p.next.next; + + if (!equals(a, b) && intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) { + + triangles.push(a.i / dim); + triangles.push(p.i / dim); + triangles.push(b.i / dim); + + // remove two nodes involved + removeNode(p); + removeNode(p.next); + + p = start = b; + } + p = p.next; + } while (p !== start); + + return p; +} + +// try splitting polygon into two and triangulate them independently +function splitEarcut(start, triangles, dim, minX, minY, size) { + // look for a valid diagonal that divides the polygon into two + var a = start; + do { + var b = a.next.next; + while (b !== a.prev) { + if (a.i !== b.i && isValidDiagonal(a, b)) { + // split the polygon in two by the diagonal + var c = splitPolygon(a, b); + + // filter colinear points around the cuts + a = filterPoints(a, a.next); + c = filterPoints(c, c.next); + + // run earcut on each half + earcutLinked(a, triangles, dim, minX, minY, size); + earcutLinked(c, triangles, dim, minX, minY, size); + return; + } + b = b.next; + } + a = a.next; + } while (a !== start); +} + +// link every hole into the outer loop, producing a single-ring polygon without holes +function eliminateHoles(data, holeIndices, outerNode, dim) { + var queue = [], + i, len, start, end, list; + + for (i = 0, len = holeIndices.length; i < len; i++) { + start = holeIndices[i] * dim; + end = i < len - 1 ? holeIndices[i + 1] * dim : data.length; + list = linkedList(data, start, end, dim, false); + if (list === list.next) list.steiner = true; + queue.push(getLeftmost(list)); + } + + queue.sort(compareX); + + // process holes from left to right + for (i = 0; i < queue.length; i++) { + eliminateHole(queue[i], outerNode); + outerNode = filterPoints(outerNode, outerNode.next); + } + + return outerNode; +} + +function compareX(a, b) { + return a.x - b.x; +} + +// find a bridge between vertices that connects hole with an outer ring and and link it +function eliminateHole(hole, outerNode) { + outerNode = findHoleBridge(hole, outerNode); + if (outerNode) { + var b = splitPolygon(outerNode, hole); + filterPoints(b, b.next); + } +} + +// David Eberly's algorithm for finding a bridge between hole and outer polygon +function findHoleBridge(hole, outerNode) { + var p = outerNode, + hx = hole.x, + hy = hole.y, + qx = -Infinity, + m; + + // find a segment intersected by a ray from the hole's leftmost point to the left; + // segment's endpoint with lesser x will be potential connection point + do { + if (hy <= p.y && hy >= p.next.y) { + var x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y); + if (x <= hx && x > qx) { + qx = x; + if (x === hx) { + if (hy === p.y) return p; + if (hy === p.next.y) return p.next; + } + m = p.x < p.next.x ? p : p.next; + } + } + p = p.next; + } while (p !== outerNode); + + if (!m) return null; + + if (hx === qx) return m.prev; // hole touches outer segment; pick lower endpoint + + // look for points inside the triangle of hole point, segment intersection and endpoint; + // if there are no points found, we have a valid connection; + // otherwise choose the point of the minimum angle with the ray as connection point + + var stop = m, + mx = m.x, + my = m.y, + tanMin = Infinity, + tan; + + p = m.next; + + while (p !== stop) { + if (hx >= p.x && p.x >= mx && + pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) { + + tan = Math.abs(hy - p.y) / (hx - p.x); // tangential + + if ((tan < tanMin || (tan === tanMin && p.x > m.x)) && locallyInside(p, hole)) { + m = p; + tanMin = tan; + } + } + + p = p.next; + } + + return m; +} + +// interlink polygon nodes in z-order +function indexCurve(start, minX, minY, size) { + var p = start; + do { + if (p.z === null) p.z = zOrder(p.x, p.y, minX, minY, size); + p.prevZ = p.prev; + p.nextZ = p.next; + p = p.next; + } while (p !== start); + + p.prevZ.nextZ = null; + p.prevZ = null; + + sortLinked(p); +} + +// Simon Tatham's linked list merge sort algorithm +// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html +function sortLinked(list) { + var i, p, q, e, tail, numMerges, pSize, qSize, + inSize = 1; + + do { + p = list; + list = null; + tail = null; + numMerges = 0; + + while (p) { + numMerges++; + q = p; + pSize = 0; + for (i = 0; i < inSize; i++) { + pSize++; + q = q.nextZ; + if (!q) break; + } + + qSize = inSize; + + while (pSize > 0 || (qSize > 0 && q)) { + + if (pSize === 0) { + e = q; + q = q.nextZ; + qSize--; + } else if (qSize === 0 || !q) { + e = p; + p = p.nextZ; + pSize--; + } else if (p.z <= q.z) { + e = p; + p = p.nextZ; + pSize--; + } else { + e = q; + q = q.nextZ; + qSize--; + } + + if (tail) tail.nextZ = e; + else list = e; + + e.prevZ = tail; + tail = e; + } + + p = q; + } + + tail.nextZ = null; + inSize *= 2; + + } while (numMerges > 1); + + return list; +} + +// z-order of a point given coords and size of the data bounding box +function zOrder(x, y, minX, minY, size) { + // coords are transformed into non-negative 15-bit integer range + x = 32767 * (x - minX) / size; + y = 32767 * (y - minY) / size; + + x = (x | (x << 8)) & 0x00FF00FF; + x = (x | (x << 4)) & 0x0F0F0F0F; + x = (x | (x << 2)) & 0x33333333; + x = (x | (x << 1)) & 0x55555555; + + y = (y | (y << 8)) & 0x00FF00FF; + y = (y | (y << 4)) & 0x0F0F0F0F; + y = (y | (y << 2)) & 0x33333333; + y = (y | (y << 1)) & 0x55555555; + + return x | (y << 1); +} + +// find the leftmost node of a polygon ring +function getLeftmost(start) { + var p = start, + leftmost = start; + do { + if (p.x < leftmost.x) leftmost = p; + p = p.next; + } while (p !== start); + + return leftmost; +} + +// check if a point lies within a convex triangle +function pointInTriangle(ax, ay, bx, by, cx, cy, px, py) { + return (cx - px) * (ay - py) - (ax - px) * (cy - py) >= 0 && + (ax - px) * (by - py) - (bx - px) * (ay - py) >= 0 && + (bx - px) * (cy - py) - (cx - px) * (by - py) >= 0; +} + +// check if a diagonal between two polygon nodes is valid (lies in polygon interior) +function isValidDiagonal(a, b) { + return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) && + locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b); +} + +// signed area of a triangle +function area(p, q, r) { + return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y); +} + +// check if two points are equal +function equals(p1, p2) { + return p1.x === p2.x && p1.y === p2.y; +} + +// check if two segments intersect +function intersects(p1, q1, p2, q2) { + if ((equals(p1, q1) && equals(p2, q2)) || + (equals(p1, q2) && equals(p2, q1))) return true; + return area(p1, q1, p2) > 0 !== area(p1, q1, q2) > 0 && + area(p2, q2, p1) > 0 !== area(p2, q2, q1) > 0; +} + +// check if a polygon diagonal intersects any polygon segments +function intersectsPolygon(a, b) { + var p = a; + do { + if (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i && + intersects(p, p.next, a, b)) return true; + p = p.next; + } while (p !== a); + + return false; +} + +// check if a polygon diagonal is locally inside the polygon +function locallyInside(a, b) { + return area(a.prev, a, a.next) < 0 ? + area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0 : + area(a, b, a.prev) < 0 || area(a, a.next, b) < 0; +} + +// check if the middle point of a polygon diagonal is inside the polygon +function middleInside(a, b) { + var p = a, + inside = false, + px = (a.x + b.x) / 2, + py = (a.y + b.y) / 2; + do { + if (((p.y > py) !== (p.next.y > py)) && (px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x)) + inside = !inside; + p = p.next; + } while (p !== a); + + return inside; +} + +// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two; +// if one belongs to the outer ring and another to a hole, it merges it into a single ring +function splitPolygon(a, b) { + var a2 = new Node(a.i, a.x, a.y), + b2 = new Node(b.i, b.x, b.y), + an = a.next, + bp = b.prev; + + a.next = b; + b.prev = a; + + a2.next = an; + an.prev = a2; + + b2.next = a2; + a2.prev = b2; + + bp.next = b2; + b2.prev = bp; + + return b2; +} + +// create a node and optionally link it with previous one (in a circular doubly linked list) +function insertNode(i, x, y, last) { + var p = new Node(i, x, y); + + if (!last) { + p.prev = p; + p.next = p; + + } else { + p.next = last.next; + p.prev = last; + last.next.prev = p; + last.next = p; + } + return p; +} + +function removeNode(p) { + p.next.prev = p.prev; + p.prev.next = p.next; + + if (p.prevZ) p.prevZ.nextZ = p.nextZ; + if (p.nextZ) p.nextZ.prevZ = p.prevZ; +} + +function Node(i, x, y) { + // vertice index in coordinates array + this.i = i; + + // vertex coordinates + this.x = x; + this.y = y; + + // previous and next vertice nodes in a polygon ring + this.prev = null; + this.next = null; + + // z-order curve value + this.z = null; + + // previous and next nodes in z-order + this.prevZ = null; + this.nextZ = null; + + // indicates whether this is a steiner point + this.steiner = false; +} + +// return a percentage difference between the polygon area and its triangulation area; +// used to verify correctness of triangulation +earcut.deviation = function (data, holeIndices, dim, triangles) { + var hasHoles = holeIndices && holeIndices.length; + var outerLen = hasHoles ? holeIndices[0] * dim : data.length; + + var polygonArea = Math.abs(signedArea(data, 0, outerLen, dim)); + if (hasHoles) { + for (var i = 0, len = holeIndices.length; i < len; i++) { + var start = holeIndices[i] * dim; + var end = i < len - 1 ? holeIndices[i + 1] * dim : data.length; + polygonArea -= Math.abs(signedArea(data, start, end, dim)); + } + } + + var trianglesArea = 0; + for (i = 0; i < triangles.length; i += 3) { + var a = triangles[i] * dim; + var b = triangles[i + 1] * dim; + var c = triangles[i + 2] * dim; + trianglesArea += Math.abs( + (data[a] - data[c]) * (data[b + 1] - data[a + 1]) - + (data[a] - data[b]) * (data[c + 1] - data[a + 1])); + } + + return polygonArea === 0 && trianglesArea === 0 ? 0 : + Math.abs((trianglesArea - polygonArea) / polygonArea); +}; + +function signedArea(data, start, end, dim) { + var sum = 0; + for (var i = start, j = end - dim; i < end; i += dim) { + sum += (data[j] - data[i]) * (data[i + 1] + data[j + 1]); + j = i; + } + return sum; +} + +// turn a polygon in a multi-dimensional array form (e.g. as in GeoJSON) into a form Earcut accepts +earcut.flatten = function (data) { + var dim = data[0][0].length, + result = {vertices: [], holes: [], dimensions: dim}, + holeIndex = 0; + + for (var i = 0; i < data.length; i++) { + for (var j = 0; j < data[i].length; j++) { + for (var d = 0; d < dim; d++) result.vertices.push(data[i][j][d]); + } + if (i > 0) { + holeIndex += data[i - 1].length; + result.holes.push(holeIndex); + } + } + return result; +}; + +},{}],138:[function(require,module,exports){ +var toString = {}.toString, + isArray = Array.isArray || function(obj){ + return toString.call(obj) === "[object Array]"; + }, + objKeys = Object.keys || function(obj) { + var keys = []; + for (var name in obj) { + if (obj.hasOwnProperty(name)) { + keys.push(name); + } + } + return keys; + }, + strReg = /[\u0000-\u001f"\\]/g, + strReplace = function(str) { + var code = str.charCodeAt(0); + switch (code) { + case 34: return '\\"'; + case 92: return '\\\\'; + case 12: return "\\f"; + case 10: return "\\n"; + case 13: return "\\r"; + case 9: return "\\t"; + case 8: return "\\b"; + default: + if (code > 15) { + return "\\u00" + code.toString(16); + } else { + return "\\u000" + code.toString(16); + } + } + }; + +/** + * Simple stable stringify. Object keys sorted. No options, no spaces. + * @param {*} val + * @returns {string} + */ +module.exports = function simpleStableStringify(val) { + if (val !== undefined) { + return ''+ sss(val); + } +}; + +module.exports.stringSearch = strReg; +module.exports.stringReplace = strReplace; + +function sss(val) { + var i, max, str, keys, key, pass; + switch (typeof val) { + case "object": + if (val === null) { + return null; + } else if (isArray(val)) { + str = '['; + max = val.length - 1; + for (i = 0; i < max; i++) { + str += sss(val[i]) + ','; + } + if (max > -1) { + str += sss(val[i]); + } + return str + ']'; + } else { + // only object is left + keys = objKeys(val).sort(); + max = keys.length; + str = "{"; + key = keys[i = 0]; + pass = max > 0 && val[key] !== undefined; + while (i < max) { + if (pass) { + str += '"' + key.replace(strReg, strReplace) + '":' + sss(val[key]); + key = keys[++i]; + pass = i < max && val[key] !== undefined; + if (pass) { + str += ','; + } + } else { + key = keys[++i]; + pass = i < max && val[key] !== undefined; + } + } + return str + '}'; + } + case "undefined": + return null; + case "string": + return '"' + val.replace(strReg, strReplace) + '"'; + default: + return val; + } +} + +},{}],139:[function(require,module,exports){ +'use strict'; + +module.exports = createFilter; + +var types = ['Unknown', 'Point', 'LineString', 'Polygon']; + +/** + * Given a filter expressed as nested arrays, return a new function + * that evaluates whether a given feature (with a .properties or .tags property) + * passes its test. + * + * @param {Array} filter mapbox gl filter + * @returns {Function} filter-evaluating function + */ +function createFilter(filter) { + return new Function('f', 'var p = (f && f.properties || {}); return ' + compile(filter)); +} + +function compile(filter) { + if (!filter) return 'true'; + var op = filter[0]; + if (filter.length <= 1) return op === 'any' ? 'false' : 'true'; + var str = + op === '==' ? compileComparisonOp(filter[1], filter[2], '===', false) : + op === '!=' ? compileComparisonOp(filter[1], filter[2], '!==', false) : + op === '<' || + op === '>' || + op === '<=' || + op === '>=' ? compileComparisonOp(filter[1], filter[2], op, true) : + op === 'any' ? compileLogicalOp(filter.slice(1), '||') : + op === 'all' ? compileLogicalOp(filter.slice(1), '&&') : + op === 'none' ? compileNegation(compileLogicalOp(filter.slice(1), '||')) : + op === 'in' ? compileInOp(filter[1], filter.slice(2)) : + op === '!in' ? compileNegation(compileInOp(filter[1], filter.slice(2))) : + op === 'has' ? compileHasOp(filter[1]) : + op === '!has' ? compileNegation(compileHasOp([filter[1]])) : + 'true'; + return '(' + str + ')'; +} + +function compilePropertyReference(property) { + return property === '$type' ? 'f.type' : + property === '$id' ? 'f.id' : + 'p[' + JSON.stringify(property) + ']'; +} + +function compileComparisonOp(property, value, op, checkType) { + var left = compilePropertyReference(property); + var right = property === '$type' ? types.indexOf(value) : JSON.stringify(value); + return (checkType ? 'typeof ' + left + '=== typeof ' + right + '&&' : '') + left + op + right; +} + +function compileLogicalOp(expressions, op) { + return expressions.map(compile).join(op); +} + +function compileInOp(property, values) { + if (property === '$type') values = values.map(function(value) { return types.indexOf(value); }); + var left = JSON.stringify(values.sort(compare)); + var right = compilePropertyReference(property); + + if (values.length <= 200) return left + '.indexOf(' + right + ') !== -1'; + + return 'function(v, a, i, j) {' + + 'while (i <= j) { var m = (i + j) >> 1;' + + ' if (a[m] === v) return true; if (a[m] > v) j = m - 1; else i = m + 1;' + + '}' + + 'return false; }(' + right + ', ' + left + ',0,' + (values.length - 1) + ')'; +} + +function compileHasOp(property) { + return JSON.stringify(property) + ' in p'; +} + +function compileNegation(expression) { + return '!(' + expression + ')'; +} + +// Comparison function to sort numbers and strings +function compare(a, b) { + return a < b ? -1 : a > b ? 1 : 0; +} + +},{}],140:[function(require,module,exports){ +var wgs84 = require('wgs84'); + +module.exports.geometry = geometry; +module.exports.ring = ringArea; + +function geometry(_) { + if (_.type === 'Polygon') return polygonArea(_.coordinates); + else if (_.type === 'MultiPolygon') { + var area = 0; + for (var i = 0; i < _.coordinates.length; i++) { + area += polygonArea(_.coordinates[i]); + } + return area; + } else { + return null; + } +} + +function polygonArea(coords) { + var area = 0; + if (coords && coords.length > 0) { + area += Math.abs(ringArea(coords[0])); + for (var i = 1; i < coords.length; i++) { + area -= Math.abs(ringArea(coords[i])); + } + } + return area; +} + +/** + * Calculate the approximate area of the polygon were it projected onto + * the earth. Note that this area will be positive if ring is oriented + * clockwise, otherwise it will be negative. + * + * Reference: + * Robert. G. Chamberlain and William H. Duquette, "Some Algorithms for + * Polygons on a Sphere", JPL Publication 07-03, Jet Propulsion + * Laboratory, Pasadena, CA, June 2007 http://trs-new.jpl.nasa.gov/dspace/handle/2014/40409 + * + * Returns: + * {float} The approximate signed geodesic area of the polygon in square + * meters. + */ + +function ringArea(coords) { + var area = 0; + + if (coords.length > 2) { + var p1, p2; + for (var i = 0; i < coords.length - 1; i++) { + p1 = coords[i]; + p2 = coords[i + 1]; + area += rad(p2[0] - p1[0]) * (2 + Math.sin(rad(p1[1])) + Math.sin(rad(p2[1]))); + } + + area = area * wgs84.RADIUS * wgs84.RADIUS / 2; + } + + return area; +} + +function rad(_) { + return _ * Math.PI / 180; +} + +},{"wgs84":215}],141:[function(require,module,exports){ +var geojsonArea = require('geojson-area'); + +module.exports = rewind; + +function rewind(gj, outer) { + switch ((gj && gj.type) || null) { + case 'FeatureCollection': + gj.features = gj.features.map(curryOuter(rewind, outer)); + return gj; + case 'Feature': + gj.geometry = rewind(gj.geometry, outer); + return gj; + case 'Polygon': + case 'MultiPolygon': + return correct(gj, outer); + default: + return gj; + } +} + +function curryOuter(a, b) { + return function(_) { return a(_, b); }; +} + +function correct(_, outer) { + if (_.type === 'Polygon') { + _.coordinates = correctRings(_.coordinates, outer); + } else if (_.type === 'MultiPolygon') { + _.coordinates = _.coordinates.map(curryOuter(correctRings, outer)); + } + return _; +} + +function correctRings(_, outer) { + outer = !!outer; + _[0] = wind(_[0], !outer); + for (var i = 1; i < _.length; i++) { + _[i] = wind(_[i], outer); + } + return _; +} + +function wind(_, dir) { + return cw(_) === dir ? _ : _.reverse(); +} + +function cw(_) { + return geojsonArea.ring(_) >= 0; +} + +},{"geojson-area":140}],142:[function(require,module,exports){ +'use strict'; + +module.exports = clip; + +var createFeature = require('./feature'); + +/* clip features between two axis-parallel lines: + * | | + * ___|___ | / + * / | \____|____/ + * | | + */ + +function clip(features, scale, k1, k2, axis, intersect, minAll, maxAll) { + + k1 /= scale; + k2 /= scale; + + if (minAll >= k1 && maxAll <= k2) return features; // trivial accept + else if (minAll > k2 || maxAll < k1) return null; // trivial reject + + var clipped = []; + + for (var i = 0; i < features.length; i++) { + + var feature = features[i], + geometry = feature.geometry, + type = feature.type, + min, max; + + min = feature.min[axis]; + max = feature.max[axis]; + + if (min >= k1 && max <= k2) { // trivial accept + clipped.push(feature); + continue; + } else if (min > k2 || max < k1) continue; // trivial reject + + var slices = type === 1 ? + clipPoints(geometry, k1, k2, axis) : + clipGeometry(geometry, k1, k2, axis, intersect, type === 3); + + if (slices.length) { + // if a feature got clipped, it will likely get clipped on the next zoom level as well, + // so there's no need to recalculate bboxes + clipped.push(createFeature(feature.tags, type, slices, feature.id)); + } + } + + return clipped.length ? clipped : null; +} + +function clipPoints(geometry, k1, k2, axis) { + var slice = []; + + for (var i = 0; i < geometry.length; i++) { + var a = geometry[i], + ak = a[axis]; + + if (ak >= k1 && ak <= k2) slice.push(a); + } + return slice; +} + +function clipGeometry(geometry, k1, k2, axis, intersect, closed) { + + var slices = []; + + for (var i = 0; i < geometry.length; i++) { + + var ak = 0, + bk = 0, + b = null, + points = geometry[i], + area = points.area, + dist = points.dist, + outer = points.outer, + len = points.length, + a, j, last; + + var slice = []; + + for (j = 0; j < len - 1; j++) { + a = b || points[j]; + b = points[j + 1]; + ak = bk || a[axis]; + bk = b[axis]; + + if (ak < k1) { + + if ((bk > k2)) { // ---|-----|--> + slice.push(intersect(a, b, k1), intersect(a, b, k2)); + if (!closed) slice = newSlice(slices, slice, area, dist, outer); + + } else if (bk >= k1) slice.push(intersect(a, b, k1)); // ---|--> | + + } else if (ak > k2) { + + if ((bk < k1)) { // <--|-----|--- + slice.push(intersect(a, b, k2), intersect(a, b, k1)); + if (!closed) slice = newSlice(slices, slice, area, dist, outer); + + } else if (bk <= k2) slice.push(intersect(a, b, k2)); // | <--|--- + + } else { + + slice.push(a); + + if (bk < k1) { // <--|--- | + slice.push(intersect(a, b, k1)); + if (!closed) slice = newSlice(slices, slice, area, dist, outer); + + } else if (bk > k2) { // | ---|--> + slice.push(intersect(a, b, k2)); + if (!closed) slice = newSlice(slices, slice, area, dist, outer); + } + // | --> | + } + } + + // add the last point + a = points[len - 1]; + ak = a[axis]; + if (ak >= k1 && ak <= k2) slice.push(a); + + // close the polygon if its endpoints are not the same after clipping + + last = slice[slice.length - 1]; + if (closed && last && (slice[0][0] !== last[0] || slice[0][1] !== last[1])) slice.push(slice[0]); + + // add the final slice + newSlice(slices, slice, area, dist, outer); + } + + return slices; +} + +function newSlice(slices, slice, area, dist, outer) { + if (slice.length) { + // we don't recalculate the area/length of the unclipped geometry because the case where it goes + // below the visibility threshold as a result of clipping is rare, so we avoid doing unnecessary work + slice.area = area; + slice.dist = dist; + if (outer !== undefined) slice.outer = outer; + + slices.push(slice); + } + return []; +} + +},{"./feature":144}],143:[function(require,module,exports){ +'use strict'; + +module.exports = convert; + +var simplify = require('./simplify'); +var createFeature = require('./feature'); + +// converts GeoJSON feature into an intermediate projected JSON vector format with simplification data + +function convert(data, tolerance) { + var features = []; + + if (data.type === 'FeatureCollection') { + for (var i = 0; i < data.features.length; i++) { + convertFeature(features, data.features[i], tolerance); + } + } else if (data.type === 'Feature') { + convertFeature(features, data, tolerance); + + } else { + // single geometry or a geometry collection + convertFeature(features, {geometry: data}, tolerance); + } + return features; +} + +function convertFeature(features, feature, tolerance) { + if (feature.geometry === null) { + // ignore features with null geometry + return; + } + + var geom = feature.geometry, + type = geom.type, + coords = geom.coordinates, + tags = feature.properties, + id = feature.id, + i, j, rings, projectedRing; + + if (type === 'Point') { + features.push(createFeature(tags, 1, [projectPoint(coords)], id)); + + } else if (type === 'MultiPoint') { + features.push(createFeature(tags, 1, project(coords), id)); + + } else if (type === 'LineString') { + features.push(createFeature(tags, 2, [project(coords, tolerance)], id)); + + } else if (type === 'MultiLineString' || type === 'Polygon') { + rings = []; + for (i = 0; i < coords.length; i++) { + projectedRing = project(coords[i], tolerance); + if (type === 'Polygon') projectedRing.outer = (i === 0); + rings.push(projectedRing); + } + features.push(createFeature(tags, type === 'Polygon' ? 3 : 2, rings, id)); + + } else if (type === 'MultiPolygon') { + rings = []; + for (i = 0; i < coords.length; i++) { + for (j = 0; j < coords[i].length; j++) { + projectedRing = project(coords[i][j], tolerance); + projectedRing.outer = (j === 0); + rings.push(projectedRing); + } + } + features.push(createFeature(tags, 3, rings, id)); + + } else if (type === 'GeometryCollection') { + for (i = 0; i < geom.geometries.length; i++) { + convertFeature(features, { + geometry: geom.geometries[i], + properties: tags + }, tolerance); + } + + } else { + throw new Error('Input data is not a valid GeoJSON object.'); + } +} + +function project(lonlats, tolerance) { + var projected = []; + for (var i = 0; i < lonlats.length; i++) { + projected.push(projectPoint(lonlats[i])); + } + if (tolerance) { + simplify(projected, tolerance); + calcSize(projected); + } + return projected; +} + +function projectPoint(p) { + var sin = Math.sin(p[1] * Math.PI / 180), + x = (p[0] / 360 + 0.5), + y = (0.5 - 0.25 * Math.log((1 + sin) / (1 - sin)) / Math.PI); + + y = y < 0 ? 0 : + y > 1 ? 1 : y; + + return [x, y, 0]; +} + +// calculate area and length of the poly +function calcSize(points) { + var area = 0, + dist = 0; + + for (var i = 0, a, b; i < points.length - 1; i++) { + a = b || points[i]; + b = points[i + 1]; + + area += a[0] * b[1] - b[0] * a[1]; + + // use Manhattan distance instead of Euclidian one to avoid expensive square root computation + dist += Math.abs(b[0] - a[0]) + Math.abs(b[1] - a[1]); + } + points.area = Math.abs(area / 2); + points.dist = dist; +} + +},{"./feature":144,"./simplify":146}],144:[function(require,module,exports){ +'use strict'; + +module.exports = createFeature; + +function createFeature(tags, type, geom, id) { + var feature = { + id: id || null, + type: type, + geometry: geom, + tags: tags || null, + min: [Infinity, Infinity], // initial bbox values + max: [-Infinity, -Infinity] + }; + calcBBox(feature); + return feature; +} + +// calculate the feature bounding box for faster clipping later +function calcBBox(feature) { + var geometry = feature.geometry, + min = feature.min, + max = feature.max; + + if (feature.type === 1) { + calcRingBBox(min, max, geometry); + } else { + for (var i = 0; i < geometry.length; i++) { + calcRingBBox(min, max, geometry[i]); + } + } + + return feature; +} + +function calcRingBBox(min, max, points) { + for (var i = 0, p; i < points.length; i++) { + p = points[i]; + min[0] = Math.min(p[0], min[0]); + max[0] = Math.max(p[0], max[0]); + min[1] = Math.min(p[1], min[1]); + max[1] = Math.max(p[1], max[1]); + } +} + +},{}],145:[function(require,module,exports){ +'use strict'; + +module.exports = geojsonvt; + +var convert = require('./convert'), // GeoJSON conversion and preprocessing + transform = require('./transform'), // coordinate transformation + clip = require('./clip'), // stripe clipping algorithm + wrap = require('./wrap'), // date line processing + createTile = require('./tile'); // final simplified tile generation + + +function geojsonvt(data, options) { + return new GeoJSONVT(data, options); +} + +function GeoJSONVT(data, options) { + options = this.options = extend(Object.create(this.options), options); + + var debug = options.debug; + + if (debug) console.time('preprocess data'); + + var z2 = 1 << options.maxZoom, // 2^z + features = convert(data, options.tolerance / (z2 * options.extent)); + + this.tiles = {}; + this.tileCoords = []; + + if (debug) { + console.timeEnd('preprocess data'); + console.log('index: maxZoom: %d, maxPoints: %d', options.indexMaxZoom, options.indexMaxPoints); + console.time('generate tiles'); + this.stats = {}; + this.total = 0; + } + + features = wrap(features, options.buffer / options.extent, intersectX); + + // start slicing from the top tile down + if (features.length) this.splitTile(features, 0, 0, 0); + + if (debug) { + if (features.length) console.log('features: %d, points: %d', this.tiles[0].numFeatures, this.tiles[0].numPoints); + console.timeEnd('generate tiles'); + console.log('tiles generated:', this.total, JSON.stringify(this.stats)); + } +} + +GeoJSONVT.prototype.options = { + maxZoom: 14, // max zoom to preserve detail on + indexMaxZoom: 5, // max zoom in the tile index + indexMaxPoints: 100000, // max number of points per tile in the tile index + solidChildren: false, // whether to tile solid square tiles further + tolerance: 3, // simplification tolerance (higher means simpler) + extent: 4096, // tile extent + buffer: 64, // tile buffer on each side + debug: 0 // logging level (0, 1 or 2) +}; + +GeoJSONVT.prototype.splitTile = function (features, z, x, y, cz, cx, cy) { + + var stack = [features, z, x, y], + options = this.options, + debug = options.debug, + solid = null; + + // avoid recursion by using a processing queue + while (stack.length) { + y = stack.pop(); + x = stack.pop(); + z = stack.pop(); + features = stack.pop(); + + var z2 = 1 << z, + id = toID(z, x, y), + tile = this.tiles[id], + tileTolerance = z === options.maxZoom ? 0 : options.tolerance / (z2 * options.extent); + + if (!tile) { + if (debug > 1) console.time('creation'); + + tile = this.tiles[id] = createTile(features, z2, x, y, tileTolerance, z === options.maxZoom); + this.tileCoords.push({z: z, x: x, y: y}); + + if (debug) { + if (debug > 1) { + console.log('tile z%d-%d-%d (features: %d, points: %d, simplified: %d)', + z, x, y, tile.numFeatures, tile.numPoints, tile.numSimplified); + console.timeEnd('creation'); + } + var key = 'z' + z; + this.stats[key] = (this.stats[key] || 0) + 1; + this.total++; + } + } + + // save reference to original geometry in tile so that we can drill down later if we stop now + tile.source = features; + + // if it's the first-pass tiling + if (!cz) { + // stop tiling if we reached max zoom, or if the tile is too simple + if (z === options.indexMaxZoom || tile.numPoints <= options.indexMaxPoints) continue; + + // if a drilldown to a specific tile + } else { + // stop tiling if we reached base zoom or our target tile zoom + if (z === options.maxZoom || z === cz) continue; + + // stop tiling if it's not an ancestor of the target tile + var m = 1 << (cz - z); + if (x !== Math.floor(cx / m) || y !== Math.floor(cy / m)) continue; + } + + // stop tiling if the tile is solid clipped square + if (!options.solidChildren && isClippedSquare(tile, options.extent, options.buffer)) { + if (cz) solid = z; // and remember the zoom if we're drilling down + continue; + } + + // if we slice further down, no need to keep source geometry + tile.source = null; + + if (debug > 1) console.time('clipping'); + + // values we'll use for clipping + var k1 = 0.5 * options.buffer / options.extent, + k2 = 0.5 - k1, + k3 = 0.5 + k1, + k4 = 1 + k1, + tl, bl, tr, br, left, right; + + tl = bl = tr = br = null; + + left = clip(features, z2, x - k1, x + k3, 0, intersectX, tile.min[0], tile.max[0]); + right = clip(features, z2, x + k2, x + k4, 0, intersectX, tile.min[0], tile.max[0]); + + if (left) { + tl = clip(left, z2, y - k1, y + k3, 1, intersectY, tile.min[1], tile.max[1]); + bl = clip(left, z2, y + k2, y + k4, 1, intersectY, tile.min[1], tile.max[1]); + } + + if (right) { + tr = clip(right, z2, y - k1, y + k3, 1, intersectY, tile.min[1], tile.max[1]); + br = clip(right, z2, y + k2, y + k4, 1, intersectY, tile.min[1], tile.max[1]); + } + + if (debug > 1) console.timeEnd('clipping'); + + if (features.length) { + stack.push(tl || [], z + 1, x * 2, y * 2); + stack.push(bl || [], z + 1, x * 2, y * 2 + 1); + stack.push(tr || [], z + 1, x * 2 + 1, y * 2); + stack.push(br || [], z + 1, x * 2 + 1, y * 2 + 1); + } + } + + return solid; +}; + +GeoJSONVT.prototype.getTile = function (z, x, y) { + var options = this.options, + extent = options.extent, + debug = options.debug; + + var z2 = 1 << z; + x = ((x % z2) + z2) % z2; // wrap tile x coordinate + + var id = toID(z, x, y); + if (this.tiles[id]) return transform.tile(this.tiles[id], extent); + + if (debug > 1) console.log('drilling down to z%d-%d-%d', z, x, y); + + var z0 = z, + x0 = x, + y0 = y, + parent; + + while (!parent && z0 > 0) { + z0--; + x0 = Math.floor(x0 / 2); + y0 = Math.floor(y0 / 2); + parent = this.tiles[toID(z0, x0, y0)]; + } + + if (!parent || !parent.source) return null; + + // if we found a parent tile containing the original geometry, we can drill down from it + if (debug > 1) console.log('found parent tile z%d-%d-%d', z0, x0, y0); + + // it parent tile is a solid clipped square, return it instead since it's identical + if (isClippedSquare(parent, extent, options.buffer)) return transform.tile(parent, extent); + + if (debug > 1) console.time('drilling down'); + var solid = this.splitTile(parent.source, z0, x0, y0, z, x, y); + if (debug > 1) console.timeEnd('drilling down'); + + // one of the parent tiles was a solid clipped square + if (solid !== null) { + var m = 1 << (z - solid); + id = toID(solid, Math.floor(x / m), Math.floor(y / m)); + } + + return this.tiles[id] ? transform.tile(this.tiles[id], extent) : null; +}; + +function toID(z, x, y) { + return (((1 << z) * y + x) * 32) + z; +} + +function intersectX(a, b, x) { + return [x, (x - a[0]) * (b[1] - a[1]) / (b[0] - a[0]) + a[1], 1]; +} +function intersectY(a, b, y) { + return [(y - a[1]) * (b[0] - a[0]) / (b[1] - a[1]) + a[0], y, 1]; +} + +function extend(dest, src) { + for (var i in src) dest[i] = src[i]; + return dest; +} + +// checks whether a tile is a whole-area fill after clipping; if it is, there's no sense slicing it further +function isClippedSquare(tile, extent, buffer) { + + var features = tile.source; + if (features.length !== 1) return false; + + var feature = features[0]; + if (feature.type !== 3 || feature.geometry.length > 1) return false; + + var len = feature.geometry[0].length; + if (len !== 5) return false; + + for (var i = 0; i < len; i++) { + var p = transform.point(feature.geometry[0][i], extent, tile.z2, tile.x, tile.y); + if ((p[0] !== -buffer && p[0] !== extent + buffer) || + (p[1] !== -buffer && p[1] !== extent + buffer)) return false; + } + + return true; +} + +},{"./clip":142,"./convert":143,"./tile":147,"./transform":148,"./wrap":149}],146:[function(require,module,exports){ +'use strict'; + +module.exports = simplify; + +// calculate simplification data using optimized Douglas-Peucker algorithm + +function simplify(points, tolerance) { + + var sqTolerance = tolerance * tolerance, + len = points.length, + first = 0, + last = len - 1, + stack = [], + i, maxSqDist, sqDist, index; + + // always retain the endpoints (1 is the max value) + points[first][2] = 1; + points[last][2] = 1; + + // avoid recursion by using a stack + while (last) { + + maxSqDist = 0; + + for (i = first + 1; i < last; i++) { + sqDist = getSqSegDist(points[i], points[first], points[last]); + + if (sqDist > maxSqDist) { + index = i; + maxSqDist = sqDist; + } + } + + if (maxSqDist > sqTolerance) { + points[index][2] = maxSqDist; // save the point importance in squared pixels as a z coordinate + stack.push(first); + stack.push(index); + first = index; + + } else { + last = stack.pop(); + first = stack.pop(); + } + } +} + +// square distance from a point to a segment +function getSqSegDist(p, a, b) { + + var x = a[0], y = a[1], + bx = b[0], by = b[1], + px = p[0], py = p[1], + dx = bx - x, + dy = by - y; + + if (dx !== 0 || dy !== 0) { + + var t = ((px - x) * dx + (py - y) * dy) / (dx * dx + dy * dy); + + if (t > 1) { + x = bx; + y = by; + + } else if (t > 0) { + x += dx * t; + y += dy * t; + } + } + + dx = px - x; + dy = py - y; + + return dx * dx + dy * dy; +} + +},{}],147:[function(require,module,exports){ +'use strict'; + +module.exports = createTile; + +function createTile(features, z2, tx, ty, tolerance, noSimplify) { + var tile = { + features: [], + numPoints: 0, + numSimplified: 0, + numFeatures: 0, + source: null, + x: tx, + y: ty, + z2: z2, + transformed: false, + min: [2, 1], + max: [-1, 0] + }; + for (var i = 0; i < features.length; i++) { + tile.numFeatures++; + addFeature(tile, features[i], tolerance, noSimplify); + + var min = features[i].min, + max = features[i].max; + + if (min[0] < tile.min[0]) tile.min[0] = min[0]; + if (min[1] < tile.min[1]) tile.min[1] = min[1]; + if (max[0] > tile.max[0]) tile.max[0] = max[0]; + if (max[1] > tile.max[1]) tile.max[1] = max[1]; + } + return tile; +} + +function addFeature(tile, feature, tolerance, noSimplify) { + + var geom = feature.geometry, + type = feature.type, + simplified = [], + sqTolerance = tolerance * tolerance, + i, j, ring, p; + + if (type === 1) { + for (i = 0; i < geom.length; i++) { + simplified.push(geom[i]); + tile.numPoints++; + tile.numSimplified++; + } + + } else { + + // simplify and transform projected coordinates for tile geometry + for (i = 0; i < geom.length; i++) { + ring = geom[i]; + + // filter out tiny polylines & polygons + if (!noSimplify && ((type === 2 && ring.dist < tolerance) || + (type === 3 && ring.area < sqTolerance))) { + tile.numPoints += ring.length; + continue; + } + + var simplifiedRing = []; + + for (j = 0; j < ring.length; j++) { + p = ring[j]; + // keep points with importance > tolerance + if (noSimplify || p[2] > sqTolerance) { + simplifiedRing.push(p); + tile.numSimplified++; + } + tile.numPoints++; + } + + if (type === 3) rewind(simplifiedRing, ring.outer); + + simplified.push(simplifiedRing); + } + } + + if (simplified.length) { + var tileFeature = { + geometry: simplified, + type: type, + tags: feature.tags || null + }; + if (feature.id !== null) { + tileFeature.id = feature.id; + } + tile.features.push(tileFeature); + } +} + +function rewind(ring, clockwise) { + var area = signedArea(ring); + if (area < 0 === clockwise) ring.reverse(); +} + +function signedArea(ring) { + var sum = 0; + for (var i = 0, len = ring.length, j = len - 1, p1, p2; i < len; j = i++) { + p1 = ring[i]; + p2 = ring[j]; + sum += (p2[0] - p1[0]) * (p1[1] + p2[1]); + } + return sum; +} + +},{}],148:[function(require,module,exports){ +'use strict'; + +exports.tile = transformTile; +exports.point = transformPoint; + +// Transforms the coordinates of each feature in the given tile from +// mercator-projected space into (extent x extent) tile space. +function transformTile(tile, extent) { + if (tile.transformed) return tile; + + var z2 = tile.z2, + tx = tile.x, + ty = tile.y, + i, j, k; + + for (i = 0; i < tile.features.length; i++) { + var feature = tile.features[i], + geom = feature.geometry, + type = feature.type; + + if (type === 1) { + for (j = 0; j < geom.length; j++) geom[j] = transformPoint(geom[j], extent, z2, tx, ty); + + } else { + for (j = 0; j < geom.length; j++) { + var ring = geom[j]; + for (k = 0; k < ring.length; k++) ring[k] = transformPoint(ring[k], extent, z2, tx, ty); + } + } + } + + tile.transformed = true; + + return tile; +} + +function transformPoint(p, extent, z2, tx, ty) { + var x = Math.round(extent * (p[0] * z2 - tx)), + y = Math.round(extent * (p[1] * z2 - ty)); + return [x, y]; +} + +},{}],149:[function(require,module,exports){ +'use strict'; + +var clip = require('./clip'); +var createFeature = require('./feature'); + +module.exports = wrap; + +function wrap(features, buffer, intersectX) { + var merged = features, + left = clip(features, 1, -1 - buffer, buffer, 0, intersectX, -1, 2), // left world copy + right = clip(features, 1, 1 - buffer, 2 + buffer, 0, intersectX, -1, 2); // right world copy + + if (left || right) { + merged = clip(features, 1, -buffer, 1 + buffer, 0, intersectX, -1, 2) || []; // center world copy + + if (left) merged = shiftFeatureCoords(left, 1).concat(merged); // merge left into center + if (right) merged = merged.concat(shiftFeatureCoords(right, -1)); // merge right into center + } + + return merged; +} + +function shiftFeatureCoords(features, offset) { + var newFeatures = []; + + for (var i = 0; i < features.length; i++) { + var feature = features[i], + type = feature.type; + + var newGeometry; + + if (type === 1) { + newGeometry = shiftCoords(feature.geometry, offset); + } else { + newGeometry = []; + for (var j = 0; j < feature.geometry.length; j++) { + newGeometry.push(shiftCoords(feature.geometry[j], offset)); + } + } + + newFeatures.push(createFeature(feature.tags, type, newGeometry, feature.id)); + } + + return newFeatures; +} + +function shiftCoords(points, offset) { + var newPoints = []; + newPoints.area = points.area; + newPoints.dist = points.dist; + + for (var i = 0; i < points.length; i++) { + newPoints.push([points[i][0] + offset, points[i][1], points[i][2]]); + } + return newPoints; +} + +},{"./clip":142,"./feature":144}],150:[function(require,module,exports){ +'use strict'; + +module.exports = GridIndex; + +var NUM_PARAMS = 3; + +function GridIndex(extent, n, padding) { + var cells = this.cells = []; + + if (extent instanceof ArrayBuffer) { + this.arrayBuffer = extent; + var array = new Int32Array(this.arrayBuffer); + extent = array[0]; + n = array[1]; + padding = array[2]; + + this.d = n + 2 * padding; + for (var k = 0; k < this.d * this.d; k++) { + var start = array[NUM_PARAMS + k]; + var end = array[NUM_PARAMS + k + 1]; + cells.push(start === end ? + null : + array.subarray(start, end)); + } + var keysOffset = array[NUM_PARAMS + cells.length]; + var bboxesOffset = array[NUM_PARAMS + cells.length + 1]; + this.keys = array.subarray(keysOffset, bboxesOffset); + this.bboxes = array.subarray(bboxesOffset); + + this.insert = this._insertReadonly; + + } else { + this.d = n + 2 * padding; + for (var i = 0; i < this.d * this.d; i++) { + cells.push([]); + } + this.keys = []; + this.bboxes = []; + } + + this.n = n; + this.extent = extent; + this.padding = padding; + this.scale = n / extent; + this.uid = 0; + + var p = (padding / n) * extent; + this.min = -p; + this.max = extent + p; +} + + +GridIndex.prototype.insert = function(key, x1, y1, x2, y2) { + this._forEachCell(x1, y1, x2, y2, this._insertCell, this.uid++); + this.keys.push(key); + this.bboxes.push(x1); + this.bboxes.push(y1); + this.bboxes.push(x2); + this.bboxes.push(y2); +}; + +GridIndex.prototype._insertReadonly = function() { + throw 'Cannot insert into a GridIndex created from an ArrayBuffer.'; +}; + +GridIndex.prototype._insertCell = function(x1, y1, x2, y2, cellIndex, uid) { + this.cells[cellIndex].push(uid); +}; + +GridIndex.prototype.query = function(x1, y1, x2, y2) { + var min = this.min; + var max = this.max; + if (x1 <= min && y1 <= min && max <= x2 && max <= y2) { + // We use `Array#slice` because `this.keys` may be a `Int32Array` and + // some browsers (Safari and IE) do not support `TypedArray#slice` + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/slice#Browser_compatibility + return Array.prototype.slice.call(this.keys); + + } else { + var result = []; + var seenUids = {}; + this._forEachCell(x1, y1, x2, y2, this._queryCell, result, seenUids); + return result; + } +}; + +GridIndex.prototype._queryCell = function(x1, y1, x2, y2, cellIndex, result, seenUids) { + var cell = this.cells[cellIndex]; + if (cell !== null) { + var keys = this.keys; + var bboxes = this.bboxes; + for (var u = 0; u < cell.length; u++) { + var uid = cell[u]; + if (seenUids[uid] === undefined) { + var offset = uid * 4; + if ((x1 <= bboxes[offset + 2]) && + (y1 <= bboxes[offset + 3]) && + (x2 >= bboxes[offset + 0]) && + (y2 >= bboxes[offset + 1])) { + seenUids[uid] = true; + result.push(keys[uid]); + } else { + seenUids[uid] = false; + } + } + } + } +}; + +GridIndex.prototype._forEachCell = function(x1, y1, x2, y2, fn, arg1, arg2) { + var cx1 = this._convertToCellCoord(x1); + var cy1 = this._convertToCellCoord(y1); + var cx2 = this._convertToCellCoord(x2); + var cy2 = this._convertToCellCoord(y2); + for (var x = cx1; x <= cx2; x++) { + for (var y = cy1; y <= cy2; y++) { + var cellIndex = this.d * y + x; + if (fn.call(this, x1, y1, x2, y2, cellIndex, arg1, arg2)) return; + } + } +}; + +GridIndex.prototype._convertToCellCoord = function(x) { + return Math.max(0, Math.min(this.d - 1, Math.floor(x * this.scale) + this.padding)); +}; + +GridIndex.prototype.toArrayBuffer = function() { + if (this.arrayBuffer) return this.arrayBuffer; + + var cells = this.cells; + + var metadataLength = NUM_PARAMS + this.cells.length + 1 + 1; + var totalCellLength = 0; + for (var i = 0; i < this.cells.length; i++) { + totalCellLength += this.cells[i].length; + } + + var array = new Int32Array(metadataLength + totalCellLength + this.keys.length + this.bboxes.length); + array[0] = this.extent; + array[1] = this.n; + array[2] = this.padding; + + var offset = metadataLength; + for (var k = 0; k < cells.length; k++) { + var cell = cells[k]; + array[NUM_PARAMS + k] = offset; + array.set(cell, offset); + offset += cell.length; + } + + array[NUM_PARAMS + cells.length] = offset; + array.set(this.keys, offset); + offset += this.keys.length; + + array[NUM_PARAMS + cells.length + 1] = offset; + array.set(this.bboxes, offset); + offset += this.bboxes.length; + + return array.buffer; +}; + +},{}],151:[function(require,module,exports){ +exports.read = function (buffer, offset, isLE, mLen, nBytes) { + var e, m + var eLen = nBytes * 8 - mLen - 1 + var eMax = (1 << eLen) - 1 + var eBias = eMax >> 1 + var nBits = -7 + var i = isLE ? (nBytes - 1) : 0 + var d = isLE ? -1 : 1 + var s = buffer[offset + i] + + i += d + + e = s & ((1 << (-nBits)) - 1) + s >>= (-nBits) + nBits += eLen + for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {} + + m = e & ((1 << (-nBits)) - 1) + e >>= (-nBits) + nBits += mLen + for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {} + + if (e === 0) { + e = 1 - eBias + } else if (e === eMax) { + return m ? NaN : ((s ? -1 : 1) * Infinity) + } else { + m = m + Math.pow(2, mLen) + e = e - eBias + } + return (s ? -1 : 1) * m * Math.pow(2, e - mLen) +} + +exports.write = function (buffer, value, offset, isLE, mLen, nBytes) { + var e, m, c + var eLen = nBytes * 8 - mLen - 1 + var eMax = (1 << eLen) - 1 + var eBias = eMax >> 1 + var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0) + var i = isLE ? 0 : (nBytes - 1) + var d = isLE ? 1 : -1 + var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0 + + value = Math.abs(value) + + if (isNaN(value) || value === Infinity) { + m = isNaN(value) ? 1 : 0 + e = eMax + } else { + e = Math.floor(Math.log(value) / Math.LN2) + if (value * (c = Math.pow(2, -e)) < 1) { + e-- + c *= 2 + } + if (e + eBias >= 1) { + value += rt / c + } else { + value += rt * Math.pow(2, 1 - eBias) + } + if (value * c >= 2) { + e++ + c /= 2 + } + + if (e + eBias >= eMax) { + m = 0 + e = eMax + } else if (e + eBias >= 1) { + m = (value * c - 1) * Math.pow(2, mLen) + e = e + eBias + } else { + m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen) + e = 0 + } + } + + for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} + + e = (e << mLen) | m + eLen += mLen + for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} + + buffer[offset + i - d] |= s * 128 +} + +},{}],152:[function(require,module,exports){ +'use strict'; + +var sort = require('./sort'); +var range = require('./range'); +var within = require('./within'); + +module.exports = kdbush; + +function kdbush(points, getX, getY, nodeSize, ArrayType) { + return new KDBush(points, getX, getY, nodeSize, ArrayType); +} + +function KDBush(points, getX, getY, nodeSize, ArrayType) { + getX = getX || defaultGetX; + getY = getY || defaultGetY; + ArrayType = ArrayType || Array; + + this.nodeSize = nodeSize || 64; + this.points = points; + + this.ids = new ArrayType(points.length); + this.coords = new ArrayType(points.length * 2); + + for (var i = 0; i < points.length; i++) { + this.ids[i] = i; + this.coords[2 * i] = getX(points[i]); + this.coords[2 * i + 1] = getY(points[i]); + } + + sort(this.ids, this.coords, this.nodeSize, 0, this.ids.length - 1, 0); +} + +KDBush.prototype = { + range: function (minX, minY, maxX, maxY) { + return range(this.ids, this.coords, minX, minY, maxX, maxY, this.nodeSize); + }, + + within: function (x, y, r) { + return within(this.ids, this.coords, x, y, r, this.nodeSize); + } +}; + +function defaultGetX(p) { return p[0]; } +function defaultGetY(p) { return p[1]; } + +},{"./range":153,"./sort":154,"./within":155}],153:[function(require,module,exports){ +'use strict'; + +module.exports = range; + +function range(ids, coords, minX, minY, maxX, maxY, nodeSize) { + var stack = [0, ids.length - 1, 0]; + var result = []; + var x, y; + + while (stack.length) { + var axis = stack.pop(); + var right = stack.pop(); + var left = stack.pop(); + + if (right - left <= nodeSize) { + for (var i = left; i <= right; i++) { + x = coords[2 * i]; + y = coords[2 * i + 1]; + if (x >= minX && x <= maxX && y >= minY && y <= maxY) result.push(ids[i]); + } + continue; + } + + var m = Math.floor((left + right) / 2); + + x = coords[2 * m]; + y = coords[2 * m + 1]; + + if (x >= minX && x <= maxX && y >= minY && y <= maxY) result.push(ids[m]); + + var nextAxis = (axis + 1) % 2; + + if (axis === 0 ? minX <= x : minY <= y) { + stack.push(left); + stack.push(m - 1); + stack.push(nextAxis); + } + if (axis === 0 ? maxX >= x : maxY >= y) { + stack.push(m + 1); + stack.push(right); + stack.push(nextAxis); + } + } + + return result; +} + +},{}],154:[function(require,module,exports){ +'use strict'; + +module.exports = sortKD; + +function sortKD(ids, coords, nodeSize, left, right, depth) { + if (right - left <= nodeSize) return; + + var m = Math.floor((left + right) / 2); + + select(ids, coords, m, left, right, depth % 2); + + sortKD(ids, coords, nodeSize, left, m - 1, depth + 1); + sortKD(ids, coords, nodeSize, m + 1, right, depth + 1); +} + +function select(ids, coords, k, left, right, inc) { + + while (right > left) { + if (right - left > 600) { + var n = right - left + 1; + var m = k - left + 1; + var z = Math.log(n); + var s = 0.5 * Math.exp(2 * z / 3); + var sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1); + var newLeft = Math.max(left, Math.floor(k - m * s / n + sd)); + var newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd)); + select(ids, coords, k, newLeft, newRight, inc); + } + + var t = coords[2 * k + inc]; + var i = left; + var j = right; + + swapItem(ids, coords, left, k); + if (coords[2 * right + inc] > t) swapItem(ids, coords, left, right); + + while (i < j) { + swapItem(ids, coords, i, j); + i++; + j--; + while (coords[2 * i + inc] < t) i++; + while (coords[2 * j + inc] > t) j--; + } + + if (coords[2 * left + inc] === t) swapItem(ids, coords, left, j); + else { + j++; + swapItem(ids, coords, j, right); + } + + if (j <= k) left = j + 1; + if (k <= j) right = j - 1; + } +} + +function swapItem(ids, coords, i, j) { + swap(ids, i, j); + swap(coords, 2 * i, 2 * j); + swap(coords, 2 * i + 1, 2 * j + 1); +} + +function swap(arr, i, j) { + var tmp = arr[i]; + arr[i] = arr[j]; + arr[j] = tmp; +} + +},{}],155:[function(require,module,exports){ +'use strict'; + +module.exports = within; + +function within(ids, coords, qx, qy, r, nodeSize) { + var stack = [0, ids.length - 1, 0]; + var result = []; + var r2 = r * r; + + while (stack.length) { + var axis = stack.pop(); + var right = stack.pop(); + var left = stack.pop(); + + if (right - left <= nodeSize) { + for (var i = left; i <= right; i++) { + if (sqDist(coords[2 * i], coords[2 * i + 1], qx, qy) <= r2) result.push(ids[i]); + } + continue; + } + + var m = Math.floor((left + right) / 2); + + var x = coords[2 * m]; + var y = coords[2 * m + 1]; + + if (sqDist(x, y, qx, qy) <= r2) result.push(ids[m]); + + var nextAxis = (axis + 1) % 2; + + if (axis === 0 ? qx - r <= x : qy - r <= y) { + stack.push(left); + stack.push(m - 1); + stack.push(nextAxis); + } + if (axis === 0 ? qx + r >= x : qy + r >= y) { + stack.push(m + 1); + stack.push(right); + stack.push(nextAxis); + } + } + + return result; +} + +function sqDist(ax, ay, bx, by) { + var dx = ax - bx; + var dy = ay - by; + return dx * dx + dy * dy; +} + +},{}],156:[function(require,module,exports){ +/** + * lodash 3.0.7 (Custom Build) + * Build: `lodash modern modularize exports="npm" -o ./` + * Copyright 2012-2015 The Dojo Foundation + * Based on Underscore.js 1.8.3 + * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + * Available under MIT license + */ +var isArray = require('lodash.isarray'), + isTypedArray = require('lodash.istypedarray'), + keys = require('lodash.keys'); + +/** `Object#toString` result references. */ +var argsTag = '[object Arguments]', + arrayTag = '[object Array]', + boolTag = '[object Boolean]', + dateTag = '[object Date]', + errorTag = '[object Error]', + numberTag = '[object Number]', + objectTag = '[object Object]', + regexpTag = '[object RegExp]', + stringTag = '[object String]'; + +/** + * Checks if `value` is object-like. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is object-like, else `false`. + */ +function isObjectLike(value) { + return !!value && typeof value == 'object'; +} + +/** Used for native method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * Used to resolve the [`toStringTag`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.prototype.tostring) + * of values. + */ +var objToString = objectProto.toString; + +/** + * A specialized version of `_.some` for arrays without support for callback + * shorthands and `this` binding. + * + * @private + * @param {Array} array The array to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {boolean} Returns `true` if any element passes the predicate check, + * else `false`. + */ +function arraySome(array, predicate) { + var index = -1, + length = array.length; + + while (++index < length) { + if (predicate(array[index], index, array)) { + return true; + } + } + return false; +} + +/** + * The base implementation of `_.isEqual` without support for `this` binding + * `customizer` functions. + * + * @private + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @param {Function} [customizer] The function to customize comparing values. + * @param {boolean} [isLoose] Specify performing partial comparisons. + * @param {Array} [stackA] Tracks traversed `value` objects. + * @param {Array} [stackB] Tracks traversed `other` objects. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + */ +function baseIsEqual(value, other, customizer, isLoose, stackA, stackB) { + if (value === other) { + return true; + } + if (value == null || other == null || (!isObject(value) && !isObjectLike(other))) { + return value !== value && other !== other; + } + return baseIsEqualDeep(value, other, baseIsEqual, customizer, isLoose, stackA, stackB); +} + +/** + * A specialized version of `baseIsEqual` for arrays and objects which performs + * deep comparisons and tracks traversed objects enabling objects with circular + * references to be compared. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Function} [customizer] The function to customize comparing objects. + * @param {boolean} [isLoose] Specify performing partial comparisons. + * @param {Array} [stackA=[]] Tracks traversed `value` objects. + * @param {Array} [stackB=[]] Tracks traversed `other` objects. + * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. + */ +function baseIsEqualDeep(object, other, equalFunc, customizer, isLoose, stackA, stackB) { + var objIsArr = isArray(object), + othIsArr = isArray(other), + objTag = arrayTag, + othTag = arrayTag; + + if (!objIsArr) { + objTag = objToString.call(object); + if (objTag == argsTag) { + objTag = objectTag; + } else if (objTag != objectTag) { + objIsArr = isTypedArray(object); + } + } + if (!othIsArr) { + othTag = objToString.call(other); + if (othTag == argsTag) { + othTag = objectTag; + } else if (othTag != objectTag) { + othIsArr = isTypedArray(other); + } + } + var objIsObj = objTag == objectTag, + othIsObj = othTag == objectTag, + isSameTag = objTag == othTag; + + if (isSameTag && !(objIsArr || objIsObj)) { + return equalByTag(object, other, objTag); + } + if (!isLoose) { + var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'), + othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__'); + + if (objIsWrapped || othIsWrapped) { + return equalFunc(objIsWrapped ? object.value() : object, othIsWrapped ? other.value() : other, customizer, isLoose, stackA, stackB); + } + } + if (!isSameTag) { + return false; + } + // Assume cyclic values are equal. + // For more information on detecting circular references see https://es5.github.io/#JO. + stackA || (stackA = []); + stackB || (stackB = []); + + var length = stackA.length; + while (length--) { + if (stackA[length] == object) { + return stackB[length] == other; + } + } + // Add `object` and `other` to the stack of traversed objects. + stackA.push(object); + stackB.push(other); + + var result = (objIsArr ? equalArrays : equalObjects)(object, other, equalFunc, customizer, isLoose, stackA, stackB); + + stackA.pop(); + stackB.pop(); + + return result; +} + +/** + * A specialized version of `baseIsEqualDeep` for arrays with support for + * partial deep comparisons. + * + * @private + * @param {Array} array The array to compare. + * @param {Array} other The other array to compare. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Function} [customizer] The function to customize comparing arrays. + * @param {boolean} [isLoose] Specify performing partial comparisons. + * @param {Array} [stackA] Tracks traversed `value` objects. + * @param {Array} [stackB] Tracks traversed `other` objects. + * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`. + */ +function equalArrays(array, other, equalFunc, customizer, isLoose, stackA, stackB) { + var index = -1, + arrLength = array.length, + othLength = other.length; + + if (arrLength != othLength && !(isLoose && othLength > arrLength)) { + return false; + } + // Ignore non-index properties. + while (++index < arrLength) { + var arrValue = array[index], + othValue = other[index], + result = customizer ? customizer(isLoose ? othValue : arrValue, isLoose ? arrValue : othValue, index) : undefined; + + if (result !== undefined) { + if (result) { + continue; + } + return false; + } + // Recursively compare arrays (susceptible to call stack limits). + if (isLoose) { + if (!arraySome(other, function(othValue) { + return arrValue === othValue || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB); + })) { + return false; + } + } else if (!(arrValue === othValue || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB))) { + return false; + } + } + return true; +} + +/** + * A specialized version of `baseIsEqualDeep` for comparing objects of + * the same `toStringTag`. + * + * **Note:** This function only supports comparing values with tags of + * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`. + * + * @private + * @param {Object} value The object to compare. + * @param {Object} other The other object to compare. + * @param {string} tag The `toStringTag` of the objects to compare. + * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. + */ +function equalByTag(object, other, tag) { + switch (tag) { + case boolTag: + case dateTag: + // Coerce dates and booleans to numbers, dates to milliseconds and booleans + // to `1` or `0` treating invalid dates coerced to `NaN` as not equal. + return +object == +other; + + case errorTag: + return object.name == other.name && object.message == other.message; + + case numberTag: + // Treat `NaN` vs. `NaN` as equal. + return (object != +object) + ? other != +other + : object == +other; + + case regexpTag: + case stringTag: + // Coerce regexes to strings and treat strings primitives and string + // objects as equal. See https://es5.github.io/#x15.10.6.4 for more details. + return object == (other + ''); + } + return false; +} + +/** + * A specialized version of `baseIsEqualDeep` for objects with support for + * partial deep comparisons. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Function} [customizer] The function to customize comparing values. + * @param {boolean} [isLoose] Specify performing partial comparisons. + * @param {Array} [stackA] Tracks traversed `value` objects. + * @param {Array} [stackB] Tracks traversed `other` objects. + * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. + */ +function equalObjects(object, other, equalFunc, customizer, isLoose, stackA, stackB) { + var objProps = keys(object), + objLength = objProps.length, + othProps = keys(other), + othLength = othProps.length; + + if (objLength != othLength && !isLoose) { + return false; + } + var index = objLength; + while (index--) { + var key = objProps[index]; + if (!(isLoose ? key in other : hasOwnProperty.call(other, key))) { + return false; + } + } + var skipCtor = isLoose; + while (++index < objLength) { + key = objProps[index]; + var objValue = object[key], + othValue = other[key], + result = customizer ? customizer(isLoose ? othValue : objValue, isLoose? objValue : othValue, key) : undefined; + + // Recursively compare objects (susceptible to call stack limits). + if (!(result === undefined ? equalFunc(objValue, othValue, customizer, isLoose, stackA, stackB) : result)) { + return false; + } + skipCtor || (skipCtor = key == 'constructor'); + } + if (!skipCtor) { + var objCtor = object.constructor, + othCtor = other.constructor; + + // Non `Object` object instances with different constructors are not equal. + if (objCtor != othCtor && + ('constructor' in object && 'constructor' in other) && + !(typeof objCtor == 'function' && objCtor instanceof objCtor && + typeof othCtor == 'function' && othCtor instanceof othCtor)) { + return false; + } + } + return true; +} + +/** + * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`. + * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an object, else `false`. + * @example + * + * _.isObject({}); + * // => true + * + * _.isObject([1, 2, 3]); + * // => true + * + * _.isObject(1); + * // => false + */ +function isObject(value) { + // Avoid a V8 JIT bug in Chrome 19-20. + // See https://code.google.com/p/v8/issues/detail?id=2291 for more details. + var type = typeof value; + return !!value && (type == 'object' || type == 'function'); +} + +module.exports = baseIsEqual; + +},{"lodash.isarray":160,"lodash.istypedarray":161,"lodash.keys":162}],157:[function(require,module,exports){ +/** + * lodash 3.0.1 (Custom Build) + * Build: `lodash modern modularize exports="npm" -o ./` + * Copyright 2012-2015 The Dojo Foundation + * Based on Underscore.js 1.8.3 + * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + * Available under MIT license + */ + +/** + * A specialized version of `baseCallback` which only supports `this` binding + * and specifying the number of arguments to provide to `func`. + * + * @private + * @param {Function} func The function to bind. + * @param {*} thisArg The `this` binding of `func`. + * @param {number} [argCount] The number of arguments to provide to `func`. + * @returns {Function} Returns the callback. + */ +function bindCallback(func, thisArg, argCount) { + if (typeof func != 'function') { + return identity; + } + if (thisArg === undefined) { + return func; + } + switch (argCount) { + case 1: return function(value) { + return func.call(thisArg, value); + }; + case 3: return function(value, index, collection) { + return func.call(thisArg, value, index, collection); + }; + case 4: return function(accumulator, value, index, collection) { + return func.call(thisArg, accumulator, value, index, collection); + }; + case 5: return function(value, other, key, object, source) { + return func.call(thisArg, value, other, key, object, source); + }; + } + return function() { + return func.apply(thisArg, arguments); + }; +} + +/** + * This method returns the first argument provided to it. + * + * @static + * @memberOf _ + * @category Utility + * @param {*} value Any value. + * @returns {*} Returns `value`. + * @example + * + * var object = { 'user': 'fred' }; + * + * _.identity(object) === object; + * // => true + */ +function identity(value) { + return value; +} + +module.exports = bindCallback; + +},{}],158:[function(require,module,exports){ +/** + * lodash 3.9.1 (Custom Build) + * Build: `lodash modern modularize exports="npm" -o ./` + * Copyright 2012-2015 The Dojo Foundation + * Based on Underscore.js 1.8.3 + * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + * Available under MIT license + */ + +/** `Object#toString` result references. */ +var funcTag = '[object Function]'; + +/** Used to detect host constructors (Safari > 5). */ +var reIsHostCtor = /^\[object .+?Constructor\]$/; + +/** + * Checks if `value` is object-like. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is object-like, else `false`. + */ +function isObjectLike(value) { + return !!value && typeof value == 'object'; +} + +/** Used for native method references. */ +var objectProto = Object.prototype; + +/** Used to resolve the decompiled source of functions. */ +var fnToString = Function.prototype.toString; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring) + * of values. + */ +var objToString = objectProto.toString; + +/** Used to detect if a method is native. */ +var reIsNative = RegExp('^' + + fnToString.call(hasOwnProperty).replace(/[\\^$.*+?()[\]{}|]/g, '\\$&') + .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' +); + +/** + * Gets the native function at `key` of `object`. + * + * @private + * @param {Object} object The object to query. + * @param {string} key The key of the method to get. + * @returns {*} Returns the function if it's native, else `undefined`. + */ +function getNative(object, key) { + var value = object == null ? undefined : object[key]; + return isNative(value) ? value : undefined; +} + +/** + * Checks if `value` is classified as a `Function` object. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. + * @example + * + * _.isFunction(_); + * // => true + * + * _.isFunction(/abc/); + * // => false + */ +function isFunction(value) { + // The use of `Object#toString` avoids issues with the `typeof` operator + // in older versions of Chrome and Safari which return 'function' for regexes + // and Safari 8 equivalents which return 'object' for typed array constructors. + return isObject(value) && objToString.call(value) == funcTag; +} + +/** + * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`. + * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an object, else `false`. + * @example + * + * _.isObject({}); + * // => true + * + * _.isObject([1, 2, 3]); + * // => true + * + * _.isObject(1); + * // => false + */ +function isObject(value) { + // Avoid a V8 JIT bug in Chrome 19-20. + // See https://code.google.com/p/v8/issues/detail?id=2291 for more details. + var type = typeof value; + return !!value && (type == 'object' || type == 'function'); +} + +/** + * Checks if `value` is a native function. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a native function, else `false`. + * @example + * + * _.isNative(Array.prototype.push); + * // => true + * + * _.isNative(_); + * // => false + */ +function isNative(value) { + if (value == null) { + return false; + } + if (isFunction(value)) { + return reIsNative.test(fnToString.call(value)); + } + return isObjectLike(value) && reIsHostCtor.test(value); +} + +module.exports = getNative; + +},{}],159:[function(require,module,exports){ +/** + * lodash (Custom Build) + * Build: `lodash modularize exports="npm" -o ./` + * Copyright jQuery Foundation and other contributors + * Released under MIT license + * Based on Underscore.js 1.8.3 + * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + */ + +/** Used as references for various `Number` constants. */ +var MAX_SAFE_INTEGER = 9007199254740991; + +/** `Object#toString` result references. */ +var argsTag = '[object Arguments]', + funcTag = '[object Function]', + genTag = '[object GeneratorFunction]'; + +/** Used for built-in method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * Used to resolve the + * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) + * of values. + */ +var objectToString = objectProto.toString; + +/** Built-in value references. */ +var propertyIsEnumerable = objectProto.propertyIsEnumerable; + +/** + * Checks if `value` is likely an `arguments` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an `arguments` object, + * else `false`. + * @example + * + * _.isArguments(function() { return arguments; }()); + * // => true + * + * _.isArguments([1, 2, 3]); + * // => false + */ +function isArguments(value) { + // Safari 8.1 makes `arguments.callee` enumerable in strict mode. + return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') && + (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag); +} + +/** + * Checks if `value` is array-like. A value is considered array-like if it's + * not a function and has a `value.length` that's an integer greater than or + * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is array-like, else `false`. + * @example + * + * _.isArrayLike([1, 2, 3]); + * // => true + * + * _.isArrayLike(document.body.children); + * // => true + * + * _.isArrayLike('abc'); + * // => true + * + * _.isArrayLike(_.noop); + * // => false + */ +function isArrayLike(value) { + return value != null && isLength(value.length) && !isFunction(value); +} + +/** + * This method is like `_.isArrayLike` except that it also checks if `value` + * is an object. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array-like object, + * else `false`. + * @example + * + * _.isArrayLikeObject([1, 2, 3]); + * // => true + * + * _.isArrayLikeObject(document.body.children); + * // => true + * + * _.isArrayLikeObject('abc'); + * // => false + * + * _.isArrayLikeObject(_.noop); + * // => false + */ +function isArrayLikeObject(value) { + return isObjectLike(value) && isArrayLike(value); +} + +/** + * Checks if `value` is classified as a `Function` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a function, else `false`. + * @example + * + * _.isFunction(_); + * // => true + * + * _.isFunction(/abc/); + * // => false + */ +function isFunction(value) { + // The use of `Object#toString` avoids issues with the `typeof` operator + // in Safari 8-9 which returns 'object' for typed array and other constructors. + var tag = isObject(value) ? objectToString.call(value) : ''; + return tag == funcTag || tag == genTag; +} + +/** + * Checks if `value` is a valid array-like length. + * + * **Note:** This method is loosely based on + * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. + * @example + * + * _.isLength(3); + * // => true + * + * _.isLength(Number.MIN_VALUE); + * // => false + * + * _.isLength(Infinity); + * // => false + * + * _.isLength('3'); + * // => false + */ +function isLength(value) { + return typeof value == 'number' && + value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; +} + +/** + * Checks if `value` is the + * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) + * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an object, else `false`. + * @example + * + * _.isObject({}); + * // => true + * + * _.isObject([1, 2, 3]); + * // => true + * + * _.isObject(_.noop); + * // => true + * + * _.isObject(null); + * // => false + */ +function isObject(value) { + var type = typeof value; + return !!value && (type == 'object' || type == 'function'); +} + +/** + * Checks if `value` is object-like. A value is object-like if it's not `null` + * and has a `typeof` result of "object". + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is object-like, else `false`. + * @example + * + * _.isObjectLike({}); + * // => true + * + * _.isObjectLike([1, 2, 3]); + * // => true + * + * _.isObjectLike(_.noop); + * // => false + * + * _.isObjectLike(null); + * // => false + */ +function isObjectLike(value) { + return !!value && typeof value == 'object'; +} + +module.exports = isArguments; + +},{}],160:[function(require,module,exports){ +/** + * lodash 3.0.4 (Custom Build) + * Build: `lodash modern modularize exports="npm" -o ./` + * Copyright 2012-2015 The Dojo Foundation + * Based on Underscore.js 1.8.3 + * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + * Available under MIT license + */ + +/** `Object#toString` result references. */ +var arrayTag = '[object Array]', + funcTag = '[object Function]'; + +/** Used to detect host constructors (Safari > 5). */ +var reIsHostCtor = /^\[object .+?Constructor\]$/; + +/** + * Checks if `value` is object-like. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is object-like, else `false`. + */ +function isObjectLike(value) { + return !!value && typeof value == 'object'; +} + +/** Used for native method references. */ +var objectProto = Object.prototype; + +/** Used to resolve the decompiled source of functions. */ +var fnToString = Function.prototype.toString; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring) + * of values. + */ +var objToString = objectProto.toString; + +/** Used to detect if a method is native. */ +var reIsNative = RegExp('^' + + fnToString.call(hasOwnProperty).replace(/[\\^$.*+?()[\]{}|]/g, '\\$&') + .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' +); + +/* Native method references for those with the same name as other `lodash` methods. */ +var nativeIsArray = getNative(Array, 'isArray'); + +/** + * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer) + * of an array-like value. + */ +var MAX_SAFE_INTEGER = 9007199254740991; + +/** + * Gets the native function at `key` of `object`. + * + * @private + * @param {Object} object The object to query. + * @param {string} key The key of the method to get. + * @returns {*} Returns the function if it's native, else `undefined`. + */ +function getNative(object, key) { + var value = object == null ? undefined : object[key]; + return isNative(value) ? value : undefined; +} + +/** + * Checks if `value` is a valid array-like length. + * + * **Note:** This function is based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength). + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. + */ +function isLength(value) { + return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; +} + +/** + * Checks if `value` is classified as an `Array` object. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. + * @example + * + * _.isArray([1, 2, 3]); + * // => true + * + * _.isArray(function() { return arguments; }()); + * // => false + */ +var isArray = nativeIsArray || function(value) { + return isObjectLike(value) && isLength(value.length) && objToString.call(value) == arrayTag; +}; + +/** + * Checks if `value` is classified as a `Function` object. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. + * @example + * + * _.isFunction(_); + * // => true + * + * _.isFunction(/abc/); + * // => false + */ +function isFunction(value) { + // The use of `Object#toString` avoids issues with the `typeof` operator + // in older versions of Chrome and Safari which return 'function' for regexes + // and Safari 8 equivalents which return 'object' for typed array constructors. + return isObject(value) && objToString.call(value) == funcTag; +} + +/** + * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`. + * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an object, else `false`. + * @example + * + * _.isObject({}); + * // => true + * + * _.isObject([1, 2, 3]); + * // => true + * + * _.isObject(1); + * // => false + */ +function isObject(value) { + // Avoid a V8 JIT bug in Chrome 19-20. + // See https://code.google.com/p/v8/issues/detail?id=2291 for more details. + var type = typeof value; + return !!value && (type == 'object' || type == 'function'); +} + +/** + * Checks if `value` is a native function. + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a native function, else `false`. + * @example + * + * _.isNative(Array.prototype.push); + * // => true + * + * _.isNative(_); + * // => false + */ +function isNative(value) { + if (value == null) { + return false; + } + if (isFunction(value)) { + return reIsNative.test(fnToString.call(value)); + } + return isObjectLike(value) && reIsHostCtor.test(value); +} + +module.exports = isArray; + +},{}],161:[function(require,module,exports){ +/** + * lodash 3.0.6 (Custom Build) + * Build: `lodash modularize exports="npm" -o ./` + * Copyright jQuery Foundation and other contributors + * Released under MIT license + * Based on Underscore.js 1.8.3 + * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + */ + +/** Used as references for various `Number` constants. */ +var MAX_SAFE_INTEGER = 9007199254740991; + +/** `Object#toString` result references. */ +var argsTag = '[object Arguments]', + arrayTag = '[object Array]', + boolTag = '[object Boolean]', + dateTag = '[object Date]', + errorTag = '[object Error]', + funcTag = '[object Function]', + mapTag = '[object Map]', + numberTag = '[object Number]', + objectTag = '[object Object]', + regexpTag = '[object RegExp]', + setTag = '[object Set]', + stringTag = '[object String]', + weakMapTag = '[object WeakMap]'; + +var arrayBufferTag = '[object ArrayBuffer]', + dataViewTag = '[object DataView]', + float32Tag = '[object Float32Array]', + float64Tag = '[object Float64Array]', + int8Tag = '[object Int8Array]', + int16Tag = '[object Int16Array]', + int32Tag = '[object Int32Array]', + uint8Tag = '[object Uint8Array]', + uint8ClampedTag = '[object Uint8ClampedArray]', + uint16Tag = '[object Uint16Array]', + uint32Tag = '[object Uint32Array]'; + +/** Used to identify `toStringTag` values of typed arrays. */ +var typedArrayTags = {}; +typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = +typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = +typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = +typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = +typedArrayTags[uint32Tag] = true; +typedArrayTags[argsTag] = typedArrayTags[arrayTag] = +typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = +typedArrayTags[dataViewTag] = typedArrayTags[dateTag] = +typedArrayTags[errorTag] = typedArrayTags[funcTag] = +typedArrayTags[mapTag] = typedArrayTags[numberTag] = +typedArrayTags[objectTag] = typedArrayTags[regexpTag] = +typedArrayTags[setTag] = typedArrayTags[stringTag] = +typedArrayTags[weakMapTag] = false; + +/** Used for built-in method references. */ +var objectProto = Object.prototype; + +/** + * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring) + * of values. + */ +var objectToString = objectProto.toString; + +/** + * Checks if `value` is a valid array-like length. + * + * **Note:** This function is loosely based on + * [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a valid length, + * else `false`. + * @example + * + * _.isLength(3); + * // => true + * + * _.isLength(Number.MIN_VALUE); + * // => false + * + * _.isLength(Infinity); + * // => false + * + * _.isLength('3'); + * // => false + */ +function isLength(value) { + return typeof value == 'number' && + value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; +} + +/** + * Checks if `value` is object-like. A value is object-like if it's not `null` + * and has a `typeof` result of "object". + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is object-like, else `false`. + * @example + * + * _.isObjectLike({}); + * // => true + * + * _.isObjectLike([1, 2, 3]); + * // => true + * + * _.isObjectLike(_.noop); + * // => false + * + * _.isObjectLike(null); + * // => false + */ +function isObjectLike(value) { + return !!value && typeof value == 'object'; +} + +/** + * Checks if `value` is classified as a typed array. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is correctly classified, + * else `false`. + * @example + * + * _.isTypedArray(new Uint8Array); + * // => true + * + * _.isTypedArray([]); + * // => false + */ +function isTypedArray(value) { + return isObjectLike(value) && + isLength(value.length) && !!typedArrayTags[objectToString.call(value)]; +} + +module.exports = isTypedArray; + +},{}],162:[function(require,module,exports){ +/** + * lodash 3.1.2 (Custom Build) + * Build: `lodash modern modularize exports="npm" -o ./` + * Copyright 2012-2015 The Dojo Foundation + * Based on Underscore.js 1.8.3 + * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + * Available under MIT license + */ +var getNative = require('lodash._getnative'), + isArguments = require('lodash.isarguments'), + isArray = require('lodash.isarray'); + +/** Used to detect unsigned integer values. */ +var reIsUint = /^\d+$/; + +/** Used for native method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/* Native method references for those with the same name as other `lodash` methods. */ +var nativeKeys = getNative(Object, 'keys'); + +/** + * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer) + * of an array-like value. + */ +var MAX_SAFE_INTEGER = 9007199254740991; + +/** + * The base implementation of `_.property` without support for deep paths. + * + * @private + * @param {string} key The key of the property to get. + * @returns {Function} Returns the new function. + */ +function baseProperty(key) { + return function(object) { + return object == null ? undefined : object[key]; + }; +} + +/** + * Gets the "length" property value of `object`. + * + * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792) + * that affects Safari on at least iOS 8.1-8.3 ARM64. + * + * @private + * @param {Object} object The object to query. + * @returns {*} Returns the "length" value. + */ +var getLength = baseProperty('length'); + +/** + * Checks if `value` is array-like. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is array-like, else `false`. + */ +function isArrayLike(value) { + return value != null && isLength(getLength(value)); +} + +/** + * Checks if `value` is a valid array-like index. + * + * @private + * @param {*} value The value to check. + * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. + * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. + */ +function isIndex(value, length) { + value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1; + length = length == null ? MAX_SAFE_INTEGER : length; + return value > -1 && value % 1 == 0 && value < length; +} + +/** + * Checks if `value` is a valid array-like length. + * + * **Note:** This function is based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength). + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. + */ +function isLength(value) { + return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; +} + +/** + * A fallback implementation of `Object.keys` which creates an array of the + * own enumerable property names of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + */ +function shimKeys(object) { + var props = keysIn(object), + propsLength = props.length, + length = propsLength && object.length; + + var allowIndexes = !!length && isLength(length) && + (isArray(object) || isArguments(object)); + + var index = -1, + result = []; + + while (++index < propsLength) { + var key = props[index]; + if ((allowIndexes && isIndex(key, length)) || hasOwnProperty.call(object, key)) { + result.push(key); + } + } + return result; +} + +/** + * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`. + * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) + * + * @static + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an object, else `false`. + * @example + * + * _.isObject({}); + * // => true + * + * _.isObject([1, 2, 3]); + * // => true + * + * _.isObject(1); + * // => false + */ +function isObject(value) { + // Avoid a V8 JIT bug in Chrome 19-20. + // See https://code.google.com/p/v8/issues/detail?id=2291 for more details. + var type = typeof value; + return !!value && (type == 'object' || type == 'function'); +} + +/** + * Creates an array of the own enumerable property names of `object`. + * + * **Note:** Non-object values are coerced to objects. See the + * [ES spec](http://ecma-international.org/ecma-262/6.0/#sec-object.keys) + * for more details. + * + * @static + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.keys(new Foo); + * // => ['a', 'b'] (iteration order is not guaranteed) + * + * _.keys('hi'); + * // => ['0', '1'] + */ +var keys = !nativeKeys ? shimKeys : function(object) { + var Ctor = object == null ? undefined : object.constructor; + if ((typeof Ctor == 'function' && Ctor.prototype === object) || + (typeof object != 'function' && isArrayLike(object))) { + return shimKeys(object); + } + return isObject(object) ? nativeKeys(object) : []; +}; + +/** + * Creates an array of the own and inherited enumerable property names of `object`. + * + * **Note:** Non-object values are coerced to objects. + * + * @static + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.keysIn(new Foo); + * // => ['a', 'b', 'c'] (iteration order is not guaranteed) + */ +function keysIn(object) { + if (object == null) { + return []; + } + if (!isObject(object)) { + object = Object(object); + } + var length = object.length; + length = (length && isLength(length) && + (isArray(object) || isArguments(object)) && length) || 0; + + var Ctor = object.constructor, + index = -1, + isProto = typeof Ctor == 'function' && Ctor.prototype === object, + result = Array(length), + skipIndexes = length > 0; + + while (++index < length) { + result[index] = (index + ''); + } + for (var key in object) { + if (!(skipIndexes && isIndex(key, length)) && + !(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) { + result.push(key); + } + } + return result; +} + +module.exports = keys; + +},{"lodash._getnative":158,"lodash.isarguments":159,"lodash.isarray":160}],163:[function(require,module,exports){ +// Constants +var Kn = 18, + Xn = 0.950470, // D65 standard referent + Yn = 1, + Zn = 1.088830, + t0 = 4 / 29, + t1 = 6 / 29, + t2 = 3 * t1 * t1, + t3 = t1 * t1 * t1, + deg2rad = Math.PI / 180, + rad2deg = 180 / Math.PI; + +// Utilities +function xyz2lab(t) { + return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0; +} + +function lab2xyz(t) { + return t > t1 ? t * t * t : t2 * (t - t0); +} + +function xyz2rgb(x) { + return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055); +} + +function rgb2xyz(x) { + return (x /= 255) <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4); +} + +// LAB +function rgbToLab(rgbColor) { + var b = rgb2xyz(rgbColor[0]), + a = rgb2xyz(rgbColor[1]), + l = rgb2xyz(rgbColor[2]), + x = xyz2lab((0.4124564 * b + 0.3575761 * a + 0.1804375 * l) / Xn), + y = xyz2lab((0.2126729 * b + 0.7151522 * a + 0.0721750 * l) / Yn), + z = xyz2lab((0.0193339 * b + 0.1191920 * a + 0.9503041 * l) / Zn); + + return [ + 116 * y - 16, + 500 * (x - y), + 200 * (y - z), + rgbColor[3] + ]; +} + +function labToRgb(labColor) { + var y = (labColor[0] + 16) / 116, + x = isNaN(labColor[1]) ? y : y + labColor[1] / 500, + z = isNaN(labColor[2]) ? y : y - labColor[2] / 200; + y = Yn * lab2xyz(y); + x = Xn * lab2xyz(x); + z = Zn * lab2xyz(z); + return [ + xyz2rgb(3.2404542 * x - 1.5371385 * y - 0.4985314 * z), // D65 -> sRGB + xyz2rgb(-0.9692660 * x + 1.8760108 * y + 0.0415560 * z), + xyz2rgb(0.0556434 * x - 0.2040259 * y + 1.0572252 * z), + labColor[3] + ]; +} + +// HCL +function rgbToHcl(rgbColor) { + var labColor = rgbToLab(rgbColor); + var l = labColor[0], + a = labColor[1], + b = labColor[2]; + var h = Math.atan2(b, a) * rad2deg; + return [ + h < 0 ? h + 360 : h, + Math.sqrt(a * a + b * b), + l, + rgbColor[3] + ]; +} + +function hclToRgb(hclColor) { + var h = hclColor[0] * deg2rad, + c = hclColor[1], + l = hclColor[2]; + return labToRgb([ + l, + Math.cos(h) * c, + Math.sin(h) * c, + hclColor[3] + ]); +} + +module.exports ={ + lab: { + forward: rgbToLab, + reverse: labToRgb + }, + hcl: { + forward: rgbToHcl, + reverse: hclToRgb + } +}; + +},{}],164:[function(require,module,exports){ +'use strict'; + +var colorSpaces = require('./color_spaces'); + +function identityFunction(x) { + return x; +} + +function createFunction(parameters, defaultType) { + var fun; + + if (!isFunctionDefinition(parameters)) { + fun = function() { return parameters; }; + fun.isFeatureConstant = true; + fun.isZoomConstant = true; + + } else { + var zoomAndFeatureDependent = parameters.stops && typeof parameters.stops[0][0] === 'object'; + var featureDependent = zoomAndFeatureDependent || parameters.property !== undefined; + var zoomDependent = zoomAndFeatureDependent || !featureDependent; + var inputType = parameters.stops && typeof (zoomAndFeatureDependent ? parameters.stops[0][0].property : parameters.stops[0][0]); + var type = parameters.type || defaultType || (inputType === 'string' ? 'categorical' : 'exponential'); + + var innerFun; + if (type === 'exponential') { + innerFun = evaluateExponentialFunction; + } else if (type === 'interval') { + innerFun = evaluateIntervalFunction; + } else if (type === 'categorical') { + innerFun = evaluateCategoricalFunction; + } else if (type === 'identity') { + innerFun = evaluateIdentityFunction; + } else { + throw new Error('Unknown function type "' + type + '"'); + } + + var outputFunction; + + // If we're interpolating colors in a color system other than RGBA, + // first translate all stop values to that color system, then interpolate + // arrays as usual. The `outputFunction` option lets us then translate + // the result of that interpolation back into RGBA. + if (parameters.colorSpace && parameters.colorSpace !== 'rgb') { + if (colorSpaces[parameters.colorSpace]) { + var colorspace = colorSpaces[parameters.colorSpace]; + // Avoid mutating the parameters value + parameters = JSON.parse(JSON.stringify(parameters)); + for (var s = 0; s < parameters.stops.length; s++) { + parameters.stops[s] = [ + parameters.stops[s][0], + colorspace.forward(parameters.stops[s][1]) + ]; + } + outputFunction = colorspace.reverse; + } else { + throw new Error('Unknown color space: ' + parameters.colorSpace); + } + } else { + outputFunction = identityFunction; + } + + if (zoomAndFeatureDependent) { + var featureFunctions = {}; + var featureFunctionStops = []; + for (s = 0; s < parameters.stops.length; s++) { + var stop = parameters.stops[s]; + if (featureFunctions[stop[0].zoom] === undefined) { + featureFunctions[stop[0].zoom] = { + zoom: stop[0].zoom, + type: parameters.type, + property: parameters.property, + stops: [] + }; + } + featureFunctions[stop[0].zoom].stops.push([stop[0].value, stop[1]]); + } + + for (var z in featureFunctions) { + featureFunctionStops.push([featureFunctions[z].zoom, createFunction(featureFunctions[z])]); + } + fun = function(zoom, feature) { + return outputFunction(evaluateExponentialFunction({ + stops: featureFunctionStops, + base: parameters.base + }, zoom)(zoom, feature)); + }; + fun.isFeatureConstant = false; + fun.isZoomConstant = false; + + } else if (zoomDependent) { + fun = function(zoom) { + return outputFunction(innerFun(parameters, zoom)); + }; + fun.isFeatureConstant = true; + fun.isZoomConstant = false; + } else { + fun = function(zoom, feature) { + return outputFunction( + innerFun(parameters, feature[parameters.property])); + }; + fun.isFeatureConstant = false; + fun.isZoomConstant = true; + } + } + + return fun; +} + +function evaluateCategoricalFunction(parameters, input) { + for (var i = 0; i < parameters.stops.length; i++) { + if (input === parameters.stops[i][0]) { + return parameters.stops[i][1]; + } + } + return parameters.stops[0][1]; +} + +function evaluateIntervalFunction(parameters, input) { + for (var i = 0; i < parameters.stops.length; i++) { + if (input < parameters.stops[i][0]) break; + } + return parameters.stops[Math.max(i - 1, 0)][1]; +} + +function evaluateExponentialFunction(parameters, input) { + var base = parameters.base !== undefined ? parameters.base : 1; + + var i = 0; + while (true) { + if (i >= parameters.stops.length) break; + else if (input <= parameters.stops[i][0]) break; + else i++; + } + + if (i === 0) { + return parameters.stops[i][1]; + + } else if (i === parameters.stops.length) { + return parameters.stops[i - 1][1]; + + } else { + return interpolate( + input, + base, + parameters.stops[i - 1][0], + parameters.stops[i][0], + parameters.stops[i - 1][1], + parameters.stops[i][1] + ); + } +} + +function evaluateIdentityFunction(parameters, input) { + return input; +} + + +function interpolate(input, base, inputLower, inputUpper, outputLower, outputUpper) { + if (typeof outputLower === 'function') { + return function() { + var evaluatedLower = outputLower.apply(undefined, arguments); + var evaluatedUpper = outputUpper.apply(undefined, arguments); + return interpolate(input, base, inputLower, inputUpper, evaluatedLower, evaluatedUpper); + }; + } else if (outputLower.length) { + return interpolateArray(input, base, inputLower, inputUpper, outputLower, outputUpper); + } else { + return interpolateNumber(input, base, inputLower, inputUpper, outputLower, outputUpper); + } +} + +function interpolateNumber(input, base, inputLower, inputUpper, outputLower, outputUpper) { + var difference = inputUpper - inputLower; + var progress = input - inputLower; + + var ratio; + if (base === 1) { + ratio = progress / difference; + } else { + ratio = (Math.pow(base, progress) - 1) / (Math.pow(base, difference) - 1); + } + + return (outputLower * (1 - ratio)) + (outputUpper * ratio); +} + +function interpolateArray(input, base, inputLower, inputUpper, outputLower, outputUpper) { + var output = []; + for (var i = 0; i < outputLower.length; i++) { + output[i] = interpolateNumber(input, base, inputLower, inputUpper, outputLower[i], outputUpper[i]); + } + return output; +} + +function isFunctionDefinition(value) { + return typeof value === 'object' && (value.stops || value.type === 'identity'); +} + + +module.exports.isFunctionDefinition = isFunctionDefinition; + +module.exports.interpolated = function(parameters) { + return createFunction(parameters, 'exponential'); +}; + +module.exports['piecewise-constant'] = function(parameters) { + return createFunction(parameters, 'interval'); +}; + +},{"./color_spaces":163}],165:[function(require,module,exports){ +'use strict'; + +var refProperties = require('./util/ref_properties'); + +function deref(layer, parent) { + var result = {}; + + for (var k in layer) { + if (k !== 'ref') { + result[k] = layer[k]; + } + } + + refProperties.forEach(function (k) { + if (k in parent) { + result[k] = parent[k]; + } + }); + + return result; +} + +module.exports = derefLayers; + +/** + * Given an array of layers, some of which may contain `ref` properties + * whose value is the `id` of another property, return a new array where + * such layers have been augmented with the 'type', 'source', etc. properties + * from the parent layer, and the `ref` property has been removed. + * + * The input is not modified. The output may contain references to portions + * of the input. + * + * @param {Array} layers + * @returns {Array} + */ +function derefLayers(layers) { + layers = layers.slice(); + + var map = Object.create(null), i; + for (i = 0; i < layers.length; i++) { + map[layers[i].id] = layers[i]; + } + + for (i = 0; i < layers.length; i++) { + if ('ref' in layers[i]) { + layers[i] = deref(layers[i], map[layers[i].ref]); + } + } + + return layers; +} + +},{"./util/ref_properties":171}],166:[function(require,module,exports){ +'use strict'; + +var isEqual = require('lodash.isequal'); + +var operations = { + + /* + * { command: 'setStyle', args: [stylesheet] } + */ + setStyle: 'setStyle', + + /* + * { command: 'addLayer', args: [layer, 'beforeLayerId'] } + */ + addLayer: 'addLayer', + + /* + * { command: 'removeLayer', args: ['layerId'] } + */ + removeLayer: 'removeLayer', + + /* + * { command: 'setPaintProperty', args: ['layerId', 'prop', value] } + */ + setPaintProperty: 'setPaintProperty', + + /* + * { command: 'setLayoutProperty', args: ['layerId', 'prop', value] } + */ + setLayoutProperty: 'setLayoutProperty', + + /* + * { command: 'setFilter', args: ['layerId', filter] } + */ + setFilter: 'setFilter', + + /* + * { command: 'addSource', args: ['sourceId', source] } + */ + addSource: 'addSource', + + /* + * { command: 'removeSource', args: ['sourceId'] } + */ + removeSource: 'removeSource', + + /* + * { command: 'setLayerZoomRange', args: ['layerId', 0, 22] } + */ + setLayerZoomRange: 'setLayerZoomRange', + + /* + * { command: 'setLayerProperty', args: ['layerId', 'prop', value] } + */ + setLayerProperty: 'setLayerProperty', + + /* + * { command: 'setCenter', args: [[lon, lat]] } + */ + setCenter: 'setCenter', + + /* + * { command: 'setZoom', args: [zoom] } + */ + setZoom: 'setZoom', + + /* + * { command: 'setBearing', args: [bearing] } + */ + setBearing: 'setBearing', + + /* + * { command: 'setPitch', args: [pitch] } + */ + setPitch: 'setPitch', + + /* + * { command: 'setSprite', args: ['spriteUrl'] } + */ + setSprite: 'setSprite', + + /* + * { command: 'setGlyphs', args: ['glyphsUrl'] } + */ + setGlyphs: 'setGlyphs', + + /* + * { command: 'setTransition', args: [transition] } + */ + setTransition: 'setTransition', + + /* + * { command: 'setLighting', args: [lightProperties] } + */ + setLight: 'setLight' + +}; + + +function diffSources(before, after, commands, sourcesRemoved) { + before = before || {}; + after = after || {}; + + var sourceId; + + // look for sources to remove + for (sourceId in before) { + if (!before.hasOwnProperty(sourceId)) continue; + if (!after.hasOwnProperty(sourceId)) { + commands.push({ command: operations.removeSource, args: [sourceId] }); + sourcesRemoved[sourceId] = true; + } + } + + // look for sources to add/update + for (sourceId in after) { + if (!after.hasOwnProperty(sourceId)) continue; + if (!before.hasOwnProperty(sourceId)) { + commands.push({ command: operations.addSource, args: [sourceId, after[sourceId]] }); + } else if (!isEqual(before[sourceId], after[sourceId])) { + // no update command, must remove then add + commands.push({ command: operations.removeSource, args: [sourceId] }); + commands.push({ command: operations.addSource, args: [sourceId, after[sourceId]] }); + sourcesRemoved[sourceId] = true; + } + } +} + +function diffLayerPropertyChanges(before, after, commands, layerId, klass, command) { + before = before || {}; + after = after || {}; + + var prop; + + for (prop in before) { + if (!before.hasOwnProperty(prop)) continue; + if (!isEqual(before[prop], after[prop])) { + commands.push({ command: command, args: [layerId, prop, after[prop], klass] }); + } + } + for (prop in after) { + if (!after.hasOwnProperty(prop) || before.hasOwnProperty(prop)) continue; + if (!isEqual(before[prop], after[prop])) { + commands.push({ command: command, args: [layerId, prop, after[prop], klass] }); + } + } +} + +function pluckId(layer) { + return layer.id; +} +function indexById(group, layer) { + group[layer.id] = layer; + return group; +} + +function diffLayers(before, after, commands) { + before = before || []; + after = after || []; + + // order of layers by id + var beforeOrder = before.map(pluckId); + var afterOrder = after.map(pluckId); + + // index of layer by id + var beforeIndex = before.reduce(indexById, {}); + var afterIndex = after.reduce(indexById, {}); + + // track order of layers as if they have been mutated + var tracker = beforeOrder.slice(); + + // layers that have been added do not need to be diffed + var clean = Object.create(null); + + var i, d, layerId, beforeLayer, afterLayer, insertBeforeLayerId, prop; + + // remove layers + for (i = 0, d = 0; i < beforeOrder.length; i++) { + layerId = beforeOrder[i]; + if (!afterIndex.hasOwnProperty(layerId)) { + commands.push({ command: operations.removeLayer, args: [layerId] }); + tracker.splice(tracker.indexOf(layerId, d), 1); + } else { + // limit where in tracker we need to look for a match + d++; + } + } + + // add/reorder layers + for (i = 0, d = 0; i < afterOrder.length; i++) { + // work backwards as insert is before an existing layer + layerId = afterOrder[afterOrder.length - 1 - i]; + + if (tracker[tracker.length - 1 - i] === layerId) continue; + + if (beforeIndex.hasOwnProperty(layerId)) { + // remove the layer before we insert at the correct position + commands.push({ command: operations.removeLayer, args: [layerId] }); + tracker.splice(tracker.lastIndexOf(layerId, tracker.length - d), 1); + } else { + // limit where in tracker we need to look for a match + d++; + } + + // add layer at correct position + insertBeforeLayerId = tracker[tracker.length - i]; + commands.push({ command: operations.addLayer, args: [afterIndex[layerId], insertBeforeLayerId] }); + tracker.splice(tracker.length - i, 0, layerId); + clean[layerId] = true; + } + + // update layers + for (i = 0; i < afterOrder.length; i++) { + layerId = afterOrder[i]; + beforeLayer = beforeIndex[layerId]; + afterLayer = afterIndex[layerId]; + + // no need to update if previously added (new or moved) + if (clean[layerId] || isEqual(beforeLayer, afterLayer)) continue; + + // If source, source-layer, or type have changes, then remove the layer + // and add it back 'from scratch'. + if (!isEqual(beforeLayer.source, afterLayer.source) || !isEqual(beforeLayer['source-layer'], afterLayer['source-layer']) || !isEqual(beforeLayer.type, afterLayer.type)) { + commands.push({ command: operations.removeLayer, args: [layerId] }); + // we add the layer back at the same position it was already in, so + // there's no need to update the `tracker` + insertBeforeLayerId = tracker[tracker.lastIndexOf(layerId) + 1]; + commands.push({ command: operations.addLayer, args: [afterLayer, insertBeforeLayerId] }); + continue; + } + + // layout, paint, filter, minzoom, maxzoom + diffLayerPropertyChanges(beforeLayer.layout, afterLayer.layout, commands, layerId, null, operations.setLayoutProperty); + diffLayerPropertyChanges(beforeLayer.paint, afterLayer.paint, commands, layerId, null, operations.setPaintProperty); + if (!isEqual(beforeLayer.filter, afterLayer.filter)) { + commands.push({ command: operations.setFilter, args: [layerId, afterLayer.filter] }); + } + if (!isEqual(beforeLayer.minzoom, afterLayer.minzoom) || !isEqual(beforeLayer.maxzoom, afterLayer.maxzoom)) { + commands.push({ command: operations.setLayerZoomRange, args: [layerId, afterLayer.minzoom, afterLayer.maxzoom] }); + } + + // handle all other layer props, including paint.* + for (prop in beforeLayer) { + if (!beforeLayer.hasOwnProperty(prop)) continue; + if (prop === 'layout' || prop === 'paint' || prop === 'filter' + || prop === 'metadata' || prop === 'minzoom' || prop === 'maxzoom') continue; + if (prop.indexOf('paint.') === 0) { + diffLayerPropertyChanges(beforeLayer[prop], afterLayer[prop], commands, layerId, prop.slice(6), operations.setPaintProperty); + } else if (!isEqual(beforeLayer[prop], afterLayer[prop])) { + commands.push({ command: operations.setLayerProperty, args: [layerId, prop, afterLayer[prop]] }); + } + } + for (prop in afterLayer) { + if (!afterLayer.hasOwnProperty(prop) || beforeLayer.hasOwnProperty(prop)) continue; + if (prop === 'layout' || prop === 'paint' || prop === 'filter' + || prop === 'metadata' || prop === 'minzoom' || prop === 'maxzoom') continue; + if (prop.indexOf('paint.') === 0) { + diffLayerPropertyChanges(beforeLayer[prop], afterLayer[prop], commands, layerId, prop.slice(6), operations.setPaintProperty); + } else if (!isEqual(beforeLayer[prop], afterLayer[prop])) { + commands.push({ command: operations.setLayerProperty, args: [layerId, prop, afterLayer[prop]] }); + } + } + } +} + +/** + * Diff two stylesheet + * + * Creates semanticly aware diffs that can easily be applied at runtime. + * Operations produced by the diff closely resemble the mapbox-gl-js API. Any + * error creating the diff will fall back to the 'setStyle' operation. + * + * Example diff: + * [ + * { command: 'setConstant', args: ['@water', '#0000FF'] }, + * { command: 'setPaintProperty', args: ['background', 'background-color', 'black'] } + * ] + * + * @param {*} [before] stylesheet to compare from + * @param {*} after stylesheet to compare to + * @returns Array list of changes + */ +function diffStyles(before, after) { + if (!before) return [{ command: operations.setStyle, args: [after] }]; + + var commands = []; + + try { + // Handle changes to top-level properties + if (!isEqual(before.version, after.version)) { + return [{ command: operations.setStyle, args: [after] }]; + } + if (!isEqual(before.center, after.center)) { + commands.push({ command: operations.setCenter, args: [after.center] }); + } + if (!isEqual(before.zoom, after.zoom)) { + commands.push({ command: operations.setZoom, args: [after.zoom] }); + } + if (!isEqual(before.bearing, after.bearing)) { + commands.push({ command: operations.setBearing, args: [after.bearing] }); + } + if (!isEqual(before.pitch, after.pitch)) { + commands.push({ command: operations.setPitch, args: [after.pitch] }); + } + if (!isEqual(before.sprite, after.sprite)) { + commands.push({ command: operations.setSprite, args: [after.sprite] }); + } + if (!isEqual(before.glyphs, after.glyphs)) { + commands.push({ command: operations.setGlyphs, args: [after.glyphs] }); + } + if (!isEqual(before.transition, after.transition)) { + commands.push({ command: operations.setTransition, args: [after.transition] }); + } + if (!isEqual(before.light, after.light)) { + commands.push({ command: operations.setLight, args: [after.light] }); + } + + // Handle changes to `sources` + // If a source is to be removed, we also--before the removeSource + // command--need to remove all the style layers that depend on it. + var sourcesRemoved = {}; + + // First collect the {add,remove}Source commands + var removeOrAddSourceCommands = []; + diffSources(before.sources, after.sources, removeOrAddSourceCommands, sourcesRemoved); + + // Push a removeLayer command for each style layer that depends on a + // source that's being removed. + // Also, exclude any such layers them from the input to `diffLayers` + // below, so that diffLayers produces the appropriate `addLayers` + // command + var beforeLayers = []; + if (before.layers) { + before.layers.forEach(function (layer) { + if (sourcesRemoved[layer.source]) { + commands.push({ command: operations.removeLayer, args: [layer.id] }); + } else { + beforeLayers.push(layer); + } + }); + } + commands = commands.concat(removeOrAddSourceCommands); + + // Handle changes to `layers` + diffLayers(beforeLayers, after.layers, commands); + + } catch (e) { + // fall back to setStyle + console.warn('Unable to compute style diff:', e); + commands = [{ command: operations.setStyle, args: [after] }]; + } + + return commands; +} + +module.exports = diffStyles; +module.exports.operations = operations; + +},{"lodash.isequal":191}],167:[function(require,module,exports){ +'use strict'; + +var format = require('util').format; + +function ValidationError(key, value /*, message, ...*/) { + this.message = ( + (key ? key + ': ' : '') + + format.apply(format, Array.prototype.slice.call(arguments, 2)) + ); + + if (value !== null && value !== undefined && value.__line__) { + this.line = value.__line__; + } +} + +module.exports = ValidationError; + +},{"util":206}],168:[function(require,module,exports){ +'use strict'; + +var refProperties = require('./util/ref_properties'); +var stringify = require('fast-stable-stringify'); + +function key(layer) { + return stringify(refProperties.map(function (k) { + return layer[k]; + })); +} + +module.exports = groupByLayout; + +/** + * Given an array of layers, return an array of arrays of layers where all + * layers in each group have identical layout-affecting properties. These + * are the properties that were formerly used by explicit `ref` mechanism + * for layers: 'type', 'source', 'source-layer', 'minzoom', 'maxzoom', + * 'filter', and 'layout'. + * + * The input is not modified. The output layers are references to the + * input layers. + * + * @param {Array} layers + * @returns {Array>} + */ +function groupByLayout(layers) { + var groups = {}, i, k; + + for (i = 0; i < layers.length; i++) { + k = key(layers[i]); + var group = groups[k]; + if (!group) { + group = groups[k] = []; + } + group.push(layers[i]); + } + + var result = []; + + for (k in groups) { + result.push(groups[k]); + } + + return result; +} + +},{"./util/ref_properties":171,"fast-stable-stringify":138}],169:[function(require,module,exports){ +'use strict'; + +module.exports = function (output) { + for (var i = 1; i < arguments.length; i++) { + var input = arguments[i]; + for (var k in input) { + output[k] = input[k]; + } + } + return output; +}; + +},{}],170:[function(require,module,exports){ +'use strict'; + +module.exports = function getType(val) { + if (val instanceof Number) { + return 'number'; + } else if (val instanceof String) { + return 'string'; + } else if (val instanceof Boolean) { + return 'boolean'; + } else if (Array.isArray(val)) { + return 'array'; + } else if (val === null) { + return 'null'; + } else { + return typeof val; + } +}; + +},{}],171:[function(require,module,exports){ +'use strict'; + +module.exports = ['type', 'source', 'source-layer', 'minzoom', 'maxzoom', 'filter', 'layout']; + +},{}],172:[function(require,module,exports){ +'use strict'; + +// Turn jsonlint-lines-primitives objects into primitive objects +module.exports = function unbundle(value) { + if (value instanceof Number || value instanceof String || value instanceof Boolean) { + return value.valueOf(); + } else { + return value; + } +}; + +},{}],173:[function(require,module,exports){ +'use strict'; + +var ValidationError = require('../error/validation_error'); +var getType = require('../util/get_type'); +var extend = require('../util/extend'); + +// Main recursive validation function. Tracks: +// +// - key: string representing location of validation in style tree. Used only +// for more informative error reporting. +// - value: current value from style being evaluated. May be anything from a +// high level object that needs to be descended into deeper or a simple +// scalar value. +// - valueSpec: current spec being evaluated. Tracks value. + +module.exports = function validate(options) { + + var validateFunction = require('./validate_function'); + var validateObject = require('./validate_object'); + var VALIDATORS = { + '*': function() { + return []; + }, + 'array': require('./validate_array'), + 'boolean': require('./validate_boolean'), + 'number': require('./validate_number'), + 'color': require('./validate_color'), + 'constants': require('./validate_constants'), + 'enum': require('./validate_enum'), + 'filter': require('./validate_filter'), + 'function': require('./validate_function'), + 'layer': require('./validate_layer'), + 'object': require('./validate_object'), + 'source': require('./validate_source'), + 'light': require('./validate_light'), + 'string': require('./validate_string') + }; + + var value = options.value; + var valueSpec = options.valueSpec; + var key = options.key; + var styleSpec = options.styleSpec; + var style = options.style; + + if (getType(value) === 'string' && value[0] === '@') { + if (styleSpec.$version > 7) { + return [new ValidationError(key, value, 'constants have been deprecated as of v8')]; + } + if (!(value in style.constants)) { + return [new ValidationError(key, value, 'constant "%s" not found', value)]; + } + options = extend({}, options, { value: style.constants[value] }); + } + + if (valueSpec.function && getType(value) === 'object') { + return validateFunction(options); + + } else if (valueSpec.type && VALIDATORS[valueSpec.type]) { + return VALIDATORS[valueSpec.type](options); + + } else { + return validateObject(extend({}, options, { + valueSpec: valueSpec.type ? styleSpec[valueSpec.type] : valueSpec + })); + } +}; + +},{"../error/validation_error":167,"../util/extend":169,"../util/get_type":170,"./validate_array":174,"./validate_boolean":175,"./validate_color":176,"./validate_constants":177,"./validate_enum":178,"./validate_filter":179,"./validate_function":180,"./validate_layer":182,"./validate_light":184,"./validate_number":185,"./validate_object":186,"./validate_source":188,"./validate_string":189}],174:[function(require,module,exports){ +'use strict'; + +var getType = require('../util/get_type'); +var validate = require('./validate'); +var ValidationError = require('../error/validation_error'); + +module.exports = function validateArray(options) { + var array = options.value; + var arraySpec = options.valueSpec; + var style = options.style; + var styleSpec = options.styleSpec; + var key = options.key; + var validateArrayElement = options.arrayElementValidator || validate; + + if (getType(array) !== 'array') { + return [new ValidationError(key, array, 'array expected, %s found', getType(array))]; + } + + if (arraySpec.length && array.length !== arraySpec.length) { + return [new ValidationError(key, array, 'array length %d expected, length %d found', arraySpec.length, array.length)]; + } + + if (arraySpec['min-length'] && array.length < arraySpec['min-length']) { + return [new ValidationError(key, array, 'array length at least %d expected, length %d found', arraySpec['min-length'], array.length)]; + } + + var arrayElementSpec = { + "type": arraySpec.value + }; + + if (styleSpec.$version < 7) { + arrayElementSpec.function = arraySpec.function; + } + + if (getType(arraySpec.value) === 'object') { + arrayElementSpec = arraySpec.value; + } + + var errors = []; + for (var i = 0; i < array.length; i++) { + errors = errors.concat(validateArrayElement({ + array: array, + arrayIndex: i, + value: array[i], + valueSpec: arrayElementSpec, + style: style, + styleSpec: styleSpec, + key: key + '[' + i + ']' + })); + } + return errors; +}; + +},{"../error/validation_error":167,"../util/get_type":170,"./validate":173}],175:[function(require,module,exports){ +'use strict'; + +var getType = require('../util/get_type'); +var ValidationError = require('../error/validation_error'); + +module.exports = function validateBoolean(options) { + var value = options.value; + var key = options.key; + var type = getType(value); + + if (type !== 'boolean') { + return [new ValidationError(key, value, 'boolean expected, %s found', type)]; + } + + return []; +}; + +},{"../error/validation_error":167,"../util/get_type":170}],176:[function(require,module,exports){ +'use strict'; + +var ValidationError = require('../error/validation_error'); +var getType = require('../util/get_type'); +var parseCSSColor = require('csscolorparser').parseCSSColor; + +module.exports = function validateColor(options) { + var key = options.key; + var value = options.value; + var type = getType(value); + + if (type !== 'string') { + return [new ValidationError(key, value, 'color expected, %s found', type)]; + } + + if (parseCSSColor(value) === null) { + return [new ValidationError(key, value, 'color expected, "%s" found', value)]; + } + + return []; +}; + +},{"../error/validation_error":167,"../util/get_type":170,"csscolorparser":136}],177:[function(require,module,exports){ +'use strict'; + +var ValidationError = require('../error/validation_error'); +var getType = require('../util/get_type'); + +module.exports = function validateConstants(options) { + var key = options.key; + var constants = options.value; + var styleSpec = options.styleSpec; + + if (styleSpec.$version > 7) { + if (constants) { + return [new ValidationError(key, constants, 'constants have been deprecated as of v8')]; + } else { + return []; + } + } else { + var type = getType(constants); + if (type !== 'object') { + return [new ValidationError(key, constants, 'object expected, %s found', type)]; + } + + var errors = []; + for (var constantName in constants) { + if (constantName[0] !== '@') { + errors.push(new ValidationError(key + '.' + constantName, constants[constantName], 'constants must start with "@"')); + } + } + return errors; + } + +}; + +},{"../error/validation_error":167,"../util/get_type":170}],178:[function(require,module,exports){ +'use strict'; + +var ValidationError = require('../error/validation_error'); +var unbundle = require('../util/unbundle_jsonlint'); + +module.exports = function validateEnum(options) { + var key = options.key; + var value = options.value; + var valueSpec = options.valueSpec; + var errors = []; + + if (Array.isArray(valueSpec.values)) { // <=v7 + if (valueSpec.values.indexOf(unbundle(value)) === -1) { + errors.push(new ValidationError(key, value, 'expected one of [%s], %s found', valueSpec.values.join(', '), value)); + } + } else { // >=v8 + if (Object.keys(valueSpec.values).indexOf(unbundle(value)) === -1) { + errors.push(new ValidationError(key, value, 'expected one of [%s], %s found', Object.keys(valueSpec.values).join(', '), value)); + } + } + return errors; +}; + +},{"../error/validation_error":167,"../util/unbundle_jsonlint":172}],179:[function(require,module,exports){ +'use strict'; + +var ValidationError = require('../error/validation_error'); +var validateEnum = require('./validate_enum'); +var getType = require('../util/get_type'); +var unbundle = require('../util/unbundle_jsonlint'); + +module.exports = function validateFilter(options) { + var value = options.value; + var key = options.key; + var styleSpec = options.styleSpec; + var type; + + var errors = []; + + if (getType(value) !== 'array') { + return [new ValidationError(key, value, 'array expected, %s found', getType(value))]; + } + + if (value.length < 1) { + return [new ValidationError(key, value, 'filter array must have at least 1 element')]; + } + + errors = errors.concat(validateEnum({ + key: key + '[0]', + value: value[0], + valueSpec: styleSpec.filter_operator, + style: options.style, + styleSpec: options.styleSpec + })); + + switch (unbundle(value[0])) { + case '<': + case '<=': + case '>': + case '>=': + if (value.length >= 2 && value[1] == '$type') { + errors.push(new ValidationError(key, value, '"$type" cannot be use with operator "%s"', value[0])); + } + /* falls through */ + case '==': + case '!=': + if (value.length != 3) { + errors.push(new ValidationError(key, value, 'filter array for operator "%s" must have 3 elements', value[0])); + } + /* falls through */ + case 'in': + case '!in': + if (value.length >= 2) { + type = getType(value[1]); + if (type !== 'string') { + errors.push(new ValidationError(key + '[1]', value[1], 'string expected, %s found', type)); + } else if (value[1][0] === '@') { + errors.push(new ValidationError(key + '[1]', value[1], 'filter key cannot be a constant')); + } + } + for (var i = 2; i < value.length; i++) { + type = getType(value[i]); + if (value[1] == '$type') { + errors = errors.concat(validateEnum({ + key: key + '[' + i + ']', + value: value[i], + valueSpec: styleSpec.geometry_type, + style: options.style, + styleSpec: options.styleSpec + })); + } else if (type === 'string' && value[i][0] === '@') { + errors.push(new ValidationError(key + '[' + i + ']', value[i], 'filter value cannot be a constant')); + } else if (type !== 'string' && type !== 'number' && type !== 'boolean') { + errors.push(new ValidationError(key + '[' + i + ']', value[i], 'string, number, or boolean expected, %s found', type)); + } + } + break; + + case 'any': + case 'all': + case 'none': + for (i = 1; i < value.length; i++) { + errors = errors.concat(validateFilter({ + key: key + '[' + i + ']', + value: value[i], + style: options.style, + styleSpec: options.styleSpec + })); + } + break; + + case 'has': + case '!has': + type = getType(value[1]); + if (value.length !== 2) { + errors.push(new ValidationError(key, value, 'filter array for "%s" operator must have 2 elements', value[0])); + } else if (type !== 'string') { + errors.push(new ValidationError(key + '[1]', value[1], 'string expected, %s found', type)); + } else if (value[1][0] === '@') { + errors.push(new ValidationError(key + '[1]', value[1], 'filter key cannot be a constant')); + } + break; + + } + + return errors; +}; + +},{"../error/validation_error":167,"../util/get_type":170,"../util/unbundle_jsonlint":172,"./validate_enum":178}],180:[function(require,module,exports){ +'use strict'; + +var ValidationError = require('../error/validation_error'); +var getType = require('../util/get_type'); +var validate = require('./validate'); +var validateObject = require('./validate_object'); +var validateArray = require('./validate_array'); +var validateNumber = require('./validate_number'); +var unbundle = require('../util/unbundle_jsonlint'); + +module.exports = function validateFunction(options) { + var functionValueSpec = options.valueSpec; + var functionType = unbundle(options.value.type); + var stopKeyType; + var stopDomainValues = {}; + var previousStopDomainValue; + var previousStopDomainZoom; + + var isZoomFunction = functionType !== 'categorical' && options.value.property === undefined; + var isPropertyFunction = !isZoomFunction; + var isZoomAndPropertyFunction = + getType(options.value.stops) === 'array' && + getType(options.value.stops[0]) === 'array' && + getType(options.value.stops[0][0]) === 'object'; + + var errors = validateObject({ + key: options.key, + value: options.value, + valueSpec: options.styleSpec.function, + style: options.style, + styleSpec: options.styleSpec, + objectElementValidators: { stops: validateFunctionStops } + }); + + if (functionType !== 'identity' && !options.value.stops) { + errors.push(new ValidationError(options.key, options.value, 'missing required property "stops"')); + } + + if (functionType === 'exponential' && options.valueSpec['function'] === 'piecewise-constant') { + errors.push(new ValidationError(options.key, options.value, 'exponential functions not supported')); + } + + if (options.styleSpec.$version >= 8) { + if (isPropertyFunction && !options.valueSpec['property-function']) { + errors.push(new ValidationError(options.key, options.value, 'property functions not supported')); + } else if (isZoomFunction && !options.valueSpec['zoom-function']) { + errors.push(new ValidationError(options.key, options.value, 'zoom functions not supported')); + } + } + + if ((functionType === 'categorical' || isZoomAndPropertyFunction) && options.value.property === undefined) { + errors.push(new ValidationError(options.key, options.value, '"property" property is required')); + } + + return errors; + + function validateFunctionStops(options) { + if (functionType === 'identity') { + return [new ValidationError(options.key, options.value, 'identity function may not have a "stops" property')]; + } + + var errors = []; + var value = options.value; + + errors = errors.concat(validateArray({ + key: options.key, + value: value, + valueSpec: options.valueSpec, + style: options.style, + styleSpec: options.styleSpec, + arrayElementValidator: validateFunctionStop + })); + + if (getType(value) === 'array' && value.length === 0) { + errors.push(new ValidationError(options.key, value, 'array must have at least one stop')); + } + + return errors; + } + + function validateFunctionStop(options) { + var errors = []; + var value = options.value; + var key = options.key; + + if (getType(value) !== 'array') { + return [new ValidationError(key, value, 'array expected, %s found', getType(value))]; + } + + if (value.length !== 2) { + return [new ValidationError(key, value, 'array length %d expected, length %d found', 2, value.length)]; + } + + if (isZoomAndPropertyFunction) { + if (getType(value[0]) !== 'object') { + return [new ValidationError(key, value, 'object expected, %s found', getType(value[0]))]; + } + if (value[0].zoom === undefined) { + return [new ValidationError(key, value, 'object stop key must have zoom')]; + } + if (value[0].value === undefined) { + return [new ValidationError(key, value, 'object stop key must have value')]; + } + if (previousStopDomainZoom && previousStopDomainZoom > unbundle(value[0].zoom)) { + return [new ValidationError(key, value[0].zoom, 'stop zoom values must appear in ascending order')]; + } + if (unbundle(value[0].zoom) !== previousStopDomainZoom) { + previousStopDomainZoom = unbundle(value[0].zoom); + previousStopDomainValue = undefined; + } + errors = errors.concat(validateObject({ + key: key + '[0]', + value: value[0], + valueSpec: { zoom: {} }, + style: options.style, + styleSpec: options.styleSpec, + objectElementValidators: { zoom: validateNumber, value: validateStopDomainValue } + })); + } else { + errors = errors.concat(validateStopDomainValue({ + key: key + '[0]', + value: value[0], + valueSpec: {}, + style: options.style, + styleSpec: options.styleSpec + })); + } + + errors = errors.concat(validate({ + key: key + '[1]', + value: value[1], + valueSpec: functionValueSpec, + style: options.style, + styleSpec: options.styleSpec + })); + + if (getType(value[0]) === 'number') { + if (functionValueSpec.function === 'piecewise-constant' && value[0] % 1 !== 0) { + errors.push(new ValidationError(key + '[0]', value[0], 'zoom level for piecewise-constant functions must be an integer')); + } + } + + return errors; + } + + function validateStopDomainValue(options) { + var type = getType(options.value); + var value = unbundle(options.value); + + if (!stopKeyType) { + stopKeyType = type; + if (!functionType && type === 'string') { + functionType = 'categorical'; + } + } else if (type !== stopKeyType) { + return [new ValidationError(options.key, options.value, '%s stop domain type must match previous stop domain type %s', type, stopKeyType)]; + } + + if (type !== 'number' && type !== 'string') { + return [new ValidationError(options.key, options.value, 'property value must be a number or string')]; + } + + if (type !== 'number' && functionType !== 'categorical') { + return [new ValidationError(options.key, options.value, 'number expected, %s found', type)]; + } + + if (functionType === 'categorical' && type === 'number' && (!isFinite(value) || Math.floor(value) !== value)) { + return [new ValidationError(options.key, options.value, 'integer expected, found %s', value)]; + } + + if (type === 'number' && previousStopDomainValue !== undefined && value < previousStopDomainValue) { + return [new ValidationError(options.key, options.value, 'stop domain values must appear in ascending order')]; + } else { + previousStopDomainValue = value; + } + + if (functionType === 'categorical' && value in stopDomainValues) { + return [new ValidationError(options.key, options.value, 'stop domain values must be unique')]; + } else { + stopDomainValues[value] = true; + } + + return []; + } + +}; + +},{"../error/validation_error":167,"../util/get_type":170,"../util/unbundle_jsonlint":172,"./validate":173,"./validate_array":174,"./validate_number":185,"./validate_object":186}],181:[function(require,module,exports){ +'use strict'; + +var ValidationError = require('../error/validation_error'); +var validateString = require('./validate_string'); + +module.exports = function(options) { + var value = options.value; + var key = options.key; + + var errors = validateString(options); + if (errors.length) return errors; + + if (value.indexOf('{fontstack}') === -1) { + errors.push(new ValidationError(key, value, '"glyphs" url must include a "{fontstack}" token')); + } + + if (value.indexOf('{range}') === -1) { + errors.push(new ValidationError(key, value, '"glyphs" url must include a "{range}" token')); + } + + return errors; +}; + +},{"../error/validation_error":167,"./validate_string":189}],182:[function(require,module,exports){ +'use strict'; + +var ValidationError = require('../error/validation_error'); +var unbundle = require('../util/unbundle_jsonlint'); +var validateObject = require('./validate_object'); +var validateFilter = require('./validate_filter'); +var validatePaintProperty = require('./validate_paint_property'); +var validateLayoutProperty = require('./validate_layout_property'); +var extend = require('../util/extend'); + +module.exports = function validateLayer(options) { + var errors = []; + + var layer = options.value; + var key = options.key; + var style = options.style; + var styleSpec = options.styleSpec; + + if (!layer.type && !layer.ref) { + errors.push(new ValidationError(key, layer, 'either "type" or "ref" is required')); + } + var type = unbundle(layer.type); + var ref = unbundle(layer.ref); + + if (layer.id) { + for (var i = 0; i < options.arrayIndex; i++) { + var otherLayer = style.layers[i]; + if (unbundle(otherLayer.id) === unbundle(layer.id)) { + errors.push(new ValidationError(key, layer.id, 'duplicate layer id "%s", previously used at line %d', layer.id, otherLayer.id.__line__)); + } + } + } + + if ('ref' in layer) { + ['type', 'source', 'source-layer', 'filter', 'layout'].forEach(function (p) { + if (p in layer) { + errors.push(new ValidationError(key, layer[p], '"%s" is prohibited for ref layers', p)); + } + }); + + var parent; + + style.layers.forEach(function(layer) { + if (layer.id == ref) parent = layer; + }); + + if (!parent) { + errors.push(new ValidationError(key, layer.ref, 'ref layer "%s" not found', ref)); + } else if (parent.ref) { + errors.push(new ValidationError(key, layer.ref, 'ref cannot reference another ref layer')); + } else { + type = unbundle(parent.type); + } + } else if (type !== 'background') { + if (!layer.source) { + errors.push(new ValidationError(key, layer, 'missing required property "source"')); + } else { + var source = style.sources && style.sources[layer.source]; + if (!source) { + errors.push(new ValidationError(key, layer.source, 'source "%s" not found', layer.source)); + } else if (source.type == 'vector' && type == 'raster') { + errors.push(new ValidationError(key, layer.source, 'layer "%s" requires a raster source', layer.id)); + } else if (source.type == 'raster' && type != 'raster') { + errors.push(new ValidationError(key, layer.source, 'layer "%s" requires a vector source', layer.id)); + } else if (source.type == 'vector' && !layer['source-layer']) { + errors.push(new ValidationError(key, layer, 'layer "%s" must specify a "source-layer"', layer.id)); + } + } + } + + errors = errors.concat(validateObject({ + key: key, + value: layer, + valueSpec: styleSpec.layer, + style: options.style, + styleSpec: options.styleSpec, + objectElementValidators: { + '*': function() { + return []; + }, + filter: validateFilter, + layout: function(options) { + return validateObject({ + layer: layer, + key: options.key, + value: options.value, + style: options.style, + styleSpec: options.styleSpec, + objectElementValidators: { + '*': function(options) { + return validateLayoutProperty(extend({layerType: type}, options)); + } + } + }); + }, + paint: function(options) { + return validateObject({ + layer: layer, + key: options.key, + value: options.value, + style: options.style, + styleSpec: options.styleSpec, + objectElementValidators: { + '*': function(options) { + return validatePaintProperty(extend({layerType: type}, options)); + } + } + }); + } + } + })); + + return errors; +}; + +},{"../error/validation_error":167,"../util/extend":169,"../util/unbundle_jsonlint":172,"./validate_filter":179,"./validate_layout_property":183,"./validate_object":186,"./validate_paint_property":187}],183:[function(require,module,exports){ +'use strict'; + +var validate = require('./validate'); +var ValidationError = require('../error/validation_error'); + +module.exports = function validateLayoutProperty(options) { + var key = options.key; + var style = options.style; + var styleSpec = options.styleSpec; + var value = options.value; + var propertyKey = options.objectKey; + var layerSpec = styleSpec['layout_' + options.layerType]; + + if (!layerSpec) return []; + + if (options.valueSpec || layerSpec[propertyKey]) { + var errors = []; + + if (options.layerType === 'symbol') { + if (propertyKey === 'icon-image' && style && !style.sprite) { + errors.push(new ValidationError(key, value, 'use of "icon-image" requires a style "sprite" property')); + } else if (propertyKey === 'text-field' && style && !style.glyphs) { + errors.push(new ValidationError(key, value, 'use of "text-field" requires a style "glyphs" property')); + } + } + + return errors.concat(validate({ + key: options.key, + value: value, + valueSpec: options.valueSpec || layerSpec[propertyKey], + style: style, + styleSpec: styleSpec + })); + + } else { + return [new ValidationError(key, value, 'unknown property "%s"', propertyKey)]; + } + +}; + +},{"../error/validation_error":167,"./validate":173}],184:[function(require,module,exports){ +'use strict'; + +var ValidationError = require('../error/validation_error'); +var getType = require('../util/get_type'); +var validate = require('./validate'); + +module.exports = function validateLight(options) { + var light = options.value; + var styleSpec = options.styleSpec; + var lightSpec = styleSpec.light; + var style = options.style; + + var errors = []; + + var rootType = getType(light); + if (light === undefined) { + return errors; + } else if (rootType !== 'object') { + errors = errors.concat([new ValidationError('light', light, 'object expected, %s found', rootType)]); + return errors; + } + + for (var key in light) { + var transitionMatch = key.match(/^(.*)-transition$/); + + if (transitionMatch && lightSpec[transitionMatch[1]] && lightSpec[transitionMatch[1]].transition) { + errors = errors.concat(validate({ + key: key, + value: light[key], + valueSpec: styleSpec.transition, + style: style, + styleSpec: styleSpec + })); + } else if (lightSpec[key]) { + errors = errors.concat(validate({ + key: key, + value: light[key], + valueSpec: lightSpec[key], + style: style, + styleSpec: styleSpec + })); + } else { + errors = errors.concat([new ValidationError(key, light[key], 'unknown property "%s"', key)]); + } + } + + return errors; +}; + +},{"../error/validation_error":167,"../util/get_type":170,"./validate":173}],185:[function(require,module,exports){ +'use strict'; + +var getType = require('../util/get_type'); +var ValidationError = require('../error/validation_error'); + +module.exports = function validateNumber(options) { + var key = options.key; + var value = options.value; + var valueSpec = options.valueSpec; + var type = getType(value); + + if (type !== 'number') { + return [new ValidationError(key, value, 'number expected, %s found', type)]; + } + + if ('minimum' in valueSpec && value < valueSpec.minimum) { + return [new ValidationError(key, value, '%s is less than the minimum value %s', value, valueSpec.minimum)]; + } + + if ('maximum' in valueSpec && value > valueSpec.maximum) { + return [new ValidationError(key, value, '%s is greater than the maximum value %s', value, valueSpec.maximum)]; + } + + return []; +}; + +},{"../error/validation_error":167,"../util/get_type":170}],186:[function(require,module,exports){ +'use strict'; + +var ValidationError = require('../error/validation_error'); +var getType = require('../util/get_type'); +var validateSpec = require('./validate'); + +module.exports = function validateObject(options) { + var key = options.key; + var object = options.value; + var elementSpecs = options.valueSpec || {}; + var elementValidators = options.objectElementValidators || {}; + var style = options.style; + var styleSpec = options.styleSpec; + var errors = []; + + var type = getType(object); + if (type !== 'object') { + return [new ValidationError(key, object, 'object expected, %s found', type)]; + } + + for (var objectKey in object) { + var elementSpecKey = objectKey.split('.')[0]; // treat 'paint.*' as 'paint' + var elementSpec = elementSpecs[elementSpecKey] || elementSpecs['*']; + + var validateElement; + if (elementValidators[elementSpecKey]) { + validateElement = elementValidators[elementSpecKey]; + } else if (elementSpecs[elementSpecKey]) { + validateElement = validateSpec; + } else if (elementValidators['*']) { + validateElement = elementValidators['*']; + } else if (elementSpecs['*']) { + validateElement = validateSpec; + } else { + errors.push(new ValidationError(key, object[objectKey], 'unknown property "%s"', objectKey)); + continue; + } + + errors = errors.concat(validateElement({ + key: (key ? key + '.' : key) + objectKey, + value: object[objectKey], + valueSpec: elementSpec, + style: style, + styleSpec: styleSpec, + object: object, + objectKey: objectKey + })); + } + + for (elementSpecKey in elementSpecs) { + if (elementSpecs[elementSpecKey].required && elementSpecs[elementSpecKey]['default'] === undefined && object[elementSpecKey] === undefined) { + errors.push(new ValidationError(key, object, 'missing required property "%s"', elementSpecKey)); + } + } + + return errors; +}; + +},{"../error/validation_error":167,"../util/get_type":170,"./validate":173}],187:[function(require,module,exports){ +'use strict'; + +var validate = require('./validate'); +var ValidationError = require('../error/validation_error'); + +module.exports = function validatePaintProperty(options) { + var key = options.key; + var style = options.style; + var styleSpec = options.styleSpec; + var value = options.value; + var propertyKey = options.objectKey; + var layerSpec = styleSpec['paint_' + options.layerType]; + + if (!layerSpec) return []; + + var transitionMatch = propertyKey.match(/^(.*)-transition$/); + + if (transitionMatch && layerSpec[transitionMatch[1]] && layerSpec[transitionMatch[1]].transition) { + return validate({ + key: key, + value: value, + valueSpec: styleSpec.transition, + style: style, + styleSpec: styleSpec + }); + + } else if (options.valueSpec || layerSpec[propertyKey]) { + return validate({ + key: options.key, + value: value, + valueSpec: options.valueSpec || layerSpec[propertyKey], + style: style, + styleSpec: styleSpec + }); + + } else { + return [new ValidationError(key, value, 'unknown property "%s"', propertyKey)]; + } + +}; + +},{"../error/validation_error":167,"./validate":173}],188:[function(require,module,exports){ +'use strict'; + +var ValidationError = require('../error/validation_error'); +var unbundle = require('../util/unbundle_jsonlint'); +var validateObject = require('./validate_object'); +var validateEnum = require('./validate_enum'); + +module.exports = function validateSource(options) { + var value = options.value; + var key = options.key; + var styleSpec = options.styleSpec; + var style = options.style; + + if (!value.type) { + return [new ValidationError(key, value, '"type" is required')]; + } + + var type = unbundle(value.type); + switch (type) { + case 'vector': + case 'raster': + var errors = []; + errors = errors.concat(validateObject({ + key: key, + value: value, + valueSpec: styleSpec.source_tile, + style: options.style, + styleSpec: styleSpec + })); + if ('url' in value) { + for (var prop in value) { + if (['type', 'url', 'tileSize'].indexOf(prop) < 0) { + errors.push(new ValidationError(key + '.' + prop, value[prop], 'a source with a "url" property may not include a "%s" property', prop)); + } + } + } + return errors; + + case 'geojson': + return validateObject({ + key: key, + value: value, + valueSpec: styleSpec.source_geojson, + style: style, + styleSpec: styleSpec + }); + + case 'video': + return validateObject({ + key: key, + value: value, + valueSpec: styleSpec.source_video, + style: style, + styleSpec: styleSpec + }); + + case 'image': + return validateObject({ + key: key, + value: value, + valueSpec: styleSpec.source_image, + style: style, + styleSpec: styleSpec + }); + + case 'canvas': + return validateObject({ + key: key, + value: value, + valueSpec: styleSpec.source_canvas, + style: style, + styleSpec: styleSpec + }); + + default: + return validateEnum({ + key: key + '.type', + value: value.type, + valueSpec: {values: ['vector', 'raster', 'geojson', 'video', 'image', 'canvas']}, + style: style, + styleSpec: styleSpec + }); + } +}; + +},{"../error/validation_error":167,"../util/unbundle_jsonlint":172,"./validate_enum":178,"./validate_object":186}],189:[function(require,module,exports){ +'use strict'; + +var getType = require('../util/get_type'); +var ValidationError = require('../error/validation_error'); + +module.exports = function validateString(options) { + var value = options.value; + var key = options.key; + var type = getType(value); + + if (type !== 'string') { + return [new ValidationError(key, value, 'string expected, %s found', type)]; + } + + return []; +}; + +},{"../error/validation_error":167,"../util/get_type":170}],190:[function(require,module,exports){ +'use strict'; + +var validateConstants = require('./validate/validate_constants'); +var validate = require('./validate/validate'); +var latestStyleSpec = require('../reference/latest.min'); +var validateGlyphsURL = require('./validate/validate_glyphs_url'); + +/** + * Validate a Mapbox GL style against the style specification. This entrypoint, + * `mapbox-gl-style-spec/lib/validate_style.min`, is designed to produce as + * small a browserify bundle as possible by omitting unnecessary functionality + * and legacy style specifications. + * + * @param {Object} style The style to be validated. + * @param {Object} [styleSpec] The style specification to validate against. + * If omitted, the latest style spec is used. + * @returns {Array} + * @example + * var validate = require('mapbox-gl-style-spec/lib/validate_style.min'); + * var errors = validate(style); + */ +function validateStyleMin(style, styleSpec) { + styleSpec = styleSpec || latestStyleSpec; + + var errors = []; + + errors = errors.concat(validate({ + key: '', + value: style, + valueSpec: styleSpec.$root, + styleSpec: styleSpec, + style: style, + objectElementValidators: { + glyphs: validateGlyphsURL, + '*': function() { + return []; + } + } + })); + + if (styleSpec.$version > 7 && style.constants) { + errors = errors.concat(validateConstants({ + key: 'constants', + value: style.constants, + style: style, + styleSpec: styleSpec + })); + } + + return sortErrors(errors); +} + +validateStyleMin.source = wrapCleanErrors(require('./validate/validate_source')); +validateStyleMin.light = wrapCleanErrors(require('./validate/validate_light')); +validateStyleMin.layer = wrapCleanErrors(require('./validate/validate_layer')); +validateStyleMin.filter = wrapCleanErrors(require('./validate/validate_filter')); +validateStyleMin.paintProperty = wrapCleanErrors(require('./validate/validate_paint_property')); +validateStyleMin.layoutProperty = wrapCleanErrors(require('./validate/validate_layout_property')); + +function sortErrors(errors) { + return [].concat(errors).sort(function (a, b) { + return a.line - b.line; + }); +} + +function wrapCleanErrors(inner) { + return function() { + return sortErrors(inner.apply(this, arguments)); + }; +} + +module.exports = validateStyleMin; + +},{"../reference/latest.min":192,"./validate/validate":173,"./validate/validate_constants":177,"./validate/validate_filter":179,"./validate/validate_glyphs_url":181,"./validate/validate_layer":182,"./validate/validate_layout_property":183,"./validate/validate_light":184,"./validate/validate_paint_property":187,"./validate/validate_source":188}],191:[function(require,module,exports){ +/** + * lodash 3.0.4 (Custom Build) + * Build: `lodash modern modularize exports="npm" -o ./` + * Copyright 2012-2015 The Dojo Foundation + * Based on Underscore.js 1.8.3 + * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + * Available under MIT license + */ +var baseIsEqual = require('lodash._baseisequal'), + bindCallback = require('lodash._bindcallback'); + +/** + * Performs a deep comparison between two values to determine if they are + * equivalent. If `customizer` is provided it is invoked to compare values. + * If `customizer` returns `undefined` comparisons are handled by the method + * instead. The `customizer` is bound to `thisArg` and invoked with three + * arguments: (value, other [, index|key]). + * + * **Note:** This method supports comparing arrays, booleans, `Date` objects, + * numbers, `Object` objects, regexes, and strings. Objects are compared by + * their own, not inherited, enumerable properties. Functions and DOM nodes + * are **not** supported. Provide a customizer function to extend support + * for comparing other values. + * + * @static + * @memberOf _ + * @alias eq + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @param {Function} [customizer] The function to customize value comparisons. + * @param {*} [thisArg] The `this` binding of `customizer`. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + * @example + * + * var object = { 'user': 'fred' }; + * var other = { 'user': 'fred' }; + * + * object == other; + * // => false + * + * _.isEqual(object, other); + * // => true + * + * // using a customizer callback + * var array = ['hello', 'goodbye']; + * var other = ['hi', 'goodbye']; + * + * _.isEqual(array, other, function(value, other) { + * if (_.every([value, other], RegExp.prototype.test, /^h(?:i|ello)$/)) { + * return true; + * } + * }); + * // => true + */ +function isEqual(value, other, customizer, thisArg) { + customizer = typeof customizer == 'function' ? bindCallback(customizer, thisArg, 3) : undefined; + var result = customizer ? customizer(value, other) : undefined; + return result === undefined ? baseIsEqual(value, other, customizer) : !!result; +} + +module.exports = isEqual; + +},{"lodash._baseisequal":156,"lodash._bindcallback":157}],192:[function(require,module,exports){ +module.exports = require('./v8.min.json'); + +},{"./v8.min.json":193}],193:[function(require,module,exports){ +module.exports={"$version":8,"$root":{"version":{"required":true,"type":"enum","values":[8]},"name":{"type":"string"},"metadata":{"type":"*"},"center":{"type":"array","value":"number"},"zoom":{"type":"number"},"bearing":{"type":"number","default":0,"period":360,"units":"degrees"},"pitch":{"type":"number","default":0,"units":"degrees"},"light":{"type":"light"},"sources":{"required":true,"type":"sources"},"sprite":{"type":"string"},"glyphs":{"type":"string"},"transition":{"type":"transition"},"layers":{"required":true,"type":"array","value":"layer"}},"sources":{"*":{"type":"source"}},"source":["source_tile","source_geojson","source_video","source_image","source_canvas"],"source_tile":{"type":{"required":true,"type":"enum","values":{"vector":{},"raster":{}}},"url":{"type":"string"},"tiles":{"type":"array","value":"string"},"minzoom":{"type":"number","default":0},"maxzoom":{"type":"number","default":22},"tileSize":{"type":"number","default":512,"units":"pixels"},"*":{"type":"*"}},"source_geojson":{"type":{"required":true,"type":"enum","values":{"geojson":{}}},"data":{"type":"*"},"maxzoom":{"type":"number","default":18},"buffer":{"type":"number","default":128,"maximum":512,"minimum":0},"tolerance":{"type":"number","default":0.375},"cluster":{"type":"boolean","default":false},"clusterRadius":{"type":"number","default":50,"minimum":0},"clusterMaxZoom":{"type":"number"}},"source_video":{"type":{"required":true,"type":"enum","values":{"video":{}}},"urls":{"required":true,"type":"array","value":"string"},"coordinates":{"required":true,"type":"array","length":4,"value":{"type":"array","length":2,"value":"number"}}},"source_image":{"type":{"required":true,"type":"enum","values":{"image":{}}},"url":{"required":true,"type":"string"},"coordinates":{"required":true,"type":"array","length":4,"value":{"type":"array","length":2,"value":"number"}}},"source_canvas":{"type":{"required":true,"type":"enum","values":{"canvas":{}}},"coordinates":{"required":true,"type":"array","length":4,"value":{"type":"array","length":2,"value":"number"}},"animate":{"type":"boolean","default":"true"},"canvas":{"type":"string","required":true}},"layer":{"id":{"type":"string","required":true},"type":{"type":"enum","values":{"fill":{},"line":{},"symbol":{},"circle":{},"fill-extrusion":{},"raster":{},"background":{}}},"metadata":{"type":"*"},"ref":{"type":"string"},"source":{"type":"string"},"source-layer":{"type":"string"},"minzoom":{"type":"number","minimum":0,"maximum":24},"maxzoom":{"type":"number","minimum":0,"maximum":24},"filter":{"type":"filter"},"layout":{"type":"layout"},"paint":{"type":"paint"},"paint.*":{"type":"paint"}},"layout":["layout_fill","layout_line","layout_circle","layout_fill-extrusion","layout_symbol","layout_raster","layout_background"],"layout_background":{"visibility":{"type":"enum","values":{"visible":{},"none":{}},"default":"visible"}},"layout_fill":{"visibility":{"type":"enum","values":{"visible":{},"none":{}},"default":"visible"}},"layout_circle":{"visibility":{"type":"enum","values":{"visible":{},"none":{}},"default":"visible"}},"layout_fill-extrusion":{"visibility":{"type":"enum","values":{"visible":{},"none":{}},"default":"visible"}},"layout_line":{"line-cap":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"butt":{},"round":{},"square":{}},"default":"butt"},"line-join":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"bevel":{},"round":{},"miter":{}},"default":"miter"},"line-miter-limit":{"type":"number","default":2,"function":"interpolated","zoom-function":true,"requires":[{"line-join":"miter"}]},"line-round-limit":{"type":"number","default":1.05,"function":"interpolated","zoom-function":true,"requires":[{"line-join":"round"}]},"visibility":{"type":"enum","values":{"visible":{},"none":{}},"default":"visible"}},"layout_symbol":{"symbol-placement":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"point":{},"line":{}},"default":"point"},"symbol-spacing":{"type":"number","default":250,"minimum":1,"function":"interpolated","zoom-function":true,"units":"pixels","requires":[{"symbol-placement":"line"}]},"symbol-avoid-edges":{"type":"boolean","function":"piecewise-constant","zoom-function":true,"default":false},"icon-allow-overlap":{"type":"boolean","function":"piecewise-constant","zoom-function":true,"default":false,"requires":["icon-image"]},"icon-ignore-placement":{"type":"boolean","function":"piecewise-constant","zoom-function":true,"default":false,"requires":["icon-image"]},"icon-optional":{"type":"boolean","function":"piecewise-constant","zoom-function":true,"default":false,"requires":["icon-image","text-field"]},"icon-rotation-alignment":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"map":{},"viewport":{},"auto":{}},"default":"auto","requires":["icon-image"]},"icon-size":{"type":"number","default":1,"minimum":0,"function":"interpolated","zoom-function":true,"requires":["icon-image"]},"icon-text-fit":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"none":{},"width":{},"height":{},"both":{}},"default":"none","requires":["icon-image","text-field"]},"icon-text-fit-padding":{"type":"array","value":"number","length":4,"default":[0,0,0,0],"units":"pixels","function":"interpolated","zoom-function":true,"requires":["icon-image","text-field",{"icon-text-fit":["both","width","height"]}]},"icon-image":{"type":"string","function":"piecewise-constant","zoom-function":true,"tokens":true},"icon-rotate":{"type":"number","default":0,"period":360,"function":"interpolated","zoom-function":true,"property-function":true,"units":"degrees","requires":["icon-image"]},"icon-padding":{"type":"number","default":2,"minimum":0,"function":"interpolated","zoom-function":true,"units":"pixels","requires":["icon-image"]},"icon-keep-upright":{"type":"boolean","function":"piecewise-constant","zoom-function":true,"default":false,"requires":["icon-image",{"icon-rotation-alignment":"map"},{"symbol-placement":"line"}]},"icon-offset":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","zoom-function":true,"property-function":true,"requires":["icon-image"]},"text-pitch-alignment":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"map":{},"viewport":{},"auto":{}},"default":"auto","requires":["text-field"]},"text-rotation-alignment":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"map":{},"viewport":{},"auto":{}},"default":"auto","requires":["text-field"]},"text-field":{"type":"string","function":"piecewise-constant","zoom-function":true,"default":"","tokens":true},"text-font":{"type":"array","value":"string","function":"piecewise-constant","zoom-function":true,"default":["Open Sans Regular","Arial Unicode MS Regular"],"requires":["text-field"]},"text-size":{"type":"number","default":16,"minimum":0,"units":"pixels","function":"interpolated","zoom-function":true,"requires":["text-field"]},"text-max-width":{"type":"number","default":10,"minimum":0,"units":"ems","function":"interpolated","zoom-function":true,"requires":["text-field"]},"text-line-height":{"type":"number","default":1.2,"units":"ems","function":"interpolated","zoom-function":true,"requires":["text-field"]},"text-letter-spacing":{"type":"number","default":0,"units":"ems","function":"interpolated","zoom-function":true,"requires":["text-field"]},"text-justify":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"left":{},"center":{},"right":{}},"default":"center","requires":["text-field"]},"text-anchor":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"center":{},"left":{},"right":{},"top":{},"bottom":{},"top-left":{},"top-right":{},"bottom-left":{},"bottom-right":{}},"default":"center","requires":["text-field"]},"text-max-angle":{"type":"number","default":45,"units":"degrees","function":"interpolated","zoom-function":true,"requires":["text-field",{"symbol-placement":"line"}]},"text-rotate":{"type":"number","default":0,"period":360,"units":"degrees","function":"interpolated","zoom-function":true,"requires":["text-field"]},"text-padding":{"type":"number","default":2,"minimum":0,"units":"pixels","function":"interpolated","zoom-function":true,"requires":["text-field"]},"text-keep-upright":{"type":"boolean","function":"piecewise-constant","zoom-function":true,"default":true,"requires":["text-field",{"text-rotation-alignment":"map"},{"symbol-placement":"line"}]},"text-transform":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"none":{},"uppercase":{},"lowercase":{}},"default":"none","requires":["text-field"]},"text-offset":{"type":"array","value":"number","units":"ems","function":"interpolated","zoom-function":true,"length":2,"default":[0,0],"requires":["text-field"]},"text-allow-overlap":{"type":"boolean","function":"piecewise-constant","zoom-function":true,"default":false,"requires":["text-field"]},"text-ignore-placement":{"type":"boolean","function":"piecewise-constant","zoom-function":true,"default":false,"requires":["text-field"]},"text-optional":{"type":"boolean","function":"piecewise-constant","zoom-function":true,"default":false,"requires":["text-field","icon-image"]},"visibility":{"type":"enum","values":{"visible":{},"none":{}},"default":"visible"}},"layout_raster":{"visibility":{"type":"enum","values":{"visible":{},"none":{}},"default":"visible"}},"filter":{"type":"array","value":"*"},"filter_operator":{"type":"enum","values":{"==":{},"!=":{},">":{},">=":{},"<":{},"<=":{},"in":{},"!in":{},"all":{},"any":{},"none":{},"has":{},"!has":{}}},"geometry_type":{"type":"enum","values":{"Point":{},"LineString":{},"Polygon":{}}},"function":{"stops":{"type":"array","value":"function_stop"},"base":{"type":"number","default":1,"minimum":0},"property":{"type":"string","default":"$zoom"},"type":{"type":"enum","values":{"identity":{},"exponential":{},"interval":{},"categorical":{}},"default":"exponential"},"colorSpace":{"type":"enum","values":{"rgb":{},"lab":{},"hcl":{}},"default":"rgb"}},"function_stop":{"type":"array","minimum":0,"maximum":22,"value":["number","color"],"length":2},"light":{"anchor":{"type":"enum","default":"viewport","values":{"map":{},"viewport":{}},"transition":false},"position":{"type":"array","default":[1.15,210,30],"length":3,"value":"number","transition":true,"function":"interpolated","zoom-function":true,"property-function":false},"color":{"type":"color","default":"#ffffff","function":"interpolated","zoom-function":true,"property-function":false,"transition":true},"intensity":{"type":"number","default":0.5,"minimum":0,"maximum":1,"function":"interpolated","zoom-function":true,"property-function":false,"transition":true}},"paint":["paint_fill","paint_line","paint_circle","paint_fill-extrusion","paint_symbol","paint_raster","paint_background"],"paint_fill":{"fill-antialias":{"type":"boolean","function":"piecewise-constant","zoom-function":true,"default":true},"fill-opacity":{"type":"number","function":"interpolated","zoom-function":true,"property-function":true,"default":1,"minimum":0,"maximum":1,"transition":true},"fill-color":{"type":"color","default":"#000000","function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"requires":[{"!":"fill-pattern"}]},"fill-outline-color":{"type":"color","function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"requires":[{"!":"fill-pattern"},{"fill-antialias":true}]},"fill-translate":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","zoom-function":true,"transition":true,"units":"pixels"},"fill-translate-anchor":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"map":{},"viewport":{}},"default":"map","requires":["fill-translate"]},"fill-pattern":{"type":"string","function":"piecewise-constant","zoom-function":true,"transition":true}},"paint_fill-extrusion":{"fill-extrusion-opacity":{"type":"number","function":"interpolated","zoom-function":true,"property-function":false,"default":1,"minimum":0,"maximum":1,"transition":true},"fill-extrusion-color":{"type":"color","default":"#000000","function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"requires":[{"!":"fill-extrusion-pattern"}]},"fill-extrusion-translate":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","zoom-function":true,"transition":true,"units":"pixels"},"fill-extrusion-translate-anchor":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"map":{},"viewport":{}},"default":"map","requires":["fill-extrusion-translate"]},"fill-extrusion-pattern":{"type":"string","function":"piecewise-constant","zoom-function":true,"transition":true},"fill-extrusion-height":{"type":"number","function":"interpolated","zoom-function":true,"property-function":true,"default":0,"minimum":0,"units":"meters","transition":true},"fill-extrusion-base":{"type":"number","function":"interpolated","zoom-function":true,"property-function":true,"default":0,"minimum":0,"units":"meters","transition":true,"requires":["fill-extrusion-height"]}},"paint_line":{"line-opacity":{"type":"number","function":"interpolated","zoom-function":true,"property-function":true,"default":1,"minimum":0,"maximum":1,"transition":true},"line-color":{"type":"color","default":"#000000","function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"requires":[{"!":"line-pattern"}]},"line-translate":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","zoom-function":true,"transition":true,"units":"pixels"},"line-translate-anchor":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"map":{},"viewport":{}},"default":"map","requires":["line-translate"]},"line-width":{"type":"number","default":1,"minimum":0,"function":"interpolated","zoom-function":true,"transition":true,"units":"pixels"},"line-gap-width":{"type":"number","default":0,"minimum":0,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"units":"pixels"},"line-offset":{"type":"number","default":0,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"units":"pixels"},"line-blur":{"type":"number","default":0,"minimum":0,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"units":"pixels"},"line-dasharray":{"type":"array","value":"number","function":"piecewise-constant","zoom-function":true,"minimum":0,"transition":true,"units":"line widths","requires":[{"!":"line-pattern"}]},"line-pattern":{"type":"string","function":"piecewise-constant","zoom-function":true,"transition":true}},"paint_circle":{"circle-radius":{"type":"number","default":5,"minimum":0,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"units":"pixels"},"circle-color":{"type":"color","default":"#000000","function":"interpolated","zoom-function":true,"property-function":true,"transition":true},"circle-blur":{"type":"number","default":0,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true},"circle-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true},"circle-translate":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","zoom-function":true,"transition":true,"units":"pixels"},"circle-translate-anchor":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"map":{},"viewport":{}},"default":"map","requires":["circle-translate"]},"circle-pitch-scale":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"map":{},"viewport":{}},"default":"map"},"circle-stroke-width":{"type":"number","default":0,"minimum":0,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"units":"pixels"},"circle-stroke-color":{"type":"color","default":"#000000","function":"interpolated","zoom-function":true,"property-function":true,"transition":true},"circle-stroke-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true}},"paint_symbol":{"icon-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"function":"interpolated","zoom-function":true,"transition":true,"requires":["icon-image"]},"icon-color":{"type":"color","default":"#000000","function":"interpolated","zoom-function":true,"transition":true,"requires":["icon-image"]},"icon-halo-color":{"type":"color","default":"rgba(0, 0, 0, 0)","function":"interpolated","zoom-function":true,"transition":true,"requires":["icon-image"]},"icon-halo-width":{"type":"number","default":0,"minimum":0,"function":"interpolated","zoom-function":true,"transition":true,"units":"pixels","requires":["icon-image"]},"icon-halo-blur":{"type":"number","default":0,"minimum":0,"function":"interpolated","zoom-function":true,"transition":true,"units":"pixels","requires":["icon-image"]},"icon-translate":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","zoom-function":true,"transition":true,"units":"pixels","requires":["icon-image"]},"icon-translate-anchor":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"map":{},"viewport":{}},"default":"map","requires":["icon-image","icon-translate"]},"text-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"function":"interpolated","zoom-function":true,"transition":true,"requires":["text-field"]},"text-color":{"type":"color","default":"#000000","function":"interpolated","zoom-function":true,"transition":true,"requires":["text-field"]},"text-halo-color":{"type":"color","default":"rgba(0, 0, 0, 0)","function":"interpolated","zoom-function":true,"transition":true,"requires":["text-field"]},"text-halo-width":{"type":"number","default":0,"minimum":0,"function":"interpolated","zoom-function":true,"transition":true,"units":"pixels","requires":["text-field"]},"text-halo-blur":{"type":"number","default":0,"minimum":0,"function":"interpolated","zoom-function":true,"transition":true,"units":"pixels","requires":["text-field"]},"text-translate":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","zoom-function":true,"transition":true,"units":"pixels","requires":["text-field"]},"text-translate-anchor":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"map":{},"viewport":{}},"default":"map","requires":["text-field","text-translate"]}},"paint_raster":{"raster-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"function":"interpolated","zoom-function":true,"transition":true},"raster-hue-rotate":{"type":"number","default":0,"period":360,"function":"interpolated","zoom-function":true,"transition":true,"units":"degrees"},"raster-brightness-min":{"type":"number","function":"interpolated","zoom-function":true,"default":0,"minimum":0,"maximum":1,"transition":true},"raster-brightness-max":{"type":"number","function":"interpolated","zoom-function":true,"default":1,"minimum":0,"maximum":1,"transition":true},"raster-saturation":{"type":"number","default":0,"minimum":-1,"maximum":1,"function":"interpolated","zoom-function":true,"transition":true},"raster-contrast":{"type":"number","default":0,"minimum":-1,"maximum":1,"function":"interpolated","zoom-function":true,"transition":true},"raster-fade-duration":{"type":"number","default":300,"minimum":0,"function":"interpolated","zoom-function":true,"transition":true,"units":"milliseconds"}},"paint_background":{"background-color":{"type":"color","default":"#000000","function":"interpolated","zoom-function":true,"transition":true,"requires":[{"!":"background-pattern"}]},"background-pattern":{"type":"string","function":"piecewise-constant","zoom-function":true,"transition":true},"background-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"function":"interpolated","zoom-function":true,"transition":true}},"transition":{"duration":{"type":"number","default":300,"minimum":0,"units":"milliseconds"},"delay":{"type":"number","default":0,"minimum":0,"units":"milliseconds"}}} +},{}],194:[function(require,module,exports){ +'use strict'; + +if (typeof module !== 'undefined' && module.exports) { + module.exports = isSupported; +} else if (window) { + window.mapboxgl = window.mapboxgl || {}; + window.mapboxgl.supported = isSupported; +} + +/** + * Test whether the current browser supports Mapbox GL JS + * @param {Object} options + * @param {boolean} [options.failIfMajorPerformanceCaveat=false] Return `false` + * if the performance of Mapbox GL JS would be dramatically worse than + * expected (i.e. a software renderer is would be used) + * @return {boolean} + */ +function isSupported(options) { + return !!( + isBrowser() && + isArraySupported() && + isFunctionSupported() && + isObjectSupported() && + isJSONSupported() && + isWorkerSupported() && + isUint8ClampedArraySupported() && + isWebGLSupportedCached(options && options.failIfMajorPerformanceCaveat) + ); +} + +function isBrowser() { + return typeof window !== 'undefined' && typeof document !== 'undefined'; +} + +function isArraySupported() { + return ( + Array.prototype && + Array.prototype.every && + Array.prototype.filter && + Array.prototype.forEach && + Array.prototype.indexOf && + Array.prototype.lastIndexOf && + Array.prototype.map && + Array.prototype.some && + Array.prototype.reduce && + Array.prototype.reduceRight && + Array.isArray + ); +} + +function isFunctionSupported() { + return Function.prototype && Function.prototype.bind; +} + +function isObjectSupported() { + return ( + Object.keys && + Object.create && + Object.getPrototypeOf && + Object.getOwnPropertyNames && + Object.isSealed && + Object.isFrozen && + Object.isExtensible && + Object.getOwnPropertyDescriptor && + Object.defineProperty && + Object.defineProperties && + Object.seal && + Object.freeze && + Object.preventExtensions + ); +} + +function isJSONSupported() { + return 'JSON' in window && 'parse' in JSON && 'stringify' in JSON; +} + +function isWorkerSupported() { + return 'Worker' in window; +} + +// IE11 only supports `Uint8ClampedArray` as of version +// [KB2929437](https://support.microsoft.com/en-us/kb/2929437) +function isUint8ClampedArraySupported() { + return 'Uint8ClampedArray' in window; +} + +var isWebGLSupportedCache = {}; +function isWebGLSupportedCached(failIfMajorPerformanceCaveat) { + + if (isWebGLSupportedCache[failIfMajorPerformanceCaveat] === undefined) { + isWebGLSupportedCache[failIfMajorPerformanceCaveat] = isWebGLSupported(failIfMajorPerformanceCaveat); + } + + return isWebGLSupportedCache[failIfMajorPerformanceCaveat]; +} + +isSupported.webGLContextAttributes = { + antialias: false, + alpha: true, + stencil: true, + depth: true +}; + +function isWebGLSupported(failIfMajorPerformanceCaveat) { + + var canvas = document.createElement('canvas'); + + var attributes = Object.create(isSupported.webGLContextAttributes); + attributes.failIfMajorPerformanceCaveat = failIfMajorPerformanceCaveat; + + if (canvas.probablySupportsContext) { + return ( + canvas.probablySupportsContext('webgl', attributes) || + canvas.probablySupportsContext('experimental-webgl', attributes) + ); + + } else if (canvas.supportsContext) { + return ( + canvas.supportsContext('webgl', attributes) || + canvas.supportsContext('experimental-webgl', attributes) + ); + + } else { + return ( + canvas.getContext('webgl', attributes) || + canvas.getContext('experimental-webgl', attributes) + ); + } +} + +},{}],195:[function(require,module,exports){ +(function (process){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +// resolves . and .. elements in a path array with directory names there +// must be no slashes, empty elements, or device names (c:\) in the array +// (so also no leading and trailing slashes - it does not distinguish +// relative and absolute paths) +function normalizeArray(parts, allowAboveRoot) { + // if the path tries to go above the root, `up` ends up > 0 + var up = 0; + for (var i = parts.length - 1; i >= 0; i--) { + var last = parts[i]; + if (last === '.') { + parts.splice(i, 1); + } else if (last === '..') { + parts.splice(i, 1); + up++; + } else if (up) { + parts.splice(i, 1); + up--; + } + } + + // if the path is allowed to go above the root, restore leading ..s + if (allowAboveRoot) { + for (; up--; up) { + parts.unshift('..'); + } + } + + return parts; +} + +// Split a filename into [root, dir, basename, ext], unix version +// 'root' is just a slash, or nothing. +var splitPathRe = + /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/; +var splitPath = function(filename) { + return splitPathRe.exec(filename).slice(1); +}; + +// path.resolve([from ...], to) +// posix version +exports.resolve = function() { + var resolvedPath = '', + resolvedAbsolute = false; + + for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) { + var path = (i >= 0) ? arguments[i] : process.cwd(); + + // Skip empty and invalid entries + if (typeof path !== 'string') { + throw new TypeError('Arguments to path.resolve must be strings'); + } else if (!path) { + continue; + } + + resolvedPath = path + '/' + resolvedPath; + resolvedAbsolute = path.charAt(0) === '/'; + } + + // At this point the path should be resolved to a full absolute path, but + // handle relative paths to be safe (might happen when process.cwd() fails) + + // Normalize the path + resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) { + return !!p; + }), !resolvedAbsolute).join('/'); + + return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.'; +}; + +// path.normalize(path) +// posix version +exports.normalize = function(path) { + var isAbsolute = exports.isAbsolute(path), + trailingSlash = substr(path, -1) === '/'; + + // Normalize the path + path = normalizeArray(filter(path.split('/'), function(p) { + return !!p; + }), !isAbsolute).join('/'); + + if (!path && !isAbsolute) { + path = '.'; + } + if (path && trailingSlash) { + path += '/'; + } + + return (isAbsolute ? '/' : '') + path; +}; + +// posix version +exports.isAbsolute = function(path) { + return path.charAt(0) === '/'; +}; + +// posix version +exports.join = function() { + var paths = Array.prototype.slice.call(arguments, 0); + return exports.normalize(filter(paths, function(p, index) { + if (typeof p !== 'string') { + throw new TypeError('Arguments to path.join must be strings'); + } + return p; + }).join('/')); +}; + + +// path.relative(from, to) +// posix version +exports.relative = function(from, to) { + from = exports.resolve(from).substr(1); + to = exports.resolve(to).substr(1); + + function trim(arr) { + var start = 0; + for (; start < arr.length; start++) { + if (arr[start] !== '') break; + } + + var end = arr.length - 1; + for (; end >= 0; end--) { + if (arr[end] !== '') break; + } + + if (start > end) return []; + return arr.slice(start, end - start + 1); + } + + var fromParts = trim(from.split('/')); + var toParts = trim(to.split('/')); + + var length = Math.min(fromParts.length, toParts.length); + var samePartsLength = length; + for (var i = 0; i < length; i++) { + if (fromParts[i] !== toParts[i]) { + samePartsLength = i; + break; + } + } + + var outputParts = []; + for (var i = samePartsLength; i < fromParts.length; i++) { + outputParts.push('..'); + } + + outputParts = outputParts.concat(toParts.slice(samePartsLength)); + + return outputParts.join('/'); +}; + +exports.sep = '/'; +exports.delimiter = ':'; + +exports.dirname = function(path) { + var result = splitPath(path), + root = result[0], + dir = result[1]; + + if (!root && !dir) { + // No dirname whatsoever + return '.'; + } + + if (dir) { + // It has a dirname, strip trailing slash + dir = dir.substr(0, dir.length - 1); + } + + return root + dir; +}; + + +exports.basename = function(path, ext) { + var f = splitPath(path)[2]; + // TODO: make this comparison case-insensitive on windows? + if (ext && f.substr(-1 * ext.length) === ext) { + f = f.substr(0, f.length - ext.length); + } + return f; +}; + + +exports.extname = function(path) { + return splitPath(path)[3]; +}; + +function filter (xs, f) { + if (xs.filter) return xs.filter(f); + var res = []; + for (var i = 0; i < xs.length; i++) { + if (f(xs[i], i, xs)) res.push(xs[i]); + } + return res; +} + +// String.prototype.substr - negative index don't work in IE8 +var substr = 'ab'.substr(-1) === 'b' + ? function (str, start, len) { return str.substr(start, len) } + : function (str, start, len) { + if (start < 0) start = str.length + start; + return str.substr(start, len); + } +; + +}).call(this,require('_process')) + +},{"_process":199}],196:[function(require,module,exports){ +'use strict'; + +// lightweight Buffer shim for pbf browser build +// based on code from github.com/feross/buffer (MIT-licensed) + +module.exports = Buffer; + +var ieee754 = require('ieee754'); + +var BufferMethods; + +function Buffer(length) { + var arr; + if (length && length.length) { + arr = length; + length = arr.length; + } + var buf = new Uint8Array(length || 0); + if (arr) buf.set(arr); + + buf.readUInt32LE = BufferMethods.readUInt32LE; + buf.writeUInt32LE = BufferMethods.writeUInt32LE; + buf.readInt32LE = BufferMethods.readInt32LE; + buf.writeInt32LE = BufferMethods.writeInt32LE; + buf.readFloatLE = BufferMethods.readFloatLE; + buf.writeFloatLE = BufferMethods.writeFloatLE; + buf.readDoubleLE = BufferMethods.readDoubleLE; + buf.writeDoubleLE = BufferMethods.writeDoubleLE; + buf.toString = BufferMethods.toString; + buf.write = BufferMethods.write; + buf.slice = BufferMethods.slice; + buf.copy = BufferMethods.copy; + + buf._isBuffer = true; + return buf; +} + +var lastStr, lastStrEncoded; + +BufferMethods = { + readUInt32LE: function(pos) { + return ((this[pos]) | + (this[pos + 1] << 8) | + (this[pos + 2] << 16)) + + (this[pos + 3] * 0x1000000); + }, + + writeUInt32LE: function(val, pos) { + this[pos] = val; + this[pos + 1] = (val >>> 8); + this[pos + 2] = (val >>> 16); + this[pos + 3] = (val >>> 24); + }, + + readInt32LE: function(pos) { + return ((this[pos]) | + (this[pos + 1] << 8) | + (this[pos + 2] << 16)) + + (this[pos + 3] << 24); + }, + + readFloatLE: function(pos) { return ieee754.read(this, pos, true, 23, 4); }, + readDoubleLE: function(pos) { return ieee754.read(this, pos, true, 52, 8); }, + + writeFloatLE: function(val, pos) { return ieee754.write(this, val, pos, true, 23, 4); }, + writeDoubleLE: function(val, pos) { return ieee754.write(this, val, pos, true, 52, 8); }, + + toString: function(encoding, start, end) { + var str = '', + tmp = ''; + + start = start || 0; + end = Math.min(this.length, end || this.length); + + for (var i = start; i < end; i++) { + var ch = this[i]; + if (ch <= 0x7F) { + str += decodeURIComponent(tmp) + String.fromCharCode(ch); + tmp = ''; + } else { + tmp += '%' + ch.toString(16); + } + } + + str += decodeURIComponent(tmp); + + return str; + }, + + write: function(str, pos) { + var bytes = str === lastStr ? lastStrEncoded : encodeString(str); + for (var i = 0; i < bytes.length; i++) { + this[pos + i] = bytes[i]; + } + }, + + slice: function(start, end) { + return this.subarray(start, end); + }, + + copy: function(buf, pos) { + pos = pos || 0; + for (var i = 0; i < this.length; i++) { + buf[pos + i] = this[i]; + } + } +}; + +BufferMethods.writeInt32LE = BufferMethods.writeUInt32LE; + +Buffer.byteLength = function(str) { + lastStr = str; + lastStrEncoded = encodeString(str); + return lastStrEncoded.length; +}; + +Buffer.isBuffer = function(buf) { + return !!(buf && buf._isBuffer); +}; + +function encodeString(str) { + var length = str.length, + bytes = []; + + for (var i = 0, c, lead; i < length; i++) { + c = str.charCodeAt(i); // code point + + if (c > 0xD7FF && c < 0xE000) { + + if (lead) { + if (c < 0xDC00) { + bytes.push(0xEF, 0xBF, 0xBD); + lead = c; + continue; + + } else { + c = lead - 0xD800 << 10 | c - 0xDC00 | 0x10000; + lead = null; + } + + } else { + if (c > 0xDBFF || (i + 1 === length)) bytes.push(0xEF, 0xBF, 0xBD); + else lead = c; + + continue; + } + + } else if (lead) { + bytes.push(0xEF, 0xBF, 0xBD); + lead = null; + } + + if (c < 0x80) bytes.push(c); + else if (c < 0x800) bytes.push(c >> 0x6 | 0xC0, c & 0x3F | 0x80); + else if (c < 0x10000) bytes.push(c >> 0xC | 0xE0, c >> 0x6 & 0x3F | 0x80, c & 0x3F | 0x80); + else bytes.push(c >> 0x12 | 0xF0, c >> 0xC & 0x3F | 0x80, c >> 0x6 & 0x3F | 0x80, c & 0x3F | 0x80); + } + return bytes; +} + +},{"ieee754":151}],197:[function(require,module,exports){ +(function (global){ +'use strict'; + +module.exports = Pbf; + +var Buffer = global.Buffer || require('./buffer'); + +function Pbf(buf) { + this.buf = !Buffer.isBuffer(buf) ? new Buffer(buf || 0) : buf; + this.pos = 0; + this.length = this.buf.length; +} + +Pbf.Varint = 0; // varint: int32, int64, uint32, uint64, sint32, sint64, bool, enum +Pbf.Fixed64 = 1; // 64-bit: double, fixed64, sfixed64 +Pbf.Bytes = 2; // length-delimited: string, bytes, embedded messages, packed repeated fields +Pbf.Fixed32 = 5; // 32-bit: float, fixed32, sfixed32 + +var SHIFT_LEFT_32 = (1 << 16) * (1 << 16), + SHIFT_RIGHT_32 = 1 / SHIFT_LEFT_32, + POW_2_63 = Math.pow(2, 63); + +Pbf.prototype = { + + destroy: function() { + this.buf = null; + }, + + // === READING ================================================================= + + readFields: function(readField, result, end) { + end = end || this.length; + + while (this.pos < end) { + var val = this.readVarint(), + tag = val >> 3, + startPos = this.pos; + + readField(tag, result, this); + + if (this.pos === startPos) this.skip(val); + } + return result; + }, + + readMessage: function(readField, result) { + return this.readFields(readField, result, this.readVarint() + this.pos); + }, + + readFixed32: function() { + var val = this.buf.readUInt32LE(this.pos); + this.pos += 4; + return val; + }, + + readSFixed32: function() { + var val = this.buf.readInt32LE(this.pos); + this.pos += 4; + return val; + }, + + // 64-bit int handling is based on github.com/dpw/node-buffer-more-ints (MIT-licensed) + + readFixed64: function() { + var val = this.buf.readUInt32LE(this.pos) + this.buf.readUInt32LE(this.pos + 4) * SHIFT_LEFT_32; + this.pos += 8; + return val; + }, + + readSFixed64: function() { + var val = this.buf.readUInt32LE(this.pos) + this.buf.readInt32LE(this.pos + 4) * SHIFT_LEFT_32; + this.pos += 8; + return val; + }, + + readFloat: function() { + var val = this.buf.readFloatLE(this.pos); + this.pos += 4; + return val; + }, + + readDouble: function() { + var val = this.buf.readDoubleLE(this.pos); + this.pos += 8; + return val; + }, + + readVarint: function() { + var buf = this.buf, + val, b; + + b = buf[this.pos++]; val = b & 0x7f; if (b < 0x80) return val; + b = buf[this.pos++]; val |= (b & 0x7f) << 7; if (b < 0x80) return val; + b = buf[this.pos++]; val |= (b & 0x7f) << 14; if (b < 0x80) return val; + b = buf[this.pos++]; val |= (b & 0x7f) << 21; if (b < 0x80) return val; + + return readVarintRemainder(val, this); + }, + + readVarint64: function() { + var startPos = this.pos, + val = this.readVarint(); + + if (val < POW_2_63) return val; + + var pos = this.pos - 2; + while (this.buf[pos] === 0xff) pos--; + if (pos < startPos) pos = startPos; + + val = 0; + for (var i = 0; i < pos - startPos + 1; i++) { + var b = ~this.buf[startPos + i] & 0x7f; + val += i < 4 ? b << i * 7 : b * Math.pow(2, i * 7); + } + + return -val - 1; + }, + + readSVarint: function() { + var num = this.readVarint(); + return num % 2 === 1 ? (num + 1) / -2 : num / 2; // zigzag encoding + }, + + readBoolean: function() { + return Boolean(this.readVarint()); + }, + + readString: function() { + var end = this.readVarint() + this.pos, + str = this.buf.toString('utf8', this.pos, end); + this.pos = end; + return str; + }, + + readBytes: function() { + var end = this.readVarint() + this.pos, + buffer = this.buf.slice(this.pos, end); + this.pos = end; + return buffer; + }, + + // verbose for performance reasons; doesn't affect gzipped size + + readPackedVarint: function() { + var end = this.readVarint() + this.pos, arr = []; + while (this.pos < end) arr.push(this.readVarint()); + return arr; + }, + readPackedSVarint: function() { + var end = this.readVarint() + this.pos, arr = []; + while (this.pos < end) arr.push(this.readSVarint()); + return arr; + }, + readPackedBoolean: function() { + var end = this.readVarint() + this.pos, arr = []; + while (this.pos < end) arr.push(this.readBoolean()); + return arr; + }, + readPackedFloat: function() { + var end = this.readVarint() + this.pos, arr = []; + while (this.pos < end) arr.push(this.readFloat()); + return arr; + }, + readPackedDouble: function() { + var end = this.readVarint() + this.pos, arr = []; + while (this.pos < end) arr.push(this.readDouble()); + return arr; + }, + readPackedFixed32: function() { + var end = this.readVarint() + this.pos, arr = []; + while (this.pos < end) arr.push(this.readFixed32()); + return arr; + }, + readPackedSFixed32: function() { + var end = this.readVarint() + this.pos, arr = []; + while (this.pos < end) arr.push(this.readSFixed32()); + return arr; + }, + readPackedFixed64: function() { + var end = this.readVarint() + this.pos, arr = []; + while (this.pos < end) arr.push(this.readFixed64()); + return arr; + }, + readPackedSFixed64: function() { + var end = this.readVarint() + this.pos, arr = []; + while (this.pos < end) arr.push(this.readSFixed64()); + return arr; + }, + + skip: function(val) { + var type = val & 0x7; + if (type === Pbf.Varint) while (this.buf[this.pos++] > 0x7f) {} + else if (type === Pbf.Bytes) this.pos = this.readVarint() + this.pos; + else if (type === Pbf.Fixed32) this.pos += 4; + else if (type === Pbf.Fixed64) this.pos += 8; + else throw new Error('Unimplemented type: ' + type); + }, + + // === WRITING ================================================================= + + writeTag: function(tag, type) { + this.writeVarint((tag << 3) | type); + }, + + realloc: function(min) { + var length = this.length || 16; + + while (length < this.pos + min) length *= 2; + + if (length !== this.length) { + var buf = new Buffer(length); + this.buf.copy(buf); + this.buf = buf; + this.length = length; + } + }, + + finish: function() { + this.length = this.pos; + this.pos = 0; + return this.buf.slice(0, this.length); + }, + + writeFixed32: function(val) { + this.realloc(4); + this.buf.writeUInt32LE(val, this.pos); + this.pos += 4; + }, + + writeSFixed32: function(val) { + this.realloc(4); + this.buf.writeInt32LE(val, this.pos); + this.pos += 4; + }, + + writeFixed64: function(val) { + this.realloc(8); + this.buf.writeInt32LE(val & -1, this.pos); + this.buf.writeUInt32LE(Math.floor(val * SHIFT_RIGHT_32), this.pos + 4); + this.pos += 8; + }, + + writeSFixed64: function(val) { + this.realloc(8); + this.buf.writeInt32LE(val & -1, this.pos); + this.buf.writeInt32LE(Math.floor(val * SHIFT_RIGHT_32), this.pos + 4); + this.pos += 8; + }, + + writeVarint: function(val) { + val = +val; + + if (val > 0xfffffff) { + writeBigVarint(val, this); + return; + } + + this.realloc(4); + + this.buf[this.pos++] = val & 0x7f | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return; + this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return; + this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return; + this.buf[this.pos++] = (val >>> 7) & 0x7f; + }, + + writeSVarint: function(val) { + this.writeVarint(val < 0 ? -val * 2 - 1 : val * 2); + }, + + writeBoolean: function(val) { + this.writeVarint(Boolean(val)); + }, + + writeString: function(str) { + str = String(str); + var bytes = Buffer.byteLength(str); + this.writeVarint(bytes); + this.realloc(bytes); + this.buf.write(str, this.pos); + this.pos += bytes; + }, + + writeFloat: function(val) { + this.realloc(4); + this.buf.writeFloatLE(val, this.pos); + this.pos += 4; + }, + + writeDouble: function(val) { + this.realloc(8); + this.buf.writeDoubleLE(val, this.pos); + this.pos += 8; + }, + + writeBytes: function(buffer) { + var len = buffer.length; + this.writeVarint(len); + this.realloc(len); + for (var i = 0; i < len; i++) this.buf[this.pos++] = buffer[i]; + }, + + writeRawMessage: function(fn, obj) { + this.pos++; // reserve 1 byte for short message length + + // write the message directly to the buffer and see how much was written + var startPos = this.pos; + fn(obj, this); + var len = this.pos - startPos; + + if (len >= 0x80) reallocForRawMessage(startPos, len, this); + + // finally, write the message length in the reserved place and restore the position + this.pos = startPos - 1; + this.writeVarint(len); + this.pos += len; + }, + + writeMessage: function(tag, fn, obj) { + this.writeTag(tag, Pbf.Bytes); + this.writeRawMessage(fn, obj); + }, + + writePackedVarint: function(tag, arr) { this.writeMessage(tag, writePackedVarint, arr); }, + writePackedSVarint: function(tag, arr) { this.writeMessage(tag, writePackedSVarint, arr); }, + writePackedBoolean: function(tag, arr) { this.writeMessage(tag, writePackedBoolean, arr); }, + writePackedFloat: function(tag, arr) { this.writeMessage(tag, writePackedFloat, arr); }, + writePackedDouble: function(tag, arr) { this.writeMessage(tag, writePackedDouble, arr); }, + writePackedFixed32: function(tag, arr) { this.writeMessage(tag, writePackedFixed32, arr); }, + writePackedSFixed32: function(tag, arr) { this.writeMessage(tag, writePackedSFixed32, arr); }, + writePackedFixed64: function(tag, arr) { this.writeMessage(tag, writePackedFixed64, arr); }, + writePackedSFixed64: function(tag, arr) { this.writeMessage(tag, writePackedSFixed64, arr); }, + + writeBytesField: function(tag, buffer) { + this.writeTag(tag, Pbf.Bytes); + this.writeBytes(buffer); + }, + writeFixed32Field: function(tag, val) { + this.writeTag(tag, Pbf.Fixed32); + this.writeFixed32(val); + }, + writeSFixed32Field: function(tag, val) { + this.writeTag(tag, Pbf.Fixed32); + this.writeSFixed32(val); + }, + writeFixed64Field: function(tag, val) { + this.writeTag(tag, Pbf.Fixed64); + this.writeFixed64(val); + }, + writeSFixed64Field: function(tag, val) { + this.writeTag(tag, Pbf.Fixed64); + this.writeSFixed64(val); + }, + writeVarintField: function(tag, val) { + this.writeTag(tag, Pbf.Varint); + this.writeVarint(val); + }, + writeSVarintField: function(tag, val) { + this.writeTag(tag, Pbf.Varint); + this.writeSVarint(val); + }, + writeStringField: function(tag, str) { + this.writeTag(tag, Pbf.Bytes); + this.writeString(str); + }, + writeFloatField: function(tag, val) { + this.writeTag(tag, Pbf.Fixed32); + this.writeFloat(val); + }, + writeDoubleField: function(tag, val) { + this.writeTag(tag, Pbf.Fixed64); + this.writeDouble(val); + }, + writeBooleanField: function(tag, val) { + this.writeVarintField(tag, Boolean(val)); + } +}; + +function readVarintRemainder(val, pbf) { + var buf = pbf.buf, b; + + b = buf[pbf.pos++]; val += (b & 0x7f) * 0x10000000; if (b < 0x80) return val; + b = buf[pbf.pos++]; val += (b & 0x7f) * 0x800000000; if (b < 0x80) return val; + b = buf[pbf.pos++]; val += (b & 0x7f) * 0x40000000000; if (b < 0x80) return val; + b = buf[pbf.pos++]; val += (b & 0x7f) * 0x2000000000000; if (b < 0x80) return val; + b = buf[pbf.pos++]; val += (b & 0x7f) * 0x100000000000000; if (b < 0x80) return val; + b = buf[pbf.pos++]; val += (b & 0x7f) * 0x8000000000000000; if (b < 0x80) return val; + + throw new Error('Expected varint not more than 10 bytes'); +} + +function writeBigVarint(val, pbf) { + pbf.realloc(10); + + var maxPos = pbf.pos + 10; + + while (val >= 1) { + if (pbf.pos >= maxPos) throw new Error('Given varint doesn\'t fit into 10 bytes'); + var b = val & 0xff; + pbf.buf[pbf.pos++] = b | (val >= 0x80 ? 0x80 : 0); + val /= 0x80; + } +} + +function reallocForRawMessage(startPos, len, pbf) { + var extraLen = + len <= 0x3fff ? 1 : + len <= 0x1fffff ? 2 : + len <= 0xfffffff ? 3 : Math.ceil(Math.log(len) / (Math.LN2 * 7)); + + // if 1 byte isn't enough for encoding message length, shift the data to the right + pbf.realloc(extraLen); + for (var i = pbf.pos - 1; i >= startPos; i--) pbf.buf[i + extraLen] = pbf.buf[i]; +} + +function writePackedVarint(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeVarint(arr[i]); } +function writePackedSVarint(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSVarint(arr[i]); } +function writePackedFloat(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeFloat(arr[i]); } +function writePackedDouble(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeDouble(arr[i]); } +function writePackedBoolean(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeBoolean(arr[i]); } +function writePackedFixed32(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeFixed32(arr[i]); } +function writePackedSFixed32(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed32(arr[i]); } +function writePackedFixed64(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeFixed64(arr[i]); } +function writePackedSFixed64(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed64(arr[i]); } + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{"./buffer":196}],198:[function(require,module,exports){ +'use strict'; + +module.exports = Point; + +function Point(x, y) { + this.x = x; + this.y = y; +} + +Point.prototype = { + clone: function() { return new Point(this.x, this.y); }, + + add: function(p) { return this.clone()._add(p); }, + sub: function(p) { return this.clone()._sub(p); }, + mult: function(k) { return this.clone()._mult(k); }, + div: function(k) { return this.clone()._div(k); }, + rotate: function(a) { return this.clone()._rotate(a); }, + matMult: function(m) { return this.clone()._matMult(m); }, + unit: function() { return this.clone()._unit(); }, + perp: function() { return this.clone()._perp(); }, + round: function() { return this.clone()._round(); }, + + mag: function() { + return Math.sqrt(this.x * this.x + this.y * this.y); + }, + + equals: function(p) { + return this.x === p.x && + this.y === p.y; + }, + + dist: function(p) { + return Math.sqrt(this.distSqr(p)); + }, + + distSqr: function(p) { + var dx = p.x - this.x, + dy = p.y - this.y; + return dx * dx + dy * dy; + }, + + angle: function() { + return Math.atan2(this.y, this.x); + }, + + angleTo: function(b) { + return Math.atan2(this.y - b.y, this.x - b.x); + }, + + angleWith: function(b) { + return this.angleWithSep(b.x, b.y); + }, + + // Find the angle of the two vectors, solving the formula for the cross product a x b = |a||b|sin(θ) for θ. + angleWithSep: function(x, y) { + return Math.atan2( + this.x * y - this.y * x, + this.x * x + this.y * y); + }, + + _matMult: function(m) { + var x = m[0] * this.x + m[1] * this.y, + y = m[2] * this.x + m[3] * this.y; + this.x = x; + this.y = y; + return this; + }, + + _add: function(p) { + this.x += p.x; + this.y += p.y; + return this; + }, + + _sub: function(p) { + this.x -= p.x; + this.y -= p.y; + return this; + }, + + _mult: function(k) { + this.x *= k; + this.y *= k; + return this; + }, + + _div: function(k) { + this.x /= k; + this.y /= k; + return this; + }, + + _unit: function() { + this._div(this.mag()); + return this; + }, + + _perp: function() { + var y = this.y; + this.y = this.x; + this.x = -y; + return this; + }, + + _rotate: function(angle) { + var cos = Math.cos(angle), + sin = Math.sin(angle), + x = cos * this.x - sin * this.y, + y = sin * this.x + cos * this.y; + this.x = x; + this.y = y; + return this; + }, + + _round: function() { + this.x = Math.round(this.x); + this.y = Math.round(this.y); + return this; + } +}; + +// constructs Point from an array if necessary +Point.convert = function (a) { + if (a instanceof Point) { + return a; + } + if (Array.isArray(a)) { + return new Point(a[0], a[1]); + } + return a; +}; + +},{}],199:[function(require,module,exports){ +// shim for using process in browser +var process = module.exports = {}; + +// cached from whatever global is present so that test runners that stub it +// don't break things. But we need to wrap it in a try catch in case it is +// wrapped in strict mode code which doesn't define any globals. It's inside a +// function because try/catches deoptimize in certain engines. + +var cachedSetTimeout; +var cachedClearTimeout; + +function defaultSetTimout() { + throw new Error('setTimeout has not been defined'); +} +function defaultClearTimeout () { + throw new Error('clearTimeout has not been defined'); +} +(function () { + try { + if (typeof setTimeout === 'function') { + cachedSetTimeout = setTimeout; + } else { + cachedSetTimeout = defaultSetTimout; + } + } catch (e) { + cachedSetTimeout = defaultSetTimout; + } + try { + if (typeof clearTimeout === 'function') { + cachedClearTimeout = clearTimeout; + } else { + cachedClearTimeout = defaultClearTimeout; + } + } catch (e) { + cachedClearTimeout = defaultClearTimeout; + } +} ()) +function runTimeout(fun) { + if (cachedSetTimeout === setTimeout) { + //normal enviroments in sane situations + return setTimeout(fun, 0); + } + // if setTimeout wasn't available but was latter defined + if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { + cachedSetTimeout = setTimeout; + return setTimeout(fun, 0); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedSetTimeout(fun, 0); + } catch(e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedSetTimeout.call(null, fun, 0); + } catch(e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error + return cachedSetTimeout.call(this, fun, 0); + } + } + + +} +function runClearTimeout(marker) { + if (cachedClearTimeout === clearTimeout) { + //normal enviroments in sane situations + return clearTimeout(marker); + } + // if clearTimeout wasn't available but was latter defined + if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { + cachedClearTimeout = clearTimeout; + return clearTimeout(marker); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedClearTimeout(marker); + } catch (e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedClearTimeout.call(null, marker); + } catch (e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. + // Some versions of I.E. have different rules for clearTimeout vs setTimeout + return cachedClearTimeout.call(this, marker); + } + } + + + +} +var queue = []; +var draining = false; +var currentQueue; +var queueIndex = -1; + +function cleanUpNextTick() { + if (!draining || !currentQueue) { + return; + } + draining = false; + if (currentQueue.length) { + queue = currentQueue.concat(queue); + } else { + queueIndex = -1; + } + if (queue.length) { + drainQueue(); + } +} + +function drainQueue() { + if (draining) { + return; + } + var timeout = runTimeout(cleanUpNextTick); + draining = true; + + var len = queue.length; + while(len) { + currentQueue = queue; + queue = []; + while (++queueIndex < len) { + if (currentQueue) { + currentQueue[queueIndex].run(); + } + } + queueIndex = -1; + len = queue.length; + } + currentQueue = null; + draining = false; + runClearTimeout(timeout); +} + +process.nextTick = function (fun) { + var args = new Array(arguments.length - 1); + if (arguments.length > 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + } + queue.push(new Item(fun, args)); + if (queue.length === 1 && !draining) { + runTimeout(drainQueue); + } +}; + +// v8 likes predictible objects +function Item(fun, array) { + this.fun = fun; + this.array = array; +} +Item.prototype.run = function () { + this.fun.apply(null, this.array); +}; +process.title = 'browser'; +process.browser = true; +process.env = {}; +process.argv = []; +process.version = ''; // empty string to avoid regexp issues +process.versions = {}; + +function noop() {} + +process.on = noop; +process.addListener = noop; +process.once = noop; +process.off = noop; +process.removeListener = noop; +process.removeAllListeners = noop; +process.emit = noop; + +process.binding = function (name) { + throw new Error('process.binding is not supported'); +}; + +process.cwd = function () { return '/' }; +process.chdir = function (dir) { + throw new Error('process.chdir is not supported'); +}; +process.umask = function() { return 0; }; + +},{}],200:[function(require,module,exports){ +'use strict'; + +module.exports = partialSort; + +// Floyd-Rivest selection algorithm: +// Rearrange items so that all items in the [left, k] range are smaller than all items in (k, right]; +// The k-th element will have the (k - left + 1)th smallest value in [left, right] + +function partialSort(arr, k, left, right, compare) { + left = left || 0; + right = right || (arr.length - 1); + compare = compare || defaultCompare; + + while (right > left) { + if (right - left > 600) { + var n = right - left + 1; + var m = k - left + 1; + var z = Math.log(n); + var s = 0.5 * Math.exp(2 * z / 3); + var sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1); + var newLeft = Math.max(left, Math.floor(k - m * s / n + sd)); + var newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd)); + partialSort(arr, k, newLeft, newRight, compare); + } + + var t = arr[k]; + var i = left; + var j = right; + + swap(arr, left, k); + if (compare(arr[right], t) > 0) swap(arr, left, right); + + while (i < j) { + swap(arr, i, j); + i++; + j--; + while (compare(arr[i], t) < 0) i++; + while (compare(arr[j], t) > 0) j--; + } + + if (compare(arr[left], t) === 0) swap(arr, left, j); + else { + j++; + swap(arr, j, right); + } + + if (j <= k) left = j + 1; + if (k <= j) right = j - 1; + } +} + +function swap(arr, i, j) { + var tmp = arr[i]; + arr[i] = arr[j]; + arr[j] = tmp; +} + +function defaultCompare(a, b) { + return a < b ? -1 : a > b ? 1 : 0; +} + +},{}],201:[function(require,module,exports){ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global.ShelfPack = factory()); +}(this, function () { + +/** + * Create a new ShelfPack bin allocator. + * + * Uses the Shelf Best Height Fit algorithm from + * http://clb.demon.fi/files/RectangleBinPack.pdf + * + * @class ShelfPack + * @param {number} [w=64] Initial width of the sprite + * @param {number} [h=64] Initial width of the sprite + * @param {Object} [options] + * @param {boolean} [options.autoResize=false] If `true`, the sprite will automatically grow + * @example + * var sprite = new ShelfPack(64, 64, { autoResize: false }); + */ +function ShelfPack(w, h, options) { + options = options || {}; + this.w = w || 64; + this.h = h || 64; + this.autoResize = !!options.autoResize; + this.shelves = []; + this.stats = {}; + this.count = function(h) { + this.stats[h] = (this.stats[h] | 0) + 1; + }; +} + +/** + * Batch pack multiple bins into the sprite. + * + * @param {Array} bins Array of requested bins - each object should have `width`, `height` (or `w`, `h`) properties + * @param {Object} [options] + * @param {boolean} [options.inPlace=false] If `true`, the supplied bin objects will be updated inplace with `x` and `y` properties + * @returns {Array} Array of allocated bins - each bin is an object with `x`, `y`, `w`, `h` properties + * @example + * var bins = [ + * { id: 'a', width: 12, height: 12 }, + * { id: 'b', width: 12, height: 16 }, + * { id: 'c', width: 12, height: 24 } + * ]; + * var results = sprite.pack(bins, { inPlace: false }); + */ +ShelfPack.prototype.pack = function(bins, options) { + bins = [].concat(bins); + options = options || {}; + + var results = [], + w, h, allocation; + + for (var i = 0; i < bins.length; i++) { + w = bins[i].w || bins[i].width; + h = bins[i].h || bins[i].height; + if (w && h) { + allocation = this.packOne(w, h); + if (!allocation) { + continue; + } + if (options.inPlace) { + bins[i].x = allocation.x; + bins[i].y = allocation.y; + } + results.push(allocation); + } + } + + // Shrink the width/height of the sprite to the bare minimum. + // Since shelf-pack doubles first width, then height when running out of shelf space + // this can result in fairly large unused space both in width and height if that happens + // towards the end of bin packing. + if (this.shelves.length > 0) { + var w2 = 0; + var h2 = 0; + + for (var j = 0; j < this.shelves.length; j++) { + var shelf = this.shelves[j]; + h2 += shelf.h; + w2 = Math.max(shelf.w - shelf.free, w2); + } + + this.resize(w2, h2); + } + + return results; +}; + +/** + * Pack a single bin into the sprite. + * + * @param {number} w Width of the bin to allocate + * @param {number} h Height of the bin to allocate + * @returns {Object} Allocated bin object with `x`, `y`, `w`, `h` properties, or `null` if allocation failed + * @example + * var results = sprite.packOne(12, 16); + */ +ShelfPack.prototype.packOne = function(w, h) { + var y = 0, + best = { shelf: -1, waste: Infinity }, + shelf, waste; + + // find the best shelf + for (var i = 0; i < this.shelves.length; i++) { + shelf = this.shelves[i]; + y += shelf.h; + + // exactly the right height with width to spare, pack it.. + if (h === shelf.h && w <= shelf.free) { + this.count(h); + return shelf.alloc(w, h); + } + // not enough height or width, skip it.. + if (h > shelf.h || w > shelf.free) { + continue; + } + // maybe enough height or width, minimize waste.. + if (h < shelf.h && w <= shelf.free) { + waste = shelf.h - h; + if (waste < best.waste) { + best.waste = waste; + best.shelf = i; + } + } + } + + if (best.shelf !== -1) { + shelf = this.shelves[best.shelf]; + this.count(h); + return shelf.alloc(w, h); + } + + // add shelf.. + if (h <= (this.h - y) && w <= this.w) { + shelf = new Shelf(y, this.w, h); + this.shelves.push(shelf); + this.count(h); + return shelf.alloc(w, h); + } + + // no more space.. + // If `autoResize` option is set, grow the sprite as follows: + // * double whichever sprite dimension is smaller (`w1` or `h1`) + // * if sprite dimensions are equal, grow width before height + // * accomodate very large bin requests (big `w` or `h`) + if (this.autoResize) { + var h1, h2, w1, w2; + + h1 = h2 = this.h; + w1 = w2 = this.w; + + if (w1 <= h1 || w > w1) { // grow width.. + w2 = Math.max(w, w1) * 2; + } + if (h1 < w1 || h > h1) { // grow height.. + h2 = Math.max(h, h1) * 2; + } + + this.resize(w2, h2); + return this.packOne(w, h); // retry + } + + return null; +}; + +/** + * Clear the sprite. + * + * @example + * sprite.clear(); + */ +ShelfPack.prototype.clear = function() { + this.shelves = []; + this.stats = {}; +}; + +/** + * Resize the sprite. + * + * @param {number} w Requested new sprite width + * @param {number} h Requested new sprite height + * @returns {boolean} `true` if resize succeeded, `false` if failed + * @example + * sprite.resize(256, 256); + */ +ShelfPack.prototype.resize = function(w, h) { + this.w = w; + this.h = h; + for (var i = 0; i < this.shelves.length; i++) { + this.shelves[i].resize(w); + } + return true; +}; + + + +/** + * Create a new Shelf. + * + * @private + * @class Shelf + * @param {number} y Top coordinate of the new shelf + * @param {number} w Width of the new shelf + * @param {number} h Height of the new shelf + * @example + * var shelf = new Shelf(64, 512, 24); + */ +function Shelf(y, w, h) { + this.x = 0; + this.y = y; + this.w = this.free = w; + this.h = h; +} + +/** + * Allocate a single bin into the shelf. + * + * @private + * @param {number} w Width of the bin to allocate + * @param {number} h Height of the bin to allocate + * @returns {Object} Allocated bin object with `x`, `y`, `w`, `h` properties, or `null` if allocation failed + * @example + * shelf.alloc(12, 16); + */ +Shelf.prototype.alloc = function(w, h) { + if (w > this.free || h > this.h) { + return null; + } + var x = this.x; + this.x += w; + this.free -= w; + return { x: x, y: this.y, w: w, h: h, width: w, height: h }; +}; + +/** + * Resize the shelf. + * + * @private + * @param {number} w Requested new width of the shelf + * @returns {boolean} true if resize succeeded, false if failed + * @example + * shelf.resize(512); + */ +Shelf.prototype.resize = function(w) { + this.free += (w - this.w); + this.w = w; + return true; +}; + +return ShelfPack; + +})); +},{}],202:[function(require,module,exports){ +'use strict'; + +var kdbush = require('kdbush'); + +module.exports = supercluster; + +function supercluster(options) { + return new SuperCluster(options); +} + +function SuperCluster(options) { + this.options = extend(Object.create(this.options), options); + this.trees = new Array(this.options.maxZoom + 1); +} + +SuperCluster.prototype = { + options: { + minZoom: 0, // min zoom to generate clusters on + maxZoom: 16, // max zoom level to cluster the points on + radius: 40, // cluster radius in pixels + extent: 512, // tile extent (radius is calculated relative to it) + nodeSize: 64, // size of the KD-tree leaf node, affects performance + log: false // whether to log timing info + }, + + load: function (points) { + var log = this.options.log; + + if (log) console.time('total time'); + + var timerId = 'prepare ' + points.length + ' points'; + if (log) console.time(timerId); + + this.points = points; + + // generate a cluster object for each point + var clusters = points.map(createPointCluster); + if (log) console.timeEnd(timerId); + + // cluster points on max zoom, then cluster the results on previous zoom, etc.; + // results in a cluster hierarchy across zoom levels + for (var z = this.options.maxZoom; z >= this.options.minZoom; z--) { + var now = +Date.now(); + + // index input points into a KD-tree + this.trees[z + 1] = kdbush(clusters, getX, getY, this.options.nodeSize, Float32Array); + + clusters = this._cluster(clusters, z); // create a new set of clusters for the zoom + + if (log) console.log('z%d: %d clusters in %dms', z, clusters.length, +Date.now() - now); + } + + // index top-level clusters + this.trees[this.options.minZoom] = kdbush(clusters, getX, getY, this.options.nodeSize, Float32Array); + + if (log) console.timeEnd('total time'); + + return this; + }, + + getClusters: function (bbox, zoom) { + var tree = this.trees[this._limitZoom(zoom)]; + var ids = tree.range(lngX(bbox[0]), latY(bbox[3]), lngX(bbox[2]), latY(bbox[1])); + var clusters = []; + for (var i = 0; i < ids.length; i++) { + var c = tree.points[ids[i]]; + clusters.push(c.id !== -1 ? this.points[c.id] : getClusterJSON(c)); + } + return clusters; + }, + + getTile: function (z, x, y) { + var tree = this.trees[this._limitZoom(z)]; + var z2 = Math.pow(2, z); + var extent = this.options.extent; + var r = this.options.radius; + var p = r / extent; + var top = (y - p) / z2; + var bottom = (y + 1 + p) / z2; + + var tile = { + features: [] + }; + + this._addTileFeatures( + tree.range((x - p) / z2, top, (x + 1 + p) / z2, bottom), + tree.points, x, y, z2, tile); + + if (x === 0) { + this._addTileFeatures( + tree.range(1 - p / z2, top, 1, bottom), + tree.points, z2, y, z2, tile); + } + if (x === z2 - 1) { + this._addTileFeatures( + tree.range(0, top, p / z2, bottom), + tree.points, -1, y, z2, tile); + } + + return tile.features.length ? tile : null; + }, + + _addTileFeatures: function (ids, points, x, y, z2, tile) { + for (var i = 0; i < ids.length; i++) { + var c = points[ids[i]]; + tile.features.push({ + type: 1, + geometry: [[ + Math.round(this.options.extent * (c.x * z2 - x)), + Math.round(this.options.extent * (c.y * z2 - y)) + ]], + tags: c.id !== -1 ? this.points[c.id].properties : getClusterProperties(c) + }); + } + }, + + _limitZoom: function (z) { + return Math.max(this.options.minZoom, Math.min(z, this.options.maxZoom + 1)); + }, + + _cluster: function (points, zoom) { + var clusters = []; + var r = this.options.radius / (this.options.extent * Math.pow(2, zoom)); + + // loop through each point + for (var i = 0; i < points.length; i++) { + var p = points[i]; + // if we've already visited the point at this zoom level, skip it + if (p.zoom <= zoom) continue; + p.zoom = zoom; + + // find all nearby points + var tree = this.trees[zoom + 1]; + var neighborIds = tree.within(p.x, p.y, r); + + var foundNeighbors = false; + var numPoints = p.numPoints; + var wx = p.x * numPoints; + var wy = p.y * numPoints; + + for (var j = 0; j < neighborIds.length; j++) { + var b = tree.points[neighborIds[j]]; + // filter out neighbors that are too far or already processed + if (zoom < b.zoom) { + foundNeighbors = true; + b.zoom = zoom; // save the zoom (so it doesn't get processed twice) + wx += b.x * b.numPoints; // accumulate coordinates for calculating weighted center + wy += b.y * b.numPoints; + numPoints += b.numPoints; + } + } + + clusters.push(foundNeighbors ? createCluster(wx / numPoints, wy / numPoints, numPoints, -1) : p); + } + + return clusters; + } +}; + +function createCluster(x, y, numPoints, id) { + return { + x: x, // weighted cluster center + y: y, + zoom: Infinity, // the last zoom the cluster was processed at + id: id, // index of the source feature in the original input array + numPoints: numPoints + }; +} + +function createPointCluster(p, i) { + var coords = p.geometry.coordinates; + return createCluster(lngX(coords[0]), latY(coords[1]), 1, i); +} + +function getClusterJSON(cluster) { + return { + type: 'Feature', + properties: getClusterProperties(cluster), + geometry: { + type: 'Point', + coordinates: [xLng(cluster.x), yLat(cluster.y)] + } + }; +} + +function getClusterProperties(cluster) { + var count = cluster.numPoints; + var abbrev = count >= 10000 ? Math.round(count / 1000) + 'k' : + count >= 1000 ? (Math.round(count / 100) / 10) + 'k' : count; + return { + cluster: true, + point_count: count, + point_count_abbreviated: abbrev + }; +} + +// longitude/latitude to spherical mercator in [0..1] range +function lngX(lng) { + return lng / 360 + 0.5; +} +function latY(lat) { + var sin = Math.sin(lat * Math.PI / 180), + y = (0.5 - 0.25 * Math.log((1 + sin) / (1 - sin)) / Math.PI); + return y < 0 ? 0 : + y > 1 ? 1 : y; +} + +// spherical mercator to longitude/latitude +function xLng(x) { + return (x - 0.5) * 360; +} +function yLat(y) { + var y2 = (180 - y * 360) * Math.PI / 180; + return 360 * Math.atan(Math.exp(y2)) / Math.PI - 90; +} + +function extend(dest, src) { + for (var id in src) dest[id] = src[id]; + return dest; +} + +function getX(p) { + return p.x; +} +function getY(p) { + return p.y; +} + +},{"kdbush":152}],203:[function(require,module,exports){ +'use strict'; + +module.exports = TinyQueue; + +function TinyQueue(data, compare) { + if (!(this instanceof TinyQueue)) return new TinyQueue(data, compare); + + this.data = data || []; + this.length = this.data.length; + this.compare = compare || defaultCompare; + + if (data) for (var i = Math.floor(this.length / 2); i >= 0; i--) this._down(i); +} + +function defaultCompare(a, b) { + return a < b ? -1 : a > b ? 1 : 0; +} + +TinyQueue.prototype = { + + push: function (item) { + this.data.push(item); + this.length++; + this._up(this.length - 1); + }, + + pop: function () { + var top = this.data[0]; + this.data[0] = this.data[this.length - 1]; + this.length--; + this.data.pop(); + this._down(0); + return top; + }, + + peek: function () { + return this.data[0]; + }, + + _up: function (pos) { + var data = this.data, + compare = this.compare; + + while (pos > 0) { + var parent = Math.floor((pos - 1) / 2); + if (compare(data[pos], data[parent]) < 0) { + swap(data, parent, pos); + pos = parent; + + } else break; + } + }, + + _down: function (pos) { + var data = this.data, + compare = this.compare, + len = this.length; + + while (true) { + var left = 2 * pos + 1, + right = left + 1, + min = pos; + + if (left < len && compare(data[left], data[min]) < 0) min = left; + if (right < len && compare(data[right], data[min]) < 0) min = right; + + if (min === pos) return; + + swap(data, min, pos); + pos = min; + } + } +}; + +function swap(data, i, j) { + var tmp = data[i]; + data[i] = data[j]; + data[j] = tmp; +} + +},{}],204:[function(require,module,exports){ +if (typeof Object.create === 'function') { + // implementation from standard node.js 'util' module + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }); + }; +} else { + // old school shim for old browsers + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + var TempCtor = function () {} + TempCtor.prototype = superCtor.prototype + ctor.prototype = new TempCtor() + ctor.prototype.constructor = ctor + } +} + +},{}],205:[function(require,module,exports){ +module.exports = function isBuffer(arg) { + return arg && typeof arg === 'object' + && typeof arg.copy === 'function' + && typeof arg.fill === 'function' + && typeof arg.readUInt8 === 'function'; +} +},{}],206:[function(require,module,exports){ +(function (process,global){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +var formatRegExp = /%[sdj%]/g; +exports.format = function(f) { + if (!isString(f)) { + var objects = []; + for (var i = 0; i < arguments.length; i++) { + objects.push(inspect(arguments[i])); + } + return objects.join(' '); + } + + var i = 1; + var args = arguments; + var len = args.length; + var str = String(f).replace(formatRegExp, function(x) { + if (x === '%%') return '%'; + if (i >= len) return x; + switch (x) { + case '%s': return String(args[i++]); + case '%d': return Number(args[i++]); + case '%j': + try { + return JSON.stringify(args[i++]); + } catch (_) { + return '[Circular]'; + } + default: + return x; + } + }); + for (var x = args[i]; i < len; x = args[++i]) { + if (isNull(x) || !isObject(x)) { + str += ' ' + x; + } else { + str += ' ' + inspect(x); + } + } + return str; +}; + + +// Mark that a method should not be used. +// Returns a modified function which warns once by default. +// If --no-deprecation is set, then it is a no-op. +exports.deprecate = function(fn, msg) { + // Allow for deprecating things in the process of starting up. + if (isUndefined(global.process)) { + return function() { + return exports.deprecate(fn, msg).apply(this, arguments); + }; + } + + if (process.noDeprecation === true) { + return fn; + } + + var warned = false; + function deprecated() { + if (!warned) { + if (process.throwDeprecation) { + throw new Error(msg); + } else if (process.traceDeprecation) { + console.trace(msg); + } else { + console.error(msg); + } + warned = true; + } + return fn.apply(this, arguments); + } + + return deprecated; +}; + + +var debugs = {}; +var debugEnviron; +exports.debuglog = function(set) { + if (isUndefined(debugEnviron)) + debugEnviron = process.env.NODE_DEBUG || ''; + set = set.toUpperCase(); + if (!debugs[set]) { + if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) { + var pid = process.pid; + debugs[set] = function() { + var msg = exports.format.apply(exports, arguments); + console.error('%s %d: %s', set, pid, msg); + }; + } else { + debugs[set] = function() {}; + } + } + return debugs[set]; +}; + + +/** + * Echos the value of a value. Trys to print the value out + * in the best way possible given the different types. + * + * @param {Object} obj The object to print out. + * @param {Object} opts Optional options object that alters the output. + */ +/* legacy: obj, showHidden, depth, colors*/ +function inspect(obj, opts) { + // default options + var ctx = { + seen: [], + stylize: stylizeNoColor + }; + // legacy... + if (arguments.length >= 3) ctx.depth = arguments[2]; + if (arguments.length >= 4) ctx.colors = arguments[3]; + if (isBoolean(opts)) { + // legacy... + ctx.showHidden = opts; + } else if (opts) { + // got an "options" object + exports._extend(ctx, opts); + } + // set default options + if (isUndefined(ctx.showHidden)) ctx.showHidden = false; + if (isUndefined(ctx.depth)) ctx.depth = 2; + if (isUndefined(ctx.colors)) ctx.colors = false; + if (isUndefined(ctx.customInspect)) ctx.customInspect = true; + if (ctx.colors) ctx.stylize = stylizeWithColor; + return formatValue(ctx, obj, ctx.depth); +} +exports.inspect = inspect; + + +// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics +inspect.colors = { + 'bold' : [1, 22], + 'italic' : [3, 23], + 'underline' : [4, 24], + 'inverse' : [7, 27], + 'white' : [37, 39], + 'grey' : [90, 39], + 'black' : [30, 39], + 'blue' : [34, 39], + 'cyan' : [36, 39], + 'green' : [32, 39], + 'magenta' : [35, 39], + 'red' : [31, 39], + 'yellow' : [33, 39] +}; + +// Don't use 'blue' not visible on cmd.exe +inspect.styles = { + 'special': 'cyan', + 'number': 'yellow', + 'boolean': 'yellow', + 'undefined': 'grey', + 'null': 'bold', + 'string': 'green', + 'date': 'magenta', + // "name": intentionally not styling + 'regexp': 'red' +}; + + +function stylizeWithColor(str, styleType) { + var style = inspect.styles[styleType]; + + if (style) { + return '\u001b[' + inspect.colors[style][0] + 'm' + str + + '\u001b[' + inspect.colors[style][1] + 'm'; + } else { + return str; + } +} + + +function stylizeNoColor(str, styleType) { + return str; +} + + +function arrayToHash(array) { + var hash = {}; + + array.forEach(function(val, idx) { + hash[val] = true; + }); + + return hash; +} + + +function formatValue(ctx, value, recurseTimes) { + // Provide a hook for user-specified inspect functions. + // Check that value is an object with an inspect function on it + if (ctx.customInspect && + value && + isFunction(value.inspect) && + // Filter out the util module, it's inspect function is special + value.inspect !== exports.inspect && + // Also filter out any prototype objects using the circular check. + !(value.constructor && value.constructor.prototype === value)) { + var ret = value.inspect(recurseTimes, ctx); + if (!isString(ret)) { + ret = formatValue(ctx, ret, recurseTimes); + } + return ret; + } + + // Primitive types cannot have properties + var primitive = formatPrimitive(ctx, value); + if (primitive) { + return primitive; + } + + // Look up the keys of the object. + var keys = Object.keys(value); + var visibleKeys = arrayToHash(keys); + + if (ctx.showHidden) { + keys = Object.getOwnPropertyNames(value); + } + + // IE doesn't make error fields non-enumerable + // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx + if (isError(value) + && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) { + return formatError(value); + } + + // Some type of object without properties can be shortcutted. + if (keys.length === 0) { + if (isFunction(value)) { + var name = value.name ? ': ' + value.name : ''; + return ctx.stylize('[Function' + name + ']', 'special'); + } + if (isRegExp(value)) { + return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); + } + if (isDate(value)) { + return ctx.stylize(Date.prototype.toString.call(value), 'date'); + } + if (isError(value)) { + return formatError(value); + } + } + + var base = '', array = false, braces = ['{', '}']; + + // Make Array say that they are Array + if (isArray(value)) { + array = true; + braces = ['[', ']']; + } + + // Make functions say that they are functions + if (isFunction(value)) { + var n = value.name ? ': ' + value.name : ''; + base = ' [Function' + n + ']'; + } + + // Make RegExps say that they are RegExps + if (isRegExp(value)) { + base = ' ' + RegExp.prototype.toString.call(value); + } + + // Make dates with properties first say the date + if (isDate(value)) { + base = ' ' + Date.prototype.toUTCString.call(value); + } + + // Make error with message first say the error + if (isError(value)) { + base = ' ' + formatError(value); + } + + if (keys.length === 0 && (!array || value.length == 0)) { + return braces[0] + base + braces[1]; + } + + if (recurseTimes < 0) { + if (isRegExp(value)) { + return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); + } else { + return ctx.stylize('[Object]', 'special'); + } + } + + ctx.seen.push(value); + + var output; + if (array) { + output = formatArray(ctx, value, recurseTimes, visibleKeys, keys); + } else { + output = keys.map(function(key) { + return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array); + }); + } + + ctx.seen.pop(); + + return reduceToSingleString(output, base, braces); +} + + +function formatPrimitive(ctx, value) { + if (isUndefined(value)) + return ctx.stylize('undefined', 'undefined'); + if (isString(value)) { + var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '') + .replace(/'/g, "\\'") + .replace(/\\"/g, '"') + '\''; + return ctx.stylize(simple, 'string'); + } + if (isNumber(value)) + return ctx.stylize('' + value, 'number'); + if (isBoolean(value)) + return ctx.stylize('' + value, 'boolean'); + // For some reason typeof null is "object", so special case here. + if (isNull(value)) + return ctx.stylize('null', 'null'); +} + + +function formatError(value) { + return '[' + Error.prototype.toString.call(value) + ']'; +} + + +function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { + var output = []; + for (var i = 0, l = value.length; i < l; ++i) { + if (hasOwnProperty(value, String(i))) { + output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, + String(i), true)); + } else { + output.push(''); + } + } + keys.forEach(function(key) { + if (!key.match(/^\d+$/)) { + output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, + key, true)); + } + }); + return output; +} + + +function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { + var name, str, desc; + desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] }; + if (desc.get) { + if (desc.set) { + str = ctx.stylize('[Getter/Setter]', 'special'); + } else { + str = ctx.stylize('[Getter]', 'special'); + } + } else { + if (desc.set) { + str = ctx.stylize('[Setter]', 'special'); + } + } + if (!hasOwnProperty(visibleKeys, key)) { + name = '[' + key + ']'; + } + if (!str) { + if (ctx.seen.indexOf(desc.value) < 0) { + if (isNull(recurseTimes)) { + str = formatValue(ctx, desc.value, null); + } else { + str = formatValue(ctx, desc.value, recurseTimes - 1); + } + if (str.indexOf('\n') > -1) { + if (array) { + str = str.split('\n').map(function(line) { + return ' ' + line; + }).join('\n').substr(2); + } else { + str = '\n' + str.split('\n').map(function(line) { + return ' ' + line; + }).join('\n'); + } + } + } else { + str = ctx.stylize('[Circular]', 'special'); + } + } + if (isUndefined(name)) { + if (array && key.match(/^\d+$/)) { + return str; + } + name = JSON.stringify('' + key); + if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { + name = name.substr(1, name.length - 2); + name = ctx.stylize(name, 'name'); + } else { + name = name.replace(/'/g, "\\'") + .replace(/\\"/g, '"') + .replace(/(^"|"$)/g, "'"); + name = ctx.stylize(name, 'string'); + } + } + + return name + ': ' + str; +} + + +function reduceToSingleString(output, base, braces) { + var numLinesEst = 0; + var length = output.reduce(function(prev, cur) { + numLinesEst++; + if (cur.indexOf('\n') >= 0) numLinesEst++; + return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1; + }, 0); + + if (length > 60) { + return braces[0] + + (base === '' ? '' : base + '\n ') + + ' ' + + output.join(',\n ') + + ' ' + + braces[1]; + } + + return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1]; +} + + +// NOTE: These type checking functions intentionally don't use `instanceof` +// because it is fragile and can be easily faked with `Object.create()`. +function isArray(ar) { + return Array.isArray(ar); +} +exports.isArray = isArray; + +function isBoolean(arg) { + return typeof arg === 'boolean'; +} +exports.isBoolean = isBoolean; + +function isNull(arg) { + return arg === null; +} +exports.isNull = isNull; + +function isNullOrUndefined(arg) { + return arg == null; +} +exports.isNullOrUndefined = isNullOrUndefined; + +function isNumber(arg) { + return typeof arg === 'number'; +} +exports.isNumber = isNumber; + +function isString(arg) { + return typeof arg === 'string'; +} +exports.isString = isString; + +function isSymbol(arg) { + return typeof arg === 'symbol'; +} +exports.isSymbol = isSymbol; + +function isUndefined(arg) { + return arg === void 0; +} +exports.isUndefined = isUndefined; + +function isRegExp(re) { + return isObject(re) && objectToString(re) === '[object RegExp]'; +} +exports.isRegExp = isRegExp; + +function isObject(arg) { + return typeof arg === 'object' && arg !== null; +} +exports.isObject = isObject; + +function isDate(d) { + return isObject(d) && objectToString(d) === '[object Date]'; +} +exports.isDate = isDate; + +function isError(e) { + return isObject(e) && + (objectToString(e) === '[object Error]' || e instanceof Error); +} +exports.isError = isError; + +function isFunction(arg) { + return typeof arg === 'function'; +} +exports.isFunction = isFunction; + +function isPrimitive(arg) { + return arg === null || + typeof arg === 'boolean' || + typeof arg === 'number' || + typeof arg === 'string' || + typeof arg === 'symbol' || // ES6 symbol + typeof arg === 'undefined'; +} +exports.isPrimitive = isPrimitive; + +exports.isBuffer = require('./support/isBuffer'); + +function objectToString(o) { + return Object.prototype.toString.call(o); +} + + +function pad(n) { + return n < 10 ? '0' + n.toString(10) : n.toString(10); +} + + +var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', + 'Oct', 'Nov', 'Dec']; + +// 26 Feb 16:19:34 +function timestamp() { + var d = new Date(); + var time = [pad(d.getHours()), + pad(d.getMinutes()), + pad(d.getSeconds())].join(':'); + return [d.getDate(), months[d.getMonth()], time].join(' '); +} + + +// log is just a thin wrapper to console.log that prepends a timestamp +exports.log = function() { + console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments)); +}; + + +/** + * Inherit the prototype methods from one constructor into another. + * + * The Function.prototype.inherits from lang.js rewritten as a standalone + * function (not on Function.prototype). NOTE: If this file is to be loaded + * during bootstrapping this function needs to be rewritten using some native + * functions as prototype setup using normal JavaScript does not work as + * expected during bootstrapping (see mirror.js in r114903). + * + * @param {function} ctor Constructor function which needs to inherit the + * prototype. + * @param {function} superCtor Constructor function to inherit prototype from. + */ +exports.inherits = require('inherits'); + +exports._extend = function(origin, add) { + // Don't do anything if add isn't an object + if (!add || !isObject(add)) return origin; + + var keys = Object.keys(add); + var i = keys.length; + while (i--) { + origin[keys[i]] = add[keys[i]]; + } + return origin; +}; + +function hasOwnProperty(obj, prop) { + return Object.prototype.hasOwnProperty.call(obj, prop); +} + +}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{"./support/isBuffer":205,"_process":199,"inherits":204}],207:[function(require,module,exports){ +module.exports.VectorTile = require('./lib/vectortile.js'); +module.exports.VectorTileFeature = require('./lib/vectortilefeature.js'); +module.exports.VectorTileLayer = require('./lib/vectortilelayer.js'); + +},{"./lib/vectortile.js":208,"./lib/vectortilefeature.js":209,"./lib/vectortilelayer.js":210}],208:[function(require,module,exports){ +'use strict'; + +var VectorTileLayer = require('./vectortilelayer'); + +module.exports = VectorTile; + +function VectorTile(pbf, end) { + this.layers = pbf.readFields(readTile, {}, end); +} + +function readTile(tag, layers, pbf) { + if (tag === 3) { + var layer = new VectorTileLayer(pbf, pbf.readVarint() + pbf.pos); + if (layer.length) layers[layer.name] = layer; + } +} + + +},{"./vectortilelayer":210}],209:[function(require,module,exports){ +'use strict'; + +var Point = require('point-geometry'); + +module.exports = VectorTileFeature; + +function VectorTileFeature(pbf, end, extent, keys, values) { + // Public + this.properties = {}; + this.extent = extent; + this.type = 0; + + // Private + this._pbf = pbf; + this._geometry = -1; + this._keys = keys; + this._values = values; + + pbf.readFields(readFeature, this, end); +} + +function readFeature(tag, feature, pbf) { + if (tag == 1) feature.id = pbf.readVarint(); + else if (tag == 2) readTag(pbf, feature); + else if (tag == 3) feature.type = pbf.readVarint(); + else if (tag == 4) feature._geometry = pbf.pos; +} + +function readTag(pbf, feature) { + var end = pbf.readVarint() + pbf.pos; + + while (pbf.pos < end) { + var key = feature._keys[pbf.readVarint()], + value = feature._values[pbf.readVarint()]; + feature.properties[key] = value; + } +} + +VectorTileFeature.types = ['Unknown', 'Point', 'LineString', 'Polygon']; + +VectorTileFeature.prototype.loadGeometry = function() { + var pbf = this._pbf; + pbf.pos = this._geometry; + + var end = pbf.readVarint() + pbf.pos, + cmd = 1, + length = 0, + x = 0, + y = 0, + lines = [], + line; + + while (pbf.pos < end) { + if (!length) { + var cmdLen = pbf.readVarint(); + cmd = cmdLen & 0x7; + length = cmdLen >> 3; + } + + length--; + + if (cmd === 1 || cmd === 2) { + x += pbf.readSVarint(); + y += pbf.readSVarint(); + + if (cmd === 1) { // moveTo + if (line) lines.push(line); + line = []; + } + + line.push(new Point(x, y)); + + } else if (cmd === 7) { + + // Workaround for https://github.com/mapbox/mapnik-vector-tile/issues/90 + if (line) { + line.push(line[0].clone()); // closePolygon + } + + } else { + throw new Error('unknown command ' + cmd); + } + } + + if (line) lines.push(line); + + return lines; +}; + +VectorTileFeature.prototype.bbox = function() { + var pbf = this._pbf; + pbf.pos = this._geometry; + + var end = pbf.readVarint() + pbf.pos, + cmd = 1, + length = 0, + x = 0, + y = 0, + x1 = Infinity, + x2 = -Infinity, + y1 = Infinity, + y2 = -Infinity; + + while (pbf.pos < end) { + if (!length) { + var cmdLen = pbf.readVarint(); + cmd = cmdLen & 0x7; + length = cmdLen >> 3; + } + + length--; + + if (cmd === 1 || cmd === 2) { + x += pbf.readSVarint(); + y += pbf.readSVarint(); + if (x < x1) x1 = x; + if (x > x2) x2 = x; + if (y < y1) y1 = y; + if (y > y2) y2 = y; + + } else if (cmd !== 7) { + throw new Error('unknown command ' + cmd); + } + } + + return [x1, y1, x2, y2]; +}; + +VectorTileFeature.prototype.toGeoJSON = function(x, y, z) { + var size = this.extent * Math.pow(2, z), + x0 = this.extent * x, + y0 = this.extent * y, + coords = this.loadGeometry(), + type = VectorTileFeature.types[this.type], + i, j; + + function project(line) { + for (var j = 0; j < line.length; j++) { + var p = line[j], y2 = 180 - (p.y + y0) * 360 / size; + line[j] = [ + (p.x + x0) * 360 / size - 180, + 360 / Math.PI * Math.atan(Math.exp(y2 * Math.PI / 180)) - 90 + ]; + } + } + + switch (this.type) { + case 1: + var points = []; + for (i = 0; i < coords.length; i++) { + points[i] = coords[i][0]; + } + coords = points; + project(coords); + break; + + case 2: + for (i = 0; i < coords.length; i++) { + project(coords[i]); + } + break; + + case 3: + coords = classifyRings(coords); + for (i = 0; i < coords.length; i++) { + for (j = 0; j < coords[i].length; j++) { + project(coords[i][j]); + } + } + break; + } + + if (coords.length === 1) { + coords = coords[0]; + } else { + type = 'Multi' + type; + } + + var result = { + type: "Feature", + geometry: { + type: type, + coordinates: coords + }, + properties: this.properties + }; + + if ('id' in this) { + result.id = this.id; + } + + return result; +}; + +// classifies an array of rings into polygons with outer rings and holes + +function classifyRings(rings) { + var len = rings.length; + + if (len <= 1) return [rings]; + + var polygons = [], + polygon, + ccw; + + for (var i = 0; i < len; i++) { + var area = signedArea(rings[i]); + if (area === 0) continue; + + if (ccw === undefined) ccw = area < 0; + + if (ccw === area < 0) { + if (polygon) polygons.push(polygon); + polygon = [rings[i]]; + + } else { + polygon.push(rings[i]); + } + } + if (polygon) polygons.push(polygon); + + return polygons; +} + +function signedArea(ring) { + var sum = 0; + for (var i = 0, len = ring.length, j = len - 1, p1, p2; i < len; j = i++) { + p1 = ring[i]; + p2 = ring[j]; + sum += (p2.x - p1.x) * (p1.y + p2.y); + } + return sum; +} + +},{"point-geometry":198}],210:[function(require,module,exports){ +'use strict'; + +var VectorTileFeature = require('./vectortilefeature.js'); + +module.exports = VectorTileLayer; + +function VectorTileLayer(pbf, end) { + // Public + this.version = 1; + this.name = null; + this.extent = 4096; + this.length = 0; + + // Private + this._pbf = pbf; + this._keys = []; + this._values = []; + this._features = []; + + pbf.readFields(readLayer, this, end); + + this.length = this._features.length; +} + +function readLayer(tag, layer, pbf) { + if (tag === 15) layer.version = pbf.readVarint(); + else if (tag === 1) layer.name = pbf.readString(); + else if (tag === 5) layer.extent = pbf.readVarint(); + else if (tag === 2) layer._features.push(pbf.pos); + else if (tag === 3) layer._keys.push(pbf.readString()); + else if (tag === 4) layer._values.push(readValueMessage(pbf)); +} + +function readValueMessage(pbf) { + var value = null, + end = pbf.readVarint() + pbf.pos; + + while (pbf.pos < end) { + var tag = pbf.readVarint() >> 3; + + value = tag === 1 ? pbf.readString() : + tag === 2 ? pbf.readFloat() : + tag === 3 ? pbf.readDouble() : + tag === 4 ? pbf.readVarint64() : + tag === 5 ? pbf.readVarint() : + tag === 6 ? pbf.readSVarint() : + tag === 7 ? pbf.readBoolean() : null; + } + + return value; +} + +// return feature `i` from this layer as a `VectorTileFeature` +VectorTileLayer.prototype.feature = function(i) { + if (i < 0 || i >= this._features.length) throw new Error('feature index out of bounds'); + + this._pbf.pos = this._features[i]; + + var end = this._pbf.readVarint() + this._pbf.pos; + return new VectorTileFeature(this._pbf, end, this.extent, this._keys, this._values); +}; + +},{"./vectortilefeature.js":209}],211:[function(require,module,exports){ +var Pbf = require('pbf') +var vtpb = require('./vector-tile-pb') +var GeoJSONWrapper = require('./lib/geojson_wrapper') + +module.exports = fromVectorTileJs +module.exports.fromVectorTileJs = fromVectorTileJs +module.exports.fromGeojsonVt = fromGeojsonVt +module.exports.GeoJSONWrapper = GeoJSONWrapper + +/** + * Serialize a vector-tile-js-created tile to pbf + * + * @param {Object} tile + * @return {Buffer} uncompressed, pbf-serialized tile data + */ +function fromVectorTileJs (tile) { + var layers = [] + for (var l in tile.layers) { + layers.push(prepareLayer(tile.layers[l])) + } + + var out = new Pbf() + vtpb.tile.write({ layers: layers }, out) + return out.finish() +} + +/** + * Serialized a geojson-vt-created tile to pbf. + * + * @param {Object} layers - An object mapping layer names to geojson-vt-created vector tile objects + * @return {Buffer} uncompressed, pbf-serialized tile data + */ +function fromGeojsonVt (layers) { + var l = {} + for (var k in layers) { + l[k] = new GeoJSONWrapper(layers[k].features) + l[k].name = k + } + return fromVectorTileJs({layers: l}) +} + +/** + * Prepare the given layer to be serialized by the auto-generated pbf + * serializer by encoding the feature geometry and properties. + */ +function prepareLayer (layer) { + var preparedLayer = { + name: layer.name || '', + version: layer.version || 1, + extent: layer.extent || 4096, + keys: [], + values: [], + features: [] + } + + var keycache = {} + var valuecache = {} + + for (var i = 0; i < layer.length; i++) { + var feature = layer.feature(i) + feature.geometry = encodeGeometry(feature.loadGeometry()) + + var tags = [] + for (var key in feature.properties) { + var keyIndex = keycache[key] + if (typeof keyIndex === 'undefined') { + preparedLayer.keys.push(key) + keyIndex = preparedLayer.keys.length - 1 + keycache[key] = keyIndex + } + var value = wrapValue(feature.properties[key]) + var valueIndex = valuecache[value.key] + if (typeof valueIndex === 'undefined') { + preparedLayer.values.push(value) + valueIndex = preparedLayer.values.length - 1 + valuecache[value.key] = valueIndex + } + tags.push(keyIndex) + tags.push(valueIndex) + } + + feature.tags = tags + preparedLayer.features.push(feature) + } + + return preparedLayer +} + +function command (cmd, length) { + return (length << 3) + (cmd & 0x7) +} + +function zigzag (num) { + return (num << 1) ^ (num >> 31) +} + +/** + * Encode a polygon's geometry into an array ready to be serialized + * to mapbox vector tile specified geometry data. + * + * @param {Array} Rings, each being an array of [x, y] tile-space coordinates + * @return {Array} encoded geometry + */ +function encodeGeometry (geometry) { + var encoded = [] + var x = 0 + var y = 0 + var rings = geometry.length + for (var r = 0; r < rings; r++) { + var ring = geometry[r] + encoded.push(command(1, 1)) // moveto + for (var i = 0; i < ring.length; i++) { + if (i === 1) { + encoded.push(command(2, ring.length - 1)) // lineto + } + var dx = ring[i].x - x + var dy = ring[i].y - y + encoded.push(zigzag(dx), zigzag(dy)) + x += dx + y += dy + } + } + + return encoded +} + +/** + * Wrap a property value according to its type. The returned object + * is of the form { xxxx_value: primitiveValue }, which is what the generated + * protobuf serializer expects. + */ +function wrapValue (value) { + var result + var type = typeof value + if (type === 'string') { + result = { string_value: value } + } else if (type === 'boolean') { + result = { bool_value: value } + } else if (type === 'number') { + if (value % 1 !== 0) { + result = { double_value: value } + } else if (value < 0) { + result = { sint_value: value } + } else { + result = { uint_value: value } + } + } else { + value = JSON.stringify(value) + result = { string_value: value } + } + + result.key = type + ':' + value + return result +} + +},{"./lib/geojson_wrapper":212,"./vector-tile-pb":213,"pbf":197}],212:[function(require,module,exports){ +'use strict' + +var Point = require('point-geometry') +var VectorTileFeature = require('vector-tile').VectorTileFeature + +module.exports = GeoJSONWrapper + +// conform to vectortile api +function GeoJSONWrapper (features) { + this.features = features + this.length = features.length +} + +GeoJSONWrapper.prototype.feature = function (i) { + return new FeatureWrapper(this.features[i]) +} + +function FeatureWrapper (feature) { + this.id = typeof feature.id === 'number' ? feature.id : undefined + this.type = feature.type + this.rawGeometry = feature.type === 1 ? [feature.geometry] : feature.geometry + this.properties = feature.tags + this.extent = 4096 +} + +FeatureWrapper.prototype.loadGeometry = function () { + var rings = this.rawGeometry + this.geometry = [] + + for (var i = 0; i < rings.length; i++) { + var ring = rings[i] + var newRing = [] + for (var j = 0; j < ring.length; j++) { + newRing.push(new Point(ring[j][0], ring[j][1])) + } + this.geometry.push(newRing) + } + return this.geometry +} + +FeatureWrapper.prototype.bbox = function () { + if (!this.geometry) this.loadGeometry() + + var rings = this.geometry + var x1 = Infinity + var x2 = -Infinity + var y1 = Infinity + var y2 = -Infinity + + for (var i = 0; i < rings.length; i++) { + var ring = rings[i] + + for (var j = 0; j < ring.length; j++) { + var coord = ring[j] + + x1 = Math.min(x1, coord.x) + x2 = Math.max(x2, coord.x) + y1 = Math.min(y1, coord.y) + y2 = Math.max(y2, coord.y) + } + } + + return [x1, y1, x2, y2] +} + +FeatureWrapper.prototype.toGeoJSON = VectorTileFeature.prototype.toGeoJSON + +},{"point-geometry":198,"vector-tile":207}],213:[function(require,module,exports){ +'use strict'; + +// tile ======================================== + +var tile = exports.tile = {read: readTile, write: writeTile}; + +tile.GeomType = { + "Unknown": 0, + "Point": 1, + "LineString": 2, + "Polygon": 3 +}; + +function readTile(pbf, end) { + return pbf.readFields(readTileField, {"layers": []}, end); +} + +function readTileField(tag, tile, pbf) { + if (tag === 3) tile.layers.push(readLayer(pbf, pbf.readVarint() + pbf.pos)); +} + +function writeTile(tile, pbf) { + var i; + if (tile.layers !== undefined) for (i = 0; i < tile.layers.length; i++) pbf.writeMessage(3, writeLayer, tile.layers[i]); +} + +// value ======================================== + +tile.value = {read: readValue, write: writeValue}; + +function readValue(pbf, end) { + return pbf.readFields(readValueField, {}, end); +} + +function readValueField(tag, value, pbf) { + if (tag === 1) value.string_value = pbf.readString(); + else if (tag === 2) value.float_value = pbf.readFloat(); + else if (tag === 3) value.double_value = pbf.readDouble(); + else if (tag === 4) value.int_value = pbf.readVarint(); + else if (tag === 5) value.uint_value = pbf.readVarint(); + else if (tag === 6) value.sint_value = pbf.readSVarint(); + else if (tag === 7) value.bool_value = pbf.readBoolean(); +} + +function writeValue(value, pbf) { + if (value.string_value !== undefined) pbf.writeStringField(1, value.string_value); + if (value.float_value !== undefined) pbf.writeFloatField(2, value.float_value); + if (value.double_value !== undefined) pbf.writeDoubleField(3, value.double_value); + if (value.int_value !== undefined) pbf.writeVarintField(4, value.int_value); + if (value.uint_value !== undefined) pbf.writeVarintField(5, value.uint_value); + if (value.sint_value !== undefined) pbf.writeSVarintField(6, value.sint_value); + if (value.bool_value !== undefined) pbf.writeBooleanField(7, value.bool_value); +} + +// feature ======================================== + +tile.feature = {read: readFeature, write: writeFeature}; + +function readFeature(pbf, end) { + var feature = pbf.readFields(readFeatureField, {}, end); + if (feature.type === undefined) feature.type = "Unknown"; + return feature; +} + +function readFeatureField(tag, feature, pbf) { + if (tag === 1) feature.id = pbf.readVarint(); + else if (tag === 2) feature.tags = pbf.readPackedVarint(); + else if (tag === 3) feature.type = pbf.readVarint(); + else if (tag === 4) feature.geometry = pbf.readPackedVarint(); +} + +function writeFeature(feature, pbf) { + if (feature.id !== undefined) pbf.writeVarintField(1, feature.id); + if (feature.tags !== undefined) pbf.writePackedVarint(2, feature.tags); + if (feature.type !== undefined) pbf.writeVarintField(3, feature.type); + if (feature.geometry !== undefined) pbf.writePackedVarint(4, feature.geometry); +} + +// layer ======================================== + +tile.layer = {read: readLayer, write: writeLayer}; + +function readLayer(pbf, end) { + return pbf.readFields(readLayerField, {"features": [], "keys": [], "values": []}, end); +} + +function readLayerField(tag, layer, pbf) { + if (tag === 15) layer.version = pbf.readVarint(); + else if (tag === 1) layer.name = pbf.readString(); + else if (tag === 2) layer.features.push(readFeature(pbf, pbf.readVarint() + pbf.pos)); + else if (tag === 3) layer.keys.push(pbf.readString()); + else if (tag === 4) layer.values.push(readValue(pbf, pbf.readVarint() + pbf.pos)); + else if (tag === 5) layer.extent = pbf.readVarint(); +} + +function writeLayer(layer, pbf) { + if (layer.version !== undefined) pbf.writeVarintField(15, layer.version); + if (layer.name !== undefined) pbf.writeStringField(1, layer.name); + var i; + if (layer.features !== undefined) for (i = 0; i < layer.features.length; i++) pbf.writeMessage(2, writeFeature, layer.features[i]); + if (layer.keys !== undefined) for (i = 0; i < layer.keys.length; i++) pbf.writeStringField(3, layer.keys[i]); + if (layer.values !== undefined) for (i = 0; i < layer.values.length; i++) pbf.writeMessage(4, writeValue, layer.values[i]); + if (layer.extent !== undefined) pbf.writeVarintField(5, layer.extent); +} + +},{}],214:[function(require,module,exports){ +var bundleFn = arguments[3]; +var sources = arguments[4]; +var cache = arguments[5]; + +var stringify = JSON.stringify; + +module.exports = function (fn, options) { + var wkey; + var cacheKeys = Object.keys(cache); + + for (var i = 0, l = cacheKeys.length; i < l; i++) { + var key = cacheKeys[i]; + var exp = cache[key].exports; + // Using babel as a transpiler to use esmodule, the export will always + // be an object with the default export as a property of it. To ensure + // the existing api and babel esmodule exports are both supported we + // check for both + if (exp === fn || exp && exp.default === fn) { + wkey = key; + break; + } + } + + if (!wkey) { + wkey = Math.floor(Math.pow(16, 8) * Math.random()).toString(16); + var wcache = {}; + for (var i = 0, l = cacheKeys.length; i < l; i++) { + var key = cacheKeys[i]; + wcache[key] = key; + } + sources[wkey] = [ + Function(['require','module','exports'], '(' + fn + ')(self)'), + wcache + ]; + } + var skey = Math.floor(Math.pow(16, 8) * Math.random()).toString(16); + + var scache = {}; scache[wkey] = wkey; + sources[skey] = [ + Function(['require'], ( + // try to call default if defined to also support babel esmodule + // exports + 'var f = require(' + stringify(wkey) + ');' + + '(f.default ? f.default : f)(self);' + )), + scache + ]; + + var workerSources = {}; + resolveSources(skey); + + function resolveSources(key) { + workerSources[key] = true; + + for (var depPath in sources[key][1]) { + var depKey = sources[key][1][depPath]; + if (!workerSources[depKey]) { + resolveSources(depKey); + } + } + } + + var src = '(' + bundleFn + ')({' + + Object.keys(workerSources).map(function (key) { + return stringify(key) + ':[' + + sources[key][0] + + ',' + stringify(sources[key][1]) + ']' + ; + }).join(',') + + '},{},[' + stringify(skey) + '])' + ; + + var URL = window.URL || window.webkitURL || window.mozURL || window.msURL; + + var blob = new Blob([src], { type: 'text/javascript' }); + if (options && options.bare) { return blob; } + var workerUrl = URL.createObjectURL(blob); + var worker = new Worker(workerUrl); + worker.objectURL = workerUrl; + return worker; +}; + +},{}],215:[function(require,module,exports){ +module.exports.RADIUS = 6378137; +module.exports.FLATTENING = 1/298.257223563; +module.exports.POLAR_RADIUS = 6356752.3142; + +},{}],216:[function(require,module,exports){ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (factory((global.WhooTS = global.WhooTS || {}))); +}(this, function (exports) { + +/** + * getURL + * + * @param {String} baseUrl Base url of the WMS server + * @param {String} layer Layer name + * @param {Number} x Tile coordinate x + * @param {Number} y Tile coordinate y + * @param {Number} z Tile zoom + * @param {Object} [options] + * @param {String} [options.format='image/png'] + * @param {String} [options.service='WMS'] + * @param {String} [options.version='1.1.1'] + * @param {String} [options.request='GetMap'] + * @param {String} [options.srs='EPSG:3857'] + * @param {Number} [options.width='256'] + * @param {Number} [options.height='256'] + * @returns {String} url + * @example + * var baseUrl = 'http://geodata.state.nj.us/imagerywms/Natural2015'; + * var layer = 'Natural2015'; + * var url = whoots.getURL(baseUrl, layer, 154308, 197167, 19); + */ +function getURL(baseUrl, layer, x, y, z, options) { + options = options || {}; + + var url = baseUrl + '?' + [ + 'bbox=' + getTileBBox(x, y, z), + 'format=' + (options.format || 'image/png'), + 'service=' + (options.service || 'WMS'), + 'version=' + (options.version || '1.1.1'), + 'request=' + (options.request || 'GetMap'), + 'srs=' + (options.srs || 'EPSG:3857'), + 'width=' + (options.width || 256), + 'height=' + (options.height || 256), + 'layers=' + layer + ].join('&'); + + return url; +} + + +/** + * getTileBBox + * + * @param {Number} x Tile coordinate x + * @param {Number} y Tile coordinate y + * @param {Number} z Tile zoom + * @returns {String} String of the bounding box + */ +function getTileBBox(x, y, z) { + // for Google/OSM tile scheme we need to alter the y + y = (Math.pow(2, z) - y - 1); + + var min = getMercCoords(x * 256, y * 256, z), + max = getMercCoords((x + 1) * 256, (y + 1) * 256, z); + + return min[0] + ',' + min[1] + ',' + max[0] + ',' + max[1]; +} + + +/** + * getMercCoords + * + * @param {Number} x Pixel coordinate x + * @param {Number} y Pixel coordinate y + * @param {Number} z Tile zoom + * @returns {Array} [x, y] + */ +function getMercCoords(x, y, z) { + var resolution = (2 * Math.PI * 6378137 / 256) / Math.pow(2, z), + merc_x = (x * resolution - 2 * Math.PI * 6378137 / 2.0), + merc_y = (y * resolution - 2 * Math.PI * 6378137 / 2.0); + + return [merc_x, merc_y]; +} + +exports.getURL = getURL; +exports.getTileBBox = getTileBBox; +exports.getMercCoords = getMercCoords; + +Object.defineProperty(exports, '__esModule', { value: true }); + +})); +},{}],217:[function(require,module,exports){ +module.exports={ + "version": "0.32.1" +} +},{}]},{},[24])(24) +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCIvVXNlcnMvZGlzdGlsbGVyL21hcGJveC1nbC1qcy9qcy9kYXRhL2FycmF5X2dyb3VwLmpzIiwiL1VzZXJzL2Rpc3RpbGxlci9tYXBib3gtZ2wtanMvanMvZGF0YS9idWNrZXQuanMiLCIvVXNlcnMvZGlzdGlsbGVyL21hcGJveC1nbC1qcy9qcy9kYXRhL2J1Y2tldC9jaXJjbGVfYnVja2V0LmpzIiwiL1VzZXJzL2Rpc3RpbGxlci9tYXBib3gtZ2wtanMvanMvZGF0YS9idWNrZXQvZmlsbF9idWNrZXQuanMiLCIvVXNlcnMvZGlzdGlsbGVyL21hcGJveC1nbC1qcy9qcy9kYXRhL2J1Y2tldC9maWxsX2V4dHJ1c2lvbl9idWNrZXQuanMiLCIvVXNlcnMvZGlzdGlsbGVyL21hcGJveC1nbC1qcy9qcy9kYXRhL2J1Y2tldC9saW5lX2J1Y2tldC5qcyIsIi9Vc2Vycy9kaXN0aWxsZXIvbWFwYm94LWdsLWpzL2pzL2RhdGEvYnVja2V0L3N5bWJvbF9idWNrZXQuanMiLCIvVXNlcnMvZGlzdGlsbGVyL21hcGJveC1nbC1qcy9qcy9kYXRhL2J1ZmZlci5qcyIsIi9Vc2Vycy9kaXN0aWxsZXIvbWFwYm94LWdsLWpzL2pzL2RhdGEvYnVmZmVyX2dyb3VwLmpzIiwiL1VzZXJzL2Rpc3RpbGxlci9tYXBib3gtZ2wtanMvanMvZGF0YS9lbGVtZW50X2FycmF5X3R5cGUuanMiLCIvVXNlcnMvZGlzdGlsbGVyL21hcGJveC1nbC1qcy9qcy9kYXRhL2V4dGVudC5qcyIsIi9Vc2Vycy9kaXN0aWxsZXIvbWFwYm94LWdsLWpzL2pzL2RhdGEvZmVhdHVyZV9pbmRleC5qcyIsIi9Vc2Vycy9kaXN0aWxsZXIvbWFwYm94LWdsLWpzL2pzL2RhdGEvbG9hZF9nZW9tZXRyeS5qcyIsIi9Vc2Vycy9kaXN0aWxsZXIvbWFwYm94LWdsLWpzL2pzL2RhdGEvcG9zX2FycmF5LmpzIiwiL1VzZXJzL2Rpc3RpbGxlci9tYXBib3gtZ2wtanMvanMvZGF0YS9wcm9ncmFtX2NvbmZpZ3VyYXRpb24uanMiLCIvVXNlcnMvZGlzdGlsbGVyL21hcGJveC1nbC1qcy9qcy9kYXRhL3Jhc3Rlcl9ib3VuZHNfYXJyYXkuanMiLCIvVXNlcnMvZGlzdGlsbGVyL21hcGJveC1nbC1qcy9qcy9kYXRhL3ZlcnRleF9hcnJheV90eXBlLmpzIiwiL1VzZXJzL2Rpc3RpbGxlci9tYXBib3gtZ2wtanMvanMvZ2VvL2Nvb3JkaW5hdGUuanMiLCIvVXNlcnMvZGlzdGlsbGVyL21hcGJveC1nbC1qcy9qcy9nZW8vbG5nX2xhdC5qcyIsIi9Vc2Vycy9kaXN0aWxsZXIvbWFwYm94LWdsLWpzL2pzL2dlby9sbmdfbGF0X2JvdW5kcy5qcyIsIi9Vc2Vycy9kaXN0aWxsZXIvbWFwYm94LWdsLWpzL2pzL2dlby90cmFuc2Zvcm0uanMiLCIvVXNlcnMvZGlzdGlsbGVyL21hcGJveC1nbC1qcy9qcy9nbG9iYWxfd29ya2VyX3Bvb2wuanMiLCIvVXNlcnMvZGlzdGlsbGVyL21hcGJveC1nbC1qcy9qcy9saWIvZGVidWd0ZXh0LmpzIiwiL1VzZXJzL2Rpc3RpbGxlci9tYXBib3gtZ2wtanMvanMvbWFwYm94LWdsLmpzIiwiL1VzZXJzL2Rpc3RpbGxlci9tYXBib3gtZ2wtanMvanMvcmVuZGVyL2RyYXdfYmFja2dyb3VuZC5qcyIsIi9Vc2Vycy9kaXN0aWxsZXIvbWFwYm94LWdsLWpzL2pzL3JlbmRlci9kcmF3X2NpcmNsZS5qcyIsIi9Vc2Vycy9kaXN0aWxsZXIvbWFwYm94LWdsLWpzL2pzL3JlbmRlci9kcmF3X2NvbGxpc2lvbl9kZWJ1Zy5qcyIsIi9Vc2Vycy9kaXN0aWxsZXIvbWFwYm94LWdsLWpzL2pzL3JlbmRlci9kcmF3X2RlYnVnLmpzIiwiL1VzZXJzL2Rpc3RpbGxlci9tYXBib3gtZ2wtanMvanMvcmVuZGVyL2RyYXdfZmlsbC5qcyIsIi9Vc2Vycy9kaXN0aWxsZXIvbWFwYm94LWdsLWpzL2pzL3JlbmRlci9kcmF3X2ZpbGxfZXh0cnVzaW9uLmpzIiwiL1VzZXJzL2Rpc3RpbGxlci9tYXBib3gtZ2wtanMvanMvcmVuZGVyL2RyYXdfbGluZS5qcyIsIi9Vc2Vycy9kaXN0aWxsZXIvbWFwYm94LWdsLWpzL2pzL3JlbmRlci9kcmF3X3Jhc3Rlci5qcyIsIi9Vc2Vycy9kaXN0aWxsZXIvbWFwYm94LWdsLWpzL2pzL3JlbmRlci9kcmF3X3N5bWJvbC5qcyIsIi9Vc2Vycy9kaXN0aWxsZXIvbWFwYm94LWdsLWpzL2pzL3JlbmRlci9mcmFtZV9oaXN0b3J5LmpzIiwiL1VzZXJzL2Rpc3RpbGxlci9tYXBib3gtZ2wtanMvanMvcmVuZGVyL2xpbmVfYXRsYXMuanMiLCIvVXNlcnMvZGlzdGlsbGVyL21hcGJveC1nbC1qcy9qcy9yZW5kZXIvcGFpbnRlci5qcyIsIi9Vc2Vycy9kaXN0aWxsZXIvbWFwYm94LWdsLWpzL2pzL3JlbmRlci9wYXR0ZXJuLmpzIiwiL1VzZXJzL2Rpc3RpbGxlci9tYXBib3gtZ2wtanMvanMvcmVuZGVyL3NoYWRlcnMuanMiLCIvVXNlcnMvZGlzdGlsbGVyL21hcGJveC1nbC1qcy9qcy9yZW5kZXIvdmVydGV4X2FycmF5X29iamVjdC5qcyIsIi9Vc2Vycy9kaXN0aWxsZXIvbWFwYm94LWdsLWpzL2pzL3NvdXJjZS9jYW52YXNfc291cmNlLmpzIiwiL1VzZXJzL2Rpc3RpbGxlci9tYXBib3gtZ2wtanMvanMvc291cmNlL2dlb2pzb25fc291cmNlLmpzIiwiL1VzZXJzL2Rpc3RpbGxlci9tYXBib3gtZ2wtanMvanMvc291cmNlL2dlb2pzb25fd29ya2VyX3NvdXJjZS5qcyIsIi9Vc2Vycy9kaXN0aWxsZXIvbWFwYm94LWdsLWpzL2pzL3NvdXJjZS9nZW9qc29uX3dyYXBwZXIuanMiLCIvVXNlcnMvZGlzdGlsbGVyL21hcGJveC1nbC1qcy9qcy9zb3VyY2UvaW1hZ2Vfc291cmNlLmpzIiwiL1VzZXJzL2Rpc3RpbGxlci9tYXBib3gtZ2wtanMvanMvc291cmNlL2xvYWRfdGlsZWpzb24uanMiLCIvVXNlcnMvZGlzdGlsbGVyL21hcGJveC1nbC1qcy9qcy9zb3VyY2UvcGl4ZWxzX3RvX3RpbGVfdW5pdHMuanMiLCIvVXNlcnMvZGlzdGlsbGVyL21hcGJveC1nbC1qcy9qcy9zb3VyY2UvcXVlcnlfZmVhdHVyZXMuanMiLCIvVXNlcnMvZGlzdGlsbGVyL21hcGJveC1nbC1qcy9qcy9zb3VyY2UvcmFzdGVyX3RpbGVfc291cmNlLmpzIiwiL1VzZXJzL2Rpc3RpbGxlci9tYXBib3gtZ2wtanMvanMvc291cmNlL3J0bF90ZXh0X3BsdWdpbi5qcyIsIi9Vc2Vycy9kaXN0aWxsZXIvbWFwYm94LWdsLWpzL2pzL3NvdXJjZS9zb3VyY2UuanMiLCIvVXNlcnMvZGlzdGlsbGVyL21hcGJveC1nbC1qcy9qcy9zb3VyY2Uvc291cmNlX2NhY2hlLmpzIiwiL1VzZXJzL2Rpc3RpbGxlci9tYXBib3gtZ2wtanMvanMvc291cmNlL3RpbGUuanMiLCIvVXNlcnMvZGlzdGlsbGVyL21hcGJveC1nbC1qcy9qcy9zb3VyY2UvdGlsZV9jb29yZC5qcyIsIi9Vc2Vycy9kaXN0aWxsZXIvbWFwYm94LWdsLWpzL2pzL3NvdXJjZS92ZWN0b3JfdGlsZV9zb3VyY2UuanMiLCIvVXNlcnMvZGlzdGlsbGVyL21hcGJveC1nbC1qcy9qcy9zb3VyY2UvdmVjdG9yX3RpbGVfd29ya2VyX3NvdXJjZS5qcyIsIi9Vc2Vycy9kaXN0aWxsZXIvbWFwYm94LWdsLWpzL2pzL3NvdXJjZS92aWRlb19zb3VyY2UuanMiLCIvVXNlcnMvZGlzdGlsbGVyL21hcGJveC1nbC1qcy9qcy9zb3VyY2Uvd29ya2VyLmpzIiwiL1VzZXJzL2Rpc3RpbGxlci9tYXBib3gtZ2wtanMvanMvc291cmNlL3dvcmtlcl90aWxlLmpzIiwiL1VzZXJzL2Rpc3RpbGxlci9tYXBib3gtZ2wtanMvanMvc3R5bGUvYW5pbWF0aW9uX2xvb3AuanMiLCIvVXNlcnMvZGlzdGlsbGVyL21hcGJveC1nbC1qcy9qcy9zdHlsZS9pbWFnZV9zcHJpdGUuanMiLCIvVXNlcnMvZGlzdGlsbGVyL21hcGJveC1nbC1qcy9qcy9zdHlsZS9saWdodC5qcyIsIi9Vc2Vycy9kaXN0aWxsZXIvbWFwYm94LWdsLWpzL2pzL3N0eWxlL3BhcnNlX2NvbG9yLmpzIiwiL1VzZXJzL2Rpc3RpbGxlci9tYXBib3gtZ2wtanMvanMvc3R5bGUvc3R5bGUuanMiLCIvVXNlcnMvZGlzdGlsbGVyL21hcGJveC1nbC1qcy9qcy9zdHlsZS9zdHlsZV9kZWNsYXJhdGlvbi5qcyIsIi9Vc2Vycy9kaXN0aWxsZXIvbWFwYm94LWdsLWpzL2pzL3N0eWxlL3N0eWxlX2xheWVyLmpzIiwiL1VzZXJzL2Rpc3RpbGxlci9tYXBib3gtZ2wtanMvanMvc3R5bGUvc3R5bGVfbGF5ZXIvY2lyY2xlX3N0eWxlX2xheWVyLmpzIiwiL1VzZXJzL2Rpc3RpbGxlci9tYXBib3gtZ2wtanMvanMvc3R5bGUvc3R5bGVfbGF5ZXIvZmlsbF9leHRydXNpb25fc3R5bGVfbGF5ZXIuanMiLCIvVXNlcnMvZGlzdGlsbGVyL21hcGJveC1nbC1qcy9qcy9zdHlsZS9zdHlsZV9sYXllci9maWxsX3N0eWxlX2xheWVyLmpzIiwiL1VzZXJzL2Rpc3RpbGxlci9tYXBib3gtZ2wtanMvanMvc3R5bGUvc3R5bGVfbGF5ZXIvbGluZV9zdHlsZV9sYXllci5qcyIsIi9Vc2Vycy9kaXN0aWxsZXIvbWFwYm94LWdsLWpzL2pzL3N0eWxlL3N0eWxlX2xheWVyL3N5bWJvbF9zdHlsZV9sYXllci5qcyIsIi9Vc2Vycy9kaXN0aWxsZXIvbWFwYm94LWdsLWpzL2pzL3N0eWxlL3N0eWxlX2xheWVyX2luZGV4LmpzIiwiL1VzZXJzL2Rpc3RpbGxlci9tYXBib3gtZ2wtanMvanMvc3R5bGUvc3R5bGVfc3BlYy5qcyIsIi9Vc2Vycy9kaXN0aWxsZXIvbWFwYm94LWdsLWpzL2pzL3N0eWxlL3N0eWxlX3RyYW5zaXRpb24uanMiLCIvVXNlcnMvZGlzdGlsbGVyL21hcGJveC1nbC1qcy9qcy9zdHlsZS92YWxpZGF0ZV9zdHlsZS5qcyIsIi9Vc2Vycy9kaXN0aWxsZXIvbWFwYm94LWdsLWpzL2pzL3N5bWJvbC9hbmNob3IuanMiLCIvVXNlcnMvZGlzdGlsbGVyL21hcGJveC1nbC1qcy9qcy9zeW1ib2wvY2hlY2tfbWF4X2FuZ2xlLmpzIiwiL1VzZXJzL2Rpc3RpbGxlci9tYXBib3gtZ2wtanMvanMvc3ltYm9sL2NsaXBfbGluZS5qcyIsIi9Vc2Vycy9kaXN0aWxsZXIvbWFwYm94LWdsLWpzL2pzL3N5bWJvbC9jb2xsaXNpb25fYm94LmpzIiwiL1VzZXJzL2Rpc3RpbGxlci9tYXBib3gtZ2wtanMvanMvc3ltYm9sL2NvbGxpc2lvbl9mZWF0dXJlLmpzIiwiL1VzZXJzL2Rpc3RpbGxlci9tYXBib3gtZ2wtanMvanMvc3ltYm9sL2NvbGxpc2lvbl90aWxlLmpzIiwiL1VzZXJzL2Rpc3RpbGxlci9tYXBib3gtZ2wtanMvanMvc3ltYm9sL2dldF9hbmNob3JzLmpzIiwiL1VzZXJzL2Rpc3RpbGxlci9tYXBib3gtZ2wtanMvanMvc3ltYm9sL2dseXBoX2F0bGFzLmpzIiwiL1VzZXJzL2Rpc3RpbGxlci9tYXBib3gtZ2wtanMvanMvc3ltYm9sL2dseXBoX3NvdXJjZS5qcyIsIi9Vc2Vycy9kaXN0aWxsZXIvbWFwYm94LWdsLWpzL2pzL3N5bWJvbC9tZXJnZWxpbmVzLmpzIiwiL1VzZXJzL2Rpc3RpbGxlci9tYXBib3gtZ2wtanMvanMvc3ltYm9sL3F1YWRzLmpzIiwiL1VzZXJzL2Rpc3RpbGxlci9tYXBib3gtZ2wtanMvanMvc3ltYm9sL3Jlc29sdmVfdGV4dC5qcyIsIi9Vc2Vycy9kaXN0aWxsZXIvbWFwYm94LWdsLWpzL2pzL3N5bWJvbC9zaGFwaW5nLmpzIiwiL1VzZXJzL2Rpc3RpbGxlci9tYXBib3gtZ2wtanMvanMvc3ltYm9sL3Nwcml0ZV9hdGxhcy5qcyIsIi9Vc2Vycy9kaXN0aWxsZXIvbWFwYm94LWdsLWpzL2pzL3N5bWJvbC9zeW1ib2xfaW5zdGFuY2VzLmpzIiwiL1VzZXJzL2Rpc3RpbGxlci9tYXBib3gtZ2wtanMvanMvc3ltYm9sL3N5bWJvbF9xdWFkcy5qcyIsIi9Vc2Vycy9kaXN0aWxsZXIvbWFwYm94LWdsLWpzL2pzL3VpL2JpbmRfaGFuZGxlcnMuanMiLCIvVXNlcnMvZGlzdGlsbGVyL21hcGJveC1nbC1qcy9qcy91aS9jYW1lcmEuanMiLCIvVXNlcnMvZGlzdGlsbGVyL21hcGJveC1nbC1qcy9qcy91aS9jb250cm9sL2F0dHJpYnV0aW9uX2NvbnRyb2wuanMiLCIvVXNlcnMvZGlzdGlsbGVyL21hcGJveC1nbC1qcy9qcy91aS9jb250cm9sL2dlb2xvY2F0ZV9jb250cm9sLmpzIiwiL1VzZXJzL2Rpc3RpbGxlci9tYXBib3gtZ2wtanMvanMvdWkvY29udHJvbC9uYXZpZ2F0aW9uX2NvbnRyb2wuanMiLCIvVXNlcnMvZGlzdGlsbGVyL21hcGJveC1nbC1qcy9qcy91aS9jb250cm9sL3NjYWxlX2NvbnRyb2wuanMiLCIvVXNlcnMvZGlzdGlsbGVyL21hcGJveC1nbC1qcy9qcy91aS9oYW5kbGVyL2JveF96b29tLmpzIiwiL1VzZXJzL2Rpc3RpbGxlci9tYXBib3gtZ2wtanMvanMvdWkvaGFuZGxlci9kYmxjbGlja196b29tLmpzIiwiL1VzZXJzL2Rpc3RpbGxlci9tYXBib3gtZ2wtanMvanMvdWkvaGFuZGxlci9kcmFnX3Bhbi5qcyIsIi9Vc2Vycy9kaXN0aWxsZXIvbWFwYm94LWdsLWpzL2pzL3VpL2hhbmRsZXIvZHJhZ19yb3RhdGUuanMiLCIvVXNlcnMvZGlzdGlsbGVyL21hcGJveC1nbC1qcy9qcy91aS9oYW5kbGVyL2tleWJvYXJkLmpzIiwiL1VzZXJzL2Rpc3RpbGxlci9tYXBib3gtZ2wtanMvanMvdWkvaGFuZGxlci9zY3JvbGxfem9vbS5qcyIsIi9Vc2Vycy9kaXN0aWxsZXIvbWFwYm94LWdsLWpzL2pzL3VpL2hhbmRsZXIvdG91Y2hfem9vbV9yb3RhdGUuanMiLCIvVXNlcnMvZGlzdGlsbGVyL21hcGJveC1nbC1qcy9qcy91aS9oYXNoLmpzIiwiL1VzZXJzL2Rpc3RpbGxlci9tYXBib3gtZ2wtanMvanMvdWkvbWFwLmpzIiwiL1VzZXJzL2Rpc3RpbGxlci9tYXBib3gtZ2wtanMvanMvdWkvbWFya2VyLmpzIiwiL1VzZXJzL2Rpc3RpbGxlci9tYXBib3gtZ2wtanMvanMvdWkvcG9wdXAuanMiLCIvVXNlcnMvZGlzdGlsbGVyL21hcGJveC1nbC1qcy9qcy91dGlsL2FjdG9yLmpzIiwiL1VzZXJzL2Rpc3RpbGxlci9tYXBib3gtZ2wtanMvanMvdXRpbC9hamF4LmpzIiwiL1VzZXJzL2Rpc3RpbGxlci9tYXBib3gtZ2wtanMvanMvdXRpbC9icm93c2VyLmpzIiwiL1VzZXJzL2Rpc3RpbGxlci9tYXBib3gtZ2wtanMvanMvdXRpbC9icm93c2VyL3dlYl93b3JrZXIuanMiLCIvVXNlcnMvZGlzdGlsbGVyL21hcGJveC1nbC1qcy9qcy91dGlsL2Jyb3dzZXIvd2luZG93LmpzIiwiL1VzZXJzL2Rpc3RpbGxlci9tYXBib3gtZ2wtanMvanMvdXRpbC9jbGFzc2lmeV9yaW5ncy5qcyIsIi9Vc2Vycy9kaXN0aWxsZXIvbWFwYm94LWdsLWpzL2pzL3V0aWwvY29uZmlnLmpzIiwiL1VzZXJzL2Rpc3RpbGxlci9tYXBib3gtZ2wtanMvanMvdXRpbC9kaWN0aW9uYXJ5X2NvZGVyLmpzIiwiL1VzZXJzL2Rpc3RpbGxlci9tYXBib3gtZ2wtanMvanMvdXRpbC9kaXNwYXRjaGVyLmpzIiwiL1VzZXJzL2Rpc3RpbGxlci9tYXBib3gtZ2wtanMvanMvdXRpbC9kb20uanMiLCIvVXNlcnMvZGlzdGlsbGVyL21hcGJveC1nbC1qcy9qcy91dGlsL2V2ZW50ZWQuanMiLCIvVXNlcnMvZGlzdGlsbGVyL21hcGJveC1nbC1qcy9qcy91dGlsL2ZpbmRfcG9sZV9vZl9pbmFjY2Vzc2liaWxpdHkuanMiLCIvVXNlcnMvZGlzdGlsbGVyL21hcGJveC1nbC1qcy9qcy91dGlsL2dseXBocy5qcyIsIi9Vc2Vycy9kaXN0aWxsZXIvbWFwYm94LWdsLWpzL2pzL3V0aWwvaW50ZXJwb2xhdGUuanMiLCIvVXNlcnMvZGlzdGlsbGVyL21hcGJveC1nbC1qcy9qcy91dGlsL2ludGVyc2VjdGlvbl90ZXN0cy5qcyIsIi9Vc2Vycy9kaXN0aWxsZXIvbWFwYm94LWdsLWpzL2pzL3V0aWwvaXNfY2hhcl9pbl91bmljb2RlX2Jsb2NrLmpzIiwiL1VzZXJzL2Rpc3RpbGxlci9tYXBib3gtZ2wtanMvanMvdXRpbC9scnVfY2FjaGUuanMiLCIvVXNlcnMvZGlzdGlsbGVyL21hcGJveC1nbC1qcy9qcy91dGlsL21hcGJveC5qcyIsIi9Vc2Vycy9kaXN0aWxsZXIvbWFwYm94LWdsLWpzL2pzL3V0aWwvc2NyaXB0X2RldGVjdGlvbi5qcyIsIi9Vc2Vycy9kaXN0aWxsZXIvbWFwYm94LWdsLWpzL2pzL3V0aWwvc3RydWN0X2FycmF5LmpzIiwiL1VzZXJzL2Rpc3RpbGxlci9tYXBib3gtZ2wtanMvanMvdXRpbC90b2tlbi5qcyIsIi9Vc2Vycy9kaXN0aWxsZXIvbWFwYm94LWdsLWpzL2pzL3V0aWwvdXRpbC5qcyIsIi9Vc2Vycy9kaXN0aWxsZXIvbWFwYm94LWdsLWpzL2pzL3V0aWwvdmVjdG9ydGlsZV90b19nZW9qc29uLmpzIiwiL1VzZXJzL2Rpc3RpbGxlci9tYXBib3gtZ2wtanMvanMvdXRpbC92ZXJ0aWNhbGl6ZV9wdW5jdHVhdGlvbi5qcyIsIi9Vc2Vycy9kaXN0aWxsZXIvbWFwYm94LWdsLWpzL2pzL3V0aWwvd29ya2VyX3Bvb2wuanMiLCJub2RlX21vZHVsZXMvQG1hcGJveC9nbC1tYXRyaXgvZGlzdC9nbC1tYXRyaXguanMiLCJub2RlX21vZHVsZXMvQG1hcGJveC91bml0YmV6aWVyL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2Fzc2VydC9hc3NlcnQuanMiLCJub2RlX21vZHVsZXMvY3NzY29sb3JwYXJzZXIvY3NzY29sb3JwYXJzZXIuanMiLCJub2RlX21vZHVsZXMvZWFyY3V0L3NyYy9lYXJjdXQuanMiLCJub2RlX21vZHVsZXMvZmFzdC1zdGFibGUtc3RyaW5naWZ5L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2ZlYXR1cmUtZmlsdGVyL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2dlb2pzb24tYXJlYS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9nZW9qc29uLXJld2luZC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9nZW9qc29uLXZ0L3NyYy9jbGlwLmpzIiwibm9kZV9tb2R1bGVzL2dlb2pzb24tdnQvc3JjL2NvbnZlcnQuanMiLCJub2RlX21vZHVsZXMvZ2VvanNvbi12dC9zcmMvZmVhdHVyZS5qcyIsIm5vZGVfbW9kdWxlcy9nZW9qc29uLXZ0L3NyYy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9nZW9qc29uLXZ0L3NyYy9zaW1wbGlmeS5qcyIsIm5vZGVfbW9kdWxlcy9nZW9qc29uLXZ0L3NyYy90aWxlLmpzIiwibm9kZV9tb2R1bGVzL2dlb2pzb24tdnQvc3JjL3RyYW5zZm9ybS5qcyIsIm5vZGVfbW9kdWxlcy9nZW9qc29uLXZ0L3NyYy93cmFwLmpzIiwibm9kZV9tb2R1bGVzL2dyaWQtaW5kZXgvZ3JpZC1pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9pZWVlNzU0L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2tkYnVzaC9zcmMva2RidXNoLmpzIiwibm9kZV9tb2R1bGVzL2tkYnVzaC9zcmMvcmFuZ2UuanMiLCJub2RlX21vZHVsZXMva2RidXNoL3NyYy9zb3J0LmpzIiwibm9kZV9tb2R1bGVzL2tkYnVzaC9zcmMvd2l0aGluLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC5fYmFzZWlzZXF1YWwvaW5kZXguanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLl9iaW5kY2FsbGJhY2svaW5kZXguanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLl9nZXRuYXRpdmUvaW5kZXguanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLmlzYXJndW1lbnRzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC5pc2FycmF5L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC5pc3R5cGVkYXJyYXkvaW5kZXguanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLmtleXMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvbWFwYm94LWdsLWZ1bmN0aW9uL2NvbG9yX3NwYWNlcy5qcyIsIm5vZGVfbW9kdWxlcy9tYXBib3gtZ2wtZnVuY3Rpb24vaW5kZXguanMiLCJub2RlX21vZHVsZXMvbWFwYm94LWdsLXN0eWxlLXNwZWMvbGliL2RlcmVmLmpzIiwibm9kZV9tb2R1bGVzL21hcGJveC1nbC1zdHlsZS1zcGVjL2xpYi9kaWZmLmpzIiwibm9kZV9tb2R1bGVzL21hcGJveC1nbC1zdHlsZS1zcGVjL2xpYi9lcnJvci92YWxpZGF0aW9uX2Vycm9yLmpzIiwibm9kZV9tb2R1bGVzL21hcGJveC1nbC1zdHlsZS1zcGVjL2xpYi9ncm91cF9ieV9sYXlvdXQuanMiLCJub2RlX21vZHVsZXMvbWFwYm94LWdsLXN0eWxlLXNwZWMvbGliL3V0aWwvZXh0ZW5kLmpzIiwibm9kZV9tb2R1bGVzL21hcGJveC1nbC1zdHlsZS1zcGVjL2xpYi91dGlsL2dldF90eXBlLmpzIiwibm9kZV9tb2R1bGVzL21hcGJveC1nbC1zdHlsZS1zcGVjL2xpYi91dGlsL3JlZl9wcm9wZXJ0aWVzLmpzIiwibm9kZV9tb2R1bGVzL21hcGJveC1nbC1zdHlsZS1zcGVjL2xpYi91dGlsL3VuYnVuZGxlX2pzb25saW50LmpzIiwibm9kZV9tb2R1bGVzL21hcGJveC1nbC1zdHlsZS1zcGVjL2xpYi92YWxpZGF0ZS92YWxpZGF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9tYXBib3gtZ2wtc3R5bGUtc3BlYy9saWIvdmFsaWRhdGUvdmFsaWRhdGVfYXJyYXkuanMiLCJub2RlX21vZHVsZXMvbWFwYm94LWdsLXN0eWxlLXNwZWMvbGliL3ZhbGlkYXRlL3ZhbGlkYXRlX2Jvb2xlYW4uanMiLCJub2RlX21vZHVsZXMvbWFwYm94LWdsLXN0eWxlLXNwZWMvbGliL3ZhbGlkYXRlL3ZhbGlkYXRlX2NvbG9yLmpzIiwibm9kZV9tb2R1bGVzL21hcGJveC1nbC1zdHlsZS1zcGVjL2xpYi92YWxpZGF0ZS92YWxpZGF0ZV9jb25zdGFudHMuanMiLCJub2RlX21vZHVsZXMvbWFwYm94LWdsLXN0eWxlLXNwZWMvbGliL3ZhbGlkYXRlL3ZhbGlkYXRlX2VudW0uanMiLCJub2RlX21vZHVsZXMvbWFwYm94LWdsLXN0eWxlLXNwZWMvbGliL3ZhbGlkYXRlL3ZhbGlkYXRlX2ZpbHRlci5qcyIsIm5vZGVfbW9kdWxlcy9tYXBib3gtZ2wtc3R5bGUtc3BlYy9saWIvdmFsaWRhdGUvdmFsaWRhdGVfZnVuY3Rpb24uanMiLCJub2RlX21vZHVsZXMvbWFwYm94LWdsLXN0eWxlLXNwZWMvbGliL3ZhbGlkYXRlL3ZhbGlkYXRlX2dseXBoc191cmwuanMiLCJub2RlX21vZHVsZXMvbWFwYm94LWdsLXN0eWxlLXNwZWMvbGliL3ZhbGlkYXRlL3ZhbGlkYXRlX2xheWVyLmpzIiwibm9kZV9tb2R1bGVzL21hcGJveC1nbC1zdHlsZS1zcGVjL2xpYi92YWxpZGF0ZS92YWxpZGF0ZV9sYXlvdXRfcHJvcGVydHkuanMiLCJub2RlX21vZHVsZXMvbWFwYm94LWdsLXN0eWxlLXNwZWMvbGliL3ZhbGlkYXRlL3ZhbGlkYXRlX2xpZ2h0LmpzIiwibm9kZV9tb2R1bGVzL21hcGJveC1nbC1zdHlsZS1zcGVjL2xpYi92YWxpZGF0ZS92YWxpZGF0ZV9udW1iZXIuanMiLCJub2RlX21vZHVsZXMvbWFwYm94LWdsLXN0eWxlLXNwZWMvbGliL3ZhbGlkYXRlL3ZhbGlkYXRlX29iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9tYXBib3gtZ2wtc3R5bGUtc3BlYy9saWIvdmFsaWRhdGUvdmFsaWRhdGVfcGFpbnRfcHJvcGVydHkuanMiLCJub2RlX21vZHVsZXMvbWFwYm94LWdsLXN0eWxlLXNwZWMvbGliL3ZhbGlkYXRlL3ZhbGlkYXRlX3NvdXJjZS5qcyIsIm5vZGVfbW9kdWxlcy9tYXBib3gtZ2wtc3R5bGUtc3BlYy9saWIvdmFsaWRhdGUvdmFsaWRhdGVfc3RyaW5nLmpzIiwibm9kZV9tb2R1bGVzL21hcGJveC1nbC1zdHlsZS1zcGVjL2xpYi92YWxpZGF0ZV9zdHlsZS5taW4uanMiLCJub2RlX21vZHVsZXMvbWFwYm94LWdsLXN0eWxlLXNwZWMvbm9kZV9tb2R1bGVzL2xvZGFzaC5pc2VxdWFsL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL21hcGJveC1nbC1zdHlsZS1zcGVjL3JlZmVyZW5jZS9sYXRlc3QubWluLmpzIiwibm9kZV9tb2R1bGVzL21hcGJveC1nbC1zdHlsZS1zcGVjL3JlZmVyZW5jZS92OC5taW4uanNvbiIsIm5vZGVfbW9kdWxlcy9tYXBib3gtZ2wtc3VwcG9ydGVkL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3BhdGgtYnJvd3NlcmlmeS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9wYmYvYnVmZmVyLmpzIiwibm9kZV9tb2R1bGVzL3BiZi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9wb2ludC1nZW9tZXRyeS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9wcm9jZXNzL2Jyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvcXVpY2tzZWxlY3QvaW5kZXguanMiLCJub2RlX21vZHVsZXMvc2hlbGYtcGFjay9pbmRleC51bWQuanMiLCJub2RlX21vZHVsZXMvc3VwZXJjbHVzdGVyL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3RpbnlxdWV1ZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy91dGlsL25vZGVfbW9kdWxlcy9pbmhlcml0cy9pbmhlcml0c19icm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL3V0aWwvc3VwcG9ydC9pc0J1ZmZlckJyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvdXRpbC91dGlsLmpzIiwibm9kZV9tb2R1bGVzL3ZlY3Rvci10aWxlL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3ZlY3Rvci10aWxlL2xpYi92ZWN0b3J0aWxlLmpzIiwibm9kZV9tb2R1bGVzL3ZlY3Rvci10aWxlL2xpYi92ZWN0b3J0aWxlZmVhdHVyZS5qcyIsIm5vZGVfbW9kdWxlcy92ZWN0b3ItdGlsZS9saWIvdmVjdG9ydGlsZWxheWVyLmpzIiwibm9kZV9tb2R1bGVzL3Z0LXBiZi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy92dC1wYmYvbGliL2dlb2pzb25fd3JhcHBlci5qcyIsIm5vZGVfbW9kdWxlcy92dC1wYmYvdmVjdG9yLXRpbGUtcGIuanMiLCJub2RlX21vZHVsZXMvd2Vid29ya2lmeS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy93Z3M4NC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy93aG9vdHMtanMvaW5kZXgudW1kLmpzIiwicGFja2FnZS5qc29uIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUEsWUFBWSxDQUFDOztBQUViLEdBQUssQ0FBQyxvQkFBb0IsR0FBRyxPQUFPLENBQUMseUJBQXlCLENBQUMsQ0FBQzs7QUFFaEUsSUFBTSxPQUFPLEdBQUMsQUFDZCxBQUFJLGdCQUFXLENBQUMsWUFBWSxFQUFFLGVBQWUsRUFBRTtJQUMzQyxBQUFJLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO0lBQ3JDLEFBQUksSUFBSSxDQUFDLGVBQWUsR0FBRyxlQUFlLENBQUM7SUFDM0MsQUFBSSxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQztJQUMxQixBQUFJLElBQUksQ0FBQyxlQUFlLEdBQUcsQ0FBQyxDQUFDO0FBQ2pDLEFBQUksQ0FBQyxDQUFBLEFBQ0o7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXFCRCxJQUFNLFVBQVUsR0FBQyxBQUNqQixBQUFJLG1CQUFXLENBQUMsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDOztBQUFBO0lBQzdDLEFBQUksSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsTUFBQSxJQUFJLENBQUMsQ0FBQzs7SUFFbkMsQUFBSSxHQUFLLENBQUMscUJBQXFCLEdBQUcsZ0JBQWdCLENBQUMscUJBQXFCLENBQUM7SUFDekUsQUFBSSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxxQkFBcUIsRUFBRSxDQUFDOztJQUV6RCxBQUFJLEdBQUssQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQztJQUMvRCxBQUFJLElBQUksZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLGdCQUFnQixFQUFFLENBQUM7O0lBRXJFLEFBQUks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LElBQUksWUFBWSxHQUFHLFdBQVcsQ0FBQyxRQUFRLEVBQUU7WUFDekMsQUFBSSxJQUFJLFNBQVMsSUFBSSxNQUFNLENBQUMsV0FBVyxLQUFLLFdBQVcsQ0FBQyxRQUFRLEVBQUU7Z0JBQzlELEFBQUksSUFBSSxXQUFXLElBQUksU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLFNBQVM7WUFDbEcsQUFBSSxDQUFDLE1BQU0sSUFBSSxXQUFXLElBQUksU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLFNBQVM7UUFDekcsQUFBSSxDQUFDLE1BQU0sSUFBSSxXQUFXLElBQUksU0FBUyxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxTQUFTOztRQUUvRixBQUFJLEdBQUssQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFDLEVBQUU7WUFDcEIsQUFBSSxFQUFFLEdBQUcsTUFBTSxDQUFDLEVBQUU7WUFDbEIsQUFBSSxFQUFFLEdBQUcsTUFBTSxDQUFDLEVBQUU7WUFDbEIsQUFBSSxFQUFFLEdBQUcsTUFBTSxDQUFDLEVBQUU7WUFDbEIsQUFBSSxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUc7WUFDcEIsQUFBSSxXQUFXLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQzs7UUFFekMsQUFBSSxHQUFHLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMs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QUFJLEdBQUcsSUFBSSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzdCLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDbkMsR0FBSyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEIsR0FBSyxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDbkIsS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNsQyxHQUFLLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDdEIsR0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbEIsR0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLEdBQUssQ0FBQyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN2RCxHQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsS0FBSyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNyRSxHQUFLLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7O1lBRXhDLEdBQUssQ0FBQyxZQUFZLEdBQUcsT0FBTyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFD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QUFDLENBQUM7SUFDbEYsQUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQSxBQUFHLElBQUksUUFBSSxJQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUEsUUFBSSxJQUFFLFNBQVMsQ0FBQyxVQUFVLENBQUEsUUFBSSxDQUFDLENBQUMsQ0FBQzs7SUFFL0YsQUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLEtBQUksR0FBRSxJQUFJLEFBQUUsQ0FBQztBQUN0QyxBQUFJLENBQUMsQ0FBQTs7QUFFTCxBQUFJLCtCQUFBLDJCQUEyQix3Q0FBQSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDOztBQUFBO0lBQzNELEFBQUksR0FBSyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDOztJQUUxQyxBQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUEsNkJBQTRCLEdBQUUsSUFBSSxNQUFFLENBQUMsQ0FBQyxDQUFDOztJQUUvRCxBQUFJO0lBQ0osQUFBSSxHQUFHLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztJQUNyQixBQUFJLEdBQUssQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDLDJCQUEyQixDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM3RSxBQUFJLE9BQU8sUUFBUSxHQUFHLFVBQVUsQ0FBQyxNQUFNLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFHLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQztJQUNuRixBQUFJLEdBQUssQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7SUFFbEYsQUFBSSxHQUFLLENBQUMsS0FBSyxHQUFHLElBQUcsR0FBRSxJQUFJLE9BQUcsQUFBQyxDQUFDOztJ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LENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUM1QixBQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN2RSxBQUFJLENBQUMsTUFBTTtRQUNQLEFBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckQsQUFBSSxDQUFDO0FBQ1QsQUFBSSxDQUFDLENBQUE7O0FBRUwsQUFBSTtDQUNILEFBQUk7Q0FDSixBQUFJO0NBQ0osQUFBSTtDQUNKLEFBQUk7Q0FDSixBQUFJO0FBQ0wsQUFBSSx1QkFBQSxZQUFZLHlCQUFBLENBQUMsRUFBRSxFQUFFO0lBQ2pCLEFBQUksSUFBSSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2xDLEFBQUksT0FBTyxJQUFJLENBQUM7QUFDcEIsQUFBSSxDQUFDLENBQUE7O0FBRUwsQUFBSTtDQUNILEFBQUk7Q0FDSixBQUFJO0NBQ0osQUFBSTtDQUNKLEFBQUk7Q0FDSixBQUFJO0FBQ0wsQUFBSSx1QkFBQSxZQUFZLHlCQUFBLENBQUMsRUFBRSxFQUFFO0lBQ2pCLEFBQUksSUFBSSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2xDLEFBQUksT0FBTyxJQUFJLENBQUM7QUFDcEIsQUFBSSxDQUFDLENBQUE7O0FBRUwsQUFBSTtDQUNILEFBQUk7Q0FDSixBQUFJO0NBQ0osQUFBSTtDQUNKLEFBQUk7Q0FDSixBQUFJO0FBQ0wsQUFBSSx1QkFBQSxNQUFNLG1CQUFBLENBQUMsR0FBRyxFQUFFO0lBQ1osQUFBSSxHQUFLLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHO1FBQ25CLEFBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7SUFDdEIsQUFBSSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQzs7SUFFakIsQUFBSSxJQUFJLEdBQUcsWUFBWSxNQUFNLEVBQUU7UUFDM0IsQUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2QsQUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDOztJQUVsQixBQUFJLENBQUMsTUFBTSxJQUFJLEdBQUcsWUFBWSxZQUFZLEVBQUU7UUFDeEMsQUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQztRQUNsQixBQUFJLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDOztRQUVsQixBQUFJLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsT0FBTyxJQUFJLENBQUM7O0lBRXRDLEFBQUksQ0FBQyxNQUFNO1FBQ1AsQUFBSSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDeEIsQUFBSSxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUM5QixBQUFJLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDdEQsQUFBSSxDQUFDLE1BQU07Z0JBQ1AsQUFBSSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ2hELEFBQUksQ0FBQztRQUNULEFBQUksQ0FBQztRQUNMLEFBQUksT0FBTyxJQUFJLENBQUM7SUFDcEIsQUFBSSxDQUFDOztJQUVMLEFBQUksSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtRQUNoQixBQUFJLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDNUMsQUFBSSxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztJQUVoRCxBQUFJLENBQUMsTUFBTTtRQUNQLEFBQUksRUFBRSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZDLEFBQUksRUFBRSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZDLEFBQUksRUFBRSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZDLEFBQUksRUFBRSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzNDLEFBQUksQ0FBQzs7SUFFTCxBQUFJLE9BQU8sSUFBSSxDQUFDO0FBQ3BCLEFBQUksQ0FBQyxDQUFBOztBQUVMLEFBQUk7Q0FDSCxBQUFJO0NBQ0osQUFBSTtDQUNKLEFBQUk7Q0FDSixBQUFJO0NBQ0osQUFBSTtDQUNKLEFBQUk7Q0FDSixBQUFJO0FBQ0wsQUFBSSx1QkFBQSxTQUFTLHNCQUFBLEdBQUc7SUFDWixBQUFJLE9BQU8sSUFBSSxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDaEcsQUFBSSxD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SSxDQUFDLElBQUk7UUFDdEIsQUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQzs7SUFFdEMsQUFBSSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7UUFDbkIsQUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkMsQUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkMsQUFBSSxFQUFFLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQy9ELEFBQUksQ0FBQzs7SUFFTCxBQUFJLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtRQUNuQixBQUFJLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2QyxBQUFJLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2QyxBQUFJLEVBQUUsR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDL0QsQUFBSSxDQUFDOztJQUVMLEFBQUk7SUFDSixBQUFJLEdBQUssQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQzs7SUFFekMsQUFBSSxJQUFJLENBQUMsRUFBRTtRQUNQLEFBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FB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QUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7SUFFaEQsQUFBSTtJQUNKLEFBQUk7SUFDSixBQUFJLEdBQUssQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNILEFBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7SUFFL0MsQUFBSSxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQzs7SUFFeEIsQUFBSTtJQUNKLEFBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUN0QixBQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1RCxBQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JDLEFBQUksSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksWUFBWSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7O0lBRS9FLEFBQUk7SUFDSixBQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksWUFBWSxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUM1RCxBQUFJLElBQUksQ0FBQyxDQUFDLEVBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0lBQ3ZELEFBQUksSUFBSSxDQUFDLGtCQUFrQixHQUFHLENBQUMsQ0FBQzs7QUFFcEMsQUFBSSxDQUFDLENBQUEsQUFDSjs7bUVBQUE7O0FBRUQsTUFBTSxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUM7OztBQzliM0IsWUFBWSxDQUFDO0FBQ2IsR0FBSyxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQzs7QUFFakQsR0FBRyxDQUFDLGdCQUFnQixDQUFDOzs7Ozs7O0FBT3JCLE1BQU0sQ0FBQyxPQUFPLEdBQUcsU0FBUyxtQkFBbUIsSUFBSTtJQUM3QyxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7UUFDbkIsZ0JBQWdCLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQztLQUN2QztJQUNELE9BQU8sZ0JBQWdCLENBQUM7Q0FDM0IsQ0FBQzs7O0FDZkYsWUFBWSxDQUFDOzs7O0FBSWIsR0FBSyxDQUFDLFdBQVcsR0FBRztJQUNoQixHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDO0lBQ2IsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzlELElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNsRCxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDOUYsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdE0sR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDN08sR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQy9QLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUM1RCxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakYsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pGLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDdEUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQy9DLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlELEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3hCLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3pDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUIsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDbEksR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3hDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ25ILEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDckgsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdkQsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDbEksR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDaEwsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ2hELEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3hOLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzdLLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNwRixHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNoQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDL0MsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMvQixHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDMUosR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3haLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDbkUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN0TCxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3hJLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3hILEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzNGLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDdEUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNySyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3RFLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3ZCLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM1RSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3BFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM3QyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM1RixHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3JFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDOUosR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUM5RyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JMLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3JJLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3hKLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUMvQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDL0UsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzlDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzVGLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMvQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN0RCxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3JFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0YsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMzQixHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQy9GLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3BGLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxQixHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDNUQsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2xJLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNsSSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMzRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDbEksR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDaEksR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3BFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDekssR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNwRixHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDbEUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekYsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNuRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN2QixHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDbkosR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNwRixHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNoSSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNuSSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNuSSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDbkUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDaEksR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ2pFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDaEYsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzlDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzVGLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMvQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDckUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuUixHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hCLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcFIsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0NBQ2xMLENBQUM7O0FBRUYsTUFBTSxDQUFDLE9BQU8sR0FBRyxTQUFTLFlBQVksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUU7SUFDaEUsS0FB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QUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU07UUFDWixFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUc7UUFDVCxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU07UUFDWixFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUc7UUFDVCxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsTUFBTTtRQUN2QixFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRztLQUNwQixDQUFDO0NBQ0w7O0FBRUQsU0FBUyxTQUFTLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRTtJQUM3QyxHQUFLLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDN0MsR0FBSyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDOzs7SUFHNUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDaEMsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDdkMsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtRQUM3QyxHQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0tBQ2pDOzs7SUFHRCxHQUFLLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUN6QixHQUFLLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUN6QixHQUFLLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3JCLEdBQUssQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDckIsS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQzFCLEdBQUssQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDckUsR0FBSyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUNyRSxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0tBQzlDO0NBQ0o7O0FBRUQsU0FBUyxZQUFZLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUU7SUFD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UUFDbkMsR0FBSyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEIsR0FBRyxDQUFDLFdBQVcsQ0FBQzs7UUFFaEIsS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDdEMsR0FBRyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakIsR0FBRyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDOzs7WUFHckIsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDeEIsU0FBUzthQUNaLE1BQU0sSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDbEIsRUFBRSxHQUFHLElBQUksS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7YUFDckYsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNsQixFQUFFLEdBQUcsSUFBSSxLQUFLLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFD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QUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDN0Q7S0FDSjs7SUFFRCxJQUFJLEtBQUssRUFBRTtRQUNQLEdBQUssQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7WUFDdkIsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDO1lBQ3JCLE1BQU0sR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7O1FBRW5DLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3hCLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3hCLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3hCLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0tBQzNCOztJQUVELE9BQU8sQ0FBQyxJQUFJLFVBQVUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztDQUMzSDs7Ozs7Ozs7Ozs7Ozs7QUFjRCxTQUFTLGFBQWEsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRTs7SUFFdEUsR0FBSyxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcs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QUFDLEVBQUU7WUFDVixHQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDdkcsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztTQUM3Qzs7UUFFRCxTQUFTLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtRQUM3RCxTQUFTLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtRQUM3RCxTQUFTLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTs7O1FBRzlDLEdBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOzs7Ozs7OztRQVFoQixHQUFHLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEdBQUcs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QUc7SUFDZCxBQUFJLEdBQUssQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUU7UUFDcEMsQUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7UUFDOUIsQUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUU7UUFDcEMsQUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7UUFDaEMsQUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDOztJQUV0RSxBQUFJLEdBQUcsQ0FBQyxJQUFJLEdBQUcsR0FBRSxJQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQSxNQUN2QyxBQUFJLEFBQUUsSUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQSxNQUNyQyxBQUFJLEFBQUUsSUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQSxBQUFFLENBQUM7O0lBRWhELEFBQUksSUFBSSxPQUFPLElBQUksS0FBSyxFQUFFLElBQUksSUFBSSxDQUFDLENBQUEsR0FBRSxJQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQSxDQUFFLENBQUMsQ0FBQztJQUN4RSxBQUFJLElBQUksS0FBSyxFQUFFLElBQUksSUFBSSxDQUFDLENBQUEsR0FBRSxJQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUEsQ0FBRSxDQUFDLENBQUM7O0lBRWpELEFBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNsRCxBQUFJLENBQUMsQ0FBQSxBQUNKOztBQUVELE1BQU0sQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDOzs7QUM1RXRCLFlBQVksQ0FBQzs7QUFFYixHQUFLLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUNyQyxHQUFLLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBQzNDLEdBQUssQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFDekMsR0FBSyxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7O0FBRW5DLEdBQUssQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFDeEMsR0FBSyxDQUFDLGFBQWEsR0FBRyxPQUFPLENBQUMseUJBQXlCLENBQUMsQ0FBQztBQUN6RCxHQUFLLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDOztBQUU3QyxHQUFLLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0FBQzlDLEdBQUssQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDOztBQUUvQixHQUFLLENBQUMsWUFBWSxHQUFHLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDOztBQUVoRCxHQUFLLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUNuQyxHQUFLLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBQ3pDLEdBQUssQ0FBQyxZQUFZLEdBQUcsT0FBTyxDQUFDLHVCQUF1QixDQUFDLENBQUM7QUFDdEQsR0FBSyxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUN4QyxHQUFLLENBQUMsa0JBQWtCLEdBQUcsT0FBTyxDQUFDLCtCQUErQixDQUFDLENBQUM7QUFDcEUsR0FBSyxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FBQzs7QUFFbkQsR0FBSyxDQUFDLGNBQWMsR0FBRyxDQUFDLENBQUM7QUFDekIsR0FBSyxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUM7QUFDMUIsR0FBSyxDQUFDLGNBQWMsR0FBRztJQUNuQixNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2QsSUFBSSxFQUFFLENBQUM7SUFDUCxPQUFPLEVBQUUsQ0FBQztJQUNWLEtBQUssRUFBRSxDQUFDOztJQUVSLE9BQU8sRUFBRSxjQUFjO0lBQ3ZCLE9BQU8sRUFBRSxjQUFjOztJQUV2QixXQUFXLEVBQUUsSUFBSTs7SUFFakIsVUFBVSxFQUFFLElBQUk7SUFDaEIsT0FBTyxFQUFFLElBQUk7SUFDYixVQUFVLEVBQUUsSUFBSTtJQUNoQixPQUFPLEVBQUUsSUFBSTtJQUNiLFFBQVEsRUFBRSxJQUFJO0lBQ2QsZUFBZSxFQUFFLElBQUk7SUFDckIsZUFBZSxFQUFFLElBQUk7O0lBRXJCLFdBQVcsRUFBRSxDQUFDOztJQUVkLElBQUksRUFBRSxLQUFLOztJQUVYLGtCQUFrQixFQUFFLElBQUk7O0lBRXhCLDRCQUE0QixFQUFFLEtBQUs7SUFDbkMscUJBQXFCLEVBQUUsS0FBSzs7SUFFNUIsV0FBVyxFQUFFLElBQUk7O0lBRWpCLGlCQUFpQixFQUFFLElBQUk7Q0FDMUIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBd0VGLElBQU0sR0FBRyxHQUFlO0VBQUMsQUFFckIsWUFBVyxDQUFDLE9BQU8sRUFBRSxDQUFDOztBQUFBO1FBQ2xCLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxjQUFjLEVBQUUsT0FBTyxDQUFDLENBQUM7O1FBRW5ELEdBQUssQ0FBQyxTQUFTLEdBQUcsSUFBSSxTQUFTLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQzdGLE1BQUssS0FBQSxDQUFDLE1BQUEsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDOztRQUUxQixJQUFJLENBQUMsWUFBWSxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUM7UUFDeEMsSUFBSSxDQUFDLDZCQUE2QixHQUFHLE9BQU8sQ0FBQyw0QkFBNEIsQ0FBQztRQUMxRSxJQUFJLENBQUMsc0JBQXNCLEdBQUcsT0FBTyxDQUFDLHFCQUFxQixDQUFDO1FBQzVELElBQUksQ0FBQyxZQUFZLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQztRQUN4QyxJQUFJLENBQUMsWUFBWSxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUM7O1FBRXhDLElBQUksT0FBTyxPQUFPLENBQUMsU0FBUyxLQUFLLFFBQVEsRUFBRTtZQUN2QyxJQUFJLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNwRSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLENBQUEsYUFBWSxJQUFFLE9BQU8sQ0FBQyxTQUFTLENBQUEsaUJBQWEsQ0FBQyxDQUFDLENBQUM7U0FDeEYsTUFBTTtZQUNILElBQUksQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQztTQUN2Qzs7UUFFRCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksYUFBYSxFQUFFLENBQUM7O1FBRXpDLElBQUksT0FBTyxDQUFDLFNBQVMsRUFBRTtZQUNuQixJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUN4Qzs7UUFFRCxJQUFJLENBQUMsT0FBTyxDQUFDO1lBQ1QsaUJBQWlCO1lBQ2pCLGlCQUFpQjtZQUNqQixjQUFjO1lBQ2Qsa0JBQWtCO1lBQ2xCLFNBQVM7WUFDVCxTQUFTO1lBQ1QsU0FBUztZQUNULGdCQUFnQjtTQUNuQixFQUFFLElBQUksQ0FBQyxDQUFDOztRQUVULElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7O1FBRXJCLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLFNBQUEsR0FBRyxBQUFHO1lBQ3JCLE1BQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzVCLE1BQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztTQUNwQixDQUFDLENBQUM7O1FBRUgsSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXLEVBQUU7WUFDL0IsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsZUFBZSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQy9ELE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLGVBQWUsRUFBRSxLQUFLLENBQUMsQ0FBQztTQUNsRTs7UUFFRCxZQUFZLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDOztRQUU1QixJQUFJLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDOztRQUV0RCxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLEVBQUU7WUFDNUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztnQkFDUixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07Z0JBQ3RCLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtnQkFDbEIsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPO2dCQUN4QixLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUs7YUFDdkIsQ0FBQyxDQUFDO1NBQ047O1FBRUQsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7O1FBRW5CLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQzs7UUFFZCxJQUFJLE9BQU8sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdEQsSUFBSSxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDOztRQUVoRCxJQUFJLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksa0JBQWtCLEVBQUUsQ0FBQyxDQUFDOztRQUUxRSxJQUFJLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxXQUFXO1lBQzdCLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUU7Z0JBQzNCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQzthQUN0QztZQUNELElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztTQUN6RCxDQUFDLENBQUM7O1FBRUgsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztLQUMvQzs7Ozs7O2dJQUFBOzs7Ozs7Ozs7OztJQVdELGNBQUEsVUFBVSx1QkFBQSxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUU7UUFDMUIsSUFBSSxRQUFRLEtBQUssU0FBUyxJQUFJLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRTtZQUN0RCxRQUFRLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixFQUFFLENBQUM7U0FDM0M7UUFDRCxJQUFJLFFBQVEsS0FBSyxTQUFTLEVBQUU7WUFDeEIsUUFBUSxHQUFHLFdBQVcsQ0FBQztTQUMxQjtRQUNELEdBQUssQ0FBQyxjQUFjLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQyxHQUFLLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzNELElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtZQUNuQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsY0FBYyxFQUFFLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQ2hGLE1BQU07WUFDSCxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLENBQUM7U0FDakQ7UUFDRCxPQUFPLElBQUksQ0FBQztLQUNmLENBQUE7Ozs7Ozs7O0lBUUQsY0FBQSxhQUFhLDBCQUFBLENBQUMsT0FBTyxFQUFFO1FBQ25CLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkIsT0FBTyxJQUFJLENBQUM7S0FDZixDQUFBOzs7Ozs7Ozs7Ozs7Ozs7O0lBZ0JELGNBQUEsUUFBUSxxQkFBQSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUU7UUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQywwRkFBMEYsQ0FBQyxDQUFDO1FBQzFHLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssS0FBSyxFQUFFLEVBQUUsT0FBTyxJQUFJLENBQUM7UUFDbkUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxPQUFPLENBQUM7O1FBRTdCLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzNDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUM3QixDQUFBOzs7Ozs7Ozs7Ozs7SUFZRCxjQUFBLFdBQVcsd0JBQUEsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFO1FBQ3hCLElBQUksQ0FBQyxRQUFRLENBQUMsMEZBQTBGLENBQUMsQ0FBQztRQUMxRyxHQUFLLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLEtBQUssRUFBRSxFQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsYUFBYSxHQUFHLE9BQU8sQ0FBQzs7UUFFN0IsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDM0MsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQzdCLENBQUE7Ozs7Ozs7Ozs7OztJQVlELGNBQUEsVUFBVSx1QkFBQSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUU7UUFDekIsSUFBSSxDQUFDLFFBQVEsQ0FBQywwRkFBMEYsQ0FBQyxDQUFDO1FBQzFHLEdBQUssQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDckMsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7U0FDM0Q7UUFDRCxJQUFJLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLGFBQWEsR0FBRyxPQUFPLENBQUM7O1FBRTdCLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzNDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUM3QixDQUFBOzs7Ozs7Ozs7OztJQVdELGNBQUEsUUFBUSxxQkFBQSxDQUFDLEtBQUssRUFBRTtRQUNaLElBQUksQ0FBQyxRQUFRLENBQUMsMEZBQTBGLENBQUMsQ0FBQztRQUMxRyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUM1QyxDQUFBOzs7Ozs7Ozs7SUFTRCxjQUFBLFVBQVUsdUJBQUEsR0FBRztRQUNULElBQUksQ0FBQyxRQUFRLENBQUMsMEZBQTBGLENBQUMsQ0FBQztRQUMxRyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7S0FDeEIsQ0FBQTs7Ozs7Ozs7Ozs7SUFXRCxjQUFBLE1BQU0sbUJBQUEsR0FBRztRQUNMLEdBQUssQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDL0MsR0FBSyxDQUFDLEtBQUssR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUIsR0FBSyxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7O1FBRTdCLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7O1FBRW5DLEdBQUssQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDM0IsR0FBSyxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM5RCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxPQUFPLEVBQUU7WUFDL0QsSUFBSSxDQUFDLFFBQVE7Z0JBQ1QsMkRBQTBELEFBQUM7Z0JBQzNELEdBQUUsR0FBRSxPQUFPLFdBQU8sR0FBRSxPQUFPLFNBQUssQUFBQzthQUNwQyxDQUFDO1NBQ0w7O1FBRUQsT0FBTyxJQUFJO2FBQ04sSUFBSSxDQUFDLFdBQVcsQ0FBQzthQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDO2FBQ1osSUFBSSxDQUFDLFFBQVEsQ0FBQzthQUNkLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztLQUN4QixDQUFBOzs7Ozs7O0lBT0QsY0FBQSxTQUFTLHNCQUFBLEdBQUc7UUFDUixHQUFLLENBQUMsTUFBTSxHQUFHLElBQUksWUFBWTtZQUMzQixJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNqRSxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7O1FBRXRFLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUU7WUFDOUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pGLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNwRjs7UUFFRCxPQUFPLE1BQU0sQ0FBQztLQUNqQixDQUFBOzs7Ozs7Ozs7Ozs7Ozs7SUFlRCxjQUFBLFlBQVksQUFBQyx5QkFBQSxDQUFDLFlBQVksRUFBRTtRQUN4QixJQUFJLFlBQVksRUFBRTtZQUNkLEdBQUssQ0FBQyxDQUFDLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUM3QyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUNyRCxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUN2RCxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQzVCLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUNsQixNQUFNLElBQUksWUFBWSxLQUFLLElBQUksSUFBSSxZQUFZLEtBQUssU0FBUyxFQUFFO1lBQzVELElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztZQUM3QixJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQ2xCO1FBQ0QsT0FBTyxJQUFJLENBQUM7O0tBRWYsQ0FBQTs7Ozs7Ozs7OztJQVVELGNBQUEsVUFBVSx1QkFBQSxDQUFDLE9BQU8sRUFBRTs7UUFFaEIsT0FBTyxHQUFHLE9BQU8sS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLFNBQVMsR0FBRyxjQUFjLEdBQUcsT0FBTyxDQUFDOztRQUUvRSxJQUFJLE9BQU8sSUFBSSxjQUFjLElBQUksT0FBTyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFO1lBQ2hFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztZQUNqQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7O1lBRWYsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUcsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7O1lBRXBELE9BQU8sSUFBSSxDQUFDOztTQUVmLE1BQU0sTUFBTSxJQUFJLEtBQUssQ0FBQyxDQUFBLDBCQUF5QixHQUFFLGNBQWMsd0NBQW9DLENBQUMsQ0FBQyxDQUFDO0tBQzFHLENBQUE7Ozs7Ozs7SUFPRCxjQUFBLFVBQVUsdUJBQUEsR0FBRyxFQUFFLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFBOzs7Ozs7Ozs7OztJQVcvQyxjQUFBLFVBQVUsdUJBQUEsQ0FBQyxPQUFPLEVBQUU7O1FBRWhCLE9BQU8sR0FBRyxPQUFPLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxTQUFTLEdBQUcsY0FBYyxHQUFHLE9BQU8sQ0FBQzs7UUFFL0UsSUFBSSxPQUFPLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUU7WUFDbkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1lBQ2pDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQzs7WUFFZixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQzs7WUFFcEQsT0FBTyxJQUFJLENBQUM7O1NBRWYsTUFBTSxNQUFNLElBQUksS0FBSyxDQUFDLGtEQUFpRCxBQUFDLENBQUMsQ0FBQztLQUM5RSxDQUFBOzs7Ozs7O0lBT0QsY0FBQSxVQUFVLHVCQUFBLEdBQUcsRUFBRSxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQTs7Ozs7Ozs7O0lBUy9DLGNBQUEsT0FBTyxvQkFBQSxDQUFDLE1BQU0sRUFBRTtRQUNaLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0tBQy9ELENBQUE7Ozs7Ozs7Ozs7SUFVRCxjQUFBLFNBQVMsc0JBQUEsQ0FBQyxLQUFLLEVBQUU7UUFDYixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztLQUM3RCxDQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBNEVELGNBQUEscUJBQXFCLGtDQUFBLEdBQUc7UUFDcEIsR0FBRyxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDaEIsR0FBRyxDQUFDLFFBQVEsQ0FBQzs7UUFFYixJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3hCLFFBQVEsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDeEIsTUFBTSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUN6QixNQUFNLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQzVELFFBQVEsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDM0IsTUFBTSxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQy9CLE1BQU0sR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDekI7O1FBRUQsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLHFCQUFxQjtZQUNuQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDO1lBQ2pDLE1BQU07WUFDTixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUk7WUFDbkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLO1NBQ3ZCLENBQUM7O1FBRUYsU0FBUyxXQUFXLENBQUMsS0FBSyxFQUFFO1lBQ3hCLE9BQU8sS0FBSyxZQUFZLEtBQUssSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3pEO0tBQ0osQ0FBQTs7SUFFRCxjQUFBLGtCQUFrQiwrQkFBQSxDQUFDLFVBQVUsRUFBRSxDQUFDOztBQUFBO1FBQzVCLElBQUksVUFBVSxLQUFLLFNBQVMsRUFBRTs7WUFFMUIsVUFBVSxHQUFHO2dCQUNULEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQy9ELENBQUM7U0FDTDs7UUFFRCxHQUFHLENBQUMsYUFBYSxDQUFDO1FBQ2xCLEdBQUssQ0FBQyxPQUFPLEdBQUcsVUFBVSxZQUFZLEtBQUssSUFBSSxPQUFPLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxRQUFRLENBQUM7O1FBRWpGLElBQUksT0FBTyxFQUFFO1lBQ1QsR0FBSyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3hDLGFBQWEsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQzNCLE1BQU07WUFDSCxHQUFLLENBQUMsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekUsYUFBYSxHQUFHO2dCQUNaLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ04sSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM3QixHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUNOLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDN0IsR0FBRyxDQUFDLENBQUMsQ0FBQzthQUNULENBQUM7U0FDTDs7UUFFRCxhQUFhLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FBQyxTQUFBLENBQUMsQ0FBQyxFQUFFLEFBQUc7WUFDckMsT0FBTyxNQUFJLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUM1QyxDQUFDLENBQUM7O1FBRUgsT0FBTyxhQUFhLENBQUM7S0FDeEIsQ0FBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBaUNELGNBQUEsbUJBQW1CLGdDQUFBLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRTtRQUN0QyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0tBQy9ELENBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7SUFnQkQsY0FBQSxRQUFRLHFCQUFBLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRTtRQUNyQixHQUFLLENBQUMsYUFBYSxHQUFHLENBQUMsQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLEtBQUs7WUFDN0UsQ0FBQyxDQUFDLEtBQUssWUFBWSxLQUFLLENBQUMsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUM7UUFDM0QsSUFBSSxhQUFhLEVBQUU7WUFDZixJQUFJO2dCQUNBLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUU7b0JBQzVCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQ3RCO2dCQUNELE9BQU8sSUFBSSxDQUFDO2FBQ2YsQ0FBQyxPQUFPLENBQUMsRUFBRTtnQkFDUixJQUFJLENBQUMsUUFBUSxDQUFDLENBQUEsZ0NBQStCLElBQUUsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQSwwQ0FBc0MsQ0FBQyxDQUFDLENBQUM7YUFDcEg7U0FDSjs7UUFFRCxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDWixJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUM5QyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1NBQ2hEOztRQUVELElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDUixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztZQUNsQixPQUFPLElBQUksQ0FBQztTQUNmLE1BQU0sSUFBSSxLQUFLLFlBQVksS0FBSyxFQUFFO1lBQy9CLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1NBQ3RCLE1BQU07WUFDSCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztTQUN2Qzs7UUFFRCxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQzs7UUFFdkQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDOztRQUU1QyxPQUFPLElBQUksQ0FBQztLQUNmLENBQUE7Ozs7Ozs7SUFPRCxjQUFBLFFBQVEscUJBQUEsR0FBRztRQUNQLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNaLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztTQUNqQztLQUNKLENBQUE7Ozs7Ozs7Ozs7Ozs7OztJQWVELGNBQUEsU0FBUyxzQkFBQSxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUU7UUFDbEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkIsT0FBTyxJQUFJLENBQUM7S0FDZixDQUFBOzs7Ozs7OztJQVFELGNBQUEsY0FBYywyQkFBQSxDQUFDLEVBQUUsRUFBRTtRQUNmLEdBQUssQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN6RCxJQUFJLE1BQU0sS0FBSyxTQUFTLEVBQUU7WUFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQ2YsS0FBSyxFQUFFLElBQUksS0FBSyxDQUFDLENBQUEsOEJBQTZCLEdBQUUsRUFBRSxNQUFFLENBQUMsQ0FBQzthQUN6RCxDQUFDLENBQUM7WUFDSCxPQUFPO1NBQ1Y7UUFDRCxPQUFPLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztLQUMxQixDQUFBOzs7Ozs7Ozs7O0lBVUQsY0FBQSxhQUFhLDBCQUFBLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUU7UUFDdEMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0tBQy9ELENBQUE7Ozs7Ozs7O0lBUUQsY0FBQSxZQUFZLHlCQUFBLENBQUMsRUFBRSxFQUFFO1FBQ2IsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuQixPQUFPLElBQUksQ0FBQztLQUNmLENBQUE7Ozs7Ozs7Ozs7OztJQVlELGNBQUEsU0FBUyxzQkFBQSxDQUFDLEVBQUUsRUFBRTtRQUNWLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7S0FDbkMsQ0FBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFpQkQsY0FBQSxRQUFRLHFCQUFBLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRTtRQUNwQixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDbkMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuQixPQUFPLElBQUksQ0FBQztLQUNmLENBQUE7Ozs7Ozs7Ozs7SUFVRCxjQUFBLFNBQVMsc0JBQUEsQ0FBQyxFQUFFLEVBQUUsUUFBUSxFQUFFO1FBQ3BCLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25CLE9BQU8sSUFBSSxDQUFDO0tBQ2YsQ0FBQTs7Ozs7Ozs7O0lBU0QsY0FBQSxXQUFXLHdCQUFBLENBQUMsRUFBRSxFQUFFO1FBQ1osSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDM0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuQixPQUFPLElBQUksQ0FBQztLQUNmLENBQUE7Ozs7Ozs7Ozs7O0lBV0QsY0FBQSxRQUFRLHFCQUFBLENBQUMsRUFBRSxFQUFFO1FBQ1QsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztLQUNsQyxDQUFBOzs7Ozs7Ozs7Ozs7Ozs7SUFlRCxjQUFBLFNBQVMsc0JBQUEsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFO1FBQ3JCLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25CLE9BQU8sSUFBSSxDQUFDO0tBQ2YsQ0FBQTs7Ozs7Ozs7Ozs7O0lBWUQsY0FBQSxpQkFBaUIsOEJBQUEsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRTtRQUN6QyxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDeEQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuQixPQUFPLElBQUksQ0FBQztLQUNmLENBQUE7Ozs7Ozs7O0lBUUQsY0FBQSxTQUFTLHNCQUFBLENBQUMsS0FBSyxFQUFFO1FBQ2IsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUN0QyxDQUFBOzs7Ozs7Ozs7Ozs7Ozs7OztJQWlCRCxjQUFBLGdCQUFnQiw2QkFBQSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRTtRQUN4QyxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3ZELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkIsT0FBTyxJQUFJLENBQUM7S0FDZixDQUFBOzs7Ozs7Ozs7O0lBVUQsY0FBQSxnQkFBZ0IsNkJBQUEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRTtRQUNqQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztLQUMxRCxDQUFBOzs7Ozs7Ozs7Ozs7SUFZRCxjQUFBLGlCQUFpQiw4QkFBQSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFO1FBQ2xDLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNqRCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25CLE9BQU8sSUFBSSxDQUFDO0tBQ2YsQ0FBQTs7Ozs7Ozs7O0lBU0QsY0FBQSxpQkFBaUIsOEJBQUEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFO1FBQzNCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7S0FDcEQsQ0FBQTs7Ozs7Ozs7SUFRRCxjQUFBLFFBQVEscUJBQUEsQ0FBQyxZQUFZLEVBQUU7UUFDbkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuQixPQUFPLElBQUksQ0FBQztLQUNmLENBQUE7Ozs7Ozs7SUFPRCxjQUFBLFFBQVEscUJBQUEsR0FBRztRQUNQLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztLQUNoQyxDQUFBOzs7Ozs7O0lBT0QsY0FBQSxZQUFZLHlCQUFBLEdBQUc7UUFDWCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7S0FDMUIsQ0FBQTs7Ozs7Ozs7Ozs7Ozs7O0lBZUQsY0FBQSxrQkFBa0IsK0JBQUEsR0FBRztRQUNqQixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztLQUNoQyxDQUFBOzs7Ozs7Ozs7O0lBVUQsY0FBQSxTQUFTLHNCQUFBLEdBQUc7UUFDUixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7S0FDdkIsQ0FBQTs7SUFFRCxjQUFBLG9CQUFvQixpQ0FBQSxHQUFHO1FBQ25CLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7O1FBRWYsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ2pCLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsSUFBSSxHQUFHLENBQUM7WUFDM0MsTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxJQUFJLEdBQUcsQ0FBQztTQUNoRDs7UUFFRCxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0tBQzFCLENBQUE7O0lBRUQsY0FBQSxlQUFlLDRCQUFBLEdBQUc7UUFDZCxHQUFLLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDbEMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUM7O1FBRXhDLEdBQUssQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLDJCQUEyQixFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzFHLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNuQixlQUFlLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1NBQ3pEOztRQUVELElBQUksQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsaUJBQWlCLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFDeEUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQztRQUN6QyxJQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDNUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxzQkFBc0IsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDcEYsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQzs7UUFFL0MsR0FBSyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUMvQyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7UUFFakQsR0FBSyxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSw0QkFBNEIsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUM3RyxHQUFLLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxFQUFFLENBQUM7UUFDOUMsQ0FBQyxVQUFVLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxjQUFjLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBQSxDQUFDLFlBQVksRUFBRSxBQUFHO1lBQy9FLFNBQVMsQ0FBQyxZQUFZLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFBLGdCQUFlLEdBQUUsWUFBWSxDQUFFLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztTQUNsRyxDQUFDLENBQUM7S0FDTixDQUFBOztJQUVELGNBQUEsYUFBYSwwQkFBQSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUU7UUFDekIsR0FBSyxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLElBQUksQ0FBQyxDQUFDOzs7UUFHaEQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUN4QyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxVQUFVLEdBQUcsTUFBTSxDQUFDOzs7UUFHMUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLEFBQUcsS0FBSyxPQUFHLEFBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQUFBRyxNQUFNLE9BQUcsQUFBQyxDQUFDO0tBQzdDLENBQUE7O0lBRUQsY0FBQSxhQUFhLDBCQUFBLEdBQUc7UUFDWixHQUFLLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDM0IsNEJBQTRCLEVBQUUsSUFBSSxDQUFDLDZCQUE2QjtZQUNoRSxxQkFBcUIsRUFBRSxJQUFJLENBQUMsc0JBQXNCO1NBQ3JELEVBQUUsV0FBVyxDQUFDLHNCQUFzQixDQUFDLENBQUM7O1FBRXZDLEdBQUssQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQztZQUNuRCxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsRUFBRSxVQUFVLENBQUMsQ0FBQzs7UUFFOUQsSUFBSSxDQUFDLEVBQUUsRUFBRTtZQUNMLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksS0FBSyxDQUFDLDRCQUE0QixDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZFLE9BQU87U0FDVjs7UUFFRCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksT0FBTyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7S0FDbEQsQ0FBQTs7Ozs7Ozs7Ozs7SUFXRCxjQUFBLFlBQVkseUJBQUEsQ0FBQyxLQUFLLEVBQUU7UUFDaEIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNmLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ3RDO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0tBQ3pELENBQUE7Ozs7Ozs7Ozs7O0lBV0QsY0FBQSxnQkFBZ0IsNkJBQUEsQ0FBQyxLQUFLLEVBQUU7UUFDcEIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNkLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNmLElBQUksQ0FBQyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxhQUFhLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztLQUM3RCxDQUFBOzs7Ozs7Ozs7OztJQVdELGNBQUEsTUFBTSxtQkFBQSxHQUFHO1FBQ0wsSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxhQUFhO1lBQ3RDLE9BQU8sS0FBSyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUU7WUFDbkMsT0FBTyxLQUFLLENBQUM7UUFDakIsT0FBTyxJQUFJLENBQUM7S0FDZixDQUFBOzs7Ozs7Ozs7O0lBVUQsY0FBQSxPQUFPLG9CQUFBLENBQUMsV0FBVyxFQUFFO1FBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLE9BQU8sSUFBSSxDQUFDOztRQUU3QixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLElBQUksV0FBVyxDQUFDO1FBQ25ELElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDOztRQUUxQixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7O1FBRWpCLE9BQU8sSUFBSSxDQUFDO0tBQ2YsQ0FBQTs7Ozs7Ozs7SUFRRCxjQUFBLE9BQU8sb0JBQUEsR0FBRztRQUNOLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ2hDLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1lBQ3pCLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3JELElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1lBQzFCLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDaEQ7O1FBRUQsSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDbEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7WUFDM0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQzdDOztRQUVELElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDNUIsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLGtCQUFrQjtZQUMzQyxxQkFBcUIsRUFBRSxJQUFJLENBQUMsc0JBQXNCO1lBQ2xELFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUN2QixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87U0FDeEIsQ0FBQyxDQUFDOztRQUVILElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7O1FBRXBCLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNoQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztZQUNwQixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3JCOztRQUVELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDOztRQUVyQixJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUMvQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztTQUMzQjs7UUFFRCxJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ3pELElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztTQUNwQjs7UUFFRCxPQUFPLElBQUksQ0FBQztLQUNmLENBQUE7Ozs7Ozs7SUFPRCxjQUFBLE1BQU0sbUJBQUEsR0FBRztRQUNMLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3BDLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ25DLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEIsSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXLEVBQUU7WUFDL0IsTUFBTSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsZUFBZSxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQ3JFO1FBQ0QsR0FBSyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUNyRSxJQUFJLFNBQVMsRUFBRSxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDdkMsVUFBVSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ2xDLFVBQVUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDakQsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztLQUN2QixDQUFBOztJQUVELGNBQUEsU0FBUyxzQkFBQSxHQUFHO1FBQ1IsSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUM5QixJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQy9DO0tBQ0osQ0FBQTs7SUFFRCxjQUFBLGVBQWUsNEJBQUEsR0FBRztRQUNkLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztLQUNsQixDQUFBOztJQUVELGNBQUEsZUFBZSw0QkFBQSxHQUFHO1FBQ2QsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ25CLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUNsQztLQUNKLENBQUE7Ozs7Ozs7Ozs7O0lBV0QsbUJBQUEsQUFBSSxrQkFBa0IsZ0JBQUEsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLENBQUE7SUFDL0QsbUJBQUEsQUFBSSxrQkFBa0IsZ0JBQUEsQ0FBQyxLQUFLLEVBQUU7UUFDMUIsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEtBQUssS0FBSyxFQUFFLE9BQU87UUFDL0MsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEtBQUssQ0FBQztRQUNqQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7S0FDbEIsQ0FBQTs7Ozs7Ozs7Ozs7OztJQWFELG1CQUFBLEFBQUksa0JBQWtCLGdCQUFBLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsRUFBRSxDQUFBO0lBQy9ELG1CQUFBLEFBQUksa0JBQWtCLGdCQUFBLENBQUMsS0FBSyxFQUFFO1FBQzFCLElBQUksSUFBSSxDQUFDLG1CQUFtQixLQUFLLEtBQUssRUFBRSxPQUFPO1FBQy9DLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUM7UUFDakMsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztLQUMvQixDQUFBOzs7Ozs7Ozs7Ozs7OztJQWNELG1CQUFBLEFBQUkscUJBQXFCLGdCQUFBLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsRUFBRSxDQUFBO0lBQ3JFLG1CQUFBLEFBQUkscUJBQXFCLGdCQUFBLENBQUMsS0FBSyxFQUFFO1FBQzdCLElBQUksSUFBSSxDQUFDLHNCQUFzQixLQUFLLEtBQUssRUFBRSxPQUFPO1FBQ2xELElBQUksQ0FBQyxzQkFBc0IsR0FBRyxLQUFLLENBQUM7UUFDcEMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0tBQ2xCLENBQUE7Ozs7Ozs7Ozs7O0lBV0QsbUJBQUEsQUFBSSxPQUFPLGdCQUFBLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQTtJQUN6QyxtQkFBQSxBQUFJLE9BQU8sZ0JBQUEsQ0FBQyxLQUFLLEVBQUUsRUFBRSxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUE7OztJQUc3RCxtQkFBQSxBQUFJLFFBQVEsZ0JBQUEsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFBO0lBQzNDLG1CQUFBLEFBQUksUUFBUSxnQkFBQSxDQUFDLEtBQUssRUFBRSxFQUFFLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQTs7SUFFL0QsY0FBQSxPQUFPLG9CQUFBLENBQUMsS0FBSyxFQUFFO1FBQ1gsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxLQUFLLE9BQU8sQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQSxDQUFHLEtBQUssQ0FBQyxRQUFRLENBQUEsU0FBSyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7S0FDN0MsQ0FBQTs7SUFFRCxjQUFBLGNBQWMsMkJBQUEsQ0FBQyxLQUFLLEVBQUU7UUFDbEIsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBLENBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQSxnQkFBWSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7S0FDcEQsQ0FBQSxBQUNKOzs7OztFQXRyQ2lCLE1Bc3JDakIsR0FBQTs7QUFFRCxNQUFNLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQzs7QUFFckIsU0FBUyxVQUFVLENBQUMsSUFBSSxFQUFFO0lBQ3RCLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtRQUNqQixJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUNyQztDQUNKOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDOXpDRCxZQUFZLENBQUM7O0FBRWIsR0FBSyxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7QUFDbkMsR0FBSyxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUN6QyxHQUFLLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7O0FBYXhDLElBQU0sTUFBTSxHQUFDLEFBRWIsQUFBSSxlQUFXLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRTtJQUM5QixBQUFJLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDOztJQUV0RSxBQUFJLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0MsQUFBSSxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDOztJQUVuRCxBQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUMsQUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQzdDLEFBQUksSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUM7O0lBRTVCLEFBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7QUFDM0IsQUFBSSxDQUFDLENBQUE7O0FBRUwsQUFBSTtDQUNILEFBQUk7Q0FDSixBQUFJO0NBQ0osQUFBSTtDQUNKLEFBQUk7QUFDTCxBQUFJLGlCQUFBLEtBQUssa0JBQUEsQ0FBQyxHQUFHLEVBQUU7SUFDWCxBQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUNsQixBQUFJLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDO0lBQ3BCLEFBQUksR0FBRyxDQUFDLGtCQUFrQixFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN4RCxBQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNqQyxBQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNwQyxBQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQzs7SUFFbkIsQUFBSTtJQUNKLEFBQUk7SUFDSixBQUFJO0lBQ0osQUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDOztJQUU1QyxBQUFJLE9BQU8sSUFBSSxDQUFDO0FBQ3BCLEFBQUksQ0FBQyxDQUFBOztBQUVMLEFBQUk7Q0FDSCxBQUFJO0NBQ0osQUFBSTtDQUNKLEFBQUk7Q0FDSixBQUFJO0NBQ0osQUFBSTtDQUNKLEFBQUk7QUFDTCxBQUFJLGlCQUFBLE1BQU0sbUJBQUEsR0FBRztJQUNULEFBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO1FBQ2YsQUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzdDLEFBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN4QyxBQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDM0MsQUFBSSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztJQUN6QixBQUFJLENBQUM7SUFDTCxBQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzlCLEFBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDMUMsQUFBSSxPQUFPLElBQUksQ0FBQztBQUNwQixBQUFJLENBQUMsQ0FBQTs7QUFFTCxBQUFJO0NBQ0gsQUFBSTtDQUNKLEFBQUk7Q0FDSixBQUFJO0FBQ0wsQUFBSSxpQkFBQSxTQUFTLHNCQUFBLEdBQUc7SUFDWixBQUFJLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztBQUM1QixBQUFJLENBQUMsQ0FBQTs7QUFFTCxBQUFJO0NBQ0gsQUFBSTtDQUNKLEFBQUk7Q0FDSixBQUFJO0NBQ0osQUFBSTtBQUNMLEFBQUksaUJBQUEsU0FBUyxzQkFBQSxDQUFDLE1BQU0sRUFBRTtJQUNsQixBQUFJLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMxQyxBQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDekQsQUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDbkIsQUFBSSxPQUFPLElBQUksQ0FBQztBQUNwQixBQUFJLENBQUMsQ0FBQTs7QUFFTCxBQUFJLGlCQUFBLFVBQVUsdUJBQUEsR0FBRztJQUNiLEFBQUksT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0FBQzdCLEFBQUksQ0FBQyxDQUFBOztBQUVMLEFBQUk7Q0FDSCxBQUFJO0NBQ0osQUFBSTtDQUNKLEFBQUk7Q0FDSixBQUFJO0NBQ0osQUFBSTs7QUFFTCxBQUFJLGlCQUFBLFFBQVEscUJBQUEsQ0FBQyxLQUFLLEVBQUU7SUFDaEIsQUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7UUFDakIsQUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3pCLEFBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7SUFDM0IsQUFBSSxDQUFDOztJQUVMLEFBQUksSUFBSSxLQUFLLEVBQUU7UUFDWCxBQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLEFBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzVDLEFBQUksQ0FBQzs7SUFFTCxBQUFJLE9BQU8sSUFBSSxDQUFDO0FBQ3BCLEFBQUksQ0FBQyxDQUFBOztBQUVMLEFBQUksaUJBQUEsV0FBVyx3QkFBQSxDQUFDLEtBQUssRUFBRTtJQUNuQixBQUFJLEdBQUssQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUM7SUFDckQsQUFBSSxHQUFLLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7O0lBRWxDLEFBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsYUFBYSxLQUFLLE9BQU8sSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDLEVBQUU7UUFDbkYsQUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDM0IsQUFBSSxDQUFDO0FBQ1QsQUFBSSxDQUFDLENBQUE7O0FBRUwsQUFBSTtDQUNILEFBQUk7Q0FDSixBQUFJO0NBQ0osQUFBSTtBQUNMLEFBQUksaUJBQUEsUUFBUSxxQkFBQSxHQUFHO0lBQ1gsQUFBSSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7QUFDM0IsQUFBSSxDQUFDLENBQUE7O0FBRUwsQUFBSTtDQUNILEFBQUk7Q0FDSixBQUFJO0NBQ0osQUFBSTtBQUNMLEFBQUksaUJBQUEsV0FBVyx3QkFBQSxHQUFHO0lBQ2QsQUFBSSxHQUFLLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7O0lBRTlCLEFBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxPQUFPO0lBQ3ZCLEFBQUksS0FBSyxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUUsRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDNUMsQUFBSSxLQUFLLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3BDLEFBQUksQ0FBQyxDQUFBOztBQUVMLEFBQUksaUJBQUEsT0FBTyxvQkFBQSxDQUFDLENBQUMsRUFBRTtJQUNYLEFBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTztJQUMzQixBQUFJLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDakUsQUFBSTtJQUNKLEFBQUk7SUFDSixBQUFJO0lBQ0osQUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFLEdBQUcsR0FBRyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDdEQsQUFBSSxHQUFHLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQSxZQUFXLElBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQSxTQUFLLElBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQSxRQUFJLENBQUMsQ0FBQyxDQUFDO0FBQzdFLEFBQUksQ0FBQyxDQUFBLEFBQ0o7O0FBRUQsTUFBTSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7OztBQzdKeEIsWUFBWSxDQUFDOztBQUViLEdBQUssQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBQ3JDLEdBQUssQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUM7QUFDM0MsR0FBSyxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7QUFDbkMsR0FBSyxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUN6QyxHQUFLLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBQ3hDLEdBQUssQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUM7O0FBRXpDLEdBQUssQ0FBQyxjQUFjLEdBQUc7SUFDbkIsV0FBVyxFQUFFLElBQUk7SUFDakIsWUFBWSxFQUFFLElBQUk7Q0FDckIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBMENGLElBQU0sS0FBSyxHQUFnQjtJQUFDLEFBQ3hCLGNBQVcsQ0FBQyxPQUFPLEVBQUU7UUFDakIsT0FBSyxLQUFBLENBQUMsSUFBQSxDQUFDLENBQUM7UUFDUixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNuRSxJQUFJLENBQUMsT0FBTyxDQUFDO1lBQ1QsU0FBUztZQUNULGVBQWUsQ0FBQztZQUNoQixJQUFJLENBQUMsQ0FBQztLQUNiOzs7O3dDQUFBOzs7Ozs7OztJQVFELGdCQUFBLEtBQUssa0JBQUEsQ0FBQyxHQUFHLEVBQUU7UUFDUCxJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztRQUNoQixJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ25DLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUU7WUFDM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztTQUM3QztRQUNELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNmLE9BQU8sSUFBSSxDQUFDO0tBQ2YsQ0FBQTs7Ozs7SUFLRCxnQkFBQSxNQUFNLG1CQUFBLEdBQUc7UUFDTCxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO0tBQ3RCLENBQUE7Ozs7Ozs7Ozs7SUFVRCxnQkFBQSxNQUFNLG1CQUFBLEdBQUc7UUFDTCxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUU7WUFDM0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUN2RDs7UUFFRCxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDakIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUN4RCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7U0FDMUI7O1FBRUQsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ1gsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNwQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQzNDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztTQUNwQjs7Ozs7Ozs7Ozs7UUFXRCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDOztRQUVuQixPQUFPLElBQUksQ0FBQztLQUNmLENBQUE7Ozs7Ozs7SUFPRCxnQkFBQSxTQUFTLHNCQUFBLEdBQUc7UUFDUixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7S0FDdkIsQ0FBQTs7Ozs7Ozs7SUFRRCxnQkFBQSxTQUFTLHNCQUFBLENBQUMsTUFBTSxFQUFFO1FBQ2QsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNmLE9BQU8sSUFBSSxDQUFDO0tBQ2YsQ0FBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFpQkQsZ0JBQUEsT0FBTyxvQkFBQSxDQUFDLElBQUksRUFBRTtRQUNWLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0tBQ25FLENBQUE7Ozs7Ozs7Ozs7OztJQVlELGdCQUFBLE9BQU8sb0JBQUEsQ0FBQyxJQUFJLEVBQUU7UUFDVixHQUFLLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUN0RCxHQUFLLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ25ELEdBQUcsQ0FBQyxLQUFLLENBQUM7UUFDVixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN0QixPQUFPLElBQUksRUFBRTtZQUNULEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxLQUFLLEVBQUUsTUFBTTtZQUNsQixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQzNCOztRQUVELE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUNuQyxDQUFBOzs7Ozs7Ozs7Ozs7Ozs7O0lBZ0JELGdCQUFBLGFBQWEsMEJBQUEsQ0FBQyxRQUFRLEVBQUU7UUFDcEIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNmLE9BQU8sSUFBSSxDQUFDO0tBQ2YsQ0FBQTs7SUFFRCxnQkFBQSxjQUFjLDJCQUFBLEdBQUc7UUFDYixJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUU7WUFDM0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUN2RDs7UUFFRCxJQUFJLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLHdCQUF3QixFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQzs7UUFFN0UsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRTtZQUMxQixJQUFJLENBQUMsWUFBWSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLDZCQUE2QixFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN2RixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUM7WUFDbEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztTQUNuRTtLQUNKLENBQUE7O0lBRUQsZ0JBQUEsT0FBTyxvQkFBQSxHQUFHO1FBQ04sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLE9BQU8sRUFBRTs7UUFFOUQsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDbEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7WUFDaEYsSUFBSSxDQUFDLElBQUksU0FBUyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxvQkFBb0IsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDM0UsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQzlDOztRQUVELEdBQUcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFDakMsR0FBSyxDQUFDLE1BQU0sR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNwRCxHQUFLLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQzs7UUFFcEQsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNULEdBQUssQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXO2dCQUNyQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUM7O1lBRTFDLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLEVBQUU7Z0JBQ2xDLE1BQU0sR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ3BCLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxNQUFNLEVBQUU7Z0JBQ3BELE1BQU0sR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQ3ZCLE1BQU07Z0JBQ0gsTUFBTSxHQUFHLEVBQUUsQ0FBQzthQUNmOztZQUVELElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxFQUFFO2dCQUNuQixNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQ3ZCLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxLQUFLLEdBQUcsQ0FBQyxFQUFFO2dCQUN0RCxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQ3hCOztZQUVELElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7Z0JBQ3JCLE1BQU0sR0FBRyxRQUFRLENBQUM7YUFDckIsTUFBTTtnQkFDSCxNQUFNLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUM3QjtTQUNKOztRQUVELEdBQUssQ0FBQyxXQUFXLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQzs7UUFFNUMsR0FBSyxDQUFDLGVBQWUsR0FBRztZQUNwQixLQUFLLEVBQUUsbUJBQW1CO1lBQzFCLFVBQVUsRUFBRSxnQkFBZ0I7WUFDNUIsV0FBVyxFQUFFLG9CQUFvQjtZQUNqQyxRQUFRLEVBQUUsdUJBQXVCO1lBQ2pDLGFBQWEsRUFBRSxvQkFBb0I7WUFDbkMsY0FBYyxFQUFFLHdCQUF3QjtZQUN4QyxNQUFNLEVBQUUsbUJBQW1CO1lBQzNCLE9BQU8sRUFBRSx1QkFBdUI7U0FDbkMsQ0FBQzs7UUFFRixHQUFLLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDO1FBQzVDLEtBQUssR0FBSyxDQUFDLEdBQUcsSUFBSSxlQUFlLEVBQUU7WUFDL0IsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFBLHdCQUF1QixHQUFFLEdBQUcsQ0FBRSxDQUFDLENBQUM7U0FDcEQ7UUFDRCxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUEsd0JBQXVCLEdBQUUsTUFBTSxDQUFFLENBQUMsQ0FBQzs7UUFFakQsR0FBRyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUEsQ0FBRyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUEsZ0JBQVksSUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFBLFFBQUksSUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFBLFFBQUksQ0FBQyxDQUFDLENBQUM7S0FDcEgsQ0FBQTs7SUFFRCxnQkFBQSxhQUFhLDBCQUFBLEdBQUc7UUFDWixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7S0FDakIsQ0FBQSxBQUNKOzs7RUExT21CLE9BME9uQixHQUFBOztBQUVELFNBQVMsZUFBZSxDQUFDLE1BQU0sRUFBRTs7SUFFN0IsSUFBSSxDQUFDLE1BQU0sRUFBRTtRQUNULE9BQU8sZUFBZSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDOztLQUUzQyxNQUFNLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxFQUFFOztRQUVuQyxHQUFLLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RFLE9BQU87WUFDSCxLQUFLLEVBQUUsSUFBSSxLQUFLLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQztZQUMzQixVQUFVLEVBQUUsSUFBSSxLQUFLLENBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQztZQUNqRCxXQUFXLEVBQUUsSUFBSSxLQUFLLENBQUMsQ0FBQyxZQUFZLEVBQUUsWUFBWSxDQUFDO1lBQ25ELFFBQVEsRUFBRSxJQUFJLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUM7WUFDL0IsYUFBYSxFQUFFLElBQUksS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDLFlBQVksQ0FBQztZQUNyRCxjQUFjLEVBQUUsSUFBSSxLQUFLLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxZQUFZLENBQUM7WUFDdkQsTUFBTSxFQUFFLElBQUksS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFDNUIsT0FBTyxFQUFFLElBQUksS0FBSyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztTQUNqQyxDQUFDOztLQUVMLE1BQU0sSUFBSSxXQUFXLENBQUMsTUFBTSxDQUFDLEVBQUU7O1FBRTVCLEdBQUssQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5QyxPQUFPO1lBQ0gsS0FBSyxFQUFFLGVBQWU7WUFDdEIsVUFBVSxFQUFFLGVBQWU7WUFDM0IsV0FBVyxFQUFFLGVBQWU7WUFDNUIsUUFBUSxFQUFFLGVBQWU7WUFDekIsYUFBYSxFQUFFLGVBQWU7WUFDOUIsY0FBYyxFQUFFLGVBQWU7WUFDL0IsTUFBTSxFQUFFLGVBQWU7WUFDdkIsT0FBTyxFQUFFLGVBQWU7U0FDM0IsQ0FBQzs7S0FFTCxNQUFNOztRQUVILE9BQU87WUFDSCxLQUFLLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDN0MsVUFBVSxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3ZELFdBQVcsRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN6RCxRQUFRLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDbkQsYUFBYSxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzdELGNBQWMsRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMvRCxNQUFNLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDL0MsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ3BELENBQUM7S0FDTDtDQUNKOztBQUVELFNBQVMsV0FBVyxDQUFDLEtBQUssRUFBRTtJQUN4QixPQUFPLEtBQUssWUFBWSxLQUFLLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztDQUN6RDs7QUFFRCxNQUFNLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQzs7O0FDdFZ2QixZQUFZLENBQUM7Ozs7Ozs7Ozs7Ozs7QUFhYixJQUFNLEtBQUssR0FBQyxBQUNaLEFBQUksY0FBVyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO0lBQ25DLEFBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7SUFDekIsQUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUN6QixBQUFJLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0lBQ3ZCLEFBQUksSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7SUFDeEIsQUFBSSxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQztJQUN4QixBQUFJLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0MsQUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3JFLEFBQUksQ0FBQyxDQUFBOztBQUVMLEFBQUk7Q0FDSCxBQUFJO0NBQ0osQUFBSTtDQUNKLEFBQUk7Q0FDSixBQUFJO0NBQ0osQUFBSTtDQUNKLEFBQUk7Q0FDSixBQUFJO0NBQ0osQUFBSTtDQUNKLEFBQUk7Q0FDSixBQUFJO0FBQ0wsQUFBSSxnQkFBQSxJQUFJLGlCQUFBLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRTtJQUNqRCxBQUFJLEdBQUssQ0FBQyxFQUFFLEdBQUcsUUFBUSxHQUFHLENBQUEsQ0FBRyxJQUFJLENBQUMsS0FBSyxDQUFBLE1BQUUsSUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUEsQ0FBRSxHQUFHLElBQUksQ0FBQztJQUN0RSxBQUFJLElBQUksUUFBUSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDO0lBQ2hELEFBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUM7UUFDeEIsQUFBSSxXQUFXLEVBQUUsV0FBVztRQUM1QixBQUFJLFdBQVcsRUFBRSxJQUFJLENBQUMsS0FBSztRQUMzQixBQUFJLElBQUksRUFBRSxJQUFJO1FBQ2QsQUFBSSxFQUFFLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUNsQixBQUFJLElBQUksRUFBRSxJQUFJO0lBQ2xCLEFBQUksQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3BCLEFBQUksQ0FBQyxDQUFBOztBQUVMLEFBQUksZ0JBQUEsT0FBTyxvQkFBQSxDQUFDLE9BQU8sRUFBRSxDQUFDOztBQUFBO0lBQ2xCLEFBQUksR0FBSyxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSTtRQUN6QixBQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO0lBQ3JCLEFBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQzs7SUFFakIsQUFBSSxJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsV0FBVztRQUN2RCxBQUFJLE9BQU87O0lBRWYsQUFBSSxHQUFLLENBQUMsSUFBSSxHQUFHLFNBQUEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxBQUFHO1FBQ3JDLEFBQUksTUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUM7WUFDeEIsQUFBSSxXQUFXLEVBQUUsTUFBSSxDQUFDLEtBQUs7WUFDM0IsQUFBSSxJQUFJLEVBQUUsWUFBWTtZQUN0QixBQUFJLEVBQUUsRUFBRSxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ2xCLEFBQUksS0FBSyxFQUFFLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSTtZQUNuQyxBQUFJLElBQUksRUFBRSxJQUFJO1FBQ2xCLEFBQUksQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3BCLEFBQUksQ0FBQyxDQUFDOztJQUVOLEFBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFlBQVksRUFBRTtRQUNoQyxBQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN2QyxBQUFJLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbkMsQUFBSSxJQUFJLFFBQVEsRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlELEFBQUksQ0FBQyxNQUFNLElBQUksT0FBTyxJQUFJLENBQUMsRUFBRSxLQUFLLFdBQVcsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUNyRSxBQUFJO1FBQ0osQUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDbEUsQUFBSSxDQUFDLE1BQU0sSUFBSSxPQUFPLElBQUksQ0FBQyxFQUFFLEtBQUssV0FBVyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxFQUFFO1FBQzFFLEFBQUk7UUFDSixBQUFJLEdBQUssQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEMsQUFBSSxHQUFLLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEYsQUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUMvQyxBQUFJLENBQUMsTUFBTTtRQUNQLEFBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFDLEFBQUksQ0FBQztBQUNULEFBQUksQ0FBQyxDQUFBOztBQUVMLEFBQUksZ0JBQUEsTUFBTSxtQkFBQSxHQUFHO0lBQ1QsQUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3hFLEFBQUksQ0FBQyxDQUFBLEFBQ0o7O0FBRUQsTUFBTSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7OztBQ3ZGdkIsWUFBWSxDQUFDOztBQUViLEdBQUssQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDOztBQUVuQyxPQUFPLENBQUMsT0FBTyxHQUFHLFNBQVMsR0FBRyxFQUFFLFFBQVEsRUFBRTtJQUN0QyxHQUFLLENBQUMsR0FBRyxHQUFHLElBQUksTUFBTSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3hDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUMzQixHQUFHLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLGtCQUFrQixDQUFDLENBQUM7SUFDbkQsR0FBRyxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUMsRUFBRTtRQUN0QixRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDZixDQUFDO0lBQ0YsR0FBRyxDQUFDLE1BQU0sR0FBRyxXQUFXO1FBQ3BCLElBQUksR0FBRyxDQUFDLE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLFFBQVEsRUFBRTtZQUN2RCxHQUFHLENBQUMsSUFBSSxDQUFDO1lBQ1QsSUFBSTtnQkFDQSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDbkMsQ0FBQyxPQUFPLEdBQUcsRUFBRTtnQkFDVixPQUFPLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUN4QjtZQUNELFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDeEIsTUFBTTtZQUNILFFBQVEsQ0FBQyxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztTQUN2QztLQUNKLENBQUM7SUFDRixHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDWCxPQUFPLEdBQUcsQ0FBQztDQUNkLENBQUM7O0FBRUYsT0FBTyxDQUFDLGNBQWMsR0FBRyxTQUFTLEdBQUcsRUFBRSxRQUFRLEVBQUU7SUFDN0MsR0FBSyxDQUFDLEdBQUcsR0FBRyxJQUFJLE1BQU0sQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN4QyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDM0IsR0FBRyxDQUFDLFlBQVksR0FBRyxhQUFhLENBQUM7SUFDakMsR0FBRyxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUMsRUFBRTtRQUN0QixRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDZixDQUFDO0lBQ0YsR0FBRyxDQUFDLE1BQU0sR0FBRyxXQUFXO1FBQ3BCLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxVQUFVLEtBQUssQ0FBQyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssR0FBRyxFQUFFO1lBQ3JELE9BQU8sUUFBUSxDQUFDLElBQUksS0FBSyxDQUFDLDJDQUEyQyxDQUFDLENBQUMsQ0FBQztTQUMzRTtRQUNELElBQUksR0FBRyxDQUFDLE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLFFBQVEsRUFBRTtZQUN2RCxRQUFRLENBQUMsSUFBSSxFQUFFO2dCQUNYLElBQUksRUFBRSxHQUFHLENBQUMsUUFBUTtnQkFDbEIsWUFBWSxFQUFFLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQUM7Z0JBQ3BELE9BQU8sRUFBRSxHQUFHLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDO2FBQzVDLENBQUMsQ0FBQztTQUNOLE1BQU07WUFDSCxRQUFRLENBQUMsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7U0FDdkM7S0FDSixDQUFDO0lBQ0YsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ1gsT0FBTyxHQUFHLENBQUM7Q0FDZCxDQUFDOztBQUVGLFNBQVMsVUFBVSxDQUFDLEdBQUcsRUFBRTtJQUNyQixHQUFLLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzdDLENBQUMsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDO0lBQ2IsT0FBTyxDQUFDLENBQUMsUUFBUSxLQUFLLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztDQUN2Rzs7QUFFRCxHQUFLLENBQUMsaUJBQWlCLEdBQUcsb0hBQW9ILENBQUM7O0FBRS9JLE9BQU8sQ0FBQyxRQUFRLEdBQUcsU0FBUyxHQUFHLEVBQUUsUUFBUSxFQUFFOzs7SUFHdkMsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxTQUFBLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxBQUFHO1FBQ2pELElBQUksR0FBRyxFQUFFLE9BQU8sUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzlCLEdBQUssQ0FBQyxHQUFHLEdBQUcsSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDL0IsR0FBSyxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUM7UUFDM0MsR0FBRyxDQUFDLE1BQU0sR0FBRyxTQUFBLEdBQUcsQUFBRztZQUNmLFFBQVEsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDcEIsR0FBRyxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDaEMsQ0FBQztRQUNGLEdBQUssQ0FBQyxJQUFJLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUNwRixHQUFHLENBQUMsWUFBWSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUM7UUFDeEMsR0FBRyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDO1FBQzlCLEdBQUcsQ0FBQyxHQUFHLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUcsR0FBRyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsR0FBRyxpQkFBaUIsQ0FBQztLQUNyRixDQUFDLENBQUM7Q0FDTixDQUFDOztBQUVGLE9BQU8sQ0FBQyxRQUFRLEdBQUcsU0FBUyxJQUFJLEVBQUUsUUFBUSxFQUFFO0lBQ3hDLEdBQUssQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDckQsS0FBSyxDQUFDLFdBQVcsR0FBRyxXQUFXO1FBQzNCLFFBQVEsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7S0FDekIsQ0FBQztJQUNGLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDbEMsR0FBSyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ3RCLEtBQUssQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1NBQ25DO1FBQ0QsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEIsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUN4QjtJQUNELE9BQU8sS0FBSyxDQUFDO0NBQ2hCLENBQUM7OztBQzdGRixZQUFZLENBQUM7Ozs7Ozs7QUFPYixHQUFLLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQzs7Ozs7O0FBTW5DLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxHQUFHLENBQUMsV0FBVztJQUM3QixJQUFJLE1BQU0sQ0FBQyxXQUFXO1FBQ2xCLE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFO1FBQ3hCLE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztLQUMxRCxNQUFNO1FBQ0gsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUM5QjtDQUNKLEVBQUUsQ0FBQyxDQUFDOztBQUVMLEdBQUssQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLHFCQUFxQjtJQUN0QyxNQUFNLENBQUMsd0JBQXdCO0lBQy9CLE1BQU0sQ0FBQywyQkFBMkI7SUFDbEMsTUFBTSxDQUFDLHVCQUF1QixDQUFDOztBQUVuQyxPQUFPLENBQUMsS0FBSyxHQUFHLFNBQVMsRUFBRSxFQUFFO0lBQ3pCLE9BQU8sS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0NBQ3BCLENBQUM7O0FBRUYsR0FBSyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsb0JBQW9CO0lBQ3RDLE1BQU0sQ0FBQyx1QkFBdUI7SUFDOUIsTUFBTSxDQUFDLDBCQUEwQjtJQUNqQyxNQUFNLENBQUMsc0JBQXNCLENBQUM7O0FBRWxDLE9BQU8sQ0FBQyxXQUFXLEdBQUcsU0FBUyxFQUFFLEVBQUU7SUFDL0IsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0NBQ2QsQ0FBQzs7QUFFRixPQUFPLENBQUMsS0FBSyxHQUFHLFVBQVUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUU7SUFDcEMsSUFBSSxDQUFDLEdBQUcsRUFBRTtRQUNOLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2hCLE9BQU8sSUFBSSxDQUFDO0tBQ2Y7O0lBRUQsR0FBRyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7SUFDbEIsR0FBSyxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDOztJQUVuQyxTQUFTLElBQUksQ0FBQyxHQUFHLEVBQUU7UUFDZixJQUFJLEtBQUssRUFBRSxPQUFPO1FBQ2xCLEdBQUcsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDOztRQUUzQixJQUFJLEdBQUcsSUFBSSxLQUFLLEdBQUcsR0FBRyxFQUFFO1lBQ3BCLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ25CLE1BQU07WUFDSCxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztZQUNsQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3ZCO0tBQ0o7O0lBRUQsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQzs7SUFFcEIsT0FBTyxXQUFXLEVBQUUsS0FBSyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7Q0FDdkMsQ0FBQzs7QUFFRixPQUFPLENBQUMsWUFBWSxHQUFHLFVBQVUsR0FBRyxFQUFFO0lBQ2xDLEdBQUssQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdkQsR0FBSyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3hDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQztJQUN6QixNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUM7SUFDM0IsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzdCLE9BQU8sT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQztDQUNqRSxDQUFDOzs7Ozs7Ozs7O0FBVUYsT0FBTyxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FBQzs7QUFFbkQsT0FBTyxDQUFDLG1CQUFtQixHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsbUJBQW1CLElBQUksQ0FBQyxDQUFDOztBQUV4RSxNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRTtJQUMvQyxHQUFHLEVBQUUsV0FBVyxFQUFFLE9BQU8sTUFBTSxDQUFDLGdCQUFnQixDQUFDLEVBQUU7Q0FDdEQsQ0FBQyxDQUFDOztBQUVILE9BQU8sQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDOztBQUU3QixHQUFLLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3pELFdBQVcsQ0FBQyxNQUFNLEdBQUcsV0FBVztJQUM1QixPQUFPLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztDQUMvQixDQUFDO0FBQ0YsV0FBVyxDQUFDLEdBQUcsR0FBRyw2RUFBNkUsQ0FBQzs7O0FDakdoRyxZQUFZLENBQUM7O0FBRWIsR0FBSyxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDekMsR0FBSyxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDcEMsR0FBSyxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7O0FBRTNHLE1BQU0sQ0FBQyxPQUFPLEdBQUcsWUFBWTtJQUN6QixPQUFPLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztDQUN2QyxDQUFDOzs7QUNSRixZQUFZLENBQUM7OztBQUdiLE1BQU0sQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDOzs7QUNIdEIsWUFBWSxDQUFDOztBQUViLEdBQUssQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0FBQzNDLEdBQUssQ0FBQyxtQkFBbUIsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsbUJBQW1CLENBQUM7OztBQUdsRSxNQUFNLENBQUMsT0FBTyxHQUFHLFNBQVMsYUFBYSxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUU7SUFDckQsR0FBSyxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDOztJQUV6QixJQUFJLEdBQUcsSUFBSSxDQUFDLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDOztJQUU3QixHQUFLLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztJQUNwQixHQUFHLENBQUMsT0FBTztRQUNQLEdBQUcsQ0FBQzs7SUFFUixLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDMUIsR0FBSyxDQUFDLElBQUksR0FBRyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzQyxJQUFJLElBQUksS0FBSyxDQUFDLEVBQUUsU0FBUzs7UUFFekIsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDOztRQUUvQixJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUUsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUM7O1FBRXRDLElBQUksR0FBRyxLQUFLLElBQUksR0FBRyxDQUFDLEVBQUU7WUFDbEIsSUFBSSxPQUFPLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNwQyxPQUFPLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7U0FFeEIsTUFBTTtZQUNILE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDMUI7S0FDSjtJQUNELElBQUksT0FBTyxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7Ozs7SUFJcEMsSUFBSSxRQUFRLEdBQUcsQ0FBQyxFQUFFO1FBQ2QsS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN0QyxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksUUFBUSxFQUFFLFNBQVM7WUFDN0MsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQzVFLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztTQUNoRDtLQUNKOztJQUVELE9BQU8sUUFBUSxDQUFDO0NBQ25CLENBQUM7O0FBRUYsU0FBUyxZQUFZLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtJQUN4QixPQUFPLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztDQUMxQjs7O0FDaERELFlBQVksQ0FBQzs7Ozs7Ozs7O0FBU2IsR0FBSyxDQUFDLE1BQU0sV0FBVztJQUNuQixPQUFPLEVBQUUsd0JBQXdCO0lBQ2pDLG9CQUFvQixFQUFFLElBQUk7SUFDMUIsWUFBWSxFQUFFLElBQUk7Q0FDckIsQ0FBQzs7QUFFRixNQUFNLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQzs7O0FDZnhCLFlBQVksQ0FBQzs7QUFFYixHQUFLLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQzs7QUFFakMsSUFBTSxlQUFlLEdBQUMsQUFFdEIsQUFBSSx3QkFBVyxDQUFDLE9BQU8sRUFBRSxDQUFDOztBQUFBO0lBQ3RCLEFBQUksSUFBSSxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUM7SUFDOUIsQUFBSSxJQUFJLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQztJQUM5QixBQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDekMsQUFBSSxHQUFLLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5QixBQUFJLE1BQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3JDLEFBQUksTUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUM7SUFDekMsQUFBSSxDQUFDO0FBQ1QsQUFBSSxDQUFDLENBQUE7O0FBRUwsQUFBSSwwQkFBQSxNQUFNLG1CQUFBLENBQUMsTUFBTSxFQUFFO0lBQ2YsQUFBSSxNQUFNLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUMzQyxBQUFJLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUM1QyxBQUFJLENBQUMsQ0FBQTs7QUFFTCxBQUFJLDBCQUFBLE1BQU0sbUJBQUEsQ0FBQyxDQUFDLEVBQUU7SUFDVixBQUFJLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM1QyxBQUFJLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QyxBQUFJLENBQUMsQ0FBQSxBQUNKOztBQUVELE1BQU0sQ0FBQyxPQUFPLEdBQUcsZUFBZSxDQUFDOzs7QUMzQmpDLFlBQVksQ0FBQzs7QUFFYixHQUFLLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUMvQixHQUFLLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQzs7Ozs7Ozs7O0FBU2pDLElBQU0sVUFBVSxHQUFDLEFBRWpCLEFBQUksbUJBQVcsQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLENBQUM7O0FBQUE7SUFDakMsQUFBSSxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztJQUNqQyxBQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO0lBQ3JCLEFBQUksSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUM7SUFDMUIsQUFBSSxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUM5QixBQUFJLEdBQUssQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3JELEFBQUksS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUN6QyxBQUFJLEdBQUssQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlCLEFBQUksR0FBSyxDQUFDLEtBQUssR0FBRyxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNyRCxBQUFJLEtBQUssQ0FBQyxJQUFJLEdBQUcsU0FBUSxHQUFFLENBQUMsQUFBRSxDQUFDO1FBQy9CLEFBQUksTUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDaEMsQUFBSSxDQUFDO0FBQ1QsQUFBSSxDQUFDLENBQUE7O0FBRUwsQUFBSTtDQUNILEFBQUk7Q0FDSixBQUFJO0NBQ0osQUFBSTtDQUNKLEFBQUk7Q0FDSixBQUFJO0NBQ0osQUFBSTtDQUNKLEFBQUk7Q0FDSixBQUFJO0NBQ0osQUFBSTtBQUNMLEFBQUkscUJBQUEsU0FBUyxzQkFBQSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFO0lBQzFCLEFBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUM5QixBQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxTQUFBLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxBQUFHO1FBQzVDLEFBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3JDLEFBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ2YsQUFBSSxDQUFDLENBQUE7O0FBRUwsQUFBSTtDQUNILEFBQUk7Q0FDSixBQUFJO0NBQ0osQUFBSTtDQUNKLEFBQUk7Q0FDSixBQUFJO0NBQ0osQUFBSTtDQUNKLEFBQUk7Q0FDSixBQUFJO0NBQ0osQUFBSTtDQUNKLEFBQUk7Q0FDSixBQUFJO0FBQ0wsQUFBSSxxQkFBQSxJQUFJLGlCQUFBLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRTtJQUM5QyxBQUFJLElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRTtRQUNyRCxBQUFJO1FBQ0osQUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDcEYsQUFBSSxDQUFDOztJQUVMLEFBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDOUQsQUFBSSxPQUFPLFFBQVEsQ0FBQztBQUN4QixBQUFJLENBQUMsQ0FBQTs7QUFFTCxBQUFJLHFCQUFBLE1BQU0sbUJBQUEsR0FBRztJQUNULEFBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBQSxDQUFDLEtBQUssRUFBRSxBQUFHLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3hELEFBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7SUFDckIsQUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDekMsQUFBSSxDQUFDLENBQUEsQUFDSjs7QUFFRCxNQUFNLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQzs7O0FDMUU1QixZQUFZLENBQUM7O0FBRWIsR0FBSyxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUN4QyxHQUFLLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQzs7QUFFbkMsT0FBTyxDQUFDLE1BQU0sR0FBRyxVQUFVLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFO0lBQ3RELEdBQUssQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbEQsSUFBSSxTQUFTLEVBQUUsRUFBRSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7SUFDeEMsSUFBSSxTQUFTLEVBQUUsU0FBUyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN6QyxPQUFPLEVBQUUsQ0FBQztDQUNiLENBQUM7O0FBRUYsR0FBSyxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUM7O0FBRXZELFNBQVMsUUFBUSxDQUFDLEtBQUssRUFBRTtJQUNyQixLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ25DLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLFFBQVEsRUFBRTtZQUN0QixPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNuQjtLQUNKO0lBQ0QsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7Q0FDbkI7O0FBRUQsR0FBSyxDQUFDLFVBQVUsR0FBRyxRQUFRLENBQUMsQ0FBQyxZQUFZLEVBQUUsZUFBZSxFQUFFLGtCQUFrQixFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUM7QUFDakcsR0FBRyxDQUFDLFVBQVUsQ0FBQztBQUNmLE9BQU8sQ0FBQyxXQUFXLEdBQUcsWUFBWTtJQUM5QixJQUFJLFVBQVUsRUFBRTtRQUNaLFVBQVUsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDbEMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxHQUFHLE1BQU0sQ0FBQztLQUNqQztDQUNKLENBQUM7QUFDRixPQUFPLENBQUMsVUFBVSxHQUFHLFlBQVk7SUFDN0IsSUFBSSxVQUFVLEVBQUU7UUFDWixRQUFRLENBQUMsVUFBVSxDQUFDLEdBQUcsVUFBVSxDQUFDO0tBQ3JDO0NBQ0osQ0FBQzs7QUFFRixHQUFLLENBQUMsYUFBYSxHQUFHLFFBQVEsQ0FBQyxDQUFDLFdBQVcsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7QUFDakUsT0FBTyxDQUFDLFlBQVksR0FBRyxTQUFTLEVBQUUsRUFBRSxLQUFLLEVBQUU7SUFDdkMsRUFBRSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsR0FBRyxLQUFLLENBQUM7Q0FDbkMsQ0FBQzs7O0FBR0YsU0FBUyxhQUFhLENBQUMsQ0FBQyxFQUFFO0lBQ3RCLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUNuQixDQUFDLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDcEIsTUFBTSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUM7Q0FDNUQ7QUFDRCxPQUFPLENBQUMsYUFBYSxHQUFHLFdBQVc7SUFDL0IsTUFBTSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDdEQsTUFBTSxDQUFDLFVBQVUsQ0FBQyxTQUFBLEdBQUcsQUFBRztRQUNwQixNQUFNLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxJQUFJLENBQUMsQ0FBQztLQUM1RCxFQUFFLENBQUMsQ0FBQyxDQUFDO0NBQ1QsQ0FBQzs7QUFFRixPQUFPLENBQUMsUUFBUSxHQUFHLFVBQVUsRUFBRSxFQUFFLENBQUMsRUFBRTtJQUNoQyxHQUFLLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO0lBQ3hDLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2pDLE9BQU8sSUFBSSxLQUFLO1FBQ1osQ0FBQyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxVQUFVO1FBQ3JDLENBQUMsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsU0FBUztLQUN0QyxDQUFDO0NBQ0wsQ0FBQzs7QUFFRixPQUFPLENBQUMsUUFBUSxHQUFHLFVBQVUsRUFBRSxFQUFFLENBQUMsRUFBRTtJQUNoQyxHQUFLLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxxQkFBcUIsRUFBRTtRQUNuQyxNQUFNLEdBQUcsRUFBRSxDQUFDO0lBQ2hCLEdBQUssQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxjQUFjLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQztJQUN2RSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3JDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLO1lBQ2pCLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUMsVUFBVTtZQUM5QyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLFNBQVM7U0FDL0MsQ0FBQyxDQUFDO0tBQ047SUFDRCxPQUFPLE1BQU0sQ0FBQztDQUNqQixDQUFDOztBQUVGLE9BQU8sQ0FBQyxNQUFNLEdBQUcsU0FBUyxJQUFJLEVBQUU7SUFDNUIsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO1FBQ2pCLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQ3JDO0NBQ0osQ0FBQzs7O0FDakZGLFlBQVksQ0FBQzs7QUFFYixHQUFLLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQzs7Ozs7OztBQU8vQixJQUFNLE9BQU8sR0FBQzs7QUFBQSxBQUVkLEFBQUksQUFDSCxBQUFJLEFBQ0osQUFBSSxBQUNKLEFBQUksQUFDSixBQUFJLEFBQ0osQUFBSSxBQUNKLEFBQUksQUFDSixBQUFJLEFBQ0osQUFBSSxBQUNMLEFBQUksa0JBQUEsRUFBRSxlQUFBLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRTtJQUNuQixBQUFJLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUM7SUFDNUMsQUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3hELEFBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7O0lBRXpDLEFBQUksT0FBTyxJQUFJLENBQUM7QUFDcEIsQUFBSSxDQUFDLENBQUE7O0FBRUwsQUFBSTtDQUNILEFBQUk7Q0FDSixBQUFJO0NBQ0osQUFBSTtDQUNKLEFBQUk7Q0FDSixBQUFJO0NBQ0osQUFBSTtBQUNMLEFBQUksa0JBQUEsR0FBRyxnQkFBQSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUU7SUFDcEIsQUFBSSxJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUM5QyxBQUFJLEdBQUssQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDMUQsQUFBSSxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsRUFBRTtZQUNsQixBQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMvQyxBQUFJLENBQUM7SUFDVCxBQUFJLENBQUM7O0lBRUwsQUFBSSxPQUFPLElBQUksQ0FBQztBQUNwQixBQUFJLENBQUMsQ0FBQTs7QUFFTCxBQUFJO0NBQ0gsQUFBSTtDQUNKLEFBQUk7Q0FDSixBQUFJO0NBQ0osQUFBSTtDQUNKLEFBQUk7Q0FDSixBQUFJO0NBQ0osQUFBSTtDQUNKLEFBQUk7QUFDTCxBQUFJLGtCQUFBLElBQUksaUJBQUEsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUM7O0FBQUE7SUFDdEIsQUFBSSxHQUFLLENBQUMsT0FBTyxHQUFHLFNBQUEsQ0FBQyxJQUFJLEVBQUUsQUFBRztRQUMxQixBQUFJLE1BQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzVCLEFBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDbEMsQUFBSSxDQUFDLENBQUM7SUFDTixBQUFJLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzNCLEFBQUksT0FBTyxJQUFJLENBQUM7QUFDcEIsQUFBSSxDQUFDLENBQUE7O0FBRUwsQUFBSTtDQUNILEFBQUk7Q0FDSixBQUFJO0NBQ0osQUFBSTtDQUNKLEFBQUk7Q0FDSixBQUFJO0NBQ0osQUFBSTtBQUNMLEFBQUksa0JBQUEsSUFBSSxpQkFBQSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQzs7QUFBQTtJQUNsQixBQUFJLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTs7UUFFeEIsQUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQzs7UUFFN0QsQUFBSTtRQUNKLEFBQUksR0FBSyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUM7O1FBRXBHLEFBQUksS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUMzQyxBQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3RDLEFBQUksQ0FBQzs7UUFFTCxBQUFJLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUN6QixBQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQztRQUN2RixBQUFJLENBQUM7O0lBRVQsQUFBSTtJQUNKLEFBQUk7SUFDSixBQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxFQUFFO1FBQ3pDLEFBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxJQUFJLG1CQUFtQixDQUFDLENBQUM7SUFDM0UsQUFBSSxDQUFDOztJQUVMLEFBQUksT0FBTyxJQUFJLENBQUM7QUFDcEIsQUFBSSxDQUFDLENBQUE7O0FBRUwsQUFBSTtDQUNILEFBQUk7Q0FDSixBQUFJO0NBQ0osQUFBSTtDQUNKLEFBQUk7Q0FDSixBQUFJO0FBQ0wsQUFBSSxrQkFBQSxPQUFPLG9CQUFBLENBQUMsSUFBSSxFQUFFO0lBQ2QsQUFBSSxPQUFPO1FBQ1AsQUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5QyxBQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNsRSxBQUFJLENBQUMsQ0FBQztBQUNWLEFBQUksQ0FBQyxDQUFBOztBQUVMLEFBQUk7Q0FDSCxBQUFJO0NBQ0osQUFBSTtDQUNKLEFBQUk7Q0FDSixBQUFJO0NBQ0osQUFBSTtDQUNKLEFBQUk7Q0FDSixBQUFJO0FBQ0wsQUFBSSxrQkFBQSxnQkFBZ0IsNkJBQUEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFO0lBQy9CLEFBQUksSUFBSSxDQUFDLGNBQWMsR0FBRyxNQUFNLENBQUM7SUFDakMsQUFBSSxJQUFJLENBQUMsa0JBQWtCLEdBQUcsT0FBTyxJQUFJLEtBQUssVUFBVSxHQUFHLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQzs7SUFFekUsQUFBSSxPQUFPLElBQUksQ0FBQztBQUNwQixBQUFJLENBQUMsQ0FBQSxBQUNKOztBQUVELE1BQU0sQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDOzs7QUM3SHpCLFlBQVksQ0FBQztBQUNiLEdBQUssQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ25DLEdBQUssQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFDeEMsR0FBSyxDQUFDLG9CQUFvQixHQUFHLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLG9CQUFvQixDQUFDOzs7Ozs7Ozs7Ozs7O0FBYWxGLE1BQU0sQ0FBQyxPQUFPLEdBQUcsVUFBVSxZQUFZLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRTtJQUN2RCxTQUFTLEdBQUcsU0FBUyxJQUFJLEdBQUcsQ0FBQzs7O0lBRzdCLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUM7SUFDM0IsR0FBSyxDQUFDLFNBQVMsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEMsS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUN2QyxHQUFLLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2QixJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxFQUFFLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEVBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksRUFBRSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxFQUFFLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ3BDOztJQUVELEdBQUssQ0FBQyxLQUFLLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztJQUMxQixHQUFLLENBQUMsTUFBTSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7SUFDM0IsR0FBSyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN6QyxHQUFHLENBQUMsQ0FBQyxHQUFHLFFBQVEsR0FBRyxDQUFDLENBQUM7OztJQUdyQixHQUFLLENBQUMsU0FBUyxHQUFHLElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQzs7O0lBRzlDLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLElBQUksUUFBUSxFQUFFO1FBQ3hDLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLElBQUksUUFBUSxFQUFFO1lBQ3hD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SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixJQUFJLEVBQUUsR0FBRztJQUNULEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7SUFDUixHQUFHLEVBQUUsR0FBRztJQUNSLEdBQUcsRUFBRSxHQUFHO0lBQ1IsR0FBRyxFQUFFLEdBQUc7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QUMsT0FBTyxHQUFHLFVBQVUsQ0FBQzs7O0FDM0M1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaGdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDekdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUMxZUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDek1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwb0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdFZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9NQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyV0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUxBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5REE7QUFDQTs7QUNEQTs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDaklBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ2hPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDL0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ3RhQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbklBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3UEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25PQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9FQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQzFrQkE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDek9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pGQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hGQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKTt0aHJvdyBmLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pIiwiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBQcm9ncmFtQ29uZmlndXJhdGlvbiA9IHJlcXVpcmUoJy4vcHJvZ3JhbV9jb25maWd1cmF0aW9uJyk7XG5cbmNsYXNzIFNlZ21lbnQge1xuICAgIGNvbnN0cnVjdG9yKHZlcnRleE9mZnNldCwgcHJpbWl0aXZlT2Zmc2V0KSB7XG4gICAgICAgIHRoaXMudmVydGV4T2Zmc2V0ID0gdmVydGV4T2Zmc2V0O1xuICAgICAgICB0aGlzLnByaW1pdGl2ZU9mZnNldCA9IHByaW1pdGl2ZU9mZnNldDtcbiAgICAgICAgdGhpcy52ZXJ0ZXhMZW5ndGggPSAwO1xuICAgICAgICB0aGlzLnByaW1pdGl2ZUxlbmd0aCA9IDA7XG4gICAgfVxufVxuXG4vKipcbiAqIEEgY2xhc3MgdGhhdCBtYW5hZ2VzIHZlcnRleCBhbmQgZWxlbWVudCBhcnJheXMgZm9yIGEgYnVja2V0LiBJdCBoYW5kbGVzIGluaXRpYWxpemF0aW9uLFxuICogc2VyaWFsaXphdGlvbiBmb3IgdHJhbnNmZXIgdG8gdGhlIG1haW4gdGhyZWFkLCBhbmQgY2VydGFpbiBpbnRlcnZlbmluZyBtdXRhdGlvbnMuXG4gKlxuICogQSBncm91cCBoYXM6XG4gKlxuICogKiBBIFwibGF5b3V0XCIgdmVydGV4IGFycmF5LCB3aXRoIGZpeGVkIGF0dHJpYnV0ZXMsIGNvbnRhaW5pbmcgdmFsdWVzIGNhbGN1bGF0ZWQgZnJvbSBsYXlvdXQgcHJvcGVydGllcy5cbiAqICogWmVybywgb25lLCBvciB0d28gZWxlbWVudCBhcnJheXMsIHdpdGggZml4ZWQgbGF5b3V0LCBmb3IgZXZlbnR1YWwgYGdsLmRyYXdFbGVtZW50c2AgdXNlLlxuICogKiBaZXJvIG9yIG1vcmUgXCJwYWludFwiIHZlcnRleCBhcnJheXMga2V5ZWQgYnkgbGF5ZXIgSUQsIGVhY2ggd2l0aCBhIGR5bmFtaWMgbGF5b3V0IHdoaWNoIGRlcGVuZHNcbiAqICAgb24gd2hpY2ggcGFpbnQgcHJvcGVydGllcyBvZiB0aGF0IGxheWVyIHVzZSBkYXRhLWRyaXZlbi1mdW5jdGlvbnMgKHByb3BlcnR5IGZ1bmN0aW9ucyBvclxuICogICBwcm9wZXJ0eS1hbmQtem9vbSBmdW5jdGlvbnMpLiBWYWx1ZXMgYXJlIGNhbGN1bGF0ZWQgYnkgZXZhbHVhdGluZyB0aG9zZSBmdW5jdGlvbnMuXG4gKlxuICogQmVjYXVzZSBpbmRleGVkIHJlbmRlcmluZyBpcyBiZXN0IGRvbmUgd2l0aCAxNiBiaXQgaW5kaWNlcyAoYW5kIGluIGZhY3QsIGluIFdlYkdMLCAxNiBiaXRcbiAqIGluZGljZXMgYXJlIHRoZSBvbmx5IGNob2ljZSksIGEgZm9ybSBvZiBzZWdtZW50ZWQgYWRkcmVzc2luZyBpcyB1c2VkLiBFYWNoIGdyb3VwXG4gKiBjb250YWlucyBhbiBgQXJyYXlgIG9mIGBTZWdtZW50YHMuIEEgc2VnbWVudCBjb250YWlucyBhIHZlcnRleCBhcnJheSBvZmZzZXQsIHdoaWNoIGZvcm1zXG4gKiB0aGUgXCJiYXNlIGFkZHJlc3NcIiBvZiBpbmRpY2VzIHdpdGhpbiB0aGlzIHNlZ21lbnQuIEVhY2ggc2VnbWVudCBpcyBkcmF3biBzZXBhcmF0ZWx5LlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIEFycmF5R3JvdXAge1xuICAgIGNvbnN0cnVjdG9yKHByb2dyYW1JbnRlcmZhY2UsIGxheWVycywgem9vbSkge1xuICAgICAgICB0aGlzLmdsb2JhbFByb3BlcnRpZXMgPSB7em9vbX07XG5cbiAgICAgICAgY29uc3QgTGF5b3V0VmVydGV4QXJyYXlUeXBlID0gcHJvZ3JhbUludGVyZmFjZS5sYXlvdXRWZXJ0ZXhBcnJheVR5cGU7XG4gICAgICAgIHRoaXMubGF5b3V0VmVydGV4QXJyYXkgPSBuZXcgTGF5b3V0VmVydGV4QXJyYXlUeXBlKCk7XG5cbiAgICAgICAgY29uc3QgRWxlbWVudEFycmF5VHlwZSA9IHByb2dyYW1JbnRlcmZhY2UuZWxlbWVudEFycmF5VHlwZTtcbiAgICAgICAgaWYgKEVsZW1lbnRBcnJheVR5cGUpIHRoaXMuZWxlbWVudEFycmF5ID0gbmV3IEVsZW1lbnRBcnJheVR5cGUoKTtcblxuICAgICAgICBjb25zdCBFbGVtZW50QXJyYXlUeXBlMiA9IHByb2dyYW1JbnRlcmZhY2UuZWxlbWVudEFycmF5VHlwZTI7XG4gICAgICAgIGlmIChFbGVtZW50QXJyYXlUeXBlMikgdGhpcy5lbGVtZW50QXJyYXkyID0gbmV3IEVsZW1lbnRBcnJheVR5cGUyKCk7XG5cbiAgICAgICAgdGhpcy5sYXllckRhdGEgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBsYXllciBvZiBsYXllcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHByb2dyYW1Db25maWd1cmF0aW9uID0gUHJvZ3JhbUNvbmZpZ3VyYXRpb24uY3JlYXRlRHluYW1pYyhcbiAgICAgICAgICAgICAgICBwcm9ncmFtSW50ZXJmYWNlLnBhaW50QXR0cmlidXRlcyB8fCBbXSwgbGF5ZXIsIHpvb20pO1xuICAgICAgICAgICAgdGhpcy5sYXllckRhdGFbbGF5ZXIuaWRdID0ge1xuICAgICAgICAgICAgICAgIGxheWVyOiBsYXllcixcbiAgICAgICAgICAgICAgICBwcm9ncmFtQ29uZmlndXJhdGlvbjogcHJvZ3JhbUNvbmZpZ3VyYXRpb24sXG4gICAgICAgICAgICAgICAgcGFpbnRWZXJ0ZXhBcnJheTogbmV3IHByb2dyYW1Db25maWd1cmF0aW9uLlBhaW50VmVydGV4QXJyYXkoKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2VnbWVudHMgPSBbXTtcbiAgICAgICAgdGhpcy5zZWdtZW50czIgPSBbXTtcbiAgICB9XG5cbiAgICBwcmVwYXJlU2VnbWVudChudW1WZXJ0aWNlcykge1xuICAgICAgICBsZXQgc2VnbWVudCA9IHRoaXMuc2VnbWVudHNbdGhpcy5zZWdtZW50cy5sZW5ndGggLSAxXTtcbiAgICAgICAgaWYgKCFzZWdtZW50IHx8IHNlZ21lbnQudmVydGV4TGVuZ3RoICsgbnVtVmVydGljZXMgPiBBcnJheUdyb3VwLk1BWF9WRVJURVhfQVJSQVlfTEVOR1RIKSB7XG4gICAgICAgICAgICBzZWdtZW50ID0gbmV3IFNlZ21lbnQodGhpcy5sYXlvdXRWZXJ0ZXhBcnJheS5sZW5ndGgsIHRoaXMuZWxlbWVudEFycmF5Lmxlbmd0aCk7XG4gICAgICAgICAgICB0aGlzLnNlZ21lbnRzLnB1c2goc2VnbWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlZ21lbnQ7XG4gICAgfVxuXG4gICAgcHJlcGFyZVNlZ21lbnQyKG51bVZlcnRpY2VzKSB7XG4gICAgICAgIGxldCBzZWdtZW50ID0gdGhpcy5zZWdtZW50czJbdGhpcy5zZWdtZW50czIubGVuZ3RoIC0gMV07XG4gICAgICAgIGlmICghc2VnbWVudCB8fCBzZWdtZW50LnZlcnRleExlbmd0aCArIG51bVZlcnRpY2VzID4gQXJyYXlHcm91cC5NQVhfVkVSVEVYX0FSUkFZX0xFTkdUSCkge1xuICAgICAgICAgICAgc2VnbWVudCA9IG5ldyBTZWdtZW50KHRoaXMubGF5b3V0VmVydGV4QXJyYXkubGVuZ3RoLCB0aGlzLmVsZW1lbnRBcnJheTIubGVuZ3RoKTtcbiAgICAgICAgICAgIHRoaXMuc2VnbWVudHMyLnB1c2goc2VnbWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlZ21lbnQ7XG4gICAgfVxuXG4gICAgcG9wdWxhdGVQYWludEFycmF5cyhmZWF0dXJlUHJvcGVydGllcykge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLmxheWVyRGF0YSkge1xuICAgICAgICAgICAgY29uc3QgbGF5ZXJEYXRhID0gdGhpcy5sYXllckRhdGFba2V5XTtcbiAgICAgICAgICAgIGlmIChsYXllckRhdGEucGFpbnRWZXJ0ZXhBcnJheS5ieXRlc1BlckVsZW1lbnQgPT09IDApIGNvbnRpbnVlO1xuICAgICAgICAgICAgbGF5ZXJEYXRhLnByb2dyYW1Db25maWd1cmF0aW9uLnBvcHVsYXRlUGFpbnRBcnJheShcbiAgICAgICAgICAgICAgICBsYXllckRhdGEubGF5ZXIsXG4gICAgICAgICAgICAgICAgbGF5ZXJEYXRhLnBhaW50VmVydGV4QXJyYXksXG4gICAgICAgICAgICAgICAgdGhpcy5sYXlvdXRWZXJ0ZXhBcnJheS5sZW5ndGgsXG4gICAgICAgICAgICAgICAgdGhpcy5nbG9iYWxQcm9wZXJ0aWVzLFxuICAgICAgICAgICAgICAgIGZlYXR1cmVQcm9wZXJ0aWVzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlzRW1wdHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxheW91dFZlcnRleEFycmF5Lmxlbmd0aCA9PT0gMDtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUodHJhbnNmZXJhYmxlcykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGF5b3V0VmVydGV4QXJyYXk6IHRoaXMubGF5b3V0VmVydGV4QXJyYXkuc2VyaWFsaXplKHRyYW5zZmVyYWJsZXMpLFxuICAgICAgICAgICAgZWxlbWVudEFycmF5OiB0aGlzLmVsZW1lbnRBcnJheSAmJiB0aGlzLmVsZW1lbnRBcnJheS5zZXJpYWxpemUodHJhbnNmZXJhYmxlcyksXG4gICAgICAgICAgICBlbGVtZW50QXJyYXkyOiB0aGlzLmVsZW1lbnRBcnJheTIgJiYgdGhpcy5lbGVtZW50QXJyYXkyLnNlcmlhbGl6ZSh0cmFuc2ZlcmFibGVzKSxcbiAgICAgICAgICAgIHBhaW50VmVydGV4QXJyYXlzOiBzZXJpYWxpemVQYWludFZlcnRleEFycmF5cyh0aGlzLmxheWVyRGF0YSwgdHJhbnNmZXJhYmxlcyksXG4gICAgICAgICAgICBzZWdtZW50czogdGhpcy5zZWdtZW50cyxcbiAgICAgICAgICAgIHNlZ21lbnRzMjogdGhpcy5zZWdtZW50czJcbiAgICAgICAgfTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHNlcmlhbGl6ZVBhaW50VmVydGV4QXJyYXlzKGxheWVyRGF0YSwgdHJhbnNmZXJhYmxlcykge1xuICAgIGNvbnN0IHBhaW50VmVydGV4QXJyYXlzID0ge307XG4gICAgZm9yIChjb25zdCBsYXllcklkIGluIGxheWVyRGF0YSkge1xuICAgICAgICBjb25zdCBpbnB1dEFycmF5ID0gbGF5ZXJEYXRhW2xheWVySWRdLnBhaW50VmVydGV4QXJyYXk7XG4gICAgICAgIGlmIChpbnB1dEFycmF5Lmxlbmd0aCA9PT0gMCkgY29udGludWU7XG4gICAgICAgIGNvbnN0IGFycmF5ID0gaW5wdXRBcnJheS5zZXJpYWxpemUodHJhbnNmZXJhYmxlcyk7XG4gICAgICAgIGNvbnN0IHR5cGUgPSBpbnB1dEFycmF5LmNvbnN0cnVjdG9yLnNlcmlhbGl6ZSgpO1xuICAgICAgICBwYWludFZlcnRleEFycmF5c1tsYXllcklkXSA9IHthcnJheSwgdHlwZX07XG4gICAgfVxuICAgIHJldHVybiBwYWludFZlcnRleEFycmF5cztcbn1cblxuLyoqXG4gKiBUaGUgbWF4aW11bSBzaXplIG9mIGEgdmVydGV4IGFycmF5LiBUaGlzIGxpbWl0IGlzIGltcG9zZWQgYnkgV2ViR0wncyAxNiBiaXRcbiAqIGFkZHJlc3Npbmcgb2YgdmVydGV4IGJ1ZmZlcnMuXG4gKiBAcHJpdmF0ZVxuICogQHJlYWRvbmx5XG4gKi9cbkFycmF5R3JvdXAuTUFYX1ZFUlRFWF9BUlJBWV9MRU5HVEggPSBNYXRoLnBvdygyLCAxNikgLSAxO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEFycmF5R3JvdXA7XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IEFycmF5R3JvdXAgPSByZXF1aXJlKCcuL2FycmF5X2dyb3VwJyk7XG5jb25zdCBCdWZmZXJHcm91cCA9IHJlcXVpcmUoJy4vYnVmZmVyX2dyb3VwJyk7XG5jb25zdCB1dGlsID0gcmVxdWlyZSgnLi4vdXRpbC91dGlsJyk7XG5cbi8qKlxuICogVGhlIGBCdWNrZXRgIGNsYXNzIGlzIHRoZSBzaW5nbGUgcG9pbnQgb2Yga25vd2xlZGdlIGFib3V0IHR1cm5pbmcgdmVjdG9yXG4gKiB0aWxlcyBpbnRvIFdlYkdMIGJ1ZmZlcnMuXG4gKlxuICogYEJ1Y2tldGAgaXMgYW4gYWJzdHJhY3QgY2xhc3MuIEEgc3ViY2xhc3MgZXhpc3RzIGZvciBlYWNoIHN0eWxlIGxheWVyIHR5cGUuXG4gKiBDcmVhdGUgYSBidWNrZXQgdmlhIHRoZSBgU3R5bGVMYXllciNjcmVhdGVCdWNrZXRgIG1ldGhvZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBCdWNrZXQge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSBvcHRpb25zXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG9wdGlvbnMuem9vbSBab29tIGxldmVsIG9mIHRoZSBidWZmZXJzIGJlaW5nIGJ1aWx0LiBNYXkgYmVcbiAgICAgKiAgICAgYSBmcmFjdGlvbmFsIHpvb20gbGV2ZWwuXG4gICAgICogQHBhcmFtIG9wdGlvbnMubGF5ZXIgQSBNYXBib3ggc3R5bGUgbGF5ZXIgb2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3QuPHN0cmluZywgQnVmZmVyPn0gb3B0aW9ucy5idWZmZXJzIFRoZSBzZXQgb2YgYEJ1ZmZlcmBzIGJlaW5nXG4gICAgICogICAgIGJ1aWx0IGZvciB0aGlzIHRpbGUuIFRoaXMgb2JqZWN0IGZhY2lsaXRhdGVzIHNoYXJpbmcgb2YgYEJ1ZmZlcmBzIGJlXG4gICAgICAgICAgIGJldHdlZW4gYEJ1Y2tldGBzLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChvcHRpb25zLCBwcm9ncmFtSW50ZXJmYWNlKSB7XG4gICAgICAgIHRoaXMuem9vbSA9IG9wdGlvbnMuem9vbTtcbiAgICAgICAgdGhpcy5vdmVyc2NhbGluZyA9IG9wdGlvbnMub3ZlcnNjYWxpbmc7XG4gICAgICAgIHRoaXMubGF5ZXJzID0gb3B0aW9ucy5sYXllcnM7XG4gICAgICAgIHRoaXMuaW5kZXggPSBvcHRpb25zLmluZGV4O1xuXG4gICAgICAgIGlmIChvcHRpb25zLmFycmF5cykge1xuICAgICAgICAgICAgdGhpcy5idWZmZXJzID0gbmV3IEJ1ZmZlckdyb3VwKHByb2dyYW1JbnRlcmZhY2UsIG9wdGlvbnMubGF5ZXJzLCBvcHRpb25zLnpvb20sIG9wdGlvbnMuYXJyYXlzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYXJyYXlzID0gbmV3IEFycmF5R3JvdXAocHJvZ3JhbUludGVyZmFjZSwgb3B0aW9ucy5sYXllcnMsIG9wdGlvbnMuem9vbSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwb3B1bGF0ZShmZWF0dXJlcywgb3B0aW9ucykge1xuICAgICAgICBmb3IgKGNvbnN0IGZlYXR1cmUgb2YgZmVhdHVyZXMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmxheWVyc1swXS5maWx0ZXIoZmVhdHVyZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEZlYXR1cmUoZmVhdHVyZSk7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5mZWF0dXJlSW5kZXguaW5zZXJ0KGZlYXR1cmUsIHRoaXMuaW5kZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaXNFbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXJyYXlzLmlzRW1wdHkoKTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUodHJhbnNmZXJhYmxlcykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgem9vbTogdGhpcy56b29tLFxuICAgICAgICAgICAgbGF5ZXJJZHM6IHRoaXMubGF5ZXJzLm1hcCgobCkgPT4gbC5pZCksXG4gICAgICAgICAgICBhcnJheXM6IHRoaXMuYXJyYXlzLnNlcmlhbGl6ZSh0cmFuc2ZlcmFibGVzKVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbGVhc2UgdGhlIFdlYkdMIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGJ1ZmZlcnMuIE5vdGUgdGhhdCBiZWNhdXNlXG4gICAgICogYnVja2V0cyBhcmUgc2hhcmVkIGJldHdlZW4gbGF5ZXJzIGhhdmluZyB0aGUgc2FtZSBsYXlvdXQgcHJvcGVydGllcywgdGhleVxuICAgICAqIG11c3QgYmUgZGVzdHJveWVkIGluIGdyb3VwcyAoYWxsIGJ1Y2tldHMgZm9yIGEgdGlsZSwgb3IgYWxsIHN5bWJvbCBidWNrZXRzKS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuYnVmZmVycykge1xuICAgICAgICAgICAgdGhpcy5idWZmZXJzLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMuYnVmZmVycyA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gQnVja2V0O1xuXG5CdWNrZXQuZGVzZXJpYWxpemUgPSBmdW5jdGlvbihpbnB1dCwgc3R5bGUpIHtcbiAgICAvLyBHdWFyZCBhZ2FpbnN0IHRoZSBjYXNlIHdoZXJlIHRoZSBtYXAncyBzdHlsZSBoYXMgYmVlbiBzZXQgdG8gbnVsbCB3aGlsZVxuICAgIC8vIHRoaXMgYnVja2V0IGhhcyBiZWVuIHBhcnNpbmcuXG4gICAgaWYgKCFzdHlsZSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb3V0cHV0ID0ge307XG5cbiAgICBmb3IgKGNvbnN0IHNlcmlhbGl6ZWQgb2YgaW5wdXQpIHtcbiAgICAgICAgY29uc3QgbGF5ZXJzID0gc2VyaWFsaXplZC5sYXllcklkc1xuICAgICAgICAgICAgLm1hcCgoaWQpID0+IHN0eWxlLmdldExheWVyKGlkKSlcbiAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbik7XG5cbiAgICAgICAgaWYgKGxheWVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYnVja2V0ID0gbGF5ZXJzWzBdLmNyZWF0ZUJ1Y2tldCh1dGlsLmV4dGVuZCh7bGF5ZXJzfSwgc2VyaWFsaXplZCkpO1xuICAgICAgICBmb3IgKGNvbnN0IGxheWVyIG9mIGxheWVycykge1xuICAgICAgICAgICAgb3V0cHV0W2xheWVyLmlkXSA9IGJ1Y2tldDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvdXRwdXQ7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBCdWNrZXQgPSByZXF1aXJlKCcuLi9idWNrZXQnKTtcbmNvbnN0IGNyZWF0ZVZlcnRleEFycmF5VHlwZSA9IHJlcXVpcmUoJy4uL3ZlcnRleF9hcnJheV90eXBlJyk7XG5jb25zdCBjcmVhdGVFbGVtZW50QXJyYXlUeXBlID0gcmVxdWlyZSgnLi4vZWxlbWVudF9hcnJheV90eXBlJyk7XG5jb25zdCBsb2FkR2VvbWV0cnkgPSByZXF1aXJlKCcuLi9sb2FkX2dlb21ldHJ5Jyk7XG5jb25zdCBFWFRFTlQgPSByZXF1aXJlKCcuLi9leHRlbnQnKTtcblxuY29uc3QgY2lyY2xlSW50ZXJmYWNlID0ge1xuICAgIGxheW91dFZlcnRleEFycmF5VHlwZTogY3JlYXRlVmVydGV4QXJyYXlUeXBlKFtcbiAgICAgICAge25hbWU6ICdhX3BvcycsIGNvbXBvbmVudHM6IDIsIHR5cGU6ICdJbnQxNid9XG4gICAgXSksXG4gICAgZWxlbWVudEFycmF5VHlwZTogY3JlYXRlRWxlbWVudEFycmF5VHlwZSgpLFxuXG4gICAgcGFpbnRBdHRyaWJ1dGVzOiBbXG4gICAgICAgIHtwcm9wZXJ0eTogJ2NpcmNsZS1jb2xvcicsICAgICAgICAgIHR5cGU6ICdVaW50OCd9LFxuICAgICAgICB7cHJvcGVydHk6ICdjaXJjbGUtcmFkaXVzJywgICAgICAgICB0eXBlOiAnVWludDE2JywgbXVsdGlwbGllcjogMTB9LFxuICAgICAgICB7cHJvcGVydHk6ICdjaXJjbGUtYmx1cicsICAgICAgICAgICB0eXBlOiAnVWludDE2JywgbXVsdGlwbGllcjogMTB9LFxuICAgICAgICB7cHJvcGVydHk6ICdjaXJjbGUtb3BhY2l0eScsICAgICAgICB0eXBlOiAnVWludDgnLCAgbXVsdGlwbGllcjogMjU1fSxcbiAgICAgICAge3Byb3BlcnR5OiAnY2lyY2xlLXN0cm9rZS1jb2xvcicsICAgdHlwZTogJ1VpbnQ4J30sXG4gICAgICAgIHtwcm9wZXJ0eTogJ2NpcmNsZS1zdHJva2Utd2lkdGgnLCAgIHR5cGU6ICdVaW50MTYnLCBtdWx0aXBsaWVyOiAxMH0sXG4gICAgICAgIHtwcm9wZXJ0eTogJ2NpcmNsZS1zdHJva2Utb3BhY2l0eScsIHR5cGU6ICdVaW50OCcsICBtdWx0aXBsaWVyOiAyNTV9XG4gICAgXVxufTtcblxuZnVuY3Rpb24gYWRkQ2lyY2xlVmVydGV4KGxheW91dFZlcnRleEFycmF5LCB4LCB5LCBleHRydWRlWCwgZXh0cnVkZVkpIHtcbiAgICBsYXlvdXRWZXJ0ZXhBcnJheS5lbXBsYWNlQmFjayhcbiAgICAgICAgKHggKiAyKSArICgoZXh0cnVkZVggKyAxKSAvIDIpLFxuICAgICAgICAoeSAqIDIpICsgKChleHRydWRlWSArIDEpIC8gMikpO1xufVxuXG4vKipcbiAqIENpcmNsZXMgYXJlIHJlcHJlc2VudGVkIGJ5IHR3byB0cmlhbmdsZXMuXG4gKlxuICogRWFjaCBjb3JuZXIgaGFzIGEgcG9zIHRoYXQgaXMgdGhlIGNlbnRlciBvZiB0aGUgY2lyY2xlIGFuZCBhbiBleHRydXNpb25cbiAqIHZlY3RvciB0aGF0IGlzIHdoZXJlIGl0IHBvaW50cy5cbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIENpcmNsZUJ1Y2tldCBleHRlbmRzIEJ1Y2tldCB7XG4gICAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgICAgICBzdXBlcihvcHRpb25zLCBjaXJjbGVJbnRlcmZhY2UpO1xuICAgIH1cblxuICAgIGFkZEZlYXR1cmUoZmVhdHVyZSkge1xuICAgICAgICBjb25zdCBhcnJheXMgPSB0aGlzLmFycmF5cztcblxuICAgICAgICBmb3IgKGNvbnN0IHJpbmcgb2YgbG9hZEdlb21ldHJ5KGZlYXR1cmUpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHBvaW50IG9mIHJpbmcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB4ID0gcG9pbnQueDtcbiAgICAgICAgICAgICAgICBjb25zdCB5ID0gcG9pbnQueTtcblxuICAgICAgICAgICAgICAgIC8vIERvIG5vdCBpbmNsdWRlIHBvaW50cyB0aGF0IGFyZSBvdXRzaWRlIHRoZSB0aWxlIGJvdW5kYXJpZXMuXG4gICAgICAgICAgICAgICAgaWYgKHggPCAwIHx8IHggPj0gRVhURU5UIHx8IHkgPCAwIHx8IHkgPj0gRVhURU5UKSBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgIC8vIHRoaXMgZ2VvbWV0cnkgd2lsbCBiZSBvZiB0aGUgUG9pbnQgdHlwZSwgYW5kIHdlJ2xsIGRlcml2ZVxuICAgICAgICAgICAgICAgIC8vIHR3byB0cmlhbmdsZXMgZnJvbSBpdC5cbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIC8vIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkFxuICAgICAgICAgICAgICAgIC8vIOKUgiAzICAgICAyIOKUglxuICAgICAgICAgICAgICAgIC8vIOKUgiAgICAgICAgIOKUglxuICAgICAgICAgICAgICAgIC8vIOKUgiAwICAgICAxIOKUglxuICAgICAgICAgICAgICAgIC8vIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmFxuXG4gICAgICAgICAgICAgICAgY29uc3Qgc2VnbWVudCA9IGFycmF5cy5wcmVwYXJlU2VnbWVudCg0KTtcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IHNlZ21lbnQudmVydGV4TGVuZ3RoO1xuXG4gICAgICAgICAgICAgICAgYWRkQ2lyY2xlVmVydGV4KGFycmF5cy5sYXlvdXRWZXJ0ZXhBcnJheSwgeCwgeSwgLTEsIC0xKTtcbiAgICAgICAgICAgICAgICBhZGRDaXJjbGVWZXJ0ZXgoYXJyYXlzLmxheW91dFZlcnRleEFycmF5LCB4LCB5LCAxLCAtMSk7XG4gICAgICAgICAgICAgICAgYWRkQ2lyY2xlVmVydGV4KGFycmF5cy5sYXlvdXRWZXJ0ZXhBcnJheSwgeCwgeSwgMSwgMSk7XG4gICAgICAgICAgICAgICAgYWRkQ2lyY2xlVmVydGV4KGFycmF5cy5sYXlvdXRWZXJ0ZXhBcnJheSwgeCwgeSwgLTEsIDEpO1xuXG4gICAgICAgICAgICAgICAgYXJyYXlzLmVsZW1lbnRBcnJheS5lbXBsYWNlQmFjayhpbmRleCwgaW5kZXggKyAxLCBpbmRleCArIDIpO1xuICAgICAgICAgICAgICAgIGFycmF5cy5lbGVtZW50QXJyYXkuZW1wbGFjZUJhY2soaW5kZXgsIGluZGV4ICsgMywgaW5kZXggKyAyKTtcblxuICAgICAgICAgICAgICAgIHNlZ21lbnQudmVydGV4TGVuZ3RoICs9IDQ7XG4gICAgICAgICAgICAgICAgc2VnbWVudC5wcmltaXRpdmVMZW5ndGggKz0gMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGFycmF5cy5wb3B1bGF0ZVBhaW50QXJyYXlzKGZlYXR1cmUucHJvcGVydGllcyk7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IENpcmNsZUJ1Y2tldDtcbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgQnVja2V0ID0gcmVxdWlyZSgnLi4vYnVja2V0Jyk7XG5jb25zdCBjcmVhdGVWZXJ0ZXhBcnJheVR5cGUgPSByZXF1aXJlKCcuLi92ZXJ0ZXhfYXJyYXlfdHlwZScpO1xuY29uc3QgY3JlYXRlRWxlbWVudEFycmF5VHlwZSA9IHJlcXVpcmUoJy4uL2VsZW1lbnRfYXJyYXlfdHlwZScpO1xuY29uc3QgbG9hZEdlb21ldHJ5ID0gcmVxdWlyZSgnLi4vbG9hZF9nZW9tZXRyeScpO1xuY29uc3QgZWFyY3V0ID0gcmVxdWlyZSgnZWFyY3V0Jyk7XG5jb25zdCBjbGFzc2lmeVJpbmdzID0gcmVxdWlyZSgnLi4vLi4vdXRpbC9jbGFzc2lmeV9yaW5ncycpO1xuY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0Jyk7XG5jb25zdCBFQVJDVVRfTUFYX1JJTkdTID0gNTAwO1xuXG5jb25zdCBmaWxsSW50ZXJmYWNlID0ge1xuICAgIGxheW91dFZlcnRleEFycmF5VHlwZTogY3JlYXRlVmVydGV4QXJyYXlUeXBlKFtcbiAgICAgICAge25hbWU6ICdhX3BvcycsIGNvbXBvbmVudHM6IDIsIHR5cGU6ICdJbnQxNid9XG4gICAgXSksXG4gICAgZWxlbWVudEFycmF5VHlwZTogY3JlYXRlRWxlbWVudEFycmF5VHlwZSgzKSxcbiAgICBlbGVtZW50QXJyYXlUeXBlMjogY3JlYXRlRWxlbWVudEFycmF5VHlwZSgyKSxcblxuICAgIHBhaW50QXR0cmlidXRlczogW1xuICAgICAgICB7cHJvcGVydHk6ICdmaWxsLWNvbG9yJywgICAgICAgICB0eXBlOiAnVWludDgnfSxcbiAgICAgICAge3Byb3BlcnR5OiAnZmlsbC1vdXRsaW5lLWNvbG9yJywgdHlwZTogJ1VpbnQ4J30sXG4gICAgICAgIHtwcm9wZXJ0eTogJ2ZpbGwtb3BhY2l0eScsICAgICAgIHR5cGU6ICdVaW50OCcsIG11bHRpcGxpZXI6IDI1NX1cbiAgICBdXG59O1xuXG5jbGFzcyBGaWxsQnVja2V0IGV4dGVuZHMgQnVja2V0IHtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKG9wdGlvbnMsIGZpbGxJbnRlcmZhY2UpO1xuICAgIH1cblxuICAgIGFkZEZlYXR1cmUoZmVhdHVyZSkge1xuICAgICAgICBjb25zdCBhcnJheXMgPSB0aGlzLmFycmF5cztcblxuICAgICAgICBmb3IgKGNvbnN0IHBvbHlnb24gb2YgY2xhc3NpZnlSaW5ncyhsb2FkR2VvbWV0cnkoZmVhdHVyZSksIEVBUkNVVF9NQVhfUklOR1MpKSB7XG4gICAgICAgICAgICBsZXQgbnVtVmVydGljZXMgPSAwO1xuICAgICAgICAgICAgZm9yIChjb25zdCByaW5nIG9mIHBvbHlnb24pIHtcbiAgICAgICAgICAgICAgICBudW1WZXJ0aWNlcyArPSByaW5nLmxlbmd0aDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgdHJpYW5nbGVTZWdtZW50ID0gYXJyYXlzLnByZXBhcmVTZWdtZW50KG51bVZlcnRpY2VzKTtcbiAgICAgICAgICAgIGNvbnN0IHRyaWFuZ2xlSW5kZXggPSB0cmlhbmdsZVNlZ21lbnQudmVydGV4TGVuZ3RoO1xuXG4gICAgICAgICAgICBjb25zdCBmbGF0dGVuZWQgPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IGhvbGVJbmRpY2VzID0gW107XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgcmluZyBvZiBwb2x5Z29uKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJpbmcubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChyaW5nICE9PSBwb2x5Z29uWzBdKSB7XG4gICAgICAgICAgICAgICAgICAgIGhvbGVJbmRpY2VzLnB1c2goZmxhdHRlbmVkLmxlbmd0aCAvIDIpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGxpbmVTZWdtZW50ID0gYXJyYXlzLnByZXBhcmVTZWdtZW50MihyaW5nLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgY29uc3QgbGluZUluZGV4ID0gbGluZVNlZ21lbnQudmVydGV4TGVuZ3RoO1xuXG4gICAgICAgICAgICAgICAgYXJyYXlzLmxheW91dFZlcnRleEFycmF5LmVtcGxhY2VCYWNrKHJpbmdbMF0ueCwgcmluZ1swXS55KTtcbiAgICAgICAgICAgICAgICBhcnJheXMuZWxlbWVudEFycmF5Mi5lbXBsYWNlQmFjayhsaW5lSW5kZXggKyByaW5nLmxlbmd0aCAtIDEsIGxpbmVJbmRleCk7XG4gICAgICAgICAgICAgICAgZmxhdHRlbmVkLnB1c2gocmluZ1swXS54KTtcbiAgICAgICAgICAgICAgICBmbGF0dGVuZWQucHVzaChyaW5nWzBdLnkpO1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCByaW5nLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGFycmF5cy5sYXlvdXRWZXJ0ZXhBcnJheS5lbXBsYWNlQmFjayhyaW5nW2ldLngsIHJpbmdbaV0ueSk7XG4gICAgICAgICAgICAgICAgICAgIGFycmF5cy5lbGVtZW50QXJyYXkyLmVtcGxhY2VCYWNrKGxpbmVJbmRleCArIGkgLSAxLCBsaW5lSW5kZXggKyBpKTtcbiAgICAgICAgICAgICAgICAgICAgZmxhdHRlbmVkLnB1c2gocmluZ1tpXS54KTtcbiAgICAgICAgICAgICAgICAgICAgZmxhdHRlbmVkLnB1c2gocmluZ1tpXS55KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsaW5lU2VnbWVudC52ZXJ0ZXhMZW5ndGggKz0gcmluZy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgbGluZVNlZ21lbnQucHJpbWl0aXZlTGVuZ3RoICs9IHJpbmcubGVuZ3RoO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBpbmRpY2VzID0gZWFyY3V0KGZsYXR0ZW5lZCwgaG9sZUluZGljZXMpO1xuICAgICAgICAgICAgYXNzZXJ0KGluZGljZXMubGVuZ3RoICUgMyA9PT0gMCk7XG5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5kaWNlcy5sZW5ndGg7IGkgKz0gMykge1xuICAgICAgICAgICAgICAgIGFycmF5cy5lbGVtZW50QXJyYXkuZW1wbGFjZUJhY2soXG4gICAgICAgICAgICAgICAgICAgIHRyaWFuZ2xlSW5kZXggKyBpbmRpY2VzW2ldLFxuICAgICAgICAgICAgICAgICAgICB0cmlhbmdsZUluZGV4ICsgaW5kaWNlc1tpICsgMV0sXG4gICAgICAgICAgICAgICAgICAgIHRyaWFuZ2xlSW5kZXggKyBpbmRpY2VzW2kgKyAyXSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRyaWFuZ2xlU2VnbWVudC52ZXJ0ZXhMZW5ndGggKz0gbnVtVmVydGljZXM7XG4gICAgICAgICAgICB0cmlhbmdsZVNlZ21lbnQucHJpbWl0aXZlTGVuZ3RoICs9IGluZGljZXMubGVuZ3RoIC8gMztcbiAgICAgICAgfVxuXG4gICAgICAgIGFycmF5cy5wb3B1bGF0ZVBhaW50QXJyYXlzKGZlYXR1cmUucHJvcGVydGllcyk7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IEZpbGxCdWNrZXQ7XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IEJ1Y2tldCA9IHJlcXVpcmUoJy4uL2J1Y2tldCcpO1xuY29uc3QgY3JlYXRlVmVydGV4QXJyYXlUeXBlID0gcmVxdWlyZSgnLi4vdmVydGV4X2FycmF5X3R5cGUnKTtcbmNvbnN0IGNyZWF0ZUVsZW1lbnRBcnJheVR5cGUgPSByZXF1aXJlKCcuLi9lbGVtZW50X2FycmF5X3R5cGUnKTtcbmNvbnN0IGxvYWRHZW9tZXRyeSA9IHJlcXVpcmUoJy4uL2xvYWRfZ2VvbWV0cnknKTtcbmNvbnN0IEVYVEVOVCA9IHJlcXVpcmUoJy4uL2V4dGVudCcpO1xuY29uc3QgZWFyY3V0ID0gcmVxdWlyZSgnZWFyY3V0Jyk7XG5jb25zdCBjbGFzc2lmeVJpbmdzID0gcmVxdWlyZSgnLi4vLi4vdXRpbC9jbGFzc2lmeV9yaW5ncycpO1xuY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0Jyk7XG5jb25zdCBFQVJDVVRfTUFYX1JJTkdTID0gNTAwO1xuXG5jb25zdCBmaWxsRXh0cnVzaW9uSW50ZXJmYWNlID0ge1xuICAgIGxheW91dFZlcnRleEFycmF5VHlwZTogY3JlYXRlVmVydGV4QXJyYXlUeXBlKFtcbiAgICAgICAge25hbWU6ICdhX3BvcycsICAgICAgICAgIGNvbXBvbmVudHM6IDIsIHR5cGU6ICdJbnQxNid9LFxuICAgICAgICB7bmFtZTogJ2Ffbm9ybWFsJywgICAgICAgY29tcG9uZW50czogMywgdHlwZTogJ0ludDE2J30sXG4gICAgICAgIHtuYW1lOiAnYV9lZGdlZGlzdGFuY2UnLCBjb21wb25lbnRzOiAxLCB0eXBlOiAnSW50MTYnfVxuICAgIF0pLFxuICAgIGVsZW1lbnRBcnJheVR5cGU6IGNyZWF0ZUVsZW1lbnRBcnJheVR5cGUoMyksXG5cbiAgICBwYWludEF0dHJpYnV0ZXM6IFtcbiAgICAgICAge3Byb3BlcnR5OiAnZmlsbC1leHRydXNpb24tYmFzZScsICAgdHlwZTogJ1VpbnQxNid9LFxuICAgICAgICB7cHJvcGVydHk6ICdmaWxsLWV4dHJ1c2lvbi1oZWlnaHQnLCB0eXBlOiAnVWludDE2J30sXG4gICAgICAgIHtwcm9wZXJ0eTogJ2ZpbGwtZXh0cnVzaW9uLWNvbG9yJywgIHR5cGU6ICdVaW50OCd9XG4gICAgXVxufTtcblxuY29uc3QgRkFDVE9SID0gTWF0aC5wb3coMiwgMTMpO1xuXG5mdW5jdGlvbiBhZGRWZXJ0ZXgodmVydGV4QXJyYXksIHgsIHksIG54LCBueSwgbnosIHQsIGUpIHtcbiAgICB2ZXJ0ZXhBcnJheS5lbXBsYWNlQmFjayhcbiAgICAgICAgLy8gYV9wb3NcbiAgICAgICAgeCxcbiAgICAgICAgeSxcbiAgICAgICAgLy8gYV9ub3JtYWxcbiAgICAgICAgTWF0aC5mbG9vcihueCAqIEZBQ1RPUikgKiAyICsgdCxcbiAgICAgICAgbnkgKiBGQUNUT1IgKiAyLFxuICAgICAgICBueiAqIEZBQ1RPUiAqIDIsXG5cbiAgICAgICAgLy8gYV9lZGdlZGlzdGFuY2VcbiAgICAgICAgTWF0aC5yb3VuZChlKVxuICAgICk7XG59XG5cbmNsYXNzIEZpbGxFeHRydXNpb25CdWNrZXQgZXh0ZW5kcyBCdWNrZXQge1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIob3B0aW9ucywgZmlsbEV4dHJ1c2lvbkludGVyZmFjZSk7XG4gICAgfVxuXG4gICAgYWRkRmVhdHVyZShmZWF0dXJlKSB7XG4gICAgICAgIGNvbnN0IGFycmF5cyA9IHRoaXMuYXJyYXlzO1xuXG4gICAgICAgIGZvciAoY29uc3QgcG9seWdvbiBvZiBjbGFzc2lmeVJpbmdzKGxvYWRHZW9tZXRyeShmZWF0dXJlKSwgRUFSQ1VUX01BWF9SSU5HUykpIHtcbiAgICAgICAgICAgIGxldCBudW1WZXJ0aWNlcyA9IDA7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJpbmcgb2YgcG9seWdvbikge1xuICAgICAgICAgICAgICAgIG51bVZlcnRpY2VzICs9IHJpbmcubGVuZ3RoO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBzZWdtZW50ID0gYXJyYXlzLnByZXBhcmVTZWdtZW50KG51bVZlcnRpY2VzICogNSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGZsYXR0ZW5lZCA9IFtdO1xuICAgICAgICAgICAgY29uc3QgaG9sZUluZGljZXMgPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IGluZGljZXMgPSBbXTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCByaW5nIG9mIHBvbHlnb24pIHtcbiAgICAgICAgICAgICAgICBpZiAocmluZy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHJpbmcgIT09IHBvbHlnb25bMF0pIHtcbiAgICAgICAgICAgICAgICAgICAgaG9sZUluZGljZXMucHVzaChmbGF0dGVuZWQubGVuZ3RoIC8gMik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IGVkZ2VEaXN0YW5jZSA9IDA7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBwID0gMDsgcCA8IHJpbmcubGVuZ3RoOyBwKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcDEgPSByaW5nW3BdO1xuXG4gICAgICAgICAgICAgICAgICAgIGFkZFZlcnRleChhcnJheXMubGF5b3V0VmVydGV4QXJyYXksIHAxLngsIHAxLnksIDAsIDAsIDEsIDEsIDApO1xuICAgICAgICAgICAgICAgICAgICBpbmRpY2VzLnB1c2goc2VnbWVudC52ZXJ0ZXhMZW5ndGgrKyk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHAgPj0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcDIgPSByaW5nW3AgLSAxXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0JvdW5kYXJ5RWRnZShwMSwgcDIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGVycCA9IHAxLnN1YihwMikuX3BlcnAoKS5fdW5pdCgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkVmVydGV4KGFycmF5cy5sYXlvdXRWZXJ0ZXhBcnJheSwgcDEueCwgcDEueSwgcGVycC54LCBwZXJwLnksIDAsIDAsIGVkZ2VEaXN0YW5jZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkVmVydGV4KGFycmF5cy5sYXlvdXRWZXJ0ZXhBcnJheSwgcDEueCwgcDEueSwgcGVycC54LCBwZXJwLnksIDAsIDEsIGVkZ2VEaXN0YW5jZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGdlRGlzdGFuY2UgKz0gcDIuZGlzdChwMSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRWZXJ0ZXgoYXJyYXlzLmxheW91dFZlcnRleEFycmF5LCBwMi54LCBwMi55LCBwZXJwLngsIHBlcnAueSwgMCwgMCwgZWRnZURpc3RhbmNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRWZXJ0ZXgoYXJyYXlzLmxheW91dFZlcnRleEFycmF5LCBwMi54LCBwMi55LCBwZXJwLngsIHBlcnAueSwgMCwgMSwgZWRnZURpc3RhbmNlKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvdHRvbVJpZ2h0ID0gc2VnbWVudC52ZXJ0ZXhMZW5ndGg7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheXMuZWxlbWVudEFycmF5LmVtcGxhY2VCYWNrKGJvdHRvbVJpZ2h0LCBib3R0b21SaWdodCArIDEsIGJvdHRvbVJpZ2h0ICsgMik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlzLmVsZW1lbnRBcnJheS5lbXBsYWNlQmFjayhib3R0b21SaWdodCArIDEsIGJvdHRvbVJpZ2h0ICsgMiwgYm90dG9tUmlnaHQgKyAzKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnQudmVydGV4TGVuZ3RoICs9IDQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudC5wcmltaXRpdmVMZW5ndGggKz0gMjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgdG8gZm9ybWF0IHVzZWQgYnkgZWFyY3V0XG4gICAgICAgICAgICAgICAgICAgIGZsYXR0ZW5lZC5wdXNoKHAxLngpO1xuICAgICAgICAgICAgICAgICAgICBmbGF0dGVuZWQucHVzaChwMS55KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHRyaWFuZ2xlSW5kaWNlcyA9IGVhcmN1dChmbGF0dGVuZWQsIGhvbGVJbmRpY2VzKTtcbiAgICAgICAgICAgIGFzc2VydCh0cmlhbmdsZUluZGljZXMubGVuZ3RoICUgMyA9PT0gMCk7XG5cbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdHJpYW5nbGVJbmRpY2VzLmxlbmd0aDsgaiArPSAzKSB7XG4gICAgICAgICAgICAgICAgYXJyYXlzLmVsZW1lbnRBcnJheS5lbXBsYWNlQmFjayhcbiAgICAgICAgICAgICAgICAgICAgaW5kaWNlc1t0cmlhbmdsZUluZGljZXNbal1dLFxuICAgICAgICAgICAgICAgICAgICBpbmRpY2VzW3RyaWFuZ2xlSW5kaWNlc1tqICsgMV1dLFxuICAgICAgICAgICAgICAgICAgICBpbmRpY2VzW3RyaWFuZ2xlSW5kaWNlc1tqICsgMl1dKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc2VnbWVudC5wcmltaXRpdmVMZW5ndGggKz0gdHJpYW5nbGVJbmRpY2VzLmxlbmd0aCAvIDM7XG4gICAgICAgIH1cblxuICAgICAgICBhcnJheXMucG9wdWxhdGVQYWludEFycmF5cyhmZWF0dXJlLnByb3BlcnRpZXMpO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBGaWxsRXh0cnVzaW9uQnVja2V0O1xuXG5mdW5jdGlvbiBpc0JvdW5kYXJ5RWRnZShwMSwgcDIpIHtcbiAgICByZXR1cm4gKHAxLnggPT09IHAyLnggJiYgKHAxLnggPCAwIHx8IHAxLnggPiBFWFRFTlQpKSB8fFxuICAgICAgICAocDEueSA9PT0gcDIueSAmJiAocDEueSA8IDAgfHwgcDEueSA+IEVYVEVOVCkpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBCdWNrZXQgPSByZXF1aXJlKCcuLi9idWNrZXQnKTtcbmNvbnN0IGNyZWF0ZVZlcnRleEFycmF5VHlwZSA9IHJlcXVpcmUoJy4uL3ZlcnRleF9hcnJheV90eXBlJyk7XG5jb25zdCBjcmVhdGVFbGVtZW50QXJyYXlUeXBlID0gcmVxdWlyZSgnLi4vZWxlbWVudF9hcnJheV90eXBlJyk7XG5jb25zdCBsb2FkR2VvbWV0cnkgPSByZXF1aXJlKCcuLi9sb2FkX2dlb21ldHJ5Jyk7XG5jb25zdCBFWFRFTlQgPSByZXF1aXJlKCcuLi9leHRlbnQnKTtcblxuLy8gTk9URSBPTiBFWFRSVURFIFNDQUxFOlxuLy8gc2NhbGUgdGhlIGV4dHJ1c2lvbiB2ZWN0b3Igc28gdGhhdCB0aGUgbm9ybWFsIGxlbmd0aCBpcyB0aGlzIHZhbHVlLlxuLy8gY29udGFpbnMgdGhlIFwidGV4dHVyZVwiIG5vcm1hbHMgKC0xLi4xKS4gdGhpcyBpcyBkaXN0aW5jdCBmcm9tIHRoZSBleHRydWRlXG4vLyBub3JtYWxzIGZvciBsaW5lIGpvaW5zLCBiZWNhdXNlIHRoZSB4LXZhbHVlIHJlbWFpbnMgMCBmb3IgdGhlIHRleHR1cmVcbi8vIG5vcm1hbCBhcnJheSwgd2hpbGUgdGhlIGV4dHJ1ZGUgbm9ybWFsIGFjdHVhbGx5IG1vdmVzIHRoZSB2ZXJ0ZXggdG8gY3JlYXRlXG4vLyB0aGUgYWN1dGUvYmV2ZWxsZWQgbGluZSBqb2luLlxuY29uc3QgRVhUUlVERV9TQ0FMRSA9IDYzO1xuXG4vKlxuICogU2hhcnAgY29ybmVycyBjYXVzZSBkYXNoZWQgbGluZXMgdG8gdGlsdCBiZWNhdXNlIHRoZSBkaXN0YW5jZSBhbG9uZyB0aGUgbGluZVxuICogaXMgdGhlIHNhbWUgYXQgYm90aCB0aGUgaW5uZXIgYW5kIG91dGVyIGNvcm5lcnMuIFRvIGltcHJvdmUgdGhlIGFwcGVhcmFuY2Ugb2ZcbiAqIGRhc2hlZCBsaW5lcyB3ZSBhZGQgZXh0cmEgcG9pbnRzIG5lYXIgc2hhcnAgY29ybmVycyBzbyB0aGF0IGEgc21hbGxlciBwYXJ0XG4gKiBvZiB0aGUgbGluZSBpcyB0aWx0ZWQuXG4gKlxuICogQ09TX0hBTEZfU0hBUlBfQ09STkVSIGNvbnRyb2xzIGhvdyBzaGFycCBhIGNvcm5lciBoYXMgdG8gYmUgZm9yIHVzIHRvIGFkZCBhblxuICogZXh0cmEgdmVydGV4LiBUaGUgZGVmYXVsdCBpcyA3NSBkZWdyZWVzLlxuICpcbiAqIFRoZSBuZXdseSBjcmVhdGVkIHZlcnRpY2VzIGFyZSBwbGFjZWQgU0hBUlBfQ09STkVSX09GRlNFVCBwaXhlbHMgZnJvbSB0aGUgY29ybmVyLlxuICovXG5jb25zdCBDT1NfSEFMRl9TSEFSUF9DT1JORVIgPSBNYXRoLmNvcyg3NSAvIDIgKiAoTWF0aC5QSSAvIDE4MCkpO1xuY29uc3QgU0hBUlBfQ09STkVSX09GRlNFVCA9IDE1O1xuXG4vLyBUaGUgbnVtYmVyIG9mIGJpdHMgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSBsaW5lIGRpc3RhbmNlIGluIHRoZSBidWZmZXIuXG5jb25zdCBMSU5FX0RJU1RBTkNFX0JVRkZFUl9CSVRTID0gMTU7XG5cbi8vIFdlIGRvbid0IGhhdmUgZW5vdWdoIGJpdHMgZm9yIHRoZSBsaW5lIGRpc3RhbmNlIGFzIHdlJ2QgbGlrZSB0byBoYXZlLCBzb1xuLy8gdXNlIHRoaXMgdmFsdWUgdG8gc2NhbGUgdGhlIGxpbmUgZGlzdGFuY2UgKGluIHRpbGUgdW5pdHMpIGRvd24gdG8gYSBzbWFsbGVyXG4vLyB2YWx1ZS4gVGhpcyBsZXRzIHVzIHN0b3JlIGxvbmdlciBkaXN0YW5jZXMgd2hpbGUgc2FjcmlmaWNpbmcgcHJlY2lzaW9uLlxuY29uc3QgTElORV9ESVNUQU5DRV9TQ0FMRSA9IDEgLyAyO1xuXG4vLyBUaGUgbWF4aW11bSBsaW5lIGRpc3RhbmNlLCBpbiB0aWxlIHVuaXRzLCB0aGF0IGZpdHMgaW4gdGhlIGJ1ZmZlci5cbmNvbnN0IE1BWF9MSU5FX0RJU1RBTkNFID0gTWF0aC5wb3coMiwgTElORV9ESVNUQU5DRV9CVUZGRVJfQklUUyAtIDEpIC8gTElORV9ESVNUQU5DRV9TQ0FMRTtcblxuY29uc3QgbGluZUludGVyZmFjZSA9IHtcbiAgICBsYXlvdXRWZXJ0ZXhBcnJheVR5cGU6IGNyZWF0ZVZlcnRleEFycmF5VHlwZShbXG4gICAgICAgIHtuYW1lOiAnYV9wb3MnLCAgY29tcG9uZW50czogMiwgdHlwZTogJ0ludDE2J30sXG4gICAgICAgIHtuYW1lOiAnYV9kYXRhJywgY29tcG9uZW50czogNCwgdHlwZTogJ1VpbnQ4J31cbiAgICBdKSxcbiAgICBwYWludEF0dHJpYnV0ZXM6IFtcbiAgICAgICAge3Byb3BlcnR5OiAnbGluZS1jb2xvcicsIHR5cGU6ICdVaW50OCd9LFxuICAgICAgICB7cHJvcGVydHk6ICdsaW5lLWJsdXInLCBtdWx0aXBsaWVyOiAxMCwgdHlwZTogJ1VpbnQ4J30sXG4gICAgICAgIHtwcm9wZXJ0eTogJ2xpbmUtb3BhY2l0eScsIG11bHRpcGxpZXI6IDEwLCB0eXBlOiAnVWludDgnfSxcbiAgICAgICAge3Byb3BlcnR5OiAnbGluZS1nYXAtd2lkdGgnLCBtdWx0aXBsaWVyOiAxMCwgdHlwZTogJ1VpbnQ4JywgbmFtZTogJ2FfZ2Fwd2lkdGgnfSxcbiAgICAgICAge3Byb3BlcnR5OiAnbGluZS1vZmZzZXQnLCBtdWx0aXBsaWVyOiAxLCB0eXBlOiAnSW50OCd9LFxuICAgIF0sXG4gICAgZWxlbWVudEFycmF5VHlwZTogY3JlYXRlRWxlbWVudEFycmF5VHlwZSgpXG59O1xuXG5mdW5jdGlvbiBhZGRMaW5lVmVydGV4KGxheW91dFZlcnRleEJ1ZmZlciwgcG9pbnQsIGV4dHJ1ZGUsIHR4LCB0eSwgZGlyLCBsaW5lc29mYXIpIHtcbiAgICBsYXlvdXRWZXJ0ZXhCdWZmZXIuZW1wbGFjZUJhY2soXG4gICAgICAgIC8vIGFfcG9zXG4gICAgICAgIChwb2ludC54IDw8IDEpIHwgdHgsXG4gICAgICAgIChwb2ludC55IDw8IDEpIHwgdHksXG4gICAgICAgIC8vIGFfZGF0YVxuICAgICAgICAvLyBhZGQgMTI4IHRvIHN0b3JlIGEgYnl0ZSBpbiBhbiB1bnNpZ25lZCBieXRlXG4gICAgICAgIE1hdGgucm91bmQoRVhUUlVERV9TQ0FMRSAqIGV4dHJ1ZGUueCkgKyAxMjgsXG4gICAgICAgIE1hdGgucm91bmQoRVhUUlVERV9TQ0FMRSAqIGV4dHJ1ZGUueSkgKyAxMjgsXG4gICAgICAgIC8vIEVuY29kZSB0aGUgLTEvMC8xIGRpcmVjdGlvbiB2YWx1ZSBpbnRvIHRoZSBmaXJzdCB0d28gYml0cyBvZiAueiBvZiBhX2RhdGEuXG4gICAgICAgIC8vIENvbWJpbmUgaXQgd2l0aCB0aGUgbG93ZXIgNiBiaXRzIG9mIGBsaW5lc29mYXJgIChzaGlmdGVkIGJ5IDIgYml0ZXMgdG8gbWFrZVxuICAgICAgICAvLyByb29tIGZvciB0aGUgZGlyZWN0aW9uIHZhbHVlKS4gVGhlIHVwcGVyIDggYml0cyBvZiBgbGluZXNvZmFyYCBhcmUgcGxhY2VkIGluXG4gICAgICAgIC8vIHRoZSBgd2AgY29tcG9uZW50LiBgbGluZXNvZmFyYCBpcyBzY2FsZWQgZG93biBieSBgTElORV9ESVNUQU5DRV9TQ0FMRWAgc28gdGhhdFxuICAgICAgICAvLyB3ZSBjYW4gc3RvcmUgbG9uZ2VyIGRpc3RhbmNlcyB3aGlsZSBzYWNyaWZpY2luZyBwcmVjaXNpb24uXG4gICAgICAgICgoZGlyID09PSAwID8gMCA6IChkaXIgPCAwID8gLTEgOiAxKSkgKyAxKSB8ICgoKGxpbmVzb2ZhciAqIExJTkVfRElTVEFOQ0VfU0NBTEUpICYgMHgzRikgPDwgMiksXG4gICAgICAgIChsaW5lc29mYXIgKiBMSU5FX0RJU1RBTkNFX1NDQUxFKSA+PiA2KTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBMaW5lQnVja2V0IGV4dGVuZHMgQnVja2V0IHtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKG9wdGlvbnMsIGxpbmVJbnRlcmZhY2UpO1xuICAgIH1cblxuICAgIGFkZEZlYXR1cmUoZmVhdHVyZSkge1xuICAgICAgICBjb25zdCBsYXlvdXQgPSB0aGlzLmxheWVyc1swXS5sYXlvdXQ7XG4gICAgICAgIGNvbnN0IGpvaW4gPSBsYXlvdXRbJ2xpbmUtam9pbiddO1xuICAgICAgICBjb25zdCBjYXAgPSBsYXlvdXRbJ2xpbmUtY2FwJ107XG4gICAgICAgIGNvbnN0IG1pdGVyTGltaXQgPSBsYXlvdXRbJ2xpbmUtbWl0ZXItbGltaXQnXTtcbiAgICAgICAgY29uc3Qgcm91bmRMaW1pdCA9IGxheW91dFsnbGluZS1yb3VuZC1saW1pdCddO1xuXG4gICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBsb2FkR2VvbWV0cnkoZmVhdHVyZSwgTElORV9ESVNUQU5DRV9CVUZGRVJfQklUUykpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkTGluZShsaW5lLCBmZWF0dXJlLnByb3BlcnRpZXMsIGpvaW4sIGNhcCwgbWl0ZXJMaW1pdCwgcm91bmRMaW1pdCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhZGRMaW5lKHZlcnRpY2VzLCBmZWF0dXJlUHJvcGVydGllcywgam9pbiwgY2FwLCBtaXRlckxpbWl0LCByb3VuZExpbWl0KSB7XG5cbiAgICAgICAgbGV0IGxlbiA9IHZlcnRpY2VzLmxlbmd0aDtcbiAgICAgICAgLy8gSWYgdGhlIGxpbmUgaGFzIGR1cGxpY2F0ZSB2ZXJ0aWNlcyBhdCB0aGUgZW5kLCBhZGp1c3QgbGVuZ3RoIHRvIHJlbW92ZSB0aGVtLlxuICAgICAgICB3aGlsZSAobGVuID4gMiAmJiB2ZXJ0aWNlc1tsZW4gLSAxXS5lcXVhbHModmVydGljZXNbbGVuIC0gMl0pKSB7XG4gICAgICAgICAgICBsZW4tLTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGEgbGluZSBtdXN0IGhhdmUgYXQgbGVhc3QgdHdvIHZlcnRpY2VzXG4gICAgICAgIGlmICh2ZXJ0aWNlcy5sZW5ndGggPCAyKSByZXR1cm47XG5cbiAgICAgICAgaWYgKGpvaW4gPT09ICdiZXZlbCcpIG1pdGVyTGltaXQgPSAxLjA1O1xuXG4gICAgICAgIGNvbnN0IHNoYXJwQ29ybmVyT2Zmc2V0ID0gU0hBUlBfQ09STkVSX09GRlNFVCAqIChFWFRFTlQgLyAoNTEyICogdGhpcy5vdmVyc2NhbGluZykpO1xuXG4gICAgICAgIGNvbnN0IGZpcnN0VmVydGV4ID0gdmVydGljZXNbMF0sXG4gICAgICAgICAgICBsYXN0VmVydGV4ID0gdmVydGljZXNbbGVuIC0gMV0sXG4gICAgICAgICAgICBjbG9zZWQgPSBmaXJzdFZlcnRleC5lcXVhbHMobGFzdFZlcnRleCk7XG5cbiAgICAgICAgY29uc3QgYXJyYXlzID0gdGhpcy5hcnJheXM7XG5cbiAgICAgICAgLy8gd2UgY291bGQgYmUgbW9yZSBwcmVjaXNlLCBidXQgaXQgd291bGQgb25seSBzYXZlIGEgbmVnbGlnaWJsZSBhbW91bnQgb2Ygc3BhY2VcbiAgICAgICAgY29uc3Qgc2VnbWVudCA9IGFycmF5cy5wcmVwYXJlU2VnbWVudChsZW4gKiAxMCk7XG5cbiAgICAgICAgLy8gYSBsaW5lIG1heSBub3QgaGF2ZSBjb2luY2lkZW50IHBvaW50c1xuICAgICAgICBpZiAobGVuID09PSAyICYmIGNsb3NlZCkgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuZGlzdGFuY2UgPSAwO1xuXG4gICAgICAgIGNvbnN0IGJlZ2luQ2FwID0gY2FwLFxuICAgICAgICAgICAgZW5kQ2FwID0gY2xvc2VkID8gJ2J1dHQnIDogY2FwO1xuICAgICAgICBsZXQgc3RhcnRPZkxpbmUgPSB0cnVlO1xuICAgICAgICBsZXQgY3VycmVudFZlcnRleCwgcHJldlZlcnRleCwgbmV4dFZlcnRleCwgcHJldk5vcm1hbCwgbmV4dE5vcm1hbCwgb2Zmc2V0QSwgb2Zmc2V0QjtcblxuICAgICAgICAvLyB0aGUgbGFzdCB0aHJlZSB2ZXJ0aWNlcyBhZGRlZFxuICAgICAgICB0aGlzLmUxID0gdGhpcy5lMiA9IHRoaXMuZTMgPSAtMTtcblxuICAgICAgICBpZiAoY2xvc2VkKSB7XG4gICAgICAgICAgICBjdXJyZW50VmVydGV4ID0gdmVydGljZXNbbGVuIC0gMl07XG4gICAgICAgICAgICBuZXh0Tm9ybWFsID0gZmlyc3RWZXJ0ZXguc3ViKGN1cnJlbnRWZXJ0ZXgpLl91bml0KCkuX3BlcnAoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcblxuICAgICAgICAgICAgbmV4dFZlcnRleCA9IGNsb3NlZCAmJiBpID09PSBsZW4gLSAxID9cbiAgICAgICAgICAgICAgICB2ZXJ0aWNlc1sxXSA6IC8vIGlmIHRoZSBsaW5lIGlzIGNsb3NlZCwgd2UgdHJlYXQgdGhlIGxhc3QgdmVydGV4IGxpa2UgdGhlIGZpcnN0XG4gICAgICAgICAgICAgICAgdmVydGljZXNbaSArIDFdOyAvLyBqdXN0IHRoZSBuZXh0IHZlcnRleFxuXG4gICAgICAgICAgICAvLyBpZiB0d28gY29uc2VjdXRpdmUgdmVydGljZXMgZXhpc3QsIHNraXAgdGhlIGN1cnJlbnQgb25lXG4gICAgICAgICAgICBpZiAobmV4dFZlcnRleCAmJiB2ZXJ0aWNlc1tpXS5lcXVhbHMobmV4dFZlcnRleCkpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBpZiAobmV4dE5vcm1hbCkgcHJldk5vcm1hbCA9IG5leHROb3JtYWw7XG4gICAgICAgICAgICBpZiAoY3VycmVudFZlcnRleCkgcHJldlZlcnRleCA9IGN1cnJlbnRWZXJ0ZXg7XG5cbiAgICAgICAgICAgIGN1cnJlbnRWZXJ0ZXggPSB2ZXJ0aWNlc1tpXTtcblxuICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBub3JtYWwgdG93YXJkcyB0aGUgbmV4dCB2ZXJ0ZXggaW4gdGhpcyBsaW5lLiBJbiBjYXNlXG4gICAgICAgICAgICAvLyB0aGVyZSBpcyBubyBuZXh0IHZlcnRleCwgcHJldGVuZCB0aGF0IHRoZSBsaW5lIGlzIGNvbnRpbnVpbmcgc3RyYWlnaHQsXG4gICAgICAgICAgICAvLyBtZWFuaW5nIHRoYXQgd2UgYXJlIGp1c3QgdXNpbmcgdGhlIHByZXZpb3VzIG5vcm1hbC5cbiAgICAgICAgICAgIG5leHROb3JtYWwgPSBuZXh0VmVydGV4ID8gbmV4dFZlcnRleC5zdWIoY3VycmVudFZlcnRleCkuX3VuaXQoKS5fcGVycCgpIDogcHJldk5vcm1hbDtcblxuICAgICAgICAgICAgLy8gSWYgd2Ugc3RpbGwgZG9uJ3QgaGF2ZSBhIHByZXZpb3VzIG5vcm1hbCwgdGhpcyBpcyB0aGUgYmVnaW5uaW5nIG9mIGFcbiAgICAgICAgICAgIC8vIG5vbi1jbG9zZWQgbGluZSwgc28gd2UncmUgZG9pbmcgYSBzdHJhaWdodCBcImpvaW5cIi5cbiAgICAgICAgICAgIHByZXZOb3JtYWwgPSBwcmV2Tm9ybWFsIHx8IG5leHROb3JtYWw7XG5cbiAgICAgICAgICAgIC8vIERldGVybWluZSB0aGUgbm9ybWFsIG9mIHRoZSBqb2luIGV4dHJ1c2lvbi4gSXQgaXMgdGhlIGFuZ2xlIGJpc2VjdG9yXG4gICAgICAgICAgICAvLyBvZiB0aGUgc2VnbWVudHMgYmV0d2VlbiB0aGUgcHJldmlvdXMgbGluZSBhbmQgdGhlIG5leHQgbGluZS5cbiAgICAgICAgICAgIC8vIEluIHRoZSBjYXNlIG9mIDE4MMKwIGFuZ2xlcywgdGhlIHByZXYgYW5kIG5leHQgbm9ybWFscyBjYW5jZWwgZWFjaCBvdGhlciBvdXQ6XG4gICAgICAgICAgICAvLyBwcmV2Tm9ybWFsICsgbmV4dE5vcm1hbCA9ICgwLCAwKSwgaXRzIG1hZ25pdHVkZSBpcyAwLCBzbyB0aGUgdW5pdCB2ZWN0b3Igd291bGQgYmVcbiAgICAgICAgICAgIC8vIHVuZGVmaW5lZC4gSW4gdGhhdCBjYXNlLCB3ZSdyZSBrZWVwaW5nIHRoZSBqb2luTm9ybWFsIGF0ICgwLCAwKSwgc28gdGhhdCB0aGUgY29zSGFsZkFuZ2xlXG4gICAgICAgICAgICAvLyBiZWxvdyB3aWxsIGFsc28gYmVjb21lIDAgYW5kIG1pdGVyTGVuZ3RoIHdpbGwgYmVjb21lIEluZmluaXR5LlxuICAgICAgICAgICAgbGV0IGpvaW5Ob3JtYWwgPSBwcmV2Tm9ybWFsLmFkZChuZXh0Tm9ybWFsKTtcbiAgICAgICAgICAgIGlmIChqb2luTm9ybWFsLnggIT09IDAgfHwgam9pbk5vcm1hbC55ICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgam9pbk5vcm1hbC5fdW5pdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLyogIGpvaW5Ob3JtYWwgICAgIHByZXZOb3JtYWxcbiAgICAgICAgICAgICAqICAgICAgICAgICAgIOKGliAgICAgIOKGkVxuICAgICAgICAgICAgICogICAgICAgICAgICAgICAgLl9fX19fX19fLiBwcmV2VmVydGV4XG4gICAgICAgICAgICAgKiAgICAgICAgICAgICAgICB8XG4gICAgICAgICAgICAgKiBuZXh0Tm9ybWFsICDihpAgIHwgIGN1cnJlbnRWZXJ0ZXhcbiAgICAgICAgICAgICAqICAgICAgICAgICAgICAgIHxcbiAgICAgICAgICAgICAqICAgICBuZXh0VmVydGV4ICFcbiAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBsZW5ndGggb2YgdGhlIG1pdGVyICh0aGUgcmF0aW8gb2YgdGhlIG1pdGVyIHRvIHRoZSB3aWR0aCkuXG4gICAgICAgICAgICAvLyBGaW5kIHRoZSBjb3NpbmUgb2YgdGhlIGFuZ2xlIGJldHdlZW4gdGhlIG5leHQgYW5kIGpvaW4gbm9ybWFsc1xuICAgICAgICAgICAgLy8gdXNpbmcgZG90IHByb2R1Y3QuIFRoZSBpbnZlcnNlIG9mIHRoYXQgaXMgdGhlIG1pdGVyIGxlbmd0aC5cbiAgICAgICAgICAgIGNvbnN0IGNvc0hhbGZBbmdsZSA9IGpvaW5Ob3JtYWwueCAqIG5leHROb3JtYWwueCArIGpvaW5Ob3JtYWwueSAqIG5leHROb3JtYWwueTtcbiAgICAgICAgICAgIGNvbnN0IG1pdGVyTGVuZ3RoID0gY29zSGFsZkFuZ2xlICE9PSAwID8gMSAvIGNvc0hhbGZBbmdsZSA6IEluZmluaXR5O1xuXG4gICAgICAgICAgICBjb25zdCBpc1NoYXJwQ29ybmVyID0gY29zSGFsZkFuZ2xlIDwgQ09TX0hBTEZfU0hBUlBfQ09STkVSICYmIHByZXZWZXJ0ZXggJiYgbmV4dFZlcnRleDtcblxuICAgICAgICAgICAgaWYgKGlzU2hhcnBDb3JuZXIgJiYgaSA+IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2U2VnbWVudExlbmd0aCA9IGN1cnJlbnRWZXJ0ZXguZGlzdChwcmV2VmVydGV4KTtcbiAgICAgICAgICAgICAgICBpZiAocHJldlNlZ21lbnRMZW5ndGggPiAyICogc2hhcnBDb3JuZXJPZmZzZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3UHJldlZlcnRleCA9IGN1cnJlbnRWZXJ0ZXguc3ViKGN1cnJlbnRWZXJ0ZXguc3ViKHByZXZWZXJ0ZXgpLl9tdWx0KHNoYXJwQ29ybmVyT2Zmc2V0IC8gcHJldlNlZ21lbnRMZW5ndGgpLl9yb3VuZCgpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXN0YW5jZSArPSBuZXdQcmV2VmVydGV4LmRpc3QocHJldlZlcnRleCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkQ3VycmVudFZlcnRleChuZXdQcmV2VmVydGV4LCB0aGlzLmRpc3RhbmNlLCBwcmV2Tm9ybWFsLm11bHQoMSksIDAsIDAsIGZhbHNlLCBzZWdtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgcHJldlZlcnRleCA9IG5ld1ByZXZWZXJ0ZXg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBUaGUgam9pbiBpZiBhIG1pZGRsZSB2ZXJ0ZXgsIG90aGVyd2lzZSB0aGUgY2FwLlxuICAgICAgICAgICAgY29uc3QgbWlkZGxlVmVydGV4ID0gcHJldlZlcnRleCAmJiBuZXh0VmVydGV4O1xuICAgICAgICAgICAgbGV0IGN1cnJlbnRKb2luID0gbWlkZGxlVmVydGV4ID8gam9pbiA6IG5leHRWZXJ0ZXggPyBiZWdpbkNhcCA6IGVuZENhcDtcblxuICAgICAgICAgICAgaWYgKG1pZGRsZVZlcnRleCAmJiBjdXJyZW50Sm9pbiA9PT0gJ3JvdW5kJykge1xuICAgICAgICAgICAgICAgIGlmIChtaXRlckxlbmd0aCA8IHJvdW5kTGltaXQpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudEpvaW4gPSAnbWl0ZXInO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWl0ZXJMZW5ndGggPD0gMikge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Sm9pbiA9ICdmYWtlcm91bmQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGN1cnJlbnRKb2luID09PSAnbWl0ZXInICYmIG1pdGVyTGVuZ3RoID4gbWl0ZXJMaW1pdCkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRKb2luID0gJ2JldmVsJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGN1cnJlbnRKb2luID09PSAnYmV2ZWwnKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlIG1heGltdW0gZXh0cnVkZSBsZW5ndGggaXMgMTI4IC8gNjMgPSAyIHRpbWVzIHRoZSB3aWR0aCBvZiB0aGUgbGluZVxuICAgICAgICAgICAgICAgIC8vIHNvIGlmIG1pdGVyTGVuZ3RoID49IDIgd2UgbmVlZCB0byBkcmF3IGEgZGlmZmVyZW50IHR5cGUgb2YgYmV2ZWwgaGVyZS5cbiAgICAgICAgICAgICAgICBpZiAobWl0ZXJMZW5ndGggPiAyKSBjdXJyZW50Sm9pbiA9ICdmbGlwYmV2ZWwnO1xuXG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIG1pdGVyTGVuZ3RoIGlzIHJlYWxseSBzbWFsbCBhbmQgdGhlIGxpbmUgYmV2ZWwgd291bGRuJ3QgYmUgdmlzaWJsZSxcbiAgICAgICAgICAgICAgICAvLyBqdXN0IGRyYXcgYSBtaXRlciBqb2luIHRvIHNhdmUgYSB0cmlhbmdsZS5cbiAgICAgICAgICAgICAgICBpZiAobWl0ZXJMZW5ndGggPCBtaXRlckxpbWl0KSBjdXJyZW50Sm9pbiA9ICdtaXRlcic7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENhbGN1bGF0ZSBob3cgZmFyIGFsb25nIHRoZSBsaW5lIHRoZSBjdXJyZW50VmVydGV4IGlzXG4gICAgICAgICAgICBpZiAocHJldlZlcnRleCkgdGhpcy5kaXN0YW5jZSArPSBjdXJyZW50VmVydGV4LmRpc3QocHJldlZlcnRleCk7XG5cbiAgICAgICAgICAgIGlmIChjdXJyZW50Sm9pbiA9PT0gJ21pdGVyJykge1xuXG4gICAgICAgICAgICAgICAgam9pbk5vcm1hbC5fbXVsdChtaXRlckxlbmd0aCk7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRDdXJyZW50VmVydGV4KGN1cnJlbnRWZXJ0ZXgsIHRoaXMuZGlzdGFuY2UsIGpvaW5Ob3JtYWwsIDAsIDAsIGZhbHNlLCBzZWdtZW50KTtcblxuICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50Sm9pbiA9PT0gJ2ZsaXBiZXZlbCcpIHtcbiAgICAgICAgICAgICAgICAvLyBtaXRlciBpcyB0b28gYmlnLCBmbGlwIHRoZSBkaXJlY3Rpb24gdG8gbWFrZSBhIGJldmVsZWQgam9pblxuXG4gICAgICAgICAgICAgICAgaWYgKG1pdGVyTGVuZ3RoID4gMTAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEFsbW9zdCBwYXJhbGxlbCBsaW5lc1xuICAgICAgICAgICAgICAgICAgICBqb2luTm9ybWFsID0gbmV4dE5vcm1hbC5jbG9uZSgpLm11bHQoLTEpO1xuXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGlyZWN0aW9uID0gcHJldk5vcm1hbC54ICogbmV4dE5vcm1hbC55IC0gcHJldk5vcm1hbC55ICogbmV4dE5vcm1hbC54ID4gMCA/IC0xIDogMTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYmV2ZWxMZW5ndGggPSBtaXRlckxlbmd0aCAqIHByZXZOb3JtYWwuYWRkKG5leHROb3JtYWwpLm1hZygpIC8gcHJldk5vcm1hbC5zdWIobmV4dE5vcm1hbCkubWFnKCk7XG4gICAgICAgICAgICAgICAgICAgIGpvaW5Ob3JtYWwuX3BlcnAoKS5fbXVsdChiZXZlbExlbmd0aCAqIGRpcmVjdGlvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuYWRkQ3VycmVudFZlcnRleChjdXJyZW50VmVydGV4LCB0aGlzLmRpc3RhbmNlLCBqb2luTm9ybWFsLCAwLCAwLCBmYWxzZSwgc2VnbWVudCk7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRDdXJyZW50VmVydGV4KGN1cnJlbnRWZXJ0ZXgsIHRoaXMuZGlzdGFuY2UsIGpvaW5Ob3JtYWwubXVsdCgtMSksIDAsIDAsIGZhbHNlLCBzZWdtZW50KTtcblxuICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50Sm9pbiA9PT0gJ2JldmVsJyB8fCBjdXJyZW50Sm9pbiA9PT0gJ2Zha2Vyb3VuZCcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsaW5lVHVybnNMZWZ0ID0gKHByZXZOb3JtYWwueCAqIG5leHROb3JtYWwueSAtIHByZXZOb3JtYWwueSAqIG5leHROb3JtYWwueCkgPiAwO1xuICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IC1NYXRoLnNxcnQobWl0ZXJMZW5ndGggKiBtaXRlckxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgICAgIGlmIChsaW5lVHVybnNMZWZ0KSB7XG4gICAgICAgICAgICAgICAgICAgIG9mZnNldEIgPSAwO1xuICAgICAgICAgICAgICAgICAgICBvZmZzZXRBID0gb2Zmc2V0O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG9mZnNldEEgPSAwO1xuICAgICAgICAgICAgICAgICAgICBvZmZzZXRCID0gb2Zmc2V0O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIENsb3NlIHByZXZpb3VzIHNlZ21lbnQgd2l0aCBhIGJldmVsXG4gICAgICAgICAgICAgICAgaWYgKCFzdGFydE9mTGluZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgoY3VycmVudFZlcnRleCwgdGhpcy5kaXN0YW5jZSwgcHJldk5vcm1hbCwgb2Zmc2V0QSwgb2Zmc2V0QiwgZmFsc2UsIHNlZ21lbnQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Sm9pbiA9PT0gJ2Zha2Vyb3VuZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGpvaW4gYW5nbGUgaXMgc2hhcnAgZW5vdWdoIHRoYXQgYSByb3VuZCBqb2luIHdvdWxkIGJlIHZpc2libGUuXG4gICAgICAgICAgICAgICAgICAgIC8vIEJldmVsIGpvaW5zIGZpbGwgdGhlIGdhcCBiZXR3ZWVuIHNlZ21lbnRzIHdpdGggYSBzaW5nbGUgcGllIHNsaWNlIHRyaWFuZ2xlLlxuICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSByb3VuZCBqb2luIGJ5IGFkZGluZyBtdWx0aXBsZSBwaWUgc2xpY2VzLiBUaGUgam9pbiBpc24ndCBhY3R1YWxseSByb3VuZCwgYnV0XG4gICAgICAgICAgICAgICAgICAgIC8vIGl0IGxvb2tzIGxpa2UgaXQgaXMgYXQgdGhlIHNpemVzIHdlIHJlbmRlciBsaW5lcyBhdC5cblxuICAgICAgICAgICAgICAgICAgICAvLyBBZGQgbW9yZSB0cmlhbmdsZXMgZm9yIHNoYXJwZXIgYW5nbGVzLlxuICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIG1hdGggaXMganVzdCBhIGdvb2QgZW5vdWdoIGFwcHJveGltYXRpb24uIEl0IGlzbid0IFwiY29ycmVjdFwiLlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBuID0gTWF0aC5mbG9vcigoMC41IC0gKGNvc0hhbGZBbmdsZSAtIDAuNSkpICogOCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBhcHByb3hGcmFjdGlvbmFsSm9pbk5vcm1hbDtcblxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBtID0gMDsgbSA8IG47IG0rKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXBwcm94RnJhY3Rpb25hbEpvaW5Ob3JtYWwgPSBuZXh0Tm9ybWFsLm11bHQoKG0gKyAxKSAvIChuICsgMSkpLl9hZGQocHJldk5vcm1hbCkuX3VuaXQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkUGllU2xpY2VWZXJ0ZXgoY3VycmVudFZlcnRleCwgdGhpcy5kaXN0YW5jZSwgYXBwcm94RnJhY3Rpb25hbEpvaW5Ob3JtYWwsIGxpbmVUdXJuc0xlZnQsIHNlZ21lbnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRQaWVTbGljZVZlcnRleChjdXJyZW50VmVydGV4LCB0aGlzLmRpc3RhbmNlLCBqb2luTm9ybWFsLCBsaW5lVHVybnNMZWZ0LCBzZWdtZW50KTtcblxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gbiAtIDE7IGsgPj0gMDsgay0tKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcHByb3hGcmFjdGlvbmFsSm9pbk5vcm1hbCA9IHByZXZOb3JtYWwubXVsdCgoayArIDEpIC8gKG4gKyAxKSkuX2FkZChuZXh0Tm9ybWFsKS5fdW5pdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRQaWVTbGljZVZlcnRleChjdXJyZW50VmVydGV4LCB0aGlzLmRpc3RhbmNlLCBhcHByb3hGcmFjdGlvbmFsSm9pbk5vcm1hbCwgbGluZVR1cm5zTGVmdCwgc2VnbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBTdGFydCBuZXh0IHNlZ21lbnRcbiAgICAgICAgICAgICAgICBpZiAobmV4dFZlcnRleCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgoY3VycmVudFZlcnRleCwgdGhpcy5kaXN0YW5jZSwgbmV4dE5vcm1hbCwgLW9mZnNldEEsIC1vZmZzZXRCLCBmYWxzZSwgc2VnbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRKb2luID09PSAnYnV0dCcpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXN0YXJ0T2ZMaW5lKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIENsb3NlIHByZXZpb3VzIHNlZ21lbnQgd2l0aCBhIGJ1dHRcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRDdXJyZW50VmVydGV4KGN1cnJlbnRWZXJ0ZXgsIHRoaXMuZGlzdGFuY2UsIHByZXZOb3JtYWwsIDAsIDAsIGZhbHNlLCBzZWdtZW50KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBTdGFydCBuZXh0IHNlZ21lbnQgd2l0aCBhIGJ1dHRcbiAgICAgICAgICAgICAgICBpZiAobmV4dFZlcnRleCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgoY3VycmVudFZlcnRleCwgdGhpcy5kaXN0YW5jZSwgbmV4dE5vcm1hbCwgMCwgMCwgZmFsc2UsIHNlZ21lbnQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50Sm9pbiA9PT0gJ3NxdWFyZScpIHtcblxuICAgICAgICAgICAgICAgIGlmICghc3RhcnRPZkxpbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2xvc2UgcHJldmlvdXMgc2VnbWVudCB3aXRoIGEgc3F1YXJlIGNhcFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgoY3VycmVudFZlcnRleCwgdGhpcy5kaXN0YW5jZSwgcHJldk5vcm1hbCwgMSwgMSwgZmFsc2UsIHNlZ21lbnQpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBzZWdtZW50IGlzIGRvbmUuIFVuc2V0IHZlcnRpY2VzIHRvIGRpc2Nvbm5lY3Qgc2VnbWVudHMuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZTEgPSB0aGlzLmUyID0gLTE7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gU3RhcnQgbmV4dCBzZWdtZW50XG4gICAgICAgICAgICAgICAgaWYgKG5leHRWZXJ0ZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRDdXJyZW50VmVydGV4KGN1cnJlbnRWZXJ0ZXgsIHRoaXMuZGlzdGFuY2UsIG5leHROb3JtYWwsIC0xLCAtMSwgZmFsc2UsIHNlZ21lbnQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50Sm9pbiA9PT0gJ3JvdW5kJykge1xuXG4gICAgICAgICAgICAgICAgaWYgKCFzdGFydE9mTGluZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBDbG9zZSBwcmV2aW91cyBzZWdtZW50IHdpdGggYnV0dFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgoY3VycmVudFZlcnRleCwgdGhpcy5kaXN0YW5jZSwgcHJldk5vcm1hbCwgMCwgMCwgZmFsc2UsIHNlZ21lbnQpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIEFkZCByb3VuZCBjYXAgb3IgbGluZWpvaW4gYXQgZW5kIG9mIHNlZ21lbnRcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRDdXJyZW50VmVydGV4KGN1cnJlbnRWZXJ0ZXgsIHRoaXMuZGlzdGFuY2UsIHByZXZOb3JtYWwsIDEsIDEsIHRydWUsIHNlZ21lbnQpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBzZWdtZW50IGlzIGRvbmUuIFVuc2V0IHZlcnRpY2VzIHRvIGRpc2Nvbm5lY3Qgc2VnbWVudHMuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZTEgPSB0aGlzLmUyID0gLTE7XG4gICAgICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgICAgICAvLyBTdGFydCBuZXh0IHNlZ21lbnQgd2l0aCBhIGJ1dHRcbiAgICAgICAgICAgICAgICBpZiAobmV4dFZlcnRleCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBBZGQgcm91bmQgY2FwIGJlZm9yZSBmaXJzdCBzZWdtZW50XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkQ3VycmVudFZlcnRleChjdXJyZW50VmVydGV4LCB0aGlzLmRpc3RhbmNlLCBuZXh0Tm9ybWFsLCAtMSwgLTEsIHRydWUsIHNlZ21lbnQpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkQ3VycmVudFZlcnRleChjdXJyZW50VmVydGV4LCB0aGlzLmRpc3RhbmNlLCBuZXh0Tm9ybWFsLCAwLCAwLCBmYWxzZSwgc2VnbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaXNTaGFycENvcm5lciAmJiBpIDwgbGVuIC0gMSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5leHRTZWdtZW50TGVuZ3RoID0gY3VycmVudFZlcnRleC5kaXN0KG5leHRWZXJ0ZXgpO1xuICAgICAgICAgICAgICAgIGlmIChuZXh0U2VnbWVudExlbmd0aCA+IDIgKiBzaGFycENvcm5lck9mZnNldCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdDdXJyZW50VmVydGV4ID0gY3VycmVudFZlcnRleC5hZGQobmV4dFZlcnRleC5zdWIoY3VycmVudFZlcnRleCkuX211bHQoc2hhcnBDb3JuZXJPZmZzZXQgLyBuZXh0U2VnbWVudExlbmd0aCkuX3JvdW5kKCkpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3RhbmNlICs9IG5ld0N1cnJlbnRWZXJ0ZXguZGlzdChjdXJyZW50VmVydGV4KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRDdXJyZW50VmVydGV4KG5ld0N1cnJlbnRWZXJ0ZXgsIHRoaXMuZGlzdGFuY2UsIG5leHROb3JtYWwubXVsdCgxKSwgMCwgMCwgZmFsc2UsIHNlZ21lbnQpO1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50VmVydGV4ID0gbmV3Q3VycmVudFZlcnRleDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN0YXJ0T2ZMaW5lID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBhcnJheXMucG9wdWxhdGVQYWludEFycmF5cyhmZWF0dXJlUHJvcGVydGllcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkIHR3byB2ZXJ0aWNlcyB0byB0aGUgYnVmZmVycy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjdXJyZW50VmVydGV4IHRoZSBsaW5lIHZlcnRleCB0byBhZGQgYnVmZmVyIHZlcnRpY2VzIGZvclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkaXN0YW5jZSB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lIHRvIHRoZSB2ZXJ0ZXhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZW5kTGVmdCBleHRydWRlIHRvIHNoaWZ0IHRoZSBsZWZ0IHZlcnRleCBhbG9uZyB0aGUgbGluZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBlbmRSaWdodCBleHRydWRlIHRvIHNoaWZ0IHRoZSBsZWZ0IHZlcnRleCBhbG9uZyB0aGUgbGluZVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gcm91bmQgd2hldGhlciB0aGlzIGlzIGEgcm91bmQgY2FwXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBhZGRDdXJyZW50VmVydGV4KGN1cnJlbnRWZXJ0ZXgsIGRpc3RhbmNlLCBub3JtYWwsIGVuZExlZnQsIGVuZFJpZ2h0LCByb3VuZCwgc2VnbWVudCkge1xuICAgICAgICBjb25zdCB0eCA9IHJvdW5kID8gMSA6IDA7XG4gICAgICAgIGxldCBleHRydWRlO1xuICAgICAgICBjb25zdCBhcnJheXMgPSB0aGlzLmFycmF5cztcbiAgICAgICAgY29uc3QgbGF5b3V0VmVydGV4QXJyYXkgPSBhcnJheXMubGF5b3V0VmVydGV4QXJyYXk7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRBcnJheSA9IGFycmF5cy5lbGVtZW50QXJyYXk7XG5cbiAgICAgICAgZXh0cnVkZSA9IG5vcm1hbC5jbG9uZSgpO1xuICAgICAgICBpZiAoZW5kTGVmdCkgZXh0cnVkZS5fc3ViKG5vcm1hbC5wZXJwKCkuX211bHQoZW5kTGVmdCkpO1xuICAgICAgICBhZGRMaW5lVmVydGV4KGxheW91dFZlcnRleEFycmF5LCBjdXJyZW50VmVydGV4LCBleHRydWRlLCB0eCwgMCwgZW5kTGVmdCwgZGlzdGFuY2UpO1xuICAgICAgICB0aGlzLmUzID0gc2VnbWVudC52ZXJ0ZXhMZW5ndGgrKztcbiAgICAgICAgaWYgKHRoaXMuZTEgPj0gMCAmJiB0aGlzLmUyID49IDApIHtcbiAgICAgICAgICAgIGVsZW1lbnRBcnJheS5lbXBsYWNlQmFjayh0aGlzLmUxLCB0aGlzLmUyLCB0aGlzLmUzKTtcbiAgICAgICAgICAgIHNlZ21lbnQucHJpbWl0aXZlTGVuZ3RoKys7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lMSA9IHRoaXMuZTI7XG4gICAgICAgIHRoaXMuZTIgPSB0aGlzLmUzO1xuXG4gICAgICAgIGV4dHJ1ZGUgPSBub3JtYWwubXVsdCgtMSk7XG4gICAgICAgIGlmIChlbmRSaWdodCkgZXh0cnVkZS5fc3ViKG5vcm1hbC5wZXJwKCkuX211bHQoZW5kUmlnaHQpKTtcbiAgICAgICAgYWRkTGluZVZlcnRleChsYXlvdXRWZXJ0ZXhBcnJheSwgY3VycmVudFZlcnRleCwgZXh0cnVkZSwgdHgsIDEsIC1lbmRSaWdodCwgZGlzdGFuY2UpO1xuICAgICAgICB0aGlzLmUzID0gc2VnbWVudC52ZXJ0ZXhMZW5ndGgrKztcbiAgICAgICAgaWYgKHRoaXMuZTEgPj0gMCAmJiB0aGlzLmUyID49IDApIHtcbiAgICAgICAgICAgIGVsZW1lbnRBcnJheS5lbXBsYWNlQmFjayh0aGlzLmUxLCB0aGlzLmUyLCB0aGlzLmUzKTtcbiAgICAgICAgICAgIHNlZ21lbnQucHJpbWl0aXZlTGVuZ3RoKys7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lMSA9IHRoaXMuZTI7XG4gICAgICAgIHRoaXMuZTIgPSB0aGlzLmUzO1xuXG4gICAgICAgIC8vIFRoZXJlIGlzIGEgbWF4aW11bSBcImRpc3RhbmNlIGFsb25nIHRoZSBsaW5lXCIgdGhhdCB3ZSBjYW4gc3RvcmUgaW4gdGhlIGJ1ZmZlcnMuXG4gICAgICAgIC8vIFdoZW4gd2UgZ2V0IGNsb3NlIHRvIHRoZSBkaXN0YW5jZSwgcmVzZXQgaXQgdG8gemVybyBhbmQgYWRkIHRoZSB2ZXJ0ZXggYWdhaW4gd2l0aFxuICAgICAgICAvLyBhIGRpc3RhbmNlIG9mIHplcm8uIFRoZSBtYXggZGlzdGFuY2UgaXMgZGV0ZXJtaW5lZCBieSB0aGUgbnVtYmVyIG9mIGJpdHMgd2UgYWxsb2NhdGVcbiAgICAgICAgLy8gdG8gYGxpbmVzb2ZhcmAuXG4gICAgICAgIGlmIChkaXN0YW5jZSA+IE1BWF9MSU5FX0RJU1RBTkNFIC8gMikge1xuICAgICAgICAgICAgdGhpcy5kaXN0YW5jZSA9IDA7XG4gICAgICAgICAgICB0aGlzLmFkZEN1cnJlbnRWZXJ0ZXgoY3VycmVudFZlcnRleCwgdGhpcy5kaXN0YW5jZSwgbm9ybWFsLCBlbmRMZWZ0LCBlbmRSaWdodCwgcm91bmQsIHNlZ21lbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkIGEgc2luZ2xlIG5ldyB2ZXJ0ZXggYW5kIGEgdHJpYW5nbGUgdXNpbmcgdHdvIHByZXZpb3VzIHZlcnRpY2VzLlxuICAgICAqIFRoaXMgYWRkcyBhIHBpZSBzbGljZSB0cmlhbmdsZSBuZWFyIGEgam9pbiB0byBzaW11bGF0ZSByb3VuZCBqb2luc1xuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGN1cnJlbnRWZXJ0ZXggdGhlIGxpbmUgdmVydGV4IHRvIGFkZCBidWZmZXIgdmVydGljZXMgZm9yXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGRpc3RhbmNlIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBiZWdnaW5pbmcgb2YgdGhlIGxpbmUgdG8gdGhlIHZlcnRleFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBleHRydWRlIHRoZSBvZmZzZXQgb2YgdGhlIG5ldyB2ZXJ0ZXggZnJvbSB0aGUgY3VycmVudFZlcnRleFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gd2hldGhlciB0aGUgbGluZSBpcyB0dXJuaW5nIGxlZnQgb3IgcmlnaHQgYXQgdGhpcyBhbmdsZVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgYWRkUGllU2xpY2VWZXJ0ZXgoY3VycmVudFZlcnRleCwgZGlzdGFuY2UsIGV4dHJ1ZGUsIGxpbmVUdXJuc0xlZnQsIHNlZ21lbnQpIHtcbiAgICAgICAgY29uc3QgdHkgPSBsaW5lVHVybnNMZWZ0ID8gMSA6IDA7XG4gICAgICAgIGV4dHJ1ZGUgPSBleHRydWRlLm11bHQobGluZVR1cm5zTGVmdCA/IC0xIDogMSk7XG4gICAgICAgIGNvbnN0IGFycmF5cyA9IHRoaXMuYXJyYXlzO1xuICAgICAgICBjb25zdCBsYXlvdXRWZXJ0ZXhBcnJheSA9IGFycmF5cy5sYXlvdXRWZXJ0ZXhBcnJheTtcbiAgICAgICAgY29uc3QgZWxlbWVudEFycmF5ID0gYXJyYXlzLmVsZW1lbnRBcnJheTtcblxuICAgICAgICBhZGRMaW5lVmVydGV4KGxheW91dFZlcnRleEFycmF5LCBjdXJyZW50VmVydGV4LCBleHRydWRlLCAwLCB0eSwgMCwgZGlzdGFuY2UpO1xuICAgICAgICB0aGlzLmUzID0gc2VnbWVudC52ZXJ0ZXhMZW5ndGgrKztcbiAgICAgICAgaWYgKHRoaXMuZTEgPj0gMCAmJiB0aGlzLmUyID49IDApIHtcbiAgICAgICAgICAgIGVsZW1lbnRBcnJheS5lbXBsYWNlQmFjayh0aGlzLmUxLCB0aGlzLmUyLCB0aGlzLmUzKTtcbiAgICAgICAgICAgIHNlZ21lbnQucHJpbWl0aXZlTGVuZ3RoKys7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGluZVR1cm5zTGVmdCkge1xuICAgICAgICAgICAgdGhpcy5lMiA9IHRoaXMuZTM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmUxID0gdGhpcy5lMztcbiAgICAgICAgfVxuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBMaW5lQnVja2V0O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBQb2ludCA9IHJlcXVpcmUoJ3BvaW50LWdlb21ldHJ5Jyk7XG5jb25zdCBBcnJheUdyb3VwID0gcmVxdWlyZSgnLi4vYXJyYXlfZ3JvdXAnKTtcbmNvbnN0IEJ1ZmZlckdyb3VwID0gcmVxdWlyZSgnLi4vYnVmZmVyX2dyb3VwJyk7XG5jb25zdCBjcmVhdGVWZXJ0ZXhBcnJheVR5cGUgPSByZXF1aXJlKCcuLi92ZXJ0ZXhfYXJyYXlfdHlwZScpO1xuY29uc3QgY3JlYXRlRWxlbWVudEFycmF5VHlwZSA9IHJlcXVpcmUoJy4uL2VsZW1lbnRfYXJyYXlfdHlwZScpO1xuY29uc3QgRVhURU5UID0gcmVxdWlyZSgnLi4vZXh0ZW50Jyk7XG5jb25zdCBBbmNob3IgPSByZXF1aXJlKCcuLi8uLi9zeW1ib2wvYW5jaG9yJyk7XG5jb25zdCBnZXRBbmNob3JzID0gcmVxdWlyZSgnLi4vLi4vc3ltYm9sL2dldF9hbmNob3JzJyk7XG5jb25zdCByZXNvbHZlVG9rZW5zID0gcmVxdWlyZSgnLi4vLi4vdXRpbC90b2tlbicpO1xuY29uc3QgUXVhZHMgPSByZXF1aXJlKCcuLi8uLi9zeW1ib2wvcXVhZHMnKTtcbmNvbnN0IFNoYXBpbmcgPSByZXF1aXJlKCcuLi8uLi9zeW1ib2wvc2hhcGluZycpO1xuY29uc3QgcmVzb2x2ZVRleHQgPSByZXF1aXJlKCcuLi8uLi9zeW1ib2wvcmVzb2x2ZV90ZXh0Jyk7XG5jb25zdCBtZXJnZUxpbmVzID0gcmVxdWlyZSgnLi4vLi4vc3ltYm9sL21lcmdlbGluZXMnKTtcbmNvbnN0IGNsaXBMaW5lID0gcmVxdWlyZSgnLi4vLi4vc3ltYm9sL2NsaXBfbGluZScpO1xuY29uc3QgdXRpbCA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvdXRpbCcpO1xuY29uc3Qgc2NyaXB0RGV0ZWN0aW9uID0gcmVxdWlyZSgnLi4vLi4vdXRpbC9zY3JpcHRfZGV0ZWN0aW9uJyk7XG5jb25zdCBsb2FkR2VvbWV0cnkgPSByZXF1aXJlKCcuLi9sb2FkX2dlb21ldHJ5Jyk7XG5jb25zdCBDb2xsaXNpb25GZWF0dXJlID0gcmVxdWlyZSgnLi4vLi4vc3ltYm9sL2NvbGxpc2lvbl9mZWF0dXJlJyk7XG5jb25zdCBmaW5kUG9sZU9mSW5hY2Nlc3NpYmlsaXR5ID0gcmVxdWlyZSgnLi4vLi4vdXRpbC9maW5kX3BvbGVfb2ZfaW5hY2Nlc3NpYmlsaXR5Jyk7XG5jb25zdCBjbGFzc2lmeVJpbmdzID0gcmVxdWlyZSgnLi4vLi4vdXRpbC9jbGFzc2lmeV9yaW5ncycpO1xuY29uc3QgVmVjdG9yVGlsZUZlYXR1cmUgPSByZXF1aXJlKCd2ZWN0b3ItdGlsZScpLlZlY3RvclRpbGVGZWF0dXJlO1xuY29uc3QgcnRsVGV4dFBsdWdpbiA9IHJlcXVpcmUoJy4uLy4uL3NvdXJjZS9ydGxfdGV4dF9wbHVnaW4nKTtcblxuY29uc3Qgc2hhcGVUZXh0ID0gU2hhcGluZy5zaGFwZVRleHQ7XG5jb25zdCBzaGFwZUljb24gPSBTaGFwaW5nLnNoYXBlSWNvbjtcbmNvbnN0IFdyaXRpbmdNb2RlID0gU2hhcGluZy5Xcml0aW5nTW9kZTtcbmNvbnN0IGdldEdseXBoUXVhZHMgPSBRdWFkcy5nZXRHbHlwaFF1YWRzO1xuY29uc3QgZ2V0SWNvblF1YWRzID0gUXVhZHMuZ2V0SWNvblF1YWRzO1xuXG5jb25zdCBlbGVtZW50QXJyYXlUeXBlID0gY3JlYXRlRWxlbWVudEFycmF5VHlwZSgpO1xuXG5jb25zdCBsYXlvdXRWZXJ0ZXhBcnJheVR5cGUgPSBjcmVhdGVWZXJ0ZXhBcnJheVR5cGUoW1xuICAgIHtuYW1lOiAnYV9wb3MnLCAgICAgICAgIGNvbXBvbmVudHM6IDIsIHR5cGU6ICdJbnQxNid9LFxuICAgIHtuYW1lOiAnYV9vZmZzZXQnLCAgICAgIGNvbXBvbmVudHM6IDIsIHR5cGU6ICdJbnQxNid9LFxuICAgIHtuYW1lOiAnYV90ZXh0dXJlX3BvcycsIGNvbXBvbmVudHM6IDIsIHR5cGU6ICdVaW50MTYnfSxcbiAgICB7bmFtZTogJ2FfZGF0YScsICAgICAgICBjb21wb25lbnRzOiA0LCB0eXBlOiAnVWludDgnfVxuXSk7XG5cbmNvbnN0IHN5bWJvbEludGVyZmFjZXMgPSB7XG4gICAgZ2x5cGg6IHtcbiAgICAgICAgbGF5b3V0VmVydGV4QXJyYXlUeXBlOiBsYXlvdXRWZXJ0ZXhBcnJheVR5cGUsXG4gICAgICAgIGVsZW1lbnRBcnJheVR5cGU6IGVsZW1lbnRBcnJheVR5cGVcbiAgICB9LFxuICAgIGljb246IHtcbiAgICAgICAgbGF5b3V0VmVydGV4QXJyYXlUeXBlOiBsYXlvdXRWZXJ0ZXhBcnJheVR5cGUsXG4gICAgICAgIGVsZW1lbnRBcnJheVR5cGU6IGVsZW1lbnRBcnJheVR5cGVcbiAgICB9LFxuICAgIGNvbGxpc2lvbkJveDoge1xuICAgICAgICBsYXlvdXRWZXJ0ZXhBcnJheVR5cGU6IGNyZWF0ZVZlcnRleEFycmF5VHlwZShbXG4gICAgICAgICAgICB7bmFtZTogJ2FfcG9zJywgICAgIGNvbXBvbmVudHM6IDIsIHR5cGU6ICdJbnQxNid9LFxuICAgICAgICAgICAge25hbWU6ICdhX2V4dHJ1ZGUnLCBjb21wb25lbnRzOiAyLCB0eXBlOiAnSW50MTYnfSxcbiAgICAgICAgICAgIHtuYW1lOiAnYV9kYXRhJywgICAgY29tcG9uZW50czogMiwgdHlwZTogJ1VpbnQ4J31cbiAgICAgICAgXSksXG4gICAgICAgIGVsZW1lbnRBcnJheVR5cGU6IGNyZWF0ZUVsZW1lbnRBcnJheVR5cGUoMilcbiAgICB9XG59O1xuXG5mdW5jdGlvbiBhZGRWZXJ0ZXgoYXJyYXksIHgsIHksIG94LCBveSwgdHgsIHR5LCBtaW56b29tLCBtYXh6b29tLCBsYWJlbG1pbnpvb20sIGxhYmVsYW5nbGUpIHtcbiAgICBhcnJheS5lbXBsYWNlQmFjayhcbiAgICAgICAgICAgIC8vIGFfcG9zXG4gICAgICAgICAgICB4LFxuICAgICAgICAgICAgeSxcblxuICAgICAgICAgICAgLy8gYV9vZmZzZXRcbiAgICAgICAgICAgIE1hdGgucm91bmQob3ggKiA2NCksXG4gICAgICAgICAgICBNYXRoLnJvdW5kKG95ICogNjQpLFxuXG4gICAgICAgICAgICAvLyBhX3RleHR1cmVfcG9zXG4gICAgICAgICAgICB0eCAvIDQsIC8vIHggY29vcmRpbmF0ZSBvZiBzeW1ib2wgb24gZ2x5cGggYXRsYXMgdGV4dHVyZVxuICAgICAgICAgICAgdHkgLyA0LCAvLyB5IGNvb3JkaW5hdGUgb2Ygc3ltYm9sIG9uIGdseXBoIGF0bGFzIHRleHR1cmVcblxuICAgICAgICAgICAgLy8gYV9kYXRhXG4gICAgICAgICAgICAobGFiZWxtaW56b29tIHx8IDApICogMTAsIC8vIGxhYmVsbWluem9vbVxuICAgICAgICAgICAgbGFiZWxhbmdsZSwgLy8gbGFiZWxhbmdsZVxuICAgICAgICAgICAgKG1pbnpvb20gfHwgMCkgKiAxMCwgLy8gbWluem9vbVxuICAgICAgICAgICAgTWF0aC5taW4obWF4em9vbSB8fCAyNSwgMjUpICogMTApOyAvLyBtYXh6b29tXG59XG5cbmZ1bmN0aW9uIGFkZENvbGxpc2lvbkJveFZlcnRleChsYXlvdXRWZXJ0ZXhBcnJheSwgcG9pbnQsIGV4dHJ1ZGUsIG1heFpvb20sIHBsYWNlbWVudFpvb20pIHtcbiAgICByZXR1cm4gbGF5b3V0VmVydGV4QXJyYXkuZW1wbGFjZUJhY2soXG4gICAgICAgIC8vIHBvc1xuICAgICAgICBwb2ludC54LFxuICAgICAgICBwb2ludC55LFxuICAgICAgICAvLyBleHRydWRlXG4gICAgICAgIE1hdGgucm91bmQoZXh0cnVkZS54KSxcbiAgICAgICAgTWF0aC5yb3VuZChleHRydWRlLnkpLFxuICAgICAgICAvLyBkYXRhXG4gICAgICAgIG1heFpvb20gKiAxMCxcbiAgICAgICAgcGxhY2VtZW50Wm9vbSAqIDEwKTtcbn1cblxuY2xhc3MgU3ltYm9sQnVja2V0IHtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuY29sbGlzaW9uQm94QXJyYXkgPSBvcHRpb25zLmNvbGxpc2lvbkJveEFycmF5O1xuICAgICAgICB0aGlzLnN5bWJvbFF1YWRzQXJyYXkgPSBvcHRpb25zLnN5bWJvbFF1YWRzQXJyYXk7XG4gICAgICAgIHRoaXMuc3ltYm9sSW5zdGFuY2VzQXJyYXkgPSBvcHRpb25zLnN5bWJvbEluc3RhbmNlc0FycmF5O1xuXG4gICAgICAgIHRoaXMuem9vbSA9IG9wdGlvbnMuem9vbTtcbiAgICAgICAgdGhpcy5vdmVyc2NhbGluZyA9IG9wdGlvbnMub3ZlcnNjYWxpbmc7XG4gICAgICAgIHRoaXMubGF5ZXJzID0gb3B0aW9ucy5sYXllcnM7XG4gICAgICAgIHRoaXMuaW5kZXggPSBvcHRpb25zLmluZGV4O1xuICAgICAgICB0aGlzLnNkZkljb25zID0gb3B0aW9ucy5zZGZJY29ucztcbiAgICAgICAgdGhpcy5pY29uc05lZWRMaW5lYXIgPSBvcHRpb25zLmljb25zTmVlZExpbmVhcjtcbiAgICAgICAgdGhpcy5hZGp1c3RlZFRleHRTaXplID0gb3B0aW9ucy5hZGp1c3RlZFRleHRTaXplO1xuICAgICAgICB0aGlzLmFkanVzdGVkSWNvblNpemUgPSBvcHRpb25zLmFkanVzdGVkSWNvblNpemU7XG4gICAgICAgIHRoaXMuZm9udHN0YWNrID0gb3B0aW9ucy5mb250c3RhY2s7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuYXJyYXlzKSB7XG4gICAgICAgICAgICB0aGlzLmJ1ZmZlcnMgPSB7fTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaWQgaW4gb3B0aW9ucy5hcnJheXMpIHtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5hcnJheXNbaWRdKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnVmZmVyc1tpZF0gPSBuZXcgQnVmZmVyR3JvdXAoc3ltYm9sSW50ZXJmYWNlc1tpZF0sIG9wdGlvbnMubGF5ZXJzLCBvcHRpb25zLnpvb20sIG9wdGlvbnMuYXJyYXlzW2lkXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcG9wdWxhdGUoZmVhdHVyZXMsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgbGF5b3V0ID0gdGhpcy5sYXllcnNbMF0ubGF5b3V0O1xuICAgICAgICBjb25zdCB0ZXh0RmllbGQgPSBsYXlvdXRbJ3RleHQtZmllbGQnXTtcbiAgICAgICAgY29uc3QgdGV4dEZvbnQgPSBsYXlvdXRbJ3RleHQtZm9udCddO1xuICAgICAgICBjb25zdCBpY29uSW1hZ2UgPSBsYXlvdXRbJ2ljb24taW1hZ2UnXTtcblxuICAgICAgICBjb25zdCBoYXNUZXh0ID0gdGV4dEZpZWxkICYmIHRleHRGb250O1xuICAgICAgICBjb25zdCBoYXNJY29uID0gaWNvbkltYWdlO1xuXG4gICAgICAgIHRoaXMuZmVhdHVyZXMgPSBbXTtcblxuICAgICAgICBpZiAoIWhhc1RleHQgJiYgIWhhc0ljb24pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGljb25zID0gb3B0aW9ucy5pY29uRGVwZW5kZW5jaWVzO1xuICAgICAgICBjb25zdCBzdGFja3MgPSBvcHRpb25zLmdseXBoRGVwZW5kZW5jaWVzO1xuICAgICAgICBjb25zdCBzdGFjayA9IHN0YWNrc1t0ZXh0Rm9udF0gPSBzdGFja3NbdGV4dEZvbnRdIHx8IHt9O1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmVhdHVyZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGZlYXR1cmUgPSBmZWF0dXJlc1tpXTtcbiAgICAgICAgICAgIGlmICghdGhpcy5sYXllcnNbMF0uZmlsdGVyKGZlYXR1cmUpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCB0ZXh0O1xuICAgICAgICAgICAgaWYgKGhhc1RleHQpIHtcbiAgICAgICAgICAgICAgICBpZiAocnRsVGV4dFBsdWdpbi5hcHBseUFyYWJpY1NoYXBpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHJ0bFRleHRQbHVnaW4uYXBwbHlBcmFiaWNTaGFwaW5nKHJlc29sdmVUZXh0KGZlYXR1cmUsIGxheW91dCkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRleHQgPSByZXNvbHZlVGV4dChmZWF0dXJlLCBsYXlvdXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGljb247XG4gICAgICAgICAgICBpZiAoaGFzSWNvbikge1xuICAgICAgICAgICAgICAgIGljb24gPSByZXNvbHZlVG9rZW5zKGZlYXR1cmUucHJvcGVydGllcywgaWNvbkltYWdlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF0ZXh0ICYmICFpY29uKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZmVhdHVyZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgdGV4dCxcbiAgICAgICAgICAgICAgICBpY29uLFxuICAgICAgICAgICAgICAgIGluZGV4OiBpLFxuICAgICAgICAgICAgICAgIHNvdXJjZUxheWVySW5kZXg6IGZlYXR1cmUuc291cmNlTGF5ZXJJbmRleCxcbiAgICAgICAgICAgICAgICBnZW9tZXRyeTogbG9hZEdlb21ldHJ5KGZlYXR1cmUpLFxuICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IGZlYXR1cmUucHJvcGVydGllcyxcbiAgICAgICAgICAgICAgICB0eXBlOiBWZWN0b3JUaWxlRmVhdHVyZS50eXBlc1tmZWF0dXJlLnR5cGVdXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKGljb24pIHtcbiAgICAgICAgICAgICAgICBpY29uc1tpY29uXSA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0ZXh0KSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YWNrW3RleHQuY2hhckNvZGVBdChpKV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsYXlvdXRbJ3N5bWJvbC1wbGFjZW1lbnQnXSA9PT0gJ2xpbmUnKSB7XG4gICAgICAgICAgICAvLyBNZXJnZSBhZGphY2VudCBsaW5lcyB3aXRoIHRoZSBzYW1lIHRleHQgdG8gaW1wcm92ZSBsYWJlbGxpbmcuXG4gICAgICAgICAgICAvLyBJdCdzIGJldHRlciB0byBwbGFjZSBsYWJlbHMgb24gb25lIGxvbmcgbGluZSB0aGFuIG9uIG1hbnkgc2hvcnQgc2VnbWVudHMuXG4gICAgICAgICAgICB0aGlzLmZlYXR1cmVzID0gbWVyZ2VMaW5lcyh0aGlzLmZlYXR1cmVzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlzRW1wdHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFycmF5cy5pY29uLmlzRW1wdHkoKSAmJlxuICAgICAgICAgICAgdGhpcy5hcnJheXMuZ2x5cGguaXNFbXB0eSgpICYmXG4gICAgICAgICAgICB0aGlzLmFycmF5cy5jb2xsaXNpb25Cb3guaXNFbXB0eSgpO1xuICAgIH1cblxuICAgIHNlcmlhbGl6ZSh0cmFuc2ZlcmFibGVzKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB6b29tOiB0aGlzLnpvb20sXG4gICAgICAgICAgICBsYXllcklkczogdGhpcy5sYXllcnMubWFwKChsKSA9PiBsLmlkKSxcbiAgICAgICAgICAgIHNkZkljb25zOiB0aGlzLnNkZkljb25zLFxuICAgICAgICAgICAgaWNvbnNOZWVkTGluZWFyOiB0aGlzLmljb25zTmVlZExpbmVhcixcbiAgICAgICAgICAgIGFkanVzdGVkVGV4dFNpemU6IHRoaXMuYWRqdXN0ZWRUZXh0U2l6ZSxcbiAgICAgICAgICAgIGFkanVzdGVkSWNvblNpemU6IHRoaXMuYWRqdXN0ZWRJY29uU2l6ZSxcbiAgICAgICAgICAgIGZvbnRzdGFjazogdGhpcy5mb250c3RhY2ssXG4gICAgICAgICAgICBhcnJheXM6IHV0aWwubWFwT2JqZWN0KHRoaXMuYXJyYXlzLCAoYSkgPT4gYS5pc0VtcHR5KCkgPyBudWxsIDogYS5zZXJpYWxpemUodHJhbnNmZXJhYmxlcykpXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuYnVmZmVycykge1xuICAgICAgICAgICAgaWYgKHRoaXMuYnVmZmVycy5pY29uKSB0aGlzLmJ1ZmZlcnMuaWNvbi5kZXN0cm95KCk7XG4gICAgICAgICAgICBpZiAodGhpcy5idWZmZXJzLmdseXBoKSB0aGlzLmJ1ZmZlcnMuZ2x5cGguZGVzdHJveSgpO1xuICAgICAgICAgICAgaWYgKHRoaXMuYnVmZmVycy5jb2xsaXNpb25Cb3gpIHRoaXMuYnVmZmVycy5jb2xsaXNpb25Cb3guZGVzdHJveSgpO1xuICAgICAgICAgICAgdGhpcy5idWZmZXJzID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNyZWF0ZUFycmF5cygpIHtcbiAgICAgICAgdGhpcy5hcnJheXMgPSB1dGlsLm1hcE9iamVjdChzeW1ib2xJbnRlcmZhY2VzLCAocHJvZ3JhbUludGVyZmFjZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBBcnJheUdyb3VwKHByb2dyYW1JbnRlcmZhY2UsIHRoaXMubGF5ZXJzLCB0aGlzLnpvb20pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcmVwYXJlKHN0YWNrcywgaWNvbnMpIHtcbiAgICAgICAgdGhpcy5jcmVhdGVBcnJheXMoKTtcblxuICAgICAgICAvLyBUbyByZWR1Y2UgdGhlIG51bWJlciBvZiBsYWJlbHMgdGhhdCBqdW1wIGFyb3VuZCB3aGVuIHpvb21pbmcgd2UgbmVlZFxuICAgICAgICAvLyB0byB1c2UgYSB0ZXh0LXNpemUgdmFsdWUgdGhhdCBpcyB0aGUgc2FtZSBmb3IgYWxsIHpvb20gbGV2ZWxzLlxuICAgICAgICAvLyBUaGlzIGNhbGN1bGF0ZXMgdGV4dC1zaXplIGF0IGEgaGlnaCB6b29tIGxldmVsIHNvIHRoYXQgYWxsIHRpbGVzIGNhblxuICAgICAgICAvLyB1c2UgdGhlIHNhbWUgdmFsdWUgd2hlbiBjYWxjdWxhdGluZyBhbmNob3IgcG9zaXRpb25zLlxuICAgICAgICB0aGlzLmFkanVzdGVkVGV4dE1heFNpemUgPSB0aGlzLmxheWVyc1swXS5nZXRMYXlvdXRWYWx1ZSgndGV4dC1zaXplJywge3pvb206IDE4fSk7XG4gICAgICAgIHRoaXMuYWRqdXN0ZWRUZXh0U2l6ZSA9IHRoaXMubGF5ZXJzWzBdLmdldExheW91dFZhbHVlKCd0ZXh0LXNpemUnLCB7em9vbTogdGhpcy56b29tICsgMX0pO1xuICAgICAgICB0aGlzLmFkanVzdGVkSWNvbk1heFNpemUgPSB0aGlzLmxheWVyc1swXS5nZXRMYXlvdXRWYWx1ZSgnaWNvbi1zaXplJywge3pvb206IDE4fSk7XG4gICAgICAgIHRoaXMuYWRqdXN0ZWRJY29uU2l6ZSA9IHRoaXMubGF5ZXJzWzBdLmdldExheW91dFZhbHVlKCdpY29uLXNpemUnLCB7em9vbTogdGhpcy56b29tICsgMX0pO1xuXG4gICAgICAgIGNvbnN0IHRpbGVTaXplID0gNTEyICogdGhpcy5vdmVyc2NhbGluZztcbiAgICAgICAgdGhpcy50aWxlUGl4ZWxSYXRpbyA9IEVYVEVOVCAvIHRpbGVTaXplO1xuICAgICAgICB0aGlzLmNvbXBhcmVUZXh0ID0ge307XG4gICAgICAgIHRoaXMuaWNvbnNOZWVkTGluZWFyID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc3ltYm9sSW5zdGFuY2VzU3RhcnRJbmRleCA9IHRoaXMuc3ltYm9sSW5zdGFuY2VzQXJyYXkubGVuZ3RoO1xuXG4gICAgICAgIGNvbnN0IGxheW91dCA9IHRoaXMubGF5ZXJzWzBdLmxheW91dDtcblxuICAgICAgICBsZXQgaG9yaXpvbnRhbEFsaWduID0gMC41LFxuICAgICAgICAgICAgdmVydGljYWxBbGlnbiA9IDAuNTtcblxuICAgICAgICBzd2l0Y2ggKGxheW91dFsndGV4dC1hbmNob3InXSkge1xuICAgICAgICBjYXNlICdyaWdodCc6XG4gICAgICAgIGNhc2UgJ3RvcC1yaWdodCc6XG4gICAgICAgIGNhc2UgJ2JvdHRvbS1yaWdodCc6XG4gICAgICAgICAgICBob3Jpem9udGFsQWxpZ24gPSAxO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgICBjYXNlICd0b3AtbGVmdCc6XG4gICAgICAgIGNhc2UgJ2JvdHRvbS1sZWZ0JzpcbiAgICAgICAgICAgIGhvcml6b250YWxBbGlnbiA9IDA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXRjaCAobGF5b3V0Wyd0ZXh0LWFuY2hvciddKSB7XG4gICAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgIGNhc2UgJ2JvdHRvbS1yaWdodCc6XG4gICAgICAgIGNhc2UgJ2JvdHRvbS1sZWZ0JzpcbiAgICAgICAgICAgIHZlcnRpY2FsQWxpZ24gPSAxO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3RvcCc6XG4gICAgICAgIGNhc2UgJ3RvcC1yaWdodCc6XG4gICAgICAgIGNhc2UgJ3RvcC1sZWZ0JzpcbiAgICAgICAgICAgIHZlcnRpY2FsQWxpZ24gPSAwO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBqdXN0aWZ5ID0gbGF5b3V0Wyd0ZXh0LWp1c3RpZnknXSA9PT0gJ3JpZ2h0JyA/IDEgOlxuICAgICAgICAgICAgbGF5b3V0Wyd0ZXh0LWp1c3RpZnknXSA9PT0gJ2xlZnQnID8gMCA6XG4gICAgICAgICAgICAwLjU7XG5cbiAgICAgICAgY29uc3Qgb25lRW0gPSAyNDtcbiAgICAgICAgY29uc3QgbGluZUhlaWdodCA9IGxheW91dFsndGV4dC1saW5lLWhlaWdodCddICogb25lRW07XG4gICAgICAgIGNvbnN0IG1heFdpZHRoID0gbGF5b3V0WydzeW1ib2wtcGxhY2VtZW50J10gIT09ICdsaW5lJyA/IGxheW91dFsndGV4dC1tYXgtd2lkdGgnXSAqIG9uZUVtIDogMDtcbiAgICAgICAgY29uc3Qgc3BhY2luZyA9IGxheW91dFsndGV4dC1sZXR0ZXItc3BhY2luZyddICogb25lRW07XG4gICAgICAgIGNvbnN0IHRleHRPZmZzZXQgPSBbbGF5b3V0Wyd0ZXh0LW9mZnNldCddWzBdICogb25lRW0sIGxheW91dFsndGV4dC1vZmZzZXQnXVsxXSAqIG9uZUVtXTtcbiAgICAgICAgY29uc3QgZm9udHN0YWNrID0gdGhpcy5mb250c3RhY2sgPSBsYXlvdXRbJ3RleHQtZm9udCddLmpvaW4oJywnKTtcbiAgICAgICAgY29uc3QgdGV4dEFsb25nTGluZSA9IGxheW91dFsndGV4dC1yb3RhdGlvbi1hbGlnbm1lbnQnXSA9PT0gJ21hcCcgJiYgbGF5b3V0WydzeW1ib2wtcGxhY2VtZW50J10gPT09ICdsaW5lJztcblxuICAgICAgICBmb3IgKGNvbnN0IGZlYXR1cmUgb2YgdGhpcy5mZWF0dXJlcykge1xuXG4gICAgICAgICAgICBsZXQgc2hhcGVkVGV4dE9yaWVudGF0aW9ucztcbiAgICAgICAgICAgIGlmIChmZWF0dXJlLnRleHQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhbGxvd3NWZXJ0aWNhbFdyaXRpbmdNb2RlID0gc2NyaXB0RGV0ZWN0aW9uLmFsbG93c1ZlcnRpY2FsV3JpdGluZ01vZGUoZmVhdHVyZS50ZXh0KTtcblxuICAgICAgICAgICAgICAgIHNoYXBlZFRleHRPcmllbnRhdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgICAgIFtXcml0aW5nTW9kZS5ob3Jpem9udGFsXTogc2hhcGVUZXh0KGZlYXR1cmUudGV4dCwgc3RhY2tzW2ZvbnRzdGFja10sIG1heFdpZHRoLCBsaW5lSGVpZ2h0LCBob3Jpem9udGFsQWxpZ24sIHZlcnRpY2FsQWxpZ24sIGp1c3RpZnksIHNwYWNpbmcsIHRleHRPZmZzZXQsIG9uZUVtLCBXcml0aW5nTW9kZS5ob3Jpem9udGFsKSxcbiAgICAgICAgICAgICAgICAgICAgW1dyaXRpbmdNb2RlLnZlcnRpY2FsXTogYWxsb3dzVmVydGljYWxXcml0aW5nTW9kZSAmJiB0ZXh0QWxvbmdMaW5lICYmIHNoYXBlVGV4dChmZWF0dXJlLnRleHQsIHN0YWNrc1tmb250c3RhY2tdLCBtYXhXaWR0aCwgbGluZUhlaWdodCwgaG9yaXpvbnRhbEFsaWduLCB2ZXJ0aWNhbEFsaWduLCBqdXN0aWZ5LCBzcGFjaW5nLCB0ZXh0T2Zmc2V0LCBvbmVFbSwgV3JpdGluZ01vZGUudmVydGljYWwpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc2hhcGVkVGV4dE9yaWVudGF0aW9ucyA9IHt9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgc2hhcGVkSWNvbjtcbiAgICAgICAgICAgIGlmIChmZWF0dXJlLmljb24pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbWFnZSA9IGljb25zW2ZlYXR1cmUuaWNvbl07XG4gICAgICAgICAgICAgICAgY29uc3QgaWNvbk9mZnNldCA9IHRoaXMubGF5ZXJzWzBdLmdldExheW91dFZhbHVlKCdpY29uLW9mZnNldCcsIHt6b29tOiB0aGlzLnpvb219LCBmZWF0dXJlLnByb3BlcnRpZXMpO1xuICAgICAgICAgICAgICAgIHNoYXBlZEljb24gPSBzaGFwZUljb24oaW1hZ2UsIGljb25PZmZzZXQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGltYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNkZkljb25zID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2RmSWNvbnMgPSBpbWFnZS5zZGY7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZGZJY29ucyAhPT0gaW1hZ2Uuc2RmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1dGlsLndhcm5PbmNlKCdTdHlsZSBzaGVldCB3YXJuaW5nOiBDYW5ub3QgbWl4IFNERiBhbmQgbm9uLVNERiBpY29ucyBpbiBvbmUgYnVmZmVyJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGltYWdlLnBpeGVsUmF0aW8gIT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaWNvbnNOZWVkTGluZWFyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsYXlvdXRbJ2ljb24tcm90YXRlJ10gIT09IDAgfHwgIXRoaXMubGF5ZXJzWzBdLmlzTGF5b3V0VmFsdWVGZWF0dXJlQ29uc3RhbnQoJ2ljb24tcm90YXRlJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaWNvbnNOZWVkTGluZWFyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHNoYXBlZFRleHRPcmllbnRhdGlvbnNbV3JpdGluZ01vZGUuaG9yaXpvbnRhbF0gfHwgc2hhcGVkSWNvbikge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkRmVhdHVyZShmZWF0dXJlLCBzaGFwZWRUZXh0T3JpZW50YXRpb25zLCBzaGFwZWRJY29uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN5bWJvbEluc3RhbmNlc0VuZEluZGV4ID0gdGhpcy5zeW1ib2xJbnN0YW5jZXNBcnJheS5sZW5ndGg7XG4gICAgfVxuXG4gICAgYWRkRmVhdHVyZShmZWF0dXJlLCBzaGFwZWRUZXh0T3JpZW50YXRpb25zLCBzaGFwZWRJY29uKSB7XG4gICAgICAgIGNvbnN0IGxheW91dCA9IHRoaXMubGF5ZXJzWzBdLmxheW91dCxcbiAgICAgICAgICAgIGdseXBoU2l6ZSA9IDI0LFxuICAgICAgICAgICAgZm9udFNjYWxlID0gdGhpcy5hZGp1c3RlZFRleHRTaXplIC8gZ2x5cGhTaXplLFxuICAgICAgICAgICAgdGV4dE1heFNpemUgPSB0aGlzLmFkanVzdGVkVGV4dE1heFNpemUgIT09IHVuZGVmaW5lZCA/IHRoaXMuYWRqdXN0ZWRUZXh0TWF4U2l6ZSA6IHRoaXMuYWRqdXN0ZWRUZXh0U2l6ZSxcbiAgICAgICAgICAgIHRleHRCb3hTY2FsZSA9IHRoaXMudGlsZVBpeGVsUmF0aW8gKiBmb250U2NhbGUsXG4gICAgICAgICAgICB0ZXh0TWF4Qm94U2NhbGUgPSB0aGlzLnRpbGVQaXhlbFJhdGlvICogdGV4dE1heFNpemUgLyBnbHlwaFNpemUsXG4gICAgICAgICAgICBpY29uQm94U2NhbGUgPSB0aGlzLnRpbGVQaXhlbFJhdGlvICogdGhpcy5hZGp1c3RlZEljb25TaXplLFxuICAgICAgICAgICAgc3ltYm9sTWluRGlzdGFuY2UgPSB0aGlzLnRpbGVQaXhlbFJhdGlvICogbGF5b3V0WydzeW1ib2wtc3BhY2luZyddLFxuICAgICAgICAgICAgYXZvaWRFZGdlcyA9IGxheW91dFsnc3ltYm9sLWF2b2lkLWVkZ2VzJ10sXG4gICAgICAgICAgICB0ZXh0UGFkZGluZyA9IGxheW91dFsndGV4dC1wYWRkaW5nJ10gKiB0aGlzLnRpbGVQaXhlbFJhdGlvLFxuICAgICAgICAgICAgaWNvblBhZGRpbmcgPSBsYXlvdXRbJ2ljb24tcGFkZGluZyddICogdGhpcy50aWxlUGl4ZWxSYXRpbyxcbiAgICAgICAgICAgIHRleHRNYXhBbmdsZSA9IGxheW91dFsndGV4dC1tYXgtYW5nbGUnXSAvIDE4MCAqIE1hdGguUEksXG4gICAgICAgICAgICB0ZXh0QWxvbmdMaW5lID0gbGF5b3V0Wyd0ZXh0LXJvdGF0aW9uLWFsaWdubWVudCddID09PSAnbWFwJyAmJiBsYXlvdXRbJ3N5bWJvbC1wbGFjZW1lbnQnXSA9PT0gJ2xpbmUnLFxuICAgICAgICAgICAgaWNvbkFsb25nTGluZSA9IGxheW91dFsnaWNvbi1yb3RhdGlvbi1hbGlnbm1lbnQnXSA9PT0gJ21hcCcgJiYgbGF5b3V0WydzeW1ib2wtcGxhY2VtZW50J10gPT09ICdsaW5lJyxcbiAgICAgICAgICAgIG1heU92ZXJsYXAgPSBsYXlvdXRbJ3RleHQtYWxsb3ctb3ZlcmxhcCddIHx8IGxheW91dFsnaWNvbi1hbGxvdy1vdmVybGFwJ10gfHxcbiAgICAgICAgICAgICAgICBsYXlvdXRbJ3RleHQtaWdub3JlLXBsYWNlbWVudCddIHx8IGxheW91dFsnaWNvbi1pZ25vcmUtcGxhY2VtZW50J10sXG4gICAgICAgICAgICBzeW1ib2xQbGFjZW1lbnQgPSBsYXlvdXRbJ3N5bWJvbC1wbGFjZW1lbnQnXSxcbiAgICAgICAgICAgIHRleHRSZXBlYXREaXN0YW5jZSA9IHN5bWJvbE1pbkRpc3RhbmNlIC8gMjtcblxuICAgICAgICBjb25zdCBhZGRTeW1ib2xJbnN0YW5jZSA9IChsaW5lLCBhbmNob3IpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGluc2lkZSA9ICEoYW5jaG9yLnggPCAwIHx8IGFuY2hvci54ID4gRVhURU5UIHx8IGFuY2hvci55IDwgMCB8fCBhbmNob3IueSA+IEVYVEVOVCk7XG5cbiAgICAgICAgICAgIGlmIChhdm9pZEVkZ2VzICYmICFpbnNpZGUpIHJldHVybjtcblxuICAgICAgICAgICAgLy8gTm9ybWFsbHkgc3ltYm9sIGxheWVycyBhcmUgZHJhd24gYWNyb3NzIHRpbGUgYm91bmRhcmllcy4gT25seSBzeW1ib2xzXG4gICAgICAgICAgICAvLyB3aXRoIHRoZWlyIGFuY2hvcnMgd2l0aGluIHRoZSB0aWxlIGJvdW5kYXJpZXMgYXJlIGFkZGVkIHRvIHRoZSBidWZmZXJzXG4gICAgICAgICAgICAvLyB0byBwcmV2ZW50IHN5bWJvbHMgZnJvbSBiZWluZyBkcmF3biB0d2ljZS5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBTeW1ib2xzIGluIGxheWVycyB3aXRoIG92ZXJsYXAgYXJlIHNvcnRlZCBpbiB0aGUgeSBkaXJlY3Rpb24gc28gdGhhdFxuICAgICAgICAgICAgLy8gc3ltYm9scyBsb3dlciBvbiB0aGUgY2FudmFzIGFyZSBkcmF3biBvbiB0b3Agb2Ygc3ltYm9scyBuZWFyIHRoZSB0b3AuXG4gICAgICAgICAgICAvLyBUbyBwcmVzZXJ2ZSB0aGlzIG9yZGVyIGFjcm9zcyB0aWxlIGJvdW5kYXJpZXMgdGhlc2Ugc3ltYm9scyBjYW4ndFxuICAgICAgICAgICAgLy8gYmUgZHJhd24gYWNyb3NzIHRpbGUgYm91bmRhcmllcy4gSW5zdGVhZCB0aGV5IG5lZWQgdG8gYmUgaW5jbHVkZWQgaW5cbiAgICAgICAgICAgIC8vIHRoZSBidWZmZXJzIGZvciBib3RoIHRpbGVzIGFuZCBjbGlwcGVkIHRvIHRpbGUgYm91bmRhcmllcyBhdCBkcmF3IHRpbWUuXG4gICAgICAgICAgICBjb25zdCBhZGRUb0J1ZmZlcnMgPSBpbnNpZGUgfHwgbWF5T3ZlcmxhcDtcbiAgICAgICAgICAgIHRoaXMuYWRkU3ltYm9sSW5zdGFuY2UoYW5jaG9yLCBsaW5lLCBzaGFwZWRUZXh0T3JpZW50YXRpb25zLCBzaGFwZWRJY29uLCB0aGlzLmxheWVyc1swXSxcbiAgICAgICAgICAgICAgICBhZGRUb0J1ZmZlcnMsIHRoaXMuc3ltYm9sSW5zdGFuY2VzQXJyYXkubGVuZ3RoLCB0aGlzLmNvbGxpc2lvbkJveEFycmF5LCBmZWF0dXJlLmluZGV4LCBmZWF0dXJlLnNvdXJjZUxheWVySW5kZXgsIHRoaXMuaW5kZXgsXG4gICAgICAgICAgICAgICAgdGV4dEJveFNjYWxlLCB0ZXh0UGFkZGluZywgdGV4dEFsb25nTGluZSxcbiAgICAgICAgICAgICAgICBpY29uQm94U2NhbGUsIGljb25QYWRkaW5nLCBpY29uQWxvbmdMaW5lLCB7em9vbTogdGhpcy56b29tfSwgZmVhdHVyZS5wcm9wZXJ0aWVzKTtcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoc3ltYm9sUGxhY2VtZW50ID09PSAnbGluZScpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBjbGlwTGluZShmZWF0dXJlLmdlb21ldHJ5LCAwLCAwLCBFWFRFTlQsIEVYVEVOVCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhbmNob3JzID0gZ2V0QW5jaG9ycyhcbiAgICAgICAgICAgICAgICAgICAgbGluZSxcbiAgICAgICAgICAgICAgICAgICAgc3ltYm9sTWluRGlzdGFuY2UsXG4gICAgICAgICAgICAgICAgICAgIHRleHRNYXhBbmdsZSxcbiAgICAgICAgICAgICAgICAgICAgc2hhcGVkVGV4dE9yaWVudGF0aW9uc1tXcml0aW5nTW9kZS52ZXJ0aWNhbF0gfHwgc2hhcGVkVGV4dE9yaWVudGF0aW9uc1tXcml0aW5nTW9kZS5ob3Jpem9udGFsXSxcbiAgICAgICAgICAgICAgICAgICAgc2hhcGVkSWNvbixcbiAgICAgICAgICAgICAgICAgICAgZ2x5cGhTaXplLFxuICAgICAgICAgICAgICAgICAgICB0ZXh0TWF4Qm94U2NhbGUsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3ZlcnNjYWxpbmcsXG4gICAgICAgICAgICAgICAgICAgIEVYVEVOVFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBhbmNob3Igb2YgYW5jaG9ycykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFwZWRUZXh0ID0gc2hhcGVkVGV4dE9yaWVudGF0aW9uc1tXcml0aW5nTW9kZS5ob3Jpem9udGFsXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzaGFwZWRUZXh0IHx8ICF0aGlzLmFuY2hvcklzVG9vQ2xvc2Uoc2hhcGVkVGV4dC50ZXh0LCB0ZXh0UmVwZWF0RGlzdGFuY2UsIGFuY2hvcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZFN5bWJvbEluc3RhbmNlKGxpbmUsIGFuY2hvcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZmVhdHVyZS50eXBlID09PSAnUG9seWdvbicpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcG9seWdvbiBvZiBjbGFzc2lmeVJpbmdzKGZlYXR1cmUuZ2VvbWV0cnksIDApKSB7XG4gICAgICAgICAgICAgICAgLy8gMTYgaGVyZSByZXByZXNlbnRzIDIgcGl4ZWxzXG4gICAgICAgICAgICAgICAgY29uc3QgcG9pID0gZmluZFBvbGVPZkluYWNjZXNzaWJpbGl0eShwb2x5Z29uLCAxNik7XG4gICAgICAgICAgICAgICAgYWRkU3ltYm9sSW5zdGFuY2UocG9seWdvblswXSwgbmV3IEFuY2hvcihwb2kueCwgcG9pLnksIDApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChmZWF0dXJlLnR5cGUgPT09ICdMaW5lU3RyaW5nJykge1xuICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvaXNzdWVzLzM4MDhcbiAgICAgICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBmZWF0dXJlLmdlb21ldHJ5KSB7XG4gICAgICAgICAgICAgICAgYWRkU3ltYm9sSW5zdGFuY2UobGluZSwgbmV3IEFuY2hvcihsaW5lWzBdLngsIGxpbmVbMF0ueSwgMCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGZlYXR1cmUudHlwZSA9PT0gJ1BvaW50Jykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBwb2ludHMgb2YgZmVhdHVyZS5nZW9tZXRyeSkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcG9pbnQgb2YgcG9pbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZFN5bWJvbEluc3RhbmNlKFtwb2ludF0sIG5ldyBBbmNob3IocG9pbnQueCwgcG9pbnQueSwgMCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFuY2hvcklzVG9vQ2xvc2UodGV4dCwgcmVwZWF0RGlzdGFuY2UsIGFuY2hvcikge1xuICAgICAgICBjb25zdCBjb21wYXJlVGV4dCA9IHRoaXMuY29tcGFyZVRleHQ7XG4gICAgICAgIGlmICghKHRleHQgaW4gY29tcGFyZVRleHQpKSB7XG4gICAgICAgICAgICBjb21wYXJlVGV4dFt0ZXh0XSA9IFtdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgb3RoZXJBbmNob3JzID0gY29tcGFyZVRleHRbdGV4dF07XG4gICAgICAgICAgICBmb3IgKGxldCBrID0gb3RoZXJBbmNob3JzLmxlbmd0aCAtIDE7IGsgPj0gMDsgay0tKSB7XG4gICAgICAgICAgICAgICAgaWYgKGFuY2hvci5kaXN0KG90aGVyQW5jaG9yc1trXSkgPCByZXBlYXREaXN0YW5jZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiBpdCdzIHdpdGhpbiByZXBlYXREaXN0YW5jZSBvZiBvbmUgYW5jaG9yLCBzdG9wIGxvb2tpbmdcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIElmIGFuY2hvciBpcyBub3Qgd2l0aGluIHJlcGVhdERpc3RhbmNlIG9mIGFueSBvdGhlciBhbmNob3IsIGFkZCB0byBhcnJheVxuICAgICAgICBjb21wYXJlVGV4dFt0ZXh0XS5wdXNoKGFuY2hvcik7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwbGFjZShjb2xsaXNpb25UaWxlLCBzaG93Q29sbGlzaW9uQm94ZXMpIHtcbiAgICAgICAgLy8gQ2FsY3VsYXRlIHdoaWNoIGxhYmVscyBjYW4gYmUgc2hvd24gYW5kIHdoZW4gdGhleSBjYW4gYmUgc2hvd24gYW5kXG4gICAgICAgIC8vIGNyZWF0ZSB0aGUgYnVmZXJzIHVzZWQgZm9yIHJlbmRlcmluZy5cblxuICAgICAgICB0aGlzLmNyZWF0ZUFycmF5cygpO1xuXG4gICAgICAgIGNvbnN0IGxheW91dCA9IHRoaXMubGF5ZXJzWzBdLmxheW91dDtcblxuICAgICAgICBjb25zdCBtYXhTY2FsZSA9IGNvbGxpc2lvblRpbGUubWF4U2NhbGU7XG5cbiAgICAgICAgY29uc3QgdGV4dEFsb25nTGluZSA9IGxheW91dFsndGV4dC1yb3RhdGlvbi1hbGlnbm1lbnQnXSA9PT0gJ21hcCcgJiYgbGF5b3V0WydzeW1ib2wtcGxhY2VtZW50J10gPT09ICdsaW5lJztcbiAgICAgICAgY29uc3QgaWNvbkFsb25nTGluZSA9IGxheW91dFsnaWNvbi1yb3RhdGlvbi1hbGlnbm1lbnQnXSA9PT0gJ21hcCcgJiYgbGF5b3V0WydzeW1ib2wtcGxhY2VtZW50J10gPT09ICdsaW5lJztcblxuICAgICAgICBjb25zdCBtYXlPdmVybGFwID0gbGF5b3V0Wyd0ZXh0LWFsbG93LW92ZXJsYXAnXSB8fCBsYXlvdXRbJ2ljb24tYWxsb3ctb3ZlcmxhcCddIHx8XG4gICAgICAgICAgICBsYXlvdXRbJ3RleHQtaWdub3JlLXBsYWNlbWVudCddIHx8IGxheW91dFsnaWNvbi1pZ25vcmUtcGxhY2VtZW50J107XG5cbiAgICAgICAgLy8gU29ydCBzeW1ib2xzIGJ5IHRoZWlyIHkgcG9zaXRpb24gb24gdGhlIGNhbnZhcyBzbyB0aGF0IHRoZSBsb3dlciBzeW1ib2xzXG4gICAgICAgIC8vIGFyZSBkcmF3biBvbiB0b3Agb2YgaGlnaGVyIHN5bWJvbHMuXG4gICAgICAgIC8vIERvbid0IHNvcnQgc3ltYm9scyB0aGF0IHdvbid0IG92ZXJsYXAgYmVjYXVzZSBpdCBpc24ndCBuZWNlc3NhcnkgYW5kXG4gICAgICAgIC8vIGJlY2F1c2UgaXQgY2F1c2VzIG1vcmUgbGFiZWxzIHRvIHBvcCBpbiBhbmQgb3V0IHdoZW4gcm90YXRpbmcuXG4gICAgICAgIGlmIChtYXlPdmVybGFwKSB7XG4gICAgICAgICAgICAvLyBPbmx5IG5lZWQgdGhlIHN5bWJvbCBpbnN0YW5jZXMgZnJvbSB0aGUgY3VycmVudCB0aWxlIHRvIHNvcnQsIHNvIGNvbnZlcnQgdGhvc2UgaW5zdGFuY2VzIGludG8gYW4gYXJyYXlcbiAgICAgICAgICAgIC8vIG9mIGBTdHJ1Y3RUeXBlYHMgdG8gZW5hYmxlIHNvcnRpbmdcbiAgICAgICAgICAgIGNvbnN0IHN5bWJvbEluc3RhbmNlc1N0cnVjdFR5cGVBcnJheSA9IHRoaXMuc3ltYm9sSW5zdGFuY2VzQXJyYXkudG9BcnJheSh0aGlzLnN5bWJvbEluc3RhbmNlc1N0YXJ0SW5kZXgsIHRoaXMuc3ltYm9sSW5zdGFuY2VzRW5kSW5kZXgpO1xuXG4gICAgICAgICAgICBjb25zdCBhbmdsZSA9IGNvbGxpc2lvblRpbGUuYW5nbGU7XG5cbiAgICAgICAgICAgIGNvbnN0IHNpbiA9IE1hdGguc2luKGFuZ2xlKSxcbiAgICAgICAgICAgICAgICBjb3MgPSBNYXRoLmNvcyhhbmdsZSk7XG5cbiAgICAgICAgICAgIHRoaXMuc29ydGVkU3ltYm9sSW5zdGFuY2VzID0gc3ltYm9sSW5zdGFuY2VzU3RydWN0VHlwZUFycmF5LnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBhUm90YXRlZCA9IChzaW4gKiBhLmFuY2hvclBvaW50WCArIGNvcyAqIGEuYW5jaG9yUG9pbnRZKSB8IDA7XG4gICAgICAgICAgICAgICAgY29uc3QgYlJvdGF0ZWQgPSAoc2luICogYi5hbmNob3JQb2ludFggKyBjb3MgKiBiLmFuY2hvclBvaW50WSkgfCAwO1xuICAgICAgICAgICAgICAgIHJldHVybiAoYVJvdGF0ZWQgLSBiUm90YXRlZCkgfHwgKGIuaW5kZXggLSBhLmluZGV4KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgcCA9IHRoaXMuc3ltYm9sSW5zdGFuY2VzU3RhcnRJbmRleDsgcCA8IHRoaXMuc3ltYm9sSW5zdGFuY2VzRW5kSW5kZXg7IHArKykge1xuICAgICAgICAgICAgY29uc3Qgc3ltYm9sSW5zdGFuY2UgPSB0aGlzLnNvcnRlZFN5bWJvbEluc3RhbmNlcyA/IHRoaXMuc29ydGVkU3ltYm9sSW5zdGFuY2VzW3AgLSB0aGlzLnN5bWJvbEluc3RhbmNlc1N0YXJ0SW5kZXhdIDogdGhpcy5zeW1ib2xJbnN0YW5jZXNBcnJheS5nZXQocCk7XG4gICAgICAgICAgICBjb25zdCB0ZXh0Q29sbGlzaW9uRmVhdHVyZSA9IHtcbiAgICAgICAgICAgICAgICBib3hTdGFydEluZGV4OiBzeW1ib2xJbnN0YW5jZS50ZXh0Qm94U3RhcnRJbmRleCxcbiAgICAgICAgICAgICAgICBib3hFbmRJbmRleDogc3ltYm9sSW5zdGFuY2UudGV4dEJveEVuZEluZGV4XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgaWNvbkNvbGxpc2lvbkZlYXR1cmUgPSB7XG4gICAgICAgICAgICAgICAgYm94U3RhcnRJbmRleDogc3ltYm9sSW5zdGFuY2UuaWNvbkJveFN0YXJ0SW5kZXgsXG4gICAgICAgICAgICAgICAgYm94RW5kSW5kZXg6IHN5bWJvbEluc3RhbmNlLmljb25Cb3hFbmRJbmRleFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgY29uc3QgaGFzVGV4dCA9ICEoc3ltYm9sSW5zdGFuY2UudGV4dEJveFN0YXJ0SW5kZXggPT09IHN5bWJvbEluc3RhbmNlLnRleHRCb3hFbmRJbmRleCk7XG4gICAgICAgICAgICBjb25zdCBoYXNJY29uID0gIShzeW1ib2xJbnN0YW5jZS5pY29uQm94U3RhcnRJbmRleCA9PT0gc3ltYm9sSW5zdGFuY2UuaWNvbkJveEVuZEluZGV4KTtcblxuICAgICAgICAgICAgY29uc3QgaWNvbldpdGhvdXRUZXh0ID0gbGF5b3V0Wyd0ZXh0LW9wdGlvbmFsJ10gfHwgIWhhc1RleHQsXG4gICAgICAgICAgICAgICAgdGV4dFdpdGhvdXRJY29uID0gbGF5b3V0WydpY29uLW9wdGlvbmFsJ10gfHwgIWhhc0ljb247XG5cblxuICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBzY2FsZXMgYXQgd2hpY2ggdGhlIHRleHQgYW5kIGljb24gY2FuIGJlIHBsYWNlZCB3aXRob3V0IGNvbGxpc2lvbi5cblxuICAgICAgICAgICAgbGV0IGdseXBoU2NhbGUgPSBoYXNUZXh0ID9cbiAgICAgICAgICAgICAgICBjb2xsaXNpb25UaWxlLnBsYWNlQ29sbGlzaW9uRmVhdHVyZSh0ZXh0Q29sbGlzaW9uRmVhdHVyZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dFsndGV4dC1hbGxvdy1vdmVybGFwJ10sIGxheW91dFsnc3ltYm9sLWF2b2lkLWVkZ2VzJ10pIDpcbiAgICAgICAgICAgICAgICBjb2xsaXNpb25UaWxlLm1pblNjYWxlO1xuXG4gICAgICAgICAgICBsZXQgaWNvblNjYWxlID0gaGFzSWNvbiA/XG4gICAgICAgICAgICAgICAgY29sbGlzaW9uVGlsZS5wbGFjZUNvbGxpc2lvbkZlYXR1cmUoaWNvbkNvbGxpc2lvbkZlYXR1cmUsXG4gICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXRbJ2ljb24tYWxsb3ctb3ZlcmxhcCddLCBsYXlvdXRbJ3N5bWJvbC1hdm9pZC1lZGdlcyddKSA6XG4gICAgICAgICAgICAgICAgY29sbGlzaW9uVGlsZS5taW5TY2FsZTtcblxuXG4gICAgICAgICAgICAvLyBDb21iaW5lIHRoZSBzY2FsZXMgZm9yIGljb25zIGFuZCB0ZXh0LlxuXG4gICAgICAgICAgICBpZiAoIWljb25XaXRob3V0VGV4dCAmJiAhdGV4dFdpdGhvdXRJY29uKSB7XG4gICAgICAgICAgICAgICAgaWNvblNjYWxlID0gZ2x5cGhTY2FsZSA9IE1hdGgubWF4KGljb25TY2FsZSwgZ2x5cGhTY2FsZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCF0ZXh0V2l0aG91dEljb24gJiYgZ2x5cGhTY2FsZSkge1xuICAgICAgICAgICAgICAgIGdseXBoU2NhbGUgPSBNYXRoLm1heChpY29uU2NhbGUsIGdseXBoU2NhbGUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghaWNvbldpdGhvdXRUZXh0ICYmIGljb25TY2FsZSkge1xuICAgICAgICAgICAgICAgIGljb25TY2FsZSA9IE1hdGgubWF4KGljb25TY2FsZSwgZ2x5cGhTY2FsZSk7XG4gICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgLy8gSW5zZXJ0IGZpbmFsIHBsYWNlbWVudCBpbnRvIGNvbGxpc2lvbiB0cmVlIGFuZCBhZGQgZ2x5cGhzL2ljb25zIHRvIGJ1ZmZlcnNcblxuICAgICAgICAgICAgaWYgKGhhc1RleHQpIHtcbiAgICAgICAgICAgICAgICBjb2xsaXNpb25UaWxlLmluc2VydENvbGxpc2lvbkZlYXR1cmUodGV4dENvbGxpc2lvbkZlYXR1cmUsIGdseXBoU2NhbGUsIGxheW91dFsndGV4dC1pZ25vcmUtcGxhY2VtZW50J10pO1xuICAgICAgICAgICAgICAgIGlmIChnbHlwaFNjYWxlIDw9IG1heFNjYWxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkU3ltYm9scyh0aGlzLmFycmF5cy5nbHlwaCwgc3ltYm9sSW5zdGFuY2UuZ2x5cGhRdWFkU3RhcnRJbmRleCwgc3ltYm9sSW5zdGFuY2UuZ2x5cGhRdWFkRW5kSW5kZXgsIGdseXBoU2NhbGUsIGxheW91dFsndGV4dC1rZWVwLXVwcmlnaHQnXSwgdGV4dEFsb25nTGluZSwgY29sbGlzaW9uVGlsZS5hbmdsZSwgc3ltYm9sSW5zdGFuY2Uud3JpdGluZ01vZGVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChoYXNJY29uKSB7XG4gICAgICAgICAgICAgICAgY29sbGlzaW9uVGlsZS5pbnNlcnRDb2xsaXNpb25GZWF0dXJlKGljb25Db2xsaXNpb25GZWF0dXJlLCBpY29uU2NhbGUsIGxheW91dFsnaWNvbi1pZ25vcmUtcGxhY2VtZW50J10pO1xuICAgICAgICAgICAgICAgIGlmIChpY29uU2NhbGUgPD0gbWF4U2NhbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRTeW1ib2xzKHRoaXMuYXJyYXlzLmljb24sIHN5bWJvbEluc3RhbmNlLmljb25RdWFkU3RhcnRJbmRleCwgc3ltYm9sSW5zdGFuY2UuaWNvblF1YWRFbmRJbmRleCwgaWNvblNjYWxlLCBsYXlvdXRbJ2ljb24ta2VlcC11cHJpZ2h0J10sIGljb25BbG9uZ0xpbmUsIGNvbGxpc2lvblRpbGUuYW5nbGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNob3dDb2xsaXNpb25Cb3hlcykgdGhpcy5hZGRUb0RlYnVnQnVmZmVycyhjb2xsaXNpb25UaWxlKTtcbiAgICB9XG5cbiAgICBhZGRTeW1ib2xzKGFycmF5cywgcXVhZHNTdGFydCwgcXVhZHNFbmQsIHNjYWxlLCBrZWVwVXByaWdodCwgYWxvbmdMaW5lLCBwbGFjZW1lbnRBbmdsZSwgd3JpdGluZ01vZGVzKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRBcnJheSA9IGFycmF5cy5lbGVtZW50QXJyYXk7XG4gICAgICAgIGNvbnN0IGxheW91dFZlcnRleEFycmF5ID0gYXJyYXlzLmxheW91dFZlcnRleEFycmF5O1xuXG4gICAgICAgIGNvbnN0IHpvb20gPSB0aGlzLnpvb207XG4gICAgICAgIGNvbnN0IHBsYWNlbWVudFpvb20gPSBNYXRoLm1heChNYXRoLmxvZyhzY2FsZSkgLyBNYXRoLkxOMiArIHpvb20sIDApO1xuXG4gICAgICAgIGZvciAobGV0IGsgPSBxdWFkc1N0YXJ0OyBrIDwgcXVhZHNFbmQ7IGsrKykge1xuXG4gICAgICAgICAgICBjb25zdCBzeW1ib2wgPSB0aGlzLnN5bWJvbFF1YWRzQXJyYXkuZ2V0KGspLlN5bWJvbFF1YWQ7XG5cbiAgICAgICAgICAgIC8vIGRyb3AgaW5jb3JyZWN0bHkgb3JpZW50ZWQgZ2x5cGhzXG4gICAgICAgICAgICBjb25zdCBhID0gKHN5bWJvbC5hbmNob3JBbmdsZSArIHBsYWNlbWVudEFuZ2xlICsgTWF0aC5QSSkgJSAoTWF0aC5QSSAqIDIpO1xuICAgICAgICAgICAgaWYgKHdyaXRpbmdNb2RlcyAmIFdyaXRpbmdNb2RlLnZlcnRpY2FsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGFsb25nTGluZSAmJiBzeW1ib2wud3JpdGluZ01vZGUgPT09IFdyaXRpbmdNb2RlLnZlcnRpY2FsKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChrZWVwVXByaWdodCAmJiBhbG9uZ0xpbmUgJiYgYSA8PSAoTWF0aC5QSSAqIDUgLyA0KSB8fCBhID4gKE1hdGguUEkgKiA3IC8gNCkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2VlcFVwcmlnaHQgJiYgYWxvbmdMaW5lICYmIGEgPD0gKE1hdGguUEkgKiAzIC8gNCkgfHwgYSA+IChNYXRoLlBJICogNSAvIDQpKSBjb250aW51ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoa2VlcFVwcmlnaHQgJiYgYWxvbmdMaW5lICYmIChhIDw9IE1hdGguUEkgLyAyIHx8IGEgPiBNYXRoLlBJICogMyAvIDIpKSBjb250aW51ZTtcblxuICAgICAgICAgICAgY29uc3QgdGwgPSBzeW1ib2wudGwsXG4gICAgICAgICAgICAgICAgdHIgPSBzeW1ib2wudHIsXG4gICAgICAgICAgICAgICAgYmwgPSBzeW1ib2wuYmwsXG4gICAgICAgICAgICAgICAgYnIgPSBzeW1ib2wuYnIsXG4gICAgICAgICAgICAgICAgdGV4ID0gc3ltYm9sLnRleCxcbiAgICAgICAgICAgICAgICBhbmNob3JQb2ludCA9IHN5bWJvbC5hbmNob3JQb2ludDtcblxuICAgICAgICAgICAgbGV0IG1pblpvb20gPSBNYXRoLm1heCh6b29tICsgTWF0aC5sb2coc3ltYm9sLm1pblNjYWxlKSAvIE1hdGguTE4yLCBwbGFjZW1lbnRab29tKTtcbiAgICAgICAgICAgIGNvbnN0IG1heFpvb20gPSBNYXRoLm1pbih6b29tICsgTWF0aC5sb2coc3ltYm9sLm1heFNjYWxlKSAvIE1hdGguTE4yLCAyNSk7XG5cbiAgICAgICAgICAgIGlmIChtYXhab29tIDw9IG1pblpvb20pIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAvLyBMb3dlciBtaW4gem9vbSBzbyB0aGF0IHdoaWxlIGZhZGluZyBvdXQgdGhlIGxhYmVsIGl0IGNhbiBiZSBzaG93biBvdXRzaWRlIG9mIGNvbGxpc2lvbi1mcmVlIHpvb20gbGV2ZWxzXG4gICAgICAgICAgICBpZiAobWluWm9vbSA9PT0gcGxhY2VtZW50Wm9vbSkgbWluWm9vbSA9IDA7XG5cbiAgICAgICAgICAgIC8vIEVuY29kZSBhbmdsZSBvZiBnbHlwaFxuICAgICAgICAgICAgY29uc3QgZ2x5cGhBbmdsZSA9IE1hdGgucm91bmQoKHN5bWJvbC5nbHlwaEFuZ2xlIC8gKE1hdGguUEkgKiAyKSkgKiAyNTYpO1xuXG4gICAgICAgICAgICBjb25zdCBzZWdtZW50ID0gYXJyYXlzLnByZXBhcmVTZWdtZW50KDQpO1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBzZWdtZW50LnZlcnRleExlbmd0aDtcblxuICAgICAgICAgICAgYWRkVmVydGV4KGxheW91dFZlcnRleEFycmF5LCBhbmNob3JQb2ludC54LCBhbmNob3JQb2ludC55LCB0bC54LCB0bC55LCB0ZXgueCwgdGV4LnksIG1pblpvb20sIG1heFpvb20sIHBsYWNlbWVudFpvb20sIGdseXBoQW5nbGUpO1xuICAgICAgICAgICAgYWRkVmVydGV4KGxheW91dFZlcnRleEFycmF5LCBhbmNob3JQb2ludC54LCBhbmNob3JQb2ludC55LCB0ci54LCB0ci55LCB0ZXgueCArIHRleC53LCB0ZXgueSwgbWluWm9vbSwgbWF4Wm9vbSwgcGxhY2VtZW50Wm9vbSwgZ2x5cGhBbmdsZSk7XG4gICAgICAgICAgICBhZGRWZXJ0ZXgobGF5b3V0VmVydGV4QXJyYXksIGFuY2hvclBvaW50LngsIGFuY2hvclBvaW50LnksIGJsLngsIGJsLnksIHRleC54LCB0ZXgueSArIHRleC5oLCBtaW5ab29tLCBtYXhab29tLCBwbGFjZW1lbnRab29tLCBnbHlwaEFuZ2xlKTtcbiAgICAgICAgICAgIGFkZFZlcnRleChsYXlvdXRWZXJ0ZXhBcnJheSwgYW5jaG9yUG9pbnQueCwgYW5jaG9yUG9pbnQueSwgYnIueCwgYnIueSwgdGV4LnggKyB0ZXgudywgdGV4LnkgKyB0ZXguaCwgbWluWm9vbSwgbWF4Wm9vbSwgcGxhY2VtZW50Wm9vbSwgZ2x5cGhBbmdsZSk7XG5cbiAgICAgICAgICAgIGVsZW1lbnRBcnJheS5lbXBsYWNlQmFjayhpbmRleCwgaW5kZXggKyAxLCBpbmRleCArIDIpO1xuICAgICAgICAgICAgZWxlbWVudEFycmF5LmVtcGxhY2VCYWNrKGluZGV4ICsgMSwgaW5kZXggKyAyLCBpbmRleCArIDMpO1xuXG4gICAgICAgICAgICBzZWdtZW50LnZlcnRleExlbmd0aCArPSA0O1xuICAgICAgICAgICAgc2VnbWVudC5wcmltaXRpdmVMZW5ndGggKz0gMjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFkZFRvRGVidWdCdWZmZXJzKGNvbGxpc2lvblRpbGUpIHtcbiAgICAgICAgY29uc3QgYXJyYXlzID0gdGhpcy5hcnJheXMuY29sbGlzaW9uQm94O1xuICAgICAgICBjb25zdCBsYXlvdXRWZXJ0ZXhBcnJheSA9IGFycmF5cy5sYXlvdXRWZXJ0ZXhBcnJheTtcbiAgICAgICAgY29uc3QgZWxlbWVudEFycmF5ID0gYXJyYXlzLmVsZW1lbnRBcnJheTtcblxuICAgICAgICBjb25zdCBhbmdsZSA9IC1jb2xsaXNpb25UaWxlLmFuZ2xlO1xuICAgICAgICBjb25zdCB5U3RyZXRjaCA9IGNvbGxpc2lvblRpbGUueVN0cmV0Y2g7XG5cbiAgICAgICAgZm9yIChsZXQgaiA9IHRoaXMuc3ltYm9sSW5zdGFuY2VzU3RhcnRJbmRleDsgaiA8IHRoaXMuc3ltYm9sSW5zdGFuY2VzRW5kSW5kZXg7IGorKykge1xuICAgICAgICAgICAgY29uc3Qgc3ltYm9sSW5zdGFuY2UgPSB0aGlzLnN5bWJvbEluc3RhbmNlc0FycmF5LmdldChqKTtcbiAgICAgICAgICAgIHN5bWJvbEluc3RhbmNlLnRleHRDb2xsaXNpb25GZWF0dXJlID0ge2JveFN0YXJ0SW5kZXg6IHN5bWJvbEluc3RhbmNlLnRleHRCb3hTdGFydEluZGV4LCBib3hFbmRJbmRleDogc3ltYm9sSW5zdGFuY2UudGV4dEJveEVuZEluZGV4fTtcbiAgICAgICAgICAgIHN5bWJvbEluc3RhbmNlLmljb25Db2xsaXNpb25GZWF0dXJlID0ge2JveFN0YXJ0SW5kZXg6IHN5bWJvbEluc3RhbmNlLmljb25Cb3hTdGFydEluZGV4LCBib3hFbmRJbmRleDogc3ltYm9sSW5zdGFuY2UuaWNvbkJveEVuZEluZGV4fTtcblxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAyOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmZWF0dXJlID0gc3ltYm9sSW5zdGFuY2VbaSA9PT0gMCA/ICd0ZXh0Q29sbGlzaW9uRmVhdHVyZScgOiAnaWNvbkNvbGxpc2lvbkZlYXR1cmUnXTtcbiAgICAgICAgICAgICAgICBpZiAoIWZlYXR1cmUpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgYiA9IGZlYXR1cmUuYm94U3RhcnRJbmRleDsgYiA8IGZlYXR1cmUuYm94RW5kSW5kZXg7IGIrKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBib3ggPSB0aGlzLmNvbGxpc2lvbkJveEFycmF5LmdldChiKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5jaG9yUG9pbnQgPSBib3guYW5jaG9yUG9pbnQ7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGwgPSBuZXcgUG9pbnQoYm94LngxLCBib3gueTEgKiB5U3RyZXRjaCkuX3JvdGF0ZShhbmdsZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRyID0gbmV3IFBvaW50KGJveC54MiwgYm94LnkxICogeVN0cmV0Y2gpLl9yb3RhdGUoYW5nbGUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBibCA9IG5ldyBQb2ludChib3gueDEsIGJveC55MiAqIHlTdHJldGNoKS5fcm90YXRlKGFuZ2xlKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYnIgPSBuZXcgUG9pbnQoYm94LngyLCBib3gueTIgKiB5U3RyZXRjaCkuX3JvdGF0ZShhbmdsZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF4Wm9vbSA9IE1hdGgubWF4KDAsIE1hdGgubWluKDI1LCB0aGlzLnpvb20gKyBNYXRoLmxvZyhib3gubWF4U2NhbGUpIC8gTWF0aC5MTjIpKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGxhY2VtZW50Wm9vbSA9IE1hdGgubWF4KDAsIE1hdGgubWluKDI1LCB0aGlzLnpvb20gKyBNYXRoLmxvZyhib3gucGxhY2VtZW50U2NhbGUpIC8gTWF0aC5MTjIpKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWdtZW50ID0gYXJyYXlzLnByZXBhcmVTZWdtZW50KDQpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IHNlZ21lbnQudmVydGV4TGVuZ3RoO1xuXG4gICAgICAgICAgICAgICAgICAgIGFkZENvbGxpc2lvbkJveFZlcnRleChsYXlvdXRWZXJ0ZXhBcnJheSwgYW5jaG9yUG9pbnQsIHRsLCBtYXhab29tLCBwbGFjZW1lbnRab29tKTtcbiAgICAgICAgICAgICAgICAgICAgYWRkQ29sbGlzaW9uQm94VmVydGV4KGxheW91dFZlcnRleEFycmF5LCBhbmNob3JQb2ludCwgdHIsIG1heFpvb20sIHBsYWNlbWVudFpvb20pO1xuICAgICAgICAgICAgICAgICAgICBhZGRDb2xsaXNpb25Cb3hWZXJ0ZXgobGF5b3V0VmVydGV4QXJyYXksIGFuY2hvclBvaW50LCBiciwgbWF4Wm9vbSwgcGxhY2VtZW50Wm9vbSk7XG4gICAgICAgICAgICAgICAgICAgIGFkZENvbGxpc2lvbkJveFZlcnRleChsYXlvdXRWZXJ0ZXhBcnJheSwgYW5jaG9yUG9pbnQsIGJsLCBtYXhab29tLCBwbGFjZW1lbnRab29tKTtcblxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50QXJyYXkuZW1wbGFjZUJhY2soaW5kZXgsIGluZGV4ICsgMSk7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRBcnJheS5lbXBsYWNlQmFjayhpbmRleCArIDEsIGluZGV4ICsgMik7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRBcnJheS5lbXBsYWNlQmFjayhpbmRleCArIDIsIGluZGV4ICsgMyk7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRBcnJheS5lbXBsYWNlQmFjayhpbmRleCArIDMsIGluZGV4KTtcblxuICAgICAgICAgICAgICAgICAgICBzZWdtZW50LnZlcnRleExlbmd0aCArPSA0O1xuICAgICAgICAgICAgICAgICAgICBzZWdtZW50LnByaW1pdGl2ZUxlbmd0aCArPSA0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFkZFN5bWJvbEluc3RhbmNlKGFuY2hvciwgbGluZSwgc2hhcGVkVGV4dE9yaWVudGF0aW9ucywgc2hhcGVkSWNvbiwgbGF5ZXIsIGFkZFRvQnVmZmVycywgaW5kZXgsIGNvbGxpc2lvbkJveEFycmF5LCBmZWF0dXJlSW5kZXgsIHNvdXJjZUxheWVySW5kZXgsIGJ1Y2tldEluZGV4LFxuICAgICAgICB0ZXh0Qm94U2NhbGUsIHRleHRQYWRkaW5nLCB0ZXh0QWxvbmdMaW5lLFxuICAgICAgICBpY29uQm94U2NhbGUsIGljb25QYWRkaW5nLCBpY29uQWxvbmdMaW5lLCBnbG9iYWxQcm9wZXJ0aWVzLCBmZWF0dXJlUHJvcGVydGllcykge1xuXG4gICAgICAgIGxldCB0ZXh0Q29sbGlzaW9uRmVhdHVyZSwgaWNvbkNvbGxpc2lvbkZlYXR1cmUsIGljb25RdWFkcztcbiAgICAgICAgbGV0IGdseXBoUXVhZHMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCB3cml0aW5nTW9kZVN0cmluZyBpbiBzaGFwZWRUZXh0T3JpZW50YXRpb25zKSB7XG4gICAgICAgICAgICBjb25zdCB3cml0aW5nTW9kZSA9IHBhcnNlSW50KHdyaXRpbmdNb2RlU3RyaW5nLCAxMCk7XG4gICAgICAgICAgICBpZiAoIXNoYXBlZFRleHRPcmllbnRhdGlvbnNbd3JpdGluZ01vZGVdKSBjb250aW51ZTtcbiAgICAgICAgICAgIGdseXBoUXVhZHMgPSBnbHlwaFF1YWRzLmNvbmNhdChhZGRUb0J1ZmZlcnMgPyBnZXRHbHlwaFF1YWRzKGFuY2hvciwgc2hhcGVkVGV4dE9yaWVudGF0aW9uc1t3cml0aW5nTW9kZV0sIHRleHRCb3hTY2FsZSwgbGluZSwgbGF5ZXIsIHRleHRBbG9uZ0xpbmUsIHdyaXRpbmdNb2RlKSA6IFtdKTtcbiAgICAgICAgICAgIHRleHRDb2xsaXNpb25GZWF0dXJlID0gbmV3IENvbGxpc2lvbkZlYXR1cmUoY29sbGlzaW9uQm94QXJyYXksIGxpbmUsIGFuY2hvciwgZmVhdHVyZUluZGV4LCBzb3VyY2VMYXllckluZGV4LCBidWNrZXRJbmRleCwgc2hhcGVkVGV4dE9yaWVudGF0aW9uc1t3cml0aW5nTW9kZV0sIHRleHRCb3hTY2FsZSwgdGV4dFBhZGRpbmcsIHRleHRBbG9uZ0xpbmUsIGZhbHNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGdseXBoUXVhZFN0YXJ0SW5kZXggPSB0aGlzLnN5bWJvbFF1YWRzQXJyYXkubGVuZ3RoO1xuICAgICAgICBpZiAoZ2x5cGhRdWFkcyAmJiBnbHlwaFF1YWRzLmxlbmd0aCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBnbHlwaFF1YWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRTeW1ib2xRdWFkKGdseXBoUXVhZHNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGdseXBoUXVhZEVuZEluZGV4ID0gdGhpcy5zeW1ib2xRdWFkc0FycmF5Lmxlbmd0aDtcblxuICAgICAgICBjb25zdCB0ZXh0Qm94U3RhcnRJbmRleCA9IHRleHRDb2xsaXNpb25GZWF0dXJlID8gdGV4dENvbGxpc2lvbkZlYXR1cmUuYm94U3RhcnRJbmRleCA6IHRoaXMuY29sbGlzaW9uQm94QXJyYXkubGVuZ3RoO1xuICAgICAgICBjb25zdCB0ZXh0Qm94RW5kSW5kZXggPSB0ZXh0Q29sbGlzaW9uRmVhdHVyZSA/IHRleHRDb2xsaXNpb25GZWF0dXJlLmJveEVuZEluZGV4IDogdGhpcy5jb2xsaXNpb25Cb3hBcnJheS5sZW5ndGg7XG5cbiAgICAgICAgaWYgKHNoYXBlZEljb24pIHtcbiAgICAgICAgICAgIGljb25RdWFkcyA9IGFkZFRvQnVmZmVycyA/IGdldEljb25RdWFkcyhhbmNob3IsIHNoYXBlZEljb24sIGljb25Cb3hTY2FsZSwgbGluZSwgbGF5ZXIsIGljb25BbG9uZ0xpbmUsIHNoYXBlZFRleHRPcmllbnRhdGlvbnNbV3JpdGluZ01vZGUuaG9yaXpvbnRhbF0sIGdsb2JhbFByb3BlcnRpZXMsIGZlYXR1cmVQcm9wZXJ0aWVzKSA6IFtdO1xuICAgICAgICAgICAgaWNvbkNvbGxpc2lvbkZlYXR1cmUgPSBuZXcgQ29sbGlzaW9uRmVhdHVyZShjb2xsaXNpb25Cb3hBcnJheSwgbGluZSwgYW5jaG9yLCBmZWF0dXJlSW5kZXgsIHNvdXJjZUxheWVySW5kZXgsIGJ1Y2tldEluZGV4LCBzaGFwZWRJY29uLCBpY29uQm94U2NhbGUsIGljb25QYWRkaW5nLCBpY29uQWxvbmdMaW5lLCB0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGljb25RdWFkU3RhcnRJbmRleCA9IHRoaXMuc3ltYm9sUXVhZHNBcnJheS5sZW5ndGg7XG4gICAgICAgIGlmIChpY29uUXVhZHMgJiYgaWNvblF1YWRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgdGhpcy5hZGRTeW1ib2xRdWFkKGljb25RdWFkc1swXSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaWNvblF1YWRFbmRJbmRleCA9IHRoaXMuc3ltYm9sUXVhZHNBcnJheS5sZW5ndGg7XG5cbiAgICAgICAgY29uc3QgaWNvbkJveFN0YXJ0SW5kZXggPSBpY29uQ29sbGlzaW9uRmVhdHVyZSA/IGljb25Db2xsaXNpb25GZWF0dXJlLmJveFN0YXJ0SW5kZXggOiB0aGlzLmNvbGxpc2lvbkJveEFycmF5Lmxlbmd0aDtcbiAgICAgICAgY29uc3QgaWNvbkJveEVuZEluZGV4ID0gaWNvbkNvbGxpc2lvbkZlYXR1cmUgPyBpY29uQ29sbGlzaW9uRmVhdHVyZS5ib3hFbmRJbmRleCA6IHRoaXMuY29sbGlzaW9uQm94QXJyYXkubGVuZ3RoO1xuICAgICAgICBpZiAoaWNvblF1YWRFbmRJbmRleCA+IFN5bWJvbEJ1Y2tldC5NQVhfUVVBRFMpIHV0aWwud2Fybk9uY2UoXCJUb28gbWFueSBzeW1ib2xzIGJlaW5nIHJlbmRlcmVkIGluIGEgdGlsZS4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWpzL2lzc3Vlcy8yOTA3XCIpO1xuICAgICAgICBpZiAoZ2x5cGhRdWFkRW5kSW5kZXggPiBTeW1ib2xCdWNrZXQuTUFYX1FVQURTKSB1dGlsLndhcm5PbmNlKFwiVG9vIG1hbnkgZ2x5cGhzIGJlaW5nIHJlbmRlcmVkIGluIGEgdGlsZS4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWpzL2lzc3Vlcy8yOTA3XCIpO1xuXG4gICAgICAgIGNvbnN0IHdyaXRpbmdNb2RlcyA9IChcbiAgICAgICAgICAgIChzaGFwZWRUZXh0T3JpZW50YXRpb25zW1dyaXRpbmdNb2RlLnZlcnRpY2FsXSA/IFdyaXRpbmdNb2RlLnZlcnRpY2FsIDogMCkgfFxuICAgICAgICAgICAgKHNoYXBlZFRleHRPcmllbnRhdGlvbnNbV3JpdGluZ01vZGUuaG9yaXpvbnRhbF0gPyBXcml0aW5nTW9kZS5ob3Jpem9udGFsIDogMClcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xJbnN0YW5jZXNBcnJheS5lbXBsYWNlQmFjayhcbiAgICAgICAgICAgIHRleHRCb3hTdGFydEluZGV4LFxuICAgICAgICAgICAgdGV4dEJveEVuZEluZGV4LFxuICAgICAgICAgICAgaWNvbkJveFN0YXJ0SW5kZXgsXG4gICAgICAgICAgICBpY29uQm94RW5kSW5kZXgsXG4gICAgICAgICAgICBnbHlwaFF1YWRTdGFydEluZGV4LFxuICAgICAgICAgICAgZ2x5cGhRdWFkRW5kSW5kZXgsXG4gICAgICAgICAgICBpY29uUXVhZFN0YXJ0SW5kZXgsXG4gICAgICAgICAgICBpY29uUXVhZEVuZEluZGV4LFxuICAgICAgICAgICAgYW5jaG9yLngsXG4gICAgICAgICAgICBhbmNob3IueSxcbiAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgd3JpdGluZ01vZGVzXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgYWRkU3ltYm9sUXVhZChzeW1ib2xRdWFkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bWJvbFF1YWRzQXJyYXkuZW1wbGFjZUJhY2soXG4gICAgICAgICAgICAvLyBhbmNob3JQb2ludHNcbiAgICAgICAgICAgIHN5bWJvbFF1YWQuYW5jaG9yUG9pbnQueCxcbiAgICAgICAgICAgIHN5bWJvbFF1YWQuYW5jaG9yUG9pbnQueSxcbiAgICAgICAgICAgIC8vIGNvcm5lcnNcbiAgICAgICAgICAgIHN5bWJvbFF1YWQudGwueCxcbiAgICAgICAgICAgIHN5bWJvbFF1YWQudGwueSxcbiAgICAgICAgICAgIHN5bWJvbFF1YWQudHIueCxcbiAgICAgICAgICAgIHN5bWJvbFF1YWQudHIueSxcbiAgICAgICAgICAgIHN5bWJvbFF1YWQuYmwueCxcbiAgICAgICAgICAgIHN5bWJvbFF1YWQuYmwueSxcbiAgICAgICAgICAgIHN5bWJvbFF1YWQuYnIueCxcbiAgICAgICAgICAgIHN5bWJvbFF1YWQuYnIueSxcbiAgICAgICAgICAgIC8vIHRleHR1cmVcbiAgICAgICAgICAgIHN5bWJvbFF1YWQudGV4LmgsXG4gICAgICAgICAgICBzeW1ib2xRdWFkLnRleC53LFxuICAgICAgICAgICAgc3ltYm9sUXVhZC50ZXgueCxcbiAgICAgICAgICAgIHN5bWJvbFF1YWQudGV4LnksXG4gICAgICAgICAgICAvL2FuZ2xlXG4gICAgICAgICAgICBzeW1ib2xRdWFkLmFuY2hvckFuZ2xlLFxuICAgICAgICAgICAgc3ltYm9sUXVhZC5nbHlwaEFuZ2xlLFxuICAgICAgICAgICAgLy8gc2NhbGVzXG4gICAgICAgICAgICBzeW1ib2xRdWFkLm1heFNjYWxlLFxuICAgICAgICAgICAgc3ltYm9sUXVhZC5taW5TY2FsZSxcbiAgICAgICAgICAgIC8vIHdyaXRpbmcgbW9kZVxuICAgICAgICAgICAgc3ltYm9sUXVhZC53cml0aW5nTW9kZSk7XG4gICAgfVxufVxuXG4vLyB0aGlzIGNvbnN0YW50IGlzIGJhc2VkIG9uIHRoZSBzaXplIG9mIHRoZSBnbHlwaFF1YWRFbmRJbmRleCBhbmQgaWNvblF1YWRFbmRJbmRleFxuLy8gaW4gdGhlIHN5bWJvbF9pbnN0YW5jZXMgU3RydWN0QXJyYXlUeXBlXG4vLyBlZyB0aGUgbWF4IHZhbGlkIFVJbnQxNiBpcyA2NSw1MzVcblN5bWJvbEJ1Y2tldC5NQVhfUVVBRFMgPSA2NTUzNTtcblxubW9kdWxlLmV4cG9ydHMgPSBTeW1ib2xCdWNrZXQ7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQGVudW0ge3N0cmluZ30gQXR0cmlidXRlVHlwZVxuICogQHByaXZhdGVcbiAqIEByZWFkb25seVxuICovXG5jb25zdCBBdHRyaWJ1dGVUeXBlID0ge1xuICAgIEludDg6ICAgJ0JZVEUnLFxuICAgIFVpbnQ4OiAgJ1VOU0lHTkVEX0JZVEUnLFxuICAgIEludDE2OiAgJ1NIT1JUJyxcbiAgICBVaW50MTY6ICdVTlNJR05FRF9TSE9SVCdcbn07XG5cbi8qKlxuICogVGhlIGBCdWZmZXJgIGNsYXNzIHR1cm5zIGEgYFN0cnVjdEFycmF5YCBpbnRvIGEgV2ViR0wgYnVmZmVyLiBFYWNoIG1lbWJlciBvZiB0aGUgU3RydWN0QXJyYXknc1xuICogU3RydWN0IHR5cGUgaXMgY29udmVydGVkIHRvIGEgV2ViR0wgYXRyaWJ1dGUuXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBCdWZmZXIge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBhcnJheSBBIHNlcmlhbGl6ZWQgU3RydWN0QXJyYXkuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGFycmF5VHlwZSBBIHNlcmlhbGl6ZWQgU3RydWN0QXJyYXlUeXBlLlxuICAgICAqIEBwYXJhbSB7QnVmZmVyVHlwZX0gdHlwZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGFycmF5LCBhcnJheVR5cGUsIHR5cGUpIHtcbiAgICAgICAgdGhpcy5hcnJheUJ1ZmZlciA9IGFycmF5LmFycmF5QnVmZmVyO1xuICAgICAgICB0aGlzLmxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVzID0gYXJyYXlUeXBlLm1lbWJlcnM7XG4gICAgICAgIHRoaXMuaXRlbVNpemUgPSBhcnJheVR5cGUuYnl0ZXNQZXJFbGVtZW50O1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLmFycmF5VHlwZSA9IGFycmF5VHlwZTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZnJvbVN0cnVjdEFycmF5KGFycmF5LCB0eXBlKSB7XG4gICAgICAgIHJldHVybiBuZXcgQnVmZmVyKGFycmF5LnNlcmlhbGl6ZSgpLCBhcnJheS5jb25zdHJ1Y3Rvci5zZXJpYWxpemUoKSwgdHlwZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQmluZCB0aGlzIGJ1ZmZlciB0byBhIFdlYkdMIGNvbnRleHQuXG4gICAgICogQHBhcmFtIGdsIFRoZSBXZWJHTCBjb250ZXh0XG4gICAgICovXG4gICAgYmluZChnbCkge1xuICAgICAgICBjb25zdCB0eXBlID0gZ2xbdGhpcy50eXBlXTtcblxuICAgICAgICBpZiAoIXRoaXMuYnVmZmVyKSB7XG4gICAgICAgICAgICB0aGlzLmdsID0gZ2w7XG4gICAgICAgICAgICB0aGlzLmJ1ZmZlciA9IGdsLmNyZWF0ZUJ1ZmZlcigpO1xuICAgICAgICAgICAgZ2wuYmluZEJ1ZmZlcih0eXBlLCB0aGlzLmJ1ZmZlcik7XG4gICAgICAgICAgICBnbC5idWZmZXJEYXRhKHR5cGUsIHRoaXMuYXJyYXlCdWZmZXIsIGdsLlNUQVRJQ19EUkFXKTtcblxuICAgICAgICAgICAgLy8gZHVtcCBhcnJheSBidWZmZXIgb25jZSBpdCdzIGJvdW5kIHRvIGdsXG4gICAgICAgICAgICB0aGlzLmFycmF5QnVmZmVyID0gbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGdsLmJpbmRCdWZmZXIodHlwZSwgdGhpcy5idWZmZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBhdHRyaWJ1dGUgcG9pbnRlcnMgaW4gYSBXZWJHTCBjb250ZXh0XG4gICAgICogQHBhcmFtIGdsIFRoZSBXZWJHTCBjb250ZXh0XG4gICAgICogQHBhcmFtIHByb2dyYW0gVGhlIGFjdGl2ZSBXZWJHTCBwcm9ncmFtXG4gICAgICogQHBhcmFtIHZlcnRleE9mZnNldCBJbmRleCBvZiB0aGUgc3RhcnRpbmcgdmVydGV4IG9mIHRoZSBzZWdtZW50XG4gICAgICovXG4gICAgc2V0VmVydGV4QXR0cmliUG9pbnRlcnMoZ2wsIHByb2dyYW0sIHZlcnRleE9mZnNldCkge1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuYXR0cmlidXRlcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgY29uc3QgbWVtYmVyID0gdGhpcy5hdHRyaWJ1dGVzW2pdO1xuICAgICAgICAgICAgY29uc3QgYXR0cmliSW5kZXggPSBwcm9ncmFtW21lbWJlci5uYW1lXTtcblxuICAgICAgICAgICAgaWYgKGF0dHJpYkluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKFxuICAgICAgICAgICAgICAgICAgICBhdHRyaWJJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgbWVtYmVyLmNvbXBvbmVudHMsXG4gICAgICAgICAgICAgICAgICAgIGdsW0F0dHJpYnV0ZVR5cGVbbWVtYmVyLnR5cGVdXSxcbiAgICAgICAgICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXJyYXlUeXBlLmJ5dGVzUGVyRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgbWVtYmVyLm9mZnNldCArICh0aGlzLmFycmF5VHlwZS5ieXRlc1BlckVsZW1lbnQgKiB2ZXJ0ZXhPZmZzZXQgfHwgMClcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVzdHJveSB0aGUgR0wgYnVmZmVyIGJvdW5kIHRvIHRoZSBnaXZlbiBXZWJHTCBjb250ZXh0XG4gICAgICogQHBhcmFtIGdsIFRoZSBXZWJHTCBjb250ZXh0XG4gICAgICovXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuYnVmZmVyKSB7XG4gICAgICAgICAgICB0aGlzLmdsLmRlbGV0ZUJ1ZmZlcih0aGlzLmJ1ZmZlcik7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogQGVudW0ge3N0cmluZ30gQnVmZmVyVHlwZVxuICogQHByaXZhdGVcbiAqIEByZWFkb25seVxuICovXG5CdWZmZXIuQnVmZmVyVHlwZSA9IHtcbiAgICBWRVJURVg6ICdBUlJBWV9CVUZGRVInLFxuICAgIEVMRU1FTlQ6ICdFTEVNRU5UX0FSUkFZX0JVRkZFUidcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gQnVmZmVyO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCB1dGlsID0gcmVxdWlyZSgnLi4vdXRpbC91dGlsJyk7XG5jb25zdCBCdWZmZXIgPSByZXF1aXJlKCcuL2J1ZmZlcicpO1xuY29uc3QgUHJvZ3JhbUNvbmZpZ3VyYXRpb24gPSByZXF1aXJlKCcuL3Byb2dyYW1fY29uZmlndXJhdGlvbicpO1xuY29uc3QgVmVydGV4QXJyYXlPYmplY3QgPSByZXF1aXJlKCcuLi9yZW5kZXIvdmVydGV4X2FycmF5X29iamVjdCcpO1xuXG5jbGFzcyBCdWZmZXJHcm91cCB7XG4gICAgY29uc3RydWN0b3IocHJvZ3JhbUludGVyZmFjZSwgbGF5ZXJzLCB6b29tLCBhcnJheXMpIHtcbiAgICAgICAgdGhpcy5sYXlvdXRWZXJ0ZXhCdWZmZXIgPSBuZXcgQnVmZmVyKGFycmF5cy5sYXlvdXRWZXJ0ZXhBcnJheSxcbiAgICAgICAgICAgIHByb2dyYW1JbnRlcmZhY2UubGF5b3V0VmVydGV4QXJyYXlUeXBlLnNlcmlhbGl6ZSgpLCBCdWZmZXIuQnVmZmVyVHlwZS5WRVJURVgpO1xuXG4gICAgICAgIGlmIChhcnJheXMuZWxlbWVudEFycmF5KSB7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnRCdWZmZXIgPSBuZXcgQnVmZmVyKGFycmF5cy5lbGVtZW50QXJyYXksXG4gICAgICAgICAgICAgICAgcHJvZ3JhbUludGVyZmFjZS5lbGVtZW50QXJyYXlUeXBlLnNlcmlhbGl6ZSgpLCBCdWZmZXIuQnVmZmVyVHlwZS5FTEVNRU5UKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhcnJheXMuZWxlbWVudEFycmF5Mikge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50QnVmZmVyMiA9IG5ldyBCdWZmZXIoYXJyYXlzLmVsZW1lbnRBcnJheTIsXG4gICAgICAgICAgICAgICAgcHJvZ3JhbUludGVyZmFjZS5lbGVtZW50QXJyYXlUeXBlMi5zZXJpYWxpemUoKSwgQnVmZmVyLkJ1ZmZlclR5cGUuRUxFTUVOVCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxheWVyRGF0YSA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGxheWVyIG9mIGxheWVycykge1xuICAgICAgICAgICAgY29uc3QgYXJyYXkgPSBhcnJheXMucGFpbnRWZXJ0ZXhBcnJheXMgJiYgYXJyYXlzLnBhaW50VmVydGV4QXJyYXlzW2xheWVyLmlkXTtcbiAgICAgICAgICAgIGNvbnN0IHByb2dyYW1Db25maWd1cmF0aW9uID0gUHJvZ3JhbUNvbmZpZ3VyYXRpb24uY3JlYXRlRHluYW1pYyhwcm9ncmFtSW50ZXJmYWNlLnBhaW50QXR0cmlidXRlcyB8fCBbXSwgbGF5ZXIsIHpvb20pO1xuICAgICAgICAgICAgY29uc3QgcGFpbnRWZXJ0ZXhCdWZmZXIgPSBhcnJheSA/IG5ldyBCdWZmZXIoYXJyYXkuYXJyYXksIGFycmF5LnR5cGUsIEJ1ZmZlci5CdWZmZXJUeXBlLlZFUlRFWCkgOiBudWxsO1xuICAgICAgICAgICAgdGhpcy5sYXllckRhdGFbbGF5ZXIuaWRdID0ge3Byb2dyYW1Db25maWd1cmF0aW9uLCBwYWludFZlcnRleEJ1ZmZlcn07XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNlZ21lbnRzID0gYXJyYXlzLnNlZ21lbnRzO1xuICAgICAgICB0aGlzLnNlZ21lbnRzMiA9IGFycmF5cy5zZWdtZW50czI7XG5cbiAgICAgICAgZm9yIChjb25zdCBzZWdtZW50cyBvZiBbdGhpcy5zZWdtZW50cywgdGhpcy5zZWdtZW50czJdKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHNlZ21lbnQgb2Ygc2VnbWVudHMgfHwgW10pIHtcbiAgICAgICAgICAgICAgICBzZWdtZW50LnZhb3MgPSB1dGlsLm1hcE9iamVjdCh0aGlzLmxheWVyRGF0YSwgKCkgPT4gbmV3IFZlcnRleEFycmF5T2JqZWN0KCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5sYXlvdXRWZXJ0ZXhCdWZmZXIuZGVzdHJveSgpO1xuXG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnRCdWZmZXIpIHtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudEJ1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudEJ1ZmZlcjIpIHtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudEJ1ZmZlcjIuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgbGF5ZXJJZCBpbiB0aGlzLmxheWVyRGF0YSkge1xuICAgICAgICAgICAgY29uc3QgcGFpbnRWZXJ0ZXhCdWZmZXIgPSB0aGlzLmxheWVyRGF0YVtsYXllcklkXS5wYWludFZlcnRleEJ1ZmZlcjtcbiAgICAgICAgICAgIGlmIChwYWludFZlcnRleEJ1ZmZlcikge1xuICAgICAgICAgICAgICAgIHBhaW50VmVydGV4QnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHNlZ21lbnRzIG9mIFt0aGlzLnNlZ21lbnRzLCB0aGlzLnNlZ21lbnRzMl0pIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc2VnbWVudCBvZiBzZWdtZW50cyB8fCBbXSkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgayBpbiBzZWdtZW50LnZhb3MpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VnbWVudC52YW9zW2tdLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gQnVmZmVyR3JvdXA7XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IGNyZWF0ZVN0cnVjdEFycmF5VHlwZSA9IHJlcXVpcmUoJy4uL3V0aWwvc3RydWN0X2FycmF5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlRWxlbWVudEFycmF5VHlwZTtcblxuLyoqXG4gKiBBbiBlbGVtZW50IGFycmF5IHN0b3JlcyBVaW50MTYgaW5kaWNpZXMgb2YgdmVydGV4ZXMgaW4gYSBjb3JyZXNwb25kaW5nIHZlcnRleCBhcnJheS4gV2l0aCBub1xuICogYXJndW1lbnRzLCBpdCBkZWZhdWx0cyB0byB0aHJlZSBjb21wb25lbnRzIHBlciBlbGVtZW50LCBmb3JtaW5nIHRyaWFuZ2xlcy5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnRBcnJheVR5cGUoY29tcG9uZW50cykge1xuICAgIHJldHVybiBjcmVhdGVTdHJ1Y3RBcnJheVR5cGUoe1xuICAgICAgICBtZW1iZXJzOiBbe1xuICAgICAgICAgICAgdHlwZTogJ1VpbnQxNicsXG4gICAgICAgICAgICBuYW1lOiAndmVydGljZXMnLFxuICAgICAgICAgICAgY29tcG9uZW50czogY29tcG9uZW50cyB8fCAzXG4gICAgICAgIH1dXG4gICAgfSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogVGhlIG1heGltdW0gdmFsdWUgb2YgYSBjb29yZGluYXRlIGluIHRoZSBpbnRlcm5hbCB0aWxlIGNvb3JkaW5hdGUgc3lzdGVtLiBDb29yZGluYXRlcyBvZlxuICogYWxsIHNvdXJjZSBmZWF0dXJlcyBub3JtYWxpemVkIHRvIHRoaXMgZXh0ZW50IHVwb24gbG9hZC5cbiAqXG4gKiBUaGUgdmFsdWUgaXMgYSBjb25zZXF1ZW5jZSBvZiB0aGUgZm9sbG93aW5nOlxuICpcbiAqICogVmVydGV4IGJ1ZmZlciBzdG9yZSBwb3NpdGlvbnMgYXMgc2lnbmVkIDE2IGJpdCBpbnRlZ2Vycy5cbiAqICogT25lIGJpdCBpcyBsb3N0IGZvciBzaWduZWRuZXNzIHRvIHN1cHBvcnQgdGlsZSBidWZmZXJzLlxuICogKiBPbmUgYml0IGlzIGxvc3QgYmVjYXVzZSB0aGUgbGluZSB2ZXJ0ZXggYnVmZmVyIHBhY2tzIDEgYml0IG9mIG90aGVyIGRhdGEgaW50byB0aGUgaW50LlxuICogKiBPbmUgYml0IGlzIGxvc3QgdG8gc3VwcG9ydCBmZWF0dXJlcyBleHRlbmRpbmcgcGFzdCB0aGUgZXh0ZW50IG9uIHRoZSByaWdodCBlZGdlIG9mIHRoZSB0aWxlLlxuICogKiBUaGlzIGxlYXZlcyB1cyB3aXRoIDJeMTMgPSA4MTkyXG4gKlxuICogQHByaXZhdGVcbiAqIEByZWFkb25seVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IDgxOTI7XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IFBvaW50ID0gcmVxdWlyZSgncG9pbnQtZ2VvbWV0cnknKTtcbmNvbnN0IGxvYWRHZW9tZXRyeSA9IHJlcXVpcmUoJy4vbG9hZF9nZW9tZXRyeScpO1xuY29uc3QgRVhURU5UID0gcmVxdWlyZSgnLi9leHRlbnQnKTtcbmNvbnN0IGZlYXR1cmVGaWx0ZXIgPSByZXF1aXJlKCdmZWF0dXJlLWZpbHRlcicpO1xuY29uc3QgY3JlYXRlU3RydWN0QXJyYXlUeXBlID0gcmVxdWlyZSgnLi4vdXRpbC9zdHJ1Y3RfYXJyYXknKTtcbmNvbnN0IEdyaWQgPSByZXF1aXJlKCdncmlkLWluZGV4Jyk7XG5jb25zdCBEaWN0aW9uYXJ5Q29kZXIgPSByZXF1aXJlKCcuLi91dGlsL2RpY3Rpb25hcnlfY29kZXInKTtcbmNvbnN0IHZ0ID0gcmVxdWlyZSgndmVjdG9yLXRpbGUnKTtcbmNvbnN0IFByb3RvYnVmID0gcmVxdWlyZSgncGJmJyk7XG5jb25zdCBHZW9KU09ORmVhdHVyZSA9IHJlcXVpcmUoJy4uL3V0aWwvdmVjdG9ydGlsZV90b19nZW9qc29uJyk7XG5jb25zdCBhcnJheXNJbnRlcnNlY3QgPSByZXF1aXJlKCcuLi91dGlsL3V0aWwnKS5hcnJheXNJbnRlcnNlY3Q7XG5cbmNvbnN0IGludGVyc2VjdGlvbiA9IHJlcXVpcmUoJy4uL3V0aWwvaW50ZXJzZWN0aW9uX3Rlc3RzJyk7XG5jb25zdCBtdWx0aVBvbHlnb25JbnRlcnNlY3RzQnVmZmVyZWRNdWx0aVBvaW50ID0gaW50ZXJzZWN0aW9uLm11bHRpUG9seWdvbkludGVyc2VjdHNCdWZmZXJlZE11bHRpUG9pbnQ7XG5jb25zdCBtdWx0aVBvbHlnb25JbnRlcnNlY3RzTXVsdGlQb2x5Z29uID0gaW50ZXJzZWN0aW9uLm11bHRpUG9seWdvbkludGVyc2VjdHNNdWx0aVBvbHlnb247XG5jb25zdCBtdWx0aVBvbHlnb25JbnRlcnNlY3RzQnVmZmVyZWRNdWx0aUxpbmUgPSBpbnRlcnNlY3Rpb24ubXVsdGlQb2x5Z29uSW50ZXJzZWN0c0J1ZmZlcmVkTXVsdGlMaW5lO1xuXG5jb25zdCBGZWF0dXJlSW5kZXhBcnJheSA9IGNyZWF0ZVN0cnVjdEFycmF5VHlwZSh7XG4gICAgbWVtYmVyczogW1xuICAgICAgICAvLyB0aGUgaW5kZXggb2YgdGhlIGZlYXR1cmUgaW4gdGhlIG9yaWdpbmFsIHZlY3RvcnRpbGVcbiAgICAgICAgeyB0eXBlOiAnVWludDMyJywgbmFtZTogJ2ZlYXR1cmVJbmRleCcgfSxcbiAgICAgICAgLy8gdGhlIHNvdXJjZSBsYXllciB0aGUgZmVhdHVyZSBhcHBlYXJzIGluXG4gICAgICAgIHsgdHlwZTogJ1VpbnQxNicsIG5hbWU6ICdzb3VyY2VMYXllckluZGV4JyB9LFxuICAgICAgICAvLyB0aGUgYnVja2V0IHRoZSBmZWF0dXJlIGFwcGVhcnMgaW5cbiAgICAgICAgeyB0eXBlOiAnVWludDE2JywgbmFtZTogJ2J1Y2tldEluZGV4JyB9XG4gICAgXVxufSk7XG5cbmNsYXNzIEZlYXR1cmVJbmRleCB7XG4gICAgY29uc3RydWN0b3IoY29vcmQsIG92ZXJzY2FsaW5nLCBjb2xsaXNpb25UaWxlKSB7XG4gICAgICAgIGlmIChjb29yZC5ncmlkKSB7XG4gICAgICAgICAgICBjb25zdCBzZXJpYWxpemVkID0gY29vcmQ7XG4gICAgICAgICAgICBjb25zdCByYXdUaWxlRGF0YSA9IG92ZXJzY2FsaW5nO1xuICAgICAgICAgICAgY29vcmQgPSBzZXJpYWxpemVkLmNvb3JkO1xuICAgICAgICAgICAgb3ZlcnNjYWxpbmcgPSBzZXJpYWxpemVkLm92ZXJzY2FsaW5nO1xuICAgICAgICAgICAgdGhpcy5ncmlkID0gbmV3IEdyaWQoc2VyaWFsaXplZC5ncmlkKTtcbiAgICAgICAgICAgIHRoaXMuZmVhdHVyZUluZGV4QXJyYXkgPSBuZXcgRmVhdHVyZUluZGV4QXJyYXkoc2VyaWFsaXplZC5mZWF0dXJlSW5kZXhBcnJheSk7XG4gICAgICAgICAgICB0aGlzLnJhd1RpbGVEYXRhID0gcmF3VGlsZURhdGE7XG4gICAgICAgICAgICB0aGlzLmJ1Y2tldExheWVySURzID0gc2VyaWFsaXplZC5idWNrZXRMYXllcklEcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZ3JpZCA9IG5ldyBHcmlkKEVYVEVOVCwgMTYsIDApO1xuICAgICAgICAgICAgdGhpcy5mZWF0dXJlSW5kZXhBcnJheSA9IG5ldyBGZWF0dXJlSW5kZXhBcnJheSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29vcmQgPSBjb29yZDtcbiAgICAgICAgdGhpcy5vdmVyc2NhbGluZyA9IG92ZXJzY2FsaW5nO1xuICAgICAgICB0aGlzLnggPSBjb29yZC54O1xuICAgICAgICB0aGlzLnkgPSBjb29yZC55O1xuICAgICAgICB0aGlzLnogPSBjb29yZC56IC0gTWF0aC5sb2cob3ZlcnNjYWxpbmcpIC8gTWF0aC5MTjI7XG4gICAgICAgIHRoaXMuc2V0Q29sbGlzaW9uVGlsZShjb2xsaXNpb25UaWxlKTtcbiAgICB9XG5cbiAgICBpbnNlcnQoZmVhdHVyZSwgYnVja2V0SW5kZXgpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5mZWF0dXJlSW5kZXhBcnJheS5sZW5ndGg7XG4gICAgICAgIHRoaXMuZmVhdHVyZUluZGV4QXJyYXkuZW1wbGFjZUJhY2soZmVhdHVyZS5pbmRleCwgZmVhdHVyZS5zb3VyY2VMYXllckluZGV4LCBidWNrZXRJbmRleCk7XG4gICAgICAgIGNvbnN0IGdlb21ldHJ5ID0gbG9hZEdlb21ldHJ5KGZlYXR1cmUpO1xuXG4gICAgICAgIGZvciAobGV0IHIgPSAwOyByIDwgZ2VvbWV0cnkubGVuZ3RoOyByKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHJpbmcgPSBnZW9tZXRyeVtyXTtcblxuICAgICAgICAgICAgY29uc3QgYmJveCA9IFtJbmZpbml0eSwgSW5maW5pdHksIC1JbmZpbml0eSwgLUluZmluaXR5XTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmluZy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHAgPSByaW5nW2ldO1xuICAgICAgICAgICAgICAgIGJib3hbMF0gPSBNYXRoLm1pbihiYm94WzBdLCBwLngpO1xuICAgICAgICAgICAgICAgIGJib3hbMV0gPSBNYXRoLm1pbihiYm94WzFdLCBwLnkpO1xuICAgICAgICAgICAgICAgIGJib3hbMl0gPSBNYXRoLm1heChiYm94WzJdLCBwLngpO1xuICAgICAgICAgICAgICAgIGJib3hbM10gPSBNYXRoLm1heChiYm94WzNdLCBwLnkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmdyaWQuaW5zZXJ0KGtleSwgYmJveFswXSwgYmJveFsxXSwgYmJveFsyXSwgYmJveFszXSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRDb2xsaXNpb25UaWxlKGNvbGxpc2lvblRpbGUpIHtcbiAgICAgICAgdGhpcy5jb2xsaXNpb25UaWxlID0gY29sbGlzaW9uVGlsZTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUodHJhbnNmZXJhYmxlcykge1xuICAgICAgICBjb25zdCBncmlkID0gdGhpcy5ncmlkLnRvQXJyYXlCdWZmZXIoKTtcbiAgICAgICAgaWYgKHRyYW5zZmVyYWJsZXMpIHtcbiAgICAgICAgICAgIHRyYW5zZmVyYWJsZXMucHVzaChncmlkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29vcmQ6IHRoaXMuY29vcmQsXG4gICAgICAgICAgICBvdmVyc2NhbGluZzogdGhpcy5vdmVyc2NhbGluZyxcbiAgICAgICAgICAgIGdyaWQ6IGdyaWQsXG4gICAgICAgICAgICBmZWF0dXJlSW5kZXhBcnJheTogdGhpcy5mZWF0dXJlSW5kZXhBcnJheS5zZXJpYWxpemUodHJhbnNmZXJhYmxlcyksXG4gICAgICAgICAgICBidWNrZXRMYXllcklEczogdGhpcy5idWNrZXRMYXllcklEc1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIEZpbmRzIGZlYXR1cmVzIGluIHRoaXMgdGlsZSBhdCBhIHBhcnRpY3VsYXIgcG9zaXRpb24uXG4gICAgcXVlcnkoYXJncywgc3R5bGVMYXllcnMpIHtcbiAgICAgICAgaWYgKCF0aGlzLnZ0TGF5ZXJzKSB7XG4gICAgICAgICAgICB0aGlzLnZ0TGF5ZXJzID0gbmV3IHZ0LlZlY3RvclRpbGUobmV3IFByb3RvYnVmKHRoaXMucmF3VGlsZURhdGEpKS5sYXllcnM7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZUxheWVyQ29kZXIgPSBuZXcgRGljdGlvbmFyeUNvZGVyKHRoaXMudnRMYXllcnMgPyBPYmplY3Qua2V5cyh0aGlzLnZ0TGF5ZXJzKS5zb3J0KCkgOiBbJ19nZW9qc29uVGlsZUxheWVyJ10pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge307XG5cbiAgICAgICAgY29uc3QgcGFyYW1zID0gYXJncy5wYXJhbXMgfHwge30sXG4gICAgICAgICAgICBwaXhlbHNUb1RpbGVVbml0cyA9IEVYVEVOVCAvIGFyZ3MudGlsZVNpemUgLyBhcmdzLnNjYWxlLFxuICAgICAgICAgICAgZmlsdGVyID0gZmVhdHVyZUZpbHRlcihwYXJhbXMuZmlsdGVyKTtcblxuICAgICAgICAvLyBGZWF0dXJlcyBhcmUgaW5kZXhlZCB0aGVpciBvcmlnaW5hbCBnZW9tZXRyaWVzLiBUaGUgcmVuZGVyZWQgZ2VvbWV0cmllcyBtYXlcbiAgICAgICAgLy8gYmUgYnVmZmVyZWQsIHRyYW5zbGF0ZWQgb3Igb2Zmc2V0LiBGaWd1cmUgb3V0IGhvdyBtdWNoIHRoZSBzZWFyY2ggcmFkaXVzIG5lZWRzIHRvIGJlXG4gICAgICAgIC8vIGV4cGFuZGVkIGJ5IHRvIGluY2x1ZGUgdGhlc2UgZmVhdHVyZXMuXG4gICAgICAgIGxldCBhZGRpdGlvbmFsUmFkaXVzID0gMDtcbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiBzdHlsZUxheWVycykge1xuICAgICAgICAgICAgY29uc3Qgc3R5bGVMYXllciA9IHN0eWxlTGF5ZXJzW2lkXTtcbiAgICAgICAgICAgIGNvbnN0IHBhaW50ID0gc3R5bGVMYXllci5wYWludDtcblxuICAgICAgICAgICAgbGV0IHN0eWxlTGF5ZXJEaXN0YW5jZSA9IDA7XG4gICAgICAgICAgICBpZiAoc3R5bGVMYXllci50eXBlID09PSAnbGluZScpIHtcbiAgICAgICAgICAgICAgICBzdHlsZUxheWVyRGlzdGFuY2UgPSBnZXRMaW5lV2lkdGgocGFpbnQpIC8gMiArIE1hdGguYWJzKHBhaW50WydsaW5lLW9mZnNldCddKSArIHRyYW5zbGF0ZURpc3RhbmNlKHBhaW50WydsaW5lLXRyYW5zbGF0ZSddKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3R5bGVMYXllci50eXBlID09PSAnZmlsbCcpIHtcbiAgICAgICAgICAgICAgICBzdHlsZUxheWVyRGlzdGFuY2UgPSB0cmFuc2xhdGVEaXN0YW5jZShwYWludFsnZmlsbC10cmFuc2xhdGUnXSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHN0eWxlTGF5ZXIudHlwZSA9PT0gJ2ZpbGwtZXh0cnVzaW9uJykge1xuICAgICAgICAgICAgICAgIHN0eWxlTGF5ZXJEaXN0YW5jZSA9IHRyYW5zbGF0ZURpc3RhbmNlKHBhaW50WydmaWxsLWV4dHJ1c2lvbi10cmFuc2xhdGUnXSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHN0eWxlTGF5ZXIudHlwZSA9PT0gJ2NpcmNsZScpIHtcbiAgICAgICAgICAgICAgICBzdHlsZUxheWVyRGlzdGFuY2UgPSBwYWludFsnY2lyY2xlLXJhZGl1cyddICsgdHJhbnNsYXRlRGlzdGFuY2UocGFpbnRbJ2NpcmNsZS10cmFuc2xhdGUnXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhZGRpdGlvbmFsUmFkaXVzID0gTWF0aC5tYXgoYWRkaXRpb25hbFJhZGl1cywgc3R5bGVMYXllckRpc3RhbmNlICogcGl4ZWxzVG9UaWxlVW5pdHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcXVlcnlHZW9tZXRyeSA9IGFyZ3MucXVlcnlHZW9tZXRyeS5tYXAoKHEpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBxLm1hcCgocCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUG9pbnQocC54LCBwLnkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGxldCBtaW5YID0gSW5maW5pdHk7XG4gICAgICAgIGxldCBtaW5ZID0gSW5maW5pdHk7XG4gICAgICAgIGxldCBtYXhYID0gLUluZmluaXR5O1xuICAgICAgICBsZXQgbWF4WSA9IC1JbmZpbml0eTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBxdWVyeUdlb21ldHJ5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCByaW5nID0gcXVlcnlHZW9tZXRyeVtpXTtcbiAgICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgcmluZy5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHAgPSByaW5nW2tdO1xuICAgICAgICAgICAgICAgIG1pblggPSBNYXRoLm1pbihtaW5YLCBwLngpO1xuICAgICAgICAgICAgICAgIG1pblkgPSBNYXRoLm1pbihtaW5ZLCBwLnkpO1xuICAgICAgICAgICAgICAgIG1heFggPSBNYXRoLm1heChtYXhYLCBwLngpO1xuICAgICAgICAgICAgICAgIG1heFkgPSBNYXRoLm1heChtYXhZLCBwLnkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbWF0Y2hpbmcgPSB0aGlzLmdyaWQucXVlcnkobWluWCAtIGFkZGl0aW9uYWxSYWRpdXMsIG1pblkgLSBhZGRpdGlvbmFsUmFkaXVzLCBtYXhYICsgYWRkaXRpb25hbFJhZGl1cywgbWF4WSArIGFkZGl0aW9uYWxSYWRpdXMpO1xuICAgICAgICBtYXRjaGluZy5zb3J0KHRvcERvd25GZWF0dXJlQ29tcGFyYXRvcik7XG4gICAgICAgIHRoaXMuZmlsdGVyTWF0Y2hpbmcocmVzdWx0LCBtYXRjaGluZywgdGhpcy5mZWF0dXJlSW5kZXhBcnJheSwgcXVlcnlHZW9tZXRyeSwgZmlsdGVyLCBwYXJhbXMubGF5ZXJzLCBzdHlsZUxheWVycywgYXJncy5iZWFyaW5nLCBwaXhlbHNUb1RpbGVVbml0cyk7XG5cbiAgICAgICAgY29uc3QgbWF0Y2hpbmdTeW1ib2xzID0gdGhpcy5jb2xsaXNpb25UaWxlLnF1ZXJ5UmVuZGVyZWRTeW1ib2xzKHF1ZXJ5R2VvbWV0cnksIGFyZ3Muc2NhbGUpO1xuICAgICAgICBtYXRjaGluZ1N5bWJvbHMuc29ydCgpO1xuICAgICAgICB0aGlzLmZpbHRlck1hdGNoaW5nKHJlc3VsdCwgbWF0Y2hpbmdTeW1ib2xzLCB0aGlzLmNvbGxpc2lvblRpbGUuY29sbGlzaW9uQm94QXJyYXksIHF1ZXJ5R2VvbWV0cnksIGZpbHRlciwgcGFyYW1zLmxheWVycywgc3R5bGVMYXllcnMsIGFyZ3MuYmVhcmluZywgcGl4ZWxzVG9UaWxlVW5pdHMpO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgZmlsdGVyTWF0Y2hpbmcocmVzdWx0LCBtYXRjaGluZywgYXJyYXksIHF1ZXJ5R2VvbWV0cnksIGZpbHRlciwgZmlsdGVyTGF5ZXJJRHMsIHN0eWxlTGF5ZXJzLCBiZWFyaW5nLCBwaXhlbHNUb1RpbGVVbml0cykge1xuICAgICAgICBsZXQgcHJldmlvdXNJbmRleDtcbiAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBtYXRjaGluZy5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBtYXRjaGluZ1trXTtcblxuICAgICAgICAgICAgLy8gZG9uJ3QgY2hlY2sgdGhlIHNhbWUgZmVhdHVyZSBtb3JlIHRoYW4gb25jZVxuICAgICAgICAgICAgaWYgKGluZGV4ID09PSBwcmV2aW91c0luZGV4KSBjb250aW51ZTtcbiAgICAgICAgICAgIHByZXZpb3VzSW5kZXggPSBpbmRleDtcblxuICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSBhcnJheS5nZXQoaW5kZXgpO1xuXG4gICAgICAgICAgICBjb25zdCBsYXllcklEcyA9IHRoaXMuYnVja2V0TGF5ZXJJRHNbbWF0Y2guYnVja2V0SW5kZXhdO1xuICAgICAgICAgICAgaWYgKGZpbHRlckxheWVySURzICYmICFhcnJheXNJbnRlcnNlY3QoZmlsdGVyTGF5ZXJJRHMsIGxheWVySURzKSkgY29udGludWU7XG5cbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZUxheWVyTmFtZSA9IHRoaXMuc291cmNlTGF5ZXJDb2Rlci5kZWNvZGUobWF0Y2guc291cmNlTGF5ZXJJbmRleCk7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VMYXllciA9IHRoaXMudnRMYXllcnNbc291cmNlTGF5ZXJOYW1lXTtcbiAgICAgICAgICAgIGNvbnN0IGZlYXR1cmUgPSBzb3VyY2VMYXllci5mZWF0dXJlKG1hdGNoLmZlYXR1cmVJbmRleCk7XG5cbiAgICAgICAgICAgIGlmICghZmlsdGVyKGZlYXR1cmUpKSBjb250aW51ZTtcblxuICAgICAgICAgICAgbGV0IGdlb21ldHJ5ID0gbnVsbDtcblxuICAgICAgICAgICAgZm9yIChsZXQgbCA9IDA7IGwgPCBsYXllcklEcy5sZW5ndGg7IGwrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxheWVySUQgPSBsYXllcklEc1tsXTtcblxuICAgICAgICAgICAgICAgIGlmIChmaWx0ZXJMYXllcklEcyAmJiBmaWx0ZXJMYXllcklEcy5pbmRleE9mKGxheWVySUQpIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBzdHlsZUxheWVyID0gc3R5bGVMYXllcnNbbGF5ZXJJRF07XG4gICAgICAgICAgICAgICAgaWYgKCFzdHlsZUxheWVyKSBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgIGxldCB0cmFuc2xhdGVkUG9seWdvbjtcbiAgICAgICAgICAgICAgICBpZiAoc3R5bGVMYXllci50eXBlICE9PSAnc3ltYm9sJykge1xuICAgICAgICAgICAgICAgICAgICAvLyBhbGwgc3ltYm9scyBhbHJlYWR5IG1hdGNoIHRoZSBzdHlsZVxuXG4gICAgICAgICAgICAgICAgICAgIGlmICghZ2VvbWV0cnkpIGdlb21ldHJ5ID0gbG9hZEdlb21ldHJ5KGZlYXR1cmUpO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhaW50ID0gc3R5bGVMYXllci5wYWludDtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVMYXllci50eXBlID09PSAnbGluZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZWRQb2x5Z29uID0gdHJhbnNsYXRlKHF1ZXJ5R2VvbWV0cnksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhaW50WydsaW5lLXRyYW5zbGF0ZSddLCBwYWludFsnbGluZS10cmFuc2xhdGUtYW5jaG9yJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlYXJpbmcsIHBpeGVsc1RvVGlsZVVuaXRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhbGZXaWR0aCA9IGdldExpbmVXaWR0aChwYWludCkgLyAyICogcGl4ZWxzVG9UaWxlVW5pdHM7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFpbnRbJ2xpbmUtb2Zmc2V0J10pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeSA9IG9mZnNldExpbmUoZ2VvbWV0cnksIHBhaW50WydsaW5lLW9mZnNldCddICogcGl4ZWxzVG9UaWxlVW5pdHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtdWx0aVBvbHlnb25JbnRlcnNlY3RzQnVmZmVyZWRNdWx0aUxpbmUodHJhbnNsYXRlZFBvbHlnb24sIGdlb21ldHJ5LCBoYWxmV2lkdGgpKSBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0eWxlTGF5ZXIudHlwZSA9PT0gJ2ZpbGwnIHx8IHN0eWxlTGF5ZXIudHlwZSA9PT0gJ2ZpbGwtZXh0cnVzaW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZVByZWZpeCA9IHN0eWxlTGF5ZXIudHlwZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZWRQb2x5Z29uID0gdHJhbnNsYXRlKHF1ZXJ5R2VvbWV0cnksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhaW50W2Ake3R5cGVQcmVmaXh9LXRyYW5zbGF0ZWBdLCBwYWludFtgJHt0eXBlUHJlZml4fS10cmFuc2xhdGUtYW5jaG9yYF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlYXJpbmcsIHBpeGVsc1RvVGlsZVVuaXRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbXVsdGlQb2x5Z29uSW50ZXJzZWN0c011bHRpUG9seWdvbih0cmFuc2xhdGVkUG9seWdvbiwgZ2VvbWV0cnkpKSBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0eWxlTGF5ZXIudHlwZSA9PT0gJ2NpcmNsZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZWRQb2x5Z29uID0gdHJhbnNsYXRlKHF1ZXJ5R2VvbWV0cnksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhaW50WydjaXJjbGUtdHJhbnNsYXRlJ10sIHBhaW50WydjaXJjbGUtdHJhbnNsYXRlLWFuY2hvciddLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWFyaW5nLCBwaXhlbHNUb1RpbGVVbml0cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaXJjbGVSYWRpdXMgPSBwYWludFsnY2lyY2xlLXJhZGl1cyddICogcGl4ZWxzVG9UaWxlVW5pdHM7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW11bHRpUG9seWdvbkludGVyc2VjdHNCdWZmZXJlZE11bHRpUG9pbnQodHJhbnNsYXRlZFBvbHlnb24sIGdlb21ldHJ5LCBjaXJjbGVSYWRpdXMpKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGdlb2pzb25GZWF0dXJlID0gbmV3IEdlb0pTT05GZWF0dXJlKGZlYXR1cmUsIHRoaXMueiwgdGhpcy54LCB0aGlzLnkpO1xuICAgICAgICAgICAgICAgIGdlb2pzb25GZWF0dXJlLmxheWVyID0gc3R5bGVMYXllci5zZXJpYWxpemUoKTtcbiAgICAgICAgICAgICAgICBsZXQgbGF5ZXJSZXN1bHQgPSByZXN1bHRbbGF5ZXJJRF07XG4gICAgICAgICAgICAgICAgaWYgKGxheWVyUmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGF5ZXJSZXN1bHQgPSByZXN1bHRbbGF5ZXJJRF0gPSBbXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGF5ZXJSZXN1bHQucHVzaChnZW9qc29uRmVhdHVyZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gRmVhdHVyZUluZGV4O1xuXG5mdW5jdGlvbiB0cmFuc2xhdGVEaXN0YW5jZSh0cmFuc2xhdGUpIHtcbiAgICByZXR1cm4gTWF0aC5zcXJ0KHRyYW5zbGF0ZVswXSAqIHRyYW5zbGF0ZVswXSArIHRyYW5zbGF0ZVsxXSAqIHRyYW5zbGF0ZVsxXSk7XG59XG5cbmZ1bmN0aW9uIHRvcERvd25GZWF0dXJlQ29tcGFyYXRvcihhLCBiKSB7XG4gICAgcmV0dXJuIGIgLSBhO1xufVxuXG5mdW5jdGlvbiBnZXRMaW5lV2lkdGgocGFpbnQpIHtcbiAgICBpZiAocGFpbnRbJ2xpbmUtZ2FwLXdpZHRoJ10gPiAwKSB7XG4gICAgICAgIHJldHVybiBwYWludFsnbGluZS1nYXAtd2lkdGgnXSArIDIgKiBwYWludFsnbGluZS13aWR0aCddO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBwYWludFsnbGluZS13aWR0aCddO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gdHJhbnNsYXRlKHF1ZXJ5R2VvbWV0cnksIHRyYW5zbGF0ZSwgdHJhbnNsYXRlQW5jaG9yLCBiZWFyaW5nLCBwaXhlbHNUb1RpbGVVbml0cykge1xuICAgIGlmICghdHJhbnNsYXRlWzBdICYmICF0cmFuc2xhdGVbMV0pIHtcbiAgICAgICAgcmV0dXJuIHF1ZXJ5R2VvbWV0cnk7XG4gICAgfVxuXG4gICAgdHJhbnNsYXRlID0gUG9pbnQuY29udmVydCh0cmFuc2xhdGUpO1xuXG4gICAgaWYgKHRyYW5zbGF0ZUFuY2hvciA9PT0gXCJ2aWV3cG9ydFwiKSB7XG4gICAgICAgIHRyYW5zbGF0ZS5fcm90YXRlKC1iZWFyaW5nKTtcbiAgICB9XG5cbiAgICBjb25zdCB0cmFuc2xhdGVkID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBxdWVyeUdlb21ldHJ5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHJpbmcgPSBxdWVyeUdlb21ldHJ5W2ldO1xuICAgICAgICBjb25zdCB0cmFuc2xhdGVkUmluZyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IHJpbmcubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgIHRyYW5zbGF0ZWRSaW5nLnB1c2gocmluZ1trXS5zdWIodHJhbnNsYXRlLl9tdWx0KHBpeGVsc1RvVGlsZVVuaXRzKSkpO1xuICAgICAgICB9XG4gICAgICAgIHRyYW5zbGF0ZWQucHVzaCh0cmFuc2xhdGVkUmluZyk7XG4gICAgfVxuICAgIHJldHVybiB0cmFuc2xhdGVkO1xufVxuXG5mdW5jdGlvbiBvZmZzZXRMaW5lKHJpbmdzLCBvZmZzZXQpIHtcbiAgICBjb25zdCBuZXdSaW5ncyA9IFtdO1xuICAgIGNvbnN0IHplcm8gPSBuZXcgUG9pbnQoMCwgMCk7XG4gICAgZm9yIChsZXQgayA9IDA7IGsgPCByaW5ncy5sZW5ndGg7IGsrKykge1xuICAgICAgICBjb25zdCByaW5nID0gcmluZ3Nba107XG4gICAgICAgIGNvbnN0IG5ld1JpbmcgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByaW5nLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBhID0gcmluZ1tpIC0gMV07XG4gICAgICAgICAgICBjb25zdCBiID0gcmluZ1tpXTtcbiAgICAgICAgICAgIGNvbnN0IGMgPSByaW5nW2kgKyAxXTtcbiAgICAgICAgICAgIGNvbnN0IGFUb0IgPSBpID09PSAwID8gemVybyA6IGIuc3ViKGEpLl91bml0KCkuX3BlcnAoKTtcbiAgICAgICAgICAgIGNvbnN0IGJUb0MgPSBpID09PSByaW5nLmxlbmd0aCAtIDEgPyB6ZXJvIDogYy5zdWIoYikuX3VuaXQoKS5fcGVycCgpO1xuICAgICAgICAgICAgY29uc3QgZXh0cnVkZSA9IGFUb0IuX2FkZChiVG9DKS5fdW5pdCgpO1xuXG4gICAgICAgICAgICBjb25zdCBjb3NIYWxmQW5nbGUgPSBleHRydWRlLnggKiBiVG9DLnggKyBleHRydWRlLnkgKiBiVG9DLnk7XG4gICAgICAgICAgICBleHRydWRlLl9tdWx0KDEgLyBjb3NIYWxmQW5nbGUpO1xuXG4gICAgICAgICAgICBuZXdSaW5nLnB1c2goZXh0cnVkZS5fbXVsdChvZmZzZXQpLl9hZGQoYikpO1xuICAgICAgICB9XG4gICAgICAgIG5ld1JpbmdzLnB1c2gobmV3UmluZyk7XG4gICAgfVxuICAgIHJldHVybiBuZXdSaW5ncztcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgdXRpbCA9IHJlcXVpcmUoJy4uL3V0aWwvdXRpbCcpO1xuY29uc3QgRVhURU5UID0gcmVxdWlyZSgnLi9leHRlbnQnKTtcbmNvbnN0IGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpO1xuXG5cbi8vIFRoZXNlIGJvdW5kcyBkZWZpbmUgdGhlIG1pbmltdW0gYW5kIG1heGltdW0gc3VwcG9ydGVkIGNvb3JkaW5hdGUgdmFsdWVzLlxuLy8gV2hpbGUgdmlzaWJsZSBjb29yZGluYXRlcyBhcmUgd2l0aGluIFswLCBFWFRFTlRdLCB0aWxlcyBtYXkgdGhlb3JldGljYWxseVxuLy8gY29udGFpbiBjb3JkaW5hdGVzIHdpdGhpbiBbLUluZmluaXR5LCBJbmZpbml0eV0uIE91ciByYW5nZSBpcyBsaW1pdGVkIGJ5IHRoZVxuLy8gbnVtYmVyIG9mIGJpdHMgdXNlZCB0byByZXByZXNlbnQgdGhlIGNvb3JkaW5hdGUuXG5mdW5jdGlvbiBjcmVhdGVCb3VuZHMoYml0cykge1xuICAgIHJldHVybiB7XG4gICAgICAgIG1pbjogLTEgKiBNYXRoLnBvdygyLCBiaXRzIC0gMSksXG4gICAgICAgIG1heDogTWF0aC5wb3coMiwgYml0cyAtIDEpIC0gMVxuICAgIH07XG59XG5cbmNvbnN0IGJvdW5kc0xvb2t1cCA9IHtcbiAgICAxNTogY3JlYXRlQm91bmRzKDE1KSxcbiAgICAxNjogY3JlYXRlQm91bmRzKDE2KVxufTtcblxuLyoqXG4gKiBMb2FkcyBhIGdlb21ldHJ5IGZyb20gYSBWZWN0b3JUaWxlRmVhdHVyZSBhbmQgc2NhbGVzIGl0IHRvIHRoZSBjb21tb24gZXh0ZW50XG4gKiB1c2VkIGludGVybmFsbHkuXG4gKiBAcGFyYW0ge1ZlY3RvclRpbGVGZWF0dXJlfSBmZWF0dXJlXG4gKiBAcGFyYW0ge251bWJlcn0gW2JpdHM9MTZdIFRoZSBudW1iZXIgb2Ygc2lnbmVkIGludGVnZXIgYml0cyBhdmFpbGFibGUgdG8gc3RvcmVcbiAqICAgZWFjaCBjb29yZGluYXRlLiBBIHdhcm5pbmcgd2lsbCBiZSBpc3N1ZWQgaWYgYW55IGNvb3JkaW5hdGUgd2lsbCBub3QgZml0c1xuICogICBpbiB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBiaXRzLlxuICogQHByaXZhdGVcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBsb2FkR2VvbWV0cnkoZmVhdHVyZSwgYml0cykge1xuICAgIGNvbnN0IGJvdW5kcyA9IGJvdW5kc0xvb2t1cFtiaXRzIHx8IDE2XTtcbiAgICBhc3NlcnQoYm91bmRzKTtcblxuICAgIGNvbnN0IHNjYWxlID0gRVhURU5UIC8gZmVhdHVyZS5leHRlbnQ7XG4gICAgY29uc3QgZ2VvbWV0cnkgPSBmZWF0dXJlLmxvYWRHZW9tZXRyeSgpO1xuICAgIGZvciAobGV0IHIgPSAwOyByIDwgZ2VvbWV0cnkubGVuZ3RoOyByKyspIHtcbiAgICAgICAgY29uc3QgcmluZyA9IGdlb21ldHJ5W3JdO1xuICAgICAgICBmb3IgKGxldCBwID0gMDsgcCA8IHJpbmcubGVuZ3RoOyBwKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHBvaW50ID0gcmluZ1twXTtcbiAgICAgICAgICAgIC8vIHJvdW5kIGhlcmUgYmVjYXVzZSBtYXBib3gtZ2wtbmF0aXZlIHVzZXMgaW50ZWdlcnMgdG8gcmVwcmVzZW50XG4gICAgICAgICAgICAvLyBwb2ludHMgYW5kIHdlIG5lZWQgdG8gZG8gdGhlIHNhbWUgdG8gYXZvaWQgcmVuZXJpbmcgZGlmZmVyZW5jZXMuXG4gICAgICAgICAgICBwb2ludC54ID0gTWF0aC5yb3VuZChwb2ludC54ICogc2NhbGUpO1xuICAgICAgICAgICAgcG9pbnQueSA9IE1hdGgucm91bmQocG9pbnQueSAqIHNjYWxlKTtcblxuICAgICAgICAgICAgaWYgKHBvaW50LnggPCBib3VuZHMubWluIHx8IHBvaW50LnggPiBib3VuZHMubWF4IHx8IHBvaW50LnkgPCBib3VuZHMubWluIHx8IHBvaW50LnkgPiBib3VuZHMubWF4KSB7XG4gICAgICAgICAgICAgICAgdXRpbC53YXJuT25jZSgnR2VvbWV0cnkgZXhjZWVkcyBhbGxvd2VkIGV4dGVudCwgcmVkdWNlIHlvdXIgdmVjdG9yIHRpbGUgYnVmZmVyIHNpemUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZ2VvbWV0cnk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBjcmVhdGVTdHJ1Y3RBcnJheVR5cGUgPSByZXF1aXJlKCcuLi91dGlsL3N0cnVjdF9hcnJheScpO1xuXG5jb25zdCBQb3NBcnJheSA9IGNyZWF0ZVN0cnVjdEFycmF5VHlwZSh7XG4gICAgbWVtYmVyczogW3sgbmFtZTogJ2FfcG9zJywgdHlwZTogJ0ludDE2JywgY29tcG9uZW50czogMiB9XVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gUG9zQXJyYXk7XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IGNyZWF0ZVZlcnRleEFycmF5VHlwZSA9IHJlcXVpcmUoJy4vdmVydGV4X2FycmF5X3R5cGUnKTtcbmNvbnN0IHV0aWwgPSByZXF1aXJlKCcuLi91dGlsL3V0aWwnKTtcblxuLyoqXG4gKiBQcm9ncmFtQ29uZmlndXJhdGlvbiBjb250YWlucyB0aGUgbG9naWMgZm9yIGJpbmRpbmcgc3R5bGUgbGF5ZXIgcHJvcGVydGllcyBhbmQgdGlsZVxuICogbGF5ZXIgZmVhdHVyZSBkYXRhIGludG8gR0wgcHJvZ3JhbSB1bmlmb3JtcyBhbmQgdmVydGV4IGF0dHJpYnV0ZXMuXG4gKlxuICogTm9uLWRhdGEtZHJpdmVuIHByb3BlcnR5IHZhbHVlcyBhcmUgYm91bmQgdG8gc2hhZGVyIHVuaWZvcm1zLiBEYXRhLWRyaXZlbiBwcm9wZXJ0eVxuICogdmFsdWVzIGFyZSBib3VuZCB0byB2ZXJ0ZXggYXR0cmlidXRlcy4gSW4gb3JkZXIgdG8gc3VwcG9ydCBhIHVuaWZvcm0gR0xTTCBzeW50YXggb3ZlclxuICogYm90aCwgW01hcGJveCBHTCBTaGFkZXJzXShodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1zaGFkZXJzKSBkZWZpbmVzIGEgYCNwcmFnbWFgXG4gKiBhYnN0cmFjdGlvbiwgd2hpY2ggUHJvZ3JhbUNvbmZpZ3VyYXRpb24gaXMgcmVzcG9uc2libGUgZm9yIGltcGxlbWVudGluZy4gQXQgcnVudGltZSxcbiAqIGl0IGV4YW1pbmVzIHRoZSBhdHRyaWJ1dGVzIG9mIGEgcGFydGljdWxhciBsYXllciwgY29tYmluZXMgdGhpcyB3aXRoIGZpeGVkIGtub3dsZWRnZVxuICogYWJvdXQgaG93IGxheWVycyBvZiB0aGUgcGFydGljdWxhciB0eXBlIGFyZSBpbXBsZW1lbnRlZCwgYW5kIGRldGVybWluZXMgd2hpY2ggdW5pZm9ybXNcbiAqIGFuZCB2ZXJ0ZXggYXR0cmlidXRlcyB3aWxsIGJlIHJlcXVpcmVkLiBJdCBjYW4gdGhlbiBzdWJzdGl0dXRlIHRoZSBhcHByb3ByaWF0ZSB0ZXh0XG4gKiBpbnRvIHRoZSBzaGFkZXIgc291cmNlIGNvZGUsIGNyZWF0ZSBhbmQgbGluayBhIHByb2dyYW0sIGFuZCBiaW5kIHRoZSB1bmlmb3JtcyBhbmRcbiAqIHZlcnRleCBhdHRyaWJ1dGVzIGluIHByZXBhcmF0aW9uIGZvciBkcmF3aW5nLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFByb2dyYW1Db25maWd1cmF0aW9uIHtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSBbXTtcbiAgICAgICAgdGhpcy51bmlmb3JtcyA9IFtdO1xuICAgICAgICB0aGlzLmludGVycG9sYXRpb25Vbmlmb3JtcyA9IFtdO1xuICAgICAgICB0aGlzLnByYWdtYXMgPSB7dmVydGV4OiB7fSwgZnJhZ21lbnQ6IHt9fTtcbiAgICAgICAgdGhpcy5jYWNoZUtleSA9ICcnO1xuICAgIH1cblxuICAgIHN0YXRpYyBjcmVhdGVEeW5hbWljKGF0dHJpYnV0ZXMsIGxheWVyLCB6b29tKSB7XG4gICAgICAgIGNvbnN0IHNlbGYgPSBuZXcgUHJvZ3JhbUNvbmZpZ3VyYXRpb24oKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGF0dHJpYnV0ZUNvbmZpZyBvZiBhdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICBjb25zdCBhdHRyaWJ1dGUgPSBub3JtYWxpemVQYWludEF0dHJpYnV0ZShhdHRyaWJ1dGVDb25maWcsIGxheWVyKTtcbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBhdHRyaWJ1dGUubmFtZS5zbGljZSgyKTtcblxuICAgICAgICAgICAgaWYgKGxheWVyLmlzUGFpbnRWYWx1ZUZlYXR1cmVDb25zdGFudChhdHRyaWJ1dGUucHJvcGVydHkpKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5hZGRab29tQXR0cmlidXRlKG5hbWUsIGF0dHJpYnV0ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxheWVyLmlzUGFpbnRWYWx1ZVpvb21Db25zdGFudChhdHRyaWJ1dGUucHJvcGVydHkpKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5hZGRQcm9wZXJ0eUF0dHJpYnV0ZShuYW1lLCBhdHRyaWJ1dGUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzZWxmLmFkZFpvb21BbmRQcm9wZXJ0eUF0dHJpYnV0ZShuYW1lLCBhdHRyaWJ1dGUsIGxheWVyLCB6b29tKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzZWxmLlBhaW50VmVydGV4QXJyYXkgPSBjcmVhdGVWZXJ0ZXhBcnJheVR5cGUoc2VsZi5hdHRyaWJ1dGVzKTtcblxuICAgICAgICByZXR1cm4gc2VsZjtcbiAgICB9XG5cbiAgICBzdGF0aWMgY3JlYXRlU3RhdGljKHVuaWZvcm1OYW1lcykge1xuICAgICAgICBjb25zdCBzZWxmID0gbmV3IFByb2dyYW1Db25maWd1cmF0aW9uKCk7XG5cbiAgICAgICAgZm9yIChjb25zdCBuYW1lIG9mIHVuaWZvcm1OYW1lcykge1xuICAgICAgICAgICAgc2VsZi5hZGRVbmlmb3JtKG5hbWUsIGB1XyR7bmFtZX1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2VsZjtcbiAgICB9XG5cbiAgICBhZGRVbmlmb3JtKG5hbWUsIGlucHV0TmFtZSkge1xuICAgICAgICBjb25zdCBwcmFnbWFzID0gdGhpcy5nZXRQcmFnbWFzKG5hbWUpO1xuXG4gICAgICAgIHByYWdtYXMuZGVmaW5lLnB1c2goYHVuaWZvcm0ge3ByZWNpc2lvbn0ge3R5cGV9ICR7aW5wdXROYW1lfTtgKTtcbiAgICAgICAgcHJhZ21hcy5pbml0aWFsaXplLnB1c2goYHtwcmVjaXNpb259IHt0eXBlfSAke25hbWV9ID0gJHtpbnB1dE5hbWV9O2ApO1xuXG4gICAgICAgIHRoaXMuY2FjaGVLZXkgKz0gYC91XyR7bmFtZX1gO1xuICAgIH1cblxuICAgIGFkZFpvb21BdHRyaWJ1dGUobmFtZSwgYXR0cmlidXRlKSB7XG4gICAgICAgIHRoaXMudW5pZm9ybXMucHVzaChhdHRyaWJ1dGUpO1xuICAgICAgICB0aGlzLmFkZFVuaWZvcm0obmFtZSwgYXR0cmlidXRlLm5hbWUpO1xuICAgIH1cblxuICAgIGFkZFByb3BlcnR5QXR0cmlidXRlKG5hbWUsIGF0dHJpYnV0ZSkge1xuICAgICAgICBjb25zdCBwcmFnbWFzID0gdGhpcy5nZXRQcmFnbWFzKG5hbWUpO1xuXG4gICAgICAgIHRoaXMuYXR0cmlidXRlcy5wdXNoKGF0dHJpYnV0ZSk7XG5cbiAgICAgICAgcHJhZ21hcy5kZWZpbmUucHVzaChgdmFyeWluZyB7cHJlY2lzaW9ufSB7dHlwZX0gJHtuYW1lfTtgKTtcblxuICAgICAgICBwcmFnbWFzLnZlcnRleC5kZWZpbmUucHVzaChgYXR0cmlidXRlIHtwcmVjaXNpb259IHt0eXBlfSAke2F0dHJpYnV0ZS5uYW1lfTtgKTtcbiAgICAgICAgcHJhZ21hcy52ZXJ0ZXguaW5pdGlhbGl6ZS5wdXNoKGAke25hbWV9ID0gJHthdHRyaWJ1dGUubmFtZX0gLyAke2F0dHJpYnV0ZS5tdWx0aXBsaWVyfS4wO2ApO1xuXG4gICAgICAgIHRoaXMuY2FjaGVLZXkgKz0gYC9hXyR7bmFtZX1gO1xuICAgIH1cblxuICAgIGFkZFpvb21BbmRQcm9wZXJ0eUF0dHJpYnV0ZShuYW1lLCBhdHRyaWJ1dGUsIGxheWVyLCB6b29tKSB7XG4gICAgICAgIGNvbnN0IHByYWdtYXMgPSB0aGlzLmdldFByYWdtYXMobmFtZSk7XG5cbiAgICAgICAgcHJhZ21hcy5kZWZpbmUucHVzaChgdmFyeWluZyB7cHJlY2lzaW9ufSB7dHlwZX0gJHtuYW1lfTtgKTtcblxuICAgICAgICAvLyBQaWNrIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgb2Zmc2V0IHRvIGFkZCB0byB0aGUgYnVmZmVycy5cbiAgICAgICAgbGV0IG51bVN0b3BzID0gMDtcbiAgICAgICAgY29uc3Qgem9vbUxldmVscyA9IGxheWVyLmdldFBhaW50VmFsdWVTdG9wWm9vbUxldmVscyhhdHRyaWJ1dGUucHJvcGVydHkpO1xuICAgICAgICB3aGlsZSAobnVtU3RvcHMgPCB6b29tTGV2ZWxzLmxlbmd0aCAmJiB6b29tTGV2ZWxzW251bVN0b3BzXSA8IHpvb20pIG51bVN0b3BzKys7XG4gICAgICAgIGNvbnN0IHN0b3BPZmZzZXQgPSBNYXRoLm1heCgwLCBNYXRoLm1pbih6b29tTGV2ZWxzLmxlbmd0aCAtIDQsIG51bVN0b3BzIC0gMikpO1xuXG4gICAgICAgIGNvbnN0IHROYW1lID0gYHVfJHtuYW1lfV90YDtcblxuICAgICAgICBwcmFnbWFzLnZlcnRleC5kZWZpbmUucHVzaChgdW5pZm9ybSBsb3dwIGZsb2F0ICR7dE5hbWV9O2ApO1xuXG4gICAgICAgIHRoaXMuaW50ZXJwb2xhdGlvblVuaWZvcm1zLnB1c2goe1xuICAgICAgICAgICAgbmFtZTogdE5hbWUsXG4gICAgICAgICAgICBwcm9wZXJ0eTogYXR0cmlidXRlLnByb3BlcnR5LFxuICAgICAgICAgICAgc3RvcE9mZnNldFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBGaW5kIHRoZSBmb3VyIGNsb3Nlc3Qgc3RvcHMsIGlkZWFsbHkgd2l0aCB0d28gb24gZWFjaCBzaWRlIG9mIHRoZSB6b29tIGxldmVsLlxuICAgICAgICBjb25zdCB6b29tU3RvcHMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgcyA9IDA7IHMgPCA0OyBzKyspIHtcbiAgICAgICAgICAgIHpvb21TdG9wcy5wdXNoKHpvb21MZXZlbHNbTWF0aC5taW4oc3RvcE9mZnNldCArIHMsIHpvb21MZXZlbHMubGVuZ3RoIC0gMSldKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbXBvbmVudE5hbWVzID0gW107XG5cbiAgICAgICAgaWYgKGF0dHJpYnV0ZS5jb21wb25lbnRzID09PSAxKSB7XG4gICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMucHVzaCh1dGlsLmV4dGVuZCh7fSwgYXR0cmlidXRlLCB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50czogNCxcbiAgICAgICAgICAgICAgICB6b29tU3RvcHNcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIHByYWdtYXMudmVydGV4LmRlZmluZS5wdXNoKGBhdHRyaWJ1dGUge3ByZWNpc2lvbn0gdmVjNCAke2F0dHJpYnV0ZS5uYW1lfTtgKTtcbiAgICAgICAgICAgIGNvbXBvbmVudE5hbWVzLnB1c2goYXR0cmlidXRlLm5hbWUpO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IDQ7IGsrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudE5hbWUgPSBhdHRyaWJ1dGUubmFtZSArIGs7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50TmFtZXMucHVzaChjb21wb25lbnROYW1lKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuYXR0cmlidXRlcy5wdXNoKHV0aWwuZXh0ZW5kKHt9LCBhdHRyaWJ1dGUsIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogY29tcG9uZW50TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgem9vbVN0b3BzOiBbem9vbVN0b3BzW2tdXVxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICBwcmFnbWFzLnZlcnRleC5kZWZpbmUucHVzaChgYXR0cmlidXRlIHtwcmVjaXNpb259IHt0eXBlfSAke2NvbXBvbmVudE5hbWV9O2ApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHByYWdtYXMudmVydGV4LmluaXRpYWxpemUucHVzaChgJHtuYW1lfSA9IGV2YWx1YXRlX3pvb21fZnVuY3Rpb25fJHthdHRyaWJ1dGUuY29tcG9uZW50c30oXFxcbiAgICAgICAgICAgICR7Y29tcG9uZW50TmFtZXMuam9pbignLCAnKX0sICR7dE5hbWV9KSAvICR7YXR0cmlidXRlLm11bHRpcGxpZXJ9LjA7YCk7XG5cbiAgICAgICAgdGhpcy5jYWNoZUtleSArPSBgL3pfJHtuYW1lfWA7XG4gICAgfVxuXG4gICAgZ2V0UHJhZ21hcyhuYW1lKSB7XG4gICAgICAgIGlmICghdGhpcy5wcmFnbWFzW25hbWVdKSB7XG4gICAgICAgICAgICB0aGlzLnByYWdtYXNbbmFtZV0gICAgICAgICAgPSB7ZGVmaW5lOiBbXSwgaW5pdGlhbGl6ZTogW119O1xuICAgICAgICAgICAgdGhpcy5wcmFnbWFzW25hbWVdLmZyYWdtZW50ID0ge2RlZmluZTogW10sIGluaXRpYWxpemU6IFtdfTtcbiAgICAgICAgICAgIHRoaXMucHJhZ21hc1tuYW1lXS52ZXJ0ZXggICA9IHtkZWZpbmU6IFtdLCBpbml0aWFsaXplOiBbXX07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucHJhZ21hc1tuYW1lXTtcbiAgICB9XG5cbiAgICBhcHBseVByYWdtYXMoc291cmNlLCBzaGFkZXJUeXBlKSB7XG4gICAgICAgIHJldHVybiBzb3VyY2UucmVwbGFjZSgvI3ByYWdtYSBtYXBib3g6IChbXFx3XSspIChbXFx3XSspIChbXFx3XSspIChbXFx3XSspL2csIChtYXRjaCwgb3BlcmF0aW9uLCBwcmVjaXNpb24sIHR5cGUsIG5hbWUpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByYWdtYXNbbmFtZV1bb3BlcmF0aW9uXS5jb25jYXQodGhpcy5wcmFnbWFzW25hbWVdW3NoYWRlclR5cGVdW29wZXJhdGlvbl0pXG4gICAgICAgICAgICAgICAgLmpvaW4oJ1xcbicpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoL3t0eXBlfS9nLCB0eXBlKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC97cHJlY2lzaW9ufS9nLCBwcmVjaXNpb24pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwb3B1bGF0ZVBhaW50QXJyYXkobGF5ZXIsIHBhaW50QXJyYXksIGxlbmd0aCwgZ2xvYmFsUHJvcGVydGllcywgZmVhdHVyZVByb3BlcnRpZXMpIHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBwYWludEFycmF5Lmxlbmd0aDtcbiAgICAgICAgcGFpbnRBcnJheS5yZXNpemUobGVuZ3RoKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGF0dHJpYnV0ZSBvZiB0aGlzLmF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZ2V0UGFpbnRBdHRyaWJ1dGVWYWx1ZShhdHRyaWJ1dGUsIGxheWVyLCBnbG9iYWxQcm9wZXJ0aWVzLCBmZWF0dXJlUHJvcGVydGllcyk7XG5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmVydGV4ID0gcGFpbnRBcnJheS5nZXQoaSk7XG4gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZS5jb21wb25lbnRzID09PSA0KSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgNDsgYysrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhbYXR0cmlidXRlLm5hbWUgKyBjXSA9IHZhbHVlW2NdICogYXR0cmlidXRlLm11bHRpcGxpZXI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhbYXR0cmlidXRlLm5hbWVdID0gdmFsdWUgKiBhdHRyaWJ1dGUubXVsdGlwbGllcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRVbmlmb3JtcyhnbCwgcHJvZ3JhbSwgbGF5ZXIsIGdsb2JhbFByb3BlcnRpZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCB1bmlmb3JtIG9mIHRoaXMudW5pZm9ybXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gbGF5ZXIuZ2V0UGFpbnRWYWx1ZSh1bmlmb3JtLnByb3BlcnR5LCBnbG9iYWxQcm9wZXJ0aWVzKTtcbiAgICAgICAgICAgIGlmICh1bmlmb3JtLmNvbXBvbmVudHMgPT09IDQpIHtcbiAgICAgICAgICAgICAgICBnbC51bmlmb3JtNGZ2KHByb2dyYW1bdW5pZm9ybS5uYW1lXSwgdmFsdWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBnbC51bmlmb3JtMWYocHJvZ3JhbVt1bmlmb3JtLm5hbWVdLCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCB1bmlmb3JtIG9mIHRoaXMuaW50ZXJwb2xhdGlvblVuaWZvcm1zKSB7XG4gICAgICAgICAgICAvLyBzdG9wSW50ZXJwIGluZGljYXRlcyB3aGljaCBzdG9wcyBuZWVkIHRvIGJlIGludGVycG9sYXRlZC5cbiAgICAgICAgICAgIC8vIElmIHN0b3BJbnRlcnAgaXMgMy41IHRoZW4gaW50ZXJwb2xhdGUgaGFsZiB3YXkgYmV0d2VlbiBzdG9wcyAzIGFuZCA0LlxuICAgICAgICAgICAgY29uc3Qgc3RvcEludGVycCA9IGxheWVyLmdldFBhaW50SW50ZXJwb2xhdGlvblQodW5pZm9ybS5wcm9wZXJ0eSwgZ2xvYmFsUHJvcGVydGllcyk7XG4gICAgICAgICAgICAvLyBXZSBjYW4gb25seSBzdG9yZSBmb3VyIHN0b3AgdmFsdWVzIGluIHRoZSBidWZmZXJzLiBzdG9wT2Zmc2V0IGlzIHRoZSBudW1iZXIgb2Ygc3RvcHMgdGhhdCBjb21lXG4gICAgICAgICAgICAvLyBiZWZvcmUgdGhlIHN0b3BzIHRoYXQgd2VyZSBhZGRlZCB0byB0aGUgYnVmZmVycy5cbiAgICAgICAgICAgIGdsLnVuaWZvcm0xZihwcm9ncmFtW3VuaWZvcm0ubmFtZV0sIE1hdGgubWF4KDAsIE1hdGgubWluKDQsIHN0b3BJbnRlcnAgLSB1bmlmb3JtLnN0b3BPZmZzZXQpKSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIGdldFBhaW50QXR0cmlidXRlVmFsdWUoYXR0cmlidXRlLCBsYXllciwgZ2xvYmFsUHJvcGVydGllcywgZmVhdHVyZVByb3BlcnRpZXMpIHtcbiAgICBpZiAoIWF0dHJpYnV0ZS56b29tU3RvcHMpIHtcbiAgICAgICAgcmV0dXJuIGxheWVyLmdldFBhaW50VmFsdWUoYXR0cmlidXRlLnByb3BlcnR5LCBnbG9iYWxQcm9wZXJ0aWVzLCBmZWF0dXJlUHJvcGVydGllcyk7XG4gICAgfVxuICAgIC8vIGFkZCBvbmUgbXVsdGktY29tcG9uZW50IHZhbHVlIGxpa2UgY29sb3IwLCBvciBwYWNrIG11bHRpcGxlIHNpbmdsZS1jb21wb25lbnQgdmFsdWVzIGludG8gYSBmb3VyIGNvbXBvbmVudCBhdHRyaWJ1dGVcbiAgICBjb25zdCB2YWx1ZXMgPSBhdHRyaWJ1dGUuem9vbVN0b3BzLm1hcCgoem9vbSkgPT4gbGF5ZXIuZ2V0UGFpbnRWYWx1ZShcbiAgICAgICAgICAgIGF0dHJpYnV0ZS5wcm9wZXJ0eSwgdXRpbC5leHRlbmQoe30sIGdsb2JhbFByb3BlcnRpZXMsIHt6b29tfSksIGZlYXR1cmVQcm9wZXJ0aWVzKSk7XG5cbiAgICByZXR1cm4gdmFsdWVzLmxlbmd0aCA9PT0gMSA/IHZhbHVlc1swXSA6IHZhbHVlcztcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplUGFpbnRBdHRyaWJ1dGUoYXR0cmlidXRlLCBsYXllcikge1xuICAgIGNvbnN0IG5hbWUgPSBhdHRyaWJ1dGUucHJvcGVydHkucmVwbGFjZShgJHtsYXllci50eXBlfS1gLCAnJykucmVwbGFjZSgvLS9nLCAnXycpO1xuICAgIGNvbnN0IGlzQ29sb3IgPSBsYXllci5fcGFpbnRTcGVjaWZpY2F0aW9uc1thdHRyaWJ1dGUucHJvcGVydHldLnR5cGUgPT09ICdjb2xvcic7XG5cbiAgICByZXR1cm4gdXRpbC5leHRlbmQoe1xuICAgICAgICBuYW1lOiBgYV8ke25hbWV9YCxcbiAgICAgICAgY29tcG9uZW50czogaXNDb2xvciA/IDQgOiAxLFxuICAgICAgICBtdWx0aXBsaWVyOiBpc0NvbG9yID8gMjU1IDogMVxuICAgIH0sIGF0dHJpYnV0ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gUHJvZ3JhbUNvbmZpZ3VyYXRpb247XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IGNyZWF0ZVN0cnVjdEFycmF5VHlwZSA9IHJlcXVpcmUoJy4uL3V0aWwvc3RydWN0X2FycmF5Jyk7XG5cbmNvbnN0IFJhc3RlckJvdW5kc0FycmF5ID0gY3JlYXRlU3RydWN0QXJyYXlUeXBlKHtcbiAgICBtZW1iZXJzOiBbXG4gICAgICAgIHsgbmFtZTogJ2FfcG9zJywgdHlwZTogJ0ludDE2JywgY29tcG9uZW50czogMiB9LFxuICAgICAgICB7IG5hbWU6ICdhX3RleHR1cmVfcG9zJywgdHlwZTogJ0ludDE2JywgY29tcG9uZW50czogMiB9XG4gICAgXVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gUmFzdGVyQm91bmRzQXJyYXk7XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IGNyZWF0ZVN0cnVjdEFycmF5VHlwZSA9IHJlcXVpcmUoJy4uL3V0aWwvc3RydWN0X2FycmF5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlVmVydGV4QXJyYXlUeXBlO1xuXG4vKipcbiAqIEEgdmVydGV4IGFycmF5IHN0b3JlcyBkYXRhIGZvciBlYWNoIHZlcnRleCBpbiBhIGdlb21ldHJ5LiBFbGVtZW50cyBhcmUgYWxpZ25lZCB0byA0IGJ5dGVcbiAqIGJvdW5kYXJpZXMgZm9yIGJlc3QgcGVyZm9ybWFuY2UgaW4gV2ViR0wuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBjcmVhdGVWZXJ0ZXhBcnJheVR5cGUobWVtYmVycykge1xuICAgIHJldHVybiBjcmVhdGVTdHJ1Y3RBcnJheVR5cGUoe1xuICAgICAgICBtZW1iZXJzOiBtZW1iZXJzLFxuICAgICAgICBhbGlnbm1lbnQ6IDRcbiAgICB9KTtcbn1cbiIsIid1c2Ugc3RyaWN0Jztcbi8vICAgICAgXG5cbi8qKlxuICogQSBjb29yZGluYXRlIGlzIGEgY29sdW1uLCByb3csIHpvb20gY29tYmluYXRpb24sIG9mdGVuIHVzZWRcbiAqIGFzIHRoZSBkYXRhIGNvbXBvbmVudCBvZiBhIHRpbGUuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGNvbHVtblxuICogQHBhcmFtIHtudW1iZXJ9IHJvd1xuICogQHBhcmFtIHtudW1iZXJ9IHpvb21cbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIENvb3JkaW5hdGUge1xuICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICBcbiAgICBjb25zdHJ1Y3Rvcihjb2x1bW4gICAgICAgICwgcm93ICAgICAgICAsIHpvb20gICAgICAgICkge1xuICAgICAgICB0aGlzLmNvbHVtbiA9IGNvbHVtbjtcbiAgICAgICAgdGhpcy5yb3cgPSByb3c7XG4gICAgICAgIHRoaXMuem9vbSA9IHpvb207XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgY2xvbmUgb2YgdGhpcyBjb29yZGluYXRlIHRoYXQgY2FuIGJlIG11dGF0ZWQgd2l0aG91dFxuICAgICAqIGNoYW5naW5nIHRoZSBvcmlnaW5hbCBjb29yZGluYXRlXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7Q29vcmRpbmF0ZX0gY2xvbmVcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIHZhciBjb29yZCA9IG5ldyBDb29yZGluYXRlKDAsIDAsIDApO1xuICAgICAqIHZhciBjMiA9IGNvb3JkLmNsb25lKCk7XG4gICAgICogLy8gc2luY2UgY29vcmQgaXMgY2xvbmVkLCBtb2RpZnlpbmcgYSBwcm9wZXJ0eSBvZiBjMiBkb2VzXG4gICAgICogLy8gbm90IG1vZGlmeSBpdC5cbiAgICAgKiBjMi56b29tID0gMjtcbiAgICAgKi9cbiAgICBjbG9uZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDb29yZGluYXRlKHRoaXMuY29sdW1uLCB0aGlzLnJvdywgdGhpcy56b29tKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBab29tIHRoaXMgY29vcmRpbmF0ZSB0byBhIGdpdmVuIHpvb20gbGV2ZWwuIFRoaXMgcmV0dXJucyBhIG5ld1xuICAgICAqIGNvb3JkaW5hdGUgb2JqZWN0LCBub3QgbXV0YXRpbmcgdGhlIG9sZCBvbmUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gem9vbVxuICAgICAqIEByZXR1cm5zIHtDb29yZGluYXRlfSB6b29tZWQgY29vcmRpbmF0ZVxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiB2YXIgY29vcmQgPSBuZXcgQ29vcmRpbmF0ZSgwLCAwLCAwKTtcbiAgICAgKiB2YXIgYzIgPSBjb29yZC56b29tVG8oMSk7XG4gICAgICogYzIgLy8gZXF1YWxzIG5ldyBDb29yZGluYXRlKDAsIDAsIDEpO1xuICAgICAqL1xuICAgIHpvb21Ubyh6b29tICAgICAgICApIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fem9vbVRvKHpvb20pOyB9XG5cbiAgICAvKipcbiAgICAgKiBTdWJ0cmFjdCB0aGUgY29sdW1uIGFuZCByb3cgdmFsdWVzIG9mIHRoaXMgY29vcmRpbmF0ZSBmcm9tIHRob3NlXG4gICAgICogb2YgYW5vdGhlciBjb29yZGluYXRlLiBUaGUgb3RoZXIgY29vcmRpbmF0IHdpbGwgYmUgem9vbWVkIHRvIHRoZVxuICAgICAqIHNhbWUgbGV2ZWwgYXMgYHRoaXNgIGJlZm9yZSB0aGUgc3VidHJhY3Rpb24gb2NjdXJzXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0Nvb3JkaW5hdGV9IGMgb3RoZXIgY29vcmRpbmF0ZVxuICAgICAqIEByZXR1cm5zIHtDb29yZGluYXRlfSByZXN1bHRcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHN1YihjICAgICAgICAgICAgKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX3N1YihjKTsgfVxuXG4gICAgX3pvb21Ubyh6b29tICAgICAgICApIHtcbiAgICAgICAgY29uc3Qgc2NhbGUgPSBNYXRoLnBvdygyLCB6b29tIC0gdGhpcy56b29tKTtcbiAgICAgICAgdGhpcy5jb2x1bW4gKj0gc2NhbGU7XG4gICAgICAgIHRoaXMucm93ICo9IHNjYWxlO1xuICAgICAgICB0aGlzLnpvb20gPSB6b29tO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBfc3ViKGMgICAgICAgICAgICApIHtcbiAgICAgICAgYyA9IGMuem9vbVRvKHRoaXMuem9vbSk7XG4gICAgICAgIHRoaXMuY29sdW1uIC09IGMuY29sdW1uO1xuICAgICAgICB0aGlzLnJvdyAtPSBjLnJvdztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IENvb3JkaW5hdGU7XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHdyYXAgPSByZXF1aXJlKCcuLi91dGlsL3V0aWwnKS53cmFwO1xuXG4vKipcbiAqIEEgYExuZ0xhdGAgb2JqZWN0IHJlcHJlc2VudHMgYSBnaXZlbiBsb25naXR1ZGUgYW5kIGxhdGl0dWRlIGNvb3JkaW5hdGUsIG1lYXN1cmVkIGluIGRlZ3JlZXMuXG4gKlxuICogTWFwYm94IEdMIHVzZXMgbG9uZ2l0dWRlLCBsYXRpdHVkZSBjb29yZGluYXRlIG9yZGVyIChhcyBvcHBvc2VkIHRvIGxhdGl0dWRlLCBsb25naXR1ZGUpIHRvIG1hdGNoIEdlb0pTT04uXG4gKlxuICogTm90ZSB0aGF0IGFueSBNYXBib3ggR0wgbWV0aG9kIHRoYXQgYWNjZXB0cyBhIGBMbmdMYXRgIG9iamVjdCBhcyBhbiBhcmd1bWVudCBvciBvcHRpb25cbiAqIGNhbiBhbHNvIGFjY2VwdCBhbiBgQXJyYXlgIG9mIHR3byBudW1iZXJzIGFuZCB3aWxsIHBlcmZvcm0gYW4gaW1wbGljaXQgY29udmVyc2lvbi5cbiAqIFRoaXMgZmxleGlibGUgdHlwZSBpcyBkb2N1bWVudGVkIGFzIFtgTG5nTGF0TGlrZWBdKCNMbmdMYXRMaWtlKS5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gbG5nIExvbmdpdHVkZSwgbWVhc3VyZWQgaW4gZGVncmVlcy5cbiAqIEBwYXJhbSB7bnVtYmVyfSBsYXQgTGF0aXR1ZGUsIG1lYXN1cmVkIGluIGRlZ3JlZXMuXG4gKiBAZXhhbXBsZVxuICogdmFyIGxsID0gbmV3IG1hcGJveGdsLkxuZ0xhdCgtNzMuOTc0OSwgNDAuNzczNik7XG4gKiBAc2VlIFtHZXQgY29vcmRpbmF0ZXMgb2YgdGhlIG1vdXNlIHBvaW50ZXJdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvbW91c2UtcG9zaXRpb24vKVxuICogQHNlZSBbRGlzcGxheSBhIHBvcHVwXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3BvcHVwLylcbiAqIEBzZWUgW0hpZ2hsaWdodCBmZWF0dXJlcyB3aXRoaW4gYSBib3VuZGluZyBib3hdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvdXNpbmctYm94LXF1ZXJ5cmVuZGVyZWRmZWF0dXJlcy8pXG4gKiBAc2VlIFtDcmVhdGUgYSB0aW1lbGluZSBhbmltYXRpb25dKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvdGltZWxpbmUtYW5pbWF0aW9uLylcbiAqL1xuY2xhc3MgTG5nTGF0IHtcbiAgICBjb25zdHJ1Y3RvcihsbmcsIGxhdCkge1xuICAgICAgICBpZiAoaXNOYU4obG5nKSB8fCBpc05hTihsYXQpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgTG5nTGF0IG9iamVjdDogKCR7bG5nfSwgJHtsYXR9KWApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubG5nID0gK2xuZztcbiAgICAgICAgdGhpcy5sYXQgPSArbGF0O1xuICAgICAgICBpZiAodGhpcy5sYXQgPiA5MCB8fCB0aGlzLmxhdCA8IC05MCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIExuZ0xhdCBsYXRpdHVkZSB2YWx1ZTogbXVzdCBiZSBiZXR3ZWVuIC05MCBhbmQgOTAnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBuZXcgYExuZ0xhdGAgb2JqZWN0IHdob3NlIGxvbmdpdHVkZSBpcyB3cmFwcGVkIHRvIHRoZSByYW5nZSAoLTE4MCwgMTgwKS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtMbmdMYXR9IFRoZSB3cmFwcGVkIGBMbmdMYXRgIG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHZhciBsbCA9IG5ldyBtYXBib3hnbC5MbmdMYXQoMjg2LjAyNTEsIDQwLjc3MzYpO1xuICAgICAqIHZhciB3cmFwcGVkID0gbGwud3JhcCgpO1xuICAgICAqIHdyYXBwZWQubG5nOyAvLyA9IC03My45NzQ5XG4gICAgICovXG4gICAgd3JhcCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBMbmdMYXQod3JhcCh0aGlzLmxuZywgLTE4MCwgMTgwKSwgdGhpcy5sYXQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGNvb3JkaW5hdGVzIHJlcHJlc2VudGVkIGFzIGFuIGFycmF5IG9mIHR3byBudW1iZXJzLlxuICAgICAqXG4gICAgICogQHJldHVybnMge0FycmF5PG51bWJlcj59IFRoZSBjb29yZGluYXRlcyByZXByZXNldGVkIGFzIGFuIGFycmF5IG9mIGxvbmdpdHVkZSBhbmQgbGF0aXR1ZGUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiB2YXIgbGwgPSBuZXcgbWFwYm94Z2wuTG5nTGF0KC03My45NzQ5LCA0MC43NzM2KTtcbiAgICAgKiBsbC50b0FycmF5KCk7IC8vID0gWy03My45NzQ5LCA0MC43NzM2XVxuICAgICAqL1xuICAgIHRvQXJyYXkoKSB7XG4gICAgICAgIHJldHVybiBbdGhpcy5sbmcsIHRoaXMubGF0XTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBjb29yZGluYXRlcyByZXByZXNlbnQgYXMgYSBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgY29vcmRpbmF0ZXMgcmVwcmVzZW50ZWQgYXMgYSBzdHJpbmcgb2YgdGhlIGZvcm1hdCBgJ0xuZ0xhdChsbmcsIGxhdCknYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHZhciBsbCA9IG5ldyBtYXBib3hnbC5MbmdMYXQoLTczLjk3NDksIDQwLjc3MzYpO1xuICAgICAqIGxsLnRvU3RyaW5nKCk7IC8vID0gXCJMbmdMYXQoLTczLjk3NDksIDQwLjc3MzYpXCJcbiAgICAgKi9cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIGBMbmdMYXQoJHt0aGlzLmxuZ30sICR7dGhpcy5sYXR9KWA7XG4gICAgfVxufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIGFycmF5IG9mIHR3byBudW1iZXJzIHRvIGEgYExuZ0xhdGAgb2JqZWN0LlxuICpcbiAqIElmIGEgYExuZ0xhdGAgb2JqZWN0IGlzIHBhc3NlZCBpbiwgdGhlIGZ1bmN0aW9uIHJldHVybnMgaXQgdW5jaGFuZ2VkLlxuICpcbiAqIEBwYXJhbSB7TG5nTGF0TGlrZX0gaW5wdXQgQW4gYXJyYXkgb2YgdHdvIG51bWJlcnMgdG8gY29udmVydCwgb3IgYSBgTG5nTGF0YCBvYmplY3QgdG8gcmV0dXJuLlxuICogQHJldHVybnMge0xuZ0xhdH0gQSBuZXcgYExuZ0xhdGAgb2JqZWN0LCBpZiBhIGNvbnZlcnNpb24gb2NjdXJyZWQsIG9yIHRoZSBvcmlnaW5hbCBgTG5nTGF0YCBvYmplY3QuXG4gKiBAZXhhbXBsZVxuICogdmFyIGFyciA9IFstNzMuOTc0OSwgNDAuNzczNl07XG4gKiB2YXIgbGwgPSBtYXBib3hnbC5MbmdMYXQuY29udmVydChhcnIpO1xuICogbGw7ICAgLy8gPSBMbmdMYXQge2xuZzogLTczLjk3NDksIGxhdDogNDAuNzczNn1cbiAqL1xuTG5nTGF0LmNvbnZlcnQgPSBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBMbmdMYXQpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0O1xuICAgIH0gZWxzZSBpZiAoaW5wdXQgJiYgaW5wdXQuaGFzT3duUHJvcGVydHkoJ2xuZycpICYmIGlucHV0Lmhhc093blByb3BlcnR5KCdsYXQnKSkge1xuICAgICAgICByZXR1cm4gbmV3IExuZ0xhdChpbnB1dC5sbmcsIGlucHV0LmxhdCk7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGlucHV0KSAmJiBpbnB1dC5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBMbmdMYXQoaW5wdXRbMF0sIGlucHV0WzFdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJgTG5nTGF0TGlrZWAgYXJndW1lbnQgbXVzdCBiZSBzcGVjaWZpZWQgYXMgYSBMbmdMYXQgaW5zdGFuY2UsIGFuIG9iamVjdCB7bG5nOiA8bG5nPiwgbGF0OiA8bGF0Pn0sIG9yIGFuIGFycmF5IG9mIFs8bG5nPiwgPGxhdD5dXCIpO1xuICAgIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gTG5nTGF0O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBMbmdMYXQgPSByZXF1aXJlKCcuL2xuZ19sYXQnKTtcblxuLyoqXG4gKiBBIGBMbmdMYXRCb3VuZHNgIG9iamVjdCByZXByZXNlbnRzIGEgZ2VvZ3JhcGhpY2FsIGJvdW5kaW5nIGJveCxcbiAqIGRlZmluZWQgYnkgaXRzIHNvdXRod2VzdCBhbmQgbm9ydGhlYXN0IHBvaW50cyBpbiBsb25naXR1ZGUgYW5kIGxhdGl0dWRlLlxuICpcbiAqIElmIG5vIGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQgdG8gdGhlIGNvbnN0cnVjdG9yLCBhIGBudWxsYCBib3VuZGluZyBib3ggaXMgY3JlYXRlZC5cbiAqXG4gKiBOb3RlIHRoYXQgYW55IE1hcGJveCBHTCBtZXRob2QgdGhhdCBhY2NlcHRzIGEgYExuZ0xhdEJvdW5kc2Agb2JqZWN0IGFzIGFuIGFyZ3VtZW50IG9yIG9wdGlvblxuICogY2FuIGFsc28gYWNjZXB0IGFuIGBBcnJheWAgb2YgdHdvIFtgTG5nTGF0TGlrZWBdKCNMbmdMYXRMaWtlKSBjb25zdHJ1Y3RzIGFuZCB3aWxsIHBlcmZvcm0gYW4gaW1wbGljaXQgY29udmVyc2lvbi5cbiAqIFRoaXMgZmxleGlibGUgdHlwZSBpcyBkb2N1bWVudGVkIGFzIFtgTG5nTGF0Qm91bmRzTGlrZWBdKCNMbmdMYXRCb3VuZHNMaWtlKS5cbiAqXG4gKiBAcGFyYW0ge0xuZ0xhdExpa2V9IFtzd10gVGhlIHNvdXRod2VzdCBjb3JuZXIgb2YgdGhlIGJvdW5kaW5nIGJveC5cbiAqIEBwYXJhbSB7TG5nTGF0TGlrZX0gW25lXSBUaGUgbm9ydGhlYXN0IGNvcm5lciBvZiB0aGUgYm91bmRpbmcgYm94LlxuICogQGV4YW1wbGVcbiAqIHZhciBzdyA9IG5ldyBtYXBib3hnbC5MbmdMYXQoLTczLjk4NzYsIDQwLjc2NjEpO1xuICogdmFyIG5lID0gbmV3IG1hcGJveGdsLkxuZ0xhdCgtNzMuOTM5NywgNDAuODAwMik7XG4gKiB2YXIgbGxiID0gbmV3IG1hcGJveGdsLkxuZ0xhdEJvdW5kcyhzdywgbmUpO1xuICovXG5jbGFzcyBMbmdMYXRCb3VuZHMge1xuICAgIGNvbnN0cnVjdG9yKHN3LCBuZSkge1xuICAgICAgICBpZiAoIXN3KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSBpZiAobmUpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0U291dGhXZXN0KHN3KS5zZXROb3J0aEVhc3QobmUpO1xuICAgICAgICB9IGVsc2UgaWYgKHN3Lmxlbmd0aCA9PT0gNCkge1xuICAgICAgICAgICAgdGhpcy5zZXRTb3V0aFdlc3QoW3N3WzBdLCBzd1sxXV0pLnNldE5vcnRoRWFzdChbc3dbMl0sIHN3WzNdXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNldFNvdXRoV2VzdChzd1swXSkuc2V0Tm9ydGhFYXN0KHN3WzFdKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgbm9ydGhlYXN0IGNvcm5lciBvZiB0aGUgYm91bmRpbmcgYm94XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0xuZ0xhdExpa2V9IG5lXG4gICAgICogQHJldHVybnMge0xuZ0xhdEJvdW5kc30gYHRoaXNgXG4gICAgICovXG4gICAgc2V0Tm9ydGhFYXN0KG5lKSB7XG4gICAgICAgIHRoaXMuX25lID0gTG5nTGF0LmNvbnZlcnQobmUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIHNvdXRod2VzdCBjb3JuZXIgb2YgdGhlIGJvdW5kaW5nIGJveFxuICAgICAqXG4gICAgICogQHBhcmFtIHtMbmdMYXRMaWtlfSBzd1xuICAgICAqIEByZXR1cm5zIHtMbmdMYXRCb3VuZHN9IGB0aGlzYFxuICAgICAqL1xuICAgIHNldFNvdXRoV2VzdChzdykge1xuICAgICAgICB0aGlzLl9zdyA9IExuZ0xhdC5jb252ZXJ0KHN3KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXh0ZW5kIHRoZSBib3VuZHMgdG8gaW5jbHVkZSBhIGdpdmVuIExuZ0xhdCBvciBMbmdMYXRCb3VuZHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0xuZ0xhdHxMbmdMYXRCb3VuZHN9IG9iaiBvYmplY3QgdG8gZXh0ZW5kIHRvXG4gICAgICogQHJldHVybnMge0xuZ0xhdEJvdW5kc30gYHRoaXNgXG4gICAgICovXG4gICAgZXh0ZW5kKG9iaikge1xuICAgICAgICBjb25zdCBzdyA9IHRoaXMuX3N3LFxuICAgICAgICAgICAgbmUgPSB0aGlzLl9uZTtcbiAgICAgICAgbGV0IHN3MiwgbmUyO1xuXG4gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBMbmdMYXQpIHtcbiAgICAgICAgICAgIHN3MiA9IG9iajtcbiAgICAgICAgICAgIG5lMiA9IG9iajtcblxuICAgICAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIExuZ0xhdEJvdW5kcykge1xuICAgICAgICAgICAgc3cyID0gb2JqLl9zdztcbiAgICAgICAgICAgIG5lMiA9IG9iai5fbmU7XG5cbiAgICAgICAgICAgIGlmICghc3cyIHx8ICFuZTIpIHJldHVybiB0aGlzO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICAgICAgICAgICAgaWYgKG9iai5ldmVyeShBcnJheS5pc0FycmF5KSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5leHRlbmQoTG5nTGF0Qm91bmRzLmNvbnZlcnQob2JqKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXh0ZW5kKExuZ0xhdC5jb252ZXJ0KG9iaikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFzdyAmJiAhbmUpIHtcbiAgICAgICAgICAgIHRoaXMuX3N3ID0gbmV3IExuZ0xhdChzdzIubG5nLCBzdzIubGF0KTtcbiAgICAgICAgICAgIHRoaXMuX25lID0gbmV3IExuZ0xhdChuZTIubG5nLCBuZTIubGF0KTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3cubG5nID0gTWF0aC5taW4oc3cyLmxuZywgc3cubG5nKTtcbiAgICAgICAgICAgIHN3LmxhdCA9IE1hdGgubWluKHN3Mi5sYXQsIHN3LmxhdCk7XG4gICAgICAgICAgICBuZS5sbmcgPSBNYXRoLm1heChuZTIubG5nLCBuZS5sbmcpO1xuICAgICAgICAgICAgbmUubGF0ID0gTWF0aC5tYXgobmUyLmxhdCwgbmUubGF0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGdlb2dyYXBoaWNhbCBjb29yZGluYXRlIGVxdWlkaXN0YW50IGZyb20gdGhlIGJvdW5kaW5nIGJveCdzIGNvcm5lcnMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7TG5nTGF0fSBUaGUgYm91bmRpbmcgYm94J3MgY2VudGVyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogdmFyIGxsYiA9IG5ldyBtYXBib3hnbC5MbmdMYXRCb3VuZHMoWy03My45ODc2LCA0MC43NjYxXSwgWy03My45Mzk3LCA0MC44MDAyXSk7XG4gICAgICogbGxiLmdldENlbnRlcigpOyAvLyA9IExuZ0xhdCB7bG5nOiAtNzMuOTYzNjUsIGxhdDogNDAuNzgzMTV9XG4gICAgICovXG4gICAgZ2V0Q2VudGVyKCkge1xuICAgICAgICByZXR1cm4gbmV3IExuZ0xhdCgodGhpcy5fc3cubG5nICsgdGhpcy5fbmUubG5nKSAvIDIsICh0aGlzLl9zdy5sYXQgKyB0aGlzLl9uZS5sYXQpIC8gMik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc291dGh3ZXN0IGNvcm5lciBvZiB0aGUgYm91bmRpbmcgYm94LlxuICAgICAqXG4gICAgICogQHJldHVybnMge0xuZ0xhdH0gVGhlIHNvdXRod2VzdCBjb3JuZXIgb2YgdGhlIGJvdW5kaW5nIGJveC5cbiAgICAgKi9cbiAgICBnZXRTb3V0aFdlc3QoKSB7IHJldHVybiB0aGlzLl9zdzsgfVxuXG4gICAgLyoqXG4gICAgKiBSZXR1cm5zIHRoZSBub3J0aGVhc3QgY29ybmVyIG9mIHRoZSBib3VuZGluZyBib3guXG4gICAgKlxuICAgICogQHJldHVybnMge0xuZ0xhdH0gVGhlIG5vcnRoZWFzdCBjb3JuZXIgb2YgdGhlIGJvdW5kaW5nIGJveC5cbiAgICAgKi9cbiAgICBnZXROb3J0aEVhc3QoKSB7IHJldHVybiB0aGlzLl9uZTsgfVxuXG4gICAgLyoqXG4gICAgKiBSZXR1cm5zIHRoZSBub3J0aHdlc3QgY29ybmVyIG9mIHRoZSBib3VuZGluZyBib3guXG4gICAgKlxuICAgICogQHJldHVybnMge0xuZ0xhdH0gVGhlIG5vcnRod2VzdCBjb3JuZXIgb2YgdGhlIGJvdW5kaW5nIGJveC5cbiAgICAgKi9cbiAgICBnZXROb3J0aFdlc3QoKSB7IHJldHVybiBuZXcgTG5nTGF0KHRoaXMuZ2V0V2VzdCgpLCB0aGlzLmdldE5vcnRoKCkpOyB9XG5cbiAgICAvKipcbiAgICAqIFJldHVybnMgdGhlIHNvdXRoZWFzdCBjb3JuZXIgb2YgdGhlIGJvdW5kaW5nIGJveC5cbiAgICAqXG4gICAgKiBAcmV0dXJucyB7TG5nTGF0fSBUaGUgc291dGhlYXN0IGNvcm5lciBvZiB0aGUgYm91bmRpbmcgYm94LlxuICAgICAqL1xuICAgIGdldFNvdXRoRWFzdCgpIHsgcmV0dXJuIG5ldyBMbmdMYXQodGhpcy5nZXRFYXN0KCksIHRoaXMuZ2V0U291dGgoKSk7IH1cblxuICAgIC8qKlxuICAgICogUmV0dXJucyB0aGUgd2VzdCBlZGdlIG9mIHRoZSBib3VuZGluZyBib3guXG4gICAgKlxuICAgICogQHJldHVybnMge251bWJlcn0gVGhlIHdlc3QgZWRnZSBvZiB0aGUgYm91bmRpbmcgYm94LlxuICAgICAqL1xuICAgIGdldFdlc3QoKSB7IHJldHVybiB0aGlzLl9zdy5sbmc7IH1cblxuICAgIC8qKlxuICAgICogUmV0dXJucyB0aGUgc291dGggZWRnZSBvZiB0aGUgYm91bmRpbmcgYm94LlxuICAgICpcbiAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBzb3V0aCBlZGdlIG9mIHRoZSBib3VuZGluZyBib3guXG4gICAgICovXG4gICAgZ2V0U291dGgoKSB7IHJldHVybiB0aGlzLl9zdy5sYXQ7IH1cblxuICAgIC8qKlxuICAgICogUmV0dXJucyB0aGUgZWFzdCBlZGdlIG9mIHRoZSBib3VuZGluZyBib3guXG4gICAgKlxuICAgICogQHJldHVybnMge251bWJlcn0gVGhlIGVhc3QgZWRnZSBvZiB0aGUgYm91bmRpbmcgYm94LlxuICAgICAqL1xuICAgIGdldEVhc3QoKSB7IHJldHVybiB0aGlzLl9uZS5sbmc7IH1cblxuICAgIC8qKlxuICAgICogUmV0dXJucyB0aGUgbm9ydGggZWRnZSBvZiB0aGUgYm91bmRpbmcgYm94LlxuICAgICpcbiAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBub3J0aCBlZGdlIG9mIHRoZSBib3VuZGluZyBib3guXG4gICAgICovXG4gICAgZ2V0Tm9ydGgoKSB7IHJldHVybiB0aGlzLl9uZS5sYXQ7IH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGJvdW5kaW5nIGJveCByZXByZXNlbnRlZCBhcyBhbiBhcnJheS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtBcnJheTxBcnJheTxudW1iZXI+Pn0gVGhlIGJvdW5kaW5nIGJveCByZXByZXNlbnRlZCBhcyBhbiBhcnJheSwgY29uc2lzdGluZyBvZiB0aGVcbiAgICAgKiAgIHNvdXRod2VzdCBhbmQgbm9ydGhlYXN0IGNvb3JkaW5hdGVzIG9mIHRoZSBib3VuZGluZyByZXByZXNlbnRlZCBhcyBhcnJheXMgb2YgbnVtYmVycy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHZhciBsbGIgPSBuZXcgbWFwYm94Z2wuTG5nTGF0Qm91bmRzKFstNzMuOTg3NiwgNDAuNzY2MV0sIFstNzMuOTM5NywgNDAuODAwMl0pO1xuICAgICAqIGxsYi50b0FycmF5KCk7IC8vID0gW1stNzMuOTg3NiwgNDAuNzY2MV0sIFstNzMuOTM5NywgNDAuODAwMl1dXG4gICAgICovXG4gICAgdG9BcnJheSAoKSB7XG4gICAgICAgIHJldHVybiBbdGhpcy5fc3cudG9BcnJheSgpLCB0aGlzLl9uZS50b0FycmF5KCldO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgYm91bmRpbmcgYm94IHJlcHJlc2VudGVkIGFzIGEgc3RyaW5nLlxuICAgICAqXG4gICAgICogQHJldHVybnMge3N0cmluZ30gVGhlIGJvdW5kaW5nIGJveCByZXByZXNlbnRzIGFzIGEgc3RyaW5nIG9mIHRoZSBmb3JtYXRcbiAgICAgKiAgIGAnTG5nTGF0Qm91bmRzKExuZ0xhdChsbmcsIGxhdCksIExuZ0xhdChsbmcsIGxhdCkpJ2AuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiB2YXIgbGxiID0gbmV3IG1hcGJveGdsLkxuZ0xhdEJvdW5kcyhbLTczLjk4NzYsIDQwLjc2NjFdLCBbLTczLjkzOTcsIDQwLjgwMDJdKTtcbiAgICAgKiBsbGIudG9TdHJpbmcoKTsgLy8gPSBcIkxuZ0xhdEJvdW5kcyhMbmdMYXQoLTczLjk4NzYsIDQwLjc2NjEpLCBMbmdMYXQoLTczLjkzOTcsIDQwLjgwMDIpKVwiXG4gICAgICovXG4gICAgdG9TdHJpbmcgKCkge1xuICAgICAgICByZXR1cm4gYExuZ0xhdEJvdW5kcygke3RoaXMuX3N3LnRvU3RyaW5nKCl9LCAke3RoaXMuX25lLnRvU3RyaW5nKCl9KWA7XG4gICAgfVxufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIGFycmF5IHRvIGEgYExuZ0xhdEJvdW5kc2Agb2JqZWN0LlxuICpcbiAqIElmIGEgYExuZ0xhdEJvdW5kc2Agb2JqZWN0IGlzIHBhc3NlZCBpbiwgdGhlIGZ1bmN0aW9uIHJldHVybnMgaXQgdW5jaGFuZ2VkLlxuICpcbiAqIEludGVybmFsbHksIHRoZSBmdW5jdGlvbiBjYWxscyBgTG5nTGF0I2NvbnZlcnRgIHRvIGNvbnZlcnQgYXJyYXlzIHRvIGBMbmdMYXRgIHZhbHVlcy5cbiAqXG4gKiBAcGFyYW0ge0xuZ0xhdEJvdW5kc0xpa2V9IGlucHV0IEFuIGFycmF5IG9mIHR3byBjb29yZGluYXRlcyB0byBjb252ZXJ0LCBvciBhIGBMbmdMYXRCb3VuZHNgIG9iamVjdCB0byByZXR1cm4uXG4gKiBAcmV0dXJucyB7TG5nTGF0Qm91bmRzfSBBIG5ldyBgTG5nTGF0Qm91bmRzYCBvYmplY3QsIGlmIGEgY29udmVyc2lvbiBvY2N1cnJlZCwgb3IgdGhlIG9yaWdpbmFsIGBMbmdMYXRCb3VuZHNgIG9iamVjdC5cbiAqIEBleGFtcGxlXG4gKiB2YXIgYXJyID0gW1stNzMuOTg3NiwgNDAuNzY2MV0sIFstNzMuOTM5NywgNDAuODAwMl1dO1xuICogdmFyIGxsYiA9IG1hcGJveGdsLkxuZ0xhdEJvdW5kcy5jb252ZXJ0KGFycik7XG4gKiBsbGI7ICAgLy8gPSBMbmdMYXRCb3VuZHMge19zdzogTG5nTGF0IHtsbmc6IC03My45ODc2LCBsYXQ6IDQwLjc2NjF9LCBfbmU6IExuZ0xhdCB7bG5nOiAtNzMuOTM5NywgbGF0OiA0MC44MDAyfX1cbiAqL1xuTG5nTGF0Qm91bmRzLmNvbnZlcnQgPSBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICBpZiAoIWlucHV0IHx8IGlucHV0IGluc3RhbmNlb2YgTG5nTGF0Qm91bmRzKSByZXR1cm4gaW5wdXQ7XG4gICAgcmV0dXJuIG5ldyBMbmdMYXRCb3VuZHMoaW5wdXQpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBMbmdMYXRCb3VuZHM7XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IExuZ0xhdCA9IHJlcXVpcmUoJy4vbG5nX2xhdCcpLFxuICAgIFBvaW50ID0gcmVxdWlyZSgncG9pbnQtZ2VvbWV0cnknKSxcbiAgICBDb29yZGluYXRlID0gcmVxdWlyZSgnLi9jb29yZGluYXRlJyksXG4gICAgdXRpbCA9IHJlcXVpcmUoJy4uL3V0aWwvdXRpbCcpLFxuICAgIGludGVycCA9IHJlcXVpcmUoJy4uL3V0aWwvaW50ZXJwb2xhdGUnKSxcbiAgICBUaWxlQ29vcmQgPSByZXF1aXJlKCcuLi9zb3VyY2UvdGlsZV9jb29yZCcpLFxuICAgIEVYVEVOVCA9IHJlcXVpcmUoJy4uL2RhdGEvZXh0ZW50JyksXG4gICAgZ2xtYXRyaXggPSByZXF1aXJlKCdAbWFwYm94L2dsLW1hdHJpeCcpO1xuXG5jb25zdCB2ZWM0ID0gZ2xtYXRyaXgudmVjNCxcbiAgICBtYXQ0ID0gZ2xtYXRyaXgubWF0NCxcbiAgICBtYXQyID0gZ2xtYXRyaXgubWF0MjtcblxuLyoqXG4gKiBBIHNpbmdsZSB0cmFuc2Zvcm0sIGdlbmVyYWxseSB1c2VkIGZvciBhIHNpbmdsZSB0aWxlIHRvIGJlXG4gKiBzY2FsZWQsIHJvdGF0ZWQsIGFuZCB6b29tZWQuXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBUcmFuc2Zvcm0ge1xuICAgIGNvbnN0cnVjdG9yKG1pblpvb20sIG1heFpvb20sIHJlbmRlcldvcmxkQ29waWVzKSB7XG4gICAgICAgIHRoaXMudGlsZVNpemUgPSA1MTI7IC8vIGNvbnN0YW50XG5cbiAgICAgICAgdGhpcy5fcmVuZGVyV29ybGRDb3BpZXMgPSByZW5kZXJXb3JsZENvcGllcyA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IHJlbmRlcldvcmxkQ29waWVzO1xuICAgICAgICB0aGlzLl9taW5ab29tID0gbWluWm9vbSB8fCAwO1xuICAgICAgICB0aGlzLl9tYXhab29tID0gbWF4Wm9vbSB8fCAyMjtcblxuICAgICAgICB0aGlzLmxhdFJhbmdlID0gWy04NS4wNTExMywgODUuMDUxMTNdO1xuXG4gICAgICAgIHRoaXMud2lkdGggPSAwO1xuICAgICAgICB0aGlzLmhlaWdodCA9IDA7XG4gICAgICAgIHRoaXMuX2NlbnRlciA9IG5ldyBMbmdMYXQoMCwgMCk7XG4gICAgICAgIHRoaXMuem9vbSA9IDA7XG4gICAgICAgIHRoaXMuYW5nbGUgPSAwO1xuICAgICAgICB0aGlzLl9mb3YgPSAwLjY0MzUwMTEwODc5MzI4NDQ7XG4gICAgICAgIHRoaXMuX3BpdGNoID0gMDtcbiAgICAgICAgdGhpcy5fdW5tb2RpZmllZCA9IHRydWU7XG4gICAgfVxuXG4gICAgZ2V0IG1pblpvb20oKSB7IHJldHVybiB0aGlzLl9taW5ab29tOyB9XG4gICAgc2V0IG1pblpvb20oem9vbSkge1xuICAgICAgICBpZiAodGhpcy5fbWluWm9vbSA9PT0gem9vbSkgcmV0dXJuO1xuICAgICAgICB0aGlzLl9taW5ab29tID0gem9vbTtcbiAgICAgICAgdGhpcy56b29tID0gTWF0aC5tYXgodGhpcy56b29tLCB6b29tKTtcbiAgICB9XG5cbiAgICBnZXQgbWF4Wm9vbSgpIHsgcmV0dXJuIHRoaXMuX21heFpvb207IH1cbiAgICBzZXQgbWF4Wm9vbSh6b29tKSB7XG4gICAgICAgIGlmICh0aGlzLl9tYXhab29tID09PSB6b29tKSByZXR1cm47XG4gICAgICAgIHRoaXMuX21heFpvb20gPSB6b29tO1xuICAgICAgICB0aGlzLnpvb20gPSBNYXRoLm1pbih0aGlzLnpvb20sIHpvb20pO1xuICAgIH1cblxuICAgIGdldCB3b3JsZFNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRpbGVTaXplICogdGhpcy5zY2FsZTtcbiAgICB9XG5cbiAgICBnZXQgY2VudGVyUG9pbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNpemUuX2RpdigyKTtcbiAgICB9XG5cbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQb2ludCh0aGlzLndpZHRoLCB0aGlzLmhlaWdodCk7XG4gICAgfVxuXG4gICAgZ2V0IGJlYXJpbmcoKSB7XG4gICAgICAgIHJldHVybiAtdGhpcy5hbmdsZSAvIE1hdGguUEkgKiAxODA7XG4gICAgfVxuICAgIHNldCBiZWFyaW5nKGJlYXJpbmcpIHtcbiAgICAgICAgY29uc3QgYiA9IC11dGlsLndyYXAoYmVhcmluZywgLTE4MCwgMTgwKSAqIE1hdGguUEkgLyAxODA7XG4gICAgICAgIGlmICh0aGlzLmFuZ2xlID09PSBiKSByZXR1cm47XG4gICAgICAgIHRoaXMuX3VubW9kaWZpZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5hbmdsZSA9IGI7XG4gICAgICAgIHRoaXMuX2NhbGNNYXRyaWNlcygpO1xuXG4gICAgICAgIC8vIDJ4MiBtYXRyaXggZm9yIHJvdGF0aW5nIHBvaW50c1xuICAgICAgICB0aGlzLnJvdGF0aW9uTWF0cml4ID0gbWF0Mi5jcmVhdGUoKTtcbiAgICAgICAgbWF0Mi5yb3RhdGUodGhpcy5yb3RhdGlvbk1hdHJpeCwgdGhpcy5yb3RhdGlvbk1hdHJpeCwgdGhpcy5hbmdsZSk7XG4gICAgfVxuXG4gICAgZ2V0IHBpdGNoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGl0Y2ggLyBNYXRoLlBJICogMTgwO1xuICAgIH1cbiAgICBzZXQgcGl0Y2gocGl0Y2gpIHtcbiAgICAgICAgY29uc3QgcCA9IHV0aWwuY2xhbXAocGl0Y2gsIDAsIDYwKSAvIDE4MCAqIE1hdGguUEk7XG4gICAgICAgIGlmICh0aGlzLl9waXRjaCA9PT0gcCkgcmV0dXJuO1xuICAgICAgICB0aGlzLl91bm1vZGlmaWVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3BpdGNoID0gcDtcbiAgICAgICAgdGhpcy5fY2FsY01hdHJpY2VzKCk7XG4gICAgfVxuXG4gICAgZ2V0IGZvdigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZvdiAvIE1hdGguUEkgKiAxODA7XG4gICAgfVxuICAgIHNldCBmb3YoZm92KSB7XG4gICAgICAgIGZvdiA9IE1hdGgubWF4KDAuMDEsIE1hdGgubWluKDYwLCBmb3YpKTtcbiAgICAgICAgaWYgKHRoaXMuX2ZvdiA9PT0gZm92KSByZXR1cm47XG4gICAgICAgIHRoaXMuX3VubW9kaWZpZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fZm92ID0gZm92IC8gMTgwICogTWF0aC5QSTtcbiAgICAgICAgdGhpcy5fY2FsY01hdHJpY2VzKCk7XG4gICAgfVxuXG4gICAgZ2V0IHpvb20oKSB7IHJldHVybiB0aGlzLl96b29tOyB9XG4gICAgc2V0IHpvb20oem9vbSkge1xuICAgICAgICBjb25zdCB6ID0gTWF0aC5taW4oTWF0aC5tYXgoem9vbSwgdGhpcy5taW5ab29tKSwgdGhpcy5tYXhab29tKTtcbiAgICAgICAgaWYgKHRoaXMuX3pvb20gPT09IHopIHJldHVybjtcbiAgICAgICAgdGhpcy5fdW5tb2RpZmllZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl96b29tID0gejtcbiAgICAgICAgdGhpcy5zY2FsZSA9IHRoaXMuem9vbVNjYWxlKHopO1xuICAgICAgICB0aGlzLnRpbGVab29tID0gTWF0aC5mbG9vcih6KTtcbiAgICAgICAgdGhpcy56b29tRnJhY3Rpb24gPSB6IC0gdGhpcy50aWxlWm9vbTtcbiAgICAgICAgdGhpcy5fY29uc3RyYWluKCk7XG4gICAgICAgIHRoaXMuX2NhbGNNYXRyaWNlcygpO1xuICAgIH1cblxuICAgIGdldCBjZW50ZXIoKSB7IHJldHVybiB0aGlzLl9jZW50ZXI7IH1cbiAgICBzZXQgY2VudGVyKGNlbnRlcikge1xuICAgICAgICBpZiAoY2VudGVyLmxhdCA9PT0gdGhpcy5fY2VudGVyLmxhdCAmJiBjZW50ZXIubG5nID09PSB0aGlzLl9jZW50ZXIubG5nKSByZXR1cm47XG4gICAgICAgIHRoaXMuX3VubW9kaWZpZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fY2VudGVyID0gY2VudGVyO1xuICAgICAgICB0aGlzLl9jb25zdHJhaW4oKTtcbiAgICAgICAgdGhpcy5fY2FsY01hdHJpY2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIGEgem9vbSBsZXZlbCB0aGF0IHdpbGwgY292ZXIgYWxsIHRpbGVzIHRoZSB0cmFuc2Zvcm1cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBvcHRpb25zLnRpbGVTaXplXG4gICAgICogQHBhcmFtIHtib29sZWFufSBvcHRpb25zLnJvdW5kWm9vbVxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IHpvb20gbGV2ZWxcbiAgICAgKi9cbiAgICBjb3ZlcmluZ1pvb21MZXZlbChvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiAob3B0aW9ucy5yb3VuZFpvb20gPyBNYXRoLnJvdW5kIDogTWF0aC5mbG9vcikoXG4gICAgICAgICAgICB0aGlzLnpvb20gKyB0aGlzLnNjYWxlWm9vbSh0aGlzLnRpbGVTaXplIC8gb3B0aW9ucy50aWxlU2l6ZSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYWxsIGNvb3JkaW5hdGVzIHRoYXQgY291bGQgY292ZXIgdGhpcyB0cmFuc2Zvcm0gZm9yIGEgY292ZXJpbmdcbiAgICAgKiB6b29tIGxldmVsLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG9wdGlvbnMudGlsZVNpemVcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gb3B0aW9ucy5taW56b29tXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG9wdGlvbnMubWF4em9vbVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gb3B0aW9ucy5yb3VuZFpvb21cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IG9wdGlvbnMucmVwYXJzZU92ZXJzY2FsZWRcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IG9wdGlvbnMucmVuZGVyV29ybGRDb3BpZXNcbiAgICAgKiBAcmV0dXJucyB7QXJyYXk8VGlsZT59IHRpbGVzXG4gICAgICovXG4gICAgY292ZXJpbmdUaWxlcyhvcHRpb25zKSB7XG4gICAgICAgIGxldCB6ID0gdGhpcy5jb3ZlcmluZ1pvb21MZXZlbChvcHRpb25zKTtcbiAgICAgICAgY29uc3QgYWN0dWFsWiA9IHo7XG5cbiAgICAgICAgaWYgKHogPCBvcHRpb25zLm1pbnpvb20pIHJldHVybiBbXTtcbiAgICAgICAgaWYgKHogPiBvcHRpb25zLm1heHpvb20pIHogPSBvcHRpb25zLm1heHpvb207XG5cbiAgICAgICAgY29uc3QgY2VudGVyQ29vcmQgPSB0aGlzLnBvaW50Q29vcmRpbmF0ZSh0aGlzLmNlbnRlclBvaW50LCB6KTtcbiAgICAgICAgY29uc3QgY2VudGVyUG9pbnQgPSBuZXcgUG9pbnQoY2VudGVyQ29vcmQuY29sdW1uIC0gMC41LCBjZW50ZXJDb29yZC5yb3cgLSAwLjUpO1xuICAgICAgICBjb25zdCBjb3JuZXJDb29yZHMgPSBbXG4gICAgICAgICAgICB0aGlzLnBvaW50Q29vcmRpbmF0ZShuZXcgUG9pbnQoMCwgMCksIHopLFxuICAgICAgICAgICAgdGhpcy5wb2ludENvb3JkaW5hdGUobmV3IFBvaW50KHRoaXMud2lkdGgsIDApLCB6KSxcbiAgICAgICAgICAgIHRoaXMucG9pbnRDb29yZGluYXRlKG5ldyBQb2ludCh0aGlzLndpZHRoLCB0aGlzLmhlaWdodCksIHopLFxuICAgICAgICAgICAgdGhpcy5wb2ludENvb3JkaW5hdGUobmV3IFBvaW50KDAsIHRoaXMuaGVpZ2h0KSwgeilcbiAgICAgICAgXTtcbiAgICAgICAgcmV0dXJuIFRpbGVDb29yZC5jb3Zlcih6LCBjb3JuZXJDb29yZHMsIG9wdGlvbnMucmVwYXJzZU92ZXJzY2FsZWQgPyBhY3R1YWxaIDogeiwgdGhpcy5fcmVuZGVyV29ybGRDb3BpZXMpXG4gICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gY2VudGVyUG9pbnQuZGlzdChhKSAtIGNlbnRlclBvaW50LmRpc3QoYikpO1xuICAgIH1cblxuICAgIHJlc2l6ZSh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICAgIHRoaXMud2lkdGggPSB3aWR0aDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG5cbiAgICAgICAgdGhpcy5waXhlbHNUb0dMVW5pdHMgPSBbMiAvIHdpZHRoLCAtMiAvIGhlaWdodF07XG4gICAgICAgIHRoaXMuX2NvbnN0cmFpbigpO1xuICAgICAgICB0aGlzLl9jYWxjTWF0cmljZXMoKTtcbiAgICB9XG5cbiAgICBnZXQgdW5tb2RpZmllZCgpIHsgcmV0dXJuIHRoaXMuX3VubW9kaWZpZWQ7IH1cblxuICAgIHpvb21TY2FsZSh6b29tKSB7IHJldHVybiBNYXRoLnBvdygyLCB6b29tKTsgfVxuICAgIHNjYWxlWm9vbShzY2FsZSkgeyByZXR1cm4gTWF0aC5sb2coc2NhbGUpIC8gTWF0aC5MTjI7IH1cblxuICAgIHByb2plY3QobG5nbGF0KSB7XG4gICAgICAgIHJldHVybiBuZXcgUG9pbnQoXG4gICAgICAgICAgICB0aGlzLmxuZ1gobG5nbGF0LmxuZyksXG4gICAgICAgICAgICB0aGlzLmxhdFkobG5nbGF0LmxhdCkpO1xuICAgIH1cblxuICAgIHVucHJvamVjdChwb2ludCkge1xuICAgICAgICByZXR1cm4gbmV3IExuZ0xhdChcbiAgICAgICAgICAgIHRoaXMueExuZyhwb2ludC54KSxcbiAgICAgICAgICAgIHRoaXMueUxhdChwb2ludC55KSk7XG4gICAgfVxuXG4gICAgZ2V0IHgoKSB7IHJldHVybiB0aGlzLmxuZ1godGhpcy5jZW50ZXIubG5nKTsgfVxuICAgIGdldCB5KCkgeyByZXR1cm4gdGhpcy5sYXRZKHRoaXMuY2VudGVyLmxhdCk7IH1cblxuICAgIGdldCBwb2ludCgpIHsgcmV0dXJuIG5ldyBQb2ludCh0aGlzLngsIHRoaXMueSk7IH1cblxuICAgIC8qKlxuICAgICAqIGxhdGl0dWRlIHRvIGFic29sdXRlIHggY29vcmRcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbG9uXG4gICAgICogQHJldHVybnMge251bWJlcn0gcGl4ZWwgY29vcmRpbmF0ZVxuICAgICAqL1xuICAgIGxuZ1gobG5nKSB7XG4gICAgICAgIHJldHVybiAoMTgwICsgbG5nKSAqIHRoaXMud29ybGRTaXplIC8gMzYwO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBsYXRpdHVkZSB0byBhYnNvbHV0ZSB5IGNvb3JkXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGxhdFxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IHBpeGVsIGNvb3JkaW5hdGVcbiAgICAgKi9cbiAgICBsYXRZKGxhdCkge1xuICAgICAgICBjb25zdCB5ID0gMTgwIC8gTWF0aC5QSSAqIE1hdGgubG9nKE1hdGgudGFuKE1hdGguUEkgLyA0ICsgbGF0ICogTWF0aC5QSSAvIDM2MCkpO1xuICAgICAgICByZXR1cm4gKDE4MCAtIHkpICogdGhpcy53b3JsZFNpemUgLyAzNjA7XG4gICAgfVxuXG4gICAgeExuZyh4KSB7XG4gICAgICAgIHJldHVybiB4ICogMzYwIC8gdGhpcy53b3JsZFNpemUgLSAxODA7XG4gICAgfVxuICAgIHlMYXQoeSkge1xuICAgICAgICBjb25zdCB5MiA9IDE4MCAtIHkgKiAzNjAgLyB0aGlzLndvcmxkU2l6ZTtcbiAgICAgICAgcmV0dXJuIDM2MCAvIE1hdGguUEkgKiBNYXRoLmF0YW4oTWF0aC5leHAoeTIgKiBNYXRoLlBJIC8gMTgwKSkgLSA5MDtcbiAgICB9XG5cbiAgICBzZXRMb2NhdGlvbkF0UG9pbnQobG5nbGF0LCBwb2ludCkge1xuICAgICAgICBjb25zdCB0cmFuc2xhdGUgPSB0aGlzLnBvaW50Q29vcmRpbmF0ZShwb2ludCkuX3N1Yih0aGlzLnBvaW50Q29vcmRpbmF0ZSh0aGlzLmNlbnRlclBvaW50KSk7XG4gICAgICAgIHRoaXMuY2VudGVyID0gdGhpcy5jb29yZGluYXRlTG9jYXRpb24odGhpcy5sb2NhdGlvbkNvb3JkaW5hdGUobG5nbGF0KS5fc3ViKHRyYW5zbGF0ZSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdpdmVuIGEgbG9jYXRpb24sIHJldHVybiB0aGUgc2NyZWVuIHBvaW50IHRoYXQgY29ycmVzcG9uZHMgdG8gaXRcbiAgICAgKiBAcGFyYW0ge0xuZ0xhdH0gbG5nbGF0IGxvY2F0aW9uXG4gICAgICogQHJldHVybnMge1BvaW50fSBzY3JlZW4gcG9pbnRcbiAgICAgKi9cbiAgICBsb2NhdGlvblBvaW50KGxuZ2xhdCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb29yZGluYXRlUG9pbnQodGhpcy5sb2NhdGlvbkNvb3JkaW5hdGUobG5nbGF0KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2l2ZW4gYSBwb2ludCBvbiBzY3JlZW4sIHJldHVybiBpdHMgbG5nbGF0XG4gICAgICogQHBhcmFtIHtQb2ludH0gcCBzY3JlZW4gcG9pbnRcbiAgICAgKiBAcmV0dXJucyB7TG5nTGF0fSBsbmdsYXQgbG9jYXRpb25cbiAgICAgKi9cbiAgICBwb2ludExvY2F0aW9uKHApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29vcmRpbmF0ZUxvY2F0aW9uKHRoaXMucG9pbnRDb29yZGluYXRlKHApKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHaXZlbiBhIGdlb2dyYXBoaWNhbCBsbmdsYXQsIHJldHVybiBhbiB1bnJvdW5kZWRcbiAgICAgKiBjb29yZGluYXRlIHRoYXQgcmVwcmVzZW50cyBpdCBhdCB0aGlzIHRyYW5zZm9ybSdzIHpvb20gbGV2ZWwuXG4gICAgICogQHBhcmFtIHtMbmdMYXR9IGxuZ2xhdFxuICAgICAqIEByZXR1cm5zIHtDb29yZGluYXRlfVxuICAgICAqL1xuICAgIGxvY2F0aW9uQ29vcmRpbmF0ZShsbmdsYXQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDb29yZGluYXRlKFxuICAgICAgICAgICAgdGhpcy5sbmdYKGxuZ2xhdC5sbmcpIC8gdGhpcy50aWxlU2l6ZSxcbiAgICAgICAgICAgIHRoaXMubGF0WShsbmdsYXQubGF0KSAvIHRoaXMudGlsZVNpemUsXG4gICAgICAgICAgICB0aGlzLnpvb20pLnpvb21Ubyh0aGlzLnRpbGVab29tKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHaXZlbiBhIENvb3JkaW5hdGUsIHJldHVybiBpdHMgZ2VvZ3JhcGhpY2FsIHBvc2l0aW9uLlxuICAgICAqIEBwYXJhbSB7Q29vcmRpbmF0ZX0gY29vcmRcbiAgICAgKiBAcmV0dXJucyB7TG5nTGF0fSBsbmdsYXRcbiAgICAgKi9cbiAgICBjb29yZGluYXRlTG9jYXRpb24oY29vcmQpIHtcbiAgICAgICAgY29uc3Qgem9vbWVkQ29vcmQgPSBjb29yZC56b29tVG8odGhpcy56b29tKTtcbiAgICAgICAgcmV0dXJuIG5ldyBMbmdMYXQoXG4gICAgICAgICAgICB0aGlzLnhMbmcoem9vbWVkQ29vcmQuY29sdW1uICogdGhpcy50aWxlU2l6ZSksXG4gICAgICAgICAgICB0aGlzLnlMYXQoem9vbWVkQ29vcmQucm93ICogdGhpcy50aWxlU2l6ZSkpO1xuICAgIH1cblxuICAgIHBvaW50Q29vcmRpbmF0ZShwLCB6b29tKSB7XG4gICAgICAgIGlmICh6b29tID09PSB1bmRlZmluZWQpIHpvb20gPSB0aGlzLnRpbGVab29tO1xuXG4gICAgICAgIGNvbnN0IHRhcmdldFogPSAwO1xuICAgICAgICAvLyBzaW5jZSB3ZSBkb24ndCBrbm93IHRoZSBjb3JyZWN0IHByb2plY3RlZCB6IHZhbHVlIGZvciB0aGUgcG9pbnQsXG4gICAgICAgIC8vIHVucHJvamVjdCB0d28gcG9pbnRzIHRvIGdldCBhIGxpbmUgYW5kIHRoZW4gZmluZCB0aGUgcG9pbnQgb24gdGhhdFxuICAgICAgICAvLyBsaW5lIHdpdGggej0wXG5cbiAgICAgICAgY29uc3QgY29vcmQwID0gW3AueCwgcC55LCAwLCAxXTtcbiAgICAgICAgY29uc3QgY29vcmQxID0gW3AueCwgcC55LCAxLCAxXTtcblxuICAgICAgICB2ZWM0LnRyYW5zZm9ybU1hdDQoY29vcmQwLCBjb29yZDAsIHRoaXMucGl4ZWxNYXRyaXhJbnZlcnNlKTtcbiAgICAgICAgdmVjNC50cmFuc2Zvcm1NYXQ0KGNvb3JkMSwgY29vcmQxLCB0aGlzLnBpeGVsTWF0cml4SW52ZXJzZSk7XG5cbiAgICAgICAgY29uc3QgdzAgPSBjb29yZDBbM107XG4gICAgICAgIGNvbnN0IHcxID0gY29vcmQxWzNdO1xuICAgICAgICBjb25zdCB4MCA9IGNvb3JkMFswXSAvIHcwO1xuICAgICAgICBjb25zdCB4MSA9IGNvb3JkMVswXSAvIHcxO1xuICAgICAgICBjb25zdCB5MCA9IGNvb3JkMFsxXSAvIHcwO1xuICAgICAgICBjb25zdCB5MSA9IGNvb3JkMVsxXSAvIHcxO1xuICAgICAgICBjb25zdCB6MCA9IGNvb3JkMFsyXSAvIHcwO1xuICAgICAgICBjb25zdCB6MSA9IGNvb3JkMVsyXSAvIHcxO1xuXG4gICAgICAgIGNvbnN0IHQgPSB6MCA9PT0gejEgPyAwIDogKHRhcmdldFogLSB6MCkgLyAoejEgLSB6MCk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBDb29yZGluYXRlKFxuICAgICAgICAgICAgaW50ZXJwKHgwLCB4MSwgdCkgLyB0aGlzLnRpbGVTaXplLFxuICAgICAgICAgICAgaW50ZXJwKHkwLCB5MSwgdCkgLyB0aGlzLnRpbGVTaXplLFxuICAgICAgICAgICAgdGhpcy56b29tKS5fem9vbVRvKHpvb20pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdpdmVuIGEgY29vcmRpbmF0ZSwgcmV0dXJuIHRoZSBzY3JlZW4gcG9pbnQgdGhhdCBjb3JyZXNwb25kcyB0byBpdFxuICAgICAqIEBwYXJhbSB7Q29vcmRpbmF0ZX0gY29vcmRcbiAgICAgKiBAcmV0dXJucyB7UG9pbnR9IHNjcmVlbiBwb2ludFxuICAgICAqL1xuICAgIGNvb3JkaW5hdGVQb2ludChjb29yZCkge1xuICAgICAgICBjb25zdCB6b29tZWRDb29yZCA9IGNvb3JkLnpvb21Ubyh0aGlzLnpvb20pO1xuICAgICAgICBjb25zdCBwID0gW3pvb21lZENvb3JkLmNvbHVtbiAqIHRoaXMudGlsZVNpemUsIHpvb21lZENvb3JkLnJvdyAqIHRoaXMudGlsZVNpemUsIDAsIDFdO1xuICAgICAgICB2ZWM0LnRyYW5zZm9ybU1hdDQocCwgcCwgdGhpcy5waXhlbE1hdHJpeCk7XG4gICAgICAgIHJldHVybiBuZXcgUG9pbnQocFswXSAvIHBbM10sIHBbMV0gLyBwWzNdKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGUgdGhlIHBvc01hdHJpeCB0aGF0LCBnaXZlbiBhIHRpbGUgY29vcmRpbmF0ZSwgd291bGQgYmUgdXNlZCB0byBkaXNwbGF5IHRoZSB0aWxlIG9uIGEgbWFwLlxuICAgICAqIEBwYXJhbSB7VGlsZUNvb3JkfSB0aWxlQ29vcmRcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWF4Wm9vbSBtYXhpbXVtIHNvdXJjZSB6b29tIHRvIGFjY291bnQgZm9yIG92ZXJzY2FsaW5nXG4gICAgICovXG4gICAgY2FsY3VsYXRlUG9zTWF0cml4KHRpbGVDb29yZCwgbWF4Wm9vbSkge1xuICAgICAgICAvLyBpZiB6ID4gbWF4em9vbSB0aGVuIHRoZSB0aWxlIGlzIGFjdHVhbGx5IGEgb3ZlcnNjYWxlZCBtYXh6b29tIHRpbGUsXG4gICAgICAgIC8vIHNvIGNhbGN1bGF0ZSB0aGUgbWF0cml4IHRoZSBtYXh6b29tIHRpbGUgd291bGQgdXNlLlxuICAgICAgICBjb25zdCBjb29yZCA9IHRpbGVDb29yZC50b0Nvb3JkaW5hdGUobWF4Wm9vbSk7XG4gICAgICAgIGNvbnN0IHNjYWxlID0gdGhpcy53b3JsZFNpemUgLyB0aGlzLnpvb21TY2FsZShjb29yZC56b29tKTtcblxuICAgICAgICBjb25zdCBwb3NNYXRyaXggPSBtYXQ0LmlkZW50aXR5KG5ldyBGbG9hdDY0QXJyYXkoMTYpKTtcbiAgICAgICAgbWF0NC50cmFuc2xhdGUocG9zTWF0cml4LCBwb3NNYXRyaXgsIFtjb29yZC5jb2x1bW4gKiBzY2FsZSwgY29vcmQucm93ICogc2NhbGUsIDBdKTtcbiAgICAgICAgbWF0NC5zY2FsZShwb3NNYXRyaXgsIHBvc01hdHJpeCwgW3NjYWxlIC8gRVhURU5ULCBzY2FsZSAvIEVYVEVOVCwgMV0pO1xuICAgICAgICBtYXQ0Lm11bHRpcGx5KHBvc01hdHJpeCwgdGhpcy5wcm9qTWF0cml4LCBwb3NNYXRyaXgpO1xuXG4gICAgICAgIHJldHVybiBuZXcgRmxvYXQzMkFycmF5KHBvc01hdHJpeCk7XG4gICAgfVxuXG4gICAgX2NvbnN0cmFpbigpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNlbnRlciB8fCAhdGhpcy53aWR0aCB8fCAhdGhpcy5oZWlnaHQgfHwgdGhpcy5fY29uc3RyYWluaW5nKSByZXR1cm47XG5cbiAgICAgICAgdGhpcy5fY29uc3RyYWluaW5nID0gdHJ1ZTtcblxuICAgICAgICBsZXQgbWluWSwgbWF4WSwgbWluWCwgbWF4WCwgc3ksIHN4LCB4MiwgeTI7XG4gICAgICAgIGNvbnN0IHNpemUgPSB0aGlzLnNpemUsXG4gICAgICAgICAgICB1bm1vZGlmaWVkID0gdGhpcy5fdW5tb2RpZmllZDtcblxuICAgICAgICBpZiAodGhpcy5sYXRSYW5nZSkge1xuICAgICAgICAgICAgbWluWSA9IHRoaXMubGF0WSh0aGlzLmxhdFJhbmdlWzFdKTtcbiAgICAgICAgICAgIG1heFkgPSB0aGlzLmxhdFkodGhpcy5sYXRSYW5nZVswXSk7XG4gICAgICAgICAgICBzeSA9IG1heFkgLSBtaW5ZIDwgc2l6ZS55ID8gc2l6ZS55IC8gKG1heFkgLSBtaW5ZKSA6IDA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5sbmdSYW5nZSkge1xuICAgICAgICAgICAgbWluWCA9IHRoaXMubG5nWCh0aGlzLmxuZ1JhbmdlWzBdKTtcbiAgICAgICAgICAgIG1heFggPSB0aGlzLmxuZ1godGhpcy5sbmdSYW5nZVsxXSk7XG4gICAgICAgICAgICBzeCA9IG1heFggLSBtaW5YIDwgc2l6ZS54ID8gc2l6ZS54IC8gKG1heFggLSBtaW5YKSA6IDA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBob3cgbXVjaCB0aGUgbWFwIHNob3VsZCBzY2FsZSB0byBmaXQgdGhlIHNjcmVlbiBpbnRvIGdpdmVuIGxhdGl0dWRlL2xvbmdpdHVkZSByYW5nZXNcbiAgICAgICAgY29uc3QgcyA9IE1hdGgubWF4KHN4IHx8IDAsIHN5IHx8IDApO1xuXG4gICAgICAgIGlmIChzKSB7XG4gICAgICAgICAgICB0aGlzLmNlbnRlciA9IHRoaXMudW5wcm9qZWN0KG5ldyBQb2ludChcbiAgICAgICAgICAgICAgICBzeCA/IChtYXhYICsgbWluWCkgLyAyIDogdGhpcy54LFxuICAgICAgICAgICAgICAgIHN5ID8gKG1heFkgKyBtaW5ZKSAvIDIgOiB0aGlzLnkpKTtcbiAgICAgICAgICAgIHRoaXMuem9vbSArPSB0aGlzLnNjYWxlWm9vbShzKTtcbiAgICAgICAgICAgIHRoaXMuX3VubW9kaWZpZWQgPSB1bm1vZGlmaWVkO1xuICAgICAgICAgICAgdGhpcy5fY29uc3RyYWluaW5nID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5sYXRSYW5nZSkge1xuICAgICAgICAgICAgY29uc3QgeSA9IHRoaXMueSxcbiAgICAgICAgICAgICAgICBoMiA9IHNpemUueSAvIDI7XG5cbiAgICAgICAgICAgIGlmICh5IC0gaDIgPCBtaW5ZKSB5MiA9IG1pblkgKyBoMjtcbiAgICAgICAgICAgIGlmICh5ICsgaDIgPiBtYXhZKSB5MiA9IG1heFkgLSBoMjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmxuZ1JhbmdlKSB7XG4gICAgICAgICAgICBjb25zdCB4ID0gdGhpcy54LFxuICAgICAgICAgICAgICAgIHcyID0gc2l6ZS54IC8gMjtcblxuICAgICAgICAgICAgaWYgKHggLSB3MiA8IG1pblgpIHgyID0gbWluWCArIHcyO1xuICAgICAgICAgICAgaWYgKHggKyB3MiA+IG1heFgpIHgyID0gbWF4WCAtIHcyO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcGFuIHRoZSBtYXAgaWYgdGhlIHNjcmVlbiBnb2VzIG9mZiB0aGUgcmFuZ2VcbiAgICAgICAgaWYgKHgyICE9PSB1bmRlZmluZWQgfHwgeTIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5jZW50ZXIgPSB0aGlzLnVucHJvamVjdChuZXcgUG9pbnQoXG4gICAgICAgICAgICAgICAgeDIgIT09IHVuZGVmaW5lZCA/IHgyIDogdGhpcy54LFxuICAgICAgICAgICAgICAgIHkyICE9PSB1bmRlZmluZWQgPyB5MiA6IHRoaXMueSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fdW5tb2RpZmllZCA9IHVubW9kaWZpZWQ7XG4gICAgICAgIHRoaXMuX2NvbnN0cmFpbmluZyA9IGZhbHNlO1xuICAgIH1cblxuICAgIF9jYWxjTWF0cmljZXMoKSB7XG4gICAgICAgIGlmICghdGhpcy5oZWlnaHQpIHJldHVybjtcblxuICAgICAgICB0aGlzLmNhbWVyYVRvQ2VudGVyRGlzdGFuY2UgPSAwLjUgLyBNYXRoLnRhbih0aGlzLl9mb3YgLyAyKSAqIHRoaXMuaGVpZ2h0O1xuXG4gICAgICAgIC8vIEZpbmQgdGhlIGRpc3RhbmNlIGZyb20gdGhlIGNlbnRlciBwb2ludCBbd2lkdGgvMiwgaGVpZ2h0LzJdIHRvIHRoZVxuICAgICAgICAvLyBjZW50ZXIgdG9wIHBvaW50IFt3aWR0aC8yLCAwXSBpbiBaIHVuaXRzLCB1c2luZyB0aGUgbGF3IG9mIHNpbmVzLlxuICAgICAgICAvLyAxIFogdW5pdCBpcyBlcXVpdmFsZW50IHRvIDEgaG9yaXpvbnRhbCBweCBhdCB0aGUgY2VudGVyIG9mIHRoZSBtYXBcbiAgICAgICAgLy8gKHRoZSBkaXN0YW5jZSBiZXR3ZWVuW3dpZHRoLzIsIGhlaWdodC8yXSBhbmQgW3dpZHRoLzIgKyAxLCBoZWlnaHQvMl0pXG4gICAgICAgIGNvbnN0IGhhbGZGb3YgPSB0aGlzLl9mb3YgLyAyO1xuICAgICAgICBjb25zdCBncm91bmRBbmdsZSA9IE1hdGguUEkgLyAyICsgdGhpcy5fcGl0Y2g7XG4gICAgICAgIGNvbnN0IHRvcEhhbGZTdXJmYWNlRGlzdGFuY2UgPSBNYXRoLnNpbihoYWxmRm92KSAqIHRoaXMuY2FtZXJhVG9DZW50ZXJEaXN0YW5jZSAvIE1hdGguc2luKE1hdGguUEkgLSBncm91bmRBbmdsZSAtIGhhbGZGb3YpO1xuXG4gICAgICAgIC8vIENhbGN1bGF0ZSB6IGRpc3RhbmNlIG9mIHRoZSBmYXJ0aGVzdCBmcmFnbWVudCB0aGF0IHNob3VsZCBiZSByZW5kZXJlZC5cbiAgICAgICAgY29uc3QgZnVydGhlc3REaXN0YW5jZSA9IE1hdGguY29zKE1hdGguUEkgLyAyIC0gdGhpcy5fcGl0Y2gpICogdG9wSGFsZlN1cmZhY2VEaXN0YW5jZSArIHRoaXMuY2FtZXJhVG9DZW50ZXJEaXN0YW5jZTtcbiAgICAgICAgLy8gQWRkIGEgYml0IGV4dHJhIHRvIGF2b2lkIHByZWNpc2lvbiBwcm9ibGVtcyB3aGVuIGEgZnJhZ21lbnQncyBkaXN0YW5jZSBpcyBleGFjdGx5IGBmdXJ0aGVzdERpc3RhbmNlYFxuICAgICAgICBjb25zdCBmYXJaID0gZnVydGhlc3REaXN0YW5jZSAqIDEuMDE7XG5cbiAgICAgICAgLy8gbWF0cml4IGZvciBjb252ZXJzaW9uIGZyb20gbG9jYXRpb24gdG8gR0wgY29vcmRpbmF0ZXMgKC0xIC4uIDEpXG4gICAgICAgIGxldCBtID0gbmV3IEZsb2F0NjRBcnJheSgxNik7XG4gICAgICAgIG1hdDQucGVyc3BlY3RpdmUobSwgdGhpcy5fZm92LCB0aGlzLndpZHRoIC8gdGhpcy5oZWlnaHQsIDEsIGZhclopO1xuXG4gICAgICAgIG1hdDQuc2NhbGUobSwgbSwgWzEsIC0xLCAxXSk7XG4gICAgICAgIG1hdDQudHJhbnNsYXRlKG0sIG0sIFswLCAwLCAtdGhpcy5jYW1lcmFUb0NlbnRlckRpc3RhbmNlXSk7XG4gICAgICAgIG1hdDQucm90YXRlWChtLCBtLCB0aGlzLl9waXRjaCk7XG4gICAgICAgIG1hdDQucm90YXRlWihtLCBtLCB0aGlzLmFuZ2xlKTtcbiAgICAgICAgbWF0NC50cmFuc2xhdGUobSwgbSwgWy10aGlzLngsIC10aGlzLnksIDBdKTtcblxuICAgICAgICAvLyBzY2FsZSB2ZXJ0aWNhbGx5IHRvIG1ldGVycyBwZXIgcGl4ZWwgKGludmVyc2Ugb2YgZ3JvdW5kIHJlc29sdXRpb24pOlxuICAgICAgICAvLyB3b3JsZFNpemUgLyAoY2lyY3VtZmVyZW5jZU9mRWFydGggKiBjb3MobGF0ICogz4AgLyAxODApKVxuICAgICAgICBjb25zdCB2ZXJ0aWNhbFNjYWxlID0gdGhpcy53b3JsZFNpemUgLyAoMiAqIE1hdGguUEkgKiA2Mzc4MTM3ICogTWF0aC5hYnMoTWF0aC5jb3ModGhpcy5jZW50ZXIubGF0ICogKE1hdGguUEkgLyAxODApKSkpO1xuICAgICAgICBtYXQ0LnNjYWxlKG0sIG0sIFsxLCAxLCB2ZXJ0aWNhbFNjYWxlLCAxXSk7XG5cbiAgICAgICAgdGhpcy5wcm9qTWF0cml4ID0gbTtcblxuICAgICAgICAvLyBtYXRyaXggZm9yIGNvbnZlcnNpb24gZnJvbSBsb2NhdGlvbiB0byBzY3JlZW4gY29vcmRpbmF0ZXNcbiAgICAgICAgbSA9IG1hdDQuY3JlYXRlKCk7XG4gICAgICAgIG1hdDQuc2NhbGUobSwgbSwgW3RoaXMud2lkdGggLyAyLCAtdGhpcy5oZWlnaHQgLyAyLCAxXSk7XG4gICAgICAgIG1hdDQudHJhbnNsYXRlKG0sIG0sIFsxLCAtMSwgMF0pO1xuICAgICAgICB0aGlzLnBpeGVsTWF0cml4ID0gbWF0NC5tdWx0aXBseShuZXcgRmxvYXQ2NEFycmF5KDE2KSwgbSwgdGhpcy5wcm9qTWF0cml4KTtcblxuICAgICAgICAvLyBpbnZlcnNlIG1hdHJpeCBmb3IgY29udmVyc2lvbiBmcm9tIHNjcmVlbiBjb29yZGluYWVzIHRvIGxvY2F0aW9uXG4gICAgICAgIG0gPSBtYXQ0LmludmVydChuZXcgRmxvYXQ2NEFycmF5KDE2KSwgdGhpcy5waXhlbE1hdHJpeCk7XG4gICAgICAgIGlmICghbSkgdGhyb3cgbmV3IEVycm9yKFwiZmFpbGVkIHRvIGludmVydCBtYXRyaXhcIik7XG4gICAgICAgIHRoaXMucGl4ZWxNYXRyaXhJbnZlcnNlID0gbTtcblxuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBUcmFuc2Zvcm07XG4iLCIndXNlIHN0cmljdCc7XG5jb25zdCBXb3JrZXJQb29sID0gcmVxdWlyZSgnLi91dGlsL3dvcmtlcl9wb29sJyk7XG5cbmxldCBnbG9iYWxXb3JrZXJQb29sO1xuXG4vKipcbiAqIENyZWF0ZXMgKGlmIG5lY2Vzc2FyeSkgYW5kIHJldHVybnMgdGhlIHNpbmdsZSwgZ2xvYmFsIFdvcmtlclBvb2wgaW5zdGFuY2VcbiAqIHRvIGJlIHNoYXJlZCBhY3Jvc3MgZWFjaCBNYXBcbiAqIEBwcml2YXRlXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2V0R2xvYmFsV29ya2VyUG9vbCAoKSB7XG4gICAgaWYgKCFnbG9iYWxXb3JrZXJQb29sKSB7XG4gICAgICAgIGdsb2JhbFdvcmtlclBvb2wgPSBuZXcgV29ya2VyUG9vbCgpO1xuICAgIH1cbiAgICByZXR1cm4gZ2xvYmFsV29ya2VyUG9vbDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIEZvbnQgZGF0YSBGcm9tIEhlcnNoZXkgU2ltcGxleCBGb250XG4vLyBodHRwOi8vcGF1bGJvdXJrZS5uZXQvZGF0YWZvcm1hdHMvaGVyc2hleS9cbmNvbnN0IHNpbXBsZXhGb250ID0ge1xuICAgIFwiIFwiOiBbMTYsIFtdXSxcbiAgICBcIiFcIjogWzEwLCBbNSwgMjEsIDUsIDcsIC0xLCAtMSwgNSwgMiwgNCwgMSwgNSwgMCwgNiwgMSwgNSwgMl1dLFxuICAgIFwiXFxcIlwiOiBbMTYsIFs0LCAyMSwgNCwgMTQsIC0xLCAtMSwgMTIsIDIxLCAxMiwgMTRdXSxcbiAgICBcIiNcIjogWzIxLCBbMTEsIDI1LCA0LCAtNywgLTEsIC0xLCAxNywgMjUsIDEwLCAtNywgLTEsIC0xLCA0LCAxMiwgMTgsIDEyLCAtMSwgLTEsIDMsIDYsIDE3LCA2XV0sXG4gICAgXCIkXCI6IFsyMCwgWzgsIDI1LCA4LCAtNCwgLTEsIC0xLCAxMiwgMjUsIDEyLCAtNCwgLTEsIC0xLCAxNywgMTgsIDE1LCAyMCwgMTIsIDIxLCA4LCAyMSwgNSwgMjAsIDMsIDE4LCAzLCAxNiwgNCwgMTQsIDUsIDEzLCA3LCAxMiwgMTMsIDEwLCAxNSwgOSwgMTYsIDgsIDE3LCA2LCAxNywgMywgMTUsIDEsIDEyLCAwLCA4LCAwLCA1LCAxLCAzLCAzXV0sXG4gICAgXCIlXCI6IFsyNCwgWzIxLCAyMSwgMywgMCwgLTEsIC0xLCA4LCAyMSwgMTAsIDE5LCAxMCwgMTcsIDksIDE1LCA3LCAxNCwgNSwgMTQsIDMsIDE2LCAzLCAxOCwgNCwgMjAsIDYsIDIxLCA4LCAyMSwgMTAsIDIwLCAxMywgMTksIDE2LCAxOSwgMTksIDIwLCAyMSwgMjEsIC0xLCAtMSwgMTcsIDcsIDE1LCA2LCAxNCwgNCwgMTQsIDIsIDE2LCAwLCAxOCwgMCwgMjAsIDEsIDIxLCAzLCAyMSwgNSwgMTksIDcsIDE3LCA3XV0sXG4gICAgXCImXCI6IFsyNiwgWzIzLCAxMiwgMjMsIDEzLCAyMiwgMTQsIDIxLCAxNCwgMjAsIDEzLCAxOSwgMTEsIDE3LCA2LCAxNSwgMywgMTMsIDEsIDExLCAwLCA3LCAwLCA1LCAxLCA0LCAyLCAzLCA0LCAzLCA2LCA0LCA4LCA1LCA5LCAxMiwgMTMsIDEzLCAxNCwgMTQsIDE2LCAxNCwgMTgsIDEzLCAyMCwgMTEsIDIxLCA5LCAyMCwgOCwgMTgsIDgsIDE2LCA5LCAxMywgMTEsIDEwLCAxNiwgMywgMTgsIDEsIDIwLCAwLCAyMiwgMCwgMjMsIDEsIDIzLCAyXV0sXG4gICAgXCInXCI6IFsxMCwgWzUsIDE5LCA0LCAyMCwgNSwgMjEsIDYsIDIwLCA2LCAxOCwgNSwgMTYsIDQsIDE1XV0sXG4gICAgXCIoXCI6IFsxNCwgWzExLCAyNSwgOSwgMjMsIDcsIDIwLCA1LCAxNiwgNCwgMTEsIDQsIDcsIDUsIDIsIDcsIC0yLCA5LCAtNSwgMTEsIC03XV0sXG4gICAgXCIpXCI6IFsxNCwgWzMsIDI1LCA1LCAyMywgNywgMjAsIDksIDE2LCAxMCwgMTEsIDEwLCA3LCA5LCAyLCA3LCAtMiwgNSwgLTUsIDMsIC03XV0sXG4gICAgXCIqXCI6IFsxNiwgWzgsIDIxLCA4LCA5LCAtMSwgLTEsIDMsIDE4LCAxMywgMTIsIC0xLCAtMSwgMTMsIDE4LCAzLCAxMl1dLFxuICAgIFwiK1wiOiBbMjYsIFsxMywgMTgsIDEzLCAwLCAtMSwgLTEsIDQsIDksIDIyLCA5XV0sXG4gICAgXCIsXCI6IFsxMCwgWzYsIDEsIDUsIDAsIDQsIDEsIDUsIDIsIDYsIDEsIDYsIC0xLCA1LCAtMywgNCwgLTRdXSxcbiAgICBcIi1cIjogWzI2LCBbNCwgOSwgMjIsIDldXSxcbiAgICBcIi5cIjogWzEwLCBbNSwgMiwgNCwgMSwgNSwgMCwgNiwgMSwgNSwgMl1dLFxuICAgIFwiL1wiOiBbMjIsIFsyMCwgMjUsIDIsIC03XV0sXG4gICAgXCIwXCI6IFsyMCwgWzksIDIxLCA2LCAyMCwgNCwgMTcsIDMsIDEyLCAzLCA5LCA0LCA0LCA2LCAxLCA5LCAwLCAxMSwgMCwgMTQsIDEsIDE2LCA0LCAxNywgOSwgMTcsIDEyLCAxNiwgMTcsIDE0LCAyMCwgMTEsIDIxLCA5LCAyMV1dLFxuICAgIFwiMVwiOiBbMjAsIFs2LCAxNywgOCwgMTgsIDExLCAyMSwgMTEsIDBdXSxcbiAgICBcIjJcIjogWzIwLCBbNCwgMTYsIDQsIDE3LCA1LCAxOSwgNiwgMjAsIDgsIDIxLCAxMiwgMjEsIDE0LCAyMCwgMTUsIDE5LCAxNiwgMTcsIDE2LCAxNSwgMTUsIDEzLCAxMywgMTAsIDMsIDAsIDE3LCAwXV0sXG4gICAgXCIzXCI6IFsyMCwgWzUsIDIxLCAxNiwgMjEsIDEwLCAxMywgMTMsIDEzLCAxNSwgMTIsIDE2LCAxMSwgMTcsIDgsIDE3LCA2LCAxNiwgMywgMTQsIDEsIDExLCAwLCA4LCAwLCA1LCAxLCA0LCAyLCAzLCA0XV0sXG4gICAgXCI0XCI6IFsyMCwgWzEzLCAyMSwgMywgNywgMTgsIDcsIC0xLCAtMSwgMTMsIDIxLCAxMywgMF1dLFxuICAgIFwiNVwiOiBbMjAsIFsxNSwgMjEsIDUsIDIxLCA0LCAxMiwgNSwgMTMsIDgsIDE0LCAxMSwgMTQsIDE0LCAxMywgMTYsIDExLCAxNywgOCwgMTcsIDYsIDE2LCAzLCAxNCwgMSwgMTEsIDAsIDgsIDAsIDUsIDEsIDQsIDIsIDMsIDRdXSxcbiAgICBcIjZcIjogWzIwLCBbMTYsIDE4LCAxNSwgMjAsIDEyLCAyMSwgMTAsIDIxLCA3LCAyMCwgNSwgMTcsIDQsIDEyLCA0LCA3LCA1LCAzLCA3LCAxLCAxMCwgMCwgMTEsIDAsIDE0LCAxLCAxNiwgMywgMTcsIDYsIDE3LCA3LCAxNiwgMTAsIDE0LCAxMiwgMTEsIDEzLCAxMCwgMTMsIDcsIDEyLCA1LCAxMCwgNCwgN11dLFxuICAgIFwiN1wiOiBbMjAsIFsxNywgMjEsIDcsIDAsIC0xLCAtMSwgMywgMjEsIDE3LCAyMV1dLFxuICAgIFwiOFwiOiBbMjAsIFs4LCAyMSwgNSwgMjAsIDQsIDE4LCA0LCAxNiwgNSwgMTQsIDcsIDEzLCAxMSwgMTIsIDE0LCAxMSwgMTYsIDksIDE3LCA3LCAxNywgNCwgMTYsIDIsIDE1LCAxLCAxMiwgMCwgOCwgMCwgNSwgMSwgNCwgMiwgMywgNCwgMywgNywgNCwgOSwgNiwgMTEsIDksIDEyLCAxMywgMTMsIDE1LCAxNCwgMTYsIDE2LCAxNiwgMTgsIDE1LCAyMCwgMTIsIDIxLCA4LCAyMV1dLFxuICAgIFwiOVwiOiBbMjAsIFsxNiwgMTQsIDE1LCAxMSwgMTMsIDksIDEwLCA4LCA5LCA4LCA2LCA5LCA0LCAxMSwgMywgMTQsIDMsIDE1LCA0LCAxOCwgNiwgMjAsIDksIDIxLCAxMCwgMjEsIDEzLCAyMCwgMTUsIDE4LCAxNiwgMTQsIDE2LCA5LCAxNSwgNCwgMTMsIDEsIDEwLCAwLCA4LCAwLCA1LCAxLCA0LCAzXV0sXG4gICAgXCI6XCI6IFsxMCwgWzUsIDE0LCA0LCAxMywgNSwgMTIsIDYsIDEzLCA1LCAxNCwgLTEsIC0xLCA1LCAyLCA0LCAxLCA1LCAwLCA2LCAxLCA1LCAyXV0sXG4gICAgXCI7XCI6IFsxMCwgWzUsIDE0LCA0LCAxMywgNSwgMTIsIDYsIDEzLCA1LCAxNCwgLTEsIC0xLCA2LCAxLCA1LCAwLCA0LCAxLCA1LCAyLCA2LCAxLCA2LCAtMSwgNSwgLTMsIDQsIC00XV0sXG4gICAgXCI8XCI6IFsyNCwgWzIwLCAxOCwgNCwgOSwgMjAsIDBdXSxcbiAgICBcIj1cIjogWzI2LCBbNCwgMTIsIDIyLCAxMiwgLTEsIC0xLCA0LCA2LCAyMiwgNl1dLFxuICAgIFwiPlwiOiBbMjQsIFs0LCAxOCwgMjAsIDksIDQsIDBdXSxcbiAgICBcIj9cIjogWzE4LCBbMywgMTYsIDMsIDE3LCA0LCAxOSwgNSwgMjAsIDcsIDIxLCAxMSwgMjEsIDEzLCAyMCwgMTQsIDE5LCAxNSwgMTcsIDE1LCAxNSwgMTQsIDEzLCAxMywgMTIsIDksIDEwLCA5LCA3LCAtMSwgLTEsIDksIDIsIDgsIDEsIDksIDAsIDEwLCAxLCA5LCAyXV0sXG4gICAgXCJAXCI6IFsyNywgWzE4LCAxMywgMTcsIDE1LCAxNSwgMTYsIDEyLCAxNiwgMTAsIDE1LCA5LCAxNCwgOCwgMTEsIDgsIDgsIDksIDYsIDExLCA1LCAxNCwgNSwgMTYsIDYsIDE3LCA4LCAtMSwgLTEsIDEyLCAxNiwgMTAsIDE0LCA5LCAxMSwgOSwgOCwgMTAsIDYsIDExLCA1LCAtMSwgLTEsIDE4LCAxNiwgMTcsIDgsIDE3LCA2LCAxOSwgNSwgMjEsIDUsIDIzLCA3LCAyNCwgMTAsIDI0LCAxMiwgMjMsIDE1LCAyMiwgMTcsIDIwLCAxOSwgMTgsIDIwLCAxNSwgMjEsIDEyLCAyMSwgOSwgMjAsIDcsIDE5LCA1LCAxNywgNCwgMTUsIDMsIDEyLCAzLCA5LCA0LCA2LCA1LCA0LCA3LCAyLCA5LCAxLCAxMiwgMCwgMTUsIDAsIDE4LCAxLCAyMCwgMiwgMjEsIDMsIC0xLCAtMSwgMTksIDE2LCAxOCwgOCwgMTgsIDYsIDE5LCA1XV0sXG4gICAgXCJBXCI6IFsxOCwgWzksIDIxLCAxLCAwLCAtMSwgLTEsIDksIDIxLCAxNywgMCwgLTEsIC0xLCA0LCA3LCAxNCwgN11dLFxuICAgIFwiQlwiOiBbMjEsIFs0LCAyMSwgNCwgMCwgLTEsIC0xLCA0LCAyMSwgMTMsIDIxLCAxNiwgMjAsIDE3LCAxOSwgMTgsIDE3LCAxOCwgMTUsIDE3LCAxMywgMTYsIDEyLCAxMywgMTEsIC0xLCAtMSwgNCwgMTEsIDEzLCAxMSwgMTYsIDEwLCAxNywgOSwgMTgsIDcsIDE4LCA0LCAxNywgMiwgMTYsIDEsIDEzLCAwLCA0LCAwXV0sXG4gICAgXCJDXCI6IFsyMSwgWzE4LCAxNiwgMTcsIDE4LCAxNSwgMjAsIDEzLCAyMSwgOSwgMjEsIDcsIDIwLCA1LCAxOCwgNCwgMTYsIDMsIDEzLCAzLCA4LCA0LCA1LCA1LCAzLCA3LCAxLCA5LCAwLCAxMywgMCwgMTUsIDEsIDE3LCAzLCAxOCwgNV1dLFxuICAgIFwiRFwiOiBbMjEsIFs0LCAyMSwgNCwgMCwgLTEsIC0xLCA0LCAyMSwgMTEsIDIxLCAxNCwgMjAsIDE2LCAxOCwgMTcsIDE2LCAxOCwgMTMsIDE4LCA4LCAxNywgNSwgMTYsIDMsIDE0LCAxLCAxMSwgMCwgNCwgMF1dLFxuICAgIFwiRVwiOiBbMTksIFs0LCAyMSwgNCwgMCwgLTEsIC0xLCA0LCAyMSwgMTcsIDIxLCAtMSwgLTEsIDQsIDExLCAxMiwgMTEsIC0xLCAtMSwgNCwgMCwgMTcsIDBdXSxcbiAgICBcIkZcIjogWzE4LCBbNCwgMjEsIDQsIDAsIC0xLCAtMSwgNCwgMjEsIDE3LCAyMSwgLTEsIC0xLCA0LCAxMSwgMTIsIDExXV0sXG4gICAgXCJHXCI6IFsyMSwgWzE4LCAxNiwgMTcsIDE4LCAxNSwgMjAsIDEzLCAyMSwgOSwgMjEsIDcsIDIwLCA1LCAxOCwgNCwgMTYsIDMsIDEzLCAzLCA4LCA0LCA1LCA1LCAzLCA3LCAxLCA5LCAwLCAxMywgMCwgMTUsIDEsIDE3LCAzLCAxOCwgNSwgMTgsIDgsIC0xLCAtMSwgMTMsIDgsIDE4LCA4XV0sXG4gICAgXCJIXCI6IFsyMiwgWzQsIDIxLCA0LCAwLCAtMSwgLTEsIDE4LCAyMSwgMTgsIDAsIC0xLCAtMSwgNCwgMTEsIDE4LCAxMV1dLFxuICAgIFwiSVwiOiBbOCwgWzQsIDIxLCA0LCAwXV0sXG4gICAgXCJKXCI6IFsxNiwgWzEyLCAyMSwgMTIsIDUsIDExLCAyLCAxMCwgMSwgOCwgMCwgNiwgMCwgNCwgMSwgMywgMiwgMiwgNSwgMiwgN11dLFxuICAgIFwiS1wiOiBbMjEsIFs0LCAyMSwgNCwgMCwgLTEsIC0xLCAxOCwgMjEsIDQsIDcsIC0xLCAtMSwgOSwgMTIsIDE4LCAwXV0sXG4gICAgXCJMXCI6IFsxNywgWzQsIDIxLCA0LCAwLCAtMSwgLTEsIDQsIDAsIDE2LCAwXV0sXG4gICAgXCJNXCI6IFsyNCwgWzQsIDIxLCA0LCAwLCAtMSwgLTEsIDQsIDIxLCAxMiwgMCwgLTEsIC0xLCAyMCwgMjEsIDEyLCAwLCAtMSwgLTEsIDIwLCAyMSwgMjAsIDBdXSxcbiAgICBcIk5cIjogWzIyLCBbNCwgMjEsIDQsIDAsIC0xLCAtMSwgNCwgMjEsIDE4LCAwLCAtMSwgLTEsIDE4LCAyMSwgMTgsIDBdXSxcbiAgICBcIk9cIjogWzIyLCBbOSwgMjEsIDcsIDIwLCA1LCAxOCwgNCwgMTYsIDMsIDEzLCAzLCA4LCA0LCA1LCA1LCAzLCA3LCAxLCA5LCAwLCAxMywgMCwgMTUsIDEsIDE3LCAzLCAxOCwgNSwgMTksIDgsIDE5LCAxMywgMTgsIDE2LCAxNywgMTgsIDE1LCAyMCwgMTMsIDIxLCA5LCAyMV1dLFxuICAgIFwiUFwiOiBbMjEsIFs0LCAyMSwgNCwgMCwgLTEsIC0xLCA0LCAyMSwgMTMsIDIxLCAxNiwgMjAsIDE3LCAxOSwgMTgsIDE3LCAxOCwgMTQsIDE3LCAxMiwgMTYsIDExLCAxMywgMTAsIDQsIDEwXV0sXG4gICAgXCJRXCI6IFsyMiwgWzksIDIxLCA3LCAyMCwgNSwgMTgsIDQsIDE2LCAzLCAxMywgMywgOCwgNCwgNSwgNSwgMywgNywgMSwgOSwgMCwgMTMsIDAsIDE1LCAxLCAxNywgMywgMTgsIDUsIDE5LCA4LCAxOSwgMTMsIDE4LCAxNiwgMTcsIDE4LCAxNSwgMjAsIDEzLCAyMSwgOSwgMjEsIC0xLCAtMSwgMTIsIDQsIDE4LCAtMl1dLFxuICAgIFwiUlwiOiBbMjEsIFs0LCAyMSwgNCwgMCwgLTEsIC0xLCA0LCAyMSwgMTMsIDIxLCAxNiwgMjAsIDE3LCAxOSwgMTgsIDE3LCAxOCwgMTUsIDE3LCAxMywgMTYsIDEyLCAxMywgMTEsIDQsIDExLCAtMSwgLTEsIDExLCAxMSwgMTgsIDBdXSxcbiAgICBcIlNcIjogWzIwLCBbMTcsIDE4LCAxNSwgMjAsIDEyLCAyMSwgOCwgMjEsIDUsIDIwLCAzLCAxOCwgMywgMTYsIDQsIDE0LCA1LCAxMywgNywgMTIsIDEzLCAxMCwgMTUsIDksIDE2LCA4LCAxNywgNiwgMTcsIDMsIDE1LCAxLCAxMiwgMCwgOCwgMCwgNSwgMSwgMywgM11dLFxuICAgIFwiVFwiOiBbMTYsIFs4LCAyMSwgOCwgMCwgLTEsIC0xLCAxLCAyMSwgMTUsIDIxXV0sXG4gICAgXCJVXCI6IFsyMiwgWzQsIDIxLCA0LCA2LCA1LCAzLCA3LCAxLCAxMCwgMCwgMTIsIDAsIDE1LCAxLCAxNywgMywgMTgsIDYsIDE4LCAyMV1dLFxuICAgIFwiVlwiOiBbMTgsIFsxLCAyMSwgOSwgMCwgLTEsIC0xLCAxNywgMjEsIDksIDBdXSxcbiAgICBcIldcIjogWzI0LCBbMiwgMjEsIDcsIDAsIC0xLCAtMSwgMTIsIDIxLCA3LCAwLCAtMSwgLTEsIDEyLCAyMSwgMTcsIDAsIC0xLCAtMSwgMjIsIDIxLCAxNywgMF1dLFxuICAgIFwiWFwiOiBbMjAsIFszLCAyMSwgMTcsIDAsIC0xLCAtMSwgMTcsIDIxLCAzLCAwXV0sXG4gICAgXCJZXCI6IFsxOCwgWzEsIDIxLCA5LCAxMSwgOSwgMCwgLTEsIC0xLCAxNywgMjEsIDksIDExXV0sXG4gICAgXCJaXCI6IFsyMCwgWzE3LCAyMSwgMywgMCwgLTEsIC0xLCAzLCAyMSwgMTcsIDIxLCAtMSwgLTEsIDMsIDAsIDE3LCAwXV0sXG4gICAgXCJbXCI6IFsxNCwgWzQsIDI1LCA0LCAtNywgLTEsIC0xLCA1LCAyNSwgNSwgLTcsIC0xLCAtMSwgNCwgMjUsIDExLCAyNSwgLTEsIC0xLCA0LCAtNywgMTEsIC03XV0sXG4gICAgXCJcXFxcXCI6IFsxNCwgWzAsIDIxLCAxNCwgLTNdXSxcbiAgICBcIl1cIjogWzE0LCBbOSwgMjUsIDksIC03LCAtMSwgLTEsIDEwLCAyNSwgMTAsIC03LCAtMSwgLTEsIDMsIDI1LCAxMCwgMjUsIC0xLCAtMSwgMywgLTcsIDEwLCAtN11dLFxuICAgIFwiXlwiOiBbMTYsIFs2LCAxNSwgOCwgMTgsIDEwLCAxNSwgLTEsIC0xLCAzLCAxMiwgOCwgMTcsIDEzLCAxMiwgLTEsIC0xLCA4LCAxNywgOCwgMF1dLFxuICAgIFwiX1wiOiBbMTYsIFswLCAtMiwgMTYsIC0yXV0sXG4gICAgXCJgXCI6IFsxMCwgWzYsIDIxLCA1LCAyMCwgNCwgMTgsIDQsIDE2LCA1LCAxNSwgNiwgMTYsIDUsIDE3XV0sXG4gICAgXCJhXCI6IFsxOSwgWzE1LCAxNCwgMTUsIDAsIC0xLCAtMSwgMTUsIDExLCAxMywgMTMsIDExLCAxNCwgOCwgMTQsIDYsIDEzLCA0LCAxMSwgMywgOCwgMywgNiwgNCwgMywgNiwgMSwgOCwgMCwgMTEsIDAsIDEzLCAxLCAxNSwgM11dLFxuICAgIFwiYlwiOiBbMTksIFs0LCAyMSwgNCwgMCwgLTEsIC0xLCA0LCAxMSwgNiwgMTMsIDgsIDE0LCAxMSwgMTQsIDEzLCAxMywgMTUsIDExLCAxNiwgOCwgMTYsIDYsIDE1LCAzLCAxMywgMSwgMTEsIDAsIDgsIDAsIDYsIDEsIDQsIDNdXSxcbiAgICBcImNcIjogWzE4LCBbMTUsIDExLCAxMywgMTMsIDExLCAxNCwgOCwgMTQsIDYsIDEzLCA0LCAxMSwgMywgOCwgMywgNiwgNCwgMywgNiwgMSwgOCwgMCwgMTEsIDAsIDEzLCAxLCAxNSwgM11dLFxuICAgIFwiZFwiOiBbMTksIFsxNSwgMjEsIDE1LCAwLCAtMSwgLTEsIDE1LCAxMSwgMTMsIDEzLCAxMSwgMTQsIDgsIDE0LCA2LCAxMywgNCwgMTEsIDMsIDgsIDMsIDYsIDQsIDMsIDYsIDEsIDgsIDAsIDExLCAwLCAxMywgMSwgMTUsIDNdXSxcbiAgICBcImVcIjogWzE4LCBbMywgOCwgMTUsIDgsIDE1LCAxMCwgMTQsIDEyLCAxMywgMTMsIDExLCAxNCwgOCwgMTQsIDYsIDEzLCA0LCAxMSwgMywgOCwgMywgNiwgNCwgMywgNiwgMSwgOCwgMCwgMTEsIDAsIDEzLCAxLCAxNSwgM11dLFxuICAgIFwiZlwiOiBbMTIsIFsxMCwgMjEsIDgsIDIxLCA2LCAyMCwgNSwgMTcsIDUsIDAsIC0xLCAtMSwgMiwgMTQsIDksIDE0XV0sXG4gICAgXCJnXCI6IFsxOSwgWzE1LCAxNCwgMTUsIC0yLCAxNCwgLTUsIDEzLCAtNiwgMTEsIC03LCA4LCAtNywgNiwgLTYsIC0xLCAtMSwgMTUsIDExLCAxMywgMTMsIDExLCAxNCwgOCwgMTQsIDYsIDEzLCA0LCAxMSwgMywgOCwgMywgNiwgNCwgMywgNiwgMSwgOCwgMCwgMTEsIDAsIDEzLCAxLCAxNSwgM11dLFxuICAgIFwiaFwiOiBbMTksIFs0LCAyMSwgNCwgMCwgLTEsIC0xLCA0LCAxMCwgNywgMTMsIDksIDE0LCAxMiwgMTQsIDE0LCAxMywgMTUsIDEwLCAxNSwgMF1dLFxuICAgIFwiaVwiOiBbOCwgWzMsIDIxLCA0LCAyMCwgNSwgMjEsIDQsIDIyLCAzLCAyMSwgLTEsIC0xLCA0LCAxNCwgNCwgMF1dLFxuICAgIFwialwiOiBbMTAsIFs1LCAyMSwgNiwgMjAsIDcsIDIxLCA2LCAyMiwgNSwgMjEsIC0xLCAtMSwgNiwgMTQsIDYsIC0zLCA1LCAtNiwgMywgLTcsIDEsIC03XV0sXG4gICAgXCJrXCI6IFsxNywgWzQsIDIxLCA0LCAwLCAtMSwgLTEsIDE0LCAxNCwgNCwgNCwgLTEsIC0xLCA4LCA4LCAxNSwgMF1dLFxuICAgIFwibFwiOiBbOCwgWzQsIDIxLCA0LCAwXV0sXG4gICAgXCJtXCI6IFszMCwgWzQsIDE0LCA0LCAwLCAtMSwgLTEsIDQsIDEwLCA3LCAxMywgOSwgMTQsIDEyLCAxNCwgMTQsIDEzLCAxNSwgMTAsIDE1LCAwLCAtMSwgLTEsIDE1LCAxMCwgMTgsIDEzLCAyMCwgMTQsIDIzLCAxNCwgMjUsIDEzLCAyNiwgMTAsIDI2LCAwXV0sXG4gICAgXCJuXCI6IFsxOSwgWzQsIDE0LCA0LCAwLCAtMSwgLTEsIDQsIDEwLCA3LCAxMywgOSwgMTQsIDEyLCAxNCwgMTQsIDEzLCAxNSwgMTAsIDE1LCAwXV0sXG4gICAgXCJvXCI6IFsxOSwgWzgsIDE0LCA2LCAxMywgNCwgMTEsIDMsIDgsIDMsIDYsIDQsIDMsIDYsIDEsIDgsIDAsIDExLCAwLCAxMywgMSwgMTUsIDMsIDE2LCA2LCAxNiwgOCwgMTUsIDExLCAxMywgMTMsIDExLCAxNCwgOCwgMTRdXSxcbiAgICBcInBcIjogWzE5LCBbNCwgMTQsIDQsIC03LCAtMSwgLTEsIDQsIDExLCA2LCAxMywgOCwgMTQsIDExLCAxNCwgMTMsIDEzLCAxNSwgMTEsIDE2LCA4LCAxNiwgNiwgMTUsIDMsIDEzLCAxLCAxMSwgMCwgOCwgMCwgNiwgMSwgNCwgM11dLFxuICAgIFwicVwiOiBbMTksIFsxNSwgMTQsIDE1LCAtNywgLTEsIC0xLCAxNSwgMTEsIDEzLCAxMywgMTEsIDE0LCA4LCAxNCwgNiwgMTMsIDQsIDExLCAzLCA4LCAzLCA2LCA0LCAzLCA2LCAxLCA4LCAwLCAxMSwgMCwgMTMsIDEsIDE1LCAzXV0sXG4gICAgXCJyXCI6IFsxMywgWzQsIDE0LCA0LCAwLCAtMSwgLTEsIDQsIDgsIDUsIDExLCA3LCAxMywgOSwgMTQsIDEyLCAxNF1dLFxuICAgIFwic1wiOiBbMTcsIFsxNCwgMTEsIDEzLCAxMywgMTAsIDE0LCA3LCAxNCwgNCwgMTMsIDMsIDExLCA0LCA5LCA2LCA4LCAxMSwgNywgMTMsIDYsIDE0LCA0LCAxNCwgMywgMTMsIDEsIDEwLCAwLCA3LCAwLCA0LCAxLCAzLCAzXV0sXG4gICAgXCJ0XCI6IFsxMiwgWzUsIDIxLCA1LCA0LCA2LCAxLCA4LCAwLCAxMCwgMCwgLTEsIC0xLCAyLCAxNCwgOSwgMTRdXSxcbiAgICBcInVcIjogWzE5LCBbNCwgMTQsIDQsIDQsIDUsIDEsIDcsIDAsIDEwLCAwLCAxMiwgMSwgMTUsIDQsIC0xLCAtMSwgMTUsIDE0LCAxNSwgMF1dLFxuICAgIFwidlwiOiBbMTYsIFsyLCAxNCwgOCwgMCwgLTEsIC0xLCAxNCwgMTQsIDgsIDBdXSxcbiAgICBcIndcIjogWzIyLCBbMywgMTQsIDcsIDAsIC0xLCAtMSwgMTEsIDE0LCA3LCAwLCAtMSwgLTEsIDExLCAxNCwgMTUsIDAsIC0xLCAtMSwgMTksIDE0LCAxNSwgMF1dLFxuICAgIFwieFwiOiBbMTcsIFszLCAxNCwgMTQsIDAsIC0xLCAtMSwgMTQsIDE0LCAzLCAwXV0sXG4gICAgXCJ5XCI6IFsxNiwgWzIsIDE0LCA4LCAwLCAtMSwgLTEsIDE0LCAxNCwgOCwgMCwgNiwgLTQsIDQsIC02LCAyLCAtNywgMSwgLTddXSxcbiAgICBcInpcIjogWzE3LCBbMTQsIDE0LCAzLCAwLCAtMSwgLTEsIDMsIDE0LCAxNCwgMTQsIC0xLCAtMSwgMywgMCwgMTQsIDBdXSxcbiAgICBcIntcIjogWzE0LCBbOSwgMjUsIDcsIDI0LCA2LCAyMywgNSwgMjEsIDUsIDE5LCA2LCAxNywgNywgMTYsIDgsIDE0LCA4LCAxMiwgNiwgMTAsIC0xLCAtMSwgNywgMjQsIDYsIDIyLCA2LCAyMCwgNywgMTgsIDgsIDE3LCA5LCAxNSwgOSwgMTMsIDgsIDExLCA0LCA5LCA4LCA3LCA5LCA1LCA5LCAzLCA4LCAxLCA3LCAwLCA2LCAtMiwgNiwgLTQsIDcsIC02LCAtMSwgLTEsIDYsIDgsIDgsIDYsIDgsIDQsIDcsIDIsIDYsIDEsIDUsIC0xLCA1LCAtMywgNiwgLTUsIDcsIC02LCA5LCAtN11dLFxuICAgIFwifFwiOiBbOCwgWzQsIDI1LCA0LCAtN11dLFxuICAgIFwifVwiOiBbMTQsIFs1LCAyNSwgNywgMjQsIDgsIDIzLCA5LCAyMSwgOSwgMTksIDgsIDE3LCA3LCAxNiwgNiwgMTQsIDYsIDEyLCA4LCAxMCwgLTEsIC0xLCA3LCAyNCwgOCwgMjIsIDgsIDIwLCA3LCAxOCwgNiwgMTcsIDUsIDE1LCA1LCAxMywgNiwgMTEsIDEwLCA5LCA2LCA3LCA1LCA1LCA1LCAzLCA2LCAxLCA3LCAwLCA4LCAtMiwgOCwgLTQsIDcsIC02LCAtMSwgLTEsIDgsIDgsIDYsIDYsIDYsIDQsIDcsIDIsIDgsIDEsIDksIC0xLCA5LCAtMywgOCwgLTUsIDcsIC02LCA1LCAtN11dLFxuICAgIFwiflwiOiBbMjQsIFszLCA2LCAzLCA4LCA0LCAxMSwgNiwgMTIsIDgsIDEyLCAxMCwgMTEsIDE0LCA4LCAxNiwgNywgMTgsIDcsIDIwLCA4LCAyMSwgMTAsIC0xLCAtMSwgMywgOCwgNCwgMTAsIDYsIDExLCA4LCAxMSwgMTAsIDEwLCAxNCwgNywgMTYsIDYsIDE4LCA2LCAyMCwgNywgMjEsIDEwLCAyMSwgMTJdXVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB0ZXh0VmVydGljZXModGV4dCwgbGVmdCwgYmFzZWxpbmUsIHNjYWxlKSB7XG4gICAgc2NhbGUgPSBzY2FsZSB8fCAxO1xuXG4gICAgY29uc3Qgc3Ryb2tlcyA9IFtdO1xuICAgIGxldCBpLCBsZW4sIGosIGxlbjIsIGdseXBoLCB4LCB5LCBwcmV2O1xuXG4gICAgZm9yIChpID0gMCwgbGVuID0gdGV4dC5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBnbHlwaCA9IHNpbXBsZXhGb250W3RleHRbaV1dO1xuICAgICAgICBpZiAoIWdseXBoKSBjb250aW51ZTtcbiAgICAgICAgcHJldiA9IG51bGw7XG5cbiAgICAgICAgZm9yIChqID0gMCwgbGVuMiA9IGdseXBoWzFdLmxlbmd0aDsgaiA8IGxlbjI7IGogKz0gMikge1xuICAgICAgICAgICAgaWYgKGdseXBoWzFdW2pdID09PSAtMSAmJiBnbHlwaFsxXVtqICsgMV0gPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgcHJldiA9IG51bGw7XG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgeCA9IGxlZnQgKyBnbHlwaFsxXVtqXSAqIHNjYWxlO1xuICAgICAgICAgICAgICAgIHkgPSBiYXNlbGluZSAtIGdseXBoWzFdW2ogKyAxXSAqIHNjYWxlO1xuICAgICAgICAgICAgICAgIGlmIChwcmV2KSB7XG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZXMucHVzaChwcmV2LngsIHByZXYueSwgeCwgeSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHByZXYgPSB7eDogeCwgeTogeX07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGVmdCArPSBnbHlwaFswXSAqIHNjYWxlO1xuICAgIH1cblxuICAgIHJldHVybiBzdHJva2VzO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgYnJvd3NlciA9IHJlcXVpcmUoJy4vdXRpbC9icm93c2VyJyk7XG5cbi8vIGpzaGludCAtVzA3OVxuY29uc3QgbWFwYm94Z2wgPSBtb2R1bGUuZXhwb3J0cyA9IHt9O1xuXG5tYXBib3hnbC52ZXJzaW9uID0gcmVxdWlyZSgnLi4vcGFja2FnZS5qc29uJykudmVyc2lvbjtcbm1hcGJveGdsLndvcmtlckNvdW50ID0gTWF0aC5tYXgoTWF0aC5mbG9vcihicm93c2VyLmhhcmR3YXJlQ29uY3VycmVuY3kgLyAyKSwgMSk7XG5cbm1hcGJveGdsLk1hcCA9IHJlcXVpcmUoJy4vdWkvbWFwJyk7XG5tYXBib3hnbC5OYXZpZ2F0aW9uQ29udHJvbCA9IHJlcXVpcmUoJy4vdWkvY29udHJvbC9uYXZpZ2F0aW9uX2NvbnRyb2wnKTtcbm1hcGJveGdsLkdlb2xvY2F0ZUNvbnRyb2wgPSByZXF1aXJlKCcuL3VpL2NvbnRyb2wvZ2VvbG9jYXRlX2NvbnRyb2wnKTtcbm1hcGJveGdsLkF0dHJpYnV0aW9uQ29udHJvbCA9IHJlcXVpcmUoJy4vdWkvY29udHJvbC9hdHRyaWJ1dGlvbl9jb250cm9sJyk7XG5tYXBib3hnbC5TY2FsZUNvbnRyb2wgPSByZXF1aXJlKCcuL3VpL2NvbnRyb2wvc2NhbGVfY29udHJvbCcpO1xubWFwYm94Z2wuUG9wdXAgPSByZXF1aXJlKCcuL3VpL3BvcHVwJyk7XG5tYXBib3hnbC5NYXJrZXIgPSByZXF1aXJlKCcuL3VpL21hcmtlcicpO1xuXG5tYXBib3hnbC5TdHlsZSA9IHJlcXVpcmUoJy4vc3R5bGUvc3R5bGUnKTtcblxubWFwYm94Z2wuTG5nTGF0ID0gcmVxdWlyZSgnLi9nZW8vbG5nX2xhdCcpO1xubWFwYm94Z2wuTG5nTGF0Qm91bmRzID0gcmVxdWlyZSgnLi9nZW8vbG5nX2xhdF9ib3VuZHMnKTtcbm1hcGJveGdsLlBvaW50ID0gcmVxdWlyZSgncG9pbnQtZ2VvbWV0cnknKTtcblxubWFwYm94Z2wuRXZlbnRlZCA9IHJlcXVpcmUoJy4vdXRpbC9ldmVudGVkJyk7XG5tYXBib3hnbC51dGlsID0gcmVxdWlyZSgnLi91dGlsL3V0aWwnKTtcblxubWFwYm94Z2wuc3VwcG9ydGVkID0gcmVxdWlyZSgnLi91dGlsL2Jyb3dzZXInKS5zdXBwb3J0ZWQ7XG5cbmNvbnN0IGFqYXggPSByZXF1aXJlKCcuL3V0aWwvYWpheCcpO1xubWFwYm94Z2wudXRpbC5nZXRKU09OID0gYWpheC5nZXRKU09OO1xubWFwYm94Z2wudXRpbC5nZXRBcnJheUJ1ZmZlciA9IGFqYXguZ2V0QXJyYXlCdWZmZXI7XG5cbmNvbnN0IGNvbmZpZyA9IHJlcXVpcmUoJy4vdXRpbC9jb25maWcnKTtcbm1hcGJveGdsLmNvbmZpZyA9IGNvbmZpZztcblxuY29uc3QgcnRsVGV4dFBsdWdpbiA9IHJlcXVpcmUoJy4vc291cmNlL3J0bF90ZXh0X3BsdWdpbicpO1xuXG5tYXBib3hnbC5zZXRSVExUZXh0UGx1Z2luID0gcnRsVGV4dFBsdWdpbi5zZXRSVExUZXh0UGx1Z2luO1xuXG4gLyoqXG4gICogU2V0cyB0aGUgbWFwJ3MgW1JUTCB0ZXh0IHBsdWdpbl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvcGx1Z2lucy8jbWFwYm94LWdsLXJ0bC10ZXh0KS5cbiAgKiBOZWNlc3NhcnkgZm9yIHN1cHBvcnRpbmcgbGFuZ3VhZ2VzIGxpa2UgQXJhYmljIGFuZCBIZWJyZXcgdGhhdCBhcmUgd3JpdHRlbiByaWdodC10by1sZWZ0LlxuICAqXG4gICogQGZ1bmN0aW9uIHNldFJUTFRleHRQbHVnaW5cbiAgKiBAcGFyYW0ge3N0cmluZ30gcGx1Z2luVVJMIFVSTCBwb2ludGluZyB0byB0aGUgTWFwYm94IFJUTCB0ZXh0IHBsdWdpbiBzb3VyY2UuXG4gICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIHdpdGggYW4gZXJyb3IgYXJndW1lbnQgaWYgdGhlcmUgaXMgYW4gZXJyb3IuXG4gICogQGV4YW1wbGVcbiAgKiBtYXBib3hnbC5zZXRSVExUZXh0UGx1Z2luKCdodHRwczovL2FwaS5tYXBib3guY29tL21hcGJveC1nbC1qcy9wbHVnaW5zL21hcGJveC1nbC1ydGwtdGV4dC92MC4xLjAvbWFwYm94LWdsLXJ0bC10ZXh0LmpzJyk7XG4gICogQHNlZSBbQWRkIHN1cHBvcnQgZm9yIHJpZ2h0LXRvLWxlZnQgc2NyaXB0c10oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9tYXBib3gtZ2wtcnRsLXRleHQvKVxuICAqL1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkobWFwYm94Z2wsICdhY2Nlc3NUb2tlbicsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gY29uZmlnLkFDQ0VTU19UT0tFTjsgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uKHRva2VuKSB7IGNvbmZpZy5BQ0NFU1NfVE9LRU4gPSB0b2tlbjsgfVxufSk7XG5cbi8qKlxuICogR2V0cyBhbmQgc2V0cyB0aGUgbWFwJ3MgW2FjY2VzcyB0b2tlbl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9oZWxwL2RlZmluZS1hY2Nlc3MtdG9rZW4vKS5cbiAqXG4gKiBAdmFyIHtzdHJpbmd9IGFjY2Vzc1Rva2VuXG4gKiBAZXhhbXBsZVxuICogbWFwYm94Z2wuYWNjZXNzVG9rZW4gPSBteUFjY2Vzc1Rva2VuO1xuICogQHNlZSBbRGlzcGxheSBhIG1hcF0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZXMvKVxuICovXG5cbi8qKlxuICogVGhlIHZlcnNpb24gb2YgTWFwYm94IEdMIEpTIGluIHVzZSBhcyBzcGVjaWZpZWQgaW4gYHBhY2thZ2UuanNvbmAsXG4gKiBgQ0hBTkdFTE9HLm1kYCwgYW5kIHRoZSBHaXRIdWIgcmVsZWFzZS5cbiAqXG4gKiBAdmFyIHtzdHJpbmd9IHZlcnNpb25cbiAqL1xuXG4vKipcbiAqIFJldHVybnMgYSBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgYnJvd3NlciBbc3VwcG9ydHMgTWFwYm94IEdMIEpTXShodHRwczovL3d3dy5tYXBib3guY29tL2hlbHAvbWFwYm94LWJyb3dzZXItc3VwcG9ydC8jbWFwYm94LWdsLWpzKS5cbiAqXG4gKiBAZnVuY3Rpb24gc3VwcG9ydGVkXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5mYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0PWZhbHNlXSBJZiBgdHJ1ZWAsXG4gKiAgIHRoZSBmdW5jdGlvbiB3aWxsIHJldHVybiBgZmFsc2VgIGlmIHRoZSBwZXJmb3JtYW5jZSBvZiBNYXBib3ggR0wgSlMgd291bGRcbiAqICAgYmUgZHJhbWF0aWNhbGx5IHdvcnNlIHRoYW4gZXhwZWN0ZWQgKGkuZS4gYSBzb2Z0d2FyZSByZW5kZXJlciB3b3VsZCBiZSB1c2VkKS5cbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKiBAZXhhbXBsZVxuICogbWFwYm94Z2wuc3VwcG9ydGVkKCkgLy8gPSB0cnVlXG4gKiBAc2VlIFtDaGVjayBmb3IgYnJvd3NlciBzdXBwb3J0XShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2NoZWNrLWZvci1zdXBwb3J0LylcbiAqL1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBwYXR0ZXJuID0gcmVxdWlyZSgnLi9wYXR0ZXJuJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZHJhd0JhY2tncm91bmQ7XG5cbmZ1bmN0aW9uIGRyYXdCYWNrZ3JvdW5kKHBhaW50ZXIsIHNvdXJjZUNhY2hlLCBsYXllcikge1xuICAgIGNvbnN0IGdsID0gcGFpbnRlci5nbDtcbiAgICBjb25zdCB0cmFuc2Zvcm0gPSBwYWludGVyLnRyYW5zZm9ybTtcbiAgICBjb25zdCB0aWxlU2l6ZSA9IHRyYW5zZm9ybS50aWxlU2l6ZTtcbiAgICBjb25zdCBjb2xvciA9IGxheWVyLnBhaW50WydiYWNrZ3JvdW5kLWNvbG9yJ107XG4gICAgY29uc3QgaW1hZ2UgPSBsYXllci5wYWludFsnYmFja2dyb3VuZC1wYXR0ZXJuJ107XG4gICAgY29uc3Qgb3BhY2l0eSA9IGxheWVyLnBhaW50WydiYWNrZ3JvdW5kLW9wYWNpdHknXTtcblxuICAgIGNvbnN0IGlzT3BhcXVlID0gIWltYWdlICYmIGNvbG9yWzNdID09PSAxICYmIG9wYWNpdHkgPT09IDE7XG4gICAgaWYgKHBhaW50ZXIuaXNPcGFxdWVQYXNzICE9PSBpc09wYXF1ZSkgcmV0dXJuO1xuXG4gICAgZ2wuZGlzYWJsZShnbC5TVEVOQ0lMX1RFU1QpO1xuXG4gICAgcGFpbnRlci5zZXREZXB0aFN1YmxheWVyKDApO1xuXG4gICAgbGV0IHByb2dyYW07XG4gICAgaWYgKGltYWdlKSB7XG4gICAgICAgIHByb2dyYW0gPSBwYWludGVyLnVzZVByb2dyYW0oJ2ZpbGxQYXR0ZXJuJywgcGFpbnRlci5iYXNpY0ZpbGxQcm9ncmFtQ29uZmlndXJhdGlvbik7XG4gICAgICAgIHBhdHRlcm4ucHJlcGFyZShpbWFnZSwgcGFpbnRlciwgcHJvZ3JhbSk7XG4gICAgICAgIHBhaW50ZXIudGlsZUV4dGVudFBhdHRlcm5WQU8uYmluZChnbCwgcHJvZ3JhbSwgcGFpbnRlci50aWxlRXh0ZW50QnVmZmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBwcm9ncmFtID0gcGFpbnRlci51c2VQcm9ncmFtKCdmaWxsJywgcGFpbnRlci5iYXNpY0ZpbGxQcm9ncmFtQ29uZmlndXJhdGlvbik7XG4gICAgICAgIGdsLnVuaWZvcm00ZnYocHJvZ3JhbS51X2NvbG9yLCBjb2xvcik7XG4gICAgICAgIHBhaW50ZXIudGlsZUV4dGVudFZBTy5iaW5kKGdsLCBwcm9ncmFtLCBwYWludGVyLnRpbGVFeHRlbnRCdWZmZXIpO1xuICAgIH1cblxuICAgIGdsLnVuaWZvcm0xZihwcm9ncmFtLnVfb3BhY2l0eSwgb3BhY2l0eSk7XG5cbiAgICBjb25zdCBjb29yZHMgPSB0cmFuc2Zvcm0uY292ZXJpbmdUaWxlcyh7dGlsZVNpemV9KTtcblxuICAgIGZvciAoY29uc3QgY29vcmQgb2YgY29vcmRzKSB7XG4gICAgICAgIGlmIChpbWFnZSkge1xuICAgICAgICAgICAgcGF0dGVybi5zZXRUaWxlKHtjb29yZCwgdGlsZVNpemV9LCBwYWludGVyLCBwcm9ncmFtKTtcbiAgICAgICAgfVxuICAgICAgICBnbC51bmlmb3JtTWF0cml4NGZ2KHByb2dyYW0udV9tYXRyaXgsIGZhbHNlLCBwYWludGVyLnRyYW5zZm9ybS5jYWxjdWxhdGVQb3NNYXRyaXgoY29vcmQpKTtcbiAgICAgICAgZ2wuZHJhd0FycmF5cyhnbC5UUklBTkdMRV9TVFJJUCwgMCwgcGFpbnRlci50aWxlRXh0ZW50QnVmZmVyLmxlbmd0aCk7XG4gICAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBicm93c2VyID0gcmVxdWlyZSgnLi4vdXRpbC9icm93c2VyJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZHJhd0NpcmNsZXM7XG5cbmZ1bmN0aW9uIGRyYXdDaXJjbGVzKHBhaW50ZXIsIHNvdXJjZUNhY2hlLCBsYXllciwgY29vcmRzKSB7XG4gICAgaWYgKHBhaW50ZXIuaXNPcGFxdWVQYXNzKSByZXR1cm47XG5cbiAgICBjb25zdCBnbCA9IHBhaW50ZXIuZ2w7XG5cbiAgICBwYWludGVyLnNldERlcHRoU3VibGF5ZXIoMCk7XG4gICAgcGFpbnRlci5kZXB0aE1hc2soZmFsc2UpO1xuXG4gICAgLy8gQWxsb3cgY2lyY2xlcyB0byBiZSBkcmF3biBhY3Jvc3MgYm91bmRhcmllcywgc28gdGhhdFxuICAgIC8vIGxhcmdlIGNpcmNsZXMgYXJlIG5vdCBjbGlwcGVkIHRvIHRpbGVzXG4gICAgZ2wuZGlzYWJsZShnbC5TVEVOQ0lMX1RFU1QpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb29yZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgY29vcmQgPSBjb29yZHNbaV07XG5cbiAgICAgICAgY29uc3QgdGlsZSA9IHNvdXJjZUNhY2hlLmdldFRpbGUoY29vcmQpO1xuICAgICAgICBjb25zdCBidWNrZXQgPSB0aWxlLmdldEJ1Y2tldChsYXllcik7XG4gICAgICAgIGlmICghYnVja2V0KSBjb250aW51ZTtcblxuICAgICAgICBjb25zdCBidWZmZXJzID0gYnVja2V0LmJ1ZmZlcnM7XG4gICAgICAgIGNvbnN0IGxheWVyRGF0YSA9IGJ1ZmZlcnMubGF5ZXJEYXRhW2xheWVyLmlkXTtcbiAgICAgICAgY29uc3QgcHJvZ3JhbUNvbmZpZ3VyYXRpb24gPSBsYXllckRhdGEucHJvZ3JhbUNvbmZpZ3VyYXRpb247XG4gICAgICAgIGNvbnN0IHByb2dyYW0gPSBwYWludGVyLnVzZVByb2dyYW0oJ2NpcmNsZScsIHByb2dyYW1Db25maWd1cmF0aW9uKTtcbiAgICAgICAgcHJvZ3JhbUNvbmZpZ3VyYXRpb24uc2V0VW5pZm9ybXMoZ2wsIHByb2dyYW0sIGxheWVyLCB7em9vbTogcGFpbnRlci50cmFuc2Zvcm0uem9vbX0pO1xuXG4gICAgICAgIGlmIChsYXllci5wYWludFsnY2lyY2xlLXBpdGNoLXNjYWxlJ10gPT09ICdtYXAnKSB7XG4gICAgICAgICAgICBnbC51bmlmb3JtMWkocHJvZ3JhbS51X3NjYWxlX3dpdGhfbWFwLCB0cnVlKTtcbiAgICAgICAgICAgIGdsLnVuaWZvcm0yZihwcm9ncmFtLnVfZXh0cnVkZV9zY2FsZSxcbiAgICAgICAgICAgICAgICBwYWludGVyLnRyYW5zZm9ybS5waXhlbHNUb0dMVW5pdHNbMF0gKiBwYWludGVyLnRyYW5zZm9ybS5jYW1lcmFUb0NlbnRlckRpc3RhbmNlLFxuICAgICAgICAgICAgICAgIHBhaW50ZXIudHJhbnNmb3JtLnBpeGVsc1RvR0xVbml0c1sxXSAqIHBhaW50ZXIudHJhbnNmb3JtLmNhbWVyYVRvQ2VudGVyRGlzdGFuY2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZ2wudW5pZm9ybTFpKHByb2dyYW0udV9zY2FsZV93aXRoX21hcCwgZmFsc2UpO1xuICAgICAgICAgICAgZ2wudW5pZm9ybTJmdihwcm9ncmFtLnVfZXh0cnVkZV9zY2FsZSwgcGFpbnRlci50cmFuc2Zvcm0ucGl4ZWxzVG9HTFVuaXRzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGdsLnVuaWZvcm0xZihwcm9ncmFtLnVfZGV2aWNlcGl4ZWxyYXRpbywgYnJvd3Nlci5kZXZpY2VQaXhlbFJhdGlvKTtcblxuICAgICAgICBnbC51bmlmb3JtTWF0cml4NGZ2KHByb2dyYW0udV9tYXRyaXgsIGZhbHNlLCBwYWludGVyLnRyYW5zbGF0ZVBvc01hdHJpeChcbiAgICAgICAgICAgIGNvb3JkLnBvc01hdHJpeCxcbiAgICAgICAgICAgIHRpbGUsXG4gICAgICAgICAgICBsYXllci5wYWludFsnY2lyY2xlLXRyYW5zbGF0ZSddLFxuICAgICAgICAgICAgbGF5ZXIucGFpbnRbJ2NpcmNsZS10cmFuc2xhdGUtYW5jaG9yJ11cbiAgICAgICAgKSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBzZWdtZW50IG9mIGJ1ZmZlcnMuc2VnbWVudHMpIHtcbiAgICAgICAgICAgIHNlZ21lbnQudmFvc1tsYXllci5pZF0uYmluZChnbCwgcHJvZ3JhbSwgYnVmZmVycy5sYXlvdXRWZXJ0ZXhCdWZmZXIsIGJ1ZmZlcnMuZWxlbWVudEJ1ZmZlciwgbGF5ZXJEYXRhLnBhaW50VmVydGV4QnVmZmVyLCBzZWdtZW50LnZlcnRleE9mZnNldCk7XG4gICAgICAgICAgICBnbC5kcmF3RWxlbWVudHMoZ2wuVFJJQU5HTEVTLCBzZWdtZW50LnByaW1pdGl2ZUxlbmd0aCAqIDMsIGdsLlVOU0lHTkVEX1NIT1JULCBzZWdtZW50LnByaW1pdGl2ZU9mZnNldCAqIDMgKiAyKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBkcmF3Q29sbGlzaW9uRGVidWc7XG5cbmZ1bmN0aW9uIGRyYXdDb2xsaXNpb25EZWJ1ZyhwYWludGVyLCBzb3VyY2VDYWNoZSwgbGF5ZXIsIGNvb3Jkcykge1xuICAgIGNvbnN0IGdsID0gcGFpbnRlci5nbDtcbiAgICBnbC5lbmFibGUoZ2wuU1RFTkNJTF9URVNUKTtcbiAgICBjb25zdCBwcm9ncmFtID0gcGFpbnRlci51c2VQcm9ncmFtKCdjb2xsaXNpb25Cb3gnKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29vcmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGNvb3JkID0gY29vcmRzW2ldO1xuICAgICAgICBjb25zdCB0aWxlID0gc291cmNlQ2FjaGUuZ2V0VGlsZShjb29yZCk7XG4gICAgICAgIGNvbnN0IGJ1Y2tldCA9IHRpbGUuZ2V0QnVja2V0KGxheWVyKTtcbiAgICAgICAgaWYgKCFidWNrZXQpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCBidWZmZXJzID0gYnVja2V0LmJ1ZmZlcnMuY29sbGlzaW9uQm94O1xuICAgICAgICBpZiAoIWJ1ZmZlcnMpIGNvbnRpbnVlO1xuXG4gICAgICAgIGdsLnVuaWZvcm1NYXRyaXg0ZnYocHJvZ3JhbS51X21hdHJpeCwgZmFsc2UsIGNvb3JkLnBvc01hdHJpeCk7XG5cbiAgICAgICAgcGFpbnRlci5lbmFibGVUaWxlQ2xpcHBpbmdNYXNrKGNvb3JkKTtcblxuICAgICAgICBwYWludGVyLmxpbmVXaWR0aCgxKTtcbiAgICAgICAgZ2wudW5pZm9ybTFmKHByb2dyYW0udV9zY2FsZSwgTWF0aC5wb3coMiwgcGFpbnRlci50cmFuc2Zvcm0uem9vbSAtIHRpbGUuY29vcmQueikpO1xuICAgICAgICBnbC51bmlmb3JtMWYocHJvZ3JhbS51X3pvb20sIHBhaW50ZXIudHJhbnNmb3JtLnpvb20gKiAxMCk7XG4gICAgICAgIGdsLnVuaWZvcm0xZihwcm9ncmFtLnVfbWF4em9vbSwgKHRpbGUuY29vcmQueiArIDEpICogMTApO1xuXG4gICAgICAgIGZvciAoY29uc3Qgc2VnbWVudCBvZiBidWZmZXJzLnNlZ21lbnRzKSB7XG4gICAgICAgICAgICBzZWdtZW50LnZhb3NbbGF5ZXIuaWRdLmJpbmQoZ2wsIHByb2dyYW0sIGJ1ZmZlcnMubGF5b3V0VmVydGV4QnVmZmVyLCBidWZmZXJzLmVsZW1lbnRCdWZmZXIsIG51bGwsIHNlZ21lbnQudmVydGV4T2Zmc2V0KTtcbiAgICAgICAgICAgIGdsLmRyYXdFbGVtZW50cyhnbC5MSU5FUywgc2VnbWVudC5wcmltaXRpdmVMZW5ndGggKiAyLCBnbC5VTlNJR05FRF9TSE9SVCwgc2VnbWVudC5wcmltaXRpdmVPZmZzZXQgKiAyICogMik7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHRleHRWZXJ0aWNlcyA9IHJlcXVpcmUoJy4uL2xpYi9kZWJ1Z3RleHQnKTtcbmNvbnN0IGJyb3dzZXIgPSByZXF1aXJlKCcuLi91dGlsL2Jyb3dzZXInKTtcbmNvbnN0IG1hdDQgPSByZXF1aXJlKCdAbWFwYm94L2dsLW1hdHJpeCcpLm1hdDQ7XG5jb25zdCBFWFRFTlQgPSByZXF1aXJlKCcuLi9kYXRhL2V4dGVudCcpO1xuY29uc3QgQnVmZmVyID0gcmVxdWlyZSgnLi4vZGF0YS9idWZmZXInKTtcbmNvbnN0IFZlcnRleEFycmF5T2JqZWN0ID0gcmVxdWlyZSgnLi92ZXJ0ZXhfYXJyYXlfb2JqZWN0Jyk7XG5jb25zdCBQb3NBcnJheSA9IHJlcXVpcmUoJy4uL2RhdGEvcG9zX2FycmF5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZHJhd0RlYnVnO1xuXG5mdW5jdGlvbiBkcmF3RGVidWcocGFpbnRlciwgc291cmNlQ2FjaGUsIGNvb3Jkcykge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29vcmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGRyYXdEZWJ1Z1RpbGUocGFpbnRlciwgc291cmNlQ2FjaGUsIGNvb3Jkc1tpXSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkcmF3RGVidWdUaWxlKHBhaW50ZXIsIHNvdXJjZUNhY2hlLCBjb29yZCkge1xuICAgIGNvbnN0IGdsID0gcGFpbnRlci5nbDtcblxuICAgIGdsLmRpc2FibGUoZ2wuU1RFTkNJTF9URVNUKTtcbiAgICBwYWludGVyLmxpbmVXaWR0aCgxICogYnJvd3Nlci5kZXZpY2VQaXhlbFJhdGlvKTtcblxuICAgIGNvbnN0IHBvc01hdHJpeCA9IGNvb3JkLnBvc01hdHJpeDtcbiAgICBjb25zdCBwcm9ncmFtID0gcGFpbnRlci51c2VQcm9ncmFtKCdkZWJ1ZycpO1xuXG4gICAgZ2wudW5pZm9ybU1hdHJpeDRmdihwcm9ncmFtLnVfbWF0cml4LCBmYWxzZSwgcG9zTWF0cml4KTtcbiAgICBnbC51bmlmb3JtNGYocHJvZ3JhbS51X2NvbG9yLCAxLCAwLCAwLCAxKTtcbiAgICBwYWludGVyLmRlYnVnVkFPLmJpbmQoZ2wsIHByb2dyYW0sIHBhaW50ZXIuZGVidWdCdWZmZXIpO1xuICAgIGdsLmRyYXdBcnJheXMoZ2wuTElORV9TVFJJUCwgMCwgcGFpbnRlci5kZWJ1Z0J1ZmZlci5sZW5ndGgpO1xuXG4gICAgY29uc3QgdmVydGljZXMgPSB0ZXh0VmVydGljZXMoY29vcmQudG9TdHJpbmcoKSwgNTAsIDIwMCwgNSk7XG4gICAgY29uc3QgZGVidWdUZXh0QXJyYXkgPSBuZXcgUG9zQXJyYXkoKTtcbiAgICBmb3IgKGxldCB2ID0gMDsgdiA8IHZlcnRpY2VzLmxlbmd0aDsgdiArPSAyKSB7XG4gICAgICAgIGRlYnVnVGV4dEFycmF5LmVtcGxhY2VCYWNrKHZlcnRpY2VzW3ZdLCB2ZXJ0aWNlc1t2ICsgMV0pO1xuICAgIH1cbiAgICBjb25zdCBkZWJ1Z1RleHRCdWZmZXIgPSBCdWZmZXIuZnJvbVN0cnVjdEFycmF5KGRlYnVnVGV4dEFycmF5LCBCdWZmZXIuQnVmZmVyVHlwZS5WRVJURVgpO1xuICAgIGNvbnN0IGRlYnVnVGV4dFZBTyA9IG5ldyBWZXJ0ZXhBcnJheU9iamVjdCgpO1xuICAgIGRlYnVnVGV4dFZBTy5iaW5kKGdsLCBwcm9ncmFtLCBkZWJ1Z1RleHRCdWZmZXIpO1xuICAgIGdsLnVuaWZvcm00Zihwcm9ncmFtLnVfY29sb3IsIDEsIDEsIDEsIDEpO1xuXG4gICAgLy8gRHJhdyB0aGUgaGFsbyB3aXRoIG11bHRpcGxlIDFweCBsaW5lcyBpbnN0ZWFkIG9mIG9uZSB3aWRlciBsaW5lIGJlY2F1c2VcbiAgICAvLyB0aGUgZ2wgc3BlYyBkb2Vzbid0IGd1YXJhbnRlZSBzdXBwb3J0IGZvciBsaW5lcyB3aXRoIHdpZHRoID4gMS5cbiAgICBjb25zdCB0aWxlU2l6ZSA9IHNvdXJjZUNhY2hlLmdldFRpbGUoY29vcmQpLnRpbGVTaXplO1xuICAgIGNvbnN0IG9uZVBpeGVsID0gRVhURU5UIC8gKE1hdGgucG93KDIsIHBhaW50ZXIudHJhbnNmb3JtLnpvb20gLSBjb29yZC56KSAqIHRpbGVTaXplKTtcbiAgICBjb25zdCB0cmFuc2xhdGlvbnMgPSBbWy0xLCAtMV0sIFstMSwgMV0sIFsxLCAtMV0sIFsxLCAxXV07XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0cmFuc2xhdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgdHJhbnNsYXRpb24gPSB0cmFuc2xhdGlvbnNbaV07XG4gICAgICAgIGdsLnVuaWZvcm1NYXRyaXg0ZnYocHJvZ3JhbS51X21hdHJpeCwgZmFsc2UsIG1hdDQudHJhbnNsYXRlKFtdLCBwb3NNYXRyaXgsIFtvbmVQaXhlbCAqIHRyYW5zbGF0aW9uWzBdLCBvbmVQaXhlbCAqIHRyYW5zbGF0aW9uWzFdLCAwXSkpO1xuICAgICAgICBnbC5kcmF3QXJyYXlzKGdsLkxJTkVTLCAwLCBkZWJ1Z1RleHRCdWZmZXIubGVuZ3RoKTtcbiAgICB9XG5cbiAgICBnbC51bmlmb3JtNGYocHJvZ3JhbS51X2NvbG9yLCAwLCAwLCAwLCAxKTtcbiAgICBnbC51bmlmb3JtTWF0cml4NGZ2KHByb2dyYW0udV9tYXRyaXgsIGZhbHNlLCBwb3NNYXRyaXgpO1xuICAgIGdsLmRyYXdBcnJheXMoZ2wuTElORVMsIDAsIGRlYnVnVGV4dEJ1ZmZlci5sZW5ndGgpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBwYXR0ZXJuID0gcmVxdWlyZSgnLi9wYXR0ZXJuJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZHJhd0ZpbGw7XG5cbmZ1bmN0aW9uIGRyYXdGaWxsKHBhaW50ZXIsIHNvdXJjZUNhY2hlLCBsYXllciwgY29vcmRzKSB7XG4gICAgY29uc3QgZ2wgPSBwYWludGVyLmdsO1xuICAgIGdsLmVuYWJsZShnbC5TVEVOQ0lMX1RFU1QpO1xuXG4gICAgY29uc3QgaXNPcGFxdWUgPVxuICAgICAgICAhbGF5ZXIucGFpbnRbJ2ZpbGwtcGF0dGVybiddICYmXG4gICAgICAgIGxheWVyLmlzUGFpbnRWYWx1ZUZlYXR1cmVDb25zdGFudCgnZmlsbC1jb2xvcicpICYmXG4gICAgICAgIGxheWVyLmlzUGFpbnRWYWx1ZUZlYXR1cmVDb25zdGFudCgnZmlsbC1vcGFjaXR5JykgJiZcbiAgICAgICAgbGF5ZXIucGFpbnRbJ2ZpbGwtY29sb3InXVszXSA9PT0gMSAmJlxuICAgICAgICBsYXllci5wYWludFsnZmlsbC1vcGFjaXR5J10gPT09IDE7XG5cbiAgICAvLyBEcmF3IGZpbGxcbiAgICBpZiAocGFpbnRlci5pc09wYXF1ZVBhc3MgPT09IGlzT3BhcXVlKSB7XG4gICAgICAgIC8vIE9uY2Ugd2Ugc3dpdGNoIHRvIGVhcmN1dCBkcmF3aW5nIHdlIGNhbiBwdWxsIG1vc3Qgb2YgdGhlIFdlYkdMIHNldHVwXG4gICAgICAgIC8vIG91dHNpZGUgb2YgdGhpcyBjb29yZHMgbG9vcC5cbiAgICAgICAgcGFpbnRlci5zZXREZXB0aFN1YmxheWVyKDEpO1xuICAgICAgICBkcmF3RmlsbFRpbGVzKHBhaW50ZXIsIHNvdXJjZUNhY2hlLCBsYXllciwgY29vcmRzLCBkcmF3RmlsbFRpbGUpO1xuICAgIH1cblxuICAgIC8vIERyYXcgc3Ryb2tlXG4gICAgaWYgKCFwYWludGVyLmlzT3BhcXVlUGFzcyAmJiBsYXllci5wYWludFsnZmlsbC1hbnRpYWxpYXMnXSkge1xuICAgICAgICBwYWludGVyLmxpbmVXaWR0aCgyKTtcbiAgICAgICAgcGFpbnRlci5kZXB0aE1hc2soZmFsc2UpO1xuXG4gICAgICAgIC8vIElmIHdlIGRlZmluZWQgYSBkaWZmZXJlbnQgY29sb3IgZm9yIHRoZSBmaWxsIG91dGxpbmUsIHdlIGFyZVxuICAgICAgICAvLyBnb2luZyB0byBpZ25vcmUgdGhlIGJpdHMgaW4gMHgwNyBhbmQganVzdCBjYXJlIGFib3V0IHRoZSBnbG9iYWxcbiAgICAgICAgLy8gY2xpcHBpbmcgbWFzay5cbiAgICAgICAgLy8gT3RoZXJ3aXNlLCB3ZSBvbmx5IHdhbnQgdG8gZHJhd0ZpbGwgdGhlIGFudGlhbGlhc2VkIHBhcnRzIHRoYXQgYXJlXG4gICAgICAgIC8vICpvdXRzaWRlKiB0aGUgY3VycmVudCBzaGFwZS4gVGhpcyBpcyBpbXBvcnRhbnQgaW4gY2FzZSB0aGUgZmlsbFxuICAgICAgICAvLyBvciBzdHJva2UgY29sb3IgaXMgdHJhbnNsdWNlbnQuIElmIHdlIHdvdWxkbid0IGNsaXAgdG8gb3V0c2lkZVxuICAgICAgICAvLyB0aGUgY3VycmVudCBzaGFwZSwgc29tZSBwaXhlbHMgZnJvbSB0aGUgb3V0bGluZSBzdHJva2Ugb3ZlcmxhcHBlZFxuICAgICAgICAvLyB0aGUgKG5vbi1hbnRpYWxpYXNlZCkgZmlsbC5cbiAgICAgICAgcGFpbnRlci5zZXREZXB0aFN1YmxheWVyKGxheWVyLmdldFBhaW50UHJvcGVydHkoJ2ZpbGwtb3V0bGluZS1jb2xvcicpID8gMiA6IDApO1xuICAgICAgICBkcmF3RmlsbFRpbGVzKHBhaW50ZXIsIHNvdXJjZUNhY2hlLCBsYXllciwgY29vcmRzLCBkcmF3U3Ryb2tlVGlsZSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkcmF3RmlsbFRpbGVzKHBhaW50ZXIsIHNvdXJjZUNhY2hlLCBsYXllciwgY29vcmRzLCBkcmF3Rm4pIHtcbiAgICBsZXQgZmlyc3RUaWxlID0gdHJ1ZTtcbiAgICBmb3IgKGNvbnN0IGNvb3JkIG9mIGNvb3Jkcykge1xuICAgICAgICBjb25zdCB0aWxlID0gc291cmNlQ2FjaGUuZ2V0VGlsZShjb29yZCk7XG4gICAgICAgIGNvbnN0IGJ1Y2tldCA9IHRpbGUuZ2V0QnVja2V0KGxheWVyKTtcbiAgICAgICAgaWYgKCFidWNrZXQpIGNvbnRpbnVlO1xuXG4gICAgICAgIHBhaW50ZXIuZW5hYmxlVGlsZUNsaXBwaW5nTWFzayhjb29yZCk7XG4gICAgICAgIGRyYXdGbihwYWludGVyLCBzb3VyY2VDYWNoZSwgbGF5ZXIsIHRpbGUsIGNvb3JkLCBidWNrZXQuYnVmZmVycywgZmlyc3RUaWxlKTtcbiAgICAgICAgZmlyc3RUaWxlID0gZmFsc2U7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkcmF3RmlsbFRpbGUocGFpbnRlciwgc291cmNlQ2FjaGUsIGxheWVyLCB0aWxlLCBjb29yZCwgYnVmZmVycywgZmlyc3RUaWxlKSB7XG4gICAgY29uc3QgZ2wgPSBwYWludGVyLmdsO1xuICAgIGNvbnN0IGxheWVyRGF0YSA9IGJ1ZmZlcnMubGF5ZXJEYXRhW2xheWVyLmlkXTtcblxuICAgIGNvbnN0IHByb2dyYW0gPSBzZXRGaWxsUHJvZ3JhbSgnZmlsbCcsIGxheWVyLnBhaW50WydmaWxsLXBhdHRlcm4nXSwgcGFpbnRlciwgbGF5ZXJEYXRhLCBsYXllciwgdGlsZSwgY29vcmQsIGZpcnN0VGlsZSk7XG5cbiAgICBmb3IgKGNvbnN0IHNlZ21lbnQgb2YgYnVmZmVycy5zZWdtZW50cykge1xuICAgICAgICBzZWdtZW50LnZhb3NbbGF5ZXIuaWRdLmJpbmQoZ2wsIHByb2dyYW0sIGJ1ZmZlcnMubGF5b3V0VmVydGV4QnVmZmVyLCBidWZmZXJzLmVsZW1lbnRCdWZmZXIsIGxheWVyRGF0YS5wYWludFZlcnRleEJ1ZmZlciwgc2VnbWVudC52ZXJ0ZXhPZmZzZXQpO1xuICAgICAgICBnbC5kcmF3RWxlbWVudHMoZ2wuVFJJQU5HTEVTLCBzZWdtZW50LnByaW1pdGl2ZUxlbmd0aCAqIDMsIGdsLlVOU0lHTkVEX1NIT1JULCBzZWdtZW50LnByaW1pdGl2ZU9mZnNldCAqIDMgKiAyKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYXdTdHJva2VUaWxlKHBhaW50ZXIsIHNvdXJjZUNhY2hlLCBsYXllciwgdGlsZSwgY29vcmQsIGJ1ZmZlcnMsIGZpcnN0VGlsZSkge1xuICAgIGNvbnN0IGdsID0gcGFpbnRlci5nbDtcbiAgICBjb25zdCBsYXllckRhdGEgPSBidWZmZXJzLmxheWVyRGF0YVtsYXllci5pZF07XG4gICAgY29uc3QgdXNlUGF0dGVybiA9IGxheWVyLnBhaW50WydmaWxsLXBhdHRlcm4nXSAmJiAhbGF5ZXIuZ2V0UGFpbnRQcm9wZXJ0eSgnZmlsbC1vdXRsaW5lLWNvbG9yJyk7XG5cbiAgICBjb25zdCBwcm9ncmFtID0gc2V0RmlsbFByb2dyYW0oJ2ZpbGxPdXRsaW5lJywgdXNlUGF0dGVybiwgcGFpbnRlciwgbGF5ZXJEYXRhLCBsYXllciwgdGlsZSwgY29vcmQsIGZpcnN0VGlsZSk7XG4gICAgZ2wudW5pZm9ybTJmKHByb2dyYW0udV93b3JsZCwgZ2wuZHJhd2luZ0J1ZmZlcldpZHRoLCBnbC5kcmF3aW5nQnVmZmVySGVpZ2h0KTtcblxuICAgIGZvciAoY29uc3Qgc2VnbWVudCBvZiBidWZmZXJzLnNlZ21lbnRzMikge1xuICAgICAgICBzZWdtZW50LnZhb3NbbGF5ZXIuaWRdLmJpbmQoZ2wsIHByb2dyYW0sIGJ1ZmZlcnMubGF5b3V0VmVydGV4QnVmZmVyLCBidWZmZXJzLmVsZW1lbnRCdWZmZXIyLCBsYXllckRhdGEucGFpbnRWZXJ0ZXhCdWZmZXIsIHNlZ21lbnQudmVydGV4T2Zmc2V0KTtcbiAgICAgICAgZ2wuZHJhd0VsZW1lbnRzKGdsLkxJTkVTLCBzZWdtZW50LnByaW1pdGl2ZUxlbmd0aCAqIDIsIGdsLlVOU0lHTkVEX1NIT1JULCBzZWdtZW50LnByaW1pdGl2ZU9mZnNldCAqIDIgKiAyKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHNldEZpbGxQcm9ncmFtKHByb2dyYW1JZCwgdXNlUGF0dGVybiwgcGFpbnRlciwgbGF5ZXJEYXRhLCBsYXllciwgdGlsZSwgY29vcmQsIGZpcnN0VGlsZSkge1xuICAgIGxldCBwcm9ncmFtO1xuICAgIGNvbnN0IHByZXZQcm9ncmFtID0gcGFpbnRlci5jdXJyZW50UHJvZ3JhbTtcbiAgICBpZiAoIXVzZVBhdHRlcm4pIHtcbiAgICAgICAgcHJvZ3JhbSA9IHBhaW50ZXIudXNlUHJvZ3JhbShwcm9ncmFtSWQsIGxheWVyRGF0YS5wcm9ncmFtQ29uZmlndXJhdGlvbik7XG4gICAgICAgIGlmIChmaXJzdFRpbGUgfHwgcHJvZ3JhbSAhPT0gcHJldlByb2dyYW0pIHtcbiAgICAgICAgICAgIGxheWVyRGF0YS5wcm9ncmFtQ29uZmlndXJhdGlvbi5zZXRVbmlmb3JtcyhwYWludGVyLmdsLCBwcm9ncmFtLCBsYXllciwge3pvb206IHBhaW50ZXIudHJhbnNmb3JtLnpvb219KTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIHByb2dyYW0gPSBwYWludGVyLnVzZVByb2dyYW0oYCR7cHJvZ3JhbUlkfVBhdHRlcm5gLCBsYXllckRhdGEucHJvZ3JhbUNvbmZpZ3VyYXRpb24pO1xuICAgICAgICBpZiAoZmlyc3RUaWxlIHx8IHByb2dyYW0gIT09IHByZXZQcm9ncmFtKSB7XG4gICAgICAgICAgICBsYXllckRhdGEucHJvZ3JhbUNvbmZpZ3VyYXRpb24uc2V0VW5pZm9ybXMocGFpbnRlci5nbCwgcHJvZ3JhbSwgbGF5ZXIsIHt6b29tOiBwYWludGVyLnRyYW5zZm9ybS56b29tfSk7XG4gICAgICAgICAgICBwYXR0ZXJuLnByZXBhcmUobGF5ZXIucGFpbnRbJ2ZpbGwtcGF0dGVybiddLCBwYWludGVyLCBwcm9ncmFtKTtcbiAgICAgICAgfVxuICAgICAgICBwYXR0ZXJuLnNldFRpbGUodGlsZSwgcGFpbnRlciwgcHJvZ3JhbSk7XG4gICAgfVxuICAgIHBhaW50ZXIuZ2wudW5pZm9ybU1hdHJpeDRmdihwcm9ncmFtLnVfbWF0cml4LCBmYWxzZSwgcGFpbnRlci50cmFuc2xhdGVQb3NNYXRyaXgoXG4gICAgICAgIGNvb3JkLnBvc01hdHJpeCwgdGlsZSxcbiAgICAgICAgbGF5ZXIucGFpbnRbJ2ZpbGwtdHJhbnNsYXRlJ10sXG4gICAgICAgIGxheWVyLnBhaW50WydmaWxsLXRyYW5zbGF0ZS1hbmNob3InXVxuICAgICkpO1xuICAgIHJldHVybiBwcm9ncmFtO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBnbE1hdHJpeCA9IHJlcXVpcmUoJ0BtYXBib3gvZ2wtbWF0cml4Jyk7XG5jb25zdCBCdWZmZXIgPSByZXF1aXJlKCcuLi9kYXRhL2J1ZmZlcicpO1xuY29uc3QgVmVydGV4QXJyYXlPYmplY3QgPSByZXF1aXJlKCcuL3ZlcnRleF9hcnJheV9vYmplY3QnKTtcbmNvbnN0IFBvc0FycmF5ID0gcmVxdWlyZSgnLi4vZGF0YS9wb3NfYXJyYXknKTtcbmNvbnN0IHBhdHRlcm4gPSByZXF1aXJlKCcuL3BhdHRlcm4nKTtcbmNvbnN0IG1hdDMgPSBnbE1hdHJpeC5tYXQzO1xuY29uc3QgbWF0NCA9IGdsTWF0cml4Lm1hdDQ7XG5jb25zdCB2ZWMzID0gZ2xNYXRyaXgudmVjMztcblxubW9kdWxlLmV4cG9ydHMgPSBkcmF3O1xuXG5mdW5jdGlvbiBkcmF3KHBhaW50ZXIsIHNvdXJjZSwgbGF5ZXIsIGNvb3Jkcykge1xuICAgIGlmIChsYXllci5wYWludFsnZmlsbC1leHRydXNpb24tb3BhY2l0eSddID09PSAwKSByZXR1cm47XG4gICAgY29uc3QgZ2wgPSBwYWludGVyLmdsO1xuICAgIGdsLmRpc2FibGUoZ2wuU1RFTkNJTF9URVNUKTtcbiAgICBnbC5lbmFibGUoZ2wuREVQVEhfVEVTVCk7XG4gICAgcGFpbnRlci5kZXB0aE1hc2sodHJ1ZSk7XG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgdGV4dHVyZSB0byB3aGljaCB0byByZW5kZXIgdGhlIGV4dHJ1c2lvbiBsYXllci4gVGhpcyBhcHByb2FjaFxuICAgIC8vIGFsbG93cyB1cyB0byBhZGp1c3Qgb3BhY2l0eSBvbiBhIHBlci1sYXllciBiYXNpcyAoZWxpbWluYXRpbmcgdGhlIGludGVyaW9yXG4gICAgLy8gd2FsbHMgcGVyLWZlYXR1cmUgb3BhY2l0eSBwcm9ibGVtKVxuICAgIGNvbnN0IHRleHR1cmUgPSBuZXcgRXh0cnVzaW9uVGV4dHVyZShnbCwgcGFpbnRlciwgbGF5ZXIpO1xuICAgIHRleHR1cmUuYmluZEZyYW1lYnVmZmVyKCk7XG5cbiAgICBnbC5jbGVhckNvbG9yKDAsIDAsIDAsIDApO1xuICAgIGdsLmNsZWFyKGdsLkNPTE9SX0JVRkZFUl9CSVQgfCBnbC5ERVBUSF9CVUZGRVJfQklUKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29vcmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGRyYXdFeHRydXNpb24ocGFpbnRlciwgc291cmNlLCBsYXllciwgY29vcmRzW2ldKTtcbiAgICB9XG5cbiAgICAvLyBVbmJpbmQgdGhlIGZyYW1lYnVmZmVyIGFzIGEgcmVuZGVyIHRhcmdldCBhbmQgcmVuZGVyIGl0IHRvIHRoZSBtYXBcbiAgICB0ZXh0dXJlLnVuYmluZEZyYW1lYnVmZmVyKCk7XG4gICAgdGV4dHVyZS5yZW5kZXJUb01hcCgpO1xufVxuXG5mdW5jdGlvbiBFeHRydXNpb25UZXh0dXJlKGdsLCBwYWludGVyLCBsYXllcikge1xuICAgIHRoaXMuZ2wgPSBnbDtcbiAgICB0aGlzLndpZHRoID0gcGFpbnRlci53aWR0aDtcbiAgICB0aGlzLmhlaWdodCA9IHBhaW50ZXIuaGVpZ2h0O1xuICAgIHRoaXMucGFpbnRlciA9IHBhaW50ZXI7XG4gICAgdGhpcy5sYXllciA9IGxheWVyO1xuXG4gICAgdGhpcy50ZXh0dXJlID0gbnVsbDtcbiAgICB0aGlzLmZibyA9IG51bGw7XG4gICAgdGhpcy5mYm9zID0gdGhpcy5wYWludGVyLnByZUZib3NbdGhpcy53aWR0aF0gJiYgdGhpcy5wYWludGVyLnByZUZib3NbdGhpcy53aWR0aF1bdGhpcy5oZWlnaHRdO1xufVxuXG5FeHRydXNpb25UZXh0dXJlLnByb3RvdHlwZS5iaW5kRnJhbWVidWZmZXIgPSBmdW5jdGlvbigpIHtcbiAgICBjb25zdCBnbCA9IHRoaXMuZ2w7XG5cbiAgICB0aGlzLnRleHR1cmUgPSB0aGlzLnBhaW50ZXIuZ2V0Vmlld3BvcnRUZXh0dXJlKHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0KTtcblxuICAgIGdsLmFjdGl2ZVRleHR1cmUoZ2wuVEVYVFVSRTEpO1xuICAgIGlmICghdGhpcy50ZXh0dXJlKSB7XG4gICAgICAgIHRoaXMudGV4dHVyZSA9IGdsLmNyZWF0ZVRleHR1cmUoKTtcbiAgICAgICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgdGhpcy50ZXh0dXJlKTtcbiAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfUywgZ2wuQ0xBTVBfVE9fRURHRSk7XG4gICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1QsIGdsLkNMQU1QX1RPX0VER0UpO1xuICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgZ2wuTElORUFSKTtcbiAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01BR19GSUxURVIsIGdsLkxJTkVBUik7XG4gICAgICAgIGdsLnRleEltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgZ2wuUkdCQSwgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHQsIDAsIGdsLlJHQkEsIGdsLlVOU0lHTkVEX0JZVEUsIG51bGwpO1xuICAgICAgICB0aGlzLnRleHR1cmUud2lkdGggPSB0aGlzLndpZHRoO1xuICAgICAgICB0aGlzLnRleHR1cmUuaGVpZ2h0ID0gdGhpcy5oZWlnaHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgdGhpcy50ZXh0dXJlKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuZmJvcykge1xuICAgICAgICB0aGlzLmZibyA9IGdsLmNyZWF0ZUZyYW1lYnVmZmVyKCk7XG4gICAgICAgIGNvbnN0IHN0ZW5jaWwgPSBnbC5jcmVhdGVSZW5kZXJidWZmZXIoKTtcbiAgICAgICAgY29uc3QgZGVwdGhSZW5kZXJCdWZmZXIgPSBnbC5jcmVhdGVSZW5kZXJidWZmZXIoKTtcbiAgICAgICAgZ2wuYmluZFJlbmRlcmJ1ZmZlcihnbC5SRU5ERVJCVUZGRVIsIHN0ZW5jaWwpO1xuICAgICAgICBnbC5iaW5kUmVuZGVyYnVmZmVyKGdsLlJFTkRFUkJVRkZFUiwgZGVwdGhSZW5kZXJCdWZmZXIpO1xuICAgICAgICBnbC5yZW5kZXJidWZmZXJTdG9yYWdlKGdsLlJFTkRFUkJVRkZFUiwgZ2wuUkdCQTQsIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0KTtcbiAgICAgICAgZ2wucmVuZGVyYnVmZmVyU3RvcmFnZShnbC5SRU5ERVJCVUZGRVIsIGdsLkRFUFRIX0NPTVBPTkVOVDE2LCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodCk7XG4gICAgICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgdGhpcy5mYm8pO1xuICAgICAgICBnbC5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgZ2wuQ09MT1JfQVRUQUNITUVOVDAsIGdsLlJFTkRFUkJVRkZFUiwgc3RlbmNpbCk7XG4gICAgICAgIGdsLmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBnbC5ERVBUSF9BVFRBQ0hNRU5ULCBnbC5SRU5ERVJCVUZGRVIsIGRlcHRoUmVuZGVyQnVmZmVyKTtcbiAgICAgICAgZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoZ2wuRlJBTUVCVUZGRVIsIGdsLkNPTE9SX0FUVEFDSE1FTlQwLCBnbC5URVhUVVJFXzJELCB0aGlzLnRleHR1cmUsIDApO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZmJvID0gdGhpcy5mYm9zLnBvcCgpO1xuICAgICAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIHRoaXMuZmJvKTtcbiAgICAgICAgZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoZ2wuRlJBTUVCVUZGRVIsIGdsLkNPTE9SX0FUVEFDSE1FTlQwLCBnbC5URVhUVVJFXzJELCB0aGlzLnRleHR1cmUsIDApO1xuICAgIH1cbn07XG5cbkV4dHJ1c2lvblRleHR1cmUucHJvdG90eXBlLnVuYmluZEZyYW1lYnVmZmVyID0gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5wYWludGVyLmJpbmREZWZhdWx0RnJhbWVidWZmZXIoKTtcbiAgICBpZiAodGhpcy5mYm9zKSB7XG4gICAgICAgIHRoaXMuZmJvcy5wdXNoKHRoaXMuZmJvKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIXRoaXMucGFpbnRlci5wcmVGYm9zW3RoaXMud2lkdGhdKSB0aGlzLnBhaW50ZXIucHJlRmJvc1t0aGlzLndpZHRoXSA9IHt9O1xuICAgICAgICB0aGlzLnBhaW50ZXIucHJlRmJvc1t0aGlzLndpZHRoXVt0aGlzLmhlaWdodF0gPSBbdGhpcy5mYm9dO1xuICAgIH1cbiAgICB0aGlzLnBhaW50ZXIuc2F2ZVZpZXdwb3J0VGV4dHVyZSh0aGlzLnRleHR1cmUpO1xufTtcblxuRXh0cnVzaW9uVGV4dHVyZS5wcm90b3R5cGUucmVuZGVyVG9NYXAgPSBmdW5jdGlvbigpIHtcbiAgICBjb25zdCBnbCA9IHRoaXMuZ2w7XG4gICAgY29uc3QgcGFpbnRlciA9IHRoaXMucGFpbnRlcjtcbiAgICBjb25zdCBwcm9ncmFtID0gcGFpbnRlci51c2VQcm9ncmFtKCdleHRydXNpb25UZXh0dXJlJyk7XG5cbiAgICBnbC5hY3RpdmVUZXh0dXJlKGdsLlRFWFRVUkUwKTtcbiAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCB0aGlzLnRleHR1cmUpO1xuXG4gICAgZ2wudW5pZm9ybTFmKHByb2dyYW0udV9vcGFjaXR5LCB0aGlzLmxheWVyLnBhaW50WydmaWxsLWV4dHJ1c2lvbi1vcGFjaXR5J10pO1xuICAgIGdsLnVuaWZvcm0xaShwcm9ncmFtLnVfdGV4dHVyZSwgMSk7XG5cbiAgICBnbC51bmlmb3JtTWF0cml4NGZ2KHByb2dyYW0udV9tYXRyaXgsIGZhbHNlLCBtYXQ0Lm9ydGhvKFxuICAgICAgICBtYXQ0LmNyZWF0ZSgpLFxuICAgICAgICAwLFxuICAgICAgICBwYWludGVyLndpZHRoLFxuICAgICAgICBwYWludGVyLmhlaWdodCxcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgMSlcbiAgICApO1xuXG4gICAgZ2wuZGlzYWJsZShnbC5ERVBUSF9URVNUKTtcblxuICAgIGdsLnVuaWZvcm0xaShwcm9ncmFtLnVfeGRpbSwgcGFpbnRlci53aWR0aCk7XG4gICAgZ2wudW5pZm9ybTFpKHByb2dyYW0udV95ZGltLCBwYWludGVyLmhlaWdodCk7XG5cbiAgICBjb25zdCBhcnJheSA9IG5ldyBQb3NBcnJheSgpO1xuICAgIGFycmF5LmVtcGxhY2VCYWNrKDAsIDApO1xuICAgIGFycmF5LmVtcGxhY2VCYWNrKHBhaW50ZXIud2lkdGgsIDApO1xuICAgIGFycmF5LmVtcGxhY2VCYWNrKDAsIHBhaW50ZXIuaGVpZ2h0KTtcbiAgICBhcnJheS5lbXBsYWNlQmFjayhwYWludGVyLndpZHRoLCBwYWludGVyLmhlaWdodCk7XG4gICAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmZyb21TdHJ1Y3RBcnJheShhcnJheSwgQnVmZmVyLkJ1ZmZlclR5cGUuVkVSVEVYKTtcblxuICAgIGNvbnN0IHZhbyA9IG5ldyBWZXJ0ZXhBcnJheU9iamVjdCgpO1xuICAgIHZhby5iaW5kKGdsLCBwcm9ncmFtLCBidWZmZXIpO1xuICAgIGdsLmRyYXdBcnJheXMoZ2wuVFJJQU5HTEVfU1RSSVAsIDAsIDQpO1xuXG4gICAgZ2wuZW5hYmxlKGdsLkRFUFRIX1RFU1QpO1xufTtcblxuZnVuY3Rpb24gZHJhd0V4dHJ1c2lvbihwYWludGVyLCBzb3VyY2UsIGxheWVyLCBjb29yZCkge1xuICAgIGlmIChwYWludGVyLmlzT3BhcXVlUGFzcykgcmV0dXJuO1xuXG4gICAgY29uc3QgdGlsZSA9IHNvdXJjZS5nZXRUaWxlKGNvb3JkKTtcbiAgICBjb25zdCBidWNrZXQgPSB0aWxlLmdldEJ1Y2tldChsYXllcik7XG4gICAgaWYgKCFidWNrZXQpIHJldHVybjtcblxuICAgIGNvbnN0IGJ1ZmZlcnMgPSBidWNrZXQuYnVmZmVycztcbiAgICBjb25zdCBnbCA9IHBhaW50ZXIuZ2w7XG5cbiAgICBjb25zdCBpbWFnZSA9IGxheWVyLnBhaW50WydmaWxsLWV4dHJ1c2lvbi1wYXR0ZXJuJ107XG5cbiAgICBjb25zdCBsYXllckRhdGEgPSBidWZmZXJzLmxheWVyRGF0YVtsYXllci5pZF07XG4gICAgY29uc3QgcHJvZ3JhbUNvbmZpZ3VyYXRpb24gPSBsYXllckRhdGEucHJvZ3JhbUNvbmZpZ3VyYXRpb247XG4gICAgY29uc3QgcHJvZ3JhbSA9IHBhaW50ZXIudXNlUHJvZ3JhbShpbWFnZSA/ICdmaWxsRXh0cnVzaW9uUGF0dGVybicgOiAnZmlsbEV4dHJ1c2lvbicsIHByb2dyYW1Db25maWd1cmF0aW9uKTtcbiAgICBwcm9ncmFtQ29uZmlndXJhdGlvbi5zZXRVbmlmb3JtcyhnbCwgcHJvZ3JhbSwgbGF5ZXIsIHt6b29tOiBwYWludGVyLnRyYW5zZm9ybS56b29tfSk7XG5cbiAgICBpZiAoaW1hZ2UpIHtcbiAgICAgICAgcGF0dGVybi5wcmVwYXJlKGltYWdlLCBwYWludGVyLCBwcm9ncmFtKTtcbiAgICAgICAgcGF0dGVybi5zZXRUaWxlKHRpbGUsIHBhaW50ZXIsIHByb2dyYW0pO1xuICAgICAgICBnbC51bmlmb3JtMWYocHJvZ3JhbS51X2hlaWdodF9mYWN0b3IsIC1NYXRoLnBvdygyLCBjb29yZC56KSAvIHRpbGUudGlsZVNpemUgLyA4KTtcbiAgICB9XG5cbiAgICBwYWludGVyLmdsLnVuaWZvcm1NYXRyaXg0ZnYocHJvZ3JhbS51X21hdHJpeCwgZmFsc2UsIHBhaW50ZXIudHJhbnNsYXRlUG9zTWF0cml4KFxuICAgICAgICBjb29yZC5wb3NNYXRyaXgsXG4gICAgICAgIHRpbGUsXG4gICAgICAgIGxheWVyLnBhaW50WydmaWxsLWV4dHJ1c2lvbi10cmFuc2xhdGUnXSxcbiAgICAgICAgbGF5ZXIucGFpbnRbJ2ZpbGwtZXh0cnVzaW9uLXRyYW5zbGF0ZS1hbmNob3InXVxuICAgICkpO1xuXG4gICAgc2V0TGlnaHQocHJvZ3JhbSwgcGFpbnRlcik7XG5cbiAgICBmb3IgKGNvbnN0IHNlZ21lbnQgb2YgYnVmZmVycy5zZWdtZW50cykge1xuICAgICAgICBzZWdtZW50LnZhb3NbbGF5ZXIuaWRdLmJpbmQoZ2wsIHByb2dyYW0sIGJ1ZmZlcnMubGF5b3V0VmVydGV4QnVmZmVyLCBidWZmZXJzLmVsZW1lbnRCdWZmZXIsIGxheWVyRGF0YS5wYWludFZlcnRleEJ1ZmZlciwgc2VnbWVudC52ZXJ0ZXhPZmZzZXQpO1xuICAgICAgICBnbC5kcmF3RWxlbWVudHMoZ2wuVFJJQU5HTEVTLCBzZWdtZW50LnByaW1pdGl2ZUxlbmd0aCAqIDMsIGdsLlVOU0lHTkVEX1NIT1JULCBzZWdtZW50LnByaW1pdGl2ZU9mZnNldCAqIDMgKiAyKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHNldExpZ2h0KHByb2dyYW0sIHBhaW50ZXIpIHtcbiAgICBjb25zdCBnbCA9IHBhaW50ZXIuZ2w7XG4gICAgY29uc3QgbGlnaHQgPSBwYWludGVyLnN0eWxlLmxpZ2h0O1xuXG4gICAgY29uc3QgX2xwID0gbGlnaHQuY2FsY3VsYXRlZC5wb3NpdGlvbixcbiAgICAgICAgbGlnaHRQb3MgPSBbX2xwLngsIF9scC55LCBfbHAuel07XG4gICAgY29uc3QgbGlnaHRNYXQgPSBtYXQzLmNyZWF0ZSgpO1xuICAgIGlmIChsaWdodC5jYWxjdWxhdGVkLmFuY2hvciA9PT0gJ3ZpZXdwb3J0JykgbWF0My5mcm9tUm90YXRpb24obGlnaHRNYXQsIC1wYWludGVyLnRyYW5zZm9ybS5hbmdsZSk7XG4gICAgdmVjMy50cmFuc2Zvcm1NYXQzKGxpZ2h0UG9zLCBsaWdodFBvcywgbGlnaHRNYXQpO1xuXG4gICAgZ2wudW5pZm9ybTNmdihwcm9ncmFtLnVfbGlnaHRwb3MsIGxpZ2h0UG9zKTtcbiAgICBnbC51bmlmb3JtMWYocHJvZ3JhbS51X2xpZ2h0aW50ZW5zaXR5LCBsaWdodC5jYWxjdWxhdGVkLmludGVuc2l0eSk7XG4gICAgZ2wudW5pZm9ybTNmdihwcm9ncmFtLnVfbGlnaHRjb2xvciwgbGlnaHQuY2FsY3VsYXRlZC5jb2xvci5zbGljZSgwLCAzKSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IGJyb3dzZXIgPSByZXF1aXJlKCcuLi91dGlsL2Jyb3dzZXInKTtcbmNvbnN0IHBpeGVsc1RvVGlsZVVuaXRzID0gcmVxdWlyZSgnLi4vc291cmNlL3BpeGVsc190b190aWxlX3VuaXRzJyk7XG5cbi8qKlxuICogRHJhdyBhIGxpbmUuIFVuZGVyIHRoZSBob29kIHRoaXMgd2lsbCByZWFkIGVsZW1lbnRzIGZyb21cbiAqIGEgdGlsZSwgZGFzaCB0ZXh0dXJlcyBmcm9tIGEgbGluZUF0bGFzLCBhbmQgc3R5bGUgcHJvcGVydGllcyBmcm9tIGEgbGF5ZXIuXG4gKiBAcGFyYW0ge09iamVjdH0gcGFpbnRlclxuICogQHBhcmFtIHtPYmplY3R9IGxheWVyXG4gKiBAcGFyYW0ge09iamVjdH0gcG9zTWF0cml4XG4gKiBAcGFyYW0ge1RpbGV9IHRpbGVcbiAqIEByZXR1cm5zIHt1bmRlZmluZWR9IGRyYXdzIHdpdGggdGhlIHBhaW50ZXJcbiAqIEBwcml2YXRlXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZHJhd0xpbmUocGFpbnRlciwgc291cmNlQ2FjaGUsIGxheWVyLCBjb29yZHMpIHtcbiAgICBpZiAocGFpbnRlci5pc09wYXF1ZVBhc3MpIHJldHVybjtcbiAgICBwYWludGVyLnNldERlcHRoU3VibGF5ZXIoMCk7XG4gICAgcGFpbnRlci5kZXB0aE1hc2soZmFsc2UpO1xuXG4gICAgY29uc3QgZ2wgPSBwYWludGVyLmdsO1xuICAgIGdsLmVuYWJsZShnbC5TVEVOQ0lMX1RFU1QpO1xuXG4gICAgLy8gZG9uJ3QgZHJhdyB6ZXJvLXdpZHRoIGxpbmVzXG4gICAgaWYgKGxheWVyLnBhaW50WydsaW5lLXdpZHRoJ10gPD0gMCkgcmV0dXJuO1xuXG4gICAgY29uc3QgcHJvZ3JhbUlkID1cbiAgICAgICAgbGF5ZXIucGFpbnRbJ2xpbmUtZGFzaGFycmF5J10gPyAnbGluZVNERicgOlxuICAgICAgICBsYXllci5wYWludFsnbGluZS1wYXR0ZXJuJ10gPyAnbGluZVBhdHRlcm4nIDogJ2xpbmUnO1xuXG4gICAgbGV0IHByZXZUaWxlWm9vbTtcbiAgICBsZXQgZmlyc3RUaWxlID0gdHJ1ZTtcblxuICAgIGZvciAoY29uc3QgY29vcmQgb2YgY29vcmRzKSB7XG4gICAgICAgIGNvbnN0IHRpbGUgPSBzb3VyY2VDYWNoZS5nZXRUaWxlKGNvb3JkKTtcbiAgICAgICAgY29uc3QgYnVja2V0ID0gdGlsZS5nZXRCdWNrZXQobGF5ZXIpO1xuICAgICAgICBpZiAoIWJ1Y2tldCkgY29udGludWU7XG5cbiAgICAgICAgY29uc3QgbGF5ZXJEYXRhID0gYnVja2V0LmJ1ZmZlcnMubGF5ZXJEYXRhW2xheWVyLmlkXTtcbiAgICAgICAgY29uc3QgcHJldlByb2dyYW0gPSBwYWludGVyLmN1cnJlbnRQcm9ncmFtO1xuICAgICAgICBjb25zdCBwcm9ncmFtID0gcGFpbnRlci51c2VQcm9ncmFtKHByb2dyYW1JZCwgbGF5ZXJEYXRhLnByb2dyYW1Db25maWd1cmF0aW9uKTtcbiAgICAgICAgY29uc3QgcHJvZ3JhbUNoYW5nZWQgPSBmaXJzdFRpbGUgfHwgcHJvZ3JhbSAhPT0gcHJldlByb2dyYW07XG4gICAgICAgIGNvbnN0IHRpbGVSYXRpb0NoYW5nZWQgPSBwcmV2VGlsZVpvb20gIT09IHRpbGUuY29vcmQuejtcblxuICAgICAgICBpZiAocHJvZ3JhbUNoYW5nZWQpIHtcbiAgICAgICAgICAgIGxheWVyRGF0YS5wcm9ncmFtQ29uZmlndXJhdGlvbi5zZXRVbmlmb3JtcyhwYWludGVyLmdsLCBwcm9ncmFtLCBsYXllciwge3pvb206IHBhaW50ZXIudHJhbnNmb3JtLnpvb219KTtcbiAgICAgICAgfVxuICAgICAgICBkcmF3TGluZVRpbGUocHJvZ3JhbSwgcGFpbnRlciwgdGlsZSwgYnVja2V0LmJ1ZmZlcnMsIGxheWVyLCBjb29yZCwgbGF5ZXJEYXRhLCBwcm9ncmFtQ2hhbmdlZCwgdGlsZVJhdGlvQ2hhbmdlZCk7XG4gICAgICAgIHByZXZUaWxlWm9vbSA9IHRpbGUuY29vcmQuejtcbiAgICAgICAgZmlyc3RUaWxlID0gZmFsc2U7XG4gICAgfVxufTtcblxuZnVuY3Rpb24gZHJhd0xpbmVUaWxlKHByb2dyYW0sIHBhaW50ZXIsIHRpbGUsIGJ1ZmZlcnMsIGxheWVyLCBjb29yZCwgbGF5ZXJEYXRhLCBwcm9ncmFtQ2hhbmdlZCwgdGlsZVJhdGlvQ2hhbmdlZCkge1xuICAgIGNvbnN0IGdsID0gcGFpbnRlci5nbDtcbiAgICBjb25zdCBkYXNoYXJyYXkgPSBsYXllci5wYWludFsnbGluZS1kYXNoYXJyYXknXTtcbiAgICBjb25zdCBpbWFnZSA9IGxheWVyLnBhaW50WydsaW5lLXBhdHRlcm4nXTtcblxuICAgIGxldCBwb3NBLCBwb3NCLCBpbWFnZVBvc0EsIGltYWdlUG9zQjtcblxuICAgIGlmIChwcm9ncmFtQ2hhbmdlZCB8fCB0aWxlUmF0aW9DaGFuZ2VkKSB7XG4gICAgICAgIGNvbnN0IHRpbGVSYXRpbyA9IDEgLyBwaXhlbHNUb1RpbGVVbml0cyh0aWxlLCAxLCBwYWludGVyLnRyYW5zZm9ybS50aWxlWm9vbSk7XG5cbiAgICAgICAgaWYgKGRhc2hhcnJheSkge1xuICAgICAgICAgICAgcG9zQSA9IHBhaW50ZXIubGluZUF0bGFzLmdldERhc2goZGFzaGFycmF5LmZyb20sIGxheWVyLmxheW91dFsnbGluZS1jYXAnXSA9PT0gJ3JvdW5kJyk7XG4gICAgICAgICAgICBwb3NCID0gcGFpbnRlci5saW5lQXRsYXMuZ2V0RGFzaChkYXNoYXJyYXkudG8sIGxheWVyLmxheW91dFsnbGluZS1jYXAnXSA9PT0gJ3JvdW5kJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IHdpZHRoQSA9IHBvc0Eud2lkdGggKiBkYXNoYXJyYXkuZnJvbVNjYWxlO1xuICAgICAgICAgICAgY29uc3Qgd2lkdGhCID0gcG9zQi53aWR0aCAqIGRhc2hhcnJheS50b1NjYWxlO1xuXG4gICAgICAgICAgICBnbC51bmlmb3JtMmYocHJvZ3JhbS51X3BhdHRlcm5zY2FsZV9hLCB0aWxlUmF0aW8gLyB3aWR0aEEsIC1wb3NBLmhlaWdodCAvIDIpO1xuICAgICAgICAgICAgZ2wudW5pZm9ybTJmKHByb2dyYW0udV9wYXR0ZXJuc2NhbGVfYiwgdGlsZVJhdGlvIC8gd2lkdGhCLCAtcG9zQi5oZWlnaHQgLyAyKTtcbiAgICAgICAgICAgIGdsLnVuaWZvcm0xZihwcm9ncmFtLnVfc2RmZ2FtbWEsIHBhaW50ZXIubGluZUF0bGFzLndpZHRoIC8gKE1hdGgubWluKHdpZHRoQSwgd2lkdGhCKSAqIDI1NiAqIGJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbykgLyAyKTtcblxuICAgICAgICB9IGVsc2UgaWYgKGltYWdlKSB7XG4gICAgICAgICAgICBpbWFnZVBvc0EgPSBwYWludGVyLnNwcml0ZUF0bGFzLmdldFBvc2l0aW9uKGltYWdlLmZyb20sIHRydWUpO1xuICAgICAgICAgICAgaW1hZ2VQb3NCID0gcGFpbnRlci5zcHJpdGVBdGxhcy5nZXRQb3NpdGlvbihpbWFnZS50bywgdHJ1ZSk7XG4gICAgICAgICAgICBpZiAoIWltYWdlUG9zQSB8fCAhaW1hZ2VQb3NCKSByZXR1cm47XG5cbiAgICAgICAgICAgIGdsLnVuaWZvcm0yZihwcm9ncmFtLnVfcGF0dGVybl9zaXplX2EsIGltYWdlUG9zQS5zaXplWzBdICogaW1hZ2UuZnJvbVNjYWxlIC8gdGlsZVJhdGlvLCBpbWFnZVBvc0Iuc2l6ZVsxXSk7XG4gICAgICAgICAgICBnbC51bmlmb3JtMmYocHJvZ3JhbS51X3BhdHRlcm5fc2l6ZV9iLCBpbWFnZVBvc0Iuc2l6ZVswXSAqIGltYWdlLnRvU2NhbGUgLyB0aWxlUmF0aW8sIGltYWdlUG9zQi5zaXplWzFdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGdsLnVuaWZvcm0yZihwcm9ncmFtLnVfZ2xfdW5pdHNfdG9fcGl4ZWxzLCAxIC8gcGFpbnRlci50cmFuc2Zvcm0ucGl4ZWxzVG9HTFVuaXRzWzBdLCAxIC8gcGFpbnRlci50cmFuc2Zvcm0ucGl4ZWxzVG9HTFVuaXRzWzFdKTtcbiAgICB9XG5cbiAgICBpZiAocHJvZ3JhbUNoYW5nZWQpIHtcblxuICAgICAgICBpZiAoZGFzaGFycmF5KSB7XG4gICAgICAgICAgICBnbC51bmlmb3JtMWkocHJvZ3JhbS51X2ltYWdlLCAwKTtcbiAgICAgICAgICAgIGdsLmFjdGl2ZVRleHR1cmUoZ2wuVEVYVFVSRTApO1xuICAgICAgICAgICAgcGFpbnRlci5saW5lQXRsYXMuYmluZChnbCk7XG5cbiAgICAgICAgICAgIGdsLnVuaWZvcm0xZihwcm9ncmFtLnVfdGV4X3lfYSwgcG9zQS55KTtcbiAgICAgICAgICAgIGdsLnVuaWZvcm0xZihwcm9ncmFtLnVfdGV4X3lfYiwgcG9zQi55KTtcbiAgICAgICAgICAgIGdsLnVuaWZvcm0xZihwcm9ncmFtLnVfbWl4LCBkYXNoYXJyYXkudCk7XG5cbiAgICAgICAgfSBlbHNlIGlmIChpbWFnZSkge1xuICAgICAgICAgICAgZ2wudW5pZm9ybTFpKHByb2dyYW0udV9pbWFnZSwgMCk7XG4gICAgICAgICAgICBnbC5hY3RpdmVUZXh0dXJlKGdsLlRFWFRVUkUwKTtcbiAgICAgICAgICAgIHBhaW50ZXIuc3ByaXRlQXRsYXMuYmluZChnbCwgdHJ1ZSk7XG5cbiAgICAgICAgICAgIGdsLnVuaWZvcm0yZnYocHJvZ3JhbS51X3BhdHRlcm5fdGxfYSwgaW1hZ2VQb3NBLnRsKTtcbiAgICAgICAgICAgIGdsLnVuaWZvcm0yZnYocHJvZ3JhbS51X3BhdHRlcm5fYnJfYSwgaW1hZ2VQb3NBLmJyKTtcbiAgICAgICAgICAgIGdsLnVuaWZvcm0yZnYocHJvZ3JhbS51X3BhdHRlcm5fdGxfYiwgaW1hZ2VQb3NCLnRsKTtcbiAgICAgICAgICAgIGdsLnVuaWZvcm0yZnYocHJvZ3JhbS51X3BhdHRlcm5fYnJfYiwgaW1hZ2VQb3NCLmJyKTtcbiAgICAgICAgICAgIGdsLnVuaWZvcm0xZihwcm9ncmFtLnVfZmFkZSwgaW1hZ2UudCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2wudW5pZm9ybTFmKHByb2dyYW0udV93aWR0aCwgbGF5ZXIucGFpbnRbJ2xpbmUtd2lkdGgnXSk7XG4gICAgfVxuXG4gICAgcGFpbnRlci5lbmFibGVUaWxlQ2xpcHBpbmdNYXNrKGNvb3JkKTtcblxuICAgIGNvbnN0IHBvc01hdHJpeCA9IHBhaW50ZXIudHJhbnNsYXRlUG9zTWF0cml4KGNvb3JkLnBvc01hdHJpeCwgdGlsZSwgbGF5ZXIucGFpbnRbJ2xpbmUtdHJhbnNsYXRlJ10sIGxheWVyLnBhaW50WydsaW5lLXRyYW5zbGF0ZS1hbmNob3InXSk7XG4gICAgZ2wudW5pZm9ybU1hdHJpeDRmdihwcm9ncmFtLnVfbWF0cml4LCBmYWxzZSwgcG9zTWF0cml4KTtcblxuICAgIGdsLnVuaWZvcm0xZihwcm9ncmFtLnVfcmF0aW8sIDEgLyBwaXhlbHNUb1RpbGVVbml0cyh0aWxlLCAxLCBwYWludGVyLnRyYW5zZm9ybS56b29tKSk7XG5cbiAgICBmb3IgKGNvbnN0IHNlZ21lbnQgb2YgYnVmZmVycy5zZWdtZW50cykge1xuICAgICAgICBzZWdtZW50LnZhb3NbbGF5ZXIuaWRdLmJpbmQoZ2wsIHByb2dyYW0sIGJ1ZmZlcnMubGF5b3V0VmVydGV4QnVmZmVyLCBidWZmZXJzLmVsZW1lbnRCdWZmZXIsIGxheWVyRGF0YS5wYWludFZlcnRleEJ1ZmZlciwgc2VnbWVudC52ZXJ0ZXhPZmZzZXQpO1xuICAgICAgICBnbC5kcmF3RWxlbWVudHMoZ2wuVFJJQU5HTEVTLCBzZWdtZW50LnByaW1pdGl2ZUxlbmd0aCAqIDMsIGdsLlVOU0lHTkVEX1NIT1JULCBzZWdtZW50LnByaW1pdGl2ZU9mZnNldCAqIDMgKiAyKTtcbiAgICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHV0aWwgPSByZXF1aXJlKCcuLi91dGlsL3V0aWwnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBkcmF3UmFzdGVyO1xuXG5mdW5jdGlvbiBkcmF3UmFzdGVyKHBhaW50ZXIsIHNvdXJjZUNhY2hlLCBsYXllciwgY29vcmRzKSB7XG4gICAgaWYgKHBhaW50ZXIuaXNPcGFxdWVQYXNzKSByZXR1cm47XG5cbiAgICBjb25zdCBnbCA9IHBhaW50ZXIuZ2w7XG5cbiAgICBnbC5lbmFibGUoZ2wuREVQVEhfVEVTVCk7XG4gICAgcGFpbnRlci5kZXB0aE1hc2sodHJ1ZSk7XG5cbiAgICAvLyBDaGFuZ2UgZGVwdGggZnVuY3Rpb24gdG8gcHJldmVudCBkb3VibGUgZHJhd2luZyBpbiBhcmVhcyB3aGVyZSB0aWxlcyBvdmVybGFwLlxuICAgIGdsLmRlcHRoRnVuYyhnbC5MRVNTKTtcblxuICAgIGNvbnN0IG1pblRpbGVaID0gY29vcmRzLmxlbmd0aCAmJiBjb29yZHNbMF0uejtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29vcmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGNvb3JkID0gY29vcmRzW2ldO1xuICAgICAgICAvLyBzZXQgdGhlIGxvd2VyIHpvb20gbGV2ZWwgdG8gc3VibGF5ZXIgMCwgYW5kIGhpZ2hlciB6b29tIGxldmVscyB0byBoaWdoZXIgc3VibGF5ZXJzXG4gICAgICAgIHBhaW50ZXIuc2V0RGVwdGhTdWJsYXllcihjb29yZC56IC0gbWluVGlsZVopO1xuICAgICAgICBkcmF3UmFzdGVyVGlsZShwYWludGVyLCBzb3VyY2VDYWNoZSwgbGF5ZXIsIGNvb3JkKTtcbiAgICB9XG5cbiAgICBnbC5kZXB0aEZ1bmMoZ2wuTEVRVUFMKTtcbn1cblxuZnVuY3Rpb24gZHJhd1Jhc3RlclRpbGUocGFpbnRlciwgc291cmNlQ2FjaGUsIGxheWVyLCBjb29yZCkge1xuXG4gICAgY29uc3QgZ2wgPSBwYWludGVyLmdsO1xuXG4gICAgZ2wuZGlzYWJsZShnbC5TVEVOQ0lMX1RFU1QpO1xuXG4gICAgY29uc3QgdGlsZSA9IHNvdXJjZUNhY2hlLmdldFRpbGUoY29vcmQpO1xuICAgIGNvbnN0IHBvc01hdHJpeCA9IHBhaW50ZXIudHJhbnNmb3JtLmNhbGN1bGF0ZVBvc01hdHJpeChjb29yZCwgc291cmNlQ2FjaGUuZ2V0U291cmNlKCkubWF4em9vbSk7XG5cbiAgICB0aWxlLnJlZ2lzdGVyRmFkZUR1cmF0aW9uKHBhaW50ZXIuc3R5bGUuYW5pbWF0aW9uTG9vcCwgbGF5ZXIucGFpbnRbJ3Jhc3Rlci1mYWRlLWR1cmF0aW9uJ10pO1xuXG4gICAgY29uc3QgcHJvZ3JhbSA9IHBhaW50ZXIudXNlUHJvZ3JhbSgncmFzdGVyJyk7XG4gICAgZ2wudW5pZm9ybU1hdHJpeDRmdihwcm9ncmFtLnVfbWF0cml4LCBmYWxzZSwgcG9zTWF0cml4KTtcblxuICAgIC8vIGNvbG9yIHBhcmFtZXRlcnNcbiAgICBnbC51bmlmb3JtMWYocHJvZ3JhbS51X2JyaWdodG5lc3NfbG93LCBsYXllci5wYWludFsncmFzdGVyLWJyaWdodG5lc3MtbWluJ10pO1xuICAgIGdsLnVuaWZvcm0xZihwcm9ncmFtLnVfYnJpZ2h0bmVzc19oaWdoLCBsYXllci5wYWludFsncmFzdGVyLWJyaWdodG5lc3MtbWF4J10pO1xuICAgIGdsLnVuaWZvcm0xZihwcm9ncmFtLnVfc2F0dXJhdGlvbl9mYWN0b3IsIHNhdHVyYXRpb25GYWN0b3IobGF5ZXIucGFpbnRbJ3Jhc3Rlci1zYXR1cmF0aW9uJ10pKTtcbiAgICBnbC51bmlmb3JtMWYocHJvZ3JhbS51X2NvbnRyYXN0X2ZhY3RvciwgY29udHJhc3RGYWN0b3IobGF5ZXIucGFpbnRbJ3Jhc3Rlci1jb250cmFzdCddKSk7XG4gICAgZ2wudW5pZm9ybTNmdihwcm9ncmFtLnVfc3Bpbl93ZWlnaHRzLCBzcGluV2VpZ2h0cyhsYXllci5wYWludFsncmFzdGVyLWh1ZS1yb3RhdGUnXSkpO1xuXG4gICAgY29uc3QgcGFyZW50VGlsZSA9IHRpbGUuc291cmNlQ2FjaGUgJiYgdGlsZS5zb3VyY2VDYWNoZS5maW5kTG9hZGVkUGFyZW50KGNvb3JkLCAwLCB7fSksXG4gICAgICAgIGZhZGUgPSBnZXRGYWRlVmFsdWVzKHRpbGUsIHBhcmVudFRpbGUsIGxheWVyLCBwYWludGVyLnRyYW5zZm9ybSk7XG5cbiAgICBsZXQgcGFyZW50U2NhbGVCeSwgcGFyZW50VEw7XG5cbiAgICBnbC5hY3RpdmVUZXh0dXJlKGdsLlRFWFRVUkUwKTtcbiAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCB0aWxlLnRleHR1cmUpO1xuXG4gICAgZ2wuYWN0aXZlVGV4dHVyZShnbC5URVhUVVJFMSk7XG5cbiAgICBpZiAocGFyZW50VGlsZSkge1xuICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBwYXJlbnRUaWxlLnRleHR1cmUpO1xuICAgICAgICBwYXJlbnRTY2FsZUJ5ID0gTWF0aC5wb3coMiwgcGFyZW50VGlsZS5jb29yZC56IC0gdGlsZS5jb29yZC56KTtcbiAgICAgICAgcGFyZW50VEwgPSBbdGlsZS5jb29yZC54ICogcGFyZW50U2NhbGVCeSAlIDEsIHRpbGUuY29vcmQueSAqIHBhcmVudFNjYWxlQnkgJSAxXTtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRpbGUudGV4dHVyZSk7XG4gICAgfVxuXG4gICAgLy8gY3Jvc3MtZmFkZSBwYXJhbWV0ZXJzXG4gICAgZ2wudW5pZm9ybTJmdihwcm9ncmFtLnVfdGxfcGFyZW50LCBwYXJlbnRUTCB8fCBbMCwgMF0pO1xuICAgIGdsLnVuaWZvcm0xZihwcm9ncmFtLnVfc2NhbGVfcGFyZW50LCBwYXJlbnRTY2FsZUJ5IHx8IDEpO1xuICAgIGdsLnVuaWZvcm0xZihwcm9ncmFtLnVfYnVmZmVyX3NjYWxlLCAxKTtcbiAgICBnbC51bmlmb3JtMWYocHJvZ3JhbS51X2ZhZGVfdCwgZmFkZS5taXgpO1xuICAgIGdsLnVuaWZvcm0xZihwcm9ncmFtLnVfb3BhY2l0eSwgZmFkZS5vcGFjaXR5ICogbGF5ZXIucGFpbnRbJ3Jhc3Rlci1vcGFjaXR5J10pO1xuICAgIGdsLnVuaWZvcm0xaShwcm9ncmFtLnVfaW1hZ2UwLCAwKTtcbiAgICBnbC51bmlmb3JtMWkocHJvZ3JhbS51X2ltYWdlMSwgMSk7XG5cbiAgICBjb25zdCBidWZmZXIgPSB0aWxlLmJvdW5kc0J1ZmZlciB8fCBwYWludGVyLnJhc3RlckJvdW5kc0J1ZmZlcjtcbiAgICBjb25zdCB2YW8gPSB0aWxlLmJvdW5kc1ZBTyB8fCBwYWludGVyLnJhc3RlckJvdW5kc1ZBTztcbiAgICB2YW8uYmluZChnbCwgcHJvZ3JhbSwgYnVmZmVyKTtcbiAgICBnbC5kcmF3QXJyYXlzKGdsLlRSSUFOR0xFX1NUUklQLCAwLCBidWZmZXIubGVuZ3RoKTtcbn1cblxuZnVuY3Rpb24gc3BpbldlaWdodHMoYW5nbGUpIHtcbiAgICBhbmdsZSAqPSBNYXRoLlBJIC8gMTgwO1xuICAgIGNvbnN0IHMgPSBNYXRoLnNpbihhbmdsZSk7XG4gICAgY29uc3QgYyA9IE1hdGguY29zKGFuZ2xlKTtcbiAgICByZXR1cm4gW1xuICAgICAgICAoMiAqIGMgKyAxKSAvIDMsXG4gICAgICAgICgtTWF0aC5zcXJ0KDMpICogcyAtIGMgKyAxKSAvIDMsXG4gICAgICAgIChNYXRoLnNxcnQoMykgKiBzIC0gYyArIDEpIC8gM1xuICAgIF07XG59XG5cbmZ1bmN0aW9uIGNvbnRyYXN0RmFjdG9yKGNvbnRyYXN0KSB7XG4gICAgcmV0dXJuIGNvbnRyYXN0ID4gMCA/XG4gICAgICAgIDEgLyAoMSAtIGNvbnRyYXN0KSA6XG4gICAgICAgIDEgKyBjb250cmFzdDtcbn1cblxuZnVuY3Rpb24gc2F0dXJhdGlvbkZhY3RvcihzYXR1cmF0aW9uKSB7XG4gICAgcmV0dXJuIHNhdHVyYXRpb24gPiAwID9cbiAgICAgICAgMSAtIDEgLyAoMS4wMDEgLSBzYXR1cmF0aW9uKSA6XG4gICAgICAgIC1zYXR1cmF0aW9uO1xufVxuXG5mdW5jdGlvbiBnZXRGYWRlVmFsdWVzKHRpbGUsIHBhcmVudFRpbGUsIGxheWVyLCB0cmFuc2Zvcm0pIHtcbiAgICBjb25zdCBmYWRlRHVyYXRpb24gPSBsYXllci5wYWludFsncmFzdGVyLWZhZGUtZHVyYXRpb24nXTtcblxuICAgIGlmICh0aWxlLnNvdXJjZUNhY2hlICYmIGZhZGVEdXJhdGlvbiA+IDApIHtcbiAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgY29uc3Qgc2luY2VUaWxlID0gKG5vdyAtIHRpbGUudGltZUFkZGVkKSAvIGZhZGVEdXJhdGlvbjtcbiAgICAgICAgY29uc3Qgc2luY2VQYXJlbnQgPSBwYXJlbnRUaWxlID8gKG5vdyAtIHBhcmVudFRpbGUudGltZUFkZGVkKSAvIGZhZGVEdXJhdGlvbiA6IC0xO1xuXG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IHRpbGUuc291cmNlQ2FjaGUuZ2V0U291cmNlKCk7XG4gICAgICAgIGNvbnN0IGlkZWFsWiA9IHRyYW5zZm9ybS5jb3ZlcmluZ1pvb21MZXZlbCh7XG4gICAgICAgICAgICB0aWxlU2l6ZTogc291cmNlLnRpbGVTaXplLFxuICAgICAgICAgICAgcm91bmRab29tOiBzb3VyY2Uucm91bmRab29tXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIGlmIG5vIHBhcmVudCBvciBwYXJlbnQgaXMgb2xkZXIsIGZhZGUgaW47IGlmIHBhcmVudCBpcyB5b3VuZ2VyLCBmYWRlIG91dFxuICAgICAgICBjb25zdCBmYWRlSW4gPSAhcGFyZW50VGlsZSB8fCBNYXRoLmFicyhwYXJlbnRUaWxlLmNvb3JkLnogLSBpZGVhbFopID4gTWF0aC5hYnModGlsZS5jb29yZC56IC0gaWRlYWxaKTtcblxuICAgICAgICBjb25zdCBjaGlsZE9wYWNpdHkgPSB1dGlsLmNsYW1wKGZhZGVJbiA/IHNpbmNlVGlsZSA6IDEgLSBzaW5jZVBhcmVudCwgMCwgMSk7XG5cbiAgICAgICAgaWYgKHBhcmVudFRpbGUpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgb3BhY2l0eTogMSxcbiAgICAgICAgICAgICAgICBtaXg6IDEgLSBjaGlsZE9wYWNpdHlcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG9wYWNpdHk6IGNoaWxkT3BhY2l0eSxcbiAgICAgICAgICAgICAgICBtaXg6IDBcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgb3BhY2l0eTogMSxcbiAgICAgICAgICAgIG1peDogMFxuICAgICAgICB9O1xuICAgIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgYnJvd3NlciA9IHJlcXVpcmUoJy4uL3V0aWwvYnJvd3NlcicpO1xuY29uc3QgZHJhd0NvbGxpc2lvbkRlYnVnID0gcmVxdWlyZSgnLi9kcmF3X2NvbGxpc2lvbl9kZWJ1ZycpO1xuY29uc3QgcGl4ZWxzVG9UaWxlVW5pdHMgPSByZXF1aXJlKCcuLi9zb3VyY2UvcGl4ZWxzX3RvX3RpbGVfdW5pdHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBkcmF3U3ltYm9scztcblxuY29uc3Qgc2RmUHggPSA4O1xuY29uc3QgYmx1ck9mZnNldCA9IDEuMTk7XG5jb25zdCBoYWxvT2Zmc2V0ID0gNjtcbmNvbnN0IGdhbW1hID0gMC4xMDUgLyBicm93c2VyLmRldmljZVBpeGVsUmF0aW87XG5cbmZ1bmN0aW9uIGRyYXdTeW1ib2xzKHBhaW50ZXIsIHNvdXJjZUNhY2hlLCBsYXllciwgY29vcmRzKSB7XG4gICAgaWYgKHBhaW50ZXIuaXNPcGFxdWVQYXNzKSByZXR1cm47XG5cbiAgICBjb25zdCBkcmF3QWNyb3NzRWRnZXMgPVxuICAgICAgICAhbGF5ZXIubGF5b3V0Wyd0ZXh0LWFsbG93LW92ZXJsYXAnXSAmJlxuICAgICAgICAhbGF5ZXIubGF5b3V0WydpY29uLWFsbG93LW92ZXJsYXAnXSAmJlxuICAgICAgICAhbGF5ZXIubGF5b3V0Wyd0ZXh0LWlnbm9yZS1wbGFjZW1lbnQnXSAmJlxuICAgICAgICAhbGF5ZXIubGF5b3V0WydpY29uLWlnbm9yZS1wbGFjZW1lbnQnXTtcblxuICAgIGNvbnN0IGdsID0gcGFpbnRlci5nbDtcblxuICAgIC8vIERpc2FibGUgdGhlIHN0ZW5jaWwgdGVzdCBzbyB0aGF0IGxhYmVscyBhcmVuJ3QgY2xpcHBlZCB0byB0aWxlIGJvdW5kYXJpZXMuXG4gICAgLy9cbiAgICAvLyBMYXllcnMgd2l0aCBmZWF0dXJlcyB0aGF0IG1heSBiZSBkcmF3biBvdmVybGFwcGluZyBhcmVuJ3QgY2xpcHBlZC4gVGhlc2VcbiAgICAvLyBsYXllcnMgYXJlIHNvcnRlZCBpbiB0aGUgeSBkaXJlY3Rpb24sIGFuZCB0byBkcmF3IHRoZSBjb3JyZWN0IG9yZGVyaW5nIG5lYXJcbiAgICAvLyB0aWxlIGVkZ2VzIHRoZSBpY29ucyBhcmUgaW5jbHVkZWQgaW4gYm90aCB0aWxlcyBhbmQgY2xpcHBlZCB3aGVuIGRyYXdpbmcuXG4gICAgaWYgKGRyYXdBY3Jvc3NFZGdlcykge1xuICAgICAgICBnbC5kaXNhYmxlKGdsLlNURU5DSUxfVEVTVCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZ2wuZW5hYmxlKGdsLlNURU5DSUxfVEVTVCk7XG4gICAgfVxuXG4gICAgcGFpbnRlci5zZXREZXB0aFN1YmxheWVyKDApO1xuICAgIHBhaW50ZXIuZGVwdGhNYXNrKGZhbHNlKTtcblxuICAgIGRyYXdMYXllclN5bWJvbHMocGFpbnRlciwgc291cmNlQ2FjaGUsIGxheWVyLCBjb29yZHMsIGZhbHNlLFxuICAgICAgICBsYXllci5wYWludFsnaWNvbi10cmFuc2xhdGUnXSxcbiAgICAgICAgbGF5ZXIucGFpbnRbJ2ljb24tdHJhbnNsYXRlLWFuY2hvciddLFxuICAgICAgICBsYXllci5sYXlvdXRbJ2ljb24tcm90YXRpb24tYWxpZ25tZW50J10sXG4gICAgICAgIC8vIGljb24tcGl0Y2gtYWxpZ25tZW50IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWRcbiAgICAgICAgLy8gYW5kIHdlIHNpbXBseSBpbmhlcml0IHRoZSByb3RhdGlvbiBhbGlnbm1lbnRcbiAgICAgICAgbGF5ZXIubGF5b3V0WydpY29uLXJvdGF0aW9uLWFsaWdubWVudCddLFxuICAgICAgICBsYXllci5sYXlvdXRbJ2ljb24tc2l6ZSddLFxuICAgICAgICBsYXllci5wYWludFsnaWNvbi1oYWxvLXdpZHRoJ10sXG4gICAgICAgIGxheWVyLnBhaW50WydpY29uLWhhbG8tY29sb3InXSxcbiAgICAgICAgbGF5ZXIucGFpbnRbJ2ljb24taGFsby1ibHVyJ10sXG4gICAgICAgIGxheWVyLnBhaW50WydpY29uLW9wYWNpdHknXSxcbiAgICAgICAgbGF5ZXIucGFpbnRbJ2ljb24tY29sb3InXVxuICAgICk7XG5cbiAgICBkcmF3TGF5ZXJTeW1ib2xzKHBhaW50ZXIsIHNvdXJjZUNhY2hlLCBsYXllciwgY29vcmRzLCB0cnVlLFxuICAgICAgICBsYXllci5wYWludFsndGV4dC10cmFuc2xhdGUnXSxcbiAgICAgICAgbGF5ZXIucGFpbnRbJ3RleHQtdHJhbnNsYXRlLWFuY2hvciddLFxuICAgICAgICBsYXllci5sYXlvdXRbJ3RleHQtcm90YXRpb24tYWxpZ25tZW50J10sXG4gICAgICAgIGxheWVyLmxheW91dFsndGV4dC1waXRjaC1hbGlnbm1lbnQnXSxcbiAgICAgICAgbGF5ZXIubGF5b3V0Wyd0ZXh0LXNpemUnXSxcbiAgICAgICAgbGF5ZXIucGFpbnRbJ3RleHQtaGFsby13aWR0aCddLFxuICAgICAgICBsYXllci5wYWludFsndGV4dC1oYWxvLWNvbG9yJ10sXG4gICAgICAgIGxheWVyLnBhaW50Wyd0ZXh0LWhhbG8tYmx1ciddLFxuICAgICAgICBsYXllci5wYWludFsndGV4dC1vcGFjaXR5J10sXG4gICAgICAgIGxheWVyLnBhaW50Wyd0ZXh0LWNvbG9yJ11cbiAgICApO1xuXG4gICAgaWYgKHNvdXJjZUNhY2hlLm1hcC5zaG93Q29sbGlzaW9uQm94ZXMpIHtcbiAgICAgICAgZHJhd0NvbGxpc2lvbkRlYnVnKHBhaW50ZXIsIHNvdXJjZUNhY2hlLCBsYXllciwgY29vcmRzKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYXdMYXllclN5bWJvbHMocGFpbnRlciwgc291cmNlQ2FjaGUsIGxheWVyLCBjb29yZHMsIGlzVGV4dCwgdHJhbnNsYXRlLCB0cmFuc2xhdGVBbmNob3IsXG4gICAgICAgIHJvdGF0aW9uQWxpZ25tZW50LCBwaXRjaEFsaWdubWVudCwgc2l6ZSwgaGFsb1dpZHRoLCBoYWxvQ29sb3IsIGhhbG9CbHVyLCBvcGFjaXR5LCBjb2xvcikge1xuXG4gICAgaWYgKCFpc1RleHQgJiYgcGFpbnRlci5zdHlsZS5zcHJpdGUgJiYgIXBhaW50ZXIuc3R5bGUuc3ByaXRlLmxvYWRlZCgpKVxuICAgICAgICByZXR1cm47XG5cbiAgICBjb25zdCBnbCA9IHBhaW50ZXIuZ2w7XG5cbiAgICBjb25zdCByb3RhdGVXaXRoTWFwID0gcm90YXRpb25BbGlnbm1lbnQgPT09ICdtYXAnO1xuICAgIGNvbnN0IHBpdGNoV2l0aE1hcCA9IHBpdGNoQWxpZ25tZW50ID09PSAnbWFwJztcblxuICAgIGNvbnN0IGRlcHRoT24gPSBwaXRjaFdpdGhNYXA7XG5cbiAgICBpZiAoZGVwdGhPbikge1xuICAgICAgICBnbC5lbmFibGUoZ2wuREVQVEhfVEVTVCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZ2wuZGlzYWJsZShnbC5ERVBUSF9URVNUKTtcbiAgICB9XG5cbiAgICBsZXQgcHJvZ3JhbSwgcHJldkZvbnRzdGFjaztcblxuICAgIGZvciAoY29uc3QgY29vcmQgb2YgY29vcmRzKSB7XG4gICAgICAgIGNvbnN0IHRpbGUgPSBzb3VyY2VDYWNoZS5nZXRUaWxlKGNvb3JkKTtcbiAgICAgICAgY29uc3QgYnVja2V0ID0gdGlsZS5nZXRCdWNrZXQobGF5ZXIpO1xuICAgICAgICBpZiAoIWJ1Y2tldCkgY29udGludWU7XG4gICAgICAgIGNvbnN0IGJ1ZmZlcnMgPSBpc1RleHQgPyBidWNrZXQuYnVmZmVycy5nbHlwaCA6IGJ1Y2tldC5idWZmZXJzLmljb247XG4gICAgICAgIGlmICghYnVmZmVycyB8fCAhYnVmZmVycy5zZWdtZW50cy5sZW5ndGgpIGNvbnRpbnVlO1xuXG4gICAgICAgIGNvbnN0IGlzU0RGID0gaXNUZXh0IHx8IGJ1Y2tldC5zZGZJY29ucztcblxuICAgICAgICBpZiAoIXByb2dyYW0gfHwgYnVja2V0LmZvbnRzdGFjayAhPT0gcHJldkZvbnRzdGFjaykge1xuICAgICAgICAgICAgcHJvZ3JhbSA9IHBhaW50ZXIudXNlUHJvZ3JhbShpc1NERiA/ICdzeW1ib2xTREYnIDogJ3N5bWJvbEljb24nKTtcblxuICAgICAgICAgICAgc2V0U3ltYm9sRHJhd1N0YXRlKHByb2dyYW0sIHBhaW50ZXIsIGlzVGV4dCwgaXNTREYsIHJvdGF0ZVdpdGhNYXAsIHBpdGNoV2l0aE1hcCwgYnVja2V0LmZvbnRzdGFjaywgc2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgYnVja2V0Lmljb25zTmVlZExpbmVhciwgaXNUZXh0ID8gYnVja2V0LmFkanVzdGVkVGV4dFNpemUgOiBidWNrZXQuYWRqdXN0ZWRJY29uU2l6ZSwgb3BhY2l0eSk7XG4gICAgICAgIH1cblxuICAgICAgICBwYWludGVyLmVuYWJsZVRpbGVDbGlwcGluZ01hc2soY29vcmQpO1xuXG4gICAgICAgIGdsLnVuaWZvcm1NYXRyaXg0ZnYocHJvZ3JhbS51X21hdHJpeCwgZmFsc2UsXG4gICAgICAgICAgICAgICAgcGFpbnRlci50cmFuc2xhdGVQb3NNYXRyaXgoY29vcmQucG9zTWF0cml4LCB0aWxlLCB0cmFuc2xhdGUsIHRyYW5zbGF0ZUFuY2hvcikpO1xuXG4gICAgICAgIGRyYXdUaWxlU3ltYm9scyhwcm9ncmFtLCBwYWludGVyLCBsYXllciwgdGlsZSwgYnVmZmVycywgaXNUZXh0LCBpc1NERixcbiAgICAgICAgICAgICAgICBwaXRjaFdpdGhNYXAsIHNpemUsIGhhbG9XaWR0aCwgaGFsb0NvbG9yLCBoYWxvQmx1ciwgY29sb3IpO1xuXG4gICAgICAgIHByZXZGb250c3RhY2sgPSBidWNrZXQuZm9udHN0YWNrO1xuICAgIH1cblxuICAgIGlmICghZGVwdGhPbikgZ2wuZW5hYmxlKGdsLkRFUFRIX1RFU1QpO1xufVxuXG5mdW5jdGlvbiBzZXRTeW1ib2xEcmF3U3RhdGUocHJvZ3JhbSwgcGFpbnRlciwgaXNUZXh0LCBpc1NERiwgcm90YXRlV2l0aE1hcCwgcGl0Y2hXaXRoTWFwLCBmb250c3RhY2ssIHNpemUsXG4gICAgICAgIGljb25zTmVlZExpbmVhciwgYWRqdXN0ZWRTaXplLCBvcGFjaXR5KSB7XG5cbiAgICBjb25zdCBnbCA9IHBhaW50ZXIuZ2w7XG4gICAgY29uc3QgdHIgPSBwYWludGVyLnRyYW5zZm9ybTtcblxuICAgIGdsLnVuaWZvcm0xaShwcm9ncmFtLnVfcm90YXRlX3dpdGhfbWFwLCByb3RhdGVXaXRoTWFwKTtcbiAgICBnbC51bmlmb3JtMWkocHJvZ3JhbS51X3BpdGNoX3dpdGhfbWFwLCBwaXRjaFdpdGhNYXApO1xuXG4gICAgZ2wuYWN0aXZlVGV4dHVyZShnbC5URVhUVVJFMCk7XG4gICAgZ2wudW5pZm9ybTFpKHByb2dyYW0udV90ZXh0dXJlLCAwKTtcblxuICAgIGlmIChpc1RleHQpIHtcbiAgICAgICAgLy8gdXNlIHRoZSBmb25zdGFjayB1c2VkIHdoZW4gcGFyc2luZyB0aGUgdGlsZSwgbm90IHRoZSBmb250c3RhY2tcbiAgICAgICAgLy8gYXQgdGhlIGN1cnJlbnQgem9vbSBsZXZlbCAobGF5b3V0Wyd0ZXh0LWZvbnQnXSkuXG4gICAgICAgIGNvbnN0IGdseXBoQXRsYXMgPSBmb250c3RhY2sgJiYgcGFpbnRlci5nbHlwaFNvdXJjZS5nZXRHbHlwaEF0bGFzKGZvbnRzdGFjayk7XG4gICAgICAgIGlmICghZ2x5cGhBdGxhcykgcmV0dXJuO1xuXG4gICAgICAgIGdseXBoQXRsYXMudXBkYXRlVGV4dHVyZShnbCk7XG4gICAgICAgIGdsLnVuaWZvcm0yZihwcm9ncmFtLnVfdGV4c2l6ZSwgZ2x5cGhBdGxhcy53aWR0aCAvIDQsIGdseXBoQXRsYXMuaGVpZ2h0IC8gNCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgbWFwTW92aW5nID0gcGFpbnRlci5vcHRpb25zLnJvdGF0aW5nIHx8IHBhaW50ZXIub3B0aW9ucy56b29taW5nO1xuICAgICAgICBjb25zdCBpY29uU2NhbGVkID0gc2l6ZSAhPT0gMSB8fCBicm93c2VyLmRldmljZVBpeGVsUmF0aW8gIT09IHBhaW50ZXIuc3ByaXRlQXRsYXMucGl4ZWxSYXRpbyB8fCBpY29uc05lZWRMaW5lYXI7XG4gICAgICAgIGNvbnN0IGljb25UcmFuc2Zvcm1lZCA9IHBpdGNoV2l0aE1hcCB8fCB0ci5waXRjaDtcbiAgICAgICAgcGFpbnRlci5zcHJpdGVBdGxhcy5iaW5kKGdsLCBpc1NERiB8fCBtYXBNb3ZpbmcgfHwgaWNvblNjYWxlZCB8fCBpY29uVHJhbnNmb3JtZWQpO1xuICAgICAgICBnbC51bmlmb3JtMmYocHJvZ3JhbS51X3RleHNpemUsIHBhaW50ZXIuc3ByaXRlQXRsYXMud2lkdGggLyA0LCBwYWludGVyLnNwcml0ZUF0bGFzLmhlaWdodCAvIDQpO1xuICAgIH1cblxuICAgIGdsLmFjdGl2ZVRleHR1cmUoZ2wuVEVYVFVSRTEpO1xuICAgIHBhaW50ZXIuZnJhbWVIaXN0b3J5LmJpbmQoZ2wpO1xuICAgIGdsLnVuaWZvcm0xaShwcm9ncmFtLnVfZmFkZXRleHR1cmUsIDEpO1xuXG4gICAgLy8gYWRqdXN0IG1pbi9tYXggem9vbXMgZm9yIHZhcmlhYmxlIGZvbnQgc2l6ZXNcbiAgICBjb25zdCB6b29tQWRqdXN0ID0gTWF0aC5sb2coc2l6ZSAvIGFkanVzdGVkU2l6ZSkgLyBNYXRoLkxOMiB8fCAwO1xuICAgIGdsLnVuaWZvcm0xZihwcm9ncmFtLnVfem9vbSwgKHRyLnpvb20gLSB6b29tQWRqdXN0KSAqIDEwKTsgLy8gY3VycmVudCB6b29tIGxldmVsXG5cbiAgICBnbC51bmlmb3JtMWYocHJvZ3JhbS51X3BpdGNoLCB0ci5waXRjaCAvIDM2MCAqIDIgKiBNYXRoLlBJKTtcbiAgICBnbC51bmlmb3JtMWYocHJvZ3JhbS51X2JlYXJpbmcsIHRyLmJlYXJpbmcgLyAzNjAgKiAyICogTWF0aC5QSSk7XG4gICAgZ2wudW5pZm9ybTFmKHByb2dyYW0udV9hc3BlY3RfcmF0aW8sIHRyLndpZHRoIC8gdHIuaGVpZ2h0KTtcblxuICAgIGdsLnVuaWZvcm0xZihwcm9ncmFtLnVfb3BhY2l0eSwgb3BhY2l0eSk7XG59XG5cbmZ1bmN0aW9uIGRyYXdUaWxlU3ltYm9scyhwcm9ncmFtLCBwYWludGVyLCBsYXllciwgdGlsZSwgYnVmZmVycywgaXNUZXh0LCBpc1NERixcbiAgICAgICAgcGl0Y2hXaXRoTWFwLCBzaXplLCBoYWxvV2lkdGgsIGhhbG9Db2xvciwgaGFsb0JsdXIsIGNvbG9yKSB7XG5cbiAgICBjb25zdCBnbCA9IHBhaW50ZXIuZ2w7XG4gICAgY29uc3QgdHIgPSBwYWludGVyLnRyYW5zZm9ybTtcblxuICAgIGNvbnN0IGZvbnRTY2FsZSA9IHNpemUgLyAoaXNUZXh0ID8gMjQgOiAxKTtcblxuICAgIGlmIChwaXRjaFdpdGhNYXApIHtcbiAgICAgICAgY29uc3QgcyA9IHBpeGVsc1RvVGlsZVVuaXRzKHRpbGUsIGZvbnRTY2FsZSwgdHIuem9vbSk7XG4gICAgICAgIGdsLnVuaWZvcm0yZihwcm9ncmFtLnVfZXh0cnVkZV9zY2FsZSwgcywgcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcyA9IHRyLmNhbWVyYVRvQ2VudGVyRGlzdGFuY2UgKiBmb250U2NhbGU7XG4gICAgICAgIGdsLnVuaWZvcm0yZihwcm9ncmFtLnVfZXh0cnVkZV9zY2FsZSwgdHIucGl4ZWxzVG9HTFVuaXRzWzBdICogcywgdHIucGl4ZWxzVG9HTFVuaXRzWzFdICogcyk7XG4gICAgfVxuXG4gICAgaWYgKGlzU0RGKSB7XG4gICAgICAgIGNvbnN0IGdhbW1hU2NhbGUgPSBmb250U2NhbGUgKiAocGl0Y2hXaXRoTWFwID8gTWF0aC5jb3ModHIuX3BpdGNoKSA6IDEpICogdHIuY2FtZXJhVG9DZW50ZXJEaXN0YW5jZTtcblxuICAgICAgICBpZiAoaGFsb1dpZHRoKSB7IC8vIERyYXcgaGFsbyB1bmRlcm5lYXRoIHRoZSB0ZXh0LlxuICAgICAgICAgICAgZ2wudW5pZm9ybTFmKHByb2dyYW0udV9nYW1tYSwgKGhhbG9CbHVyICogYmx1ck9mZnNldCAvIHNkZlB4ICsgZ2FtbWEpIC8gZ2FtbWFTY2FsZSk7XG4gICAgICAgICAgICBnbC51bmlmb3JtNGZ2KHByb2dyYW0udV9jb2xvciwgaGFsb0NvbG9yKTtcbiAgICAgICAgICAgIGdsLnVuaWZvcm0xZihwcm9ncmFtLnVfYnVmZmVyLCAoaGFsb09mZnNldCAtIGhhbG9XaWR0aCAvIGZvbnRTY2FsZSkgLyBzZGZQeCk7XG5cbiAgICAgICAgICAgIGRyYXdTeW1ib2xFbGVtZW50cyhidWZmZXJzLCBsYXllciwgZ2wsIHByb2dyYW0pO1xuICAgICAgICB9XG5cbiAgICAgICAgZ2wudW5pZm9ybTFmKHByb2dyYW0udV9nYW1tYSwgZ2FtbWEgLyBnYW1tYVNjYWxlKTtcbiAgICAgICAgZ2wudW5pZm9ybTRmdihwcm9ncmFtLnVfY29sb3IsIGNvbG9yKTtcbiAgICAgICAgZ2wudW5pZm9ybTFmKHByb2dyYW0udV9idWZmZXIsICgyNTYgLSA2NCkgLyAyNTYpO1xuICAgIH1cblxuICAgIGRyYXdTeW1ib2xFbGVtZW50cyhidWZmZXJzLCBsYXllciwgZ2wsIHByb2dyYW0pO1xufVxuXG5mdW5jdGlvbiBkcmF3U3ltYm9sRWxlbWVudHMoYnVmZmVycywgbGF5ZXIsIGdsLCBwcm9ncmFtKSB7XG4gICAgZm9yIChjb25zdCBzZWdtZW50IG9mIGJ1ZmZlcnMuc2VnbWVudHMpIHtcbiAgICAgICAgc2VnbWVudC52YW9zW2xheWVyLmlkXS5iaW5kKGdsLCBwcm9ncmFtLCBidWZmZXJzLmxheW91dFZlcnRleEJ1ZmZlciwgYnVmZmVycy5lbGVtZW50QnVmZmVyLCBudWxsLCBzZWdtZW50LnZlcnRleE9mZnNldCk7XG4gICAgICAgIGdsLmRyYXdFbGVtZW50cyhnbC5UUklBTkdMRVMsIHNlZ21lbnQucHJpbWl0aXZlTGVuZ3RoICogMywgZ2wuVU5TSUdORURfU0hPUlQsIHNlZ21lbnQucHJpbWl0aXZlT2Zmc2V0ICogMyAqIDIpO1xuICAgIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuY2xhc3MgRnJhbWVIaXN0b3J5IHtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmNoYW5nZVRpbWVzID0gbmV3IEZsb2F0NjRBcnJheSgyNTYpO1xuICAgICAgICB0aGlzLmNoYW5nZU9wYWNpdGllcyA9IG5ldyBVaW50OEFycmF5KDI1Nik7XG4gICAgICAgIHRoaXMub3BhY2l0aWVzID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KDI1Nik7XG4gICAgICAgIHRoaXMuYXJyYXkgPSBuZXcgVWludDhBcnJheSh0aGlzLm9wYWNpdGllcy5idWZmZXIpO1xuXG4gICAgICAgIHRoaXMucHJldmlvdXNab29tID0gMDtcbiAgICAgICAgdGhpcy5maXJzdEZyYW1lID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZWNvcmQobm93LCB6b29tLCBkdXJhdGlvbikge1xuICAgICAgICBpZiAodGhpcy5maXJzdEZyYW1lKSB7XG4gICAgICAgICAgICBub3cgPSAwO1xuICAgICAgICAgICAgdGhpcy5maXJzdEZyYW1lID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB6b29tID0gTWF0aC5mbG9vcih6b29tICogMTApO1xuXG4gICAgICAgIGxldCB6O1xuICAgICAgICBpZiAoem9vbSA8IHRoaXMucHJldmlvdXNab29tKSB7XG4gICAgICAgICAgICBmb3IgKHogPSB6b29tICsgMTsgeiA8PSB0aGlzLnByZXZpb3VzWm9vbTsgeisrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VUaW1lc1t6XSA9IG5vdztcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZU9wYWNpdGllc1t6XSA9IHRoaXMub3BhY2l0aWVzW3pdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yICh6ID0gem9vbTsgeiA+IHRoaXMucHJldmlvdXNab29tOyB6LS0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZVRpbWVzW3pdID0gbm93O1xuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlT3BhY2l0aWVzW3pdID0gdGhpcy5vcGFjaXRpZXNbel07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHogPSAwOyB6IDwgMjU2OyB6KyspIHtcbiAgICAgICAgICAgIGNvbnN0IHRpbWVTaW5jZSA9IG5vdyAtIHRoaXMuY2hhbmdlVGltZXNbel07XG4gICAgICAgICAgICBjb25zdCBvcGFjaXR5Q2hhbmdlID0gKGR1cmF0aW9uID8gdGltZVNpbmNlIC8gZHVyYXRpb24gOiAxKSAqIDI1NTtcbiAgICAgICAgICAgIGlmICh6IDw9IHpvb20pIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wYWNpdGllc1t6XSA9IHRoaXMuY2hhbmdlT3BhY2l0aWVzW3pdICsgb3BhY2l0eUNoYW5nZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcGFjaXRpZXNbel0gPSB0aGlzLmNoYW5nZU9wYWNpdGllc1t6XSAtIG9wYWNpdHlDaGFuZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNoYW5nZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnByZXZpb3VzWm9vbSA9IHpvb207XG4gICAgfVxuXG4gICAgYmluZChnbCkge1xuICAgICAgICBpZiAoIXRoaXMudGV4dHVyZSkge1xuICAgICAgICAgICAgdGhpcy50ZXh0dXJlID0gZ2wuY3JlYXRlVGV4dHVyZSgpO1xuICAgICAgICAgICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgdGhpcy50ZXh0dXJlKTtcbiAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1MsIGdsLkNMQU1QX1RPX0VER0UpO1xuICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfVCwgZ2wuQ0xBTVBfVE9fRURHRSk7XG4gICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgZ2wuTkVBUkVTVCk7XG4gICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgZ2wuTkVBUkVTVCk7XG4gICAgICAgICAgICBnbC50ZXhJbWFnZTJEKGdsLlRFWFRVUkVfMkQsIDAsIGdsLkFMUEhBLCAyNTYsIDEsIDAsIGdsLkFMUEhBLCBnbC5VTlNJR05FRF9CWVRFLCB0aGlzLmFycmF5KTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgdGhpcy50ZXh0dXJlKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmNoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICBnbC50ZXhTdWJJbWFnZTJEKGdsLlRFWFRVUkVfMkQsIDAsIDAsIDAsIDI1NiwgMSwgZ2wuQUxQSEEsIGdsLlVOU0lHTkVEX0JZVEUsIHRoaXMuYXJyYXkpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IEZyYW1lSGlzdG9yeTtcbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgdXRpbCA9IHJlcXVpcmUoJy4uL3V0aWwvdXRpbCcpO1xuXG4vKipcbiAqIEEgTGluZUF0bGFzIGxldHMgdXMgcmV1c2UgcmVuZGVyZWQgZGFzaGVkIGxpbmVzXG4gKiBieSB3cml0aW5nIG1hbnkgb2YgdGhlbSB0byBhIHRleHR1cmUgYW5kIHRoZW4gZmV0Y2hpbmcgdGhlaXIgcG9zaXRpb25zXG4gKiB1c2luZyAuZ2V0RGFzaC5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gd2lkdGhcbiAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHRcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIExpbmVBdGxhcyB7XG4gICAgY29uc3RydWN0b3Iod2lkdGgsIGhlaWdodCkge1xuICAgICAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICB0aGlzLm5leHRSb3cgPSAwO1xuXG4gICAgICAgIHRoaXMuYnl0ZXMgPSA0O1xuICAgICAgICB0aGlzLmRhdGEgPSBuZXcgVWludDhBcnJheSh0aGlzLndpZHRoICogdGhpcy5oZWlnaHQgKiB0aGlzLmJ5dGVzKTtcblxuICAgICAgICB0aGlzLnBvc2l0aW9ucyA9IHt9O1xuICAgIH1cblxuICAgIHNldFNwcml0ZShzcHJpdGUpIHtcbiAgICAgICAgdGhpcy5zcHJpdGUgPSBzcHJpdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IG9yIGNyZWF0ZSBhIGRhc2ggbGluZSBwYXR0ZXJuLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBkYXNoYXJyYXlcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHJvdW5kIHdoZXRoZXIgdG8gYWRkIGNpcmNsZSBjYXBzIGluIGJldHdlZW4gZGFzaCBzZWdtZW50c1xuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IHBvc2l0aW9uIG9mIGRhc2ggdGV4dHVyZSBpbiB7IHksIGhlaWdodCwgd2lkdGggfVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZ2V0RGFzaChkYXNoYXJyYXksIHJvdW5kKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGRhc2hhcnJheS5qb2luKFwiLFwiKSArIHJvdW5kO1xuXG4gICAgICAgIGlmICghdGhpcy5wb3NpdGlvbnNba2V5XSkge1xuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbnNba2V5XSA9IHRoaXMuYWRkRGFzaChkYXNoYXJyYXksIHJvdW5kKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5wb3NpdGlvbnNba2V5XTtcbiAgICB9XG5cbiAgICBhZGREYXNoKGRhc2hhcnJheSwgcm91bmQpIHtcblxuICAgICAgICBjb25zdCBuID0gcm91bmQgPyA3IDogMDtcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gMiAqIG4gKyAxO1xuICAgICAgICBjb25zdCBvZmZzZXQgPSAxMjg7XG5cbiAgICAgICAgaWYgKHRoaXMubmV4dFJvdyArIGhlaWdodCA+IHRoaXMuaGVpZ2h0KSB7XG4gICAgICAgICAgICB1dGlsLndhcm5PbmNlKCdMaW5lQXRsYXMgb3V0IG9mIHNwYWNlJyk7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsZW5ndGggPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhc2hhcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGVuZ3RoICs9IGRhc2hhcnJheVtpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0cmV0Y2ggPSB0aGlzLndpZHRoIC8gbGVuZ3RoO1xuICAgICAgICBjb25zdCBoYWxmV2lkdGggPSBzdHJldGNoIC8gMjtcblxuICAgICAgICAvLyBJZiBkYXNoYXJyYXkgaGFzIGFuIG9kZCBsZW5ndGgsIGJvdGggdGhlIGZpcnN0IGFuZCBsYXN0IHBhcnRzXG4gICAgICAgIC8vIGFyZSBkYXNoZXMgYW5kIHNob3VsZCBiZSBqb2luZWQgc2VhbWxlc3NseS5cbiAgICAgICAgY29uc3Qgb2RkTGVuZ3RoID0gZGFzaGFycmF5Lmxlbmd0aCAlIDIgPT09IDE7XG5cbiAgICAgICAgZm9yIChsZXQgeSA9IC1uOyB5IDw9IG47IHkrKykge1xuICAgICAgICAgICAgY29uc3Qgcm93ID0gdGhpcy5uZXh0Um93ICsgbiArIHk7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMud2lkdGggKiByb3c7XG5cbiAgICAgICAgICAgIGxldCBsZWZ0ID0gb2RkTGVuZ3RoID8gLWRhc2hhcnJheVtkYXNoYXJyYXkubGVuZ3RoIC0gMV0gOiAwO1xuICAgICAgICAgICAgbGV0IHJpZ2h0ID0gZGFzaGFycmF5WzBdO1xuICAgICAgICAgICAgbGV0IHBhcnRJbmRleCA9IDE7XG5cbiAgICAgICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgdGhpcy53aWR0aDsgeCsrKSB7XG5cbiAgICAgICAgICAgICAgICB3aGlsZSAocmlnaHQgPCB4IC8gc3RyZXRjaCkge1xuICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gcmlnaHQ7XG4gICAgICAgICAgICAgICAgICAgIHJpZ2h0ID0gcmlnaHQgKyBkYXNoYXJyYXlbcGFydEluZGV4XTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAob2RkTGVuZ3RoICYmIHBhcnRJbmRleCA9PT0gZGFzaGFycmF5Lmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0ICs9IGRhc2hhcnJheVswXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHBhcnRJbmRleCsrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGRpc3RMZWZ0ID0gTWF0aC5hYnMoeCAtIGxlZnQgKiBzdHJldGNoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkaXN0UmlnaHQgPSBNYXRoLmFicyh4IC0gcmlnaHQgKiBzdHJldGNoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkaXN0ID0gTWF0aC5taW4oZGlzdExlZnQsIGRpc3RSaWdodCk7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5zaWRlID0gKHBhcnRJbmRleCAlIDIpID09PSAxO1xuICAgICAgICAgICAgICAgIGxldCBzaWduZWREaXN0YW5jZTtcblxuICAgICAgICAgICAgICAgIGlmIChyb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBBZGQgY2lyY2xlIGNhcHNcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGlzdE1pZGRsZSA9IG4gPyB5IC8gbiAqIChoYWxmV2lkdGggKyAxKSA6IDA7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnNpZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRpc3RFZGdlID0gaGFsZldpZHRoIC0gTWF0aC5hYnMoZGlzdE1pZGRsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaWduZWREaXN0YW5jZSA9IE1hdGguc3FydChkaXN0ICogZGlzdCArIGRpc3RFZGdlICogZGlzdEVkZ2UpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmVkRGlzdGFuY2UgPSBoYWxmV2lkdGggLSBNYXRoLnNxcnQoZGlzdCAqIGRpc3QgKyBkaXN0TWlkZGxlICogZGlzdE1pZGRsZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzaWduZWREaXN0YW5jZSA9IChpbnNpZGUgPyAxIDogLTEpICogZGlzdDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFbMyArIChpbmRleCArIHgpICogNF0gPSBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTUsIHNpZ25lZERpc3RhbmNlICsgb2Zmc2V0KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwb3MgPSB7XG4gICAgICAgICAgICB5OiAodGhpcy5uZXh0Um93ICsgbiArIDAuNSkgLyB0aGlzLmhlaWdodCxcbiAgICAgICAgICAgIGhlaWdodDogMiAqIG4gLyB0aGlzLmhlaWdodCxcbiAgICAgICAgICAgIHdpZHRoOiBsZW5ndGhcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLm5leHRSb3cgKz0gaGVpZ2h0O1xuICAgICAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcblxuICAgICAgICByZXR1cm4gcG9zO1xuICAgIH1cblxuICAgIGJpbmQoZ2wpIHtcbiAgICAgICAgaWYgKCF0aGlzLnRleHR1cmUpIHtcbiAgICAgICAgICAgIHRoaXMudGV4dHVyZSA9IGdsLmNyZWF0ZVRleHR1cmUoKTtcbiAgICAgICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRoaXMudGV4dHVyZSk7XG4gICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9TLCBnbC5SRVBFQVQpO1xuICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfVCwgZ2wuUkVQRUFUKTtcbiAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCBnbC5MSU5FQVIpO1xuICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01BR19GSUxURVIsIGdsLkxJTkVBUik7XG4gICAgICAgICAgICBnbC50ZXhJbWFnZTJEKGdsLlRFWFRVUkVfMkQsIDAsIGdsLlJHQkEsIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0LCAwLCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLCB0aGlzLmRhdGEpO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCB0aGlzLnRleHR1cmUpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5kaXJ0eSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBnbC50ZXhTdWJJbWFnZTJEKGdsLlRFWFRVUkVfMkQsIDAsIDAsIDAsIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0LCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLCB0aGlzLmRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IExpbmVBdGxhcztcbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgYnJvd3NlciA9IHJlcXVpcmUoJy4uL3V0aWwvYnJvd3NlcicpO1xuY29uc3QgbWF0NCA9IHJlcXVpcmUoJ0BtYXBib3gvZ2wtbWF0cml4JykubWF0NDtcbmNvbnN0IEZyYW1lSGlzdG9yeSA9IHJlcXVpcmUoJy4vZnJhbWVfaGlzdG9yeScpO1xuY29uc3QgU291cmNlQ2FjaGUgPSByZXF1aXJlKCcuLi9zb3VyY2Uvc291cmNlX2NhY2hlJyk7XG5jb25zdCBFWFRFTlQgPSByZXF1aXJlKCcuLi9kYXRhL2V4dGVudCcpO1xuY29uc3QgcGl4ZWxzVG9UaWxlVW5pdHMgPSByZXF1aXJlKCcuLi9zb3VyY2UvcGl4ZWxzX3RvX3RpbGVfdW5pdHMnKTtcbmNvbnN0IHV0aWwgPSByZXF1aXJlKCcuLi91dGlsL3V0aWwnKTtcbmNvbnN0IEJ1ZmZlciA9IHJlcXVpcmUoJy4uL2RhdGEvYnVmZmVyJyk7XG5jb25zdCBWZXJ0ZXhBcnJheU9iamVjdCA9IHJlcXVpcmUoJy4vdmVydGV4X2FycmF5X29iamVjdCcpO1xuY29uc3QgUmFzdGVyQm91bmRzQXJyYXkgPSByZXF1aXJlKCcuLi9kYXRhL3Jhc3Rlcl9ib3VuZHNfYXJyYXknKTtcbmNvbnN0IFBvc0FycmF5ID0gcmVxdWlyZSgnLi4vZGF0YS9wb3NfYXJyYXknKTtcbmNvbnN0IFByb2dyYW1Db25maWd1cmF0aW9uID0gcmVxdWlyZSgnLi4vZGF0YS9wcm9ncmFtX2NvbmZpZ3VyYXRpb24nKTtcbmNvbnN0IHNoYWRlcnMgPSByZXF1aXJlKCcuL3NoYWRlcnMnKTtcbmNvbnN0IGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpO1xuXG5jb25zdCBkcmF3ID0ge1xuICAgIHN5bWJvbDogcmVxdWlyZSgnLi9kcmF3X3N5bWJvbCcpLFxuICAgIGNpcmNsZTogcmVxdWlyZSgnLi9kcmF3X2NpcmNsZScpLFxuICAgIGxpbmU6IHJlcXVpcmUoJy4vZHJhd19saW5lJyksXG4gICAgZmlsbDogcmVxdWlyZSgnLi9kcmF3X2ZpbGwnKSxcbiAgICAnZmlsbC1leHRydXNpb24nOiByZXF1aXJlKCcuL2RyYXdfZmlsbF9leHRydXNpb24nKSxcbiAgICByYXN0ZXI6IHJlcXVpcmUoJy4vZHJhd19yYXN0ZXInKSxcbiAgICBiYWNrZ3JvdW5kOiByZXF1aXJlKCcuL2RyYXdfYmFja2dyb3VuZCcpLFxuICAgIGRlYnVnOiByZXF1aXJlKCcuL2RyYXdfZGVidWcnKVxufTtcblxuLyoqXG4gKiBJbml0aWFsaXplIGEgbmV3IHBhaW50ZXIgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB7Q2FudmFzfSBnbCBhbiBleHBlcmltZW50YWwtd2ViZ2wgZHJhd2luZyBjb250ZXh0XG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBQYWludGVyIHtcbiAgICBjb25zdHJ1Y3RvcihnbCwgdHJhbnNmb3JtKSB7XG4gICAgICAgIHRoaXMuZ2wgPSBnbDtcbiAgICAgICAgdGhpcy50cmFuc2Zvcm0gPSB0cmFuc2Zvcm07XG5cbiAgICAgICAgdGhpcy5yZXVzYWJsZVRleHR1cmVzID0ge1xuICAgICAgICAgICAgdGlsZXM6IHt9LFxuICAgICAgICAgICAgdmlld3BvcnQ6IG51bGxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5wcmVGYm9zID0ge307XG5cbiAgICAgICAgdGhpcy5mcmFtZUhpc3RvcnkgPSBuZXcgRnJhbWVIaXN0b3J5KCk7XG5cbiAgICAgICAgdGhpcy5zZXR1cCgpO1xuXG4gICAgICAgIC8vIFdpdGhpbiBlYWNoIGxheWVyIHRoZXJlIGFyZSBtdWx0aXBsZSBkaXN0aW5jdCB6LXBsYW5lcyB0aGF0IGNhbiBiZSBkcmF3biB0by5cbiAgICAgICAgLy8gVGhpcyBpcyBpbXBsZW1lbnRlZCB1c2luZyB0aGUgV2ViR0wgZGVwdGggYnVmZmVyLlxuICAgICAgICB0aGlzLm51bVN1YmxheWVycyA9IFNvdXJjZUNhY2hlLm1heFVuZGVyem9vbWluZyArIFNvdXJjZUNhY2hlLm1heE92ZXJ6b29taW5nICsgMTtcbiAgICAgICAgdGhpcy5kZXB0aEVwc2lsb24gPSAxIC8gTWF0aC5wb3coMiwgMTYpO1xuXG4gICAgICAgIHRoaXMubGluZVdpZHRoUmFuZ2UgPSBnbC5nZXRQYXJhbWV0ZXIoZ2wuQUxJQVNFRF9MSU5FX1dJRFRIX1JBTkdFKTtcblxuICAgICAgICB0aGlzLmJhc2ljRmlsbFByb2dyYW1Db25maWd1cmF0aW9uID0gUHJvZ3JhbUNvbmZpZ3VyYXRpb24uY3JlYXRlU3RhdGljKFsnY29sb3InLCAnb3BhY2l0eSddKTtcbiAgICAgICAgdGhpcy5lbXB0eVByb2dyYW1Db25maWd1cmF0aW9uID0gbmV3IFByb2dyYW1Db25maWd1cmF0aW9uKCk7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBVcGRhdGUgdGhlIEdMIHZpZXdwb3J0LCBwcm9qZWN0aW9uIG1hdHJpeCwgYW5kIHRyYW5zZm9ybXMgdG8gY29tcGVuc2F0ZVxuICAgICAqIGZvciBhIG5ldyB3aWR0aCBhbmQgaGVpZ2h0IHZhbHVlLlxuICAgICAqL1xuICAgIHJlc2l6ZSh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5nbDtcblxuICAgICAgICB0aGlzLndpZHRoID0gd2lkdGggKiBicm93c2VyLmRldmljZVBpeGVsUmF0aW87XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0ICogYnJvd3Nlci5kZXZpY2VQaXhlbFJhdGlvO1xuICAgICAgICBnbC52aWV3cG9ydCgwLCAwLCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodCk7XG4gICAgfVxuXG4gICAgc2V0dXAoKSB7XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5nbDtcblxuICAgICAgICBnbC52ZXJib3NlID0gdHJ1ZTtcblxuICAgICAgICAvLyBXZSBhcmUgYmxlbmRpbmcgdGhlIG5ldyBwaXhlbHMgKmJlaGluZCogdGhlIGV4aXN0aW5nIHBpeGVscy4gVGhhdCB3YXkgd2UgY2FuXG4gICAgICAgIC8vIGRyYXcgZnJvbnQtdG8tYmFjayBhbmQgdXNlIHRoZW4gc3RlbmNpbCBidWZmZXIgdG8gY3VsbCBvcGFxdWUgcGl4ZWxzIGVhcmx5LlxuICAgICAgICBnbC5lbmFibGUoZ2wuQkxFTkQpO1xuICAgICAgICBnbC5ibGVuZEZ1bmMoZ2wuT05FLCBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBKTtcblxuICAgICAgICBnbC5lbmFibGUoZ2wuU1RFTkNJTF9URVNUKTtcblxuICAgICAgICBnbC5lbmFibGUoZ2wuREVQVEhfVEVTVCk7XG4gICAgICAgIGdsLmRlcHRoRnVuYyhnbC5MRVFVQUwpO1xuXG4gICAgICAgIHRoaXMuX2RlcHRoTWFzayA9IGZhbHNlO1xuICAgICAgICBnbC5kZXB0aE1hc2soZmFsc2UpO1xuXG4gICAgICAgIGNvbnN0IHRpbGVFeHRlbnRBcnJheSA9IG5ldyBQb3NBcnJheSgpO1xuICAgICAgICB0aWxlRXh0ZW50QXJyYXkuZW1wbGFjZUJhY2soMCwgMCk7XG4gICAgICAgIHRpbGVFeHRlbnRBcnJheS5lbXBsYWNlQmFjayhFWFRFTlQsIDApO1xuICAgICAgICB0aWxlRXh0ZW50QXJyYXkuZW1wbGFjZUJhY2soMCwgRVhURU5UKTtcbiAgICAgICAgdGlsZUV4dGVudEFycmF5LmVtcGxhY2VCYWNrKEVYVEVOVCwgRVhURU5UKTtcbiAgICAgICAgdGhpcy50aWxlRXh0ZW50QnVmZmVyID0gQnVmZmVyLmZyb21TdHJ1Y3RBcnJheSh0aWxlRXh0ZW50QXJyYXksIEJ1ZmZlci5CdWZmZXJUeXBlLlZFUlRFWCk7XG4gICAgICAgIHRoaXMudGlsZUV4dGVudFZBTyA9IG5ldyBWZXJ0ZXhBcnJheU9iamVjdCgpO1xuICAgICAgICB0aGlzLnRpbGVFeHRlbnRQYXR0ZXJuVkFPID0gbmV3IFZlcnRleEFycmF5T2JqZWN0KCk7XG5cbiAgICAgICAgY29uc3QgZGVidWdBcnJheSA9IG5ldyBQb3NBcnJheSgpO1xuICAgICAgICBkZWJ1Z0FycmF5LmVtcGxhY2VCYWNrKDAsIDApO1xuICAgICAgICBkZWJ1Z0FycmF5LmVtcGxhY2VCYWNrKEVYVEVOVCwgMCk7XG4gICAgICAgIGRlYnVnQXJyYXkuZW1wbGFjZUJhY2soRVhURU5ULCBFWFRFTlQpO1xuICAgICAgICBkZWJ1Z0FycmF5LmVtcGxhY2VCYWNrKDAsIEVYVEVOVCk7XG4gICAgICAgIGRlYnVnQXJyYXkuZW1wbGFjZUJhY2soMCwgMCk7XG4gICAgICAgIHRoaXMuZGVidWdCdWZmZXIgPSBCdWZmZXIuZnJvbVN0cnVjdEFycmF5KGRlYnVnQXJyYXksIEJ1ZmZlci5CdWZmZXJUeXBlLlZFUlRFWCk7XG4gICAgICAgIHRoaXMuZGVidWdWQU8gPSBuZXcgVmVydGV4QXJyYXlPYmplY3QoKTtcblxuICAgICAgICBjb25zdCByYXN0ZXJCb3VuZHNBcnJheSA9IG5ldyBSYXN0ZXJCb3VuZHNBcnJheSgpO1xuICAgICAgICByYXN0ZXJCb3VuZHNBcnJheS5lbXBsYWNlQmFjaygwLCAwLCAwLCAwKTtcbiAgICAgICAgcmFzdGVyQm91bmRzQXJyYXkuZW1wbGFjZUJhY2soRVhURU5ULCAwLCAzMjc2NywgMCk7XG4gICAgICAgIHJhc3RlckJvdW5kc0FycmF5LmVtcGxhY2VCYWNrKDAsIEVYVEVOVCwgMCwgMzI3NjcpO1xuICAgICAgICByYXN0ZXJCb3VuZHNBcnJheS5lbXBsYWNlQmFjayhFWFRFTlQsIEVYVEVOVCwgMzI3NjcsIDMyNzY3KTtcbiAgICAgICAgdGhpcy5yYXN0ZXJCb3VuZHNCdWZmZXIgPSBCdWZmZXIuZnJvbVN0cnVjdEFycmF5KHJhc3RlckJvdW5kc0FycmF5LCBCdWZmZXIuQnVmZmVyVHlwZS5WRVJURVgpO1xuICAgICAgICB0aGlzLnJhc3RlckJvdW5kc1ZBTyA9IG5ldyBWZXJ0ZXhBcnJheU9iamVjdCgpO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogUmVzZXQgdGhlIGNvbG9yIGJ1ZmZlcnMgb2YgdGhlIGRyYXdpbmcgY2FudmFzLlxuICAgICAqL1xuICAgIGNsZWFyQ29sb3IoKSB7XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5nbDtcbiAgICAgICAgZ2wuY2xlYXJDb2xvcigwLCAwLCAwLCAwKTtcbiAgICAgICAgZ2wuY2xlYXIoZ2wuQ09MT1JfQlVGRkVSX0JJVCk7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBSZXNldCB0aGUgZHJhd2luZyBjYW52YXMgYnkgY2xlYXJpbmcgdGhlIHN0ZW5jaWwgYnVmZmVyIHNvIHRoYXQgd2UgY2FuIGRyYXdcbiAgICAgKiBuZXcgdGlsZXMgYXQgdGhlIHNhbWUgbG9jYXRpb24sIHdoaWxlIHJldGFpbmluZyBwcmV2aW91c2x5IGRyYXduIHBpeGVscy5cbiAgICAgKi9cbiAgICBjbGVhclN0ZW5jaWwoKSB7XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5nbDtcbiAgICAgICAgZ2wuY2xlYXJTdGVuY2lsKDB4MCk7XG4gICAgICAgIGdsLnN0ZW5jaWxNYXNrKDB4RkYpO1xuICAgICAgICBnbC5jbGVhcihnbC5TVEVOQ0lMX0JVRkZFUl9CSVQpO1xuICAgIH1cblxuICAgIGNsZWFyRGVwdGgoKSB7XG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5nbDtcbiAgICAgICAgZ2wuY2xlYXJEZXB0aCgxKTtcbiAgICAgICAgdGhpcy5kZXB0aE1hc2sodHJ1ZSk7XG4gICAgICAgIGdsLmNsZWFyKGdsLkRFUFRIX0JVRkZFUl9CSVQpO1xuICAgIH1cblxuICAgIF9yZW5kZXJUaWxlQ2xpcHBpbmdNYXNrcyhjb29yZHMpIHtcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmdsO1xuICAgICAgICBnbC5jb2xvck1hc2soZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpO1xuICAgICAgICB0aGlzLmRlcHRoTWFzayhmYWxzZSk7XG4gICAgICAgIGdsLmRpc2FibGUoZ2wuREVQVEhfVEVTVCk7XG4gICAgICAgIGdsLmVuYWJsZShnbC5TVEVOQ0lMX1RFU1QpO1xuXG4gICAgICAgIC8vIE9ubHkgd3JpdGUgY2xpcHBpbmcgSURzIHRvIHRoZSBsYXN0IDUgYml0cy4gVGhlIGZpcnN0IHRocmVlIGFyZSB1c2VkIGZvciBkcmF3aW5nIGZpbGxzLlxuICAgICAgICBnbC5zdGVuY2lsTWFzaygweEY4KTtcbiAgICAgICAgLy8gVGVzdHMgd2lsbCBhbHdheXMgcGFzcywgYW5kIHJlZiB2YWx1ZSB3aWxsIGJlIHdyaXR0ZW4gdG8gc3RlbmNpbCBidWZmZXIuXG4gICAgICAgIGdsLnN0ZW5jaWxPcChnbC5LRUVQLCBnbC5LRUVQLCBnbC5SRVBMQUNFKTtcblxuICAgICAgICBsZXQgaWROZXh0ID0gMTtcbiAgICAgICAgdGhpcy5fdGlsZUNsaXBwaW5nTWFza0lEcyA9IHt9O1xuXG4gICAgICAgIGZvciAoY29uc3QgY29vcmQgb2YgY29vcmRzKSB7XG4gICAgICAgICAgICBjb25zdCBpZCA9IHRoaXMuX3RpbGVDbGlwcGluZ01hc2tJRHNbY29vcmQuaWRdID0gKGlkTmV4dCsrKSA8PCAzO1xuXG4gICAgICAgICAgICBnbC5zdGVuY2lsRnVuYyhnbC5BTFdBWVMsIGlkLCAweEY4KTtcblxuICAgICAgICAgICAgY29uc3QgcHJvZ3JhbSA9IHRoaXMudXNlUHJvZ3JhbSgnZmlsbCcsIHRoaXMuYmFzaWNGaWxsUHJvZ3JhbUNvbmZpZ3VyYXRpb24pO1xuICAgICAgICAgICAgZ2wudW5pZm9ybU1hdHJpeDRmdihwcm9ncmFtLnVfbWF0cml4LCBmYWxzZSwgY29vcmQucG9zTWF0cml4KTtcblxuICAgICAgICAgICAgLy8gRHJhdyB0aGUgY2xpcHBpbmcgbWFza1xuICAgICAgICAgICAgdGhpcy50aWxlRXh0ZW50VkFPLmJpbmQoZ2wsIHByb2dyYW0sIHRoaXMudGlsZUV4dGVudEJ1ZmZlcik7XG4gICAgICAgICAgICBnbC5kcmF3QXJyYXlzKGdsLlRSSUFOR0xFX1NUUklQLCAwLCB0aGlzLnRpbGVFeHRlbnRCdWZmZXIubGVuZ3RoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGdsLnN0ZW5jaWxNYXNrKDB4MDApO1xuICAgICAgICBnbC5jb2xvck1hc2sodHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuZGVwdGhNYXNrKHRydWUpO1xuICAgICAgICBnbC5lbmFibGUoZ2wuREVQVEhfVEVTVCk7XG4gICAgfVxuXG4gICAgZW5hYmxlVGlsZUNsaXBwaW5nTWFzayhjb29yZCkge1xuICAgICAgICBjb25zdCBnbCA9IHRoaXMuZ2w7XG4gICAgICAgIGdsLnN0ZW5jaWxGdW5jKGdsLkVRVUFMLCB0aGlzLl90aWxlQ2xpcHBpbmdNYXNrSURzW2Nvb3JkLmlkXSwgMHhGOCk7XG4gICAgfVxuXG4gICAgLy8gT3ZlcnJpZGRlbiBieSBoZWFkbGVzcyB0ZXN0cy5cbiAgICBwcmVwYXJlQnVmZmVycygpIHt9XG5cbiAgICBiaW5kRGVmYXVsdEZyYW1lYnVmZmVyKCkge1xuICAgICAgICBjb25zdCBnbCA9IHRoaXMuZ2w7XG4gICAgICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgbnVsbCk7XG4gICAgfVxuXG4gICAgcmVuZGVyKHN0eWxlLCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuc3R5bGUgPSBzdHlsZTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcblxuICAgICAgICB0aGlzLmxpbmVBdGxhcyA9IHN0eWxlLmxpbmVBdGxhcztcblxuICAgICAgICB0aGlzLnNwcml0ZUF0bGFzID0gc3R5bGUuc3ByaXRlQXRsYXM7XG4gICAgICAgIHRoaXMuc3ByaXRlQXRsYXMuc2V0U3ByaXRlKHN0eWxlLnNwcml0ZSk7XG5cbiAgICAgICAgdGhpcy5nbHlwaFNvdXJjZSA9IHN0eWxlLmdseXBoU291cmNlO1xuXG4gICAgICAgIHRoaXMuZnJhbWVIaXN0b3J5LnJlY29yZChEYXRlLm5vdygpLCB0aGlzLnRyYW5zZm9ybS56b29tLCBzdHlsZS5nZXRUcmFuc2l0aW9uKCkuZHVyYXRpb24pO1xuXG4gICAgICAgIHRoaXMucHJlcGFyZUJ1ZmZlcnMoKTtcbiAgICAgICAgdGhpcy5jbGVhckNvbG9yKCk7XG4gICAgICAgIHRoaXMuY2xlYXJEZXB0aCgpO1xuXG4gICAgICAgIHRoaXMuc2hvd092ZXJkcmF3SW5zcGVjdG9yKG9wdGlvbnMuc2hvd092ZXJkcmF3SW5zcGVjdG9yKTtcblxuICAgICAgICB0aGlzLmRlcHRoUmFuZ2UgPSAoc3R5bGUuX29yZGVyLmxlbmd0aCArIDIpICogdGhpcy5udW1TdWJsYXllcnMgKiB0aGlzLmRlcHRoRXBzaWxvbjtcblxuICAgICAgICB0aGlzLmlzT3BhcXVlUGFzcyA9IHRydWU7XG4gICAgICAgIHRoaXMucmVuZGVyUGFzcygpO1xuICAgICAgICB0aGlzLmlzT3BhcXVlUGFzcyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJlbmRlclBhc3MoKTtcblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNob3dUaWxlQm91bmRhcmllcykge1xuICAgICAgICAgICAgY29uc3Qgc291cmNlQ2FjaGUgPSB0aGlzLnN0eWxlLnNvdXJjZUNhY2hlc1tPYmplY3Qua2V5cyh0aGlzLnN0eWxlLnNvdXJjZUNhY2hlcylbMF1dO1xuICAgICAgICAgICAgaWYgKHNvdXJjZUNhY2hlKSB7XG4gICAgICAgICAgICAgICAgZHJhdy5kZWJ1Zyh0aGlzLCBzb3VyY2VDYWNoZSwgc291cmNlQ2FjaGUuZ2V0VmlzaWJsZUNvb3JkaW5hdGVzKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVuZGVyUGFzcygpIHtcbiAgICAgICAgY29uc3QgbGF5ZXJJZHMgPSB0aGlzLnN0eWxlLl9vcmRlcjtcblxuICAgICAgICBsZXQgc291cmNlQ2FjaGUsIGNvb3JkcztcblxuICAgICAgICB0aGlzLmN1cnJlbnRMYXllciA9IHRoaXMuaXNPcGFxdWVQYXNzID8gbGF5ZXJJZHMubGVuZ3RoIC0gMSA6IDA7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNPcGFxdWVQYXNzKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX3Nob3dPdmVyZHJhd0luc3BlY3Rvcikge1xuICAgICAgICAgICAgICAgIHRoaXMuZ2wuZGlzYWJsZSh0aGlzLmdsLkJMRU5EKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZ2wuZW5hYmxlKHRoaXMuZ2wuQkxFTkQpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsYXllcklkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLnN0eWxlLl9sYXllcnNbbGF5ZXJJZHNbdGhpcy5jdXJyZW50TGF5ZXJdXTtcblxuICAgICAgICAgICAgaWYgKGxheWVyLnNvdXJjZSAhPT0gKHNvdXJjZUNhY2hlICYmIHNvdXJjZUNhY2hlLmlkKSkge1xuICAgICAgICAgICAgICAgIHNvdXJjZUNhY2hlID0gdGhpcy5zdHlsZS5zb3VyY2VDYWNoZXNbbGF5ZXIuc291cmNlXTtcbiAgICAgICAgICAgICAgICBjb29yZHMgPSBbXTtcblxuICAgICAgICAgICAgICAgIGlmIChzb3VyY2VDYWNoZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlQ2FjaGUucHJlcGFyZSkgc291cmNlQ2FjaGUucHJlcGFyZSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsZWFyU3RlbmNpbCgpO1xuICAgICAgICAgICAgICAgICAgICBjb29yZHMgPSBzb3VyY2VDYWNoZS5nZXRWaXNpYmxlQ29vcmRpbmF0ZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZUNhY2hlLmdldFNvdXJjZSgpLmlzVGlsZUNsaXBwZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlbmRlclRpbGVDbGlwcGluZ01hc2tzKGNvb3Jkcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNPcGFxdWVQYXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvb3Jkcy5yZXZlcnNlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnJlbmRlckxheWVyKHRoaXMsIHNvdXJjZUNhY2hlLCBsYXllciwgY29vcmRzKTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudExheWVyICs9IHRoaXMuaXNPcGFxdWVQYXNzID8gLTEgOiAxO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGVwdGhNYXNrKG1hc2spIHtcbiAgICAgICAgaWYgKG1hc2sgIT09IHRoaXMuX2RlcHRoTWFzaykge1xuICAgICAgICAgICAgdGhpcy5fZGVwdGhNYXNrID0gbWFzaztcbiAgICAgICAgICAgIHRoaXMuZ2wuZGVwdGhNYXNrKG1hc2spO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVuZGVyTGF5ZXIocGFpbnRlciwgc291cmNlQ2FjaGUsIGxheWVyLCBjb29yZHMpIHtcbiAgICAgICAgaWYgKGxheWVyLmlzSGlkZGVuKHRoaXMudHJhbnNmb3JtLnpvb20pKSByZXR1cm47XG4gICAgICAgIGlmIChsYXllci50eXBlICE9PSAnYmFja2dyb3VuZCcgJiYgIWNvb3Jkcy5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgdGhpcy5pZCA9IGxheWVyLmlkO1xuXG4gICAgICAgIGRyYXdbbGF5ZXIudHlwZV0ocGFpbnRlciwgc291cmNlQ2FjaGUsIGxheWVyLCBjb29yZHMpO1xuICAgIH1cblxuICAgIHNldERlcHRoU3VibGF5ZXIobikge1xuICAgICAgICBjb25zdCBmYXJEZXB0aCA9IDEgLSAoKDEgKyB0aGlzLmN1cnJlbnRMYXllcikgKiB0aGlzLm51bVN1YmxheWVycyArIG4pICogdGhpcy5kZXB0aEVwc2lsb247XG4gICAgICAgIGNvbnN0IG5lYXJEZXB0aCA9IGZhckRlcHRoIC0gMSArIHRoaXMuZGVwdGhSYW5nZTtcbiAgICAgICAgdGhpcy5nbC5kZXB0aFJhbmdlKG5lYXJEZXB0aCwgZmFyRGVwdGgpO1xuICAgIH1cblxuICAgIHRyYW5zbGF0ZVBvc01hdHJpeChtYXRyaXgsIHRpbGUsIHRyYW5zbGF0ZSwgYW5jaG9yKSB7XG4gICAgICAgIGlmICghdHJhbnNsYXRlWzBdICYmICF0cmFuc2xhdGVbMV0pIHJldHVybiBtYXRyaXg7XG5cbiAgICAgICAgaWYgKGFuY2hvciA9PT0gJ3ZpZXdwb3J0Jykge1xuICAgICAgICAgICAgY29uc3Qgc2luQSA9IE1hdGguc2luKC10aGlzLnRyYW5zZm9ybS5hbmdsZSk7XG4gICAgICAgICAgICBjb25zdCBjb3NBID0gTWF0aC5jb3MoLXRoaXMudHJhbnNmb3JtLmFuZ2xlKTtcbiAgICAgICAgICAgIHRyYW5zbGF0ZSA9IFtcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGVbMF0gKiBjb3NBIC0gdHJhbnNsYXRlWzFdICogc2luQSxcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGVbMF0gKiBzaW5BICsgdHJhbnNsYXRlWzFdICogY29zQVxuICAgICAgICAgICAgXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRyYW5zbGF0aW9uID0gW1xuICAgICAgICAgICAgcGl4ZWxzVG9UaWxlVW5pdHModGlsZSwgdHJhbnNsYXRlWzBdLCB0aGlzLnRyYW5zZm9ybS56b29tKSxcbiAgICAgICAgICAgIHBpeGVsc1RvVGlsZVVuaXRzKHRpbGUsIHRyYW5zbGF0ZVsxXSwgdGhpcy50cmFuc2Zvcm0uem9vbSksXG4gICAgICAgICAgICAwXG4gICAgICAgIF07XG5cbiAgICAgICAgY29uc3QgdHJhbnNsYXRlZE1hdHJpeCA9IG5ldyBGbG9hdDMyQXJyYXkoMTYpO1xuICAgICAgICBtYXQ0LnRyYW5zbGF0ZSh0cmFuc2xhdGVkTWF0cml4LCBtYXRyaXgsIHRyYW5zbGF0aW9uKTtcbiAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZWRNYXRyaXg7XG4gICAgfVxuXG4gICAgc2F2ZVRpbGVUZXh0dXJlKHRleHR1cmUpIHtcbiAgICAgICAgY29uc3QgdGV4dHVyZXMgPSB0aGlzLnJldXNhYmxlVGV4dHVyZXMudGlsZXNbdGV4dHVyZS5zaXplXTtcbiAgICAgICAgaWYgKCF0ZXh0dXJlcykge1xuICAgICAgICAgICAgdGhpcy5yZXVzYWJsZVRleHR1cmVzLnRpbGVzW3RleHR1cmUuc2l6ZV0gPSBbdGV4dHVyZV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0ZXh0dXJlcy5wdXNoKHRleHR1cmUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2F2ZVZpZXdwb3J0VGV4dHVyZSh0ZXh0dXJlKSB7XG4gICAgICAgIHRoaXMucmV1c2FibGVUZXh0dXJlcy52aWV3cG9ydCA9IHRleHR1cmU7XG4gICAgfVxuXG4gICAgZ2V0VGlsZVRleHR1cmUoc2l6ZSkge1xuICAgICAgICBjb25zdCB0ZXh0dXJlcyA9IHRoaXMucmV1c2FibGVUZXh0dXJlcy50aWxlc1tzaXplXTtcbiAgICAgICAgcmV0dXJuIHRleHR1cmVzICYmIHRleHR1cmVzLmxlbmd0aCA+IDAgPyB0ZXh0dXJlcy5wb3AoKSA6IG51bGw7XG4gICAgfVxuXG4gICAgZ2V0Vmlld3BvcnRUZXh0dXJlKHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgICAgY29uc3QgdGV4dHVyZSA9IHRoaXMucmV1c2FibGVUZXh0dXJlcy52aWV3cG9ydDtcbiAgICAgICAgaWYgKCF0ZXh0dXJlKSByZXR1cm47XG5cbiAgICAgICAgaWYgKHRleHR1cmUud2lkdGggPT09IHdpZHRoICYmIHRleHR1cmUuaGVpZ2h0ID09PSBoZWlnaHQpIHtcbiAgICAgICAgICAgIHJldHVybiB0ZXh0dXJlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5nbC5kZWxldGVUZXh0dXJlKHRleHR1cmUpO1xuICAgICAgICAgICAgdGhpcy5yZXVzYWJsZVRleHR1cmVzLnZpZXdwb3J0ID0gbnVsbDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGxpbmVXaWR0aCh3aWR0aCkge1xuICAgICAgICB0aGlzLmdsLmxpbmVXaWR0aCh1dGlsLmNsYW1wKHdpZHRoLCB0aGlzLmxpbmVXaWR0aFJhbmdlWzBdLCB0aGlzLmxpbmVXaWR0aFJhbmdlWzFdKSk7XG4gICAgfVxuXG4gICAgc2hvd092ZXJkcmF3SW5zcGVjdG9yKGVuYWJsZWQpIHtcbiAgICAgICAgaWYgKCFlbmFibGVkICYmICF0aGlzLl9zaG93T3ZlcmRyYXdJbnNwZWN0b3IpIHJldHVybjtcbiAgICAgICAgdGhpcy5fc2hvd092ZXJkcmF3SW5zcGVjdG9yID0gZW5hYmxlZDtcblxuICAgICAgICBjb25zdCBnbCA9IHRoaXMuZ2w7XG4gICAgICAgIGlmIChlbmFibGVkKSB7XG4gICAgICAgICAgICBnbC5ibGVuZEZ1bmMoZ2wuQ09OU1RBTlRfQ09MT1IsIGdsLk9ORSk7XG4gICAgICAgICAgICBjb25zdCBudW1PdmVyZHJhd1N0ZXBzID0gODtcbiAgICAgICAgICAgIGNvbnN0IGEgPSAxIC8gbnVtT3ZlcmRyYXdTdGVwcztcbiAgICAgICAgICAgIGdsLmJsZW5kQ29sb3IoYSwgYSwgYSwgMCk7XG4gICAgICAgICAgICBnbC5jbGVhckNvbG9yKDAsIDAsIDAsIDEpO1xuICAgICAgICAgICAgZ2wuY2xlYXIoZ2wuQ09MT1JfQlVGRkVSX0JJVCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBnbC5ibGVuZEZ1bmMoZ2wuT05FLCBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNyZWF0ZVByb2dyYW0obmFtZSwgY29uZmlndXJhdGlvbikge1xuICAgICAgICBjb25zdCBnbCA9IHRoaXMuZ2w7XG4gICAgICAgIGNvbnN0IHByb2dyYW0gPSBnbC5jcmVhdGVQcm9ncmFtKCk7XG4gICAgICAgIGNvbnN0IGRlZmluaXRpb24gPSBzaGFkZXJzW25hbWVdO1xuXG4gICAgICAgIGxldCBkZWZpbmVzU291cmNlID0gYCNkZWZpbmUgTUFQQk9YX0dMX0pTXFxuI2RlZmluZSBERVZJQ0VfUElYRUxfUkFUSU8gJHticm93c2VyLmRldmljZVBpeGVsUmF0aW8udG9GaXhlZCgxKX1cXG5gO1xuICAgICAgICBpZiAodGhpcy5fc2hvd092ZXJkcmF3SW5zcGVjdG9yKSB7XG4gICAgICAgICAgICBkZWZpbmVzU291cmNlICs9ICcjZGVmaW5lIE9WRVJEUkFXX0lOU1BFQ1RPUjtcXG4nO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZnJhZ21lbnRTaGFkZXIgPSBnbC5jcmVhdGVTaGFkZXIoZ2wuRlJBR01FTlRfU0hBREVSKTtcbiAgICAgICAgZ2wuc2hhZGVyU291cmNlKGZyYWdtZW50U2hhZGVyLCBjb25maWd1cmF0aW9uLmFwcGx5UHJhZ21hcyhkZWZpbmVzU291cmNlICsgc2hhZGVycy5wcmVsdWRlLmZyYWdtZW50U291cmNlICsgZGVmaW5pdGlvbi5mcmFnbWVudFNvdXJjZSwgJ2ZyYWdtZW50JykpO1xuICAgICAgICBnbC5jb21waWxlU2hhZGVyKGZyYWdtZW50U2hhZGVyKTtcbiAgICAgICAgYXNzZXJ0KGdsLmdldFNoYWRlclBhcmFtZXRlcihmcmFnbWVudFNoYWRlciwgZ2wuQ09NUElMRV9TVEFUVVMpLCBnbC5nZXRTaGFkZXJJbmZvTG9nKGZyYWdtZW50U2hhZGVyKSk7XG4gICAgICAgIGdsLmF0dGFjaFNoYWRlcihwcm9ncmFtLCBmcmFnbWVudFNoYWRlcik7XG5cbiAgICAgICAgY29uc3QgdmVydGV4U2hhZGVyID0gZ2wuY3JlYXRlU2hhZGVyKGdsLlZFUlRFWF9TSEFERVIpO1xuICAgICAgICBnbC5zaGFkZXJTb3VyY2UodmVydGV4U2hhZGVyLCBjb25maWd1cmF0aW9uLmFwcGx5UHJhZ21hcyhkZWZpbmVzU291cmNlICsgc2hhZGVycy5wcmVsdWRlLnZlcnRleFNvdXJjZSArIGRlZmluaXRpb24udmVydGV4U291cmNlLCAndmVydGV4JykpO1xuICAgICAgICBnbC5jb21waWxlU2hhZGVyKHZlcnRleFNoYWRlcik7XG4gICAgICAgIGFzc2VydChnbC5nZXRTaGFkZXJQYXJhbWV0ZXIodmVydGV4U2hhZGVyLCBnbC5DT01QSUxFX1NUQVRVUyksIGdsLmdldFNoYWRlckluZm9Mb2codmVydGV4U2hhZGVyKSk7XG4gICAgICAgIGdsLmF0dGFjaFNoYWRlcihwcm9ncmFtLCB2ZXJ0ZXhTaGFkZXIpO1xuXG4gICAgICAgIGdsLmxpbmtQcm9ncmFtKHByb2dyYW0pO1xuICAgICAgICBhc3NlcnQoZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlcihwcm9ncmFtLCBnbC5MSU5LX1NUQVRVUyksIGdsLmdldFByb2dyYW1JbmZvTG9nKHByb2dyYW0pKTtcblxuICAgICAgICBjb25zdCBudW1BdHRyaWJ1dGVzID0gZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlcihwcm9ncmFtLCBnbC5BQ1RJVkVfQVRUUklCVVRFUyk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHtwcm9ncmFtLCBudW1BdHRyaWJ1dGVzfTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUF0dHJpYnV0ZXM7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgYXR0cmlidXRlID0gZ2wuZ2V0QWN0aXZlQXR0cmliKHByb2dyYW0sIGkpO1xuICAgICAgICAgICAgcmVzdWx0W2F0dHJpYnV0ZS5uYW1lXSA9IGdsLmdldEF0dHJpYkxvY2F0aW9uKHByb2dyYW0sIGF0dHJpYnV0ZS5uYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBudW1Vbmlmb3JtcyA9IGdsLmdldFByb2dyYW1QYXJhbWV0ZXIocHJvZ3JhbSwgZ2wuQUNUSVZFX1VOSUZPUk1TKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1Vbmlmb3JtczsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCB1bmlmb3JtID0gZ2wuZ2V0QWN0aXZlVW5pZm9ybShwcm9ncmFtLCBpKTtcbiAgICAgICAgICAgIHJlc3VsdFt1bmlmb3JtLm5hbWVdID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sIHVuaWZvcm0ubmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBfY3JlYXRlUHJvZ3JhbUNhY2hlZChuYW1lLCBwcm9ncmFtQ29uZmlndXJhdGlvbikge1xuICAgICAgICB0aGlzLmNhY2hlID0gdGhpcy5jYWNoZSB8fCB7fTtcbiAgICAgICAgY29uc3Qga2V5ID0gYCR7bmFtZX0ke3Byb2dyYW1Db25maWd1cmF0aW9uLmNhY2hlS2V5IHx8ICcnfSR7dGhpcy5fc2hvd092ZXJkcmF3SW5zcGVjdG9yID8gJy9vdmVyZHJhdycgOiAnJ31gO1xuICAgICAgICBpZiAoIXRoaXMuY2FjaGVba2V5XSkge1xuICAgICAgICAgICAgdGhpcy5jYWNoZVtrZXldID0gdGhpcy5jcmVhdGVQcm9ncmFtKG5hbWUsIHByb2dyYW1Db25maWd1cmF0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZVtrZXldO1xuICAgIH1cblxuICAgIHVzZVByb2dyYW0obmFtZSwgcHJvZ3JhbUNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgY29uc3QgZ2wgPSB0aGlzLmdsO1xuICAgICAgICBjb25zdCBuZXh0UHJvZ3JhbSA9IHRoaXMuX2NyZWF0ZVByb2dyYW1DYWNoZWQobmFtZSwgcHJvZ3JhbUNvbmZpZ3VyYXRpb24gfHwgdGhpcy5lbXB0eVByb2dyYW1Db25maWd1cmF0aW9uKTtcblxuICAgICAgICBpZiAodGhpcy5jdXJyZW50UHJvZ3JhbSAhPT0gbmV4dFByb2dyYW0pIHtcbiAgICAgICAgICAgIGdsLnVzZVByb2dyYW0obmV4dFByb2dyYW0ucHJvZ3JhbSk7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRQcm9ncmFtID0gbmV4dFByb2dyYW07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV4dFByb2dyYW07XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFBhaW50ZXI7XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHBpeGVsc1RvVGlsZVVuaXRzID0gcmVxdWlyZSgnLi4vc291cmNlL3BpeGVsc190b190aWxlX3VuaXRzJyk7XG5cbmV4cG9ydHMucHJlcGFyZSA9IGZ1bmN0aW9uIChpbWFnZSwgcGFpbnRlciwgcHJvZ3JhbSkge1xuICAgIGNvbnN0IGdsID0gcGFpbnRlci5nbDtcblxuICAgIGNvbnN0IGltYWdlUG9zQSA9IHBhaW50ZXIuc3ByaXRlQXRsYXMuZ2V0UG9zaXRpb24oaW1hZ2UuZnJvbSwgdHJ1ZSk7XG4gICAgY29uc3QgaW1hZ2VQb3NCID0gcGFpbnRlci5zcHJpdGVBdGxhcy5nZXRQb3NpdGlvbihpbWFnZS50bywgdHJ1ZSk7XG4gICAgaWYgKCFpbWFnZVBvc0EgfHwgIWltYWdlUG9zQikgcmV0dXJuO1xuXG4gICAgZ2wudW5pZm9ybTFpKHByb2dyYW0udV9pbWFnZSwgMCk7XG4gICAgZ2wudW5pZm9ybTJmdihwcm9ncmFtLnVfcGF0dGVybl90bF9hLCBpbWFnZVBvc0EudGwpO1xuICAgIGdsLnVuaWZvcm0yZnYocHJvZ3JhbS51X3BhdHRlcm5fYnJfYSwgaW1hZ2VQb3NBLmJyKTtcbiAgICBnbC51bmlmb3JtMmZ2KHByb2dyYW0udV9wYXR0ZXJuX3RsX2IsIGltYWdlUG9zQi50bCk7XG4gICAgZ2wudW5pZm9ybTJmdihwcm9ncmFtLnVfcGF0dGVybl9icl9iLCBpbWFnZVBvc0IuYnIpO1xuICAgIGdsLnVuaWZvcm0xZihwcm9ncmFtLnVfbWl4LCBpbWFnZS50KTtcbiAgICBnbC51bmlmb3JtMmZ2KHByb2dyYW0udV9wYXR0ZXJuX3NpemVfYSwgaW1hZ2VQb3NBLnNpemUpO1xuICAgIGdsLnVuaWZvcm0yZnYocHJvZ3JhbS51X3BhdHRlcm5fc2l6ZV9iLCBpbWFnZVBvc0Iuc2l6ZSk7XG4gICAgZ2wudW5pZm9ybTFmKHByb2dyYW0udV9zY2FsZV9hLCBpbWFnZS5mcm9tU2NhbGUpO1xuICAgIGdsLnVuaWZvcm0xZihwcm9ncmFtLnVfc2NhbGVfYiwgaW1hZ2UudG9TY2FsZSk7XG5cbiAgICBnbC5hY3RpdmVUZXh0dXJlKGdsLlRFWFRVUkUwKTtcbiAgICBwYWludGVyLnNwcml0ZUF0bGFzLmJpbmQoZ2wsIHRydWUpO1xufTtcblxuZXhwb3J0cy5zZXRUaWxlID0gZnVuY3Rpb24gKHRpbGUsIHBhaW50ZXIsIHByb2dyYW0pIHtcbiAgICBjb25zdCBnbCA9IHBhaW50ZXIuZ2w7XG5cbiAgICBnbC51bmlmb3JtMWYocHJvZ3JhbS51X3RpbGVfdW5pdHNfdG9fcGl4ZWxzLCAxIC8gcGl4ZWxzVG9UaWxlVW5pdHModGlsZSwgMSwgcGFpbnRlci50cmFuc2Zvcm0udGlsZVpvb20pKTtcblxuICAgIGNvbnN0IG51bVRpbGVzID0gTWF0aC5wb3coMiwgdGlsZS5jb29yZC56KTtcbiAgICBjb25zdCB0aWxlU2l6ZUF0TmVhcmVzdFpvb20gPSB0aWxlLnRpbGVTaXplICogTWF0aC5wb3coMiwgcGFpbnRlci50cmFuc2Zvcm0udGlsZVpvb20pIC8gbnVtVGlsZXM7XG5cbiAgICBjb25zdCBwaXhlbFggPSB0aWxlU2l6ZUF0TmVhcmVzdFpvb20gKiAodGlsZS5jb29yZC54ICsgdGlsZS5jb29yZC53ICogbnVtVGlsZXMpO1xuICAgIGNvbnN0IHBpeGVsWSA9IHRpbGVTaXplQXROZWFyZXN0Wm9vbSAqIHRpbGUuY29vcmQueTtcblxuICAgIC8vIHNwbGl0IHRoZSBwaXhlbCBjb29yZCBpbnRvIHR3byBwYWlycyBvZiAxNiBiaXQgbnVtYmVycy4gVGhlIGdsc2wgc3BlYyBvbmx5IGd1YXJhbnRlZXMgMTYgYml0cyBvZiBwcmVjaXNpb24uXG4gICAgZ2wudW5pZm9ybTJmKHByb2dyYW0udV9waXhlbF9jb29yZF91cHBlciwgcGl4ZWxYID4+IDE2LCBwaXhlbFkgPj4gMTYpO1xuICAgIGdsLnVuaWZvcm0yZihwcm9ncmFtLnVfcGl4ZWxfY29vcmRfbG93ZXIsIHBpeGVsWCAmIDB4RkZGRiwgcGl4ZWxZICYgMHhGRkZGKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IGZzID0gcmVxdWlyZSgnZnMnKTtcbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG5cbi8vIHJlYWRGaWxlU3luYyBjYWxscyBtdXN0IGJlIHdyaXR0ZW4gb3V0IGxvbmctZm9ybSBmb3IgYnJmcy5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIHByZWx1ZGU6IHtcbiAgICAgICAgZnJhZ21lbnRTb3VyY2U6IGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vLi4vc2hhZGVycy9fcHJlbHVkZS5mcmFnbWVudC5nbHNsJyksICd1dGY4JyksXG4gICAgICAgIHZlcnRleFNvdXJjZTogZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi8uLi9zaGFkZXJzL19wcmVsdWRlLnZlcnRleC5nbHNsJyksICd1dGY4JylcbiAgICB9LFxuICAgIGNpcmNsZToge1xuICAgICAgICBmcmFnbWVudFNvdXJjZTogZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi8uLi9zaGFkZXJzL2NpcmNsZS5mcmFnbWVudC5nbHNsJyksICd1dGY4JyksXG4gICAgICAgIHZlcnRleFNvdXJjZTogZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi8uLi9zaGFkZXJzL2NpcmNsZS52ZXJ0ZXguZ2xzbCcpLCAndXRmOCcpXG4gICAgfSxcbiAgICBjb2xsaXNpb25Cb3g6IHtcbiAgICAgICAgZnJhZ21lbnRTb3VyY2U6IGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vLi4vc2hhZGVycy9jb2xsaXNpb25fYm94LmZyYWdtZW50Lmdsc2wnKSwgJ3V0ZjgnKSxcbiAgICAgICAgdmVydGV4U291cmNlOiBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKF9fZGlybmFtZSwgJy4uLy4uL3NoYWRlcnMvY29sbGlzaW9uX2JveC52ZXJ0ZXguZ2xzbCcpLCAndXRmOCcpXG4gICAgfSxcbiAgICBkZWJ1Zzoge1xuICAgICAgICBmcmFnbWVudFNvdXJjZTogZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi8uLi9zaGFkZXJzL2RlYnVnLmZyYWdtZW50Lmdsc2wnKSwgJ3V0ZjgnKSxcbiAgICAgICAgdmVydGV4U291cmNlOiBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKF9fZGlybmFtZSwgJy4uLy4uL3NoYWRlcnMvZGVidWcudmVydGV4Lmdsc2wnKSwgJ3V0ZjgnKVxuICAgIH0sXG4gICAgZmlsbDoge1xuICAgICAgICBmcmFnbWVudFNvdXJjZTogZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi8uLi9zaGFkZXJzL2ZpbGwuZnJhZ21lbnQuZ2xzbCcpLCAndXRmOCcpLFxuICAgICAgICB2ZXJ0ZXhTb3VyY2U6IGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vLi4vc2hhZGVycy9maWxsLnZlcnRleC5nbHNsJyksICd1dGY4JylcbiAgICB9LFxuICAgIGZpbGxPdXRsaW5lOiB7XG4gICAgICAgIGZyYWdtZW50U291cmNlOiBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKF9fZGlybmFtZSwgJy4uLy4uL3NoYWRlcnMvZmlsbF9vdXRsaW5lLmZyYWdtZW50Lmdsc2wnKSwgJ3V0ZjgnKSxcbiAgICAgICAgdmVydGV4U291cmNlOiBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKF9fZGlybmFtZSwgJy4uLy4uL3NoYWRlcnMvZmlsbF9vdXRsaW5lLnZlcnRleC5nbHNsJyksICd1dGY4JylcbiAgICB9LFxuICAgIGZpbGxPdXRsaW5lUGF0dGVybjoge1xuICAgICAgICBmcmFnbWVudFNvdXJjZTogZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi8uLi9zaGFkZXJzL2ZpbGxfb3V0bGluZV9wYXR0ZXJuLmZyYWdtZW50Lmdsc2wnKSwgJ3V0ZjgnKSxcbiAgICAgICAgdmVydGV4U291cmNlOiBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKF9fZGlybmFtZSwgJy4uLy4uL3NoYWRlcnMvZmlsbF9vdXRsaW5lX3BhdHRlcm4udmVydGV4Lmdsc2wnKSwgJ3V0ZjgnKVxuICAgIH0sXG4gICAgZmlsbFBhdHRlcm46IHtcbiAgICAgICAgZnJhZ21lbnRTb3VyY2U6IGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vLi4vc2hhZGVycy9maWxsX3BhdHRlcm4uZnJhZ21lbnQuZ2xzbCcpLCAndXRmOCcpLFxuICAgICAgICB2ZXJ0ZXhTb3VyY2U6IGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vLi4vc2hhZGVycy9maWxsX3BhdHRlcm4udmVydGV4Lmdsc2wnKSwgJ3V0ZjgnKVxuICAgIH0sXG4gICAgZmlsbEV4dHJ1c2lvbjoge1xuICAgICAgICBmcmFnbWVudFNvdXJjZTogZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi8uLi9zaGFkZXJzL2ZpbGxfZXh0cnVzaW9uLmZyYWdtZW50Lmdsc2wnKSwgJ3V0ZjgnKSxcbiAgICAgICAgdmVydGV4U291cmNlOiBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKF9fZGlybmFtZSwgJy4uLy4uL3NoYWRlcnMvZmlsbF9leHRydXNpb24udmVydGV4Lmdsc2wnKSwgJ3V0ZjgnKVxuICAgIH0sXG4gICAgZmlsbEV4dHJ1c2lvblBhdHRlcm46IHtcbiAgICAgICAgZnJhZ21lbnRTb3VyY2U6IGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vLi4vc2hhZGVycy9maWxsX2V4dHJ1c2lvbl9wYXR0ZXJuLmZyYWdtZW50Lmdsc2wnKSwgJ3V0ZjgnKSxcbiAgICAgICAgdmVydGV4U291cmNlOiBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKF9fZGlybmFtZSwgJy4uLy4uL3NoYWRlcnMvZmlsbF9leHRydXNpb25fcGF0dGVybi52ZXJ0ZXguZ2xzbCcpLCAndXRmOCcpXG4gICAgfSxcbiAgICBleHRydXNpb25UZXh0dXJlOiB7XG4gICAgICAgIGZyYWdtZW50U291cmNlOiBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKF9fZGlybmFtZSwgJy4uLy4uL3NoYWRlcnMvZXh0cnVzaW9uX3RleHR1cmUuZnJhZ21lbnQuZ2xzbCcpLCAndXRmOCcpLFxuICAgICAgICB2ZXJ0ZXhTb3VyY2U6IGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vLi4vc2hhZGVycy9leHRydXNpb25fdGV4dHVyZS52ZXJ0ZXguZ2xzbCcpLCAndXRmOCcpXG4gICAgfSxcbiAgICBsaW5lOiB7XG4gICAgICAgIGZyYWdtZW50U291cmNlOiBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKF9fZGlybmFtZSwgJy4uLy4uL3NoYWRlcnMvbGluZS5mcmFnbWVudC5nbHNsJyksICd1dGY4JyksXG4gICAgICAgIHZlcnRleFNvdXJjZTogZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi8uLi9zaGFkZXJzL2xpbmUudmVydGV4Lmdsc2wnKSwgJ3V0ZjgnKVxuICAgIH0sXG4gICAgbGluZVBhdHRlcm46IHtcbiAgICAgICAgZnJhZ21lbnRTb3VyY2U6IGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vLi4vc2hhZGVycy9saW5lX3BhdHRlcm4uZnJhZ21lbnQuZ2xzbCcpLCAndXRmOCcpLFxuICAgICAgICB2ZXJ0ZXhTb3VyY2U6IGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vLi4vc2hhZGVycy9saW5lX3BhdHRlcm4udmVydGV4Lmdsc2wnKSwgJ3V0ZjgnKVxuICAgIH0sXG4gICAgbGluZVNERjoge1xuICAgICAgICBmcmFnbWVudFNvdXJjZTogZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi8uLi9zaGFkZXJzL2xpbmVfc2RmLmZyYWdtZW50Lmdsc2wnKSwgJ3V0ZjgnKSxcbiAgICAgICAgdmVydGV4U291cmNlOiBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKF9fZGlybmFtZSwgJy4uLy4uL3NoYWRlcnMvbGluZV9zZGYudmVydGV4Lmdsc2wnKSwgJ3V0ZjgnKVxuICAgIH0sXG4gICAgcmFzdGVyOiB7XG4gICAgICAgIGZyYWdtZW50U291cmNlOiBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKF9fZGlybmFtZSwgJy4uLy4uL3NoYWRlcnMvcmFzdGVyLmZyYWdtZW50Lmdsc2wnKSwgJ3V0ZjgnKSxcbiAgICAgICAgdmVydGV4U291cmNlOiBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKF9fZGlybmFtZSwgJy4uLy4uL3NoYWRlcnMvcmFzdGVyLnZlcnRleC5nbHNsJyksICd1dGY4JylcbiAgICB9LFxuICAgIHN5bWJvbEljb246IHtcbiAgICAgICAgZnJhZ21lbnRTb3VyY2U6IGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vLi4vc2hhZGVycy9zeW1ib2xfaWNvbi5mcmFnbWVudC5nbHNsJyksICd1dGY4JyksXG4gICAgICAgIHZlcnRleFNvdXJjZTogZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi8uLi9zaGFkZXJzL3N5bWJvbF9pY29uLnZlcnRleC5nbHNsJyksICd1dGY4JylcbiAgICB9LFxuICAgIHN5bWJvbFNERjoge1xuICAgICAgICBmcmFnbWVudFNvdXJjZTogZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi8uLi9zaGFkZXJzL3N5bWJvbF9zZGYuZnJhZ21lbnQuZ2xzbCcpLCAndXRmOCcpLFxuICAgICAgICB2ZXJ0ZXhTb3VyY2U6IGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vLi4vc2hhZGVycy9zeW1ib2xfc2RmLnZlcnRleC5nbHNsJyksICd1dGY4JylcbiAgICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKTtcblxuY2xhc3MgVmVydGV4QXJyYXlPYmplY3Qge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmJvdW5kUHJvZ3JhbSA9IG51bGw7XG4gICAgICAgIHRoaXMuYm91bmRWZXJ0ZXhCdWZmZXIgPSBudWxsO1xuICAgICAgICB0aGlzLmJvdW5kVmVydGV4QnVmZmVyMiA9IG51bGw7XG4gICAgICAgIHRoaXMuYm91bmRFbGVtZW50QnVmZmVyID0gbnVsbDtcbiAgICAgICAgdGhpcy5ib3VuZFZlcnRleE9mZnNldCA9IG51bGw7XG4gICAgICAgIHRoaXMudmFvID0gbnVsbDtcbiAgICB9XG5cbiAgICBiaW5kKGdsLCBwcm9ncmFtLCBsYXlvdXRWZXJ0ZXhCdWZmZXIsIGVsZW1lbnRCdWZmZXIsIHZlcnRleEJ1ZmZlcjIsIHZlcnRleE9mZnNldCkge1xuXG4gICAgICAgIGlmIChnbC5leHRWZXJ0ZXhBcnJheU9iamVjdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBnbC5leHRWZXJ0ZXhBcnJheU9iamVjdCA9IGdsLmdldEV4dGVuc2lvbihcIk9FU192ZXJ0ZXhfYXJyYXlfb2JqZWN0XCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaXNGcmVzaEJpbmRSZXF1aXJlZCA9IChcbiAgICAgICAgICAgICF0aGlzLnZhbyB8fFxuICAgICAgICAgICAgdGhpcy5ib3VuZFByb2dyYW0gIT09IHByb2dyYW0gfHxcbiAgICAgICAgICAgIHRoaXMuYm91bmRWZXJ0ZXhCdWZmZXIgIT09IGxheW91dFZlcnRleEJ1ZmZlciB8fFxuICAgICAgICAgICAgdGhpcy5ib3VuZFZlcnRleEJ1ZmZlcjIgIT09IHZlcnRleEJ1ZmZlcjIgfHxcbiAgICAgICAgICAgIHRoaXMuYm91bmRFbGVtZW50QnVmZmVyICE9PSBlbGVtZW50QnVmZmVyIHx8XG4gICAgICAgICAgICB0aGlzLmJvdW5kVmVydGV4T2Zmc2V0ICE9PSB2ZXJ0ZXhPZmZzZXRcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoIWdsLmV4dFZlcnRleEFycmF5T2JqZWN0IHx8IGlzRnJlc2hCaW5kUmVxdWlyZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZnJlc2hCaW5kKGdsLCBwcm9ncmFtLCBsYXlvdXRWZXJ0ZXhCdWZmZXIsIGVsZW1lbnRCdWZmZXIsIHZlcnRleEJ1ZmZlcjIsIHZlcnRleE9mZnNldCk7XG4gICAgICAgICAgICB0aGlzLmdsID0gZ2w7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBnbC5leHRWZXJ0ZXhBcnJheU9iamVjdC5iaW5kVmVydGV4QXJyYXlPRVModGhpcy52YW8pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnJlc2hCaW5kKGdsLCBwcm9ncmFtLCBsYXlvdXRWZXJ0ZXhCdWZmZXIsIGVsZW1lbnRCdWZmZXIsIHZlcnRleEJ1ZmZlcjIsIHZlcnRleE9mZnNldCkge1xuICAgICAgICBsZXQgbnVtUHJldkF0dHJpYnV0ZXM7XG4gICAgICAgIGNvbnN0IG51bU5leHRBdHRyaWJ1dGVzID0gcHJvZ3JhbS5udW1BdHRyaWJ1dGVzO1xuXG4gICAgICAgIGlmIChnbC5leHRWZXJ0ZXhBcnJheU9iamVjdCkge1xuICAgICAgICAgICAgaWYgKHRoaXMudmFvKSB0aGlzLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMudmFvID0gZ2wuZXh0VmVydGV4QXJyYXlPYmplY3QuY3JlYXRlVmVydGV4QXJyYXlPRVMoKTtcbiAgICAgICAgICAgIGdsLmV4dFZlcnRleEFycmF5T2JqZWN0LmJpbmRWZXJ0ZXhBcnJheU9FUyh0aGlzLnZhbyk7XG4gICAgICAgICAgICBudW1QcmV2QXR0cmlidXRlcyA9IDA7XG5cbiAgICAgICAgICAgIC8vIHN0b3JlIHRoZSBhcmd1bWVudHMgc28gdGhhdCB3ZSBjYW4gdmVyaWZ5IHRoZW0gd2hlbiB0aGUgdmFvIGlzIGJvdW5kIGFnYWluXG4gICAgICAgICAgICB0aGlzLmJvdW5kUHJvZ3JhbSA9IHByb2dyYW07XG4gICAgICAgICAgICB0aGlzLmJvdW5kVmVydGV4QnVmZmVyID0gbGF5b3V0VmVydGV4QnVmZmVyO1xuICAgICAgICAgICAgdGhpcy5ib3VuZFZlcnRleEJ1ZmZlcjIgPSB2ZXJ0ZXhCdWZmZXIyO1xuICAgICAgICAgICAgdGhpcy5ib3VuZEVsZW1lbnRCdWZmZXIgPSBlbGVtZW50QnVmZmVyO1xuICAgICAgICAgICAgdGhpcy5ib3VuZFZlcnRleE9mZnNldCA9IHZlcnRleE9mZnNldDtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbnVtUHJldkF0dHJpYnV0ZXMgPSBnbC5jdXJyZW50TnVtQXR0cmlidXRlcyB8fCAwO1xuXG4gICAgICAgICAgICAvLyBEaXNhYmxlIGFsbCBhdHRyaWJ1dGVzIGZyb20gdGhlIHByZXZpb3VzIHByb2dyYW0gdGhhdCBhcmVuJ3QgdXNlZCBpblxuICAgICAgICAgICAgLy8gdGhlIG5ldyBwcm9ncmFtLiBOb3RlOiBhdHRyaWJ1dGUgaW5kaWNlcyBhcmUgKm5vdCogcHJvZ3JhbSBzcGVjaWZpYyFcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBudW1OZXh0QXR0cmlidXRlczsgaSA8IG51bVByZXZBdHRyaWJ1dGVzOyBpKyspIHtcbiAgICAgICAgICAgICAgICAvLyBXZWJHTCBicmVha3MgaWYgeW91IGRpc2FibGUgYXR0cmlidXRlIDAuXG4gICAgICAgICAgICAgICAgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8yMDMwNTIzMVxuICAgICAgICAgICAgICAgIGFzc2VydChpICE9PSAwKTtcbiAgICAgICAgICAgICAgICBnbC5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbmFibGUgYWxsIGF0dHJpYnV0ZXMgZm9yIHRoZSBuZXcgcHJvZ3JhbS5cbiAgICAgICAgZm9yIChsZXQgaiA9IG51bVByZXZBdHRyaWJ1dGVzOyBqIDwgbnVtTmV4dEF0dHJpYnV0ZXM7IGorKykge1xuICAgICAgICAgICAgZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoaik7XG4gICAgICAgIH1cblxuICAgICAgICBsYXlvdXRWZXJ0ZXhCdWZmZXIuYmluZChnbCk7XG4gICAgICAgIGxheW91dFZlcnRleEJ1ZmZlci5zZXRWZXJ0ZXhBdHRyaWJQb2ludGVycyhnbCwgcHJvZ3JhbSwgdmVydGV4T2Zmc2V0KTtcbiAgICAgICAgaWYgKHZlcnRleEJ1ZmZlcjIpIHtcbiAgICAgICAgICAgIHZlcnRleEJ1ZmZlcjIuYmluZChnbCk7XG4gICAgICAgICAgICB2ZXJ0ZXhCdWZmZXIyLnNldFZlcnRleEF0dHJpYlBvaW50ZXJzKGdsLCBwcm9ncmFtLCB2ZXJ0ZXhPZmZzZXQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbGVtZW50QnVmZmVyKSB7XG4gICAgICAgICAgICBlbGVtZW50QnVmZmVyLmJpbmQoZ2wpO1xuICAgICAgICB9XG5cbiAgICAgICAgZ2wuY3VycmVudE51bUF0dHJpYnV0ZXMgPSBudW1OZXh0QXR0cmlidXRlcztcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy52YW8pIHtcbiAgICAgICAgICAgIHRoaXMuZ2wuZXh0VmVydGV4QXJyYXlPYmplY3QuZGVsZXRlVmVydGV4QXJyYXlPRVModGhpcy52YW8pO1xuICAgICAgICAgICAgdGhpcy52YW8gPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFZlcnRleEFycmF5T2JqZWN0O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBJbWFnZVNvdXJjZSA9IHJlcXVpcmUoJy4vaW1hZ2Vfc291cmNlJyk7XG5jb25zdCB3aW5kb3cgPSByZXF1aXJlKCcuLi91dGlsL3dpbmRvdycpO1xuXG4vKipcbiAqIEEgZGF0YSBzb3VyY2UgY29udGFpbmluZyB0aGUgY29udGVudHMgb2YgYW4gSFRNTCBjYW52YXMuXG4gKiAoU2VlIHRoZSBbU3R5bGUgU3BlY2lmaWNhdGlvbl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtc3R5bGUtc3BlYy8jc291cmNlcy1jYW52YXMpIGZvciBkZXRhaWxlZCBkb2N1bWVudGF0aW9uIG9mIG9wdGlvbnMuKVxuICogQGludGVyZmFjZSBDYW52YXNTb3VyY2VcbiAqIEBleGFtcGxlXG4gKiAvLyBhZGQgdG8gbWFwXG4gKiBtYXAuYWRkU291cmNlKCdzb21lIGlkJywge1xuICogICAgdHlwZTogJ2NhbnZhcycsXG4gKiAgICBjYW52YXM6ICdpZE9mTXlIVE1MQ2FudmFzJyxcbiAqICAgIGFuaW1hdGU6IHRydWUsXG4gKiAgICBjb29yZGluYXRlczogW1xuICogICAgICAgIFstNzYuNTQsIDM5LjE4XSxcbiAqICAgICAgICBbLTc2LjUyLCAzOS4xOF0sXG4gKiAgICAgICAgWy03Ni41MiwgMzkuMTddLFxuICogICAgICAgIFstNzYuNTQsIDM5LjE3XVxuICogICAgXVxuICogfSk7XG4gKlxuICogLy8gdXBkYXRlXG4gKiB2YXIgbXlTb3VyY2UgPSBtYXAuZ2V0U291cmNlKCdzb21lIGlkJyk7XG4gKiBteVNvdXJjZS5zZXRDb29yZGluYXRlcyhbXG4gKiAgICAgWy03Ni41NDMzNTczNzIyODM5NCwgMzkuMTg1Nzk5MDcyMjk3NDhdLFxuICogICAgIFstNzYuNTI4MDM2NTk0MzkwODcsIDM5LjE4MzgzNjQ4NDc1ODddLFxuICogICAgIFstNzYuNTI5NTM4NjMxNDM5MiwgMzkuMTc2ODMzOTI1MDc2MDZdLFxuICogICAgIFstNzYuNTQ1MjAyNzMyMDg2MTgsIDM5LjE3ODc2MzQ0MTA2NjQyXVxuICogXSk7XG4gKlxuICogbWFwLnJlbW92ZVNvdXJjZSgnc29tZSBpZCcpOyAgLy8gcmVtb3ZlXG4gKi9cbmNsYXNzIENhbnZhc1NvdXJjZSBleHRlbmRzIEltYWdlU291cmNlIHtcblxuICAgIGNvbnN0cnVjdG9yKGlkLCBvcHRpb25zLCBkaXNwYXRjaGVyLCBldmVudGVkUGFyZW50KSB7XG4gICAgICAgIHN1cGVyKGlkLCBvcHRpb25zLCBkaXNwYXRjaGVyLCBldmVudGVkUGFyZW50KTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgdGhpcy5hbmltYXRlID0gb3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnYW5pbWF0ZScpID8gb3B0aW9ucy5hbmltYXRlIDogdHJ1ZTtcbiAgICB9XG5cbiAgICBsb2FkKCkge1xuICAgICAgICB0aGlzLmNhbnZhcyA9IHRoaXMuY2FudmFzIHx8IHdpbmRvdy5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLm9wdGlvbnMuY2FudmFzKTtcbiAgICAgICAgdGhpcy53aWR0aCA9IHRoaXMuY2FudmFzLndpZHRoO1xuICAgICAgICB0aGlzLmhlaWdodCA9IHRoaXMuY2FudmFzLmhlaWdodDtcbiAgICAgICAgaWYgKHRoaXMuX2hhc0ludmFsaWREaW1lbnNpb25zKHRoaXMuY2FudmFzKSkgcmV0dXJuIHRoaXMuZmlyZSgnZXJyb3InLCBuZXcgRXJyb3IoJ0NhbnZhcyBkaW1lbnNpb25zIGNhbm5vdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gemVyby4nKSk7XG5cbiAgICAgICAgbGV0IGxvb3BJRDtcblxuICAgICAgICB0aGlzLnBsYXkgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGxvb3BJRCA9IHRoaXMubWFwLnN0eWxlLmFuaW1hdGlvbkxvb3Auc2V0KEluZmluaXR5KTtcbiAgICAgICAgICAgIHRoaXMubWFwLl9yZXJlbmRlcigpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMucGF1c2UgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRoaXMubWFwLnN0eWxlLmFuaW1hdGlvbkxvb3AuY2FuY2VsKGxvb3BJRCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5fZmluaXNoTG9hZGluZygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIEhUTUwgYGNhbnZhc2AgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtIVE1MQ2FudmFzRWxlbWVudH0gVGhlIEhUTUwgYGNhbnZhc2AgZWxlbWVudC5cbiAgICAgKi9cbiAgICBnZXRDYW52YXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbnZhcztcbiAgICB9XG5cbiAgICBvbkFkZChtYXApIHtcbiAgICAgICAgaWYgKHRoaXMubWFwKSByZXR1cm47XG4gICAgICAgIHRoaXMubWFwID0gbWFwO1xuICAgICAgICB0aGlzLmxvYWQoKTtcbiAgICAgICAgaWYgKHRoaXMuY2FudmFzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5hbmltYXRlKSB0aGlzLnBsYXkoKTtcbiAgICAgICAgICAgIHRoaXMuc2V0Q29vcmRpbmF0ZXModGhpcy5jb29yZGluYXRlcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBjYW52YXMncyBjb29yZGluYXRlcyBhbmQgcmUtcmVuZGVycyB0aGUgbWFwLlxuICAgICAqXG4gICAgICogQG1ldGhvZCBzZXRDb29yZGluYXRlc1xuICAgICAqIEBwYXJhbSB7QXJyYXk8QXJyYXk8bnVtYmVyPj59IGNvb3JkaW5hdGVzIEZvdXIgZ2VvZ3JhcGhpY2FsIGNvb3JkaW5hdGVzLFxuICAgICAqICAgcmVwcmVzZW50ZWQgYXMgYXJyYXlzIG9mIGxvbmdpdHVkZSBhbmQgbGF0aXR1ZGUgbnVtYmVycywgd2hpY2ggZGVmaW5lIHRoZSBjb3JuZXJzIG9mIHRoZSBjYW52YXMuXG4gICAgICogICBUaGUgY29vcmRpbmF0ZXMgc3RhcnQgYXQgdGhlIHRvcCBsZWZ0IGNvcm5lciBvZiB0aGUgY2FudmFzIGFuZCBwcm9jZWVkIGluIGNsb2Nrd2lzZSBvcmRlci5cbiAgICAgKiAgIFRoZXkgZG8gbm90IGhhdmUgdG8gcmVwcmVzZW50IGEgcmVjdGFuZ2xlLlxuICAgICAqIEByZXR1cm5zIHtDYW52YXNTb3VyY2V9IHRoaXNcbiAgICAgKi9cbiAgICAvLyBzZXRDb29yZGluYXRlcyBpbmhlcml0ZWQgZnJvbSBJbWFnZVNvdXJjZVxuXG4gICAgcHJlcGFyZSgpIHtcbiAgICAgICAgbGV0IHJlc2l6ZSA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5jYW52YXMud2lkdGggIT09IHRoaXMud2lkdGgpIHtcbiAgICAgICAgICAgIHRoaXMud2lkdGggPSB0aGlzLmNhbnZhcy53aWR0aDtcbiAgICAgICAgICAgIHJlc2l6ZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY2FudmFzLmhlaWdodCAhPT0gdGhpcy5oZWlnaHQpIHtcbiAgICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gdGhpcy5jYW52YXMuaGVpZ2h0O1xuICAgICAgICAgICAgcmVzaXplID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5faGFzSW52YWxpZERpbWVuc2lvbnMoKSkgcmV0dXJuO1xuXG4gICAgICAgIGlmICghdGhpcy50aWxlKSByZXR1cm47IC8vIG5vdCBlbm91Z2ggZGF0YSBmb3IgY3VycmVudCBwb3NpdGlvblxuICAgICAgICB0aGlzLl9wcmVwYXJlSW1hZ2UodGhpcy5tYXAucGFpbnRlci5nbCwgdGhpcy5jYW52YXMsIHJlc2l6ZSk7XG4gICAgfVxuXG4gICAgc2VyaWFsaXplKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogJ2NhbnZhcycsXG4gICAgICAgICAgICBjYW52YXM6IHRoaXMuY2FudmFzLFxuICAgICAgICAgICAgY29vcmRpbmF0ZXM6IHRoaXMuY29vcmRpbmF0ZXNcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBfaGFzSW52YWxpZERpbWVuc2lvbnMoKSB7XG4gICAgICAgIGZvciAoY29uc3QgeCBvZiBbdGhpcy5jYW52YXMud2lkdGgsIHRoaXMuY2FudmFzLmhlaWdodF0pIHtcbiAgICAgICAgICAgIGlmIChpc05hTih4KSB8fCB4IDw9IDApIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gQ2FudmFzU291cmNlO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBFdmVudGVkID0gcmVxdWlyZSgnLi4vdXRpbC9ldmVudGVkJyk7XG5jb25zdCB1dGlsID0gcmVxdWlyZSgnLi4vdXRpbC91dGlsJyk7XG5jb25zdCB3aW5kb3cgPSByZXF1aXJlKCcuLi91dGlsL3dpbmRvdycpO1xuY29uc3QgRVhURU5UID0gcmVxdWlyZSgnLi4vZGF0YS9leHRlbnQnKTtcblxuLyoqXG4gKiBBIHNvdXJjZSBjb250YWluaW5nIEdlb0pTT04uXG4gKiAoU2VlIHRoZSBbU3R5bGUgU3BlY2lmaWNhdGlvbl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtc3R5bGUtc3BlYy8jc291cmNlcy1nZW9qc29uKSBmb3IgZGV0YWlsZWQgZG9jdW1lbnRhdGlvbiBvZiBvcHRpb25zLilcbiAqXG4gKiBAaW50ZXJmYWNlIEdlb0pTT05Tb3VyY2VcbiAqIEBleGFtcGxlXG4gKlxuICogbWFwLmFkZFNvdXJjZSgnc29tZSBpZCcsIHtcbiAqICAgICB0eXBlOiAnZ2VvanNvbicsXG4gKiAgICAgZGF0YTogJ2h0dHBzOi8vZDJhZDZiNHVyN3l2cHEuY2xvdWRmcm9udC5uZXQvbmF0dXJhbGVhcnRoLTMuMy4wL25lXzEwbV9wb3J0cy5nZW9qc29uJ1xuICogfSk7XG4gKlxuICogQGV4YW1wbGVcbiAqIG1hcC5hZGRTb3VyY2UoJ3NvbWUgaWQnLCB7XG4gKiAgICB0eXBlOiAnZ2VvanNvbicsXG4gKiAgICBkYXRhOiB7XG4gKiAgICAgICAgXCJ0eXBlXCI6IFwiRmVhdHVyZUNvbGxlY3Rpb25cIixcbiAqICAgICAgICBcImZlYXR1cmVzXCI6IFt7XG4gKiAgICAgICAgICAgIFwidHlwZVwiOiBcIkZlYXR1cmVcIixcbiAqICAgICAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHt9LFxuICogICAgICAgICAgICBcImdlb21ldHJ5XCI6IHtcbiAqICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIlBvaW50XCIsXG4gKiAgICAgICAgICAgICAgICBcImNvb3JkaW5hdGVzXCI6IFtcbiAqICAgICAgICAgICAgICAgICAgICAtNzYuNTMwNjMyOTcyNzE3MjksXG4gKiAgICAgICAgICAgICAgICAgICAgMzkuMTgxNzQwNzc5OTQxMDhcbiAqICAgICAgICAgICAgICAgIF1cbiAqICAgICAgICAgICAgfVxuICogICAgICAgIH1dXG4gKiAgICB9XG4gKiB9KTtcbiAqXG4gKiBAZXhhbXBsZVxuICogbWFwLmdldFNvdXJjZSgnc29tZSBpZCcpLnNldERhdGEoe1xuICogICBcInR5cGVcIjogXCJGZWF0dXJlQ29sbGVjdGlvblwiLFxuICogICBcImZlYXR1cmVzXCI6IFt7XG4gKiAgICAgICBcInR5cGVcIjogXCJGZWF0dXJlXCIsXG4gKiAgICAgICBcInByb3BlcnRpZXNcIjogeyBcIm5hbWVcIjogXCJOdWxsIElzbGFuZFwiIH0sXG4gKiAgICAgICBcImdlb21ldHJ5XCI6IHtcbiAqICAgICAgICAgICBcInR5cGVcIjogXCJQb2ludFwiLFxuICogICAgICAgICAgIFwiY29vcmRpbmF0ZXNcIjogWyAwLCAwIF1cbiAqICAgICAgIH1cbiAqICAgfV1cbiAqIH0pO1xuICogQHNlZSBbRHJhdyBHZW9KU09OIHBvaW50c10oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9nZW9qc29uLW1hcmtlcnMvKVxuICogQHNlZSBbQWRkIGEgR2VvSlNPTiBsaW5lXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2dlb2pzb24tbGluZS8pXG4gKiBAc2VlIFtDcmVhdGUgYSBoZWF0bWFwIGZyb20gcG9pbnRzXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2hlYXRtYXAvKVxuICovXG5jbGFzcyBHZW9KU09OU291cmNlIGV4dGVuZHMgRXZlbnRlZCB7XG5cbiAgICBjb25zdHJ1Y3RvcihpZCwgb3B0aW9ucywgZGlzcGF0Y2hlciwgZXZlbnRlZFBhcmVudCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgdGhpcy5pZCA9IGlkO1xuXG4gICAgICAgIC8vIGB0eXBlYCBpcyBhIHByb3BlcnR5IHJhdGhlciB0aGFuIGEgY29uc3RhbnQgdG8gbWFrZSBpdCBlYXN5IGZvciAzcmRcbiAgICAgICAgLy8gcGFydGllcyB0byB1c2UgR2VvSlNPTlNvdXJjZSB0byBidWlsZCB0aGVpciBvd24gc291cmNlIHR5cGVzLlxuICAgICAgICB0aGlzLnR5cGUgPSAnZ2VvanNvbic7XG5cbiAgICAgICAgdGhpcy5taW56b29tID0gMDtcbiAgICAgICAgdGhpcy5tYXh6b29tID0gMTg7XG4gICAgICAgIHRoaXMudGlsZVNpemUgPSA1MTI7XG4gICAgICAgIHRoaXMuaXNUaWxlQ2xpcHBlZCA9IHRydWU7XG4gICAgICAgIHRoaXMucmVwYXJzZU92ZXJzY2FsZWQgPSB0cnVlO1xuXG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlciA9IGRpc3BhdGNoZXI7XG4gICAgICAgIHRoaXMuc2V0RXZlbnRlZFBhcmVudChldmVudGVkUGFyZW50KTtcblxuICAgICAgICB0aGlzLl9kYXRhID0gb3B0aW9ucy5kYXRhO1xuXG4gICAgICAgIGlmIChvcHRpb25zLm1heHpvb20gIT09IHVuZGVmaW5lZCkgdGhpcy5tYXh6b29tID0gb3B0aW9ucy5tYXh6b29tO1xuICAgICAgICBpZiAob3B0aW9ucy50eXBlKSB0aGlzLnR5cGUgPSBvcHRpb25zLnR5cGU7XG5cbiAgICAgICAgY29uc3Qgc2NhbGUgPSBFWFRFTlQgLyB0aGlzLnRpbGVTaXplO1xuXG4gICAgICAgIC8vIHNlbnQgdG8gdGhlIHdvcmtlciwgYWxvbmcgd2l0aCBgdXJsOiAuLi5gIG9yIGBkYXRhOiBsaXRlcmFsIGdlb2pzb25gLFxuICAgICAgICAvLyBzbyB0aGF0IGl0IGNhbiBsb2FkL3BhcnNlL2luZGV4IHRoZSBnZW9qc29uIGRhdGFcbiAgICAgICAgLy8gZXh0ZW5kaW5nIHdpdGggYG9wdGlvbnMud29ya2VyT3B0aW9uc2AgaGVscHMgdG8gbWFrZSBpdCBlYXN5IGZvclxuICAgICAgICAvLyB0aGlyZC1wYXJ0eSBzb3VyY2VzIHRvIGhhY2svcmV1c2UgR2VvSlNPTlNvdXJjZS5cbiAgICAgICAgdGhpcy53b3JrZXJPcHRpb25zID0gdXRpbC5leHRlbmQoe1xuICAgICAgICAgICAgc291cmNlOiB0aGlzLmlkLFxuICAgICAgICAgICAgY2x1c3Rlcjogb3B0aW9ucy5jbHVzdGVyIHx8IGZhbHNlLFxuICAgICAgICAgICAgZ2VvanNvblZ0T3B0aW9uczoge1xuICAgICAgICAgICAgICAgIGJ1ZmZlcjogKG9wdGlvbnMuYnVmZmVyICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmJ1ZmZlciA6IDEyOCkgKiBzY2FsZSxcbiAgICAgICAgICAgICAgICB0b2xlcmFuY2U6IChvcHRpb25zLnRvbGVyYW5jZSAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy50b2xlcmFuY2UgOiAwLjM3NSkgKiBzY2FsZSxcbiAgICAgICAgICAgICAgICBleHRlbnQ6IEVYVEVOVCxcbiAgICAgICAgICAgICAgICBtYXhab29tOiB0aGlzLm1heHpvb21cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzdXBlcmNsdXN0ZXJPcHRpb25zOiB7XG4gICAgICAgICAgICAgICAgbWF4Wm9vbTogTWF0aC5taW4ob3B0aW9ucy5jbHVzdGVyTWF4Wm9vbSwgdGhpcy5tYXh6b29tIC0gMSkgfHwgKHRoaXMubWF4em9vbSAtIDEpLFxuICAgICAgICAgICAgICAgIGV4dGVudDogRVhURU5ULFxuICAgICAgICAgICAgICAgIHJhZGl1czogKG9wdGlvbnMuY2x1c3RlclJhZGl1cyB8fCA1MCkgKiBzY2FsZSxcbiAgICAgICAgICAgICAgICBsb2c6IGZhbHNlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIG9wdGlvbnMud29ya2VyT3B0aW9ucyk7XG4gICAgfVxuXG4gICAgbG9hZCgpIHtcbiAgICAgICAgdGhpcy5maXJlKCdkYXRhbG9hZGluZycsIHtkYXRhVHlwZTogJ3NvdXJjZSd9KTtcbiAgICAgICAgdGhpcy5fdXBkYXRlV29ya2VyRGF0YSgoZXJyKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maXJlKCdlcnJvcicsIHtlcnJvcjogZXJyfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5maXJlKCdkYXRhJywge2RhdGFUeXBlOiAnc291cmNlJ30pO1xuICAgICAgICAgICAgdGhpcy5maXJlKCdzb3VyY2UubG9hZCcpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvbkFkZChtYXApIHtcbiAgICAgICAgdGhpcy5sb2FkKCk7XG4gICAgICAgIHRoaXMubWFwID0gbWFwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIEdlb0pTT04gZGF0YSBhbmQgcmUtcmVuZGVycyB0aGUgbWFwLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R8c3RyaW5nfSBkYXRhIEEgR2VvSlNPTiBkYXRhIG9iamVjdCBvciBhIFVSTCB0byBvbmUuIFRoZSBsYXR0ZXIgaXMgcHJlZmVyYWJsZSBpbiB0aGUgY2FzZSBvZiBsYXJnZSBHZW9KU09OIGZpbGVzLlxuICAgICAqIEByZXR1cm5zIHtHZW9KU09OU291cmNlfSB0aGlzXG4gICAgICovXG4gICAgc2V0RGF0YShkYXRhKSB7XG4gICAgICAgIHRoaXMuX2RhdGEgPSBkYXRhO1xuXG4gICAgICAgIHRoaXMuZmlyZSgnZGF0YWxvYWRpbmcnLCB7ZGF0YVR5cGU6ICdzb3VyY2UnfSk7XG4gICAgICAgIHRoaXMuX3VwZGF0ZVdvcmtlckRhdGEoKGVycikgPT4ge1xuICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZpcmUoJ2Vycm9yJywgeyBlcnJvcjogZXJyIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5maXJlKCdkYXRhJywge2RhdGFUeXBlOiAnc291cmNlJ30pO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIFJlc3BvbnNpYmxlIGZvciBpbnZva2luZyBXb3JrZXJTb3VyY2UncyBnZW9qc29uLmxvYWREYXRhIHRhcmdldCwgd2hpY2hcbiAgICAgKiBoYW5kbGVzIGxvYWRpbmcgdGhlIGdlb2pzb24gZGF0YSBhbmQgcHJlcGFyaW5nIHRvIHNlcnZlIGl0IHVwIGFzIHRpbGVzLFxuICAgICAqIHVzaW5nIGdlb2pzb24tdnQgb3Igc3VwZXJjbHVzdGVyIGFzIGFwcHJvcHJpYXRlLlxuICAgICAqL1xuICAgIF91cGRhdGVXb3JrZXJEYXRhKGNhbGxiYWNrKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB1dGlsLmV4dGVuZCh7fSwgdGhpcy53b3JrZXJPcHRpb25zKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuX2RhdGE7XG4gICAgICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIG9wdGlvbnMudXJsID0gcmVzb2x2ZVVSTChkYXRhKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG9wdGlvbnMuZGF0YSA9IEpTT04uc3RyaW5naWZ5KGRhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdGFyZ2V0IHt0aGlzLnR5cGV9LmxvYWREYXRhIHJhdGhlciB0aGFuIGxpdGVyYWxseSBnZW9qc29uLmxvYWREYXRhLFxuICAgICAgICAvLyBzbyB0aGF0IG90aGVyIGdlb2pzb24tbGlrZSBzb3VyY2UgdHlwZXMgY2FuIGVhc2lseSByZXVzZSB0aGlzXG4gICAgICAgIC8vIGltcGxlbWVudGF0aW9uXG4gICAgICAgIHRoaXMud29ya2VySUQgPSB0aGlzLmRpc3BhdGNoZXIuc2VuZChgJHt0aGlzLnR5cGV9LmxvYWREYXRhYCwgb3B0aW9ucywgKGVycikgPT4ge1xuICAgICAgICAgICAgdGhpcy5fbG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG5cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbG9hZFRpbGUodGlsZSwgY2FsbGJhY2spIHtcbiAgICAgICAgY29uc3Qgb3ZlcnNjYWxpbmcgPSB0aWxlLmNvb3JkLnogPiB0aGlzLm1heHpvb20gPyBNYXRoLnBvdygyLCB0aWxlLmNvb3JkLnogLSB0aGlzLm1heHpvb20pIDogMTtcbiAgICAgICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgICAgICAgdWlkOiB0aWxlLnVpZCxcbiAgICAgICAgICAgIGNvb3JkOiB0aWxlLmNvb3JkLFxuICAgICAgICAgICAgem9vbTogdGlsZS5jb29yZC56LFxuICAgICAgICAgICAgbWF4Wm9vbTogdGhpcy5tYXh6b29tLFxuICAgICAgICAgICAgdGlsZVNpemU6IHRoaXMudGlsZVNpemUsXG4gICAgICAgICAgICBzb3VyY2U6IHRoaXMuaWQsXG4gICAgICAgICAgICBvdmVyc2NhbGluZzogb3ZlcnNjYWxpbmcsXG4gICAgICAgICAgICBhbmdsZTogdGhpcy5tYXAudHJhbnNmb3JtLmFuZ2xlLFxuICAgICAgICAgICAgcGl0Y2g6IHRoaXMubWFwLnRyYW5zZm9ybS5waXRjaCxcbiAgICAgICAgICAgIHNob3dDb2xsaXNpb25Cb3hlczogdGhpcy5tYXAuc2hvd0NvbGxpc2lvbkJveGVzXG4gICAgICAgIH07XG5cbiAgICAgICAgdGlsZS53b3JrZXJJRCA9IHRoaXMuZGlzcGF0Y2hlci5zZW5kKCdsb2FkVGlsZScsIHBhcmFtcywgKGVyciwgZGF0YSkgPT4ge1xuXG4gICAgICAgICAgICB0aWxlLnVubG9hZFZlY3RvckRhdGEoKTtcblxuICAgICAgICAgICAgaWYgKHRpbGUuYWJvcnRlZClcbiAgICAgICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGlsZS5sb2FkVmVjdG9yRGF0YShkYXRhLCB0aGlzLm1hcC5wYWludGVyKTtcblxuICAgICAgICAgICAgaWYgKHRpbGUucmVkb1doZW5Eb25lKSB7XG4gICAgICAgICAgICAgICAgdGlsZS5yZWRvV2hlbkRvbmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aWxlLnJlZG9QbGFjZW1lbnQodGhpcyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsKTtcblxuICAgICAgICB9LCB0aGlzLndvcmtlcklEKTtcbiAgICB9XG5cbiAgICBhYm9ydFRpbGUodGlsZSkge1xuICAgICAgICB0aWxlLmFib3J0ZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIHVubG9hZFRpbGUodGlsZSkge1xuICAgICAgICB0aWxlLnVubG9hZFZlY3RvckRhdGEoKTtcbiAgICAgICAgdGhpcy5kaXNwYXRjaGVyLnNlbmQoJ3JlbW92ZVRpbGUnLCB7IHVpZDogdGlsZS51aWQsIHR5cGU6IHRoaXMudHlwZSwgc291cmNlOiB0aGlzLmlkIH0sICgpID0+IHt9LCB0aWxlLndvcmtlcklEKTtcbiAgICB9XG5cbiAgICBvblJlbW92ZSgpIHtcbiAgICAgICAgdGhpcy5kaXNwYXRjaGVyLmJyb2FkY2FzdCgncmVtb3ZlU291cmNlJywgeyB0eXBlOiB0aGlzLnR5cGUsIHNvdXJjZTogdGhpcy5pZCB9LCAoKSA9PiB7fSk7XG4gICAgfVxuXG4gICAgc2VyaWFsaXplKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgICAgICAgZGF0YTogdGhpcy5fZGF0YVxuICAgICAgICB9O1xuICAgIH1cbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVVSTCh1cmwpIHtcbiAgICBjb25zdCBhID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICBhLmhyZWYgPSB1cmw7XG4gICAgcmV0dXJuIGEuaHJlZjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBHZW9KU09OU291cmNlO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBhamF4ID0gcmVxdWlyZSgnLi4vdXRpbC9hamF4Jyk7XG5jb25zdCByZXdpbmQgPSByZXF1aXJlKCdnZW9qc29uLXJld2luZCcpO1xuY29uc3QgR2VvSlNPTldyYXBwZXIgPSByZXF1aXJlKCcuL2dlb2pzb25fd3JhcHBlcicpO1xuY29uc3QgdnRwYmYgPSByZXF1aXJlKCd2dC1wYmYnKTtcbmNvbnN0IHN1cGVyY2x1c3RlciA9IHJlcXVpcmUoJ3N1cGVyY2x1c3RlcicpO1xuY29uc3QgZ2VvanNvbnZ0ID0gcmVxdWlyZSgnZ2VvanNvbi12dCcpO1xuXG5jb25zdCBWZWN0b3JUaWxlV29ya2VyU291cmNlID0gcmVxdWlyZSgnLi92ZWN0b3JfdGlsZV93b3JrZXJfc291cmNlJyk7XG5cbi8qKlxuICogVGhlIHtAbGluayBXb3JrZXJTb3VyY2V9IGltcGxlbWVudGF0aW9uIHRoYXQgc3VwcG9ydHMge0BsaW5rIEdlb0pTT05Tb3VyY2V9LlxuICogVGhpcyBjbGFzcyBpcyBkZXNpZ25lZCB0byBiZSBlYXNpbHkgcmV1c2VkIHRvIHN1cHBvcnQgY3VzdG9tIHNvdXJjZSB0eXBlc1xuICogZm9yIGRhdGEgZm9ybWF0cyB0aGF0IGNhbiBiZSBwYXJzZWQvY29udmVydGVkIGludG8gYW4gaW4tbWVtb3J5IEdlb0pTT05cbiAqIHJlcHJlc2VudGF0aW9uLiAgVG8gZG8gc28sIGNyZWF0ZSBpdCB3aXRoXG4gKiBgbmV3IEdlb0pTT05Xb3JrZXJTb3VyY2UoYWN0b3IsIGxheWVySW5kZXgsIGN1c3RvbUxvYWRHZW9KU09ORnVuY3Rpb24pYC4gIEZvciBhIGZ1bGwgZXhhbXBsZSwgc2VlIFttYXBib3gtZ2wtdG9wb2pzb25dKGh0dHBzOi8vZ2l0aHViLmNvbS9kZXZlbG9wbWVudHNlZWQvbWFwYm94LWdsLXRvcG9qc29uKS5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBHZW9KU09OV29ya2VyU291cmNlIGV4dGVuZHMgVmVjdG9yVGlsZVdvcmtlclNvdXJjZSB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2xvYWRHZW9KU09OXSBPcHRpb25hbCBtZXRob2QgZm9yIGN1c3RvbSBsb2FkaW5nL3BhcnNpbmcgb2YgR2VvSlNPTiBiYXNlZCBvbiBwYXJhbWV0ZXJzIHBhc3NlZCBmcm9tIHRoZSBtYWluLXRocmVhZCBTb3VyY2UuICBTZWUge0BsaW5rIEdlb0pTT05Xb3JrZXJTb3VyY2UjbG9hZEdlb0pTT059LlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yIChhY3RvciwgbGF5ZXJJbmRleCwgbG9hZEdlb0pTT04pIHtcbiAgICAgICAgc3VwZXIoYWN0b3IsIGxheWVySW5kZXgpO1xuICAgICAgICBpZiAobG9hZEdlb0pTT04pIHtcbiAgICAgICAgICAgIHRoaXMubG9hZEdlb0pTT04gPSBsb2FkR2VvSlNPTjtcbiAgICAgICAgfVxuICAgICAgICAvLyBvYmplY3QgbWFwcGluZyBzb3VyY2UgaWRzIHRvIGdlb2pzb24tdnQtbGlrZSB0aWxlIGluZGV4ZXNcbiAgICAgICAgdGhpcy5fZ2VvSlNPTkluZGV4ZXMgPSB7fTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZWUge0BsaW5rIFZlY3RvclRpbGVXb3JrZXJTb3VyY2UjbG9hZFRpbGV9LlxuICAgICAqL1xuICAgIGxvYWRWZWN0b3JEYXRhKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgICAgICAgY29uc3Qgc291cmNlID0gcGFyYW1zLnNvdXJjZSxcbiAgICAgICAgICAgIGNvb3JkID0gcGFyYW1zLmNvb3JkO1xuXG4gICAgICAgIGlmICghdGhpcy5fZ2VvSlNPTkluZGV4ZXNbc291cmNlXSkge1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIG51bGwpOyAgLy8gd2UgY291bGRuJ3QgbG9hZCB0aGUgZmlsZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZ2VvSlNPTlRpbGUgPSB0aGlzLl9nZW9KU09OSW5kZXhlc1tzb3VyY2VdLmdldFRpbGUoTWF0aC5taW4oY29vcmQueiwgcGFyYW1zLm1heFpvb20pLCBjb29yZC54LCBjb29yZC55KTtcbiAgICAgICAgaWYgKCFnZW9KU09OVGlsZSkge1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIG51bGwpOyAvLyBub3RoaW5nIGluIHRoZSBnaXZlbiB0aWxlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBnZW9qc29uV3JhcHBlciA9IG5ldyBHZW9KU09OV3JhcHBlcihnZW9KU09OVGlsZS5mZWF0dXJlcyk7XG4gICAgICAgIGdlb2pzb25XcmFwcGVyLm5hbWUgPSAnX2dlb2pzb25UaWxlTGF5ZXInO1xuICAgICAgICBsZXQgcGJmID0gdnRwYmYoeyBsYXllcnM6IHsgJ19nZW9qc29uVGlsZUxheWVyJzogZ2VvanNvbldyYXBwZXIgfX0pO1xuICAgICAgICBpZiAocGJmLmJ5dGVPZmZzZXQgIT09IDAgfHwgcGJmLmJ5dGVMZW5ndGggIT09IHBiZi5idWZmZXIuYnl0ZUxlbmd0aCkge1xuICAgICAgICAgICAgLy8gQ29tcGF0aWJpbGl0eSB3aXRoIG5vZGUgQnVmZmVyIChodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L3BiZi9pc3N1ZXMvMzUpXG4gICAgICAgICAgICBwYmYgPSBuZXcgVWludDhBcnJheShwYmYpO1xuICAgICAgICB9XG4gICAgICAgIGdlb2pzb25XcmFwcGVyLnJhd0RhdGEgPSBwYmYuYnVmZmVyO1xuICAgICAgICBjYWxsYmFjayhudWxsLCBnZW9qc29uV3JhcHBlcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmV0Y2hlcyAoaWYgYXBwcm9wcmlhdGUpLCBwYXJzZXMsIGFuZCBpbmRleCBnZW9qc29uIGRhdGEgaW50byB0aWxlcy4gVGhpc1xuICAgICAqIHByZXBhcmF0b3J5IG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBiZWZvcmUge0BsaW5rIEdlb0pTT05Xb3JrZXJTb3VyY2UjbG9hZFRpbGV9XG4gICAgICogY2FuIGNvcnJlY3RseSBzZXJ2ZSB1cCB0aWxlcy5cbiAgICAgKlxuICAgICAqIERlZmVycyB0byB7QGxpbmsgR2VvSlNPTldvcmtlclNvdXJjZSNsb2FkR2VvSlNPTn0gZm9yIHRoZSBmZXRjaGluZy9wYXJzaW5nLFxuICAgICAqIGV4cGVjdGluZyBgY2FsbGJhY2soZXJyb3IsIGRhdGEpYCB0byBiZSBjYWxsZWQgd2l0aCBlaXRoZXIgYW4gZXJyb3Igb3IgYVxuICAgICAqIHBhcnNlZCBHZW9KU09OIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5zb3VyY2UgVGhlIGlkIG9mIHRoZSBzb3VyY2UuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICAgKi9cbiAgICBsb2FkRGF0YShwYXJhbXMsIGNhbGxiYWNrKSB7XG4gICAgICAgIGNvbnN0IGhhbmRsZURhdGEgPSBmdW5jdGlvbihlcnIsIGRhdGEpIHtcbiAgICAgICAgICAgIGlmIChlcnIpIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBkYXRhICE9ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBFcnJvcihcIklucHV0IGRhdGEgaXMgbm90IGEgdmFsaWQgR2VvSlNPTiBvYmplY3QuXCIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJld2luZChkYXRhLCB0cnVlKTtcbiAgICAgICAgICAgIHRoaXMuX2luZGV4RGF0YShkYXRhLCBwYXJhbXMsIChlcnIsIGluZGV4ZWQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7IHJldHVybiBjYWxsYmFjayhlcnIpOyB9XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2VvSlNPTkluZGV4ZXNbcGFyYW1zLnNvdXJjZV0gPSBpbmRleGVkO1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0uYmluZCh0aGlzKTtcblxuICAgICAgICB0aGlzLmxvYWRHZW9KU09OKHBhcmFtcywgaGFuZGxlRGF0YSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmV0Y2ggYW5kIHBhcnNlIEdlb0pTT04gYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBwYXJhbXMuICBDYWxscyBgY2FsbGJhY2tgXG4gICAgICogd2l0aCBgKGVyciwgZGF0YSlgLCB3aGVyZSBgZGF0YWAgaXMgYSBwYXJzZWQgR2VvSlNPTiBvYmplY3QuXG4gICAgICpcbiAgICAgKiBHZW9KU09OIGlzIGxvYWRlZCBhbmQgcGFyc2VkIGZyb20gYHBhcmFtcy51cmxgIGlmIGl0IGV4aXN0cywgb3IgZWxzZVxuICAgICAqIGV4cGVjdGVkIGFzIGEgbGl0ZXJhbCAoc3RyaW5nIG9yIG9iamVjdCkgYHBhcmFtcy5kYXRhYC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3BhcmFtcy51cmxdIEEgVVJMIHRvIHRoZSByZW1vdGUgR2VvSlNPTiBkYXRhLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zLmRhdGFdIExpdGVyYWwgR2VvSlNPTiBkYXRhLiBNdXN0IGJlIHByb3ZpZGVkIGlmIGBwYXJhbXMudXJsYCBpcyBub3QuXG4gICAgICovXG4gICAgbG9hZEdlb0pTT04ocGFyYW1zLCBjYWxsYmFjaykge1xuICAgICAgICAvLyBCZWNhdXNlIG9mIHNhbWUgb3JpZ2luIGlzc3VlcywgdXJscyBtdXN0IGVpdGhlciBpbmNsdWRlIGFuIGV4cGxpY2l0XG4gICAgICAgIC8vIG9yaWdpbiBvciBhYnNvbHV0ZSBwYXRoLlxuICAgICAgICAvLyBpZTogL2Zvby9iYXIuanNvbiBvciBodHRwOi8vZXhhbXBsZS5jb20vYmFyLmpzb25cbiAgICAgICAgLy8gYnV0IG5vdCAuLi9mb28vYmFyLmpzb25cbiAgICAgICAgaWYgKHBhcmFtcy51cmwpIHtcbiAgICAgICAgICAgIGFqYXguZ2V0SlNPTihwYXJhbXMudXJsLCBjYWxsYmFjayk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHBhcmFtcy5kYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwgSlNPTi5wYXJzZShwYXJhbXMuZGF0YSkpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoXCJJbnB1dCBkYXRhIGlzIG5vdCBhIHZhbGlkIEdlb0pTT04gb2JqZWN0LlwiKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKFwiSW5wdXQgZGF0YSBpcyBub3QgYSB2YWxpZCBHZW9KU09OIG9iamVjdC5cIikpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVtb3ZlU291cmNlKHBhcmFtcykge1xuICAgICAgICBpZiAodGhpcy5fZ2VvSlNPTkluZGV4ZXNbcGFyYW1zLnNvdXJjZV0pIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9nZW9KU09OSW5kZXhlc1twYXJhbXMuc291cmNlXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluZGV4IHRoZSBkYXRhIHVzaW5nIGVpdGhlciBnZW9qc29uLXZ0IG9yIHN1cGVyY2x1c3RlclxuICAgICAqIEBwYXJhbSB7R2VvSlNPTn0gZGF0YVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgZm9yd2FyZGVkIGZyb20gbG9hZFRpbGUuXG4gICAgICogQHBhcmFtIHtjYWxsYmFja30gKGVyciwgaW5kZXhlZERhdGEpXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfaW5kZXhEYXRhKGRhdGEsIHBhcmFtcywgY2FsbGJhY2spIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChwYXJhbXMuY2x1c3Rlcikge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHN1cGVyY2x1c3RlcihwYXJhbXMuc3VwZXJjbHVzdGVyT3B0aW9ucykubG9hZChkYXRhLmZlYXR1cmVzKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIGdlb2pzb252dChkYXRhLCBwYXJhbXMuZ2VvanNvblZ0T3B0aW9ucykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IEdlb0pTT05Xb3JrZXJTb3VyY2U7XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IFBvaW50ID0gcmVxdWlyZSgncG9pbnQtZ2VvbWV0cnknKTtcbmNvbnN0IFZlY3RvclRpbGVGZWF0dXJlID0gcmVxdWlyZSgndmVjdG9yLXRpbGUnKS5WZWN0b3JUaWxlRmVhdHVyZTtcbmNvbnN0IEVYVEVOVCA9IHJlcXVpcmUoJy4uL2RhdGEvZXh0ZW50Jyk7XG5cbmNsYXNzIEZlYXR1cmVXcmFwcGVyIHtcblxuICAgIGNvbnN0cnVjdG9yKGZlYXR1cmUpIHtcbiAgICAgICAgdGhpcy50eXBlID0gZmVhdHVyZS50eXBlO1xuICAgICAgICBpZiAoZmVhdHVyZS50eXBlID09PSAxKSB7XG4gICAgICAgICAgICB0aGlzLnJhd0dlb21ldHJ5ID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZlYXR1cmUuZ2VvbWV0cnkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJhd0dlb21ldHJ5LnB1c2goW2ZlYXR1cmUuZ2VvbWV0cnlbaV1dKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmF3R2VvbWV0cnkgPSBmZWF0dXJlLmdlb21ldHJ5O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJvcGVydGllcyA9IGZlYXR1cmUudGFncztcbiAgICAgICAgdGhpcy5leHRlbnQgPSBFWFRFTlQ7XG4gICAgfVxuXG4gICAgbG9hZEdlb21ldHJ5KCkge1xuICAgICAgICBjb25zdCByaW5ncyA9IHRoaXMucmF3R2VvbWV0cnk7XG4gICAgICAgIHRoaXMuZ2VvbWV0cnkgPSBbXTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJpbmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCByaW5nID0gcmluZ3NbaV0sXG4gICAgICAgICAgICAgICAgbmV3UmluZyA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByaW5nLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgbmV3UmluZy5wdXNoKG5ldyBQb2ludChyaW5nW2pdWzBdLCByaW5nW2pdWzFdKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmdlb21ldHJ5LnB1c2gobmV3UmluZyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2VvbWV0cnk7XG4gICAgfVxuXG4gICAgYmJveCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmdlb21ldHJ5KSB0aGlzLmxvYWRHZW9tZXRyeSgpO1xuXG4gICAgICAgIGNvbnN0IHJpbmdzID0gdGhpcy5nZW9tZXRyeTtcbiAgICAgICAgbGV0IHgxID0gSW5maW5pdHksXG4gICAgICAgICAgICB4MiA9IC1JbmZpbml0eSxcbiAgICAgICAgICAgIHkxID0gSW5maW5pdHksXG4gICAgICAgICAgICB5MiA9IC1JbmZpbml0eTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJpbmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCByaW5nID0gcmluZ3NbaV07XG5cbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcmluZy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvb3JkID0gcmluZ1tqXTtcblxuICAgICAgICAgICAgICAgIHgxID0gTWF0aC5taW4oeDEsIGNvb3JkLngpO1xuICAgICAgICAgICAgICAgIHgyID0gTWF0aC5tYXgoeDIsIGNvb3JkLngpO1xuICAgICAgICAgICAgICAgIHkxID0gTWF0aC5taW4oeTEsIGNvb3JkLnkpO1xuICAgICAgICAgICAgICAgIHkyID0gTWF0aC5tYXgoeTIsIGNvb3JkLnkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFt4MSwgeTEsIHgyLCB5Ml07XG4gICAgfVxuXG4gICAgdG9HZW9KU09OKCkge1xuICAgICAgICBWZWN0b3JUaWxlRmVhdHVyZS5wcm90b3R5cGUudG9HZW9KU09OLmNhbGwodGhpcyk7XG4gICAgfVxufVxuXG4vLyBjb25mb3JtIHRvIHZlY3RvcnRpbGUgYXBpXG5jbGFzcyBHZW9KU09OV3JhcHBlciB7XG5cbiAgICBjb25zdHJ1Y3RvcihmZWF0dXJlcykge1xuICAgICAgICB0aGlzLmZlYXR1cmVzID0gZmVhdHVyZXM7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gZmVhdHVyZXMubGVuZ3RoO1xuICAgICAgICB0aGlzLmV4dGVudCA9IEVYVEVOVDtcbiAgICB9XG5cbiAgICBmZWF0dXJlKGkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBGZWF0dXJlV3JhcHBlcih0aGlzLmZlYXR1cmVzW2ldKTtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gR2VvSlNPTldyYXBwZXI7XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHV0aWwgPSByZXF1aXJlKCcuLi91dGlsL3V0aWwnKTtcbmNvbnN0IHdpbmRvdyA9IHJlcXVpcmUoJy4uL3V0aWwvd2luZG93Jyk7XG5jb25zdCBUaWxlQ29vcmQgPSByZXF1aXJlKCcuL3RpbGVfY29vcmQnKTtcbmNvbnN0IExuZ0xhdCA9IHJlcXVpcmUoJy4uL2dlby9sbmdfbGF0Jyk7XG5jb25zdCBQb2ludCA9IHJlcXVpcmUoJ3BvaW50LWdlb21ldHJ5Jyk7XG5jb25zdCBFdmVudGVkID0gcmVxdWlyZSgnLi4vdXRpbC9ldmVudGVkJyk7XG5jb25zdCBhamF4ID0gcmVxdWlyZSgnLi4vdXRpbC9hamF4Jyk7XG5jb25zdCBFWFRFTlQgPSByZXF1aXJlKCcuLi9kYXRhL2V4dGVudCcpO1xuY29uc3QgUmFzdGVyQm91bmRzQXJyYXkgPSByZXF1aXJlKCcuLi9kYXRhL3Jhc3Rlcl9ib3VuZHNfYXJyYXknKTtcbmNvbnN0IEJ1ZmZlciA9IHJlcXVpcmUoJy4uL2RhdGEvYnVmZmVyJyk7XG5jb25zdCBWZXJ0ZXhBcnJheU9iamVjdCA9IHJlcXVpcmUoJy4uL3JlbmRlci92ZXJ0ZXhfYXJyYXlfb2JqZWN0Jyk7XG5cbi8qKlxuICogQSBkYXRhIHNvdXJjZSBjb250YWluaW5nIGFuIGltYWdlLlxuICogKFNlZSB0aGUgW1N0eWxlIFNwZWNpZmljYXRpb25dKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLXN0eWxlLXNwZWMvI3NvdXJjZXMtaW1hZ2UpIGZvciBkZXRhaWxlZCBkb2N1bWVudGF0aW9uIG9mIG9wdGlvbnMuKVxuICpcbiAqIEBpbnRlcmZhY2UgSW1hZ2VTb3VyY2VcbiAqIEBleGFtcGxlXG4gKiAvLyBhZGQgdG8gbWFwXG4gKiBtYXAuYWRkU291cmNlKCdzb21lIGlkJywge1xuICogICAgdHlwZTogJ2ltYWdlJyxcbiAqICAgIHVybDogJ2h0dHBzOi8vd3d3Lm1hcGJveC5jb20vaW1hZ2VzL2Zvby5wbmcnLFxuICogICAgY29vcmRpbmF0ZXM6IFtcbiAqICAgICAgICBbLTc2LjU0LCAzOS4xOF0sXG4gKiAgICAgICAgWy03Ni41MiwgMzkuMThdLFxuICogICAgICAgIFstNzYuNTIsIDM5LjE3XSxcbiAqICAgICAgICBbLTc2LjU0LCAzOS4xN11cbiAqICAgIF1cbiAqIH0pO1xuICpcbiAqIC8vIHVwZGF0ZVxuICogdmFyIG15U291cmNlID0gbWFwLmdldFNvdXJjZSgnc29tZSBpZCcpO1xuICogbXlTb3VyY2Uuc2V0Q29vcmRpbmF0ZXMoW1xuICogICAgIFstNzYuNTQzMzU3MzcyMjgzOTQsIDM5LjE4NTc5OTA3MjI5NzQ4XSxcbiAqICAgICBbLTc2LjUyODAzNjU5NDM5MDg3LCAzOS4xODM4MzY0ODQ3NTg3XSxcbiAqICAgICBbLTc2LjUyOTUzODYzMTQzOTIsIDM5LjE3NjgzMzkyNTA3NjA2XSxcbiAqICAgICBbLTc2LjU0NTIwMjczMjA4NjE4LCAzOS4xNzg3NjM0NDEwNjY0Ml1cbiAqIF0pO1xuICpcbiAqIG1hcC5yZW1vdmVTb3VyY2UoJ3NvbWUgaWQnKTsgIC8vIHJlbW92ZVxuICogQHNlZSBbQWRkIGFuIGltYWdlXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2ltYWdlLW9uLWEtbWFwLylcbiAqL1xuY2xhc3MgSW1hZ2VTb3VyY2UgZXh0ZW5kcyBFdmVudGVkIHtcblxuICAgIGNvbnN0cnVjdG9yKGlkLCBvcHRpb25zLCBkaXNwYXRjaGVyLCBldmVudGVkUGFyZW50KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICAgICAgdGhpcy5kaXNwYXRjaGVyID0gZGlzcGF0Y2hlcjtcbiAgICAgICAgdGhpcy5jb29yZGluYXRlcyA9IG9wdGlvbnMuY29vcmRpbmF0ZXM7XG5cbiAgICAgICAgdGhpcy50eXBlID0gJ2ltYWdlJztcbiAgICAgICAgdGhpcy5taW56b29tID0gMDtcbiAgICAgICAgdGhpcy5tYXh6b29tID0gMjI7XG4gICAgICAgIHRoaXMudGlsZVNpemUgPSA1MTI7XG5cbiAgICAgICAgdGhpcy5zZXRFdmVudGVkUGFyZW50KGV2ZW50ZWRQYXJlbnQpO1xuXG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgfVxuXG4gICAgbG9hZCgpIHtcbiAgICAgICAgdGhpcy5maXJlKCdkYXRhbG9hZGluZycsIHtkYXRhVHlwZTogJ3NvdXJjZSd9KTtcblxuICAgICAgICB0aGlzLnVybCA9IHRoaXMub3B0aW9ucy51cmw7XG5cbiAgICAgICAgYWpheC5nZXRJbWFnZSh0aGlzLm9wdGlvbnMudXJsLCAoZXJyLCBpbWFnZSkgPT4ge1xuICAgICAgICAgICAgaWYgKGVycikgcmV0dXJuIHRoaXMuZmlyZSgnZXJyb3InLCB7ZXJyb3I6IGVycn0pO1xuXG4gICAgICAgICAgICB0aGlzLmltYWdlID0gaW1hZ2U7XG5cbiAgICAgICAgICAgIHRoaXMuX2ZpbmlzaExvYWRpbmcoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX2ZpbmlzaExvYWRpbmcoKSB7XG4gICAgICAgIHRoaXMuZmlyZSgnc291cmNlLmxvYWQnKTtcblxuICAgICAgICBpZiAodGhpcy5tYXApIHtcbiAgICAgICAgICAgIHRoaXMuc2V0Q29vcmRpbmF0ZXModGhpcy5jb29yZGluYXRlcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbkFkZChtYXApIHtcbiAgICAgICAgdGhpcy5sb2FkKCk7XG4gICAgICAgIHRoaXMubWFwID0gbWFwO1xuICAgICAgICBpZiAodGhpcy5pbWFnZSkge1xuICAgICAgICAgICAgdGhpcy5zZXRDb29yZGluYXRlcyh0aGlzLmNvb3JkaW5hdGVzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGltYWdlJ3MgY29vcmRpbmF0ZXMgYW5kIHJlLXJlbmRlcnMgdGhlIG1hcC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXk8QXJyYXk8bnVtYmVyPj59IGNvb3JkaW5hdGVzIEZvdXIgZ2VvZ3JhcGhpY2FsIGNvb3JkaW5hdGVzLFxuICAgICAqICAgcmVwcmVzZW50ZWQgYXMgYXJyYXlzIG9mIGxvbmdpdHVkZSBhbmQgbGF0aXR1ZGUgbnVtYmVycywgd2hpY2ggZGVmaW5lIHRoZSBjb3JuZXJzIG9mIHRoZSBpbWFnZS5cbiAgICAgKiAgIFRoZSBjb29yZGluYXRlcyBzdGFydCBhdCB0aGUgdG9wIGxlZnQgY29ybmVyIG9mIHRoZSBpbWFnZSBhbmQgcHJvY2VlZCBpbiBjbG9ja3dpc2Ugb3JkZXIuXG4gICAgICogICBUaGV5IGRvIG5vdCBoYXZlIHRvIHJlcHJlc2VudCBhIHJlY3RhbmdsZS5cbiAgICAgKiBAcmV0dXJucyB7SW1hZ2VTb3VyY2V9IHRoaXNcbiAgICAgKi9cbiAgICBzZXRDb29yZGluYXRlcyhjb29yZGluYXRlcykge1xuICAgICAgICB0aGlzLmNvb3JkaW5hdGVzID0gY29vcmRpbmF0ZXM7XG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIHdoaWNoIG1lcmNhdG9yIHRpbGUgaXMgc3VpdGFibGUgZm9yIHJlbmRlcmluZyB0aGUgdmlkZW8gaW5cbiAgICAgICAgLy8gYW5kIGNyZWF0ZSBhIGJ1ZmZlciB3aXRoIHRoZSBjb3JuZXIgY29vcmRpbmF0ZXMuIFRoZXNlIGNvb3JkaW5hdGVzXG4gICAgICAgIC8vIG1heSBiZSBvdXRzaWRlIHRoZSB0aWxlLCBiZWNhdXNlIHJhc3RlciB0aWxlcyBhcmVuJ3QgY2xpcHBlZCB3aGVuIHJlbmRlcmluZy5cblxuICAgICAgICBjb25zdCBtYXAgPSB0aGlzLm1hcDtcbiAgICAgICAgY29uc3QgY29ybmVyWjBDb29yZHMgPSBjb29yZGluYXRlcy5tYXAoKGNvb3JkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbWFwLnRyYW5zZm9ybS5sb2NhdGlvbkNvb3JkaW5hdGUoTG5nTGF0LmNvbnZlcnQoY29vcmQpKS56b29tVG8oMCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGNlbnRlckNvb3JkID0gdGhpcy5jZW50ZXJDb29yZCA9IHV0aWwuZ2V0Q29vcmRpbmF0ZXNDZW50ZXIoY29ybmVyWjBDb29yZHMpO1xuICAgICAgICBjZW50ZXJDb29yZC5jb2x1bW4gPSBNYXRoLnJvdW5kKGNlbnRlckNvb3JkLmNvbHVtbik7XG4gICAgICAgIGNlbnRlckNvb3JkLnJvdyA9IE1hdGgucm91bmQoY2VudGVyQ29vcmQucm93KTtcblxuICAgICAgICB0aGlzLm1pbnpvb20gPSB0aGlzLm1heHpvb20gPSBjZW50ZXJDb29yZC56b29tO1xuICAgICAgICB0aGlzLmNvb3JkID0gbmV3IFRpbGVDb29yZChjZW50ZXJDb29yZC56b29tLCBjZW50ZXJDb29yZC5jb2x1bW4sIGNlbnRlckNvb3JkLnJvdyk7XG4gICAgICAgIHRoaXMuX3RpbGVDb29yZHMgPSBjb3JuZXJaMENvb3Jkcy5tYXAoKGNvb3JkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB6b29tZWRDb29yZCA9IGNvb3JkLnpvb21UbyhjZW50ZXJDb29yZC56b29tKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUG9pbnQoXG4gICAgICAgICAgICAgICAgTWF0aC5yb3VuZCgoem9vbWVkQ29vcmQuY29sdW1uIC0gY2VudGVyQ29vcmQuY29sdW1uKSAqIEVYVEVOVCksXG4gICAgICAgICAgICAgICAgTWF0aC5yb3VuZCgoem9vbWVkQ29vcmQucm93IC0gY2VudGVyQ29vcmQucm93KSAqIEVYVEVOVCkpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmZpcmUoJ2RhdGEnLCB7ZGF0YVR5cGU6ICdzb3VyY2UnfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIF9zZXRUaWxlKHRpbGUpIHtcbiAgICAgICAgdGhpcy50aWxlID0gdGlsZTtcbiAgICAgICAgY29uc3QgbWF4SW50MTYgPSAzMjc2NztcbiAgICAgICAgY29uc3QgYXJyYXkgPSBuZXcgUmFzdGVyQm91bmRzQXJyYXkoKTtcbiAgICAgICAgYXJyYXkuZW1wbGFjZUJhY2sodGhpcy5fdGlsZUNvb3Jkc1swXS54LCB0aGlzLl90aWxlQ29vcmRzWzBdLnksIDAsIDApO1xuICAgICAgICBhcnJheS5lbXBsYWNlQmFjayh0aGlzLl90aWxlQ29vcmRzWzFdLngsIHRoaXMuX3RpbGVDb29yZHNbMV0ueSwgbWF4SW50MTYsIDApO1xuICAgICAgICBhcnJheS5lbXBsYWNlQmFjayh0aGlzLl90aWxlQ29vcmRzWzNdLngsIHRoaXMuX3RpbGVDb29yZHNbM10ueSwgMCwgbWF4SW50MTYpO1xuICAgICAgICBhcnJheS5lbXBsYWNlQmFjayh0aGlzLl90aWxlQ29vcmRzWzJdLngsIHRoaXMuX3RpbGVDb29yZHNbMl0ueSwgbWF4SW50MTYsIG1heEludDE2KTtcblxuICAgICAgICB0aGlzLnRpbGUuYnVja2V0cyA9IHt9O1xuXG4gICAgICAgIHRoaXMudGlsZS5ib3VuZHNCdWZmZXIgPSBCdWZmZXIuZnJvbVN0cnVjdEFycmF5KGFycmF5LCBCdWZmZXIuQnVmZmVyVHlwZS5WRVJURVgpO1xuICAgICAgICB0aGlzLnRpbGUuYm91bmRzVkFPID0gbmV3IFZlcnRleEFycmF5T2JqZWN0KCk7XG4gICAgfVxuXG4gICAgcHJlcGFyZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnRpbGUgfHwgIXRoaXMuaW1hZ2UpIHJldHVybjtcbiAgICAgICAgdGhpcy5fcHJlcGFyZUltYWdlKHRoaXMubWFwLnBhaW50ZXIuZ2wsIHRoaXMuaW1hZ2UpO1xuICAgIH1cblxuICAgIF9wcmVwYXJlSW1hZ2UoZ2wsIGltYWdlLCByZXNpemUpIHtcbiAgICAgICAgaWYgKHRoaXMudGlsZS5zdGF0ZSAhPT0gJ2xvYWRlZCcpIHtcbiAgICAgICAgICAgIHRoaXMudGlsZS5zdGF0ZSA9ICdsb2FkZWQnO1xuICAgICAgICAgICAgdGhpcy50aWxlLnRleHR1cmUgPSBnbC5jcmVhdGVUZXh0dXJlKCk7XG4gICAgICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCB0aGlzLnRpbGUudGV4dHVyZSk7XG4gICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9TLCBnbC5DTEFNUF9UT19FREdFKTtcbiAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1QsIGdsLkNMQU1QX1RPX0VER0UpO1xuICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01JTl9GSUxURVIsIGdsLkxJTkVBUik7XG4gICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgZ2wuTElORUFSKTtcbiAgICAgICAgICAgIGdsLnRleEltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgZ2wuUkdCQSwgZ2wuUkdCQSwgZ2wuVU5TSUdORURfQllURSwgaW1hZ2UpO1xuICAgICAgICB9IGVsc2UgaWYgKHJlc2l6ZSkge1xuICAgICAgICAgICAgZ2wudGV4SW1hZ2UyRChnbC5URVhUVVJFXzJELCAwLCBnbC5SR0JBLCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLCBpbWFnZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaW1hZ2UgaW5zdGFuY2VvZiB3aW5kb3cuSFRNTFZpZGVvRWxlbWVudCB8fCBpbWFnZSBpbnN0YW5jZW9mIHdpbmRvdy5JbWFnZURhdGEgfHwgaW1hZ2UgaW5zdGFuY2VvZiB3aW5kb3cuSFRNTENhbnZhc0VsZW1lbnQpIHtcbiAgICAgICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRoaXMudGlsZS50ZXh0dXJlKTtcbiAgICAgICAgICAgIGdsLnRleFN1YkltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgMCwgMCwgZ2wuUkdCQSwgZ2wuVU5TSUdORURfQllURSwgaW1hZ2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbG9hZFRpbGUodGlsZSwgY2FsbGJhY2spIHtcbiAgICAgICAgLy8gV2UgaGF2ZSBhIHNpbmdsZSB0aWxlIC0tIHdob29zZSBjb29yZGluYXRlcyBhcmUgdGhpcy5jb29yZCAtLSB0aGF0XG4gICAgICAgIC8vIGNvdmVycyB0aGUgaW1hZ2Ugd2Ugd2FudCB0byByZW5kZXIuICBJZiB0aGF0J3MgdGhlIG9uZSBiZWluZ1xuICAgICAgICAvLyByZXF1ZXN0ZWQsIHNldCBpdCB1cCB3aXRoIHRoZSBpbWFnZTsgb3RoZXJ3aXNlLCBtYXJrIHRoZSB0aWxlIGFzXG4gICAgICAgIC8vIGBlcnJvcmVkYCB0byBpbmRpY2F0ZSB0aGF0IHdlIGhhdmUgbm8gZGF0YSBmb3IgaXQuXG4gICAgICAgIGlmICh0aGlzLmNvb3JkICYmIHRoaXMuY29vcmQudG9TdHJpbmcoKSA9PT0gdGlsZS5jb29yZC50b1N0cmluZygpKSB7XG4gICAgICAgICAgICB0aGlzLl9zZXRUaWxlKHRpbGUpO1xuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aWxlLnN0YXRlID0gJ2Vycm9yZWQnO1xuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiAnaW1hZ2UnLFxuICAgICAgICAgICAgdXJsczogdGhpcy51cmwsXG4gICAgICAgICAgICBjb29yZGluYXRlczogdGhpcy5jb29yZGluYXRlc1xuICAgICAgICB9O1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBJbWFnZVNvdXJjZTtcbiIsIid1c2Ugc3RyaWN0JztcbmNvbnN0IHV0aWwgPSByZXF1aXJlKCcuLi91dGlsL3V0aWwnKTtcbmNvbnN0IGFqYXggPSByZXF1aXJlKCcuLi91dGlsL2FqYXgnKTtcbmNvbnN0IGJyb3dzZXIgPSByZXF1aXJlKCcuLi91dGlsL2Jyb3dzZXInKTtcbmNvbnN0IG5vcm1hbGl6ZVVSTCA9IHJlcXVpcmUoJy4uL3V0aWwvbWFwYm94Jykubm9ybWFsaXplU291cmNlVVJMO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gICAgY29uc3QgbG9hZGVkID0gZnVuY3Rpb24oZXJyLCB0aWxlSlNPTikge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHV0aWwucGljayh0aWxlSlNPTiwgWyd0aWxlcycsICdtaW56b29tJywgJ21heHpvb20nLCAnYXR0cmlidXRpb24nXSk7XG5cbiAgICAgICAgaWYgKHRpbGVKU09OLnZlY3Rvcl9sYXllcnMpIHtcbiAgICAgICAgICAgIHJlc3VsdC52ZWN0b3JMYXllcnMgPSB0aWxlSlNPTi52ZWN0b3JfbGF5ZXJzO1xuICAgICAgICAgICAgcmVzdWx0LnZlY3RvckxheWVySWRzID0gcmVzdWx0LnZlY3RvckxheWVycy5tYXAoKGxheWVyKSA9PiB7IHJldHVybiBsYXllci5pZDsgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjYWxsYmFjayhudWxsLCByZXN1bHQpO1xuICAgIH07XG5cbiAgICBpZiAob3B0aW9ucy51cmwpIHtcbiAgICAgICAgYWpheC5nZXRKU09OKG5vcm1hbGl6ZVVSTChvcHRpb25zLnVybCksIGxvYWRlZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgYnJvd3Nlci5mcmFtZShsb2FkZWQuYmluZChudWxsLCBudWxsLCBvcHRpb25zKSk7XG4gICAgfVxufTtcblxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBFWFRFTlQgPSByZXF1aXJlKCcuLi9kYXRhL2V4dGVudCcpO1xuXG4vKipcbiAqIENvbnZlcnRzIGEgcGl4ZWwgdmFsdWUgYXQgYSB0aGUgZ2l2ZW4gem9vbSBsZXZlbCB0byB0aWxlIHVuaXRzLlxuICpcbiAqIFRoZSBzaGFkZXJzIG1vc3RseSBjYWxjdWxhdGUgZXZlcnl0aGluZyBpbiB0aWxlIHVuaXRzIHNvIHN0eWxlXG4gKiBwcm9wZXJ0aWVzIG5lZWQgdG8gYmUgY29udmVydGVkIGZyb20gcGl4ZWxzIHRvIHRpbGUgdW5pdHMgdXNpbmcgdGhpcy5cbiAqXG4gKiBGb3IgZXhhbXBsZSwgYSB0cmFuc2xhdGlvbiBieSAzMCBwaXhlbHMgYXQgem9vbSA2LjUgd2lsbCBiZSBhXG4gKiB0cmFuc2xhdGlvbiBieSBwaXhlbHNUb1RpbGVVbml0cygzMCwgNi41KSB0aWxlIHVuaXRzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB0aWxlIGEge1RpbGUgb2JqZWN0fSB3aWxsIHdvcmsgd2VsbCwgYnV0IGFueSBvYmplY3QgdGhhdCBmb2xsb3dzIHRoZSBmb3JtYXQge2Nvb3JkOiB7VGlsZUNvcmQgb2JqZWN0fSwgdGlsZVNpemU6IHtudW1iZXJ9fSB3aWxsIHdvcmtcbiAqIEBwYXJhbSB7bnVtYmVyfSBwaXhlbFZhbHVlXG4gKiBAcGFyYW0ge251bWJlcn0gelxuICogQHJldHVybnMge251bWJlcn0gdmFsdWUgaW4gdGlsZSB1bml0c1xuICogQHByaXZhdGVcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbih0aWxlLCBwaXhlbFZhbHVlLCB6KSB7XG4gICAgcmV0dXJuIHBpeGVsVmFsdWUgKiAoRVhURU5UIC8gKHRpbGUudGlsZVNpemUgKiBNYXRoLnBvdygyLCB6IC0gdGlsZS5jb29yZC56KSkpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbmNvbnN0IFRpbGVDb29yZCA9IHJlcXVpcmUoJy4vdGlsZV9jb29yZCcpO1xuXG5leHBvcnRzLnJlbmRlcmVkID0gZnVuY3Rpb24oc291cmNlQ2FjaGUsIHN0eWxlTGF5ZXJzLCBxdWVyeUdlb21ldHJ5LCBwYXJhbXMsIHpvb20sIGJlYXJpbmcpIHtcbiAgICBjb25zdCB0aWxlc0luID0gc291cmNlQ2FjaGUudGlsZXNJbihxdWVyeUdlb21ldHJ5KTtcblxuICAgIHRpbGVzSW4uc29ydChzb3J0VGlsZXNJbik7XG5cbiAgICBjb25zdCByZW5kZXJlZEZlYXR1cmVMYXllcnMgPSBbXTtcbiAgICBmb3IgKGxldCByID0gMDsgciA8IHRpbGVzSW4ubGVuZ3RoOyByKyspIHtcbiAgICAgICAgY29uc3QgdGlsZUluID0gdGlsZXNJbltyXTtcbiAgICAgICAgaWYgKCF0aWxlSW4udGlsZS5mZWF0dXJlSW5kZXgpIGNvbnRpbnVlO1xuXG4gICAgICAgIHJlbmRlcmVkRmVhdHVyZUxheWVycy5wdXNoKHRpbGVJbi50aWxlLmZlYXR1cmVJbmRleC5xdWVyeSh7XG4gICAgICAgICAgICBxdWVyeUdlb21ldHJ5OiB0aWxlSW4ucXVlcnlHZW9tZXRyeSxcbiAgICAgICAgICAgIHNjYWxlOiB0aWxlSW4uc2NhbGUsXG4gICAgICAgICAgICB0aWxlU2l6ZTogdGlsZUluLnRpbGUudGlsZVNpemUsXG4gICAgICAgICAgICBiZWFyaW5nOiBiZWFyaW5nLFxuICAgICAgICAgICAgcGFyYW1zOiBwYXJhbXNcbiAgICAgICAgfSwgc3R5bGVMYXllcnMpKTtcbiAgICB9XG4gICAgcmV0dXJuIG1lcmdlUmVuZGVyZWRGZWF0dXJlTGF5ZXJzKHJlbmRlcmVkRmVhdHVyZUxheWVycyk7XG59O1xuXG5leHBvcnRzLnNvdXJjZSA9IGZ1bmN0aW9uKHNvdXJjZUNhY2hlLCBwYXJhbXMpIHtcbiAgICBjb25zdCB0aWxlcyA9IHNvdXJjZUNhY2hlLmdldFJlbmRlcmFibGVJZHMoKS5tYXAoKGlkKSA9PiB7XG4gICAgICAgIHJldHVybiBzb3VyY2VDYWNoZS5nZXRUaWxlQnlJRChpZCk7XG4gICAgfSk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBbXTtcblxuICAgIGNvbnN0IGRhdGFUaWxlcyA9IHt9O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgdGlsZSA9IHRpbGVzW2ldO1xuICAgICAgICBjb25zdCBkYXRhSUQgPSBuZXcgVGlsZUNvb3JkKE1hdGgubWluKHRpbGUuc291cmNlTWF4Wm9vbSwgdGlsZS5jb29yZC56KSwgdGlsZS5jb29yZC54LCB0aWxlLmNvb3JkLnksIDApLmlkO1xuICAgICAgICBpZiAoIWRhdGFUaWxlc1tkYXRhSURdKSB7XG4gICAgICAgICAgICBkYXRhVGlsZXNbZGF0YUlEXSA9IHRydWU7XG4gICAgICAgICAgICB0aWxlLnF1ZXJ5U291cmNlRmVhdHVyZXMocmVzdWx0LCBwYXJhbXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbmZ1bmN0aW9uIHNvcnRUaWxlc0luKGEsIGIpIHtcbiAgICBjb25zdCBjb29yZEEgPSBhLmNvb3JkO1xuICAgIGNvbnN0IGNvb3JkQiA9IGIuY29vcmQ7XG4gICAgcmV0dXJuIChjb29yZEEueiAtIGNvb3JkQi56KSB8fCAoY29vcmRBLnkgLSBjb29yZEIueSkgfHwgKGNvb3JkQS53IC0gY29vcmRCLncpIHx8IChjb29yZEEueCAtIGNvb3JkQi54KTtcbn1cblxuZnVuY3Rpb24gbWVyZ2VSZW5kZXJlZEZlYXR1cmVMYXllcnModGlsZXMpIHtcbiAgICBjb25zdCByZXN1bHQgPSB0aWxlc1swXSB8fCB7fTtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHRpbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHRpbGUgPSB0aWxlc1tpXTtcbiAgICAgICAgZm9yIChjb25zdCBsYXllcklEIGluIHRpbGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHRpbGVGZWF0dXJlcyA9IHRpbGVbbGF5ZXJJRF07XG4gICAgICAgICAgICBsZXQgcmVzdWx0RmVhdHVyZXMgPSByZXN1bHRbbGF5ZXJJRF07XG4gICAgICAgICAgICBpZiAocmVzdWx0RmVhdHVyZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdEZlYXR1cmVzID0gcmVzdWx0W2xheWVySURdID0gdGlsZUZlYXR1cmVzO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBmID0gMDsgZiA8IHRpbGVGZWF0dXJlcy5sZW5ndGg7IGYrKykge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRGZWF0dXJlcy5wdXNoKHRpbGVGZWF0dXJlc1tmXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgdXRpbCA9IHJlcXVpcmUoJy4uL3V0aWwvdXRpbCcpO1xuY29uc3QgYWpheCA9IHJlcXVpcmUoJy4uL3V0aWwvYWpheCcpO1xuY29uc3QgRXZlbnRlZCA9IHJlcXVpcmUoJy4uL3V0aWwvZXZlbnRlZCcpO1xuY29uc3QgbG9hZFRpbGVKU09OID0gcmVxdWlyZSgnLi9sb2FkX3RpbGVqc29uJyk7XG5jb25zdCBub3JtYWxpemVVUkwgPSByZXF1aXJlKCcuLi91dGlsL21hcGJveCcpLm5vcm1hbGl6ZVRpbGVVUkw7XG5cbmNsYXNzIFJhc3RlclRpbGVTb3VyY2UgZXh0ZW5kcyBFdmVudGVkIHtcblxuICAgIGNvbnN0cnVjdG9yKGlkLCBvcHRpb25zLCBkaXNwYXRjaGVyLCBldmVudGVkUGFyZW50KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICAgICAgdGhpcy5kaXNwYXRjaGVyID0gZGlzcGF0Y2hlcjtcbiAgICAgICAgdGhpcy5zZXRFdmVudGVkUGFyZW50KGV2ZW50ZWRQYXJlbnQpO1xuXG4gICAgICAgIHRoaXMudHlwZSA9ICdyYXN0ZXInO1xuICAgICAgICB0aGlzLm1pbnpvb20gPSAwO1xuICAgICAgICB0aGlzLm1heHpvb20gPSAyMjtcbiAgICAgICAgdGhpcy5yb3VuZFpvb20gPSB0cnVlO1xuICAgICAgICB0aGlzLnNjaGVtZSA9ICd4eXonO1xuICAgICAgICB0aGlzLnRpbGVTaXplID0gNTEyO1xuICAgICAgICB0aGlzLl9sb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgdXRpbC5leHRlbmQodGhpcywgdXRpbC5waWNrKG9wdGlvbnMsIFsndXJsJywgJ3NjaGVtZScsICd0aWxlU2l6ZSddKSk7XG4gICAgfVxuXG4gICAgbG9hZCgpIHtcbiAgICAgICAgdGhpcy5maXJlKCdkYXRhbG9hZGluZycsIHtkYXRhVHlwZTogJ3NvdXJjZSd9KTtcbiAgICAgICAgbG9hZFRpbGVKU09OKHRoaXMub3B0aW9ucywgKGVyciwgdGlsZUpTT04pID0+IHtcbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maXJlKCdlcnJvcicsIGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB1dGlsLmV4dGVuZCh0aGlzLCB0aWxlSlNPTik7XG4gICAgICAgICAgICB0aGlzLmZpcmUoJ2RhdGEnLCB7ZGF0YVR5cGU6ICdzb3VyY2UnfSk7XG4gICAgICAgICAgICB0aGlzLmZpcmUoJ3NvdXJjZS5sb2FkJyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG9uQWRkKG1hcCkge1xuICAgICAgICB0aGlzLmxvYWQoKTtcbiAgICAgICAgdGhpcy5tYXAgPSBtYXA7XG4gICAgfVxuXG4gICAgc2VyaWFsaXplKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogJ3Jhc3RlcicsXG4gICAgICAgICAgICB1cmw6IHRoaXMudXJsLFxuICAgICAgICAgICAgdGlsZVNpemU6IHRoaXMudGlsZVNpemUsXG4gICAgICAgICAgICB0aWxlczogdGhpcy50aWxlc1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGxvYWRUaWxlKHRpbGUsIGNhbGxiYWNrKSB7XG4gICAgICAgIGNvbnN0IHVybCA9IG5vcm1hbGl6ZVVSTCh0aWxlLmNvb3JkLnVybCh0aGlzLnRpbGVzLCBudWxsLCB0aGlzLnNjaGVtZSksIHRoaXMudXJsLCB0aGlzLnRpbGVTaXplKTtcblxuICAgICAgICB0aWxlLnJlcXVlc3QgPSBhamF4LmdldEltYWdlKHVybCwgZG9uZS5iaW5kKHRoaXMpKTtcblxuICAgICAgICBmdW5jdGlvbiBkb25lKGVyciwgaW1nKSB7XG4gICAgICAgICAgICBkZWxldGUgdGlsZS5yZXF1ZXN0O1xuXG4gICAgICAgICAgICBpZiAodGlsZS5hYm9ydGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9ICd1bmxvYWRlZCc7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9ICdlcnJvcmVkJztcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGlsZS5zZXRFeHBpcnlEYXRhKGltZyk7XG4gICAgICAgICAgICBkZWxldGUgaW1nLmNhY2hlQ29udHJvbDtcbiAgICAgICAgICAgIGRlbGV0ZSBpbWcuZXhwaXJlcztcblxuICAgICAgICAgICAgY29uc3QgZ2wgPSB0aGlzLm1hcC5wYWludGVyLmdsO1xuICAgICAgICAgICAgdGlsZS50ZXh0dXJlID0gdGhpcy5tYXAucGFpbnRlci5nZXRUaWxlVGV4dHVyZShpbWcud2lkdGgpO1xuICAgICAgICAgICAgaWYgKHRpbGUudGV4dHVyZSkge1xuICAgICAgICAgICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRpbGUudGV4dHVyZSk7XG4gICAgICAgICAgICAgICAgZ2wudGV4U3ViSW1hZ2UyRChnbC5URVhUVVJFXzJELCAwLCAwLCAwLCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLCBpbWcpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aWxlLnRleHR1cmUgPSBnbC5jcmVhdGVUZXh0dXJlKCk7XG4gICAgICAgICAgICAgICAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgdGlsZS50ZXh0dXJlKTtcbiAgICAgICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgZ2wuTElORUFSX01JUE1BUF9ORUFSRVNUKTtcbiAgICAgICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgZ2wuTElORUFSKTtcbiAgICAgICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9TLCBnbC5DTEFNUF9UT19FREdFKTtcbiAgICAgICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9ULCBnbC5DTEFNUF9UT19FREdFKTtcbiAgICAgICAgICAgICAgICBnbC50ZXhJbWFnZTJEKGdsLlRFWFRVUkVfMkQsIDAsIGdsLlJHQkEsIGdsLlJHQkEsIGdsLlVOU0lHTkVEX0JZVEUsIGltZyk7XG4gICAgICAgICAgICAgICAgdGlsZS50ZXh0dXJlLnNpemUgPSBpbWcud2lkdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBnbC5nZW5lcmF0ZU1pcG1hcChnbC5URVhUVVJFXzJEKTtcblxuICAgICAgICAgICAgdGlsZS5zdGF0ZSA9ICdsb2FkZWQnO1xuXG4gICAgICAgICAgICBjYWxsYmFjayhudWxsKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFib3J0VGlsZSh0aWxlKSB7XG4gICAgICAgIGlmICh0aWxlLnJlcXVlc3QpIHtcbiAgICAgICAgICAgIHRpbGUucmVxdWVzdC5hYm9ydCgpO1xuICAgICAgICAgICAgZGVsZXRlIHRpbGUucmVxdWVzdDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHVubG9hZFRpbGUodGlsZSkge1xuICAgICAgICBpZiAodGlsZS50ZXh0dXJlKSB0aGlzLm1hcC5wYWludGVyLnNhdmVUaWxlVGV4dHVyZSh0aWxlLnRleHR1cmUpO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBSYXN0ZXJUaWxlU291cmNlO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBhamF4ID0gcmVxdWlyZSgnLi4vdXRpbC9hamF4Jyk7XG5jb25zdCB3aW5kb3cgPSByZXF1aXJlKCcuLi91dGlsL3dpbmRvdycpO1xuXG5jb25zdCBwbHVnaW5BdmFpbGFibGVDYWxsYmFja3MgPSBbXTtcbmxldCBwbHVnaW5SZXF1ZXN0ZWQgPSBmYWxzZTtcbmxldCBwbHVnaW5CbG9iVVJMID0gbnVsbDtcblxubW9kdWxlLmV4cG9ydHMucmVnaXN0ZXJGb3JQbHVnaW5BdmFpbGFiaWxpdHkgPSBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgIGlmIChwbHVnaW5CbG9iVVJMKSB7XG4gICAgICAgIGNhbGxiYWNrKHBsdWdpbkJsb2JVUkwpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHBsdWdpbkF2YWlsYWJsZUNhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTtcbiAgICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cy5lcnJvckNhbGxiYWNrID0gbnVsbDtcblxubW9kdWxlLmV4cG9ydHMuc2V0UlRMVGV4dFBsdWdpbiA9IGZ1bmN0aW9uKHBsdWdpblVSTCwgY2FsbGJhY2spIHtcbiAgICBpZiAocGx1Z2luUmVxdWVzdGVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignc2V0UlRMVGV4dFBsdWdpbiBjYW5ub3QgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLicpO1xuICAgIH1cbiAgICBwbHVnaW5SZXF1ZXN0ZWQgPSB0cnVlO1xuICAgIG1vZHVsZS5leHBvcnRzLmVycm9yQ2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICBhamF4LmdldEFycmF5QnVmZmVyKHBsdWdpblVSTCwgKGVyciwgcmVzcG9uc2UpID0+IHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBsdWdpbkJsb2JVUkwgPVxuICAgICAgICAgICAgICAgIHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyB3aW5kb3cuQmxvYihbcmVzcG9uc2UuZGF0YV0pLCB7dHlwZTogXCJ0ZXh0L2phdmFzY3JpcHRcIn0pO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHBsdWdpbkF2YWlsYWJsZUNhbGxiYWNrIG9mIHBsdWdpbkF2YWlsYWJsZUNhbGxiYWNrcykge1xuICAgICAgICAgICAgICAgIHBsdWdpbkF2YWlsYWJsZUNhbGxiYWNrKHBsdWdpbkJsb2JVUkwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCB1dGlsID0gcmVxdWlyZSgnLi4vdXRpbC91dGlsJyk7XG5cbmNvbnN0IHNvdXJjZVR5cGVzID0ge1xuICAgICd2ZWN0b3InOiByZXF1aXJlKCcuLi9zb3VyY2UvdmVjdG9yX3RpbGVfc291cmNlJyksXG4gICAgJ3Jhc3Rlcic6IHJlcXVpcmUoJy4uL3NvdXJjZS9yYXN0ZXJfdGlsZV9zb3VyY2UnKSxcbiAgICAnZ2VvanNvbic6IHJlcXVpcmUoJy4uL3NvdXJjZS9nZW9qc29uX3NvdXJjZScpLFxuICAgICd2aWRlbyc6IHJlcXVpcmUoJy4uL3NvdXJjZS92aWRlb19zb3VyY2UnKSxcbiAgICAnaW1hZ2UnOiByZXF1aXJlKCcuLi9zb3VyY2UvaW1hZ2Vfc291cmNlJyksXG4gICAgJ2NhbnZhcyc6IHJlcXVpcmUoJy4uL3NvdXJjZS9jYW52YXNfc291cmNlJylcbn07XG5cbi8qXG4gKiBDcmVhdGVzIGEgdGlsZWQgZGF0YSBzb3VyY2UgaW5zdGFuY2UgZ2l2ZW4gYW4gb3B0aW9ucyBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGlkXG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlIEEgc291cmNlIGRlZmluaXRpb24gb2JqZWN0IGNvbXBsaWFudCB3aXRoIFtgbWFwYm94LWdsLXN0eWxlLXNwZWNgXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1zdHlsZS1zcGVjLyNzb3VyY2VzKSBvciwgZm9yIGEgdGhpcmQtcGFydHkgc291cmNlIHR5cGUsIHdpdGggdGhhdCB0eXBlJ3MgcmVxdWlyZW1lbnRzLlxuICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMudHlwZSBBIHNvdXJjZSB0eXBlIGxpa2UgYHJhc3RlcmAsIGB2ZWN0b3JgLCBgdmlkZW9gLCBldGMuXG4gKiBAcGFyYW0ge0Rpc3BhdGNoZXJ9IGRpc3BhdGNoZXJcbiAqIEByZXR1cm5zIHtTb3VyY2V9XG4gKi9cbmV4cG9ydHMuY3JlYXRlID0gZnVuY3Rpb24oaWQsIHNvdXJjZSwgZGlzcGF0Y2hlciwgZXZlbnRlZFBhcmVudCkge1xuICAgIHNvdXJjZSA9IG5ldyBzb3VyY2VUeXBlc1tzb3VyY2UudHlwZV0oaWQsIHNvdXJjZSwgZGlzcGF0Y2hlciwgZXZlbnRlZFBhcmVudCk7XG5cbiAgICBpZiAoc291cmNlLmlkICE9PSBpZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIFNvdXJjZSBpZCB0byBiZSAke2lkfSBpbnN0ZWFkIG9mICR7c291cmNlLmlkfWApO1xuICAgIH1cblxuICAgIHV0aWwuYmluZEFsbChbJ2xvYWQnLCAnYWJvcnQnLCAndW5sb2FkJywgJ3NlcmlhbGl6ZScsICdwcmVwYXJlJ10sIHNvdXJjZSk7XG4gICAgcmV0dXJuIHNvdXJjZTtcbn07XG5cbmV4cG9ydHMuZ2V0VHlwZSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgcmV0dXJuIHNvdXJjZVR5cGVzW25hbWVdO1xufTtcblxuZXhwb3J0cy5zZXRUeXBlID0gZnVuY3Rpb24gKG5hbWUsIHR5cGUpIHtcbiAgICBzb3VyY2VUeXBlc1tuYW1lXSA9IHR5cGU7XG59O1xuXG4vKipcbiAqIFRoZSBgU291cmNlYCBpbnRlcmZhY2UgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBlYWNoIHNvdXJjZSB0eXBlLCBpbmNsdWRpbmcgXCJjb3JlXCIgdHlwZXMgKGB2ZWN0b3JgLCBgcmFzdGVyYCwgYHZpZGVvYCwgZXRjLikgYW5kIGFsbCBjdXN0b20sIHRoaXJkLXBhcnR5IHR5cGVzLlxuICpcbiAqIEBjbGFzcyBTb3VyY2VcbiAqIEBwcml2YXRlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGlkIFRoZSBpZCBmb3IgdGhlIHNvdXJjZS4gTXVzdCBub3QgYmUgdXNlZCBieSBhbnkgZXhpc3Rpbmcgc291cmNlLlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgU291cmNlIG9wdGlvbnMsIHNwZWNpZmljIHRvIHRoZSBzb3VyY2UgdHlwZSAoZXhjZXB0IGZvciBgb3B0aW9ucy50eXBlYCwgd2hpY2ggaXMgYWx3YXlzIHJlcXVpcmVkKS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLnR5cGUgVGhlIHNvdXJjZSB0eXBlLCBtYXRjaGluZyB0aGUgdmFsdWUgb2YgYG5hbWVgIHVzZWQgaW4ge0BsaW5rIFN0eWxlI2FkZFNvdXJjZVR5cGV9LlxuICogQHBhcmFtIHtEaXNwYXRjaGVyfSBkaXNwYXRjaGVyIEEge0BsaW5rIERpc3BhdGNoZXJ9IGluc3RhbmNlLCB3aGljaCBjYW4gYmUgdXNlZCB0byBzZW5kIG1lc3NhZ2VzIHRvIHRoZSB3b3JrZXJzLlxuICpcbiAqIEBmaXJlcyBsb2FkIHRvIGluZGljYXRlIHNvdXJjZSBkYXRhIGhhcyBiZWVuIGxvYWRlZCwgc28gdGhhdCBpdCdzIG9rYXkgdG8gY2FsbCBgbG9hZFRpbGVgXG4gKiBAZmlyZXMgY2hhbmdlIHRvIGluZGljYXRlIHNvdXJjZSBkYXRhIGhhcyBjaGFuZ2VkLCBzbyB0aGF0IGFueSBjdXJyZW50IGNhY2hlcyBzaG91bGQgYmUgZmx1c2hlZFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIFRoZSBpZCBmb3IgdGhlIHNvdXJjZS4gIE11c3QgbWF0Y2ggdGhlIGlkIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IuXG4gKiBAcHJvcGVydHkge251bWJlcn0gbWluem9vbVxuICogQHByb3BlcnR5IHtudW1iZXJ9IG1heHpvb21cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gaXNUaWxlQ2xpcHBlZCBgZmFsc2VgIGlmIHRpbGVzIGNhbiBiZSBkcmF3biBvdXRzaWRlIHRoZWlyIGJvdW5kYXJpZXMsIGB0cnVlYCBpZiB0aGV5IGNhbm5vdC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcmVwYXJzZU92ZXJzY2FsZWQgYHRydWVgIGlmIHRpbGVzIHNob3VsZCBiZSBzZW50IGJhY2sgdG8gdGhlIHdvcmtlciBmb3IgZWFjaCBvdmVyem9vbWVkIHpvb20gbGV2ZWwsIGBmYWxzZWAgaWYgbm90LlxuICogQHByb3BlcnR5IHtib29sZWFufSByb3VuZFpvb20gYHRydWVgIGlmIHpvb20gbGV2ZWxzIGFyZSByb3VuZGVkIHRvIHRoZSBuZWFyZXN0IGludGVnZXIgaW4gdGhlIHNvdXJjZSBkYXRhLCBgZmFsc2VgIGlmIHRoZXkgYXJlIGZsb29yLWVkIHRvIHRoZSBuZWFyZXN0IGludGVnZXIuXG4gKi9cblxuLyoqXG4gKiBBbiBvcHRpb25hbCBVUkwgdG8gYSBzY3JpcHQgd2hpY2gsIHdoZW4gcnVuIGJ5IGEgV29ya2VyLCByZWdpc3RlcnMgYSB7QGxpbmsgV29ya2VyU291cmNlfSBpbXBsZW1lbnRhdGlvbiBmb3IgdGhpcyBTb3VyY2UgdHlwZSBieSBjYWxsaW5nIGBzZWxmLnJlZ2lzdGVyV29ya2VyU291cmNlKHdvcmtlclNvdXJjZTogV29ya2VyU291cmNlKWAuXG4gKlxuICogQG1lbWJlciB7VVJMfHVuZGVmaW5lZH0gd29ya2VyU291cmNlVVJMXG4gKiBAbWVtYmVyb2YgU291cmNlXG4gKiBAc3RhdGljXG4gKi9cblxuLyoqXG4gKiBAbWV0aG9kXG4gKiBAbmFtZSBsb2FkVGlsZVxuICogQHBhcmFtIHtUaWxlfSB0aWxlXG4gKiBAcGFyYW0ge0Z1bnRpb259IGNhbGxiYWNrIENhbGxlZCB3aGVuIHRpbGUgaGFzIGJlZW4gbG9hZGVkXG4gKiBAbWVtYmVyb2YgU291cmNlXG4gKiBAaW5zdGFuY2VcbiAqL1xuXG4vKipcbiAqIEBtZXRob2RcbiAqIEBuYW1lIGFib3J0VGlsZVxuICogQHBhcmFtIHtUaWxlfSB0aWxlXG4gKiBAbWVtYmVyb2YgU291cmNlXG4gKiBAaW5zdGFuY2VcbiAqL1xuXG4vKipcbiAqIEBtZXRob2RcbiAqIEBuYW1lIHVubG9hZFRpbGVcbiAqIEBwYXJhbSB7VGlsZX0gdGlsZVxuICogQG1lbWJlcm9mIFNvdXJjZVxuICogQGluc3RhbmNlXG4gKi9cblxuLyoqXG4gKiBAbWV0aG9kXG4gKiBAbmFtZSBzZXJpYWxpemVcbiAqIEByZXR1cm5zIHtPYmplY3R9IEEgcGxhaW4gKHN0cmluZ2lmaWFibGUpIEpTIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHNvdXJjZS4gQ3JlYXRpbmcgYSBzb3VyY2UgdXNpbmcgdGhlIHJldHVybmVkIG9iamVjdCBhcyB0aGUgYG9wdGlvbnNgIHNob3VsZCByZXN1bHQgaW4gYSBTb3VyY2UgdGhhdCBpcyBlcXVpdmFsZW50IHRvIHRoaXMgb25lLlxuICogQG1lbWJlcm9mIFNvdXJjZVxuICogQGluc3RhbmNlXG4gKi9cblxuLyoqXG4gKiBAbWV0aG9kXG4gKiBAbmFtZSBwcmVwYXJlXG4gKiBAbWVtYmVyb2YgU291cmNlXG4gKiBAaW5zdGFuY2VcbiAqL1xuXG5cblxuLyoqXG4gKiBNYXkgYmUgaW1wbGVtZW50ZWQgYnkgY3VzdG9tIHNvdXJjZSB0eXBlcyB0byBwcm92aWRlIGNvZGUgdGhhdCBjYW4gYmUgcnVuIG9uXG4gKiB0aGUgV2ViV29ya2Vycy4gSW4gYWRkaXRpb24gdG8gcHJvdmlkaW5nIGEgY3VzdG9tXG4gKiB7QGxpbmsgV29ya2VyU291cmNlI2xvYWRUaWxlfSwgYW55IG90aGVyIG1ldGhvZHMgYXR0YWNoZWQgdG8gYSBgV29ya2VyU291cmNlYFxuICogaW1wbGVtZW50YXRpb24gbWF5IGFsc28gYmUgdGFyZ2V0ZWQgYnkgdGhlIHtAbGluayBTb3VyY2V9IHZpYVxuICogYGRpc3BhdGNoZXIuc2VuZCgnc291cmNlLXR5cGUubWV0aG9kbmFtZScsIHBhcmFtcywgY2FsbGJhY2spYC5cbiAqXG4gKiBAc2VlIHtAbGluayBNYXAjYWRkU291cmNlVHlwZX1cbiAqIEBwcml2YXRlXG4gKlxuICogQGNsYXNzIFdvcmtlclNvdXJjZVxuICogQHBhcmFtIHtBY3Rvcn0gYWN0b3JcbiAqIEBwYXJhbSB7U3R5bGVMYXllckluZGV4fSBsYXllckluZGV4XG4gKi9cblxuLyoqXG4gKiBMb2FkcyBhIHRpbGUgZnJvbSB0aGUgZ2l2ZW4gcGFyYW1zIGFuZCBwYXJzZSBpdCBpbnRvIGJ1Y2tldHMgcmVhZHkgdG8gc2VuZFxuICogYmFjayB0byB0aGUgbWFpbiB0aHJlYWQgZm9yIHJlbmRlcmluZy4gIFNob3VsZCBjYWxsIHRoZSBjYWxsYmFjayB3aXRoOlxuICogYHsgYnVja2V0cywgZmVhdHVyZUluZGV4LCBjb2xsaXNpb25UaWxlLCBzeW1ib2xJbnN0YW5jZXNBcnJheSwgc3ltYm9sUXVhZHNBcnJheSwgcmF3VGlsZURhdGF9YC5cbiAqXG4gKiBAbWV0aG9kXG4gKiBAbmFtZSBsb2FkVGlsZVxuICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBQYXJhbWV0ZXJzIHNlbnQgYnkgdGhlIG1haW4tdGhyZWFkIFNvdXJjZSBpZGVudGlmeWluZyB0aGUgdGlsZSB0byBsb2FkLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEBtZW1iZXJvZiBXb3JrZXJTb3VyY2VcbiAqIEBpbnN0YW5jZVxuICovXG5cbi8qKlxuICogUmUtcGFyc2VzIGEgdGlsZSB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gbG9hZGVkLiAgWWllbGRzIHRoZSBzYW1lIGRhdGEgYXNcbiAqIHtAbGluayBXb3JrZXJTb3VyY2UjbG9hZFRpbGV9LlxuICpcbiAqIEBtZXRob2RcbiAqIEBuYW1lIHJlbG9hZFRpbGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXNcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAbWVtYmVyb2YgV29ya2VyU291cmNlXG4gKiBAaW5zdGFuY2VcbiAqL1xuXG4vKipcbiAqIEFib3J0cyBsb2FkaW5nIGEgdGlsZSB0aGF0IGlzIGluIHByb2dyZXNzLlxuICogQG1ldGhvZFxuICogQG5hbWUgYWJvcnRUaWxlXG4gKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zXG4gKiBAbWVtYmVyb2YgV29ya2VyU291cmNlXG4gKiBAaW5zdGFuY2VcbiAqL1xuXG4vKipcbiAqIFJlbW92ZXMgdGhpcyB0aWxlIGZyb20gYW55IGxvY2FsIGNhY2hlcy5cbiAqIEBtZXRob2RcbiAqIEBuYW1lIHJlbW92ZVRpbGVcbiAqIEBtZW1iZXJvZiBXb3JrZXJTb3VyY2VcbiAqIEBpbnN0YW5jZVxuICovXG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IFNvdXJjZSA9IHJlcXVpcmUoJy4vc291cmNlJyk7XG5jb25zdCBUaWxlID0gcmVxdWlyZSgnLi90aWxlJyk7XG5jb25zdCBFdmVudGVkID0gcmVxdWlyZSgnLi4vdXRpbC9ldmVudGVkJyk7XG5jb25zdCBUaWxlQ29vcmQgPSByZXF1aXJlKCcuL3RpbGVfY29vcmQnKTtcbmNvbnN0IENhY2hlID0gcmVxdWlyZSgnLi4vdXRpbC9scnVfY2FjaGUnKTtcbmNvbnN0IENvb3JkaW5hdGUgPSByZXF1aXJlKCcuLi9nZW8vY29vcmRpbmF0ZScpO1xuY29uc3QgdXRpbCA9IHJlcXVpcmUoJy4uL3V0aWwvdXRpbCcpO1xuY29uc3QgRVhURU5UID0gcmVxdWlyZSgnLi4vZGF0YS9leHRlbnQnKTtcblxuLyoqXG4gKiBgU291cmNlQ2FjaGVgIGlzIHJlc3BvbnNpYmxlIGZvclxuICpcbiAqICAtIGNyZWF0aW5nIGFuIGluc3RhbmNlIG9mIGBTb3VyY2VgXG4gKiAgLSBmb3J3YXJkaW5nIGV2ZW50cyBmcm9tIGBTb3VyY2VgXG4gKiAgLSBjYWNoaW5nIHRpbGVzIGxvYWRlZCBmcm9tIGFuIGluc3RhbmNlIG9mIGBTb3VyY2VgXG4gKiAgLSBsb2FkaW5nIHRoZSB0aWxlcyBuZWVkZWQgdG8gcmVuZGVyIGEgZ2l2ZW4gdmlld3BvcnRcbiAqICAtIHVubG9hZGluZyB0aGUgY2FjaGVkIHRpbGVzIG5vdCBuZWVkZWQgdG8gcmVuZGVyIGEgZ2l2ZW4gdmlld3BvcnRcbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBTb3VyY2VDYWNoZSBleHRlbmRzIEV2ZW50ZWQge1xuXG4gICAgY29uc3RydWN0b3IoaWQsIG9wdGlvbnMsIGRpc3BhdGNoZXIpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5pZCA9IGlkO1xuICAgICAgICB0aGlzLmRpc3BhdGNoZXIgPSBkaXNwYXRjaGVyO1xuXG4gICAgICAgIHRoaXMub24oJ3NvdXJjZS5sb2FkJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0aGlzLl9zb3VyY2VMb2FkZWQgPSB0cnVlO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLm9uKCdlcnJvcicsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhpcy5fc291cmNlRXJyb3JlZCA9IHRydWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMub24oJ2RhdGEnLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3NvdXJjZUxvYWRlZCAmJiBldmVudC5kYXRhVHlwZSA9PT0gJ3NvdXJjZScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbG9hZCgpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnRyYW5zZm9ybSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZSh0aGlzLnRyYW5zZm9ybSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLl9zb3VyY2UgPSBTb3VyY2UuY3JlYXRlKGlkLCBvcHRpb25zLCBkaXNwYXRjaGVyLCB0aGlzKTtcblxuICAgICAgICB0aGlzLl90aWxlcyA9IHt9O1xuICAgICAgICB0aGlzLl9jYWNoZSA9IG5ldyBDYWNoZSgwLCB0aGlzLnVubG9hZFRpbGUuYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMuX3RpbWVycyA9IHt9O1xuICAgICAgICB0aGlzLl9jYWNoZVRpbWVycyA9IHt9O1xuXG4gICAgICAgIHRoaXMuX2lzSWRSZW5kZXJhYmxlID0gdGhpcy5faXNJZFJlbmRlcmFibGUuYmluZCh0aGlzKTtcbiAgICB9XG5cbiAgICBvbkFkZChtYXApIHtcbiAgICAgICAgdGhpcy5tYXAgPSBtYXA7XG4gICAgICAgIGlmICh0aGlzLl9zb3VyY2UgJiYgdGhpcy5fc291cmNlLm9uQWRkKSB7XG4gICAgICAgICAgICB0aGlzLl9zb3VyY2Uub25BZGQobWFwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uUmVtb3ZlKG1hcCkge1xuICAgICAgICBpZiAodGhpcy5fc291cmNlICYmIHRoaXMuX3NvdXJjZS5vblJlbW92ZSkge1xuICAgICAgICAgICAgdGhpcy5fc291cmNlLm9uUmVtb3ZlKG1hcCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdHJ1ZSBpZiBubyB0aWxlIGRhdGEgaXMgcGVuZGluZywgdGlsZXMgd2lsbCBub3QgY2hhbmdlIHVubGVzc1xuICAgICAqIGFuIGFkZGl0aW9uYWwgQVBJIGNhbGwgaXMgcmVjZWl2ZWQuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBsb2FkZWQoKSB7XG4gICAgICAgIGlmICh0aGlzLl9zb3VyY2VFcnJvcmVkKSB7IHJldHVybiB0cnVlOyB9XG4gICAgICAgIGlmICghdGhpcy5fc291cmNlTG9hZGVkKSB7IHJldHVybiBmYWxzZTsgfVxuICAgICAgICBmb3IgKGNvbnN0IHQgaW4gdGhpcy5fdGlsZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHRpbGUgPSB0aGlzLl90aWxlc1t0XTtcbiAgICAgICAgICAgIGlmICh0aWxlLnN0YXRlICE9PSAnbG9hZGVkJyAmJiB0aWxlLnN0YXRlICE9PSAnZXJyb3JlZCcpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIHtTb3VyY2V9IFRoZSB1bmRlcmx5aW5nIHNvdXJjZSBvYmplY3RcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGdldFNvdXJjZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NvdXJjZTtcbiAgICB9XG5cbiAgICBsb2FkVGlsZSh0aWxlLCBjYWxsYmFjaykge1xuICAgICAgICByZXR1cm4gdGhpcy5fc291cmNlLmxvYWRUaWxlKHRpbGUsIGNhbGxiYWNrKTtcbiAgICB9XG5cbiAgICB1bmxvYWRUaWxlKHRpbGUpIHtcbiAgICAgICAgaWYgKHRoaXMuX3NvdXJjZS51bmxvYWRUaWxlKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3NvdXJjZS51bmxvYWRUaWxlKHRpbGUpO1xuICAgIH1cblxuICAgIGFib3J0VGlsZSh0aWxlKSB7XG4gICAgICAgIGlmICh0aGlzLl9zb3VyY2UuYWJvcnRUaWxlKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3NvdXJjZS5hYm9ydFRpbGUodGlsZSk7XG4gICAgfVxuXG4gICAgc2VyaWFsaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc291cmNlLnNlcmlhbGl6ZSgpO1xuICAgIH1cblxuICAgIHByZXBhcmUoKSB7XG4gICAgICAgIGlmICh0aGlzLl9zb3VyY2VMb2FkZWQgJiYgdGhpcy5fc291cmNlLnByZXBhcmUpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fc291cmNlLnByZXBhcmUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYWxsIHRpbGUgaWRzIG9yZGVyZWQgd2l0aCB6LW9yZGVyLCBhbmQgY2FzdCB0byBudW1iZXJzXG4gICAgICogQHJldHVybnMge0FycmF5PG51bWJlcj59IGlkc1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZ2V0SWRzKCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5fdGlsZXMpLm1hcChOdW1iZXIpLnNvcnQoY29tcGFyZUtleVpvb20pO1xuICAgIH1cblxuICAgIGdldFJlbmRlcmFibGVJZHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldElkcygpLmZpbHRlcih0aGlzLl9pc0lkUmVuZGVyYWJsZSk7XG4gICAgfVxuXG4gICAgX2lzSWRSZW5kZXJhYmxlKGlkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90aWxlc1tpZF0uaGFzRGF0YSgpICYmICF0aGlzLl9jb3ZlcmVkVGlsZXNbaWRdO1xuICAgIH1cblxuICAgIHJlbG9hZCgpIHtcbiAgICAgICAgdGhpcy5fY2FjaGUucmVzZXQoKTtcbiAgICAgICAgZm9yIChjb25zdCBpIGluIHRoaXMuX3RpbGVzKSB7XG4gICAgICAgICAgICB0aGlzLnJlbG9hZFRpbGUoaSwgJ3JlbG9hZGluZycpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVsb2FkVGlsZShpZCwgc3RhdGUpIHtcbiAgICAgICAgY29uc3QgdGlsZSA9IHRoaXMuX3RpbGVzW2lkXTtcblxuICAgICAgICAvLyBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIFwibG9hZGluZ1wiIHRpbGVzIGFuZCBcInJlbG9hZGluZ1wiIG9yIFwiZXhwaXJlZFwiXG4gICAgICAgIC8vIHRpbGVzIGlzIHRoYXQgXCJyZWxvYWRpbmdcIi9cImV4cGlyZWRcIiB0aWxlcyBhcmUgXCJyZW5kZXJhYmxlXCIuXG4gICAgICAgIC8vIFRoZXJlZm9yZSwgYSBcImxvYWRpbmdcIiB0aWxlIGNhbm5vdCBiZWNvbWUgYSBcInJlbG9hZGluZ1wiIHRpbGUgd2l0aG91dFxuICAgICAgICAvLyBmaXJzdCBiZWNvbWluZyBhIFwibG9hZGVkXCIgdGlsZS5cbiAgICAgICAgaWYgKHRpbGUuc3RhdGUgIT09ICdsb2FkaW5nJykge1xuICAgICAgICAgICAgdGlsZS5zdGF0ZSA9IHN0YXRlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5sb2FkVGlsZSh0aWxlLCB0aGlzLl90aWxlTG9hZGVkLmJpbmQodGhpcywgdGlsZSwgaWQpKTtcbiAgICB9XG5cbiAgICBfdGlsZUxvYWRlZCh0aWxlLCBpZCwgZXJyKSB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIHRpbGUuc3RhdGUgPSAnZXJyb3JlZCc7XG4gICAgICAgICAgICB0aGlzLl9zb3VyY2UuZmlyZSgnZXJyb3InLCB7dGlsZTogdGlsZSwgZXJyb3I6IGVycn0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGlsZS5zb3VyY2VDYWNoZSA9IHRoaXM7XG4gICAgICAgIHRpbGUudGltZUFkZGVkID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICAgIHRoaXMuX3NldFRpbGVSZWxvYWRUaW1lcihpZCwgdGlsZSk7XG4gICAgICAgIHRoaXMuX3NvdXJjZS5maXJlKCdkYXRhJywge3RpbGU6IHRpbGUsIGNvb3JkOiB0aWxlLmNvb3JkLCBkYXRhVHlwZTogJ3RpbGUnfSk7XG5cbiAgICAgICAgLy8gSEFDSyB0aGlzIGlzIG5lY2Vzc2FyeSB0byBmaXggaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvaXNzdWVzLzI5ODZcbiAgICAgICAgaWYgKHRoaXMubWFwKSB0aGlzLm1hcC5wYWludGVyLnRpbGVFeHRlbnRWQU8udmFvID0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYSBzcGVjaWZpYyB0aWxlIGJ5IFRpbGVDb29yZGluYXRlXG4gICAgICogQHBhcmFtIHtUaWxlQ29vcmRpbmF0ZX0gY29vcmRcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSB0aWxlXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBnZXRUaWxlKGNvb3JkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFRpbGVCeUlEKGNvb3JkLmlkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYSBzcGVjaWZpYyB0aWxlIGJ5IGlkXG4gICAgICogQHBhcmFtIHtudW1iZXJ8c3RyaW5nfSBpZFxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IHRpbGVcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGdldFRpbGVCeUlEKGlkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90aWxlc1tpZF07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZ2V0IHRoZSB6b29tIGxldmVsIGFkanVzdGVkIGZvciB0aGUgZGlmZmVyZW5jZSBpbiBtYXAgYW5kIHNvdXJjZSB0aWxlc2l6ZXNcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gdHJhbnNmb3JtXG4gICAgICogQHJldHVybnMge251bWJlcn0gem9vbSBsZXZlbFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZ2V0Wm9vbSh0cmFuc2Zvcm0pIHtcbiAgICAgICAgcmV0dXJuIHRyYW5zZm9ybS56b29tICsgdHJhbnNmb3JtLnNjYWxlWm9vbSh0cmFuc2Zvcm0udGlsZVNpemUgLyB0aGlzLl9zb3VyY2UudGlsZVNpemUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlY3Vyc2l2ZWx5IGZpbmQgY2hpbGRyZW4gb2YgdGhlIGdpdmVuIHRpbGUgKHVwIHRvIG1heENvdmVyaW5nWm9vbSkgdGhhdCBhcmUgYWxyZWFkeSBsb2FkZWQ7XG4gICAgICogYWRkcyBmb3VuZCB0aWxlcyB0byByZXRhaW4gb2JqZWN0OyByZXR1cm5zIHRydWUgaWYgYW55IGNoaWxkIGlzIGZvdW5kLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtDb29yZGluYXRlfSBjb29yZFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtYXhDb3ZlcmluZ1pvb21cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHJldGFpblxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSB3aGV0aGVyIHRoZSBvcGVyYXRpb24gd2FzIGNvbXBsZXRlXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBmaW5kTG9hZGVkQ2hpbGRyZW4oY29vcmQsIG1heENvdmVyaW5nWm9vbSwgcmV0YWluKSB7XG4gICAgICAgIGxldCBmb3VuZCA9IGZhbHNlO1xuXG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy5fdGlsZXMpIHtcbiAgICAgICAgICAgIGxldCB0aWxlID0gdGhpcy5fdGlsZXNbaWRdO1xuXG4gICAgICAgICAgICAvLyBvbmx5IGNvbnNpZGVyIHJlbmRlcmFibGUgdGlsZXMgb24gaGlnaGVyIHpvb20gbGV2ZWxzICh1cCB0byBtYXhDb3ZlcmluZ1pvb20pXG4gICAgICAgICAgICBpZiAocmV0YWluW2lkXSB8fCAhdGlsZS5oYXNEYXRhKCkgfHwgdGlsZS5jb29yZC56IDw9IGNvb3JkLnogfHwgdGlsZS5jb29yZC56ID4gbWF4Q292ZXJpbmdab29tKSBjb250aW51ZTtcblxuICAgICAgICAgICAgLy8gZGlzcmVnYXJkIHRpbGVzIHRoYXQgYXJlIG5vdCBkZXNjZW5kYW50cyBvZiB0aGUgZ2l2ZW4gdGlsZSBjb29yZGluYXRlXG4gICAgICAgICAgICBjb25zdCB6MiA9IE1hdGgucG93KDIsIE1hdGgubWluKHRpbGUuY29vcmQueiwgdGhpcy5fc291cmNlLm1heHpvb20pIC0gTWF0aC5taW4oY29vcmQueiwgdGhpcy5fc291cmNlLm1heHpvb20pKTtcbiAgICAgICAgICAgIGlmIChNYXRoLmZsb29yKHRpbGUuY29vcmQueCAvIHoyKSAhPT0gY29vcmQueCB8fFxuICAgICAgICAgICAgICAgIE1hdGguZmxvb3IodGlsZS5jb29yZC55IC8gejIpICE9PSBjb29yZC55KVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAvLyBmb3VuZCBsb2FkZWQgY2hpbGRcbiAgICAgICAgICAgIHJldGFpbltpZF0gPSB0cnVlO1xuICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xuXG4gICAgICAgICAgICAvLyBsb29wIHRocm91Z2ggcGFyZW50czsgcmV0YWluIHRoZSB0b3Btb3N0IGxvYWRlZCBvbmUgaWYgZm91bmRcbiAgICAgICAgICAgIHdoaWxlICh0aWxlICYmIHRpbGUuY29vcmQueiAtIDEgPiBjb29yZC56KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50SWQgPSB0aWxlLmNvb3JkLnBhcmVudCh0aGlzLl9zb3VyY2UubWF4em9vbSkuaWQ7XG4gICAgICAgICAgICAgICAgdGlsZSA9IHRoaXMuX3RpbGVzW3BhcmVudElkXTtcblxuICAgICAgICAgICAgICAgIGlmICh0aWxlICYmIHRpbGUuaGFzRGF0YSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSByZXRhaW5baWRdO1xuICAgICAgICAgICAgICAgICAgICByZXRhaW5bcGFyZW50SWRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZvdW5kO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbmQgYSBsb2FkZWQgcGFyZW50IG9mIHRoZSBnaXZlbiB0aWxlICh1cCB0byBtaW5Db3ZlcmluZ1pvb20pO1xuICAgICAqIGFkZHMgdGhlIGZvdW5kIHRpbGUgdG8gcmV0YWluIG9iamVjdCBhbmQgcmV0dXJucyB0aGUgdGlsZSBpZiBmb3VuZFxuICAgICAqXG4gICAgICogQHBhcmFtIHtDb29yZGluYXRlfSBjb29yZFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtaW5Db3ZlcmluZ1pvb21cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHJldGFpblxuICAgICAqIEByZXR1cm5zIHtUaWxlfSB0aWxlIG9iamVjdFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZmluZExvYWRlZFBhcmVudChjb29yZCwgbWluQ292ZXJpbmdab29tLCByZXRhaW4pIHtcbiAgICAgICAgZm9yIChsZXQgeiA9IGNvb3JkLnogLSAxOyB6ID49IG1pbkNvdmVyaW5nWm9vbTsgei0tKSB7XG4gICAgICAgICAgICBjb29yZCA9IGNvb3JkLnBhcmVudCh0aGlzLl9zb3VyY2UubWF4em9vbSk7XG4gICAgICAgICAgICBjb25zdCB0aWxlID0gdGhpcy5fdGlsZXNbY29vcmQuaWRdO1xuICAgICAgICAgICAgaWYgKHRpbGUgJiYgdGlsZS5oYXNEYXRhKCkpIHtcbiAgICAgICAgICAgICAgICByZXRhaW5bY29vcmQuaWRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGlsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9jYWNoZS5oYXMoY29vcmQuaWQpKSB7XG4gICAgICAgICAgICAgICAgcmV0YWluW2Nvb3JkLmlkXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlLmdldChjb29yZC5pZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNpemVzIHRoZSB0aWxlIGNhY2hlIGJhc2VkIG9uIHRoZSBjdXJyZW50IHZpZXdwb3J0J3Mgc2l6ZS5cbiAgICAgKlxuICAgICAqIExhcmdlciB2aWV3cG9ydHMgdXNlIG1vcmUgdGlsZXMgYW5kIG5lZWQgbGFyZ2VyIGNhY2hlcy4gTGFyZ2VyIHZpZXdwb3J0c1xuICAgICAqIGFyZSBtb3JlIGxpa2VseSB0byBiZSBmb3VuZCBvbiBkZXZpY2VzIHdpdGggbW9yZSBtZW1vcnkgYW5kIG9uIHBhZ2VzIHdoZXJlXG4gICAgICogdGhlIG1hcCBpcyBtb3JlIGltcG9ydGFudC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgdXBkYXRlQ2FjaGVTaXplKHRyYW5zZm9ybSkge1xuICAgICAgICBjb25zdCB3aWR0aEluVGlsZXMgPSBNYXRoLmNlaWwodHJhbnNmb3JtLndpZHRoIC8gdHJhbnNmb3JtLnRpbGVTaXplKSArIDE7XG4gICAgICAgIGNvbnN0IGhlaWdodEluVGlsZXMgPSBNYXRoLmNlaWwodHJhbnNmb3JtLmhlaWdodCAvIHRyYW5zZm9ybS50aWxlU2l6ZSkgKyAxO1xuICAgICAgICBjb25zdCBhcHByb3hUaWxlc0luVmlldyA9IHdpZHRoSW5UaWxlcyAqIGhlaWdodEluVGlsZXM7XG4gICAgICAgIGNvbnN0IGNvbW1vblpvb21SYW5nZSA9IDU7XG4gICAgICAgIHRoaXMuX2NhY2hlLnNldE1heFNpemUoTWF0aC5mbG9vcihhcHByb3hUaWxlc0luVmlldyAqIGNvbW1vblpvb21SYW5nZSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGlsZXMgdGhhdCBhcmUgb3V0c2lkZSB0aGUgdmlld3BvcnQgYW5kIGFkZHMgbmV3IHRpbGVzIHRoYXRcbiAgICAgKiBhcmUgaW5zaWRlIHRoZSB2aWV3cG9ydC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHVwZGF0ZSh0cmFuc2Zvcm0pIHtcbiAgICAgICAgaWYgKCF0aGlzLl9zb3VyY2VMb2FkZWQpIHsgcmV0dXJuOyB9XG4gICAgICAgIGxldCBpO1xuICAgICAgICBsZXQgY29vcmQ7XG4gICAgICAgIGxldCB0aWxlO1xuICAgICAgICBsZXQgcGFyZW50VGlsZTtcblxuICAgICAgICB0aGlzLnVwZGF0ZUNhY2hlU2l6ZSh0cmFuc2Zvcm0pO1xuXG4gICAgICAgIC8vIERldGVybWluZSB0aGUgb3Zlcnpvb21pbmcvdW5kZXJ6b29taW5nIGFtb3VudHMuXG4gICAgICAgIGNvbnN0IHpvb20gPSAodGhpcy5fc291cmNlLnJvdW5kWm9vbSA/IE1hdGgucm91bmQgOiBNYXRoLmZsb29yKSh0aGlzLmdldFpvb20odHJhbnNmb3JtKSk7XG4gICAgICAgIGNvbnN0IG1pbkNvdmVyaW5nWm9vbSA9IE1hdGgubWF4KHpvb20gLSBTb3VyY2VDYWNoZS5tYXhPdmVyem9vbWluZywgdGhpcy5fc291cmNlLm1pbnpvb20pO1xuICAgICAgICBjb25zdCBtYXhDb3ZlcmluZ1pvb20gPSBNYXRoLm1heCh6b29tICsgU291cmNlQ2FjaGUubWF4VW5kZXJ6b29taW5nLCAgdGhpcy5fc291cmNlLm1pbnpvb20pO1xuXG4gICAgICAgIC8vIFJldGFpbiBpcyBhIGxpc3Qgb2YgdGlsZXMgdGhhdCB3ZSBzaG91bGRuJ3QgZGVsZXRlLCBldmVuIGlmIHRoZXkgYXJlIG5vdFxuICAgICAgICAvLyB0aGUgbW9zdCBpZGVhbCB0aWxlIGZvciB0aGUgY3VycmVudCB2aWV3cG9ydC4gVGhpcyBtYXkgaW5jbHVkZSB0aWxlcyBsaWtlXG4gICAgICAgIC8vIHBhcmVudCBvciBjaGlsZCB0aWxlcyB0aGF0IGFyZSAqYWxyZWFkeSogbG9hZGVkLlxuICAgICAgICBjb25zdCByZXRhaW4gPSB7fTtcblxuICAgICAgICAvLyBDb3ZlcmVkIGlzIGEgbGlzdCBvZiByZXRhaW5lZCB0aWxlcyB3aG8ncyBhcmVhcyBhcmUgZnVsbCBjb3ZlcmVkIGJ5IG90aGVyLFxuICAgICAgICAvLyBiZXR0ZXIsIHJldGFpbmVkIHRpbGVzLiBUaGV5IGFyZSBub3QgZHJhd24gc2VwYXJhdGVseS5cbiAgICAgICAgdGhpcy5fY292ZXJlZFRpbGVzID0ge307XG5cbiAgICAgICAgbGV0IHZpc2libGVDb29yZHM7XG4gICAgICAgIGlmICghdGhpcy51c2VkKSB7XG4gICAgICAgICAgICB2aXNpYmxlQ29vcmRzID0gW107XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fc291cmNlLmNvb3JkKSB7XG4gICAgICAgICAgICB2aXNpYmxlQ29vcmRzID0gW3RoaXMuX3NvdXJjZS5jb29yZF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2aXNpYmxlQ29vcmRzID0gdHJhbnNmb3JtLmNvdmVyaW5nVGlsZXMoe1xuICAgICAgICAgICAgICAgIHRpbGVTaXplOiB0aGlzLl9zb3VyY2UudGlsZVNpemUsXG4gICAgICAgICAgICAgICAgbWluem9vbTogdGhpcy5fc291cmNlLm1pbnpvb20sXG4gICAgICAgICAgICAgICAgbWF4em9vbTogdGhpcy5fc291cmNlLm1heHpvb20sXG4gICAgICAgICAgICAgICAgcm91bmRab29tOiB0aGlzLl9zb3VyY2Uucm91bmRab29tLFxuICAgICAgICAgICAgICAgIHJlcGFyc2VPdmVyc2NhbGVkOiB0aGlzLl9zb3VyY2UucmVwYXJzZU92ZXJzY2FsZWRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHZpc2libGVDb29yZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvb3JkID0gdmlzaWJsZUNvb3Jkc1tpXTtcbiAgICAgICAgICAgIHRpbGUgPSB0aGlzLmFkZFRpbGUoY29vcmQpO1xuXG4gICAgICAgICAgICByZXRhaW5bY29vcmQuaWRdID0gdHJ1ZTtcblxuICAgICAgICAgICAgaWYgKHRpbGUuaGFzRGF0YSgpKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAvLyBUaGUgdGlsZSB3ZSByZXF1aXJlIGlzIG5vdCB5ZXQgbG9hZGVkLlxuICAgICAgICAgICAgLy8gUmV0YWluIGNoaWxkIG9yIHBhcmVudCB0aWxlcyB0aGF0IGNvdmVyIHRoZSBzYW1lIGFyZWEuXG4gICAgICAgICAgICBpZiAoIXRoaXMuZmluZExvYWRlZENoaWxkcmVuKGNvb3JkLCBtYXhDb3ZlcmluZ1pvb20sIHJldGFpbikpIHtcbiAgICAgICAgICAgICAgICBwYXJlbnRUaWxlID0gdGhpcy5maW5kTG9hZGVkUGFyZW50KGNvb3JkLCBtaW5Db3ZlcmluZ1pvb20sIHJldGFpbik7XG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudFRpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRUaWxlKHBhcmVudFRpbGUuY29vcmQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhcmVudHNGb3JGYWRpbmcgPSB7fTtcblxuICAgICAgICBpZiAoaXNSYXN0ZXJUeXBlKHRoaXMuX3NvdXJjZS50eXBlKSkge1xuICAgICAgICAgICAgY29uc3QgaWRzID0gT2JqZWN0LmtleXMocmV0YWluKTtcbiAgICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgaWRzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaWQgPSBpZHNba107XG4gICAgICAgICAgICAgICAgY29vcmQgPSBUaWxlQ29vcmQuZnJvbUlEKGlkKTtcbiAgICAgICAgICAgICAgICB0aWxlID0gdGhpcy5fdGlsZXNbaWRdO1xuICAgICAgICAgICAgICAgIGlmICghdGlsZSkgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgZHJhd1Jhc3RlclRpbGUgaGFzIG5ldmVyIHNlZW4gdGhpcyB0aWxlLCB0aGVuXG4gICAgICAgICAgICAgICAgLy8gdGlsZS5mYWRlRW5kVGltZSBtYXkgYmUgdW5zZXQuICBJbiB0aGF0IGNhc2UsIG9yIGlmXG4gICAgICAgICAgICAgICAgLy8gZmFkZUVuZFRpbWUgaXMgaW4gdGhlIGZ1dHVyZSwgdGhlbiB0aGlzIHRpbGUgaXMgc3RpbGxcbiAgICAgICAgICAgICAgICAvLyBmYWRpbmcgaW4uIEZpbmQgdGlsZXMgdG8gY3Jvc3MtZmFkZSB3aXRoIGl0LlxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGlsZS5mYWRlRW5kVGltZSA9PT0gJ3VuZGVmaW5lZCcgfHwgdGlsZS5mYWRlRW5kVGltZSA+PSBEYXRlLm5vdygpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpbmRMb2FkZWRDaGlsZHJlbihjb29yZCwgbWF4Q292ZXJpbmdab29tLCByZXRhaW4pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRhaW5baWRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwYXJlbnRUaWxlID0gdGhpcy5maW5kTG9hZGVkUGFyZW50KGNvb3JkLCBtaW5Db3ZlcmluZ1pvb20sIHBhcmVudHNGb3JGYWRpbmcpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50VGlsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRUaWxlKHBhcmVudFRpbGUuY29vcmQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGZhZGVkUGFyZW50O1xuICAgICAgICBmb3IgKGZhZGVkUGFyZW50IGluIHBhcmVudHNGb3JGYWRpbmcpIHtcbiAgICAgICAgICAgIGlmICghcmV0YWluW2ZhZGVkUGFyZW50XSkge1xuICAgICAgICAgICAgICAgIC8vIElmIGEgdGlsZSBpcyBvbmx5IG5lZWRlZCBmb3IgZmFkaW5nLCBtYXJrIGl0IGFzIGNvdmVyZWQgc28gdGhhdCBpdCBpc24ndCByZW5kZXJlZCBvbiBpdCdzIG93bi5cbiAgICAgICAgICAgICAgICB0aGlzLl9jb3ZlcmVkVGlsZXNbZmFkZWRQYXJlbnRdID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGZhZGVkUGFyZW50IGluIHBhcmVudHNGb3JGYWRpbmcpIHtcbiAgICAgICAgICAgIHJldGFpbltmYWRlZFBhcmVudF0gPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVtb3ZlIHRoZSB0aWxlcyB3ZSBkb24ndCBuZWVkIGFueW1vcmUuXG4gICAgICAgIGNvbnN0IHJlbW92ZSA9IHV0aWwua2V5c0RpZmZlcmVuY2UodGhpcy5fdGlsZXMsIHJldGFpbik7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCByZW1vdmUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlVGlsZSgrcmVtb3ZlW2ldKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudHJhbnNmb3JtID0gdHJhbnNmb3JtO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZCBhIHRpbGUsIGdpdmVuIGl0cyBjb29yZGluYXRlLCB0byB0aGUgcHlyYW1pZC5cbiAgICAgKiBAcGFyYW0ge0Nvb3JkaW5hdGV9IGNvb3JkXG4gICAgICogQHJldHVybnMge0Nvb3JkaW5hdGV9IHRoZSBjb29yZGluYXRlLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgYWRkVGlsZShjb29yZCkge1xuICAgICAgICBsZXQgdGlsZSA9IHRoaXMuX3RpbGVzW2Nvb3JkLmlkXTtcbiAgICAgICAgaWYgKHRpbGUpXG4gICAgICAgICAgICByZXR1cm4gdGlsZTtcblxuICAgICAgICBjb25zdCB3cmFwcGVkID0gY29vcmQud3JhcHBlZCgpO1xuICAgICAgICB0aWxlID0gdGhpcy5fdGlsZXNbd3JhcHBlZC5pZF07XG5cbiAgICAgICAgaWYgKCF0aWxlKSB7XG4gICAgICAgICAgICB0aWxlID0gdGhpcy5fY2FjaGUuZ2V0KHdyYXBwZWQuaWQpO1xuICAgICAgICAgICAgaWYgKHRpbGUpIHtcbiAgICAgICAgICAgICAgICB0aWxlLnJlZG9QbGFjZW1lbnQodGhpcy5fc291cmNlKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fY2FjaGVUaW1lcnNbd3JhcHBlZC5pZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX2NhY2hlVGltZXJzW3dyYXBwZWQuaWRdKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVUaW1lcnNbd3JhcHBlZC5pZF0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NldFRpbGVSZWxvYWRUaW1lcih3cmFwcGVkLmlkLCB0aWxlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRpbGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHpvb20gPSBjb29yZC56O1xuICAgICAgICAgICAgY29uc3Qgb3ZlcnNjYWxpbmcgPSB6b29tID4gdGhpcy5fc291cmNlLm1heHpvb20gPyBNYXRoLnBvdygyLCB6b29tIC0gdGhpcy5fc291cmNlLm1heHpvb20pIDogMTtcbiAgICAgICAgICAgIHRpbGUgPSBuZXcgVGlsZSh3cmFwcGVkLCB0aGlzLl9zb3VyY2UudGlsZVNpemUgKiBvdmVyc2NhbGluZywgdGhpcy5fc291cmNlLm1heHpvb20pO1xuICAgICAgICAgICAgdGhpcy5sb2FkVGlsZSh0aWxlLCB0aGlzLl90aWxlTG9hZGVkLmJpbmQodGhpcywgdGlsZSwgY29vcmQuaWQpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRpbGUudXNlcysrO1xuICAgICAgICB0aGlzLl90aWxlc1tjb29yZC5pZF0gPSB0aWxlO1xuICAgICAgICB0aGlzLl9zb3VyY2UuZmlyZSgnZGF0YWxvYWRpbmcnLCB7dGlsZTogdGlsZSwgY29vcmQ6IHRpbGUuY29vcmQsIGRhdGFUeXBlOiAndGlsZSd9KTtcblxuICAgICAgICByZXR1cm4gdGlsZTtcbiAgICB9XG5cbiAgICBfc2V0VGlsZVJlbG9hZFRpbWVyKGlkLCB0aWxlKSB7XG4gICAgICAgIGNvbnN0IHRpbGVFeHBpcmVzID0gdGlsZS5nZXRFeHBpcnkoKTtcbiAgICAgICAgaWYgKHRpbGVFeHBpcmVzKSB7XG4gICAgICAgICAgICB0aGlzLl90aW1lcnNbaWRdID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWxvYWRUaWxlKGlkLCAnZXhwaXJlZCcpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3RpbWVyc1tpZF0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9LCB0aWxlRXhwaXJlcyAtIG5ldyBEYXRlKCkuZ2V0VGltZSgpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9zZXRDYWNoZUludmFsaWRhdGlvblRpbWVyKGlkLCB0aWxlKSB7XG4gICAgICAgIGNvbnN0IHRpbGVFeHBpcmVzID0gdGlsZS5nZXRFeHBpcnkoKTtcbiAgICAgICAgaWYgKHRpbGVFeHBpcmVzKSB7XG4gICAgICAgICAgICB0aGlzLl9jYWNoZVRpbWVyc1tpZF0gPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZS5yZW1vdmUoaWQpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlVGltZXJzW2lkXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH0sIHRpbGVFeHBpcmVzIC0gbmV3IERhdGUoKS5nZXRUaW1lKCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGEgdGlsZSwgZ2l2ZW4gaXRzIGlkLCBmcm9tIHRoZSBweXJhbWlkXG4gICAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBpZCB0aWxlIGlkXG4gICAgICogQHJldHVybnMge3VuZGVmaW5lZH0gbm90aGluZ1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcmVtb3ZlVGlsZShpZCkge1xuICAgICAgICBjb25zdCB0aWxlID0gdGhpcy5fdGlsZXNbaWRdO1xuICAgICAgICBpZiAoIXRpbGUpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgdGlsZS51c2VzLS07XG4gICAgICAgIGRlbGV0ZSB0aGlzLl90aWxlc1tpZF07XG4gICAgICAgIGlmICh0aGlzLl90aW1lcnNbaWRdKSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZXJzW2lkXSk7XG4gICAgICAgICAgICB0aGlzLl90aW1lcnNbaWRdID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3NvdXJjZS5maXJlKCdkYXRhJywgeyB0aWxlOiB0aWxlLCBjb29yZDogdGlsZS5jb29yZCwgZGF0YVR5cGU6ICd0aWxlJyB9KTtcblxuICAgICAgICBpZiAodGlsZS51c2VzID4gMClcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBpZiAodGlsZS5oYXNEYXRhKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHdyYXBwZWRJZCA9IHRpbGUuY29vcmQud3JhcHBlZCgpLmlkO1xuICAgICAgICAgICAgdGhpcy5fY2FjaGUuYWRkKHdyYXBwZWRJZCwgdGlsZSk7XG4gICAgICAgICAgICB0aGlzLl9zZXRDYWNoZUludmFsaWRhdGlvblRpbWVyKHdyYXBwZWRJZCwgdGlsZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aWxlLmFib3J0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5hYm9ydFRpbGUodGlsZSk7XG4gICAgICAgICAgICB0aGlzLnVubG9hZFRpbGUodGlsZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYWxsIHRpbGVzIGZyb20gdGhpcyBweXJhbWlkXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBjbGVhclRpbGVzKCkge1xuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMuX3RpbGVzKVxuICAgICAgICAgICAgdGhpcy5yZW1vdmVUaWxlKGlkKTtcbiAgICAgICAgdGhpcy5fY2FjaGUucmVzZXQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZWFyY2ggdGhyb3VnaCBvdXIgY3VycmVudCB0aWxlcyBhbmQgYXR0ZW1wdCB0byBmaW5kIHRoZSB0aWxlcyB0aGF0XG4gICAgICogY292ZXIgdGhlIGdpdmVuIGJvdW5kcy5cbiAgICAgKiBAcGFyYW0ge0FycmF5PENvb3JkaW5hdGU+fSBxdWVyeUdlb21ldHJ5IGNvb3JkaW5hdGVzIG9mIHRoZSBjb3JuZXJzIG9mIGJvdW5kaW5nIHJlY3RhbmdsZVxuICAgICAqIEByZXR1cm5zIHtBcnJheTxPYmplY3Q+fSByZXN1bHQgaXRlbXMgaGF2ZSB7dGlsZSwgbWluWCwgbWF4WCwgbWluWSwgbWF4WX0sIHdoZXJlIG1pbi9tYXggYm91bmRpbmcgdmFsdWVzIGFyZSB0aGUgZ2l2ZW4gYm91bmRzIHRyYW5zZm9ybWVkIGluIGludG8gdGhlIGNvb3JkaW5hdGUgc3BhY2Ugb2YgdGhpcyB0aWxlLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgdGlsZXNJbihxdWVyeUdlb21ldHJ5KSB7XG4gICAgICAgIGNvbnN0IHRpbGVSZXN1bHRzID0ge307XG4gICAgICAgIGNvbnN0IGlkcyA9IHRoaXMuZ2V0SWRzKCk7XG5cbiAgICAgICAgbGV0IG1pblggPSBJbmZpbml0eTtcbiAgICAgICAgbGV0IG1pblkgPSBJbmZpbml0eTtcbiAgICAgICAgbGV0IG1heFggPSAtSW5maW5pdHk7XG4gICAgICAgIGxldCBtYXhZID0gLUluZmluaXR5O1xuICAgICAgICBjb25zdCB6ID0gcXVlcnlHZW9tZXRyeVswXS56b29tO1xuXG4gICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgcXVlcnlHZW9tZXRyeS5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgY29uc3QgcCA9IHF1ZXJ5R2VvbWV0cnlba107XG4gICAgICAgICAgICBtaW5YID0gTWF0aC5taW4obWluWCwgcC5jb2x1bW4pO1xuICAgICAgICAgICAgbWluWSA9IE1hdGgubWluKG1pblksIHAucm93KTtcbiAgICAgICAgICAgIG1heFggPSBNYXRoLm1heChtYXhYLCBwLmNvbHVtbik7XG4gICAgICAgICAgICBtYXhZID0gTWF0aC5tYXgobWF4WSwgcC5yb3cpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHRpbGUgPSB0aGlzLl90aWxlc1tpZHNbaV1dO1xuICAgICAgICAgICAgY29uc3QgY29vcmQgPSBUaWxlQ29vcmQuZnJvbUlEKGlkc1tpXSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHRpbGVTcGFjZUJvdW5kcyA9IFtcbiAgICAgICAgICAgICAgICBjb29yZGluYXRlVG9UaWxlUG9pbnQoY29vcmQsIHRpbGUuc291cmNlTWF4Wm9vbSwgbmV3IENvb3JkaW5hdGUobWluWCwgbWluWSwgeikpLFxuICAgICAgICAgICAgICAgIGNvb3JkaW5hdGVUb1RpbGVQb2ludChjb29yZCwgdGlsZS5zb3VyY2VNYXhab29tLCBuZXcgQ29vcmRpbmF0ZShtYXhYLCBtYXhZLCB6KSlcbiAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgIGlmICh0aWxlU3BhY2VCb3VuZHNbMF0ueCA8IEVYVEVOVCAmJiB0aWxlU3BhY2VCb3VuZHNbMF0ueSA8IEVYVEVOVCAmJlxuICAgICAgICAgICAgICAgIHRpbGVTcGFjZUJvdW5kc1sxXS54ID49IDAgJiYgdGlsZVNwYWNlQm91bmRzWzFdLnkgPj0gMCkge1xuXG4gICAgICAgICAgICAgICAgY29uc3QgdGlsZVNwYWNlUXVlcnlHZW9tZXRyeSA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcXVlcnlHZW9tZXRyeS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICB0aWxlU3BhY2VRdWVyeUdlb21ldHJ5LnB1c2goY29vcmRpbmF0ZVRvVGlsZVBvaW50KGNvb3JkLCB0aWxlLnNvdXJjZU1heFpvb20sIHF1ZXJ5R2VvbWV0cnlbal0pKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgdGlsZVJlc3VsdCA9IHRpbGVSZXN1bHRzW3RpbGUuY29vcmQuaWRdO1xuICAgICAgICAgICAgICAgIGlmICh0aWxlUmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGlsZVJlc3VsdCA9IHRpbGVSZXN1bHRzW3RpbGUuY29vcmQuaWRdID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGlsZTogdGlsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvb3JkOiBjb29yZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5R2VvbWV0cnk6IFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGU6IE1hdGgucG93KDIsIHRoaXMudHJhbnNmb3JtLnpvb20gLSB0aWxlLmNvb3JkLnopXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gV3JhcHBlZCB0aWxlcyBzaGFyZSBvbmUgdGlsZVJlc3VsdCBvYmplY3QgYnV0IGNhbiBoYXZlIG11bHRpcGxlIHF1ZXJ5R2VvbWV0cnkgcGFydHNcbiAgICAgICAgICAgICAgICB0aWxlUmVzdWx0LnF1ZXJ5R2VvbWV0cnkucHVzaCh0aWxlU3BhY2VRdWVyeUdlb21ldHJ5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCB0IGluIHRpbGVSZXN1bHRzKSB7XG4gICAgICAgICAgICByZXN1bHRzLnB1c2godGlsZVJlc3VsdHNbdF0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH1cblxuICAgIHJlZG9QbGFjZW1lbnQoKSB7XG4gICAgICAgIGNvbnN0IGlkcyA9IHRoaXMuZ2V0SWRzKCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCB0aWxlID0gdGhpcy5nZXRUaWxlQnlJRChpZHNbaV0pO1xuICAgICAgICAgICAgdGlsZS5yZWRvUGxhY2VtZW50KHRoaXMuX3NvdXJjZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRWaXNpYmxlQ29vcmRpbmF0ZXMoKSB7XG4gICAgICAgIGNvbnN0IGNvb3JkcyA9IHRoaXMuZ2V0UmVuZGVyYWJsZUlkcygpLm1hcChUaWxlQ29vcmQuZnJvbUlEKTtcbiAgICAgICAgZm9yIChjb25zdCBjb29yZCBvZiBjb29yZHMpIHtcbiAgICAgICAgICAgIGNvb3JkLnBvc01hdHJpeCA9IHRoaXMudHJhbnNmb3JtLmNhbGN1bGF0ZVBvc01hdHJpeChjb29yZCwgdGhpcy5fc291cmNlLm1heHpvb20pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb29yZHM7XG4gICAgfVxufVxuXG5Tb3VyY2VDYWNoZS5tYXhPdmVyem9vbWluZyA9IDEwO1xuU291cmNlQ2FjaGUubWF4VW5kZXJ6b29taW5nID0gMztcblxuLyoqXG4gKiBDb252ZXJ0IGEgY29vcmRpbmF0ZSB0byBhIHBvaW50IGluIGEgdGlsZSdzIGNvb3JkaW5hdGUgc3BhY2UuXG4gKiBAcGFyYW0ge0Nvb3JkaW5hdGV9IHRpbGVDb29yZFxuICogQHBhcmFtIHtDb29yZGluYXRlfSBjb29yZFxuICogQHJldHVybnMge09iamVjdH0gcG9zaXRpb25cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNvb3JkaW5hdGVUb1RpbGVQb2ludCh0aWxlQ29vcmQsIHNvdXJjZU1heFpvb20sIGNvb3JkKSB7XG4gICAgY29uc3Qgem9vbWVkQ29vcmQgPSBjb29yZC56b29tVG8oTWF0aC5taW4odGlsZUNvb3JkLnosIHNvdXJjZU1heFpvb20pKTtcbiAgICByZXR1cm4ge1xuICAgICAgICB4OiAoem9vbWVkQ29vcmQuY29sdW1uIC0gKHRpbGVDb29yZC54ICsgdGlsZUNvb3JkLncgKiBNYXRoLnBvdygyLCB0aWxlQ29vcmQueikpKSAqIEVYVEVOVCxcbiAgICAgICAgeTogKHpvb21lZENvb3JkLnJvdyAtIHRpbGVDb29yZC55KSAqIEVYVEVOVFxuICAgIH07XG5cbn1cblxuZnVuY3Rpb24gY29tcGFyZUtleVpvb20oYSwgYikge1xuICAgIHJldHVybiAoYSAlIDMyKSAtIChiICUgMzIpO1xufVxuXG5mdW5jdGlvbiBpc1Jhc3RlclR5cGUodHlwZSkge1xuICAgIHJldHVybiB0eXBlID09PSAncmFzdGVyJyB8fCB0eXBlID09PSAnaW1hZ2UnIHx8IHR5cGUgPT09ICd2aWRlbyc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gU291cmNlQ2FjaGU7XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHV0aWwgPSByZXF1aXJlKCcuLi91dGlsL3V0aWwnKTtcbmNvbnN0IEJ1Y2tldCA9IHJlcXVpcmUoJy4uL2RhdGEvYnVja2V0Jyk7XG5jb25zdCBGZWF0dXJlSW5kZXggPSByZXF1aXJlKCcuLi9kYXRhL2ZlYXR1cmVfaW5kZXgnKTtcbmNvbnN0IHZ0ID0gcmVxdWlyZSgndmVjdG9yLXRpbGUnKTtcbmNvbnN0IFByb3RvYnVmID0gcmVxdWlyZSgncGJmJyk7XG5jb25zdCBHZW9KU09ORmVhdHVyZSA9IHJlcXVpcmUoJy4uL3V0aWwvdmVjdG9ydGlsZV90b19nZW9qc29uJyk7XG5jb25zdCBmZWF0dXJlRmlsdGVyID0gcmVxdWlyZSgnZmVhdHVyZS1maWx0ZXInKTtcbmNvbnN0IENvbGxpc2lvblRpbGUgPSByZXF1aXJlKCcuLi9zeW1ib2wvY29sbGlzaW9uX3RpbGUnKTtcbmNvbnN0IENvbGxpc2lvbkJveEFycmF5ID0gcmVxdWlyZSgnLi4vc3ltYm9sL2NvbGxpc2lvbl9ib3gnKTtcbmNvbnN0IFN5bWJvbEluc3RhbmNlc0FycmF5ID0gcmVxdWlyZSgnLi4vc3ltYm9sL3N5bWJvbF9pbnN0YW5jZXMnKTtcbmNvbnN0IFN5bWJvbFF1YWRzQXJyYXkgPSByZXF1aXJlKCcuLi9zeW1ib2wvc3ltYm9sX3F1YWRzJyk7XG5cbi8qKlxuICogQSB0aWxlIG9iamVjdCBpcyB0aGUgY29tYmluYXRpb24gb2YgYSBDb29yZGluYXRlLCB3aGljaCBkZWZpbmVzXG4gKiBpdHMgcGxhY2UsIGFzIHdlbGwgYXMgYSB1bmlxdWUgSUQgYW5kIGRhdGEgdHJhY2tpbmcgZm9yIGl0cyBjb250ZW50XG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgVGlsZSB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtDb29yZGluYXRlfSBjb29yZFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzaXplXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoY29vcmQsIHNpemUsIHNvdXJjZU1heFpvb20pIHtcbiAgICAgICAgdGhpcy5jb29yZCA9IGNvb3JkO1xuICAgICAgICB0aGlzLnVpZCA9IHV0aWwudW5pcXVlSWQoKTtcbiAgICAgICAgdGhpcy51c2VzID0gMDtcbiAgICAgICAgdGhpcy50aWxlU2l6ZSA9IHNpemU7XG4gICAgICAgIHRoaXMuc291cmNlTWF4Wm9vbSA9IHNvdXJjZU1heFpvb207XG4gICAgICAgIHRoaXMuYnVja2V0cyA9IHt9O1xuICAgICAgICB0aGlzLmV4cGlyZXMgPSBudWxsO1xuICAgICAgICB0aGlzLmNhY2hlQ29udHJvbCA9IG51bGw7XG5cbiAgICAgICAgLy8gYHRoaXMuc3RhdGVgIG11c3QgYmUgb25lIG9mXG4gICAgICAgIC8vXG4gICAgICAgIC8vIC0gYGxvYWRpbmdgOiAgIFRpbGUgZGF0YSBpcyBpbiB0aGUgcHJvY2VzcyBvZiBsb2FkaW5nLlxuICAgICAgICAvLyAtIGBsb2FkZWRgOiAgICBUaWxlIGRhdGEgaGFzIGJlZW4gbG9hZGVkLiBUaWxlIGNhbiBiZSByZW5kZXJlZC5cbiAgICAgICAgLy8gLSBgcmVsb2FkaW5nYDogVGlsZSBkYXRhIGhhcyBiZWVuIGxvYWRlZCBhbmQgaXMgYmVpbmcgdXBkYXRlZC4gVGlsZSBjYW4gYmUgcmVuZGVyZWQuXG4gICAgICAgIC8vIC0gYHVubG9hZGVkYDogIFRpbGUgZGF0YSBoYXMgYmVlbiBkZWxldGVkLlxuICAgICAgICAvLyAtIGBlcnJvcmVkYDogICBUaWxlIGRhdGEgd2FzIG5vdCBsb2FkZWQgYmVjYXVzZSBvZiBhbiBlcnJvci5cbiAgICAgICAgLy8gLSBgZXhwaXJlZGA6ICAgVGlsZSBkYXRhIHdhcyBwcmV2aW91c2x5IGxvYWRlZCwgYnV0IGhhcyBleHBpcmVkIHBlciBpdHMgSFRUUCBoZWFkZXJzIGFuZCBpcyBpbiB0aGUgcHJvY2VzcyBvZiByZWZyZXNoaW5nLlxuICAgICAgICB0aGlzLnN0YXRlID0gJ2xvYWRpbmcnO1xuICAgIH1cblxuICAgIHJlZ2lzdGVyRmFkZUR1cmF0aW9uKGFuaW1hdGlvbkxvb3AsIGR1cmF0aW9uKSB7XG4gICAgICAgIGNvbnN0IGZhZGVFbmRUaW1lID0gZHVyYXRpb24gKyB0aGlzLnRpbWVBZGRlZDtcbiAgICAgICAgaWYgKGZhZGVFbmRUaW1lIDwgRGF0ZS5ub3coKSkgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy5mYWRlRW5kVGltZSAmJiBmYWRlRW5kVGltZSA8IHRoaXMuZmFkZUVuZFRpbWUpIHJldHVybjtcblxuICAgICAgICB0aGlzLmZhZGVFbmRUaW1lID0gZmFkZUVuZFRpbWU7XG4gICAgICAgIGFuaW1hdGlvbkxvb3Auc2V0KHRoaXMuZmFkZUVuZFRpbWUgLSBEYXRlLm5vdygpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHaXZlbiBhIGRhdGEgb2JqZWN0IHdpdGggYSAnYnVmZmVycycgcHJvcGVydHksIGxvYWQgaXQgaW50b1xuICAgICAqIHRoaXMgdGlsZSdzIGVsZW1lbnRHcm91cHMgYW5kIGJ1ZmZlcnMgcHJvcGVydGllcyBhbmQgc2V0IGxvYWRlZFxuICAgICAqIHRvIHRydWUuIElmIHRoZSBkYXRhIGlzIG51bGwsIGxpa2UgaW4gdGhlIGNhc2Ugb2YgYW4gZW1wdHlcbiAgICAgKiBHZW9KU09OIHRpbGUsIG5vLW9wIGJ1dCBzdGlsbCBzZXQgbG9hZGVkIHRvIHRydWUuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGFcbiAgICAgKiBAcmV0dXJucyB7dW5kZWZpbmVkfVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgbG9hZFZlY3RvckRhdGEoZGF0YSwgcGFpbnRlcikge1xuICAgICAgICBpZiAodGhpcy5oYXNEYXRhKCkpIHtcbiAgICAgICAgICAgIHRoaXMudW5sb2FkVmVjdG9yRGF0YShwYWludGVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc3RhdGUgPSAnbG9hZGVkJztcblxuICAgICAgICAvLyBlbXB0eSBHZW9KU09OIHRpbGVcbiAgICAgICAgaWYgKCFkYXRhKSByZXR1cm47XG5cbiAgICAgICAgLy8gSWYgd2UgYXJlIHJlZG9pbmcgcGxhY2VtZW50IGZvciB0aGUgc2FtZSB0aWxlLCB3ZSB3aWxsIG5vdCByZWNpZXZlXG4gICAgICAgIC8vIGEgbmV3IFwicmF3VGlsZURhdGFcIiBvYmplY3QuIElmIHdlIGFyZSBsb2FkaW5nIGEgbmV3IHRpbGUsIHdlIHdpbGxcbiAgICAgICAgLy8gcmVjaWV2ZSBhIG5ldyBcInJhd1RpbGVEYXRhXCIgb2JqZWN0LlxuICAgICAgICBpZiAoZGF0YS5yYXdUaWxlRGF0YSkge1xuICAgICAgICAgICAgdGhpcy5yYXdUaWxlRGF0YSA9IGRhdGEucmF3VGlsZURhdGE7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbGxpc2lvbkJveEFycmF5ID0gbmV3IENvbGxpc2lvbkJveEFycmF5KGRhdGEuY29sbGlzaW9uQm94QXJyYXkpO1xuICAgICAgICB0aGlzLmNvbGxpc2lvblRpbGUgPSBuZXcgQ29sbGlzaW9uVGlsZShkYXRhLmNvbGxpc2lvblRpbGUsIHRoaXMuY29sbGlzaW9uQm94QXJyYXkpO1xuICAgICAgICB0aGlzLnN5bWJvbEluc3RhbmNlc0FycmF5ID0gbmV3IFN5bWJvbEluc3RhbmNlc0FycmF5KGRhdGEuc3ltYm9sSW5zdGFuY2VzQXJyYXkpO1xuICAgICAgICB0aGlzLnN5bWJvbFF1YWRzQXJyYXkgPSBuZXcgU3ltYm9sUXVhZHNBcnJheShkYXRhLnN5bWJvbFF1YWRzQXJyYXkpO1xuICAgICAgICB0aGlzLmZlYXR1cmVJbmRleCA9IG5ldyBGZWF0dXJlSW5kZXgoZGF0YS5mZWF0dXJlSW5kZXgsIHRoaXMucmF3VGlsZURhdGEsIHRoaXMuY29sbGlzaW9uVGlsZSk7XG4gICAgICAgIHRoaXMuYnVja2V0cyA9IEJ1Y2tldC5kZXNlcmlhbGl6ZShkYXRhLmJ1Y2tldHMsIHBhaW50ZXIuc3R5bGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlcGxhY2UgdGhpcyB0aWxlJ3Mgc3ltYm9sIGJ1Y2tldHMgd2l0aCBmcmVzaCBkYXRhLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhXG4gICAgICogQHBhcmFtIHtTdHlsZX0gc3R5bGVcbiAgICAgKiBAcmV0dXJucyB7dW5kZWZpbmVkfVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcmVsb2FkU3ltYm9sRGF0YShkYXRhLCBzdHlsZSkge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZSA9PT0gJ3VubG9hZGVkJykgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuY29sbGlzaW9uVGlsZSA9IG5ldyBDb2xsaXNpb25UaWxlKGRhdGEuY29sbGlzaW9uVGlsZSwgdGhpcy5jb2xsaXNpb25Cb3hBcnJheSk7XG4gICAgICAgIHRoaXMuZmVhdHVyZUluZGV4LnNldENvbGxpc2lvblRpbGUodGhpcy5jb2xsaXNpb25UaWxlKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMuYnVja2V0cykge1xuICAgICAgICAgICAgY29uc3QgYnVja2V0ID0gdGhpcy5idWNrZXRzW2lkXTtcbiAgICAgICAgICAgIGlmIChidWNrZXQubGF5ZXJzWzBdLnR5cGUgPT09ICdzeW1ib2wnKSB7XG4gICAgICAgICAgICAgICAgYnVja2V0LmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5idWNrZXRzW2lkXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFkZCBuZXcgc3ltYm9sIGJ1Y2tldHNcbiAgICAgICAgdXRpbC5leHRlbmQodGhpcy5idWNrZXRzLCBCdWNrZXQuZGVzZXJpYWxpemUoZGF0YS5idWNrZXRzLCBzdHlsZSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbGVhc2UgYW55IGRhdGEgb3IgV2ViR0wgcmVzb3VyY2VzIHJlZmVyZW5jZWQgYnkgdGhpcyB0aWxlLlxuICAgICAqIEByZXR1cm5zIHt1bmRlZmluZWR9XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICB1bmxvYWRWZWN0b3JEYXRhKCkge1xuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMuYnVja2V0cykge1xuICAgICAgICAgICAgdGhpcy5idWNrZXRzW2lkXS5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5idWNrZXRzID0ge307XG5cbiAgICAgICAgdGhpcy5jb2xsaXNpb25Cb3hBcnJheSA9IG51bGw7XG4gICAgICAgIHRoaXMuc3ltYm9sUXVhZHNBcnJheSA9IG51bGw7XG4gICAgICAgIHRoaXMuc3ltYm9sSW5zdGFuY2VzQXJyYXkgPSBudWxsO1xuICAgICAgICB0aGlzLmNvbGxpc2lvblRpbGUgPSBudWxsO1xuICAgICAgICB0aGlzLmZlYXR1cmVJbmRleCA9IG51bGw7XG4gICAgICAgIHRoaXMuc3RhdGUgPSAndW5sb2FkZWQnO1xuICAgIH1cblxuICAgIHJlZG9QbGFjZW1lbnQoc291cmNlKSB7XG4gICAgICAgIGlmIChzb3VyY2UudHlwZSAhPT0gJ3ZlY3RvcicgJiYgc291cmNlLnR5cGUgIT09ICdnZW9qc29uJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnN0YXRlICE9PSAnbG9hZGVkJykge1xuICAgICAgICAgICAgdGhpcy5yZWRvV2hlbkRvbmUgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5jb2xsaXNpb25UaWxlKSB7IC8vIGVtcHR5IHRpbGVcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc3RhdGUgPSAncmVsb2FkaW5nJztcblxuICAgICAgICBzb3VyY2UuZGlzcGF0Y2hlci5zZW5kKCdyZWRvUGxhY2VtZW50Jywge1xuICAgICAgICAgICAgdHlwZTogc291cmNlLnR5cGUsXG4gICAgICAgICAgICB1aWQ6IHRoaXMudWlkLFxuICAgICAgICAgICAgc291cmNlOiBzb3VyY2UuaWQsXG4gICAgICAgICAgICBhbmdsZTogc291cmNlLm1hcC50cmFuc2Zvcm0uYW5nbGUsXG4gICAgICAgICAgICBwaXRjaDogc291cmNlLm1hcC50cmFuc2Zvcm0ucGl0Y2gsXG4gICAgICAgICAgICBzaG93Q29sbGlzaW9uQm94ZXM6IHNvdXJjZS5tYXAuc2hvd0NvbGxpc2lvbkJveGVzXG4gICAgICAgIH0sIChfLCBkYXRhKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlbG9hZFN5bWJvbERhdGEoZGF0YSwgc291cmNlLm1hcC5zdHlsZSk7XG4gICAgICAgICAgICBzb3VyY2UuZmlyZSgnZGF0YScsIHt0aWxlOiB0aGlzLCBjb29yZDogdGhpcy5jb29yZCwgZGF0YVR5cGU6ICd0aWxlJ30pO1xuXG4gICAgICAgICAgICAvLyBIQUNLIHRoaXMgaXMgbmVzY2Vzc2FyeSB0byBmaXggaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvaXNzdWVzLzI5ODZcbiAgICAgICAgICAgIGlmIChzb3VyY2UubWFwKSBzb3VyY2UubWFwLnBhaW50ZXIudGlsZUV4dGVudFZBTy52YW8gPSBudWxsO1xuXG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gJ2xvYWRlZCc7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnJlZG9XaGVuRG9uZSkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVkb1doZW5Eb25lID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWRvUGxhY2VtZW50KHNvdXJjZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHRoaXMud29ya2VySUQpO1xuICAgIH1cblxuICAgIGdldEJ1Y2tldChsYXllcikge1xuICAgICAgICByZXR1cm4gdGhpcy5idWNrZXRzW2xheWVyLmlkXTtcbiAgICB9XG5cbiAgICBxdWVyeVNvdXJjZUZlYXR1cmVzKHJlc3VsdCwgcGFyYW1zKSB7XG4gICAgICAgIGlmICghdGhpcy5yYXdUaWxlRGF0YSkgcmV0dXJuO1xuXG4gICAgICAgIGlmICghdGhpcy52dExheWVycykge1xuICAgICAgICAgICAgdGhpcy52dExheWVycyA9IG5ldyB2dC5WZWN0b3JUaWxlKG5ldyBQcm90b2J1Zih0aGlzLnJhd1RpbGVEYXRhKSkubGF5ZXJzO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLnZ0TGF5ZXJzLl9nZW9qc29uVGlsZUxheWVyIHx8IHRoaXMudnRMYXllcnNbcGFyYW1zLnNvdXJjZUxheWVyXTtcblxuICAgICAgICBpZiAoIWxheWVyKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgZmlsdGVyID0gZmVhdHVyZUZpbHRlcihwYXJhbXMgJiYgcGFyYW1zLmZpbHRlcik7XG4gICAgICAgIGNvbnN0IGNvb3JkID0geyB6OiB0aGlzLmNvb3JkLnosIHg6IHRoaXMuY29vcmQueCwgeTogdGhpcy5jb29yZC55IH07XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsYXllci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgZmVhdHVyZSA9IGxheWVyLmZlYXR1cmUoaSk7XG4gICAgICAgICAgICBpZiAoZmlsdGVyKGZlYXR1cmUpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZ2VvanNvbkZlYXR1cmUgPSBuZXcgR2VvSlNPTkZlYXR1cmUoZmVhdHVyZSwgdGhpcy5jb29yZC56LCB0aGlzLmNvb3JkLngsIHRoaXMuY29vcmQueSk7XG4gICAgICAgICAgICAgICAgZ2VvanNvbkZlYXR1cmUudGlsZSA9IGNvb3JkO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGdlb2pzb25GZWF0dXJlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGhhc0RhdGEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlID09PSAnbG9hZGVkJyB8fCB0aGlzLnN0YXRlID09PSAncmVsb2FkaW5nJyB8fCB0aGlzLnN0YXRlID09PSAnZXhwaXJlZCc7XG4gICAgfVxuXG4gICAgc2V0RXhwaXJ5RGF0YShkYXRhKSB7XG4gICAgICAgIGlmIChkYXRhLmNhY2hlQ29udHJvbCkgdGhpcy5jYWNoZUNvbnRyb2wgPSBkYXRhLmNhY2hlQ29udHJvbDtcbiAgICAgICAgaWYgKGRhdGEuZXhwaXJlcykgdGhpcy5leHBpcmVzID0gZGF0YS5leHBpcmVzO1xuICAgIH1cblxuICAgIGdldEV4cGlyeSgpIHtcbiAgICAgICAgaWYgKHRoaXMuY2FjaGVDb250cm9sKSB7XG4gICAgICAgICAgICAvLyBDYWNoZS1Db250cm9sIGhlYWRlcnMgc2V0IG1heCBhZ2UgKGluIHNlY29uZHMpIGZyb20gdGhlIHRpbWUgb2YgcmVxdWVzdFxuICAgICAgICAgICAgY29uc3QgcGFyc2VkQ0MgPSB1dGlsLnBhcnNlQ2FjaGVDb250cm9sKHRoaXMuY2FjaGVDb250cm9sKTtcbiAgICAgICAgICAgIGlmIChwYXJzZWRDQ1snbWF4LWFnZSddKSByZXR1cm4gdGhpcy50aW1lQWRkZWQgKyBwYXJzZWRDQ1snbWF4LWFnZSddICogMTAwMDtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmV4cGlyZXMpIHtcbiAgICAgICAgICAgIC8vIEV4cGlyZXMgaGVhZGVycyBzZXQgYWJzb2x1dGUgZXhwaXJhdGlvbiB0aW1lc1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHRoaXMuZXhwaXJlcykuZ2V0VGltZSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFRpbGU7XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpO1xuY29uc3QgV2hvb1RTID0gcmVxdWlyZSgnd2hvb3RzLWpzJyk7XG5jb25zdCBDb29yZGluYXRlID0gcmVxdWlyZSgnLi4vZ2VvL2Nvb3JkaW5hdGUnKTtcblxuY2xhc3MgVGlsZUNvb3JkIHtcbiAgICBjb25zdHJ1Y3Rvcih6LCB4LCB5LCB3KSB7XG4gICAgICAgIGFzc2VydCghaXNOYU4oeikgJiYgeiA+PSAwICYmIHogJSAxID09PSAwKTtcbiAgICAgICAgYXNzZXJ0KCFpc05hTih4KSAmJiB4ID49IDAgJiYgeCAlIDEgPT09IDApO1xuICAgICAgICBhc3NlcnQoIWlzTmFOKHkpICYmIHkgPj0gMCAmJiB5ICUgMSA9PT0gMCk7XG5cbiAgICAgICAgaWYgKGlzTmFOKHcpKSB3ID0gMDtcblxuICAgICAgICB0aGlzLnogPSArejtcbiAgICAgICAgdGhpcy54ID0gK3g7XG4gICAgICAgIHRoaXMueSA9ICt5O1xuICAgICAgICB0aGlzLncgPSArdztcblxuICAgICAgICAvLyBjYWxjdWxhdGUgaWRcbiAgICAgICAgdyAqPSAyO1xuICAgICAgICBpZiAodyA8IDApIHcgPSB3ICogLTEgLSAxO1xuICAgICAgICBjb25zdCBkaW0gPSAxIDw8IHRoaXMuejtcbiAgICAgICAgdGhpcy5pZCA9ICgoZGltICogZGltICogdyArIGRpbSAqIHRoaXMueSArIHRoaXMueCkgKiAzMikgKyB0aGlzLno7XG5cbiAgICAgICAgLy8gZm9yIGNhY2hpbmcgcG9zIG1hdHJpeCBjYWxjdWxhdGlvbiB3aGVuIHJlbmRlcmluZ1xuICAgICAgICB0aGlzLnBvc01hdHJpeCA9IG51bGw7XG4gICAgfVxuXG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiBgJHt0aGlzLnp9LyR7dGhpcy54fS8ke3RoaXMueX1gO1xuICAgIH1cblxuICAgIHRvQ29vcmRpbmF0ZShzb3VyY2VNYXhab29tKSB7XG4gICAgICAgIGNvbnN0IHpvb20gPSBNYXRoLm1pbih0aGlzLnosIHNvdXJjZU1heFpvb20gPT09IHVuZGVmaW5lZCA/IHRoaXMueiA6IHNvdXJjZU1heFpvb20pO1xuICAgICAgICBjb25zdCB0aWxlU2NhbGUgPSBNYXRoLnBvdygyLCB6b29tKTtcbiAgICAgICAgY29uc3Qgcm93ID0gdGhpcy55O1xuICAgICAgICBjb25zdCBjb2x1bW4gPSB0aGlzLnggKyB0aWxlU2NhbGUgKiB0aGlzLnc7XG4gICAgICAgIHJldHVybiBuZXcgQ29vcmRpbmF0ZShjb2x1bW4sIHJvdywgem9vbSk7XG4gICAgfVxuXG4gICAgLy8gZ2l2ZW4gYSBsaXN0IG9mIHVybHMsIGNob29zZSBhIHVybCB0ZW1wbGF0ZSBhbmQgcmV0dXJuIGEgdGlsZSBVUkxcbiAgICB1cmwodXJscywgc291cmNlTWF4Wm9vbSwgc2NoZW1lKSB7XG4gICAgICAgIGNvbnN0IGJib3ggPSBXaG9vVFMuZ2V0VGlsZUJCb3godGhpcy54LCB0aGlzLnksIHRoaXMueik7XG4gICAgICAgIGNvbnN0IHF1YWRrZXkgPSBnZXRRdWFka2V5KHRoaXMueiwgdGhpcy54LCB0aGlzLnkpO1xuXG4gICAgICAgIHJldHVybiB1cmxzWyh0aGlzLnggKyB0aGlzLnkpICUgdXJscy5sZW5ndGhdXG4gICAgICAgICAgICAucmVwbGFjZSgne3ByZWZpeH0nLCAodGhpcy54ICUgMTYpLnRvU3RyaW5nKDE2KSArICh0aGlzLnkgJSAxNikudG9TdHJpbmcoMTYpKVxuICAgICAgICAgICAgLnJlcGxhY2UoJ3t6fScsIE1hdGgubWluKHRoaXMueiwgc291cmNlTWF4Wm9vbSB8fCB0aGlzLnopKVxuICAgICAgICAgICAgLnJlcGxhY2UoJ3t4fScsIHRoaXMueClcbiAgICAgICAgICAgIC5yZXBsYWNlKCd7eX0nLCBzY2hlbWUgPT09ICd0bXMnID8gKE1hdGgucG93KDIsIHRoaXMueikgLSB0aGlzLnkgLSAxKSA6IHRoaXMueSlcbiAgICAgICAgICAgIC5yZXBsYWNlKCd7cXVhZGtleX0nLCBxdWFka2V5KVxuICAgICAgICAgICAgLnJlcGxhY2UoJ3tiYm94LWVwc2ctMzg1N30nLCBiYm94KTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gdGhlIGNvb3JkaW5hdGUgb2YgdGhlIHBhcmVudCB0aWxlXG4gICAgcGFyZW50KHNvdXJjZU1heFpvb20pIHtcbiAgICAgICAgaWYgKHRoaXMueiA9PT0gMCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gdGhlIGlkIHJlcHJlc2VudHMgYW4gb3ZlcnNjYWxlZCB0aWxlLCByZXR1cm4gdGhlIHNhbWUgY29vcmRpbmF0ZXMgd2l0aCBhIGxvd2VyIHpcbiAgICAgICAgaWYgKHRoaXMueiA+IHNvdXJjZU1heFpvb20pIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgVGlsZUNvb3JkKHRoaXMueiAtIDEsIHRoaXMueCwgdGhpcy55LCB0aGlzLncpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBUaWxlQ29vcmQodGhpcy56IC0gMSwgTWF0aC5mbG9vcih0aGlzLnggLyAyKSwgTWF0aC5mbG9vcih0aGlzLnkgLyAyKSwgdGhpcy53KTtcbiAgICB9XG5cbiAgICB3cmFwcGVkKCkge1xuICAgICAgICByZXR1cm4gbmV3IFRpbGVDb29yZCh0aGlzLnosIHRoaXMueCwgdGhpcy55LCAwKTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSB0aWxlJ3MgY2hpbGRyZW5cbiAgICBjaGlsZHJlbihzb3VyY2VNYXhab29tKSB7XG5cbiAgICAgICAgaWYgKHRoaXMueiA+PSBzb3VyY2VNYXhab29tKSB7XG4gICAgICAgICAgICAvLyByZXR1cm4gYSBzaW5nbGUgdGlsZSBjb29yZCByZXByZXNlbnRpbmcgYSBhbiBvdmVyc2NhbGVkIHRpbGVcbiAgICAgICAgICAgIHJldHVybiBbbmV3IFRpbGVDb29yZCh0aGlzLnogKyAxLCB0aGlzLngsIHRoaXMueSwgdGhpcy53KV07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB6ID0gdGhpcy56ICsgMTtcbiAgICAgICAgY29uc3QgeCA9IHRoaXMueCAqIDI7XG4gICAgICAgIGNvbnN0IHkgPSB0aGlzLnkgKiAyO1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgbmV3IFRpbGVDb29yZCh6LCB4LCB5LCB0aGlzLncpLFxuICAgICAgICAgICAgbmV3IFRpbGVDb29yZCh6LCB4ICsgMSwgeSwgdGhpcy53KSxcbiAgICAgICAgICAgIG5ldyBUaWxlQ29vcmQoeiwgeCwgeSArIDEsIHRoaXMudyksXG4gICAgICAgICAgICBuZXcgVGlsZUNvb3JkKHosIHggKyAxLCB5ICsgMSwgdGhpcy53KVxuICAgICAgICBdO1xuICAgIH1cbn1cblxuLy8gVGFrZW4gZnJvbSBwb2x5bWFwcyBzcmMvTGF5ZXIuanNcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9zaW1wbGVnZW8vcG9seW1hcHMvYmxvYi9tYXN0ZXIvc3JjL0xheWVyLmpzI0wzMzMtTDM4M1xuXG5mdW5jdGlvbiBlZGdlKGEsIGIpIHtcbiAgICBpZiAoYS5yb3cgPiBiLnJvdykgeyBjb25zdCB0ID0gYTsgYSA9IGI7IGIgPSB0OyB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgeDA6IGEuY29sdW1uLFxuICAgICAgICB5MDogYS5yb3csXG4gICAgICAgIHgxOiBiLmNvbHVtbixcbiAgICAgICAgeTE6IGIucm93LFxuICAgICAgICBkeDogYi5jb2x1bW4gLSBhLmNvbHVtbixcbiAgICAgICAgZHk6IGIucm93IC0gYS5yb3dcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBzY2FuU3BhbnMoZTAsIGUxLCB5bWluLCB5bWF4LCBzY2FuTGluZSkge1xuICAgIGNvbnN0IHkwID0gTWF0aC5tYXgoeW1pbiwgTWF0aC5mbG9vcihlMS55MCkpO1xuICAgIGNvbnN0IHkxID0gTWF0aC5taW4oeW1heCwgTWF0aC5jZWlsKGUxLnkxKSk7XG5cbiAgICAvLyBzb3J0IGVkZ2VzIGJ5IHgtY29vcmRpbmF0ZVxuICAgIGlmICgoZTAueDAgPT09IGUxLngwICYmIGUwLnkwID09PSBlMS55MCkgP1xuICAgICAgICAgICAgKGUwLngwICsgZTEuZHkgLyBlMC5keSAqIGUwLmR4IDwgZTEueDEpIDpcbiAgICAgICAgICAgIChlMC54MSAtIGUxLmR5IC8gZTAuZHkgKiBlMC5keCA8IGUxLngwKSkge1xuICAgICAgICBjb25zdCB0ID0gZTA7IGUwID0gZTE7IGUxID0gdDtcbiAgICB9XG5cbiAgICAvLyBzY2FuIGxpbmVzIVxuICAgIGNvbnN0IG0wID0gZTAuZHggLyBlMC5keTtcbiAgICBjb25zdCBtMSA9IGUxLmR4IC8gZTEuZHk7XG4gICAgY29uc3QgZDAgPSBlMC5keCA+IDA7IC8vIHVzZSB5ICsgMSB0byBjb21wdXRlIHgwXG4gICAgY29uc3QgZDEgPSBlMS5keCA8IDA7IC8vIHVzZSB5ICsgMSB0byBjb21wdXRlIHgxXG4gICAgZm9yIChsZXQgeSA9IHkwOyB5IDwgeTE7IHkrKykge1xuICAgICAgICBjb25zdCB4MCA9IG0wICogTWF0aC5tYXgoMCwgTWF0aC5taW4oZTAuZHksIHkgKyBkMCAtIGUwLnkwKSkgKyBlMC54MDtcbiAgICAgICAgY29uc3QgeDEgPSBtMSAqIE1hdGgubWF4KDAsIE1hdGgubWluKGUxLmR5LCB5ICsgZDEgLSBlMS55MCkpICsgZTEueDA7XG4gICAgICAgIHNjYW5MaW5lKE1hdGguZmxvb3IoeDEpLCBNYXRoLmNlaWwoeDApLCB5KTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHNjYW5UcmlhbmdsZShhLCBiLCBjLCB5bWluLCB5bWF4LCBzY2FuTGluZSkge1xuICAgIGxldCBhYiA9IGVkZ2UoYSwgYiksXG4gICAgICAgIGJjID0gZWRnZShiLCBjKSxcbiAgICAgICAgY2EgPSBlZGdlKGMsIGEpO1xuXG4gICAgbGV0IHQ7XG5cbiAgICAvLyBzb3J0IGVkZ2VzIGJ5IHktbGVuZ3RoXG4gICAgaWYgKGFiLmR5ID4gYmMuZHkpIHsgdCA9IGFiOyBhYiA9IGJjOyBiYyA9IHQ7IH1cbiAgICBpZiAoYWIuZHkgPiBjYS5keSkgeyB0ID0gYWI7IGFiID0gY2E7IGNhID0gdDsgfVxuICAgIGlmIChiYy5keSA+IGNhLmR5KSB7IHQgPSBiYzsgYmMgPSBjYTsgY2EgPSB0OyB9XG5cbiAgICAvLyBzY2FuIHNwYW4hIHNjYW4gc3BhbiFcbiAgICBpZiAoYWIuZHkpIHNjYW5TcGFucyhjYSwgYWIsIHltaW4sIHltYXgsIHNjYW5MaW5lKTtcbiAgICBpZiAoYmMuZHkpIHNjYW5TcGFucyhjYSwgYmMsIHltaW4sIHltYXgsIHNjYW5MaW5lKTtcbn1cblxuVGlsZUNvb3JkLmNvdmVyID0gZnVuY3Rpb24oeiwgYm91bmRzLCBhY3R1YWxaLCByZW5kZXJXb3JsZENvcGllcykge1xuICAgIGlmIChyZW5kZXJXb3JsZENvcGllcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJlbmRlcldvcmxkQ29waWVzID0gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgdGlsZXMgPSAxIDw8IHo7XG4gICAgY29uc3QgdCA9IHt9O1xuXG4gICAgZnVuY3Rpb24gc2NhbkxpbmUoeDAsIHgxLCB5KSB7XG4gICAgICAgIGxldCB4LCB3LCB3eCwgY29vcmQ7XG4gICAgICAgIGlmICh5ID49IDAgJiYgeSA8PSB0aWxlcykge1xuICAgICAgICAgICAgZm9yICh4ID0geDA7IHggPCB4MTsgeCsrKSB7XG4gICAgICAgICAgICAgICAgdyA9IE1hdGguZmxvb3IoeCAvIHRpbGVzKTtcbiAgICAgICAgICAgICAgICB3eCA9ICh4ICUgdGlsZXMgKyB0aWxlcykgJSB0aWxlcztcbiAgICAgICAgICAgICAgICBpZiAodyA9PT0gMCB8fCByZW5kZXJXb3JsZENvcGllcyA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjb29yZCA9IG5ldyBUaWxlQ29vcmQoYWN0dWFsWiwgd3gsIHksIHcpO1xuICAgICAgICAgICAgICAgICAgICB0W2Nvb3JkLmlkXSA9IGNvb3JkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIERpdmlkZSB0aGUgc2NyZWVuIHVwIGluIHR3byB0cmlhbmdsZXMgYW5kIHNjYW4gZWFjaCBvZiB0aGVtOlxuICAgIC8vICstLS0vXG4gICAgLy8gfCAvIHxcbiAgICAvLyAvLS0tK1xuICAgIHNjYW5UcmlhbmdsZShib3VuZHNbMF0sIGJvdW5kc1sxXSwgYm91bmRzWzJdLCAwLCB0aWxlcywgc2NhbkxpbmUpO1xuICAgIHNjYW5UcmlhbmdsZShib3VuZHNbMl0sIGJvdW5kc1szXSwgYm91bmRzWzBdLCAwLCB0aWxlcywgc2NhbkxpbmUpO1xuXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHQpLm1hcCgoaWQpID0+IHtcbiAgICAgICAgcmV0dXJuIHRbaWRdO1xuICAgIH0pO1xufTtcblxuLy8gUGFyc2UgYSBwYWNrZWQgaW50ZWdlciBpZCBpbnRvIGEgVGlsZUNvb3JkIG9iamVjdFxuVGlsZUNvb3JkLmZyb21JRCA9IGZ1bmN0aW9uKGlkKSB7XG4gICAgY29uc3QgeiA9IGlkICUgMzIsIGRpbSA9IDEgPDwgejtcbiAgICBjb25zdCB4eSA9ICgoaWQgLSB6KSAvIDMyKTtcbiAgICBjb25zdCB4ID0geHkgJSBkaW0sIHkgPSAoKHh5IC0geCkgLyBkaW0pICUgZGltO1xuICAgIGxldCB3ID0gTWF0aC5mbG9vcih4eSAvIChkaW0gKiBkaW0pKTtcbiAgICBpZiAodyAlIDIgIT09IDApIHcgPSB3ICogLTEgLSAxO1xuICAgIHcgLz0gMjtcbiAgICByZXR1cm4gbmV3IFRpbGVDb29yZCh6LCB4LCB5LCB3KTtcbn07XG5cbmZ1bmN0aW9uIGdldFF1YWRrZXkoeiwgeCwgeSkge1xuICAgIGxldCBxdWFka2V5ID0gJycsIG1hc2s7XG4gICAgZm9yIChsZXQgaSA9IHo7IGkgPiAwOyBpLS0pIHtcbiAgICAgICAgbWFzayA9IDEgPDwgKGkgLSAxKTtcbiAgICAgICAgcXVhZGtleSArPSAoKHggJiBtYXNrID8gMSA6IDApICsgKHkgJiBtYXNrID8gMiA6IDApKTtcbiAgICB9XG4gICAgcmV0dXJuIHF1YWRrZXk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gVGlsZUNvb3JkO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBFdmVudGVkID0gcmVxdWlyZSgnLi4vdXRpbC9ldmVudGVkJyk7XG5jb25zdCB1dGlsID0gcmVxdWlyZSgnLi4vdXRpbC91dGlsJyk7XG5jb25zdCBsb2FkVGlsZUpTT04gPSByZXF1aXJlKCcuL2xvYWRfdGlsZWpzb24nKTtcbmNvbnN0IG5vcm1hbGl6ZVVSTCA9IHJlcXVpcmUoJy4uL3V0aWwvbWFwYm94Jykubm9ybWFsaXplVGlsZVVSTDtcblxuY2xhc3MgVmVjdG9yVGlsZVNvdXJjZSBleHRlbmRzIEV2ZW50ZWQge1xuXG4gICAgY29uc3RydWN0b3IoaWQsIG9wdGlvbnMsIGRpc3BhdGNoZXIsIGV2ZW50ZWRQYXJlbnQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5pZCA9IGlkO1xuICAgICAgICB0aGlzLmRpc3BhdGNoZXIgPSBkaXNwYXRjaGVyO1xuXG4gICAgICAgIHRoaXMudHlwZSA9ICd2ZWN0b3InO1xuICAgICAgICB0aGlzLm1pbnpvb20gPSAwO1xuICAgICAgICB0aGlzLm1heHpvb20gPSAyMjtcbiAgICAgICAgdGhpcy5zY2hlbWUgPSAneHl6JztcbiAgICAgICAgdGhpcy50aWxlU2l6ZSA9IDUxMjtcbiAgICAgICAgdGhpcy5yZXBhcnNlT3ZlcnNjYWxlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuaXNUaWxlQ2xpcHBlZCA9IHRydWU7XG4gICAgICAgIHV0aWwuZXh0ZW5kKHRoaXMsIHV0aWwucGljayhvcHRpb25zLCBbJ3VybCcsICdzY2hlbWUnLCAndGlsZVNpemUnXSkpO1xuXG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSB1dGlsLmV4dGVuZCh7IHR5cGU6ICd2ZWN0b3InIH0sIG9wdGlvbnMpO1xuXG4gICAgICAgIGlmICh0aGlzLnRpbGVTaXplICE9PSA1MTIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigndmVjdG9yIHRpbGUgc291cmNlcyBtdXN0IGhhdmUgYSB0aWxlU2l6ZSBvZiA1MTInKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2V0RXZlbnRlZFBhcmVudChldmVudGVkUGFyZW50KTtcbiAgICB9XG5cbiAgICBsb2FkKCkge1xuICAgICAgICB0aGlzLmZpcmUoJ2RhdGFsb2FkaW5nJywge2RhdGFUeXBlOiAnc291cmNlJ30pO1xuXG4gICAgICAgIGxvYWRUaWxlSlNPTih0aGlzLl9vcHRpb25zLCAoZXJyLCB0aWxlSlNPTikgPT4ge1xuICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZSgnZXJyb3InLCBlcnIpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHV0aWwuZXh0ZW5kKHRoaXMsIHRpbGVKU09OKTtcbiAgICAgICAgICAgIHRoaXMuZmlyZSgnZGF0YScsIHtkYXRhVHlwZTogJ3NvdXJjZSd9KTtcbiAgICAgICAgICAgIHRoaXMuZmlyZSgnc291cmNlLmxvYWQnKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb25BZGQobWFwKSB7XG4gICAgICAgIHRoaXMubG9hZCgpO1xuICAgICAgICB0aGlzLm1hcCA9IG1hcDtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKSB7XG4gICAgICAgIHJldHVybiB1dGlsLmV4dGVuZCh7fSwgdGhpcy5fb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgbG9hZFRpbGUodGlsZSwgY2FsbGJhY2spIHtcbiAgICAgICAgY29uc3Qgb3ZlcnNjYWxpbmcgPSB0aWxlLmNvb3JkLnogPiB0aGlzLm1heHpvb20gPyBNYXRoLnBvdygyLCB0aWxlLmNvb3JkLnogLSB0aGlzLm1heHpvb20pIDogMTtcbiAgICAgICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgICAgICAgdXJsOiBub3JtYWxpemVVUkwodGlsZS5jb29yZC51cmwodGhpcy50aWxlcywgdGhpcy5tYXh6b29tLCB0aGlzLnNjaGVtZSksIHRoaXMudXJsKSxcbiAgICAgICAgICAgIHVpZDogdGlsZS51aWQsXG4gICAgICAgICAgICBjb29yZDogdGlsZS5jb29yZCxcbiAgICAgICAgICAgIHpvb206IHRpbGUuY29vcmQueixcbiAgICAgICAgICAgIHRpbGVTaXplOiB0aGlzLnRpbGVTaXplICogb3ZlcnNjYWxpbmcsXG4gICAgICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICAgICAgICBzb3VyY2U6IHRoaXMuaWQsXG4gICAgICAgICAgICBvdmVyc2NhbGluZzogb3ZlcnNjYWxpbmcsXG4gICAgICAgICAgICBhbmdsZTogdGhpcy5tYXAudHJhbnNmb3JtLmFuZ2xlLFxuICAgICAgICAgICAgcGl0Y2g6IHRoaXMubWFwLnRyYW5zZm9ybS5waXRjaCxcbiAgICAgICAgICAgIHNob3dDb2xsaXNpb25Cb3hlczogdGhpcy5tYXAuc2hvd0NvbGxpc2lvbkJveGVzXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKCF0aWxlLndvcmtlcklEIHx8IHRpbGUuc3RhdGUgPT09ICdleHBpcmVkJykge1xuICAgICAgICAgICAgdGlsZS53b3JrZXJJRCA9IHRoaXMuZGlzcGF0Y2hlci5zZW5kKCdsb2FkVGlsZScsIHBhcmFtcywgZG9uZS5iaW5kKHRoaXMpKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aWxlLnN0YXRlID09PSAnbG9hZGluZycpIHtcbiAgICAgICAgICAgIC8vIHNjaGVkdWxlIHRpbGUgcmVsb2FkaW5nIGFmdGVyIGl0IGhhcyBiZWVuIGxvYWRlZFxuICAgICAgICAgICAgdGlsZS5yZWxvYWRDYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaGVyLnNlbmQoJ3JlbG9hZFRpbGUnLCBwYXJhbXMsIGRvbmUuYmluZCh0aGlzKSwgdGlsZS53b3JrZXJJRCk7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBkb25lKGVyciwgZGF0YSkge1xuICAgICAgICAgICAgaWYgKHRpbGUuYWJvcnRlZClcbiAgICAgICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGlsZS5zZXRFeHBpcnlEYXRhKGRhdGEpO1xuICAgICAgICAgICAgdGlsZS5sb2FkVmVjdG9yRGF0YShkYXRhLCB0aGlzLm1hcC5wYWludGVyKTtcblxuICAgICAgICAgICAgaWYgKHRpbGUucmVkb1doZW5Eb25lKSB7XG4gICAgICAgICAgICAgICAgdGlsZS5yZWRvV2hlbkRvbmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aWxlLnJlZG9QbGFjZW1lbnQodGhpcyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwpO1xuXG4gICAgICAgICAgICBpZiAodGlsZS5yZWxvYWRDYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZFRpbGUodGlsZSwgdGlsZS5yZWxvYWRDYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgdGlsZS5yZWxvYWRDYWxsYmFjayA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhYm9ydFRpbGUodGlsZSkge1xuICAgICAgICB0aGlzLmRpc3BhdGNoZXIuc2VuZCgnYWJvcnRUaWxlJywgeyB1aWQ6IHRpbGUudWlkLCB0eXBlOiB0aGlzLnR5cGUsIHNvdXJjZTogdGhpcy5pZCB9LCBudWxsLCB0aWxlLndvcmtlcklEKTtcbiAgICB9XG5cbiAgICB1bmxvYWRUaWxlKHRpbGUpIHtcbiAgICAgICAgdGlsZS51bmxvYWRWZWN0b3JEYXRhKCk7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlci5zZW5kKCdyZW1vdmVUaWxlJywgeyB1aWQ6IHRpbGUudWlkLCB0eXBlOiB0aGlzLnR5cGUsIHNvdXJjZTogdGhpcy5pZCB9LCBudWxsLCB0aWxlLndvcmtlcklEKTtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gVmVjdG9yVGlsZVNvdXJjZTtcbiIsIid1c2Ugc3RyaWN0JztcbmNvbnN0IGFqYXggPSByZXF1aXJlKCcuLi91dGlsL2FqYXgnKTtcbmNvbnN0IHZ0ID0gcmVxdWlyZSgndmVjdG9yLXRpbGUnKTtcbmNvbnN0IFByb3RvYnVmID0gcmVxdWlyZSgncGJmJyk7XG5jb25zdCBXb3JrZXJUaWxlID0gcmVxdWlyZSgnLi93b3JrZXJfdGlsZScpO1xuY29uc3QgdXRpbCA9IHJlcXVpcmUoJy4uL3V0aWwvdXRpbCcpO1xuXG4vKipcbiAqIFRoZSB7QGxpbmsgV29ya2VyU291cmNlfSBpbXBsZW1lbnRhdGlvbiB0aGF0IHN1cHBvcnRzIHtAbGluayBWZWN0b3JUaWxlU291cmNlfS5cbiAqIFRoaXMgY2xhc3MgaXMgZGVzaWduZWQgdG8gYmUgZWFzaWx5IHJldXNlZCB0byBzdXBwb3J0IGN1c3RvbSBzb3VyY2UgdHlwZXNcbiAqIGZvciBkYXRhIGZvcm1hdHMgdGhhdCBjYW4gYmUgcGFyc2VkL2NvbnZlcnRlZCBpbnRvIGFuIGluLW1lbW9yeSBWZWN0b3JUaWxlXG4gKiByZXByZXNlbnRhdGlvbi4gIFRvIGRvIHNvLCBjcmVhdGUgaXQgd2l0aFxuICogYG5ldyBWZWN0b3JUaWxlV29ya2VyU291cmNlKGFjdG9yLCBzdHlsZUxheWVycywgY3VzdG9tTG9hZFZlY3RvckRhdGFGdW5jdGlvbilgLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFZlY3RvclRpbGVXb3JrZXJTb3VyY2Uge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtsb2FkVmVjdG9yRGF0YV0gT3B0aW9uYWwgbWV0aG9kIGZvciBjdXN0b20gbG9hZGluZyBvZiBhIFZlY3RvclRpbGUgb2JqZWN0IGJhc2VkIG9uIHBhcmFtZXRlcnMgcGFzc2VkIGZyb20gdGhlIG1haW4tdGhyZWFkIFNvdXJjZS4gIFNlZSB7QGxpbmsgVmVjdG9yVGlsZVdvcmtlclNvdXJjZSNsb2FkVGlsZX0uICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgbG9hZHMgdGhlIHBiZiBhdCBgcGFyYW1zLnVybGAuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoYWN0b3IsIGxheWVySW5kZXgsIGxvYWRWZWN0b3JEYXRhKSB7XG4gICAgICAgIHRoaXMuYWN0b3IgPSBhY3RvcjtcbiAgICAgICAgdGhpcy5sYXllckluZGV4ID0gbGF5ZXJJbmRleDtcblxuICAgICAgICBpZiAobG9hZFZlY3RvckRhdGEpIHsgdGhpcy5sb2FkVmVjdG9yRGF0YSA9IGxvYWRWZWN0b3JEYXRhOyB9XG5cbiAgICAgICAgdGhpcy5sb2FkaW5nID0ge307XG4gICAgICAgIHRoaXMubG9hZGVkID0ge307XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW1wbGVtZW50cyB7QGxpbmsgV29ya2VyU291cmNlI2xvYWRUaWxlfS4gIERlbGVnYXRlcyB0byB7QGxpbmsgVmVjdG9yVGlsZVdvcmtlclNvdXJjZSNsb2FkVmVjdG9yRGF0YX0gKHdoaWNoIGJ5IGRlZmF1bHQgZXhwZWN0cyBhIGBwYXJhbXMudXJsYCBwcm9wZXJ0eSkgZm9yIGZldGNoaW5nIGFuZCBwcm9kdWNpbmcgYSBWZWN0b3JUaWxlIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnNvdXJjZSBUaGUgaWQgb2YgdGhlIHNvdXJjZSBmb3Igd2hpY2ggd2UncmUgbG9hZGluZyB0aGlzIHRpbGUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy51aWQgVGhlIFVJRCBmb3IgdGhpcyB0aWxlLlxuICAgICAqIEBwYXJhbSB7VGlsZUNvb3JkfSBwYXJhbXMuY29vcmRcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcGFyYW1zLnpvb21cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcGFyYW1zLm92ZXJzY2FsaW5nXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHBhcmFtcy5hbmdsZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBwYXJhbXMucGl0Y2hcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHBhcmFtcy5zaG93Q29sbGlzaW9uQm94ZXNcbiAgICAgKi9cbiAgICBsb2FkVGlsZShwYXJhbXMsIGNhbGxiYWNrKSB7XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IHBhcmFtcy5zb3VyY2UsXG4gICAgICAgICAgICB1aWQgPSBwYXJhbXMudWlkO1xuXG4gICAgICAgIGlmICghdGhpcy5sb2FkaW5nW3NvdXJjZV0pXG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdbc291cmNlXSA9IHt9O1xuXG4gICAgICAgIGNvbnN0IHdvcmtlclRpbGUgPSB0aGlzLmxvYWRpbmdbc291cmNlXVt1aWRdID0gbmV3IFdvcmtlclRpbGUocGFyYW1zKTtcbiAgICAgICAgd29ya2VyVGlsZS5hYm9ydCA9IHRoaXMubG9hZFZlY3RvckRhdGEocGFyYW1zLCBkb25lLmJpbmQodGhpcykpO1xuXG4gICAgICAgIGZ1bmN0aW9uIGRvbmUoZXJyLCB2ZWN0b3JUaWxlKSB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5sb2FkaW5nW3NvdXJjZV1bdWlkXTtcblxuICAgICAgICAgICAgaWYgKGVycikgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICBpZiAoIXZlY3RvclRpbGUpIHJldHVybiBjYWxsYmFjayhudWxsLCBudWxsKTtcblxuICAgICAgICAgICAgd29ya2VyVGlsZS52ZWN0b3JUaWxlID0gdmVjdG9yVGlsZTtcbiAgICAgICAgICAgIHdvcmtlclRpbGUucGFyc2UodmVjdG9yVGlsZSwgdGhpcy5sYXllckluZGV4LCB0aGlzLmFjdG9yLCAoZXJyLCByZXN1bHQsIHRyYW5zZmVycmFibGVzKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikgcmV0dXJuIGNhbGxiYWNrKGVycik7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBjYWNoZUNvbnRyb2wgPSB7fTtcbiAgICAgICAgICAgICAgICBpZiAodmVjdG9yVGlsZS5leHBpcmVzKSBjYWNoZUNvbnRyb2wuZXhwaXJlcyA9IHZlY3RvclRpbGUuZXhwaXJlcztcbiAgICAgICAgICAgICAgICBpZiAodmVjdG9yVGlsZS5jYWNoZUNvbnRyb2wpIGNhY2hlQ29udHJvbC5jYWNoZUNvbnRyb2wgPSB2ZWN0b3JUaWxlLmNhY2hlQ29udHJvbDtcblxuICAgICAgICAgICAgICAgIC8vIE5vdCB0cmFuc2ZlcnJpbmcgcmF3VGlsZURhdGEgYmVjYXVzZSB0aGUgd29ya2VyIG5lZWRzIHRvIHJldGFpbiBpdHMgY29weS5cbiAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLFxuICAgICAgICAgICAgICAgICAgICB1dGlsLmV4dGVuZCh7cmF3VGlsZURhdGE6IHZlY3RvclRpbGUucmF3RGF0YX0sIHJlc3VsdCwgY2FjaGVDb250cm9sKSxcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXJyYWJsZXMpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMubG9hZGVkW3NvdXJjZV0gPSB0aGlzLmxvYWRlZFtzb3VyY2VdIHx8IHt9O1xuICAgICAgICAgICAgdGhpcy5sb2FkZWRbc291cmNlXVt1aWRdID0gd29ya2VyVGlsZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEltcGxlbWVudHMge0BsaW5rIFdvcmtlclNvdXJjZSNyZWxvYWRUaWxlfS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnNvdXJjZSBUaGUgaWQgb2YgdGhlIHNvdXJjZSBmb3Igd2hpY2ggd2UncmUgbG9hZGluZyB0aGlzIHRpbGUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy51aWQgVGhlIFVJRCBmb3IgdGhpcyB0aWxlLlxuICAgICAqL1xuICAgIHJlbG9hZFRpbGUocGFyYW1zLCBjYWxsYmFjaykge1xuICAgICAgICBjb25zdCBsb2FkZWQgPSB0aGlzLmxvYWRlZFtwYXJhbXMuc291cmNlXSxcbiAgICAgICAgICAgIHVpZCA9IHBhcmFtcy51aWQsXG4gICAgICAgICAgICB2dFNvdXJjZSA9IHRoaXM7XG4gICAgICAgIGlmIChsb2FkZWQgJiYgbG9hZGVkW3VpZF0pIHtcbiAgICAgICAgICAgIGNvbnN0IHdvcmtlclRpbGUgPSBsb2FkZWRbdWlkXTtcblxuICAgICAgICAgICAgaWYgKHdvcmtlclRpbGUuc3RhdHVzID09PSAncGFyc2luZycpIHtcbiAgICAgICAgICAgICAgICB3b3JrZXJUaWxlLnJlbG9hZENhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHdvcmtlclRpbGUuc3RhdHVzID09PSAnZG9uZScpIHtcbiAgICAgICAgICAgICAgICB3b3JrZXJUaWxlLnBhcnNlKHdvcmtlclRpbGUudmVjdG9yVGlsZSwgdGhpcy5sYXllckluZGV4LCB0aGlzLmFjdG9yLCBkb25lLmJpbmQod29ya2VyVGlsZSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBkb25lKGVyciwgZGF0YSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucmVsb2FkQ2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWxvYWRDYWxsYmFjayA9IHRoaXMucmVsb2FkQ2FsbGJhY2s7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMucmVsb2FkQ2FsbGJhY2s7XG4gICAgICAgICAgICAgICAgdGhpcy5wYXJzZSh0aGlzLnZlY3RvclRpbGUsIHZ0U291cmNlLmxheWVySW5kZXgsIHZ0U291cmNlLmFjdG9yLCByZWxvYWRDYWxsYmFjayk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgZGF0YSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbXBsZW1lbnRzIHtAbGluayBXb3JrZXJTb3VyY2UjYWJvcnRUaWxlfS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnNvdXJjZSBUaGUgaWQgb2YgdGhlIHNvdXJjZSBmb3Igd2hpY2ggd2UncmUgbG9hZGluZyB0aGlzIHRpbGUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy51aWQgVGhlIFVJRCBmb3IgdGhpcyB0aWxlLlxuICAgICAqL1xuICAgIGFib3J0VGlsZShwYXJhbXMpIHtcbiAgICAgICAgY29uc3QgbG9hZGluZyA9IHRoaXMubG9hZGluZ1twYXJhbXMuc291cmNlXSxcbiAgICAgICAgICAgIHVpZCA9IHBhcmFtcy51aWQ7XG4gICAgICAgIGlmIChsb2FkaW5nICYmIGxvYWRpbmdbdWlkXSAmJiBsb2FkaW5nW3VpZF0uYWJvcnQpIHtcbiAgICAgICAgICAgIGxvYWRpbmdbdWlkXS5hYm9ydCgpO1xuICAgICAgICAgICAgZGVsZXRlIGxvYWRpbmdbdWlkXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEltcGxlbWVudHMge0BsaW5rIFdvcmtlclNvdXJjZSNyZW1vdmVUaWxlfS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnNvdXJjZSBUaGUgaWQgb2YgdGhlIHNvdXJjZSBmb3Igd2hpY2ggd2UncmUgbG9hZGluZyB0aGlzIHRpbGUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy51aWQgVGhlIFVJRCBmb3IgdGhpcyB0aWxlLlxuICAgICAqL1xuICAgIHJlbW92ZVRpbGUocGFyYW1zKSB7XG4gICAgICAgIGNvbnN0IGxvYWRlZCA9IHRoaXMubG9hZGVkW3BhcmFtcy5zb3VyY2VdLFxuICAgICAgICAgICAgdWlkID0gcGFyYW1zLnVpZDtcbiAgICAgICAgaWYgKGxvYWRlZCAmJiBsb2FkZWRbdWlkXSkge1xuICAgICAgICAgICAgZGVsZXRlIGxvYWRlZFt1aWRdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHJlc3VsdCBwYXNzZWQgdG8gdGhlIGBsb2FkVmVjdG9yRGF0YWAgY2FsbGJhY2sgbXVzdCBjb25mb3JtIHRvIHRoZSBpbnRlcmZhY2UgZXN0YWJsaXNoZWRcbiAgICAgKiBieSB0aGUgYFZlY3RvclRpbGVgIGNsYXNzIGZyb20gdGhlIFt2ZWN0b3ItdGlsZV0oaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvdmVjdG9yLXRpbGUpXG4gICAgICogbnBtIHBhY2thZ2UuIEluIGFkZGl0aW9uLCBpdCBtdXN0IGhhdmUgYSBgcmF3RGF0YWAgcHJvcGVydHkgY29udGFpbmluZyBhbiBgQXJyYXlCdWZmZXJgXG4gICAgICogd2l0aCBwcm90b2J1ZiBkYXRhIGNvbmZvcm1pbmcgdG8gdGhlXG4gICAgICogW01hcGJveCBWZWN0b3IgVGlsZSBzcGVjaWZpY2F0aW9uXShodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L3ZlY3Rvci10aWxlLXNwZWMpLlxuICAgICAqXG4gICAgICogQGNsYXNzIFZlY3RvclRpbGVcbiAgICAgKiBAcHJvcGVydHkge0FycmF5QnVmZmVyfSByYXdEYXRhXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEBjYWxsYmFjayBMb2FkVmVjdG9yRGF0YUNhbGxiYWNrXG4gICAgICogQHBhcmFtIHtFcnJvcj99IGVycm9yXG4gICAgICogQHBhcmFtIHtWZWN0b3JUaWxlP30gdmVjdG9yVGlsZVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy51cmwgVGhlIFVSTCBvZiB0aGUgdGlsZSBQQkYgdG8gbG9hZC5cbiAgICAgKiBAcGFyYW0ge0xvYWRWZWN0b3JEYXRhQ2FsbGJhY2t9IGNhbGxiYWNrXG4gICAgICovXG4gICAgbG9hZFZlY3RvckRhdGEocGFyYW1zLCBjYWxsYmFjaykge1xuICAgICAgICBjb25zdCB4aHIgPSBhamF4LmdldEFycmF5QnVmZmVyKHBhcmFtcy51cmwsIGRvbmUuYmluZCh0aGlzKSk7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBhYm9ydCAoKSB7IHhoci5hYm9ydCgpOyB9O1xuICAgICAgICBmdW5jdGlvbiBkb25lKGVyciwgcmVzcG9uc2UpIHtcbiAgICAgICAgICAgIGlmIChlcnIpIHsgcmV0dXJuIGNhbGxiYWNrKGVycik7IH1cbiAgICAgICAgICAgIGNvbnN0IHZlY3RvclRpbGUgPSBuZXcgdnQuVmVjdG9yVGlsZShuZXcgUHJvdG9idWYocmVzcG9uc2UuZGF0YSkpO1xuICAgICAgICAgICAgdmVjdG9yVGlsZS5yYXdEYXRhID0gcmVzcG9uc2UuZGF0YTtcbiAgICAgICAgICAgIHZlY3RvclRpbGUuY2FjaGVDb250cm9sID0gcmVzcG9uc2UuY2FjaGVDb250cm9sO1xuICAgICAgICAgICAgdmVjdG9yVGlsZS5leHBpcmVzID0gcmVzcG9uc2UuZXhwaXJlcztcbiAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgdmVjdG9yVGlsZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZWRvUGxhY2VtZW50KHBhcmFtcywgY2FsbGJhY2spIHtcbiAgICAgICAgY29uc3QgbG9hZGVkID0gdGhpcy5sb2FkZWRbcGFyYW1zLnNvdXJjZV0sXG4gICAgICAgICAgICBsb2FkaW5nID0gdGhpcy5sb2FkaW5nW3BhcmFtcy5zb3VyY2VdLFxuICAgICAgICAgICAgdWlkID0gcGFyYW1zLnVpZDtcblxuICAgICAgICBpZiAobG9hZGVkICYmIGxvYWRlZFt1aWRdKSB7XG4gICAgICAgICAgICBjb25zdCB3b3JrZXJUaWxlID0gbG9hZGVkW3VpZF07XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB3b3JrZXJUaWxlLnJlZG9QbGFjZW1lbnQocGFyYW1zLmFuZ2xlLCBwYXJhbXMucGl0Y2gsIHBhcmFtcy5zaG93Q29sbGlzaW9uQm94ZXMpO1xuXG4gICAgICAgICAgICBpZiAocmVzdWx0LnJlc3VsdCkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3VsdC5yZXN1bHQsIHJlc3VsdC50cmFuc2ZlcmFibGVzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2UgaWYgKGxvYWRpbmcgJiYgbG9hZGluZ1t1aWRdKSB7XG4gICAgICAgICAgICBsb2FkaW5nW3VpZF0uYW5nbGUgPSBwYXJhbXMuYW5nbGU7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gVmVjdG9yVGlsZVdvcmtlclNvdXJjZTtcbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgYWpheCA9IHJlcXVpcmUoJy4uL3V0aWwvYWpheCcpO1xuY29uc3QgSW1hZ2VTb3VyY2UgPSByZXF1aXJlKCcuL2ltYWdlX3NvdXJjZScpO1xuXG4vKipcbiAqIEEgZGF0YSBzb3VyY2UgY29udGFpbmluZyB2aWRlby5cbiAqIChTZWUgdGhlIFtTdHlsZSBTcGVjaWZpY2F0aW9uXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1zdHlsZS1zcGVjLyNzb3VyY2VzLXZpZGVvKSBmb3IgZGV0YWlsZWQgZG9jdW1lbnRhdGlvbiBvZiBvcHRpb25zLilcbiAqIEBpbnRlcmZhY2UgVmlkZW9Tb3VyY2VcbiAqIEBleGFtcGxlXG4gKiAvLyBhZGQgdG8gbWFwXG4gKiBtYXAuYWRkU291cmNlKCdzb21lIGlkJywge1xuICogICAgdHlwZTogJ3ZpZGVvJyxcbiAqICAgIHVybDogW1xuICogICAgICAgICdodHRwczovL3d3dy5tYXBib3guY29tL2Jsb2cvYXNzZXRzL2JhbHRpbW9yZS1zbW9rZS5tcDQnLFxuICogICAgICAgICdodHRwczovL3d3dy5tYXBib3guY29tL2Jsb2cvYXNzZXRzL2JhbHRpbW9yZS1zbW9rZS53ZWJtJ1xuICogICAgXSxcbiAqICAgIGNvb3JkaW5hdGVzOiBbXG4gKiAgICAgICAgWy03Ni41NCwgMzkuMThdLFxuICogICAgICAgIFstNzYuNTIsIDM5LjE4XSxcbiAqICAgICAgICBbLTc2LjUyLCAzOS4xN10sXG4gKiAgICAgICAgWy03Ni41NCwgMzkuMTddXG4gKiAgICBdXG4gKiB9KTtcbiAqXG4gKiAvLyB1cGRhdGVcbiAqIHZhciBteVNvdXJjZSA9IG1hcC5nZXRTb3VyY2UoJ3NvbWUgaWQnKTtcbiAqIG15U291cmNlLnNldENvb3JkaW5hdGVzKFtcbiAqICAgICBbLTc2LjU0MzM1NzM3MjI4Mzk0LCAzOS4xODU3OTkwNzIyOTc0OF0sXG4gKiAgICAgWy03Ni41MjgwMzY1OTQzOTA4NywgMzkuMTgzODM2NDg0NzU4N10sXG4gKiAgICAgWy03Ni41Mjk1Mzg2MzE0MzkyLCAzOS4xNzY4MzM5MjUwNzYwNl0sXG4gKiAgICAgWy03Ni41NDUyMDI3MzIwODYxOCwgMzkuMTc4NzYzNDQxMDY2NDJdXG4gKiBdKTtcbiAqXG4gKiBtYXAucmVtb3ZlU291cmNlKCdzb21lIGlkJyk7ICAvLyByZW1vdmVcbiAqIEBzZWUgW0FkZCBhIHZpZGVvXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3ZpZGVvLW9uLWEtbWFwLylcbiAqL1xuY2xhc3MgVmlkZW9Tb3VyY2UgZXh0ZW5kcyBJbWFnZVNvdXJjZSB7XG5cbiAgICBjb25zdHJ1Y3RvcihpZCwgb3B0aW9ucywgZGlzcGF0Y2hlciwgZXZlbnRlZFBhcmVudCkge1xuICAgICAgICBzdXBlcihpZCwgb3B0aW9ucywgZGlzcGF0Y2hlciwgZXZlbnRlZFBhcmVudCk7XG4gICAgICAgIHRoaXMucm91bmRab29tID0gdHJ1ZTtcbiAgICAgICAgdGhpcy50eXBlID0gJ3ZpZGVvJztcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB9XG5cbiAgICBsb2FkKCkge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgICAgICB0aGlzLnVybHMgPSBvcHRpb25zLnVybHM7XG5cbiAgICAgICAgYWpheC5nZXRWaWRlbyhvcHRpb25zLnVybHMsIChlcnIsIHZpZGVvKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyKSByZXR1cm4gdGhpcy5maXJlKCdlcnJvcicsIHtlcnJvcjogZXJyfSk7XG5cbiAgICAgICAgICAgIHRoaXMudmlkZW8gPSB2aWRlbztcbiAgICAgICAgICAgIHRoaXMudmlkZW8ubG9vcCA9IHRydWU7XG5cbiAgICAgICAgICAgIGxldCBsb29wSUQ7XG5cbiAgICAgICAgICAgIC8vIHN0YXJ0IHJlcGFpbnRpbmcgd2hlbiB2aWRlbyBzdGFydHMgcGxheWluZ1xuICAgICAgICAgICAgdGhpcy52aWRlby5hZGRFdmVudExpc3RlbmVyKCdwbGF5aW5nJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGxvb3BJRCA9IHRoaXMubWFwLnN0eWxlLmFuaW1hdGlvbkxvb3Auc2V0KEluZmluaXR5KTtcbiAgICAgICAgICAgICAgICB0aGlzLm1hcC5fcmVyZW5kZXIoKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBzdG9wIHJlcGFpbnRpbmcgd2hlbiB2aWRlbyBzdG9wc1xuICAgICAgICAgICAgdGhpcy52aWRlby5hZGRFdmVudExpc3RlbmVyKCdwYXVzZScsICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm1hcC5zdHlsZS5hbmltYXRpb25Mb29wLmNhbmNlbChsb29wSUQpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLm1hcCkge1xuICAgICAgICAgICAgICAgIHRoaXMudmlkZW8ucGxheSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLl9maW5pc2hMb2FkaW5nKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIEhUTUwgYHZpZGVvYCBlbGVtZW50LlxuICAgICAqXG4gICAgICogQHJldHVybnMge0hUTUxWaWRlb0VsZW1lbnR9IFRoZSBIVE1MIGB2aWRlb2AgZWxlbWVudC5cbiAgICAgKi9cbiAgICBnZXRWaWRlbygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlkZW87XG4gICAgfVxuXG4gICAgb25BZGQobWFwKSB7XG4gICAgICAgIGlmICh0aGlzLm1hcCkgcmV0dXJuO1xuICAgICAgICB0aGlzLmxvYWQoKTtcbiAgICAgICAgdGhpcy5tYXAgPSBtYXA7XG4gICAgICAgIGlmICh0aGlzLnZpZGVvKSB7XG4gICAgICAgICAgICB0aGlzLnZpZGVvLnBsYXkoKTtcbiAgICAgICAgICAgIHRoaXMuc2V0Q29vcmRpbmF0ZXModGhpcy5jb29yZGluYXRlcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSB2aWRlbydzIGNvb3JkaW5hdGVzIGFuZCByZS1yZW5kZXJzIHRoZSBtYXAuXG4gICAgICpcbiAgICAgKiBAbWV0aG9kIHNldENvb3JkaW5hdGVzXG4gICAgICogQHBhcmFtIHtBcnJheTxBcnJheTxudW1iZXI+Pn0gY29vcmRpbmF0ZXMgRm91ciBnZW9ncmFwaGljYWwgY29vcmRpbmF0ZXMsXG4gICAgICogICByZXByZXNlbnRlZCBhcyBhcnJheXMgb2YgbG9uZ2l0dWRlIGFuZCBsYXRpdHVkZSBudW1iZXJzLCB3aGljaCBkZWZpbmUgdGhlIGNvcm5lcnMgb2YgdGhlIHZpZGVvLlxuICAgICAqICAgVGhlIGNvb3JkaW5hdGVzIHN0YXJ0IGF0IHRoZSB0b3AgbGVmdCBjb3JuZXIgb2YgdGhlIHZpZGVvIGFuZCBwcm9jZWVkIGluIGNsb2Nrd2lzZSBvcmRlci5cbiAgICAgKiAgIFRoZXkgZG8gbm90IGhhdmUgdG8gcmVwcmVzZW50IGEgcmVjdGFuZ2xlLlxuICAgICAqIEByZXR1cm5zIHtWaWRlb1NvdXJjZX0gdGhpc1xuICAgICAqL1xuICAgIC8vIHNldENvb3JkaW5hdGVzIGluaGVyaXRlZCBmcm9tIEltYWdlU291cmNlXG5cbiAgICBwcmVwYXJlKCkge1xuICAgICAgICBpZiAoIXRoaXMudGlsZSB8fCB0aGlzLnZpZGVvLnJlYWR5U3RhdGUgPCAyKSByZXR1cm47IC8vIG5vdCBlbm91Z2ggZGF0YSBmb3IgY3VycmVudCBwb3NpdGlvblxuICAgICAgICB0aGlzLl9wcmVwYXJlSW1hZ2UodGhpcy5tYXAucGFpbnRlci5nbCwgdGhpcy52aWRlbyk7XG4gICAgfVxuXG4gICAgc2VyaWFsaXplKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogJ3ZpZGVvJyxcbiAgICAgICAgICAgIHVybHM6IHRoaXMudXJscyxcbiAgICAgICAgICAgIGNvb3JkaW5hdGVzOiB0aGlzLmNvb3JkaW5hdGVzXG4gICAgICAgIH07XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFZpZGVvU291cmNlO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBBY3RvciA9IHJlcXVpcmUoJy4uL3V0aWwvYWN0b3InKTtcbmNvbnN0IFN0eWxlTGF5ZXJJbmRleCA9IHJlcXVpcmUoJy4uL3N0eWxlL3N0eWxlX2xheWVyX2luZGV4Jyk7XG5cbmNvbnN0IFZlY3RvclRpbGVXb3JrZXJTb3VyY2UgPSByZXF1aXJlKCcuL3ZlY3Rvcl90aWxlX3dvcmtlcl9zb3VyY2UnKTtcbmNvbnN0IEdlb0pTT05Xb3JrZXJTb3VyY2UgPSByZXF1aXJlKCcuL2dlb2pzb25fd29ya2VyX3NvdXJjZScpO1xuY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0Jyk7XG5cbmNvbnN0IGdsb2JhbFJUTFRleHRQbHVnaW4gPSByZXF1aXJlKCcuL3J0bF90ZXh0X3BsdWdpbicpO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFdvcmtlciB7XG4gICAgY29uc3RydWN0b3Ioc2VsZikge1xuICAgICAgICB0aGlzLnNlbGYgPSBzZWxmO1xuICAgICAgICB0aGlzLmFjdG9yID0gbmV3IEFjdG9yKHNlbGYsIHRoaXMpO1xuXG4gICAgICAgIHRoaXMubGF5ZXJJbmRleGVzID0ge307XG5cbiAgICAgICAgdGhpcy53b3JrZXJTb3VyY2VUeXBlcyA9IHtcbiAgICAgICAgICAgIHZlY3RvcjogVmVjdG9yVGlsZVdvcmtlclNvdXJjZSxcbiAgICAgICAgICAgIGdlb2pzb246IEdlb0pTT05Xb3JrZXJTb3VyY2VcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBbbWFwSWRdW3NvdXJjZVR5cGVdID0+IHdvcmtlciBzb3VyY2UgaW5zdGFuY2VcbiAgICAgICAgdGhpcy53b3JrZXJTb3VyY2VzID0ge307XG5cbiAgICAgICAgdGhpcy5zZWxmLnJlZ2lzdGVyV29ya2VyU291cmNlID0gKG5hbWUsIFdvcmtlclNvdXJjZSkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMud29ya2VyU291cmNlVHlwZXNbbmFtZV0pIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFdvcmtlciBzb3VyY2Ugd2l0aCBuYW1lIFwiJHtuYW1lfVwiIGFscmVhZHkgcmVnaXN0ZXJlZC5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMud29ya2VyU291cmNlVHlwZXNbbmFtZV0gPSBXb3JrZXJTb3VyY2U7XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5zZWxmLnJlZ2lzdGVyUlRMVGV4dFBsdWdpbiA9IChydGxUZXh0UGx1Z2luKSA9PiB7XG4gICAgICAgICAgICBpZiAoZ2xvYmFsUlRMVGV4dFBsdWdpbi5hcHBseUFyYWJpY1NoYXBpbmcgfHwgZ2xvYmFsUlRMVGV4dFBsdWdpbi5wcm9jZXNzQmlkaXJlY3Rpb25hbFRleHQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JUTCB0ZXh0IHBsdWdpbiBhbHJlYWR5IHJlZ2lzdGVyZWQuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBnbG9iYWxSVExUZXh0UGx1Z2luWydhcHBseUFyYWJpY1NoYXBpbmcnXSA9IHJ0bFRleHRQbHVnaW4uYXBwbHlBcmFiaWNTaGFwaW5nO1xuICAgICAgICAgICAgZ2xvYmFsUlRMVGV4dFBsdWdpblsncHJvY2Vzc0JpZGlyZWN0aW9uYWxUZXh0J10gPSBydGxUZXh0UGx1Z2luLnByb2Nlc3NCaWRpcmVjdGlvbmFsVGV4dDtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBzZXRMYXllcnMobWFwSWQsIGxheWVycykge1xuICAgICAgICB0aGlzLmdldExheWVySW5kZXgobWFwSWQpLnJlcGxhY2UobGF5ZXJzKTtcbiAgICB9XG5cbiAgICB1cGRhdGVMYXllcnMobWFwSWQsIHBhcmFtcykge1xuICAgICAgICB0aGlzLmdldExheWVySW5kZXgobWFwSWQpLnVwZGF0ZShwYXJhbXMubGF5ZXJzLCBwYXJhbXMucmVtb3ZlZElkcywgcGFyYW1zLnN5bWJvbE9yZGVyKTtcbiAgICB9XG5cbiAgICBsb2FkVGlsZShtYXBJZCwgcGFyYW1zLCBjYWxsYmFjaykge1xuICAgICAgICBhc3NlcnQocGFyYW1zLnR5cGUpO1xuICAgICAgICB0aGlzLmdldFdvcmtlclNvdXJjZShtYXBJZCwgcGFyYW1zLnR5cGUpLmxvYWRUaWxlKHBhcmFtcywgY2FsbGJhY2spO1xuICAgIH1cblxuICAgIHJlbG9hZFRpbGUobWFwSWQsIHBhcmFtcywgY2FsbGJhY2spIHtcbiAgICAgICAgYXNzZXJ0KHBhcmFtcy50eXBlKTtcbiAgICAgICAgdGhpcy5nZXRXb3JrZXJTb3VyY2UobWFwSWQsIHBhcmFtcy50eXBlKS5yZWxvYWRUaWxlKHBhcmFtcywgY2FsbGJhY2spO1xuICAgIH1cblxuICAgIGFib3J0VGlsZShtYXBJZCwgcGFyYW1zKSB7XG4gICAgICAgIGFzc2VydChwYXJhbXMudHlwZSk7XG4gICAgICAgIHRoaXMuZ2V0V29ya2VyU291cmNlKG1hcElkLCBwYXJhbXMudHlwZSkuYWJvcnRUaWxlKHBhcmFtcyk7XG4gICAgfVxuXG4gICAgcmVtb3ZlVGlsZShtYXBJZCwgcGFyYW1zKSB7XG4gICAgICAgIGFzc2VydChwYXJhbXMudHlwZSk7XG4gICAgICAgIHRoaXMuZ2V0V29ya2VyU291cmNlKG1hcElkLCBwYXJhbXMudHlwZSkucmVtb3ZlVGlsZShwYXJhbXMpO1xuICAgIH1cblxuICAgIHJlbW92ZVNvdXJjZShtYXBJZCwgcGFyYW1zKSB7XG4gICAgICAgIGFzc2VydChwYXJhbXMudHlwZSk7XG4gICAgICAgIGNvbnN0IHdvcmtlciA9IHRoaXMuZ2V0V29ya2VyU291cmNlKG1hcElkLCBwYXJhbXMudHlwZSk7XG4gICAgICAgIGlmICh3b3JrZXIucmVtb3ZlU291cmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHdvcmtlci5yZW1vdmVTb3VyY2UocGFyYW1zKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlZG9QbGFjZW1lbnQobWFwSWQsIHBhcmFtcywgY2FsbGJhY2spIHtcbiAgICAgICAgYXNzZXJ0KHBhcmFtcy50eXBlKTtcbiAgICAgICAgdGhpcy5nZXRXb3JrZXJTb3VyY2UobWFwSWQsIHBhcmFtcy50eXBlKS5yZWRvUGxhY2VtZW50KHBhcmFtcywgY2FsbGJhY2spO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWQgYSB7QGxpbmsgV29ya2VyU291cmNlfSBzY3JpcHQgYXQgcGFyYW1zLnVybC4gIFRoZSBzY3JpcHQgaXMgcnVuXG4gICAgICogKHVzaW5nIGltcG9ydFNjcmlwdHMpIHdpdGggYHJlZ2lzdGVyV29ya2VyU291cmNlYCBpbiBzY29wZSwgd2hpY2ggaXMgYVxuICAgICAqIGZ1bmN0aW9uIHRha2luZyBgKG5hbWUsIHdvcmtlclNvdXJjZU9iamVjdClgLlxuICAgICAqICBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGxvYWRXb3JrZXJTb3VyY2UobWFwLCBwYXJhbXMsIGNhbGxiYWNrKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnNlbGYuaW1wb3J0U2NyaXB0cyhwYXJhbXMudXJsKTtcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbG9hZFJUTFRleHRQbHVnaW4obWFwLCBwbHVnaW5VUkwsIGNhbGxiYWNrKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIWdsb2JhbFJUTFRleHRQbHVnaW4uYXBwbHlBcmFiaWNTaGFwaW5nICYmICFnbG9iYWxSVExUZXh0UGx1Z2luLnByb2Nlc3NCaWRpcmVjdGlvbmFsVGV4dCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZi5pbXBvcnRTY3JpcHRzKHBsdWdpblVSTCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0TGF5ZXJJbmRleChtYXBJZCkge1xuICAgICAgICBsZXQgbGF5ZXJJbmRleGVzID0gdGhpcy5sYXllckluZGV4ZXNbbWFwSWRdO1xuICAgICAgICBpZiAoIWxheWVySW5kZXhlcykge1xuICAgICAgICAgICAgbGF5ZXJJbmRleGVzID0gdGhpcy5sYXllckluZGV4ZXNbbWFwSWRdID0gbmV3IFN0eWxlTGF5ZXJJbmRleCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsYXllckluZGV4ZXM7XG4gICAgfVxuXG4gICAgZ2V0V29ya2VyU291cmNlKG1hcElkLCB0eXBlKSB7XG4gICAgICAgIGlmICghdGhpcy53b3JrZXJTb3VyY2VzW21hcElkXSlcbiAgICAgICAgICAgIHRoaXMud29ya2VyU291cmNlc1ttYXBJZF0gPSB7fTtcbiAgICAgICAgaWYgKCF0aGlzLndvcmtlclNvdXJjZXNbbWFwSWRdW3R5cGVdKSB7XG4gICAgICAgICAgICAvLyB1c2UgYSB3cmFwcGVkIGFjdG9yIHNvIHRoYXQgd2UgY2FuIGF0dGFjaCBhIHRhcmdldCBtYXBJZCBwYXJhbVxuICAgICAgICAgICAgLy8gdG8gYW55IG1lc3NhZ2VzIGludm9rZWQgYnkgdGhlIFdvcmtlclNvdXJjZVxuICAgICAgICAgICAgY29uc3QgYWN0b3IgPSB7XG4gICAgICAgICAgICAgICAgc2VuZDogKHR5cGUsIGRhdGEsIGNhbGxiYWNrLCBidWZmZXJzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0b3Iuc2VuZCh0eXBlLCBkYXRhLCBjYWxsYmFjaywgYnVmZmVycywgbWFwSWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHRoaXMud29ya2VyU291cmNlc1ttYXBJZF1bdHlwZV0gPSBuZXcgdGhpcy53b3JrZXJTb3VyY2VUeXBlc1t0eXBlXShhY3RvciwgdGhpcy5nZXRMYXllckluZGV4KG1hcElkKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy53b3JrZXJTb3VyY2VzW21hcElkXVt0eXBlXTtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gY3JlYXRlV29ya2VyKHNlbGYpIHtcbiAgICByZXR1cm4gbmV3IFdvcmtlcihzZWxmKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IEZlYXR1cmVJbmRleCA9IHJlcXVpcmUoJy4uL2RhdGEvZmVhdHVyZV9pbmRleCcpO1xuY29uc3QgQ29sbGlzaW9uVGlsZSA9IHJlcXVpcmUoJy4uL3N5bWJvbC9jb2xsaXNpb25fdGlsZScpO1xuY29uc3QgQ29sbGlzaW9uQm94QXJyYXkgPSByZXF1aXJlKCcuLi9zeW1ib2wvY29sbGlzaW9uX2JveCcpO1xuY29uc3QgRGljdGlvbmFyeUNvZGVyID0gcmVxdWlyZSgnLi4vdXRpbC9kaWN0aW9uYXJ5X2NvZGVyJyk7XG5jb25zdCB1dGlsID0gcmVxdWlyZSgnLi4vdXRpbC91dGlsJyk7XG5jb25zdCBTeW1ib2xJbnN0YW5jZXNBcnJheSA9IHJlcXVpcmUoJy4uL3N5bWJvbC9zeW1ib2xfaW5zdGFuY2VzJyk7XG5jb25zdCBTeW1ib2xRdWFkc0FycmF5ID0gcmVxdWlyZSgnLi4vc3ltYm9sL3N5bWJvbF9xdWFkcycpO1xuY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0Jyk7XG5cbmNsYXNzIFdvcmtlclRpbGUge1xuICAgIGNvbnN0cnVjdG9yKHBhcmFtcykge1xuICAgICAgICB0aGlzLmNvb3JkID0gcGFyYW1zLmNvb3JkO1xuICAgICAgICB0aGlzLnVpZCA9IHBhcmFtcy51aWQ7XG4gICAgICAgIHRoaXMuem9vbSA9IHBhcmFtcy56b29tO1xuICAgICAgICB0aGlzLnRpbGVTaXplID0gcGFyYW1zLnRpbGVTaXplO1xuICAgICAgICB0aGlzLnNvdXJjZSA9IHBhcmFtcy5zb3VyY2U7XG4gICAgICAgIHRoaXMub3ZlcnNjYWxpbmcgPSBwYXJhbXMub3ZlcnNjYWxpbmc7XG4gICAgICAgIHRoaXMuYW5nbGUgPSBwYXJhbXMuYW5nbGU7XG4gICAgICAgIHRoaXMucGl0Y2ggPSBwYXJhbXMucGl0Y2g7XG4gICAgICAgIHRoaXMuc2hvd0NvbGxpc2lvbkJveGVzID0gcGFyYW1zLnNob3dDb2xsaXNpb25Cb3hlcztcbiAgICB9XG5cbiAgICBwYXJzZShkYXRhLCBsYXllckluZGV4LCBhY3RvciwgY2FsbGJhY2spIHtcbiAgICAgICAgLy8gTm9ybWFsaXplIEdlb0pTT04gZGF0YS5cbiAgICAgICAgaWYgKCFkYXRhLmxheWVycykge1xuICAgICAgICAgICAgZGF0YSA9IHsgbGF5ZXJzOiB7ICdfZ2VvanNvblRpbGVMYXllcic6IGRhdGEgfSB9O1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zdGF0dXMgPSAncGFyc2luZyc7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG5cbiAgICAgICAgdGhpcy5jb2xsaXNpb25Cb3hBcnJheSA9IG5ldyBDb2xsaXNpb25Cb3hBcnJheSgpO1xuICAgICAgICB0aGlzLnN5bWJvbEluc3RhbmNlc0FycmF5ID0gbmV3IFN5bWJvbEluc3RhbmNlc0FycmF5KCk7XG4gICAgICAgIHRoaXMuc3ltYm9sUXVhZHNBcnJheSA9IG5ldyBTeW1ib2xRdWFkc0FycmF5KCk7XG4gICAgICAgIGNvbnN0IHNvdXJjZUxheWVyQ29kZXIgPSBuZXcgRGljdGlvbmFyeUNvZGVyKE9iamVjdC5rZXlzKGRhdGEubGF5ZXJzKS5zb3J0KCkpO1xuXG4gICAgICAgIGNvbnN0IGZlYXR1cmVJbmRleCA9IG5ldyBGZWF0dXJlSW5kZXgodGhpcy5jb29yZCwgdGhpcy5vdmVyc2NhbGluZyk7XG4gICAgICAgIGZlYXR1cmVJbmRleC5idWNrZXRMYXllcklEcyA9IHt9O1xuXG4gICAgICAgIGNvbnN0IGJ1Y2tldHMgPSB7fTtcbiAgICAgICAgbGV0IGJ1Y2tldEluZGV4ID0gMDtcblxuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgZmVhdHVyZUluZGV4OiBmZWF0dXJlSW5kZXgsXG4gICAgICAgICAgICBpY29uRGVwZW5kZW5jaWVzOiB7fSxcbiAgICAgICAgICAgIGdseXBoRGVwZW5kZW5jaWVzOiB7fVxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGxheWVyRmFtaWxpZXMgPSBsYXllckluZGV4LmZhbWlsaWVzQnlTb3VyY2VbdGhpcy5zb3VyY2VdO1xuICAgICAgICBmb3IgKGNvbnN0IHNvdXJjZUxheWVySWQgaW4gbGF5ZXJGYW1pbGllcykge1xuICAgICAgICAgICAgY29uc3Qgc291cmNlTGF5ZXIgPSBkYXRhLmxheWVyc1tzb3VyY2VMYXllcklkXTtcbiAgICAgICAgICAgIGlmICghc291cmNlTGF5ZXIpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHNvdXJjZUxheWVyLnZlcnNpb24gPT09IDEpIHtcbiAgICAgICAgICAgICAgICB1dGlsLndhcm5PbmNlKFxuICAgICAgICAgICAgICAgICAgICBgVmVjdG9yIHRpbGUgc291cmNlIFwiJHt0aGlzLnNvdXJjZX1cIiBsYXllciBcIiR7XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZUxheWVySWR9XCIgZG9lcyBub3QgdXNlIHZlY3RvciB0aWxlIHNwZWMgdjIgYCArXG4gICAgICAgICAgICAgICAgICAgIGBhbmQgdGhlcmVmb3JlIG1heSBoYXZlIHNvbWUgcmVuZGVyaW5nIGVycm9ycy5gXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgc291cmNlTGF5ZXJJbmRleCA9IHNvdXJjZUxheWVyQ29kZXIuZW5jb2RlKHNvdXJjZUxheWVySWQpO1xuICAgICAgICAgICAgY29uc3QgZmVhdHVyZXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc291cmNlTGF5ZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmZWF0dXJlID0gc291cmNlTGF5ZXIuZmVhdHVyZShpKTtcbiAgICAgICAgICAgICAgICBmZWF0dXJlLmluZGV4ID0gaTtcbiAgICAgICAgICAgICAgICBmZWF0dXJlLnNvdXJjZUxheWVySW5kZXggPSBzb3VyY2VMYXllckluZGV4O1xuICAgICAgICAgICAgICAgIGZlYXR1cmVzLnB1c2goZmVhdHVyZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgZmFtaWx5IG9mIGxheWVyRmFtaWxpZXNbc291cmNlTGF5ZXJJZF0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsYXllciA9IGZhbWlseVswXTtcblxuICAgICAgICAgICAgICAgIGFzc2VydChsYXllci5zb3VyY2UgPT09IHRoaXMuc291cmNlKTtcblxuICAgICAgICAgICAgICAgIGlmIChsYXllci5taW56b29tICYmIHRoaXMuem9vbSA8IGxheWVyLm1pbnpvb20pIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGlmIChsYXllci5tYXh6b29tICYmIHRoaXMuem9vbSA+PSBsYXllci5tYXh6b29tKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBpZiAobGF5ZXIubGF5b3V0ICYmIGxheWVyLmxheW91dC52aXNpYmlsaXR5ID09PSAnbm9uZScpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBsYXllciBvZiBmYW1pbHkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGF5ZXIucmVjYWxjdWxhdGUodGhpcy56b29tKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBidWNrZXQgPSBidWNrZXRzW2xheWVyLmlkXSA9IGxheWVyLmNyZWF0ZUJ1Y2tldCh7XG4gICAgICAgICAgICAgICAgICAgIGluZGV4OiBidWNrZXRJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgbGF5ZXJzOiBmYW1pbHksXG4gICAgICAgICAgICAgICAgICAgIHpvb206IHRoaXMuem9vbSxcbiAgICAgICAgICAgICAgICAgICAgb3ZlcnNjYWxpbmc6IHRoaXMub3ZlcnNjYWxpbmcsXG4gICAgICAgICAgICAgICAgICAgIGNvbGxpc2lvbkJveEFycmF5OiB0aGlzLmNvbGxpc2lvbkJveEFycmF5LFxuICAgICAgICAgICAgICAgICAgICBzeW1ib2xRdWFkc0FycmF5OiB0aGlzLnN5bWJvbFF1YWRzQXJyYXksXG4gICAgICAgICAgICAgICAgICAgIHN5bWJvbEluc3RhbmNlc0FycmF5OiB0aGlzLnN5bWJvbEluc3RhbmNlc0FycmF5XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBidWNrZXQucG9wdWxhdGUoZmVhdHVyZXMsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGZlYXR1cmVJbmRleC5idWNrZXRMYXllcklEc1tidWNrZXRJbmRleF0gPSBmYW1pbHkubWFwKChsKSA9PiBsLmlkKTtcblxuICAgICAgICAgICAgICAgIGJ1Y2tldEluZGV4Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuXG4gICAgICAgIGNvbnN0IGRvbmUgPSAoY29sbGlzaW9uVGlsZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zdGF0dXMgPSAnZG9uZSc7XG5cbiAgICAgICAgICAgIGNvbnN0IHRyYW5zZmVyYWJsZXMgPSBbXTtcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHtcbiAgICAgICAgICAgICAgICBidWNrZXRzOiBzZXJpYWxpemVCdWNrZXRzKHV0aWwudmFsdWVzKGJ1Y2tldHMpLCB0cmFuc2ZlcmFibGVzKSxcbiAgICAgICAgICAgICAgICBmZWF0dXJlSW5kZXg6IGZlYXR1cmVJbmRleC5zZXJpYWxpemUodHJhbnNmZXJhYmxlcyksXG4gICAgICAgICAgICAgICAgY29sbGlzaW9uVGlsZTogY29sbGlzaW9uVGlsZS5zZXJpYWxpemUodHJhbnNmZXJhYmxlcyksXG4gICAgICAgICAgICAgICAgY29sbGlzaW9uQm94QXJyYXk6IHRoaXMuY29sbGlzaW9uQm94QXJyYXkuc2VyaWFsaXplKCksXG4gICAgICAgICAgICAgICAgc3ltYm9sSW5zdGFuY2VzQXJyYXk6IHRoaXMuc3ltYm9sSW5zdGFuY2VzQXJyYXkuc2VyaWFsaXplKCksXG4gICAgICAgICAgICAgICAgc3ltYm9sUXVhZHNBcnJheTogdGhpcy5zeW1ib2xRdWFkc0FycmF5LnNlcmlhbGl6ZSgpXG4gICAgICAgICAgICB9LCB0cmFuc2ZlcmFibGVzKTtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBTeW1ib2wgYnVja2V0cyBtdXN0IGJlIHBsYWNlZCBpbiByZXZlcnNlIG9yZGVyLlxuICAgICAgICB0aGlzLnN5bWJvbEJ1Y2tldHMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IGxheWVySW5kZXguc3ltYm9sT3JkZXIubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGNvbnN0IGJ1Y2tldCA9IGJ1Y2tldHNbbGF5ZXJJbmRleC5zeW1ib2xPcmRlcltpXV07XG4gICAgICAgICAgICBpZiAoYnVja2V0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zeW1ib2xCdWNrZXRzLnB1c2goYnVja2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnN5bWJvbEJ1Y2tldHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZG9uZShuZXcgQ29sbGlzaW9uVGlsZSh0aGlzLmFuZ2xlLCB0aGlzLnBpdGNoLCB0aGlzLmNvbGxpc2lvbkJveEFycmF5KSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZGVwcyA9IDA7XG4gICAgICAgIGxldCBpY29ucyA9IE9iamVjdC5rZXlzKG9wdGlvbnMuaWNvbkRlcGVuZGVuY2llcyk7XG4gICAgICAgIGxldCBzdGFja3MgPSB1dGlsLm1hcE9iamVjdChvcHRpb25zLmdseXBoRGVwZW5kZW5jaWVzLCAoZ2x5cGhzKSA9PiBPYmplY3Qua2V5cyhnbHlwaHMpLm1hcChOdW1iZXIpKTtcblxuICAgICAgICBjb25zdCBnb3REZXBlbmRlbmN5ID0gKGVycikgPT4ge1xuICAgICAgICAgICAgaWYgKGVycikgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICBkZXBzKys7XG4gICAgICAgICAgICBpZiAoZGVwcyA9PT0gMikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbGxpc2lvblRpbGUgPSBuZXcgQ29sbGlzaW9uVGlsZSh0aGlzLmFuZ2xlLCB0aGlzLnBpdGNoLCB0aGlzLmNvbGxpc2lvbkJveEFycmF5KTtcblxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYnVja2V0IG9mIHRoaXMuc3ltYm9sQnVja2V0cykge1xuICAgICAgICAgICAgICAgICAgICByZWNhbGN1bGF0ZUxheWVycyhidWNrZXQsIHRoaXMuem9vbSk7XG5cbiAgICAgICAgICAgICAgICAgICAgYnVja2V0LnByZXBhcmUoc3RhY2tzLCBpY29ucyk7XG4gICAgICAgICAgICAgICAgICAgIGJ1Y2tldC5wbGFjZShjb2xsaXNpb25UaWxlLCB0aGlzLnNob3dDb2xsaXNpb25Cb3hlcyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZG9uZShjb2xsaXNpb25UaWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoc3RhY2tzKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGFjdG9yLnNlbmQoJ2dldEdseXBocycsIHt1aWQ6IHRoaXMudWlkLCBzdGFja3M6IHN0YWNrc30sIChlcnIsIG5ld1N0YWNrcykgPT4ge1xuICAgICAgICAgICAgICAgIHN0YWNrcyA9IG5ld1N0YWNrcztcbiAgICAgICAgICAgICAgICBnb3REZXBlbmRlbmN5KGVycik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGdvdERlcGVuZGVuY3koKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpY29ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGFjdG9yLnNlbmQoJ2dldEljb25zJywge2ljb25zOiBpY29uc30sIChlcnIsIG5ld0ljb25zKSA9PiB7XG4gICAgICAgICAgICAgICAgaWNvbnMgPSBuZXdJY29ucztcbiAgICAgICAgICAgICAgICBnb3REZXBlbmRlbmN5KGVycik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGdvdERlcGVuZGVuY3koKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlZG9QbGFjZW1lbnQoYW5nbGUsIHBpdGNoLCBzaG93Q29sbGlzaW9uQm94ZXMpIHtcbiAgICAgICAgdGhpcy5hbmdsZSA9IGFuZ2xlO1xuICAgICAgICB0aGlzLnBpdGNoID0gcGl0Y2g7XG5cbiAgICAgICAgaWYgKHRoaXMuc3RhdHVzICE9PSAnZG9uZScpIHtcbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbGxpc2lvblRpbGUgPSBuZXcgQ29sbGlzaW9uVGlsZSh0aGlzLmFuZ2xlLCB0aGlzLnBpdGNoLCB0aGlzLmNvbGxpc2lvbkJveEFycmF5KTtcblxuICAgICAgICBmb3IgKGNvbnN0IGJ1Y2tldCBvZiB0aGlzLnN5bWJvbEJ1Y2tldHMpIHtcbiAgICAgICAgICAgIHJlY2FsY3VsYXRlTGF5ZXJzKGJ1Y2tldCwgdGhpcy56b29tKTtcblxuICAgICAgICAgICAgYnVja2V0LnBsYWNlKGNvbGxpc2lvblRpbGUsIHNob3dDb2xsaXNpb25Cb3hlcyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0cmFuc2ZlcmFibGVzID0gW107XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByZXN1bHQ6IHtcbiAgICAgICAgICAgICAgICBidWNrZXRzOiBzZXJpYWxpemVCdWNrZXRzKHRoaXMuc3ltYm9sQnVja2V0cywgdHJhbnNmZXJhYmxlcyksXG4gICAgICAgICAgICAgICAgY29sbGlzaW9uVGlsZTogY29sbGlzaW9uVGlsZS5zZXJpYWxpemUodHJhbnNmZXJhYmxlcylcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0cmFuc2ZlcmFibGVzOiB0cmFuc2ZlcmFibGVzXG4gICAgICAgIH07XG4gICAgfVxufVxuXG5mdW5jdGlvbiByZWNhbGN1bGF0ZUxheWVycyhidWNrZXQsIHpvb20pIHtcbiAgICAvLyBMYXllcnMgYXJlIHNoYXJlZCBhbmQgbWF5IGhhdmUgYmVlbiB1c2VkIGJ5IGEgV29ya2VyVGlsZSB3aXRoIGEgZGlmZmVyZW50IHpvb20uXG4gICAgZm9yIChjb25zdCBsYXllciBvZiBidWNrZXQubGF5ZXJzKSB7XG4gICAgICAgIGxheWVyLnJlY2FsY3VsYXRlKHpvb20pO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gc2VyaWFsaXplQnVja2V0cyhidWNrZXRzLCB0cmFuc2ZlcmFibGVzKSB7XG4gICAgcmV0dXJuIGJ1Y2tldHNcbiAgICAgICAgLmZpbHRlcigoYikgPT4gIWIuaXNFbXB0eSgpKVxuICAgICAgICAubWFwKChiKSA9PiBiLnNlcmlhbGl6ZSh0cmFuc2ZlcmFibGVzKSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gV29ya2VyVGlsZTtcbiIsIid1c2Ugc3RyaWN0JztcblxuY2xhc3MgQW5pbWF0aW9uTG9vcCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMubiA9IDA7XG4gICAgICAgIHRoaXMudGltZXMgPSBbXTtcbiAgICB9XG5cbiAgICAvLyBBcmUgYWxsIGFuaW1hdGlvbnMgZG9uZT9cbiAgICBzdG9wcGVkKCkge1xuICAgICAgICB0aGlzLnRpbWVzID0gdGhpcy50aW1lcy5maWx0ZXIoKHQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0LnRpbWUgPj0gKG5ldyBEYXRlKCkpLmdldFRpbWUoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiAhdGhpcy50aW1lcy5sZW5ndGg7XG4gICAgfVxuXG4gICAgLy8gQWRkIGEgbmV3IGFuaW1hdGlvbiB0aGF0IHdpbGwgcnVuIHQgbWlsbGlzZWNvbmRzXG4gICAgLy8gUmV0dXJucyBhbiBpZCB0aGF0IGNhbiBiZSB1c2VkIHRvIGNhbmNlbCBpdCBsYXllclxuICAgIHNldCh0KSB7XG4gICAgICAgIHRoaXMudGltZXMucHVzaCh7IGlkOiB0aGlzLm4sIHRpbWU6IHQgKyAobmV3IERhdGUoKSkuZ2V0VGltZSgpIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5uKys7XG4gICAgfVxuXG4gICAgLy8gQ2FuY2VsIGFuIGFuaW1hdGlvblxuICAgIGNhbmNlbChuKSB7XG4gICAgICAgIHRoaXMudGltZXMgPSB0aGlzLnRpbWVzLmZpbHRlcigodCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHQuaWQgIT09IG47XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBBbmltYXRpb25Mb29wO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBFdmVudGVkID0gcmVxdWlyZSgnLi4vdXRpbC9ldmVudGVkJyk7XG5jb25zdCBhamF4ID0gcmVxdWlyZSgnLi4vdXRpbC9hamF4Jyk7XG5jb25zdCBicm93c2VyID0gcmVxdWlyZSgnLi4vdXRpbC9icm93c2VyJyk7XG5jb25zdCBub3JtYWxpemVVUkwgPSByZXF1aXJlKCcuLi91dGlsL21hcGJveCcpLm5vcm1hbGl6ZVNwcml0ZVVSTDtcblxuY2xhc3MgU3ByaXRlUG9zaXRpb24ge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnggPSAwO1xuICAgICAgICB0aGlzLnkgPSAwO1xuICAgICAgICB0aGlzLndpZHRoID0gMDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSAwO1xuICAgICAgICB0aGlzLnBpeGVsUmF0aW8gPSAxO1xuICAgICAgICB0aGlzLnNkZiA9IGZhbHNlO1xuICAgIH1cbn1cblxuY2xhc3MgSW1hZ2VTcHJpdGUgZXh0ZW5kcyBFdmVudGVkIHtcblxuICAgIGNvbnN0cnVjdG9yKGJhc2UsIGV2ZW50ZWRQYXJlbnQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5iYXNlID0gYmFzZTtcbiAgICAgICAgdGhpcy5yZXRpbmEgPSBicm93c2VyLmRldmljZVBpeGVsUmF0aW8gPiAxO1xuICAgICAgICB0aGlzLnNldEV2ZW50ZWRQYXJlbnQoZXZlbnRlZFBhcmVudCk7XG5cbiAgICAgICAgY29uc3QgZm9ybWF0ID0gdGhpcy5yZXRpbmEgPyAnQDJ4JyA6ICcnO1xuXG4gICAgICAgIGFqYXguZ2V0SlNPTihub3JtYWxpemVVUkwoYmFzZSwgZm9ybWF0LCAnLmpzb24nKSwgKGVyciwgZGF0YSkgPT4ge1xuICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZSgnZXJyb3InLCB7ZXJyb3I6IGVycn0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICAgICAgICAgIGlmICh0aGlzLmltZ0RhdGEpIHRoaXMuZmlyZSgnZGF0YScsIHtkYXRhVHlwZTogJ3N0eWxlJ30pO1xuICAgICAgICB9KTtcblxuICAgICAgICBhamF4LmdldEltYWdlKG5vcm1hbGl6ZVVSTChiYXNlLCBmb3JtYXQsICcucG5nJyksIChlcnIsIGltZykgPT4ge1xuICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZSgnZXJyb3InLCB7ZXJyb3I6IGVycn0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5pbWdEYXRhID0gYnJvd3Nlci5nZXRJbWFnZURhdGEoaW1nKTtcblxuICAgICAgICAgICAgLy8gcHJlbXVsdGlwbHkgdGhlIHNwcml0ZVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmltZ0RhdGEubGVuZ3RoOyBpICs9IDQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhbHBoYSA9IHRoaXMuaW1nRGF0YVtpICsgM10gLyAyNTU7XG4gICAgICAgICAgICAgICAgdGhpcy5pbWdEYXRhW2kgKyAwXSAqPSBhbHBoYTtcbiAgICAgICAgICAgICAgICB0aGlzLmltZ0RhdGFbaSArIDFdICo9IGFscGhhO1xuICAgICAgICAgICAgICAgIHRoaXMuaW1nRGF0YVtpICsgMl0gKj0gYWxwaGE7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMud2lkdGggPSBpbWcud2lkdGg7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGEpIHRoaXMuZmlyZSgnZGF0YScsIHtkYXRhVHlwZTogJ3N0eWxlJ30pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJhc2U7XG4gICAgfVxuXG4gICAgbG9hZGVkKCkge1xuICAgICAgICByZXR1cm4gISEodGhpcy5kYXRhICYmIHRoaXMuaW1nRGF0YSk7XG4gICAgfVxuXG4gICAgcmVzaXplKC8qZ2wqLykge1xuICAgICAgICBpZiAoYnJvd3Nlci5kZXZpY2VQaXhlbFJhdGlvID4gMSAhPT0gdGhpcy5yZXRpbmEpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld1Nwcml0ZSA9IG5ldyBJbWFnZVNwcml0ZSh0aGlzLmJhc2UpO1xuICAgICAgICAgICAgbmV3U3ByaXRlLm9uKCdkYXRhJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IG5ld1Nwcml0ZS5kYXRhO1xuICAgICAgICAgICAgICAgIHRoaXMuaW1nRGF0YSA9IG5ld1Nwcml0ZS5pbWdEYXRhO1xuICAgICAgICAgICAgICAgIHRoaXMud2lkdGggPSBuZXdTcHJpdGUud2lkdGg7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXRpbmEgPSBuZXdTcHJpdGUucmV0aW5hO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRTcHJpdGVQb3NpdGlvbihuYW1lKSB7XG4gICAgICAgIGlmICghdGhpcy5sb2FkZWQoKSkgcmV0dXJuIG5ldyBTcHJpdGVQb3NpdGlvbigpO1xuXG4gICAgICAgIGNvbnN0IHBvcyA9IHRoaXMuZGF0YSAmJiB0aGlzLmRhdGFbbmFtZV07XG4gICAgICAgIGlmIChwb3MgJiYgdGhpcy5pbWdEYXRhKSByZXR1cm4gcG9zO1xuXG4gICAgICAgIHJldHVybiBuZXcgU3ByaXRlUG9zaXRpb24oKTtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gSW1hZ2VTcHJpdGU7XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHN0eWxlU3BlYyA9IHJlcXVpcmUoJy4vc3R5bGVfc3BlYycpO1xuY29uc3QgdXRpbCA9IHJlcXVpcmUoJy4uL3V0aWwvdXRpbCcpO1xuY29uc3QgRXZlbnRlZCA9IHJlcXVpcmUoJy4uL3V0aWwvZXZlbnRlZCcpO1xuY29uc3QgdmFsaWRhdGVTdHlsZSA9IHJlcXVpcmUoJy4vdmFsaWRhdGVfc3R5bGUnKTtcbmNvbnN0IFN0eWxlRGVjbGFyYXRpb24gPSByZXF1aXJlKCcuL3N0eWxlX2RlY2xhcmF0aW9uJyk7XG5jb25zdCBTdHlsZVRyYW5zaXRpb24gPSByZXF1aXJlKCcuL3N0eWxlX3RyYW5zaXRpb24nKTtcblxuY29uc3QgVFJBTlNJVElPTl9TVUZGSVggPSAnLXRyYW5zaXRpb24nO1xuXG4vKlxuICogUmVwcmVzZW50cyB0aGUgbGlnaHQgdXNlZCB0byBsaWdodCBleHRydWRlZCBmZWF0dXJlcy5cbiAqL1xuY2xhc3MgTGlnaHQgZXh0ZW5kcyBFdmVudGVkIHtcblxuICAgIGNvbnN0cnVjdG9yKGxpZ2h0T3B0aW9ucykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnByb3BlcnRpZXMgPSBbJ2FuY2hvcicsICdjb2xvcicsICdwb3NpdGlvbicsICdpbnRlbnNpdHknXTtcbiAgICAgICAgdGhpcy5fc3BlY2lmaWNhdGlvbnMgPSBzdHlsZVNwZWMubGlnaHQ7XG4gICAgICAgIHRoaXMuc2V0KGxpZ2h0T3B0aW9ucyk7XG4gICAgfVxuXG4gICAgc2V0KGxpZ2h0T3B0cykge1xuICAgICAgICBpZiAodGhpcy5fdmFsaWRhdGUodmFsaWRhdGVTdHlsZS5saWdodCwgbGlnaHRPcHRzKSkgcmV0dXJuO1xuICAgICAgICB0aGlzLl9kZWNsYXJhdGlvbnMgPSB7fTtcbiAgICAgICAgdGhpcy5fdHJhbnNpdGlvbnMgPSB7fTtcbiAgICAgICAgdGhpcy5fdHJhbnNpdGlvbk9wdGlvbnMgPSB7fTtcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVkID0ge307XG5cbiAgICAgICAgbGlnaHRPcHRzID0gdXRpbC5leHRlbmQoe1xuICAgICAgICAgICAgYW5jaG9yOiB0aGlzLl9zcGVjaWZpY2F0aW9ucy5hbmNob3IuZGVmYXVsdCxcbiAgICAgICAgICAgIGNvbG9yOiB0aGlzLl9zcGVjaWZpY2F0aW9ucy5jb2xvci5kZWZhdWx0LFxuICAgICAgICAgICAgcG9zaXRpb246IHRoaXMuX3NwZWNpZmljYXRpb25zLnBvc2l0aW9uLmRlZmF1bHQsXG4gICAgICAgICAgICBpbnRlbnNpdHk6IHRoaXMuX3NwZWNpZmljYXRpb25zLmludGVuc2l0eS5kZWZhdWx0XG4gICAgICAgIH0sIGxpZ2h0T3B0cyk7XG5cbiAgICAgICAgZm9yIChjb25zdCBwcm9wIG9mIHRoaXMucHJvcGVydGllcykge1xuICAgICAgICAgICAgdGhpcy5fZGVjbGFyYXRpb25zW3Byb3BdID0gbmV3IFN0eWxlRGVjbGFyYXRpb24odGhpcy5fc3BlY2lmaWNhdGlvbnNbcHJvcF0sIGxpZ2h0T3B0c1twcm9wXSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBnZXRMaWdodCgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGFuY2hvcjogdGhpcy5nZXRMaWdodFByb3BlcnR5KCdhbmNob3InKSxcbiAgICAgICAgICAgIGNvbG9yOiB0aGlzLmdldExpZ2h0UHJvcGVydHkoJ2NvbG9yJyksXG4gICAgICAgICAgICBwb3NpdGlvbjogdGhpcy5nZXRMaWdodFByb3BlcnR5KCdwb3NpdGlvbicpLFxuICAgICAgICAgICAgaW50ZW5zaXR5OiB0aGlzLmdldExpZ2h0UHJvcGVydHkoJ2ludGVuc2l0eScpXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZ2V0TGlnaHRQcm9wZXJ0eShwcm9wZXJ0eSkge1xuICAgICAgICBpZiAodXRpbC5lbmRzV2l0aChwcm9wZXJ0eSwgVFJBTlNJVElPTl9TVUZGSVgpKSB7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zaXRpb25PcHRpb25zW3Byb3BlcnR5XVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgdGhpcy5fZGVjbGFyYXRpb25zW3Byb3BlcnR5XSAmJlxuICAgICAgICAgICAgICAgIHRoaXMuX2RlY2xhcmF0aW9uc1twcm9wZXJ0eV0udmFsdWVcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRMaWdodFZhbHVlKHByb3BlcnR5LCBnbG9iYWxQcm9wZXJ0aWVzKSB7XG4gICAgICAgIGlmIChwcm9wZXJ0eSA9PT0gJ3Bvc2l0aW9uJykge1xuICAgICAgICAgICAgY29uc3QgY2FsY3VsYXRlZCA9IHRoaXMuX3RyYW5zaXRpb25zW3Byb3BlcnR5XS5jYWxjdWxhdGUoZ2xvYmFsUHJvcGVydGllcyksXG4gICAgICAgICAgICAgICAgY2FydGVzaWFuID0gdXRpbC5zcGhlcmljYWxUb0NhcnRlc2lhbihjYWxjdWxhdGVkKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgeDogY2FydGVzaWFuWzBdLFxuICAgICAgICAgICAgICAgIHk6IGNhcnRlc2lhblsxXSxcbiAgICAgICAgICAgICAgICB6OiBjYXJ0ZXNpYW5bMl1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5fdHJhbnNpdGlvbnNbcHJvcGVydHldLmNhbGN1bGF0ZShnbG9iYWxQcm9wZXJ0aWVzKTtcbiAgICB9XG5cbiAgICBzZXRMaWdodChvcHRpb25zKSB7XG4gICAgICAgIGlmICh0aGlzLl92YWxpZGF0ZSh2YWxpZGF0ZVN0eWxlLmxpZ2h0LCBvcHRpb25zKSkgcmV0dXJuO1xuXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gb3B0aW9uc1trZXldO1xuXG4gICAgICAgICAgICBpZiAodXRpbC5lbmRzV2l0aChrZXksIFRSQU5TSVRJT05fU1VGRklYKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zaXRpb25PcHRpb25zW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9kZWNsYXJhdGlvbnNba2V5XTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZGVjbGFyYXRpb25zW2tleV0gPSBuZXcgU3R5bGVEZWNsYXJhdGlvbih0aGlzLl9zcGVjaWZpY2F0aW9uc1trZXldLCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZWNhbGN1bGF0ZSh6b29tKSB7XG4gICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gdGhpcy5fZGVjbGFyYXRpb25zKSB7XG4gICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZWRbcHJvcGVydHldID0gdGhpcy5nZXRMaWdodFZhbHVlKHByb3BlcnR5LCB7em9vbTogem9vbX0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX2FwcGx5TGlnaHREZWNsYXJhdGlvbihwcm9wZXJ0eSwgZGVjbGFyYXRpb24sIG9wdGlvbnMsIGdsb2JhbE9wdGlvbnMsIGFuaW1hdGlvbkxvb3ApIHtcbiAgICAgICAgY29uc3Qgb2xkVHJhbnNpdGlvbiA9IG9wdGlvbnMudHJhbnNpdGlvbiA/IHRoaXMuX3RyYW5zaXRpb25zW3Byb3BlcnR5XSA6IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3Qgc3BlYyA9IHRoaXMuX3NwZWNpZmljYXRpb25zW3Byb3BlcnR5XTtcblxuICAgICAgICBpZiAoZGVjbGFyYXRpb24gPT09IG51bGwgfHwgZGVjbGFyYXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZGVjbGFyYXRpb24gPSBuZXcgU3R5bGVEZWNsYXJhdGlvbihzcGVjLCBzcGVjLmRlZmF1bHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9sZFRyYW5zaXRpb24gJiYgb2xkVHJhbnNpdGlvbi5kZWNsYXJhdGlvbi5qc29uID09PSBkZWNsYXJhdGlvbi5qc29uKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgdHJhbnNpdGlvbk9wdGlvbnMgPSB1dGlsLmV4dGVuZCh7XG4gICAgICAgICAgICBkdXJhdGlvbjogMzAwLFxuICAgICAgICAgICAgZGVsYXk6IDBcbiAgICAgICAgfSwgZ2xvYmFsT3B0aW9ucywgdGhpcy5nZXRMaWdodFByb3BlcnR5KHByb3BlcnR5ICsgVFJBTlNJVElPTl9TVUZGSVgpKTtcbiAgICAgICAgY29uc3QgbmV3VHJhbnNpdGlvbiA9IHRoaXMuX3RyYW5zaXRpb25zW3Byb3BlcnR5XSA9XG4gICAgICAgICAgICBuZXcgU3R5bGVUcmFuc2l0aW9uKHNwZWMsIGRlY2xhcmF0aW9uLCBvbGRUcmFuc2l0aW9uLCB0cmFuc2l0aW9uT3B0aW9ucyk7XG4gICAgICAgIGlmICghbmV3VHJhbnNpdGlvbi5pbnN0YW50KCkpIHtcbiAgICAgICAgICAgIG5ld1RyYW5zaXRpb24ubG9vcElEID0gYW5pbWF0aW9uTG9vcC5zZXQobmV3VHJhbnNpdGlvbi5lbmRUaW1lIC0gRGF0ZS5ub3coKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob2xkVHJhbnNpdGlvbikge1xuICAgICAgICAgICAgYW5pbWF0aW9uTG9vcC5jYW5jZWwob2xkVHJhbnNpdGlvbi5sb29wSUQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlTGlnaHRUcmFuc2l0aW9ucyhvcHRpb25zLCBnbG9iYWxPcHRpb25zLCBhbmltYXRpb25Mb29wKSB7XG4gICAgICAgIGxldCBwcm9wZXJ0eTtcbiAgICAgICAgZm9yIChwcm9wZXJ0eSBpbiB0aGlzLl9kZWNsYXJhdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMuX2FwcGx5TGlnaHREZWNsYXJhdGlvbihwcm9wZXJ0eSwgdGhpcy5fZGVjbGFyYXRpb25zW3Byb3BlcnR5XSwgb3B0aW9ucywgZ2xvYmFsT3B0aW9ucywgYW5pbWF0aW9uTG9vcCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfdmFsaWRhdGUodmFsaWRhdGUsIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB2YWxpZGF0ZVN0eWxlLmVtaXRFcnJvcnModGhpcywgdmFsaWRhdGUuY2FsbCh2YWxpZGF0ZVN0eWxlLCB1dGlsLmV4dGVuZCh7XG4gICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgICAvLyBXb3JrYXJvdW5kIGZvciBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1qcy9pc3N1ZXMvMjQwN1xuICAgICAgICAgICAgc3R5bGU6IHtnbHlwaHM6IHRydWUsIHNwcml0ZTogdHJ1ZX0sXG4gICAgICAgICAgICBzdHlsZVNwZWM6IHN0eWxlU3BlY1xuICAgICAgICB9KSkpO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBMaWdodDtcbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgcGFyc2VDb2xvclN0cmluZyA9IHJlcXVpcmUoJ2Nzc2NvbG9ycGFyc2VyJykucGFyc2VDU1NDb2xvcjtcbmNvbnN0IHV0aWwgPSByZXF1aXJlKCcuLi91dGlsL3V0aWwnKTtcbmNvbnN0IE1hcGJveEdMRnVuY3Rpb24gPSByZXF1aXJlKCdtYXBib3gtZ2wtZnVuY3Rpb24nKTtcblxuY29uc3QgY2FjaGUgPSB7fTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBwYXJzZUNvbG9yKGlucHV0KSB7XG5cbiAgICBpZiAoaW5wdXQgJiYgTWFwYm94R0xGdW5jdGlvbi5pc0Z1bmN0aW9uRGVmaW5pdGlvbihpbnB1dCkpIHtcblxuICAgICAgICBpZiAoIWlucHV0LnN0b3BzKSByZXR1cm4gaW5wdXQ7XG4gICAgICAgIGVsc2UgcmV0dXJuIHV0aWwuZXh0ZW5kKHt9LCBpbnB1dCwge1xuICAgICAgICAgICAgc3RvcHM6IGlucHV0LnN0b3BzLm1hcCgoc3RvcCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBbc3RvcFswXSwgcGFyc2VDb2xvcihzdG9wWzFdKV07XG4gICAgICAgICAgICB9KVxuICAgICAgICB9KTtcblxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuXG4gICAgICAgIGlmICghY2FjaGVbaW5wdXRdKSB7XG4gICAgICAgICAgICBjb25zdCByZ2JhID0gcGFyc2VDb2xvclN0cmluZyhpbnB1dCk7XG4gICAgICAgICAgICBpZiAoIXJnYmEpIHsgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGNvbG9yICR7aW5wdXR9YCk7IH1cblxuICAgICAgICAgICAgLy8gR0wgZXhwZWN0cyBhbGwgY29tcG9uZW50cyB0byBiZSBpbiB0aGUgcmFuZ2UgWzAsIDFdIGFuZCB0byBiZVxuICAgICAgICAgICAgLy8gbXVsdGlwbGVkIGJ5IHRoZSBhbHBoYSB2YWx1ZS5cbiAgICAgICAgICAgIGNhY2hlW2lucHV0XSA9IFtcbiAgICAgICAgICAgICAgICByZ2JhWzBdIC8gMjU1ICogcmdiYVszXSxcbiAgICAgICAgICAgICAgICByZ2JhWzFdIC8gMjU1ICogcmdiYVszXSxcbiAgICAgICAgICAgICAgICByZ2JhWzJdIC8gMjU1ICogcmdiYVszXSxcbiAgICAgICAgICAgICAgICByZ2JhWzNdXG4gICAgICAgICAgICBdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNhY2hlW2lucHV0XTtcblxuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShpbnB1dCkpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0O1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGNvbG9yICR7aW5wdXR9YCk7XG4gICAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0Jyk7XG5jb25zdCBFdmVudGVkID0gcmVxdWlyZSgnLi4vdXRpbC9ldmVudGVkJyk7XG5jb25zdCBTdHlsZUxheWVyID0gcmVxdWlyZSgnLi9zdHlsZV9sYXllcicpO1xuY29uc3QgSW1hZ2VTcHJpdGUgPSByZXF1aXJlKCcuL2ltYWdlX3Nwcml0ZScpO1xuY29uc3QgTGlnaHQgPSByZXF1aXJlKCcuL2xpZ2h0Jyk7XG5jb25zdCBHbHlwaFNvdXJjZSA9IHJlcXVpcmUoJy4uL3N5bWJvbC9nbHlwaF9zb3VyY2UnKTtcbmNvbnN0IFNwcml0ZUF0bGFzID0gcmVxdWlyZSgnLi4vc3ltYm9sL3Nwcml0ZV9hdGxhcycpO1xuY29uc3QgTGluZUF0bGFzID0gcmVxdWlyZSgnLi4vcmVuZGVyL2xpbmVfYXRsYXMnKTtcbmNvbnN0IHV0aWwgPSByZXF1aXJlKCcuLi91dGlsL3V0aWwnKTtcbmNvbnN0IGFqYXggPSByZXF1aXJlKCcuLi91dGlsL2FqYXgnKTtcbmNvbnN0IG1hcGJveCA9IHJlcXVpcmUoJy4uL3V0aWwvbWFwYm94Jyk7XG5jb25zdCBicm93c2VyID0gcmVxdWlyZSgnLi4vdXRpbC9icm93c2VyJyk7XG5jb25zdCBEaXNwYXRjaGVyID0gcmVxdWlyZSgnLi4vdXRpbC9kaXNwYXRjaGVyJyk7XG5jb25zdCBBbmltYXRpb25Mb29wID0gcmVxdWlyZSgnLi9hbmltYXRpb25fbG9vcCcpO1xuY29uc3QgdmFsaWRhdGVTdHlsZSA9IHJlcXVpcmUoJy4vdmFsaWRhdGVfc3R5bGUnKTtcbmNvbnN0IFNvdXJjZSA9IHJlcXVpcmUoJy4uL3NvdXJjZS9zb3VyY2UnKTtcbmNvbnN0IFF1ZXJ5RmVhdHVyZXMgPSByZXF1aXJlKCcuLi9zb3VyY2UvcXVlcnlfZmVhdHVyZXMnKTtcbmNvbnN0IFNvdXJjZUNhY2hlID0gcmVxdWlyZSgnLi4vc291cmNlL3NvdXJjZV9jYWNoZScpO1xuY29uc3Qgc3R5bGVTcGVjID0gcmVxdWlyZSgnLi9zdHlsZV9zcGVjJyk7XG5jb25zdCBNYXBib3hHTEZ1bmN0aW9uID0gcmVxdWlyZSgnbWFwYm94LWdsLWZ1bmN0aW9uJyk7XG5jb25zdCBnZXRXb3JrZXJQb29sID0gcmVxdWlyZSgnLi4vZ2xvYmFsX3dvcmtlcl9wb29sJyk7XG5jb25zdCBkZXJlZiA9IHJlcXVpcmUoJ21hcGJveC1nbC1zdHlsZS1zcGVjL2xpYi9kZXJlZicpO1xuY29uc3QgZGlmZiA9IHJlcXVpcmUoJ21hcGJveC1nbC1zdHlsZS1zcGVjL2xpYi9kaWZmJyk7XG5jb25zdCBydGxUZXh0UGx1Z2luID0gcmVxdWlyZSgnLi4vc291cmNlL3J0bF90ZXh0X3BsdWdpbicpO1xuXG5jb25zdCBzdXBwb3J0ZWREaWZmT3BlcmF0aW9ucyA9IHV0aWwucGljayhkaWZmLm9wZXJhdGlvbnMsIFtcbiAgICAnYWRkTGF5ZXInLFxuICAgICdyZW1vdmVMYXllcicsXG4gICAgJ3NldFBhaW50UHJvcGVydHknLFxuICAgICdzZXRMYXlvdXRQcm9wZXJ0eScsXG4gICAgJ3NldEZpbHRlcicsXG4gICAgJ2FkZFNvdXJjZScsXG4gICAgJ3JlbW92ZVNvdXJjZScsXG4gICAgJ3NldExheWVyWm9vbVJhbmdlJyxcbiAgICAnc2V0TGlnaHQnLFxuICAgICdzZXRUcmFuc2l0aW9uJ1xuICAgIC8vICdzZXRHbHlwaHMnLFxuICAgIC8vICdzZXRTcHJpdGUnLFxuXSk7XG5cbmNvbnN0IGlnbm9yZWREaWZmT3BlcmF0aW9ucyA9IHV0aWwucGljayhkaWZmLm9wZXJhdGlvbnMsIFtcbiAgICAnc2V0Q2VudGVyJyxcbiAgICAnc2V0Wm9vbScsXG4gICAgJ3NldEJlYXJpbmcnLFxuICAgICdzZXRQaXRjaCdcbl0pO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFN0eWxlIGV4dGVuZHMgRXZlbnRlZCB7XG5cbiAgICBjb25zdHJ1Y3RvcihzdHlsZXNoZWV0LCBtYXAsIG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5tYXAgPSBtYXA7XG4gICAgICAgIHRoaXMuYW5pbWF0aW9uTG9vcCA9IChtYXAgJiYgbWFwLmFuaW1hdGlvbkxvb3ApIHx8IG5ldyBBbmltYXRpb25Mb29wKCk7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlciA9IG5ldyBEaXNwYXRjaGVyKGdldFdvcmtlclBvb2woKSwgdGhpcyk7XG4gICAgICAgIHRoaXMuc3ByaXRlQXRsYXMgPSBuZXcgU3ByaXRlQXRsYXMoMTAyNCwgMTAyNCk7XG4gICAgICAgIHRoaXMubGluZUF0bGFzID0gbmV3IExpbmVBdGxhcygyNTYsIDUxMik7XG5cbiAgICAgICAgdGhpcy5fbGF5ZXJzID0ge307XG4gICAgICAgIHRoaXMuX29yZGVyICA9IFtdO1xuICAgICAgICB0aGlzLnNvdXJjZUNhY2hlcyA9IHt9O1xuICAgICAgICB0aGlzLnpvb21IaXN0b3J5ID0ge307XG4gICAgICAgIHRoaXMuX2xvYWRlZCA9IGZhbHNlO1xuXG4gICAgICAgIHV0aWwuYmluZEFsbChbJ19yZWRvUGxhY2VtZW50J10sIHRoaXMpO1xuXG4gICAgICAgIHRoaXMuX3Jlc2V0VXBkYXRlcygpO1xuXG4gICAgICAgIG9wdGlvbnMgPSB1dGlsLmV4dGVuZCh7XG4gICAgICAgICAgICB2YWxpZGF0ZTogdHlwZW9mIHN0eWxlc2hlZXQgPT09ICdzdHJpbmcnID8gIW1hcGJveC5pc01hcGJveFVSTChzdHlsZXNoZWV0KSA6IHRydWVcbiAgICAgICAgfSwgb3B0aW9ucyk7XG5cbiAgICAgICAgdGhpcy5zZXRFdmVudGVkUGFyZW50KG1hcCk7XG4gICAgICAgIHRoaXMuZmlyZSgnZGF0YWxvYWRpbmcnLCB7ZGF0YVR5cGU6ICdzdHlsZSd9KTtcblxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgcnRsVGV4dFBsdWdpbi5yZWdpc3RlckZvclBsdWdpbkF2YWlsYWJpbGl0eSgocGx1Z2luQmxvYlVSTCkgPT4ge1xuICAgICAgICAgICAgc2VsZi5kaXNwYXRjaGVyLmJyb2FkY2FzdCgnbG9hZFJUTFRleHRQbHVnaW4nLCBwbHVnaW5CbG9iVVJMLCBydGxUZXh0UGx1Z2luLmVycm9yQ2FsbGJhY2spO1xuICAgICAgICAgICAgZm9yIChjb25zdCBpZCBpbiBzZWxmLnNvdXJjZUNhY2hlcykge1xuICAgICAgICAgICAgICAgIHNlbGYuc291cmNlQ2FjaGVzW2lkXS5yZWxvYWQoKTsgLy8gU2hvdWxkIGJlIGEgbm8tb3AgaWYgdGhlIHBsdWdpbiBsb2FkcyBiZWZvcmUgYW55IHRpbGVzIGxvYWRcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3Qgc3R5bGVzaGVldExvYWRlZCA9IChlcnIsIHN0eWxlc2hlZXQpID0+IHtcbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmUoJ2Vycm9yJywge2Vycm9yOiBlcnJ9KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zLnZhbGlkYXRlICYmIHZhbGlkYXRlU3R5bGUuZW1pdEVycm9ycyh0aGlzLCB2YWxpZGF0ZVN0eWxlKHN0eWxlc2hlZXQpKSkgcmV0dXJuO1xuXG4gICAgICAgICAgICB0aGlzLl9sb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5zdHlsZXNoZWV0ID0gc3R5bGVzaGVldDtcblxuICAgICAgICAgICAgdGhpcy51cGRhdGVDbGFzc2VzKCk7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgaWQgaW4gc3R5bGVzaGVldC5zb3VyY2VzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRTb3VyY2UoaWQsIHN0eWxlc2hlZXQuc291cmNlc1tpZF0sIG9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc3R5bGVzaGVldC5zcHJpdGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNwcml0ZSA9IG5ldyBJbWFnZVNwcml0ZShzdHlsZXNoZWV0LnNwcml0ZSwgdGhpcyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZ2x5cGhTb3VyY2UgPSBuZXcgR2x5cGhTb3VyY2Uoc3R5bGVzaGVldC5nbHlwaHMpO1xuICAgICAgICAgICAgdGhpcy5fcmVzb2x2ZSgpO1xuICAgICAgICAgICAgdGhpcy5maXJlKCdkYXRhJywge2RhdGFUeXBlOiAnc3R5bGUnfSk7XG4gICAgICAgICAgICB0aGlzLmZpcmUoJ3N0eWxlLmxvYWQnKTtcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAodHlwZW9mIHN0eWxlc2hlZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBhamF4LmdldEpTT04obWFwYm94Lm5vcm1hbGl6ZVN0eWxlVVJMKHN0eWxlc2hlZXQpLCBzdHlsZXNoZWV0TG9hZGVkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGJyb3dzZXIuZnJhbWUoc3R5bGVzaGVldExvYWRlZC5iaW5kKHRoaXMsIG51bGwsIHN0eWxlc2hlZXQpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMub24oJ3NvdXJjZS5sb2FkJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2UgPSB0aGlzLnNvdXJjZUNhY2hlc1tldmVudC5zb3VyY2VJZF0uZ2V0U291cmNlKCk7XG4gICAgICAgICAgICBpZiAoc291cmNlICYmIHNvdXJjZS52ZWN0b3JMYXllcklkcykge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbGF5ZXJJZCBpbiB0aGlzLl9sYXllcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLl9sYXllcnNbbGF5ZXJJZF07XG4gICAgICAgICAgICAgICAgICAgIGlmIChsYXllci5zb3VyY2UgPT09IHNvdXJjZS5pZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsaWRhdGVMYXllcihsYXllcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF92YWxpZGF0ZUxheWVyKGxheWVyKSB7XG4gICAgICAgIGNvbnN0IHNvdXJjZUNhY2hlID0gdGhpcy5zb3VyY2VDYWNoZXNbbGF5ZXIuc291cmNlXTtcblxuICAgICAgICBpZiAoIWxheWVyLnNvdXJjZUxheWVyKSByZXR1cm47XG4gICAgICAgIGlmICghc291cmNlQ2FjaGUpIHJldHVybjtcbiAgICAgICAgY29uc3Qgc291cmNlID0gc291cmNlQ2FjaGUuZ2V0U291cmNlKCk7XG5cbiAgICAgICAgaWYgKHNvdXJjZS50eXBlID09PSAnZ2VvanNvbicgfHwgKHNvdXJjZS52ZWN0b3JMYXllcklkcyAmJlxuICAgICAgICAgICAgc291cmNlLnZlY3RvckxheWVySWRzLmluZGV4T2YobGF5ZXIuc291cmNlTGF5ZXIpID09PSAtMSkpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZSgnZXJyb3InLCB7XG4gICAgICAgICAgICAgICAgZXJyb3I6IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgYFNvdXJjZSBsYXllciBcIiR7bGF5ZXIuc291cmNlTGF5ZXJ9XCIgYCArXG4gICAgICAgICAgICAgICAgICAgIGBkb2VzIG5vdCBleGlzdCBvbiBzb3VyY2UgXCIke3NvdXJjZS5pZH1cIiBgICtcbiAgICAgICAgICAgICAgICAgICAgYGFzIHNwZWNpZmllZCBieSBzdHlsZSBsYXllciBcIiR7bGF5ZXIuaWR9XCJgXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBsb2FkZWQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fbG9hZGVkKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLl91cGRhdGVkU291cmNlcykubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy5zb3VyY2VDYWNoZXMpXG4gICAgICAgICAgICBpZiAoIXRoaXMuc291cmNlQ2FjaGVzW2lkXS5sb2FkZWQoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgaWYgKHRoaXMuc3ByaXRlICYmICF0aGlzLnNwcml0ZS5sb2FkZWQoKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBfcmVzb2x2ZSgpIHtcbiAgICAgICAgY29uc3QgbGF5ZXJzID0gZGVyZWYodGhpcy5zdHlsZXNoZWV0LmxheWVycyk7XG5cbiAgICAgICAgdGhpcy5fb3JkZXIgPSBsYXllcnMubWFwKChsYXllcikgPT4gbGF5ZXIuaWQpO1xuXG4gICAgICAgIHRoaXMuX2xheWVycyA9IHt9O1xuICAgICAgICBmb3IgKGxldCBsYXllciBvZiBsYXllcnMpIHtcbiAgICAgICAgICAgIGxheWVyID0gU3R5bGVMYXllci5jcmVhdGUobGF5ZXIpO1xuICAgICAgICAgICAgbGF5ZXIuc2V0RXZlbnRlZFBhcmVudCh0aGlzLCB7bGF5ZXI6IHtpZDogbGF5ZXIuaWR9fSk7XG4gICAgICAgICAgICB0aGlzLl9sYXllcnNbbGF5ZXIuaWRdID0gbGF5ZXI7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRpc3BhdGNoZXIuYnJvYWRjYXN0KCdzZXRMYXllcnMnLCB0aGlzLl9zZXJpYWxpemVMYXllcnModGhpcy5fb3JkZXIpKTtcblxuICAgICAgICB0aGlzLmxpZ2h0ID0gbmV3IExpZ2h0KHRoaXMuc3R5bGVzaGVldC5saWdodCk7XG4gICAgfVxuXG4gICAgX3NlcmlhbGl6ZUxheWVycyhpZHMpIHtcbiAgICAgICAgcmV0dXJuIGlkcy5tYXAoKGlkKSA9PiB0aGlzLl9sYXllcnNbaWRdLnNlcmlhbGl6ZSgpKTtcbiAgICB9XG5cbiAgICBfYXBwbHlDbGFzc2VzKGNsYXNzZXMsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9sb2FkZWQpIHJldHVybjtcblxuICAgICAgICBjbGFzc2VzID0gY2xhc3NlcyB8fCBbXTtcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge3RyYW5zaXRpb246IHRydWV9O1xuICAgICAgICBjb25zdCB0cmFuc2l0aW9uID0gdGhpcy5zdHlsZXNoZWV0LnRyYW5zaXRpb24gfHwge307XG5cbiAgICAgICAgY29uc3QgbGF5ZXJzID0gdGhpcy5fdXBkYXRlZEFsbFBhaW50UHJvcHMgPyB0aGlzLl9sYXllcnMgOiB0aGlzLl91cGRhdGVkUGFpbnRQcm9wcztcblxuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIGxheWVycykge1xuICAgICAgICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLl9sYXllcnNbaWRdO1xuICAgICAgICAgICAgY29uc3QgcHJvcHMgPSB0aGlzLl91cGRhdGVkUGFpbnRQcm9wc1tpZF07XG5cbiAgICAgICAgICAgIGlmICh0aGlzLl91cGRhdGVkQWxsUGFpbnRQcm9wcyB8fCBwcm9wcy5hbGwpIHtcbiAgICAgICAgICAgICAgICBsYXllci51cGRhdGVQYWludFRyYW5zaXRpb25zKGNsYXNzZXMsIG9wdGlvbnMsIHRyYW5zaXRpb24sIHRoaXMuYW5pbWF0aW9uTG9vcCwgdGhpcy56b29tSGlzdG9yeSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcGFpbnROYW1lIGluIHByb3BzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xheWVyc1tpZF0udXBkYXRlUGFpbnRUcmFuc2l0aW9uKHBhaW50TmFtZSwgY2xhc3Nlcywgb3B0aW9ucywgdHJhbnNpdGlvbiwgdGhpcy5hbmltYXRpb25Mb29wLCB0aGlzLnpvb21IaXN0b3J5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxpZ2h0LnVwZGF0ZUxpZ2h0VHJhbnNpdGlvbnMob3B0aW9ucywgdHJhbnNpdGlvbiwgdGhpcy5hbmltYXRpb25Mb29wKTtcbiAgICB9XG5cbiAgICBfcmVjYWxjdWxhdGUoeikge1xuICAgICAgICBpZiAoIXRoaXMuX2xvYWRlZCkgcmV0dXJuO1xuXG4gICAgICAgIGZvciAoY29uc3Qgc291cmNlSWQgaW4gdGhpcy5zb3VyY2VDYWNoZXMpXG4gICAgICAgICAgICB0aGlzLnNvdXJjZUNhY2hlc1tzb3VyY2VJZF0udXNlZCA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMuX3VwZGF0ZVpvb21IaXN0b3J5KHopO1xuXG4gICAgICAgIGZvciAoY29uc3QgbGF5ZXJJZCBvZiB0aGlzLl9vcmRlcikge1xuICAgICAgICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLl9sYXllcnNbbGF5ZXJJZF07XG5cbiAgICAgICAgICAgIGxheWVyLnJlY2FsY3VsYXRlKHopO1xuICAgICAgICAgICAgaWYgKCFsYXllci5pc0hpZGRlbih6KSAmJiBsYXllci5zb3VyY2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNvdXJjZUNhY2hlc1tsYXllci5zb3VyY2VdLnVzZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5saWdodC5yZWNhbGN1bGF0ZSh6KTtcblxuICAgICAgICBjb25zdCBtYXhab29tVHJhbnNpdGlvbkR1cmF0aW9uID0gMzAwO1xuICAgICAgICBpZiAoTWF0aC5mbG9vcih0aGlzLnopICE9PSBNYXRoLmZsb29yKHopKSB7XG4gICAgICAgICAgICB0aGlzLmFuaW1hdGlvbkxvb3Auc2V0KG1heFpvb21UcmFuc2l0aW9uRHVyYXRpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy56ID0gejtcbiAgICB9XG5cbiAgICBfdXBkYXRlWm9vbUhpc3Rvcnkoeikge1xuXG4gICAgICAgIGNvbnN0IHpoID0gdGhpcy56b29tSGlzdG9yeTtcblxuICAgICAgICBpZiAoemgubGFzdEludGVnZXJab29tID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIGZpcnN0IHRpbWVcbiAgICAgICAgICAgIHpoLmxhc3RJbnRlZ2VyWm9vbSA9IE1hdGguZmxvb3Ioeik7XG4gICAgICAgICAgICB6aC5sYXN0SW50ZWdlclpvb21UaW1lID0gMDtcbiAgICAgICAgICAgIHpoLmxhc3Rab29tID0gejtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNoZWNrIHdoZXRoZXIgYW4gaW50ZWdlciB6b29tIGxldmVsIGFzIHBhc3NlZCBzaW5jZSB0aGUgbGFzdCBmcmFtZVxuICAgICAgICAvLyBhbmQgaWYgeWVzLCByZWNvcmQgaXQgd2l0aCB0aGUgdGltZS4gVXNlZCBmb3IgdHJhbnNpdGlvbmluZyBwYXR0ZXJucy5cbiAgICAgICAgaWYgKE1hdGguZmxvb3IoemgubGFzdFpvb20pIDwgTWF0aC5mbG9vcih6KSkge1xuICAgICAgICAgICAgemgubGFzdEludGVnZXJab29tID0gTWF0aC5mbG9vcih6KTtcbiAgICAgICAgICAgIHpoLmxhc3RJbnRlZ2VyWm9vbVRpbWUgPSBEYXRlLm5vdygpO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoTWF0aC5mbG9vcih6aC5sYXN0Wm9vbSkgPiBNYXRoLmZsb29yKHopKSB7XG4gICAgICAgICAgICB6aC5sYXN0SW50ZWdlclpvb20gPSBNYXRoLmZsb29yKHogKyAxKTtcbiAgICAgICAgICAgIHpoLmxhc3RJbnRlZ2VyWm9vbVRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICB9XG5cbiAgICAgICAgemgubGFzdFpvb20gPSB6O1xuICAgIH1cblxuICAgIF9jaGVja0xvYWRlZCAoKSB7XG4gICAgICAgIGlmICghdGhpcy5fbG9hZGVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1N0eWxlIGlzIG5vdCBkb25lIGxvYWRpbmcnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFwcGx5IHF1ZXVlZCBzdHlsZSB1cGRhdGVzIGluIGEgYmF0Y2hcbiAgICAgKi9cbiAgICB1cGRhdGUoY2xhc3Nlcywgb3B0aW9ucykge1xuICAgICAgICBpZiAoIXRoaXMuX2NoYW5nZWQpIHJldHVybjtcblxuICAgICAgICBjb25zdCB1cGRhdGVkSWRzID0gT2JqZWN0LmtleXModGhpcy5fdXBkYXRlZExheWVycyk7XG4gICAgICAgIGNvbnN0IHJlbW92ZWRJZHMgPSBPYmplY3Qua2V5cyh0aGlzLl9yZW1vdmVkTGF5ZXJzKTtcblxuICAgICAgICBpZiAodXBkYXRlZElkcy5sZW5ndGggfHwgcmVtb3ZlZElkcy5sZW5ndGggfHwgdGhpcy5fdXBkYXRlZFN5bWJvbE9yZGVyKSB7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVXb3JrZXJMYXllcnModXBkYXRlZElkcywgcmVtb3ZlZElkcyk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiB0aGlzLl91cGRhdGVkU291cmNlcykge1xuICAgICAgICAgICAgY29uc3QgYWN0aW9uID0gdGhpcy5fdXBkYXRlZFNvdXJjZXNbaWRdO1xuICAgICAgICAgICAgYXNzZXJ0KGFjdGlvbiA9PT0gJ3JlbG9hZCcgfHwgYWN0aW9uID09PSAnY2xlYXInKTtcbiAgICAgICAgICAgIGlmIChhY3Rpb24gPT09ICdyZWxvYWQnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVsb2FkU291cmNlKGlkKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uID09PSAnY2xlYXInKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2xlYXJTb3VyY2UoaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fYXBwbHlDbGFzc2VzKGNsYXNzZXMsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLl9yZXNldFVwZGF0ZXMoKTtcblxuICAgICAgICB0aGlzLmZpcmUoJ2RhdGEnLCB7ZGF0YVR5cGU6ICdzdHlsZSd9KTtcbiAgICB9XG5cbiAgICBfdXBkYXRlV29ya2VyTGF5ZXJzKHVwZGF0ZWRJZHMsIHJlbW92ZWRJZHMpIHtcbiAgICAgICAgY29uc3Qgc3ltYm9sT3JkZXIgPSB0aGlzLl91cGRhdGVkU3ltYm9sT3JkZXIgPyB0aGlzLl9vcmRlci5maWx0ZXIoKGlkKSA9PiB0aGlzLl9sYXllcnNbaWRdLnR5cGUgPT09ICdzeW1ib2wnKSA6IG51bGw7XG5cbiAgICAgICAgdGhpcy5kaXNwYXRjaGVyLmJyb2FkY2FzdCgndXBkYXRlTGF5ZXJzJywge1xuICAgICAgICAgICAgbGF5ZXJzOiB0aGlzLl9zZXJpYWxpemVMYXllcnModXBkYXRlZElkcyksXG4gICAgICAgICAgICByZW1vdmVkSWRzOiByZW1vdmVkSWRzLFxuICAgICAgICAgICAgc3ltYm9sT3JkZXI6IHN5bWJvbE9yZGVyXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9yZXNldFVwZGF0ZXMoKSB7XG4gICAgICAgIHRoaXMuX2NoYW5nZWQgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLl91cGRhdGVkTGF5ZXJzID0ge307XG4gICAgICAgIHRoaXMuX3JlbW92ZWRMYXllcnMgPSB7fTtcbiAgICAgICAgdGhpcy5fdXBkYXRlZFN5bWJvbE9yZGVyID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5fdXBkYXRlZFNvdXJjZXMgPSB7fTtcblxuICAgICAgICB0aGlzLl91cGRhdGVkUGFpbnRQcm9wcyA9IHt9O1xuICAgICAgICB0aGlzLl91cGRhdGVkQWxsUGFpbnRQcm9wcyA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGlzIHN0eWxlJ3Mgc3RhdGUgdG8gbWF0Y2ggdGhlIGdpdmVuIHN0eWxlIEpTT04sIHBlcmZvcm1pbmcgb25seVxuICAgICAqIHRoZSBuZWNlc3NhcnkgbXV0YXRpb25zLlxuICAgICAqXG4gICAgICogTWF5IHRocm93IGFuIEVycm9yICgnVW5pbXBsZW1lbnRlZDogTUVUSE9EJykgaWYgdGhlIG1hcGJveC1nbC1zdHlsZS1zcGVjXG4gICAgICogZGlmZiBhbGdvcml0aG0gcHJvZHVjZXMgYW4gb3BlcmF0aW9uIHRoYXQgaXMgbm90IHN1cHBvcnRlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIGFueSBjaGFuZ2VzIHdlcmUgbWFkZTsgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBzZXRTdGF0ZShuZXh0U3RhdGUpIHtcbiAgICAgICAgdGhpcy5fY2hlY2tMb2FkZWQoKTtcblxuICAgICAgICBpZiAodmFsaWRhdGVTdHlsZS5lbWl0RXJyb3JzKHRoaXMsIHZhbGlkYXRlU3R5bGUobmV4dFN0YXRlKSkpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBuZXh0U3RhdGUgPSB1dGlsLmV4dGVuZCh7fSwgbmV4dFN0YXRlKTtcbiAgICAgICAgbmV4dFN0YXRlLmxheWVycyA9IGRlcmVmKG5leHRTdGF0ZS5sYXllcnMpO1xuXG4gICAgICAgIGNvbnN0IGNoYW5nZXMgPSBkaWZmKHRoaXMuc2VyaWFsaXplKCksIG5leHRTdGF0ZSlcbiAgICAgICAgICAgIC5maWx0ZXIob3AgPT4gIShvcC5jb21tYW5kIGluIGlnbm9yZWREaWZmT3BlcmF0aW9ucykpO1xuXG4gICAgICAgIGlmIChjaGFuZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdW5pbXBsZW1lbnRlZE9wcyA9IGNoYW5nZXMuZmlsdGVyKG9wID0+ICEob3AuY29tbWFuZCBpbiBzdXBwb3J0ZWREaWZmT3BlcmF0aW9ucykpO1xuICAgICAgICBpZiAodW5pbXBsZW1lbnRlZE9wcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuaW1wbGVtZW50ZWQ6ICR7dW5pbXBsZW1lbnRlZE9wcy5tYXAob3AgPT4gb3AuY29tbWFuZCkuam9pbignLCAnKX0uYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjaGFuZ2VzLmZvckVhY2goKG9wKSA9PiB7XG4gICAgICAgICAgICBpZiAob3AuY29tbWFuZCA9PT0gJ3NldFRyYW5zaXRpb24nKSB7XG4gICAgICAgICAgICAgICAgLy8gYHRyYW5zaXRpb25gIGlzIGFsd2F5cyByZWFkIGRpcmVjdGx5IG9mZiBvZlxuICAgICAgICAgICAgICAgIC8vIGB0aGlzLnN0eWxlc2hlZXRgLCB3aGljaCB3ZSB1cGRhdGUgYmVsb3dcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzW29wLmNvbW1hbmRdLmFwcGx5KHRoaXMsIG9wLmFyZ3MpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnN0eWxlc2hlZXQgPSBuZXh0U3RhdGU7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgYWRkU291cmNlKGlkLCBzb3VyY2UsIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5fY2hlY2tMb2FkZWQoKTtcblxuICAgICAgICBpZiAodGhpcy5zb3VyY2VDYWNoZXNbaWRdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlcmUgaXMgYWxyZWFkeSBhIHNvdXJjZSB3aXRoIHRoaXMgSUQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghc291cmNlLnR5cGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHR5cGUgcHJvcGVydHkgbXVzdCBiZSBkZWZpbmVkLCBidXQgdGhlIG9ubHkgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIHdlcmUgZ2l2ZW46ICR7T2JqZWN0LmtleXMoc291cmNlKX0uYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBidWlsdElucyA9IFsndmVjdG9yJywgJ3Jhc3RlcicsICdnZW9qc29uJywgJ3ZpZGVvJywgJ2ltYWdlJywgJ2NhbnZhcyddO1xuICAgICAgICBjb25zdCBzaG91bGRWYWxpZGF0ZSA9IGJ1aWx0SW5zLmluZGV4T2Yoc291cmNlLnR5cGUpID49IDA7XG4gICAgICAgIGlmIChzaG91bGRWYWxpZGF0ZSAmJiB0aGlzLl92YWxpZGF0ZSh2YWxpZGF0ZVN0eWxlLnNvdXJjZSwgYHNvdXJjZXMuJHtpZH1gLCBzb3VyY2UsIG51bGwsIG9wdGlvbnMpKSByZXR1cm47XG5cbiAgICAgICAgY29uc3Qgc291cmNlQ2FjaGUgPSB0aGlzLnNvdXJjZUNhY2hlc1tpZF0gPSBuZXcgU291cmNlQ2FjaGUoaWQsIHNvdXJjZSwgdGhpcy5kaXNwYXRjaGVyKTtcbiAgICAgICAgc291cmNlQ2FjaGUuc3R5bGUgPSB0aGlzO1xuICAgICAgICBzb3VyY2VDYWNoZS5zZXRFdmVudGVkUGFyZW50KHRoaXMsICgpID0+ICh7XG4gICAgICAgICAgICBpc1NvdXJjZUxvYWRlZDogc291cmNlQ2FjaGUubG9hZGVkKCksXG4gICAgICAgICAgICBzb3VyY2U6IHNvdXJjZUNhY2hlLnNlcmlhbGl6ZSgpLFxuICAgICAgICAgICAgc291cmNlSWQ6IGlkXG4gICAgICAgIH0pKTtcblxuICAgICAgICBzb3VyY2VDYWNoZS5vbkFkZCh0aGlzLm1hcCk7XG4gICAgICAgIHRoaXMuX2NoYW5nZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhIHNvdXJjZSBmcm9tIHRoaXMgc3R5bGVzaGVldCwgZ2l2ZW4gaXRzIGlkLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpZCBpZCBvZiB0aGUgc291cmNlIHRvIHJlbW92ZVxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSBpZiBubyBzb3VyY2UgaXMgZm91bmQgd2l0aCB0aGUgZ2l2ZW4gSURcbiAgICAgKi9cbiAgICByZW1vdmVTb3VyY2UoaWQpIHtcbiAgICAgICAgdGhpcy5fY2hlY2tMb2FkZWQoKTtcblxuICAgICAgICBpZiAodGhpcy5zb3VyY2VDYWNoZXNbaWRdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlcmUgaXMgbm8gc291cmNlIHdpdGggdGhpcyBJRCcpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNvdXJjZUNhY2hlID0gdGhpcy5zb3VyY2VDYWNoZXNbaWRdO1xuICAgICAgICBkZWxldGUgdGhpcy5zb3VyY2VDYWNoZXNbaWRdO1xuICAgICAgICBkZWxldGUgdGhpcy5fdXBkYXRlZFNvdXJjZXNbaWRdO1xuICAgICAgICBzb3VyY2VDYWNoZS5zZXRFdmVudGVkUGFyZW50KG51bGwpO1xuICAgICAgICBzb3VyY2VDYWNoZS5jbGVhclRpbGVzKCk7XG5cbiAgICAgICAgaWYgKHNvdXJjZUNhY2hlLm9uUmVtb3ZlKSBzb3VyY2VDYWNoZS5vblJlbW92ZSh0aGlzLm1hcCk7XG4gICAgICAgIHRoaXMuX2NoYW5nZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhIHNvdXJjZSBieSBpZC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgaWQgb2YgdGhlIGRlc2lyZWQgc291cmNlXG4gICAgICogQHJldHVybnMge09iamVjdH0gc291cmNlXG4gICAgICovXG4gICAgZ2V0U291cmNlKGlkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNvdXJjZUNhY2hlc1tpZF0gJiYgdGhpcy5zb3VyY2VDYWNoZXNbaWRdLmdldFNvdXJjZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZCBhIGxheWVyIHRvIHRoZSBtYXAgc3R5bGUuIFRoZSBsYXllciB3aWxsIGJlIGluc2VydGVkIGJlZm9yZSB0aGUgbGF5ZXIgd2l0aFxuICAgICAqIElEIGBiZWZvcmVgLCBvciBhcHBlbmRlZCBpZiBgYmVmb3JlYCBpcyBvbWl0dGVkLlxuICAgICAqIEBwYXJhbSB7U3R5bGVMYXllcnxPYmplY3R9IGxheWVyXG4gICAgICogQHBhcmFtIHtzdHJpbmc9fSBiZWZvcmUgIElEIG9mIGFuIGV4aXN0aW5nIGxheWVyIHRvIGluc2VydCBiZWZvcmVcbiAgICAgKi9cbiAgICBhZGRMYXllcihsYXllck9iamVjdCwgYmVmb3JlLCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuX2NoZWNrTG9hZGVkKCk7XG5cbiAgICAgICAgY29uc3QgaWQgPSBsYXllck9iamVjdC5pZDtcblxuICAgICAgICBpZiAodHlwZW9mIGxheWVyT2JqZWN0LnNvdXJjZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkU291cmNlKGlkLCBsYXllck9iamVjdC5zb3VyY2UpO1xuICAgICAgICAgICAgbGF5ZXJPYmplY3QgPSB1dGlsLmV4dGVuZChsYXllck9iamVjdCwgeyBzb3VyY2U6IGlkIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdGhpcyBsYXllciBpcyBub3QgaW4gdGhlIHN0eWxlLmxheWVycyBhcnJheSwgc28gd2UgcGFzcyBhbiBpbXBvc3NpYmxlIGFycmF5IGluZGV4XG4gICAgICAgIGlmICh0aGlzLl92YWxpZGF0ZSh2YWxpZGF0ZVN0eWxlLmxheWVyLFxuICAgICAgICAgICAgICAgIGBsYXllcnMuJHtpZH1gLCBsYXllck9iamVjdCwge2FycmF5SW5kZXg6IC0xfSwgb3B0aW9ucykpIHJldHVybjtcblxuICAgICAgICBjb25zdCBsYXllciA9IFN0eWxlTGF5ZXIuY3JlYXRlKGxheWVyT2JqZWN0KTtcbiAgICAgICAgdGhpcy5fdmFsaWRhdGVMYXllcihsYXllcik7XG5cbiAgICAgICAgbGF5ZXIuc2V0RXZlbnRlZFBhcmVudCh0aGlzLCB7bGF5ZXI6IHtpZDogaWR9fSk7XG5cbiAgICAgICAgY29uc3QgaW5kZXggPSBiZWZvcmUgPyB0aGlzLl9vcmRlci5pbmRleE9mKGJlZm9yZSkgOiB0aGlzLl9vcmRlci5sZW5ndGg7XG4gICAgICAgIHRoaXMuX29yZGVyLnNwbGljZShpbmRleCwgMCwgaWQpO1xuXG4gICAgICAgIHRoaXMuX2xheWVyc1tpZF0gPSBsYXllcjtcblxuICAgICAgICBpZiAodGhpcy5fcmVtb3ZlZExheWVyc1tpZF0gJiYgbGF5ZXIuc291cmNlKSB7XG4gICAgICAgICAgICAvLyBJZiwgaW4gdGhlIGN1cnJlbnQgYmF0Y2gsIHdlIGhhdmUgYWxyZWFkeSByZW1vdmVkIHRoaXMgbGF5ZXJcbiAgICAgICAgICAgIC8vIGFuZCB3ZSBhcmUgbm93IHJlLWFkZGluZyBpdCB3aXRoIGEgZGlmZmVyZW50IGB0eXBlYCwgdGhlbiB3ZVxuICAgICAgICAgICAgLy8gbmVlZCB0byBjbGVhciAocmF0aGVyIHRoYW4ganVzdCByZWxvYWQpIHRoZSB1bmRlcnlsaW5nIHNvdXJjZSdzXG4gICAgICAgICAgICAvLyB0aWxlcy4gIE90aGVyd2lzZSwgdGlsZXMgbWFya2VkICdyZWxvYWRpbmcnIHdpbGwgaGF2ZSBidWNrZXRzIC9cbiAgICAgICAgICAgIC8vIGJ1ZmZlcnMgdGhhdCBhcmUgc2V0IHVwIGZvciB0aGUgX3ByZXZpb3VzXyB2ZXJzaW9uIG9mIHRoaXNcbiAgICAgICAgICAgIC8vIGxheWVyLCBjYXVzaW5nLCBlLmcuOlxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvaXNzdWVzLzM2MzNcbiAgICAgICAgICAgIGNvbnN0IHJlbW92ZWQgPSB0aGlzLl9yZW1vdmVkTGF5ZXJzW2lkXTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9yZW1vdmVkTGF5ZXJzW2lkXTtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZWRTb3VyY2VzW2xheWVyLnNvdXJjZV0gPSByZW1vdmVkLnR5cGUgIT09IGxheWVyLnR5cGUgPyAnY2xlYXInIDogJ3JlbG9hZCc7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdXBkYXRlTGF5ZXIobGF5ZXIpO1xuXG4gICAgICAgIGlmIChsYXllci50eXBlID09PSAnc3ltYm9sJykge1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlZFN5bWJvbE9yZGVyID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXBkYXRlQ2xhc3NlcyhpZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkIGEgbGF5ZXIgdG8gdGhlIG1hcCBzdHlsZS4gVGhlIGxheWVyIHdpbGwgYmUgaW5zZXJ0ZWQgYmVmb3JlIHRoZSBsYXllciB3aXRoXG4gICAgICogSUQgYGJlZm9yZWAsIG9yIGFwcGVuZGVkIGlmIGBiZWZvcmVgIGlzIG9taXR0ZWQuXG4gICAgICogQHBhcmFtIHtTdHlsZUxheWVyfE9iamVjdH0gbGF5ZXJcbiAgICAgKiBAcGFyYW0ge3N0cmluZz19IGJlZm9yZSAgSUQgb2YgYW4gZXhpc3RpbmcgbGF5ZXIgdG8gaW5zZXJ0IGJlZm9yZVxuICAgICAqL1xuICAgIG1vdmVMYXllcihpZCwgYmVmb3JlKSB7XG4gICAgICAgIHRoaXMuX2NoZWNrTG9hZGVkKCk7XG4gICAgICAgIHRoaXMuX2NoYW5nZWQgPSB0cnVlO1xuXG4gICAgICAgIGNvbnN0IGxheWVyID0gdGhpcy5fbGF5ZXJzW2lkXTtcbiAgICAgICAgaWYgKCFsYXllcikge1xuICAgICAgICAgICAgdGhpcy5maXJlKCdlcnJvcicsIHtcbiAgICAgICAgICAgICAgICBlcnJvcjogbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgYFRoZSBsYXllciAnJHtpZH0nIGRvZXMgbm90IGV4aXN0IGluIGAgK1xuICAgICAgICAgICAgICAgICAgYHRoZSBtYXAncyBzdHlsZSBhbmQgY2Fubm90IGJlIG1vdmVkLmBcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fb3JkZXIuaW5kZXhPZihpZCk7XG4gICAgICAgIHRoaXMuX29yZGVyLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAgICAgY29uc3QgbmV3SW5kZXggPSBiZWZvcmUgPyB0aGlzLl9vcmRlci5pbmRleE9mKGJlZm9yZSkgOiB0aGlzLl9vcmRlci5sZW5ndGg7XG4gICAgICAgIHRoaXMuX29yZGVyLnNwbGljZShuZXdJbmRleCwgMCwgaWQpO1xuXG4gICAgICAgIGlmIChsYXllci50eXBlID09PSAnc3ltYm9sJykge1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlZFN5bWJvbE9yZGVyID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmIChsYXllci5zb3VyY2UgJiYgIXRoaXMuX3VwZGF0ZWRTb3VyY2VzW2xheWVyLnNvdXJjZV0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVkU291cmNlc1tsYXllci5zb3VyY2VdID0gJ3JlbG9hZCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYSBsYXllciBmcm9tIHRoaXMgc3R5bGVzaGVldCwgZ2l2ZW4gaXRzIGlkLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpZCBpZCBvZiB0aGUgbGF5ZXIgdG8gcmVtb3ZlXG4gICAgICogQHRocm93cyB7RXJyb3J9IGlmIG5vIGxheWVyIGlzIGZvdW5kIHdpdGggdGhlIGdpdmVuIElEXG4gICAgICovXG4gICAgcmVtb3ZlTGF5ZXIoaWQpIHtcbiAgICAgICAgdGhpcy5fY2hlY2tMb2FkZWQoKTtcblxuICAgICAgICBjb25zdCBsYXllciA9IHRoaXMuX2xheWVyc1tpZF07XG4gICAgICAgIGlmICghbGF5ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZSgnZXJyb3InLCB7XG4gICAgICAgICAgICAgICAgZXJyb3I6IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgIGBUaGUgbGF5ZXIgJyR7aWR9JyBkb2VzIG5vdCBleGlzdCBpbiBgICtcbiAgICAgICAgICAgICAgICAgIGB0aGUgbWFwJ3Mgc3R5bGUgYW5kIGNhbm5vdCBiZSByZW1vdmVkLmBcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxheWVyLnNldEV2ZW50ZWRQYXJlbnQobnVsbCk7XG5cbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLl9vcmRlci5pbmRleE9mKGlkKTtcbiAgICAgICAgdGhpcy5fb3JkZXIuc3BsaWNlKGluZGV4LCAxKTtcblxuICAgICAgICBpZiAobGF5ZXIudHlwZSA9PT0gJ3N5bWJvbCcpIHtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZWRTeW1ib2xPcmRlciA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fcmVtb3ZlZExheWVyc1tpZF0gPSBsYXllcjtcbiAgICAgICAgZGVsZXRlIHRoaXMuX2xheWVyc1tpZF07XG4gICAgICAgIGRlbGV0ZSB0aGlzLl91cGRhdGVkTGF5ZXJzW2lkXTtcbiAgICAgICAgZGVsZXRlIHRoaXMuX3VwZGF0ZWRQYWludFByb3BzW2lkXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIHN0eWxlIGxheWVyIG9iamVjdCB3aXRoIHRoZSBnaXZlbiBgaWRgLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIC0gaWQgb2YgdGhlIGRlc2lyZWQgbGF5ZXJcbiAgICAgKiBAcmV0dXJucyB7P09iamVjdH0gYSBsYXllciwgaWYgb25lIHdpdGggdGhlIGdpdmVuIGBpZGAgZXhpc3RzXG4gICAgICovXG4gICAgZ2V0TGF5ZXIoaWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xheWVyc1tpZF07XG4gICAgfVxuXG4gICAgc2V0TGF5ZXJab29tUmFuZ2UobGF5ZXJJZCwgbWluem9vbSwgbWF4em9vbSkge1xuICAgICAgICB0aGlzLl9jaGVja0xvYWRlZCgpO1xuXG4gICAgICAgIGNvbnN0IGxheWVyID0gdGhpcy5nZXRMYXllcihsYXllcklkKTtcbiAgICAgICAgaWYgKCFsYXllcikge1xuICAgICAgICAgICAgdGhpcy5maXJlKCdlcnJvcicsIHtcbiAgICAgICAgICAgICAgICBlcnJvcjogbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgYFRoZSBsYXllciAnJHtsYXllcklkfScgZG9lcyBub3QgZXhpc3QgaW4gYCArXG4gICAgICAgICAgICAgICAgICBgdGhlIG1hcCdzIHN0eWxlIGFuZCBjYW5ub3QgaGF2ZSB6b29tIGV4dGVudC5gXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGF5ZXIubWluem9vbSA9PT0gbWluem9vbSAmJiBsYXllci5tYXh6b29tID09PSBtYXh6b29tKSByZXR1cm47XG5cbiAgICAgICAgaWYgKG1pbnpvb20gIT0gbnVsbCkge1xuICAgICAgICAgICAgbGF5ZXIubWluem9vbSA9IG1pbnpvb207XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1heHpvb20gIT0gbnVsbCkge1xuICAgICAgICAgICAgbGF5ZXIubWF4em9vbSA9IG1heHpvb207XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdXBkYXRlTGF5ZXIobGF5ZXIpO1xuICAgIH1cblxuICAgIHNldEZpbHRlcihsYXllcklkLCBmaWx0ZXIpIHtcbiAgICAgICAgdGhpcy5fY2hlY2tMb2FkZWQoKTtcblxuICAgICAgICBjb25zdCBsYXllciA9IHRoaXMuZ2V0TGF5ZXIobGF5ZXJJZCk7XG4gICAgICAgIGlmICghbGF5ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZSgnZXJyb3InLCB7XG4gICAgICAgICAgICAgICAgZXJyb3I6IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgIGBUaGUgbGF5ZXIgJyR7bGF5ZXJJZH0nIGRvZXMgbm90IGV4aXN0IGluIGAgK1xuICAgICAgICAgICAgICAgICAgYHRoZSBtYXAncyBzdHlsZSBhbmQgY2Fubm90IGJlIGZpbHRlcmVkLmBcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWx0ZXIgIT09IG51bGwgJiYgZmlsdGVyICE9PSB1bmRlZmluZWQgJiYgdGhpcy5fdmFsaWRhdGUodmFsaWRhdGVTdHlsZS5maWx0ZXIsIGBsYXllcnMuJHtsYXllci5pZH0uZmlsdGVyYCwgZmlsdGVyKSkgcmV0dXJuO1xuXG4gICAgICAgIGlmICh1dGlsLmRlZXBFcXVhbChsYXllci5maWx0ZXIsIGZpbHRlcikpIHJldHVybjtcbiAgICAgICAgbGF5ZXIuZmlsdGVyID0gdXRpbC5jbG9uZShmaWx0ZXIpO1xuXG4gICAgICAgIHRoaXMuX3VwZGF0ZUxheWVyKGxheWVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYSBsYXllcidzIGZpbHRlciBvYmplY3RcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbGF5ZXIgdGhlIGxheWVyIHRvIGluc3BlY3RcbiAgICAgKiBAcmV0dXJucyB7Kn0gdGhlIGxheWVyJ3MgZmlsdGVyLCBpZiBhbnlcbiAgICAgKi9cbiAgICBnZXRGaWx0ZXIobGF5ZXIpIHtcbiAgICAgICAgcmV0dXJuIHV0aWwuY2xvbmUodGhpcy5nZXRMYXllcihsYXllcikuZmlsdGVyKTtcbiAgICB9XG5cbiAgICBzZXRMYXlvdXRQcm9wZXJ0eShsYXllcklkLCBuYW1lLCB2YWx1ZSkge1xuICAgICAgICB0aGlzLl9jaGVja0xvYWRlZCgpO1xuXG4gICAgICAgIGNvbnN0IGxheWVyID0gdGhpcy5nZXRMYXllcihsYXllcklkKTtcbiAgICAgICAgaWYgKCFsYXllcikge1xuICAgICAgICAgICAgdGhpcy5maXJlKCdlcnJvcicsIHtcbiAgICAgICAgICAgICAgICBlcnJvcjogbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgYFRoZSBsYXllciAnJHtsYXllcklkfScgZG9lcyBub3QgZXhpc3QgaW4gYCArXG4gICAgICAgICAgICAgICAgICBgdGhlIG1hcCdzIHN0eWxlIGFuZCBjYW5ub3QgYmUgc3R5bGVkLmBcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh1dGlsLmRlZXBFcXVhbChsYXllci5nZXRMYXlvdXRQcm9wZXJ0eShuYW1lKSwgdmFsdWUpKSByZXR1cm47XG5cbiAgICAgICAgbGF5ZXIuc2V0TGF5b3V0UHJvcGVydHkobmFtZSwgdmFsdWUpO1xuICAgICAgICB0aGlzLl91cGRhdGVMYXllcihsYXllcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGEgbGF5b3V0IHByb3BlcnR5J3MgdmFsdWUgZnJvbSBhIGdpdmVuIGxheWVyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxheWVyIHRoZSBsYXllciB0byBpbnNwZWN0XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgdGhlIG5hbWUgb2YgdGhlIGxheW91dCBwcm9wZXJ0eVxuICAgICAqIEByZXR1cm5zIHsqfSB0aGUgcHJvcGVydHkgdmFsdWVcbiAgICAgKi9cbiAgICBnZXRMYXlvdXRQcm9wZXJ0eShsYXllciwgbmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRMYXllcihsYXllcikuZ2V0TGF5b3V0UHJvcGVydHkobmFtZSk7XG4gICAgfVxuXG4gICAgc2V0UGFpbnRQcm9wZXJ0eShsYXllcklkLCBuYW1lLCB2YWx1ZSwga2xhc3MpIHtcbiAgICAgICAgdGhpcy5fY2hlY2tMb2FkZWQoKTtcblxuICAgICAgICBjb25zdCBsYXllciA9IHRoaXMuZ2V0TGF5ZXIobGF5ZXJJZCk7XG4gICAgICAgIGlmICghbGF5ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZSgnZXJyb3InLCB7XG4gICAgICAgICAgICAgICAgZXJyb3I6IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgIGBUaGUgbGF5ZXIgJyR7bGF5ZXJJZH0nIGRvZXMgbm90IGV4aXN0IGluIGAgK1xuICAgICAgICAgICAgICAgICAgYHRoZSBtYXAncyBzdHlsZSBhbmQgY2Fubm90IGJlIHN0eWxlZC5gXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodXRpbC5kZWVwRXF1YWwobGF5ZXIuZ2V0UGFpbnRQcm9wZXJ0eShuYW1lLCBrbGFzcyksIHZhbHVlKSkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHdhc0ZlYXR1cmVDb25zdGFudCA9IGxheWVyLmlzUGFpbnRWYWx1ZUZlYXR1cmVDb25zdGFudChuYW1lKTtcbiAgICAgICAgbGF5ZXIuc2V0UGFpbnRQcm9wZXJ0eShuYW1lLCB2YWx1ZSwga2xhc3MpO1xuXG4gICAgICAgIGNvbnN0IGlzRmVhdHVyZUNvbnN0YW50ID0gIShcbiAgICAgICAgICAgIHZhbHVlICYmXG4gICAgICAgICAgICBNYXBib3hHTEZ1bmN0aW9uLmlzRnVuY3Rpb25EZWZpbml0aW9uKHZhbHVlKSAmJlxuICAgICAgICAgICAgdmFsdWUucHJvcGVydHkgIT09ICckem9vbScgJiZcbiAgICAgICAgICAgIHZhbHVlLnByb3BlcnR5ICE9PSB1bmRlZmluZWRcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoIWlzRmVhdHVyZUNvbnN0YW50IHx8ICF3YXNGZWF0dXJlQ29uc3RhbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUxheWVyKGxheWVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXBkYXRlQ2xhc3NlcyhsYXllcklkLCBuYW1lKTtcbiAgICB9XG5cbiAgICBnZXRQYWludFByb3BlcnR5KGxheWVyLCBuYW1lLCBrbGFzcykge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRMYXllcihsYXllcikuZ2V0UGFpbnRQcm9wZXJ0eShuYW1lLCBrbGFzcyk7XG4gICAgfVxuXG4gICAgZ2V0VHJhbnNpdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHV0aWwuZXh0ZW5kKHsgZHVyYXRpb246IDMwMCwgZGVsYXk6IDAgfSxcbiAgICAgICAgICAgIHRoaXMuc3R5bGVzaGVldCAmJiB0aGlzLnN0eWxlc2hlZXQudHJhbnNpdGlvbik7XG4gICAgfVxuXG4gICAgdXBkYXRlQ2xhc3NlcyhsYXllcklkLCBwYWludE5hbWUpIHtcbiAgICAgICAgdGhpcy5fY2hhbmdlZCA9IHRydWU7XG4gICAgICAgIGlmICghbGF5ZXJJZCkge1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlZEFsbFBhaW50UHJvcHMgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcHJvcHMgPSB0aGlzLl91cGRhdGVkUGFpbnRQcm9wcztcbiAgICAgICAgICAgIGlmICghcHJvcHNbbGF5ZXJJZF0pIHByb3BzW2xheWVySWRdID0ge307XG4gICAgICAgICAgICBwcm9wc1tsYXllcklkXVtwYWludE5hbWUgfHwgJ2FsbCddID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHV0aWwuZmlsdGVyT2JqZWN0KHtcbiAgICAgICAgICAgIHZlcnNpb246IHRoaXMuc3R5bGVzaGVldC52ZXJzaW9uLFxuICAgICAgICAgICAgbmFtZTogdGhpcy5zdHlsZXNoZWV0Lm5hbWUsXG4gICAgICAgICAgICBtZXRhZGF0YTogdGhpcy5zdHlsZXNoZWV0Lm1ldGFkYXRhLFxuICAgICAgICAgICAgbGlnaHQ6IHRoaXMuc3R5bGVzaGVldC5saWdodCxcbiAgICAgICAgICAgIGNlbnRlcjogdGhpcy5zdHlsZXNoZWV0LmNlbnRlcixcbiAgICAgICAgICAgIHpvb206IHRoaXMuc3R5bGVzaGVldC56b29tLFxuICAgICAgICAgICAgYmVhcmluZzogdGhpcy5zdHlsZXNoZWV0LmJlYXJpbmcsXG4gICAgICAgICAgICBwaXRjaDogdGhpcy5zdHlsZXNoZWV0LnBpdGNoLFxuICAgICAgICAgICAgc3ByaXRlOiB0aGlzLnN0eWxlc2hlZXQuc3ByaXRlLFxuICAgICAgICAgICAgZ2x5cGhzOiB0aGlzLnN0eWxlc2hlZXQuZ2x5cGhzLFxuICAgICAgICAgICAgdHJhbnNpdGlvbjogdGhpcy5zdHlsZXNoZWV0LnRyYW5zaXRpb24sXG4gICAgICAgICAgICBzb3VyY2VzOiB1dGlsLm1hcE9iamVjdCh0aGlzLnNvdXJjZUNhY2hlcywgKHNvdXJjZSkgPT4gc291cmNlLnNlcmlhbGl6ZSgpKSxcbiAgICAgICAgICAgIGxheWVyczogdGhpcy5fb3JkZXIubWFwKChpZCkgPT4gdGhpcy5fbGF5ZXJzW2lkXS5zZXJpYWxpemUoKSlcbiAgICAgICAgfSwgKHZhbHVlKSA9PiB7IHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkOyB9KTtcbiAgICB9XG5cbiAgICBfdXBkYXRlTGF5ZXIobGF5ZXIpIHtcbiAgICAgICAgdGhpcy5fdXBkYXRlZExheWVyc1tsYXllci5pZF0gPSB0cnVlO1xuICAgICAgICBpZiAobGF5ZXIuc291cmNlICYmICF0aGlzLl91cGRhdGVkU291cmNlc1tsYXllci5zb3VyY2VdKSB7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVkU291cmNlc1tsYXllci5zb3VyY2VdID0gJ3JlbG9hZCc7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fY2hhbmdlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgX2ZsYXR0ZW5SZW5kZXJlZEZlYXR1cmVzKHNvdXJjZVJlc3VsdHMpIHtcbiAgICAgICAgY29uc3QgZmVhdHVyZXMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgbCA9IHRoaXMuX29yZGVyLmxlbmd0aCAtIDE7IGwgPj0gMDsgbC0tKSB7XG4gICAgICAgICAgICBjb25zdCBsYXllcklkID0gdGhpcy5fb3JkZXJbbF07XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHNvdXJjZVJlc3VsdCBvZiBzb3VyY2VSZXN1bHRzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGF5ZXJGZWF0dXJlcyA9IHNvdXJjZVJlc3VsdFtsYXllcklkXTtcbiAgICAgICAgICAgICAgICBpZiAobGF5ZXJGZWF0dXJlcykge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGZlYXR1cmUgb2YgbGF5ZXJGZWF0dXJlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZXMucHVzaChmZWF0dXJlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmVhdHVyZXM7XG4gICAgfVxuXG4gICAgcXVlcnlSZW5kZXJlZEZlYXR1cmVzKHF1ZXJ5R2VvbWV0cnksIHBhcmFtcywgem9vbSwgYmVhcmluZykge1xuICAgICAgICBpZiAocGFyYW1zICYmIHBhcmFtcy5maWx0ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX3ZhbGlkYXRlKHZhbGlkYXRlU3R5bGUuZmlsdGVyLCAncXVlcnlSZW5kZXJlZEZlYXR1cmVzLmZpbHRlcicsIHBhcmFtcy5maWx0ZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaW5jbHVkZWRTb3VyY2VzID0ge307XG4gICAgICAgIGlmIChwYXJhbXMgJiYgcGFyYW1zLmxheWVycykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBsYXllcklkIG9mIHBhcmFtcy5sYXllcnMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsYXllciA9IHRoaXMuX2xheWVyc1tsYXllcklkXTtcbiAgICAgICAgICAgICAgICBpZiAoIWxheWVyKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgbGF5ZXIgaXMgbm90IGluIHRoZSBzdHlsZS5sYXllcnMgYXJyYXlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlKCdlcnJvcicsIHtlcnJvcjogYFRoZSBsYXllciAnJHtsYXllcklkXG4gICAgICAgICAgICAgICAgICAgICAgICB9JyBkb2VzIG5vdCBleGlzdCBpbiB0aGUgbWFwJ3Mgc3R5bGUgYW5kIGNhbm5vdCBiZSBxdWVyaWVkIGZvciBmZWF0dXJlcy5gfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaW5jbHVkZWRTb3VyY2VzW2xheWVyLnNvdXJjZV0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc291cmNlUmVzdWx0cyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMuc291cmNlQ2FjaGVzKSB7XG4gICAgICAgICAgICBpZiAocGFyYW1zLmxheWVycyAmJiAhaW5jbHVkZWRTb3VyY2VzW2lkXSkgY29udGludWU7XG4gICAgICAgICAgICBjb25zdCByZXN1bHRzID0gUXVlcnlGZWF0dXJlcy5yZW5kZXJlZCh0aGlzLnNvdXJjZUNhY2hlc1tpZF0sIHRoaXMuX2xheWVycywgcXVlcnlHZW9tZXRyeSwgcGFyYW1zLCB6b29tLCBiZWFyaW5nKTtcbiAgICAgICAgICAgIHNvdXJjZVJlc3VsdHMucHVzaChyZXN1bHRzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fZmxhdHRlblJlbmRlcmVkRmVhdHVyZXMoc291cmNlUmVzdWx0cyk7XG4gICAgfVxuXG4gICAgcXVlcnlTb3VyY2VGZWF0dXJlcyhzb3VyY2VJRCwgcGFyYW1zKSB7XG4gICAgICAgIGlmIChwYXJhbXMgJiYgcGFyYW1zLmZpbHRlcikge1xuICAgICAgICAgICAgdGhpcy5fdmFsaWRhdGUodmFsaWRhdGVTdHlsZS5maWx0ZXIsICdxdWVyeVNvdXJjZUZlYXR1cmVzLmZpbHRlcicsIHBhcmFtcy5maWx0ZXIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNvdXJjZUNhY2hlID0gdGhpcy5zb3VyY2VDYWNoZXNbc291cmNlSURdO1xuICAgICAgICByZXR1cm4gc291cmNlQ2FjaGUgPyBRdWVyeUZlYXR1cmVzLnNvdXJjZShzb3VyY2VDYWNoZSwgcGFyYW1zKSA6IFtdO1xuICAgIH1cblxuICAgIGFkZFNvdXJjZVR5cGUobmFtZSwgU291cmNlVHlwZSwgY2FsbGJhY2spIHtcbiAgICAgICAgaWYgKFNvdXJjZS5nZXRUeXBlKG5hbWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKGBBIHNvdXJjZSB0eXBlIGNhbGxlZCBcIiR7bmFtZX1cIiBhbHJlYWR5IGV4aXN0cy5gKSk7XG4gICAgICAgIH1cblxuICAgICAgICBTb3VyY2Uuc2V0VHlwZShuYW1lLCBTb3VyY2VUeXBlKTtcblxuICAgICAgICBpZiAoIVNvdXJjZVR5cGUud29ya2VyU291cmNlVVJMKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwgbnVsbCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRpc3BhdGNoZXIuYnJvYWRjYXN0KCdsb2FkV29ya2VyU291cmNlJywge1xuICAgICAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgICAgIHVybDogU291cmNlVHlwZS53b3JrZXJTb3VyY2VVUkxcbiAgICAgICAgfSwgY2FsbGJhY2spO1xuICAgIH1cblxuICAgIGdldExpZ2h0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5saWdodC5nZXRMaWdodCgpO1xuICAgIH1cblxuICAgIHNldExpZ2h0KGxpZ2h0T3B0aW9ucywgdHJhbnNpdGlvbk9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5fY2hlY2tMb2FkZWQoKTtcblxuICAgICAgICBjb25zdCBsaWdodCA9IHRoaXMubGlnaHQuZ2V0TGlnaHQoKTtcbiAgICAgICAgbGV0IF91cGRhdGUgPSBmYWxzZTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gbGlnaHRPcHRpb25zKSB7XG4gICAgICAgICAgICBpZiAoIXV0aWwuZGVlcEVxdWFsKGxpZ2h0T3B0aW9uc1trZXldLCBsaWdodFtrZXldKSkge1xuICAgICAgICAgICAgICAgIF91cGRhdGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghX3VwZGF0ZSkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHRyYW5zaXRpb24gPSB0aGlzLnN0eWxlc2hlZXQudHJhbnNpdGlvbiB8fCB7fTtcblxuICAgICAgICB0aGlzLmxpZ2h0LnNldExpZ2h0KGxpZ2h0T3B0aW9ucyk7XG4gICAgICAgIHRoaXMubGlnaHQudXBkYXRlTGlnaHRUcmFuc2l0aW9ucyh0cmFuc2l0aW9uT3B0aW9ucyB8fCB7dHJhbnNpdGlvbjogdHJ1ZX0sIHRyYW5zaXRpb24sIHRoaXMuYW5pbWF0aW9uTG9vcCk7XG4gICAgfVxuXG4gICAgX3ZhbGlkYXRlKHZhbGlkYXRlLCBrZXksIHZhbHVlLCBwcm9wcywgb3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnZhbGlkYXRlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWxpZGF0ZVN0eWxlLmVtaXRFcnJvcnModGhpcywgdmFsaWRhdGUuY2FsbCh2YWxpZGF0ZVN0eWxlLCB1dGlsLmV4dGVuZCh7XG4gICAgICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgICAgIHN0eWxlOiB0aGlzLnNlcmlhbGl6ZSgpLFxuICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgc3R5bGVTcGVjOiBzdHlsZVNwZWNcbiAgICAgICAgfSwgcHJvcHMpKSk7XG4gICAgfVxuXG4gICAgX3JlbW92ZSgpIHtcbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiB0aGlzLnNvdXJjZUNhY2hlcykge1xuICAgICAgICAgICAgdGhpcy5zb3VyY2VDYWNoZXNbaWRdLmNsZWFyVGlsZXMoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRpc3BhdGNoZXIucmVtb3ZlKCk7XG4gICAgfVxuXG4gICAgX2NsZWFyU291cmNlKGlkKSB7XG4gICAgICAgIHRoaXMuc291cmNlQ2FjaGVzW2lkXS5jbGVhclRpbGVzKCk7XG4gICAgfVxuXG4gICAgX3JlbG9hZFNvdXJjZShpZCkge1xuICAgICAgICB0aGlzLnNvdXJjZUNhY2hlc1tpZF0ucmVsb2FkKCk7XG4gICAgfVxuXG4gICAgX3VwZGF0ZVNvdXJjZXModHJhbnNmb3JtKSB7XG4gICAgICAgIGZvciAoY29uc3QgaWQgaW4gdGhpcy5zb3VyY2VDYWNoZXMpIHtcbiAgICAgICAgICAgIHRoaXMuc291cmNlQ2FjaGVzW2lkXS51cGRhdGUodHJhbnNmb3JtKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9yZWRvUGxhY2VtZW50KCkge1xuICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMuc291cmNlQ2FjaGVzKSB7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZUNhY2hlc1tpZF0ucmVkb1BsYWNlbWVudCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2FsbGJhY2tzIGZyb20gd2ViIHdvcmtlcnNcblxuICAgIGdldEljb25zKG1hcElkLCBwYXJhbXMsIGNhbGxiYWNrKSB7XG4gICAgICAgIGNvbnN0IHVwZGF0ZVNwcml0ZUF0bGFzID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zcHJpdGVBdGxhcy5zZXRTcHJpdGUodGhpcy5zcHJpdGUpO1xuICAgICAgICAgICAgdGhpcy5zcHJpdGVBdGxhcy5hZGRJY29ucyhwYXJhbXMuaWNvbnMsIGNhbGxiYWNrKTtcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHRoaXMuc3ByaXRlLmxvYWRlZCgpKSB7XG4gICAgICAgICAgICB1cGRhdGVTcHJpdGVBdGxhcygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zcHJpdGUub24oJ2RhdGEnLCB1cGRhdGVTcHJpdGVBdGxhcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRHbHlwaHMobWFwSWQsIHBhcmFtcywgY2FsbGJhY2spIHtcbiAgICAgICAgY29uc3Qgc3RhY2tzID0gcGFyYW1zLnN0YWNrcztcbiAgICAgICAgbGV0IHJlbWFpbmluZyA9IE9iamVjdC5rZXlzKHN0YWNrcykubGVuZ3RoO1xuICAgICAgICBjb25zdCBhbGxHbHlwaHMgPSB7fTtcblxuICAgICAgICBmb3IgKGNvbnN0IGZvbnROYW1lIGluIHN0YWNrcykge1xuICAgICAgICAgICAgdGhpcy5nbHlwaFNvdXJjZS5nZXRTaW1wbGVHbHlwaHMoZm9udE5hbWUsIHN0YWNrc1tmb250TmFtZV0sIHBhcmFtcy51aWQsIGRvbmUpO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gZG9uZShlcnIsIGdseXBocywgZm9udE5hbWUpIHtcbiAgICAgICAgICAgIGlmIChlcnIpIGNvbnNvbGUuZXJyb3IoZXJyKTtcblxuICAgICAgICAgICAgYWxsR2x5cGhzW2ZvbnROYW1lXSA9IGdseXBocztcbiAgICAgICAgICAgIHJlbWFpbmluZy0tO1xuXG4gICAgICAgICAgICBpZiAocmVtYWluaW5nID09PSAwKVxuICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIGFsbEdseXBocyk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gU3R5bGU7XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IE1hcGJveEdMRnVuY3Rpb24gPSByZXF1aXJlKCdtYXBib3gtZ2wtZnVuY3Rpb24nKTtcbmNvbnN0IHBhcnNlQ29sb3IgPSByZXF1aXJlKCcuL3BhcnNlX2NvbG9yJyk7XG5jb25zdCB1dGlsID0gcmVxdWlyZSgnLi4vdXRpbC91dGlsJyk7XG5cbmNsYXNzIFN0eWxlRGVjbGFyYXRpb24ge1xuXG4gICAgY29uc3RydWN0b3IocmVmZXJlbmNlLCB2YWx1ZSkge1xuICAgICAgICB0aGlzLnZhbHVlID0gdXRpbC5jbG9uZSh2YWx1ZSk7XG4gICAgICAgIHRoaXMuaXNGdW5jdGlvbiA9IE1hcGJveEdMRnVuY3Rpb24uaXNGdW5jdGlvbkRlZmluaXRpb24odmFsdWUpO1xuXG4gICAgICAgIC8vIGltbXV0YWJsZSByZXByZXNlbnRhdGlvbiBvZiB2YWx1ZS4gdXNlZCBmb3IgY29tcGFyaXNvblxuICAgICAgICB0aGlzLmpzb24gPSBKU09OLnN0cmluZ2lmeSh0aGlzLnZhbHVlKTtcblxuICAgICAgICB0aGlzLm1pbmltdW0gPSByZWZlcmVuY2UubWluaW11bTtcbiAgICAgICAgdGhpcy5pc0NvbG9yID0gcmVmZXJlbmNlLnR5cGUgPT09ICdjb2xvcic7XG5cbiAgICAgICAgY29uc3QgcGFyc2VkVmFsdWUgPSB0aGlzLmlzQ29sb3IgJiYgdGhpcy52YWx1ZSA/IHBhcnNlQ29sb3IodGhpcy52YWx1ZSkgOiB2YWx1ZTtcbiAgICAgICAgbGV0IHNwZWNEZWZhdWx0ID0gcmVmZXJlbmNlLmRlZmF1bHQ7XG4gICAgICAgIGlmIChzcGVjRGVmYXVsdCAmJiByZWZlcmVuY2UudHlwZSA9PT0gJ2NvbG9yJykgc3BlY0RlZmF1bHQgPSBwYXJzZUNvbG9yKHNwZWNEZWZhdWx0KTtcblxuICAgICAgICB0aGlzLmZ1bmN0aW9uID0gTWFwYm94R0xGdW5jdGlvbltyZWZlcmVuY2UuZnVuY3Rpb24gfHwgJ3BpZWNld2lzZS1jb25zdGFudCddKHBhcnNlZFZhbHVlLCBzcGVjRGVmYXVsdCk7XG4gICAgICAgIHRoaXMuaXNGZWF0dXJlQ29uc3RhbnQgPSB0aGlzLmZ1bmN0aW9uLmlzRmVhdHVyZUNvbnN0YW50O1xuICAgICAgICB0aGlzLmlzWm9vbUNvbnN0YW50ID0gdGhpcy5mdW5jdGlvbi5pc1pvb21Db25zdGFudDtcblxuICAgICAgICBpZiAoIXRoaXMuaXNGZWF0dXJlQ29uc3RhbnQgJiYgIXRoaXMuaXNab29tQ29uc3RhbnQpIHtcbiAgICAgICAgICAgIHRoaXMuc3RvcFpvb21MZXZlbHMgPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IGludGVycG9sYXRpb25BbW91bnRTdG9wcyA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBzdG9wIG9mIHRoaXMudmFsdWUuc3RvcHMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB6b29tID0gc3RvcFswXS56b29tO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0b3Bab29tTGV2ZWxzLmluZGV4T2Yoem9vbSkgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcFpvb21MZXZlbHMucHVzaCh6b29tKTtcbiAgICAgICAgICAgICAgICAgICAgaW50ZXJwb2xhdGlvbkFtb3VudFN0b3BzLnB1c2goW3pvb20sIGludGVycG9sYXRpb25BbW91bnRTdG9wcy5sZW5ndGhdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZnVuY3Rpb25JbnRlcnBvbGF0aW9uVCA9IE1hcGJveEdMRnVuY3Rpb24uaW50ZXJwb2xhdGVkKHtcbiAgICAgICAgICAgICAgICBzdG9wczogaW50ZXJwb2xhdGlvbkFtb3VudFN0b3BzLFxuICAgICAgICAgICAgICAgIGJhc2U6IHZhbHVlLmJhc2UsXG4gICAgICAgICAgICAgICAgY29sb3JTcGFjZTogdmFsdWUuY29sb3JTcGFjZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjYWxjdWxhdGUoZ2xvYmFsUHJvcGVydGllcywgZmVhdHVyZVByb3BlcnRpZXMpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmZ1bmN0aW9uKGdsb2JhbFByb3BlcnRpZXMgJiYgZ2xvYmFsUHJvcGVydGllcy56b29tLCBmZWF0dXJlUHJvcGVydGllcyB8fCB7fSk7XG4gICAgICAgIGlmICh0aGlzLmlzQ29sb3IgJiYgdmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZUNvbG9yKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5taW5pbXVtICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgPCB0aGlzLm1pbmltdW0pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1pbmltdW07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIGNhbGN1bGF0ZUludGVycG9sYXRpb25UKGdsb2JhbFByb3BlcnRpZXMsIGZlYXR1cmVQcm9wZXJ0aWVzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZ1bmN0aW9uSW50ZXJwb2xhdGlvblQoZ2xvYmFsUHJvcGVydGllcyAmJiBnbG9iYWxQcm9wZXJ0aWVzLnpvb20sIGZlYXR1cmVQcm9wZXJ0aWVzIHx8IHt9KTtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gU3R5bGVEZWNsYXJhdGlvbjtcbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgdXRpbCA9IHJlcXVpcmUoJy4uL3V0aWwvdXRpbCcpO1xuY29uc3QgU3R5bGVUcmFuc2l0aW9uID0gcmVxdWlyZSgnLi9zdHlsZV90cmFuc2l0aW9uJyk7XG5jb25zdCBTdHlsZURlY2xhcmF0aW9uID0gcmVxdWlyZSgnLi9zdHlsZV9kZWNsYXJhdGlvbicpO1xuY29uc3Qgc3R5bGVTcGVjID0gcmVxdWlyZSgnLi9zdHlsZV9zcGVjJyk7XG5jb25zdCB2YWxpZGF0ZVN0eWxlID0gcmVxdWlyZSgnLi92YWxpZGF0ZV9zdHlsZScpO1xuY29uc3QgcGFyc2VDb2xvciA9IHJlcXVpcmUoJy4vcGFyc2VfY29sb3InKTtcbmNvbnN0IEV2ZW50ZWQgPSByZXF1aXJlKCcuLi91dGlsL2V2ZW50ZWQnKTtcblxuY29uc3QgVFJBTlNJVElPTl9TVUZGSVggPSAnLXRyYW5zaXRpb24nO1xuXG5jbGFzcyBTdHlsZUxheWVyIGV4dGVuZHMgRXZlbnRlZCB7XG4gICAgY29uc3RydWN0b3IobGF5ZXIpIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICB0aGlzLmlkID0gbGF5ZXIuaWQ7XG4gICAgICAgIHRoaXMubWV0YWRhdGEgPSBsYXllci5tZXRhZGF0YTtcbiAgICAgICAgdGhpcy50eXBlID0gbGF5ZXIudHlwZTtcbiAgICAgICAgdGhpcy5zb3VyY2UgPSBsYXllci5zb3VyY2U7XG4gICAgICAgIHRoaXMuc291cmNlTGF5ZXIgPSBsYXllclsnc291cmNlLWxheWVyJ107XG4gICAgICAgIHRoaXMubWluem9vbSA9IGxheWVyLm1pbnpvb207XG4gICAgICAgIHRoaXMubWF4em9vbSA9IGxheWVyLm1heHpvb207XG4gICAgICAgIHRoaXMuZmlsdGVyID0gbGF5ZXIuZmlsdGVyO1xuXG4gICAgICAgIHRoaXMucGFpbnQgPSB7fTtcbiAgICAgICAgdGhpcy5sYXlvdXQgPSB7fTtcblxuICAgICAgICB0aGlzLl9wYWludFNwZWNpZmljYXRpb25zID0gc3R5bGVTcGVjW2BwYWludF8ke3RoaXMudHlwZX1gXTtcbiAgICAgICAgdGhpcy5fbGF5b3V0U3BlY2lmaWNhdGlvbnMgPSBzdHlsZVNwZWNbYGxheW91dF8ke3RoaXMudHlwZX1gXTtcblxuICAgICAgICB0aGlzLl9wYWludFRyYW5zaXRpb25zID0ge307IC8vIHtbcHJvcGVydHlOYW1lXTogU3R5bGVUcmFuc2l0aW9ufVxuICAgICAgICB0aGlzLl9wYWludFRyYW5zaXRpb25PcHRpb25zID0ge307IC8vIHtbY2xhc3NOYW1lXToge1twcm9wZXJ0eU5hbWVdOiB7IGR1cmF0aW9uOk51bWJlciwgZGVsYXk6TnVtYmVyIH19fVxuICAgICAgICB0aGlzLl9wYWludERlY2xhcmF0aW9ucyA9IHt9OyAvLyB7W2NsYXNzTmFtZV06IHtbcHJvcGVydHlOYW1lXTogU3R5bGVEZWNsYXJhdGlvbn19XG4gICAgICAgIHRoaXMuX2xheW91dERlY2xhcmF0aW9ucyA9IHt9OyAvLyB7W3Byb3BlcnR5TmFtZV06IFN0eWxlRGVjbGFyYXRpb259XG4gICAgICAgIHRoaXMuX2xheW91dEZ1bmN0aW9ucyA9IHt9OyAvLyB7W3Byb3BlcnR5TmFtZV06IEJvb2xlYW59XG5cbiAgICAgICAgbGV0IHBhaW50TmFtZSwgbGF5b3V0TmFtZTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHt2YWxpZGF0ZTogZmFsc2V9O1xuXG4gICAgICAgIC8vIFJlc29sdmUgcGFpbnQgZGVjbGFyYXRpb25zXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGxheWVyKSB7XG4gICAgICAgICAgICBjb25zdCBtYXRjaCA9IGtleS5tYXRjaCgvXnBhaW50KD86XFwuKC4qKSk/JC8pO1xuICAgICAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qga2xhc3MgPSBtYXRjaFsxXSB8fCAnJztcbiAgICAgICAgICAgICAgICBmb3IgKHBhaW50TmFtZSBpbiBsYXllcltrZXldKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0UGFpbnRQcm9wZXJ0eShwYWludE5hbWUsIGxheWVyW2tleV1bcGFpbnROYW1lXSwga2xhc3MsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlc29sdmUgbGF5b3V0IGRlY2xhcmF0aW9uc1xuICAgICAgICBmb3IgKGxheW91dE5hbWUgaW4gbGF5ZXIubGF5b3V0KSB7XG4gICAgICAgICAgICB0aGlzLnNldExheW91dFByb3BlcnR5KGxheW91dE5hbWUsIGxheWVyLmxheW91dFtsYXlvdXROYW1lXSwgb3B0aW9ucyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzZXQgaW5pdGlhbCBsYXlvdXQvcGFpbnQgdmFsdWVzXG4gICAgICAgIGZvciAocGFpbnROYW1lIGluIHRoaXMuX3BhaW50U3BlY2lmaWNhdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMucGFpbnRbcGFpbnROYW1lXSA9IHRoaXMuZ2V0UGFpbnRWYWx1ZShwYWludE5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGF5b3V0TmFtZSBpbiB0aGlzLl9sYXlvdXRTcGVjaWZpY2F0aW9ucykge1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlTGF5b3V0VmFsdWUobGF5b3V0TmFtZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRMYXlvdXRQcm9wZXJ0eShuYW1lLCB2YWx1ZSwgb3B0aW9ucykge1xuXG4gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fbGF5b3V0RGVjbGFyYXRpb25zW25hbWVdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gYGxheWVycy4ke3RoaXMuaWR9LmxheW91dC4ke25hbWV9YDtcbiAgICAgICAgICAgIGlmICh0aGlzLl92YWxpZGF0ZSh2YWxpZGF0ZVN0eWxlLmxheW91dFByb3BlcnR5LCBrZXksIG5hbWUsIHZhbHVlLCBvcHRpb25zKSkgcmV0dXJuO1xuICAgICAgICAgICAgdGhpcy5fbGF5b3V0RGVjbGFyYXRpb25zW25hbWVdID0gbmV3IFN0eWxlRGVjbGFyYXRpb24odGhpcy5fbGF5b3V0U3BlY2lmaWNhdGlvbnNbbmFtZV0sIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl91cGRhdGVMYXlvdXRWYWx1ZShuYW1lKTtcbiAgICB9XG5cbiAgICBnZXRMYXlvdXRQcm9wZXJ0eShuYW1lKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0aGlzLl9sYXlvdXREZWNsYXJhdGlvbnNbbmFtZV0gJiZcbiAgICAgICAgICAgIHRoaXMuX2xheW91dERlY2xhcmF0aW9uc1tuYW1lXS52YWx1ZVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGdldExheW91dFZhbHVlKG5hbWUsIGdsb2JhbFByb3BlcnRpZXMsIGZlYXR1cmVQcm9wZXJ0aWVzKSB7XG4gICAgICAgIGNvbnN0IHNwZWNpZmljYXRpb24gPSB0aGlzLl9sYXlvdXRTcGVjaWZpY2F0aW9uc1tuYW1lXTtcbiAgICAgICAgY29uc3QgZGVjbGFyYXRpb24gPSB0aGlzLl9sYXlvdXREZWNsYXJhdGlvbnNbbmFtZV07XG5cbiAgICAgICAgaWYgKGRlY2xhcmF0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVjbGFyYXRpb24uY2FsY3VsYXRlKGdsb2JhbFByb3BlcnRpZXMsIGZlYXR1cmVQcm9wZXJ0aWVzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBzcGVjaWZpY2F0aW9uLmRlZmF1bHQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRQYWludFByb3BlcnR5KG5hbWUsIHZhbHVlLCBrbGFzcywgb3B0aW9ucykge1xuICAgICAgICBjb25zdCB2YWxpZGF0ZVN0eWxlS2V5ID0gYGxheWVycy4ke3RoaXMuaWR9JHtrbGFzcyA/IGBbXCJwYWludC4ke2tsYXNzfVwiXS5gIDogJy5wYWludC4nfSR7bmFtZX1gO1xuXG4gICAgICAgIGlmICh1dGlsLmVuZHNXaXRoKG5hbWUsIFRSQU5TSVRJT05fU1VGRklYKSkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9wYWludFRyYW5zaXRpb25PcHRpb25zW2tsYXNzIHx8ICcnXSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3BhaW50VHJhbnNpdGlvbk9wdGlvbnNba2xhc3MgfHwgJyddID0ge307XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9wYWludFRyYW5zaXRpb25PcHRpb25zW2tsYXNzIHx8ICcnXVtuYW1lXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3ZhbGlkYXRlKHZhbGlkYXRlU3R5bGUucGFpbnRQcm9wZXJ0eSwgdmFsaWRhdGVTdHlsZUtleSwgbmFtZSwgdmFsdWUsIG9wdGlvbnMpKSByZXR1cm47XG4gICAgICAgICAgICAgICAgdGhpcy5fcGFpbnRUcmFuc2l0aW9uT3B0aW9uc1trbGFzcyB8fCAnJ11bbmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5fcGFpbnREZWNsYXJhdGlvbnNba2xhc3MgfHwgJyddKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcGFpbnREZWNsYXJhdGlvbnNba2xhc3MgfHwgJyddID0ge307XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9wYWludERlY2xhcmF0aW9uc1trbGFzcyB8fCAnJ11bbmFtZV07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl92YWxpZGF0ZSh2YWxpZGF0ZVN0eWxlLnBhaW50UHJvcGVydHksIHZhbGlkYXRlU3R5bGVLZXksIG5hbWUsIHZhbHVlLCBvcHRpb25zKSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIHRoaXMuX3BhaW50RGVjbGFyYXRpb25zW2tsYXNzIHx8ICcnXVtuYW1lXSA9IG5ldyBTdHlsZURlY2xhcmF0aW9uKHRoaXMuX3BhaW50U3BlY2lmaWNhdGlvbnNbbmFtZV0sIHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldFBhaW50UHJvcGVydHkobmFtZSwga2xhc3MpIHtcbiAgICAgICAga2xhc3MgPSBrbGFzcyB8fCAnJztcbiAgICAgICAgaWYgKHV0aWwuZW5kc1dpdGgobmFtZSwgVFJBTlNJVElPTl9TVUZGSVgpKSB7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIHRoaXMuX3BhaW50VHJhbnNpdGlvbk9wdGlvbnNba2xhc3NdICYmXG4gICAgICAgICAgICAgICAgdGhpcy5fcGFpbnRUcmFuc2l0aW9uT3B0aW9uc1trbGFzc11bbmFtZV1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIHRoaXMuX3BhaW50RGVjbGFyYXRpb25zW2tsYXNzXSAmJlxuICAgICAgICAgICAgICAgIHRoaXMuX3BhaW50RGVjbGFyYXRpb25zW2tsYXNzXVtuYW1lXSAmJlxuICAgICAgICAgICAgICAgIHRoaXMuX3BhaW50RGVjbGFyYXRpb25zW2tsYXNzXVtuYW1lXS52YWx1ZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldFBhaW50VmFsdWUobmFtZSwgZ2xvYmFsUHJvcGVydGllcywgZmVhdHVyZVByb3BlcnRpZXMpIHtcbiAgICAgICAgY29uc3Qgc3BlY2lmaWNhdGlvbiA9IHRoaXMuX3BhaW50U3BlY2lmaWNhdGlvbnNbbmFtZV07XG4gICAgICAgIGNvbnN0IHRyYW5zaXRpb24gPSB0aGlzLl9wYWludFRyYW5zaXRpb25zW25hbWVdO1xuXG4gICAgICAgIGlmICh0cmFuc2l0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJhbnNpdGlvbi5jYWxjdWxhdGUoZ2xvYmFsUHJvcGVydGllcywgZmVhdHVyZVByb3BlcnRpZXMpO1xuICAgICAgICB9IGVsc2UgaWYgKHNwZWNpZmljYXRpb24udHlwZSA9PT0gJ2NvbG9yJyAmJiBzcGVjaWZpY2F0aW9uLmRlZmF1bHQpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZUNvbG9yKHNwZWNpZmljYXRpb24uZGVmYXVsdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gc3BlY2lmaWNhdGlvbi5kZWZhdWx0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0UGFpbnRWYWx1ZVN0b3Bab29tTGV2ZWxzKG5hbWUpIHtcbiAgICAgICAgY29uc3QgdHJhbnNpdGlvbiA9IHRoaXMuX3BhaW50VHJhbnNpdGlvbnNbbmFtZV07XG4gICAgICAgIGlmICh0cmFuc2l0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJhbnNpdGlvbi5kZWNsYXJhdGlvbi5zdG9wWm9vbUxldmVscztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldFBhaW50SW50ZXJwb2xhdGlvblQobmFtZSwgZ2xvYmFsUHJvcGVydGllcykge1xuICAgICAgICBjb25zdCB0cmFuc2l0aW9uID0gdGhpcy5fcGFpbnRUcmFuc2l0aW9uc1tuYW1lXTtcbiAgICAgICAgcmV0dXJuIHRyYW5zaXRpb24uZGVjbGFyYXRpb24uY2FsY3VsYXRlSW50ZXJwb2xhdGlvblQoZ2xvYmFsUHJvcGVydGllcyk7XG4gICAgfVxuXG4gICAgaXNQYWludFZhbHVlRmVhdHVyZUNvbnN0YW50KG5hbWUpIHtcbiAgICAgICAgY29uc3QgdHJhbnNpdGlvbiA9IHRoaXMuX3BhaW50VHJhbnNpdGlvbnNbbmFtZV07XG5cbiAgICAgICAgaWYgKHRyYW5zaXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiB0cmFuc2l0aW9uLmRlY2xhcmF0aW9uLmlzRmVhdHVyZUNvbnN0YW50O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpc0xheW91dFZhbHVlRmVhdHVyZUNvbnN0YW50KG5hbWUpIHtcbiAgICAgICAgY29uc3QgZGVjbGFyYXRpb24gPSB0aGlzLl9sYXlvdXREZWNsYXJhdGlvbnNbbmFtZV07XG5cbiAgICAgICAgaWYgKGRlY2xhcmF0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVjbGFyYXRpb24uaXNGZWF0dXJlQ29uc3RhbnQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlzUGFpbnRWYWx1ZVpvb21Db25zdGFudChuYW1lKSB7XG4gICAgICAgIGNvbnN0IHRyYW5zaXRpb24gPSB0aGlzLl9wYWludFRyYW5zaXRpb25zW25hbWVdO1xuXG4gICAgICAgIGlmICh0cmFuc2l0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJhbnNpdGlvbi5kZWNsYXJhdGlvbi5pc1pvb21Db25zdGFudDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaXNIaWRkZW4oem9vbSkge1xuICAgICAgICBpZiAodGhpcy5taW56b29tICYmIHpvb20gPCB0aGlzLm1pbnpvb20pIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAodGhpcy5tYXh6b29tICYmIHpvb20gPj0gdGhpcy5tYXh6b29tKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMubGF5b3V0Wyd2aXNpYmlsaXR5J10gPT09ICdub25lJykgcmV0dXJuIHRydWU7XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHVwZGF0ZVBhaW50VHJhbnNpdGlvbnMoY2xhc3Nlcywgb3B0aW9ucywgZ2xvYmFsT3B0aW9ucywgYW5pbWF0aW9uTG9vcCwgem9vbUhpc3RvcnkpIHtcbiAgICAgICAgY29uc3QgZGVjbGFyYXRpb25zID0gdXRpbC5leHRlbmQoe30sIHRoaXMuX3BhaW50RGVjbGFyYXRpb25zWycnXSk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2xhc3Nlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdXRpbC5leHRlbmQoZGVjbGFyYXRpb25zLCB0aGlzLl9wYWludERlY2xhcmF0aW9uc1tjbGFzc2VzW2ldXSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbmFtZTtcbiAgICAgICAgZm9yIChuYW1lIGluIGRlY2xhcmF0aW9ucykgeyAvLyBhcHBseSBuZXcgZGVjbGFyYXRpb25zXG4gICAgICAgICAgICB0aGlzLl9hcHBseVBhaW50RGVjbGFyYXRpb24obmFtZSwgZGVjbGFyYXRpb25zW25hbWVdLCBvcHRpb25zLCBnbG9iYWxPcHRpb25zLCBhbmltYXRpb25Mb29wLCB6b29tSGlzdG9yeSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChuYW1lIGluIHRoaXMuX3BhaW50VHJhbnNpdGlvbnMpIHtcbiAgICAgICAgICAgIGlmICghKG5hbWUgaW4gZGVjbGFyYXRpb25zKSkgLy8gYXBwbHkgcmVtb3ZlZCBkZWNsYXJhdGlvbnNcbiAgICAgICAgICAgICAgICB0aGlzLl9hcHBseVBhaW50RGVjbGFyYXRpb24obmFtZSwgbnVsbCwgb3B0aW9ucywgZ2xvYmFsT3B0aW9ucywgYW5pbWF0aW9uTG9vcCwgem9vbUhpc3RvcnkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlUGFpbnRUcmFuc2l0aW9uKG5hbWUsIGNsYXNzZXMsIG9wdGlvbnMsIGdsb2JhbE9wdGlvbnMsIGFuaW1hdGlvbkxvb3AsIHpvb21IaXN0b3J5KSB7XG4gICAgICAgIGxldCBkZWNsYXJhdGlvbiA9IHRoaXMuX3BhaW50RGVjbGFyYXRpb25zWycnXVtuYW1lXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjbGFzc2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBjbGFzc1BhaW50RGVjbGFyYXRpb25zID0gdGhpcy5fcGFpbnREZWNsYXJhdGlvbnNbY2xhc3Nlc1tpXV07XG4gICAgICAgICAgICBpZiAoY2xhc3NQYWludERlY2xhcmF0aW9ucyAmJiBjbGFzc1BhaW50RGVjbGFyYXRpb25zW25hbWVdKSB7XG4gICAgICAgICAgICAgICAgZGVjbGFyYXRpb24gPSBjbGFzc1BhaW50RGVjbGFyYXRpb25zW25hbWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2FwcGx5UGFpbnREZWNsYXJhdGlvbihuYW1lLCBkZWNsYXJhdGlvbiwgb3B0aW9ucywgZ2xvYmFsT3B0aW9ucywgYW5pbWF0aW9uTG9vcCwgem9vbUhpc3RvcnkpO1xuICAgIH1cblxuICAgIC8vIHVwZGF0ZSBhbGwgem9vbS1kZXBlbmRlbnQgbGF5b3V0L3BhaW50IHZhbHVlc1xuICAgIHJlY2FsY3VsYXRlKHpvb20pIHtcbiAgICAgICAgZm9yIChjb25zdCBwYWludE5hbWUgaW4gdGhpcy5fcGFpbnRUcmFuc2l0aW9ucykge1xuICAgICAgICAgICAgdGhpcy5wYWludFtwYWludE5hbWVdID0gdGhpcy5nZXRQYWludFZhbHVlKHBhaW50TmFtZSwge3pvb206IHpvb219KTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGxheW91dE5hbWUgaW4gdGhpcy5fbGF5b3V0RnVuY3Rpb25zKSB7XG4gICAgICAgICAgICB0aGlzLmxheW91dFtsYXlvdXROYW1lXSA9IHRoaXMuZ2V0TGF5b3V0VmFsdWUobGF5b3V0TmFtZSwge3pvb206IHpvb219KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNlcmlhbGl6ZSgpIHtcbiAgICAgICAgY29uc3Qgb3V0cHV0ID0ge1xuICAgICAgICAgICAgJ2lkJzogdGhpcy5pZCxcbiAgICAgICAgICAgICd0eXBlJzogdGhpcy50eXBlLFxuICAgICAgICAgICAgJ3NvdXJjZSc6IHRoaXMuc291cmNlLFxuICAgICAgICAgICAgJ3NvdXJjZS1sYXllcic6IHRoaXMuc291cmNlTGF5ZXIsXG4gICAgICAgICAgICAnbWV0YWRhdGEnOiB0aGlzLm1ldGFkYXRhLFxuICAgICAgICAgICAgJ21pbnpvb20nOiB0aGlzLm1pbnpvb20sXG4gICAgICAgICAgICAnbWF4em9vbSc6IHRoaXMubWF4em9vbSxcbiAgICAgICAgICAgICdmaWx0ZXInOiB0aGlzLmZpbHRlcixcbiAgICAgICAgICAgICdsYXlvdXQnOiB1dGlsLm1hcE9iamVjdCh0aGlzLl9sYXlvdXREZWNsYXJhdGlvbnMsIGdldERlY2xhcmF0aW9uVmFsdWUpXG4gICAgICAgIH07XG5cbiAgICAgICAgZm9yIChjb25zdCBrbGFzcyBpbiB0aGlzLl9wYWludERlY2xhcmF0aW9ucykge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0ga2xhc3MgPT09ICcnID8gJ3BhaW50JyA6IGBwYWludC4ke2tsYXNzfWA7XG4gICAgICAgICAgICBvdXRwdXRba2V5XSA9IHV0aWwubWFwT2JqZWN0KHRoaXMuX3BhaW50RGVjbGFyYXRpb25zW2tsYXNzXSwgZ2V0RGVjbGFyYXRpb25WYWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdXRpbC5maWx0ZXJPYmplY3Qob3V0cHV0LCAodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgIShrZXkgPT09ICdsYXlvdXQnICYmICFPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gc2V0IHBhaW50IHRyYW5zaXRpb24gYmFzZWQgb24gYSBnaXZlbiBwYWludCBkZWNsYXJhdGlvblxuICAgIF9hcHBseVBhaW50RGVjbGFyYXRpb24obmFtZSwgZGVjbGFyYXRpb24sIG9wdGlvbnMsIGdsb2JhbE9wdGlvbnMsIGFuaW1hdGlvbkxvb3AsIHpvb21IaXN0b3J5KSB7XG4gICAgICAgIGNvbnN0IG9sZFRyYW5zaXRpb24gPSBvcHRpb25zLnRyYW5zaXRpb24gPyB0aGlzLl9wYWludFRyYW5zaXRpb25zW25hbWVdIDogdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBzcGVjID0gdGhpcy5fcGFpbnRTcGVjaWZpY2F0aW9uc1tuYW1lXTtcblxuICAgICAgICBpZiAoZGVjbGFyYXRpb24gPT09IG51bGwgfHwgZGVjbGFyYXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZGVjbGFyYXRpb24gPSBuZXcgU3R5bGVEZWNsYXJhdGlvbihzcGVjLCBzcGVjLmRlZmF1bHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9sZFRyYW5zaXRpb24gJiYgb2xkVHJhbnNpdGlvbi5kZWNsYXJhdGlvbi5qc29uID09PSBkZWNsYXJhdGlvbi5qc29uKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgdHJhbnNpdGlvbk9wdGlvbnMgPSB1dGlsLmV4dGVuZCh7XG4gICAgICAgICAgICBkdXJhdGlvbjogMzAwLFxuICAgICAgICAgICAgZGVsYXk6IDBcbiAgICAgICAgfSwgZ2xvYmFsT3B0aW9ucywgdGhpcy5nZXRQYWludFByb3BlcnR5KG5hbWUgKyBUUkFOU0lUSU9OX1NVRkZJWCkpO1xuXG4gICAgICAgIGNvbnN0IG5ld1RyYW5zaXRpb24gPSB0aGlzLl9wYWludFRyYW5zaXRpb25zW25hbWVdID1cbiAgICAgICAgICAgIG5ldyBTdHlsZVRyYW5zaXRpb24oc3BlYywgZGVjbGFyYXRpb24sIG9sZFRyYW5zaXRpb24sIHRyYW5zaXRpb25PcHRpb25zLCB6b29tSGlzdG9yeSk7XG5cbiAgICAgICAgaWYgKCFuZXdUcmFuc2l0aW9uLmluc3RhbnQoKSkge1xuICAgICAgICAgICAgbmV3VHJhbnNpdGlvbi5sb29wSUQgPSBhbmltYXRpb25Mb29wLnNldChuZXdUcmFuc2l0aW9uLmVuZFRpbWUgLSBEYXRlLm5vdygpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob2xkVHJhbnNpdGlvbikge1xuICAgICAgICAgICAgYW5pbWF0aW9uTG9vcC5jYW5jZWwob2xkVHJhbnNpdGlvbi5sb29wSUQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gdXBkYXRlIGxheW91dCB2YWx1ZSBpZiBpdCdzIGNvbnN0YW50LCBvciBtYXJrIGl0IGFzIHpvb20tZGVwZW5kZW50XG4gICAgX3VwZGF0ZUxheW91dFZhbHVlKG5hbWUpIHtcbiAgICAgICAgY29uc3QgZGVjbGFyYXRpb24gPSB0aGlzLl9sYXlvdXREZWNsYXJhdGlvbnNbbmFtZV07XG5cbiAgICAgICAgaWYgKGRlY2xhcmF0aW9uICYmIGRlY2xhcmF0aW9uLmlzRnVuY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMuX2xheW91dEZ1bmN0aW9uc1tuYW1lXSA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fbGF5b3V0RnVuY3Rpb25zW25hbWVdO1xuICAgICAgICAgICAgdGhpcy5sYXlvdXRbbmFtZV0gPSB0aGlzLmdldExheW91dFZhbHVlKG5hbWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX3ZhbGlkYXRlKHZhbGlkYXRlLCBrZXksIG5hbWUsIHZhbHVlLCBvcHRpb25zKSB7XG4gICAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMudmFsaWRhdGUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbGlkYXRlU3R5bGUuZW1pdEVycm9ycyh0aGlzLCB2YWxpZGF0ZS5jYWxsKHZhbGlkYXRlU3R5bGUsIHtcbiAgICAgICAgICAgIGtleToga2V5LFxuICAgICAgICAgICAgbGF5ZXJUeXBlOiB0aGlzLnR5cGUsXG4gICAgICAgICAgICBvYmplY3RLZXk6IG5hbWUsXG4gICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgICBzdHlsZVNwZWM6IHN0eWxlU3BlYyxcbiAgICAgICAgICAgIC8vIFdvcmthcm91bmQgZm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWpzL2lzc3Vlcy8yNDA3XG4gICAgICAgICAgICBzdHlsZToge2dseXBoczogdHJ1ZSwgc3ByaXRlOiB0cnVlfVxuICAgICAgICB9KSk7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFN0eWxlTGF5ZXI7XG5cbmNvbnN0IHN1YmNsYXNzZXMgPSB7XG4gICAgJ2NpcmNsZSc6IHJlcXVpcmUoJy4vc3R5bGVfbGF5ZXIvY2lyY2xlX3N0eWxlX2xheWVyJyksXG4gICAgJ2ZpbGwnOiByZXF1aXJlKCcuL3N0eWxlX2xheWVyL2ZpbGxfc3R5bGVfbGF5ZXInKSxcbiAgICAnZmlsbC1leHRydXNpb24nOiByZXF1aXJlKCcuL3N0eWxlX2xheWVyL2ZpbGxfZXh0cnVzaW9uX3N0eWxlX2xheWVyJyksXG4gICAgJ2xpbmUnOiByZXF1aXJlKCcuL3N0eWxlX2xheWVyL2xpbmVfc3R5bGVfbGF5ZXInKSxcbiAgICAnc3ltYm9sJzogcmVxdWlyZSgnLi9zdHlsZV9sYXllci9zeW1ib2xfc3R5bGVfbGF5ZXInKVxufTtcblxuU3R5bGVMYXllci5jcmVhdGUgPSBmdW5jdGlvbihsYXllcikge1xuICAgIGNvbnN0IExheWVyQ2xhc3MgPSBzdWJjbGFzc2VzW2xheWVyLnR5cGVdIHx8IFN0eWxlTGF5ZXI7XG4gICAgcmV0dXJuIG5ldyBMYXllckNsYXNzKGxheWVyKTtcbn07XG5cbmZ1bmN0aW9uIGdldERlY2xhcmF0aW9uVmFsdWUoZGVjbGFyYXRpb24pIHtcbiAgICByZXR1cm4gZGVjbGFyYXRpb24udmFsdWU7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IFN0eWxlTGF5ZXIgPSByZXF1aXJlKCcuLi9zdHlsZV9sYXllcicpO1xuY29uc3QgQ2lyY2xlQnVja2V0ID0gcmVxdWlyZSgnLi4vLi4vZGF0YS9idWNrZXQvY2lyY2xlX2J1Y2tldCcpO1xuXG5jbGFzcyBDaXJjbGVTdHlsZUxheWVyIGV4dGVuZHMgU3R5bGVMYXllciB7XG4gICAgY3JlYXRlQnVja2V0KG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDaXJjbGVCdWNrZXQob3B0aW9ucyk7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IENpcmNsZVN0eWxlTGF5ZXI7XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IFN0eWxlTGF5ZXIgPSByZXF1aXJlKCcuLi9zdHlsZV9sYXllcicpO1xuY29uc3QgRmlsbEV4dHJ1c2lvbkJ1Y2tldCA9IHJlcXVpcmUoJy4uLy4uL2RhdGEvYnVja2V0L2ZpbGxfZXh0cnVzaW9uX2J1Y2tldCcpO1xuXG5jbGFzcyBGaWxsRXh0cnVzaW9uU3R5bGVMYXllciBleHRlbmRzIFN0eWxlTGF5ZXIge1xuXG4gICAgZ2V0UGFpbnRWYWx1ZShuYW1lLCBnbG9iYWxQcm9wZXJ0aWVzLCBmZWF0dXJlUHJvcGVydGllcykge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHN1cGVyLmdldFBhaW50VmFsdWUobmFtZSwgZ2xvYmFsUHJvcGVydGllcywgZmVhdHVyZVByb3BlcnRpZXMpO1xuICAgICAgICBpZiAobmFtZSA9PT0gJ2ZpbGwtZXh0cnVzaW9uLWNvbG9yJyAmJiB2YWx1ZSkge1xuICAgICAgICAgICAgdmFsdWVbM10gPSAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBjcmVhdGVCdWNrZXQob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gbmV3IEZpbGxFeHRydXNpb25CdWNrZXQob3B0aW9ucyk7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IEZpbGxFeHRydXNpb25TdHlsZUxheWVyO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBTdHlsZUxheWVyID0gcmVxdWlyZSgnLi4vc3R5bGVfbGF5ZXInKTtcbmNvbnN0IEZpbGxCdWNrZXQgPSByZXF1aXJlKCcuLi8uLi9kYXRhL2J1Y2tldC9maWxsX2J1Y2tldCcpO1xuXG5jbGFzcyBGaWxsU3R5bGVMYXllciBleHRlbmRzIFN0eWxlTGF5ZXIge1xuXG4gICAgZ2V0UGFpbnRWYWx1ZShuYW1lLCBnbG9iYWxQcm9wZXJ0aWVzLCBmZWF0dXJlUHJvcGVydGllcykge1xuICAgICAgICBpZiAobmFtZSA9PT0gJ2ZpbGwtb3V0bGluZS1jb2xvcicpIHtcbiAgICAgICAgICAgIC8vIFNwZWNpYWwtY2FzZSBoYW5kbGluZyBvZiB1bmRlZmluZWQgZmlsbC1vdXRsaW5lLWNvbG9yIHZhbHVlc1xuICAgICAgICAgICAgaWYgKHRoaXMuZ2V0UGFpbnRQcm9wZXJ0eSgnZmlsbC1vdXRsaW5lLWNvbG9yJykgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRQYWludFZhbHVlKCdmaWxsLWNvbG9yJywgZ2xvYmFsUHJvcGVydGllcywgZmVhdHVyZVByb3BlcnRpZXMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBIYW5kbGUgdHJhbnNpdGlvbnMgZnJvbSBmaWxsLW91dGxpbmUtY29sb3I6IHVuZGVmaW5lZFxuICAgICAgICAgICAgbGV0IHRyYW5zaXRpb24gPSB0aGlzLl9wYWludFRyYW5zaXRpb25zWydmaWxsLW91dGxpbmUtY29sb3InXTtcbiAgICAgICAgICAgIHdoaWxlICh0cmFuc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVjbGFyZWRWYWx1ZSA9IChcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbiAmJlxuICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uLmRlY2xhcmF0aW9uICYmXG4gICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb24uZGVjbGFyYXRpb24udmFsdWVcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFkZWNsYXJlZFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRQYWludFZhbHVlKCdmaWxsLWNvbG9yJywgZ2xvYmFsUHJvcGVydGllcywgZmVhdHVyZVByb3BlcnRpZXMpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRyYW5zaXRpb24gPSB0cmFuc2l0aW9uLm9sZFRyYW5zaXRpb247XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3VwZXIuZ2V0UGFpbnRWYWx1ZShuYW1lLCBnbG9iYWxQcm9wZXJ0aWVzLCBmZWF0dXJlUHJvcGVydGllcyk7XG4gICAgfVxuXG4gICAgZ2V0UGFpbnRWYWx1ZVN0b3Bab29tTGV2ZWxzKG5hbWUpIHtcbiAgICAgICAgaWYgKG5hbWUgPT09ICdmaWxsLW91dGxpbmUtY29sb3InICYmIHRoaXMuZ2V0UGFpbnRQcm9wZXJ0eSgnZmlsbC1vdXRsaW5lLWNvbG9yJykgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldFBhaW50VmFsdWVTdG9wWm9vbUxldmVscygnZmlsbC1jb2xvcicpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldFBhaW50VmFsdWVTdG9wWm9vbUxldmVscyhuYW1lKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldFBhaW50SW50ZXJwb2xhdGlvblQobmFtZSwgZ2xvYmFsUHJvcGVydGllcykge1xuICAgICAgICBpZiAobmFtZSA9PT0gJ2ZpbGwtb3V0bGluZS1jb2xvcicgJiYgdGhpcy5nZXRQYWludFByb3BlcnR5KCdmaWxsLW91dGxpbmUtY29sb3InKSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0UGFpbnRJbnRlcnBvbGF0aW9uVCgnZmlsbC1jb2xvcicsIGdsb2JhbFByb3BlcnRpZXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldFBhaW50SW50ZXJwb2xhdGlvblQobmFtZSwgZ2xvYmFsUHJvcGVydGllcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpc1BhaW50VmFsdWVGZWF0dXJlQ29uc3RhbnQobmFtZSkge1xuICAgICAgICBpZiAobmFtZSA9PT0gJ2ZpbGwtb3V0bGluZS1jb2xvcicgJiYgdGhpcy5nZXRQYWludFByb3BlcnR5KCdmaWxsLW91dGxpbmUtY29sb3InKSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gc3VwZXIuaXNQYWludFZhbHVlRmVhdHVyZUNvbnN0YW50KCdmaWxsLWNvbG9yJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gc3VwZXIuaXNQYWludFZhbHVlRmVhdHVyZUNvbnN0YW50KG5hbWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaXNQYWludFZhbHVlWm9vbUNvbnN0YW50KG5hbWUpIHtcbiAgICAgICAgaWYgKG5hbWUgPT09ICdmaWxsLW91dGxpbmUtY29sb3InICYmIHRoaXMuZ2V0UGFpbnRQcm9wZXJ0eSgnZmlsbC1vdXRsaW5lLWNvbG9yJykgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmlzUGFpbnRWYWx1ZVpvb21Db25zdGFudCgnZmlsbC1jb2xvcicpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmlzUGFpbnRWYWx1ZVpvb21Db25zdGFudChuYW1lKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNyZWF0ZUJ1Y2tldChvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBuZXcgRmlsbEJ1Y2tldChvcHRpb25zKTtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gRmlsbFN0eWxlTGF5ZXI7XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IFN0eWxlTGF5ZXIgPSByZXF1aXJlKCcuLi9zdHlsZV9sYXllcicpO1xuY29uc3QgTGluZUJ1Y2tldCA9IHJlcXVpcmUoJy4uLy4uL2RhdGEvYnVja2V0L2xpbmVfYnVja2V0Jyk7XG5jb25zdCB1dGlsID0gcmVxdWlyZSgnLi4vLi4vdXRpbC91dGlsJyk7XG5cbmNsYXNzIExpbmVTdHlsZUxheWVyIGV4dGVuZHMgU3R5bGVMYXllciB7XG5cbiAgICBnZXRQYWludFZhbHVlKG5hbWUsIGdsb2JhbFByb3BlcnRpZXMsIGZlYXR1cmVQcm9wZXJ0aWVzKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gc3VwZXIuZ2V0UGFpbnRWYWx1ZShuYW1lLCBnbG9iYWxQcm9wZXJ0aWVzLCBmZWF0dXJlUHJvcGVydGllcyk7XG5cbiAgICAgICAgLy8gSWYgdGhlIGxpbmUgaXMgZGFzaGVkLCBzY2FsZSB0aGUgZGFzaCBsZW5ndGhzIGJ5IHRoZSBsaW5lXG4gICAgICAgIC8vIHdpZHRoIGF0IHRoZSBwcmV2aW91cyByb3VuZCB6b29tIGxldmVsLlxuICAgICAgICBpZiAodmFsdWUgJiYgbmFtZSA9PT0gJ2xpbmUtZGFzaGFycmF5Jykge1xuICAgICAgICAgICAgY29uc3Qgd2lkdGggPSB0aGlzLmdldFBhaW50VmFsdWUoJ2xpbmUtd2lkdGgnLFxuICAgICAgICAgICAgICAgICAgICB1dGlsLmV4dGVuZCh7fSwgZ2xvYmFsUHJvcGVydGllcywge3pvb206IE1hdGguZmxvb3IoZ2xvYmFsUHJvcGVydGllcy56b29tKX0pLCBmZWF0dXJlUHJvcGVydGllcyk7XG4gICAgICAgICAgICB2YWx1ZS5mcm9tU2NhbGUgKj0gd2lkdGg7XG4gICAgICAgICAgICB2YWx1ZS50b1NjYWxlICo9IHdpZHRoO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIGNyZWF0ZUJ1Y2tldChvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBuZXcgTGluZUJ1Y2tldChvcHRpb25zKTtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gTGluZVN0eWxlTGF5ZXI7XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IFN0eWxlTGF5ZXIgPSByZXF1aXJlKCcuLi9zdHlsZV9sYXllcicpO1xuY29uc3QgU3ltYm9sQnVja2V0ID0gcmVxdWlyZSgnLi4vLi4vZGF0YS9idWNrZXQvc3ltYm9sX2J1Y2tldCcpO1xuXG5jbGFzcyBTeW1ib2xTdHlsZUxheWVyIGV4dGVuZHMgU3R5bGVMYXllciB7XG5cbiAgICBnZXRMYXlvdXRWYWx1ZShuYW1lLCBnbG9iYWxQcm9wZXJ0aWVzLCBmZWF0dXJlUHJvcGVydGllcykge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHN1cGVyLmdldExheW91dFZhbHVlKG5hbWUsIGdsb2JhbFByb3BlcnRpZXMsIGZlYXR1cmVQcm9wZXJ0aWVzKTtcbiAgICAgICAgaWYgKHZhbHVlICE9PSAnYXV0bycpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXRjaCAobmFtZSkge1xuICAgICAgICBjYXNlICd0ZXh0LXJvdGF0aW9uLWFsaWdubWVudCc6XG4gICAgICAgIGNhc2UgJ2ljb24tcm90YXRpb24tYWxpZ25tZW50JzpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldExheW91dFZhbHVlKCdzeW1ib2wtcGxhY2VtZW50JywgZ2xvYmFsUHJvcGVydGllcywgZmVhdHVyZVByb3BlcnRpZXMpID09PSAnbGluZScgPyAnbWFwJyA6ICd2aWV3cG9ydCc7XG4gICAgICAgIGNhc2UgJ3RleHQtcGl0Y2gtYWxpZ25tZW50JzpcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldExheW91dFZhbHVlKCd0ZXh0LXJvdGF0aW9uLWFsaWdubWVudCcsIGdsb2JhbFByb3BlcnRpZXMsIGZlYXR1cmVQcm9wZXJ0aWVzKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNyZWF0ZUJ1Y2tldChvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBuZXcgU3ltYm9sQnVja2V0KG9wdGlvbnMpO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBTeW1ib2xTdHlsZUxheWVyO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBTdHlsZUxheWVyID0gcmVxdWlyZSgnLi9zdHlsZV9sYXllcicpO1xuY29uc3QgdXRpbCA9IHJlcXVpcmUoJy4uL3V0aWwvdXRpbCcpO1xuY29uc3QgZmVhdHVyZUZpbHRlciA9IHJlcXVpcmUoJ2ZlYXR1cmUtZmlsdGVyJyk7XG5jb25zdCBncm91cEJ5TGF5b3V0ID0gcmVxdWlyZSgnbWFwYm94LWdsLXN0eWxlLXNwZWMvbGliL2dyb3VwX2J5X2xheW91dCcpO1xuXG5jbGFzcyBTdHlsZUxheWVySW5kZXgge1xuICAgIGNvbnN0cnVjdG9yKGxheWVyQ29uZmlncykge1xuICAgICAgICBpZiAobGF5ZXJDb25maWdzKSB7XG4gICAgICAgICAgICB0aGlzLnJlcGxhY2UobGF5ZXJDb25maWdzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlcGxhY2UobGF5ZXJDb25maWdzKSB7XG4gICAgICAgIHRoaXMuc3ltYm9sT3JkZXIgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBsYXllckNvbmZpZyBvZiBsYXllckNvbmZpZ3MpIHtcbiAgICAgICAgICAgIGlmIChsYXllckNvbmZpZy50eXBlID09PSAnc3ltYm9sJykge1xuICAgICAgICAgICAgICAgIHRoaXMuc3ltYm9sT3JkZXIucHVzaChsYXllckNvbmZpZy5pZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fbGF5ZXJDb25maWdzID0ge307XG4gICAgICAgIHRoaXMuX2xheWVycyA9IHt9O1xuICAgICAgICB0aGlzLnVwZGF0ZShsYXllckNvbmZpZ3MsIFtdKTtcbiAgICB9XG5cbiAgICB1cGRhdGUobGF5ZXJDb25maWdzLCByZW1vdmVkSWRzLCBzeW1ib2xPcmRlcikge1xuICAgICAgICBmb3IgKGNvbnN0IGxheWVyQ29uZmlnIG9mIGxheWVyQ29uZmlncykge1xuICAgICAgICAgICAgdGhpcy5fbGF5ZXJDb25maWdzW2xheWVyQ29uZmlnLmlkXSA9IGxheWVyQ29uZmlnO1xuXG4gICAgICAgICAgICBjb25zdCBsYXllciA9IHRoaXMuX2xheWVyc1tsYXllckNvbmZpZy5pZF0gPSBTdHlsZUxheWVyLmNyZWF0ZShsYXllckNvbmZpZyk7XG4gICAgICAgICAgICBsYXllci51cGRhdGVQYWludFRyYW5zaXRpb25zKHt9LCB7dHJhbnNpdGlvbjogZmFsc2V9KTtcbiAgICAgICAgICAgIGxheWVyLmZpbHRlciA9IGZlYXR1cmVGaWx0ZXIobGF5ZXIuZmlsdGVyKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIHJlbW92ZWRJZHMpIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9sYXllckNvbmZpZ3NbaWRdO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2xheWVyc1tpZF07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN5bWJvbE9yZGVyKSB7XG4gICAgICAgICAgICB0aGlzLnN5bWJvbE9yZGVyID0gc3ltYm9sT3JkZXI7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZhbWlsaWVzQnlTb3VyY2UgPSB7fTtcblxuICAgICAgICBjb25zdCBncm91cHMgPSBncm91cEJ5TGF5b3V0KHV0aWwudmFsdWVzKHRoaXMuX2xheWVyQ29uZmlncykpO1xuXG4gICAgICAgIGZvciAoY29uc3QgbGF5ZXJDb25maWdzIG9mIGdyb3Vwcykge1xuICAgICAgICAgICAgY29uc3QgbGF5ZXJzID0gbGF5ZXJDb25maWdzLm1hcCgobGF5ZXJDb25maWcpID0+IHRoaXMuX2xheWVyc1tsYXllckNvbmZpZy5pZF0pO1xuXG4gICAgICAgICAgICBjb25zdCBsYXllciA9IGxheWVyc1swXTtcbiAgICAgICAgICAgIGlmIChsYXllci5sYXlvdXQgJiYgbGF5ZXIubGF5b3V0LnZpc2liaWxpdHkgPT09ICdub25lJykge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBzb3VyY2VJZCA9IGxheWVyLnNvdXJjZSB8fCAnJztcbiAgICAgICAgICAgIGxldCBzb3VyY2VHcm91cCA9IHRoaXMuZmFtaWxpZXNCeVNvdXJjZVtzb3VyY2VJZF07XG4gICAgICAgICAgICBpZiAoIXNvdXJjZUdyb3VwKSB7XG4gICAgICAgICAgICAgICAgc291cmNlR3JvdXAgPSB0aGlzLmZhbWlsaWVzQnlTb3VyY2Vbc291cmNlSWRdID0ge307XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZUxheWVySWQgPSBsYXllci5zb3VyY2VMYXllciB8fCAnX2dlb2pzb25UaWxlTGF5ZXInO1xuICAgICAgICAgICAgbGV0IHNvdXJjZUxheWVyRmFtaWxpZXMgPSBzb3VyY2VHcm91cFtzb3VyY2VMYXllcklkXTtcbiAgICAgICAgICAgIGlmICghc291cmNlTGF5ZXJGYW1pbGllcykge1xuICAgICAgICAgICAgICAgIHNvdXJjZUxheWVyRmFtaWxpZXMgPSBzb3VyY2VHcm91cFtzb3VyY2VMYXllcklkXSA9IFtdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzb3VyY2VMYXllckZhbWlsaWVzLnB1c2gobGF5ZXJzKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBTdHlsZUxheWVySW5kZXg7XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnbWFwYm94LWdsLXN0eWxlLXNwZWMvcmVmZXJlbmNlL2xhdGVzdC5taW4nKTtcbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgdXRpbCA9IHJlcXVpcmUoJy4uL3V0aWwvdXRpbCcpO1xuY29uc3QgaW50ZXJwb2xhdGUgPSByZXF1aXJlKCcuLi91dGlsL2ludGVycG9sYXRlJyk7XG5cbmNvbnN0IGZha2Vab29tSGlzdG9yeSA9IHsgbGFzdEludGVnZXJab29tOiAwLCBsYXN0SW50ZWdlclpvb21UaW1lOiAwLCBsYXN0Wm9vbTogMCB9O1xuXG4vKlxuICogUmVwcmVzZW50cyBhIHRyYW5zaXRpb24gYmV0d2VlbiB0d28gZGVjbGFyYXRpb25zXG4gKi9cbmNsYXNzIFN0eWxlVHJhbnNpdGlvbiB7XG5cbiAgICBjb25zdHJ1Y3RvcihyZWZlcmVuY2UsIGRlY2xhcmF0aW9uLCBvbGRUcmFuc2l0aW9uLCBvcHRpb25zLCB6b29tSGlzdG9yeSkge1xuICAgICAgICB0aGlzLmRlY2xhcmF0aW9uID0gZGVjbGFyYXRpb247XG4gICAgICAgIHRoaXMuc3RhcnRUaW1lID0gdGhpcy5lbmRUaW1lID0gKG5ldyBEYXRlKCkpLmdldFRpbWUoKTtcblxuICAgICAgICB0aGlzLm9sZFRyYW5zaXRpb24gPSBvbGRUcmFuc2l0aW9uO1xuICAgICAgICB0aGlzLmR1cmF0aW9uID0gb3B0aW9ucy5kdXJhdGlvbiB8fCAwO1xuICAgICAgICB0aGlzLmRlbGF5ID0gb3B0aW9ucy5kZWxheSB8fCAwO1xuXG4gICAgICAgIHRoaXMuem9vbVRyYW5zaXRpb25lZCA9IHJlZmVyZW5jZS5mdW5jdGlvbiA9PT0gJ3BpZWNld2lzZS1jb25zdGFudCcgJiYgcmVmZXJlbmNlLnRyYW5zaXRpb247XG4gICAgICAgIHRoaXMuaW50ZXJwID0gdGhpcy56b29tVHJhbnNpdGlvbmVkID8gaW50ZXJwWm9vbVRyYW5zaXRpb25lZCA6IGludGVycG9sYXRlW3JlZmVyZW5jZS50eXBlXTtcbiAgICAgICAgdGhpcy56b29tSGlzdG9yeSA9IHpvb21IaXN0b3J5IHx8IGZha2Vab29tSGlzdG9yeTtcblxuICAgICAgICBpZiAoIXRoaXMuaW5zdGFudCgpKSB7XG4gICAgICAgICAgICB0aGlzLmVuZFRpbWUgPSB0aGlzLnN0YXJ0VGltZSArIHRoaXMuZHVyYXRpb24gKyB0aGlzLmRlbGF5O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9sZFRyYW5zaXRpb24gJiYgb2xkVHJhbnNpdGlvbi5lbmRUaW1lIDw9IHRoaXMuc3RhcnRUaW1lKSB7XG4gICAgICAgICAgICAvLyBPbGQgdHJhbnNpdGlvbiBpcyBkb25lIHJ1bm5pbmcsIHNvIHdlIGNhblxuICAgICAgICAgICAgLy8gZGVsZXRlIGl0cyByZWZlcmVuY2UgdG8gaXRzIG9sZCB0cmFuc2l0aW9uLlxuICAgICAgICAgICAgZGVsZXRlIG9sZFRyYW5zaXRpb24ub2xkVHJhbnNpdGlvbjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGluc3RhbnQoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5vbGRUcmFuc2l0aW9uIHx8ICF0aGlzLmludGVycCB8fCAodGhpcy5kdXJhdGlvbiA9PT0gMCAmJiB0aGlzLmRlbGF5ID09PSAwKTtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlIHRyYW5zaXRpb25pbmcgcHJvcGVydHkuXG4gICAgICovXG4gICAgY2FsY3VsYXRlKGdsb2JhbFByb3BlcnRpZXMsIGZlYXR1cmVQcm9wZXJ0aWVzLCB0aW1lKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fY2FsY3VsYXRlVGFyZ2V0VmFsdWUoZ2xvYmFsUHJvcGVydGllcywgZmVhdHVyZVByb3BlcnRpZXMpO1xuXG4gICAgICAgIGlmICh0aGlzLmluc3RhbnQoKSlcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcblxuICAgICAgICB0aW1lID0gdGltZSB8fCBEYXRlLm5vdygpO1xuXG4gICAgICAgIGlmICh0aW1lID49IHRoaXMuZW5kVGltZSlcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcblxuICAgICAgICBjb25zdCBvbGRWYWx1ZSA9IHRoaXMub2xkVHJhbnNpdGlvbi5jYWxjdWxhdGUoZ2xvYmFsUHJvcGVydGllcywgZmVhdHVyZVByb3BlcnRpZXMsIHRoaXMuc3RhcnRUaW1lKTtcbiAgICAgICAgY29uc3QgdCA9IHV0aWwuZWFzZUN1YmljSW5PdXQoKHRpbWUgLSB0aGlzLnN0YXJ0VGltZSAtIHRoaXMuZGVsYXkpIC8gdGhpcy5kdXJhdGlvbik7XG4gICAgICAgIHJldHVybiB0aGlzLmludGVycChvbGRWYWx1ZSwgdmFsdWUsIHQpO1xuICAgIH1cblxuICAgIF9jYWxjdWxhdGVUYXJnZXRWYWx1ZShnbG9iYWxQcm9wZXJ0aWVzLCBmZWF0dXJlUHJvcGVydGllcykge1xuICAgICAgICBpZiAoIXRoaXMuem9vbVRyYW5zaXRpb25lZClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRlY2xhcmF0aW9uLmNhbGN1bGF0ZShnbG9iYWxQcm9wZXJ0aWVzLCBmZWF0dXJlUHJvcGVydGllcyk7XG5cbiAgICAgICAgLy8gY2FsY3VsYXRlIHpvb20gdHJhbnNpdGlvbiBiZXR3ZWVuIGRpc2NyZXRlIHZhbHVlcywgc3VjaCBhcyBpbWFnZXMgYW5kIGRhc2hhcnJheXMuXG4gICAgICAgIGNvbnN0IHogPSBnbG9iYWxQcm9wZXJ0aWVzLnpvb207XG4gICAgICAgIGNvbnN0IGxhc3RJbnRlZ2VyWm9vbSA9IHRoaXMuem9vbUhpc3RvcnkubGFzdEludGVnZXJab29tO1xuXG4gICAgICAgIGNvbnN0IGZyb21TY2FsZSA9IHogPiBsYXN0SW50ZWdlclpvb20gPyAyIDogMC41O1xuICAgICAgICBjb25zdCBmcm9tID0gdGhpcy5kZWNsYXJhdGlvbi5jYWxjdWxhdGUoe3pvb206IHogPiBsYXN0SW50ZWdlclpvb20gPyB6IC0gMSA6IHogKyAxfSwgZmVhdHVyZVByb3BlcnRpZXMpO1xuICAgICAgICBjb25zdCB0byA9IHRoaXMuZGVjbGFyYXRpb24uY2FsY3VsYXRlKHt6b29tOiB6fSwgZmVhdHVyZVByb3BlcnRpZXMpO1xuXG4gICAgICAgIGNvbnN0IHRpbWVGcmFjdGlvbiA9IE1hdGgubWluKChEYXRlLm5vdygpIC0gdGhpcy56b29tSGlzdG9yeS5sYXN0SW50ZWdlclpvb21UaW1lKSAvIHRoaXMuZHVyYXRpb24sIDEpO1xuICAgICAgICBjb25zdCB6b29tRnJhY3Rpb24gPSBNYXRoLmFicyh6IC0gbGFzdEludGVnZXJab29tKTtcbiAgICAgICAgY29uc3QgdCA9IGludGVycG9sYXRlKHRpbWVGcmFjdGlvbiwgMSwgem9vbUZyYWN0aW9uKTtcblxuICAgICAgICBpZiAoZnJvbSA9PT0gdW5kZWZpbmVkIHx8IHRvID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgICAgIHJldHVybiB7IGZyb20sIGZyb21TY2FsZSwgdG8sIHRvU2NhbGU6IDEsIHQgfTtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gU3R5bGVUcmFuc2l0aW9uO1xuXG4vLyBpbnRlcnBvbGF0ZSBiZXR3ZWVuIHR3byB2YWx1ZXMgdGhhdCB0cmFuc2l0aW9uIHdpdGggem9vbSwgc3VjaCBhcyBpbWFnZXMgYW5kIGRhc2hhcnJheXNcbmZ1bmN0aW9uIGludGVycFpvb21UcmFuc2l0aW9uZWQoZnJvbSwgdG8sIHQpIHtcbiAgICBpZiAoZnJvbSA9PT0gdW5kZWZpbmVkIHx8IHRvID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBmcm9tOiBmcm9tLnRvLFxuICAgICAgICBmcm9tU2NhbGU6IGZyb20udG9TY2FsZSxcbiAgICAgICAgdG86IHRvLnRvLFxuICAgICAgICB0b1NjYWxlOiB0by50b1NjYWxlLFxuICAgICAgICB0OiB0XG4gICAgfTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCdtYXBib3gtZ2wtc3R5bGUtc3BlYy9saWIvdmFsaWRhdGVfc3R5bGUubWluJyk7XG5cbm1vZHVsZS5leHBvcnRzLmVtaXRFcnJvcnMgPSBmdW5jdGlvbiAoZW1pdHRlciwgZXJyb3JzKSB7XG4gICAgaWYgKGVycm9ycyAmJiBlcnJvcnMubGVuZ3RoKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXJyb3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBlbWl0dGVyLmZpcmUoJ2Vycm9yJywgeyBlcnJvcjogbmV3IEVycm9yKGVycm9yc1tpXS5tZXNzYWdlKSB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgUG9pbnQgPSByZXF1aXJlKCdwb2ludC1nZW9tZXRyeScpO1xuXG5jbGFzcyBBbmNob3IgZXh0ZW5kcyBQb2ludCB7XG5cbiAgICBjb25zdHJ1Y3Rvcih4LCB5LCBhbmdsZSwgc2VnbWVudCkge1xuICAgICAgICBzdXBlcih4LCB5KTtcbiAgICAgICAgdGhpcy5hbmdsZSA9IGFuZ2xlO1xuICAgICAgICBpZiAoc2VnbWVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLnNlZ21lbnQgPSBzZWdtZW50O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY2xvbmUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQW5jaG9yKHRoaXMueCwgdGhpcy55LCB0aGlzLmFuZ2xlLCB0aGlzLnNlZ21lbnQpO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBBbmNob3I7XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gY2hlY2tNYXhBbmdsZTtcblxuLyoqXG4gKiBMYWJlbHMgcGxhY2VkIGFyb3VuZCByZWFsbHkgc2hhcnAgYW5nbGVzIGFyZW4ndCByZWFkYWJsZS4gQ2hlY2sgaWYgYW55XG4gKiBwYXJ0IG9mIHRoZSBwb3RlbnRpYWwgbGFiZWwgaGFzIGEgY29tYmluZWQgYW5nbGUgdGhhdCBpcyB0b28gYmlnLlxuICpcbiAqIEBwYXJhbSB7QXJyYXk8UG9pbnQ+fSBsaW5lXG4gKiBAcGFyYW0ge0FuY2hvcn0gYW5jaG9yIFRoZSBwb2ludCBvbiB0aGUgbGluZSBhcm91bmQgd2hpY2ggdGhlIGxhYmVsIGlzIGFuY2hvcmVkLlxuICogQHBhcmFtIHtudW1iZXJ9IGxhYmVsTGVuZ3RoIFRoZSBsZW5ndGggb2YgdGhlIGxhYmVsIGluIGdlb21ldHJ5IHVuaXRzLlxuICogQHBhcmFtIHtudW1iZXJ9IHdpbmRvd1NpemUgVGhlIGNoZWNrIGZhaWxzIGlmIHRoZSBjb21iaW5lZCBhbmdsZXMgd2l0aGluIGEgcGFydCBvZiB0aGUgbGluZSB0aGF0IGlzIGB3aW5kb3dTaXplYCBsb25nIGlzIHRvbyBiaWcuXG4gKiBAcGFyYW0ge251bWJlcn0gbWF4QW5nbGUgVGhlIG1heGltdW0gY29tYmluZWQgYW5nbGUgdGhhdCBhbnkgd2luZG93IGFsb25nIHRoZSBsYWJlbCBpcyBhbGxvd2VkIHRvIGhhdmUuXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IHdoZXRoZXIgdGhlIGxhYmVsIHNob3VsZCBiZSBwbGFjZWRcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNoZWNrTWF4QW5nbGUobGluZSwgYW5jaG9yLCBsYWJlbExlbmd0aCwgd2luZG93U2l6ZSwgbWF4QW5nbGUpIHtcblxuICAgIC8vIGhvcml6b250YWwgbGFiZWxzIGFsd2F5cyBwYXNzXG4gICAgaWYgKGFuY2hvci5zZWdtZW50ID09PSB1bmRlZmluZWQpIHJldHVybiB0cnVlO1xuXG4gICAgbGV0IHAgPSBhbmNob3I7XG4gICAgbGV0IGluZGV4ID0gYW5jaG9yLnNlZ21lbnQgKyAxO1xuICAgIGxldCBhbmNob3JEaXN0YW5jZSA9IDA7XG5cbiAgICAvLyBtb3ZlIGJhY2t3YXJkcyBhbG9uZyB0aGUgbGluZSB0byB0aGUgZmlyc3Qgc2VnbWVudCB0aGUgbGFiZWwgYXBwZWFycyBvblxuICAgIHdoaWxlIChhbmNob3JEaXN0YW5jZSA+IC1sYWJlbExlbmd0aCAvIDIpIHtcbiAgICAgICAgaW5kZXgtLTtcblxuICAgICAgICAvLyB0aGVyZSBpc24ndCBlbm91Z2ggcm9vbSBmb3IgdGhlIGxhYmVsIGFmdGVyIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmVcbiAgICAgICAgaWYgKGluZGV4IDwgMCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGFuY2hvckRpc3RhbmNlIC09IGxpbmVbaW5kZXhdLmRpc3QocCk7XG4gICAgICAgIHAgPSBsaW5lW2luZGV4XTtcbiAgICB9XG5cbiAgICBhbmNob3JEaXN0YW5jZSArPSBsaW5lW2luZGV4XS5kaXN0KGxpbmVbaW5kZXggKyAxXSk7XG4gICAgaW5kZXgrKztcblxuICAgIC8vIHN0b3JlIHJlY2VudCBjb3JuZXJzIGFuZCB0aGVpciB0b3RhbCBhbmdsZSBkaWZmZXJlbmNlXG4gICAgY29uc3QgcmVjZW50Q29ybmVycyA9IFtdO1xuICAgIGxldCByZWNlbnRBbmdsZURlbHRhID0gMDtcblxuICAgIC8vIG1vdmUgZm9yd2FyZHMgYnkgdGhlIGxlbmd0aCBvZiB0aGUgbGFiZWwgYW5kIGNoZWNrIGFuZ2xlcyBhbG9uZyB0aGUgd2F5XG4gICAgd2hpbGUgKGFuY2hvckRpc3RhbmNlIDwgbGFiZWxMZW5ndGggLyAyKSB7XG4gICAgICAgIGNvbnN0IHByZXYgPSBsaW5lW2luZGV4IC0gMV07XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSBsaW5lW2luZGV4XTtcbiAgICAgICAgY29uc3QgbmV4dCA9IGxpbmVbaW5kZXggKyAxXTtcblxuICAgICAgICAvLyB0aGVyZSBpc24ndCBlbm91Z2ggcm9vbSBmb3IgdGhlIGxhYmVsIGJlZm9yZSB0aGUgZW5kIG9mIHRoZSBsaW5lXG4gICAgICAgIGlmICghbmV4dCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGxldCBhbmdsZURlbHRhID0gcHJldi5hbmdsZVRvKGN1cnJlbnQpIC0gY3VycmVudC5hbmdsZVRvKG5leHQpO1xuICAgICAgICAvLyByZXN0cmljdCBhbmdsZSB0byAtcGkuLnBpIHJhbmdlXG4gICAgICAgIGFuZ2xlRGVsdGEgPSBNYXRoLmFicygoKGFuZ2xlRGVsdGEgKyAzICogTWF0aC5QSSkgJSAoTWF0aC5QSSAqIDIpKSAtIE1hdGguUEkpO1xuXG4gICAgICAgIHJlY2VudENvcm5lcnMucHVzaCh7XG4gICAgICAgICAgICBkaXN0YW5jZTogYW5jaG9yRGlzdGFuY2UsXG4gICAgICAgICAgICBhbmdsZURlbHRhOiBhbmdsZURlbHRhXG4gICAgICAgIH0pO1xuICAgICAgICByZWNlbnRBbmdsZURlbHRhICs9IGFuZ2xlRGVsdGE7XG5cbiAgICAgICAgLy8gcmVtb3ZlIGNvcm5lcnMgdGhhdCBhcmUgZmFyIGVub3VnaCBhd2F5IGZyb20gdGhlIGxpc3Qgb2YgcmVjZW50IGFuY2hvcnNcbiAgICAgICAgd2hpbGUgKGFuY2hvckRpc3RhbmNlIC0gcmVjZW50Q29ybmVyc1swXS5kaXN0YW5jZSA+IHdpbmRvd1NpemUpIHtcbiAgICAgICAgICAgIHJlY2VudEFuZ2xlRGVsdGEgLT0gcmVjZW50Q29ybmVycy5zaGlmdCgpLmFuZ2xlRGVsdGE7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0aGUgc3VtIG9mIGFuZ2xlcyB3aXRoaW4gdGhlIHdpbmRvdyBhcmVhIGV4Y2VlZHMgdGhlIG1heGltdW0gYWxsb3dlZCB2YWx1ZS4gY2hlY2sgZmFpbHMuXG4gICAgICAgIGlmIChyZWNlbnRBbmdsZURlbHRhID4gbWF4QW5nbGUpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBpbmRleCsrO1xuICAgICAgICBhbmNob3JEaXN0YW5jZSArPSBjdXJyZW50LmRpc3QobmV4dCk7XG4gICAgfVxuXG4gICAgLy8gbm8gcGFydCBvZiB0aGUgbGluZSBoYWQgYW4gYW5nbGUgZ3JlYXRlciB0aGFuIHRoZSBtYXhpbXVtIGFsbG93ZWQuIGNoZWNrIHBhc3Nlcy5cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgUG9pbnQgPSByZXF1aXJlKCdwb2ludC1nZW9tZXRyeScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNsaXBMaW5lO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHBhcnQgb2YgYSBtdWx0aWxpbmUgdGhhdCBpbnRlcnNlY3RzIHdpdGggdGhlIHByb3ZpZGVkIHJlY3Rhbmd1bGFyIGJveC5cbiAqXG4gKiBAcGFyYW0ge0FycmF5PEFycmF5PFBvaW50Pj59IGxpbmVzXG4gKiBAcGFyYW0ge251bWJlcn0geDEgdGhlIGxlZnQgZWRnZSBvZiB0aGUgYm94XG4gKiBAcGFyYW0ge251bWJlcn0geTEgdGhlIHRvcCBlZGdlIG9mIHRoZSBib3hcbiAqIEBwYXJhbSB7bnVtYmVyfSB4MiB0aGUgcmlnaHQgZWRnZSBvZiB0aGUgYm94XG4gKiBAcGFyYW0ge251bWJlcn0geTIgdGhlIGJvdHRvbSBlZGdlIG9mIHRoZSBib3hcbiAqIEByZXR1cm5zIHtBcnJheTxBcnJheTxQb2ludD4+fSBsaW5lc1xuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY2xpcExpbmUobGluZXMsIHgxLCB5MSwgeDIsIHkyKSB7XG4gICAgY29uc3QgY2xpcHBlZExpbmVzID0gW107XG5cbiAgICBmb3IgKGxldCBsID0gMDsgbCA8IGxpbmVzLmxlbmd0aDsgbCsrKSB7XG4gICAgICAgIGNvbnN0IGxpbmUgPSBsaW5lc1tsXTtcbiAgICAgICAgbGV0IGNsaXBwZWRMaW5lO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZS5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBwMCA9IGxpbmVbaV07XG4gICAgICAgICAgICBsZXQgcDEgPSBsaW5lW2kgKyAxXTtcblxuXG4gICAgICAgICAgICBpZiAocDAueCA8IHgxICYmIHAxLnggPCB4MSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwMC54IDwgeDEpIHtcbiAgICAgICAgICAgICAgICBwMCA9IG5ldyBQb2ludCh4MSwgcDAueSArIChwMS55IC0gcDAueSkgKiAoKHgxIC0gcDAueCkgLyAocDEueCAtIHAwLngpKSkuX3JvdW5kKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHAxLnggPCB4MSkge1xuICAgICAgICAgICAgICAgIHAxID0gbmV3IFBvaW50KHgxLCBwMC55ICsgKHAxLnkgLSBwMC55KSAqICgoeDEgLSBwMC54KSAvIChwMS54IC0gcDAueCkpKS5fcm91bmQoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHAwLnkgPCB5MSAmJiBwMS55IDwgeTEpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocDAueSA8IHkxKSB7XG4gICAgICAgICAgICAgICAgcDAgPSBuZXcgUG9pbnQocDAueCArIChwMS54IC0gcDAueCkgKiAoKHkxIC0gcDAueSkgLyAocDEueSAtIHAwLnkpKSwgeTEpLl9yb3VuZCgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwMS55IDwgeTEpIHtcbiAgICAgICAgICAgICAgICBwMSA9IG5ldyBQb2ludChwMC54ICsgKHAxLnggLSBwMC54KSAqICgoeTEgLSBwMC55KSAvIChwMS55IC0gcDAueSkpLCB5MSkuX3JvdW5kKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwMC54ID49IHgyICYmIHAxLnggPj0geDIpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocDAueCA+PSB4Mikge1xuICAgICAgICAgICAgICAgIHAwID0gbmV3IFBvaW50KHgyLCBwMC55ICsgKHAxLnkgLSBwMC55KSAqICgoeDIgLSBwMC54KSAvIChwMS54IC0gcDAueCkpKS5fcm91bmQoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocDEueCA+PSB4Mikge1xuICAgICAgICAgICAgICAgIHAxID0gbmV3IFBvaW50KHgyLCBwMC55ICsgKHAxLnkgLSBwMC55KSAqICgoeDIgLSBwMC54KSAvIChwMS54IC0gcDAueCkpKS5fcm91bmQoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHAwLnkgPj0geTIgJiYgcDEueSA+PSB5Mikge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwMC55ID49IHkyKSB7XG4gICAgICAgICAgICAgICAgcDAgPSBuZXcgUG9pbnQocDAueCArIChwMS54IC0gcDAueCkgKiAoKHkyIC0gcDAueSkgLyAocDEueSAtIHAwLnkpKSwgeTIpLl9yb3VuZCgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwMS55ID49IHkyKSB7XG4gICAgICAgICAgICAgICAgcDEgPSBuZXcgUG9pbnQocDAueCArIChwMS54IC0gcDAueCkgKiAoKHkyIC0gcDAueSkgLyAocDEueSAtIHAwLnkpKSwgeTIpLl9yb3VuZCgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIWNsaXBwZWRMaW5lIHx8ICFwMC5lcXVhbHMoY2xpcHBlZExpbmVbY2xpcHBlZExpbmUubGVuZ3RoIC0gMV0pKSB7XG4gICAgICAgICAgICAgICAgY2xpcHBlZExpbmUgPSBbcDBdO1xuICAgICAgICAgICAgICAgIGNsaXBwZWRMaW5lcy5wdXNoKGNsaXBwZWRMaW5lKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY2xpcHBlZExpbmUucHVzaChwMSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY2xpcHBlZExpbmVzO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBjcmVhdGVTdHJ1Y3RBcnJheVR5cGUgPSByZXF1aXJlKCcuLi91dGlsL3N0cnVjdF9hcnJheScpO1xuY29uc3QgUG9pbnQgPSByZXF1aXJlKCdwb2ludC1nZW9tZXRyeScpO1xuXG4vKipcbiAqIEEgY29sbGlzaW9uIGJveCByZXByZXNlbnRzIGFuIGFyZWEgb2YgdGhlIG1hcCB0aGF0IHRoYXQgaXMgY292ZXJlZCBieSBhXG4gKiBsYWJlbC4gQ29sbGlzaW9uRmVhdHVyZSB1c2VzIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNvbGxpc2lvbiBib3hlcyB0b1xuICogcmVwcmVzZW50IGFsbCB0aGUgYXJlYSBjb3ZlcmVkIGJ5IGEgc2luZ2xlIGxhYmVsLiBUaGV5IGFyZSB1c2VkIHRvXG4gKiBwcmV2ZW50IGNvbGxpc2lvbnMgYmV0d2VlbiBsYWJlbHMuXG4gKlxuICogQSBjb2xsaXNpb24gYm94IGFjdHVhbGx5IHJlcHJlc2VudHMgYSAzZCB2b2x1bWUuIFRoZSBmaXJzdCB0d28gZGltZW5zaW9ucyxcbiAqIHggYW5kIHksIGFyZSBzcGVjaWZpZWQgd2l0aCBgYW5jaG9yYCBhbG9uZyB3aXRoIGB4MWAsIGB5MWAsIGB4MmAsIGB5MmAuXG4gKiBUaGUgdGhpcmQgZGltZW5zaW9uLCB6b29tLCBpcyBsaW1pdGVkIGJ5IGBtYXhTY2FsZWAgd2hpY2ggZGV0ZXJtaW5lc1xuICogaG93IGZhciBpbiB0aGUgeiBkaW1lbnNpb25zIHRoZSBib3ggZXh0ZW5kcy5cbiAqXG4gKiBBcyB5b3Ugem9vbSBpbiBvbiBhIG1hcCwgYWxsIHBvaW50cyBvbiB0aGUgbWFwIGdldCBmdXJ0aGVyIGFuZCBmdXJ0aGVyIGFwYXJ0XG4gKiBidXQgbGFiZWxzIHN0YXkgcm91Z2hseSB0aGUgc2FtZSBzaXplLiBMYWJlbHMgY292ZXIgbGVzcyByZWFsIHdvcmxkIGFyZWEgb25cbiAqIHRoZSBtYXAgYXQgaGlnaGVyIHpvb20gbGV2ZWxzIHRoYW4gdGhleSBkbyBhdCBsb3dlciB6b29tIGxldmVscy4gVGhpcyBpcyB3aHlcbiAqIGFyZWFzIGFyZSBhcmUgcmVwcmVzZW50ZWQgd2l0aCBhbiBhbmNob3IgcG9pbnQgYW5kIG9mZnNldHMgZnJvbSB0aGF0IHBvaW50XG4gKiBpbnN0ZWFkIG9mIGp1c3QgdXNpbmcgZm91ciBhYnNvbHV0ZSBwb2ludHMuXG4gKlxuICogTGluZSBsYWJlbHMgYXJlIHJlcHJlc2VudGVkIGJ5IGEgc2V0IG9mIHRoZXNlIGJveGVzIHNwYWNlZCBvdXQgYWxvbmcgYSBsaW5lLlxuICogV2hlbiB5b3Ugem9vbSBpbiwgbGluZSBsYWJlbHMgY292ZXIgbGVzcyByZWFsIHdvcmxkIGRpc3RhbmNlIGFsb25nIHRoZSBsaW5lXG4gKiB0aGFuIHRoZXkgdXNlZCB0by4gQ29sbGlzaW9uIGJveGVzIG5lYXIgdGhlIGVkZ2VzIHRoYXQgdXNlZCB0byBjb3ZlciBsYWJlbFxuICogbm8gbG9uZ2VyIGRvLiBJZiBhIGJveCBkb2Vzbid0IGNvdmVyIHRoZSBsYWJlbCBhbnltb3JlIGl0IHNob3VsZCBiZSBpZ25vcmVkXG4gKiB3aGVuIGRvaW5nIGNvbGxpc2lvbiBjaGVja3MuIGBtYXhTY2FsZWAgaXMgaG93IG11Y2ggeW91IGNhbiBzY2FsZSB0aGUgbWFwXG4gKiBiZWZvcmUgdGhlIGxhYmVsIGlzbid0IHdpdGhpbiB0aGUgYm94IGFueW1vcmUuXG4gKiBGb3IgZXhhbXBsZVxuICogbG93ZXIgem9vbTpcbiAqIGh0dHBzOi8vY2xvdWQuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2Fzc2V0cy8xNDIxNjUyLzgwNjAwOTQvNGQ5NzVmNzYtMGU5MS0xMWU1LTg0YjEtNGVkZWIzMGE1ODc1LnBuZ1xuICogc2xpZ2h0bHkgaGlnaGVyIHpvb206XG4gKiBodHRwczovL2Nsb3VkLmdpdGh1YnVzZXJjb250ZW50LmNvbS9hc3NldHMvMTQyMTY1Mi84MDYwMDYxLzI2YWUxYzM4LTBlOTEtMTFlNS04YzVhLTlmMzgwYmYyOWYwYS5wbmdcbiAqIEluIHRoZSB6b29tZWQgaW4gaW1hZ2UgdGhlIHR3byBncmV5IGJveGVzIG9uIGVpdGhlciBzaWRlIGRvbid0IGNvdmVyIHRoZVxuICogbGFiZWwgYW55bW9yZS4gVGhlaXIgbWF4U2NhbGUgaXMgc21hbGxlciB0aGFuIHRoZSBjdXJyZW50IHNjYWxlLlxuICpcbiAqXG4gKiBAY2xhc3MgQ29sbGlzaW9uQm94QXJyYXlcbiAqIEBwcml2YXRlXG4gKi9cblxuY29uc3QgQ29sbGlzaW9uQm94QXJyYXkgPSBjcmVhdGVTdHJ1Y3RBcnJheVR5cGUoe1xuICAgIG1lbWJlcnM6IFtcbiAgICAgICAgLy8gdGhlIGJveCBpcyBjZW50ZXJlZCBhcm91bmQgdGhlIGFuY2hvciBwb2ludFxuICAgICAgICB7IHR5cGU6ICdJbnQxNicsIG5hbWU6ICdhbmNob3JQb2ludFgnIH0sXG4gICAgICAgIHsgdHlwZTogJ0ludDE2JywgbmFtZTogJ2FuY2hvclBvaW50WScgfSxcblxuICAgICAgICAvLyBkaXN0YW5jZXMgdG8gdGhlIGVkZ2VzIGZyb20gdGhlIGFuY2hvclxuICAgICAgICB7IHR5cGU6ICdJbnQxNicsIG5hbWU6ICd4MScgfSxcbiAgICAgICAgeyB0eXBlOiAnSW50MTYnLCBuYW1lOiAneTEnIH0sXG4gICAgICAgIHsgdHlwZTogJ0ludDE2JywgbmFtZTogJ3gyJyB9LFxuICAgICAgICB7IHR5cGU6ICdJbnQxNicsIG5hbWU6ICd5MicgfSxcblxuICAgICAgICAvLyB0aGUgYm94IGlzIG9ubHkgdmFsaWQgZm9yIHNjYWxlcyA8IG1heFNjYWxlLlxuICAgICAgICAvLyBUaGUgYm94IGRvZXMgbm90IGJsb2NrIG90aGVyIGJveGVzIGF0IHNjYWxlcyA+PSBtYXhTY2FsZTtcbiAgICAgICAgeyB0eXBlOiAnRmxvYXQzMicsIG5hbWU6ICdtYXhTY2FsZScgfSxcblxuICAgICAgICAvLyB0aGUgaW5kZXggb2YgdGhlIGZlYXR1cmUgaW4gdGhlIG9yaWdpbmFsIHZlY3RvcnRpbGVcbiAgICAgICAgeyB0eXBlOiAnVWludDMyJywgbmFtZTogJ2ZlYXR1cmVJbmRleCcgfSxcbiAgICAgICAgLy8gdGhlIHNvdXJjZSBsYXllciB0aGUgZmVhdHVyZSBhcHBlYXJzIGluXG4gICAgICAgIHsgdHlwZTogJ1VpbnQxNicsIG5hbWU6ICdzb3VyY2VMYXllckluZGV4JyB9LFxuICAgICAgICAvLyB0aGUgYnVja2V0IHRoZSBmZWF0dXJlIGFwcGVhcnMgaW5cbiAgICAgICAgeyB0eXBlOiAnVWludDE2JywgbmFtZTogJ2J1Y2tldEluZGV4JyB9LFxuXG4gICAgICAgIC8vIHJvdGF0ZWQgYW5kIHNjYWxlZCBiYm94IHVzZWQgZm9yIGluZGV4aW5nXG4gICAgICAgIHsgdHlwZTogJ0ludDE2JywgbmFtZTogJ2Jib3gwJyB9LFxuICAgICAgICB7IHR5cGU6ICdJbnQxNicsIG5hbWU6ICdiYm94MScgfSxcbiAgICAgICAgeyB0eXBlOiAnSW50MTYnLCBuYW1lOiAnYmJveDInIH0sXG4gICAgICAgIHsgdHlwZTogJ0ludDE2JywgbmFtZTogJ2Jib3gzJyB9LFxuXG4gICAgICAgIHsgdHlwZTogJ0Zsb2F0MzInLCBuYW1lOiAncGxhY2VtZW50U2NhbGUnIH1cbiAgICBdXG59KTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbGxpc2lvbkJveEFycmF5LnByb3RvdHlwZS5TdHJ1Y3RUeXBlLnByb3RvdHlwZSwgJ2FuY2hvclBvaW50Jywge1xuICAgIGdldCgpIHsgcmV0dXJuIG5ldyBQb2ludCh0aGlzLmFuY2hvclBvaW50WCwgdGhpcy5hbmNob3JQb2ludFkpOyB9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBDb2xsaXNpb25Cb3hBcnJheTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBBIENvbGxpc2lvbkZlYXR1cmUgcmVwcmVzZW50cyB0aGUgYXJlYSBvZiB0aGUgdGlsZSBjb3ZlcmVkIGJ5IGEgc2luZ2xlIGxhYmVsLlxuICogSXQgaXMgdXNlZCB3aXRoIENvbGxpc2lvblRpbGUgdG8gY2hlY2sgaWYgdGhlIGxhYmVsIG92ZXJsYXBzIHdpdGggYW55XG4gKiBwcmV2aW91cyBsYWJlbHMuIEEgQ29sbGlzaW9uRmVhdHVyZSBpcyBtb3N0bHkganVzdCBhIHNldCBvZiBDb2xsaXNpb25Cb3hcbiAqIG9iamVjdHMuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgQ29sbGlzaW9uRmVhdHVyZSB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtBcnJheTxQb2ludD59IGxpbmUgVGhlIGdlb21ldHJ5IHRoZSBsYWJlbCBpcyBwbGFjZWQgb24uXG4gICAgICogQHBhcmFtIHtBbmNob3J9IGFuY2hvciBUaGUgcG9pbnQgYWxvbmcgdGhlIGxpbmUgYXJvdW5kIHdoaWNoIHRoZSBsYWJlbCBpcyBhbmNob3JlZC5cbiAgICAgKiBAcGFyYW0ge1ZlY3RvclRpbGVGZWF0dXJlfSBmZWF0dXJlIFRoZSBWZWN0b3JUaWxlRmVhdHVyZSB0aGF0IHRoaXMgQ29sbGlzaW9uRmVhdHVyZSB3YXMgY3JlYXRlZCBmb3IuXG4gICAgICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBsYXllcklEcyBUaGUgSURzIG9mIHRoZSBsYXllcnMgdGhhdCB0aGlzIENvbGxpc2lvbkZlYXR1cmUgaXMgYSBwYXJ0IG9mLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzaGFwZWQgVGhlIHRleHQgb3IgaWNvbiBzaGFwaW5nIHJlc3VsdHMuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJveFNjYWxlIEEgbWFnaWMgbnVtYmVyIHVzZWQgdG8gY29udmVydCBmcm9tIGdseXBoIG1ldHJpY3MgdW5pdHMgdG8gZ2VvbWV0cnkgdW5pdHMuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHBhZGRpbmcgVGhlIGFtb3VudCBvZiBwYWRkaW5nIHRvIGFkZCBhcm91bmQgdGhlIGxhYmVsIGVkZ2VzLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gYWxpZ25MaW5lIFdoZXRoZXIgdGhlIGxhYmVsIGlzIGFsaWduZWQgd2l0aCB0aGUgbGluZSBvciB0aGUgdmlld3BvcnQuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoY29sbGlzaW9uQm94QXJyYXksIGxpbmUsIGFuY2hvciwgZmVhdHVyZUluZGV4LCBzb3VyY2VMYXllckluZGV4LCBidWNrZXRJbmRleCwgc2hhcGVkLCBib3hTY2FsZSwgcGFkZGluZywgYWxpZ25MaW5lLCBzdHJhaWdodCkge1xuICAgICAgICBjb25zdCB5MSA9IHNoYXBlZC50b3AgKiBib3hTY2FsZSAtIHBhZGRpbmc7XG4gICAgICAgIGNvbnN0IHkyID0gc2hhcGVkLmJvdHRvbSAqIGJveFNjYWxlICsgcGFkZGluZztcbiAgICAgICAgY29uc3QgeDEgPSBzaGFwZWQubGVmdCAqIGJveFNjYWxlIC0gcGFkZGluZztcbiAgICAgICAgY29uc3QgeDIgPSBzaGFwZWQucmlnaHQgKiBib3hTY2FsZSArIHBhZGRpbmc7XG5cbiAgICAgICAgdGhpcy5ib3hTdGFydEluZGV4ID0gY29sbGlzaW9uQm94QXJyYXkubGVuZ3RoO1xuXG4gICAgICAgIGlmIChhbGlnbkxpbmUpIHtcblxuICAgICAgICAgICAgbGV0IGhlaWdodCA9IHkyIC0geTE7XG4gICAgICAgICAgICBjb25zdCBsZW5ndGggPSB4MiAtIHgxO1xuXG4gICAgICAgICAgICBpZiAoaGVpZ2h0ID4gMCkge1xuICAgICAgICAgICAgICAgIC8vIHNldCBtaW5pbXVtIGJveCBoZWlnaHQgdG8gYXZvaWQgdmVyeSBtYW55IHNtYWxsIGxhYmVsc1xuICAgICAgICAgICAgICAgIGhlaWdodCA9IE1hdGgubWF4KDEwICogYm94U2NhbGUsIGhlaWdodCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoc3RyYWlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdXNlZCBmb3IgaWNvbiBsYWJlbHMgdGhhdCBhcmUgYWxpZ25lZCB3aXRoIHRoZSBsaW5lLCBidXQgZG9uJ3QgY3VydmUgYWxvbmcgaXRcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVjdG9yID0gbGluZVthbmNob3Iuc2VnbWVudCArIDFdLnN1YihsaW5lW2FuY2hvci5zZWdtZW50XSkuX3VuaXQoKS5fbXVsdChsZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJhaWdodExpbmUgPSBbYW5jaG9yLnN1Yih2ZWN0b3IpLCBhbmNob3IuYWRkKHZlY3RvcildO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hZGRMaW5lQ29sbGlzaW9uQm94ZXMoY29sbGlzaW9uQm94QXJyYXksIHN0cmFpZ2h0TGluZSwgYW5jaG9yLCAwLCBsZW5ndGgsIGhlaWdodCwgZmVhdHVyZUluZGV4LCBzb3VyY2VMYXllckluZGV4LCBidWNrZXRJbmRleCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdXNlZCBmb3IgdGV4dCBsYWJlbHMgdGhhdCBjdXJ2ZSBhbG9uZyBhIGxpbmVcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYWRkTGluZUNvbGxpc2lvbkJveGVzKGNvbGxpc2lvbkJveEFycmF5LCBsaW5lLCBhbmNob3IsIGFuY2hvci5zZWdtZW50LCBsZW5ndGgsIGhlaWdodCwgZmVhdHVyZUluZGV4LCBzb3VyY2VMYXllckluZGV4LCBidWNrZXRJbmRleCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb2xsaXNpb25Cb3hBcnJheS5lbXBsYWNlQmFjayhhbmNob3IueCwgYW5jaG9yLnksIHgxLCB5MSwgeDIsIHkyLCBJbmZpbml0eSwgZmVhdHVyZUluZGV4LCBzb3VyY2VMYXllckluZGV4LCBidWNrZXRJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwgMCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmJveEVuZEluZGV4ID0gY29sbGlzaW9uQm94QXJyYXkubGVuZ3RoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIHNldCBvZiBDb2xsaXNpb25Cb3ggb2JqZWN0cyBmb3IgYSBsaW5lLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheTxQb2ludD59IGxpbmVcbiAgICAgKiBAcGFyYW0ge0FuY2hvcn0gYW5jaG9yXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGxhYmVsTGVuZ3RoIFRoZSBsZW5ndGggb2YgdGhlIGxhYmVsIGluIGdlb21ldHJ5IHVuaXRzLlxuICAgICAqIEBwYXJhbSB7QW5jaG9yfSBhbmNob3IgVGhlIHBvaW50IGFsb25nIHRoZSBsaW5lIGFyb3VuZCB3aGljaCB0aGUgbGFiZWwgaXMgYW5jaG9yZWQuXG4gICAgICogQHBhcmFtIHtWZWN0b3JUaWxlRmVhdHVyZX0gZmVhdHVyZSBUaGUgVmVjdG9yVGlsZUZlYXR1cmUgdGhhdCB0aGlzIENvbGxpc2lvbkZlYXR1cmUgd2FzIGNyZWF0ZWQgZm9yLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBib3hTaXplIFRoZSBzaXplIG9mIHRoZSBjb2xsaXNpb24gYm94ZXMgdGhhdCB3aWxsIGJlIGNyZWF0ZWQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF9hZGRMaW5lQ29sbGlzaW9uQm94ZXMoY29sbGlzaW9uQm94QXJyYXksIGxpbmUsIGFuY2hvciwgc2VnbWVudCwgbGFiZWxMZW5ndGgsIGJveFNpemUsIGZlYXR1cmVJbmRleCwgc291cmNlTGF5ZXJJbmRleCwgYnVja2V0SW5kZXgpIHtcbiAgICAgICAgY29uc3Qgc3RlcCA9IGJveFNpemUgLyAyO1xuICAgICAgICBjb25zdCBuQm94ZXMgPSBNYXRoLmZsb29yKGxhYmVsTGVuZ3RoIC8gc3RlcCk7XG5cbiAgICAgICAgLy8gb2Zmc2V0IHRoZSBjZW50ZXIgb2YgdGhlIGZpcnN0IGJveCBieSBoYWxmIGEgYm94IHNvIHRoYXQgdGhlIGVkZ2Ugb2YgdGhlXG4gICAgICAgIC8vIGJveCBpcyBhdCB0aGUgZWRnZSBvZiB0aGUgbGFiZWwuXG4gICAgICAgIGNvbnN0IGZpcnN0Qm94T2Zmc2V0ID0gLWJveFNpemUgLyAyO1xuXG4gICAgICAgIGNvbnN0IGJib3hlcyA9IHRoaXMuYm94ZXM7XG5cbiAgICAgICAgbGV0IHAgPSBhbmNob3I7XG4gICAgICAgIGxldCBpbmRleCA9IHNlZ21lbnQgKyAxO1xuICAgICAgICBsZXQgYW5jaG9yRGlzdGFuY2UgPSBmaXJzdEJveE9mZnNldDtcblxuICAgICAgICAvLyBtb3ZlIGJhY2t3YXJkcyBhbG9uZyB0aGUgbGluZSB0byB0aGUgZmlyc3Qgc2VnbWVudCB0aGUgbGFiZWwgYXBwZWFycyBvblxuICAgICAgICBkbyB7XG4gICAgICAgICAgICBpbmRleC0tO1xuXG4gICAgICAgICAgICAvLyB0aGVyZSBpc24ndCBlbm91Z2ggcm9vbSBmb3IgdGhlIGxhYmVsIGFmdGVyIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmVcbiAgICAgICAgICAgIC8vIGNoZWNrTWF4QW5nbGUgc2hvdWxkIGhhdmUgYWxyZWFkeSBjYXVnaHQgdGhpc1xuICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgcmV0dXJuIGJib3hlcztcblxuICAgICAgICAgICAgYW5jaG9yRGlzdGFuY2UgLT0gbGluZVtpbmRleF0uZGlzdChwKTtcbiAgICAgICAgICAgIHAgPSBsaW5lW2luZGV4XTtcbiAgICAgICAgfSB3aGlsZSAoYW5jaG9yRGlzdGFuY2UgPiAtbGFiZWxMZW5ndGggLyAyKTtcblxuICAgICAgICBsZXQgc2VnbWVudExlbmd0aCA9IGxpbmVbaW5kZXhdLmRpc3QobGluZVtpbmRleCArIDFdKTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5Cb3hlczsgaSsrKSB7XG4gICAgICAgICAgICAvLyB0aGUgZGlzdGFuY2UgdGhlIGJveCB3aWxsIGJlIGZyb20gdGhlIGFuY2hvclxuICAgICAgICAgICAgY29uc3QgYm94RGlzdGFuY2VUb0FuY2hvciA9IC1sYWJlbExlbmd0aCAvIDIgKyBpICogc3RlcDtcblxuICAgICAgICAgICAgLy8gdGhlIGJveCBpcyBub3Qgb24gdGhlIGN1cnJlbnQgc2VnbWVudC4gTW92ZSB0byB0aGUgbmV4dCBzZWdtZW50LlxuICAgICAgICAgICAgd2hpbGUgKGFuY2hvckRpc3RhbmNlICsgc2VnbWVudExlbmd0aCA8IGJveERpc3RhbmNlVG9BbmNob3IpIHtcbiAgICAgICAgICAgICAgICBhbmNob3JEaXN0YW5jZSArPSBzZWdtZW50TGVuZ3RoO1xuICAgICAgICAgICAgICAgIGluZGV4Kys7XG5cbiAgICAgICAgICAgICAgICAvLyBUaGVyZSBpc24ndCBlbm91Z2ggcm9vbSBiZWZvcmUgdGhlIGVuZCBvZiB0aGUgbGluZS5cbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggKyAxID49IGxpbmUubGVuZ3RoKSByZXR1cm4gYmJveGVzO1xuXG4gICAgICAgICAgICAgICAgc2VnbWVudExlbmd0aCA9IGxpbmVbaW5kZXhdLmRpc3QobGluZVtpbmRleCArIDFdKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gdGhlIGRpc3RhbmNlIHRoZSBib3ggd2lsbCBiZSBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNlZ21lbnRcbiAgICAgICAgICAgIGNvbnN0IHNlZ21lbnRCb3hEaXN0YW5jZSA9IGJveERpc3RhbmNlVG9BbmNob3IgLSBhbmNob3JEaXN0YW5jZTtcblxuICAgICAgICAgICAgY29uc3QgcDAgPSBsaW5lW2luZGV4XTtcbiAgICAgICAgICAgIGNvbnN0IHAxID0gbGluZVtpbmRleCArIDFdO1xuICAgICAgICAgICAgY29uc3QgYm94QW5jaG9yUG9pbnQgPSBwMS5zdWIocDApLl91bml0KCkuX211bHQoc2VnbWVudEJveERpc3RhbmNlKS5fYWRkKHAwKS5fcm91bmQoKTtcblxuICAgICAgICAgICAgY29uc3QgZGlzdGFuY2VUb0lubmVyRWRnZSA9IE1hdGgubWF4KE1hdGguYWJzKGJveERpc3RhbmNlVG9BbmNob3IgLSBmaXJzdEJveE9mZnNldCkgLSBzdGVwIC8gMiwgMCk7XG4gICAgICAgICAgICBjb25zdCBtYXhTY2FsZSA9IGxhYmVsTGVuZ3RoIC8gMiAvIGRpc3RhbmNlVG9Jbm5lckVkZ2U7XG5cbiAgICAgICAgICAgIGNvbGxpc2lvbkJveEFycmF5LmVtcGxhY2VCYWNrKGJveEFuY2hvclBvaW50LngsIGJveEFuY2hvclBvaW50LnksXG4gICAgICAgICAgICAgICAgICAgIC1ib3hTaXplIC8gMiwgLWJveFNpemUgLyAyLCBib3hTaXplIC8gMiwgYm94U2l6ZSAvIDIsIG1heFNjYWxlLFxuICAgICAgICAgICAgICAgICAgICBmZWF0dXJlSW5kZXgsIHNvdXJjZUxheWVySW5kZXgsIGJ1Y2tldEluZGV4LFxuICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBiYm94ZXM7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IENvbGxpc2lvbkZlYXR1cmU7XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IFBvaW50ID0gcmVxdWlyZSgncG9pbnQtZ2VvbWV0cnknKTtcbmNvbnN0IEVYVEVOVCA9IHJlcXVpcmUoJy4uL2RhdGEvZXh0ZW50Jyk7XG5jb25zdCBHcmlkID0gcmVxdWlyZSgnZ3JpZC1pbmRleCcpO1xuXG5jb25zdCBpbnRlcnNlY3Rpb25UZXN0cyA9IHJlcXVpcmUoJy4uL3V0aWwvaW50ZXJzZWN0aW9uX3Rlc3RzJyk7XG5cbi8qKlxuICogQSBjb2xsaXNpb24gdGlsZSB1c2VkIHRvIHByZXZlbnQgc3ltYm9scyBmcm9tIG92ZXJsYXBwaW5nLiBJdCBrZWVwIHRyYWNrcyBvZlxuICogd2hlcmUgcHJldmlvdXMgc3ltYm9scyBoYXZlIGJlZW4gcGxhY2VkIGFuZCBpcyB1c2VkIHRvIGNoZWNrIGlmIGEgbmV3XG4gKiBzeW1ib2wgb3ZlcmxhcHMgd2l0aCBhbnkgcHJldmlvdXNseSBhZGRlZCBzeW1ib2xzLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIENvbGxpc2lvblRpbGUge1xuICAgIGNvbnN0cnVjdG9yKGFuZ2xlLCBwaXRjaCwgY29sbGlzaW9uQm94QXJyYXkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBhbmdsZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBhbmdsZTtcbiAgICAgICAgICAgIGNvbGxpc2lvbkJveEFycmF5ID0gcGl0Y2g7XG4gICAgICAgICAgICBhbmdsZSA9IHNlcmlhbGl6ZWQuYW5nbGU7XG4gICAgICAgICAgICBwaXRjaCA9IHNlcmlhbGl6ZWQucGl0Y2g7XG4gICAgICAgICAgICB0aGlzLmdyaWQgPSBuZXcgR3JpZChzZXJpYWxpemVkLmdyaWQpO1xuICAgICAgICAgICAgdGhpcy5pZ25vcmVkR3JpZCA9IG5ldyBHcmlkKHNlcmlhbGl6ZWQuaWdub3JlZEdyaWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5ncmlkID0gbmV3IEdyaWQoRVhURU5ULCAxMiwgNik7XG4gICAgICAgICAgICB0aGlzLmlnbm9yZWRHcmlkID0gbmV3IEdyaWQoRVhURU5ULCAxMiwgMCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm1pblNjYWxlID0gMC41O1xuICAgICAgICB0aGlzLm1heFNjYWxlID0gMjtcblxuICAgICAgICB0aGlzLmFuZ2xlID0gYW5nbGU7XG4gICAgICAgIHRoaXMucGl0Y2ggPSBwaXRjaDtcblxuICAgICAgICBjb25zdCBzaW4gPSBNYXRoLnNpbihhbmdsZSksXG4gICAgICAgICAgICBjb3MgPSBNYXRoLmNvcyhhbmdsZSk7XG4gICAgICAgIHRoaXMucm90YXRpb25NYXRyaXggPSBbY29zLCAtc2luLCBzaW4sIGNvc107XG4gICAgICAgIHRoaXMucmV2ZXJzZVJvdGF0aW9uTWF0cml4ID0gW2Nvcywgc2luLCAtc2luLCBjb3NdO1xuXG4gICAgICAgIC8vIFN0cmV0Y2ggYm94ZXMgaW4geSBkaXJlY3Rpb24gdG8gYWNjb3VudCBmb3IgdGhlIG1hcCB0aWx0LlxuICAgICAgICB0aGlzLnlTdHJldGNoID0gMSAvIE1hdGguY29zKHBpdGNoIC8gMTgwICogTWF0aC5QSSk7XG5cbiAgICAgICAgLy8gVGhlIGFtb3VudCB0aGUgbWFwIGlzIHNxdWlzaGVkIGRlcGVuZHMgb24gdGhlIHkgcG9zaXRpb24uXG4gICAgICAgIC8vIFNvcnQgb2YgYWNjb3VudCBmb3IgdGhpcyBieSBtYWtpbmcgYWxsIGJveGVzIGEgYml0IGJpZ2dlci5cbiAgICAgICAgdGhpcy55U3RyZXRjaCA9IE1hdGgucG93KHRoaXMueVN0cmV0Y2gsIDEuMyk7XG5cbiAgICAgICAgdGhpcy5jb2xsaXNpb25Cb3hBcnJheSA9IGNvbGxpc2lvbkJveEFycmF5O1xuICAgICAgICBpZiAoY29sbGlzaW9uQm94QXJyYXkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyB0aGUgZmlyc3QgY29sbGlzaW9uQm94QXJyYXkgaXMgcGFzc2VkIHRvIGEgQ29sbGlzaW9uVGlsZVxuXG4gICAgICAgICAgICAvLyB0ZW1wQ29sbGlzaW9uQm94XG4gICAgICAgICAgICBjb2xsaXNpb25Cb3hBcnJheS5lbXBsYWNlQmFjaygpO1xuXG4gICAgICAgICAgICBjb25zdCBtYXhJbnQxNiA9IDMyNzY3O1xuICAgICAgICAgICAgLy9sZWZ0XG4gICAgICAgICAgICBjb2xsaXNpb25Cb3hBcnJheS5lbXBsYWNlQmFjaygwLCAwLCAwLCAtbWF4SW50MTYsIDAsIG1heEludDE2LCBtYXhJbnQxNixcbiAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCxcbiAgICAgICAgICAgICAgICAgICAgMCk7XG4gICAgICAgICAgICAvLyByaWdodFxuICAgICAgICAgICAgY29sbGlzaW9uQm94QXJyYXkuZW1wbGFjZUJhY2soRVhURU5ULCAwLCAwLCAtbWF4SW50MTYsIDAsIG1heEludDE2LCBtYXhJbnQxNixcbiAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCxcbiAgICAgICAgICAgICAgICAgICAgMCk7XG4gICAgICAgICAgICAvLyB0b3BcbiAgICAgICAgICAgIGNvbGxpc2lvbkJveEFycmF5LmVtcGxhY2VCYWNrKDAsIDAsIC1tYXhJbnQxNiwgMCwgbWF4SW50MTYsIDAsIG1heEludDE2LFxuICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLFxuICAgICAgICAgICAgICAgICAgICAwKTtcbiAgICAgICAgICAgIC8vIGJvdHRvbVxuICAgICAgICAgICAgY29sbGlzaW9uQm94QXJyYXkuZW1wbGFjZUJhY2soMCwgRVhURU5ULCAtbWF4SW50MTYsIDAsIG1heEludDE2LCAwLCBtYXhJbnQxNixcbiAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCxcbiAgICAgICAgICAgICAgICAgICAgMCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnRlbXBDb2xsaXNpb25Cb3ggPSBjb2xsaXNpb25Cb3hBcnJheS5nZXQoMCk7XG4gICAgICAgIHRoaXMuZWRnZXMgPSBbXG4gICAgICAgICAgICBjb2xsaXNpb25Cb3hBcnJheS5nZXQoMSksXG4gICAgICAgICAgICBjb2xsaXNpb25Cb3hBcnJheS5nZXQoMiksXG4gICAgICAgICAgICBjb2xsaXNpb25Cb3hBcnJheS5nZXQoMyksXG4gICAgICAgICAgICBjb2xsaXNpb25Cb3hBcnJheS5nZXQoNClcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUodHJhbnNmZXJhYmxlcykge1xuICAgICAgICBjb25zdCBncmlkID0gdGhpcy5ncmlkLnRvQXJyYXlCdWZmZXIoKTtcbiAgICAgICAgY29uc3QgaWdub3JlZEdyaWQgPSB0aGlzLmlnbm9yZWRHcmlkLnRvQXJyYXlCdWZmZXIoKTtcbiAgICAgICAgaWYgKHRyYW5zZmVyYWJsZXMpIHtcbiAgICAgICAgICAgIHRyYW5zZmVyYWJsZXMucHVzaChncmlkKTtcbiAgICAgICAgICAgIHRyYW5zZmVyYWJsZXMucHVzaChpZ25vcmVkR3JpZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGFuZ2xlOiB0aGlzLmFuZ2xlLFxuICAgICAgICAgICAgcGl0Y2g6IHRoaXMucGl0Y2gsXG4gICAgICAgICAgICBncmlkOiBncmlkLFxuICAgICAgICAgICAgaWdub3JlZEdyaWQ6IGlnbm9yZWRHcmlkXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmluZCB0aGUgc2NhbGUgYXQgd2hpY2ggdGhlIGNvbGxpc2lvbkZlYXR1cmUgY2FuIGJlIHNob3duIHdpdGhvdXRcbiAgICAgKiBvdmVybGFwcGluZyB3aXRoIG90aGVyIGZlYXR1cmVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtDb2xsaXNpb25GZWF0dXJlfSBjb2xsaXNpb25GZWF0dXJlXG4gICAgICogQHJldHVybnMge251bWJlcn0gcGxhY2VtZW50U2NhbGVcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHBsYWNlQ29sbGlzaW9uRmVhdHVyZShjb2xsaXNpb25GZWF0dXJlLCBhbGxvd092ZXJsYXAsIGF2b2lkRWRnZXMpIHtcblxuICAgICAgICBjb25zdCBjb2xsaXNpb25Cb3hBcnJheSA9IHRoaXMuY29sbGlzaW9uQm94QXJyYXk7XG4gICAgICAgIGxldCBtaW5QbGFjZW1lbnRTY2FsZSA9IHRoaXMubWluU2NhbGU7XG4gICAgICAgIGNvbnN0IHJvdGF0aW9uTWF0cml4ID0gdGhpcy5yb3RhdGlvbk1hdHJpeDtcbiAgICAgICAgY29uc3QgeVN0cmV0Y2ggPSB0aGlzLnlTdHJldGNoO1xuXG4gICAgICAgIGZvciAobGV0IGIgPSBjb2xsaXNpb25GZWF0dXJlLmJveFN0YXJ0SW5kZXg7IGIgPCBjb2xsaXNpb25GZWF0dXJlLmJveEVuZEluZGV4OyBiKyspIHtcblxuICAgICAgICAgICAgY29uc3QgYm94ID0gY29sbGlzaW9uQm94QXJyYXkuZ2V0KGIpO1xuXG4gICAgICAgICAgICBjb25zdCBhbmNob3JQb2ludCA9IGJveC5hbmNob3JQb2ludC5fbWF0TXVsdChyb3RhdGlvbk1hdHJpeCk7XG4gICAgICAgICAgICBjb25zdCB4ID0gYW5jaG9yUG9pbnQueDtcbiAgICAgICAgICAgIGNvbnN0IHkgPSBhbmNob3JQb2ludC55O1xuXG4gICAgICAgICAgICBjb25zdCB4MSA9IHggKyBib3gueDE7XG4gICAgICAgICAgICBjb25zdCB5MSA9IHkgKyBib3gueTEgKiB5U3RyZXRjaDtcbiAgICAgICAgICAgIGNvbnN0IHgyID0geCArIGJveC54MjtcbiAgICAgICAgICAgIGNvbnN0IHkyID0geSArIGJveC55MiAqIHlTdHJldGNoO1xuXG4gICAgICAgICAgICBib3guYmJveDAgPSB4MTtcbiAgICAgICAgICAgIGJveC5iYm94MSA9IHkxO1xuICAgICAgICAgICAgYm94LmJib3gyID0geDI7XG4gICAgICAgICAgICBib3guYmJveDMgPSB5MjtcblxuICAgICAgICAgICAgaWYgKCFhbGxvd092ZXJsYXApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBibG9ja2luZ0JveGVzID0gdGhpcy5ncmlkLnF1ZXJ5KHgxLCB5MSwgeDIsIHkyKTtcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmxvY2tpbmdCb3hlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBibG9ja2luZyA9IGNvbGxpc2lvbkJveEFycmF5LmdldChibG9ja2luZ0JveGVzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYmxvY2tpbmdBbmNob3JQb2ludCA9IGJsb2NraW5nLmFuY2hvclBvaW50Ll9tYXRNdWx0KHJvdGF0aW9uTWF0cml4KTtcblxuICAgICAgICAgICAgICAgICAgICBtaW5QbGFjZW1lbnRTY2FsZSA9IHRoaXMuZ2V0UGxhY2VtZW50U2NhbGUobWluUGxhY2VtZW50U2NhbGUsIGFuY2hvclBvaW50LCBib3gsIGJsb2NraW5nQW5jaG9yUG9pbnQsIGJsb2NraW5nKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1pblBsYWNlbWVudFNjYWxlID49IHRoaXMubWF4U2NhbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtaW5QbGFjZW1lbnRTY2FsZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGF2b2lkRWRnZXMpIHtcbiAgICAgICAgICAgICAgICBsZXQgcm90YXRlZENvbGxpc2lvbkJveDtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmFuZ2xlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJldmVyc2VSb3RhdGlvbk1hdHJpeCA9IHRoaXMucmV2ZXJzZVJvdGF0aW9uTWF0cml4O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0bCA9IG5ldyBQb2ludChib3gueDEsIGJveC55MSkubWF0TXVsdChyZXZlcnNlUm90YXRpb25NYXRyaXgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ciA9IG5ldyBQb2ludChib3gueDIsIGJveC55MSkubWF0TXVsdChyZXZlcnNlUm90YXRpb25NYXRyaXgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBibCA9IG5ldyBQb2ludChib3gueDEsIGJveC55MikubWF0TXVsdChyZXZlcnNlUm90YXRpb25NYXRyaXgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBiciA9IG5ldyBQb2ludChib3gueDIsIGJveC55MikubWF0TXVsdChyZXZlcnNlUm90YXRpb25NYXRyaXgpO1xuXG4gICAgICAgICAgICAgICAgICAgIHJvdGF0ZWRDb2xsaXNpb25Cb3ggPSB0aGlzLnRlbXBDb2xsaXNpb25Cb3g7XG4gICAgICAgICAgICAgICAgICAgIHJvdGF0ZWRDb2xsaXNpb25Cb3guYW5jaG9yUG9pbnRYID0gYm94LmFuY2hvclBvaW50Lng7XG4gICAgICAgICAgICAgICAgICAgIHJvdGF0ZWRDb2xsaXNpb25Cb3guYW5jaG9yUG9pbnRZID0gYm94LmFuY2hvclBvaW50Lnk7XG4gICAgICAgICAgICAgICAgICAgIHJvdGF0ZWRDb2xsaXNpb25Cb3gueDEgPSBNYXRoLm1pbih0bC54LCB0ci54LCBibC54LCBici54KTtcbiAgICAgICAgICAgICAgICAgICAgcm90YXRlZENvbGxpc2lvbkJveC55MSA9IE1hdGgubWluKHRsLnksIHRyLngsIGJsLngsIGJyLngpO1xuICAgICAgICAgICAgICAgICAgICByb3RhdGVkQ29sbGlzaW9uQm94LngyID0gTWF0aC5tYXgodGwueCwgdHIueCwgYmwueCwgYnIueCk7XG4gICAgICAgICAgICAgICAgICAgIHJvdGF0ZWRDb2xsaXNpb25Cb3gueTIgPSBNYXRoLm1heCh0bC55LCB0ci54LCBibC54LCBici54KTtcbiAgICAgICAgICAgICAgICAgICAgcm90YXRlZENvbGxpc2lvbkJveC5tYXhTY2FsZSA9IGJveC5tYXhTY2FsZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByb3RhdGVkQ29sbGlzaW9uQm94ID0gYm94O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgdGhpcy5lZGdlcy5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlZGdlQm94ID0gdGhpcy5lZGdlc1trXTtcbiAgICAgICAgICAgICAgICAgICAgbWluUGxhY2VtZW50U2NhbGUgPSB0aGlzLmdldFBsYWNlbWVudFNjYWxlKG1pblBsYWNlbWVudFNjYWxlLCBib3guYW5jaG9yUG9pbnQsIHJvdGF0ZWRDb2xsaXNpb25Cb3gsIGVkZ2VCb3guYW5jaG9yUG9pbnQsIGVkZ2VCb3gpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobWluUGxhY2VtZW50U2NhbGUgPj0gdGhpcy5tYXhTY2FsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1pblBsYWNlbWVudFNjYWxlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1pblBsYWNlbWVudFNjYWxlO1xuICAgIH1cblxuICAgIHF1ZXJ5UmVuZGVyZWRTeW1ib2xzKHF1ZXJ5R2VvbWV0cnksIHNjYWxlKSB7XG4gICAgICAgIGNvbnN0IHNvdXJjZUxheWVyRmVhdHVyZXMgPSB7fTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gW107XG5cbiAgICAgICAgaWYgKHF1ZXJ5R2VvbWV0cnkubGVuZ3RoID09PSAwIHx8ICh0aGlzLmdyaWQubGVuZ3RoID09PSAwICYmIHRoaXMuaWdub3JlZEdyaWQubGVuZ3RoID09PSAwKSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbGxpc2lvbkJveEFycmF5ID0gdGhpcy5jb2xsaXNpb25Cb3hBcnJheTtcbiAgICAgICAgY29uc3Qgcm90YXRpb25NYXRyaXggPSB0aGlzLnJvdGF0aW9uTWF0cml4O1xuICAgICAgICBjb25zdCB5U3RyZXRjaCA9IHRoaXMueVN0cmV0Y2g7XG5cbiAgICAgICAgLy8gR2VuZXJhdGUgYSByb3RhdGVkIGdlb21ldHJ5IG91dCBvZiB0aGUgb3JpZ2luYWwgcXVlcnkgZ2VvbWV0cnkuXG4gICAgICAgIC8vIFNjYWxlIGhhcyBhbHJlYWR5IGJlZW4gaGFuZGxlZCBieSB0aGUgcHJpb3IgY29udmVyc2lvbnMuXG4gICAgICAgIGNvbnN0IHJvdGF0ZWRRdWVyeSA9IFtdO1xuICAgICAgICBsZXQgbWluWCA9IEluZmluaXR5O1xuICAgICAgICBsZXQgbWluWSA9IEluZmluaXR5O1xuICAgICAgICBsZXQgbWF4WCA9IC1JbmZpbml0eTtcbiAgICAgICAgbGV0IG1heFkgPSAtSW5maW5pdHk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcXVlcnlHZW9tZXRyeS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgcmluZyA9IHF1ZXJ5R2VvbWV0cnlbaV07XG4gICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IHJpbmcubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwID0gcmluZ1trXS5tYXRNdWx0KHJvdGF0aW9uTWF0cml4KTtcbiAgICAgICAgICAgICAgICBtaW5YID0gTWF0aC5taW4obWluWCwgcC54KTtcbiAgICAgICAgICAgICAgICBtaW5ZID0gTWF0aC5taW4obWluWSwgcC55KTtcbiAgICAgICAgICAgICAgICBtYXhYID0gTWF0aC5tYXgobWF4WCwgcC54KTtcbiAgICAgICAgICAgICAgICBtYXhZID0gTWF0aC5tYXgobWF4WSwgcC55KTtcbiAgICAgICAgICAgICAgICByb3RhdGVkUXVlcnkucHVzaChwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZlYXR1cmVzID0gdGhpcy5ncmlkLnF1ZXJ5KG1pblgsIG1pblksIG1heFgsIG1heFkpO1xuICAgICAgICBjb25zdCBpZ25vcmVkRmVhdHVyZXMgPSB0aGlzLmlnbm9yZWRHcmlkLnF1ZXJ5KG1pblgsIG1pblksIG1heFgsIG1heFkpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlnbm9yZWRGZWF0dXJlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgZmVhdHVyZXMucHVzaChpZ25vcmVkRmVhdHVyZXNbaV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWNjb3VudCBmb3IgdGhlIHJvdW5kaW5nIGRvbmUgd2hlbiB1cGRhdGluZyBzeW1ib2wgc2hhZGVyIHZhcmlhYmxlcy5cbiAgICAgICAgY29uc3Qgcm91bmRlZFNjYWxlID0gTWF0aC5wb3coMiwgTWF0aC5jZWlsKE1hdGgubG9nKHNjYWxlKSAvIE1hdGguTE4yICogMTApIC8gMTApO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmVhdHVyZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGJsb2NraW5nID0gY29sbGlzaW9uQm94QXJyYXkuZ2V0KGZlYXR1cmVzW2ldKTtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZUxheWVyID0gYmxvY2tpbmcuc291cmNlTGF5ZXJJbmRleDtcbiAgICAgICAgICAgIGNvbnN0IGZlYXR1cmVJbmRleCA9IGJsb2NraW5nLmZlYXR1cmVJbmRleDtcblxuICAgICAgICAgICAgLy8gU2tpcCBhbHJlYWR5IHNlZW4gZmVhdHVyZXMuXG4gICAgICAgICAgICBpZiAoc291cmNlTGF5ZXJGZWF0dXJlc1tzb3VyY2VMYXllcl0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHNvdXJjZUxheWVyRmVhdHVyZXNbc291cmNlTGF5ZXJdID0ge307XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc291cmNlTGF5ZXJGZWF0dXJlc1tzb3VyY2VMYXllcl1bZmVhdHVyZUluZGV4XSkgY29udGludWU7XG5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIGZlYXR1cmUgaXMgcmVuZGVyZWQgKGNvbGxpc2lvbiBmcmVlKSBhdCBjdXJyZW50IHNjYWxlLlxuICAgICAgICAgICAgaWYgKHJvdW5kZWRTY2FsZSA8IGJsb2NraW5nLnBsYWNlbWVudFNjYWxlIHx8IHJvdW5kZWRTY2FsZSA+IGJsb2NraW5nLm1heFNjYWxlKSBjb250aW51ZTtcblxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgcXVlcnkgaW50ZXJzZWN0cyB3aXRoIHRoZSBmZWF0dXJlIGJveCBhdCBjdXJyZW50IHNjYWxlLlxuICAgICAgICAgICAgY29uc3QgYW5jaG9yID0gYmxvY2tpbmcuYW5jaG9yUG9pbnQubWF0TXVsdChyb3RhdGlvbk1hdHJpeCk7XG4gICAgICAgICAgICBjb25zdCB4MSA9IGFuY2hvci54ICsgYmxvY2tpbmcueDEgLyBzY2FsZTtcbiAgICAgICAgICAgIGNvbnN0IHkxID0gYW5jaG9yLnkgKyBibG9ja2luZy55MSAvIHNjYWxlICogeVN0cmV0Y2g7XG4gICAgICAgICAgICBjb25zdCB4MiA9IGFuY2hvci54ICsgYmxvY2tpbmcueDIgLyBzY2FsZTtcbiAgICAgICAgICAgIGNvbnN0IHkyID0gYW5jaG9yLnkgKyBibG9ja2luZy55MiAvIHNjYWxlICogeVN0cmV0Y2g7XG4gICAgICAgICAgICBjb25zdCBiYm94ID0gW1xuICAgICAgICAgICAgICAgIG5ldyBQb2ludCh4MSwgeTEpLFxuICAgICAgICAgICAgICAgIG5ldyBQb2ludCh4MiwgeTEpLFxuICAgICAgICAgICAgICAgIG5ldyBQb2ludCh4MiwgeTIpLFxuICAgICAgICAgICAgICAgIG5ldyBQb2ludCh4MSwgeTIpXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgaWYgKCFpbnRlcnNlY3Rpb25UZXN0cy5wb2x5Z29uSW50ZXJzZWN0c1BvbHlnb24ocm90YXRlZFF1ZXJ5LCBiYm94KSkgY29udGludWU7XG5cbiAgICAgICAgICAgIHNvdXJjZUxheWVyRmVhdHVyZXNbc291cmNlTGF5ZXJdW2ZlYXR1cmVJbmRleF0gPSB0cnVlO1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goZmVhdHVyZXNbaV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBnZXRQbGFjZW1lbnRTY2FsZShtaW5QbGFjZW1lbnRTY2FsZSwgYW5jaG9yUG9pbnQsIGJveCwgYmxvY2tpbmdBbmNob3JQb2ludCwgYmxvY2tpbmcpIHtcblxuICAgICAgICAvLyBGaW5kIHRoZSBsb3dlc3Qgc2NhbGUgYXQgd2hpY2ggdGhlIHR3byBib3hlcyBjYW4gZml0IHNpZGUgYnkgc2lkZSB3aXRob3V0IG92ZXJsYXBwaW5nLlxuICAgICAgICAvLyBPcmlnaW5hbCBhbGdvcml0aG06XG4gICAgICAgIGNvbnN0IGFuY2hvckRpZmZYID0gYW5jaG9yUG9pbnQueCAtIGJsb2NraW5nQW5jaG9yUG9pbnQueDtcbiAgICAgICAgY29uc3QgYW5jaG9yRGlmZlkgPSBhbmNob3JQb2ludC55IC0gYmxvY2tpbmdBbmNob3JQb2ludC55O1xuICAgICAgICBsZXQgczEgPSAoYmxvY2tpbmcueDEgLSBib3gueDIpIC8gYW5jaG9yRGlmZlg7IC8vIHNjYWxlIGF0IHdoaWNoIG5ldyBib3ggaXMgdG8gdGhlIGxlZnQgb2Ygb2xkIGJveFxuICAgICAgICBsZXQgczIgPSAoYmxvY2tpbmcueDIgLSBib3gueDEpIC8gYW5jaG9yRGlmZlg7IC8vIHNjYWxlIGF0IHdoaWNoIG5ldyBib3ggaXMgdG8gdGhlIHJpZ2h0IG9mIG9sZCBib3hcbiAgICAgICAgbGV0IHMzID0gKGJsb2NraW5nLnkxIC0gYm94LnkyKSAqIHRoaXMueVN0cmV0Y2ggLyBhbmNob3JEaWZmWTsgLy8gc2NhbGUgYXQgd2hpY2ggbmV3IGJveCBpcyB0byB0aGUgdG9wIG9mIG9sZCBib3hcbiAgICAgICAgbGV0IHM0ID0gKGJsb2NraW5nLnkyIC0gYm94LnkxKSAqIHRoaXMueVN0cmV0Y2ggLyBhbmNob3JEaWZmWTsgLy8gc2NhbGUgYXQgd2hpY2ggbmV3IGJveCBpcyB0byB0aGUgYm90dG9tIG9mIG9sZCBib3hcblxuICAgICAgICBpZiAoaXNOYU4oczEpIHx8IGlzTmFOKHMyKSkgczEgPSBzMiA9IDE7XG4gICAgICAgIGlmIChpc05hTihzMykgfHwgaXNOYU4oczQpKSBzMyA9IHM0ID0gMTtcblxuICAgICAgICBsZXQgY29sbGlzaW9uRnJlZVNjYWxlID0gTWF0aC5taW4oTWF0aC5tYXgoczEsIHMyKSwgTWF0aC5tYXgoczMsIHM0KSk7XG4gICAgICAgIGNvbnN0IGJsb2NraW5nTWF4U2NhbGUgPSBibG9ja2luZy5tYXhTY2FsZTtcbiAgICAgICAgY29uc3QgYm94TWF4U2NhbGUgPSBib3gubWF4U2NhbGU7XG5cbiAgICAgICAgaWYgKGNvbGxpc2lvbkZyZWVTY2FsZSA+IGJsb2NraW5nTWF4U2NhbGUpIHtcbiAgICAgICAgICAgIC8vIEFmdGVyIGEgYm94J3MgbWF4U2NhbGUgdGhlIGxhYmVsIGhhcyBzaHJ1bmsgZW5vdWdoIHRoYXQgdGhlIGJveCBpcyBubyBsb25nZXIgbmVlZGVkIHRvIGNvdmVyIGl0LFxuICAgICAgICAgICAgLy8gc28gdW5ibG9jayB0aGUgbmV3IGJveCBhdCB0aGUgc2NhbGUgdGhhdCB0aGUgb2xkIGJveCBkaXNhcHBlYXJzLlxuICAgICAgICAgICAgY29sbGlzaW9uRnJlZVNjYWxlID0gYmxvY2tpbmdNYXhTY2FsZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb2xsaXNpb25GcmVlU2NhbGUgPiBib3hNYXhTY2FsZSkge1xuICAgICAgICAgICAgLy8gSWYgdGhlIGJveCBjYW4gb25seSBiZSBzaG93biBhZnRlciBpdCBpcyB2aXNpYmxlLCB0aGVuIHRoZSBib3ggY2FuIG5ldmVyIGJlIHNob3duLlxuICAgICAgICAgICAgLy8gQnV0IHRoZSBsYWJlbCBjYW4gYmUgc2hvd24gYWZ0ZXIgdGhpcyBib3ggaXMgbm90IHZpc2libGUuXG4gICAgICAgICAgICBjb2xsaXNpb25GcmVlU2NhbGUgPSBib3hNYXhTY2FsZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb2xsaXNpb25GcmVlU2NhbGUgPiBtaW5QbGFjZW1lbnRTY2FsZSAmJlxuICAgICAgICAgICAgICAgIGNvbGxpc2lvbkZyZWVTY2FsZSA+PSBibG9ja2luZy5wbGFjZW1lbnRTY2FsZSkge1xuICAgICAgICAgICAgLy8gSWYgdGhpcyBjb2xsaXNpb24gb2NjdXJzIGF0IGEgbG93ZXIgc2NhbGUgdGhhbiBwcmV2aW91c2x5IGZvdW5kIGNvbGxpc2lvbnNcbiAgICAgICAgICAgIC8vIGFuZCB0aGUgY29sbGlzaW9uIG9jY3VycyB3aGlsZSB0aGUgb3RoZXIgbGFiZWwgaXMgdmlzaWJsZVxuXG4gICAgICAgICAgICAvLyB0aGlzIHRoaXMgaXMgdGhlIGxvd2VzdCBzY2FsZSBhdCB3aGljaCB0aGUgbGFiZWwgd29uJ3QgY29sbGlkZSB3aXRoIGFueXRoaW5nXG4gICAgICAgICAgICBtaW5QbGFjZW1lbnRTY2FsZSA9IGNvbGxpc2lvbkZyZWVTY2FsZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtaW5QbGFjZW1lbnRTY2FsZTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIFJlbWVtYmVyIHRoaXMgY29sbGlzaW9uRmVhdHVyZSBhbmQgd2hhdCBzY2FsZSBpdCB3YXMgcGxhY2VkIGF0IHRvIGJsb2NrXG4gICAgICogbGF0ZXIgZmVhdHVyZXMgZnJvbSBvdmVybGFwcGluZyB3aXRoIGl0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtDb2xsaXNpb25GZWF0dXJlfSBjb2xsaXNpb25GZWF0dXJlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG1pblBsYWNlbWVudFNjYWxlXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBpbnNlcnRDb2xsaXNpb25GZWF0dXJlKGNvbGxpc2lvbkZlYXR1cmUsIG1pblBsYWNlbWVudFNjYWxlLCBpZ25vcmVQbGFjZW1lbnQpIHtcblxuICAgICAgICBjb25zdCBncmlkID0gaWdub3JlUGxhY2VtZW50ID8gdGhpcy5pZ25vcmVkR3JpZCA6IHRoaXMuZ3JpZDtcbiAgICAgICAgY29uc3QgY29sbGlzaW9uQm94QXJyYXkgPSB0aGlzLmNvbGxpc2lvbkJveEFycmF5O1xuXG4gICAgICAgIGZvciAobGV0IGsgPSBjb2xsaXNpb25GZWF0dXJlLmJveFN0YXJ0SW5kZXg7IGsgPCBjb2xsaXNpb25GZWF0dXJlLmJveEVuZEluZGV4OyBrKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGJveCA9IGNvbGxpc2lvbkJveEFycmF5LmdldChrKTtcbiAgICAgICAgICAgIGJveC5wbGFjZW1lbnRTY2FsZSA9IG1pblBsYWNlbWVudFNjYWxlO1xuICAgICAgICAgICAgaWYgKG1pblBsYWNlbWVudFNjYWxlIDwgdGhpcy5tYXhTY2FsZSkge1xuICAgICAgICAgICAgICAgIGdyaWQuaW5zZXJ0KGssIGJveC5iYm94MCwgYm94LmJib3gxLCBib3guYmJveDIsIGJveC5iYm94Myk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gQ29sbGlzaW9uVGlsZTtcbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgaW50ZXJwb2xhdGUgPSByZXF1aXJlKCcuLi91dGlsL2ludGVycG9sYXRlJyk7XG5jb25zdCBBbmNob3IgPSByZXF1aXJlKCcuLi9zeW1ib2wvYW5jaG9yJyk7XG5jb25zdCBjaGVja01heEFuZ2xlID0gcmVxdWlyZSgnLi9jaGVja19tYXhfYW5nbGUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBnZXRBbmNob3JzO1xuXG5mdW5jdGlvbiBnZXRBbmNob3JzKGxpbmUsIHNwYWNpbmcsIG1heEFuZ2xlLCBzaGFwZWRUZXh0LCBzaGFwZWRJY29uLCBnbHlwaFNpemUsIGJveFNjYWxlLCBvdmVyc2NhbGluZywgdGlsZUV4dGVudCkge1xuXG4gICAgLy8gUmVzYW1wbGUgYSBsaW5lIHRvIGdldCBhbmNob3IgcG9pbnRzIGZvciBsYWJlbHMgYW5kIGNoZWNrIHRoYXQgZWFjaFxuICAgIC8vIHBvdGVudGlhbCBsYWJlbCBwYXNzZXMgdGV4dC1tYXgtYW5nbGUgY2hlY2sgYW5kIGhhcyBlbm91Z2ggZnJvb20gdG8gZml0XG4gICAgLy8gb24gdGhlIGxpbmUuXG5cbiAgICBjb25zdCBhbmdsZVdpbmRvd1NpemUgPSBzaGFwZWRUZXh0ID9cbiAgICAgICAgMyAvIDUgKiBnbHlwaFNpemUgKiBib3hTY2FsZSA6XG4gICAgICAgIDA7XG5cbiAgICBjb25zdCBsYWJlbExlbmd0aCA9IE1hdGgubWF4KFxuICAgICAgICBzaGFwZWRUZXh0ID8gc2hhcGVkVGV4dC5yaWdodCAtIHNoYXBlZFRleHQubGVmdCA6IDAsXG4gICAgICAgIHNoYXBlZEljb24gPyBzaGFwZWRJY29uLnJpZ2h0IC0gc2hhcGVkSWNvbi5sZWZ0IDogMCk7XG5cbiAgICAvLyBJcyB0aGUgbGluZSBjb250aW51ZWQgZnJvbSBvdXRzaWRlIHRoZSB0aWxlIGJvdW5kYXJ5P1xuICAgIGNvbnN0IGlzTGluZUNvbnRpbnVlZCA9IGxpbmVbMF0ueCA9PT0gMCB8fCBsaW5lWzBdLnggPT09IHRpbGVFeHRlbnQgfHwgbGluZVswXS55ID09PSAwIHx8IGxpbmVbMF0ueSA9PT0gdGlsZUV4dGVudDtcblxuICAgIC8vIElzIHRoZSBsYWJlbCBsb25nLCByZWxhdGl2ZSB0byB0aGUgc3BhY2luZz9cbiAgICAvLyBJZiBzbywgYWRqdXN0IHRoZSBzcGFjaW5nIHNvIHRoZXJlIGlzIGFsd2F5cyBhIG1pbmltdW0gc3BhY2Ugb2YgYHNwYWNpbmcgLyA0YCBiZXR3ZWVuIGxhYmVsIGVkZ2VzLlxuICAgIGlmIChzcGFjaW5nIC0gbGFiZWxMZW5ndGggKiBib3hTY2FsZSAgPCBzcGFjaW5nIC8gNCkge1xuICAgICAgICBzcGFjaW5nID0gbGFiZWxMZW5ndGggKiBib3hTY2FsZSArIHNwYWNpbmcgLyA0O1xuICAgIH1cblxuICAgIC8vIE9mZnNldCB0aGUgZmlyc3QgYW5jaG9yIGJ5OlxuICAgIC8vIEVpdGhlciBoYWxmIHRoZSBsYWJlbCBsZW5ndGggcGx1cyBhIGZpeGVkIGV4dHJhIG9mZnNldCBpZiB0aGUgbGluZSBpcyBub3QgY29udGludWVkXG4gICAgLy8gT3IgaGFsZiB0aGUgc3BhY2luZyBpZiB0aGUgbGluZSBpcyBjb250aW51ZWQuXG5cbiAgICAvLyBGb3Igbm9uLWNvbnRpbnVlZCBsaW5lcywgYWRkIGEgYml0IG9mIGZpeGVkIGV4dHJhIG9mZnNldCB0byBhdm9pZCBjb2xsaXNpb25zIGF0IFQgaW50ZXJzZWN0aW9ucy5cbiAgICBjb25zdCBmaXhlZEV4dHJhT2Zmc2V0ID0gZ2x5cGhTaXplICogMjtcblxuICAgIGNvbnN0IG9mZnNldCA9ICFpc0xpbmVDb250aW51ZWQgP1xuICAgICAgICAoKGxhYmVsTGVuZ3RoIC8gMiArIGZpeGVkRXh0cmFPZmZzZXQpICogYm94U2NhbGUgKiBvdmVyc2NhbGluZykgJSBzcGFjaW5nIDpcbiAgICAgICAgKHNwYWNpbmcgLyAyICogb3ZlcnNjYWxpbmcpICUgc3BhY2luZztcblxuICAgIHJldHVybiByZXNhbXBsZShsaW5lLCBvZmZzZXQsIHNwYWNpbmcsIGFuZ2xlV2luZG93U2l6ZSwgbWF4QW5nbGUsIGxhYmVsTGVuZ3RoICogYm94U2NhbGUsIGlzTGluZUNvbnRpbnVlZCwgZmFsc2UsIHRpbGVFeHRlbnQpO1xufVxuXG5cbmZ1bmN0aW9uIHJlc2FtcGxlKGxpbmUsIG9mZnNldCwgc3BhY2luZywgYW5nbGVXaW5kb3dTaXplLCBtYXhBbmdsZSwgbGFiZWxMZW5ndGgsIGlzTGluZUNvbnRpbnVlZCwgcGxhY2VBdE1pZGRsZSwgdGlsZUV4dGVudCkge1xuXG4gICAgY29uc3QgaGFsZkxhYmVsTGVuZ3RoID0gbGFiZWxMZW5ndGggLyAyO1xuICAgIGxldCBsaW5lTGVuZ3RoID0gMDtcbiAgICBmb3IgKGxldCBrID0gMDsgayA8IGxpbmUubGVuZ3RoIC0gMTsgaysrKSB7XG4gICAgICAgIGxpbmVMZW5ndGggKz0gbGluZVtrXS5kaXN0KGxpbmVbayArIDFdKTtcbiAgICB9XG5cbiAgICBsZXQgZGlzdGFuY2UgPSAwLFxuICAgICAgICBtYXJrZWREaXN0YW5jZSA9IG9mZnNldCAtIHNwYWNpbmc7XG5cbiAgICBsZXQgYW5jaG9ycyA9IFtdO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lLmxlbmd0aCAtIDE7IGkrKykge1xuXG4gICAgICAgIGNvbnN0IGEgPSBsaW5lW2ldLFxuICAgICAgICAgICAgYiA9IGxpbmVbaSArIDFdO1xuXG4gICAgICAgIGNvbnN0IHNlZ21lbnREaXN0ID0gYS5kaXN0KGIpLFxuICAgICAgICAgICAgYW5nbGUgPSBiLmFuZ2xlVG8oYSk7XG5cbiAgICAgICAgd2hpbGUgKG1hcmtlZERpc3RhbmNlICsgc3BhY2luZyA8IGRpc3RhbmNlICsgc2VnbWVudERpc3QpIHtcbiAgICAgICAgICAgIG1hcmtlZERpc3RhbmNlICs9IHNwYWNpbmc7XG5cbiAgICAgICAgICAgIGNvbnN0IHQgPSAobWFya2VkRGlzdGFuY2UgLSBkaXN0YW5jZSkgLyBzZWdtZW50RGlzdCxcbiAgICAgICAgICAgICAgICB4ID0gaW50ZXJwb2xhdGUoYS54LCBiLngsIHQpLFxuICAgICAgICAgICAgICAgIHkgPSBpbnRlcnBvbGF0ZShhLnksIGIueSwgdCk7XG5cbiAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgdGhlIHBvaW50IGlzIHdpdGhpbiB0aGUgdGlsZSBib3VuZGFyaWVzIGFuZCB0aGF0XG4gICAgICAgICAgICAvLyB0aGUgbGFiZWwgd291bGQgZml0IGJlZm9yZSB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgdGhlIGxpbmVcbiAgICAgICAgICAgIC8vIGlmIHBsYWNlZCBhdCB0aGlzIHBvaW50LlxuICAgICAgICAgICAgaWYgKHggPj0gMCAmJiB4IDwgdGlsZUV4dGVudCAmJiB5ID49IDAgJiYgeSA8IHRpbGVFeHRlbnQgJiZcbiAgICAgICAgICAgICAgICAgICAgbWFya2VkRGlzdGFuY2UgLSBoYWxmTGFiZWxMZW5ndGggPj0gMCAmJlxuICAgICAgICAgICAgICAgICAgICBtYXJrZWREaXN0YW5jZSArIGhhbGZMYWJlbExlbmd0aCA8PSBsaW5lTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYW5jaG9yID0gbmV3IEFuY2hvcih4LCB5LCBhbmdsZSwgaSkuX3JvdW5kKCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIWFuZ2xlV2luZG93U2l6ZSB8fCBjaGVja01heEFuZ2xlKGxpbmUsIGFuY2hvciwgbGFiZWxMZW5ndGgsIGFuZ2xlV2luZG93U2l6ZSwgbWF4QW5nbGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGFuY2hvcnMucHVzaChhbmNob3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGRpc3RhbmNlICs9IHNlZ21lbnREaXN0O1xuICAgIH1cblxuICAgIGlmICghcGxhY2VBdE1pZGRsZSAmJiAhYW5jaG9ycy5sZW5ndGggJiYgIWlzTGluZUNvbnRpbnVlZCkge1xuICAgICAgICAvLyBUaGUgZmlyc3QgYXR0ZW1wdCBhdCBmaW5kaW5nIGFuY2hvcnMgYXQgd2hpY2ggbGFiZWxzIGNhbiBiZSBwbGFjZWQgZmFpbGVkLlxuICAgICAgICAvLyBUcnkgYWdhaW4sIGJ1dCB0aGlzIHRpbWUganVzdCB0cnkgcGxhY2luZyBvbmUgYW5jaG9yIGF0IHRoZSBtaWRkbGUgb2YgdGhlIGxpbmUuXG4gICAgICAgIC8vIFRoaXMgaGFzIHRoZSBtb3N0IGVmZmVjdCBmb3Igc2hvcnQgbGluZXMgaW4gb3ZlcnNjYWxlZCB0aWxlcywgc2luY2UgdGhlXG4gICAgICAgIC8vIGluaXRpYWwgb2Zmc2V0IHVzZWQgaW4gb3ZlcnNjYWxlZCB0aWxlcyBpcyBjYWxjdWxhdGVkIHRvIGFsaWduIGxhYmVscyB3aXRoIHBvc2l0aW9ucyBpblxuICAgICAgICAvLyBwYXJlbnQgdGlsZXMgaW5zdGVhZCBvZiBwbGFjaW5nIHRoZSBsYWJlbCBhcyBjbG9zZSB0byB0aGUgYmVnaW5uaW5nIGFzIHBvc3NpYmxlLlxuICAgICAgICBhbmNob3JzID0gcmVzYW1wbGUobGluZSwgZGlzdGFuY2UgLyAyLCBzcGFjaW5nLCBhbmdsZVdpbmRvd1NpemUsIG1heEFuZ2xlLCBsYWJlbExlbmd0aCwgaXNMaW5lQ29udGludWVkLCB0cnVlLCB0aWxlRXh0ZW50KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYW5jaG9ycztcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgU2hlbGZQYWNrID0gcmVxdWlyZSgnc2hlbGYtcGFjaycpO1xuY29uc3QgdXRpbCA9IHJlcXVpcmUoJy4uL3V0aWwvdXRpbCcpO1xuXG5jb25zdCBTSVpFX0dST1dUSF9SQVRFID0gNDtcbmNvbnN0IERFRkFVTFRfU0laRSA9IDEyODtcbi8vIG11c3QgYmUgXCJERUZBVUxUX1NJWkUgKiBTSVpFX0dST1dUSF9SQVRFIF4gblwiIGZvciBzb21lIGludGVnZXIgblxuY29uc3QgTUFYX1NJWkUgPSAyMDQ4O1xuXG5jbGFzcyBHbHlwaEF0bGFzIHtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLndpZHRoID0gREVGQVVMVF9TSVpFO1xuICAgICAgICB0aGlzLmhlaWdodCA9IERFRkFVTFRfU0laRTtcblxuICAgICAgICB0aGlzLmJpbiA9IG5ldyBTaGVsZlBhY2sodGhpcy53aWR0aCwgdGhpcy5oZWlnaHQpO1xuICAgICAgICB0aGlzLmluZGV4ID0ge307XG4gICAgICAgIHRoaXMuaWRzID0ge307XG4gICAgICAgIHRoaXMuZGF0YSA9IG5ldyBVaW50OEFycmF5KHRoaXMud2lkdGggKiB0aGlzLmhlaWdodCk7XG4gICAgfVxuXG4gICAgZ2V0R2x5cGhzKCkge1xuICAgICAgICBjb25zdCBnbHlwaHMgPSB7fTtcbiAgICAgICAgbGV0IHNwbGl0LFxuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGlkO1xuXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuaWRzKSB7XG4gICAgICAgICAgICBzcGxpdCA9IGtleS5zcGxpdCgnIycpO1xuICAgICAgICAgICAgbmFtZSA9IHNwbGl0WzBdO1xuICAgICAgICAgICAgaWQgPSBzcGxpdFsxXTtcblxuICAgICAgICAgICAgaWYgKCFnbHlwaHNbbmFtZV0pIGdseXBoc1tuYW1lXSA9IFtdO1xuICAgICAgICAgICAgZ2x5cGhzW25hbWVdLnB1c2goaWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGdseXBocztcbiAgICB9XG5cbiAgICBnZXRSZWN0cygpIHtcbiAgICAgICAgY29uc3QgcmVjdHMgPSB7fTtcbiAgICAgICAgbGV0IHNwbGl0LFxuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGlkO1xuXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuaWRzKSB7XG4gICAgICAgICAgICBzcGxpdCA9IGtleS5zcGxpdCgnIycpO1xuICAgICAgICAgICAgbmFtZSA9IHNwbGl0WzBdO1xuICAgICAgICAgICAgaWQgPSBzcGxpdFsxXTtcblxuICAgICAgICAgICAgaWYgKCFyZWN0c1tuYW1lXSkgcmVjdHNbbmFtZV0gPSB7fTtcbiAgICAgICAgICAgIHJlY3RzW25hbWVdW2lkXSA9IHRoaXMuaW5kZXhba2V5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZWN0cztcbiAgICB9XG5cbiAgICBhZGRHbHlwaChpZCwgbmFtZSwgZ2x5cGgsIGJ1ZmZlcikge1xuICAgICAgICBpZiAoIWdseXBoKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBrZXkgPSBgJHtuYW1lfSMke2dseXBoLmlkfWA7XG5cbiAgICAgICAgLy8gVGhlIGdseXBoIGlzIGFscmVhZHkgaW4gdGhpcyB0ZXh0dXJlLlxuICAgICAgICBpZiAodGhpcy5pbmRleFtrZXldKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pZHNba2V5XS5pbmRleE9mKGlkKSA8IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlkc1trZXldLnB1c2goaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXhba2V5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZSBnbHlwaCBiaXRtYXAgaGFzIHplcm8gd2lkdGguXG4gICAgICAgIGlmICghZ2x5cGguYml0bWFwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJ1ZmZlcmVkV2lkdGggPSBnbHlwaC53aWR0aCArIGJ1ZmZlciAqIDI7XG4gICAgICAgIGNvbnN0IGJ1ZmZlcmVkSGVpZ2h0ID0gZ2x5cGguaGVpZ2h0ICsgYnVmZmVyICogMjtcblxuICAgICAgICAvLyBBZGQgYSAxcHggYm9yZGVyIGFyb3VuZCBldmVyeSBpbWFnZS5cbiAgICAgICAgY29uc3QgcGFkZGluZyA9IDE7XG4gICAgICAgIGxldCBwYWNrV2lkdGggPSBidWZmZXJlZFdpZHRoICsgMiAqIHBhZGRpbmc7XG4gICAgICAgIGxldCBwYWNrSGVpZ2h0ID0gYnVmZmVyZWRIZWlnaHQgKyAyICogcGFkZGluZztcblxuICAgICAgICAvLyBJbmNyZWFzZSB0byBuZXh0IG51bWJlciBkaXZpc2libGUgYnkgNCwgYnV0IGF0IGxlYXN0IDEuXG4gICAgICAgIC8vIFRoaXMgaXMgc28gd2UgY2FuIHNjYWxlIGRvd24gdGhlIHRleHR1cmUgY29vcmRpbmF0ZXMgYW5kIHBhY2sgdGhlbVxuICAgICAgICAvLyBpbnRvIGZld2VyIGJ5dGVzLlxuICAgICAgICBwYWNrV2lkdGggKz0gKDQgLSBwYWNrV2lkdGggJSA0KTtcbiAgICAgICAgcGFja0hlaWdodCArPSAoNCAtIHBhY2tIZWlnaHQgJSA0KTtcblxuICAgICAgICBsZXQgcmVjdCA9IHRoaXMuYmluLnBhY2tPbmUocGFja1dpZHRoLCBwYWNrSGVpZ2h0KTtcbiAgICAgICAgaWYgKCFyZWN0KSB7XG4gICAgICAgICAgICB0aGlzLnJlc2l6ZSgpO1xuICAgICAgICAgICAgcmVjdCA9IHRoaXMuYmluLnBhY2tPbmUocGFja1dpZHRoLCBwYWNrSGVpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJlY3QpIHtcbiAgICAgICAgICAgIHV0aWwud2Fybk9uY2UoJ2dseXBoIGJpdG1hcCBvdmVyZmxvdycpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmluZGV4W2tleV0gPSByZWN0O1xuICAgICAgICB0aGlzLmlkc1trZXldID0gW2lkXTtcblxuICAgICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLmRhdGE7XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IGdseXBoLmJpdG1hcDtcbiAgICAgICAgZm9yIChsZXQgeSA9IDA7IHkgPCBidWZmZXJlZEhlaWdodDsgeSsrKSB7XG4gICAgICAgICAgICBjb25zdCB5MSA9IHRoaXMud2lkdGggKiAocmVjdC55ICsgeSArIHBhZGRpbmcpICsgcmVjdC54ICsgcGFkZGluZztcbiAgICAgICAgICAgIGNvbnN0IHkyID0gYnVmZmVyZWRXaWR0aCAqIHk7XG4gICAgICAgICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IGJ1ZmZlcmVkV2lkdGg7IHgrKykge1xuICAgICAgICAgICAgICAgIHRhcmdldFt5MSArIHhdID0gc291cmNlW3kyICsgeF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcblxuICAgICAgICByZXR1cm4gcmVjdDtcbiAgICB9XG5cbiAgICByZXNpemUoKSB7XG4gICAgICAgIGNvbnN0IHByZXZXaWR0aCA9IHRoaXMud2lkdGg7XG4gICAgICAgIGNvbnN0IHByZXZIZWlnaHQgPSB0aGlzLmhlaWdodDtcblxuICAgICAgICBpZiAocHJldldpZHRoID49IE1BWF9TSVpFIHx8IHByZXZIZWlnaHQgPj0gTUFYX1NJWkUpIHJldHVybjtcblxuICAgICAgICBpZiAodGhpcy50ZXh0dXJlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5nbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZ2wuZGVsZXRlVGV4dHVyZSh0aGlzLnRleHR1cmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy50ZXh0dXJlID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMud2lkdGggKj0gU0laRV9HUk9XVEhfUkFURTtcbiAgICAgICAgdGhpcy5oZWlnaHQgKj0gU0laRV9HUk9XVEhfUkFURTtcbiAgICAgICAgdGhpcy5iaW4ucmVzaXplKHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0KTtcblxuICAgICAgICBjb25zdCBidWYgPSBuZXcgQXJyYXlCdWZmZXIodGhpcy53aWR0aCAqIHRoaXMuaGVpZ2h0KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcmV2SGVpZ2h0OyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHNyYyA9IG5ldyBVaW50OEFycmF5KHRoaXMuZGF0YS5idWZmZXIsIHByZXZIZWlnaHQgKiBpLCBwcmV2V2lkdGgpO1xuICAgICAgICAgICAgY29uc3QgZHN0ID0gbmV3IFVpbnQ4QXJyYXkoYnVmLCBwcmV2SGVpZ2h0ICogaSAqIFNJWkVfR1JPV1RIX1JBVEUsIHByZXZXaWR0aCk7XG4gICAgICAgICAgICBkc3Quc2V0KHNyYyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kYXRhID0gbmV3IFVpbnQ4QXJyYXkoYnVmKTtcbiAgICB9XG5cbiAgICBiaW5kKGdsKSB7XG4gICAgICAgIHRoaXMuZ2wgPSBnbDtcbiAgICAgICAgaWYgKCF0aGlzLnRleHR1cmUpIHtcbiAgICAgICAgICAgIHRoaXMudGV4dHVyZSA9IGdsLmNyZWF0ZVRleHR1cmUoKTtcbiAgICAgICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRoaXMudGV4dHVyZSk7XG4gICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgZ2wuTElORUFSKTtcbiAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCBnbC5MSU5FQVIpO1xuICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfUywgZ2wuQ0xBTVBfVE9fRURHRSk7XG4gICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9ULCBnbC5DTEFNUF9UT19FREdFKTtcbiAgICAgICAgICAgIGdsLnRleEltYWdlMkQoZ2wuVEVYVFVSRV8yRCwgMCwgZ2wuQUxQSEEsIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0LCAwLCBnbC5BTFBIQSwgZ2wuVU5TSUdORURfQllURSwgbnVsbCk7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRoaXMudGV4dHVyZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGVUZXh0dXJlKGdsKSB7XG4gICAgICAgIHRoaXMuYmluZChnbCk7XG4gICAgICAgIGlmICh0aGlzLmRpcnR5KSB7XG4gICAgICAgICAgICBnbC50ZXhTdWJJbWFnZTJEKGdsLlRFWFRVUkVfMkQsIDAsIDAsIDAsIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0LCBnbC5BTFBIQSwgZ2wuVU5TSUdORURfQllURSwgdGhpcy5kYXRhKTtcbiAgICAgICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBHbHlwaEF0bGFzO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBub3JtYWxpemVVUkwgPSByZXF1aXJlKCcuLi91dGlsL21hcGJveCcpLm5vcm1hbGl6ZUdseXBoc1VSTDtcbmNvbnN0IGFqYXggPSByZXF1aXJlKCcuLi91dGlsL2FqYXgnKTtcbmNvbnN0IHZlcnRpY2FsaXplUHVuY3R1YXRpb24gPSByZXF1aXJlKCcuLi91dGlsL3ZlcnRpY2FsaXplX3B1bmN0dWF0aW9uJyk7XG5jb25zdCBHbHlwaHMgPSByZXF1aXJlKCcuLi91dGlsL2dseXBocycpO1xuY29uc3QgR2x5cGhBdGxhcyA9IHJlcXVpcmUoJy4uL3N5bWJvbC9nbHlwaF9hdGxhcycpO1xuY29uc3QgUHJvdG9idWYgPSByZXF1aXJlKCdwYmYnKTtcblxuLy8gQSBzaW1wbGlmaWVkIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnbHlwaCBjb250YWluaW5nIG9ubHkgdGhlIHByb3BlcnRpZXMgbmVlZGVkIGZvciBzaGFwaW5nLlxuY2xhc3MgU2ltcGxlR2x5cGgge1xuICAgIGNvbnN0cnVjdG9yKGdseXBoLCByZWN0LCBidWZmZXIpIHtcbiAgICAgICAgY29uc3QgcGFkZGluZyA9IDE7XG4gICAgICAgIHRoaXMuYWR2YW5jZSA9IGdseXBoLmFkdmFuY2U7XG4gICAgICAgIHRoaXMubGVmdCA9IGdseXBoLmxlZnQgLSBidWZmZXIgLSBwYWRkaW5nO1xuICAgICAgICB0aGlzLnRvcCA9IGdseXBoLnRvcCArIGJ1ZmZlciArIHBhZGRpbmc7XG4gICAgICAgIHRoaXMucmVjdCA9IHJlY3Q7XG4gICAgfVxufVxuXG4vKipcbiAqIEEgZ2x5cGggc291cmNlIGhhcyBhIFVSTCBmcm9tIHdoaWNoIHRvIGxvYWQgbmV3IGdseXBocyBhbmQgbWFuYWdlc1xuICogR2x5cGhBdGxhc2VzIGluIHdoaWNoIHRvIHN0b3JlIGdseXBocyB1c2VkIGJ5IHRoZSByZXF1ZXN0ZWQgZm9udHN0YWNrc1xuICogYW5kIHJhbmdlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBHbHlwaFNvdXJjZSB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBnbHlwaCB0ZW1wbGF0ZSB1cmxcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih1cmwpIHtcbiAgICAgICAgdGhpcy51cmwgPSB1cmwgJiYgbm9ybWFsaXplVVJMKHVybCk7XG4gICAgICAgIHRoaXMuYXRsYXNlcyA9IHt9O1xuICAgICAgICB0aGlzLnN0YWNrcyA9IHt9O1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSB7fTtcbiAgICB9XG5cbiAgICBnZXRTaW1wbGVHbHlwaHMoZm9udHN0YWNrLCBnbHlwaElEcywgdWlkLCBjYWxsYmFjaykge1xuICAgICAgICBpZiAodGhpcy5zdGFja3NbZm9udHN0YWNrXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLnN0YWNrc1tmb250c3RhY2tdID0ge307XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuYXRsYXNlc1tmb250c3RhY2tdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuYXRsYXNlc1tmb250c3RhY2tdID0gbmV3IEdseXBoQXRsYXMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGdseXBocyA9IHt9O1xuICAgICAgICBjb25zdCBzdGFjayA9IHRoaXMuc3RhY2tzW2ZvbnRzdGFja107XG4gICAgICAgIGNvbnN0IGF0bGFzID0gdGhpcy5hdGxhc2VzW2ZvbnRzdGFja107XG5cbiAgICAgICAgLy8gdGhlIG51bWJlciBvZiBwaXhlbHMgdGhlIHNkZiBiaXRtYXBzIGFyZSBwYWRkZWQgYnlcbiAgICAgICAgY29uc3QgYnVmZmVyID0gMztcblxuICAgICAgICBjb25zdCBtaXNzaW5nID0ge307XG4gICAgICAgIGxldCByZW1haW5pbmcgPSAwO1xuXG4gICAgICAgIGNvbnN0IGdldEdseXBoID0gKGdseXBoSUQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gTWF0aC5mbG9vcihnbHlwaElEIC8gMjU2KTtcblxuICAgICAgICAgICAgaWYgKHN0YWNrW3JhbmdlXSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGdseXBoID0gc3RhY2tbcmFuZ2VdLmdseXBoc1tnbHlwaElEXTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWN0ICA9IGF0bGFzLmFkZEdseXBoKHVpZCwgZm9udHN0YWNrLCBnbHlwaCwgYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBpZiAoZ2x5cGgpIGdseXBoc1tnbHlwaElEXSA9IG5ldyBTaW1wbGVHbHlwaChnbHlwaCwgcmVjdCwgYnVmZmVyKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKG1pc3NpbmdbcmFuZ2VdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbWlzc2luZ1tyYW5nZV0gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG1pc3NpbmdbcmFuZ2VdLnB1c2goZ2x5cGhJRCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBnbHlwaElEcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgZ2x5cGhJRCA9IGdseXBoSURzW2ldO1xuICAgICAgICAgICAgY29uc3Qgc3RyaW5nID0gU3RyaW5nLmZyb21DaGFyQ29kZShnbHlwaElEKTtcbiAgICAgICAgICAgIGdldEdseXBoKGdseXBoSUQpO1xuICAgICAgICAgICAgaWYgKHZlcnRpY2FsaXplUHVuY3R1YXRpb24ubG9va3VwW3N0cmluZ10pIHtcbiAgICAgICAgICAgICAgICBnZXRHbHlwaCh2ZXJ0aWNhbGl6ZVB1bmN0dWF0aW9uLmxvb2t1cFtzdHJpbmddLmNoYXJDb2RlQXQoMCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFyZW1haW5pbmcpIGNhbGxiYWNrKHVuZGVmaW5lZCwgZ2x5cGhzLCBmb250c3RhY2spO1xuXG4gICAgICAgIGNvbnN0IG9uUmFuZ2VMb2FkZWQgPSAoZXJyLCByYW5nZSwgZGF0YSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFlcnIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFjayA9IHRoaXMuc3RhY2tzW2ZvbnRzdGFja11bcmFuZ2VdID0gZGF0YS5zdGFja3NbMF07XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtaXNzaW5nW3JhbmdlXS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBnbHlwaElEID0gbWlzc2luZ1tyYW5nZV1baV07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGdseXBoID0gc3RhY2suZ2x5cGhzW2dseXBoSURdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWN0ICA9IGF0bGFzLmFkZEdseXBoKHVpZCwgZm9udHN0YWNrLCBnbHlwaCwgYnVmZmVyKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGdseXBoKSBnbHlwaHNbZ2x5cGhJRF0gPSBuZXcgU2ltcGxlR2x5cGgoZ2x5cGgsIHJlY3QsIGJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVtYWluaW5nLS07XG4gICAgICAgICAgICBpZiAoIXJlbWFpbmluZykgY2FsbGJhY2sodW5kZWZpbmVkLCBnbHlwaHMsIGZvbnRzdGFjayk7XG4gICAgICAgIH07XG5cbiAgICAgICAgZm9yIChjb25zdCByIGluIG1pc3NpbmcpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZFJhbmdlKGZvbnRzdGFjaywgciwgb25SYW5nZUxvYWRlZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBsb2FkUmFuZ2UoZm9udHN0YWNrLCByYW5nZSwgY2FsbGJhY2spIHtcbiAgICAgICAgaWYgKHJhbmdlICogMjU2ID4gNjU1MzUpIHJldHVybiBjYWxsYmFjaygnZ2x5cGhzID4gNjU1MzUgbm90IHN1cHBvcnRlZCcpO1xuXG4gICAgICAgIGlmICh0aGlzLmxvYWRpbmdbZm9udHN0YWNrXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdbZm9udHN0YWNrXSA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxvYWRpbmcgPSB0aGlzLmxvYWRpbmdbZm9udHN0YWNrXTtcblxuICAgICAgICBpZiAobG9hZGluZ1tyYW5nZV0pIHtcbiAgICAgICAgICAgIGxvYWRpbmdbcmFuZ2VdLnB1c2goY2FsbGJhY2spO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG9hZGluZ1tyYW5nZV0gPSBbY2FsbGJhY2tdO1xuXG4gICAgICAgICAgICBjb25zdCByYW5nZU5hbWUgPSBgJHtyYW5nZSAqIDI1Nn0tJHtyYW5nZSAqIDI1NiArIDI1NX1gO1xuICAgICAgICAgICAgY29uc3QgdXJsID0gZ2x5cGhVcmwoZm9udHN0YWNrLCByYW5nZU5hbWUsIHRoaXMudXJsKTtcblxuICAgICAgICAgICAgYWpheC5nZXRBcnJheUJ1ZmZlcih1cmwsIChlcnIsIHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZ2x5cGhzID0gIWVyciAmJiBuZXcgR2x5cGhzKG5ldyBQcm90b2J1ZihyZXNwb25zZS5kYXRhKSk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb2FkaW5nW3JhbmdlXS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBsb2FkaW5nW3JhbmdlXVtpXShlcnIsIHJhbmdlLCBnbHlwaHMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkZWxldGUgbG9hZGluZ1tyYW5nZV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldEdseXBoQXRsYXMoZm9udHN0YWNrKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmF0bGFzZXNbZm9udHN0YWNrXTtcbiAgICB9XG59XG5cbi8qKlxuICogVXNlIENOQU1FIHNoYXJkaW5nIHRvIGxvYWQgYSBzcGVjaWZpYyBnbHlwaCByYW5nZSBvdmVyIGEgcmFuZG9taXplZFxuICogYnV0IGNvbnNpc3RlbnQgc3ViZG9tYWluLlxuICogQHBhcmFtIHtzdHJpbmd9IGZvbnRzdGFjayBjb21tYS1qb2luZWQgZm9udHNcbiAqIEBwYXJhbSB7c3RyaW5nfSByYW5nZSBjb21tYS1qb2luZWQgcmFuZ2VcbiAqIEBwYXJhbSB7dXJsfSB1cmwgdGVtcGxhdGVkIHVybFxuICogQHBhcmFtIHtzdHJpbmd9IFtzdWJkb21haW5zPWFiY10gc3ViZG9tYWlucyBhcyBhIHN0cmluZyB3aGVyZSBlYWNoIGxldHRlciBpcyBvbmUuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBhIHVybCB0byBsb2FkIHRoYXQgc2VjdGlvbiBvZiBnbHlwaHNcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGdseXBoVXJsKGZvbnRzdGFjaywgcmFuZ2UsIHVybCwgc3ViZG9tYWlucykge1xuICAgIHN1YmRvbWFpbnMgPSBzdWJkb21haW5zIHx8ICdhYmMnO1xuXG4gICAgcmV0dXJuIHVybFxuICAgICAgICAucmVwbGFjZSgne3N9Jywgc3ViZG9tYWluc1tmb250c3RhY2subGVuZ3RoICUgc3ViZG9tYWlucy5sZW5ndGhdKVxuICAgICAgICAucmVwbGFjZSgne2ZvbnRzdGFja30nLCBmb250c3RhY2spXG4gICAgICAgIC5yZXBsYWNlKCd7cmFuZ2V9JywgcmFuZ2UpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IEdseXBoU291cmNlO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChmZWF0dXJlcykge1xuICAgIGNvbnN0IGxlZnRJbmRleCA9IHt9O1xuICAgIGNvbnN0IHJpZ2h0SW5kZXggPSB7fTtcbiAgICBjb25zdCBtZXJnZWRGZWF0dXJlcyA9IFtdO1xuICAgIGxldCBtZXJnZWRJbmRleCA9IDA7XG5cbiAgICBmdW5jdGlvbiBhZGQoaykge1xuICAgICAgICBtZXJnZWRGZWF0dXJlcy5wdXNoKGZlYXR1cmVzW2tdKTtcbiAgICAgICAgbWVyZ2VkSW5kZXgrKztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtZXJnZUZyb21SaWdodChsZWZ0S2V5LCByaWdodEtleSwgZ2VvbSkge1xuICAgICAgICBjb25zdCBpID0gcmlnaHRJbmRleFtsZWZ0S2V5XTtcbiAgICAgICAgZGVsZXRlIHJpZ2h0SW5kZXhbbGVmdEtleV07XG4gICAgICAgIHJpZ2h0SW5kZXhbcmlnaHRLZXldID0gaTtcblxuICAgICAgICBtZXJnZWRGZWF0dXJlc1tpXS5nZW9tZXRyeVswXS5wb3AoKTtcbiAgICAgICAgbWVyZ2VkRmVhdHVyZXNbaV0uZ2VvbWV0cnlbMF0gPSBtZXJnZWRGZWF0dXJlc1tpXS5nZW9tZXRyeVswXS5jb25jYXQoZ2VvbVswXSk7XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1lcmdlRnJvbUxlZnQobGVmdEtleSwgcmlnaHRLZXksIGdlb20pIHtcbiAgICAgICAgY29uc3QgaSA9IGxlZnRJbmRleFtyaWdodEtleV07XG4gICAgICAgIGRlbGV0ZSBsZWZ0SW5kZXhbcmlnaHRLZXldO1xuICAgICAgICBsZWZ0SW5kZXhbbGVmdEtleV0gPSBpO1xuXG4gICAgICAgIG1lcmdlZEZlYXR1cmVzW2ldLmdlb21ldHJ5WzBdLnNoaWZ0KCk7XG4gICAgICAgIG1lcmdlZEZlYXR1cmVzW2ldLmdlb21ldHJ5WzBdID0gZ2VvbVswXS5jb25jYXQobWVyZ2VkRmVhdHVyZXNbaV0uZ2VvbWV0cnlbMF0pO1xuICAgICAgICByZXR1cm4gaTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRLZXkodGV4dCwgZ2VvbSwgb25SaWdodCkge1xuICAgICAgICBjb25zdCBwb2ludCA9IG9uUmlnaHQgPyBnZW9tWzBdW2dlb21bMF0ubGVuZ3RoIC0gMV0gOiBnZW9tWzBdWzBdO1xuICAgICAgICByZXR1cm4gYCR7dGV4dH06JHtwb2ludC54fToke3BvaW50Lnl9YDtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBrID0gMDsgayA8IGZlYXR1cmVzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgIGNvbnN0IGZlYXR1cmUgPSBmZWF0dXJlc1trXTtcbiAgICAgICAgY29uc3QgZ2VvbSA9IGZlYXR1cmUuZ2VvbWV0cnk7XG4gICAgICAgIGNvbnN0IHRleHQgPSBmZWF0dXJlLnRleHQ7XG5cbiAgICAgICAgaWYgKCF0ZXh0KSB7XG4gICAgICAgICAgICBhZGQoayk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxlZnRLZXkgPSBnZXRLZXkodGV4dCwgZ2VvbSksXG4gICAgICAgICAgICByaWdodEtleSA9IGdldEtleSh0ZXh0LCBnZW9tLCB0cnVlKTtcblxuICAgICAgICBpZiAoKGxlZnRLZXkgaW4gcmlnaHRJbmRleCkgJiYgKHJpZ2h0S2V5IGluIGxlZnRJbmRleCkgJiYgKHJpZ2h0SW5kZXhbbGVmdEtleV0gIT09IGxlZnRJbmRleFtyaWdodEtleV0pKSB7XG4gICAgICAgICAgICAvLyBmb3VuZCBsaW5lcyB3aXRoIHRoZSBzYW1lIHRleHQgYWRqYWNlbnQgdG8gYm90aCBlbmRzIG9mIHRoZSBjdXJyZW50IGxpbmUsIG1lcmdlIGFsbCB0aHJlZVxuICAgICAgICAgICAgY29uc3QgaiA9IG1lcmdlRnJvbUxlZnQobGVmdEtleSwgcmlnaHRLZXksIGdlb20pO1xuICAgICAgICAgICAgY29uc3QgaSA9IG1lcmdlRnJvbVJpZ2h0KGxlZnRLZXksIHJpZ2h0S2V5LCBtZXJnZWRGZWF0dXJlc1tqXS5nZW9tZXRyeSk7XG5cbiAgICAgICAgICAgIGRlbGV0ZSBsZWZ0SW5kZXhbbGVmdEtleV07XG4gICAgICAgICAgICBkZWxldGUgcmlnaHRJbmRleFtyaWdodEtleV07XG5cbiAgICAgICAgICAgIHJpZ2h0SW5kZXhbZ2V0S2V5KHRleHQsIG1lcmdlZEZlYXR1cmVzW2ldLmdlb21ldHJ5LCB0cnVlKV0gPSBpO1xuICAgICAgICAgICAgbWVyZ2VkRmVhdHVyZXNbal0uZ2VvbWV0cnkgPSBudWxsO1xuXG4gICAgICAgIH0gZWxzZSBpZiAobGVmdEtleSBpbiByaWdodEluZGV4KSB7XG4gICAgICAgICAgICAvLyBmb3VuZCBtZXJnZWFibGUgbGluZSBhZGphY2VudCB0byB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgbGluZSwgbWVyZ2VcbiAgICAgICAgICAgIG1lcmdlRnJvbVJpZ2h0KGxlZnRLZXksIHJpZ2h0S2V5LCBnZW9tKTtcblxuICAgICAgICB9IGVsc2UgaWYgKHJpZ2h0S2V5IGluIGxlZnRJbmRleCkge1xuICAgICAgICAgICAgLy8gZm91bmQgbWVyZ2VhYmxlIGxpbmUgYWRqYWNlbnQgdG8gdGhlIGVuZCBvZiB0aGUgY3VycmVudCBsaW5lLCBtZXJnZVxuICAgICAgICAgICAgbWVyZ2VGcm9tTGVmdChsZWZ0S2V5LCByaWdodEtleSwgZ2VvbSk7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIG5vIGFkamFjZW50IGxpbmVzLCBhZGQgYXMgYSBuZXcgaXRlbVxuICAgICAgICAgICAgYWRkKGspO1xuICAgICAgICAgICAgbGVmdEluZGV4W2xlZnRLZXldID0gbWVyZ2VkSW5kZXggLSAxO1xuICAgICAgICAgICAgcmlnaHRJbmRleFtyaWdodEtleV0gPSBtZXJnZWRJbmRleCAtIDE7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbWVyZ2VkRmVhdHVyZXMuZmlsdGVyKChmKSA9PiBmLmdlb21ldHJ5KTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IFBvaW50ID0gcmVxdWlyZSgncG9pbnQtZ2VvbWV0cnknKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgZ2V0SWNvblF1YWRzOiBnZXRJY29uUXVhZHMsXG4gICAgZ2V0R2x5cGhRdWFkczogZ2V0R2x5cGhRdWFkcyxcbiAgICBTeW1ib2xRdWFkOiBTeW1ib2xRdWFkXG59O1xuXG5jb25zdCBtaW5TY2FsZSA9IDAuNTsgLy8gdW5kZXJzY2FsZSBieSAxIHpvb20gbGV2ZWxcblxuLyoqXG4gKiBBIHRleHR1cmVkIHF1YWQgZm9yIHJlbmRlcmluZyBhIHNpbmdsZSBpY29uIG9yIGdseXBoLlxuICpcbiAqIFRoZSB6b29tIHJhbmdlIHRoZSBnbHlwaCBjYW4gYmUgc2hvd24gaXMgZGVmaW5lZCBieSBtaW5TY2FsZSBhbmQgbWF4U2NhbGUuXG4gKlxuICogQHBhcmFtIHtQb2ludH0gYW5jaG9yUG9pbnQgdGhlIHBvaW50IHRoZSBzeW1ib2wgaXMgYW5jaG9yZWQgYXJvdW5kXG4gKiBAcGFyYW0ge1BvaW50fSB0bCBUaGUgb2Zmc2V0IG9mIHRoZSB0b3AgbGVmdCBjb3JuZXIgZnJvbSB0aGUgYW5jaG9yLlxuICogQHBhcmFtIHtQb2ludH0gdHIgVGhlIG9mZnNldCBvZiB0aGUgdG9wIHJpZ2h0IGNvcm5lciBmcm9tIHRoZSBhbmNob3IuXG4gKiBAcGFyYW0ge1BvaW50fSBibCBUaGUgb2Zmc2V0IG9mIHRoZSBib3R0b20gbGVmdCBjb3JuZXIgZnJvbSB0aGUgYW5jaG9yLlxuICogQHBhcmFtIHtQb2ludH0gYnIgVGhlIG9mZnNldCBvZiB0aGUgYm90dG9tIHJpZ2h0IGNvcm5lciBmcm9tIHRoZSBhbmNob3IuXG4gKiBAcGFyYW0ge09iamVjdH0gdGV4IFRoZSB0ZXh0dXJlIGNvb3JkaW5hdGVzLlxuICogQHBhcmFtIHtudW1iZXJ9IGFuY2hvckFuZ2xlIFRoZSBhbmdsZSBvZiB0aGUgbGFiZWwgYXQgaXQncyBjZW50ZXIsIG5vdCB0aGUgYW5nbGUgb2YgdGhpcyBxdWFkLlxuICogQHBhcmFtIHtudW1iZXJ9IGdseXBoQW5nbGUgVGhlIGFuZ2xlIG9mIHRoZSBnbHlwaCB0byBiZSBwb3NpdGlvbmVkIGluIHRoZSBxdWFkLlxuICogQHBhcmFtIHtudW1iZXJ9IG1pblNjYWxlIFRoZSBtaW5pbXVtIHNjYWxlLCByZWxhdGl2ZSB0byB0aGUgdGlsZSdzIGludGVuZGVkIHNjYWxlLCB0aGF0IHRoZSBnbHlwaCBjYW4gYmUgc2hvd24gYXQuXG4gKiBAcGFyYW0ge251bWJlcn0gbWF4U2NhbGUgVGhlIG1heGltdW0gc2NhbGUsIHJlbGF0aXZlIHRvIHRoZSB0aWxlJ3MgaW50ZW5kZWQgc2NhbGUsIHRoYXQgdGhlIGdseXBoIGNhbiBiZSBzaG93biBhdC5cbiAqXG4gKiBAY2xhc3MgU3ltYm9sUXVhZFxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gU3ltYm9sUXVhZChhbmNob3JQb2ludCwgdGwsIHRyLCBibCwgYnIsIHRleCwgYW5jaG9yQW5nbGUsIGdseXBoQW5nbGUsIG1pblNjYWxlLCBtYXhTY2FsZSwgd3JpdGluZ01vZGUpIHtcbiAgICB0aGlzLmFuY2hvclBvaW50ID0gYW5jaG9yUG9pbnQ7XG4gICAgdGhpcy50bCA9IHRsO1xuICAgIHRoaXMudHIgPSB0cjtcbiAgICB0aGlzLmJsID0gYmw7XG4gICAgdGhpcy5iciA9IGJyO1xuICAgIHRoaXMudGV4ID0gdGV4O1xuICAgIHRoaXMuYW5jaG9yQW5nbGUgPSBhbmNob3JBbmdsZTtcbiAgICB0aGlzLmdseXBoQW5nbGUgPSBnbHlwaEFuZ2xlO1xuICAgIHRoaXMubWluU2NhbGUgPSBtaW5TY2FsZTtcbiAgICB0aGlzLm1heFNjYWxlID0gbWF4U2NhbGU7XG4gICAgdGhpcy53cml0aW5nTW9kZSA9IHdyaXRpbmdNb2RlO1xufVxuXG4vKipcbiAqIENyZWF0ZSB0aGUgcXVhZHMgdXNlZCBmb3IgcmVuZGVyaW5nIGFuIGljb24uXG4gKlxuICogQHBhcmFtIHtBbmNob3J9IGFuY2hvclxuICogQHBhcmFtIHtQb3NpdGlvbmVkSWNvbn0gc2hhcGVkSWNvblxuICogQHBhcmFtIHtudW1iZXJ9IGJveFNjYWxlIEEgbWFnaWMgbnVtYmVyIGZvciBjb252ZXJ0aW5nIGdseXBoIG1ldHJpYyB1bml0cyB0byBnZW9tZXRyeSB1bml0cy5cbiAqIEBwYXJhbSB7QXJyYXk8QXJyYXk8UG9pbnQ+Pn0gbGluZVxuICogQHBhcmFtIHtTdHlsZUxheWVyfSBsYXllclxuICogQHBhcmFtIHtib29sZWFufSBhbG9uZ0xpbmUgV2hldGhlciB0aGUgaWNvbiBzaG91bGQgYmUgcGxhY2VkIGFsb25nIHRoZSBsaW5lLlxuICogQHBhcmFtIHtTaGFwaW5nfSBzaGFwZWRUZXh0IFNoYXBpbmcgZm9yIGNvcnJlc3BvbmRpbmcgdGV4dFxuICogQHJldHVybnMge0FycmF5PFN5bWJvbFF1YWQ+fVxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZ2V0SWNvblF1YWRzKGFuY2hvciwgc2hhcGVkSWNvbiwgYm94U2NhbGUsIGxpbmUsIGxheWVyLCBhbG9uZ0xpbmUsIHNoYXBlZFRleHQsIGdsb2JhbFByb3BlcnRpZXMsIGZlYXR1cmVQcm9wZXJ0aWVzKSB7XG4gICAgY29uc3QgcmVjdCA9IHNoYXBlZEljb24uaW1hZ2UucmVjdDtcbiAgICBjb25zdCBsYXlvdXQgPSBsYXllci5sYXlvdXQ7XG5cbiAgICBjb25zdCBib3JkZXIgPSAxO1xuICAgIGNvbnN0IGxlZnQgPSBzaGFwZWRJY29uLmxlZnQgLSBib3JkZXI7XG4gICAgY29uc3QgcmlnaHQgPSBsZWZ0ICsgcmVjdC53IC8gc2hhcGVkSWNvbi5pbWFnZS5waXhlbFJhdGlvO1xuICAgIGNvbnN0IHRvcCA9IHNoYXBlZEljb24udG9wIC0gYm9yZGVyO1xuICAgIGNvbnN0IGJvdHRvbSA9IHRvcCArIHJlY3QuaCAvIHNoYXBlZEljb24uaW1hZ2UucGl4ZWxSYXRpbztcbiAgICBsZXQgdGwsIHRyLCBiciwgYmw7XG5cbiAgICAvLyB0ZXh0LWZpdCBtb2RlXG4gICAgaWYgKGxheW91dFsnaWNvbi10ZXh0LWZpdCddICE9PSAnbm9uZScgJiYgc2hhcGVkVGV4dCkge1xuICAgICAgICBjb25zdCBpY29uV2lkdGggPSAocmlnaHQgLSBsZWZ0KSxcbiAgICAgICAgICAgIGljb25IZWlnaHQgPSAoYm90dG9tIC0gdG9wKSxcbiAgICAgICAgICAgIHNpemUgPSBsYXlvdXRbJ3RleHQtc2l6ZSddIC8gMjQsXG4gICAgICAgICAgICB0ZXh0TGVmdCA9IHNoYXBlZFRleHQubGVmdCAqIHNpemUsXG4gICAgICAgICAgICB0ZXh0UmlnaHQgPSBzaGFwZWRUZXh0LnJpZ2h0ICogc2l6ZSxcbiAgICAgICAgICAgIHRleHRUb3AgPSBzaGFwZWRUZXh0LnRvcCAqIHNpemUsXG4gICAgICAgICAgICB0ZXh0Qm90dG9tID0gc2hhcGVkVGV4dC5ib3R0b20gKiBzaXplLFxuICAgICAgICAgICAgdGV4dFdpZHRoID0gdGV4dFJpZ2h0IC0gdGV4dExlZnQsXG4gICAgICAgICAgICB0ZXh0SGVpZ2h0ID0gdGV4dEJvdHRvbSAtIHRleHRUb3AsXG4gICAgICAgICAgICBwYWRUID0gbGF5b3V0WydpY29uLXRleHQtZml0LXBhZGRpbmcnXVswXSxcbiAgICAgICAgICAgIHBhZFIgPSBsYXlvdXRbJ2ljb24tdGV4dC1maXQtcGFkZGluZyddWzFdLFxuICAgICAgICAgICAgcGFkQiA9IGxheW91dFsnaWNvbi10ZXh0LWZpdC1wYWRkaW5nJ11bMl0sXG4gICAgICAgICAgICBwYWRMID0gbGF5b3V0WydpY29uLXRleHQtZml0LXBhZGRpbmcnXVszXSxcbiAgICAgICAgICAgIG9mZnNldFkgPSBsYXlvdXRbJ2ljb24tdGV4dC1maXQnXSA9PT0gJ3dpZHRoJyA/ICh0ZXh0SGVpZ2h0IC0gaWNvbkhlaWdodCkgKiAwLjUgOiAwLFxuICAgICAgICAgICAgb2Zmc2V0WCA9IGxheW91dFsnaWNvbi10ZXh0LWZpdCddID09PSAnaGVpZ2h0JyA/ICh0ZXh0V2lkdGggLSBpY29uV2lkdGgpICogMC41IDogMCxcbiAgICAgICAgICAgIHdpZHRoID0gbGF5b3V0WydpY29uLXRleHQtZml0J10gPT09ICd3aWR0aCcgfHwgbGF5b3V0WydpY29uLXRleHQtZml0J10gPT09ICdib3RoJyA/IHRleHRXaWR0aCA6IGljb25XaWR0aCxcbiAgICAgICAgICAgIGhlaWdodCA9IGxheW91dFsnaWNvbi10ZXh0LWZpdCddID09PSAnaGVpZ2h0JyB8fCBsYXlvdXRbJ2ljb24tdGV4dC1maXQnXSA9PT0gJ2JvdGgnID8gdGV4dEhlaWdodCA6IGljb25IZWlnaHQ7XG4gICAgICAgIHRsID0gbmV3IFBvaW50KHRleHRMZWZ0ICsgb2Zmc2V0WCAtIHBhZEwsICAgICAgICAgdGV4dFRvcCArIG9mZnNldFkgLSBwYWRUKTtcbiAgICAgICAgdHIgPSBuZXcgUG9pbnQodGV4dExlZnQgKyBvZmZzZXRYICsgcGFkUiArIHdpZHRoLCB0ZXh0VG9wICsgb2Zmc2V0WSAtIHBhZFQpO1xuICAgICAgICBiciA9IG5ldyBQb2ludCh0ZXh0TGVmdCArIG9mZnNldFggKyBwYWRSICsgd2lkdGgsIHRleHRUb3AgKyBvZmZzZXRZICsgcGFkQiArIGhlaWdodCk7XG4gICAgICAgIGJsID0gbmV3IFBvaW50KHRleHRMZWZ0ICsgb2Zmc2V0WCAtIHBhZEwsICAgICAgICAgdGV4dFRvcCArIG9mZnNldFkgKyBwYWRCICsgaGVpZ2h0KTtcbiAgICAvLyBOb3JtYWwgaWNvbiBzaXplIG1vZGVcbiAgICB9IGVsc2Uge1xuICAgICAgICB0bCA9IG5ldyBQb2ludChsZWZ0LCB0b3ApO1xuICAgICAgICB0ciA9IG5ldyBQb2ludChyaWdodCwgdG9wKTtcbiAgICAgICAgYnIgPSBuZXcgUG9pbnQocmlnaHQsIGJvdHRvbSk7XG4gICAgICAgIGJsID0gbmV3IFBvaW50KGxlZnQsIGJvdHRvbSk7XG4gICAgfVxuXG4gICAgbGV0IGFuZ2xlID0gbGF5ZXIuZ2V0TGF5b3V0VmFsdWUoJ2ljb24tcm90YXRlJywgZ2xvYmFsUHJvcGVydGllcywgZmVhdHVyZVByb3BlcnRpZXMpICogTWF0aC5QSSAvIDE4MDtcbiAgICBpZiAoYWxvbmdMaW5lKSB7XG4gICAgICAgIGNvbnN0IHByZXYgPSBsaW5lW2FuY2hvci5zZWdtZW50XTtcbiAgICAgICAgaWYgKGFuY2hvci55ID09PSBwcmV2LnkgJiYgYW5jaG9yLnggPT09IHByZXYueCAmJiBhbmNob3Iuc2VnbWVudCArIDEgPCBsaW5lLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgbmV4dCA9IGxpbmVbYW5jaG9yLnNlZ21lbnQgKyAxXTtcbiAgICAgICAgICAgIGFuZ2xlICs9IE1hdGguYXRhbjIoYW5jaG9yLnkgLSBuZXh0LnksIGFuY2hvci54IC0gbmV4dC54KSArIE1hdGguUEk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhbmdsZSArPSBNYXRoLmF0YW4yKGFuY2hvci55IC0gcHJldi55LCBhbmNob3IueCAtIHByZXYueCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoYW5nbGUpIHtcbiAgICAgICAgY29uc3Qgc2luID0gTWF0aC5zaW4oYW5nbGUpLFxuICAgICAgICAgICAgY29zID0gTWF0aC5jb3MoYW5nbGUpLFxuICAgICAgICAgICAgbWF0cml4ID0gW2NvcywgLXNpbiwgc2luLCBjb3NdO1xuXG4gICAgICAgIHRsID0gdGwubWF0TXVsdChtYXRyaXgpO1xuICAgICAgICB0ciA9IHRyLm1hdE11bHQobWF0cml4KTtcbiAgICAgICAgYmwgPSBibC5tYXRNdWx0KG1hdHJpeCk7XG4gICAgICAgIGJyID0gYnIubWF0TXVsdChtYXRyaXgpO1xuICAgIH1cblxuICAgIHJldHVybiBbbmV3IFN5bWJvbFF1YWQobmV3IFBvaW50KGFuY2hvci54LCBhbmNob3IueSksIHRsLCB0ciwgYmwsIGJyLCBzaGFwZWRJY29uLmltYWdlLnJlY3QsIDAsIDAsIG1pblNjYWxlLCBJbmZpbml0eSldO1xufVxuXG4vKipcbiAqIENyZWF0ZSB0aGUgcXVhZHMgdXNlZCBmb3IgcmVuZGVyaW5nIGEgdGV4dCBsYWJlbC5cbiAqXG4gKiBAcGFyYW0ge0FuY2hvcn0gYW5jaG9yXG4gKiBAcGFyYW0ge1NoYXBpbmd9IHNoYXBpbmdcbiAqIEBwYXJhbSB7bnVtYmVyfSBib3hTY2FsZSBBIG1hZ2ljIG51bWJlciBmb3IgY29udmVydGluZyBmcm9tIGdseXBoIG1ldHJpYyB1bml0cyB0byBnZW9tZXRyeSB1bml0cy5cbiAqIEBwYXJhbSB7QXJyYXk8QXJyYXk8UG9pbnQ+Pn0gbGluZVxuICogQHBhcmFtIHtTdHlsZUxheWVyfSBsYXllclxuICogQHBhcmFtIHtib29sZWFufSBhbG9uZ0xpbmUgV2hldGhlciB0aGUgbGFiZWwgc2hvdWxkIGJlIHBsYWNlZCBhbG9uZyB0aGUgbGluZS5cbiAqIEByZXR1cm5zIHtBcnJheTxTeW1ib2xRdWFkPn1cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGdldEdseXBoUXVhZHMoYW5jaG9yLCBzaGFwaW5nLCBib3hTY2FsZSwgbGluZSwgbGF5ZXIsIGFsb25nTGluZSkge1xuXG4gICAgY29uc3QgdGV4dFJvdGF0ZSA9IGxheWVyLmxheW91dFsndGV4dC1yb3RhdGUnXSAqIE1hdGguUEkgLyAxODA7XG4gICAgY29uc3Qga2VlcFVwcmlnaHQgPSBsYXllci5sYXlvdXRbJ3RleHQta2VlcC11cHJpZ2h0J107XG5cbiAgICBjb25zdCBwb3NpdGlvbmVkR2x5cGhzID0gc2hhcGluZy5wb3NpdGlvbmVkR2x5cGhzO1xuICAgIGNvbnN0IHF1YWRzID0gW107XG5cbiAgICBmb3IgKGxldCBrID0gMDsgayA8IHBvc2l0aW9uZWRHbHlwaHMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgY29uc3QgcG9zaXRpb25lZEdseXBoID0gcG9zaXRpb25lZEdseXBoc1trXTtcbiAgICAgICAgY29uc3QgZ2x5cGggPSBwb3NpdGlvbmVkR2x5cGguZ2x5cGg7XG4gICAgICAgIGlmICghZ2x5cGgpIGNvbnRpbnVlO1xuXG4gICAgICAgIGNvbnN0IHJlY3QgPSBnbHlwaC5yZWN0O1xuICAgICAgICBpZiAoIXJlY3QpIGNvbnRpbnVlO1xuXG4gICAgICAgIGNvbnN0IGNlbnRlclggPSAocG9zaXRpb25lZEdseXBoLnggKyBnbHlwaC5hZHZhbmNlIC8gMikgKiBib3hTY2FsZTtcblxuICAgICAgICBsZXQgZ2x5cGhJbnN0YW5jZXM7XG4gICAgICAgIGxldCBsYWJlbE1pblNjYWxlID0gbWluU2NhbGU7XG4gICAgICAgIGlmIChhbG9uZ0xpbmUpIHtcbiAgICAgICAgICAgIGdseXBoSW5zdGFuY2VzID0gW107XG4gICAgICAgICAgICBsYWJlbE1pblNjYWxlID0gZ2V0U2VnbWVudEdseXBocyhnbHlwaEluc3RhbmNlcywgYW5jaG9yLCBjZW50ZXJYLCBsaW5lLCBhbmNob3Iuc2VnbWVudCwgdHJ1ZSk7XG4gICAgICAgICAgICBpZiAoa2VlcFVwcmlnaHQpIHtcbiAgICAgICAgICAgICAgICBsYWJlbE1pblNjYWxlID0gTWF0aC5taW4obGFiZWxNaW5TY2FsZSwgZ2V0U2VnbWVudEdseXBocyhnbHlwaEluc3RhbmNlcywgYW5jaG9yLCBjZW50ZXJYLCBsaW5lLCBhbmNob3Iuc2VnbWVudCwgZmFsc2UpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZ2x5cGhJbnN0YW5jZXMgPSBbe1xuICAgICAgICAgICAgICAgIGFuY2hvclBvaW50OiBuZXcgUG9pbnQoYW5jaG9yLngsIGFuY2hvci55KSxcbiAgICAgICAgICAgICAgICBvZmZzZXQ6IDAsXG4gICAgICAgICAgICAgICAgYW5nbGU6IDAsXG4gICAgICAgICAgICAgICAgbWF4U2NhbGU6IEluZmluaXR5LFxuICAgICAgICAgICAgICAgIG1pblNjYWxlOiBtaW5TY2FsZVxuICAgICAgICAgICAgfV07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB4MSA9IHBvc2l0aW9uZWRHbHlwaC54ICsgZ2x5cGgubGVmdDtcbiAgICAgICAgY29uc3QgeTEgPSBwb3NpdGlvbmVkR2x5cGgueSAtIGdseXBoLnRvcDtcbiAgICAgICAgY29uc3QgeDIgPSB4MSArIHJlY3QudztcbiAgICAgICAgY29uc3QgeTIgPSB5MSArIHJlY3QuaDtcblxuICAgICAgICBjb25zdCBjZW50ZXIgPSBuZXcgUG9pbnQocG9zaXRpb25lZEdseXBoLngsIGdseXBoLmFkdmFuY2UgLyAyKTtcblxuICAgICAgICBjb25zdCBvdGwgPSBuZXcgUG9pbnQoeDEsIHkxKTtcbiAgICAgICAgY29uc3Qgb3RyID0gbmV3IFBvaW50KHgyLCB5MSk7XG4gICAgICAgIGNvbnN0IG9ibCA9IG5ldyBQb2ludCh4MSwgeTIpO1xuICAgICAgICBjb25zdCBvYnIgPSBuZXcgUG9pbnQoeDIsIHkyKTtcblxuICAgICAgICBpZiAocG9zaXRpb25lZEdseXBoLmFuZ2xlICE9PSAwKSB7XG4gICAgICAgICAgICBvdGwuX3N1YihjZW50ZXIpLl9yb3RhdGUocG9zaXRpb25lZEdseXBoLmFuZ2xlKS5fYWRkKGNlbnRlcik7XG4gICAgICAgICAgICBvdHIuX3N1YihjZW50ZXIpLl9yb3RhdGUocG9zaXRpb25lZEdseXBoLmFuZ2xlKS5fYWRkKGNlbnRlcik7XG4gICAgICAgICAgICBvYmwuX3N1YihjZW50ZXIpLl9yb3RhdGUocG9zaXRpb25lZEdseXBoLmFuZ2xlKS5fYWRkKGNlbnRlcik7XG4gICAgICAgICAgICBvYnIuX3N1YihjZW50ZXIpLl9yb3RhdGUocG9zaXRpb25lZEdseXBoLmFuZ2xlKS5fYWRkKGNlbnRlcik7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdseXBoSW5zdGFuY2VzLmxlbmd0aDsgaSsrKSB7XG5cbiAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gZ2x5cGhJbnN0YW5jZXNbaV07XG4gICAgICAgICAgICBsZXQgdGwgPSBvdGwsXG4gICAgICAgICAgICAgICAgdHIgPSBvdHIsXG4gICAgICAgICAgICAgICAgYmwgPSBvYmwsXG4gICAgICAgICAgICAgICAgYnIgPSBvYnI7XG5cbiAgICAgICAgICAgIGlmICh0ZXh0Um90YXRlKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2luID0gTWF0aC5zaW4odGV4dFJvdGF0ZSksXG4gICAgICAgICAgICAgICAgICAgIGNvcyA9IE1hdGguY29zKHRleHRSb3RhdGUpLFxuICAgICAgICAgICAgICAgICAgICBtYXRyaXggPSBbY29zLCAtc2luLCBzaW4sIGNvc107XG5cbiAgICAgICAgICAgICAgICB0bCA9IHRsLm1hdE11bHQobWF0cml4KTtcbiAgICAgICAgICAgICAgICB0ciA9IHRyLm1hdE11bHQobWF0cml4KTtcbiAgICAgICAgICAgICAgICBibCA9IGJsLm1hdE11bHQobWF0cml4KTtcbiAgICAgICAgICAgICAgICBiciA9IGJyLm1hdE11bHQobWF0cml4KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gUHJldmVudCBsYWJlbCBmcm9tIGV4dGVuZGluZyBwYXN0IHRoZSBlbmQgb2YgdGhlIGxpbmVcbiAgICAgICAgICAgIGNvbnN0IGdseXBoTWluU2NhbGUgPSBNYXRoLm1heChpbnN0YW5jZS5taW5TY2FsZSwgbGFiZWxNaW5TY2FsZSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGFuY2hvckFuZ2xlID0gKGFuY2hvci5hbmdsZSArIGluc3RhbmNlLm9mZnNldCArIDIgKiBNYXRoLlBJKSAlICgyICogTWF0aC5QSSk7XG4gICAgICAgICAgICBjb25zdCBnbHlwaEFuZ2xlID0gKGluc3RhbmNlLmFuZ2xlICsgaW5zdGFuY2Uub2Zmc2V0ICsgMiAqIE1hdGguUEkpICUgKDIgKiBNYXRoLlBJKTtcbiAgICAgICAgICAgIHF1YWRzLnB1c2gobmV3IFN5bWJvbFF1YWQoaW5zdGFuY2UuYW5jaG9yUG9pbnQsIHRsLCB0ciwgYmwsIGJyLCByZWN0LCBhbmNob3JBbmdsZSwgZ2x5cGhBbmdsZSwgZ2x5cGhNaW5TY2FsZSwgaW5zdGFuY2UubWF4U2NhbGUsIHNoYXBpbmcud3JpdGluZ01vZGUpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBxdWFkcztcbn1cblxuLyoqXG4gKiBXZSBjYW4gb25seSByZW5kZXIgZ2x5cGggcXVhZHMgdGhhdCBzbGlkZSBhbG9uZyBhIHN0cmFpZ2h0IGxpbmUuIFRvIGRyYXdcbiAqIGN1cnZlZCBsaW5lcyB3ZSBuZWVkIGFuIGluc3RhbmNlIG9mIGEgZ2x5cGggZm9yIGVhY2ggc2VnbWVudCBpdCBhcHBlYXJzIG9uLlxuICogVGhpcyBjcmVhdGVzIGFsbCB0aGUgaW5zdGFuY2VzIG9mIGEgZ2x5cGggdGhhdCBhcmUgbmVjZXNzYXJ5IHRvIHJlbmRlciBhIGxhYmVsLlxuICpcbiAqIFdlIG5lZWQgYVxuICogQHBhcmFtIHtBcnJheTxPYmplY3Q+fSBnbHlwaEluc3RhbmNlcyBBbiBlbXB0eSBhcnJheSB0aGF0IGdseXBoSW5zdGFuY2VzIGFyZSBhZGRlZCB0by5cbiAqIEBwYXJhbSB7QW5jaG9yfSBhbmNob3JcbiAqIEBwYXJhbSB7bnVtYmVyfSBvZmZzZXQgVGhlIGdseXBoJ3Mgb2Zmc2V0IGZyb20gdGhlIGNlbnRlciBvZiB0aGUgbGFiZWwuXG4gKiBAcGFyYW0ge0FycmF5PFBvaW50Pn0gbGluZVxuICogQHBhcmFtIHtudW1iZXJ9IHNlZ21lbnQgVGhlIGluZGV4IG9mIHRoZSBzZWdtZW50IG9mIHRoZSBsaW5lIG9uIHdoaWNoIHRoZSBhbmNob3IgZXhpc3RzLlxuICogQHBhcmFtIHtib29sZWFufSBmb3J3YXJkIElmIHRydWUgZ2V0IHRoZSBnbHlwaHMgdGhhdCBjb21lIGxhdGVyIG9uIHRoZSBsaW5lLCBvdGhlcndpc2UgZ2V0IHRoZSBnbHlwaHMgdGhhdCBjb21lIGVhcmxpZXIuXG4gKlxuICogQHJldHVybnMge0FycmF5PE9iamVjdD59IGdseXBoSW5zdGFuY2VzXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBnZXRTZWdtZW50R2x5cGhzKGdseXBocywgYW5jaG9yLCBvZmZzZXQsIGxpbmUsIHNlZ21lbnQsIGZvcndhcmQpIHtcbiAgICBjb25zdCB1cHNpZGVEb3duID0gIWZvcndhcmQ7XG5cbiAgICBpZiAob2Zmc2V0IDwgMCkgZm9yd2FyZCA9ICFmb3J3YXJkO1xuXG4gICAgaWYgKGZvcndhcmQpIHNlZ21lbnQrKztcblxuICAgIGxldCBuZXdBbmNob3JQb2ludCA9IG5ldyBQb2ludChhbmNob3IueCwgYW5jaG9yLnkpO1xuICAgIGxldCBlbmQgPSBsaW5lW3NlZ21lbnRdO1xuICAgIGxldCBwcmV2U2NhbGUgPSBJbmZpbml0eTtcblxuICAgIG9mZnNldCA9IE1hdGguYWJzKG9mZnNldCk7XG5cbiAgICBjb25zdCBwbGFjZW1lbnRTY2FsZSA9IG1pblNjYWxlO1xuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgY29uc3QgZGlzdGFuY2UgPSBuZXdBbmNob3JQb2ludC5kaXN0KGVuZCk7XG4gICAgICAgIGNvbnN0IHNjYWxlID0gb2Zmc2V0IC8gZGlzdGFuY2U7XG5cbiAgICAgICAgLy8gR2V0IHRoZSBhbmdsZSBvZiB0aGUgbGluZSBzZWdtZW50XG4gICAgICAgIGxldCBhbmdsZSA9IE1hdGguYXRhbjIoZW5kLnkgLSBuZXdBbmNob3JQb2ludC55LCBlbmQueCAtIG5ld0FuY2hvclBvaW50LngpO1xuICAgICAgICBpZiAoIWZvcndhcmQpIGFuZ2xlICs9IE1hdGguUEk7XG5cbiAgICAgICAgZ2x5cGhzLnB1c2goe1xuICAgICAgICAgICAgYW5jaG9yUG9pbnQ6IG5ld0FuY2hvclBvaW50LFxuICAgICAgICAgICAgb2Zmc2V0OiB1cHNpZGVEb3duID8gTWF0aC5QSSA6IDAsXG4gICAgICAgICAgICBtaW5TY2FsZTogc2NhbGUsXG4gICAgICAgICAgICBtYXhTY2FsZTogcHJldlNjYWxlLFxuICAgICAgICAgICAgYW5nbGU6IChhbmdsZSArIDIgKiBNYXRoLlBJKSAlICgyICogTWF0aC5QSSlcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHNjYWxlIDw9IHBsYWNlbWVudFNjYWxlKSBicmVhaztcblxuICAgICAgICBuZXdBbmNob3JQb2ludCA9IGVuZDtcblxuICAgICAgICAvLyBza2lwIGR1cGxpY2F0ZSBub2Rlc1xuICAgICAgICB3aGlsZSAobmV3QW5jaG9yUG9pbnQuZXF1YWxzKGVuZCkpIHtcbiAgICAgICAgICAgIHNlZ21lbnQgKz0gZm9yd2FyZCA/IDEgOiAtMTtcbiAgICAgICAgICAgIGVuZCA9IGxpbmVbc2VnbWVudF07XG4gICAgICAgICAgICBpZiAoIWVuZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzY2FsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHVuaXQgPSBlbmQuc3ViKG5ld0FuY2hvclBvaW50KS5fdW5pdCgpO1xuICAgICAgICBuZXdBbmNob3JQb2ludCA9IG5ld0FuY2hvclBvaW50LnN1Yih1bml0Ll9tdWx0KGRpc3RhbmNlKSk7XG5cbiAgICAgICAgcHJldlNjYWxlID0gc2NhbGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBsYWNlbWVudFNjYWxlO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCByZXNvbHZlVG9rZW5zID0gcmVxdWlyZSgnLi4vdXRpbC90b2tlbicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHJlc29sdmVUZXh0KGZlYXR1cmUsIGxheW91dCkge1xuICAgIGxldCB0ZXh0ID0gcmVzb2x2ZVRva2VucyhmZWF0dXJlLnByb3BlcnRpZXMsIGxheW91dFsndGV4dC1maWVsZCddKTtcbiAgICBpZiAoIXRleHQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0ZXh0ID0gdGV4dC50b1N0cmluZygpO1xuXG4gICAgY29uc3QgdHJhbnNmb3JtID0gbGF5b3V0Wyd0ZXh0LXRyYW5zZm9ybSddO1xuICAgIGlmICh0cmFuc2Zvcm0gPT09ICd1cHBlcmNhc2UnKSB7XG4gICAgICAgIHRleHQgPSB0ZXh0LnRvTG9jYWxlVXBwZXJDYXNlKCk7XG4gICAgfSBlbHNlIGlmICh0cmFuc2Zvcm0gPT09ICdsb3dlcmNhc2UnKSB7XG4gICAgICAgIHRleHQgPSB0ZXh0LnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRleHQ7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBzY3JpcHREZXRlY3Rpb24gPSByZXF1aXJlKCcuLi91dGlsL3NjcmlwdF9kZXRlY3Rpb24nKTtcbmNvbnN0IHZlcnRpY2FsaXplUHVuY3R1YXRpb24gPSByZXF1aXJlKCcuLi91dGlsL3ZlcnRpY2FsaXplX3B1bmN0dWF0aW9uJyk7XG5jb25zdCBydGxUZXh0UGx1Z2luID0gcmVxdWlyZSgnLi4vc291cmNlL3J0bF90ZXh0X3BsdWdpbicpO1xuXG5jb25zdCBXcml0aW5nTW9kZSA9IHtcbiAgICBob3Jpem9udGFsOiAxLFxuICAgIHZlcnRpY2FsOiAyXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBzaGFwZVRleHQ6IHNoYXBlVGV4dCxcbiAgICBzaGFwZUljb246IHNoYXBlSWNvbixcbiAgICBXcml0aW5nTW9kZTogV3JpdGluZ01vZGVcbn07XG5cblxuLy8gVGhlIHBvc2l0aW9uIG9mIGEgZ2x5cGggcmVsYXRpdmUgdG8gdGhlIHRleHQncyBhbmNob3IgcG9pbnQuXG5mdW5jdGlvbiBQb3NpdGlvbmVkR2x5cGgoY29kZVBvaW50LCB4LCB5LCBnbHlwaCwgYW5nbGUpIHtcbiAgICB0aGlzLmNvZGVQb2ludCA9IGNvZGVQb2ludDtcbiAgICB0aGlzLnggPSB4O1xuICAgIHRoaXMueSA9IHk7XG4gICAgdGhpcy5nbHlwaCA9IGdseXBoIHx8IG51bGw7XG4gICAgdGhpcy5hbmdsZSA9IGFuZ2xlO1xufVxuXG4vLyBBIGNvbGxlY3Rpb24gb2YgcG9zaXRpb25lZCBnbHlwaHMgYW5kIHNvbWUgbWV0YWRhdGFcbmZ1bmN0aW9uIFNoYXBpbmcocG9zaXRpb25lZEdseXBocywgdGV4dCwgdG9wLCBib3R0b20sIGxlZnQsIHJpZ2h0LCB3cml0aW5nTW9kZSkge1xuICAgIHRoaXMucG9zaXRpb25lZEdseXBocyA9IHBvc2l0aW9uZWRHbHlwaHM7XG4gICAgdGhpcy50ZXh0ID0gdGV4dDtcbiAgICB0aGlzLnRvcCA9IHRvcDtcbiAgICB0aGlzLmJvdHRvbSA9IGJvdHRvbTtcbiAgICB0aGlzLmxlZnQgPSBsZWZ0O1xuICAgIHRoaXMucmlnaHQgPSByaWdodDtcbiAgICB0aGlzLndyaXRpbmdNb2RlID0gd3JpdGluZ01vZGU7XG59XG5cbmZ1bmN0aW9uIGJyZWFrTGluZXModGV4dCwgbGluZUJyZWFrUG9pbnRzKSB7XG4gICAgY29uc3QgbGluZXMgPSBbXTtcbiAgICBsZXQgc3RhcnQgPSAwO1xuICAgIGZvciAoY29uc3QgbGluZUJyZWFrIG9mIGxpbmVCcmVha1BvaW50cykge1xuICAgICAgICBsaW5lcy5wdXNoKHRleHQuc3Vic3RyaW5nKHN0YXJ0LCBsaW5lQnJlYWspKTtcbiAgICAgICAgc3RhcnQgPSBsaW5lQnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKHN0YXJ0IDwgdGV4dC5sZW5ndGgpIHtcbiAgICAgICAgbGluZXMucHVzaCh0ZXh0LnN1YnN0cmluZyhzdGFydCwgdGV4dC5sZW5ndGgpKTtcbiAgICB9XG4gICAgcmV0dXJuIGxpbmVzO1xufVxuXG5mdW5jdGlvbiBzaGFwZVRleHQodGV4dCwgZ2x5cGhzLCBtYXhXaWR0aCwgbGluZUhlaWdodCwgaG9yaXpvbnRhbEFsaWduLCB2ZXJ0aWNhbEFsaWduLCBqdXN0aWZ5LCBzcGFjaW5nLCB0cmFuc2xhdGUsIHZlcnRpY2FsSGVpZ2h0LCB3cml0aW5nTW9kZSkge1xuICAgIGxldCBsb2dpY2FsSW5wdXQgPSB0ZXh0LnRyaW0oKTtcbiAgICBpZiAod3JpdGluZ01vZGUgPT09IFdyaXRpbmdNb2RlLnZlcnRpY2FsKSBsb2dpY2FsSW5wdXQgPSB2ZXJ0aWNhbGl6ZVB1bmN0dWF0aW9uKGxvZ2ljYWxJbnB1dCk7XG5cbiAgICBjb25zdCBwb3NpdGlvbmVkR2x5cGhzID0gW107XG4gICAgY29uc3Qgc2hhcGluZyA9IG5ldyBTaGFwaW5nKHBvc2l0aW9uZWRHbHlwaHMsIGxvZ2ljYWxJbnB1dCwgdHJhbnNsYXRlWzFdLCB0cmFuc2xhdGVbMV0sIHRyYW5zbGF0ZVswXSwgdHJhbnNsYXRlWzBdLCB3cml0aW5nTW9kZSk7XG5cbiAgICBsZXQgbGluZXM7XG4gICAgaWYgKHJ0bFRleHRQbHVnaW4ucHJvY2Vzc0JpZGlyZWN0aW9uYWxUZXh0KSB7XG4gICAgICAgIGxpbmVzID0gcnRsVGV4dFBsdWdpbi5wcm9jZXNzQmlkaXJlY3Rpb25hbFRleHQobG9naWNhbElucHV0LCBkZXRlcm1pbmVMaW5lQnJlYWtzKGxvZ2ljYWxJbnB1dCwgc3BhY2luZywgbWF4V2lkdGgsIGdseXBocykpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGxpbmVzID0gYnJlYWtMaW5lcyhsb2dpY2FsSW5wdXQsIGRldGVybWluZUxpbmVCcmVha3MobG9naWNhbElucHV0LCBzcGFjaW5nLCBtYXhXaWR0aCwgZ2x5cGhzKSk7XG4gICAgfVxuXG4gICAgc2hhcGVMaW5lcyhzaGFwaW5nLCBnbHlwaHMsIGxpbmVzLCBsaW5lSGVpZ2h0LCBob3Jpem9udGFsQWxpZ24sIHZlcnRpY2FsQWxpZ24sIGp1c3RpZnksIHRyYW5zbGF0ZSwgd3JpdGluZ01vZGUsIHNwYWNpbmcsIHZlcnRpY2FsSGVpZ2h0KTtcblxuICAgIGlmICghcG9zaXRpb25lZEdseXBocy5sZW5ndGgpXG4gICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIHJldHVybiBzaGFwaW5nO1xufVxuXG5jb25zdCB3aGl0ZXNwYWNlID0ge1xuICAgIDB4MDk6IHRydWUsIC8vIHRhYlxuICAgIDB4MGE6IHRydWUsIC8vIG5ld2xpbmVcbiAgICAweDBiOiB0cnVlLCAvLyB2ZXJ0aWNhbCB0YWJcbiAgICAweDBjOiB0cnVlLCAvLyBmb3JtIGZlZWRcbiAgICAweDBkOiB0cnVlLCAvLyBjYXJyaWFnZSByZXR1cm5cbiAgICAweDIwOiB0cnVlLCAvLyBzcGFjZVxufTtcblxuY29uc3QgYnJlYWthYmxlID0ge1xuICAgIDB4MGE6ICAgdHJ1ZSwgLy8gbmV3bGluZVxuICAgIDB4MjA6ICAgdHJ1ZSwgLy8gc3BhY2VcbiAgICAweDI2OiAgIHRydWUsIC8vIGFtcGVyc2FuZFxuICAgIDB4Mjg6ICAgdHJ1ZSwgLy8gbGVmdCBwYXJlbnRoZXNpc1xuICAgIDB4Mjk6ICAgdHJ1ZSwgLy8gcmlnaHQgcGFyZW50aGVzaXNcbiAgICAweDJiOiAgIHRydWUsIC8vIHBsdXMgc2lnblxuICAgIDB4MmQ6ICAgdHJ1ZSwgLy8gaHlwaGVuLW1pbnVzXG4gICAgMHgyZjogICB0cnVlLCAvLyBzb2xpZHVzXG4gICAgMHhhZDogICB0cnVlLCAvLyBzb2Z0IGh5cGhlblxuICAgIDB4Yjc6ICAgdHJ1ZSwgLy8gbWlkZGxlIGRvdFxuICAgIDB4MjAwYjogdHJ1ZSwgLy8gemVyby13aWR0aCBzcGFjZVxuICAgIDB4MjAxMDogdHJ1ZSwgLy8gaHlwaGVuXG4gICAgMHgyMDEzOiB0cnVlLCAvLyBlbiBkYXNoXG4gICAgMHgyMDI3OiB0cnVlICAvLyBpbnRlcnB1bmN0XG4gICAgLy8gTWFueSBvdGhlciBjaGFyYWN0ZXJzIG1heSBiZSByZWFzb25hYmxlIGJyZWFrcG9pbnRzXG4gICAgLy8gQ29uc2lkZXIgXCJuZXV0cmFsIG9yaWVudGF0aW9uXCIgY2hhcmFjdGVycyBhdCBzY3JpcHREZXRlY3Rpb24uY2hhckhhc05ldXRyYWxWZXJ0aWNhbE9yaWVudGF0aW9uXG4gICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWpzL2lzc3Vlcy8zNjU4XG59O1xuXG5mdW5jdGlvbiBkZXRlcm1pbmVBdmVyYWdlTGluZVdpZHRoKGxvZ2ljYWxJbnB1dCwgc3BhY2luZywgbWF4V2lkdGgsIGdseXBocykge1xuICAgIGxldCB0b3RhbFdpZHRoID0gMDtcblxuICAgIGZvciAoY29uc3QgaW5kZXggaW4gbG9naWNhbElucHV0KSB7XG4gICAgICAgIGNvbnN0IGdseXBoID0gZ2x5cGhzW2xvZ2ljYWxJbnB1dC5jaGFyQ29kZUF0KGluZGV4KV07XG4gICAgICAgIGlmICghZ2x5cGgpXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgdG90YWxXaWR0aCArPSBnbHlwaC5hZHZhbmNlICsgc3BhY2luZztcbiAgICB9XG5cbiAgICBjb25zdCBsaW5lQ291bnQgPSBNYXRoLm1heCgxLCBNYXRoLmNlaWwodG90YWxXaWR0aCAvIG1heFdpZHRoKSk7XG4gICAgcmV0dXJuIHRvdGFsV2lkdGggLyBsaW5lQ291bnQ7XG59XG5cbmZ1bmN0aW9uIGNhbGN1bGF0ZUJhZG5lc3MobGluZVdpZHRoLCB0YXJnZXRXaWR0aCwgcGVuYWx0eSwgaXNMYXN0QnJlYWspIHtcbiAgICBjb25zdCByYWdnZWRuZXNzID0gTWF0aC5wb3cobGluZVdpZHRoIC0gdGFyZ2V0V2lkdGgsIDIpO1xuICAgIGlmIChpc0xhc3RCcmVhaykge1xuICAgICAgICAvLyBGYXZvciBmaW5hbHMgbGluZXMgc2hvcnRlciB0aGFuIGF2ZXJhZ2Ugb3ZlciBsb25nZXIgdGhhbiBhdmVyYWdlXG4gICAgICAgIGlmIChsaW5lV2lkdGggPCB0YXJnZXRXaWR0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHJhZ2dlZG5lc3MgLyAyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHJhZ2dlZG5lc3MgKiAyO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJhZ2dlZG5lc3MgKyBNYXRoLmFicyhwZW5hbHR5KSAqIHBlbmFsdHk7XG59XG5cbmZ1bmN0aW9uIGNhbGN1bGF0ZVBlbmFsdHkoY29kZVBvaW50LCBuZXh0Q29kZVBvaW50KSB7XG4gICAgbGV0IHBlbmFsdHkgPSAwO1xuICAgIC8vIEZvcmNlIGJyZWFrIG9uIG5ld2xpbmVcbiAgICBpZiAoY29kZVBvaW50ID09PSAweDBhKSB7XG4gICAgICAgIHBlbmFsdHkgLT0gMTAwMDA7XG4gICAgfVxuICAgIC8vIFBlbmFsaXplIG9wZW4gcGFyZW50aGVzaXMgYXQgZW5kIG9mIGxpbmVcbiAgICBpZiAoY29kZVBvaW50ID09PSAweDI4IHx8IGNvZGVQb2ludCA9PT0gMHhmZjA4KSB7XG4gICAgICAgIHBlbmFsdHkgKz0gNTA7XG4gICAgfVxuXG4gICAgLy8gUGVuYWxpemUgY2xvc2UgcGFyZW50aGVzaXMgYXQgYmVnaW5uaW5nIG9mIGxpbmVcbiAgICBpZiAobmV4dENvZGVQb2ludCA9PT0gMHgyOSB8fCBuZXh0Q29kZVBvaW50ID09PSAweGZmMDkpIHtcbiAgICAgICAgcGVuYWx0eSArPSA1MDtcbiAgICB9XG4gICAgcmV0dXJuIHBlbmFsdHk7XG59XG5cbmZ1bmN0aW9uIGV2YWx1YXRlQnJlYWsoYnJlYWtJbmRleCwgYnJlYWtYLCB0YXJnZXRXaWR0aCwgcG90ZW50aWFsQnJlYWtzLCBwZW5hbHR5LCBpc0xhc3RCcmVhaykge1xuICAgIC8vIFdlIGNvdWxkIHNraXAgZXZhbHVhdGluZyBicmVha3Mgd2hlcmUgdGhlIGxpbmUgbGVuZ3RoIChicmVha1ggLSBwcmlvckJyZWFrLngpID4gbWF4V2lkdGhcbiAgICAvLyAgLi4uYnV0IGluIGZhY3Qgd2UgYWxsb3cgbGluZXMgbG9uZ2VyIHRoYW4gbWF4V2lkdGggKGlmIHRoZXJlJ3Mgbm8gYnJlYWsgcG9pbnRzKVxuICAgIC8vICAuLi5hbmQgd2hlbiB0YXJnZXRXaWR0aCBhbmQgbWF4V2lkdGggYXJlIGNsb3NlLCBzdHJpY3RseSBlbmZvcmNpbmcgbWF4V2lkdGggY2FuIGdpdmVcbiAgICAvLyAgICAgbW9yZSBsb3BzaWRlZCByZXN1bHRzLlxuXG4gICAgbGV0IGJlc3RQcmlvckJyZWFrID0gbnVsbDtcbiAgICBsZXQgYmVzdEJyZWFrQmFkbmVzcyA9IGNhbGN1bGF0ZUJhZG5lc3MoYnJlYWtYLCB0YXJnZXRXaWR0aCwgcGVuYWx0eSwgaXNMYXN0QnJlYWspO1xuXG4gICAgZm9yIChjb25zdCBwb3RlbnRpYWxCcmVhayBvZiBwb3RlbnRpYWxCcmVha3MpIHtcbiAgICAgICAgY29uc3QgbGluZVdpZHRoID0gYnJlYWtYIC0gcG90ZW50aWFsQnJlYWsueDtcbiAgICAgICAgY29uc3QgYnJlYWtCYWRuZXNzID1cbiAgICAgICAgICAgIGNhbGN1bGF0ZUJhZG5lc3MobGluZVdpZHRoLCB0YXJnZXRXaWR0aCwgcGVuYWx0eSwgaXNMYXN0QnJlYWspICsgcG90ZW50aWFsQnJlYWsuYmFkbmVzcztcbiAgICAgICAgaWYgKGJyZWFrQmFkbmVzcyA8PSBiZXN0QnJlYWtCYWRuZXNzKSB7XG4gICAgICAgICAgICBiZXN0UHJpb3JCcmVhayA9IHBvdGVudGlhbEJyZWFrO1xuICAgICAgICAgICAgYmVzdEJyZWFrQmFkbmVzcyA9IGJyZWFrQmFkbmVzcztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIGluZGV4OiBicmVha0luZGV4LFxuICAgICAgICB4OiBicmVha1gsXG4gICAgICAgIHByaW9yQnJlYWs6IGJlc3RQcmlvckJyZWFrLFxuICAgICAgICBiYWRuZXNzOiBiZXN0QnJlYWtCYWRuZXNzXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gbGVhc3RCYWRCcmVha3MobGFzdExpbmVCcmVhaykge1xuICAgIGlmICghbGFzdExpbmVCcmVhaykge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHJldHVybiBsZWFzdEJhZEJyZWFrcyhsYXN0TGluZUJyZWFrLnByaW9yQnJlYWspLmNvbmNhdChsYXN0TGluZUJyZWFrLmluZGV4KTtcbn1cblxuZnVuY3Rpb24gZGV0ZXJtaW5lTGluZUJyZWFrcyhsb2dpY2FsSW5wdXQsIHNwYWNpbmcsIG1heFdpZHRoLCBnbHlwaHMpIHtcbiAgICBpZiAoIW1heFdpZHRoKVxuICAgICAgICByZXR1cm4gW107XG5cbiAgICBpZiAoIWxvZ2ljYWxJbnB1dClcbiAgICAgICAgcmV0dXJuIFtdO1xuXG4gICAgY29uc3QgcG90ZW50aWFsTGluZUJyZWFrcyA9IFtdO1xuICAgIGNvbnN0IHRhcmdldFdpZHRoID0gZGV0ZXJtaW5lQXZlcmFnZUxpbmVXaWR0aChsb2dpY2FsSW5wdXQsIHNwYWNpbmcsIG1heFdpZHRoLCBnbHlwaHMpO1xuXG4gICAgbGV0IGN1cnJlbnRYID0gMDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbG9naWNhbElucHV0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGNvZGVQb2ludCA9IGxvZ2ljYWxJbnB1dC5jaGFyQ29kZUF0KGkpO1xuICAgICAgICBjb25zdCBnbHlwaCA9IGdseXBoc1tjb2RlUG9pbnRdO1xuXG4gICAgICAgIGlmIChnbHlwaCAmJiAhd2hpdGVzcGFjZVtjb2RlUG9pbnRdKVxuICAgICAgICAgICAgY3VycmVudFggKz0gZ2x5cGguYWR2YW5jZSArIHNwYWNpbmc7XG5cbiAgICAgICAgLy8gSWRlb2dyYXBoaWMgY2hhcmFjdGVycywgc3BhY2VzLCBhbmQgd29yZC1icmVha2luZyBwdW5jdHVhdGlvbiB0aGF0IG9mdGVuIGFwcGVhciB3aXRob3V0XG4gICAgICAgIC8vIHN1cnJvdW5kaW5nIHNwYWNlcy5cbiAgICAgICAgaWYgKChpIDwgbG9naWNhbElucHV0Lmxlbmd0aCAtIDEpICYmXG4gICAgICAgICAgICAoYnJlYWthYmxlW2NvZGVQb2ludF0gfHxcbiAgICAgICAgICAgICAgICBzY3JpcHREZXRlY3Rpb24uY2hhckFsbG93c0lkZW9ncmFwaGljQnJlYWtpbmcoY29kZVBvaW50KSkpIHtcblxuICAgICAgICAgICAgcG90ZW50aWFsTGluZUJyZWFrcy5wdXNoKFxuICAgICAgICAgICAgICAgIGV2YWx1YXRlQnJlYWsoXG4gICAgICAgICAgICAgICAgICAgIGkgKyAxLFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50WCxcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0V2lkdGgsXG4gICAgICAgICAgICAgICAgICAgIHBvdGVudGlhbExpbmVCcmVha3MsXG4gICAgICAgICAgICAgICAgICAgIGNhbGN1bGF0ZVBlbmFsdHkoY29kZVBvaW50LCBsb2dpY2FsSW5wdXQuY2hhckNvZGVBdChpICsgMSkpLFxuICAgICAgICAgICAgICAgICAgICBmYWxzZSkpO1xuICAgICAgICB9XG5cblxuICAgIH1cblxuICAgIHJldHVybiBsZWFzdEJhZEJyZWFrcyhcbiAgICAgICAgZXZhbHVhdGVCcmVhayhcbiAgICAgICAgICAgIGxvZ2ljYWxJbnB1dC5sZW5ndGgsXG4gICAgICAgICAgICBjdXJyZW50WCxcbiAgICAgICAgICAgIHRhcmdldFdpZHRoLFxuICAgICAgICAgICAgcG90ZW50aWFsTGluZUJyZWFrcyxcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICB0cnVlKSk7XG59XG5cbmZ1bmN0aW9uIHNoYXBlTGluZXMoc2hhcGluZywgZ2x5cGhzLCBsaW5lcywgbGluZUhlaWdodCwgaG9yaXpvbnRhbEFsaWduLCB2ZXJ0aWNhbEFsaWduLCBqdXN0aWZ5LCB0cmFuc2xhdGUsIHdyaXRpbmdNb2RlLCBzcGFjaW5nLCB2ZXJ0aWNhbEhlaWdodCkge1xuICAgIC8vIHRoZSB5IG9mZnNldCAqc2hvdWxkKiBiZSBwYXJ0IG9mIHRoZSBmb250IG1ldGFkYXRhXG4gICAgY29uc3QgeU9mZnNldCA9IC0xNztcblxuICAgIGxldCB4ID0gMDtcbiAgICBsZXQgeSA9IHlPZmZzZXQ7XG5cbiAgICBsZXQgbWF4TGluZUxlbmd0aCA9IDA7XG4gICAgY29uc3QgcG9zaXRpb25lZEdseXBocyA9IHNoYXBpbmcucG9zaXRpb25lZEdseXBocztcblxuICAgIGZvciAoY29uc3QgaSBpbiBsaW5lcykge1xuICAgICAgICBjb25zdCBsaW5lID0gbGluZXNbaV0udHJpbSgpO1xuXG4gICAgICAgIGlmICghbGluZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHkgKz0gbGluZUhlaWdodDsgLy8gU3RpbGwgbmVlZCBhIGxpbmUgZmVlZCBhZnRlciBlbXB0eSBsaW5lXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxpbmVTdGFydEluZGV4ID0gcG9zaXRpb25lZEdseXBocy5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgY29kZVBvaW50ID0gbGluZS5jaGFyQ29kZUF0KGkpO1xuICAgICAgICAgICAgY29uc3QgZ2x5cGggPSBnbHlwaHNbY29kZVBvaW50XTtcblxuICAgICAgICAgICAgaWYgKCFnbHlwaCkgY29udGludWU7XG5cbiAgICAgICAgICAgIGlmICghc2NyaXB0RGV0ZWN0aW9uLmNoYXJIYXNVcHJpZ2h0VmVydGljYWxPcmllbnRhdGlvbihjb2RlUG9pbnQpIHx8IHdyaXRpbmdNb2RlID09PSBXcml0aW5nTW9kZS5ob3Jpem9udGFsKSB7XG4gICAgICAgICAgICAgICAgcG9zaXRpb25lZEdseXBocy5wdXNoKG5ldyBQb3NpdGlvbmVkR2x5cGgoY29kZVBvaW50LCB4LCB5LCBnbHlwaCwgMCkpO1xuICAgICAgICAgICAgICAgIHggKz0gZ2x5cGguYWR2YW5jZSArIHNwYWNpbmc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uZWRHbHlwaHMucHVzaChuZXcgUG9zaXRpb25lZEdseXBoKGNvZGVQb2ludCwgeCwgMCwgZ2x5cGgsIC1NYXRoLlBJIC8gMikpO1xuICAgICAgICAgICAgICAgIHggKz0gdmVydGljYWxIZWlnaHQgKyBzcGFjaW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gT25seSBqdXN0aWZ5IGlmIHdlIHBsYWNlZCBhdCBsZWFzdCBvbmUgZ2x5cGhcbiAgICAgICAgaWYgKHBvc2l0aW9uZWRHbHlwaHMubGVuZ3RoICE9PSBsaW5lU3RhcnRJbmRleCkge1xuICAgICAgICAgICAgY29uc3QgbGluZUxlbmd0aCA9IHggLSBzcGFjaW5nO1xuICAgICAgICAgICAgbWF4TGluZUxlbmd0aCA9IE1hdGgubWF4KGxpbmVMZW5ndGgsIG1heExpbmVMZW5ndGgpO1xuXG4gICAgICAgICAgICBqdXN0aWZ5TGluZShwb3NpdGlvbmVkR2x5cGhzLCBnbHlwaHMsIGxpbmVTdGFydEluZGV4LCBwb3NpdGlvbmVkR2x5cGhzLmxlbmd0aCAtIDEsIGp1c3RpZnkpO1xuICAgICAgICB9XG5cbiAgICAgICAgeCA9IDA7XG4gICAgICAgIHkgKz0gbGluZUhlaWdodDtcbiAgICB9XG5cbiAgICBhbGlnbihwb3NpdGlvbmVkR2x5cGhzLCBqdXN0aWZ5LCBob3Jpem9udGFsQWxpZ24sIHZlcnRpY2FsQWxpZ24sIG1heExpbmVMZW5ndGgsIGxpbmVIZWlnaHQsIGxpbmVzLmxlbmd0aCwgdHJhbnNsYXRlKTtcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgYm91bmRpbmcgYm94XG4gICAgY29uc3QgaGVpZ2h0ID0gbGluZXMubGVuZ3RoICogbGluZUhlaWdodDtcblxuICAgIHNoYXBpbmcudG9wICs9IC12ZXJ0aWNhbEFsaWduICogaGVpZ2h0O1xuICAgIHNoYXBpbmcuYm90dG9tID0gc2hhcGluZy50b3AgKyBoZWlnaHQ7XG4gICAgc2hhcGluZy5sZWZ0ICs9IC1ob3Jpem9udGFsQWxpZ24gKiBtYXhMaW5lTGVuZ3RoO1xuICAgIHNoYXBpbmcucmlnaHQgPSBzaGFwaW5nLmxlZnQgKyBtYXhMaW5lTGVuZ3RoO1xufVxuXG4vLyBqdXN0aWZ5IGxlZnQgPSAwLCByaWdodCA9IDEsIGNlbnRlciA9IC41XG5mdW5jdGlvbiBqdXN0aWZ5TGluZShwb3NpdGlvbmVkR2x5cGhzLCBnbHlwaHMsIHN0YXJ0LCBlbmQsIGp1c3RpZnkpIHtcbiAgICBpZiAoIWp1c3RpZnkpXG4gICAgICAgIHJldHVybjtcblxuICAgIGNvbnN0IGxhc3RBZHZhbmNlID0gZ2x5cGhzW3Bvc2l0aW9uZWRHbHlwaHNbZW5kXS5jb2RlUG9pbnRdLmFkdmFuY2U7XG4gICAgY29uc3QgbGluZUluZGVudCA9IChwb3NpdGlvbmVkR2x5cGhzW2VuZF0ueCArIGxhc3RBZHZhbmNlKSAqIGp1c3RpZnk7XG5cbiAgICBmb3IgKGxldCBqID0gc3RhcnQ7IGogPD0gZW5kOyBqKyspIHtcbiAgICAgICAgcG9zaXRpb25lZEdseXBoc1tqXS54IC09IGxpbmVJbmRlbnQ7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBhbGlnbihwb3NpdGlvbmVkR2x5cGhzLCBqdXN0aWZ5LCBob3Jpem9udGFsQWxpZ24sIHZlcnRpY2FsQWxpZ24sIG1heExpbmVMZW5ndGgsIGxpbmVIZWlnaHQsIGxpbmVDb3VudCwgdHJhbnNsYXRlKSB7XG4gICAgY29uc3Qgc2hpZnRYID0gKGp1c3RpZnkgLSBob3Jpem9udGFsQWxpZ24pICogbWF4TGluZUxlbmd0aCArIHRyYW5zbGF0ZVswXTtcbiAgICBjb25zdCBzaGlmdFkgPSAoLXZlcnRpY2FsQWxpZ24gKiBsaW5lQ291bnQgKyAwLjUpICogbGluZUhlaWdodCArIHRyYW5zbGF0ZVsxXTtcblxuICAgIGZvciAobGV0IGogPSAwOyBqIDwgcG9zaXRpb25lZEdseXBocy5sZW5ndGg7IGorKykge1xuICAgICAgICBwb3NpdGlvbmVkR2x5cGhzW2pdLnggKz0gc2hpZnRYO1xuICAgICAgICBwb3NpdGlvbmVkR2x5cGhzW2pdLnkgKz0gc2hpZnRZO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gc2hhcGVJY29uKGltYWdlLCBpY29uT2Zmc2V0KSB7XG4gICAgaWYgKCFpbWFnZSB8fCAhaW1hZ2UucmVjdCkgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBkeCA9IGljb25PZmZzZXRbMF07XG4gICAgY29uc3QgZHkgPSBpY29uT2Zmc2V0WzFdO1xuICAgIGNvbnN0IHgxID0gZHggLSBpbWFnZS53aWR0aCAvIDI7XG4gICAgY29uc3QgeDIgPSB4MSArIGltYWdlLndpZHRoO1xuICAgIGNvbnN0IHkxID0gZHkgLSBpbWFnZS5oZWlnaHQgLyAyO1xuICAgIGNvbnN0IHkyID0geTEgKyBpbWFnZS5oZWlnaHQ7XG5cbiAgICByZXR1cm4gbmV3IFBvc2l0aW9uZWRJY29uKGltYWdlLCB5MSwgeTIsIHgxLCB4Mik7XG59XG5cbmZ1bmN0aW9uIFBvc2l0aW9uZWRJY29uKGltYWdlLCB0b3AsIGJvdHRvbSwgbGVmdCwgcmlnaHQpIHtcbiAgICB0aGlzLmltYWdlID0gaW1hZ2U7XG4gICAgdGhpcy50b3AgPSB0b3A7XG4gICAgdGhpcy5ib3R0b20gPSBib3R0b207XG4gICAgdGhpcy5sZWZ0ID0gbGVmdDtcbiAgICB0aGlzLnJpZ2h0ID0gcmlnaHQ7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IFNoZWxmUGFjayA9IHJlcXVpcmUoJ3NoZWxmLXBhY2snKTtcbmNvbnN0IGJyb3dzZXIgPSByZXF1aXJlKCcuLi91dGlsL2Jyb3dzZXInKTtcbmNvbnN0IHV0aWwgPSByZXF1aXJlKCcuLi91dGlsL3V0aWwnKTtcblxuY2xhc3MgQXRsYXNJbWFnZSB7XG4gICAgY29uc3RydWN0b3IocmVjdCwgd2lkdGgsIGhlaWdodCwgc2RmLCBwaXhlbFJhdGlvKSB7XG4gICAgICAgIHRoaXMucmVjdCA9IHJlY3Q7XG4gICAgICAgIHRoaXMud2lkdGggPSB3aWR0aDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgIHRoaXMuc2RmID0gc2RmO1xuICAgICAgICB0aGlzLnBpeGVsUmF0aW8gPSBwaXhlbFJhdGlvO1xuICAgIH1cbn1cblxuY2xhc3MgU3ByaXRlQXRsYXMge1xuXG4gICAgY29uc3RydWN0b3Iod2lkdGgsIGhlaWdodCkge1xuICAgICAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuXG4gICAgICAgIHRoaXMuYmluID0gbmV3IFNoZWxmUGFjayh3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgdGhpcy5pbWFnZXMgPSB7fTtcbiAgICAgICAgdGhpcy5kYXRhID0gZmFsc2U7XG4gICAgICAgIHRoaXMudGV4dHVyZSA9IDA7IC8vIFdlYkdMIElEXG4gICAgICAgIHRoaXMuZmlsdGVyID0gMDsgLy8gV2ViR0wgSURcbiAgICAgICAgdGhpcy5waXhlbFJhdGlvID0gMTtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7XG4gICAgfVxuXG4gICAgYWxsb2NhdGVJbWFnZShwaXhlbFdpZHRoLCBwaXhlbEhlaWdodCkge1xuICAgICAgICBwaXhlbFdpZHRoID0gcGl4ZWxXaWR0aCAvIHRoaXMucGl4ZWxSYXRpbztcbiAgICAgICAgcGl4ZWxIZWlnaHQgPSBwaXhlbEhlaWdodCAvIHRoaXMucGl4ZWxSYXRpbztcblxuICAgICAgICAvLyBJbmNyZWFzZSB0byBuZXh0IG51bWJlciBkaXZpc2libGUgYnkgNCwgYnV0IGF0IGxlYXN0IDEuXG4gICAgICAgIC8vIFRoaXMgaXMgc28gd2UgY2FuIHNjYWxlIGRvd24gdGhlIHRleHR1cmUgY29vcmRpbmF0ZXMgYW5kIHBhY2sgdGhlbVxuICAgICAgICAvLyBpbnRvIDIgYnl0ZXMgcmF0aGVyIHRoYW4gNCBieXRlcy5cbiAgICAgICAgLy8gUGFkIGljb25zIHRvIHByZXZlbnQgdGhlbSBmcm9tIHBvbGx1dGluZyBuZWlnaGJvdXJzIGR1cmluZyBsaW5lYXIgaW50ZXJwb2xhdGlvblxuICAgICAgICBjb25zdCBwYWRkaW5nID0gMjtcbiAgICAgICAgY29uc3QgcGFja1dpZHRoID0gcGl4ZWxXaWR0aCArIHBhZGRpbmcgKyAoNCAtIChwaXhlbFdpZHRoICsgcGFkZGluZykgJSA0KTtcbiAgICAgICAgY29uc3QgcGFja0hlaWdodCA9IHBpeGVsSGVpZ2h0ICsgcGFkZGluZyArICg0IC0gKHBpeGVsSGVpZ2h0ICsgcGFkZGluZykgJSA0KTsvLyArIDQ7XG5cbiAgICAgICAgY29uc3QgcmVjdCA9IHRoaXMuYmluLnBhY2tPbmUocGFja1dpZHRoLCBwYWNrSGVpZ2h0KTtcbiAgICAgICAgaWYgKCFyZWN0KSB7XG4gICAgICAgICAgICB1dGlsLndhcm5PbmNlKCdTcHJpdGVBdGxhcyBvdXQgb2Ygc3BhY2UuJyk7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZWN0O1xuICAgIH1cblxuICAgIGdldEltYWdlKG5hbWUsIHdyYXApIHtcbiAgICAgICAgaWYgKHRoaXMuaW1hZ2VzW25hbWVdKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbWFnZXNbbmFtZV07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuc3ByaXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBvcyA9IHRoaXMuc3ByaXRlLmdldFNwcml0ZVBvc2l0aW9uKG5hbWUpO1xuICAgICAgICBpZiAoIXBvcy53aWR0aCB8fCAhcG9zLmhlaWdodCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZWN0ID0gdGhpcy5hbGxvY2F0ZUltYWdlKHBvcy53aWR0aCwgcG9zLmhlaWdodCk7XG4gICAgICAgIGlmICghcmVjdCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbWFnZSA9IG5ldyBBdGxhc0ltYWdlKHJlY3QsIHBvcy53aWR0aCAvIHBvcy5waXhlbFJhdGlvLCBwb3MuaGVpZ2h0IC8gcG9zLnBpeGVsUmF0aW8sIHBvcy5zZGYsIHBvcy5waXhlbFJhdGlvIC8gdGhpcy5waXhlbFJhdGlvKTtcbiAgICAgICAgdGhpcy5pbWFnZXNbbmFtZV0gPSBpbWFnZTtcblxuICAgICAgICB0aGlzLmNvcHkocmVjdCwgcG9zLCB3cmFwKTtcblxuICAgICAgICByZXR1cm4gaW1hZ2U7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHBvc2l0aW9uIG9mIGEgcmVwZWF0aW5nIGZpbGwgcGF0dGVybi5cbiAgICBnZXRQb3NpdGlvbihuYW1lLCByZXBlYXRpbmcpIHtcbiAgICAgICAgY29uc3QgaW1hZ2UgPSB0aGlzLmdldEltYWdlKG5hbWUsIHJlcGVhdGluZyk7XG4gICAgICAgIGNvbnN0IHJlY3QgPSBpbWFnZSAmJiBpbWFnZS5yZWN0O1xuXG4gICAgICAgIGlmICghcmVjdCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB3aWR0aCA9IGltYWdlLndpZHRoICogaW1hZ2UucGl4ZWxSYXRpbztcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gaW1hZ2UuaGVpZ2h0ICogaW1hZ2UucGl4ZWxSYXRpbztcbiAgICAgICAgY29uc3QgcGFkZGluZyA9IDE7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNpemU6IFtpbWFnZS53aWR0aCwgaW1hZ2UuaGVpZ2h0XSxcbiAgICAgICAgICAgIHRsOiBbKHJlY3QueCArIHBhZGRpbmcpICAgICAgICAgLyB0aGlzLndpZHRoLCAocmVjdC55ICsgcGFkZGluZykgICAgICAgICAgLyB0aGlzLmhlaWdodF0sXG4gICAgICAgICAgICBicjogWyhyZWN0LnggKyBwYWRkaW5nICsgd2lkdGgpIC8gdGhpcy53aWR0aCwgKHJlY3QueSArIHBhZGRpbmcgKyBoZWlnaHQpIC8gdGhpcy5oZWlnaHRdXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgYWxsb2NhdGUoKSB7XG4gICAgICAgIGlmICghdGhpcy5kYXRhKSB7XG4gICAgICAgICAgICBjb25zdCB3ID0gTWF0aC5mbG9vcih0aGlzLndpZHRoICogdGhpcy5waXhlbFJhdGlvKTtcbiAgICAgICAgICAgIGNvbnN0IGggPSBNYXRoLmZsb29yKHRoaXMuaGVpZ2h0ICogdGhpcy5waXhlbFJhdGlvKTtcbiAgICAgICAgICAgIHRoaXMuZGF0YSA9IG5ldyBVaW50MzJBcnJheSh3ICogaCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YVtpXSA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb3B5KGRzdCwgc3JjLCB3cmFwKSB7XG4gICAgICAgIGlmICghdGhpcy5zcHJpdGUuaW1nRGF0YSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBzcmNJbWcgPSBuZXcgVWludDMyQXJyYXkodGhpcy5zcHJpdGUuaW1nRGF0YS5idWZmZXIpO1xuXG4gICAgICAgIHRoaXMuYWxsb2NhdGUoKTtcbiAgICAgICAgY29uc3QgZHN0SW1nID0gdGhpcy5kYXRhO1xuXG4gICAgICAgIGNvbnN0IHBhZGRpbmcgPSAxO1xuXG4gICAgICAgIGNvcHlCaXRtYXAoXG4gICAgICAgICAgICAvKiBzb3VyY2UgYnVmZmVyICovICBzcmNJbWcsXG4gICAgICAgICAgICAvKiBzb3VyY2Ugc3RyaWRlICovICB0aGlzLnNwcml0ZS53aWR0aCxcbiAgICAgICAgICAgIC8qIHNvdXJjZSB4ICovICAgICAgIHNyYy54LFxuICAgICAgICAgICAgLyogc291cmNlIHkgKi8gICAgICAgc3JjLnksXG4gICAgICAgICAgICAvKiBkZXN0IGJ1ZmZlciAqLyAgICBkc3RJbWcsXG4gICAgICAgICAgICAvKiBkZXN0IHN0cmlkZSAqLyAgICB0aGlzLndpZHRoICogdGhpcy5waXhlbFJhdGlvLFxuICAgICAgICAgICAgLyogZGVzdCB4ICovICAgICAgICAgKGRzdC54ICsgcGFkZGluZykgKiB0aGlzLnBpeGVsUmF0aW8sXG4gICAgICAgICAgICAvKiBkZXN0IHkgKi8gICAgICAgICAoZHN0LnkgKyBwYWRkaW5nKSAqIHRoaXMucGl4ZWxSYXRpbyxcbiAgICAgICAgICAgIC8qIGljb24gZGltZW5zaW9uICovIHNyYy53aWR0aCxcbiAgICAgICAgICAgIC8qIGljb24gZGltZW5zaW9uICovIHNyYy5oZWlnaHQsXG4gICAgICAgICAgICAvKiB3cmFwICovIHdyYXBcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBzZXRTcHJpdGUoc3ByaXRlKSB7XG4gICAgICAgIGlmIChzcHJpdGUpIHtcbiAgICAgICAgICAgIHRoaXMucGl4ZWxSYXRpbyA9IGJyb3dzZXIuZGV2aWNlUGl4ZWxSYXRpbyA+IDEgPyAyIDogMTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuY2FudmFzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jYW52YXMud2lkdGggPSB0aGlzLndpZHRoICogdGhpcy5waXhlbFJhdGlvO1xuICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzLmhlaWdodCA9IHRoaXMuaGVpZ2h0ICogdGhpcy5waXhlbFJhdGlvO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3ByaXRlID0gc3ByaXRlO1xuICAgIH1cblxuICAgIGFkZEljb25zKGljb25zLCBjYWxsYmFjaykge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGljb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLmdldEltYWdlKGljb25zW2ldKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNhbGxiYWNrKG51bGwsIHRoaXMuaW1hZ2VzKTtcbiAgICB9XG5cbiAgICBiaW5kKGdsLCBsaW5lYXIpIHtcbiAgICAgICAgbGV0IGZpcnN0ID0gZmFsc2U7XG4gICAgICAgIGlmICghdGhpcy50ZXh0dXJlKSB7XG4gICAgICAgICAgICB0aGlzLnRleHR1cmUgPSBnbC5jcmVhdGVUZXh0dXJlKCk7XG4gICAgICAgICAgICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCB0aGlzLnRleHR1cmUpO1xuICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfUywgZ2wuQ0xBTVBfVE9fRURHRSk7XG4gICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9ULCBnbC5DTEFNUF9UT19FREdFKTtcbiAgICAgICAgICAgIGZpcnN0ID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIHRoaXMudGV4dHVyZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaWx0ZXJWYWwgPSBsaW5lYXIgPyBnbC5MSU5FQVIgOiBnbC5ORUFSRVNUO1xuICAgICAgICBpZiAoZmlsdGVyVmFsICE9PSB0aGlzLmZpbHRlcikge1xuICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01JTl9GSUxURVIsIGZpbHRlclZhbCk7XG4gICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgZmlsdGVyVmFsKTtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyID0gZmlsdGVyVmFsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZGlydHkpIHtcbiAgICAgICAgICAgIHRoaXMuYWxsb2NhdGUoKTtcblxuICAgICAgICAgICAgaWYgKGZpcnN0KSB7XG4gICAgICAgICAgICAgICAgZ2wudGV4SW1hZ2UyRChcbiAgICAgICAgICAgICAgICAgICAgZ2wuVEVYVFVSRV8yRCwgLy8gZW51bSB0YXJnZXRcbiAgICAgICAgICAgICAgICAgICAgMCwgLy8gaW5kIGxldmVsXG4gICAgICAgICAgICAgICAgICAgIGdsLlJHQkEsIC8vIGluZCBpbnRlcm5hbGZvcm1hdFxuICAgICAgICAgICAgICAgICAgICB0aGlzLndpZHRoICogdGhpcy5waXhlbFJhdGlvLCAvLyBHTHNpemVpIHdpZHRoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGVpZ2h0ICogdGhpcy5waXhlbFJhdGlvLCAvLyBHTHNpemVpIGhlaWdodFxuICAgICAgICAgICAgICAgICAgICAwLCAvLyBpbmQgYm9yZGVyXG4gICAgICAgICAgICAgICAgICAgIGdsLlJHQkEsIC8vIGVudW0gZm9ybWF0XG4gICAgICAgICAgICAgICAgICAgIGdsLlVOU0lHTkVEX0JZVEUsIC8vIGVudW0gdHlwZVxuICAgICAgICAgICAgICAgICAgICBuZXcgVWludDhBcnJheSh0aGlzLmRhdGEuYnVmZmVyKSAvLyBPYmplY3QgZGF0YVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGdsLnRleFN1YkltYWdlMkQoXG4gICAgICAgICAgICAgICAgICAgIGdsLlRFWFRVUkVfMkQsIC8vIGVudW0gdGFyZ2V0XG4gICAgICAgICAgICAgICAgICAgIDAsIC8vIGludCBsZXZlbFxuICAgICAgICAgICAgICAgICAgICAwLCAvLyBpbnQgeG9mZnNldFxuICAgICAgICAgICAgICAgICAgICAwLCAvLyBpbnQgeW9mZnNldFxuICAgICAgICAgICAgICAgICAgICB0aGlzLndpZHRoICogdGhpcy5waXhlbFJhdGlvLCAvLyBsb25nIHdpZHRoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGVpZ2h0ICogdGhpcy5waXhlbFJhdGlvLCAvLyBsb25nIGhlaWdodFxuICAgICAgICAgICAgICAgICAgICBnbC5SR0JBLCAvLyBlbnVtIGZvcm1hdFxuICAgICAgICAgICAgICAgICAgICBnbC5VTlNJR05FRF9CWVRFLCAvLyBlbnVtIHR5cGVcbiAgICAgICAgICAgICAgICAgICAgbmV3IFVpbnQ4QXJyYXkodGhpcy5kYXRhLmJ1ZmZlcikgLy8gT2JqZWN0IHBpeGVsc1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBTcHJpdGVBdGxhcztcblxuZnVuY3Rpb24gY29weUJpdG1hcChzcmMsIHNyY1N0cmlkZSwgc3JjWCwgc3JjWSwgZHN0LCBkc3RTdHJpZGUsIGRzdFgsIGRzdFksIHdpZHRoLCBoZWlnaHQsIHdyYXApIHtcbiAgICBsZXQgc3JjSSA9IHNyY1kgKiBzcmNTdHJpZGUgKyBzcmNYO1xuICAgIGxldCBkc3RJID0gZHN0WSAqIGRzdFN0cmlkZSArIGRzdFg7XG4gICAgbGV0IHgsIHk7XG5cbiAgICBpZiAod3JhcCkge1xuICAgICAgICAvLyBhZGQgMSBwaXhlbCB3cmFwcGVkIHBhZGRpbmcgb24gZWFjaCBzaWRlIG9mIHRoZSBpbWFnZVxuICAgICAgICBkc3RJIC09IGRzdFN0cmlkZTtcbiAgICAgICAgZm9yICh5ID0gLTE7IHkgPD0gaGVpZ2h0OyB5KyssIHNyY0kgPSAoKHkgKyBoZWlnaHQpICUgaGVpZ2h0ICsgc3JjWSkgKiBzcmNTdHJpZGUgKyBzcmNYLCBkc3RJICs9IGRzdFN0cmlkZSkge1xuICAgICAgICAgICAgZm9yICh4ID0gLTE7IHggPD0gd2lkdGg7IHgrKykge1xuICAgICAgICAgICAgICAgIGRzdFtkc3RJICsgeF0gPSBzcmNbc3JjSSArICgoeCArIHdpZHRoKSAlIHdpZHRoKV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKywgc3JjSSArPSBzcmNTdHJpZGUsIGRzdEkgKz0gZHN0U3RyaWRlKSB7XG4gICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykge1xuICAgICAgICAgICAgICAgIGRzdFtkc3RJICsgeF0gPSBzcmNbc3JjSSArIHhdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBjcmVhdGVTdHJ1Y3RBcnJheVR5cGUgPSByZXF1aXJlKCcuLi91dGlsL3N0cnVjdF9hcnJheScpO1xuY29uc3QgUG9pbnQgPSByZXF1aXJlKCdwb2ludC1nZW9tZXRyeScpO1xuXG4vKlxuICpcbiAqIEEgU3RydWN0QXJyYXkgaW1wbGVtZW50YXRpb24gb2Ygc3ltYm9sSW5zdGFuY2VzIGZyb20gZGF0YS9idWNrZXQvc3ltYm9sX2J1Y2tldC5qc1xuICogdGhpcyB3aWxsIGFsbG93IHN5bWJvbEluc3RhbmNlcyB0byBiZSB0cmFuc2ZlcnJlZCBiZXR3ZWVuIHRoZSB3b3JrZXIgYW5kIG1haW4gdGhyZWFkc1xuICpcbiAqIEBjbGFzcyBTeW1ib2xJbnN0YW5jZUFycmF5XG4gKiBAcHJpdmF0ZVxuICovXG5cbmNvbnN0IFN5bWJvbEluc3RhbmNlc0FycmF5ID0gY3JlYXRlU3RydWN0QXJyYXlUeXBlKHtcbiAgICBtZW1iZXJzOiBbXG5cbiAgICAgICAgeyB0eXBlOiAnVWludDE2JywgbmFtZTogJ3RleHRCb3hTdGFydEluZGV4JyB9LFxuICAgICAgICB7IHR5cGU6ICdVaW50MTYnLCBuYW1lOiAndGV4dEJveEVuZEluZGV4JyB9LFxuICAgICAgICB7IHR5cGU6ICdVaW50MTYnLCBuYW1lOiAnaWNvbkJveFN0YXJ0SW5kZXgnIH0sXG4gICAgICAgIHsgdHlwZTogJ1VpbnQxNicsIG5hbWU6ICdpY29uQm94RW5kSW5kZXgnIH0sXG4gICAgICAgIHsgdHlwZTogJ1VpbnQxNicsIG5hbWU6ICdnbHlwaFF1YWRTdGFydEluZGV4JyB9LFxuICAgICAgICB7IHR5cGU6ICdVaW50MTYnLCBuYW1lOiAnZ2x5cGhRdWFkRW5kSW5kZXgnIH0sXG4gICAgICAgIHsgdHlwZTogJ1VpbnQxNicsIG5hbWU6ICdpY29uUXVhZFN0YXJ0SW5kZXgnIH0sXG4gICAgICAgIHsgdHlwZTogJ1VpbnQxNicsIG5hbWU6ICdpY29uUXVhZEVuZEluZGV4JyB9LFxuXG4gICAgICAgIC8vIGVhY2ggc3ltYm9sSW5zdGFuY2UgaXMgY2VudGVyZWQgYXJvdW5kIHRoZSBhbmNob3IgcG9pbnRcbiAgICAgICAgeyB0eXBlOiAnSW50MTYnLCBuYW1lOiAnYW5jaG9yUG9pbnRYJyB9LFxuICAgICAgICB7IHR5cGU6ICdJbnQxNicsIG5hbWU6ICdhbmNob3JQb2ludFknIH0sXG5cbiAgICAgICAgLy8gaW5kZXggLS0gbm90IHN1cmUgaWYgd2UgbmVlZCB0aGlzIC1AbW9sbHltZXJwXG4gICAgICAgIHsgdHlwZTogJ0ludDgnLCBuYW1lOiAnaW5kZXgnIH0sXG5cbiAgICAgICAgLy8gQml0bWFzayBpbmRpY2F0aW5nIGFsbCBhdmFpbGFibGUgd3JpdGluZyBtb2Rlc1xuICAgICAgICB7IHR5cGU6ICdVaW50OCcsIG5hbWU6ICd3cml0aW5nTW9kZXMnIH1cbiAgICBdXG59KTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFN5bWJvbEluc3RhbmNlc0FycmF5LnByb3RvdHlwZS5TdHJ1Y3RUeXBlLnByb3RvdHlwZSwgJ2FuY2hvclBvaW50Jywge1xuICAgIGdldCgpIHsgcmV0dXJuIG5ldyBQb2ludCh0aGlzLmFuY2hvclBvaW50WCwgdGhpcy5hbmNob3JQb2ludFkpOyB9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBTeW1ib2xJbnN0YW5jZXNBcnJheTtcbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgY3JlYXRlU3RydWN0QXJyYXlUeXBlID0gcmVxdWlyZSgnLi4vdXRpbC9zdHJ1Y3RfYXJyYXknKTtcbmNvbnN0IFBvaW50ID0gcmVxdWlyZSgncG9pbnQtZ2VvbWV0cnknKTtcbmNvbnN0IFN5bWJvbFF1YWQgPSByZXF1aXJlKCcuL3F1YWRzJykuU3ltYm9sUXVhZDtcblxuLy8gbm90ZXMgZnJvbSBhbnNpcyBvbiBzbGFjazpcbi8vIGl0IHdvdWxkIGJlIGJlc3QgaWYgdGhleSBhcmUgYWRkZWQgdG8gYSBidWZmZXIgaW4gYWR2YW5jZSBzbyB0aGF0IHRoZXkgYXJlIG9ubHkgY3JlYXRlZCBvbmNlLiBUaGVyZSB3b3VsZCBiZSBhIHNlcGFyYXRlIGJ1ZmZlciB3aXRoIGFsbCB0aGUgaW5kaXZpZHVhbCBjb2xsaXNpb24gYm94ZXMgYW5kIHRoZW4gU3ltYm9sSW5zdGFuY2Ugd291bGQgc3RvcmUgdGhlIGJlZ2lubmluZyBhbmQgZW5kIGluZGV4ZXMgb2YgYSBmZWF0dXJlJ3MgY29sbGlzaW9uYm94ZXMuIENvbGxpc2lvbkZlYXR1cmUgd291bGRuJ3QgcmVhbGx5IGV4aXN0IGFzIGEgc3RhbmRhbG9uZSB0aGluZywgaXQgd291bGQganVzdCBiZSBhIHJhbmdlIG9mIGJveGVzIGluIHRoZSBiaWcgY29sbGlzaW9uIGJveCBidWZmZXJcblxuLypcbiAqXG4gKiBBIFN0cnVjdEFycmF5IGltcGxlbWVudGF0aW9uIG9mIGdseXBoUXVhZCBmcm9tIHN5bWJvbC9xdWFkc1xuICogdGhpcyB3aWxsIGFsbG93IGdseXBoIHF1YWRzIHRvIGJlIHRyYW5zZmVycmVkIGJldHdlZW4gdGhlIHdvcmtlciBhbmQgbWFpbiB0aHJlYWRzIGFsb25nIHdpdGggdGhlIHJlc3Qgb2ZcbiAqIHRoZSBzeW1ib2xJbnN0YW5jZXNcbiAqXG4gKiBAY2xhc3MgU3ltYm9sUXVhZHNBcnJheVxuICogQHByaXZhdGVcbiAqL1xuXG5jb25zdCBTeW1ib2xRdWFkc0FycmF5ID0gY3JlYXRlU3RydWN0QXJyYXlUeXBlKHtcbiAgICBtZW1iZXJzOiBbXG4gICAgICAgIC8vIHRoZSBxdWFkIGlzIGNlbnRlcmVkIGFyb3VuZCB0aGUgYW5jaG9yIHBvaW50XG4gICAgICAgIHsgdHlwZTogJ0ludDE2JywgbmFtZTogJ2FuY2hvclBvaW50WCcgfSxcbiAgICAgICAgeyB0eXBlOiAnSW50MTYnLCBuYW1lOiAnYW5jaG9yUG9pbnRZJyB9LFxuXG4gICAgICAgIC8vIHRoZSBvZmZzZXRzIG9mIHRoZSB0bCAodG9wLWxlZnQpLCB0ciwgYmwsIGJyIGNvcm5lcnMgZnJvbSB0aGUgYW5jaG9yIHBvaW50XG4gICAgICAgIC8vIGRvIHRoZXNlIG5lZWQgdG8gYmUgZmxvYXRzP1xuICAgICAgICB7IHR5cGU6ICdGbG9hdDMyJywgbmFtZTogJ3RsWCcgfSxcbiAgICAgICAgeyB0eXBlOiAnRmxvYXQzMicsIG5hbWU6ICd0bFknIH0sXG4gICAgICAgIHsgdHlwZTogJ0Zsb2F0MzInLCBuYW1lOiAndHJYJyB9LFxuICAgICAgICB7IHR5cGU6ICdGbG9hdDMyJywgbmFtZTogJ3RyWScgfSxcbiAgICAgICAgeyB0eXBlOiAnRmxvYXQzMicsIG5hbWU6ICdibFgnIH0sXG4gICAgICAgIHsgdHlwZTogJ0Zsb2F0MzInLCBuYW1lOiAnYmxZJyB9LFxuICAgICAgICB7IHR5cGU6ICdGbG9hdDMyJywgbmFtZTogJ2JyWCcgfSxcbiAgICAgICAgeyB0eXBlOiAnRmxvYXQzMicsIG5hbWU6ICdiclknIH0sXG5cbiAgICAgICAgLy8gdGV4dHVyZSBjb29yZGluYXRlcyAoaGVpZ2h0LCB3aWR0aCwgeCwgYW5kIHkpXG4gICAgICAgIHsgdHlwZTogJ0ludDE2JywgbmFtZTogJ3RleEgnIH0sXG4gICAgICAgIHsgdHlwZTogJ0ludDE2JywgbmFtZTogJ3RleFcnIH0sXG4gICAgICAgIHsgdHlwZTogJ0ludDE2JywgbmFtZTogJ3RleFgnIH0sXG4gICAgICAgIHsgdHlwZTogJ0ludDE2JywgbmFtZTogJ3RleFknIH0sXG5cbiAgICAgICAgLy8gdGhlIGFuZ2xlIG9mIHRoZSBsYWJlbCBhdCBpdCdzIGNlbnRlciwgbm90IHRoZSBhbmdsZSBvZiB0aGlzIHF1YWQuXG4gICAgICAgIHsgdHlwZTogJ0Zsb2F0MzInLCBuYW1lOiAnYW5jaG9yQW5nbGUnIH0sXG4gICAgICAgIC8vIHRoZSBhbmdsZSBvZiB0aGlzIHF1YWQuXG4gICAgICAgIHsgdHlwZTogJ0Zsb2F0MzInLCBuYW1lOiAnZ2x5cGhBbmdsZScgfSxcblxuICAgICAgICAvLyBxdWFkIGlzIG9ubHkgdmFsaWQgZm9yIHNjYWxlcyA8IG1heFNjYWxlICYmIHNjYWxlID4gbWluU2NhbGUuXG4gICAgICAgIHsgdHlwZTogJ0Zsb2F0MzInLCBuYW1lOiAnbWF4U2NhbGUnIH0sXG4gICAgICAgIHsgdHlwZTogJ0Zsb2F0MzInLCBuYW1lOiAnbWluU2NhbGUnIH0sXG5cbiAgICAgICAgeyB0eXBlOiAnVWludDgnLCBuYW1lOiAnd3JpdGluZ01vZGUnIH1cbiAgICBdXG59KTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFN5bWJvbFF1YWRzQXJyYXkucHJvdG90eXBlLlN0cnVjdFR5cGUucHJvdG90eXBlLCAnYW5jaG9yUG9pbnQnLCB7XG4gICAgZ2V0KCkgeyByZXR1cm4gbmV3IFBvaW50KHRoaXMuYW5jaG9yUG9pbnRYLCB0aGlzLmFuY2hvclBvaW50WSk7IH1cbn0pO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoU3ltYm9sUXVhZHNBcnJheS5wcm90b3R5cGUuU3RydWN0VHlwZS5wcm90b3R5cGUsICdTeW1ib2xRdWFkJywge1xuICAgIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTeW1ib2xRdWFkKHRoaXMuYW5jaG9yUG9pbnQsXG4gICAgICAgICAgICBuZXcgUG9pbnQodGhpcy50bFgsIHRoaXMudGxZKSxcbiAgICAgICAgICAgIG5ldyBQb2ludCh0aGlzLnRyWCwgdGhpcy50clkpLFxuICAgICAgICAgICAgbmV3IFBvaW50KHRoaXMuYmxYLCB0aGlzLmJsWSksXG4gICAgICAgICAgICBuZXcgUG9pbnQodGhpcy5iclgsIHRoaXMuYnJZKSxcbiAgICAgICAgICAgIHsgeDogdGhpcy50ZXhYLCB5OiB0aGlzLnRleFksIGg6IHRoaXMudGV4SCwgdzogdGhpcy50ZXhXLCBoZWlnaHQ6IHRoaXMudGV4SCwgd2lkdGg6IHRoaXMudGV4VyB9LFxuICAgICAgICAgICAgdGhpcy5hbmNob3JBbmdsZSxcbiAgICAgICAgICAgIHRoaXMuZ2x5cGhBbmdsZSxcbiAgICAgICAgICAgIHRoaXMubWluU2NhbGUsXG4gICAgICAgICAgICB0aGlzLm1heFNjYWxlLFxuICAgICAgICAgICAgdGhpcy53cml0aW5nTW9kZSk7XG4gICAgfVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gU3ltYm9sUXVhZHNBcnJheTtcbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgRE9NID0gcmVxdWlyZSgnLi4vdXRpbC9kb20nKTtcbmNvbnN0IFBvaW50ID0gcmVxdWlyZSgncG9pbnQtZ2VvbWV0cnknKTtcblxuY29uc3QgaGFuZGxlcnMgPSB7XG4gICAgc2Nyb2xsWm9vbTogcmVxdWlyZSgnLi9oYW5kbGVyL3Njcm9sbF96b29tJyksXG4gICAgYm94Wm9vbTogcmVxdWlyZSgnLi9oYW5kbGVyL2JveF96b29tJyksXG4gICAgZHJhZ1JvdGF0ZTogcmVxdWlyZSgnLi9oYW5kbGVyL2RyYWdfcm90YXRlJyksXG4gICAgZHJhZ1BhbjogcmVxdWlyZSgnLi9oYW5kbGVyL2RyYWdfcGFuJyksXG4gICAga2V5Ym9hcmQ6IHJlcXVpcmUoJy4vaGFuZGxlci9rZXlib2FyZCcpLFxuICAgIGRvdWJsZUNsaWNrWm9vbTogcmVxdWlyZSgnLi9oYW5kbGVyL2RibGNsaWNrX3pvb20nKSxcbiAgICB0b3VjaFpvb21Sb3RhdGU6IHJlcXVpcmUoJy4vaGFuZGxlci90b3VjaF96b29tX3JvdGF0ZScpXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGJpbmRIYW5kbGVycyhtYXAsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBlbCA9IG1hcC5nZXRDYW52YXNDb250YWluZXIoKTtcbiAgICBsZXQgY29udGV4dE1lbnVFdmVudCA9IG51bGw7XG4gICAgbGV0IG1vdXNlRG93biA9IGZhbHNlO1xuICAgIGxldCBzdGFydFBvcyA9IG51bGw7XG4gICAgbGV0IHRhcHBlZCA9IG51bGw7XG5cbiAgICBmb3IgKGNvbnN0IG5hbWUgaW4gaGFuZGxlcnMpIHtcbiAgICAgICAgbWFwW25hbWVdID0gbmV3IGhhbmRsZXJzW25hbWVdKG1hcCwgb3B0aW9ucyk7XG4gICAgICAgIGlmIChvcHRpb25zLmludGVyYWN0aXZlICYmIG9wdGlvbnNbbmFtZV0pIHtcbiAgICAgICAgICAgIG1hcFtuYW1lXS5lbmFibGUob3B0aW9uc1tuYW1lXSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW91dCcsIG9uTW91c2VPdXQsIGZhbHNlKTtcbiAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBvbk1vdXNlRG93biwgZmFsc2UpO1xuICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvbk1vdXNlVXAsIGZhbHNlKTtcbiAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSwgZmFsc2UpO1xuICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBvblRvdWNoU3RhcnQsIGZhbHNlKTtcbiAgICBlbC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIG9uVG91Y2hFbmQsIGZhbHNlKTtcbiAgICBlbC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBvblRvdWNoTW92ZSwgZmFsc2UpO1xuICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoY2FuY2VsJywgb25Ub3VjaENhbmNlbCwgZmFsc2UpO1xuICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgb25DbGljaywgZmFsc2UpO1xuICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2RibGNsaWNrJywgb25EYmxDbGljaywgZmFsc2UpO1xuICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51Jywgb25Db250ZXh0TWVudSwgZmFsc2UpO1xuXG4gICAgZnVuY3Rpb24gb25Nb3VzZU91dChlKSB7XG4gICAgICAgIGZpcmVNb3VzZUV2ZW50KCdtb3VzZW91dCcsIGUpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uTW91c2VEb3duKGUpIHtcbiAgICAgICAgbWFwLnN0b3AoKTtcbiAgICAgICAgc3RhcnRQb3MgPSBET00ubW91c2VQb3MoZWwsIGUpO1xuICAgICAgICBmaXJlTW91c2VFdmVudCgnbW91c2Vkb3duJywgZSk7XG5cbiAgICAgICAgbW91c2VEb3duID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvbk1vdXNlVXAoZSkge1xuICAgICAgICBjb25zdCByb3RhdGluZyA9IG1hcC5kcmFnUm90YXRlICYmIG1hcC5kcmFnUm90YXRlLmlzQWN0aXZlKCk7XG5cbiAgICAgICAgaWYgKGNvbnRleHRNZW51RXZlbnQgJiYgIXJvdGF0aW5nKSB7XG4gICAgICAgICAgICAvLyBUaGlzIHdpbGwgYmUgdGhlIGNhc2UgZm9yIE1hY1xuICAgICAgICAgICAgZmlyZU1vdXNlRXZlbnQoJ2NvbnRleHRtZW51JywgY29udGV4dE1lbnVFdmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZXh0TWVudUV2ZW50ID0gbnVsbDtcbiAgICAgICAgbW91c2VEb3duID0gZmFsc2U7XG4gICAgICAgIGZpcmVNb3VzZUV2ZW50KCdtb3VzZXVwJywgZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25Nb3VzZU1vdmUoZSkge1xuICAgICAgICBpZiAobWFwLmRyYWdQYW4gJiYgbWFwLmRyYWdQYW4uaXNBY3RpdmUoKSkgcmV0dXJuO1xuICAgICAgICBpZiAobWFwLmRyYWdSb3RhdGUgJiYgbWFwLmRyYWdSb3RhdGUuaXNBY3RpdmUoKSkgcmV0dXJuO1xuXG4gICAgICAgIGxldCB0YXJnZXQgPSBlLnRvRWxlbWVudCB8fCBlLnRhcmdldDtcbiAgICAgICAgd2hpbGUgKHRhcmdldCAmJiB0YXJnZXQgIT09IGVsKSB0YXJnZXQgPSB0YXJnZXQucGFyZW50Tm9kZTtcbiAgICAgICAgaWYgKHRhcmdldCAhPT0gZWwpIHJldHVybjtcblxuICAgICAgICBmaXJlTW91c2VFdmVudCgnbW91c2Vtb3ZlJywgZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25Ub3VjaFN0YXJ0KGUpIHtcbiAgICAgICAgbWFwLnN0b3AoKTtcbiAgICAgICAgZmlyZVRvdWNoRXZlbnQoJ3RvdWNoc3RhcnQnLCBlKTtcblxuICAgICAgICBpZiAoIWUudG91Y2hlcyB8fCBlLnRvdWNoZXMubGVuZ3RoID4gMSkgcmV0dXJuO1xuXG4gICAgICAgIGlmICghdGFwcGVkKSB7XG4gICAgICAgICAgICB0YXBwZWQgPSBzZXRUaW1lb3V0KG9uVG91Y2hUaW1lb3V0LCAzMDApO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGFwcGVkKTtcbiAgICAgICAgICAgIHRhcHBlZCA9IG51bGw7XG4gICAgICAgICAgICBmaXJlTW91c2VFdmVudCgnZGJsY2xpY2snLCBlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uVG91Y2hNb3ZlKGUpIHtcbiAgICAgICAgZmlyZVRvdWNoRXZlbnQoJ3RvdWNobW92ZScsIGUpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uVG91Y2hFbmQoZSkge1xuICAgICAgICBmaXJlVG91Y2hFdmVudCgndG91Y2hlbmQnLCBlKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvblRvdWNoQ2FuY2VsKGUpIHtcbiAgICAgICAgZmlyZVRvdWNoRXZlbnQoJ3RvdWNoY2FuY2VsJywgZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25Ub3VjaFRpbWVvdXQoKSB7XG4gICAgICAgIHRhcHBlZCA9IG51bGw7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25DbGljayhlKSB7XG4gICAgICAgIGNvbnN0IHBvcyA9IERPTS5tb3VzZVBvcyhlbCwgZSk7XG5cbiAgICAgICAgaWYgKHBvcy5lcXVhbHMoc3RhcnRQb3MpKSB7XG4gICAgICAgICAgICBmaXJlTW91c2VFdmVudCgnY2xpY2snLCBlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uRGJsQ2xpY2soZSkge1xuICAgICAgICBmaXJlTW91c2VFdmVudCgnZGJsY2xpY2snLCBlKTtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uQ29udGV4dE1lbnUoZSkge1xuICAgICAgICBjb25zdCByb3RhdGluZyA9IG1hcC5kcmFnUm90YXRlICYmIG1hcC5kcmFnUm90YXRlLmlzQWN0aXZlKCk7XG4gICAgICAgIGlmICghbW91c2VEb3duICYmICFyb3RhdGluZykge1xuICAgICAgICAgICAgLy8gV2luZG93czogY29udGV4dG1lbnUgZmlyZWQgb24gbW91c2V1cCwgc28gZmlyZSBldmVudCBub3dcbiAgICAgICAgICAgIGZpcmVNb3VzZUV2ZW50KCdjb250ZXh0bWVudScsIGUpO1xuICAgICAgICB9IGVsc2UgaWYgKG1vdXNlRG93bikge1xuICAgICAgICAgICAgLy8gTWFjOiBjb250ZXh0bWVudSBmaXJlZCBvbiBtb3VzZWRvd247IHdlIHNhdmUgaXQgdW50aWwgbW91c2V1cCBmb3IgY29uc2lzdGVuY3kncyBzYWtlXG4gICAgICAgICAgICBjb250ZXh0TWVudUV2ZW50ID0gZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmaXJlTW91c2VFdmVudCh0eXBlLCBlKSB7XG4gICAgICAgIGNvbnN0IHBvcyA9IERPTS5tb3VzZVBvcyhlbCwgZSk7XG5cbiAgICAgICAgcmV0dXJuIG1hcC5maXJlKHR5cGUsIHtcbiAgICAgICAgICAgIGxuZ0xhdDogbWFwLnVucHJvamVjdChwb3MpLFxuICAgICAgICAgICAgcG9pbnQ6IHBvcyxcbiAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGVcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZmlyZVRvdWNoRXZlbnQodHlwZSwgZSkge1xuICAgICAgICBjb25zdCB0b3VjaGVzID0gRE9NLnRvdWNoUG9zKGVsLCBlKTtcbiAgICAgICAgY29uc3Qgc2luZ3VsYXIgPSB0b3VjaGVzLnJlZHVjZSgocHJldiwgY3VyciwgaSwgYXJyKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gcHJldi5hZGQoY3Vyci5kaXYoYXJyLmxlbmd0aCkpO1xuICAgICAgICB9LCBuZXcgUG9pbnQoMCwgMCkpO1xuXG4gICAgICAgIHJldHVybiBtYXAuZmlyZSh0eXBlLCB7XG4gICAgICAgICAgICBsbmdMYXQ6IG1hcC51bnByb2plY3Qoc2luZ3VsYXIpLFxuICAgICAgICAgICAgcG9pbnQ6IHNpbmd1bGFyLFxuICAgICAgICAgICAgbG5nTGF0czogdG91Y2hlcy5tYXAoKHQpID0+IHsgcmV0dXJuIG1hcC51bnByb2plY3QodCk7IH0sIHRoaXMpLFxuICAgICAgICAgICAgcG9pbnRzOiB0b3VjaGVzLFxuICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZVxuICAgICAgICB9KTtcbiAgICB9XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IE1hcE1vdXNlRXZlbnRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0eXBlIFRoZSBldmVudCB0eXBlLlxuICogQHByb3BlcnR5IHtNYXB9IHRhcmdldCBUaGUgYE1hcGAgb2JqZWN0IHRoYXQgZmlyZWQgdGhlIGV2ZW50LlxuICogQHByb3BlcnR5IHtNb3VzZUV2ZW50fSBvcmlnaW5hbEV2ZW50XG4gKiBAcHJvcGVydHkge1BvaW50fSBwb2ludCBUaGUgcGl4ZWwgY29vcmRpbmF0ZXMgb2YgdGhlIG1vdXNlIGV2ZW50IHRhcmdldCwgcmVsYXRpdmUgdG8gdGhlIG1hcFxuICogICBhbmQgbWVhc3VyZWQgZnJvbSB0aGUgdG9wIGxlZnQgY29ybmVyLlxuICogQHByb3BlcnR5IHtMbmdMYXR9IGxuZ0xhdCBUaGUgZ2VvZ3JhcGhpYyBsb2NhdGlvbiBvbiB0aGUgbWFwIG9mIHRoZSBtb3VzZSBldmVudCB0YXJnZXQuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBNYXBUb3VjaEV2ZW50XG4gKiBAcHJvcGVydHkge3N0cmluZ30gdHlwZSBUaGUgZXZlbnQgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7TWFwfSB0YXJnZXQgVGhlIGBNYXBgIG9iamVjdCB0aGF0IGZpcmVkIHRoZSBldmVudC5cbiAqIEBwcm9wZXJ0eSB7VG91Y2hFdmVudH0gb3JpZ2luYWxFdmVudFxuICogQHByb3BlcnR5IHtQb2ludH0gcG9pbnQgVGhlIHBpeGVsIGNvb3JkaW5hdGVzIG9mIHRoZSBjZW50ZXIgb2YgdGhlIHRvdWNoIGV2ZW50IHBvaW50cywgcmVsYXRpdmUgdG8gdGhlIG1hcFxuICogICBhbmQgbWVhc3VyZWQgZnJvbSB0aGUgdG9wIGxlZnQgY29ybmVyLlxuICogQHByb3BlcnR5IHtMbmdMYXR9IGxuZ0xhdCBUaGUgZ2VvZ3JhcGhpYyBsb2NhdGlvbiBvbiB0aGUgbWFwIG9mIHRoZSBjZW50ZXIgb2YgdGhlIHRvdWNoIGV2ZW50IHBvaW50cy5cbiAqIEBwcm9wZXJ0eSB7QXJyYXk8UG9pbnQ+fSBwb2ludHMgVGhlIGFycmF5IG9mIHBpeGVsIGNvb3JkaW5hdGVzIGNvcnJlc3BvbmRpbmcgdG9cbiAqICAgYSBbdG91Y2ggZXZlbnQncyBgdG91Y2hlc2BdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Ub3VjaEV2ZW50L3RvdWNoZXMpXG4gKiAgIHByb3BlcnR5LlxuICogQHByb3BlcnR5IHtBcnJheTxMbmdMYXQ+fSBsbmdMYXRzIFRoZSBnZW9ncmFwaGljYWwgbG9jYXRpb25zIG9uIHRoZSBtYXAgY29ycmVzcG9uZGluZyB0b1xuICogICBhIFt0b3VjaCBldmVudCdzIGB0b3VjaGVzYF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1RvdWNoRXZlbnQvdG91Y2hlcylcbiAqICAgcHJvcGVydHkuXG4gKi9cbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgdXRpbCA9IHJlcXVpcmUoJy4uL3V0aWwvdXRpbCcpO1xuY29uc3QgaW50ZXJwb2xhdGUgPSByZXF1aXJlKCcuLi91dGlsL2ludGVycG9sYXRlJyk7XG5jb25zdCBicm93c2VyID0gcmVxdWlyZSgnLi4vdXRpbC9icm93c2VyJyk7XG5jb25zdCBMbmdMYXQgPSByZXF1aXJlKCcuLi9nZW8vbG5nX2xhdCcpO1xuY29uc3QgTG5nTGF0Qm91bmRzID0gcmVxdWlyZSgnLi4vZ2VvL2xuZ19sYXRfYm91bmRzJyk7XG5jb25zdCBQb2ludCA9IHJlcXVpcmUoJ3BvaW50LWdlb21ldHJ5Jyk7XG5jb25zdCBFdmVudGVkID0gcmVxdWlyZSgnLi4vdXRpbC9ldmVudGVkJyk7XG5cbi8qKlxuICogT3B0aW9ucyBjb21tb24gdG8ge0BsaW5rIE1hcCNqdW1wVG99LCB7QGxpbmsgTWFwI2Vhc2VUb30sIGFuZCB7QGxpbmsgTWFwI2ZseVRvfSxcbiAqIGNvbnRyb2xsaW5nIHRoZSBkZXN0aW5hdGlvbidzIGxvY2F0aW9uLCB6b29tIGxldmVsLCBiZWFyaW5nLCBhbmQgcGl0Y2guXG4gKiBBbGwgcHJvcGVydGllcyBhcmUgb3B0aW9uYWwuIFVuc3BlY2lmaWVkXG4gKiBvcHRpb25zIHdpbGwgZGVmYXVsdCB0byB0aGUgbWFwJ3MgY3VycmVudCB2YWx1ZSBmb3IgdGhhdCBwcm9wZXJ0eS5cbiAqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDYW1lcmFPcHRpb25zXG4gKiBAcHJvcGVydHkge0xuZ0xhdExpa2V9IGNlbnRlciBUaGUgZGVzdGluYXRpb24ncyBjZW50ZXIuXG4gKiBAcHJvcGVydHkge251bWJlcn0gem9vbSBUaGUgZGVzdGluYXRpb24ncyB6b29tIGxldmVsLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGJlYXJpbmcgVGhlIGRlc3RpbmF0aW9uJ3MgYmVhcmluZyAocm90YXRpb24pLCBtZWFzdXJlZCBpbiBkZWdyZWVzIGNvdW50ZXItY2xvY2t3aXNlIGZyb20gbm9ydGguXG4gKiBAcHJvcGVydHkge251bWJlcn0gcGl0Y2ggVGhlIGRlc3RpbmF0aW9uJ3MgcGl0Y2ggKHRpbHQpLCBtZWFzdXJlZCBpbiBkZWdyZWVzLlxuICogQHByb3BlcnR5IHtMbmdMYXRMaWtlfSBhcm91bmQgSWYgYSBgem9vbWAgaXMgc3BlY2lmaWVkLCBgYXJvdW5kYCBkZXRlcm1pbmVzIHRoZSB6b29tIGNlbnRlciAoZGVmYXVsdHMgdG8gdGhlIGNlbnRlciBvZiB0aGUgbWFwKS5cbiAqL1xuXG4vKipcbiAqIE9wdGlvbnMgY29tbW9uIHRvIG1hcCBtb3ZlbWVudCBtZXRob2RzIHRoYXQgaW52b2x2ZSBhbmltYXRpb24sIHN1Y2ggYXMge0BsaW5rIE1hcCNwYW5CeX0gYW5kXG4gKiB7QGxpbmsgTWFwI2Vhc2VUb30sIGNvbnRyb2xsaW5nIHRoZSBkdXJhdGlvbiBhbmQgZWFzaW5nIGZ1bmN0aW9uIG9mIHRoZSBhbmltYXRpb24uIEFsbCBwcm9wZXJ0aWVzXG4gKiBhcmUgb3B0aW9uYWwuXG4gKlxuICogQHR5cGVkZWYge09iamVjdH0gQW5pbWF0aW9uT3B0aW9uc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IGR1cmF0aW9uIFRoZSBhbmltYXRpb24ncyBkdXJhdGlvbiwgbWVhc3VyZWQgaW4gbWlsbGlzZWNvbmRzLlxuICogQHByb3BlcnR5IHtGdW5jdGlvbn0gZWFzaW5nIFRoZSBhbmltYXRpb24ncyBlYXNpbmcgZnVuY3Rpb24uXG4gKiBAcHJvcGVydHkge1BvaW50TGlrZX0gb2Zmc2V0IGB4YCBhbmQgYHlgIGNvb3JkaW5hdGVzIHJlcHJlc2VudGluZyB0aGUgYW5pbWF0aW9uJ3Mgb3JpZ2luIG9mIG1vdmVtZW50IHJlbGF0aXZlIHRvIHRoZSBtYXAncyBjZW50ZXIuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGFuaW1hdGUgSWYgYGZhbHNlYCwgbm8gYW5pbWF0aW9uIHdpbGwgb2NjdXIuXG4gKi9cblxuY2xhc3MgQ2FtZXJhIGV4dGVuZHMgRXZlbnRlZCB7XG5cbiAgICBjb25zdHJ1Y3Rvcih0cmFuc2Zvcm0sIG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5tb3ZpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50cmFuc2Zvcm0gPSB0cmFuc2Zvcm07XG4gICAgICAgIHRoaXMuX2JlYXJpbmdTbmFwID0gb3B0aW9ucy5iZWFyaW5nU25hcDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBtYXAncyBnZW9ncmFwaGljYWwgY2VudGVycG9pbnQuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgTWFwI1xuICAgICAqIEByZXR1cm5zIHtMbmdMYXR9IFRoZSBtYXAncyBnZW9ncmFwaGljYWwgY2VudGVycG9pbnQuXG4gICAgICovXG4gICAgZ2V0Q2VudGVyKCkgeyByZXR1cm4gdGhpcy50cmFuc2Zvcm0uY2VudGVyOyB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBtYXAncyBnZW9ncmFwaGljYWwgY2VudGVycG9pbnQuIEVxdWl2YWxlbnQgdG8gYGp1bXBUbyh7Y2VudGVyOiBjZW50ZXJ9KWAuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgTWFwI1xuICAgICAqIEBwYXJhbSB7TG5nTGF0TGlrZX0gY2VudGVyIFRoZSBjZW50ZXJwb2ludCB0byBzZXQuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtldmVudERhdGFdIERhdGEgdG8gcHJvcGFnYXRlIHRvIGFueSBldmVudCBsaXN0ZW5lcnMuXG4gICAgICogQGZpcmVzIG1vdmVzdGFydFxuICAgICAqIEBmaXJlcyBtb3ZlZW5kXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXAuc2V0Q2VudGVyKFstNzQsIDM4XSk7XG4gICAgICogQHNlZSBbTW92ZSBzeW1ib2wgd2l0aCB0aGUga2V5Ym9hcmRdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvcm90YXRpbmctY29udHJvbGxhYmxlLW1hcmtlci8pXG4gICAgICovXG4gICAgc2V0Q2VudGVyKGNlbnRlciwgZXZlbnREYXRhKSB7XG4gICAgICAgIHRoaXMuanVtcFRvKHtjZW50ZXI6IGNlbnRlcn0sIGV2ZW50RGF0YSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhbnMgdGhlIG1hcCBieSB0aGUgc3BlY2lmaWVkIG9mZmVzdC5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBNYXAjXG4gICAgICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBvZmZzZXQgYHhgIGFuZCBgeWAgY29vcmRpbmF0ZXMgYnkgd2hpY2ggdG8gcGFuIHRoZSBtYXAuXG4gICAgICogQHBhcmFtIHtBbmltYXRpb25PcHRpb25zfSBbb3B0aW9uc11cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW2V2ZW50RGF0YV0gRGF0YSB0byBwcm9wYWdhdGUgdG8gYW55IGV2ZW50IGxpc3RlbmVycy5cbiAgICAgKiBAZmlyZXMgbW92ZXN0YXJ0XG4gICAgICogQGZpcmVzIG1vdmVlbmRcbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcbiAgICAgKiBAc2VlIFtOYXZpZ2F0ZSB0aGUgbWFwIHdpdGggZ2FtZS1saWtlIGNvbnRyb2xzXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2dhbWUtY29udHJvbHMvKVxuICAgICAqL1xuICAgIHBhbkJ5KG9mZnNldCwgb3B0aW9ucywgZXZlbnREYXRhKSB7XG4gICAgICAgIHRoaXMucGFuVG8odGhpcy50cmFuc2Zvcm0uY2VudGVyLFxuICAgICAgICAgICAgdXRpbC5leHRlbmQoe29mZnNldDogUG9pbnQuY29udmVydChvZmZzZXQpLm11bHQoLTEpfSwgb3B0aW9ucyksIGV2ZW50RGF0YSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhbnMgdGhlIG1hcCB0byB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uLCB3aXRoIGFuIGFuaW1hdGVkIHRyYW5zaXRpb24uXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgTWFwI1xuICAgICAqIEBwYXJhbSB7TG5nTGF0TGlrZX0gbG5nbGF0IFRoZSBsb2NhdGlvbiB0byBwYW4gdGhlIG1hcCB0by5cbiAgICAgKiBAcGFyYW0ge0FuaW1hdGlvbk9wdGlvbnN9IFtvcHRpb25zXVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbZXZlbnREYXRhXSBEYXRhIHRvIHByb3BhZ2F0ZSB0byBhbnkgZXZlbnQgbGlzdGVuZXJzLlxuICAgICAqIEBmaXJlcyBtb3Zlc3RhcnRcbiAgICAgKiBAZmlyZXMgbW92ZWVuZFxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqL1xuICAgIHBhblRvKGxuZ2xhdCwgb3B0aW9ucywgZXZlbnREYXRhKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVhc2VUbyh1dGlsLmV4dGVuZCh7XG4gICAgICAgICAgICBjZW50ZXI6IGxuZ2xhdFxuICAgICAgICB9LCBvcHRpb25zKSwgZXZlbnREYXRhKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBtYXAncyBjdXJyZW50IHpvb20gbGV2ZWwuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgTWFwI1xuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBtYXAncyBjdXJyZW50IHpvb20gbGV2ZWwuXG4gICAgICovXG4gICAgZ2V0Wm9vbSgpIHsgcmV0dXJuIHRoaXMudHJhbnNmb3JtLnpvb207IH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIG1hcCdzIHpvb20gbGV2ZWwuIEVxdWl2YWxlbnQgdG8gYGp1bXBUbyh7em9vbTogem9vbX0pYC5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBNYXAjXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHpvb20gVGhlIHpvb20gbGV2ZWwgdG8gc2V0ICgwLTIwKS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW2V2ZW50RGF0YV0gRGF0YSB0byBwcm9wYWdhdGUgdG8gYW55IGV2ZW50IGxpc3RlbmVycy5cbiAgICAgKiBAZmlyZXMgbW92ZXN0YXJ0XG4gICAgICogQGZpcmVzIHpvb21zdGFydFxuICAgICAqIEBmaXJlcyBtb3ZlXG4gICAgICogQGZpcmVzIHpvb21cbiAgICAgKiBAZmlyZXMgbW92ZWVuZFxuICAgICAqIEBmaXJlcyB6b29tZW5kXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyB6b29tIHRoZSBtYXAgdG8gNVxuICAgICAqIG1hcC5zZXRab29tKDUpO1xuICAgICAqL1xuICAgIHNldFpvb20oem9vbSwgZXZlbnREYXRhKSB7XG4gICAgICAgIHRoaXMuanVtcFRvKHt6b29tOiB6b29tfSwgZXZlbnREYXRhKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogWm9vbXMgdGhlIG1hcCB0byB0aGUgc3BlY2lmaWVkIHpvb20gbGV2ZWwsIHdpdGggYW4gYW5pbWF0ZWQgdHJhbnNpdGlvbi5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBNYXAjXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHpvb20gVGhlIHpvb20gbGV2ZWwgdG8gdHJhbnNpdGlvbiB0by5cbiAgICAgKiBAcGFyYW0ge0FuaW1hdGlvbk9wdGlvbnN9IFtvcHRpb25zXVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbZXZlbnREYXRhXSBEYXRhIHRvIHByb3BhZ2F0ZSB0byBhbnkgZXZlbnQgbGlzdGVuZXJzLlxuICAgICAqIEBmaXJlcyBtb3Zlc3RhcnRcbiAgICAgKiBAZmlyZXMgem9vbXN0YXJ0XG4gICAgICogQGZpcmVzIG1vdmVcbiAgICAgKiBAZmlyZXMgem9vbVxuICAgICAqIEBmaXJlcyBtb3ZlZW5kXG4gICAgICogQGZpcmVzIHpvb21lbmRcbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcbiAgICAgKi9cbiAgICB6b29tVG8oem9vbSwgb3B0aW9ucywgZXZlbnREYXRhKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVhc2VUbyh1dGlsLmV4dGVuZCh7XG4gICAgICAgICAgICB6b29tOiB6b29tXG4gICAgICAgIH0sIG9wdGlvbnMpLCBldmVudERhdGEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluY3JlYXNlcyB0aGUgbWFwJ3Mgem9vbSBsZXZlbCBieSAxLlxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIE1hcCNcbiAgICAgKiBAcGFyYW0ge0FuaW1hdGlvbk9wdGlvbnN9IFtvcHRpb25zXVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbZXZlbnREYXRhXSBEYXRhIHRvIHByb3BhZ2F0ZSB0byBhbnkgZXZlbnQgbGlzdGVuZXJzLlxuICAgICAqIEBmaXJlcyBtb3Zlc3RhcnRcbiAgICAgKiBAZmlyZXMgem9vbXN0YXJ0XG4gICAgICogQGZpcmVzIG1vdmVcbiAgICAgKiBAZmlyZXMgem9vbVxuICAgICAqIEBmaXJlcyBtb3ZlZW5kXG4gICAgICogQGZpcmVzIHpvb21lbmRcbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcbiAgICAgKi9cbiAgICB6b29tSW4ob3B0aW9ucywgZXZlbnREYXRhKSB7XG4gICAgICAgIHRoaXMuem9vbVRvKHRoaXMuZ2V0Wm9vbSgpICsgMSwgb3B0aW9ucywgZXZlbnREYXRhKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVjcmVhc2VzIHRoZSBtYXAncyB6b29tIGxldmVsIGJ5IDEuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgTWFwI1xuICAgICAqIEBwYXJhbSB7QW5pbWF0aW9uT3B0aW9uc30gW29wdGlvbnNdXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtldmVudERhdGFdIERhdGEgdG8gcHJvcGFnYXRlIHRvIGFueSBldmVudCBsaXN0ZW5lcnMuXG4gICAgICogQGZpcmVzIG1vdmVzdGFydFxuICAgICAqIEBmaXJlcyB6b29tc3RhcnRcbiAgICAgKiBAZmlyZXMgbW92ZVxuICAgICAqIEBmaXJlcyB6b29tXG4gICAgICogQGZpcmVzIG1vdmVlbmRcbiAgICAgKiBAZmlyZXMgem9vbWVuZFxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqL1xuICAgIHpvb21PdXQob3B0aW9ucywgZXZlbnREYXRhKSB7XG4gICAgICAgIHRoaXMuem9vbVRvKHRoaXMuZ2V0Wm9vbSgpIC0gMSwgb3B0aW9ucywgZXZlbnREYXRhKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbWFwJ3MgY3VycmVudCBiZWFyaW5nIChyb3RhdGlvbikuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgTWFwI1xuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBtYXAncyBjdXJyZW50IGJlYXJpbmcsIG1lYXN1cmVkIGluIGRlZ3JlZXMgY291bnRlci1jbG9ja3dpc2UgZnJvbSBub3J0aC5cbiAgICAgKiBAc2VlIFtOYXZpZ2F0ZSB0aGUgbWFwIHdpdGggZ2FtZS1saWtlIGNvbnRyb2xzXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2dhbWUtY29udHJvbHMvKVxuICAgICAqL1xuICAgIGdldEJlYXJpbmcoKSB7IHJldHVybiB0aGlzLnRyYW5zZm9ybS5iZWFyaW5nOyB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBtYXBzJyBiZWFyaW5nIChyb3RhdGlvbikuIEVxdWl2YWxlbnQgdG8gYGp1bXBUbyh7YmVhcmluZzogYmVhcmluZ30pYC5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBNYXAjXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJlYXJpbmcgVGhlIGJlYXJpbmcgdG8gc2V0LCBtZWFzdXJlZCBpbiBkZWdyZWVzIGNvdW50ZXItY2xvY2t3aXNlIGZyb20gbm9ydGguXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtldmVudERhdGFdIERhdGEgdG8gcHJvcGFnYXRlIHRvIGFueSBldmVudCBsaXN0ZW5lcnMuXG4gICAgICogQGZpcmVzIG1vdmVzdGFydFxuICAgICAqIEBmaXJlcyBtb3ZlZW5kXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyByb3RhdGUgdGhlIG1hcCB0byA5MCBkZWdyZWVzXG4gICAgICogbWFwLnNldEJlYXJpbmcoOTApO1xuICAgICAqL1xuICAgIHNldEJlYXJpbmcoYmVhcmluZywgZXZlbnREYXRhKSB7XG4gICAgICAgIHRoaXMuanVtcFRvKHtiZWFyaW5nOiBiZWFyaW5nfSwgZXZlbnREYXRhKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUm90YXRlcyB0aGUgbWFwIHRvIHRoZSBzcGVjaWZpZWQgYmVhcmluZywgd2l0aCBhbiBhbmltYXRlZCB0cmFuc2l0aW9uLlxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIE1hcCNcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYmVhcmluZyBUaGUgYmVhcmluZyB0byByb3RhdGUgdGhlIG1hcCB0bywgbWVhc3VyZWQgaW4gZGVncmVlcyBjb3VudGVyLWNsb2Nrd2lzZSBmcm9tIG5vcnRoLlxuICAgICAqIEBwYXJhbSB7QW5pbWF0aW9uT3B0aW9uc30gW29wdGlvbnNdXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtldmVudERhdGFdIERhdGEgdG8gcHJvcGFnYXRlIHRvIGFueSBldmVudCBsaXN0ZW5lcnMuXG4gICAgICogQGZpcmVzIG1vdmVzdGFydFxuICAgICAqIEBmaXJlcyBtb3ZlZW5kXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICovXG4gICAgcm90YXRlVG8oYmVhcmluZywgb3B0aW9ucywgZXZlbnREYXRhKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVhc2VUbyh1dGlsLmV4dGVuZCh7XG4gICAgICAgICAgICBiZWFyaW5nOiBiZWFyaW5nXG4gICAgICAgIH0sIG9wdGlvbnMpLCBldmVudERhdGEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJvdGF0ZXMgdGhlIG1hcCB0byBhIGJlYXJpbmcgb2YgMCAoZHVlIG5vcnRoKSwgd2l0aCBhbiBhbmltYXRlZCB0cmFuc2l0aW9uLlxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIE1hcCNcbiAgICAgKiBAcGFyYW0ge0FuaW1hdGlvbk9wdGlvbnN9IFtvcHRpb25zXVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbZXZlbnREYXRhXSBEYXRhIHRvIHByb3BhZ2F0ZSB0byBhbnkgZXZlbnQgbGlzdGVuZXJzLlxuICAgICAqIEBmaXJlcyBtb3Zlc3RhcnRcbiAgICAgKiBAZmlyZXMgbW92ZWVuZFxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqL1xuICAgIHJlc2V0Tm9ydGgob3B0aW9ucywgZXZlbnREYXRhKSB7XG4gICAgICAgIHRoaXMucm90YXRlVG8oMCwgdXRpbC5leHRlbmQoe2R1cmF0aW9uOiAxMDAwfSwgb3B0aW9ucyksIGV2ZW50RGF0YSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNuYXBzIHRoZSBtYXAncyBiZWFyaW5nIHRvIDAgKGR1ZSBub3J0aCksIGlmIHRoZSBjdXJyZW50IGJlYXJpbmcgaXMgY2xvc2UgZW5vdWdoIHRvIGl0IChpLmUuIHdpdGhpbiB0aGUgYGJlYXJpbmdTbmFwYCB0aHJlc2hvbGQpLlxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIE1hcCNcbiAgICAgKiBAcGFyYW0ge0FuaW1hdGlvbk9wdGlvbnN9IFtvcHRpb25zXVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbZXZlbnREYXRhXSBEYXRhIHRvIHByb3BhZ2F0ZSB0byBhbnkgZXZlbnQgbGlzdGVuZXJzLlxuICAgICAqIEBmaXJlcyBtb3Zlc3RhcnRcbiAgICAgKiBAZmlyZXMgbW92ZWVuZFxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqL1xuICAgIHNuYXBUb05vcnRoKG9wdGlvbnMsIGV2ZW50RGF0YSkge1xuICAgICAgICBpZiAoTWF0aC5hYnModGhpcy5nZXRCZWFyaW5nKCkpIDwgdGhpcy5fYmVhcmluZ1NuYXApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlc2V0Tm9ydGgob3B0aW9ucywgZXZlbnREYXRhKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBtYXAncyBjdXJyZW50IHBpdGNoICh0aWx0KS5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBNYXAjXG4gICAgICogQHJldHVybnMge251bWJlcn0gVGhlIG1hcCdzIGN1cnJlbnQgcGl0Y2gsIG1lYXN1cmVkIGluIGRlZ3JlZXMgYXdheSBmcm9tIHRoZSBwbGFuZSBvZiB0aGUgc2NyZWVuLlxuICAgICAqL1xuICAgIGdldFBpdGNoKCkgeyByZXR1cm4gdGhpcy50cmFuc2Zvcm0ucGl0Y2g7IH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIG1hcCdzIHBpdGNoICh0aWx0KS4gRXF1aXZhbGVudCB0byBganVtcFRvKHtwaXRjaDogcGl0Y2h9KWAuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgTWFwI1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBwaXRjaCBUaGUgcGl0Y2ggdG8gc2V0LCBtZWFzdXJlZCBpbiBkZWdyZWVzIGF3YXkgZnJvbSB0aGUgcGxhbmUgb2YgdGhlIHNjcmVlbiAoMC02MCkuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtldmVudERhdGFdIERhdGEgdG8gcHJvcGFnYXRlIHRvIGFueSBldmVudCBsaXN0ZW5lcnMuXG4gICAgICogQGZpcmVzIG1vdmVzdGFydFxuICAgICAqIEBmaXJlcyBtb3ZlZW5kXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICovXG4gICAgc2V0UGl0Y2gocGl0Y2gsIGV2ZW50RGF0YSkge1xuICAgICAgICB0aGlzLmp1bXBUbyh7cGl0Y2g6IHBpdGNofSwgZXZlbnREYXRhKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBQYW5zIGFuZCB6b29tcyB0aGUgbWFwIHRvIGNvbnRhaW4gaXRzIHZpc2libGUgYXJlYSB3aXRoaW4gdGhlIHNwZWNpZmllZCBnZW9ncmFwaGljYWwgYm91bmRzLlxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIE1hcCNcbiAgICAgKiBAcGFyYW0ge0xuZ0xhdEJvdW5kc0xpa2V9IGJvdW5kcyBDZW50ZXIgdGhlc2UgYm91bmRzIGluIHRoZSB2aWV3cG9ydCBhbmQgdXNlIHRoZSBoaWdoZXN0XG4gICAgICogICAgICB6b29tIGxldmVsIHVwIHRvIGFuZCBpbmNsdWRpbmcgYE1hcCNnZXRNYXhab29tKClgIHRoYXQgZml0cyB0aGVtIGluIHRoZSB2aWV3cG9ydC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5saW5lYXI9ZmFsc2VdIElmIGB0cnVlYCwgdGhlIG1hcCB0cmFuc2l0aW9ucyB1c2luZ1xuICAgICAqICAgICB7QGxpbmsgTWFwI2Vhc2VUb30uIElmIGBmYWxzZWAsIHRoZSBtYXAgdHJhbnNpdGlvbnMgdXNpbmcge0BsaW5rIE1hcCNmbHlUb30uIFNlZVxuICAgICAqICAgICB7QGxpbmsgTWFwI2ZseVRvfSBmb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9wdGlvbnMgc3BlY2lmaWMgdG8gdGhhdCBhbmltYXRlZCB0cmFuc2l0aW9uLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLmVhc2luZ10gQW4gZWFzaW5nIGZ1bmN0aW9uIGZvciB0aGUgYW5pbWF0ZWQgdHJhbnNpdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMucGFkZGluZz0wXSBUaGUgYW1vdW50IG9mIHBhZGRpbmcsIGluIHBpeGVscywgdG8gYWxsb3cgYXJvdW5kIHRoZSBzcGVjaWZpZWQgYm91bmRzLlxuICAgICAqIEBwYXJhbSB7UG9pbnRMaWtlfSBbb3B0aW9ucy5vZmZzZXQ9WzAsIDBdXSBUaGUgY2VudGVyIG9mIHRoZSBnaXZlbiBib3VuZHMgcmVsYXRpdmUgdG8gdGhlIG1hcCdzIGNlbnRlciwgbWVhc3VyZWQgaW4gcGl4ZWxzLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5tYXhab29tXSBUaGUgbWF4aW11bSB6b29tIGxldmVsIHRvIGFsbG93IHdoZW4gdGhlIG1hcCB2aWV3IHRyYW5zaXRpb25zIHRvIHRoZSBzcGVjaWZpZWQgYm91bmRzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbZXZlbnREYXRhXSBEYXRhIHRvIHByb3BhZ2F0ZSB0byBhbnkgZXZlbnQgbGlzdGVuZXJzLlxuICAgICAqIEBmaXJlcyBtb3Zlc3RhcnRcbiAgICAgKiBAZmlyZXMgbW92ZWVuZFxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqIEBzZWUgW0ZpdCBhIG1hcCB0byBhIGJvdW5kaW5nIGJveF0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9maXRib3VuZHMvKVxuICAgICAqL1xuICAgIGZpdEJvdW5kcyhib3VuZHMsIG9wdGlvbnMsIGV2ZW50RGF0YSkge1xuXG4gICAgICAgIG9wdGlvbnMgPSB1dGlsLmV4dGVuZCh7XG4gICAgICAgICAgICBwYWRkaW5nOiAwLFxuICAgICAgICAgICAgb2Zmc2V0OiBbMCwgMF0sXG4gICAgICAgICAgICBtYXhab29tOiB0aGlzLmdldE1heFpvb20oKVxuICAgICAgICB9LCBvcHRpb25zKTtcblxuICAgICAgICBib3VuZHMgPSBMbmdMYXRCb3VuZHMuY29udmVydChib3VuZHMpO1xuXG4gICAgICAgIGNvbnN0IG9mZnNldCA9IFBvaW50LmNvbnZlcnQob3B0aW9ucy5vZmZzZXQpLFxuICAgICAgICAgICAgdHIgPSB0aGlzLnRyYW5zZm9ybSxcbiAgICAgICAgICAgIG53ID0gdHIucHJvamVjdChib3VuZHMuZ2V0Tm9ydGhXZXN0KCkpLFxuICAgICAgICAgICAgc2UgPSB0ci5wcm9qZWN0KGJvdW5kcy5nZXRTb3V0aEVhc3QoKSksXG4gICAgICAgICAgICBzaXplID0gc2Uuc3ViKG53KSxcbiAgICAgICAgICAgIHNjYWxlWCA9ICh0ci53aWR0aCAtIG9wdGlvbnMucGFkZGluZyAqIDIgLSBNYXRoLmFicyhvZmZzZXQueCkgKiAyKSAvIHNpemUueCxcbiAgICAgICAgICAgIHNjYWxlWSA9ICh0ci5oZWlnaHQgLSBvcHRpb25zLnBhZGRpbmcgKiAyIC0gTWF0aC5hYnMob2Zmc2V0LnkpICogMikgLyBzaXplLnk7XG5cbiAgICAgICAgb3B0aW9ucy5jZW50ZXIgPSB0ci51bnByb2plY3QobncuYWRkKHNlKS5kaXYoMikpO1xuICAgICAgICBvcHRpb25zLnpvb20gPSBNYXRoLm1pbih0ci5zY2FsZVpvb20odHIuc2NhbGUgKiBNYXRoLm1pbihzY2FsZVgsIHNjYWxlWSkpLCBvcHRpb25zLm1heFpvb20pO1xuICAgICAgICBvcHRpb25zLmJlYXJpbmcgPSAwO1xuXG4gICAgICAgIHJldHVybiBvcHRpb25zLmxpbmVhciA/XG4gICAgICAgICAgICB0aGlzLmVhc2VUbyhvcHRpb25zLCBldmVudERhdGEpIDpcbiAgICAgICAgICAgIHRoaXMuZmx5VG8ob3B0aW9ucywgZXZlbnREYXRhKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGFuZ2VzIGFueSBjb21iaW5hdGlvbiBvZiBjZW50ZXIsIHpvb20sIGJlYXJpbmcsIGFuZCBwaXRjaCwgd2l0aG91dFxuICAgICAqIGFuIGFuaW1hdGVkIHRyYW5zaXRpb24uIFRoZSBtYXAgd2lsbCByZXRhaW4gaXRzIGN1cnJlbnQgdmFsdWVzIGZvciBhbnlcbiAgICAgKiBkZXRhaWxzIG5vdCBzcGVjaWZpZWQgaW4gYG9wdGlvbnNgLlxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIE1hcCNcbiAgICAgKiBAcGFyYW0ge0NhbWVyYU9wdGlvbnN9IG9wdGlvbnNcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW2V2ZW50RGF0YV0gRGF0YSB0byBwcm9wYWdhdGUgdG8gYW55IGV2ZW50IGxpc3RlbmVycy5cbiAgICAgKiBAZmlyZXMgbW92ZXN0YXJ0XG4gICAgICogQGZpcmVzIHpvb21zdGFydFxuICAgICAqIEBmaXJlcyBtb3ZlXG4gICAgICogQGZpcmVzIHpvb21cbiAgICAgKiBAZmlyZXMgcm90YXRlXG4gICAgICogQGZpcmVzIHBpdGNoXG4gICAgICogQGZpcmVzIHpvb21lbmRcbiAgICAgKiBAZmlyZXMgbW92ZWVuZFxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqL1xuICAgIGp1bXBUbyhvcHRpb25zLCBldmVudERhdGEpIHtcbiAgICAgICAgdGhpcy5zdG9wKCk7XG5cbiAgICAgICAgY29uc3QgdHIgPSB0aGlzLnRyYW5zZm9ybTtcbiAgICAgICAgbGV0IHpvb21DaGFuZ2VkID0gZmFsc2UsXG4gICAgICAgICAgICBiZWFyaW5nQ2hhbmdlZCA9IGZhbHNlLFxuICAgICAgICAgICAgcGl0Y2hDaGFuZ2VkID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKCd6b29tJyBpbiBvcHRpb25zICYmIHRyLnpvb20gIT09ICtvcHRpb25zLnpvb20pIHtcbiAgICAgICAgICAgIHpvb21DaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRyLnpvb20gPSArb3B0aW9ucy56b29tO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCdjZW50ZXInIGluIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHRyLmNlbnRlciA9IExuZ0xhdC5jb252ZXJ0KG9wdGlvbnMuY2VudGVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgnYmVhcmluZycgaW4gb3B0aW9ucyAmJiB0ci5iZWFyaW5nICE9PSArb3B0aW9ucy5iZWFyaW5nKSB7XG4gICAgICAgICAgICBiZWFyaW5nQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICB0ci5iZWFyaW5nID0gK29wdGlvbnMuYmVhcmluZztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgncGl0Y2gnIGluIG9wdGlvbnMgJiYgdHIucGl0Y2ggIT09ICtvcHRpb25zLnBpdGNoKSB7XG4gICAgICAgICAgICBwaXRjaENoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgdHIucGl0Y2ggPSArb3B0aW9ucy5waXRjaDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmlyZSgnbW92ZXN0YXJ0JywgZXZlbnREYXRhKVxuICAgICAgICAgICAgLmZpcmUoJ21vdmUnLCBldmVudERhdGEpO1xuXG4gICAgICAgIGlmICh6b29tQ2hhbmdlZCkge1xuICAgICAgICAgICAgdGhpcy5maXJlKCd6b29tc3RhcnQnLCBldmVudERhdGEpXG4gICAgICAgICAgICAgICAgLmZpcmUoJ3pvb20nLCBldmVudERhdGEpXG4gICAgICAgICAgICAgICAgLmZpcmUoJ3pvb21lbmQnLCBldmVudERhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGJlYXJpbmdDaGFuZ2VkKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUoJ3JvdGF0ZScsIGV2ZW50RGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGl0Y2hDaGFuZ2VkKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUoJ3BpdGNoJywgZXZlbnREYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmZpcmUoJ21vdmVlbmQnLCBldmVudERhdGEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgYW55IGNvbWJpbmF0aW9uIG9mIGNlbnRlciwgem9vbSwgYmVhcmluZywgYW5kIHBpdGNoLCB3aXRoIGFuIGFuaW1hdGVkIHRyYW5zaXRpb25cbiAgICAgKiBiZXR3ZWVuIG9sZCBhbmQgbmV3IHZhbHVlcy4gVGhlIG1hcCB3aWxsIHJldGFpbiBpdHMgY3VycmVudCB2YWx1ZXMgZm9yIGFueVxuICAgICAqIGRldGFpbHMgbm90IHNwZWNpZmllZCBpbiBgb3B0aW9uc2AuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgTWFwI1xuICAgICAqIEBwYXJhbSB7Q2FtZXJhT3B0aW9uc3xBbmltYXRpb25PcHRpb25zfSBvcHRpb25zIE9wdGlvbnMgZGVzY3JpYmluZyB0aGUgZGVzdGluYXRpb24gYW5kIGFuaW1hdGlvbiBvZiB0aGUgdHJhbnNpdGlvbi5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW2V2ZW50RGF0YV0gRGF0YSB0byBwcm9wYWdhdGUgdG8gYW55IGV2ZW50IGxpc3RlbmVycy5cbiAgICAgKiBAZmlyZXMgbW92ZXN0YXJ0XG4gICAgICogQGZpcmVzIHpvb21zdGFydFxuICAgICAqIEBmaXJlcyBtb3ZlXG4gICAgICogQGZpcmVzIHpvb21cbiAgICAgKiBAZmlyZXMgcm90YXRlXG4gICAgICogQGZpcmVzIHBpdGNoXG4gICAgICogQGZpcmVzIHpvb21lbmRcbiAgICAgKiBAZmlyZXMgbW92ZWVuZFxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqIEBzZWUgW05hdmlnYXRlIHRoZSBtYXAgd2l0aCBnYW1lLWxpa2UgY29udHJvbHNdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvZ2FtZS1jb250cm9scy8pXG4gICAgICovXG4gICAgZWFzZVRvKG9wdGlvbnMsIGV2ZW50RGF0YSkge1xuICAgICAgICB0aGlzLnN0b3AoKTtcblxuICAgICAgICBvcHRpb25zID0gdXRpbC5leHRlbmQoe1xuICAgICAgICAgICAgb2Zmc2V0OiBbMCwgMF0sXG4gICAgICAgICAgICBkdXJhdGlvbjogNTAwLFxuICAgICAgICAgICAgZWFzaW5nOiB1dGlsLmVhc2VcbiAgICAgICAgfSwgb3B0aW9ucyk7XG5cbiAgICAgICAgY29uc3QgdHIgPSB0aGlzLnRyYW5zZm9ybSxcbiAgICAgICAgICAgIG9mZnNldCA9IFBvaW50LmNvbnZlcnQob3B0aW9ucy5vZmZzZXQpLFxuICAgICAgICAgICAgc3RhcnRab29tID0gdGhpcy5nZXRab29tKCksXG4gICAgICAgICAgICBzdGFydEJlYXJpbmcgPSB0aGlzLmdldEJlYXJpbmcoKSxcbiAgICAgICAgICAgIHN0YXJ0UGl0Y2ggPSB0aGlzLmdldFBpdGNoKCksXG5cbiAgICAgICAgICAgIHpvb20gPSAnem9vbScgaW4gb3B0aW9ucyA/ICtvcHRpb25zLnpvb20gOiBzdGFydFpvb20sXG4gICAgICAgICAgICBiZWFyaW5nID0gJ2JlYXJpbmcnIGluIG9wdGlvbnMgPyB0aGlzLl9ub3JtYWxpemVCZWFyaW5nKG9wdGlvbnMuYmVhcmluZywgc3RhcnRCZWFyaW5nKSA6IHN0YXJ0QmVhcmluZyxcbiAgICAgICAgICAgIHBpdGNoID0gJ3BpdGNoJyBpbiBvcHRpb25zID8gK29wdGlvbnMucGl0Y2ggOiBzdGFydFBpdGNoO1xuXG4gICAgICAgIGxldCB0b0xuZ0xhdCxcbiAgICAgICAgICAgIHRvUG9pbnQ7XG5cbiAgICAgICAgaWYgKCdjZW50ZXInIGluIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHRvTG5nTGF0ID0gTG5nTGF0LmNvbnZlcnQob3B0aW9ucy5jZW50ZXIpO1xuICAgICAgICAgICAgdG9Qb2ludCA9IHRyLmNlbnRlclBvaW50LmFkZChvZmZzZXQpO1xuICAgICAgICB9IGVsc2UgaWYgKCdhcm91bmQnIGluIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHRvTG5nTGF0ID0gTG5nTGF0LmNvbnZlcnQob3B0aW9ucy5hcm91bmQpO1xuICAgICAgICAgICAgdG9Qb2ludCA9IHRyLmxvY2F0aW9uUG9pbnQodG9MbmdMYXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdG9Qb2ludCA9IHRyLmNlbnRlclBvaW50LmFkZChvZmZzZXQpO1xuICAgICAgICAgICAgdG9MbmdMYXQgPSB0ci5wb2ludExvY2F0aW9uKHRvUG9pbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZnJvbVBvaW50ID0gdHIubG9jYXRpb25Qb2ludCh0b0xuZ0xhdCk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuYW5pbWF0ZSA9PT0gZmFsc2UpIG9wdGlvbnMuZHVyYXRpb24gPSAwO1xuXG4gICAgICAgIHRoaXMuem9vbWluZyA9ICh6b29tICE9PSBzdGFydFpvb20pO1xuICAgICAgICB0aGlzLnJvdGF0aW5nID0gKHN0YXJ0QmVhcmluZyAhPT0gYmVhcmluZyk7XG4gICAgICAgIHRoaXMucGl0Y2hpbmcgPSAocGl0Y2ggIT09IHN0YXJ0UGl0Y2gpO1xuXG4gICAgICAgIGlmIChvcHRpb25zLnNtb290aEVhc2luZyAmJiBvcHRpb25zLmR1cmF0aW9uICE9PSAwKSB7XG4gICAgICAgICAgICBvcHRpb25zLmVhc2luZyA9IHRoaXMuX3Ntb290aE91dEVhc2luZyhvcHRpb25zLmR1cmF0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghb3B0aW9ucy5ub01vdmVTdGFydCkge1xuICAgICAgICAgICAgdGhpcy5tb3ZpbmcgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5maXJlKCdtb3Zlc3RhcnQnLCBldmVudERhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnpvb21pbmcpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZSgnem9vbXN0YXJ0JywgZXZlbnREYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9vbkVhc2VFbmQpO1xuXG4gICAgICAgIHRoaXMuX2Vhc2UoZnVuY3Rpb24gKGspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnpvb21pbmcpIHtcbiAgICAgICAgICAgICAgICB0ci56b29tID0gaW50ZXJwb2xhdGUoc3RhcnRab29tLCB6b29tLCBrKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMucm90YXRpbmcpIHtcbiAgICAgICAgICAgICAgICB0ci5iZWFyaW5nID0gaW50ZXJwb2xhdGUoc3RhcnRCZWFyaW5nLCBiZWFyaW5nLCBrKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMucGl0Y2hpbmcpIHtcbiAgICAgICAgICAgICAgICB0ci5waXRjaCA9IGludGVycG9sYXRlKHN0YXJ0UGl0Y2gsIHBpdGNoLCBrKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdHIuc2V0TG9jYXRpb25BdFBvaW50KHRvTG5nTGF0LCBmcm9tUG9pbnQuYWRkKHRvUG9pbnQuc3ViKGZyb21Qb2ludCkuX211bHQoaykpKTtcblxuICAgICAgICAgICAgdGhpcy5maXJlKCdtb3ZlJywgZXZlbnREYXRhKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnpvb21pbmcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmUoJ3pvb20nLCBldmVudERhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMucm90YXRpbmcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmUoJ3JvdGF0ZScsIGV2ZW50RGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5waXRjaGluZykge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZSgncGl0Y2gnLCBldmVudERhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCAoKSA9PiB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5kZWxheUVuZEV2ZW50cykge1xuICAgICAgICAgICAgICAgIHRoaXMuX29uRWFzZUVuZCA9IHNldFRpbWVvdXQodGhpcy5fZWFzZVRvRW5kLmJpbmQodGhpcywgZXZlbnREYXRhKSwgb3B0aW9ucy5kZWxheUVuZEV2ZW50cyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX2Vhc2VUb0VuZChldmVudERhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCBvcHRpb25zKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBfZWFzZVRvRW5kKGV2ZW50RGF0YSkge1xuICAgICAgICBjb25zdCB3YXNab29taW5nID0gdGhpcy56b29taW5nO1xuICAgICAgICB0aGlzLm1vdmluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnpvb21pbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yb3RhdGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnBpdGNoaW5nID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHdhc1pvb21pbmcpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZSgnem9vbWVuZCcsIGV2ZW50RGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maXJlKCdtb3ZlZW5kJywgZXZlbnREYXRhKTtcblxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgYW55IGNvbWJpbmF0aW9uIG9mIGNlbnRlciwgem9vbSwgYmVhcmluZywgYW5kIHBpdGNoLCBhbmltYXRpbmcgdGhlIHRyYW5zaXRpb24gYWxvbmcgYSBjdXJ2ZSB0aGF0XG4gICAgICogZXZva2VzIGZsaWdodC4gVGhlIGFuaW1hdGlvbiBzZWFtbGVzc2x5IGluY29ycG9yYXRlcyB6b29taW5nIGFuZCBwYW5uaW5nIHRvIGhlbHBcbiAgICAgKiB0aGUgdXNlciBtYWludGFpbiBoZXIgYmVhcmluZ3MgZXZlbiBhZnRlciB0cmF2ZXJzaW5nIGEgZ3JlYXQgZGlzdGFuY2UuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgTWFwI1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIE9wdGlvbnMgZGVzY3JpYmluZyB0aGUgZGVzdGluYXRpb24gYW5kIGFuaW1hdGlvbiBvZiB0aGUgdHJhbnNpdGlvbi5cbiAgICAgKiAgICAgQWNjZXB0cyBbQ2FtZXJhT3B0aW9uc10oI0NhbWVyYU9wdGlvbnMpLCBbQW5pbWF0aW9uT3B0aW9uc10oI0FuaW1hdGlvbk9wdGlvbnMpLFxuICAgICAqICAgICBhbmQgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIG9wdGlvbnMuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmN1cnZlPTEuNDJdIFRoZSB6b29taW5nIFwiY3VydmVcIiB0aGF0IHdpbGwgb2NjdXIgYWxvbmcgdGhlXG4gICAgICogICAgIGZsaWdodCBwYXRoLiBBIGhpZ2ggdmFsdWUgbWF4aW1pemVzIHpvb21pbmcgZm9yIGFuIGV4YWdnZXJhdGVkIGFuaW1hdGlvbiwgd2hpbGUgYSBsb3dcbiAgICAgKiAgICAgdmFsdWUgbWluaW1pemVzIHpvb21pbmcgZm9yIGFuIGVmZmVjdCBjbG9zZXIgdG8ge0BsaW5rIE1hcCNlYXNlVG99LiAxLjQyIGlzIHRoZSBhdmVyYWdlXG4gICAgICogICAgIHZhbHVlIHNlbGVjdGVkIGJ5IHBhcnRpY2lwYW50cyBpbiB0aGUgdXNlciBzdHVkeSBkaXNjdXNzZWQgaW5cbiAgICAgKiAgICAgW3ZhbiBXaWprICgyMDAzKV0oaHR0cHM6Ly93d3cud2luLnR1ZS5ubC9+dmFud2lqay96b29tcGFuLnBkZikuIEEgdmFsdWUgb2ZcbiAgICAgKiAgICAgYE1hdGgucG93KDYsIDAuMjUpYCB3b3VsZCBiZSBlcXVpdmFsZW50IHRvIHRoZSByb290IG1lYW4gc3F1YXJlZCBhdmVyYWdlIHZlbG9jaXR5LiBBXG4gICAgICogICAgIHZhbHVlIG9mIDEgd291bGQgcHJvZHVjZSBhIGNpcmN1bGFyIG1vdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubWluWm9vbV0gVGhlIHplcm8tYmFzZWQgem9vbSBsZXZlbCBhdCB0aGUgcGVhayBvZiB0aGUgZmxpZ2h0IHBhdGguIElmXG4gICAgICogICAgIGBvcHRpb25zLmN1cnZlYCBpcyBzcGVjaWZpZWQsIHRoaXMgb3B0aW9uIGlzIGlnbm9yZWQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLnNwZWVkPTEuMl0gVGhlIGF2ZXJhZ2Ugc3BlZWQgb2YgdGhlIGFuaW1hdGlvbiBkZWZpbmVkIGluIHJlbGF0aW9uIHRvXG4gICAgICogICAgIGBvcHRpb25zLmN1cnZlYC4gQSBzcGVlZCBvZiAxLjIgbWVhbnMgdGhhdCB0aGUgbWFwIGFwcGVhcnMgdG8gbW92ZSBhbG9uZyB0aGUgZmxpZ2h0IHBhdGhcbiAgICAgKiAgICAgYnkgMS4yIHRpbWVzIGBvcHRpb25zLmN1cnZlYCBzY3JlZW5mdWxzIGV2ZXJ5IHNlY29uZC4gQSBfc2NyZWVuZnVsXyBpcyB0aGUgbWFwJ3MgdmlzaWJsZSBzcGFuLlxuICAgICAqICAgICBJdCBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGEgZml4ZWQgcGh5c2ljYWwgZGlzdGFuY2UsIGJ1dCB2YXJpZXMgYnkgem9vbSBsZXZlbC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuc2NyZWVuU3BlZWRdIFRoZSBhdmVyYWdlIHNwZWVkIG9mIHRoZSBhbmltYXRpb24gbWVhc3VyZWQgaW4gc2NyZWVuZnVsc1xuICAgICAqICAgICBwZXIgc2Vjb25kLCBhc3N1bWluZyBhIGxpbmVhciB0aW1pbmcgY3VydmUuIElmIGBvcHRpb25zLnNwZWVkYCBpcyBzcGVjaWZpZWQsIHRoaXMgb3B0aW9uIGlzIGlnbm9yZWQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuZWFzaW5nXSBBbiBlYXNpbmcgZnVuY3Rpb24gZm9yIHRoZSBhbmltYXRlZCB0cmFuc2l0aW9uLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbZXZlbnREYXRhXSBEYXRhIHRvIHByb3BhZ2F0ZSB0byBhbnkgZXZlbnQgbGlzdGVuZXJzLlxuICAgICAqIEBmaXJlcyBtb3Zlc3RhcnRcbiAgICAgKiBAZmlyZXMgem9vbXN0YXJ0XG4gICAgICogQGZpcmVzIG1vdmVcbiAgICAgKiBAZmlyZXMgem9vbVxuICAgICAqIEBmaXJlcyByb3RhdGVcbiAgICAgKiBAZmlyZXMgcGl0Y2hcbiAgICAgKiBAZmlyZXMgem9vbWVuZFxuICAgICAqIEBmaXJlcyBtb3ZlZW5kXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBmbHkgd2l0aCBkZWZhdWx0IG9wdGlvbnMgdG8gbnVsbCBpc2xhbmRcbiAgICAgKiBtYXAuZmx5VG8oe2NlbnRlcjogWzAsIDBdLCB6b29tOiA5fSk7XG4gICAgICogLy8gdXNpbmcgZmx5VG8gb3B0aW9uc1xuICAgICAqIG1hcC5mbHlUbyh7XG4gICAgICogICBjZW50ZXI6IFswLCAwXSxcbiAgICAgKiAgIHpvb206IDksXG4gICAgICogICBzcGVlZDogMC4yLFxuICAgICAqICAgY3VydmU6IDEsXG4gICAgICogICBlYXNpbmcodCkge1xuICAgICAqICAgICByZXR1cm4gdDtcbiAgICAgKiAgIH1cbiAgICAgKiB9KTtcbiAgICAgKiBAc2VlIFtGbHkgdG8gYSBsb2NhdGlvbl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9mbHl0by8pXG4gICAgICogQHNlZSBbU2xvd2x5IGZseSB0byBhIGxvY2F0aW9uXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2ZseXRvLW9wdGlvbnMvKVxuICAgICAqIEBzZWUgW0ZseSB0byBhIGxvY2F0aW9uIGJhc2VkIG9uIHNjcm9sbCBwb3NpdGlvbl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9zY3JvbGwtZmx5LXRvLylcbiAgICAgKi9cbiAgICBmbHlUbyhvcHRpb25zLCBldmVudERhdGEpIHtcbiAgICAgICAgLy8gVGhpcyBtZXRob2QgaW1wbGVtZW50cyBhbiDigJxvcHRpbWFsIHBhdGjigJ0gYW5pbWF0aW9uLCBhcyBkZXRhaWxlZCBpbjpcbiAgICAgICAgLy9cbiAgICAgICAgLy8gVmFuIFdpamssIEphcmtlIEouOyBOdWlqLCBXaW0gQS4gQS4g4oCcU21vb3RoIGFuZCBlZmZpY2llbnQgem9vbWluZyBhbmQgcGFubmluZy7igJ0gSU5GT1ZJU1xuICAgICAgICAvLyAgIOKAmTAzLiBwcC4gMTXigJMyMi4gPGh0dHBzOi8vd3d3Lndpbi50dWUubmwvfnZhbndpamsvem9vbXBhbi5wZGYjcGFnZT01Pi5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gV2hlcmUgYXBwbGljYWJsZSwgbG9jYWwgdmFyaWFibGUgZG9jdW1lbnRhdGlvbiBiZWdpbnMgd2l0aCB0aGUgYXNzb2NpYXRlZCB2YXJpYWJsZSBvclxuICAgICAgICAvLyBmdW5jdGlvbiBpbiB2YW4gV2lqayAoMjAwMykuXG5cbiAgICAgICAgdGhpcy5zdG9wKCk7XG5cbiAgICAgICAgb3B0aW9ucyA9IHV0aWwuZXh0ZW5kKHtcbiAgICAgICAgICAgIG9mZnNldDogWzAsIDBdLFxuICAgICAgICAgICAgc3BlZWQ6IDEuMixcbiAgICAgICAgICAgIGN1cnZlOiAxLjQyLFxuICAgICAgICAgICAgZWFzaW5nOiB1dGlsLmVhc2VcbiAgICAgICAgfSwgb3B0aW9ucyk7XG5cbiAgICAgICAgY29uc3QgdHIgPSB0aGlzLnRyYW5zZm9ybSxcbiAgICAgICAgICAgIG9mZnNldCA9IFBvaW50LmNvbnZlcnQob3B0aW9ucy5vZmZzZXQpLFxuICAgICAgICAgICAgc3RhcnRab29tID0gdGhpcy5nZXRab29tKCksXG4gICAgICAgICAgICBzdGFydEJlYXJpbmcgPSB0aGlzLmdldEJlYXJpbmcoKSxcbiAgICAgICAgICAgIHN0YXJ0UGl0Y2ggPSB0aGlzLmdldFBpdGNoKCk7XG5cbiAgICAgICAgY29uc3QgY2VudGVyID0gJ2NlbnRlcicgaW4gb3B0aW9ucyA/IExuZ0xhdC5jb252ZXJ0KG9wdGlvbnMuY2VudGVyKSA6IHRoaXMuZ2V0Q2VudGVyKCk7XG4gICAgICAgIGNvbnN0IHpvb20gPSAnem9vbScgaW4gb3B0aW9ucyA/ICArb3B0aW9ucy56b29tIDogc3RhcnRab29tO1xuICAgICAgICBjb25zdCBiZWFyaW5nID0gJ2JlYXJpbmcnIGluIG9wdGlvbnMgPyB0aGlzLl9ub3JtYWxpemVCZWFyaW5nKG9wdGlvbnMuYmVhcmluZywgc3RhcnRCZWFyaW5nKSA6IHN0YXJ0QmVhcmluZztcbiAgICAgICAgY29uc3QgcGl0Y2ggPSAncGl0Y2gnIGluIG9wdGlvbnMgPyArb3B0aW9ucy5waXRjaCA6IHN0YXJ0UGl0Y2g7XG5cbiAgICAgICAgLy8gSWYgYSBwYXRoIGNyb3NzaW5nIHRoZSBhbnRpbWVyaWRpYW4gd291bGQgYmUgc2hvcnRlciwgZXh0ZW5kIHRoZSBmaW5hbCBjb29yZGluYXRlIHNvIHRoYXRcbiAgICAgICAgLy8gaW50ZXJwb2xhdGluZyBiZXR3ZWVuIHRoZSB0d28gZW5kcG9pbnRzIHdpbGwgY3Jvc3MgaXQuXG4gICAgICAgIGlmIChNYXRoLmFicyh0ci5jZW50ZXIubG5nKSArIE1hdGguYWJzKGNlbnRlci5sbmcpID4gMTgwKSB7XG4gICAgICAgICAgICBpZiAodHIuY2VudGVyLmxuZyA+IDAgJiYgY2VudGVyLmxuZyA8IDApIHtcbiAgICAgICAgICAgICAgICBjZW50ZXIubG5nICs9IDM2MDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHIuY2VudGVyLmxuZyA8IDAgJiYgY2VudGVyLmxuZyA+IDApIHtcbiAgICAgICAgICAgICAgICBjZW50ZXIubG5nIC09IDM2MDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNjYWxlID0gdHIuem9vbVNjYWxlKHpvb20gLSBzdGFydFpvb20pLFxuICAgICAgICAgICAgZnJvbSA9IHRyLnBvaW50LFxuICAgICAgICAgICAgdG8gPSAnY2VudGVyJyBpbiBvcHRpb25zID8gdHIucHJvamVjdChjZW50ZXIpLnN1YihvZmZzZXQuZGl2KHNjYWxlKSkgOiBmcm9tO1xuXG4gICAgICAgIGxldCByaG8gPSBvcHRpb25zLmN1cnZlO1xuXG4gICAgICAgICAgICAvLyB34oKAOiBJbml0aWFsIHZpc2libGUgc3BhbiwgbWVhc3VyZWQgaW4gcGl4ZWxzIGF0IHRoZSBpbml0aWFsIHNjYWxlLlxuICAgICAgICBjb25zdCB3MCA9IE1hdGgubWF4KHRyLndpZHRoLCB0ci5oZWlnaHQpLFxuICAgICAgICAgICAgLy8gd+KCgTogRmluYWwgdmlzaWJsZSBzcGFuLCBtZWFzdXJlZCBpbiBwaXhlbHMgd2l0aCByZXNwZWN0IHRvIHRoZSBpbml0aWFsIHNjYWxlLlxuICAgICAgICAgICAgdzEgPSB3MCAvIHNjYWxlLFxuICAgICAgICAgICAgLy8gTGVuZ3RoIG9mIHRoZSBmbGlnaHQgcGF0aCBhcyBwcm9qZWN0ZWQgb250byB0aGUgZ3JvdW5kIHBsYW5lLCBtZWFzdXJlZCBpbiBwaXhlbHMgZnJvbVxuICAgICAgICAgICAgLy8gdGhlIHdvcmxkIGltYWdlIG9yaWdpbiBhdCB0aGUgaW5pdGlhbCBzY2FsZS5cbiAgICAgICAgICAgIHUxID0gdG8uc3ViKGZyb20pLm1hZygpO1xuXG4gICAgICAgIGlmICgnbWluWm9vbScgaW4gb3B0aW9ucykge1xuICAgICAgICAgICAgY29uc3QgbWluWm9vbSA9IHV0aWwuY2xhbXAoTWF0aC5taW4ob3B0aW9ucy5taW5ab29tLCBzdGFydFpvb20sIHpvb20pLCB0ci5taW5ab29tLCB0ci5tYXhab29tKTtcbiAgICAgICAgICAgIC8vIHc8c3ViPm08L3N1Yj46IE1heGltdW0gdmlzaWJsZSBzcGFuLCBtZWFzdXJlZCBpbiBwaXhlbHMgd2l0aCByZXNwZWN0IHRvIHRoZSBpbml0aWFsXG4gICAgICAgICAgICAvLyBzY2FsZS5cbiAgICAgICAgICAgIGNvbnN0IHdNYXggPSB3MCAvIHRyLnpvb21TY2FsZShtaW5ab29tIC0gc3RhcnRab29tKTtcbiAgICAgICAgICAgIHJobyA9IE1hdGguc3FydCh3TWF4IC8gdTEgKiAyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIM+BwrJcbiAgICAgICAgY29uc3QgcmhvMiA9IHJobyAqIHJobztcblxuICAgICAgICAvKipcbiAgICAgICAgICogcuG1ojogUmV0dXJucyB0aGUgem9vbS1vdXQgZmFjdG9yIGF0IG9uZSBlbmQgb2YgdGhlIGFuaW1hdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIGkgMCBmb3IgdGhlIGFzY2VudCBvciAxIGZvciB0aGUgZGVzY2VudC5cbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIHIoaSkge1xuICAgICAgICAgICAgY29uc3QgYiA9ICh3MSAqIHcxIC0gdzAgKiB3MCArIChpID8gLTEgOiAxKSAqIHJobzIgKiByaG8yICogdTEgKiB1MSkgLyAoMiAqIChpID8gdzEgOiB3MCkgKiByaG8yICogdTEpO1xuICAgICAgICAgICAgcmV0dXJuIE1hdGgubG9nKE1hdGguc3FydChiICogYiArIDEpIC0gYik7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBzaW5oKG4pIHsgcmV0dXJuIChNYXRoLmV4cChuKSAtIE1hdGguZXhwKC1uKSkgLyAyOyB9XG4gICAgICAgIGZ1bmN0aW9uIGNvc2gobikgeyByZXR1cm4gKE1hdGguZXhwKG4pICsgTWF0aC5leHAoLW4pKSAvIDI7IH1cbiAgICAgICAgZnVuY3Rpb24gdGFuaChuKSB7IHJldHVybiBzaW5oKG4pIC8gY29zaChuKTsgfVxuXG4gICAgICAgIC8vIHLigoA6IFpvb20tb3V0IGZhY3RvciBkdXJpbmcgYXNjZW50LlxuICAgICAgICBjb25zdCByMCA9IHIoMCk7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIHcocyk6IFJldHVybnMgdGhlIHZpc2libGUgc3BhbiBvbiB0aGUgZ3JvdW5kLCBtZWFzdXJlZCBpbiBwaXhlbHMgd2l0aCByZXNwZWN0IHRvIHRoZVxuICAgICAgICAgICAgICogaW5pdGlhbCBzY2FsZS5cbiAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgKiBBc3N1bWVzIGFuIGFuZ3VsYXIgZmllbGQgb2YgdmlldyBvZiAyIGFyY3RhbiDCvSDiiYggNTPCsC5cbiAgICAgICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgbGV0IHcgPSBmdW5jdGlvbiAocykgeyByZXR1cm4gKGNvc2gocjApIC8gY29zaChyMCArIHJobyAqIHMpKTsgfSxcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogdShzKTogUmV0dXJucyB0aGUgZGlzdGFuY2UgYWxvbmcgdGhlIGZsaWdodCBwYXRoIGFzIHByb2plY3RlZCBvbnRvIHRoZSBncm91bmQgcGxhbmUsXG4gICAgICAgICAgICAgKiBtZWFzdXJlZCBpbiBwaXhlbHMgZnJvbSB0aGUgd29ybGQgaW1hZ2Ugb3JpZ2luIGF0IHRoZSBpbml0aWFsIHNjYWxlLlxuICAgICAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgdSA9IGZ1bmN0aW9uIChzKSB7IHJldHVybiB3MCAqICgoY29zaChyMCkgKiB0YW5oKHIwICsgcmhvICogcykgLSBzaW5oKHIwKSkgLyByaG8yKSAvIHUxOyB9LFxuICAgICAgICAgICAgLy8gUzogVG90YWwgbGVuZ3RoIG9mIHRoZSBmbGlnaHQgcGF0aCwgbWVhc3VyZWQgaW4gz4Etc2NyZWVuZnVscy5cbiAgICAgICAgICAgIFMgPSAocigxKSAtIHIwKSAvIHJobztcblxuICAgICAgICAvLyBXaGVuIHXigoAgPSB14oKBLCB0aGUgb3B0aW1hbCBwYXRoIGRvZXNu4oCZdCByZXF1aXJlIGJvdGggYXNjZW50IGFuZCBkZXNjZW50LlxuICAgICAgICBpZiAoTWF0aC5hYnModTEpIDwgMC4wMDAwMDEpIHtcbiAgICAgICAgICAgIC8vIFBlcmZvcm0gYSBtb3JlIG9yIGxlc3MgaW5zdGFudGFuZW91cyB0cmFuc2l0aW9uIGlmIHRoZSBwYXRoIGlzIHRvbyBzaG9ydC5cbiAgICAgICAgICAgIGlmIChNYXRoLmFicyh3MCAtIHcxKSA8IDAuMDAwMDAxKSByZXR1cm4gdGhpcy5lYXNlVG8ob3B0aW9ucyk7XG5cbiAgICAgICAgICAgIGNvbnN0IGsgPSB3MSA8IHcwID8gLTEgOiAxO1xuICAgICAgICAgICAgUyA9IE1hdGguYWJzKE1hdGgubG9nKHcxIC8gdzApKSAvIHJobztcblxuICAgICAgICAgICAgdSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gMDsgfTtcbiAgICAgICAgICAgIHcgPSBmdW5jdGlvbihzKSB7IHJldHVybiBNYXRoLmV4cChrICogcmhvICogcyk7IH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoJ2R1cmF0aW9uJyBpbiBvcHRpb25zKSB7XG4gICAgICAgICAgICBvcHRpb25zLmR1cmF0aW9uID0gK29wdGlvbnMuZHVyYXRpb247XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBWID0gJ3NjcmVlblNwZWVkJyBpbiBvcHRpb25zID8gK29wdGlvbnMuc2NyZWVuU3BlZWQgLyByaG8gOiArb3B0aW9ucy5zcGVlZDtcbiAgICAgICAgICAgIG9wdGlvbnMuZHVyYXRpb24gPSAxMDAwICogUyAvIFY7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm1vdmluZyA9IHRydWU7XG4gICAgICAgIHRoaXMuem9vbWluZyA9IHRydWU7XG4gICAgICAgIGlmIChzdGFydEJlYXJpbmcgIT09IGJlYXJpbmcpIHRoaXMucm90YXRpbmcgPSB0cnVlO1xuICAgICAgICBpZiAoc3RhcnRQaXRjaCAhPT0gcGl0Y2gpIHRoaXMucGl0Y2hpbmcgPSB0cnVlO1xuXG4gICAgICAgIHRoaXMuZmlyZSgnbW92ZXN0YXJ0JywgZXZlbnREYXRhKTtcbiAgICAgICAgdGhpcy5maXJlKCd6b29tc3RhcnQnLCBldmVudERhdGEpO1xuXG4gICAgICAgIHRoaXMuX2Vhc2UoZnVuY3Rpb24gKGspIHtcbiAgICAgICAgICAgIC8vIHM6IFRoZSBkaXN0YW5jZSB0cmF2ZWxlZCBhbG9uZyB0aGUgZmxpZ2h0IHBhdGgsIG1lYXN1cmVkIGluIM+BLXNjcmVlbmZ1bHMuXG4gICAgICAgICAgICBjb25zdCBzID0gayAqIFMsXG4gICAgICAgICAgICAgICAgdXMgPSB1KHMpO1xuXG4gICAgICAgICAgICBjb25zdCBzY2FsZSA9IDEgLyB3KHMpO1xuICAgICAgICAgICAgdHIuem9vbSA9IHN0YXJ0Wm9vbSArIHRyLnNjYWxlWm9vbShzY2FsZSk7XG4gICAgICAgICAgICB0ci5jZW50ZXIgPSB0ci51bnByb2plY3QoZnJvbS5hZGQodG8uc3ViKGZyb20pLm11bHQodXMpKS5tdWx0KHNjYWxlKSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnJvdGF0aW5nKSB7XG4gICAgICAgICAgICAgICAgdHIuYmVhcmluZyA9IGludGVycG9sYXRlKHN0YXJ0QmVhcmluZywgYmVhcmluZywgayk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5waXRjaGluZykge1xuICAgICAgICAgICAgICAgIHRyLnBpdGNoID0gaW50ZXJwb2xhdGUoc3RhcnRQaXRjaCwgcGl0Y2gsIGspO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmZpcmUoJ21vdmUnLCBldmVudERhdGEpO1xuICAgICAgICAgICAgdGhpcy5maXJlKCd6b29tJywgZXZlbnREYXRhKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnJvdGF0aW5nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maXJlKCdyb3RhdGUnLCBldmVudERhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMucGl0Y2hpbmcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmUoJ3BpdGNoJywgZXZlbnREYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0aGlzLm1vdmluZyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy56b29taW5nID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnJvdGF0aW5nID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnBpdGNoaW5nID0gZmFsc2U7XG5cbiAgICAgICAgICAgIHRoaXMuZmlyZSgnem9vbWVuZCcsIGV2ZW50RGF0YSk7XG4gICAgICAgICAgICB0aGlzLmZpcmUoJ21vdmVlbmQnLCBldmVudERhdGEpO1xuICAgICAgICB9LCBvcHRpb25zKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBpc0Vhc2luZygpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fYWJvcnRGbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGNhbWVyYSBpcyBtb3ZpbmcuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgTWFwI1xuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBBIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBjYW1lcmEgaXMgbW92aW5nLlxuICAgICAqL1xuICAgIGlzTW92aW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tb3Zpbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RvcHMgYW55IGFuaW1hdGVkIHRyYW5zaXRpb24gdW5kZXJ3YXkuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgTWFwI1xuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqL1xuICAgIHN0b3AoKSB7XG4gICAgICAgIGlmICh0aGlzLl9hYm9ydEZuKSB7XG4gICAgICAgICAgICB0aGlzLl9hYm9ydEZuKCk7XG4gICAgICAgICAgICB0aGlzLl9maW5pc2hFYXNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgX2Vhc2UoZnJhbWUsIGZpbmlzaCwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLl9maW5pc2hGbiA9IGZpbmlzaDtcbiAgICAgICAgdGhpcy5fYWJvcnRGbiA9IGJyb3dzZXIudGltZWQoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgIGZyYW1lLmNhbGwodGhpcywgb3B0aW9ucy5lYXNpbmcodCkpO1xuICAgICAgICAgICAgaWYgKHQgPT09IDEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9maW5pc2hFYXNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIG9wdGlvbnMuYW5pbWF0ZSA9PT0gZmFsc2UgPyAwIDogb3B0aW9ucy5kdXJhdGlvbiwgdGhpcyk7XG4gICAgfVxuXG4gICAgX2ZpbmlzaEVhc2UoKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9hYm9ydEZuO1xuICAgICAgICAvLyBUaGUgZmluaXNoIGZ1bmN0aW9uIG1pZ2h0IGVtaXQgZXZlbnRzIHdoaWNoIHRyaWdnZXIgbmV3IGVhc2VzLCB3aGljaFxuICAgICAgICAvLyBzZXQgYSBuZXcgX2ZpbmlzaEZuLiBFbnN1cmUgd2UgZG9uJ3QgZGVsZXRlIGl0IHVuaW50ZW50aW9uYWxseS5cbiAgICAgICAgY29uc3QgZmluaXNoID0gdGhpcy5fZmluaXNoRm47XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9maW5pc2hGbjtcbiAgICAgICAgZmluaXNoLmNhbGwodGhpcyk7XG4gICAgfVxuXG4gICAgLy8gY29udmVydCBiZWFyaW5nIHNvIHRoYXQgaXQncyBudW1lcmljYWxseSBjbG9zZSB0byB0aGUgY3VycmVudCBvbmUgc28gdGhhdCBpdCBpbnRlcnBvbGF0ZXMgcHJvcGVybHlcbiAgICBfbm9ybWFsaXplQmVhcmluZyhiZWFyaW5nLCBjdXJyZW50QmVhcmluZykge1xuICAgICAgICBiZWFyaW5nID0gdXRpbC53cmFwKGJlYXJpbmcsIC0xODAsIDE4MCk7XG4gICAgICAgIGNvbnN0IGRpZmYgPSBNYXRoLmFicyhiZWFyaW5nIC0gY3VycmVudEJlYXJpbmcpO1xuICAgICAgICBpZiAoTWF0aC5hYnMoYmVhcmluZyAtIDM2MCAtIGN1cnJlbnRCZWFyaW5nKSA8IGRpZmYpIGJlYXJpbmcgLT0gMzYwO1xuICAgICAgICBpZiAoTWF0aC5hYnMoYmVhcmluZyArIDM2MCAtIGN1cnJlbnRCZWFyaW5nKSA8IGRpZmYpIGJlYXJpbmcgKz0gMzYwO1xuICAgICAgICByZXR1cm4gYmVhcmluZztcbiAgICB9XG5cbiAgICAvLyBvbmx5IHVzZWQgb24gbW91c2Utd2hlZWwgem9vbSB0byBzbW9vdGggb3V0IGFuaW1hdGlvblxuICAgIF9zbW9vdGhPdXRFYXNpbmcoZHVyYXRpb24pIHtcbiAgICAgICAgbGV0IGVhc2luZyA9IHV0aWwuZWFzZTtcblxuICAgICAgICBpZiAodGhpcy5fcHJldkVhc2UpIHtcbiAgICAgICAgICAgIGNvbnN0IGVhc2UgPSB0aGlzLl9wcmV2RWFzZSxcbiAgICAgICAgICAgICAgICB0ID0gKERhdGUubm93KCkgLSBlYXNlLnN0YXJ0KSAvIGVhc2UuZHVyYXRpb24sXG4gICAgICAgICAgICAgICAgc3BlZWQgPSBlYXNlLmVhc2luZyh0ICsgMC4wMSkgLSBlYXNlLmVhc2luZyh0KSxcblxuICAgICAgICAgICAgICAgIC8vIFF1aWNrIGhhY2sgdG8gbWFrZSBuZXcgYmV6aWVyIHRoYXQgaXMgY29udGludW91cyB3aXRoIGxhc3RcbiAgICAgICAgICAgICAgICB4ID0gMC4yNyAvIE1hdGguc3FydChzcGVlZCAqIHNwZWVkICsgMC4wMDAxKSAqIDAuMDEsXG4gICAgICAgICAgICAgICAgeSA9IE1hdGguc3FydCgwLjI3ICogMC4yNyAtIHggKiB4KTtcblxuICAgICAgICAgICAgZWFzaW5nID0gdXRpbC5iZXppZXIoeCwgeSwgMC4yNSwgMSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9wcmV2RWFzZSA9IHtcbiAgICAgICAgICAgIHN0YXJ0OiAobmV3IERhdGUoKSkuZ2V0VGltZSgpLFxuICAgICAgICAgICAgZHVyYXRpb246IGR1cmF0aW9uLFxuICAgICAgICAgICAgZWFzaW5nOiBlYXNpbmdcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gZWFzaW5nO1xuICAgIH1cbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuZXZlciB0aGUgbWFwJ3MgcGl0Y2ggKHRpbHQpIGNoYW5nZXMuXG4gKlxuICogQGV2ZW50IHBpdGNoXG4gKiBAbWVtYmVyb2YgTWFwXG4gKiBAaW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7TWFwRXZlbnREYXRhfSBkYXRhXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBDYW1lcmE7XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IERPTSA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvZG9tJyk7XG5jb25zdCB1dGlsID0gcmVxdWlyZSgnLi4vLi4vdXRpbC91dGlsJyk7XG5cbi8qKlxuICogQW4gYEF0dHJpYnV0aW9uQ29udHJvbGAgY29udHJvbCBwcmVzZW50cyB0aGUgbWFwJ3MgW2F0dHJpYnV0aW9uIGluZm9ybWF0aW9uXShodHRwczovL3d3dy5tYXBib3guY29tL2hlbHAvYXR0cmlidXRpb24vKS5cbiAqXG4gKiBAaW1wbGVtZW50cyB7SUNvbnRyb2x9XG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmNvbXBhY3RdIElmIGB0cnVlYCBmb3JjZSBhIGNvbXBhY3QgYXR0cmlidXRpb24gdGhhdCBzaG93cyB0aGUgZnVsbCBhdHRyaWJ1dGlvbiBvbiBtb3VzZSBob3Zlciwgb3IgaWYgYGZhbHNlYCBmb3JjZSB0aGUgZnVsbCBhdHRyaWJ1dGlvbiBjb250cm9sLiBUaGUgZGVmYXVsdCBpcyBhIHJlc3BvbnNpdmUgYXR0cmlidXRpb24gdGhhdCBjb2xsYXBzZXMgd2hlbiB0aGUgbWFwIGlzIGxlc3MgdGhhbiA2NDAgcGl4ZWxzIHdpZGUuXG4gKiBAZXhhbXBsZVxuICogdmFyIG1hcCA9IG5ldyBtYXBib3hnbC5NYXAoe2F0dHJpYnV0aW9uQ29udHJvbDogZmFsc2V9KVxuICogICAgIC5hZGRDb250cm9sKG5ldyBtYXBib3hnbC5BdHRyaWJ1dGlvbkNvbnRyb2woe1xuICogICAgICAgICBjb21wYWN0OiB0cnVlXG4gKiAgICAgfSkpO1xuICovXG5jbGFzcyBBdHRyaWJ1dGlvbkNvbnRyb2wge1xuXG4gICAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgICAgIHV0aWwuYmluZEFsbChbXG4gICAgICAgICAgICAnX3VwZGF0ZUVkaXRMaW5rJyxcbiAgICAgICAgICAgICdfdXBkYXRlRGF0YScsXG4gICAgICAgICAgICAnX3VwZGF0ZUNvbXBhY3QnXG4gICAgICAgIF0sIHRoaXMpO1xuICAgIH1cblxuICAgIGdldERlZmF1bHRQb3NpdGlvbigpIHtcbiAgICAgICAgcmV0dXJuICdib3R0b20tcmlnaHQnO1xuICAgIH1cblxuICAgIG9uQWRkKG1hcCkge1xuICAgICAgICBjb25zdCBjb21wYWN0ID0gdGhpcy5vcHRpb25zICYmIHRoaXMub3B0aW9ucy5jb21wYWN0O1xuXG4gICAgICAgIHRoaXMuX21hcCA9IG1hcDtcbiAgICAgICAgdGhpcy5fY29udGFpbmVyID0gRE9NLmNyZWF0ZSgnZGl2JywgJ21hcGJveGdsLWN0cmwgbWFwYm94Z2wtY3RybC1hdHRyaWInKTtcblxuICAgICAgICBpZiAoY29tcGFjdCkge1xuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ2NvbXBhY3QnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3VwZGF0ZUF0dHJpYnV0aW9ucygpO1xuICAgICAgICB0aGlzLl91cGRhdGVFZGl0TGluaygpO1xuXG4gICAgICAgIHRoaXMuX21hcC5vbignZGF0YScsIHRoaXMuX3VwZGF0ZURhdGEpO1xuICAgICAgICB0aGlzLl9tYXAub24oJ21vdmVlbmQnLCB0aGlzLl91cGRhdGVFZGl0TGluayk7XG5cbiAgICAgICAgaWYgKGNvbXBhY3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5fbWFwLm9uKCdyZXNpemUnLCB0aGlzLl91cGRhdGVDb21wYWN0KTtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUNvbXBhY3QoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9jb250YWluZXI7XG4gICAgfVxuXG4gICAgb25SZW1vdmUoKSB7XG4gICAgICAgIHRoaXMuX2NvbnRhaW5lci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuX2NvbnRhaW5lcik7XG5cbiAgICAgICAgdGhpcy5fbWFwLm9mZignZGF0YScsIHRoaXMuX3VwZGF0ZURhdGEpO1xuICAgICAgICB0aGlzLl9tYXAub2ZmKCdtb3ZlZW5kJywgdGhpcy5fdXBkYXRlRWRpdExpbmspO1xuICAgICAgICB0aGlzLl9tYXAub2ZmKCdyZXNpemUnLCB0aGlzLl91cGRhdGVDb21wYWN0KTtcblxuICAgICAgICB0aGlzLl9tYXAgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgX3VwZGF0ZUVkaXRMaW5rKCkge1xuICAgICAgICBpZiAoIXRoaXMuX2VkaXRMaW5rKSB0aGlzLl9lZGl0TGluayA9IHRoaXMuX2NvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcubWFwYm94LWltcHJvdmUtbWFwJyk7XG4gICAgICAgIGlmICh0aGlzLl9lZGl0TGluaykge1xuICAgICAgICAgICAgY29uc3QgY2VudGVyID0gdGhpcy5fbWFwLmdldENlbnRlcigpO1xuICAgICAgICAgICAgdGhpcy5fZWRpdExpbmsuaHJlZiA9IGBodHRwczovL3d3dy5tYXBib3guY29tL21hcC1mZWVkYmFjay8jLyR7XG4gICAgICAgICAgICAgICAgICAgIGNlbnRlci5sbmd9LyR7Y2VudGVyLmxhdH0vJHtNYXRoLnJvdW5kKHRoaXMuX21hcC5nZXRab29tKCkgKyAxKX1gO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX3VwZGF0ZURhdGEoZXZlbnQpIHtcbiAgICAgICAgaWYgKGV2ZW50LmRhdGFUeXBlID09PSAnc291cmNlJykge1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlQXR0cmlidXRpb25zKCk7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVFZGl0TGluaygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX3VwZGF0ZUF0dHJpYnV0aW9ucygpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9tYXAuc3R5bGUpIHJldHVybjtcblxuICAgICAgICBsZXQgYXR0cmlidXRpb25zID0gW107XG5cbiAgICAgICAgY29uc3Qgc291cmNlQ2FjaGVzID0gdGhpcy5fbWFwLnN0eWxlLnNvdXJjZUNhY2hlcztcbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiBzb3VyY2VDYWNoZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IHNvdXJjZUNhY2hlc1tpZF0uZ2V0U291cmNlKCk7XG4gICAgICAgICAgICBpZiAoc291cmNlLmF0dHJpYnV0aW9uICYmIGF0dHJpYnV0aW9ucy5pbmRleE9mKHNvdXJjZS5hdHRyaWJ1dGlvbikgPCAwKSB7XG4gICAgICAgICAgICAgICAgYXR0cmlidXRpb25zLnB1c2goc291cmNlLmF0dHJpYnV0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHJlbW92ZSBhbnkgZW50cmllcyB0aGF0IGFyZSBzdWJzdHJpbmdzIG9mIGFub3RoZXIgZW50cnkuXG4gICAgICAgIC8vIGZpcnN0IHNvcnQgYnkgbGVuZ3RoIHNvIHRoYXQgc3Vic3RyaW5ncyBjb21lIGZpcnN0XG4gICAgICAgIGF0dHJpYnV0aW9ucy5zb3J0KChhLCBiKSA9PiBhLmxlbmd0aCAtIGIubGVuZ3RoKTtcbiAgICAgICAgYXR0cmlidXRpb25zID0gYXR0cmlidXRpb25zLmZpbHRlcigoYXR0cmliLCBpKSA9PiB7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gaSArIDE7IGogPCBhdHRyaWJ1dGlvbnMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRpb25zW2pdLmluZGV4T2YoYXR0cmliKSA+PSAwKSB7IHJldHVybiBmYWxzZTsgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9jb250YWluZXIuaW5uZXJIVE1MID0gYXR0cmlidXRpb25zLmpvaW4oJyB8ICcpO1xuICAgICAgICAvLyByZW1vdmUgb2xkIERPTSBub2RlIGZyb20gX2VkaXRMaW5rXG4gICAgICAgIHRoaXMuX2VkaXRMaW5rID0gbnVsbDtcbiAgICB9XG5cbiAgICBfdXBkYXRlQ29tcGFjdCgpIHtcbiAgICAgICAgY29uc3QgY29tcGFjdCA9IHRoaXMuX21hcC5nZXRDYW52YXNDb250YWluZXIoKS5vZmZzZXRXaWR0aCA8PSA2NDA7XG5cbiAgICAgICAgdGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdFtjb21wYWN0ID8gJ2FkZCcgOiAncmVtb3ZlJ10oJ2NvbXBhY3QnKTtcbiAgICB9XG5cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBBdHRyaWJ1dGlvbkNvbnRyb2w7XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IEV2ZW50ZWQgPSByZXF1aXJlKCcuLi8uLi91dGlsL2V2ZW50ZWQnKTtcbmNvbnN0IERPTSA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvZG9tJyk7XG5jb25zdCB3aW5kb3cgPSByZXF1aXJlKCcuLi8uLi91dGlsL3dpbmRvdycpO1xuY29uc3QgdXRpbCA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvdXRpbCcpO1xuXG5jb25zdCBkZWZhdWx0R2VvUG9zaXRpb25PcHRpb25zID0geyBlbmFibGVIaWdoQWNjdXJhY3k6IGZhbHNlLCB0aW1lb3V0OiA2MDAwIC8qIDZzZWMgKi8gfTtcbmNvbnN0IGNsYXNzTmFtZSA9ICdtYXBib3hnbC1jdHJsJztcblxubGV0IHN1cHBvcnRzR2VvbG9jYXRpb247XG5cbmZ1bmN0aW9uIGNoZWNrR2VvbG9jYXRpb25TdXBwb3J0KGNhbGxiYWNrKSB7XG4gICAgaWYgKHN1cHBvcnRzR2VvbG9jYXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjYWxsYmFjayhzdXBwb3J0c0dlb2xvY2F0aW9uKTtcblxuICAgIH0gZWxzZSBpZiAod2luZG93Lm5hdmlnYXRvci5wZXJtaXNzaW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIG5hdmlnYXRvci5wZXJtaXNzaW9ucyBoYXMgaW5jb21wbGV0ZSBicm93c2VyIHN1cHBvcnRcbiAgICAgICAgLy8gaHR0cDovL2Nhbml1c2UuY29tLyNmZWF0PXBlcm1pc3Npb25zLWFwaVxuICAgICAgICAvLyBUZXN0IGZvciB0aGUgY2FzZSB3aGVyZSBhIGJyb3dzZXIgZGlzYWJsZXMgR2VvbG9jYXRpb24gYmVjYXVzZSBvZiBhblxuICAgICAgICAvLyBpbnNlY3VyZSBvcmlnaW5cbiAgICAgICAgd2luZG93Lm5hdmlnYXRvci5wZXJtaXNzaW9ucy5xdWVyeSh7IG5hbWU6ICdnZW9sb2NhdGlvbicgfSkudGhlbigocCkgPT4ge1xuICAgICAgICAgICAgc3VwcG9ydHNHZW9sb2NhdGlvbiA9IHAuc3RhdGUgIT09ICdkZW5pZWQnO1xuICAgICAgICAgICAgY2FsbGJhY2soc3VwcG9ydHNHZW9sb2NhdGlvbik7XG4gICAgICAgIH0pO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgc3VwcG9ydHNHZW9sb2NhdGlvbiA9ICEhd2luZG93Lm5hdmlnYXRvci5nZW9sb2NhdGlvbjtcbiAgICAgICAgY2FsbGJhY2soc3VwcG9ydHNHZW9sb2NhdGlvbik7XG4gICAgfVxufVxuXG4vKipcbiAqIEEgYEdlb2xvY2F0ZUNvbnRyb2xgIGNvbnRyb2wgcHJvdmlkZXMgYSBidXR0b24gdGhhdCB1c2VzIHRoZSBicm93c2VyJ3MgZ2VvbG9jYXRpb25cbiAqIEFQSSB0byBsb2NhdGUgdGhlIHVzZXIgb24gdGhlIG1hcC5cbiAqXG4gKiBOb3QgYWxsIGJyb3dzZXJzIHN1cHBvcnQgZ2VvbG9jYXRpb24sXG4gKiBhbmQgc29tZSB1c2VycyBtYXkgZGlzYWJsZSB0aGUgZmVhdHVyZS4gR2VvbG9jYXRpb24gc3VwcG9ydCBmb3IgbW9kZXJuXG4gKiBicm93c2VycyBpbmNsdWRpbmcgQ2hyb21lIHJlcXVpcmVzIHNpdGVzIHRvIGJlIHNlcnZlZCBvdmVyIEhUVFBTLiBJZlxuICogZ2VvbG9jYXRpb24gc3VwcG9ydCBpcyBub3QgYXZhaWxhYmxlLCB0aGUgR2VvbG9jYXRlQ29udHJvbCB3aWxsIG5vdFxuICogYmUgdmlzaWJsZS5cbiAqXG4gKiBAaW1wbGVtZW50cyB7SUNvbnRyb2x9XG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMucG9zaXRpb25PcHRpb25zPXtlbmFibGVIaWdoQWNjdXJhY3k6IGZhbHNlLCB0aW1lb3V0OiA2MDAwfV0gQSBbUG9zaXRpb25PcHRpb25zXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvUG9zaXRpb25PcHRpb25zKSBvYmplY3QuXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMud2F0Y2hQb3NpdGlvbj1mYWxzZV0gSWYgYHRydWVgIHRoZSBtYXAgd2lsbCByZXBvc2l0aW9uIGVhY2ggdGltZSB0aGUgcG9zaXRpb24gb2YgdGhlIGRldmljZSBjaGFuZ2VzIGFuZCB0aGUgY29udHJvbCBiZWNvbWVzIGEgdG9nZ2xlLlxuICogQGV4YW1wbGVcbiAqIG1hcC5hZGRDb250cm9sKG5ldyBtYXBib3hnbC5HZW9sb2NhdGVDb250cm9sKHtcbiAqICAgICBwb3NpdGlvbk9wdGlvbnM6IHtcbiAqICAgICAgICAgZW5hYmxlSGlnaEFjY3VyYWN5OiB0cnVlXG4gKiAgICAgfVxuICogfSkpO1xuICovXG5jbGFzcyBHZW9sb2NhdGVDb250cm9sIGV4dGVuZHMgRXZlbnRlZCB7XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgIHV0aWwuYmluZEFsbChbXG4gICAgICAgICAgICAnX29uU3VjY2VzcycsXG4gICAgICAgICAgICAnX29uRXJyb3InLFxuICAgICAgICAgICAgJ19maW5pc2gnLFxuICAgICAgICAgICAgJ19zZXR1cFVJJ1xuICAgICAgICBdLCB0aGlzKTtcbiAgICB9XG5cbiAgICBvbkFkZChtYXApIHtcbiAgICAgICAgdGhpcy5fbWFwID0gbWFwO1xuICAgICAgICB0aGlzLl9jb250YWluZXIgPSBET00uY3JlYXRlKCdkaXYnLCBgJHtjbGFzc05hbWV9ICR7Y2xhc3NOYW1lfS1ncm91cGApO1xuICAgICAgICBjaGVja0dlb2xvY2F0aW9uU3VwcG9ydCh0aGlzLl9zZXR1cFVJKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRhaW5lcjtcbiAgICB9XG5cbiAgICBvblJlbW92ZSgpIHtcbiAgICAgICAgdGhpcy5fY29udGFpbmVyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5fY29udGFpbmVyKTtcbiAgICAgICAgdGhpcy5fbWFwID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIF9vblN1Y2Nlc3MocG9zaXRpb24pIHtcbiAgICAgICAgdGhpcy5fbWFwLmp1bXBUbyh7XG4gICAgICAgICAgICBjZW50ZXI6IFtwb3NpdGlvbi5jb29yZHMubG9uZ2l0dWRlLCBwb3NpdGlvbi5jb29yZHMubGF0aXR1ZGVdLFxuICAgICAgICAgICAgem9vbTogMTcsXG4gICAgICAgICAgICBiZWFyaW5nOiAwLFxuICAgICAgICAgICAgcGl0Y2g6IDBcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5maXJlKCdnZW9sb2NhdGUnLCBwb3NpdGlvbik7XG4gICAgICAgIHRoaXMuX2ZpbmlzaCgpO1xuICAgIH1cblxuICAgIF9vbkVycm9yKGVycm9yKSB7XG4gICAgICAgIHRoaXMuZmlyZSgnZXJyb3InLCBlcnJvcik7XG4gICAgICAgIHRoaXMuX2ZpbmlzaCgpO1xuICAgIH1cblxuICAgIF9maW5pc2goKSB7XG4gICAgICAgIGlmICh0aGlzLl90aW1lb3V0SWQpIHsgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXRJZCk7IH1cbiAgICAgICAgdGhpcy5fdGltZW91dElkID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIF9zZXR1cFVJKHN1cHBvcnRlZCkge1xuICAgICAgICBpZiAoc3VwcG9ydGVkID09PSBmYWxzZSkgcmV0dXJuO1xuICAgICAgICB0aGlzLl9jb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLFxuICAgICAgICAgICAgZSA9PiBlLnByZXZlbnREZWZhdWx0KCkpO1xuICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24gPSBET00uY3JlYXRlKCdidXR0b24nLFxuICAgICAgICAgICAgYCR7Y2xhc3NOYW1lfS1pY29uICR7Y2xhc3NOYW1lfS1nZW9sb2NhdGVgLFxuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyKTtcbiAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLnR5cGUgPSAnYnV0dG9uJztcbiAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsICdHZW9sb2NhdGUnKTtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy53YXRjaFBvc2l0aW9uKSB0aGlzLl9nZW9sb2NhdGVCdXR0b24uc2V0QXR0cmlidXRlKCdhcmlhLXByZXNzZWQnLCBmYWxzZSk7XG4gICAgICAgIHRoaXMuX2dlb2xvY2F0ZUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsXG4gICAgICAgICAgICB0aGlzLl9vbkNsaWNrR2VvbG9jYXRlLmJpbmQodGhpcykpO1xuICAgIH1cblxuICAgIF9vbkNsaWNrR2VvbG9jYXRlKCkge1xuICAgICAgICBjb25zdCBwb3NpdGlvbk9wdGlvbnMgPSB1dGlsLmV4dGVuZChkZWZhdWx0R2VvUG9zaXRpb25PcHRpb25zLCB0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLnBvc2l0aW9uT3B0aW9ucyB8fCB7fSk7XG5cbiAgICAgICAgLy8gdG9nZ2xlIHdhdGNoaW5nIHRoZSBkZXZpY2UgbG9jYXRpb25cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy53YXRjaFBvc2l0aW9uKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fZ2VvbG9jYXRpb25XYXRjaElEICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBjbGVhciB3YXRjaFBvc2l0aW9uXG4gICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ3dhdGNoaW5nJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2VvbG9jYXRlQnV0dG9uLnNldEF0dHJpYnV0ZSgnYXJpYS1wcmVzc2VkJywgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHdpbmRvdy5uYXZpZ2F0b3IuZ2VvbG9jYXRpb24uY2xlYXJXYXRjaCh0aGlzLl9nZW9sb2NhdGlvbldhdGNoSUQpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2dlb2xvY2F0aW9uV2F0Y2hJRCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gZW5hYmxlIHdhdGNoUG9zaXRpb25cbiAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uY2xhc3NMaXN0LmFkZCgnd2F0Y2hpbmcnKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGVCdXR0b24uc2V0QXR0cmlidXRlKCdhcmlhLXByZXNzZWQnLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9nZW9sb2NhdGlvbldhdGNoSUQgPSB3aW5kb3cubmF2aWdhdG9yLmdlb2xvY2F0aW9uLndhdGNoUG9zaXRpb24oXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29uU3VjY2VzcywgdGhpcy5fb25FcnJvciwgcG9zaXRpb25PcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHdpbmRvdy5uYXZpZ2F0b3IuZ2VvbG9jYXRpb24uZ2V0Q3VycmVudFBvc2l0aW9uKFxuICAgICAgICAgICAgICAgIHRoaXMuX29uU3VjY2VzcywgdGhpcy5fb25FcnJvciwgcG9zaXRpb25PcHRpb25zKTtcblxuICAgICAgICAgICAgLy8gVGhpcyB0aW1lb3V0IGVuc3VyZXMgdGhhdCB3ZSBzdGlsbCBjYWxsIGZpbmlzaCgpIGV2ZW4gaWZcbiAgICAgICAgICAgIC8vIHRoZSB1c2VyIGRlY2xpbmVzIHRvIHNoYXJlIHRoZWlyIGxvY2F0aW9uIGluIEZpcmVmb3hcbiAgICAgICAgICAgIHRoaXMuX3RpbWVvdXRJZCA9IHNldFRpbWVvdXQodGhpcy5fZmluaXNoLCAxMDAwMCAvKiAxMHNlYyAqLyk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gR2VvbG9jYXRlQ29udHJvbDtcblxuLyoqXG4gKiBnZW9sb2NhdGUgZXZlbnQuXG4gKlxuICogQGV2ZW50IGdlb2xvY2F0ZVxuICogQG1lbWJlcm9mIEdlb2xvY2F0ZUNvbnRyb2xcbiAqIEBpbnN0YW5jZVxuICogQHByb3BlcnR5IHtQb3NpdGlvbn0gZGF0YSBUaGUgcmV0dXJuZWQgW1Bvc2l0aW9uXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvUG9zaXRpb24pIG9iamVjdCBmcm9tIHRoZSBjYWxsYmFjayBpbiBbR2VvbG9jYXRpb24uZ2V0Q3VycmVudFBvc2l0aW9uKCldKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9HZW9sb2NhdGlvbi9nZXRDdXJyZW50UG9zaXRpb24pLlxuICpcbiAqL1xuXG4vKipcbiAqIGVycm9yIGV2ZW50LlxuICpcbiAqIEBldmVudCBlcnJvclxuICogQG1lbWJlcm9mIEdlb2xvY2F0ZUNvbnRyb2xcbiAqIEBpbnN0YW5jZVxuICogQHByb3BlcnR5IHtQb3NpdGlvbkVycm9yfSBkYXRhIFRoZSByZXR1cm5lZCBbUG9zaXRpb25FcnJvcl0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1Bvc2l0aW9uRXJyb3IpIG9iamVjdCBmcm9tIHRoZSBjYWxsYmFjayBpbiBbR2VvbG9jYXRpb24uZ2V0Q3VycmVudFBvc2l0aW9uKCldKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9HZW9sb2NhdGlvbi9nZXRDdXJyZW50UG9zaXRpb24pLlxuICpcbiAqL1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBET00gPSByZXF1aXJlKCcuLi8uLi91dGlsL2RvbScpO1xuY29uc3Qgd2luZG93ID0gcmVxdWlyZSgnLi4vLi4vdXRpbC93aW5kb3cnKTtcbmNvbnN0IHV0aWwgPSByZXF1aXJlKCcuLi8uLi91dGlsL3V0aWwnKTtcblxuY29uc3QgY2xhc3NOYW1lID0gJ21hcGJveGdsLWN0cmwnO1xuXG4vKipcbiAqIEEgYE5hdmlnYXRpb25Db250cm9sYCBjb250cm9sIGNvbnRhaW5zIHpvb20gYnV0dG9ucyBhbmQgYSBjb21wYXNzLlxuICpcbiAqIEBpbXBsZW1lbnRzIHtJQ29udHJvbH1cbiAqIEBleGFtcGxlXG4gKiB2YXIgbmF2ID0gbmV3IG1hcGJveGdsLk5hdmlnYXRpb25Db250cm9sKCk7XG4gKiBtYXAuYWRkQ29udHJvbChuYXYsICd0b3AtbGVmdCcpO1xuICogQHNlZSBbRGlzcGxheSBtYXAgbmF2aWdhdGlvbiBjb250cm9sc10oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9uYXZpZ2F0aW9uLylcbiAqIEBzZWUgW0FkZCBhIHRoaXJkIHBhcnR5IHZlY3RvciB0aWxlIHNvdXJjZV0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS90aGlyZC1wYXJ0eS8pXG4gKi9cbmNsYXNzIE5hdmlnYXRpb25Db250cm9sIHtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB1dGlsLmJpbmRBbGwoW1xuICAgICAgICAgICAgJ19yb3RhdGVDb21wYXNzQXJyb3cnXG4gICAgICAgIF0sIHRoaXMpO1xuICAgIH1cblxuICAgIF9yb3RhdGVDb21wYXNzQXJyb3coKSB7XG4gICAgICAgIGNvbnN0IHJvdGF0ZSA9IGByb3RhdGUoJHt0aGlzLl9tYXAudHJhbnNmb3JtLmFuZ2xlICogKDE4MCAvIE1hdGguUEkpfWRlZylgO1xuICAgICAgICB0aGlzLl9jb21wYXNzQXJyb3cuc3R5bGUudHJhbnNmb3JtID0gcm90YXRlO1xuICAgIH1cblxuICAgIG9uQWRkKG1hcCkge1xuICAgICAgICB0aGlzLl9tYXAgPSBtYXA7XG4gICAgICAgIHRoaXMuX2NvbnRhaW5lciA9IERPTS5jcmVhdGUoJ2RpdicsIGAke2NsYXNzTmFtZX0gJHtjbGFzc05hbWV9LWdyb3VwYCwgbWFwLmdldENvbnRhaW5lcigpKTtcbiAgICAgICAgdGhpcy5fY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51JywgdGhpcy5fb25Db250ZXh0TWVudS5iaW5kKHRoaXMpKTtcblxuICAgICAgICB0aGlzLl96b29tSW5CdXR0b24gPSB0aGlzLl9jcmVhdGVCdXR0b24oYCR7Y2xhc3NOYW1lfS1pY29uICR7Y2xhc3NOYW1lfS16b29tLWluYCwgJ1pvb20gSW4nLCBtYXAuem9vbUluLmJpbmQobWFwKSk7XG4gICAgICAgIHRoaXMuX3pvb21PdXRCdXR0b24gPSB0aGlzLl9jcmVhdGVCdXR0b24oYCR7Y2xhc3NOYW1lfS1pY29uICR7Y2xhc3NOYW1lfS16b29tLW91dGAsICdab29tIE91dCcsIG1hcC56b29tT3V0LmJpbmQobWFwKSk7XG4gICAgICAgIHRoaXMuX2NvbXBhc3MgPSB0aGlzLl9jcmVhdGVCdXR0b24oYCR7Y2xhc3NOYW1lfS1pY29uICR7Y2xhc3NOYW1lfS1jb21wYXNzYCwgJ1Jlc2V0IE5vcnRoJywgbWFwLnJlc2V0Tm9ydGguYmluZChtYXApKTtcblxuICAgICAgICB0aGlzLl9jb21wYXNzQXJyb3cgPSBET00uY3JlYXRlKCdzcGFuJywgJ2Fycm93JywgdGhpcy5fY29tcGFzcyk7XG5cbiAgICAgICAgdGhpcy5fY29tcGFzcy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLl9vbkNvbXBhc3NEb3duLmJpbmQodGhpcykpO1xuICAgICAgICB0aGlzLl9vbkNvbXBhc3NNb3ZlID0gdGhpcy5fb25Db21wYXNzTW92ZS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLl9vbkNvbXBhc3NVcCA9IHRoaXMuX29uQ29tcGFzc1VwLmJpbmQodGhpcyk7XG5cbiAgICAgICAgdGhpcy5fbWFwLm9uKCdyb3RhdGUnLCB0aGlzLl9yb3RhdGVDb21wYXNzQXJyb3cpO1xuICAgICAgICB0aGlzLl9yb3RhdGVDb21wYXNzQXJyb3coKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5fY29udGFpbmVyO1xuICAgIH1cblxuICAgIG9uUmVtb3ZlKCkge1xuICAgICAgICB0aGlzLl9jb250YWluZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLl9jb250YWluZXIpO1xuICAgICAgICB0aGlzLl9tYXAub2ZmKCdyb3RhdGUnLCB0aGlzLl9yb3RhdGVDb21wYXNzQXJyb3cpO1xuICAgICAgICB0aGlzLl9tYXAgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgX29uQ29udGV4dE1lbnUoZSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgX29uQ29tcGFzc0Rvd24oZSkge1xuICAgICAgICBpZiAoZS5idXR0b24gIT09IDApIHJldHVybjtcblxuICAgICAgICBET00uZGlzYWJsZURyYWcoKTtcbiAgICAgICAgd2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuX29uQ29tcGFzc01vdmUpO1xuICAgICAgICB3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuX29uQ29tcGFzc1VwKTtcblxuICAgICAgICB0aGlzLl9tYXAuZ2V0Q2FudmFzQ29udGFpbmVyKCkuZGlzcGF0Y2hFdmVudChjb3B5TW91c2VFdmVudChlKSk7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuXG4gICAgX29uQ29tcGFzc01vdmUoZSkge1xuICAgICAgICBpZiAoZS5idXR0b24gIT09IDApIHJldHVybjtcblxuICAgICAgICB0aGlzLl9tYXAuZ2V0Q2FudmFzQ29udGFpbmVyKCkuZGlzcGF0Y2hFdmVudChjb3B5TW91c2VFdmVudChlKSk7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuXG4gICAgX29uQ29tcGFzc1VwKGUpIHtcbiAgICAgICAgaWYgKGUuYnV0dG9uICE9PSAwKSByZXR1cm47XG5cbiAgICAgICAgd2luZG93LmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuX29uQ29tcGFzc01vdmUpO1xuICAgICAgICB3aW5kb3cuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuX29uQ29tcGFzc1VwKTtcbiAgICAgICAgRE9NLmVuYWJsZURyYWcoKTtcblxuICAgICAgICB0aGlzLl9tYXAuZ2V0Q2FudmFzQ29udGFpbmVyKCkuZGlzcGF0Y2hFdmVudChjb3B5TW91c2VFdmVudChlKSk7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuXG4gICAgX2NyZWF0ZUJ1dHRvbihjbGFzc05hbWUsIGFyaWFMYWJlbCwgZm4pIHtcbiAgICAgICAgY29uc3QgYSA9IERPTS5jcmVhdGUoJ2J1dHRvbicsIGNsYXNzTmFtZSwgdGhpcy5fY29udGFpbmVyKTtcbiAgICAgICAgYS50eXBlID0gJ2J1dHRvbic7XG4gICAgICAgIGEuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgYXJpYUxhYmVsKTtcbiAgICAgICAgYS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHsgZm4oKTsgfSk7XG4gICAgICAgIHJldHVybiBhO1xuICAgIH1cblxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IE5hdmlnYXRpb25Db250cm9sO1xuXG5mdW5jdGlvbiBjb3B5TW91c2VFdmVudChlKSB7XG4gICAgcmV0dXJuIG5ldyB3aW5kb3cuTW91c2VFdmVudChlLnR5cGUsIHtcbiAgICAgICAgYnV0dG9uOiAyLCAgICAvLyByaWdodCBjbGlja1xuICAgICAgICBidXR0b25zOiAyLCAgIC8vIHJpZ2h0IGNsaWNrXG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNhbmNlbGFibGU6IHRydWUsXG4gICAgICAgIGRldGFpbDogZS5kZXRhaWwsXG4gICAgICAgIHZpZXc6IGUudmlldyxcbiAgICAgICAgc2NyZWVuWDogZS5zY3JlZW5YLFxuICAgICAgICBzY3JlZW5ZOiBlLnNjcmVlblksXG4gICAgICAgIGNsaWVudFg6IGUuY2xpZW50WCxcbiAgICAgICAgY2xpZW50WTogZS5jbGllbnRZLFxuICAgICAgICBtb3ZlbWVudFg6IGUubW92ZW1lbnRYLFxuICAgICAgICBtb3ZlbWVudFk6IGUubW92ZW1lbnRZLFxuICAgICAgICBjdHJsS2V5OiBlLmN0cmxLZXksXG4gICAgICAgIHNoaWZ0S2V5OiBlLnNoaWZ0S2V5LFxuICAgICAgICBhbHRLZXk6IGUuYWx0S2V5LFxuICAgICAgICBtZXRhS2V5OiBlLm1ldGFLZXlcbiAgICB9KTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgRE9NID0gcmVxdWlyZSgnLi4vLi4vdXRpbC9kb20nKTtcbmNvbnN0IHV0aWwgPSByZXF1aXJlKCcuLi8uLi91dGlsL3V0aWwnKTtcblxuLyoqXG4gKiBBIGBTY2FsZUNvbnRyb2xgIGNvbnRyb2wgZGlzcGxheXMgdGhlIHJhdGlvIG9mIGEgZGlzdGFuY2Ugb24gdGhlIG1hcCB0byB0aGUgY29ycmVzcG9uZGluZyBkaXN0YW5jZSBvbiB0aGUgZ3JvdW5kLlxuICpcbiAqIEBpbXBsZW1lbnRzIHtJQ29udHJvbH1cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5tYXhXaWR0aD0nMTUwJ10gVGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBzY2FsZSBjb250cm9sIGluIHBpeGVscy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy51bml0PSdtZXRyaWMnXSBVbml0IG9mIHRoZSBkaXN0YW5jZSAoYCdpbXBlcmlhbCdgIG9yIGAnbWV0cmljJ2ApLlxuICogQGV4YW1wbGVcbiAqIG1hcC5hZGRDb250cm9sKG5ldyBtYXBib3hnbC5TY2FsZUNvbnRyb2woe1xuICogICAgIG1heFdpZHRoOiA4MCxcbiAqICAgICB1bml0OiAnaW1wZXJpYWwnXG4gKiB9KSk7XG4gKi9cbmNsYXNzIFNjYWxlQ29udHJvbCB7XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG5cbiAgICAgICAgdXRpbC5iaW5kQWxsKFtcbiAgICAgICAgICAgICdfb25Nb3ZlJ1xuICAgICAgICBdLCB0aGlzKTtcbiAgICB9XG5cbiAgICBnZXREZWZhdWx0UG9zaXRpb24oKSB7XG4gICAgICAgIHJldHVybiAnYm90dG9tLWxlZnQnO1xuICAgIH1cblxuICAgIF9vbk1vdmUoKSB7XG4gICAgICAgIHVwZGF0ZVNjYWxlKHRoaXMuX21hcCwgdGhpcy5fY29udGFpbmVyLCB0aGlzLm9wdGlvbnMpO1xuICAgIH1cblxuICAgIG9uQWRkKG1hcCkge1xuICAgICAgICB0aGlzLl9tYXAgPSBtYXA7XG4gICAgICAgIHRoaXMuX2NvbnRhaW5lciA9IERPTS5jcmVhdGUoJ2RpdicsICdtYXBib3hnbC1jdHJsIG1hcGJveGdsLWN0cmwtc2NhbGUnLCBtYXAuZ2V0Q29udGFpbmVyKCkpO1xuXG4gICAgICAgIHRoaXMuX21hcC5vbignbW92ZScsIHRoaXMuX29uTW92ZSk7XG4gICAgICAgIHRoaXMuX29uTW92ZSgpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9jb250YWluZXI7XG4gICAgfVxuXG4gICAgb25SZW1vdmUoKSB7XG4gICAgICAgIHRoaXMuX2NvbnRhaW5lci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuX2NvbnRhaW5lcik7XG4gICAgICAgIHRoaXMuX21hcC5vZmYoJ21vdmUnLCB0aGlzLl9vbk1vdmUpO1xuICAgICAgICB0aGlzLl9tYXAgPSB1bmRlZmluZWQ7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFNjYWxlQ29udHJvbDtcblxuZnVuY3Rpb24gdXBkYXRlU2NhbGUobWFwLCBjb250YWluZXIsIG9wdGlvbnMpIHtcbiAgICAvLyBBIGhvcml6b250YWwgc2NhbGUgaXMgaW1hZ2luZWQgdG8gYmUgcHJlc2VudCBhdCBjZW50ZXIgb2YgdGhlIG1hcFxuICAgIC8vIGNvbnRhaW5lciB3aXRoIG1heGltdW0gbGVuZ3RoIChEZWZhdWx0KSBhcyAxMDBweC5cbiAgICAvLyBVc2luZyBzcGhlcmljYWwgbGF3IG9mIGNvc2luZXMgYXBwcm94aW1hdGlvbiwgdGhlIHJlYWwgZGlzdGFuY2UgaXNcbiAgICAvLyBmb3VuZCBiZXR3ZWVuIHRoZSB0d28gY29vcmRpbmF0ZXMuXG4gICAgY29uc3QgbWF4V2lkdGggPSBvcHRpb25zICYmIG9wdGlvbnMubWF4V2lkdGggfHwgMTAwO1xuXG4gICAgY29uc3QgeSA9IG1hcC5fY29udGFpbmVyLmNsaWVudEhlaWdodCAvIDI7XG4gICAgY29uc3QgbWF4TWV0ZXJzID0gZ2V0RGlzdGFuY2UobWFwLnVucHJvamVjdChbMCwgeV0pLCBtYXAudW5wcm9qZWN0KFttYXhXaWR0aCwgeV0pKTtcbiAgICAvLyBUaGUgcmVhbCBkaXN0YW5jZSBjb3JyZXNwb25kaW5nIHRvIDEwMHB4IHNjYWxlIGxlbmd0aCBpcyByb3VuZGVkIG9mZiB0b1xuICAgIC8vIG5lYXIgcHJldHR5IG51bWJlciBhbmQgdGhlIHNjYWxlIGxlbmd0aCBmb3IgdGhlIHNhbWUgaXMgZm91bmQgb3V0LlxuICAgIC8vIERlZmF1bHQgdW5pdCBvZiB0aGUgc2NhbGUgaXMgYmFzZWQgb24gVXNlcidzIGxvY2FsZS5cbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnVuaXQgPT09ICdpbXBlcmlhbCcpIHtcbiAgICAgICAgY29uc3QgbWF4RmVldCA9IDMuMjgwOCAqIG1heE1ldGVycztcbiAgICAgICAgaWYgKG1heEZlZXQgPiA1MjgwKSB7XG4gICAgICAgICAgICBjb25zdCBtYXhNaWxlcyA9IG1heEZlZXQgLyA1MjgwO1xuICAgICAgICAgICAgc2V0U2NhbGUoY29udGFpbmVyLCBtYXhXaWR0aCwgbWF4TWlsZXMsICdtaScpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2V0U2NhbGUoY29udGFpbmVyLCBtYXhXaWR0aCwgbWF4RmVldCwgJ2Z0Jyk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBzZXRTY2FsZShjb250YWluZXIsIG1heFdpZHRoLCBtYXhNZXRlcnMsICdtJyk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBzZXRTY2FsZShjb250YWluZXIsIG1heFdpZHRoLCBtYXhEaXN0YW5jZSwgdW5pdCkge1xuICAgIGxldCBkaXN0YW5jZSA9IGdldFJvdW5kTnVtKG1heERpc3RhbmNlKTtcbiAgICBjb25zdCByYXRpbyA9IGRpc3RhbmNlIC8gbWF4RGlzdGFuY2U7XG5cbiAgICBpZiAodW5pdCA9PT0gJ20nICYmIGRpc3RhbmNlID49IDEwMDApIHtcbiAgICAgICAgZGlzdGFuY2UgPSBkaXN0YW5jZSAvIDEwMDA7XG4gICAgICAgIHVuaXQgPSAna20nO1xuICAgIH1cblxuICAgIGNvbnRhaW5lci5zdHlsZS53aWR0aCA9IGAke21heFdpZHRoICogcmF0aW99cHhgO1xuICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBkaXN0YW5jZSArIHVuaXQ7XG59XG5cbmZ1bmN0aW9uIGdldERpc3RhbmNlKGxhdGxuZzEsIGxhdGxuZzIpIHtcbiAgICAvLyBVc2VzIHNwaGVyaWNhbCBsYXcgb2YgY29zaW5lcyBhcHByb3hpbWF0aW9uLlxuICAgIGNvbnN0IFIgPSA2MzcxMDAwO1xuXG4gICAgY29uc3QgcmFkID0gTWF0aC5QSSAvIDE4MCxcbiAgICAgICAgbGF0MSA9IGxhdGxuZzEubGF0ICogcmFkLFxuICAgICAgICBsYXQyID0gbGF0bG5nMi5sYXQgKiByYWQsXG4gICAgICAgIGEgPSBNYXRoLnNpbihsYXQxKSAqIE1hdGguc2luKGxhdDIpICtcbiAgICAgICAgICBNYXRoLmNvcyhsYXQxKSAqIE1hdGguY29zKGxhdDIpICogTWF0aC5jb3MoKGxhdGxuZzIubG5nIC0gbGF0bG5nMS5sbmcpICogcmFkKTtcblxuICAgIGNvbnN0IG1heE1ldGVycyA9IFIgKiBNYXRoLmFjb3MoTWF0aC5taW4oYSwgMSkpO1xuICAgIHJldHVybiBtYXhNZXRlcnM7XG5cbn1cblxuZnVuY3Rpb24gZ2V0Um91bmROdW0obnVtKSB7XG4gICAgY29uc3QgcG93MTAgPSBNYXRoLnBvdygxMCwgKGAke01hdGguZmxvb3IobnVtKX1gKS5sZW5ndGggLSAxKTtcbiAgICBsZXQgZCA9IG51bSAvIHBvdzEwO1xuXG4gICAgZCA9IGQgPj0gMTAgPyAxMCA6XG4gICAgICAgIGQgPj0gNSA/IDUgOlxuICAgICAgICBkID49IDMgPyAzIDpcbiAgICAgICAgZCA+PSAyID8gMiA6IDE7XG5cbiAgICByZXR1cm4gcG93MTAgKiBkO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBET00gPSByZXF1aXJlKCcuLi8uLi91dGlsL2RvbScpO1xuY29uc3QgTG5nTGF0Qm91bmRzID0gcmVxdWlyZSgnLi4vLi4vZ2VvL2xuZ19sYXRfYm91bmRzJyk7XG5jb25zdCB1dGlsID0gcmVxdWlyZSgnLi4vLi4vdXRpbC91dGlsJyk7XG5jb25zdCB3aW5kb3cgPSByZXF1aXJlKCcuLi8uLi91dGlsL3dpbmRvdycpO1xuXG4vKipcbiAqIFRoZSBgQm94Wm9vbUhhbmRsZXJgIGFsbG93cyB0aGUgdXNlciB0byB6b29tIHRoZSBtYXAgdG8gZml0IHdpdGhpbiBhIGJvdW5kaW5nIGJveC5cbiAqIFRoZSBib3VuZGluZyBib3ggaXMgZGVmaW5lZCBieSBjbGlja2luZyBhbmQgaG9sZGluZyBgc2hpZnRgIHdoaWxlIGRyYWdnaW5nIHRoZSBjdXJzb3IuXG4gKlxuICogQHBhcmFtIHtNYXB9IG1hcCBUaGUgTWFwYm94IEdMIEpTIG1hcCB0byBhZGQgdGhlIGhhbmRsZXIgdG8uXG4gKi9cbmNsYXNzIEJveFpvb21IYW5kbGVyIHtcblxuICAgIGNvbnN0cnVjdG9yKG1hcCkge1xuICAgICAgICB0aGlzLl9tYXAgPSBtYXA7XG4gICAgICAgIHRoaXMuX2VsID0gbWFwLmdldENhbnZhc0NvbnRhaW5lcigpO1xuICAgICAgICB0aGlzLl9jb250YWluZXIgPSBtYXAuZ2V0Q29udGFpbmVyKCk7XG5cbiAgICAgICAgdXRpbC5iaW5kQWxsKFtcbiAgICAgICAgICAgICdfb25Nb3VzZURvd24nLFxuICAgICAgICAgICAgJ19vbk1vdXNlTW92ZScsXG4gICAgICAgICAgICAnX29uTW91c2VVcCcsXG4gICAgICAgICAgICAnX29uS2V5RG93bidcbiAgICAgICAgXSwgdGhpcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBcImJveCB6b29tXCIgaW50ZXJhY3Rpb24gaXMgZW5hYmxlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIFwiYm94IHpvb21cIiBpbnRlcmFjdGlvbiBpcyBlbmFibGVkLlxuICAgICAqL1xuICAgIGlzRW5hYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fZW5hYmxlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIFwiYm94IHpvb21cIiBpbnRlcmFjdGlvbiBpcyBhY3RpdmUsIGkuZS4gY3VycmVudGx5IGJlaW5nIHVzZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBcImJveCB6b29tXCIgaW50ZXJhY3Rpb24gaXMgYWN0aXZlLlxuICAgICAqL1xuICAgIGlzQWN0aXZlKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9hY3RpdmU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyB0aGUgXCJib3ggem9vbVwiIGludGVyYWN0aW9uLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAgIG1hcC5ib3hab29tLmVuYWJsZSgpO1xuICAgICAqL1xuICAgIGVuYWJsZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNFbmFibGVkKCkpIHJldHVybjtcbiAgICAgICAgdGhpcy5fZWwuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5fb25Nb3VzZURvd24sIGZhbHNlKTtcbiAgICAgICAgdGhpcy5fZW5hYmxlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzYWJsZXMgdGhlIFwiYm94IHpvb21cIiBpbnRlcmFjdGlvbi5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogICBtYXAuYm94Wm9vbS5kaXNhYmxlKCk7XG4gICAgICovXG4gICAgZGlzYWJsZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzRW5hYmxlZCgpKSByZXR1cm47XG4gICAgICAgIHRoaXMuX2VsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMuX29uTW91c2VEb3duKTtcbiAgICAgICAgdGhpcy5fZW5hYmxlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIF9vbk1vdXNlRG93bihlKSB7XG4gICAgICAgIGlmICghKGUuc2hpZnRLZXkgJiYgZS5idXR0b24gPT09IDApKSByZXR1cm47XG5cbiAgICAgICAgd2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuX29uTW91c2VNb3ZlLCBmYWxzZSk7XG4gICAgICAgIHdpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5fb25LZXlEb3duLCBmYWxzZSk7XG4gICAgICAgIHdpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5fb25Nb3VzZVVwLCBmYWxzZSk7XG5cbiAgICAgICAgRE9NLmRpc2FibGVEcmFnKCk7XG4gICAgICAgIHRoaXMuX3N0YXJ0UG9zID0gRE9NLm1vdXNlUG9zKHRoaXMuX2VsLCBlKTtcbiAgICAgICAgdGhpcy5fYWN0aXZlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBfb25Nb3VzZU1vdmUoZSkge1xuICAgICAgICBjb25zdCBwMCA9IHRoaXMuX3N0YXJ0UG9zLFxuICAgICAgICAgICAgcDEgPSBET00ubW91c2VQb3ModGhpcy5fZWwsIGUpO1xuXG4gICAgICAgIGlmICghdGhpcy5fYm94KSB7XG4gICAgICAgICAgICB0aGlzLl9ib3ggPSBET00uY3JlYXRlKCdkaXYnLCAnbWFwYm94Z2wtYm94em9vbScsIHRoaXMuX2NvbnRhaW5lcik7XG4gICAgICAgICAgICB0aGlzLl9jb250YWluZXIuY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtY3Jvc3NoYWlyJyk7XG4gICAgICAgICAgICB0aGlzLl9maXJlRXZlbnQoJ2JveHpvb21zdGFydCcsIGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbWluWCA9IE1hdGgubWluKHAwLngsIHAxLngpLFxuICAgICAgICAgICAgbWF4WCA9IE1hdGgubWF4KHAwLngsIHAxLngpLFxuICAgICAgICAgICAgbWluWSA9IE1hdGgubWluKHAwLnksIHAxLnkpLFxuICAgICAgICAgICAgbWF4WSA9IE1hdGgubWF4KHAwLnksIHAxLnkpO1xuXG4gICAgICAgIERPTS5zZXRUcmFuc2Zvcm0odGhpcy5fYm94LCBgdHJhbnNsYXRlKCR7bWluWH1weCwke21pbll9cHgpYCk7XG5cbiAgICAgICAgdGhpcy5fYm94LnN0eWxlLndpZHRoID0gYCR7bWF4WCAtIG1pblh9cHhgO1xuICAgICAgICB0aGlzLl9ib3guc3R5bGUuaGVpZ2h0ID0gYCR7bWF4WSAtIG1pbll9cHhgO1xuICAgIH1cblxuICAgIF9vbk1vdXNlVXAoZSkge1xuICAgICAgICBpZiAoZS5idXR0b24gIT09IDApIHJldHVybjtcblxuICAgICAgICBjb25zdCBwMCA9IHRoaXMuX3N0YXJ0UG9zLFxuICAgICAgICAgICAgcDEgPSBET00ubW91c2VQb3ModGhpcy5fZWwsIGUpLFxuICAgICAgICAgICAgYm91bmRzID0gbmV3IExuZ0xhdEJvdW5kcygpXG4gICAgICAgICAgICAgICAgLmV4dGVuZCh0aGlzLl9tYXAudW5wcm9qZWN0KHAwKSlcbiAgICAgICAgICAgICAgICAuZXh0ZW5kKHRoaXMuX21hcC51bnByb2plY3QocDEpKTtcblxuICAgICAgICB0aGlzLl9maW5pc2goKTtcblxuICAgICAgICBpZiAocDAueCA9PT0gcDEueCAmJiBwMC55ID09PSBwMS55KSB7XG4gICAgICAgICAgICB0aGlzLl9maXJlRXZlbnQoJ2JveHpvb21jYW5jZWwnLCBlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX21hcFxuICAgICAgICAgICAgICAgIC5maXRCb3VuZHMoYm91bmRzLCB7bGluZWFyOiB0cnVlfSlcbiAgICAgICAgICAgICAgICAuZmlyZSgnYm94em9vbWVuZCcsIHsgb3JpZ2luYWxFdmVudDogZSwgYm94Wm9vbUJvdW5kczogYm91bmRzIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX29uS2V5RG93bihlKSB7XG4gICAgICAgIGlmIChlLmtleUNvZGUgPT09IDI3KSB7XG4gICAgICAgICAgICB0aGlzLl9maW5pc2goKTtcbiAgICAgICAgICAgIHRoaXMuX2ZpcmVFdmVudCgnYm94em9vbWNhbmNlbCcsIGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX2ZpbmlzaCgpIHtcbiAgICAgICAgdGhpcy5fYWN0aXZlID0gZmFsc2U7XG5cbiAgICAgICAgd2luZG93LmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuX29uTW91c2VNb3ZlLCBmYWxzZSk7XG4gICAgICAgIHdpbmRvdy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5fb25LZXlEb3duLCBmYWxzZSk7XG4gICAgICAgIHdpbmRvdy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5fb25Nb3VzZVVwLCBmYWxzZSk7XG5cbiAgICAgICAgdGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoJ21hcGJveGdsLWNyb3NzaGFpcicpO1xuXG4gICAgICAgIGlmICh0aGlzLl9ib3gpIHtcbiAgICAgICAgICAgIHRoaXMuX2JveC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuX2JveCk7XG4gICAgICAgICAgICB0aGlzLl9ib3ggPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgRE9NLmVuYWJsZURyYWcoKTtcbiAgICB9XG5cbiAgICBfZmlyZUV2ZW50KHR5cGUsIGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21hcC5maXJlKHR5cGUsIHsgb3JpZ2luYWxFdmVudDogZSB9KTtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gQm94Wm9vbUhhbmRsZXI7XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gTWFwQm94Wm9vbUV2ZW50XG4gKiBAcHJvcGVydHkge01vdXNlRXZlbnR9IG9yaWdpbmFsRXZlbnRcbiAqIEBwcm9wZXJ0eSB7TG5nTGF0Qm91bmRzfSBib3hab29tQm91bmRzIFRoZSBib3VuZGluZyBib3ggb2YgdGhlIFwiYm94IHpvb21cIiBpbnRlcmFjdGlvbi5cbiAqICAgVGhpcyBwcm9wZXJ0eSBpcyBvbmx5IHByb3ZpZGVkIGZvciBgYm94em9vbWVuZGAgZXZlbnRzLlxuICovXG5cbi8qKlxuICogRmlyZWQgd2hlbiBhIFwiYm94IHpvb21cIiBpbnRlcmFjdGlvbiBzdGFydHMuIFNlZSBbYEJveFpvb21IYW5kbGVyYF0oI0JveFpvb21IYW5kbGVyKS5cbiAqXG4gKiBAZXZlbnQgYm94em9vbXN0YXJ0XG4gKiBAbWVtYmVyb2YgTWFwXG4gKiBAaW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7TWFwQm94Wm9vbUV2ZW50fSBkYXRhXG4gKi9cblxuLyoqXG4gKiBGaXJlZCB3aGVuIGEgXCJib3ggem9vbVwiIGludGVyYWN0aW9uIGVuZHMuICBTZWUgW2BCb3hab29tSGFuZGxlcmBdKCNCb3hab29tSGFuZGxlcikuXG4gKlxuICogQGV2ZW50IGJveHpvb21lbmRcbiAqIEBtZW1iZXJvZiBNYXBcbiAqIEBpbnN0YW5jZVxuICogQHR5cGUge09iamVjdH1cbiAqIEBwcm9wZXJ0eSB7TWFwQm94Wm9vbUV2ZW50fSBkYXRhXG4gKi9cblxuLyoqXG4gKiBGaXJlZCB3aGVuIHRoZSB1c2VyIGNhbmNlbHMgYSBcImJveCB6b29tXCIgaW50ZXJhY3Rpb24sIG9yIHdoZW4gdGhlIGJvdW5kaW5nIGJveCBkb2VzIG5vdCBtZWV0IHRoZSBtaW5pbXVtIHNpemUgdGhyZXNob2xkLlxuICogU2VlIFtgQm94Wm9vbUhhbmRsZXJgXSgjQm94Wm9vbUhhbmRsZXIpLlxuICpcbiAqIEBldmVudCBib3h6b29tY2FuY2VsXG4gKiBAbWVtYmVyb2YgTWFwXG4gKiBAaW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7TWFwQm94Wm9vbUV2ZW50fSBkYXRhXG4gKi9cbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBUaGUgYERvdWJsZUNsaWNrWm9vbUhhbmRsZXJgIGFsbG93cyB0aGUgdXNlciB0byB6b29tIHRoZSBtYXAgYXQgYSBwb2ludCBieVxuICogZG91YmxlIGNsaWNraW5nLlxuICpcbiAqIEBwYXJhbSB7TWFwfSBtYXAgVGhlIE1hcGJveCBHTCBKUyBtYXAgdG8gYWRkIHRoZSBoYW5kbGVyIHRvLlxuICovXG5jbGFzcyBEb3VibGVDbGlja1pvb21IYW5kbGVyIHtcbiAgICBjb25zdHJ1Y3RvcihtYXApIHtcbiAgICAgICAgdGhpcy5fbWFwID0gbWFwO1xuICAgICAgICB0aGlzLl9vbkRibENsaWNrID0gdGhpcy5fb25EYmxDbGljay5iaW5kKHRoaXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgXCJkb3VibGUgY2xpY2sgdG8gem9vbVwiIGludGVyYWN0aW9uIGlzIGVuYWJsZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBcImRvdWJsZSBjbGljayB0byB6b29tXCIgaW50ZXJhY3Rpb24gaXMgZW5hYmxlZC5cbiAgICAgKi9cbiAgICBpc0VuYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2VuYWJsZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyB0aGUgXCJkb3VibGUgY2xpY2sgdG8gem9vbVwiIGludGVyYWN0aW9uLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXAuZG91YmxlQ2xpY2tab29tLmVuYWJsZSgpO1xuICAgICAqL1xuICAgIGVuYWJsZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNFbmFibGVkKCkpIHJldHVybjtcbiAgICAgICAgdGhpcy5fbWFwLm9uKCdkYmxjbGljaycsIHRoaXMuX29uRGJsQ2xpY2spO1xuICAgICAgICB0aGlzLl9lbmFibGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlcyB0aGUgXCJkb3VibGUgY2xpY2sgdG8gem9vbVwiIGludGVyYWN0aW9uLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXAuZG91YmxlQ2xpY2tab29tLmRpc2FibGUoKTtcbiAgICAgKi9cbiAgICBkaXNhYmxlKCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNFbmFibGVkKCkpIHJldHVybjtcbiAgICAgICAgdGhpcy5fbWFwLm9mZignZGJsY2xpY2snLCB0aGlzLl9vbkRibENsaWNrKTtcbiAgICAgICAgdGhpcy5fZW5hYmxlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIF9vbkRibENsaWNrKGUpIHtcbiAgICAgICAgdGhpcy5fbWFwLnpvb21UbyhcbiAgICAgICAgICAgIHRoaXMuX21hcC5nZXRab29tKCkgKyAoZS5vcmlnaW5hbEV2ZW50LnNoaWZ0S2V5ID8gLTEgOiAxKSxcbiAgICAgICAgICAgIHthcm91bmQ6IGUubG5nTGF0fSxcbiAgICAgICAgICAgIGVcbiAgICAgICAgKTtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gRG91YmxlQ2xpY2tab29tSGFuZGxlcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgRE9NID0gcmVxdWlyZSgnLi4vLi4vdXRpbC9kb20nKTtcbmNvbnN0IHV0aWwgPSByZXF1aXJlKCcuLi8uLi91dGlsL3V0aWwnKTtcbmNvbnN0IHdpbmRvdyA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvd2luZG93Jyk7XG5cbmNvbnN0IGluZXJ0aWFMaW5lYXJpdHkgPSAwLjMsXG4gICAgaW5lcnRpYUVhc2luZyA9IHV0aWwuYmV6aWVyKDAsIDAsIGluZXJ0aWFMaW5lYXJpdHksIDEpLFxuICAgIGluZXJ0aWFNYXhTcGVlZCA9IDE0MDAsIC8vIHB4L3NcbiAgICBpbmVydGlhRGVjZWxlcmF0aW9uID0gMjUwMDsgLy8gcHgvc14yXG5cbi8qKlxuICogVGhlIGBEcmFnUGFuSGFuZGxlcmAgYWxsb3dzIHRoZSB1c2VyIHRvIHBhbiB0aGUgbWFwIGJ5IGNsaWNraW5nIGFuZCBkcmFnZ2luZ1xuICogdGhlIGN1cnNvci5cbiAqXG4gKiBAcGFyYW0ge01hcH0gbWFwIFRoZSBNYXBib3ggR0wgSlMgbWFwIHRvIGFkZCB0aGUgaGFuZGxlciB0by5cbiAqL1xuY2xhc3MgRHJhZ1BhbkhhbmRsZXIge1xuICAgIGNvbnN0cnVjdG9yKG1hcCkge1xuICAgICAgICB0aGlzLl9tYXAgPSBtYXA7XG4gICAgICAgIHRoaXMuX2VsID0gbWFwLmdldENhbnZhc0NvbnRhaW5lcigpO1xuXG4gICAgICAgIHV0aWwuYmluZEFsbChbXG4gICAgICAgICAgICAnX29uRG93bicsXG4gICAgICAgICAgICAnX29uTW92ZScsXG4gICAgICAgICAgICAnX29uVXAnLFxuICAgICAgICAgICAgJ19vblRvdWNoRW5kJyxcbiAgICAgICAgICAgICdfb25Nb3VzZVVwJ1xuICAgICAgICBdLCB0aGlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIFwiZHJhZyB0byBwYW5cIiBpbnRlcmFjdGlvbiBpcyBlbmFibGVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgXCJkcmFnIHRvIHBhblwiIGludGVyYWN0aW9uIGlzIGVuYWJsZWQuXG4gICAgICovXG4gICAgaXNFbmFibGVkKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9lbmFibGVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgXCJkcmFnIHRvIHBhblwiIGludGVyYWN0aW9uIGlzIGFjdGl2ZSwgaS5lLiBjdXJyZW50bHkgYmVpbmcgdXNlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIFwiZHJhZyB0byBwYW5cIiBpbnRlcmFjdGlvbiBpcyBhY3RpdmUuXG4gICAgICovXG4gICAgaXNBY3RpdmUoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2FjdGl2ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGVzIHRoZSBcImRyYWcgdG8gcGFuXCIgaW50ZXJhY3Rpb24uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcC5kcmFnUGFuLmVuYWJsZSgpO1xuICAgICAqL1xuICAgIGVuYWJsZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNFbmFibGVkKCkpIHJldHVybjtcbiAgICAgICAgdGhpcy5fZWwuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5fb25Eb3duKTtcbiAgICAgICAgdGhpcy5fZWwuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMuX29uRG93bik7XG4gICAgICAgIHRoaXMuX2VuYWJsZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERpc2FibGVzIHRoZSBcImRyYWcgdG8gcGFuXCIgaW50ZXJhY3Rpb24uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcC5kcmFnUGFuLmRpc2FibGUoKTtcbiAgICAgKi9cbiAgICBkaXNhYmxlKCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNFbmFibGVkKCkpIHJldHVybjtcbiAgICAgICAgdGhpcy5fZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5fb25Eb3duKTtcbiAgICAgICAgdGhpcy5fZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMuX29uRG93bik7XG4gICAgICAgIHRoaXMuX2VuYWJsZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBfb25Eb3duKGUpIHtcbiAgICAgICAgaWYgKHRoaXMuX2lnbm9yZUV2ZW50KGUpKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLmlzQWN0aXZlKCkpIHJldHVybjtcblxuICAgICAgICBpZiAoZS50b3VjaGVzKSB7XG4gICAgICAgICAgICB3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgdGhpcy5fb25Nb3ZlKTtcbiAgICAgICAgICAgIHdpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHRoaXMuX29uVG91Y2hFbmQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgd2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuX29uTW92ZSk7XG4gICAgICAgICAgICB3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuX29uTW91c2VVcCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fc3RhcnRQb3MgPSB0aGlzLl9wb3MgPSBET00ubW91c2VQb3ModGhpcy5fZWwsIGUpO1xuICAgICAgICB0aGlzLl9pbmVydGlhID0gW1tEYXRlLm5vdygpLCB0aGlzLl9wb3NdXTtcbiAgICB9XG5cbiAgICBfb25Nb3ZlKGUpIHtcbiAgICAgICAgaWYgKHRoaXMuX2lnbm9yZUV2ZW50KGUpKSByZXR1cm47XG5cbiAgICAgICAgaWYgKCF0aGlzLmlzQWN0aXZlKCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2FjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl9maXJlRXZlbnQoJ2RyYWdzdGFydCcsIGUpO1xuICAgICAgICAgICAgdGhpcy5fZmlyZUV2ZW50KCdtb3Zlc3RhcnQnLCBlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBvcyA9IERPTS5tb3VzZVBvcyh0aGlzLl9lbCwgZSksXG4gICAgICAgICAgICBtYXAgPSB0aGlzLl9tYXA7XG5cbiAgICAgICAgbWFwLnN0b3AoKTtcbiAgICAgICAgdGhpcy5fZHJhaW5JbmVydGlhQnVmZmVyKCk7XG4gICAgICAgIHRoaXMuX2luZXJ0aWEucHVzaChbRGF0ZS5ub3coKSwgcG9zXSk7XG5cbiAgICAgICAgbWFwLnRyYW5zZm9ybS5zZXRMb2NhdGlvbkF0UG9pbnQobWFwLnRyYW5zZm9ybS5wb2ludExvY2F0aW9uKHRoaXMuX3BvcyksIHBvcyk7XG5cbiAgICAgICAgdGhpcy5fZmlyZUV2ZW50KCdkcmFnJywgZSk7XG4gICAgICAgIHRoaXMuX2ZpcmVFdmVudCgnbW92ZScsIGUpO1xuXG4gICAgICAgIHRoaXMuX3BvcyA9IHBvcztcblxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgX29uVXAoZSkge1xuICAgICAgICBpZiAoIXRoaXMuaXNBY3RpdmUoKSkgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuX2FjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9maXJlRXZlbnQoJ2RyYWdlbmQnLCBlKTtcbiAgICAgICAgdGhpcy5fZHJhaW5JbmVydGlhQnVmZmVyKCk7XG5cbiAgICAgICAgY29uc3QgZmluaXNoID0gKCkgPT4gdGhpcy5fZmlyZUV2ZW50KCdtb3ZlZW5kJywgZSk7XG5cbiAgICAgICAgY29uc3QgaW5lcnRpYSA9IHRoaXMuX2luZXJ0aWE7XG4gICAgICAgIGlmIChpbmVydGlhLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgIGZpbmlzaCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGFzdCA9IGluZXJ0aWFbaW5lcnRpYS5sZW5ndGggLSAxXSxcbiAgICAgICAgICAgIGZpcnN0ID0gaW5lcnRpYVswXSxcbiAgICAgICAgICAgIGZsaW5nT2Zmc2V0ID0gbGFzdFsxXS5zdWIoZmlyc3RbMV0pLFxuICAgICAgICAgICAgZmxpbmdEdXJhdGlvbiA9IChsYXN0WzBdIC0gZmlyc3RbMF0pIC8gMTAwMDtcblxuICAgICAgICBpZiAoZmxpbmdEdXJhdGlvbiA9PT0gMCB8fCBsYXN0WzFdLmVxdWFscyhmaXJzdFsxXSkpIHtcbiAgICAgICAgICAgIGZpbmlzaCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2FsY3VsYXRlIHB4L3MgdmVsb2NpdHkgJiBhZGp1c3QgZm9yIGluY3JlYXNlZCBpbml0aWFsIGFuaW1hdGlvbiBzcGVlZCB3aGVuIGVhc2luZyBvdXRcbiAgICAgICAgY29uc3QgdmVsb2NpdHkgPSBmbGluZ09mZnNldC5tdWx0KGluZXJ0aWFMaW5lYXJpdHkgLyBmbGluZ0R1cmF0aW9uKTtcbiAgICAgICAgbGV0IHNwZWVkID0gdmVsb2NpdHkubWFnKCk7IC8vIHB4L3NcblxuICAgICAgICBpZiAoc3BlZWQgPiBpbmVydGlhTWF4U3BlZWQpIHtcbiAgICAgICAgICAgIHNwZWVkID0gaW5lcnRpYU1heFNwZWVkO1xuICAgICAgICAgICAgdmVsb2NpdHkuX3VuaXQoKS5fbXVsdChzcGVlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkdXJhdGlvbiA9IHNwZWVkIC8gKGluZXJ0aWFEZWNlbGVyYXRpb24gKiBpbmVydGlhTGluZWFyaXR5KSxcbiAgICAgICAgICAgIG9mZnNldCA9IHZlbG9jaXR5Lm11bHQoLWR1cmF0aW9uIC8gMik7XG5cbiAgICAgICAgdGhpcy5fbWFwLnBhbkJ5KG9mZnNldCwge1xuICAgICAgICAgICAgZHVyYXRpb246IGR1cmF0aW9uICogMTAwMCxcbiAgICAgICAgICAgIGVhc2luZzogaW5lcnRpYUVhc2luZyxcbiAgICAgICAgICAgIG5vTW92ZVN0YXJ0OiB0cnVlXG4gICAgICAgIH0sIHsgb3JpZ2luYWxFdmVudDogZSB9KTtcbiAgICB9XG5cbiAgICBfb25Nb3VzZVVwKGUpIHtcbiAgICAgICAgaWYgKHRoaXMuX2lnbm9yZUV2ZW50KGUpKSByZXR1cm47XG4gICAgICAgIHRoaXMuX29uVXAoZSk7XG4gICAgICAgIHdpbmRvdy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLl9vbk1vdmUpO1xuICAgICAgICB3aW5kb3cuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuX29uTW91c2VVcCk7XG4gICAgfVxuXG4gICAgX29uVG91Y2hFbmQoZSkge1xuICAgICAgICBpZiAodGhpcy5faWdub3JlRXZlbnQoZSkpIHJldHVybjtcbiAgICAgICAgdGhpcy5fb25VcChlKTtcbiAgICAgICAgd2luZG93LmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHRoaXMuX29uTW92ZSk7XG4gICAgICAgIHdpbmRvdy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHRoaXMuX29uVG91Y2hFbmQpO1xuICAgIH1cblxuICAgIF9maXJlRXZlbnQodHlwZSwgZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWFwLmZpcmUodHlwZSwgeyBvcmlnaW5hbEV2ZW50OiBlIH0pO1xuICAgIH1cblxuICAgIF9pZ25vcmVFdmVudChlKSB7XG4gICAgICAgIGNvbnN0IG1hcCA9IHRoaXMuX21hcDtcblxuICAgICAgICBpZiAobWFwLmJveFpvb20gJiYgbWFwLmJveFpvb20uaXNBY3RpdmUoKSkgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChtYXAuZHJhZ1JvdGF0ZSAmJiBtYXAuZHJhZ1JvdGF0ZS5pc0FjdGl2ZSgpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKGUudG91Y2hlcykge1xuICAgICAgICAgICAgcmV0dXJuIChlLnRvdWNoZXMubGVuZ3RoID4gMSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoZS5jdHJsS2V5KSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGNvbnN0IGJ1dHRvbnMgPSAxLCAgLy8gbGVmdCBidXR0b25cbiAgICAgICAgICAgICAgICBidXR0b24gPSAwOyAgIC8vIGxlZnQgYnV0dG9uXG4gICAgICAgICAgICByZXR1cm4gKGUudHlwZSA9PT0gJ21vdXNlbW92ZScgPyBlLmJ1dHRvbnMgJiBidXR0b25zID09PSAwIDogZS5idXR0b24gIT09IGJ1dHRvbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfZHJhaW5JbmVydGlhQnVmZmVyKCkge1xuICAgICAgICBjb25zdCBpbmVydGlhID0gdGhpcy5faW5lcnRpYSxcbiAgICAgICAgICAgIG5vdyA9IERhdGUubm93KCksXG4gICAgICAgICAgICBjdXRvZmYgPSAxNjA7ICAgLy8gbXNlY1xuXG4gICAgICAgIHdoaWxlIChpbmVydGlhLmxlbmd0aCA+IDAgJiYgbm93IC0gaW5lcnRpYVswXVswXSA+IGN1dG9mZikgaW5lcnRpYS5zaGlmdCgpO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBEcmFnUGFuSGFuZGxlcjtcblxuLyoqXG4gKiBGaXJlZCB3aGVuIGEgXCJkcmFnIHRvIHBhblwiIGludGVyYWN0aW9uIHN0YXJ0cy4gU2VlIFtgRHJhZ1BhbkhhbmRsZXJgXSgjRHJhZ1BhbkhhbmRsZXIpLlxuICpcbiAqIEBldmVudCBkcmFnc3RhcnRcbiAqIEBtZW1iZXJvZiBNYXBcbiAqIEBpbnN0YW5jZVxuICogQHByb3BlcnR5IHt7b3JpZ2luYWxFdmVudDogRHJhZ0V2ZW50fX0gZGF0YVxuICovXG5cbi8qKlxuICogRmlyZWQgcmVwZWF0ZWRseSBkdXJpbmcgYSBcImRyYWcgdG8gcGFuXCIgaW50ZXJhY3Rpb24uIFNlZSBbYERyYWdQYW5IYW5kbGVyYF0oI0RyYWdQYW5IYW5kbGVyKS5cbiAqXG4gKiBAZXZlbnQgZHJhZ1xuICogQG1lbWJlcm9mIE1hcFxuICogQGluc3RhbmNlXG4gKiBAcHJvcGVydHkge01hcE1vdXNlRXZlbnQgfCBNYXBUb3VjaEV2ZW50fSBkYXRhXG4gKi9cblxuLyoqXG4gKiBGaXJlZCB3aGVuIGEgXCJkcmFnIHRvIHBhblwiIGludGVyYWN0aW9uIGVuZHMuIFNlZSBbYERyYWdQYW5IYW5kbGVyYF0oI0RyYWdQYW5IYW5kbGVyKS5cbiAqXG4gKiBAZXZlbnQgZHJhZ2VuZFxuICogQG1lbWJlcm9mIE1hcFxuICogQGluc3RhbmNlXG4gKiBAcHJvcGVydHkge3tvcmlnaW5hbEV2ZW50OiBEcmFnRXZlbnR9fSBkYXRhXG4gKi9cbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgRE9NID0gcmVxdWlyZSgnLi4vLi4vdXRpbC9kb20nKTtcbmNvbnN0IHV0aWwgPSByZXF1aXJlKCcuLi8uLi91dGlsL3V0aWwnKTtcbmNvbnN0IHdpbmRvdyA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvd2luZG93Jyk7XG5cbmNvbnN0IGluZXJ0aWFMaW5lYXJpdHkgPSAwLjI1LFxuICAgIGluZXJ0aWFFYXNpbmcgPSB1dGlsLmJlemllcigwLCAwLCBpbmVydGlhTGluZWFyaXR5LCAxKSxcbiAgICBpbmVydGlhTWF4U3BlZWQgPSAxODAsIC8vIGRlZy9zXG4gICAgaW5lcnRpYURlY2VsZXJhdGlvbiA9IDcyMDsgLy8gZGVnL3NeMlxuXG4vKipcbiAqIFRoZSBgRHJhZ1JvdGF0ZUhhbmRsZXJgIGFsbG93cyB0aGUgdXNlciB0byByb3RhdGUgdGhlIG1hcCBieSBjbGlja2luZyBhbmRcbiAqIGRyYWdnaW5nIHRoZSBjdXJzb3Igd2hpbGUgaG9sZGluZyB0aGUgcmlnaHQgbW91c2UgYnV0dG9uIG9yIGBjdHJsYCBrZXkuXG4gKlxuICogQHBhcmFtIHtNYXB9IG1hcCBUaGUgTWFwYm94IEdMIEpTIG1hcCB0byBhZGQgdGhlIGhhbmRsZXIgdG8uXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuYmVhcmluZ1NuYXBdIFRoZSB0aHJlc2hvbGQsIG1lYXN1cmVkIGluIGRlZ3JlZXMsIHRoYXQgZGV0ZXJtaW5lcyB3aGVuIHRoZSBtYXAnc1xuICogICBiZWFyaW5nIChyb3RhdGlvbikgd2lsbCBzbmFwIHRvIG5vcnRoLlxuICogQHBhcmFtIHtib29sfSBbb3B0aW9ucy5waXRjaFdpdGhSb3RhdGU9dHJ1ZV0gQ29udHJvbCB0aGUgbWFwIHBpdGNoIGluIGFkZGl0aW9uIHRvIHRoZSBiZWFyaW5nXG4gKi9cbmNsYXNzIERyYWdSb3RhdGVIYW5kbGVyIHtcbiAgICBjb25zdHJ1Y3RvcihtYXAsIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5fbWFwID0gbWFwO1xuICAgICAgICB0aGlzLl9lbCA9IG1hcC5nZXRDYW52YXNDb250YWluZXIoKTtcbiAgICAgICAgdGhpcy5fYmVhcmluZ1NuYXAgPSBvcHRpb25zLmJlYXJpbmdTbmFwO1xuICAgICAgICB0aGlzLl9waXRjaFdpdGhSb3RhdGUgPSBvcHRpb25zLnBpdGNoV2l0aFJvdGF0ZSAhPT0gZmFsc2U7XG5cbiAgICAgICAgdXRpbC5iaW5kQWxsKFtcbiAgICAgICAgICAgICdfb25Eb3duJyxcbiAgICAgICAgICAgICdfb25Nb3ZlJyxcbiAgICAgICAgICAgICdfb25VcCdcbiAgICAgICAgXSwgdGhpcyk7XG5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIFwiZHJhZyB0byByb3RhdGVcIiBpbnRlcmFjdGlvbiBpcyBlbmFibGVkLlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgXCJkcmFnIHRvIHJvdGF0ZVwiIGludGVyYWN0aW9uIGlzIGVuYWJsZWQuXG4gICAgICovXG4gICAgaXNFbmFibGVkKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9lbmFibGVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgXCJkcmFnIHRvIHJvdGF0ZVwiIGludGVyYWN0aW9uIGlzIGFjdGl2ZSwgaS5lLiBjdXJyZW50bHkgYmVpbmcgdXNlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIFwiZHJhZyB0byByb3RhdGVcIiBpbnRlcmFjdGlvbiBpcyBhY3RpdmUuXG4gICAgICovXG4gICAgaXNBY3RpdmUoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2FjdGl2ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGVzIHRoZSBcImRyYWcgdG8gcm90YXRlXCIgaW50ZXJhY3Rpb24uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcC5kcmFnUm90YXRlLmVuYWJsZSgpO1xuICAgICAqL1xuICAgIGVuYWJsZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNFbmFibGVkKCkpIHJldHVybjtcbiAgICAgICAgdGhpcy5fZWwuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5fb25Eb3duKTtcbiAgICAgICAgdGhpcy5fZW5hYmxlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzYWJsZXMgdGhlIFwiZHJhZyB0byByb3RhdGVcIiBpbnRlcmFjdGlvbi5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogbWFwLmRyYWdSb3RhdGUuZGlzYWJsZSgpO1xuICAgICAqL1xuICAgIGRpc2FibGUoKSB7XG4gICAgICAgIGlmICghdGhpcy5pc0VuYWJsZWQoKSkgcmV0dXJuO1xuICAgICAgICB0aGlzLl9lbC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLl9vbkRvd24pO1xuICAgICAgICB0aGlzLl9lbmFibGVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgX29uRG93bihlKSB7XG4gICAgICAgIGlmICh0aGlzLl9pZ25vcmVFdmVudChlKSkgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy5pc0FjdGl2ZSgpKSByZXR1cm47XG5cbiAgICAgICAgd2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuX29uTW92ZSk7XG4gICAgICAgIHdpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5fb25VcCk7XG5cbiAgICAgICAgdGhpcy5fYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2luZXJ0aWEgPSBbW0RhdGUubm93KCksIHRoaXMuX21hcC5nZXRCZWFyaW5nKCldXTtcbiAgICAgICAgdGhpcy5fc3RhcnRQb3MgPSB0aGlzLl9wb3MgPSBET00ubW91c2VQb3ModGhpcy5fZWwsIGUpO1xuICAgICAgICB0aGlzLl9jZW50ZXIgPSB0aGlzLl9tYXAudHJhbnNmb3JtLmNlbnRlclBvaW50OyAgLy8gQ2VudGVyIG9mIHJvdGF0aW9uXG5cbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIF9vbk1vdmUoZSkge1xuICAgICAgICBpZiAodGhpcy5faWdub3JlRXZlbnQoZSkpIHJldHVybjtcblxuICAgICAgICBpZiAoIXRoaXMuaXNBY3RpdmUoKSkge1xuICAgICAgICAgICAgdGhpcy5fYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuX2ZpcmVFdmVudCgncm90YXRlc3RhcnQnLCBlKTtcbiAgICAgICAgICAgIHRoaXMuX2ZpcmVFdmVudCgnbW92ZXN0YXJ0JywgZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtYXAgPSB0aGlzLl9tYXA7XG4gICAgICAgIG1hcC5zdG9wKCk7XG5cbiAgICAgICAgY29uc3QgcDEgPSB0aGlzLl9wb3MsXG4gICAgICAgICAgICBwMiA9IERPTS5tb3VzZVBvcyh0aGlzLl9lbCwgZSksXG4gICAgICAgICAgICBiZWFyaW5nRGlmZiA9IChwMS54IC0gcDIueCkgKiAwLjgsXG4gICAgICAgICAgICBwaXRjaERpZmYgPSAocDEueSAtIHAyLnkpICogLTAuNSxcbiAgICAgICAgICAgIGJlYXJpbmcgPSBtYXAuZ2V0QmVhcmluZygpIC0gYmVhcmluZ0RpZmYsXG4gICAgICAgICAgICBwaXRjaCA9IG1hcC5nZXRQaXRjaCgpIC0gcGl0Y2hEaWZmLFxuICAgICAgICAgICAgaW5lcnRpYSA9IHRoaXMuX2luZXJ0aWEsXG4gICAgICAgICAgICBsYXN0ID0gaW5lcnRpYVtpbmVydGlhLmxlbmd0aCAtIDFdO1xuXG4gICAgICAgIHRoaXMuX2RyYWluSW5lcnRpYUJ1ZmZlcigpO1xuICAgICAgICBpbmVydGlhLnB1c2goW0RhdGUubm93KCksIG1hcC5fbm9ybWFsaXplQmVhcmluZyhiZWFyaW5nLCBsYXN0WzFdKV0pO1xuXG4gICAgICAgIG1hcC50cmFuc2Zvcm0uYmVhcmluZyA9IGJlYXJpbmc7XG4gICAgICAgIGlmICh0aGlzLl9waXRjaFdpdGhSb3RhdGUpIG1hcC50cmFuc2Zvcm0ucGl0Y2ggPSBwaXRjaDtcblxuICAgICAgICB0aGlzLl9maXJlRXZlbnQoJ3JvdGF0ZScsIGUpO1xuICAgICAgICB0aGlzLl9maXJlRXZlbnQoJ21vdmUnLCBlKTtcblxuICAgICAgICB0aGlzLl9wb3MgPSBwMjtcbiAgICB9XG5cbiAgICBfb25VcChlKSB7XG4gICAgICAgIGlmICh0aGlzLl9pZ25vcmVFdmVudChlKSkgcmV0dXJuO1xuICAgICAgICB3aW5kb3cuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5fb25Nb3ZlKTtcbiAgICAgICAgd2luZG93LmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLl9vblVwKTtcblxuICAgICAgICBpZiAoIXRoaXMuaXNBY3RpdmUoKSkgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuX2FjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9maXJlRXZlbnQoJ3JvdGF0ZWVuZCcsIGUpO1xuICAgICAgICB0aGlzLl9kcmFpbkluZXJ0aWFCdWZmZXIoKTtcblxuICAgICAgICBjb25zdCBtYXAgPSB0aGlzLl9tYXAsXG4gICAgICAgICAgICBtYXBCZWFyaW5nID0gbWFwLmdldEJlYXJpbmcoKSxcbiAgICAgICAgICAgIGluZXJ0aWEgPSB0aGlzLl9pbmVydGlhO1xuXG4gICAgICAgIGNvbnN0IGZpbmlzaCA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChNYXRoLmFicyhtYXBCZWFyaW5nKSA8IHRoaXMuX2JlYXJpbmdTbmFwKSB7XG4gICAgICAgICAgICAgICAgbWFwLnJlc2V0Tm9ydGgoe25vTW92ZVN0YXJ0OiB0cnVlfSwgeyBvcmlnaW5hbEV2ZW50OiBlIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9maXJlRXZlbnQoJ21vdmVlbmQnLCBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoaW5lcnRpYS5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgICBmaW5pc2goKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpcnN0ID0gaW5lcnRpYVswXSxcbiAgICAgICAgICAgIGxhc3QgPSBpbmVydGlhW2luZXJ0aWEubGVuZ3RoIC0gMV0sXG4gICAgICAgICAgICBwcmV2aW91cyA9IGluZXJ0aWFbaW5lcnRpYS5sZW5ndGggLSAyXTtcbiAgICAgICAgbGV0IGJlYXJpbmcgPSBtYXAuX25vcm1hbGl6ZUJlYXJpbmcobWFwQmVhcmluZywgcHJldmlvdXNbMV0pO1xuICAgICAgICBjb25zdCBmbGluZ0RpZmYgPSBsYXN0WzFdIC0gZmlyc3RbMV0sXG4gICAgICAgICAgICBzaWduID0gZmxpbmdEaWZmIDwgMCA/IC0xIDogMSxcbiAgICAgICAgICAgIGZsaW5nRHVyYXRpb24gPSAobGFzdFswXSAtIGZpcnN0WzBdKSAvIDEwMDA7XG5cbiAgICAgICAgaWYgKGZsaW5nRGlmZiA9PT0gMCB8fCBmbGluZ0R1cmF0aW9uID09PSAwKSB7XG4gICAgICAgICAgICBmaW5pc2goKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzcGVlZCA9IE1hdGguYWJzKGZsaW5nRGlmZiAqIChpbmVydGlhTGluZWFyaXR5IC8gZmxpbmdEdXJhdGlvbikpOyAgLy8gZGVnL3NcbiAgICAgICAgaWYgKHNwZWVkID4gaW5lcnRpYU1heFNwZWVkKSB7XG4gICAgICAgICAgICBzcGVlZCA9IGluZXJ0aWFNYXhTcGVlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGR1cmF0aW9uID0gc3BlZWQgLyAoaW5lcnRpYURlY2VsZXJhdGlvbiAqIGluZXJ0aWFMaW5lYXJpdHkpLFxuICAgICAgICAgICAgb2Zmc2V0ID0gc2lnbiAqIHNwZWVkICogKGR1cmF0aW9uIC8gMik7XG5cbiAgICAgICAgYmVhcmluZyArPSBvZmZzZXQ7XG5cbiAgICAgICAgaWYgKE1hdGguYWJzKG1hcC5fbm9ybWFsaXplQmVhcmluZyhiZWFyaW5nLCAwKSkgPCB0aGlzLl9iZWFyaW5nU25hcCkge1xuICAgICAgICAgICAgYmVhcmluZyA9IG1hcC5fbm9ybWFsaXplQmVhcmluZygwLCBiZWFyaW5nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG1hcC5yb3RhdGVUbyhiZWFyaW5nLCB7XG4gICAgICAgICAgICBkdXJhdGlvbjogZHVyYXRpb24gKiAxMDAwLFxuICAgICAgICAgICAgZWFzaW5nOiBpbmVydGlhRWFzaW5nLFxuICAgICAgICAgICAgbm9Nb3ZlU3RhcnQ6IHRydWVcbiAgICAgICAgfSwgeyBvcmlnaW5hbEV2ZW50OiBlIH0pO1xuICAgIH1cblxuICAgIF9maXJlRXZlbnQodHlwZSwgZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWFwLmZpcmUodHlwZSwgeyBvcmlnaW5hbEV2ZW50OiBlIH0pO1xuICAgIH1cblxuICAgIF9pZ25vcmVFdmVudChlKSB7XG4gICAgICAgIGNvbnN0IG1hcCA9IHRoaXMuX21hcDtcblxuICAgICAgICBpZiAobWFwLmJveFpvb20gJiYgbWFwLmJveFpvb20uaXNBY3RpdmUoKSkgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChtYXAuZHJhZ1BhbiAmJiBtYXAuZHJhZ1Bhbi5pc0FjdGl2ZSgpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKGUudG91Y2hlcykge1xuICAgICAgICAgICAgcmV0dXJuIChlLnRvdWNoZXMubGVuZ3RoID4gMSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBidXR0b25zID0gKGUuY3RybEtleSA/IDEgOiAyKSwgIC8vID8gY3RybCtsZWZ0IGJ1dHRvbiA6IHJpZ2h0IGJ1dHRvblxuICAgICAgICAgICAgICAgIGJ1dHRvbiA9IChlLmN0cmxLZXkgPyAwIDogMik7ICAgLy8gPyBjdHJsK2xlZnQgYnV0dG9uIDogcmlnaHQgYnV0dG9uXG4gICAgICAgICAgICBsZXQgZXZlbnRCdXR0b24gPSBlLmJ1dHRvbjtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgSW5zdGFsbFRyaWdnZXIgIT09ICd1bmRlZmluZWQnICYmIGUuYnV0dG9uID09PSAyICYmIGUuY3RybEtleSAmJlxuICAgICAgICAgICAgICAgIHdpbmRvdy5uYXZpZ2F0b3IucGxhdGZvcm0udG9VcHBlckNhc2UoKS5pbmRleE9mKCdNQUMnKSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gRml4IGZvciBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1qcy9pc3N1ZXMvMzEzMTpcbiAgICAgICAgICAgICAgICAvLyBGaXJlZm94IChkZXRlY3RlZCBieSBJbnN0YWxsVHJpZ2dlcikgb24gTWFjIGRldGVybWluZXMgZS5idXR0b24gPSAyIHdoZW5cbiAgICAgICAgICAgICAgICAvLyB1c2luZyBDb250cm9sICsgbGVmdCBjbGlja1xuICAgICAgICAgICAgICAgIGV2ZW50QnV0dG9uID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAoZS50eXBlID09PSAnbW91c2Vtb3ZlJyA/IGUuYnV0dG9ucyAmIGJ1dHRvbnMgPT09IDAgOiBldmVudEJ1dHRvbiAhPT0gYnV0dG9uKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9kcmFpbkluZXJ0aWFCdWZmZXIoKSB7XG4gICAgICAgIGNvbnN0IGluZXJ0aWEgPSB0aGlzLl9pbmVydGlhLFxuICAgICAgICAgICAgbm93ID0gRGF0ZS5ub3coKSxcbiAgICAgICAgICAgIGN1dG9mZiA9IDE2MDsgICAvL21zZWNcblxuICAgICAgICB3aGlsZSAoaW5lcnRpYS5sZW5ndGggPiAwICYmIG5vdyAtIGluZXJ0aWFbMF1bMF0gPiBjdXRvZmYpXG4gICAgICAgICAgICBpbmVydGlhLnNoaWZ0KCk7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IERyYWdSb3RhdGVIYW5kbGVyO1xuXG4vKipcbiAqIEZpcmVkIHdoZW4gYSBcImRyYWcgdG8gcm90YXRlXCIgaW50ZXJhY3Rpb24gc3RhcnRzLiBTZWUgW2BEcmFnUm90YXRlSGFuZGxlcmBdKCNEcmFnUm90YXRlSGFuZGxlcikuXG4gKlxuICogQGV2ZW50IHJvdGF0ZXN0YXJ0XG4gKiBAbWVtYmVyb2YgTWFwXG4gKiBAaW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7TWFwTW91c2VFdmVudCB8IE1hcFRvdWNoRXZlbnR9IGRhdGFcbiAqL1xuXG4vKipcbiAqIEZpcmVkIHJlcGVhdGVkbHkgZHVyaW5nIGEgXCJkcmFnIHRvIHJvdGF0ZVwiIGludGVyYWN0aW9uLiBTZWUgW2BEcmFnUm90YXRlSGFuZGxlcmBdKCNEcmFnUm90YXRlSGFuZGxlcikuXG4gKlxuICogQGV2ZW50IHJvdGF0ZVxuICogQG1lbWJlcm9mIE1hcFxuICogQGluc3RhbmNlXG4gKiBAcHJvcGVydHkge01hcE1vdXNlRXZlbnQgfCBNYXBUb3VjaEV2ZW50fSBkYXRhXG4gKi9cblxuLyoqXG4gKiBGaXJlZCB3aGVuIGEgXCJkcmFnIHRvIHJvdGF0ZVwiIGludGVyYWN0aW9uIGVuZHMuIFNlZSBbYERyYWdSb3RhdGVIYW5kbGVyYF0oI0RyYWdSb3RhdGVIYW5kbGVyKS5cbiAqXG4gKiBAZXZlbnQgcm90YXRlZW5kXG4gKiBAbWVtYmVyb2YgTWFwXG4gKiBAaW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7TWFwTW91c2VFdmVudCB8IE1hcFRvdWNoRXZlbnR9IGRhdGFcbiAqL1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBwYW5TdGVwID0gMTAwLFxuICAgIGJlYXJpbmdTdGVwID0gMTUsXG4gICAgcGl0Y2hTdGVwID0gMTA7XG5cbi8qKlxuICogVGhlIGBLZXlib2FyZEhhbmRsZXJgIGFsbG93cyB0aGUgdXNlciB0byB6b29tLCByb3RhdGUsIGFuZCBwYW4gdGhlIG1hcCB1c2luZ1xuICogdGhlIGZvbGxvd2luZyBrZXlib2FyZCBzaG9ydGN1dHM6XG4gKlxuICogLSBgPWAgLyBgK2A6IEluY3JlYXNlIHRoZSB6b29tIGxldmVsIGJ5IDEuXG4gKiAtIGBTaGlmdC09YCAvIGBTaGlmdC0rYDogSW5jcmVhc2UgdGhlIHpvb20gbGV2ZWwgYnkgMi5cbiAqIC0gYC1gOiBEZWNyZWFzZSB0aGUgem9vbSBsZXZlbCBieSAxLlxuICogLSBgU2hpZnQtLWA6IERlY3JlYXNlIHRoZSB6b29tIGxldmVsIGJ5IDIuXG4gKiAtIEFycm93IGtleXM6IFBhbiBieSAxMDAgcGl4ZWxzLlxuICogLSBgU2hpZnQr4oeiYDogSW5jcmVhc2UgdGhlIHJvdGF0aW9uIGJ5IDE1IGRlZ3JlZXMuXG4gKiAtIGBTaGlmdCvih6BgOiBEZWNyZWFzZSB0aGUgcm90YXRpb24gYnkgMTUgZGVncmVlcy5cbiAqIC0gYFNoaWZ0K+KHoWA6IEluY3JlYXNlIHRoZSBwaXRjaCBieSAxMCBkZWdyZWVzLlxuICogLSBgU2hpZnQr4oejYDogRGVjcmVhc2UgdGhlIHBpdGNoIGJ5IDEwIGRlZ3JlZXMuXG4gKlxuICogQHBhcmFtIHtNYXB9IG1hcCBUaGUgTWFwYm94IEdMIEpTIG1hcCB0byBhZGQgdGhlIGhhbmRsZXIgdG8uXG4gKi9cbmNsYXNzIEtleWJvYXJkSGFuZGxlciB7XG4gICAgY29uc3RydWN0b3IobWFwKSB7XG4gICAgICAgIHRoaXMuX21hcCA9IG1hcDtcbiAgICAgICAgdGhpcy5fZWwgPSBtYXAuZ2V0Q2FudmFzQ29udGFpbmVyKCk7XG5cbiAgICAgICAgdGhpcy5fb25LZXlEb3duID0gdGhpcy5fb25LZXlEb3duLmJpbmQodGhpcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGtleWJvYXJkIGludGVyYWN0aW9uIGlzIGVuYWJsZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIGtleWJvYXJkIGludGVyYWN0aW9uIGlzIGVuYWJsZWQuXG4gICAgICovXG4gICAgaXNFbmFibGVkKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9lbmFibGVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVuYWJsZXMga2V5Ym9hcmQgaW50ZXJhY3Rpb24uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcC5rZXlib2FyZC5lbmFibGUoKTtcbiAgICAgKi9cbiAgICBlbmFibGUoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRW5hYmxlZCgpKSByZXR1cm47XG4gICAgICAgIHRoaXMuX2VsLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLl9vbktleURvd24sIGZhbHNlKTtcbiAgICAgICAgdGhpcy5fZW5hYmxlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzYWJsZXMga2V5Ym9hcmQgaW50ZXJhY3Rpb24uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcC5rZXlib2FyZC5kaXNhYmxlKCk7XG4gICAgICovXG4gICAgZGlzYWJsZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzRW5hYmxlZCgpKSByZXR1cm47XG4gICAgICAgIHRoaXMuX2VsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLl9vbktleURvd24pO1xuICAgICAgICB0aGlzLl9lbmFibGVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgX29uS2V5RG93bihlKSB7XG4gICAgICAgIGlmIChlLmFsdEtleSB8fCBlLmN0cmxLZXkgfHwgZS5tZXRhS2V5KSByZXR1cm47XG5cbiAgICAgICAgbGV0IHpvb21EaXIgPSAwO1xuICAgICAgICBsZXQgYmVhcmluZ0RpciA9IDA7XG4gICAgICAgIGxldCBwaXRjaERpciA9IDA7XG4gICAgICAgIGxldCB4RGlyID0gMDtcbiAgICAgICAgbGV0IHlEaXIgPSAwO1xuXG4gICAgICAgIHN3aXRjaCAoZS5rZXlDb2RlKSB7XG4gICAgICAgIGNhc2UgNjE6XG4gICAgICAgIGNhc2UgMTA3OlxuICAgICAgICBjYXNlIDE3MTpcbiAgICAgICAgY2FzZSAxODc6XG4gICAgICAgICAgICB6b29tRGlyID0gMTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgMTg5OlxuICAgICAgICBjYXNlIDEwOTpcbiAgICAgICAgY2FzZSAxNzM6XG4gICAgICAgICAgICB6b29tRGlyID0gLTE7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDM3OlxuICAgICAgICAgICAgaWYgKGUuc2hpZnRLZXkpIHtcbiAgICAgICAgICAgICAgICBiZWFyaW5nRGlyID0gLTE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB4RGlyID0gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDM5OlxuICAgICAgICAgICAgaWYgKGUuc2hpZnRLZXkpIHtcbiAgICAgICAgICAgICAgICBiZWFyaW5nRGlyID0gMTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHhEaXIgPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAzODpcbiAgICAgICAgICAgIGlmIChlLnNoaWZ0S2V5KSB7XG4gICAgICAgICAgICAgICAgcGl0Y2hEaXIgPSAxO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgeURpciA9IC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSA0MDpcbiAgICAgICAgICAgIGlmIChlLnNoaWZ0S2V5KSB7XG4gICAgICAgICAgICAgICAgcGl0Y2hEaXIgPSAtMTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgeURpciA9IDE7XG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtYXAgPSB0aGlzLl9tYXA7XG4gICAgICAgIGNvbnN0IHpvb20gPSBtYXAuZ2V0Wm9vbSgpO1xuXG4gICAgICAgIGNvbnN0IGVhc2VPcHRpb25zID0ge1xuICAgICAgICAgICAgZHVyYXRpb246IDMwMCxcbiAgICAgICAgICAgIGRlbGF5RW5kRXZlbnRzOiA1MDAsXG4gICAgICAgICAgICBlYXNpbmc6IGVhc2VPdXQsXG5cbiAgICAgICAgICAgIHpvb206IHpvb21EaXIgPyBNYXRoLnJvdW5kKHpvb20pICsgem9vbURpciAqIChlLnNoaWZ0S2V5ID8gMiA6IDEpIDogem9vbSxcbiAgICAgICAgICAgIGJlYXJpbmc6IG1hcC5nZXRCZWFyaW5nKCkgKyBiZWFyaW5nRGlyICogYmVhcmluZ1N0ZXAsXG4gICAgICAgICAgICBwaXRjaDogbWFwLmdldFBpdGNoKCkgKyBwaXRjaERpciAqIHBpdGNoU3RlcCxcbiAgICAgICAgICAgIG9mZnNldDogWy14RGlyICogcGFuU3RlcCwgLXlEaXIgKiBwYW5TdGVwXSxcbiAgICAgICAgICAgIGNlbnRlcjogbWFwLmdldENlbnRlcigpXG4gICAgICAgIH07XG5cbiAgICAgICAgbWFwLmVhc2VUbyhlYXNlT3B0aW9ucywge29yaWdpbmFsRXZlbnQ6IGV9KTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGVhc2VPdXQodCkge1xuICAgIHJldHVybiB0ICogKDIgLSB0KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBLZXlib2FyZEhhbmRsZXI7XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IERPTSA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvZG9tJyk7XG5jb25zdCB1dGlsID0gcmVxdWlyZSgnLi4vLi4vdXRpbC91dGlsJyk7XG5jb25zdCBicm93c2VyID0gcmVxdWlyZSgnLi4vLi4vdXRpbC9icm93c2VyJyk7XG5jb25zdCB3aW5kb3cgPSByZXF1aXJlKCcuLi8uLi91dGlsL3dpbmRvdycpO1xuXG5jb25zdCB1YSA9IHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCksXG4gICAgZmlyZWZveCA9IHVhLmluZGV4T2YoJ2ZpcmVmb3gnKSAhPT0gLTEsXG4gICAgc2FmYXJpID0gdWEuaW5kZXhPZignc2FmYXJpJykgIT09IC0xICYmIHVhLmluZGV4T2YoJ2Nocm9tJykgPT09IC0xO1xuXG4vKipcbiAqIFRoZSBgU2Nyb2xsWm9vbUhhbmRsZXJgIGFsbG93cyB0aGUgdXNlciB0byB6b29tIHRoZSBtYXAgYnkgc2Nyb2xsaW5nLlxuICpcbiAqIEBwYXJhbSB7TWFwfSBtYXAgVGhlIE1hcGJveCBHTCBKUyBtYXAgdG8gYWRkIHRoZSBoYW5kbGVyIHRvLlxuICovXG5jbGFzcyBTY3JvbGxab29tSGFuZGxlciB7XG4gICAgY29uc3RydWN0b3IobWFwKSB7XG4gICAgICAgIHRoaXMuX21hcCA9IG1hcDtcbiAgICAgICAgdGhpcy5fZWwgPSBtYXAuZ2V0Q2FudmFzQ29udGFpbmVyKCk7XG5cbiAgICAgICAgdXRpbC5iaW5kQWxsKFtcbiAgICAgICAgICAgICdfb25XaGVlbCcsXG4gICAgICAgICAgICAnX29uVGltZW91dCdcbiAgICAgICAgXSwgdGhpcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBcInNjcm9sbCB0byB6b29tXCIgaW50ZXJhY3Rpb24gaXMgZW5hYmxlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIFwic2Nyb2xsIHRvIHpvb21cIiBpbnRlcmFjdGlvbiBpcyBlbmFibGVkLlxuICAgICAqL1xuICAgIGlzRW5hYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fZW5hYmxlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGVzIHRoZSBcInNjcm9sbCB0byB6b29tXCIgaW50ZXJhY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmFyb3VuZF0gSWYgXCJjZW50ZXJcIiBpcyBwYXNzZWQsIG1hcCB3aWxsIHpvb20gYXJvdW5kIGNlbnRlciBvZiBtYXBcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogICBtYXAuc2Nyb2xsWm9vbS5lbmFibGUoKTtcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqICBtYXAuc2Nyb2xsWm9vbS5lbmFibGUoeyBhcm91bmQ6ICdjZW50ZXInIH0pXG4gICAgICovXG4gICAgZW5hYmxlKG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNFbmFibGVkKCkpIHJldHVybjtcbiAgICAgICAgdGhpcy5fZWwuYWRkRXZlbnRMaXN0ZW5lcignd2hlZWwnLCB0aGlzLl9vbldoZWVsLCBmYWxzZSk7XG4gICAgICAgIHRoaXMuX2VsLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNld2hlZWwnLCB0aGlzLl9vbldoZWVsLCBmYWxzZSk7XG4gICAgICAgIHRoaXMuX2VuYWJsZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLl9hcm91bmRDZW50ZXIgPSBvcHRpb25zICYmIG9wdGlvbnMuYXJvdW5kID09PSAnY2VudGVyJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlcyB0aGUgXCJzY3JvbGwgdG8gem9vbVwiIGludGVyYWN0aW9uLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAgIG1hcC5zY3JvbGxab29tLmRpc2FibGUoKTtcbiAgICAgKi9cbiAgICBkaXNhYmxlKCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNFbmFibGVkKCkpIHJldHVybjtcbiAgICAgICAgdGhpcy5fZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignd2hlZWwnLCB0aGlzLl9vbldoZWVsKTtcbiAgICAgICAgdGhpcy5fZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V3aGVlbCcsIHRoaXMuX29uV2hlZWwpO1xuICAgICAgICB0aGlzLl9lbmFibGVkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgX29uV2hlZWwoZSkge1xuICAgICAgICBsZXQgdmFsdWU7XG5cbiAgICAgICAgaWYgKGUudHlwZSA9PT0gJ3doZWVsJykge1xuICAgICAgICAgICAgdmFsdWUgPSBlLmRlbHRhWTtcbiAgICAgICAgICAgIC8vIEZpcmVmb3ggZG91YmxlcyB0aGUgdmFsdWVzIG9uIHJldGluYSBzY3JlZW5zLi4uXG4gICAgICAgICAgICBpZiAoZmlyZWZveCAmJiBlLmRlbHRhTW9kZSA9PT0gd2luZG93LldoZWVsRXZlbnQuRE9NX0RFTFRBX1BJWEVMKSB2YWx1ZSAvPSBicm93c2VyLmRldmljZVBpeGVsUmF0aW87XG4gICAgICAgICAgICBpZiAoZS5kZWx0YU1vZGUgPT09IHdpbmRvdy5XaGVlbEV2ZW50LkRPTV9ERUxUQV9MSU5FKSB2YWx1ZSAqPSA0MDtcblxuICAgICAgICB9IGVsc2UgaWYgKGUudHlwZSA9PT0gJ21vdXNld2hlZWwnKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IC1lLndoZWVsRGVsdGFZO1xuICAgICAgICAgICAgaWYgKHNhZmFyaSkgdmFsdWUgPSB2YWx1ZSAvIDM7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBub3cgPSBicm93c2VyLm5vdygpLFxuICAgICAgICAgICAgdGltZURlbHRhID0gbm93IC0gKHRoaXMuX3RpbWUgfHwgMCk7XG5cbiAgICAgICAgdGhpcy5fcG9zID0gRE9NLm1vdXNlUG9zKHRoaXMuX2VsLCBlKTtcbiAgICAgICAgdGhpcy5fdGltZSA9IG5vdztcblxuICAgICAgICBpZiAodmFsdWUgIT09IDAgJiYgKHZhbHVlICUgNC4wMDAyNDQxNDA2MjUpID09PSAwKSB7XG4gICAgICAgICAgICAvLyBUaGlzIG9uZSBpcyBkZWZpbml0ZWx5IGEgbW91c2Ugd2hlZWwgZXZlbnQuXG4gICAgICAgICAgICB0aGlzLl90eXBlID0gJ3doZWVsJztcblxuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlICE9PSAwICYmIE1hdGguYWJzKHZhbHVlKSA8IDQpIHtcbiAgICAgICAgICAgIC8vIFRoaXMgb25lIGlzIGRlZmluaXRlbHkgYSB0cmFja3BhZCBldmVudCBiZWNhdXNlIGl0IGlzIHNvIHNtYWxsLlxuICAgICAgICAgICAgdGhpcy5fdHlwZSA9ICd0cmFja3BhZCc7XG5cbiAgICAgICAgfSBlbHNlIGlmICh0aW1lRGVsdGEgPiA0MDApIHtcbiAgICAgICAgICAgIC8vIFRoaXMgaXMgbGlrZWx5IGEgbmV3IHNjcm9sbCBhY3Rpb24uXG4gICAgICAgICAgICB0aGlzLl90eXBlID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuX2xhc3RWYWx1ZSA9IHZhbHVlO1xuXG4gICAgICAgICAgICAvLyBTdGFydCBhIHRpbWVvdXQgaW4gY2FzZSB0aGlzIHdhcyBhIHNpbmd1bGFyIGV2ZW50LCBhbmQgZGVseSBpdCBieSB1cCB0byA0MG1zLlxuICAgICAgICAgICAgdGhpcy5fdGltZW91dCA9IHNldFRpbWVvdXQodGhpcy5fb25UaW1lb3V0LCA0MCk7XG5cbiAgICAgICAgfSBlbHNlIGlmICghdGhpcy5fdHlwZSkge1xuICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHJlcGVhdGluZyBldmVudCwgYnV0IHdlIGRvbid0IGtub3cgdGhlIHR5cGUgb2YgZXZlbnQganVzdCB5ZXQuXG4gICAgICAgICAgICAvLyBJZiB0aGUgZGVsdGEgcGVyIHRpbWUgaXMgc21hbGwsIHdlIGFzc3VtZSBpdCdzIGEgZmFzdCB0cmFja3BhZDsgb3RoZXJ3aXNlIHdlIHN3aXRjaCBpbnRvIHdoZWVsIG1vZGUuXG4gICAgICAgICAgICB0aGlzLl90eXBlID0gKE1hdGguYWJzKHRpbWVEZWx0YSAqIHZhbHVlKSA8IDIwMCkgPyAndHJhY2twYWQnIDogJ3doZWVsJztcblxuICAgICAgICAgICAgLy8gTWFrZSBzdXJlIG91ciBkZWxheWVkIGV2ZW50IGlzbid0IGZpcmVkIGFnYWluLCBiZWNhdXNlIHdlIGFjY3VtdWxhdGVcbiAgICAgICAgICAgIC8vIHRoZSBwcmV2aW91cyBldmVudCAod2hpY2ggd2FzIGxlc3MgdGhhbiA0MG1zIGFnbykgaW50byB0aGlzIGV2ZW50LlxuICAgICAgICAgICAgaWYgKHRoaXMuX3RpbWVvdXQpIHtcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fdGltZW91dCA9IG51bGw7XG4gICAgICAgICAgICAgICAgdmFsdWUgKz0gdGhpcy5fbGFzdFZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2xvdyBkb3duIHpvb20gaWYgc2hpZnQga2V5IGlzIGhlbGQgZm9yIG1vcmUgcHJlY2lzZSB6b29taW5nXG4gICAgICAgIGlmIChlLnNoaWZ0S2V5ICYmIHZhbHVlKSB2YWx1ZSA9IHZhbHVlIC8gNDtcblxuICAgICAgICAvLyBPbmx5IGZpcmUgdGhlIGNhbGxiYWNrIGlmIHdlIGFjdHVhbGx5IGtub3cgd2hhdCB0eXBlIG9mIHNjcm9sbGluZyBkZXZpY2UgdGhlIHVzZXIgdXNlcy5cbiAgICAgICAgaWYgKHRoaXMuX3R5cGUpIHRoaXMuX3pvb20oLXZhbHVlLCBlKTtcblxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgX29uVGltZW91dCgpIHtcbiAgICAgICAgdGhpcy5fdHlwZSA9ICd3aGVlbCc7XG4gICAgICAgIHRoaXMuX3pvb20oLXRoaXMuX2xhc3RWYWx1ZSk7XG4gICAgfVxuXG4gICAgX3pvb20oZGVsdGEsIGUpIHtcbiAgICAgICAgaWYgKGRlbHRhID09PSAwKSByZXR1cm47XG4gICAgICAgIGNvbnN0IG1hcCA9IHRoaXMuX21hcDtcblxuICAgICAgICAvLyBTY2FsZSBieSBzaWdtb2lkIG9mIHNjcm9sbCB3aGVlbCBkZWx0YS5cbiAgICAgICAgbGV0IHNjYWxlID0gMiAvICgxICsgTWF0aC5leHAoLU1hdGguYWJzKGRlbHRhIC8gMTAwKSkpO1xuICAgICAgICBpZiAoZGVsdGEgPCAwICYmIHNjYWxlICE9PSAwKSBzY2FsZSA9IDEgLyBzY2FsZTtcblxuICAgICAgICBjb25zdCBmcm9tU2NhbGUgPSBtYXAuZWFzZSA/IG1hcC5lYXNlLnRvIDogbWFwLnRyYW5zZm9ybS5zY2FsZSxcbiAgICAgICAgICAgIHRhcmdldFpvb20gPSBtYXAudHJhbnNmb3JtLnNjYWxlWm9vbShmcm9tU2NhbGUgKiBzY2FsZSk7XG5cbiAgICAgICAgbWFwLnpvb21Ubyh0YXJnZXRab29tLCB7XG4gICAgICAgICAgICBkdXJhdGlvbjogdGhpcy5fdHlwZSA9PT0gJ3doZWVsJyA/IDIwMCA6IDAsXG4gICAgICAgICAgICBhcm91bmQ6IHRoaXMuX2Fyb3VuZENlbnRlciA/IG1hcC5nZXRDZW50ZXIoKSA6IG1hcC51bnByb2plY3QodGhpcy5fcG9zKSxcbiAgICAgICAgICAgIGRlbGF5RW5kRXZlbnRzOiAyMDAsXG4gICAgICAgICAgICBzbW9vdGhFYXNpbmc6IHRydWVcbiAgICAgICAgfSwgeyBvcmlnaW5hbEV2ZW50OiBlIH0pO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBTY3JvbGxab29tSGFuZGxlcjtcblxuLyoqXG4gKiBGaXJlZCBqdXN0IGJlZm9yZSB0aGUgbWFwIGJlZ2lucyBhIHRyYW5zaXRpb24gZnJvbSBvbmUgem9vbSBsZXZlbCB0byBhbm90aGVyLFxuICogYXMgdGhlIHJlc3VsdCBvZiBlaXRoZXIgdXNlciBpbnRlcmFjdGlvbiBvciBtZXRob2RzIHN1Y2ggYXMgW01hcCNmbHlUb10oI01hcCNmbHlUbykuXG4gKlxuICogQGV2ZW50IHpvb21zdGFydFxuICogQG1lbWJlcm9mIE1hcFxuICogQGluc3RhbmNlXG4gKiBAcHJvcGVydHkge01hcE1vdXNlRXZlbnQgfCBNYXBUb3VjaEV2ZW50fSBkYXRhXG4gKi9cblxuLyoqXG4gKiBGaXJlZCByZXBlYXRlZGx5IGR1cmluZyBhbiBhbmltYXRlZCB0cmFuc2l0aW9uIGZyb20gb25lIHpvb20gbGV2ZWwgdG8gYW5vdGhlcixcbiAqIGFzIHRoZSByZXN1bHQgb2YgZWl0aGVyIHVzZXIgaW50ZXJhY3Rpb24gb3IgbWV0aG9kcyBzdWNoIGFzIFtNYXAjZmx5VG9dKCNNYXAjZmx5VG8pLlxuICpcbiAqIEBldmVudCB6b29tXG4gKiBAbWVtYmVyb2YgTWFwXG4gKiBAaW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7TWFwTW91c2VFdmVudCB8IE1hcFRvdWNoRXZlbnR9IGRhdGFcbiAqIEBzZWUgW1VwZGF0ZSBhIGNob3JvcGxldGggbGF5ZXIgYnkgem9vbSBsZXZlbF0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS91cGRhdGluZy1jaG9yb3BsZXRoLylcbiAqL1xuXG4vKipcbiAqIEZpcmVkIGp1c3QgYWZ0ZXIgdGhlIG1hcCBjb21wbGV0ZXMgYSB0cmFuc2l0aW9uIGZyb20gb25lIHpvb20gbGV2ZWwgdG8gYW5vdGhlcixcbiAqIGFzIHRoZSByZXN1bHQgb2YgZWl0aGVyIHVzZXIgaW50ZXJhY3Rpb24gb3IgbWV0aG9kcyBzdWNoIGFzIFtNYXAjZmx5VG9dKCNNYXAjZmx5VG8pLlxuICpcbiAqIEBldmVudCB6b29tZW5kXG4gKiBAbWVtYmVyb2YgTWFwXG4gKiBAaW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7TWFwTW91c2VFdmVudCB8IE1hcFRvdWNoRXZlbnR9IGRhdGFcbiAqL1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBET00gPSByZXF1aXJlKCcuLi8uLi91dGlsL2RvbScpO1xuY29uc3QgdXRpbCA9IHJlcXVpcmUoJy4uLy4uL3V0aWwvdXRpbCcpO1xuY29uc3Qgd2luZG93ID0gcmVxdWlyZSgnLi4vLi4vdXRpbC93aW5kb3cnKTtcblxuY29uc3QgaW5lcnRpYUxpbmVhcml0eSA9IDAuMTUsXG4gICAgaW5lcnRpYUVhc2luZyA9IHV0aWwuYmV6aWVyKDAsIDAsIGluZXJ0aWFMaW5lYXJpdHksIDEpLFxuICAgIGluZXJ0aWFEZWNlbGVyYXRpb24gPSAxMiwgLy8gc2NhbGUgLyBzXjJcbiAgICBpbmVydGlhTWF4U3BlZWQgPSAyLjUsIC8vIHNjYWxlIC8gc1xuICAgIHNpZ25pZmljYW50U2NhbGVUaHJlc2hvbGQgPSAwLjE1LFxuICAgIHNpZ25pZmljYW50Um90YXRlVGhyZXNob2xkID0gNDtcblxuLyoqXG4gKiBUaGUgYFRvdWNoWm9vbVJvdGF0ZUhhbmRsZXJgIGFsbG93cyB0aGUgdXNlciB0byB6b29tIGFuZCByb3RhdGUgdGhlIG1hcCBieVxuICogcGluY2hpbmcgb24gYSB0b3VjaHNjcmVlbi5cbiAqXG4gKiBAcGFyYW0ge01hcH0gbWFwIFRoZSBNYXBib3ggR0wgSlMgbWFwIHRvIGFkZCB0aGUgaGFuZGxlciB0by5cbiAqL1xuY2xhc3MgVG91Y2hab29tUm90YXRlSGFuZGxlciB7XG4gICAgY29uc3RydWN0b3IobWFwKSB7XG4gICAgICAgIHRoaXMuX21hcCA9IG1hcDtcbiAgICAgICAgdGhpcy5fZWwgPSBtYXAuZ2V0Q2FudmFzQ29udGFpbmVyKCk7XG5cbiAgICAgICAgdXRpbC5iaW5kQWxsKFtcbiAgICAgICAgICAgICdfb25TdGFydCcsXG4gICAgICAgICAgICAnX29uTW92ZScsXG4gICAgICAgICAgICAnX29uRW5kJ1xuICAgICAgICBdLCB0aGlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIFwicGluY2ggdG8gcm90YXRlIGFuZCB6b29tXCIgaW50ZXJhY3Rpb24gaXMgZW5hYmxlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIFwicGluY2ggdG8gcm90YXRlIGFuZCB6b29tXCIgaW50ZXJhY3Rpb24gaXMgZW5hYmxlZC5cbiAgICAgKi9cbiAgICBpc0VuYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2VuYWJsZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyB0aGUgXCJwaW5jaCB0byByb3RhdGUgYW5kIHpvb21cIiBpbnRlcmFjdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuYXJvdW5kXSBJZiBcImNlbnRlclwiIGlzIHBhc3NlZCwgbWFwIHdpbGwgem9vbSBhcm91bmQgdGhlIGNlbnRlclxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAgIG1hcC50b3VjaFpvb21Sb3RhdGUuZW5hYmxlKCk7XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAgIG1hcC50b3VjaFpvb21Sb3RhdGUuZW5hYmxlKHsgYXJvdW5kOiAnY2VudGVyJyB9KTtcbiAgICAgKi9cbiAgICBlbmFibGUob3B0aW9ucykge1xuICAgICAgICBpZiAodGhpcy5pc0VuYWJsZWQoKSkgcmV0dXJuO1xuICAgICAgICB0aGlzLl9lbC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5fb25TdGFydCwgZmFsc2UpO1xuICAgICAgICB0aGlzLl9lbmFibGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fYXJvdW5kQ2VudGVyID0gb3B0aW9ucyAmJiBvcHRpb25zLmFyb3VuZCA9PT0gJ2NlbnRlcic7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzYWJsZXMgdGhlIFwicGluY2ggdG8gcm90YXRlIGFuZCB6b29tXCIgaW50ZXJhY3Rpb24uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqICAgbWFwLnRvdWNoWm9vbVJvdGF0ZS5kaXNhYmxlKCk7XG4gICAgICovXG4gICAgZGlzYWJsZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzRW5hYmxlZCgpKSByZXR1cm47XG4gICAgICAgIHRoaXMuX2VsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLl9vblN0YXJ0KTtcbiAgICAgICAgdGhpcy5fZW5hYmxlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERpc2FibGVzIHRoZSBcInBpbmNoIHRvIHJvdGF0ZVwiIGludGVyYWN0aW9uLCBsZWF2aW5nIHRoZSBcInBpbmNoIHRvIHpvb21cIlxuICAgICAqIGludGVyYWN0aW9uIGVuYWJsZWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqICAgbWFwLnRvdWNoWm9vbVJvdGF0ZS5kaXNhYmxlUm90YXRpb24oKTtcbiAgICAgKi9cbiAgICBkaXNhYmxlUm90YXRpb24oKSB7XG4gICAgICAgIHRoaXMuX3JvdGF0aW9uRGlzYWJsZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVuYWJsZXMgdGhlIFwicGluY2ggdG8gcm90YXRlXCIgaW50ZXJhY3Rpb24uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqICAgbWFwLnRvdWNoWm9vbVJvdGF0ZS5lbmFibGUoKTtcbiAgICAgKiAgIG1hcC50b3VjaFpvb21Sb3RhdGUuZW5hYmxlUm90YXRpb24oKTtcbiAgICAgKi9cbiAgICBlbmFibGVSb3RhdGlvbigpIHtcbiAgICAgICAgdGhpcy5fcm90YXRpb25EaXNhYmxlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIF9vblN0YXJ0KGUpIHtcbiAgICAgICAgaWYgKGUudG91Y2hlcy5sZW5ndGggIT09IDIpIHJldHVybjtcblxuICAgICAgICBjb25zdCBwMCA9IERPTS5tb3VzZVBvcyh0aGlzLl9lbCwgZS50b3VjaGVzWzBdKSxcbiAgICAgICAgICAgIHAxID0gRE9NLm1vdXNlUG9zKHRoaXMuX2VsLCBlLnRvdWNoZXNbMV0pO1xuXG4gICAgICAgIHRoaXMuX3N0YXJ0VmVjID0gcDAuc3ViKHAxKTtcbiAgICAgICAgdGhpcy5fc3RhcnRTY2FsZSA9IHRoaXMuX21hcC50cmFuc2Zvcm0uc2NhbGU7XG4gICAgICAgIHRoaXMuX3N0YXJ0QmVhcmluZyA9IHRoaXMuX21hcC50cmFuc2Zvcm0uYmVhcmluZztcbiAgICAgICAgdGhpcy5fZ2VzdHVyZUludGVudCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5faW5lcnRpYSA9IFtdO1xuXG4gICAgICAgIHdpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0aGlzLl9vbk1vdmUsIGZhbHNlKTtcbiAgICAgICAgd2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdGhpcy5fb25FbmQsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBfb25Nb3ZlKGUpIHtcbiAgICAgICAgaWYgKGUudG91Y2hlcy5sZW5ndGggIT09IDIpIHJldHVybjtcblxuICAgICAgICBjb25zdCBwMCA9IERPTS5tb3VzZVBvcyh0aGlzLl9lbCwgZS50b3VjaGVzWzBdKSxcbiAgICAgICAgICAgIHAxID0gRE9NLm1vdXNlUG9zKHRoaXMuX2VsLCBlLnRvdWNoZXNbMV0pLFxuICAgICAgICAgICAgcCA9IHAwLmFkZChwMSkuZGl2KDIpLFxuICAgICAgICAgICAgdmVjID0gcDAuc3ViKHAxKSxcbiAgICAgICAgICAgIHNjYWxlID0gdmVjLm1hZygpIC8gdGhpcy5fc3RhcnRWZWMubWFnKCksXG4gICAgICAgICAgICBiZWFyaW5nID0gdGhpcy5fcm90YXRpb25EaXNhYmxlZCA/IDAgOiB2ZWMuYW5nbGVXaXRoKHRoaXMuX3N0YXJ0VmVjKSAqIDE4MCAvIE1hdGguUEksXG4gICAgICAgICAgICBtYXAgPSB0aGlzLl9tYXA7XG5cbiAgICAgICAgLy8gRGV0ZXJtaW5lICdpbnRlbnQnIGJ5IHdoaWNoZXZlciB0aHJlc2hvbGQgaXMgc3VycGFzc2VkIGZpcnN0LFxuICAgICAgICAvLyB0aGVuIGtlZXAgdGhhdCBzdGF0ZSBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoaXMgZ2VzdHVyZS5cbiAgICAgICAgaWYgKCF0aGlzLl9nZXN0dXJlSW50ZW50KSB7XG4gICAgICAgICAgICBjb25zdCBzY2FsaW5nU2lnbmlmaWNhbnRseSA9IChNYXRoLmFicygxIC0gc2NhbGUpID4gc2lnbmlmaWNhbnRTY2FsZVRocmVzaG9sZCksXG4gICAgICAgICAgICAgICAgcm90YXRpbmdTaWduaWZpY2FudGx5ID0gKE1hdGguYWJzKGJlYXJpbmcpID4gc2lnbmlmaWNhbnRSb3RhdGVUaHJlc2hvbGQpO1xuXG4gICAgICAgICAgICBpZiAocm90YXRpbmdTaWduaWZpY2FudGx5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZ2VzdHVyZUludGVudCA9ICdyb3RhdGUnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzY2FsaW5nU2lnbmlmaWNhbnRseSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2dlc3R1cmVJbnRlbnQgPSAnem9vbSc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLl9nZXN0dXJlSW50ZW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3RhcnRWZWMgPSB2ZWM7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3RhcnRTY2FsZSA9IG1hcC50cmFuc2Zvcm0uc2NhbGU7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3RhcnRCZWFyaW5nID0gbWFwLnRyYW5zZm9ybS5iZWFyaW5nO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBwYXJhbSA9IHsgZHVyYXRpb246IDAsIGFyb3VuZDogbWFwLnVucHJvamVjdChwKSB9O1xuXG4gICAgICAgICAgICBpZiAodGhpcy5fZ2VzdHVyZUludGVudCA9PT0gJ3JvdGF0ZScpIHtcbiAgICAgICAgICAgICAgICBwYXJhbS5iZWFyaW5nID0gdGhpcy5fc3RhcnRCZWFyaW5nICsgYmVhcmluZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9nZXN0dXJlSW50ZW50ID09PSAnem9vbScgfHwgdGhpcy5fZ2VzdHVyZUludGVudCA9PT0gJ3JvdGF0ZScpIHtcbiAgICAgICAgICAgICAgICBwYXJhbS56b29tID0gbWFwLnRyYW5zZm9ybS5zY2FsZVpvb20odGhpcy5fc3RhcnRTY2FsZSAqIHNjYWxlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbWFwLnN0b3AoKTtcbiAgICAgICAgICAgIHRoaXMuX2RyYWluSW5lcnRpYUJ1ZmZlcigpO1xuICAgICAgICAgICAgdGhpcy5faW5lcnRpYS5wdXNoKFtEYXRlLm5vdygpLCBzY2FsZSwgcF0pO1xuXG4gICAgICAgICAgICBtYXAuZWFzZVRvKHBhcmFtLCB7IG9yaWdpbmFsRXZlbnQ6IGUgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgX29uRW5kKGUpIHtcbiAgICAgICAgd2luZG93LmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHRoaXMuX29uTW92ZSk7XG4gICAgICAgIHdpbmRvdy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHRoaXMuX29uRW5kKTtcbiAgICAgICAgdGhpcy5fZHJhaW5JbmVydGlhQnVmZmVyKCk7XG5cbiAgICAgICAgY29uc3QgaW5lcnRpYSA9IHRoaXMuX2luZXJ0aWEsXG4gICAgICAgICAgICBtYXAgPSB0aGlzLl9tYXA7XG5cbiAgICAgICAgaWYgKGluZXJ0aWEubGVuZ3RoIDwgMikge1xuICAgICAgICAgICAgbWFwLnNuYXBUb05vcnRoKHt9LCB7IG9yaWdpbmFsRXZlbnQ6IGUgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsYXN0ID0gaW5lcnRpYVtpbmVydGlhLmxlbmd0aCAtIDFdLFxuICAgICAgICAgICAgZmlyc3QgPSBpbmVydGlhWzBdLFxuICAgICAgICAgICAgbGFzdFNjYWxlID0gbWFwLnRyYW5zZm9ybS5zY2FsZVpvb20odGhpcy5fc3RhcnRTY2FsZSAqIGxhc3RbMV0pLFxuICAgICAgICAgICAgZmlyc3RTY2FsZSA9IG1hcC50cmFuc2Zvcm0uc2NhbGVab29tKHRoaXMuX3N0YXJ0U2NhbGUgKiBmaXJzdFsxXSksXG4gICAgICAgICAgICBzY2FsZU9mZnNldCA9IGxhc3RTY2FsZSAtIGZpcnN0U2NhbGUsXG4gICAgICAgICAgICBzY2FsZUR1cmF0aW9uID0gKGxhc3RbMF0gLSBmaXJzdFswXSkgLyAxMDAwLFxuICAgICAgICAgICAgcCA9IGxhc3RbMl07XG5cbiAgICAgICAgaWYgKHNjYWxlRHVyYXRpb24gPT09IDAgfHwgbGFzdFNjYWxlID09PSBmaXJzdFNjYWxlKSB7XG4gICAgICAgICAgICBtYXAuc25hcFRvTm9ydGgoe30sIHsgb3JpZ2luYWxFdmVudDogZSB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNhbGN1bGF0ZSBzY2FsZS9zIHNwZWVkIGFuZCBhZGp1c3QgZm9yIGluY3JlYXNlZCBpbml0aWFsIGFuaW1hdGlvbiBzcGVlZCB3aGVuIGVhc2luZ1xuICAgICAgICBsZXQgc3BlZWQgPSBzY2FsZU9mZnNldCAqIGluZXJ0aWFMaW5lYXJpdHkgLyBzY2FsZUR1cmF0aW9uOyAvLyBzY2FsZS9zXG5cbiAgICAgICAgaWYgKE1hdGguYWJzKHNwZWVkKSA+IGluZXJ0aWFNYXhTcGVlZCkge1xuICAgICAgICAgICAgaWYgKHNwZWVkID4gMCkge1xuICAgICAgICAgICAgICAgIHNwZWVkID0gaW5lcnRpYU1heFNwZWVkO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzcGVlZCA9IC1pbmVydGlhTWF4U3BlZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkdXJhdGlvbiA9IE1hdGguYWJzKHNwZWVkIC8gKGluZXJ0aWFEZWNlbGVyYXRpb24gKiBpbmVydGlhTGluZWFyaXR5KSkgKiAxMDAwO1xuICAgICAgICBsZXQgdGFyZ2V0U2NhbGUgPSBsYXN0U2NhbGUgKyBzcGVlZCAqIGR1cmF0aW9uIC8gMjAwMDtcblxuICAgICAgICBpZiAodGFyZ2V0U2NhbGUgPCAwKSB7XG4gICAgICAgICAgICB0YXJnZXRTY2FsZSA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBtYXAuZWFzZVRvKHtcbiAgICAgICAgICAgIHpvb206IHRhcmdldFNjYWxlLFxuICAgICAgICAgICAgZHVyYXRpb246IGR1cmF0aW9uLFxuICAgICAgICAgICAgZWFzaW5nOiBpbmVydGlhRWFzaW5nLFxuICAgICAgICAgICAgYXJvdW5kOiB0aGlzLl9hcm91bmRDZW50ZXIgPyBtYXAuZ2V0Q2VudGVyKCkgOiBtYXAudW5wcm9qZWN0KHApXG4gICAgICAgIH0sIHsgb3JpZ2luYWxFdmVudDogZSB9KTtcbiAgICB9XG5cbiAgICBfZHJhaW5JbmVydGlhQnVmZmVyKCkge1xuICAgICAgICBjb25zdCBpbmVydGlhID0gdGhpcy5faW5lcnRpYSxcbiAgICAgICAgICAgIG5vdyA9IERhdGUubm93KCksXG4gICAgICAgICAgICBjdXRvZmYgPSAxNjA7IC8vIG1zZWNcblxuICAgICAgICB3aGlsZSAoaW5lcnRpYS5sZW5ndGggPiAyICYmIG5vdyAtIGluZXJ0aWFbMF1bMF0gPiBjdXRvZmYpIGluZXJ0aWEuc2hpZnQoKTtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gVG91Y2hab29tUm90YXRlSGFuZGxlcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgdXRpbCA9IHJlcXVpcmUoJy4uL3V0aWwvdXRpbCcpO1xuY29uc3Qgd2luZG93ID0gcmVxdWlyZSgnLi4vdXRpbC93aW5kb3cnKTtcblxuLypcbiAqIEFkZHMgdGhlIG1hcCdzIHBvc2l0aW9uIHRvIGl0cyBwYWdlJ3MgbG9jYXRpb24gaGFzaC5cbiAqIFBhc3NlZCBhcyBhbiBvcHRpb24gdG8gdGhlIG1hcCBvYmplY3QuXG4gKlxuICogQHJldHVybnMge0hhc2h9IGB0aGlzYFxuICovXG5jbGFzcyBIYXNoIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdXRpbC5iaW5kQWxsKFtcbiAgICAgICAgICAgICdfb25IYXNoQ2hhbmdlJyxcbiAgICAgICAgICAgICdfdXBkYXRlSGFzaCdcbiAgICAgICAgXSwgdGhpcyk7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBNYXAgZWxlbWVudCB0byBsaXN0ZW4gZm9yIGNvb3JkaW5hdGUgY2hhbmdlc1xuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG1hcFxuICAgICAqIEByZXR1cm5zIHtIYXNofSBgdGhpc2BcbiAgICAgKi9cbiAgICBhZGRUbyhtYXApIHtcbiAgICAgICAgdGhpcy5fbWFwID0gbWFwO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignaGFzaGNoYW5nZScsIHRoaXMuX29uSGFzaENoYW5nZSwgZmFsc2UpO1xuICAgICAgICB0aGlzLl9tYXAub24oJ21vdmVlbmQnLCB0aGlzLl91cGRhdGVIYXNoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBSZW1vdmVzIGhhc2hcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtQb3B1cH0gYHRoaXNgXG4gICAgICovXG4gICAgcmVtb3ZlKCkge1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignaGFzaGNoYW5nZScsIHRoaXMuX29uSGFzaENoYW5nZSwgZmFsc2UpO1xuICAgICAgICB0aGlzLl9tYXAub2ZmKCdtb3ZlZW5kJywgdGhpcy5fdXBkYXRlSGFzaCk7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9tYXA7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIF9vbkhhc2hDaGFuZ2UoKSB7XG4gICAgICAgIGNvbnN0IGxvYyA9IHdpbmRvdy5sb2NhdGlvbi5oYXNoLnJlcGxhY2UoJyMnLCAnJykuc3BsaXQoJy8nKTtcbiAgICAgICAgaWYgKGxvYy5sZW5ndGggPj0gMykge1xuICAgICAgICAgICAgdGhpcy5fbWFwLmp1bXBUbyh7XG4gICAgICAgICAgICAgICAgY2VudGVyOiBbK2xvY1syXSwgK2xvY1sxXV0sXG4gICAgICAgICAgICAgICAgem9vbTogK2xvY1swXSxcbiAgICAgICAgICAgICAgICBiZWFyaW5nOiArKGxvY1szXSB8fCAwKSxcbiAgICAgICAgICAgICAgICBwaXRjaDogKyhsb2NbNF0gfHwgMClcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIF91cGRhdGVIYXNoKCkge1xuICAgICAgICBjb25zdCBjZW50ZXIgPSB0aGlzLl9tYXAuZ2V0Q2VudGVyKCksXG4gICAgICAgICAgICB6b29tID0gdGhpcy5fbWFwLmdldFpvb20oKSxcbiAgICAgICAgICAgIGJlYXJpbmcgPSB0aGlzLl9tYXAuZ2V0QmVhcmluZygpLFxuICAgICAgICAgICAgcGl0Y2ggPSB0aGlzLl9tYXAuZ2V0UGl0Y2goKSxcbiAgICAgICAgICAgIHByZWNpc2lvbiA9IE1hdGgubWF4KDAsIE1hdGguY2VpbChNYXRoLmxvZyh6b29tKSAvIE1hdGguTE4yKSk7XG5cbiAgICAgICAgbGV0IGhhc2ggPSBgIyR7TWF0aC5yb3VuZCh6b29tICogMTAwKSAvIDEwMFxuICAgICAgICAgICAgICAgIH0vJHtjZW50ZXIubGF0LnRvRml4ZWQocHJlY2lzaW9uKVxuICAgICAgICAgICAgICAgIH0vJHtjZW50ZXIubG5nLnRvRml4ZWQocHJlY2lzaW9uKX1gO1xuXG4gICAgICAgIGlmIChiZWFyaW5nIHx8IHBpdGNoKSBoYXNoICs9IChgLyR7TWF0aC5yb3VuZChiZWFyaW5nICogMTApIC8gMTB9YCk7XG4gICAgICAgIGlmIChwaXRjaCkgaGFzaCArPSAoYC8ke01hdGgucm91bmQocGl0Y2gpfWApO1xuXG4gICAgICAgIHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZSgnJywgJycsIGhhc2gpO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBIYXNoO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCB1dGlsID0gcmVxdWlyZSgnLi4vdXRpbC91dGlsJyk7XG5jb25zdCBicm93c2VyID0gcmVxdWlyZSgnLi4vdXRpbC9icm93c2VyJyk7XG5jb25zdCB3aW5kb3cgPSByZXF1aXJlKCcuLi91dGlsL3dpbmRvdycpO1xuY29uc3QgRE9NID0gcmVxdWlyZSgnLi4vdXRpbC9kb20nKTtcblxuY29uc3QgU3R5bGUgPSByZXF1aXJlKCcuLi9zdHlsZS9zdHlsZScpO1xuY29uc3QgQW5pbWF0aW9uTG9vcCA9IHJlcXVpcmUoJy4uL3N0eWxlL2FuaW1hdGlvbl9sb29wJyk7XG5jb25zdCBQYWludGVyID0gcmVxdWlyZSgnLi4vcmVuZGVyL3BhaW50ZXInKTtcblxuY29uc3QgVHJhbnNmb3JtID0gcmVxdWlyZSgnLi4vZ2VvL3RyYW5zZm9ybScpO1xuY29uc3QgSGFzaCA9IHJlcXVpcmUoJy4vaGFzaCcpO1xuXG5jb25zdCBiaW5kSGFuZGxlcnMgPSByZXF1aXJlKCcuL2JpbmRfaGFuZGxlcnMnKTtcblxuY29uc3QgQ2FtZXJhID0gcmVxdWlyZSgnLi9jYW1lcmEnKTtcbmNvbnN0IExuZ0xhdCA9IHJlcXVpcmUoJy4uL2dlby9sbmdfbGF0Jyk7XG5jb25zdCBMbmdMYXRCb3VuZHMgPSByZXF1aXJlKCcuLi9nZW8vbG5nX2xhdF9ib3VuZHMnKTtcbmNvbnN0IFBvaW50ID0gcmVxdWlyZSgncG9pbnQtZ2VvbWV0cnknKTtcbmNvbnN0IEF0dHJpYnV0aW9uQ29udHJvbCA9IHJlcXVpcmUoJy4vY29udHJvbC9hdHRyaWJ1dGlvbl9jb250cm9sJyk7XG5jb25zdCBpc1N1cHBvcnRlZCA9IHJlcXVpcmUoJ21hcGJveC1nbC1zdXBwb3J0ZWQnKTtcblxuY29uc3QgZGVmYXVsdE1pblpvb20gPSAwO1xuY29uc3QgZGVmYXVsdE1heFpvb20gPSAyMDtcbmNvbnN0IGRlZmF1bHRPcHRpb25zID0ge1xuICAgIGNlbnRlcjogWzAsIDBdLFxuICAgIHpvb206IDAsXG4gICAgYmVhcmluZzogMCxcbiAgICBwaXRjaDogMCxcblxuICAgIG1pblpvb206IGRlZmF1bHRNaW5ab29tLFxuICAgIG1heFpvb206IGRlZmF1bHRNYXhab29tLFxuXG4gICAgaW50ZXJhY3RpdmU6IHRydWUsXG5cbiAgICBzY3JvbGxab29tOiB0cnVlLFxuICAgIGJveFpvb206IHRydWUsXG4gICAgZHJhZ1JvdGF0ZTogdHJ1ZSxcbiAgICBkcmFnUGFuOiB0cnVlLFxuICAgIGtleWJvYXJkOiB0cnVlLFxuICAgIGRvdWJsZUNsaWNrWm9vbTogdHJ1ZSxcbiAgICB0b3VjaFpvb21Sb3RhdGU6IHRydWUsXG5cbiAgICBiZWFyaW5nU25hcDogNyxcblxuICAgIGhhc2g6IGZhbHNlLFxuXG4gICAgYXR0cmlidXRpb25Db250cm9sOiB0cnVlLFxuXG4gICAgZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdDogZmFsc2UsXG4gICAgcHJlc2VydmVEcmF3aW5nQnVmZmVyOiBmYWxzZSxcblxuICAgIHRyYWNrUmVzaXplOiB0cnVlLFxuXG4gICAgcmVuZGVyV29ybGRDb3BpZXM6IHRydWVcbn07XG5cbi8qKlxuICogVGhlIGBNYXBgIG9iamVjdCByZXByZXNlbnRzIHRoZSBtYXAgb24geW91ciBwYWdlLiBJdCBleHBvc2VzIG1ldGhvZHNcbiAqIGFuZCBwcm9wZXJ0aWVzIHRoYXQgZW5hYmxlIHlvdSB0byBwcm9ncmFtbWF0aWNhbGx5IGNoYW5nZSB0aGUgbWFwLFxuICogYW5kIGZpcmVzIGV2ZW50cyBhcyB1c2VycyBpbnRlcmFjdCB3aXRoIGl0LlxuICpcbiAqIFlvdSBjcmVhdGUgYSBgTWFwYCBieSBzcGVjaWZ5aW5nIGEgYGNvbnRhaW5lcmAgYW5kIG90aGVyIG9wdGlvbnMuXG4gKiBUaGVuIE1hcGJveCBHTCBKUyBpbml0aWFsaXplcyB0aGUgbWFwIG9uIHRoZSBwYWdlIGFuZCByZXR1cm5zIHlvdXIgYE1hcGBcbiAqIG9iamVjdC5cbiAqXG4gKiBAZXh0ZW5kcyBFdmVudGVkXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogQHBhcmFtIHtIVE1MRWxlbWVudHxzdHJpbmd9IG9wdGlvbnMuY29udGFpbmVyIFRoZSBIVE1MIGVsZW1lbnQgaW4gd2hpY2ggTWFwYm94IEdMIEpTIHdpbGwgcmVuZGVyIHRoZSBtYXAsIG9yIHRoZSBlbGVtZW50J3Mgc3RyaW5nIGBpZGAuXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubWluWm9vbT0wXSBUaGUgbWluaW11bSB6b29tIGxldmVsIG9mIHRoZSBtYXAgKDEtMjApLlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLm1heFpvb209MjBdIFRoZSBtYXhpbXVtIHpvb20gbGV2ZWwgb2YgdGhlIG1hcCAoMS0yMCkuXG4gKiBAcGFyYW0ge09iamVjdHxzdHJpbmd9IFtvcHRpb25zLnN0eWxlXSBUaGUgbWFwJ3MgTWFwYm94IHN0eWxlLiBUaGlzIG11c3QgYmUgYW4gYSBKU09OIG9iamVjdCBjb25mb3JtaW5nIHRvXG4gKiB0aGUgc2NoZW1hIGRlc2NyaWJlZCBpbiB0aGUgW01hcGJveCBTdHlsZSBTcGVjaWZpY2F0aW9uXShodHRwczovL21hcGJveC5jb20vbWFwYm94LWdsLXN0eWxlLXNwZWMvKSwgb3IgYSBVUkwgdG9cbiAqIHN1Y2ggSlNPTi5cbiAqXG4gKiBUbyBsb2FkIGEgc3R5bGUgZnJvbSB0aGUgTWFwYm94IEFQSSwgeW91IGNhbiB1c2UgYSBVUkwgb2YgdGhlIGZvcm0gYG1hcGJveDovL3N0eWxlcy86b3duZXIvOnN0eWxlYCxcbiAqIHdoZXJlIGA6b3duZXJgIGlzIHlvdXIgTWFwYm94IGFjY291bnQgbmFtZSBhbmQgYDpzdHlsZWAgaXMgdGhlIHN0eWxlIElELiBPciB5b3UgY2FuIHVzZSBvbmUgb2YgdGhlIGZvbGxvd2luZ1xuICogW3RoZSBwcmVkZWZpbmVkIE1hcGJveCBzdHlsZXNdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwcy8pOlxuICpcbiAqICAqIGBtYXBib3g6Ly9zdHlsZXMvbWFwYm94L3N0cmVldHMtdjlgXG4gKiAgKiBgbWFwYm94Oi8vc3R5bGVzL21hcGJveC9vdXRkb29ycy12OWBcbiAqICAqIGBtYXBib3g6Ly9zdHlsZXMvbWFwYm94L2xpZ2h0LXY5YFxuICogICogYG1hcGJveDovL3N0eWxlcy9tYXBib3gvZGFyay12OWBcbiAqICAqIGBtYXBib3g6Ly9zdHlsZXMvbWFwYm94L3NhdGVsbGl0ZS12OWBcbiAqICAqIGBtYXBib3g6Ly9zdHlsZXMvbWFwYm94L3NhdGVsbGl0ZS1zdHJlZXRzLXY5YFxuICpcbiAqIFRpbGVzZXRzIGhvc3RlZCB3aXRoIE1hcGJveCBjYW4gYmUgc3R5bGUtb3B0aW1pemVkIGlmIHlvdSBhcHBlbmQgYD9vcHRpbWl6ZT10cnVlYCB0byB0aGUgZW5kIG9mIHlvdXIgc3R5bGUgVVJMLCBsaWtlIGBtYXBib3g6Ly9zdHlsZXMvbWFwYm94L3N0cmVldHMtdjk/b3B0aW1pemU9dHJ1ZWAuXG4gKiBMZWFybiBtb3JlIGFib3V0IHN0eWxlLW9wdGltaXplZCB2ZWN0b3IgdGlsZXMgaW4gb3VyIFtBUEkgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9hcGktZG9jdW1lbnRhdGlvbi8jcmV0cmlldmUtdGlsZXMpLlxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuaGFzaD1mYWxzZV0gSWYgYHRydWVgLCB0aGUgbWFwJ3MgcG9zaXRpb24gKHpvb20sIGNlbnRlciBsYXRpdHVkZSwgY2VudGVyIGxvbmdpdHVkZSwgYmVhcmluZywgYW5kIHBpdGNoKSB3aWxsIGJlIHN5bmNlZCB3aXRoIHRoZSBoYXNoIGZyYWdtZW50IG9mIHRoZSBwYWdlJ3MgVVJMLlxuICogICBGb3IgZXhhbXBsZSwgYGh0dHA6Ly9wYXRoL3RvL215L3BhZ2UuaHRtbCMyLjU5LzM5LjI2LzUzLjA3Ly0yNC4xLzYwYC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuaW50ZXJhY3RpdmU9dHJ1ZV0gSWYgYGZhbHNlYCwgbm8gbW91c2UsIHRvdWNoLCBvciBrZXlib2FyZCBsaXN0ZW5lcnMgd2lsbCBiZSBhdHRhY2hlZCB0byB0aGUgbWFwLCBzbyBpdCB3aWxsIG5vdCByZXNwb25kIHRvIGludGVyYWN0aW9uLlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmJlYXJpbmdTbmFwPTddIFRoZSB0aHJlc2hvbGQsIG1lYXN1cmVkIGluIGRlZ3JlZXMsIHRoYXQgZGV0ZXJtaW5lcyB3aGVuIHRoZSBtYXAnc1xuICogICBiZWFyaW5nIChyb3RhdGlvbikgd2lsbCBzbmFwIHRvIG5vcnRoLiBGb3IgZXhhbXBsZSwgd2l0aCBhIGBiZWFyaW5nU25hcGAgb2YgNywgaWYgdGhlIHVzZXIgcm90YXRlc1xuICogICB0aGUgbWFwIHdpdGhpbiA3IGRlZ3JlZXMgb2Ygbm9ydGgsIHRoZSBtYXAgd2lsbCBhdXRvbWF0aWNhbGx5IHNuYXAgdG8gZXhhY3Qgbm9ydGguXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IFtvcHRpb25zLmNsYXNzZXNdIE1hcGJveCBzdHlsZSBjbGFzcyBuYW1lcyB3aXRoIHdoaWNoIHRvIGluaXRpYWxpemUgdGhlIG1hcC5cbiAqICAgS2VlcCBpbiBtaW5kIHRoYXQgdGhlc2UgY2xhc3NlcyBhcmUgdXNlZCBmb3IgY29udHJvbGxpbmcgYSBzdHlsZSBsYXllcidzIHBhaW50IHByb3BlcnRpZXMsIHNvIGFyZSAqbm90KiByZWZsZWN0ZWRcbiAqICAgaW4gYW4gSFRNTCBlbGVtZW50J3MgYGNsYXNzYCBhdHRyaWJ1dGUuIFRvIGxlYXJuIG1vcmUgYWJvdXQgTWFwYm94IHN0eWxlIGNsYXNzZXMsIHJlYWQgYWJvdXRcbiAqICAgW0xheWVyc10oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtc3R5bGUtc3BlYy8jbGF5ZXJzKSBpbiB0aGUgc3R5bGUgc3BlY2lmaWNhdGlvbi5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuYXR0cmlidXRpb25Db250cm9sPXRydWVdIElmIGB0cnVlYCwgYW4gW0F0dHJpYnV0aW9uQ29udHJvbF0oI0F0dHJpYnV0aW9uQ29udHJvbCkgd2lsbCBiZSBhZGRlZCB0byB0aGUgbWFwLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5mYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0PWZhbHNlXSBJZiBgdHJ1ZWAsIG1hcCBjcmVhdGlvbiB3aWxsIGZhaWwgaWYgdGhlIHBlcmZvcm1hbmNlIG9mIE1hcGJveFxuICogICBHTCBKUyB3b3VsZCBiZSBkcmFtYXRpY2FsbHkgd29yc2UgdGhhbiBleHBlY3RlZCAoaS5lLiBhIHNvZnR3YXJlIHJlbmRlcmVyIHdvdWxkIGJlIHVzZWQpLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5wcmVzZXJ2ZURyYXdpbmdCdWZmZXI9ZmFsc2VdIElmIGB0cnVlYCwgdGhlIG1hcCdzIGNhbnZhcyBjYW4gYmUgZXhwb3J0ZWQgdG8gYSBQTkcgdXNpbmcgYG1hcC5nZXRDYW52YXMoKS50b0RhdGFVUkwoKWAuIFRoaXMgaXMgYGZhbHNlYCBieSBkZWZhdWx0IGFzIGEgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uLlxuICogQHBhcmFtIHtMbmdMYXRCb3VuZHNMaWtlfSBbb3B0aW9ucy5tYXhCb3VuZHNdIElmIHNldCwgdGhlIG1hcCB3aWxsIGJlIGNvbnN0cmFpbmVkIHRvIHRoZSBnaXZlbiBib3VuZHMuXG4gKiBAcGFyYW0ge2Jvb2xlYW58T2JqZWN0fSBbb3B0aW9ucy5zY3JvbGxab29tPXRydWVdIElmIGB0cnVlYCwgdGhlIFwic2Nyb2xsIHRvIHpvb21cIiBpbnRlcmFjdGlvbiBpcyBlbmFibGVkLiBBbiBgT2JqZWN0YCB2YWx1ZSBpcyBwYXNzZWQgYXMgb3B0aW9ucyB0byBbYFNjcm9sbFpvb21IYW5kbGVyI2VuYWJsZWBdKCNTY3JvbGxab29tSGFuZGxlciNlbmFibGUpLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5ib3hab29tPXRydWVdIElmIGB0cnVlYCwgdGhlIFwiYm94IHpvb21cIiBpbnRlcmFjdGlvbiBpcyBlbmFibGVkIChzZWUgW2BCb3hab29tSGFuZGxlcmBdKCNCb3hab29tSGFuZGxlcikpLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5kcmFnUm90YXRlPXRydWVdIElmIGB0cnVlYCwgdGhlIFwiZHJhZyB0byByb3RhdGVcIiBpbnRlcmFjdGlvbiBpcyBlbmFibGVkIChzZWUgW2BEcmFnUm90YXRlSGFuZGxlcmBdKCNEcmFnUm90YXRlSGFuZGxlcikpLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5kcmFnUGFuPXRydWVdIElmIGB0cnVlYCwgdGhlIFwiZHJhZyB0byBwYW5cIiBpbnRlcmFjdGlvbiBpcyBlbmFibGVkIChzZWUgW2BEcmFnUGFuSGFuZGxlcmBdKCNEcmFnUGFuSGFuZGxlcikpLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5rZXlib2FyZD10cnVlXSBJZiBgdHJ1ZWAsIGtleWJvYXJkIHNob3J0Y3V0cyBhcmUgZW5hYmxlZCAoc2VlIFtgS2V5Ym9hcmRIYW5kbGVyYF0oI0tleWJvYXJkSGFuZGxlcikpLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5kb3VibGVDbGlja1pvb209dHJ1ZV0gSWYgYHRydWVgLCB0aGUgXCJkb3VibGUgY2xpY2sgdG8gem9vbVwiIGludGVyYWN0aW9uIGlzIGVuYWJsZWQgKHNlZSBbYERvdWJsZUNsaWNrWm9vbUhhbmRsZXJgXSgjRG91YmxlQ2xpY2tab29tSGFuZGxlcikpLlxuICogQHBhcmFtIHtib29sZWFufE9iamVjdH0gW29wdGlvbnMudG91Y2hab29tUm90YXRlPXRydWVdIElmIGB0cnVlYCwgdGhlIFwicGluY2ggdG8gcm90YXRlIGFuZCB6b29tXCIgaW50ZXJhY3Rpb24gaXMgZW5hYmxlZC4gQW4gYE9iamVjdGAgdmFsdWUgaXMgcGFzc2VkIGFzIG9wdGlvbnMgdG8gW2BUb3VjaFpvb21Sb3RhdGVIYW5kbGVyI2VuYWJsZWBdKCNUb3VjaFpvb21Sb3RhdGVIYW5kbGVyI2VuYWJsZSkuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnRyYWNrUmVzaXplPXRydWVdICBJZiBgdHJ1ZWAsIHRoZSBtYXAgd2lsbCBhdXRvbWF0aWNhbGx5IHJlc2l6ZSB3aGVuIHRoZSBicm93c2VyIHdpbmRvdyByZXNpemVzLlxuICogQHBhcmFtIHtMbmdMYXRMaWtlfSBbb3B0aW9ucy5jZW50ZXI9WzAsIDBdXSBUaGUgaW5pdGFsIGdlb2dyYXBoaWNhbCBjZW50ZXJwb2ludCBvZiB0aGUgbWFwLiBJZiBgY2VudGVyYCBpcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBjb25zdHJ1Y3RvciBvcHRpb25zLCBNYXBib3ggR0wgSlMgd2lsbCBsb29rIGZvciBpdCBpbiB0aGUgbWFwJ3Mgc3R5bGUgb2JqZWN0LiBJZiBpdCBpcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBzdHlsZSwgZWl0aGVyLCBpdCB3aWxsIGRlZmF1bHQgdG8gYFswLCAwXWAuXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuem9vbT0wXSBUaGUgaW5pdGlhbCB6b29tIGxldmVsIG9mIHRoZSBtYXAuIElmIGB6b29tYCBpcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBjb25zdHJ1Y3RvciBvcHRpb25zLCBNYXBib3ggR0wgSlMgd2lsbCBsb29rIGZvciBpdCBpbiB0aGUgbWFwJ3Mgc3R5bGUgb2JqZWN0LiBJZiBpdCBpcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBzdHlsZSwgZWl0aGVyLCBpdCB3aWxsIGRlZmF1bHQgdG8gYDBgLlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmJlYXJpbmc9MF0gVGhlIGluaXRpYWwgYmVhcmluZyAocm90YXRpb24pIG9mIHRoZSBtYXAsIG1lYXN1cmVkIGluIGRlZ3JlZXMgY291bnRlci1jbG9ja3dpc2UgZnJvbSBub3J0aC4gSWYgYGJlYXJpbmdgIGlzIG5vdCBzcGVjaWZpZWQgaW4gdGhlIGNvbnN0cnVjdG9yIG9wdGlvbnMsIE1hcGJveCBHTCBKUyB3aWxsIGxvb2sgZm9yIGl0IGluIHRoZSBtYXAncyBzdHlsZSBvYmplY3QuIElmIGl0IGlzIG5vdCBzcGVjaWZpZWQgaW4gdGhlIHN0eWxlLCBlaXRoZXIsIGl0IHdpbGwgZGVmYXVsdCB0byBgMGAuXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMucGl0Y2g9MF0gVGhlIGluaXRpYWwgcGl0Y2ggKHRpbHQpIG9mIHRoZSBtYXAsIG1lYXN1cmVkIGluIGRlZ3JlZXMgYXdheSBmcm9tIHRoZSBwbGFuZSBvZiB0aGUgc2NyZWVuICgwLTYwKS4gSWYgYHBpdGNoYCBpcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBjb25zdHJ1Y3RvciBvcHRpb25zLCBNYXBib3ggR0wgSlMgd2lsbCBsb29rIGZvciBpdCBpbiB0aGUgbWFwJ3Mgc3R5bGUgb2JqZWN0LiBJZiBpdCBpcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBzdHlsZSwgZWl0aGVyLCBpdCB3aWxsIGRlZmF1bHQgdG8gYDBgLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5yZW5kZXJXb3JsZENvcGllcz10cnVlXSAgSWYgYHRydWVgLCBtdWx0aXBsZSBjb3BpZXMgb2YgdGhlIHdvcmxkIHdpbGwgYmUgcmVuZGVyZWQsIHdoZW4gem9vbWVkIG91dC5cbiAqIEBleGFtcGxlXG4gKiB2YXIgbWFwID0gbmV3IG1hcGJveGdsLk1hcCh7XG4gKiAgIGNvbnRhaW5lcjogJ21hcCcsXG4gKiAgIGNlbnRlcjogWy0xMjIuNDIwNjc5LCAzNy43NzI1MzddLFxuICogICB6b29tOiAxMyxcbiAqICAgc3R5bGU6IHN0eWxlX29iamVjdCxcbiAqICAgaGFzaDogdHJ1ZVxuICogfSk7XG4gKiBAc2VlIFtEaXNwbGF5IGEgbWFwXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlcy8pXG4gKi9cbmNsYXNzIE1hcCBleHRlbmRzIENhbWVyYSB7XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIG9wdGlvbnMgPSB1dGlsLmV4dGVuZCh7fSwgZGVmYXVsdE9wdGlvbnMsIG9wdGlvbnMpO1xuXG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IG5ldyBUcmFuc2Zvcm0ob3B0aW9ucy5taW5ab29tLCBvcHRpb25zLm1heFpvb20sIG9wdGlvbnMucmVuZGVyV29ybGRDb3BpZXMpO1xuICAgICAgICBzdXBlcih0cmFuc2Zvcm0sIG9wdGlvbnMpO1xuXG4gICAgICAgIHRoaXMuX2ludGVyYWN0aXZlID0gb3B0aW9ucy5pbnRlcmFjdGl2ZTtcbiAgICAgICAgdGhpcy5fZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdCA9IG9wdGlvbnMuZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdDtcbiAgICAgICAgdGhpcy5fcHJlc2VydmVEcmF3aW5nQnVmZmVyID0gb3B0aW9ucy5wcmVzZXJ2ZURyYXdpbmdCdWZmZXI7XG4gICAgICAgIHRoaXMuX3RyYWNrUmVzaXplID0gb3B0aW9ucy50cmFja1Jlc2l6ZTtcbiAgICAgICAgdGhpcy5fYmVhcmluZ1NuYXAgPSBvcHRpb25zLmJlYXJpbmdTbmFwO1xuXG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5jb250YWluZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aGlzLl9jb250YWluZXIgPSB3aW5kb3cuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQob3B0aW9ucy5jb250YWluZXIpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9jb250YWluZXIpIHRocm93IG5ldyBFcnJvcihgQ29udGFpbmVyICcke29wdGlvbnMuY29udGFpbmVyfScgbm90IGZvdW5kLmApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyID0gb3B0aW9ucy5jb250YWluZXI7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFuaW1hdGlvbkxvb3AgPSBuZXcgQW5pbWF0aW9uTG9vcCgpO1xuXG4gICAgICAgIGlmIChvcHRpb25zLm1heEJvdW5kcykge1xuICAgICAgICAgICAgdGhpcy5zZXRNYXhCb3VuZHMob3B0aW9ucy5tYXhCb3VuZHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgdXRpbC5iaW5kQWxsKFtcbiAgICAgICAgICAgICdfb25XaW5kb3dPbmxpbmUnLFxuICAgICAgICAgICAgJ19vbldpbmRvd1Jlc2l6ZScsXG4gICAgICAgICAgICAnX2NvbnRleHRMb3N0JyxcbiAgICAgICAgICAgICdfY29udGV4dFJlc3RvcmVkJyxcbiAgICAgICAgICAgICdfdXBkYXRlJyxcbiAgICAgICAgICAgICdfcmVuZGVyJyxcbiAgICAgICAgICAgICdfb25EYXRhJyxcbiAgICAgICAgICAgICdfb25EYXRhTG9hZGluZydcbiAgICAgICAgXSwgdGhpcyk7XG5cbiAgICAgICAgdGhpcy5fc2V0dXBDb250YWluZXIoKTtcbiAgICAgICAgdGhpcy5fc2V0dXBQYWludGVyKCk7XG5cbiAgICAgICAgdGhpcy5vbignbW92ZScsIHRoaXMuX3VwZGF0ZS5iaW5kKHRoaXMsIGZhbHNlKSk7XG4gICAgICAgIHRoaXMub24oJ3pvb20nLCB0aGlzLl91cGRhdGUuYmluZCh0aGlzLCB0cnVlKSk7XG4gICAgICAgIHRoaXMub24oJ21vdmVlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmFuaW1hdGlvbkxvb3Auc2V0KDMwMCk7IC8vIHRleHQgZmFkaW5nXG4gICAgICAgICAgICB0aGlzLl9yZXJlbmRlcigpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdvbmxpbmUnLCB0aGlzLl9vbldpbmRvd09ubGluZSwgZmFsc2UpO1xuICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMuX29uV2luZG93UmVzaXplLCBmYWxzZSk7XG4gICAgICAgIH1cblxuICAgICAgICBiaW5kSGFuZGxlcnModGhpcywgb3B0aW9ucyk7XG5cbiAgICAgICAgdGhpcy5faGFzaCA9IG9wdGlvbnMuaGFzaCAmJiAobmV3IEhhc2goKSkuYWRkVG8odGhpcyk7XG4gICAgICAgIC8vIGRvbid0IHNldCBwb3NpdGlvbiBmcm9tIG9wdGlvbnMgaWYgc2V0IHRocm91Z2ggaGFzaFxuICAgICAgICBpZiAoIXRoaXMuX2hhc2ggfHwgIXRoaXMuX2hhc2guX29uSGFzaENoYW5nZSgpKSB7XG4gICAgICAgICAgICB0aGlzLmp1bXBUbyh7XG4gICAgICAgICAgICAgICAgY2VudGVyOiBvcHRpb25zLmNlbnRlcixcbiAgICAgICAgICAgICAgICB6b29tOiBvcHRpb25zLnpvb20sXG4gICAgICAgICAgICAgICAgYmVhcmluZzogb3B0aW9ucy5iZWFyaW5nLFxuICAgICAgICAgICAgICAgIHBpdGNoOiBvcHRpb25zLnBpdGNoXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2NsYXNzZXMgPSBbXTtcblxuICAgICAgICB0aGlzLnJlc2l6ZSgpO1xuXG4gICAgICAgIGlmIChvcHRpb25zLmNsYXNzZXMpIHRoaXMuc2V0Q2xhc3NlcyhvcHRpb25zLmNsYXNzZXMpO1xuICAgICAgICBpZiAob3B0aW9ucy5zdHlsZSkgdGhpcy5zZXRTdHlsZShvcHRpb25zLnN0eWxlKTtcblxuICAgICAgICBpZiAob3B0aW9ucy5hdHRyaWJ1dGlvbkNvbnRyb2wpIHRoaXMuYWRkQ29udHJvbChuZXcgQXR0cmlidXRpb25Db250cm9sKCkpO1xuXG4gICAgICAgIHRoaXMub24oJ3N0eWxlLmxvYWQnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnRyYW5zZm9ybS51bm1vZGlmaWVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5qdW1wVG8odGhpcy5zdHlsZS5zdHlsZXNoZWV0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc3R5bGUudXBkYXRlKHRoaXMuX2NsYXNzZXMsIHt0cmFuc2l0aW9uOiBmYWxzZX0pO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLm9uKCdkYXRhJywgdGhpcy5fb25EYXRhKTtcbiAgICAgICAgdGhpcy5vbignZGF0YWxvYWRpbmcnLCB0aGlzLl9vbkRhdGFMb2FkaW5nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgW2BJQ29udHJvbGBdKCNJQ29udHJvbCkgdG8gdGhlIG1hcCwgY2FsbGluZyBgY29udHJvbC5vbkFkZCh0aGlzKWAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0lDb250cm9sfSBjb250cm9sIFRoZSBbYElDb250cm9sYF0oI0lDb250cm9sKSB0byBhZGQuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtwb3NpdGlvbl0gcG9zaXRpb24gb24gdGhlIG1hcCB0byB3aGljaCB0aGUgY29udHJvbCB3aWxsIGJlIGFkZGVkLlxuICAgICAqIFZhbGlkIHZhbHVlcyBhcmUgYCd0b3AtbGVmdCdgLCBgJ3RvcC1yaWdodCdgLCBgJ2JvdHRvbS1sZWZ0J2AsIGFuZCBgJ2JvdHRvbS1yaWdodCdgLiBEZWZhdWx0cyB0byBgJ3RvcC1yaWdodCdgLlxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqIEBzZWUgW0Rpc3BsYXkgbWFwIG5hdmlnYXRpb24gY29udHJvbHNdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvbmF2aWdhdGlvbi8pXG4gICAgICovXG4gICAgYWRkQ29udHJvbChjb250cm9sLCBwb3NpdGlvbikge1xuICAgICAgICBpZiAocG9zaXRpb24gPT09IHVuZGVmaW5lZCAmJiBjb250cm9sLmdldERlZmF1bHRQb3NpdGlvbikge1xuICAgICAgICAgICAgcG9zaXRpb24gPSBjb250cm9sLmdldERlZmF1bHRQb3NpdGlvbigpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwb3NpdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBwb3NpdGlvbiA9ICd0b3AtcmlnaHQnO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbnRyb2xFbGVtZW50ID0gY29udHJvbC5vbkFkZCh0aGlzKTtcbiAgICAgICAgY29uc3QgcG9zaXRpb25Db250YWluZXIgPSB0aGlzLl9jb250cm9sUG9zaXRpb25zW3Bvc2l0aW9uXTtcbiAgICAgICAgaWYgKHBvc2l0aW9uLmluZGV4T2YoJ2JvdHRvbScpICE9PSAtMSkge1xuICAgICAgICAgICAgcG9zaXRpb25Db250YWluZXIuaW5zZXJ0QmVmb3JlKGNvbnRyb2xFbGVtZW50LCBwb3NpdGlvbkNvbnRhaW5lci5maXJzdENoaWxkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBvc2l0aW9uQ29udGFpbmVyLmFwcGVuZENoaWxkKGNvbnRyb2xFbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBjb250cm9sIGZyb20gdGhlIG1hcC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7SUNvbnRyb2x9IGNvbnRyb2wgVGhlIFtgSUNvbnRyb2xgXSgjSUNvbnRyb2wpIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcbiAgICAgKi9cbiAgICByZW1vdmVDb250cm9sKGNvbnRyb2wpIHtcbiAgICAgICAgY29udHJvbC5vblJlbW92ZSh0aGlzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIE1hcGJveCBzdHlsZSBjbGFzcyB0byB0aGUgbWFwLlxuICAgICAqXG4gICAgICogS2VlcCBpbiBtaW5kIHRoYXQgdGhlc2UgY2xhc3NlcyBhcmUgdXNlZCBmb3IgY29udHJvbGxpbmcgYSBzdHlsZSBsYXllcidzIHBhaW50IHByb3BlcnRpZXMsIHNvIGFyZSAqbm90KiByZWZsZWN0ZWRcbiAgICAgKiBpbiBhbiBIVE1MIGVsZW1lbnQncyBgY2xhc3NgIGF0dHJpYnV0ZS4gVG8gbGVhcm4gbW9yZSBhYm91dCBNYXBib3ggc3R5bGUgY2xhc3NlcywgcmVhZCBhYm91dFxuICAgICAqIFtMYXllcnNdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLXN0eWxlLXNwZWMvI2xheWVycykgaW4gdGhlIHN0eWxlIHNwZWNpZmljYXRpb24uXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogU3R5bGUgY2xhc3NlcyBhcmUgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGFuIHVwY29taW5nIHJlbGVhc2Ugb2YgTWFwYm94IEdMIEpTLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtsYXNzIFRoZSBzdHlsZSBjbGFzcyB0byBhZGQuXG4gICAgICogQHBhcmFtIHtTdHlsZU9wdGlvbnN9IFtvcHRpb25zXVxuICAgICAqIEBmaXJlcyBjaGFuZ2VcbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcbiAgICAgKi9cbiAgICBhZGRDbGFzcyhrbGFzcywgb3B0aW9ucykge1xuICAgICAgICB1dGlsLndhcm5PbmNlKCdTdHlsZSBjbGFzc2VzIGFyZSBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYW4gdXBjb21pbmcgcmVsZWFzZSBvZiBNYXBib3ggR0wgSlMuJyk7XG4gICAgICAgIGlmICh0aGlzLl9jbGFzc2VzLmluZGV4T2Yoa2xhc3MpID49IDAgfHwga2xhc3MgPT09ICcnKSByZXR1cm4gdGhpcztcbiAgICAgICAgdGhpcy5fY2xhc3Nlcy5wdXNoKGtsYXNzKTtcbiAgICAgICAgdGhpcy5fY2xhc3NPcHRpb25zID0gb3B0aW9ucztcblxuICAgICAgICBpZiAodGhpcy5zdHlsZSkgdGhpcy5zdHlsZS51cGRhdGVDbGFzc2VzKCk7XG4gICAgICAgIHJldHVybiB0aGlzLl91cGRhdGUodHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhIE1hcGJveCBzdHlsZSBjbGFzcyBmcm9tIHRoZSBtYXAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogU3R5bGUgY2xhc3NlcyBhcmUgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGFuIHVwY29taW5nIHJlbGVhc2Ugb2YgTWFwYm94IEdMIEpTLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtsYXNzIFRoZSBzdHlsZSBjbGFzcyB0byByZW1vdmUuXG4gICAgICogQHBhcmFtIHtTdHlsZU9wdGlvbnN9IFtvcHRpb25zXVxuICAgICAqIEBmaXJlcyBjaGFuZ2VcbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcbiAgICAgKi9cbiAgICByZW1vdmVDbGFzcyhrbGFzcywgb3B0aW9ucykge1xuICAgICAgICB1dGlsLndhcm5PbmNlKCdTdHlsZSBjbGFzc2VzIGFyZSBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYW4gdXBjb21pbmcgcmVsZWFzZSBvZiBNYXBib3ggR0wgSlMuJyk7XG4gICAgICAgIGNvbnN0IGkgPSB0aGlzLl9jbGFzc2VzLmluZGV4T2Yoa2xhc3MpO1xuICAgICAgICBpZiAoaSA8IDAgfHwga2xhc3MgPT09ICcnKSByZXR1cm4gdGhpcztcbiAgICAgICAgdGhpcy5fY2xhc3Nlcy5zcGxpY2UoaSwgMSk7XG4gICAgICAgIHRoaXMuX2NsYXNzT3B0aW9ucyA9IG9wdGlvbnM7XG5cbiAgICAgICAgaWYgKHRoaXMuc3R5bGUpIHRoaXMuc3R5bGUudXBkYXRlQ2xhc3NlcygpO1xuICAgICAgICByZXR1cm4gdGhpcy5fdXBkYXRlKHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlcGxhY2VzIHRoZSBtYXAncyBleGlzdGluZyBNYXBib3ggc3R5bGUgY2xhc3NlcyB3aXRoIGEgbmV3IGFycmF5IG9mIGNsYXNzZXMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogU3R5bGUgY2xhc3NlcyBhcmUgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGFuIHVwY29taW5nIHJlbGVhc2Ugb2YgTWFwYm94IEdMIEpTLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBrbGFzc2VzIFRoZSBzdHlsZSBjbGFzc2VzIHRvIHNldC5cbiAgICAgKiBAcGFyYW0ge1N0eWxlT3B0aW9uc30gW29wdGlvbnNdXG4gICAgICogQGZpcmVzIGNoYW5nZVxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqL1xuICAgIHNldENsYXNzZXMoa2xhc3Nlcywgb3B0aW9ucykge1xuICAgICAgICB1dGlsLndhcm5PbmNlKCdTdHlsZSBjbGFzc2VzIGFyZSBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYW4gdXBjb21pbmcgcmVsZWFzZSBvZiBNYXBib3ggR0wgSlMuJyk7XG4gICAgICAgIGNvbnN0IHVuaXF1ZUNsYXNzZXMgPSB7fTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrbGFzc2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoa2xhc3Nlc1tpXSAhPT0gJycpIHVuaXF1ZUNsYXNzZXNba2xhc3Nlc1tpXV0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NsYXNzZXMgPSBPYmplY3Qua2V5cyh1bmlxdWVDbGFzc2VzKTtcbiAgICAgICAgdGhpcy5fY2xhc3NPcHRpb25zID0gb3B0aW9ucztcblxuICAgICAgICBpZiAodGhpcy5zdHlsZSkgdGhpcy5zdHlsZS51cGRhdGVDbGFzc2VzKCk7XG4gICAgICAgIHJldHVybiB0aGlzLl91cGRhdGUodHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBtYXAgaGFzIHRoZVxuICAgICAqIHNwZWNpZmllZCBNYXBib3ggc3R5bGUgY2xhc3MuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogU3R5bGUgY2xhc3NlcyBhcmUgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGFuIHVwY29taW5nIHJlbGVhc2Ugb2YgTWFwYm94IEdMIEpTLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtsYXNzIFRoZSBzdHlsZSBjbGFzcyB0byB0ZXN0LlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIG1hcCBoYXMgdGhlIHNwZWNpZmllZCBzdHlsZSBjbGFzcy5cbiAgICAgKi9cbiAgICBoYXNDbGFzcyhrbGFzcykge1xuICAgICAgICB1dGlsLndhcm5PbmNlKCdTdHlsZSBjbGFzc2VzIGFyZSBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYW4gdXBjb21pbmcgcmVsZWFzZSBvZiBNYXBib3ggR0wgSlMuJyk7XG4gICAgICAgIHJldHVybiB0aGlzLl9jbGFzc2VzLmluZGV4T2Yoa2xhc3MpID49IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbWFwJ3MgTWFwYm94IHN0eWxlIGNsYXNzZXMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogU3R5bGUgY2xhc3NlcyBhcmUgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGFuIHVwY29taW5nIHJlbGVhc2Ugb2YgTWFwYm94IEdMIEpTLlxuICAgICAqXG4gICAgICogQHJldHVybnMge0FycmF5PHN0cmluZz59IFRoZSBtYXAncyBzdHlsZSBjbGFzc2VzLlxuICAgICAqL1xuICAgIGdldENsYXNzZXMoKSB7XG4gICAgICAgIHV0aWwud2Fybk9uY2UoJ1N0eWxlIGNsYXNzZXMgYXJlIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhbiB1cGNvbWluZyByZWxlYXNlIG9mIE1hcGJveCBHTCBKUy4nKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NsYXNzZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzaXplcyB0aGUgbWFwIGFjY29yZGluZyB0byB0aGUgZGltZW5zaW9ucyBvZiBpdHNcbiAgICAgKiBgY29udGFpbmVyYCBlbGVtZW50LlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIG1hcCdzIGBjb250YWluZXJgIGlzIHJlc2l6ZWQgYnkgYW5vdGhlciBzY3JpcHQsXG4gICAgICogb3Igd2hlbiB0aGUgbWFwIGlzIHNob3duIGFmdGVyIGJlaW5nIGluaXRpYWxseSBoaWRkZW4gd2l0aCBDU1MuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcbiAgICAgKi9cbiAgICByZXNpemUoKSB7XG4gICAgICAgIGNvbnN0IGRpbWVuc2lvbnMgPSB0aGlzLl9jb250YWluZXJEaW1lbnNpb25zKCk7XG4gICAgICAgIGNvbnN0IHdpZHRoID0gZGltZW5zaW9uc1swXTtcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gZGltZW5zaW9uc1sxXTtcblxuICAgICAgICB0aGlzLl9yZXNpemVDYW52YXMod2lkdGgsIGhlaWdodCk7XG4gICAgICAgIHRoaXMudHJhbnNmb3JtLnJlc2l6ZSh3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgdGhpcy5wYWludGVyLnJlc2l6ZSh3aWR0aCwgaGVpZ2h0KTtcblxuICAgICAgICBjb25zdCBnbCA9IHRoaXMucGFpbnRlci5nbDtcbiAgICAgICAgY29uc3QgbWF4U2l6ZSA9IGdsLmdldFBhcmFtZXRlcihnbC5NQVhfUkVOREVSQlVGRkVSX1NJWkUpIC8gMjtcbiAgICAgICAgaWYgKHRoaXMuX2NhbnZhcy53aWR0aCA+IG1heFNpemUgfHwgdGhpcy5fY2FudmFzLmhlaWdodCA+IG1heFNpemUpIHtcbiAgICAgICAgICAgIHV0aWwud2Fybk9uY2UoXG4gICAgICAgICAgICAgICAgYE1hcCBpcyBsYXJnZXIgdGhhbiBtYXhpbXVtIHNpemUgc3VwcG9ydGVkIGJ5IHRoaXMgc3lzdGVtIGAgK1xuICAgICAgICAgICAgICAgIGAoJHttYXhTaXplfXB4IGJ5ICR7bWF4U2l6ZX1weCkuYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgICAgICAgICAuZmlyZSgnbW92ZXN0YXJ0JylcbiAgICAgICAgICAgIC5maXJlKCdtb3ZlJylcbiAgICAgICAgICAgIC5maXJlKCdyZXNpemUnKVxuICAgICAgICAgICAgLmZpcmUoJ21vdmVlbmQnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBtYXAncyBnZW9ncmFwaGljYWwgYm91bmRzLlxuICAgICAqXG4gICAgICogQHJldHVybnMge0xuZ0xhdEJvdW5kc30gVGhlIG1hcCdzIGdlb2dyYXBoaWNhbCBib3VuZHMuXG4gICAgICovXG4gICAgZ2V0Qm91bmRzKCkge1xuICAgICAgICBjb25zdCBib3VuZHMgPSBuZXcgTG5nTGF0Qm91bmRzKFxuICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm0ucG9pbnRMb2NhdGlvbihuZXcgUG9pbnQoMCwgdGhpcy50cmFuc2Zvcm0uaGVpZ2h0KSksXG4gICAgICAgICAgICB0aGlzLnRyYW5zZm9ybS5wb2ludExvY2F0aW9uKG5ldyBQb2ludCh0aGlzLnRyYW5zZm9ybS53aWR0aCwgMCkpKTtcblxuICAgICAgICBpZiAodGhpcy50cmFuc2Zvcm0uYW5nbGUgfHwgdGhpcy50cmFuc2Zvcm0ucGl0Y2gpIHtcbiAgICAgICAgICAgIGJvdW5kcy5leHRlbmQodGhpcy50cmFuc2Zvcm0ucG9pbnRMb2NhdGlvbihuZXcgUG9pbnQodGhpcy50cmFuc2Zvcm0uc2l6ZS54LCAwKSkpO1xuICAgICAgICAgICAgYm91bmRzLmV4dGVuZCh0aGlzLnRyYW5zZm9ybS5wb2ludExvY2F0aW9uKG5ldyBQb2ludCgwLCB0aGlzLnRyYW5zZm9ybS5zaXplLnkpKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYm91bmRzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgb3IgY2xlYXJzIHRoZSBtYXAncyBnZW9ncmFwaGljYWwgYm91bmRzLlxuICAgICAqXG4gICAgICogUGFuIGFuZCB6b29tIG9wZXJhdGlvbnMgYXJlIGNvbnN0cmFpbmVkIHdpdGhpbiB0aGVzZSBib3VuZHMuXG4gICAgICogSWYgYSBwYW4gb3Igem9vbSBpcyBwZXJmb3JtZWQgdGhhdCB3b3VsZFxuICAgICAqIGRpc3BsYXkgcmVnaW9ucyBvdXRzaWRlIHRoZXNlIGJvdW5kcywgdGhlIG1hcCB3aWxsXG4gICAgICogaW5zdGVhZCBkaXNwbGF5IGEgcG9zaXRpb24gYW5kIHpvb20gbGV2ZWxcbiAgICAgKiBhcyBjbG9zZSBhcyBwb3NzaWJsZSB0byB0aGUgb3BlcmF0aW9uJ3MgcmVxdWVzdCB3aGlsZSBzdGlsbFxuICAgICAqIHJlbWFpbmluZyB3aXRoaW4gdGhlIGJvdW5kcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7TG5nTGF0Qm91bmRzTGlrZSB8IG51bGwgfCB1bmRlZmluZWR9IGxuZ2xhdGJvdW5kcyBUaGUgbWF4aW11bSBib3VuZHMgdG8gc2V0LiBJZiBgbnVsbGAgb3IgYHVuZGVmaW5lZGAgaXMgcHJvdmlkZWQsIHRoZSBmdW5jdGlvbiByZW1vdmVzIHRoZSBtYXAncyBtYXhpbXVtIGJvdW5kcy5cbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcbiAgICAgKi9cbiAgICBzZXRNYXhCb3VuZHMgKGxuZ2xhdGJvdW5kcykge1xuICAgICAgICBpZiAobG5nbGF0Ym91bmRzKSB7XG4gICAgICAgICAgICBjb25zdCBiID0gTG5nTGF0Qm91bmRzLmNvbnZlcnQobG5nbGF0Ym91bmRzKTtcbiAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtLmxuZ1JhbmdlID0gW2IuZ2V0V2VzdCgpLCBiLmdldEVhc3QoKV07XG4gICAgICAgICAgICB0aGlzLnRyYW5zZm9ybS5sYXRSYW5nZSA9IFtiLmdldFNvdXRoKCksIGIuZ2V0Tm9ydGgoKV07XG4gICAgICAgICAgICB0aGlzLnRyYW5zZm9ybS5fY29uc3RyYWluKCk7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGUoKTtcbiAgICAgICAgfSBlbHNlIGlmIChsbmdsYXRib3VuZHMgPT09IG51bGwgfHwgbG5nbGF0Ym91bmRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtLmxuZ1JhbmdlID0gW107XG4gICAgICAgICAgICB0aGlzLnRyYW5zZm9ybS5sYXRSYW5nZSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyBvciBjbGVhcnMgdGhlIG1hcCdzIG1pbmltdW0gem9vbSBsZXZlbC5cbiAgICAgKiBJZiB0aGUgbWFwJ3MgY3VycmVudCB6b29tIGxldmVsIGlzIGxvd2VyIHRoYW4gdGhlIG5ldyBtaW5pbXVtLFxuICAgICAqIHRoZSBtYXAgd2lsbCB6b29tIHRvIHRoZSBuZXcgbWluaW11bS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7P251bWJlcn0gbWluWm9vbSBUaGUgbWluaW11bSB6b29tIGxldmVsIHRvIHNldCAoMC0yMCkuXG4gICAgICogICBJZiBgbnVsbGAgb3IgYHVuZGVmaW5lZGAgaXMgcHJvdmlkZWQsIHRoZSBmdW5jdGlvbiByZW1vdmVzIHRoZSBjdXJyZW50IG1pbmltdW0gem9vbSAoaS5lLiBzZXRzIGl0IHRvIDApLlxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqL1xuICAgIHNldE1pblpvb20obWluWm9vbSkge1xuXG4gICAgICAgIG1pblpvb20gPSBtaW5ab29tID09PSBudWxsIHx8IG1pblpvb20gPT09IHVuZGVmaW5lZCA/IGRlZmF1bHRNaW5ab29tIDogbWluWm9vbTtcblxuICAgICAgICBpZiAobWluWm9vbSA+PSBkZWZhdWx0TWluWm9vbSAmJiBtaW5ab29tIDw9IHRoaXMudHJhbnNmb3JtLm1heFpvb20pIHtcbiAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtLm1pblpvb20gPSBtaW5ab29tO1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlKCk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmdldFpvb20oKSA8IG1pblpvb20pIHRoaXMuc2V0Wm9vbShtaW5ab29tKTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICAgICAgfSBlbHNlIHRocm93IG5ldyBFcnJvcihgbWluWm9vbSBtdXN0IGJlIGJldHdlZW4gJHtkZWZhdWx0TWluWm9vbX0gYW5kIHRoZSBjdXJyZW50IG1heFpvb20sIGluY2x1c2l2ZWApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG1hcCdzIG1pbmltdW0gYWxsb3dhYmxlIHpvb20gbGV2ZWwuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBtaW5ab29tXG4gICAgICovXG4gICAgZ2V0TWluWm9vbSgpIHsgcmV0dXJuIHRoaXMudHJhbnNmb3JtLm1pblpvb207IH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgb3IgY2xlYXJzIHRoZSBtYXAncyBtYXhpbXVtIHpvb20gbGV2ZWwuXG4gICAgICogSWYgdGhlIG1hcCdzIGN1cnJlbnQgem9vbSBsZXZlbCBpcyBoaWdoZXIgdGhhbiB0aGUgbmV3IG1heGltdW0sXG4gICAgICogdGhlIG1hcCB3aWxsIHpvb20gdG8gdGhlIG5ldyBtYXhpbXVtLlxuICAgICAqXG4gICAgICogQHBhcmFtIHs/bnVtYmVyfSBtYXhab29tIFRoZSBtYXhpbXVtIHpvb20gbGV2ZWwgdG8gc2V0LlxuICAgICAqICAgSWYgYG51bGxgIG9yIGB1bmRlZmluZWRgIGlzIHByb3ZpZGVkLCB0aGUgZnVuY3Rpb24gcmVtb3ZlcyB0aGUgY3VycmVudCBtYXhpbXVtIHpvb20gKHNldHMgaXQgdG8gMjApLlxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqL1xuICAgIHNldE1heFpvb20obWF4Wm9vbSkge1xuXG4gICAgICAgIG1heFpvb20gPSBtYXhab29tID09PSBudWxsIHx8IG1heFpvb20gPT09IHVuZGVmaW5lZCA/IGRlZmF1bHRNYXhab29tIDogbWF4Wm9vbTtcblxuICAgICAgICBpZiAobWF4Wm9vbSA+PSB0aGlzLnRyYW5zZm9ybS5taW5ab29tKSB7XG4gICAgICAgICAgICB0aGlzLnRyYW5zZm9ybS5tYXhab29tID0gbWF4Wm9vbTtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZSgpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5nZXRab29tKCkgPiBtYXhab29tKSB0aGlzLnNldFpvb20obWF4Wm9vbSk7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICAgIH0gZWxzZSB0aHJvdyBuZXcgRXJyb3IoYG1heFpvb20gbXVzdCBiZSBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQgbWluWm9vbWApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG1hcCdzIG1heGltdW0gYWxsb3dhYmxlIHpvb20gbGV2ZWwuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBtYXhab29tXG4gICAgICovXG4gICAgZ2V0TWF4Wm9vbSgpIHsgcmV0dXJuIHRoaXMudHJhbnNmb3JtLm1heFpvb207IH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBbYFBvaW50YF0oI1BvaW50KSByZXByZXNlbnRpbmcgcGl4ZWwgY29vcmRpbmF0ZXMsIHJlbGF0aXZlIHRvIHRoZSBtYXAncyBgY29udGFpbmVyYCxcbiAgICAgKiB0aGF0IGNvcnJlc3BvbmQgdG8gdGhlIHNwZWNpZmllZCBnZW9ncmFwaGljYWwgbG9jYXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0xuZ0xhdExpa2V9IGxuZ2xhdCBUaGUgZ2VvZ3JhcGhpY2FsIGxvY2F0aW9uIHRvIHByb2plY3QuXG4gICAgICogQHJldHVybnMge1BvaW50fSBUaGUgW2BQb2ludGBdKCNQb2ludCkgY29ycmVzcG9uZGluZyB0byBgbG5nbGF0YCwgcmVsYXRpdmUgdG8gdGhlIG1hcCdzIGBjb250YWluZXJgLlxuICAgICAqL1xuICAgIHByb2plY3QobG5nbGF0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybS5sb2NhdGlvblBvaW50KExuZ0xhdC5jb252ZXJ0KGxuZ2xhdCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBbYExuZ0xhdGBdKCNMbmdMYXQpIHJlcHJlc2VudGluZyBnZW9ncmFwaGljYWwgY29vcmRpbmF0ZXMgdGhhdCBjb3JyZXNwb25kXG4gICAgICogdG8gdGhlIHNwZWNpZmllZCBwaXhlbCBjb29yZGluYXRlcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UG9pbnRMaWtlfSBwb2ludCBUaGUgcGl4ZWwgY29vcmRpbmF0ZXMgdG8gdW5wcm9qZWN0LlxuICAgICAqIEByZXR1cm5zIHtMbmdMYXR9IFRoZSBbYExuZ0xhdGBdKCNMbmdMYXQpIGNvcnJlc3BvbmRpbmcgdG8gYHBvaW50YC5cbiAgICAgKiBAc2VlIFtTaG93IHBvbHlnb24gaW5mb3JtYXRpb24gb24gY2xpY2tdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvcG9seWdvbi1wb3B1cC1vbi1jbGljay8pXG4gICAgICovXG4gICAgdW5wcm9qZWN0KHBvaW50KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybS5wb2ludExvY2F0aW9uKFBvaW50LmNvbnZlcnQocG9pbnQpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIFtHZW9KU09OXShodHRwOi8vZ2VvanNvbi5vcmcvKVxuICAgICAqIFtGZWF0dXJlIG9iamVjdHNdKGh0dHA6Ly9nZW9qc29uLm9yZy9nZW9qc29uLXNwZWMuaHRtbCNmZWF0dXJlLW9iamVjdHMpXG4gICAgICogcmVwcmVzZW50aW5nIHZpc2libGUgZmVhdHVyZXMgdGhhdCBzYXRpc2Z5IHRoZSBxdWVyeSBwYXJhbWV0ZXJzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtQb2ludExpa2V8QXJyYXk8UG9pbnRMaWtlPn0gW2dlb21ldHJ5XSAtIFRoZSBnZW9tZXRyeSBvZiB0aGUgcXVlcnkgcmVnaW9uOlxuICAgICAqIGVpdGhlciBhIHNpbmdsZSBwb2ludCBvciBzb3V0aHdlc3QgYW5kIG5vcnRoZWFzdCBwb2ludHMgZGVzY3JpYmluZyBhIGJvdW5kaW5nIGJveC5cbiAgICAgKiBPbWl0dGluZyB0aGlzIHBhcmFtZXRlciAoaS5lLiBjYWxsaW5nIFtgTWFwI3F1ZXJ5UmVuZGVyZWRGZWF0dXJlc2BdKCNNYXAjcXVlcnlSZW5kZXJlZEZlYXR1cmVzKSB3aXRoIHplcm8gYXJndW1lbnRzLFxuICAgICAqIG9yIHdpdGggb25seSBhIGBwYXJhbWV0ZXJzYCBhcmd1bWVudCkgaXMgZXF1aXZhbGVudCB0byBwYXNzaW5nIGEgYm91bmRpbmcgYm94IGVuY29tcGFzc2luZyB0aGUgZW50aXJlXG4gICAgICogbWFwIHZpZXdwb3J0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1ldGVyc11cbiAgICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IFtwYXJhbWV0ZXJzLmxheWVyc10gQW4gYXJyYXkgb2Ygc3R5bGUgbGF5ZXIgSURzIGZvciB0aGUgcXVlcnkgdG8gaW5zcGVjdC5cbiAgICAgKiAgIE9ubHkgZmVhdHVyZXMgd2l0aGluIHRoZXNlIGxheWVycyB3aWxsIGJlIHJldHVybmVkLiBJZiB0aGlzIHBhcmFtZXRlciBpcyB1bmRlZmluZWQsIGFsbCBsYXllcnMgd2lsbCBiZSBjaGVja2VkLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtwYXJhbWV0ZXJzLmZpbHRlcl0gQSBbZmlsdGVyXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1zdHlsZS1zcGVjLyN0eXBlcy1maWx0ZXIpXG4gICAgICogICB0byBsaW1pdCBxdWVyeSByZXN1bHRzLlxuICAgICAqXG4gICAgICogQHJldHVybnMge0FycmF5PE9iamVjdD59IEFuIGFycmF5IG9mIFtHZW9KU09OXShodHRwOi8vZ2VvanNvbi5vcmcvKVxuICAgICAqIFtmZWF0dXJlIG9iamVjdHNdKGh0dHA6Ly9nZW9qc29uLm9yZy9nZW9qc29uLXNwZWMuaHRtbCNmZWF0dXJlLW9iamVjdHMpLlxuICAgICAqXG4gICAgICogVGhlIGBwcm9wZXJ0aWVzYCB2YWx1ZSBvZiBlYWNoIHJldHVybmVkIGZlYXR1cmUgb2JqZWN0IGNvbnRhaW5zIHRoZSBwcm9wZXJ0aWVzIG9mIGl0cyBzb3VyY2UgZmVhdHVyZS4gRm9yIEdlb0pTT04gc291cmNlcywgb25seVxuICAgICAqIHN0cmluZyBhbmQgbnVtZXJpYyBwcm9wZXJ0eSB2YWx1ZXMgYXJlIHN1cHBvcnRlZCAoaS5lLiBgbnVsbGAsIGBBcnJheWAsIGFuZCBgT2JqZWN0YCB2YWx1ZXMgYXJlIG5vdCBzdXBwb3J0ZWQpLlxuICAgICAqXG4gICAgICogRWFjaCBmZWF0dXJlIGluY2x1ZGVzIGEgdG9wLWxldmVsIGBsYXllcmAgcHJvcGVydHkgd2hvc2UgdmFsdWUgaXMgYW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc3R5bGUgbGF5ZXIgdG9cbiAgICAgKiB3aGljaCB0aGUgZmVhdHVyZSBiZWxvbmdzLiBMYXlvdXQgYW5kIHBhaW50IHByb3BlcnRpZXMgaW4gdGhpcyBvYmplY3QgY29udGFpbiB2YWx1ZXMgd2hpY2ggYXJlIGZ1bGx5IGV2YWx1YXRlZFxuICAgICAqIGZvciB0aGUgZ2l2ZW4gem9vbSBsZXZlbCBhbmQgZmVhdHVyZS5cbiAgICAgKlxuICAgICAqIEZlYXR1cmVzIGZyb20gbGF5ZXJzIHdob3NlIGB2aXNpYmlsaXR5YCBwcm9wZXJ0eSBpcyBgXCJub25lXCJgLCBvciBmcm9tIGxheWVycyB3aG9zZSB6b29tIHJhbmdlIGV4Y2x1ZGVzIHRoZVxuICAgICAqIGN1cnJlbnQgem9vbSBsZXZlbCBhcmUgbm90IGluY2x1ZGVkLiBTeW1ib2wgZmVhdHVyZXMgdGhhdCBoYXZlIGJlZW4gaGlkZGVuIGR1ZSB0byB0ZXh0IG9yIGljb24gY29sbGlzaW9uIGFyZVxuICAgICAqIG5vdCBpbmNsdWRlZC4gRmVhdHVyZXMgZnJvbSBhbGwgb3RoZXIgbGF5ZXJzIGFyZSBpbmNsdWRlZCwgaW5jbHVkaW5nIGZlYXR1cmVzIHRoYXQgbWF5IGhhdmUgbm8gdmlzaWJsZVxuICAgICAqIGNvbnRyaWJ1dGlvbiB0byB0aGUgcmVuZGVyZWQgcmVzdWx0OyBmb3IgZXhhbXBsZSwgYmVjYXVzZSB0aGUgbGF5ZXIncyBvcGFjaXR5IG9yIGNvbG9yIGFscGhhIGNvbXBvbmVudCBpcyBzZXQgdG9cbiAgICAgKiAwLlxuICAgICAqXG4gICAgICogVGhlIHRvcG1vc3QgcmVuZGVyZWQgZmVhdHVyZSBhcHBlYXJzIGZpcnN0IGluIHRoZSByZXR1cm5lZCBhcnJheSwgYW5kIHN1YnNlcXVlbnQgZmVhdHVyZXMgYXJlIHNvcnRlZCBieVxuICAgICAqIGRlc2NlbmRpbmcgei1vcmRlci4gRmVhdHVyZXMgdGhhdCBhcmUgcmVuZGVyZWQgbXVsdGlwbGUgdGltZXMgKGR1ZSB0byB3cmFwcGluZyBhY3Jvc3MgdGhlIGFudGltZXJpZGlhbiBhdCBsb3dcbiAgICAgKiB6b29tIGxldmVscykgYXJlIHJldHVybmVkIG9ubHkgb25jZSAodGhvdWdoIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjYXZlYXQpLlxuICAgICAqXG4gICAgICogQmVjYXVzZSBmZWF0dXJlcyBjb21lIGZyb20gdGlsZWQgdmVjdG9yIGRhdGEgb3IgR2VvSlNPTiBkYXRhIHRoYXQgaXMgY29udmVydGVkIHRvIHRpbGVzIGludGVybmFsbHksIGZlYXR1cmVcbiAgICAgKiBnZW9tZXRyaWVzIG1heSBiZSBzcGxpdCBvciBkdXBsaWNhdGVkIGFjcm9zcyB0aWxlIGJvdW5kYXJpZXMgYW5kLCBhcyBhIHJlc3VsdCwgZmVhdHVyZXMgbWF5IGFwcGVhciBtdWx0aXBsZVxuICAgICAqIHRpbWVzIGluIHF1ZXJ5IHJlc3VsdHMuIEZvciBleGFtcGxlLCBzdXBwb3NlIHRoZXJlIGlzIGEgaGlnaHdheSBydW5uaW5nIHRocm91Z2ggdGhlIGJvdW5kaW5nIHJlY3RhbmdsZSBvZiBhIHF1ZXJ5LlxuICAgICAqIFRoZSByZXN1bHRzIG9mIHRoZSBxdWVyeSB3aWxsIGJlIHRob3NlIHBhcnRzIG9mIHRoZSBoaWdod2F5IHRoYXQgbGllIHdpdGhpbiB0aGUgbWFwIHRpbGVzIGNvdmVyaW5nIHRoZSBib3VuZGluZ1xuICAgICAqIHJlY3RhbmdsZSwgZXZlbiBpZiB0aGUgaGlnaHdheSBleHRlbmRzIGludG8gb3RoZXIgdGlsZXMsIGFuZCB0aGUgcG9ydGlvbiBvZiB0aGUgaGlnaHdheSB3aXRoaW4gZWFjaCBtYXAgdGlsZVxuICAgICAqIHdpbGwgYmUgcmV0dXJuZWQgYXMgYSBzZXBhcmF0ZSBmZWF0dXJlLiBTaW1pbGFybHksIGEgcG9pbnQgZmVhdHVyZSBuZWFyIGEgdGlsZSBib3VuZGFyeSBtYXkgYXBwZWFyIGluIG11bHRpcGxlXG4gICAgICogdGlsZXMgZHVlIHRvIHRpbGUgYnVmZmVyaW5nLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBGaW5kIGFsbCBmZWF0dXJlcyBhdCBhIHBvaW50XG4gICAgICogdmFyIGZlYXR1cmVzID0gbWFwLnF1ZXJ5UmVuZGVyZWRGZWF0dXJlcyhcbiAgICAgKiAgIFsyMCwgMzVdLFxuICAgICAqICAgeyBsYXllcnM6IFsnbXktbGF5ZXItbmFtZSddIH1cbiAgICAgKiApO1xuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBGaW5kIGFsbCBmZWF0dXJlcyB3aXRoaW4gYSBzdGF0aWMgYm91bmRpbmcgYm94XG4gICAgICogdmFyIGZlYXR1cmVzID0gbWFwLnF1ZXJ5UmVuZGVyZWRGZWF0dXJlcyhcbiAgICAgKiAgIFtbMTAsIDIwXSwgWzMwLCA1MF1dLFxuICAgICAqICAgeyBsYXllcnM6IFsnbXktbGF5ZXItbmFtZSddIH1cbiAgICAgKiApO1xuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAvLyBGaW5kIGFsbCBmZWF0dXJlcyB3aXRoaW4gYSBib3VuZGluZyBib3ggYXJvdW5kIGEgcG9pbnRcbiAgICAgKiB2YXIgd2lkdGggPSAxMDtcbiAgICAgKiB2YXIgaGVpZ2h0ID0gMjA7XG4gICAgICogdmFyIGZlYXR1cmVzID0gbWFwLnF1ZXJ5UmVuZGVyZWRGZWF0dXJlcyhbXG4gICAgICogICBbcG9pbnQueCAtIHdpZHRoIC8gMiwgcG9pbnQueSAtIGhlaWdodCAvIDJdLFxuICAgICAqICAgW3BvaW50LnggKyB3aWR0aCAvIDIsIHBvaW50LnkgKyBoZWlnaHQgLyAyXVxuICAgICAqIF0sIHsgbGF5ZXJzOiBbJ215LWxheWVyLW5hbWUnXSB9KTtcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gUXVlcnkgYWxsIHJlbmRlcmVkIGZlYXR1cmVzIGZyb20gYSBzaW5nbGUgbGF5ZXJcbiAgICAgKiB2YXIgZmVhdHVyZXMgPSBtYXAucXVlcnlSZW5kZXJlZEZlYXR1cmVzKHsgbGF5ZXJzOiBbJ215LWxheWVyLW5hbWUnXSB9KTtcbiAgICAgKiBAc2VlIFtHZXQgZmVhdHVyZXMgdW5kZXIgdGhlIG1vdXNlIHBvaW50ZXJdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvcXVlcnlyZW5kZXJlZGZlYXR1cmVzLylcbiAgICAgKiBAc2VlIFtIaWdobGlnaHQgZmVhdHVyZXMgd2l0aGluIGEgYm91bmRpbmcgYm94XShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3VzaW5nLWJveC1xdWVyeXJlbmRlcmVkZmVhdHVyZXMvKVxuICAgICAqIEBzZWUgW0NlbnRlciB0aGUgbWFwIG9uIGEgY2xpY2tlZCBzeW1ib2xdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvY2VudGVyLW9uLXN5bWJvbC8pXG4gICAgICovXG4gICAgcXVlcnlSZW5kZXJlZEZlYXR1cmVzKCkge1xuICAgICAgICBsZXQgcGFyYW1zID0ge307XG4gICAgICAgIGxldCBnZW9tZXRyeTtcblxuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgZ2VvbWV0cnkgPSBhcmd1bWVudHNbMF07XG4gICAgICAgICAgICBwYXJhbXMgPSBhcmd1bWVudHNbMV07XG4gICAgICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSAmJiBpc1BvaW50TGlrZShhcmd1bWVudHNbMF0pKSB7XG4gICAgICAgICAgICBnZW9tZXRyeSA9IGFyZ3VtZW50c1swXTtcbiAgICAgICAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICBwYXJhbXMgPSBhcmd1bWVudHNbMF07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5zdHlsZS5xdWVyeVJlbmRlcmVkRmVhdHVyZXMoXG4gICAgICAgICAgICB0aGlzLl9tYWtlUXVlcnlHZW9tZXRyeShnZW9tZXRyeSksXG4gICAgICAgICAgICBwYXJhbXMsXG4gICAgICAgICAgICB0aGlzLnRyYW5zZm9ybS56b29tLFxuICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm0uYW5nbGVcbiAgICAgICAgKTtcblxuICAgICAgICBmdW5jdGlvbiBpc1BvaW50TGlrZShpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0IGluc3RhbmNlb2YgUG9pbnQgfHwgQXJyYXkuaXNBcnJheShpbnB1dCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfbWFrZVF1ZXJ5R2VvbWV0cnkocG9pbnRPckJveCkge1xuICAgICAgICBpZiAocG9pbnRPckJveCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBib3VuZHMgd2FzIG9taXR0ZWQ6IHVzZSBmdWxsIHZpZXdwb3J0XG4gICAgICAgICAgICBwb2ludE9yQm94ID0gW1xuICAgICAgICAgICAgICAgIFBvaW50LmNvbnZlcnQoWzAsIDBdKSxcbiAgICAgICAgICAgICAgICBQb2ludC5jb252ZXJ0KFt0aGlzLnRyYW5zZm9ybS53aWR0aCwgdGhpcy50cmFuc2Zvcm0uaGVpZ2h0XSlcbiAgICAgICAgICAgIF07XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcXVlcnlHZW9tZXRyeTtcbiAgICAgICAgY29uc3QgaXNQb2ludCA9IHBvaW50T3JCb3ggaW5zdGFuY2VvZiBQb2ludCB8fCB0eXBlb2YgcG9pbnRPckJveFswXSA9PT0gJ251bWJlcic7XG5cbiAgICAgICAgaWYgKGlzUG9pbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IHBvaW50ID0gUG9pbnQuY29udmVydChwb2ludE9yQm94KTtcbiAgICAgICAgICAgIHF1ZXJ5R2VvbWV0cnkgPSBbcG9pbnRdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgYm94ID0gW1BvaW50LmNvbnZlcnQocG9pbnRPckJveFswXSksIFBvaW50LmNvbnZlcnQocG9pbnRPckJveFsxXSldO1xuICAgICAgICAgICAgcXVlcnlHZW9tZXRyeSA9IFtcbiAgICAgICAgICAgICAgICBib3hbMF0sXG4gICAgICAgICAgICAgICAgbmV3IFBvaW50KGJveFsxXS54LCBib3hbMF0ueSksXG4gICAgICAgICAgICAgICAgYm94WzFdLFxuICAgICAgICAgICAgICAgIG5ldyBQb2ludChib3hbMF0ueCwgYm94WzFdLnkpLFxuICAgICAgICAgICAgICAgIGJveFswXVxuICAgICAgICAgICAgXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHF1ZXJ5R2VvbWV0cnkgPSBxdWVyeUdlb21ldHJ5Lm1hcCgocCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtLnBvaW50Q29vcmRpbmF0ZShwKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHF1ZXJ5R2VvbWV0cnk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBbR2VvSlNPTl0oaHR0cDovL2dlb2pzb24ub3JnLylcbiAgICAgKiBbRmVhdHVyZSBvYmplY3RzXShodHRwOi8vZ2VvanNvbi5vcmcvZ2VvanNvbi1zcGVjLmh0bWwjZmVhdHVyZS1vYmplY3RzKVxuICAgICAqIHJlcHJlc2VudGluZyBmZWF0dXJlcyB3aXRoaW4gdGhlIHNwZWNpZmllZCB2ZWN0b3IgdGlsZSBvciBHZW9KU09OIHNvdXJjZSB0aGF0IHNhdGlzZnkgdGhlIHF1ZXJ5IHBhcmFtZXRlcnMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc291cmNlSUQgVGhlIElEIG9mIHRoZSB2ZWN0b3IgdGlsZSBvciBHZW9KU09OIHNvdXJjZSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtZXRlcnNdXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtwYXJhbWV0ZXJzLnNvdXJjZUxheWVyXSBUaGUgbmFtZSBvZiB0aGUgdmVjdG9yIHRpbGUgbGF5ZXIgdG8gcXVlcnkuICpGb3IgdmVjdG9yIHRpbGVcbiAgICAgKiAgIHNvdXJjZXMsIHRoaXMgcGFyYW1ldGVyIGlzIHJlcXVpcmVkLiogRm9yIEdlb0pTT04gc291cmNlcywgaXQgaXMgaWdub3JlZC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbcGFyYW1ldGVycy5maWx0ZXJdIEEgW2ZpbHRlcl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtc3R5bGUtc3BlYy8jdHlwZXMtZmlsdGVyKVxuICAgICAqICAgdG8gbGltaXQgcXVlcnkgcmVzdWx0cy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtBcnJheTxPYmplY3Q+fSBBbiBhcnJheSBvZiBbR2VvSlNPTl0oaHR0cDovL2dlb2pzb24ub3JnLylcbiAgICAgKiBbRmVhdHVyZSBvYmplY3RzXShodHRwOi8vZ2VvanNvbi5vcmcvZ2VvanNvbi1zcGVjLmh0bWwjZmVhdHVyZS1vYmplY3RzKS5cbiAgICAgKlxuICAgICAqIEluIGNvbnRyYXN0IHRvIFtgTWFwI3F1ZXJ5UmVuZGVyZWRGZWF0dXJlc2BdKCNNYXAjcXVlcnlSZW5kZXJlZEZlYXR1cmVzKSwgdGhpcyBmdW5jdGlvblxuICAgICAqIHJldHVybnMgYWxsIGZlYXR1cmVzIG1hdGNoaW5nIHRoZSBxdWVyeSBwYXJhbWV0ZXJzLFxuICAgICAqIHdoZXRoZXIgb3Igbm90IHRoZXkgYXJlIHJlbmRlcmVkIGJ5IHRoZSBjdXJyZW50IHN0eWxlIChpLmUuIHZpc2libGUpLiBUaGUgZG9tYWluIG9mIHRoZSBxdWVyeSBpbmNsdWRlcyBhbGwgY3VycmVudGx5LWxvYWRlZFxuICAgICAqIHZlY3RvciB0aWxlcyBhbmQgR2VvSlNPTiBzb3VyY2UgdGlsZXM6IHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgY2hlY2sgdGlsZXMgb3V0c2lkZSB0aGUgY3VycmVudGx5XG4gICAgICogdmlzaWJsZSB2aWV3cG9ydC5cbiAgICAgKlxuICAgICAqIEJlY2F1c2UgZmVhdHVyZXMgY29tZSBmcm9tIHRpbGVkIHZlY3RvciBkYXRhIG9yIEdlb0pTT04gZGF0YSB0aGF0IGlzIGNvbnZlcnRlZCB0byB0aWxlcyBpbnRlcm5hbGx5LCBmZWF0dXJlXG4gICAgICogZ2VvbWV0cmllcyBtYXkgYmUgc3BsaXQgb3IgZHVwbGljYXRlZCBhY3Jvc3MgdGlsZSBib3VuZGFyaWVzIGFuZCwgYXMgYSByZXN1bHQsIGZlYXR1cmVzIG1heSBhcHBlYXIgbXVsdGlwbGVcbiAgICAgKiB0aW1lcyBpbiBxdWVyeSByZXN1bHRzLiBGb3IgZXhhbXBsZSwgc3VwcG9zZSB0aGVyZSBpcyBhIGhpZ2h3YXkgcnVubmluZyB0aHJvdWdoIHRoZSBib3VuZGluZyByZWN0YW5nbGUgb2YgYSBxdWVyeS5cbiAgICAgKiBUaGUgcmVzdWx0cyBvZiB0aGUgcXVlcnkgd2lsbCBiZSB0aG9zZSBwYXJ0cyBvZiB0aGUgaGlnaHdheSB0aGF0IGxpZSB3aXRoaW4gdGhlIG1hcCB0aWxlcyBjb3ZlcmluZyB0aGUgYm91bmRpbmdcbiAgICAgKiByZWN0YW5nbGUsIGV2ZW4gaWYgdGhlIGhpZ2h3YXkgZXh0ZW5kcyBpbnRvIG90aGVyIHRpbGVzLCBhbmQgdGhlIHBvcnRpb24gb2YgdGhlIGhpZ2h3YXkgd2l0aGluIGVhY2ggbWFwIHRpbGVcbiAgICAgKiB3aWxsIGJlIHJldHVybmVkIGFzIGEgc2VwYXJhdGUgZmVhdHVyZS4gU2ltaWxhcmx5LCBhIHBvaW50IGZlYXR1cmUgbmVhciBhIHRpbGUgYm91bmRhcnkgbWF5IGFwcGVhciBpbiBtdWx0aXBsZVxuICAgICAqIHRpbGVzIGR1ZSB0byB0aWxlIGJ1ZmZlcmluZy5cbiAgICAgKiBAc2VlIFtGaWx0ZXIgZmVhdHVyZXMgd2l0aGluIG1hcCB2aWV3XShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2ZpbHRlci1mZWF0dXJlcy13aXRoaW4tbWFwLXZpZXcvKVxuICAgICAqIEBzZWUgW0hpZ2hsaWdodCBmZWF0dXJlcyBjb250YWluaW5nIHNpbWlsYXIgZGF0YV0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9xdWVyeS1zaW1pbGFyLWZlYXR1cmVzLylcbiAgICAgKi9cbiAgICBxdWVyeVNvdXJjZUZlYXR1cmVzKHNvdXJjZUlELCBwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0eWxlLnF1ZXJ5U291cmNlRmVhdHVyZXMoc291cmNlSUQsIHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIG1hcCdzIE1hcGJveCBzdHlsZSBvYmplY3Qgd2l0aCBhIG5ldyB2YWx1ZS4gIElmIHRoZSBnaXZlblxuICAgICAqIHZhbHVlIGlzIHN0eWxlIEpTT04gb2JqZWN0LCBjb21wYXJlcyBpdCBhZ2FpbnN0IHRoZSB0aGUgbWFwJ3MgY3VycmVudFxuICAgICAqIHN0YXRlIGFuZCBwZXJmb3JtIG9ubHkgdGhlIGNoYW5nZXMgbmVjZXNzYXJ5IHRvIG1ha2UgdGhlIG1hcCBzdHlsZSBtYXRjaFxuICAgICAqIHRoZSBkZXNpcmVkIHN0YXRlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R8c3RyaW5nfSBzdHlsZSBBIEpTT04gb2JqZWN0IGNvbmZvcm1pbmcgdG8gdGhlIHNjaGVtYSBkZXNjcmliZWQgaW4gdGhlXG4gICAgICogICBbTWFwYm94IFN0eWxlIFNwZWNpZmljYXRpb25dKGh0dHBzOi8vbWFwYm94LmNvbS9tYXBib3gtZ2wtc3R5bGUtc3BlYy8pLCBvciBhIFVSTCB0byBzdWNoIEpTT04uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuZGlmZj10cnVlXSBJZiBmYWxzZSwgZm9yY2UgYSAnZnVsbCcgdXBkYXRlLCByZW1vdmluZyB0aGUgY3VycmVudCBzdHlsZVxuICAgICAqICAgYW5kIGFkZGluZyBidWlsZGluZyB0aGUgZ2l2ZW4gb25lIGluc3RlYWQgb2YgYXR0ZW1wdGluZyBhIGRpZmYtYmFzZWQgdXBkYXRlLlxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqIEBzZWUgW0NoYW5nZSBhIG1hcCdzIHN0eWxlXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3NldHN0eWxlLylcbiAgICAgKi9cbiAgICBzZXRTdHlsZShzdHlsZSwgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBzaG91bGRUcnlEaWZmID0gKCFvcHRpb25zIHx8IG9wdGlvbnMuZGlmZiAhPT0gZmFsc2UpICYmIHRoaXMuc3R5bGUgJiYgc3R5bGUgJiZcbiAgICAgICAgICAgICEoc3R5bGUgaW5zdGFuY2VvZiBTdHlsZSkgJiYgdHlwZW9mIHN0eWxlICE9PSAnc3RyaW5nJztcbiAgICAgICAgaWYgKHNob3VsZFRyeURpZmYpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc3R5bGUuc2V0U3RhdGUoc3R5bGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgdXRpbC53YXJuT25jZShgVW5hYmxlIHRvIHBlcmZvcm0gc3R5bGUgZGlmZjogJHtlLm1lc3NhZ2UgfHwgZS5lcnJvciB8fCBlfS4gIFJlYnVpbGRpbmcgdGhlIHN0eWxlIGZyb20gc2NyYXRjaC5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnN0eWxlKSB7XG4gICAgICAgICAgICB0aGlzLnN0eWxlLnNldEV2ZW50ZWRQYXJlbnQobnVsbCk7XG4gICAgICAgICAgICB0aGlzLnN0eWxlLl9yZW1vdmUoKTtcbiAgICAgICAgICAgIHRoaXMub2ZmKCdyb3RhdGUnLCB0aGlzLnN0eWxlLl9yZWRvUGxhY2VtZW50KTtcbiAgICAgICAgICAgIHRoaXMub2ZmKCdwaXRjaCcsIHRoaXMuc3R5bGUuX3JlZG9QbGFjZW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFzdHlsZSkge1xuICAgICAgICAgICAgdGhpcy5zdHlsZSA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSBlbHNlIGlmIChzdHlsZSBpbnN0YW5jZW9mIFN0eWxlKSB7XG4gICAgICAgICAgICB0aGlzLnN0eWxlID0gc3R5bGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnN0eWxlID0gbmV3IFN0eWxlKHN0eWxlLCB0aGlzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc3R5bGUuc2V0RXZlbnRlZFBhcmVudCh0aGlzLCB7c3R5bGU6IHRoaXMuc3R5bGV9KTtcblxuICAgICAgICB0aGlzLm9uKCdyb3RhdGUnLCB0aGlzLnN0eWxlLl9yZWRvUGxhY2VtZW50KTtcbiAgICAgICAgdGhpcy5vbigncGl0Y2gnLCB0aGlzLnN0eWxlLl9yZWRvUGxhY2VtZW50KTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBtYXAncyBNYXBib3ggc3R5bGUgb2JqZWN0LCB3aGljaCBjYW4gYmUgdXNlZCB0byByZWNyZWF0ZSB0aGUgbWFwJ3Mgc3R5bGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgbWFwJ3Mgc3R5bGUgb2JqZWN0LlxuICAgICAqL1xuICAgIGdldFN0eWxlKCkge1xuICAgICAgICBpZiAodGhpcy5zdHlsZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGUuc2VyaWFsaXplKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgc291cmNlIHRvIHRoZSBtYXAncyBzdHlsZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpZCBUaGUgSUQgb2YgdGhlIHNvdXJjZSB0byBhZGQuIE11c3Qgbm90IGNvbmZsaWN0IHdpdGggZXhpc3Rpbmcgc291cmNlcy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0LCBjb25mb3JtaW5nIHRvIHRoZVxuICAgICAqIE1hcGJveCBTdHlsZSBTcGVjaWZpY2F0aW9uJ3MgW3NvdXJjZSBkZWZpbml0aW9uXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1zdHlsZS1zcGVjLyNzb3VyY2VzKS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc291cmNlLnR5cGUgVGhlIHNvdXJjZSB0eXBlLCB3aGljaCBtdXN0IGJlIGVpdGhlciBvbmUgb2YgdGhlIGNvcmUgTWFwYm94IEdMIHNvdXJjZSB0eXBlcyBkZWZpbmVkIGluIHRoZSBzdHlsZSBzcGVjaWZpY2F0aW9uIG9yIGEgY3VzdG9tIHR5cGUgdGhhdCBoYXMgYmVlbiBhZGRlZCB0byB0aGUgbWFwIHdpdGgge0BsaW5rIE1hcCNhZGRTb3VyY2VUeXBlfS5cbiAgICAgKiBAZmlyZXMgc291cmNlLmFkZFxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqIEBzZWUgW0RyYXcgR2VvSlNPTiBwb2ludHNdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvZ2VvanNvbi1tYXJrZXJzLylcbiAgICAgKiBAc2VlIFtTdHlsZSBjaXJjbGVzIHVzaW5nIGRhdGEtZHJpdmVuIHN0eWxpbmddKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvZGF0YS1kcml2ZW4tY2lyY2xlLWNvbG9ycy8pXG4gICAgICogQHNlZSBbU2V0IGEgcG9pbnQgYWZ0ZXIgR2VvY29kZXIgcmVzdWx0XShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3BvaW50LWZyb20tZ2VvY29kZXItcmVzdWx0LylcbiAgICAgKi9cbiAgICBhZGRTb3VyY2UoaWQsIHNvdXJjZSkge1xuICAgICAgICB0aGlzLnN0eWxlLmFkZFNvdXJjZShpZCwgc291cmNlKTtcbiAgICAgICAgdGhpcy5fdXBkYXRlKHRydWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHNvdXJjZSBpcyBsb2FkZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgVGhlIElEIG9mIHRoZSBzb3VyY2UgdG8gYmUgY2hlY2tlZC5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gQSBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgc291cmNlIGlzIGxvYWRlZC5cbiAgICAgKi9cbiAgICBpc1NvdXJjZUxvYWRlZChpZCkge1xuICAgICAgICBjb25zdCBzb3VyY2UgPSB0aGlzLnN0eWxlICYmIHRoaXMuc3R5bGUuc291cmNlQ2FjaGVzW2lkXTtcbiAgICAgICAgaWYgKHNvdXJjZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUoJ2Vycm9yJywge1xuICAgICAgICAgICAgICAgIGVycm9yOiBuZXcgRXJyb3IoYFRoZXJlIGlzIG5vIHNvdXJjZSB3aXRoIElEICcke2lkfSdgKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNvdXJjZS5sb2FkZWQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgW2N1c3RvbSBzb3VyY2UgdHlwZV0oI0N1c3RvbSBTb3VyY2VzKSwgbWFraW5nIGl0IGF2YWlsYWJsZSBmb3IgdXNlIHdpdGhcbiAgICAgKiB7QGxpbmsgTWFwI2FkZFNvdXJjZX0uXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgc291cmNlIHR5cGU7IHNvdXJjZSBkZWZpbml0aW9uIG9iamVjdHMgdXNlIHRoaXMgbmFtZSBpbiB0aGUgYHt0eXBlOiAuLi59YCBmaWVsZC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBTb3VyY2VUeXBlIEEge0BsaW5rIFNvdXJjZX0gY29uc3RydWN0b3IuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIHdoZW4gdGhlIHNvdXJjZSB0eXBlIGlzIHJlYWR5IG9yIHdpdGggYW4gZXJyb3IgYXJndW1lbnQgaWYgdGhlcmUgaXMgYW4gZXJyb3IuXG4gICAgICovXG4gICAgYWRkU291cmNlVHlwZShuYW1lLCBTb3VyY2VUeXBlLCBjYWxsYmFjaykge1xuICAgICAgICByZXR1cm4gdGhpcy5zdHlsZS5hZGRTb3VyY2VUeXBlKG5hbWUsIFNvdXJjZVR5cGUsIGNhbGxiYWNrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEgc291cmNlIGZyb20gdGhlIG1hcCdzIHN0eWxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIFRoZSBJRCBvZiB0aGUgc291cmNlIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcbiAgICAgKi9cbiAgICByZW1vdmVTb3VyY2UoaWQpIHtcbiAgICAgICAgdGhpcy5zdHlsZS5yZW1vdmVTb3VyY2UoaWQpO1xuICAgICAgICB0aGlzLl91cGRhdGUodHJ1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHNvdXJjZSB3aXRoIHRoZSBzcGVjaWZpZWQgSUQgaW4gdGhlIG1hcCdzIHN0eWxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIFRoZSBJRCBvZiB0aGUgc291cmNlIHRvIGdldC5cbiAgICAgKiBAcmV0dXJucyB7P09iamVjdH0gVGhlIHN0eWxlIHNvdXJjZSB3aXRoIHRoZSBzcGVjaWZpZWQgSUQsIG9yIGB1bmRlZmluZWRgXG4gICAgICogICBpZiB0aGUgSUQgY29ycmVzcG9uZHMgdG8gbm8gZXhpc3Rpbmcgc291cmNlcy5cbiAgICAgKiBAc2VlIFtDcmVhdGUgYSBkcmFnZ2FibGUgcG9pbnRdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvZHJhZy1hLXBvaW50LylcbiAgICAgKiBAc2VlIFtBbmltYXRlIGEgcG9pbnRdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvYW5pbWF0ZS1wb2ludC1hbG9uZy1saW5lLylcbiAgICAgKiBAc2VlIFtBZGQgbGl2ZSByZWFsdGltZSBkYXRhXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2xpdmUtZ2VvanNvbi8pXG4gICAgICovXG4gICAgZ2V0U291cmNlKGlkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0eWxlLmdldFNvdXJjZShpZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIFtNYXBib3ggc3R5bGUgbGF5ZXJdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLXN0eWxlLXNwZWMvI2xheWVycylcbiAgICAgKiB0byB0aGUgbWFwJ3Mgc3R5bGUuXG4gICAgICpcbiAgICAgKiBBIGxheWVyIGRlZmluZXMgc3R5bGluZyBmb3IgZGF0YSBmcm9tIGEgc3BlY2lmaWVkIHNvdXJjZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBsYXllciBUaGUgc3R5bGUgbGF5ZXIgdG8gYWRkLCBjb25mb3JtaW5nIHRvIHRoZSBNYXBib3ggU3R5bGUgU3BlY2lmaWNhdGlvbidzXG4gICAgICogICBbbGF5ZXIgZGVmaW5pdGlvbl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtc3R5bGUtc3BlYy8jbGF5ZXJzKS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2JlZm9yZV0gVGhlIElEIG9mIGFuIGV4aXN0aW5nIGxheWVyIHRvIGluc2VydCB0aGUgbmV3IGxheWVyIGJlZm9yZS5cbiAgICAgKiAgIElmIHRoaXMgYXJndW1lbnQgaXMgb21pdHRlZCwgdGhlIGxheWVyIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIGVuZCBvZiB0aGUgbGF5ZXJzIGFycmF5LlxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqIEBzZWUgW0NyZWF0ZSBhbmQgc3R5bGUgY2x1c3RlcnNdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvY2x1c3Rlci8pXG4gICAgICogQHNlZSBbQWRkIGEgdmVjdG9yIHRpbGUgc291cmNlXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3ZlY3Rvci1zb3VyY2UvKVxuICAgICAqIEBzZWUgW0FkZCBhIFdNUyBzb3VyY2VdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvd21zLylcbiAgICAgKi9cbiAgICBhZGRMYXllcihsYXllciwgYmVmb3JlKSB7XG4gICAgICAgIHRoaXMuc3R5bGUuYWRkTGF5ZXIobGF5ZXIsIGJlZm9yZSk7XG4gICAgICAgIHRoaXMuX3VwZGF0ZSh0cnVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTW92ZXMgYSBsYXllciB0byBhIGRpZmZlcmVudCB6LXBvc2l0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIFRoZSBJRCBvZiB0aGUgbGF5ZXIgdG8gbW92ZS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2JlZm9yZUlkXSBUaGUgSUQgb2YgYW4gZXhpc3RpbmcgbGF5ZXIgdG8gaW5zZXJ0IHRoZSBuZXcgbGF5ZXIgYmVmb3JlLlxuICAgICAqICAgSWYgdGhpcyBhcmd1bWVudCBpcyBvbWl0dGVkLCB0aGUgbGF5ZXIgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgZW5kIG9mIHRoZSBsYXllcnMgYXJyYXkuXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICovXG4gICAgbW92ZUxheWVyKGlkLCBiZWZvcmVJZCkge1xuICAgICAgICB0aGlzLnN0eWxlLm1vdmVMYXllcihpZCwgYmVmb3JlSWQpO1xuICAgICAgICB0aGlzLl91cGRhdGUodHJ1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYSBsYXllciBmcm9tIHRoZSBtYXAncyBzdHlsZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpZCBUaGUgSUQgb2YgdGhlIGxheWVyIHRvIHJlbW92ZS5cbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gaWYgbm8gbGF5ZXIgd2l0aCB0aGUgc3BlY2lmaWVkIGBpZGAgZXhpc3RzLlxuICAgICAqIEByZXR1cm5zIHtNYXB9IGB0aGlzYFxuICAgICAqL1xuICAgIHJlbW92ZUxheWVyKGlkKSB7XG4gICAgICAgIHRoaXMuc3R5bGUucmVtb3ZlTGF5ZXIoaWQpO1xuICAgICAgICB0aGlzLl91cGRhdGUodHJ1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGxheWVyIHdpdGggdGhlIHNwZWNpZmllZCBJRCBpbiB0aGUgbWFwJ3Mgc3R5bGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgVGhlIElEIG9mIHRoZSBsYXllciB0byBnZXQuXG4gICAgICogQHJldHVybnMgez9PYmplY3R9IFRoZSBsYXllciB3aXRoIHRoZSBzcGVjaWZpZWQgSUQsIG9yIGB1bmRlZmluZWRgXG4gICAgICogICBpZiB0aGUgSUQgY29ycmVzcG9uZHMgdG8gbm8gZXhpc3RpbmcgbGF5ZXJzLlxuICAgICAqIEBzZWUgW0ZpbHRlciBzeW1ib2xzIGJ5IHRvZ2dsaW5nIGEgbGlzdF0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9maWx0ZXItbWFya2Vycy8pXG4gICAgICogQHNlZSBbRmlsdGVyIHN5bWJvbHMgYnkgdGV4dCBpbnB1dF0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9maWx0ZXItbWFya2Vycy1ieS1pbnB1dC8pXG4gICAgICovXG4gICAgZ2V0TGF5ZXIoaWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGUuZ2V0TGF5ZXIoaWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGZpbHRlciBmb3IgdGhlIHNwZWNpZmllZCBzdHlsZSBsYXllci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsYXllciBUaGUgSUQgb2YgdGhlIGxheWVyIHRvIHdoaWNoIHRoZSBmaWx0ZXIgd2lsbCBiZSBhcHBsaWVkLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGZpbHRlciBUaGUgZmlsdGVyLCBjb25mb3JtaW5nIHRvIHRoZSBNYXBib3ggU3R5bGUgU3BlY2lmaWNhdGlvbidzXG4gICAgICogICBbZmlsdGVyIGRlZmluaXRpb25dKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLXN0eWxlLXNwZWMvI3R5cGVzLWZpbHRlcikuXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBtYXAuc2V0RmlsdGVyKCdteS1sYXllcicsIFsnPT0nLCAnbmFtZScsICdVU0EnXSk7XG4gICAgICogQHNlZSBbRmlsdGVyIGZlYXR1cmVzIHdpdGhpbiBtYXAgdmlld10oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9maWx0ZXItZmVhdHVyZXMtd2l0aGluLW1hcC12aWV3LylcbiAgICAgKiBAc2VlIFtIaWdobGlnaHQgZmVhdHVyZXMgY29udGFpbmluZyBzaW1pbGFyIGRhdGFdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvcXVlcnktc2ltaWxhci1mZWF0dXJlcy8pXG4gICAgICogQHNlZSBbQ3JlYXRlIGEgdGltZWxpbmUgYW5pbWF0aW9uXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3RpbWVsaW5lLWFuaW1hdGlvbi8pXG4gICAgICovXG4gICAgc2V0RmlsdGVyKGxheWVyLCBmaWx0ZXIpIHtcbiAgICAgICAgdGhpcy5zdHlsZS5zZXRGaWx0ZXIobGF5ZXIsIGZpbHRlcik7XG4gICAgICAgIHRoaXMuX3VwZGF0ZSh0cnVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgem9vbSBleHRlbnQgZm9yIHRoZSBzcGVjaWZpZWQgc3R5bGUgbGF5ZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbGF5ZXJJZCBUaGUgSUQgb2YgdGhlIGxheWVyIHRvIHdoaWNoIHRoZSB6b29tIGV4dGVudCB3aWxsIGJlIGFwcGxpZWQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG1pbnpvb20gVGhlIG1pbmltdW0gem9vbSB0byBzZXQgKDAtMjApLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtYXh6b29tIFRoZSBtYXhpbXVtIHpvb20gdG8gc2V0ICgwLTIwKS5cbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcC5zZXRMYXllclpvb21SYW5nZSgnbXktbGF5ZXInLCAyLCA1KTtcbiAgICAgKi9cbiAgICBzZXRMYXllclpvb21SYW5nZShsYXllcklkLCBtaW56b29tLCBtYXh6b29tKSB7XG4gICAgICAgIHRoaXMuc3R5bGUuc2V0TGF5ZXJab29tUmFuZ2UobGF5ZXJJZCwgbWluem9vbSwgbWF4em9vbSk7XG4gICAgICAgIHRoaXMuX3VwZGF0ZSh0cnVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgZmlsdGVyIGFwcGxpZWQgdG8gdGhlIHNwZWNpZmllZCBzdHlsZSBsYXllci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsYXllciBUaGUgSUQgb2YgdGhlIHN0eWxlIGxheWVyIHdob3NlIGZpbHRlciB0byBnZXQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBUaGUgbGF5ZXIncyBmaWx0ZXIuXG4gICAgICovXG4gICAgZ2V0RmlsdGVyKGxheWVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0eWxlLmdldEZpbHRlcihsYXllcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgYSBwYWludCBwcm9wZXJ0eSBpbiB0aGUgc3BlY2lmaWVkIHN0eWxlIGxheWVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxheWVyIFRoZSBJRCBvZiB0aGUgbGF5ZXIgdG8gc2V0IHRoZSBwYWludCBwcm9wZXJ0eSBpbi5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcGFpbnQgcHJvcGVydHkgdG8gc2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBwYWludCBwcm9wZXJ5IHRvIHNldC5cbiAgICAgKiAgIE11c3QgYmUgb2YgYSB0eXBlIGFwcHJvcHJpYXRlIGZvciB0aGUgcHJvcGVydHksIGFzIGRlZmluZWQgaW4gdGhlIFtNYXBib3ggU3R5bGUgU3BlY2lmaWNhdGlvbl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtc3R5bGUtc3BlYy8pLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nPX0ga2xhc3MgQSBzdHlsZSBjbGFzcyBzcGVjaWZpZXIgZm9yIHRoZSBwYWludCBwcm9wZXJ0eS5cbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcC5zZXRQYWludFByb3BlcnR5KCdteS1sYXllcicsICdmaWxsLWNvbG9yJywgJyNmYWFmZWUnKTtcbiAgICAgKiBAc2VlIFtDaGFuZ2UgYSBsYXllcidzIGNvbG9yIHdpdGggYnV0dG9uc10oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9jb2xvci1zd2l0Y2hlci8pXG4gICAgICogQHNlZSBbQWRqdXN0IGEgbGF5ZXIncyBvcGFjaXR5XShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2FkanVzdC1sYXllci1vcGFjaXR5LylcbiAgICAgKiBAc2VlIFtDcmVhdGUgYSBkcmFnZ2FibGUgcG9pbnRdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvZHJhZy1hLXBvaW50LylcbiAgICAgKi9cbiAgICBzZXRQYWludFByb3BlcnR5KGxheWVyLCBuYW1lLCB2YWx1ZSwga2xhc3MpIHtcbiAgICAgICAgdGhpcy5zdHlsZS5zZXRQYWludFByb3BlcnR5KGxheWVyLCBuYW1lLCB2YWx1ZSwga2xhc3MpO1xuICAgICAgICB0aGlzLl91cGRhdGUodHJ1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIGEgcGFpbnQgcHJvcGVydHkgaW4gdGhlIHNwZWNpZmllZCBzdHlsZSBsYXllci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsYXllciBUaGUgSUQgb2YgdGhlIGxheWVyIHRvIGdldCB0aGUgcGFpbnQgcHJvcGVydHkgZnJvbS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiBhIHBhaW50IHByb3BlcnR5IHRvIGdldC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZz19IGtsYXNzIEEgY2xhc3Mgc3BlY2lmaWVyIGZvciB0aGUgcGFpbnQgcHJvcGVydHkuXG4gICAgICogQHJldHVybnMgeyp9IFRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHBhaW50IHByb3BlcnR5LlxuICAgICAqL1xuICAgIGdldFBhaW50UHJvcGVydHkobGF5ZXIsIG5hbWUsIGtsYXNzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0eWxlLmdldFBhaW50UHJvcGVydHkobGF5ZXIsIG5hbWUsIGtsYXNzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiBhIGxheW91dCBwcm9wZXJ0eSBpbiB0aGUgc3BlY2lmaWVkIHN0eWxlIGxheWVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxheWVyIFRoZSBJRCBvZiB0aGUgbGF5ZXIgdG8gc2V0IHRoZSBsYXlvdXQgcHJvcGVydHkgaW4uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIGxheW91dCBwcm9wZXJ0eSB0byBzZXQuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIGxheW91dCBwcm9wZXJ5LiBNdXN0IGJlIG9mIGEgdHlwZSBhcHByb3ByaWF0ZSBmb3IgdGhlIHByb3BlcnR5LCBhcyBkZWZpbmVkIGluIHRoZSBbTWFwYm94IFN0eWxlIFNwZWNpZmljYXRpb25dKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLXN0eWxlLXNwZWMvKS5cbiAgICAgKiBAcmV0dXJucyB7TWFwfSBgdGhpc2BcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIG1hcC5zZXRMYXlvdXRQcm9wZXJ0eSgnbXktbGF5ZXInLCAndmlzaWJpbGl0eScsICdub25lJyk7XG4gICAgICovXG4gICAgc2V0TGF5b3V0UHJvcGVydHkobGF5ZXIsIG5hbWUsIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuc3R5bGUuc2V0TGF5b3V0UHJvcGVydHkobGF5ZXIsIG5hbWUsIHZhbHVlKTtcbiAgICAgICAgdGhpcy5fdXBkYXRlKHRydWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiBhIGxheW91dCBwcm9wZXJ0eSBpbiB0aGUgc3BlY2lmaWVkIHN0eWxlIGxheWVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxheWVyIFRoZSBJRCBvZiB0aGUgbGF5ZXIgdG8gZ2V0IHRoZSBsYXlvdXQgcHJvcGVydHkgZnJvbS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgbGF5b3V0IHByb3BlcnR5IHRvIGdldC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gVGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgbGF5b3V0IHByb3BlcnR5LlxuICAgICAqL1xuICAgIGdldExheW91dFByb3BlcnR5KGxheWVyLCBuYW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0eWxlLmdldExheW91dFByb3BlcnR5KGxheWVyLCBuYW1lKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBhbnkgY29tYmluYXRpb24gb2YgbGlnaHQgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgTGlnaHQgcHJvcGVydGllcyB0byBzZXQuIE11c3QgY29uZm9ybSB0byB0aGUgW01hcGJveCBTdHlsZSBTcGVjaWZpY2F0aW9uXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1zdHlsZS1zcGVjLykuXG4gICAgICogQHJldHVybnMge01hcH0gYHRoaXNgXG4gICAgICovXG4gICAgc2V0TGlnaHQobGlnaHRPcHRpb25zKSB7XG4gICAgICAgIHRoaXMuc3R5bGUuc2V0TGlnaHQobGlnaHRPcHRpb25zKTtcbiAgICAgICAgdGhpcy5fdXBkYXRlKHRydWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgbGlnaHQgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHJldHVybnMge09iamVjdH0gbGlnaHQgTGlnaHQgcHJvcGVydGllcyBvZiB0aGUgc3R5bGUuXG4gICAgICovXG4gICAgZ2V0TGlnaHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0eWxlLmdldExpZ2h0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbWFwJ3MgY29udGFpbmluZyBIVE1MIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnR9IFRoZSBtYXAncyBjb250YWluZXIuXG4gICAgICovXG4gICAgZ2V0Q29udGFpbmVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29udGFpbmVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIEhUTUwgZWxlbWVudCBjb250YWluaW5nIHRoZSBtYXAncyBgPGNhbnZhcz5gIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBJZiB5b3Ugd2FudCB0byBhZGQgbm9uLUdMIG92ZXJsYXlzIHRvIHRoZSBtYXAsIHlvdSBzaG91bGQgYXBwZW5kIHRoZW0gdG8gdGhpcyBlbGVtZW50LlxuICAgICAqXG4gICAgICogVGhpcyBpcyB0aGUgZWxlbWVudCB0byB3aGljaCBldmVudCBiaW5kaW5ncyBmb3IgbWFwIGludGVyYWN0aXZpdHkgKHN1Y2ggYXMgcGFubmluZyBhbmQgem9vbWluZykgYXJlXG4gICAgICogYXR0YWNoZWQuIEl0IHdpbGwgcmVjZWl2ZSBidWJibGVkIGV2ZW50cyBmcm9tIGNoaWxkIGVsZW1lbnRzIHN1Y2ggYXMgdGhlIGA8Y2FudmFzPmAsIGJ1dCBub3QgZnJvbVxuICAgICAqIG1hcCBjb250cm9scy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtIVE1MRWxlbWVudH0gVGhlIGNvbnRhaW5lciBvZiB0aGUgbWFwJ3MgYDxjYW52YXM+YC5cbiAgICAgKiBAc2VlIFtDcmVhdGUgYSBkcmFnZ2FibGUgcG9pbnRdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvZHJhZy1hLXBvaW50LylcbiAgICAgKiBAc2VlIFtIaWdobGlnaHQgZmVhdHVyZXMgd2l0aGluIGEgYm91bmRpbmcgYm94XShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3VzaW5nLWJveC1xdWVyeXJlbmRlcmVkZmVhdHVyZXMvKVxuICAgICAqL1xuICAgIGdldENhbnZhc0NvbnRhaW5lcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhbnZhc0NvbnRhaW5lcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBtYXAncyBgPGNhbnZhcz5gIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7SFRNTENhbnZhc0VsZW1lbnR9IFRoZSBtYXAncyBgPGNhbnZhcz5gIGVsZW1lbnQuXG4gICAgICogQHNlZSBbTWVhc3VyZSBkaXN0YW5jZXNdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvbWVhc3VyZS8pXG4gICAgICogQHNlZSBbRGlzcGxheSBhIHBvcHVwIG9uIGhvdmVyXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3BvcHVwLW9uLWhvdmVyLylcbiAgICAgKiBAc2VlIFtDZW50ZXIgdGhlIG1hcCBvbiBhIGNsaWNrZWQgc3ltYm9sXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2NlbnRlci1vbi1zeW1ib2wvKVxuICAgICAqL1xuICAgIGdldENhbnZhcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhbnZhcztcbiAgICB9XG5cbiAgICBfY29udGFpbmVyRGltZW5zaW9ucygpIHtcbiAgICAgICAgbGV0IHdpZHRoID0gMDtcbiAgICAgICAgbGV0IGhlaWdodCA9IDA7XG5cbiAgICAgICAgaWYgKHRoaXMuX2NvbnRhaW5lcikge1xuICAgICAgICAgICAgd2lkdGggPSB0aGlzLl9jb250YWluZXIub2Zmc2V0V2lkdGggfHwgNDAwO1xuICAgICAgICAgICAgaGVpZ2h0ID0gdGhpcy5fY29udGFpbmVyLm9mZnNldEhlaWdodCB8fCAzMDA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW3dpZHRoLCBoZWlnaHRdO1xuICAgIH1cblxuICAgIF9zZXR1cENvbnRhaW5lcigpIHtcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5fY29udGFpbmVyO1xuICAgICAgICBjb250YWluZXIuY2xhc3NMaXN0LmFkZCgnbWFwYm94Z2wtbWFwJyk7XG5cbiAgICAgICAgY29uc3QgY2FudmFzQ29udGFpbmVyID0gdGhpcy5fY2FudmFzQ29udGFpbmVyID0gRE9NLmNyZWF0ZSgnZGl2JywgJ21hcGJveGdsLWNhbnZhcy1jb250YWluZXInLCBjb250YWluZXIpO1xuICAgICAgICBpZiAodGhpcy5faW50ZXJhY3RpdmUpIHtcbiAgICAgICAgICAgIGNhbnZhc0NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC1pbnRlcmFjdGl2ZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY2FudmFzID0gRE9NLmNyZWF0ZSgnY2FudmFzJywgJ21hcGJveGdsLWNhbnZhcycsIGNhbnZhc0NvbnRhaW5lcik7XG4gICAgICAgIHRoaXMuX2NhbnZhcy5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgICAgIHRoaXMuX2NhbnZhcy5hZGRFdmVudExpc3RlbmVyKCd3ZWJnbGNvbnRleHRsb3N0JywgdGhpcy5fY29udGV4dExvc3QsIGZhbHNlKTtcbiAgICAgICAgdGhpcy5fY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoJ3dlYmdsY29udGV4dHJlc3RvcmVkJywgdGhpcy5fY29udGV4dFJlc3RvcmVkLCBmYWxzZSk7XG4gICAgICAgIHRoaXMuX2NhbnZhcy5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgMCk7XG4gICAgICAgIHRoaXMuX2NhbnZhcy5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCAnTWFwJyk7XG5cbiAgICAgICAgY29uc3QgZGltZW5zaW9ucyA9IHRoaXMuX2NvbnRhaW5lckRpbWVuc2lvbnMoKTtcbiAgICAgICAgdGhpcy5fcmVzaXplQ2FudmFzKGRpbWVuc2lvbnNbMF0sIGRpbWVuc2lvbnNbMV0pO1xuXG4gICAgICAgIGNvbnN0IGNvbnRyb2xDb250YWluZXIgPSB0aGlzLl9jb250cm9sQ29udGFpbmVyID0gRE9NLmNyZWF0ZSgnZGl2JywgJ21hcGJveGdsLWNvbnRyb2wtY29udGFpbmVyJywgY29udGFpbmVyKTtcbiAgICAgICAgY29uc3QgcG9zaXRpb25zID0gdGhpcy5fY29udHJvbFBvc2l0aW9ucyA9IHt9O1xuICAgICAgICBbJ3RvcC1sZWZ0JywgJ3RvcC1yaWdodCcsICdib3R0b20tbGVmdCcsICdib3R0b20tcmlnaHQnXS5mb3JFYWNoKChwb3NpdGlvbk5hbWUpID0+IHtcbiAgICAgICAgICAgIHBvc2l0aW9uc1twb3NpdGlvbk5hbWVdID0gRE9NLmNyZWF0ZSgnZGl2JywgYG1hcGJveGdsLWN0cmwtJHtwb3NpdGlvbk5hbWV9YCwgY29udHJvbENvbnRhaW5lcik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9yZXNpemVDYW52YXMod2lkdGgsIGhlaWdodCkge1xuICAgICAgICBjb25zdCBwaXhlbFJhdGlvID0gd2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMTtcblxuICAgICAgICAvLyBSZXF1ZXN0IHRoZSByZXF1aXJlZCBjYW52YXMgc2l6ZSB0YWtpbmcgdGhlIHBpeGVscmF0aW8gaW50byBhY2NvdW50LlxuICAgICAgICB0aGlzLl9jYW52YXMud2lkdGggPSBwaXhlbFJhdGlvICogd2lkdGg7XG4gICAgICAgIHRoaXMuX2NhbnZhcy5oZWlnaHQgPSBwaXhlbFJhdGlvICogaGVpZ2h0O1xuXG4gICAgICAgIC8vIE1haW50YWluIHRoZSBzYW1lIGNhbnZhcyBzaXplLCBwb3RlbnRpYWxseSBkb3duc2NhbGluZyBpdCBmb3IgSGlEUEkgZGlzcGxheXNcbiAgICAgICAgdGhpcy5fY2FudmFzLnN0eWxlLndpZHRoID0gYCR7d2lkdGh9cHhgO1xuICAgICAgICB0aGlzLl9jYW52YXMuc3R5bGUuaGVpZ2h0ID0gYCR7aGVpZ2h0fXB4YDtcbiAgICB9XG5cbiAgICBfc2V0dXBQYWludGVyKCkge1xuICAgICAgICBjb25zdCBhdHRyaWJ1dGVzID0gdXRpbC5leHRlbmQoe1xuICAgICAgICAgICAgZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdDogdGhpcy5fZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdCxcbiAgICAgICAgICAgIHByZXNlcnZlRHJhd2luZ0J1ZmZlcjogdGhpcy5fcHJlc2VydmVEcmF3aW5nQnVmZmVyXG4gICAgICAgIH0sIGlzU3VwcG9ydGVkLndlYkdMQ29udGV4dEF0dHJpYnV0ZXMpO1xuXG4gICAgICAgIGNvbnN0IGdsID0gdGhpcy5fY2FudmFzLmdldENvbnRleHQoJ3dlYmdsJywgYXR0cmlidXRlcykgfHxcbiAgICAgICAgICAgIHRoaXMuX2NhbnZhcy5nZXRDb250ZXh0KCdleHBlcmltZW50YWwtd2ViZ2wnLCBhdHRyaWJ1dGVzKTtcblxuICAgICAgICBpZiAoIWdsKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmUoJ2Vycm9yJywgeyBlcnJvcjogbmV3IEVycm9yKCdGYWlsZWQgdG8gaW5pdGlhbGl6ZSBXZWJHTCcpIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wYWludGVyID0gbmV3IFBhaW50ZXIoZ2wsIHRoaXMudHJhbnNmb3JtKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIHRoZSBXZWJHTCBjb250ZXh0IGlzIGxvc3QuXG4gICAgICpcbiAgICAgKiBAZXZlbnQgd2ViZ2xjb250ZXh0bG9zdFxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAqIEBwcm9wZXJ0eSB7V2ViR0xDb250ZXh0RXZlbnR9IG9yaWdpbmFsRXZlbnQgVGhlIG9yaWdpbmFsIERPTSBldmVudC5cbiAgICAgKi9cbiAgICBfY29udGV4dExvc3QoZXZlbnQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgaWYgKHRoaXMuX2ZyYW1lSWQpIHtcbiAgICAgICAgICAgIGJyb3dzZXIuY2FuY2VsRnJhbWUodGhpcy5fZnJhbWVJZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maXJlKCd3ZWJnbGNvbnRleHRsb3N0Jywge29yaWdpbmFsRXZlbnQ6IGV2ZW50fSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiB0aGUgV2ViR0wgY29udGV4dCBpcyByZXN0b3JlZC5cbiAgICAgKlxuICAgICAqIEBldmVudCB3ZWJnbGNvbnRleHRyZXN0b3JlZFxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAqIEBwcm9wZXJ0eSB7V2ViR0xDb250ZXh0RXZlbnR9IG9yaWdpbmFsRXZlbnQgVGhlIG9yaWdpbmFsIERPTSBldmVudC5cbiAgICAgKi9cbiAgICBfY29udGV4dFJlc3RvcmVkKGV2ZW50KSB7XG4gICAgICAgIHRoaXMuX3NldHVwUGFpbnRlcigpO1xuICAgICAgICB0aGlzLnJlc2l6ZSgpO1xuICAgICAgICB0aGlzLl91cGRhdGUoKTtcbiAgICAgICAgdGhpcy5maXJlKCd3ZWJnbGNvbnRleHRyZXN0b3JlZCcsIHtvcmlnaW5hbEV2ZW50OiBldmVudH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgbWFwIGlzIGZ1bGx5IGxvYWRlZC5cbiAgICAgKlxuICAgICAqIFJldHVybnMgYGZhbHNlYCBpZiB0aGUgc3R5bGUgaXMgbm90IHlldCBmdWxseSBsb2FkZWQsXG4gICAgICogb3IgaWYgdGhlcmUgaGFzIGJlZW4gYSBjaGFuZ2UgdG8gdGhlIHNvdXJjZXMgb3Igc3R5bGUgdGhhdFxuICAgICAqIGhhcyBub3QgeWV0IGZ1bGx5IGxvYWRlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBBIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBtYXAgaXMgZnVsbHkgbG9hZGVkLlxuICAgICAqL1xuICAgIGxvYWRlZCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3N0eWxlRGlydHkgfHwgdGhpcy5fc291cmNlc0RpcnR5KVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoIXRoaXMuc3R5bGUgfHwgIXRoaXMuc3R5bGUubG9hZGVkKCkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGlzIG1hcCdzIHN0eWxlIGFuZCBzb3VyY2VzLCBhbmQgcmUtcmVuZGVyIHRoZSBtYXAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHVwZGF0ZVN0eWxlIG1hcmsgdGhlIG1hcCdzIHN0eWxlIGZvciByZXByb2Nlc3NpbmcgYXNcbiAgICAgKiB3ZWxsIGFzIGl0cyBzb3VyY2VzXG4gICAgICogQHJldHVybnMge01hcH0gdGhpc1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX3VwZGF0ZSh1cGRhdGVTdHlsZSkge1xuICAgICAgICBpZiAoIXRoaXMuc3R5bGUpIHJldHVybiB0aGlzO1xuXG4gICAgICAgIHRoaXMuX3N0eWxlRGlydHkgPSB0aGlzLl9zdHlsZURpcnR5IHx8IHVwZGF0ZVN0eWxlO1xuICAgICAgICB0aGlzLl9zb3VyY2VzRGlydHkgPSB0cnVlO1xuXG4gICAgICAgIHRoaXMuX3JlcmVuZGVyKCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsbCB3aGVuIGEgKHJlLSlyZW5kZXIgb2YgdGhlIG1hcCBpcyByZXF1aXJlZCwgZS5nLiB3aGVuIHRoZVxuICAgICAqIHVzZXIgcGFubmVkIG9yIHpvb21lZCxmIG9yIG5ldyBkYXRhIGlzIGF2YWlsYWJsZS5cbiAgICAgKiBAcmV0dXJucyB7TWFwfSB0aGlzXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfcmVuZGVyKCkge1xuICAgICAgICBpZiAodGhpcy5zdHlsZSAmJiB0aGlzLl9zdHlsZURpcnR5KSB7XG4gICAgICAgICAgICB0aGlzLl9zdHlsZURpcnR5ID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnN0eWxlLnVwZGF0ZSh0aGlzLl9jbGFzc2VzLCB0aGlzLl9jbGFzc09wdGlvbnMpO1xuICAgICAgICAgICAgdGhpcy5fY2xhc3NPcHRpb25zID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuc3R5bGUuX3JlY2FsY3VsYXRlKHRoaXMudHJhbnNmb3JtLnpvb20pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuc3R5bGUgJiYgdGhpcy5fc291cmNlc0RpcnR5KSB7XG4gICAgICAgICAgICB0aGlzLl9zb3VyY2VzRGlydHkgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuc3R5bGUuX3VwZGF0ZVNvdXJjZXModGhpcy50cmFuc2Zvcm0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wYWludGVyLnJlbmRlcih0aGlzLnN0eWxlLCB7XG4gICAgICAgICAgICBzaG93VGlsZUJvdW5kYXJpZXM6IHRoaXMuc2hvd1RpbGVCb3VuZGFyaWVzLFxuICAgICAgICAgICAgc2hvd092ZXJkcmF3SW5zcGVjdG9yOiB0aGlzLl9zaG93T3ZlcmRyYXdJbnNwZWN0b3IsXG4gICAgICAgICAgICByb3RhdGluZzogdGhpcy5yb3RhdGluZyxcbiAgICAgICAgICAgIHpvb21pbmc6IHRoaXMuem9vbWluZ1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmZpcmUoJ3JlbmRlcicpO1xuXG4gICAgICAgIGlmICh0aGlzLmxvYWRlZCgpICYmICF0aGlzLl9sb2FkZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmZpcmUoJ2xvYWQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2ZyYW1lSWQgPSBudWxsO1xuXG4gICAgICAgIGlmICghdGhpcy5hbmltYXRpb25Mb29wLnN0b3BwZWQoKSkge1xuICAgICAgICAgICAgdGhpcy5fc3R5bGVEaXJ0eSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fc291cmNlc0RpcnR5IHx8IHRoaXMuX3JlcGFpbnQgfHwgdGhpcy5fc3R5bGVEaXJ0eSkge1xuICAgICAgICAgICAgdGhpcy5fcmVyZW5kZXIoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc3Ryb3lzIHRoZSBtYXAncyB1bmRlcmx5aW5nIHJlc291cmNlcywgaW5jbHVkaW5nIHdlYiB3b3JrZXJzIGFuZCBET00gZWxlbWVudHMuXG4gICAgICpcbiAgICAgKiBBZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kLCB5b3UgbXVzdCBub3QgY2FsbCBhbnkgb3RoZXIgbWV0aG9kcyBvbiB0aGUgbWFwLlxuICAgICAqL1xuICAgIHJlbW92ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2hhc2gpIHRoaXMuX2hhc2gucmVtb3ZlKCk7XG4gICAgICAgIGJyb3dzZXIuY2FuY2VsRnJhbWUodGhpcy5fZnJhbWVJZCk7XG4gICAgICAgIHRoaXMuc2V0U3R5bGUobnVsbCk7XG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMuX29uV2luZG93UmVzaXplLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZXh0ZW5zaW9uID0gdGhpcy5wYWludGVyLmdsLmdldEV4dGVuc2lvbignV0VCR0xfbG9zZV9jb250ZXh0Jyk7XG4gICAgICAgIGlmIChleHRlbnNpb24pIGV4dGVuc2lvbi5sb3NlQ29udGV4dCgpO1xuICAgICAgICByZW1vdmVOb2RlKHRoaXMuX2NhbnZhc0NvbnRhaW5lcik7XG4gICAgICAgIHJlbW92ZU5vZGUodGhpcy5fY29udHJvbENvbnRhaW5lcik7XG4gICAgICAgIHRoaXMuX2NvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKCdtYXBib3hnbC1tYXAnKTtcbiAgICAgICAgdGhpcy5maXJlKCdyZW1vdmUnKTtcbiAgICB9XG5cbiAgICBfcmVyZW5kZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLnN0eWxlICYmICF0aGlzLl9mcmFtZUlkKSB7XG4gICAgICAgICAgICB0aGlzLl9mcmFtZUlkID0gYnJvd3Nlci5mcmFtZSh0aGlzLl9yZW5kZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX29uV2luZG93T25saW5lKCkge1xuICAgICAgICB0aGlzLl91cGRhdGUoKTtcbiAgICB9XG5cbiAgICBfb25XaW5kb3dSZXNpemUoKSB7XG4gICAgICAgIGlmICh0aGlzLl90cmFja1Jlc2l6ZSkge1xuICAgICAgICAgICAgdGhpcy5zdG9wKCkucmVzaXplKCkuX3VwZGF0ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhbmQgc2V0cyBhIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBtYXAgd2lsbCByZW5kZXIgYW4gb3V0bGluZVxuICAgICAqIGFyb3VuZCBlYWNoIHRpbGUuIFRoZXNlIHRpbGUgYm91bmRhcmllcyBhcmUgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuXG4gICAgICpcbiAgICAgKiBAbmFtZSBzaG93VGlsZUJvdW5kYXJpZXNcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAbWVtYmVyb2YgTWFwXG4gICAgICovXG4gICAgZ2V0IHNob3dUaWxlQm91bmRhcmllcygpIHsgcmV0dXJuICEhdGhpcy5fc2hvd1RpbGVCb3VuZGFyaWVzOyB9XG4gICAgc2V0IHNob3dUaWxlQm91bmRhcmllcyh2YWx1ZSkge1xuICAgICAgICBpZiAodGhpcy5fc2hvd1RpbGVCb3VuZGFyaWVzID09PSB2YWx1ZSkgcmV0dXJuO1xuICAgICAgICB0aGlzLl9zaG93VGlsZUJvdW5kYXJpZXMgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5fdXBkYXRlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhbmQgc2V0cyBhIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBtYXAgd2lsbCByZW5kZXIgYm94ZXNcbiAgICAgKiBhcm91bmQgYWxsIHN5bWJvbHMgaW4gdGhlIGRhdGEgc291cmNlLCByZXZlYWxpbmcgd2hpY2ggc3ltYm9sc1xuICAgICAqIHdlcmUgcmVuZGVyZWQgb3Igd2hpY2ggd2VyZSBoaWRkZW4gZHVlIHRvIGNvbGxpc2lvbnMuXG4gICAgICogVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZy5cbiAgICAgKlxuICAgICAqIEBuYW1lIHNob3dDb2xsaXNpb25Cb3hlc1xuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKi9cbiAgICBnZXQgc2hvd0NvbGxpc2lvbkJveGVzKCkgeyByZXR1cm4gISF0aGlzLl9zaG93Q29sbGlzaW9uQm94ZXM7IH1cbiAgICBzZXQgc2hvd0NvbGxpc2lvbkJveGVzKHZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLl9zaG93Q29sbGlzaW9uQm94ZXMgPT09IHZhbHVlKSByZXR1cm47XG4gICAgICAgIHRoaXMuX3Nob3dDb2xsaXNpb25Cb3hlcyA9IHZhbHVlO1xuICAgICAgICB0aGlzLnN0eWxlLl9yZWRvUGxhY2VtZW50KCk7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBHZXRzIGFuZCBzZXRzIGEgQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIG1hcCBzaG91bGQgY29sb3ItY29kZVxuICAgICAqIGVhY2ggZnJhZ21lbnQgdG8gc2hvdyBob3cgbWFueSB0aW1lcyBpdCBoYXMgYmVlbiBzaGFkZWQuXG4gICAgICogV2hpdGUgZnJhZ21lbnRzIGhhdmUgYmVlbiBzaGFkZWQgOCBvciBtb3JlIHRpbWVzLlxuICAgICAqIEJsYWNrIGZyYWdtZW50cyBoYXZlIGJlZW4gc2hhZGVkIDAgdGltZXMuXG4gICAgICogVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZy5cbiAgICAgKlxuICAgICAqIEBuYW1lIHNob3dPdmVyZHJhd1xuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBtZW1iZXJvZiBNYXBcbiAgICAgKi9cbiAgICBnZXQgc2hvd092ZXJkcmF3SW5zcGVjdG9yKCkgeyByZXR1cm4gISF0aGlzLl9zaG93T3ZlcmRyYXdJbnNwZWN0b3I7IH1cbiAgICBzZXQgc2hvd092ZXJkcmF3SW5zcGVjdG9yKHZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLl9zaG93T3ZlcmRyYXdJbnNwZWN0b3IgPT09IHZhbHVlKSByZXR1cm47XG4gICAgICAgIHRoaXMuX3Nob3dPdmVyZHJhd0luc3BlY3RvciA9IHZhbHVlO1xuICAgICAgICB0aGlzLl91cGRhdGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGFuZCBzZXRzIGEgQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIG1hcCB3aWxsXG4gICAgICogY29udGludW91c2x5IHJlcGFpbnQuIFRoaXMgaW5mb3JtYXRpb24gaXMgdXNlZnVsIGZvciBhbmFseXppbmcgcGVyZm9ybWFuY2UuXG4gICAgICpcbiAgICAgKiBAbmFtZSByZXBhaW50XG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQG1lbWJlcm9mIE1hcFxuICAgICAqL1xuICAgIGdldCByZXBhaW50KCkgeyByZXR1cm4gISF0aGlzLl9yZXBhaW50OyB9XG4gICAgc2V0IHJlcGFpbnQodmFsdWUpIHsgdGhpcy5fcmVwYWludCA9IHZhbHVlOyB0aGlzLl91cGRhdGUoKTsgfVxuXG4gICAgLy8gc2hvdyB2ZXJ0aWNlc1xuICAgIGdldCB2ZXJ0aWNlcygpIHsgcmV0dXJuICEhdGhpcy5fdmVydGljZXM7IH1cbiAgICBzZXQgdmVydGljZXModmFsdWUpIHsgdGhpcy5fdmVydGljZXMgPSB2YWx1ZTsgdGhpcy5fdXBkYXRlKCk7IH1cblxuICAgIF9vbkRhdGEoZXZlbnQpIHtcbiAgICAgICAgdGhpcy5fdXBkYXRlKGV2ZW50LmRhdGFUeXBlID09PSAnc3R5bGUnKTtcbiAgICAgICAgdGhpcy5maXJlKGAke2V2ZW50LmRhdGFUeXBlfWRhdGFgLCBldmVudCk7XG4gICAgfVxuXG4gICAgX29uRGF0YUxvYWRpbmcoZXZlbnQpIHtcbiAgICAgICAgdGhpcy5maXJlKGAke2V2ZW50LmRhdGFUeXBlfWRhdGFsb2FkaW5nYCwgZXZlbnQpO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBNYXA7XG5cbmZ1bmN0aW9uIHJlbW92ZU5vZGUobm9kZSkge1xuICAgIGlmIChub2RlLnBhcmVudE5vZGUpIHtcbiAgICAgICAgbm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIGludGVyYWN0aXZlIGNvbnRyb2xzIGFkZGVkIHRvIHRoZSBtYXAuIFRoaXMgaXMgYW5cbiAqIHNwZWNpZmljYXRpb24gZm9yIGltcGxlbWVudGVycyB0byBtb2RlbDogaXQgaXMgbm90XG4gKiBhbiBleHBvcnRlZCBtZXRob2Qgb3IgY2xhc3MuXG4gKlxuICogQ29udHJvbHMgbXVzdCBpbXBsZW1lbnQgYG9uQWRkYCBhbmQgYG9uUmVtb3ZlYCwgYW5kIG11c3Qgb3duIGFuXG4gKiBlbGVtZW50LCB3aGljaCBpcyBvZnRlbiBhIGBkaXZgIGVsZW1lbnQuIFRvIHVzZSBNYXBib3ggR0wgSlMnc1xuICogZGVmYXVsdCBjb250cm9sIHN0eWxpbmcsIGFkZCB0aGUgYG1hcGJveGdsLWN0cmxgIGNsYXNzIHRvIHlvdXIgY29udHJvbCdzXG4gKiBub2RlLlxuICpcbiAqIEBpbnRlcmZhY2UgSUNvbnRyb2xcbiAqIEBleGFtcGxlXG4gKiAvLyBDb250cm9sIGltcGxlbWVudGVkIGFzIEVTNiBjbGFzc1xuICogY2xhc3MgSGVsbG9Xb3JsZENvbnRyb2wge1xuICogICAgIG9uQWRkKG1hcCkge1xuICogICAgICAgICB0aGlzLl9tYXAgPSBtYXA7XG4gKiAgICAgICAgIHRoaXMuX2NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICogICAgICAgICB0aGlzLl9jb250YWluZXIuY2xhc3NOYW1lID0gJ21hcGJveGdsLWN0cmwnO1xuICogICAgICAgICB0aGlzLl9jb250YWluZXIudGV4dENvbnRlbnQgPSAnSGVsbG8sIHdvcmxkJztcbiAqICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRhaW5lcjtcbiAqICAgICB9XG4gKlxuICogICAgIG9uUmVtb3ZlKCkge1xuICogICAgICAgICB0aGlzLl9jb250YWluZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLl9jb250YWluZXIpO1xuICogICAgICAgICB0aGlzLl9tYXAgPSB1bmRlZmluZWQ7XG4gKiAgICAgfVxuICogfVxuICpcbiAqIC8vIENvbnRyb2wgaW1wbGVtZW50ZWQgYXMgRVM1IHByb3RvdHlwaWNhbCBjbGFzc1xuICogZnVuY3Rpb24gSGVsbG9Xb3JsZENvbnRyb2woKSB7IH1cbiAqXG4gKiBIZWxsb1dvcmxkQ29udHJvbC5wcm90b3R5cGUub25BZGQgPSBmdW5jdGlvbihtYXApIHtcbiAqICAgICB0aGlzLl9tYXAgPSBtYXA7XG4gKiAgICAgdGhpcy5fY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gKiAgICAgdGhpcy5fY29udGFpbmVyLmNsYXNzTmFtZSA9ICdtYXBib3hnbC1jdHJsJztcbiAqICAgICB0aGlzLl9jb250YWluZXIudGV4dENvbnRlbnQgPSAnSGVsbG8sIHdvcmxkJztcbiAqICAgICByZXR1cm4gdGhpcy5fY29udGFpbmVyO1xuICogfTtcbiAqXG4gKiBIZWxsb1dvcmxkQ29udHJvbC5wcm90b3R5cGUub25SZW1vdmUoKSB7XG4gKiAgICAgIHRoaXMuX2NvbnRhaW5lci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuX2NvbnRhaW5lcik7XG4gKiAgICAgIHRoaXMuX21hcCA9IHVuZGVmaW5lZDtcbiAqIH07XG4gKi9cblxuLyoqXG4gKiBSZWdpc3RlciBhIGNvbnRyb2wgb24gdGhlIG1hcCBhbmQgZ2l2ZSBpdCBhIGNoYW5jZSB0byByZWdpc3RlciBldmVudCBsaXN0ZW5lcnNcbiAqIGFuZCByZXNvdXJjZXMuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB7QGxpbmsgTWFwI2FkZENvbnRyb2x9XG4gKiBpbnRlcm5hbGx5LlxuICpcbiAqIEBmdW5jdGlvblxuICogQG1lbWJlcm9mIElDb250cm9sXG4gKiBAaW5zdGFuY2VcbiAqIEBuYW1lIG9uQWRkXG4gKiBAcGFyYW0ge01hcH0gbWFwIHRoZSBNYXAgdGhpcyBjb250cm9sIHdpbGwgYmUgYWRkZWQgdG9cbiAqIEByZXR1cm5zIHtIVE1MRWxlbWVudH0gVGhlIGNvbnRyb2wncyBjb250YWluZXIgZWxlbWVudC4gVGhpcyBzaG91bGRcbiAqIGJlIGNyZWF0ZWQgYnkgdGhlIGNvbnRyb2wgYW5kIHJldHVybmVkIGJ5IG9uQWRkIHdpdGhvdXQgYmVpbmcgYXR0YWNoZWRcbiAqIHRvIHRoZSBET006IHRoZSBtYXAgd2lsbCBpbnNlcnQgdGhlIGNvbnRyb2wncyBlbGVtZW50IGludG8gdGhlIERPTVxuICogYXMgbmVjZXNzYXJ5LlxuICovXG5cbi8qKlxuICogVW5yZWdpc3RlciBhIGNvbnRyb2wgb24gdGhlIG1hcCBhbmQgZ2l2ZSBpdCBhIGNoYW5jZSB0byBkZXRhY2ggZXZlbnQgbGlzdGVuZXJzXG4gKiBhbmQgcmVzb3VyY2VzLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkge0BsaW5rIE1hcCNyZW1vdmVDb250cm9sfVxuICogaW50ZXJuYWxseS5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBtZW1iZXJvZiBJQ29udHJvbFxuICogQGluc3RhbmNlXG4gKiBAbmFtZSBvblJlbW92ZVxuICogQHBhcmFtIHtNYXB9IG1hcCB0aGUgTWFwIHRoaXMgY29udHJvbCB3aWxsIGJlIHJlbW92ZWQgZnJvbVxuICogQHJldHVybnMge3VuZGVmaW5lZH0gdGhlcmUgaXMgbm8gcmVxdWlyZWQgcmV0dXJuIHZhbHVlIGZvciB0aGlzIG1ldGhvZFxuICovXG5cbi8qKlxuICogT3B0aW9uYWxseSBwcm92aWRlIGEgZGVmYXVsdCBwb3NpdGlvbiBmb3IgdGhpcyBjb250cm9sLiBJZiB0aGlzIG1ldGhvZFxuICogaXMgaW1wbGVtZW50ZWQgYW5kIHtAbGluayBNYXAjYWRkQ29udHJvbH0gaXMgY2FsbGVkIHdpdGhvdXQgdGhlIGBwb3NpdGlvbmBcbiAqIHBhcmFtZXRlciwgdGhlIHZhbHVlIHJldHVybmVkIGJ5IGdldERlZmF1bHRQb3NpdGlvbiB3aWxsIGJlIHVzZWQgYXMgdGhlXG4gKiBjb250cm9sJ3MgcG9zaXRpb24uXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAbWVtYmVyb2YgSUNvbnRyb2xcbiAqIEBpbnN0YW5jZVxuICogQG5hbWUgZ2V0RGVmYXVsdFBvc2l0aW9uXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBhIGNvbnRyb2wgcG9zaXRpb24sIG9uZSBvZiB0aGUgdmFsdWVzIHZhbGlkIGluIGFkZENvbnRyb2wuXG4gKi9cblxuLyoqXG4gKiBBIFtgTG5nTGF0YF0oI0xuZ0xhdCkgb2JqZWN0IG9yIGFuIGFycmF5IG9mIHR3byBudW1iZXJzIHJlcHJlc2VudGluZyBsb25naXR1ZGUgYW5kIGxhdGl0dWRlLlxuICpcbiAqIEB0eXBlZGVmIHsoTG5nTGF0IHwgQXJyYXk8bnVtYmVyPil9IExuZ0xhdExpa2VcbiAqIEBleGFtcGxlXG4gKiB2YXIgdjEgPSBuZXcgbWFwYm94Z2wuTG5nTGF0KC0xMjIuNDIwNjc5LCAzNy43NzI1MzcpO1xuICogdmFyIHYyID0gWy0xMjIuNDIwNjc5LCAzNy43NzI1MzddO1xuICovXG5cbi8qKlxuICogQSBbYExuZ0xhdEJvdW5kc2BdKCNMbmdMYXRCb3VuZHMpIG9iamVjdCBvciBhbiBhcnJheSBvZiBbYExuZ0xhdExpa2VgXSgjTG5nTGF0TGlrZSkgb2JqZWN0cy5cbiAqXG4gKiBAdHlwZWRlZiB7KExuZ0xhdEJvdW5kcyB8IEFycmF5PExuZ0xhdExpa2U+KX0gTG5nTGF0Qm91bmRzTGlrZVxuICogQGV4YW1wbGVcbiAqIHZhciB2MSA9IG5ldyBtYXBib3hnbC5MbmdMYXRCb3VuZHMoXG4gKiAgIG5ldyBtYXBib3hnbC5MbmdMYXQoLTczLjk4NzYsIDQwLjc2NjEpLFxuICogICBuZXcgbWFwYm94Z2wuTG5nTGF0KC03My45Mzk3LCA0MC44MDAyKVxuICogKTtcbiAqIHZhciB2MiA9IG5ldyBtYXBib3hnbC5MbmdMYXRCb3VuZHMoWy03My45ODc2LCA0MC43NjYxXSwgWy03My45Mzk3LCA0MC44MDAyXSlcbiAqIHZhciB2MyA9IFtbLTczLjk4NzYsIDQwLjc2NjFdLCBbLTczLjkzOTcsIDQwLjgwMDJdXTtcbiAqL1xuXG4vKipcbiAqIEEgW2BQb2ludGAgZ2VvbWV0cnldKGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvcG9pbnQtZ2VvbWV0cnkpIG9iamVjdCwgd2hpY2ggaGFzXG4gKiBgeGAgYW5kIGB5YCBwcm9wZXJ0aWVzIHJlcHJlc2VudGluZyBzY3JlZW4gY29vcmRpbmF0ZXMgaW4gcGl4ZWxzLlxuICpcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFBvaW50XG4gKi9cblxuLyoqXG4gKiBBIFtgUG9pbnRgXSgjUG9pbnQpIG9yIGFuIGFycmF5IG9mIHR3byBudW1iZXJzIHJlcHJlc2VudGluZyBgeGAgYW5kIGB5YCBzY3JlZW4gY29vcmRpbmF0ZXMgaW4gcGl4ZWxzLlxuICpcbiAqIEB0eXBlZGVmIHsoUG9pbnQgfCBBcnJheTxudW1iZXI+KX0gUG9pbnRMaWtlXG4gKi9cblxuLyoqXG4gKiBPcHRpb25zIGNvbW1vbiB0byB7QGxpbmsgTWFwI2FkZENsYXNzfSwge0BsaW5rIE1hcCNyZW1vdmVDbGFzc30sXG4gKiBhbmQge0BsaW5rIE1hcCNzZXRDbGFzc2VzfSwgY29udHJvbGxpbmdcbiAqIHdoZXRoZXIgb3Igbm90IHRvIHNtb290aGx5IHRyYW5zaXRpb24gcHJvcGVydHkgY2hhbmdlcyB0cmlnZ2VyZWQgYnkgYSBjbGFzcyBjaGFuZ2UuXG4gKlxuICogQHR5cGVkZWYge09iamVjdH0gU3R5bGVPcHRpb25zXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHRyYW5zaXRpb24gSWYgYHRydWVgLCBwcm9wZXJ0eSBjaGFuZ2VzIHdpbGwgc21vb3RseSB0cmFuc2l0aW9uLlxuICovXG5cbi8qKlxuICogRmlyZWQgd2hlbmV2ZXIgdGhlIG1hcCBpcyBkcmF3biB0byB0aGUgc2NyZWVuLCBhcyB0aGUgcmVzdWx0IG9mXG4gKlxuICogLSBhIGNoYW5nZSB0byB0aGUgbWFwJ3MgcG9zaXRpb24sIHpvb20sIHBpdGNoLCBvciBiZWFyaW5nXG4gKiAtIGEgY2hhbmdlIHRvIHRoZSBtYXAncyBzdHlsZVxuICogLSBhIGNoYW5nZSB0byBhIEdlb0pTT04gc291cmNlXG4gKiAtIHRoZSBsb2FkaW5nIG9mIGEgdmVjdG9yIHRpbGUsIEdlb0pTT04gZmlsZSwgZ2x5cGgsIG9yIHNwcml0ZVxuICpcbiAqIEBldmVudCByZW5kZXJcbiAqIEBtZW1iZXJvZiBNYXBcbiAqIEBpbnN0YW5jZVxuICovXG5cbi8qKlxuICogRmlyZWQgd2hlbiBhIHBvaW50IGRldmljZSAodXN1YWxseSBhIG1vdXNlKSBsZWF2ZXMgdGhlIG1hcCdzIGNhbnZhcy5cbiAqXG4gKiBAZXZlbnQgbW91c2VvdXRcbiAqIEBtZW1iZXJvZiBNYXBcbiAqIEBpbnN0YW5jZVxuICogQHByb3BlcnR5IHtNYXBNb3VzZUV2ZW50fSBkYXRhXG4gKiBAc2VlIFtIaWdobGlnaHQgZmVhdHVyZXMgdW5kZXIgdGhlIG1vdXNlIHBvaW50ZXJdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvaG92ZXItc3R5bGVzLylcbiAqL1xuXG4vKipcbiAqIEZpcmVkIHdoZW4gYSBwb2ludGluZyBkZXZpY2UgKHVzdWFsbHkgYSBtb3VzZSkgaXMgcHJlc3NlZCB3aXRoaW4gdGhlIG1hcC5cbiAqXG4gKiBAZXZlbnQgbW91c2Vkb3duXG4gKiBAbWVtYmVyb2YgTWFwXG4gKiBAaW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7TWFwTW91c2VFdmVudH0gZGF0YVxuICogQHNlZSBbSGlnaGxpZ2h0IGZlYXR1cmVzIHdpdGhpbiBhIGJvdW5kaW5nIGJveF0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS91c2luZy1ib3gtcXVlcnlyZW5kZXJlZGZlYXR1cmVzLylcbiAqIEBzZWUgW0NyZWF0ZSBhIGRyYWdnYWJsZSBwb2ludF0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9kcmFnLWEtcG9pbnQvKVxuICovXG5cbi8qKlxuICogRmlyZWQgd2hlbiBhIHBvaW50aW5nIGRldmljZSAodXN1YWxseSBhIG1vdXNlKSBpcyByZWxlYXNlZCB3aXRoaW4gdGhlIG1hcC5cbiAqXG4gKiBAZXZlbnQgbW91c2V1cFxuICogQG1lbWJlcm9mIE1hcFxuICogQGluc3RhbmNlXG4gKiBAcHJvcGVydHkge01hcE1vdXNlRXZlbnR9IGRhdGFcbiAqIEBzZWUgW0hpZ2hsaWdodCBmZWF0dXJlcyB3aXRoaW4gYSBib3VuZGluZyBib3hdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvdXNpbmctYm94LXF1ZXJ5cmVuZGVyZWRmZWF0dXJlcy8pXG4gKiBAc2VlIFtDcmVhdGUgYSBkcmFnZ2FibGUgcG9pbnRdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvZHJhZy1hLXBvaW50LylcbiAqL1xuXG4vKipcbiAqIEZpcmVkIHdoZW4gYSBwb2ludGluZyBkZXZpY2UgKHVzdWFsbHkgYSBtb3VzZSkgaXMgbW92ZWQgd2l0aGluIHRoZSBtYXAuXG4gKlxuICogQGV2ZW50IG1vdXNlbW92ZVxuICogQG1lbWJlcm9mIE1hcFxuICogQGluc3RhbmNlXG4gKiBAcHJvcGVydHkge01hcE1vdXNlRXZlbnR9IGRhdGFcbiAqIEBzZWUgW0dldCBjb29yZGluYXRlcyBvZiB0aGUgbW91c2UgcG9pbnRlcl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9tb3VzZS1wb3NpdGlvbi8pXG4gKiBAc2VlIFtIaWdobGlnaHQgZmVhdHVyZXMgdW5kZXIgdGhlIG1vdXNlIHBvaW50ZXJdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvaG92ZXItc3R5bGVzLylcbiAqIEBzZWUgW0Rpc3BsYXkgYSBwb3B1cCBvbiBob3Zlcl0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9wb3B1cC1vbi1ob3Zlci8pXG4gKi9cblxuLyoqXG4gKiBGaXJlZCB3aGVuIGEgdG91Y2ggcG9pbnQgaXMgcGxhY2VkIG9uIHRoZSBtYXAuXG4gKlxuICogQGV2ZW50IHRvdWNoc3RhcnRcbiAqIEBtZW1iZXJvZiBNYXBcbiAqIEBpbnN0YW5jZVxuICogQHByb3BlcnR5IHtNYXBUb3VjaEV2ZW50fSBkYXRhXG4gKi9cblxuLyoqXG4gKiBGaXJlZCB3aGVuIGEgdG91Y2ggcG9pbnQgaXMgcmVtb3ZlZCBmcm9tIHRoZSBtYXAuXG4gKlxuICogQGV2ZW50IHRvdWNoZW5kXG4gKiBAbWVtYmVyb2YgTWFwXG4gKiBAaW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7TWFwVG91Y2hFdmVudH0gZGF0YVxuICovXG5cbi8qKlxuICogRmlyZWQgd2hlbiBhIHRvdWNoIHBvaW50IGlzIG1vdmVkIHdpdGhpbiB0aGUgbWFwLlxuICpcbiAqIEBldmVudCB0b3VjaG1vdmVcbiAqIEBtZW1iZXJvZiBNYXBcbiAqIEBpbnN0YW5jZVxuICogQHByb3BlcnR5IHtNYXBUb3VjaEV2ZW50fSBkYXRhXG4gKi9cblxuLyoqXG4gKiBGaXJlZCB3aGVuIGEgdG91Y2ggcG9pbnQgaGFzIGJlZW4gZGlzcnVwdGVkLlxuICpcbiAqIEBldmVudCB0b3VjaGNhbmNlbFxuICogQG1lbWJlcm9mIE1hcFxuICogQGluc3RhbmNlXG4gKiBAcHJvcGVydHkge01hcFRvdWNoRXZlbnR9IGRhdGFcbiAqL1xuXG4vKipcbiAqIEZpcmVkIHdoZW4gYSBwb2ludGluZyBkZXZpY2UgKHVzdWFsbHkgYSBtb3VzZSkgaXMgcHJlc3NlZCBhbmQgcmVsZWFzZWQgYXQgdGhlIHNhbWUgcG9pbnQgb24gdGhlIG1hcC5cbiAqXG4gKiBAZXZlbnQgY2xpY2tcbiAqIEBtZW1iZXJvZiBNYXBcbiAqIEBpbnN0YW5jZVxuICogQHByb3BlcnR5IHtNYXBNb3VzZUV2ZW50fSBkYXRhXG4gKiBAc2VlIFtNZWFzdXJlIGRpc3RhbmNlc10oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9tZWFzdXJlLylcbiAqIEBzZWUgW0NlbnRlciB0aGUgbWFwIG9uIGEgY2xpY2tlZCBzeW1ib2xdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvY2VudGVyLW9uLXN5bWJvbC8pXG4gKi9cblxuLyoqXG4gKiBGaXJlZCB3aGVuIGEgcG9pbnRpbmcgZGV2aWNlICh1c3VhbGx5IGEgbW91c2UpIGlzIGNsaWNrZWQgdHdpY2UgYXQgdGhlIHNhbWUgcG9pbnQgb24gdGhlIG1hcC5cbiAqXG4gKiBAZXZlbnQgZGJsY2xpY2tcbiAqIEBtZW1iZXJvZiBNYXBcbiAqIEBpbnN0YW5jZVxuICogQHByb3BlcnR5IHtNYXBNb3VzZUV2ZW50fSBkYXRhXG4gKi9cblxuLyoqXG4gKiBGaXJlZCB3aGVuIHRoZSByaWdodCBidXR0b24gb2YgdGhlIG1vdXNlIGlzIGNsaWNrZWQgb3IgdGhlIGNvbnRleHQgbWVudSBrZXkgaXMgcHJlc3NlZCB3aXRoaW4gdGhlIG1hcC5cbiAqXG4gKiBAZXZlbnQgY29udGV4dG1lbnVcbiAqIEBtZW1iZXJvZiBNYXBcbiAqIEBpbnN0YW5jZVxuICogQHByb3BlcnR5IHtNYXBNb3VzZUV2ZW50fSBkYXRhXG4gKi9cblxuLyoqXG4gKiBGaXJlZCBpbW1lZGlhdGVseSBhZnRlciBhbGwgbmVjZXNzYXJ5IHJlc291cmNlcyBoYXZlIGJlZW4gZG93bmxvYWRlZFxuICogYW5kIHRoZSBmaXJzdCB2aXN1YWxseSBjb21wbGV0ZSByZW5kZXJpbmcgb2YgdGhlIG1hcCBoYXMgb2NjdXJyZWQuXG4gKlxuICogQGV2ZW50IGxvYWRcbiAqIEBtZW1iZXJvZiBNYXBcbiAqIEBpbnN0YW5jZVxuICogQHR5cGUge09iamVjdH1cbiAqIEBzZWUgW0RyYXcgR2VvSlNPTiBwb2ludHNdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvZ2VvanNvbi1tYXJrZXJzLylcbiAqIEBzZWUgW0FkZCBsaXZlIHJlYWx0aW1lIGRhdGFdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvbGl2ZS1nZW9qc29uLylcbiAqIEBzZWUgW0FuaW1hdGUgYSBwb2ludF0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9hbmltYXRlLXBvaW50LWFsb25nLWxpbmUvKVxuICovXG5cbi8qKlxuICogRmlyZWQganVzdCBiZWZvcmUgdGhlIG1hcCBiZWdpbnMgYSB0cmFuc2l0aW9uIGZyb20gb25lXG4gKiB2aWV3IHRvIGFub3RoZXIsIGFzIHRoZSByZXN1bHQgb2YgZWl0aGVyIHVzZXIgaW50ZXJhY3Rpb24gb3IgbWV0aG9kcyBzdWNoIGFzIFtNYXAjanVtcFRvXSgjTWFwI2p1bXBUbykuXG4gKlxuICogQGV2ZW50IG1vdmVzdGFydFxuICogQG1lbWJlcm9mIE1hcFxuICogQGluc3RhbmNlXG4gKiBAcHJvcGVydHkge3tvcmlnaW5hbEV2ZW50OiBEcmFnRXZlbnR9fSBkYXRhXG4gKi9cblxuLyoqXG4gKiBGaXJlZCByZXBlYXRlZGx5IGR1cmluZyBhbiBhbmltYXRlZCB0cmFuc2l0aW9uIGZyb20gb25lIHZpZXcgdG9cbiAqIGFub3RoZXIsIGFzIHRoZSByZXN1bHQgb2YgZWl0aGVyIHVzZXIgaW50ZXJhY3Rpb24gb3IgbWV0aG9kcyBzdWNoIGFzIFtNYXAjZmx5VG9dKCNNYXAjZmx5VG8pLlxuICpcbiAqIEBldmVudCBtb3ZlXG4gKiBAbWVtYmVyb2YgTWFwXG4gKiBAaW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7TWFwTW91c2VFdmVudCB8IE1hcFRvdWNoRXZlbnR9IGRhdGFcbiAqL1xuXG4vKipcbiAqIEZpcmVkIGp1c3QgYWZ0ZXIgdGhlIG1hcCBjb21wbGV0ZXMgYSB0cmFuc2l0aW9uIGZyb20gb25lXG4gKiB2aWV3IHRvIGFub3RoZXIsIGFzIHRoZSByZXN1bHQgb2YgZWl0aGVyIHVzZXIgaW50ZXJhY3Rpb24gb3IgbWV0aG9kcyBzdWNoIGFzIFtNYXAjanVtcFRvXSgjTWFwI2p1bXBUbykuXG4gKlxuICogQGV2ZW50IG1vdmVlbmRcbiAqIEBtZW1iZXJvZiBNYXBcbiAqIEBpbnN0YW5jZVxuICogQHByb3BlcnR5IHt7b3JpZ2luYWxFdmVudDogRHJhZ0V2ZW50fX0gZGF0YVxuICogQHNlZSBbUGxheSBtYXAgbG9jYXRpb25zIGFzIGEgc2xpZGVzaG93XShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3BsYXliYWNrLWxvY2F0aW9ucy8pXG4gKiBAc2VlIFtGaWx0ZXIgZmVhdHVyZXMgd2l0aGluIG1hcCB2aWV3XShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2ZpbHRlci1mZWF0dXJlcy13aXRoaW4tbWFwLXZpZXcvKVxuICovXG5cbiAvKipcbiAgKiBGaXJlZCB3aGVuIGFuIGVycm9yIG9jY3Vycy4gVGhpcyBpcyBHTCBKUydzIHByaW1hcnkgZXJyb3IgcmVwb3J0aW5nXG4gICogbWVjaGFuaXNtLiBXZSB1c2UgYW4gZXZlbnQgaW5zdGVhZCBvZiBgdGhyb3dgIHRvIGJldHRlciBhY2NvbW1vZGF0ZVxuICAqIGFzeW5jcm9ub3VzIG9wZXJhdGlvbnMuIElmIG5vIGxpc3RlbmVycyBhcmUgYm91bmQgdG8gdGhlIGBlcnJvcmAgZXZlbnQsIHRoZVxuICAqIGVycm9yIHdpbGwgYmUgcHJpbnRlZCB0byB0aGUgY29uc29sZS5cbiAgKlxuICAqIEBldmVudCBlcnJvclxuICAqIEBtZW1iZXJvZiBNYXBcbiAgKiBAaW5zdGFuY2VcbiAgKiBAcHJvcGVydHkge3tlcnJvcjoge21lc3NhZ2U6IHN0cmluZ319fSBkYXRhXG4gICovXG5cbi8qKlxuICogRmlyZWQgd2hlbiBhbnkgbWFwIGRhdGEgbG9hZHMgb3IgY2hhbmdlcy4gU2VlIFtgTWFwRGF0YUV2ZW50YF0oI01hcERhdGFFdmVudClcbiAqIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICpcbiAqIEBldmVudCBkYXRhXG4gKiBAbWVtYmVyb2YgTWFwXG4gKiBAaW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7TWFwRGF0YUV2ZW50fSBkYXRhXG4gKi9cblxuLyoqXG4gKiBGaXJlZCB3aGVuIHRoZSBtYXAncyBzdHlsZSBsb2FkcyBvciBjaGFuZ2VzLiBTZWVcbiAqIFtgTWFwRGF0YUV2ZW50YF0oI01hcERhdGFFdmVudCkgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKlxuICogQGV2ZW50IHN0eWxlZGF0YVxuICogQG1lbWJlcm9mIE1hcFxuICogQGluc3RhbmNlXG4gKiBAcHJvcGVydHkge01hcERhdGFFdmVudH0gZGF0YVxuICovXG5cbi8qKlxuICogRmlyZWQgd2hlbiBvbmUgb2YgdGhlIG1hcCdzIHNvdXJjZXMgbG9hZHMgb3IgY2hhbmdlcy4gVGhpcyBldmVudCBpcyBub3QgZmlyZWRcbiAqIGlmIGEgdGlsZSBiZWxvbmdpbmcgdG8gYSBzb3VyY2UgbG9hZHMgb3IgY2hhbmdlcyAodGhhdCBpcyBoYW5kbGVkIGJ5XG4gKiBgdGlsZWRhdGFgKS4gU2VlIFtgTWFwRGF0YUV2ZW50YF0oI01hcERhdGFFdmVudCkgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKlxuICogQGV2ZW50IHNvdXJjZWRhdGFcbiAqIEBtZW1iZXJvZiBNYXBcbiAqIEBpbnN0YW5jZVxuICogQHByb3BlcnR5IHtNYXBEYXRhRXZlbnR9IGRhdGFcbiAqL1xuXG4gLyoqXG4gICogRmlyZWQgd2hlbiBvbmUgb2YgdGhlIG1hcCdzIHNvdXJjZXMnIHRpbGVzIGxvYWRzIG9yIGNoYW5nZXMuIFNlZVxuICAqIFtgTWFwRGF0YUV2ZW50YF0oI01hcERhdGFFdmVudCkgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICpcbiAgKiBAZXZlbnQgdGlsZWRhdGFcbiAgKiBAbWVtYmVyb2YgTWFwXG4gICogQGluc3RhbmNlXG4gICogQHByb3BlcnR5IHtNYXBEYXRhRXZlbnR9IGRhdGFcbiAgKi9cblxuLyoqXG4gKiBGaXJlZCB3aGVuIGFueSBtYXAgZGF0YSAoc3R5bGUsIHNvdXJjZSwgdGlsZSwgZXRjKSBiZWdpbnMgbG9hZGluZyBvclxuICogY2hhbmdpbmcgYXN5bmNyb25vdXNseS4gQWxsIGBkYXRhbG9hZGluZ2AgZXZlbnRzIGFyZSBmb2xsb3dlZCBieSBhIGBkYXRhYFxuICogb3IgYGVycm9yYCBldmVudC4gU2VlIFtgTWFwRGF0YUV2ZW50YF0oI01hcERhdGFFdmVudCkgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKlxuICogQGV2ZW50IGRhdGFsb2FkaW5nXG4gKiBAbWVtYmVyb2YgTWFwXG4gKiBAaW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7TWFwRGF0YUV2ZW50fSBkYXRhXG4gKi9cblxuLyoqXG4gKiBGaXJlZCB3aGVuIHRoZSBtYXAncyBzdHlsZSBiZWdpbnMgbG9hZGluZyBvciBjaGFuZ2luZyBhc3luY3Jvbm91c2x5LlxuICogQWxsIGBzdHlsZWRhdGFsb2FkaW5nYCBldmVudHMgYXJlIGZvbGxvd2VkIGJ5IGEgYHN0eWxlZGF0YWBcbiAqIG9yIGBlcnJvcmAgZXZlbnQuIFNlZSBbYE1hcERhdGFFdmVudGBdKCNNYXBEYXRhRXZlbnQpIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICpcbiAqIEBldmVudCBzdHlsZWRhdGFsb2FkaW5nXG4gKiBAbWVtYmVyb2YgTWFwXG4gKiBAaW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7TWFwRGF0YUV2ZW50fSBkYXRhXG4gKi9cblxuLyoqXG4gKiBGaXJlZCB3aGVuIG9uZSBvZiB0aGUgbWFwJ3Mgc291cmNlcyBiZWdpbnMgbG9hZGluZyBvciBjaGFuZ2luZyBhc3luY3Jvbm91c2x5LlxuICogVGhpcyBldmVudCBpcyBub3QgZmlyZWQgaWYgYSB0aWxlIGJlbG9uZ2luZyB0byBhIHNvdXJjZSBiZWdpbnMgbG9hZGluZyBvclxuICogY2hhbmdpbmcgKHRoYXQgaXMgaGFuZGxlZCBieSBgdGlsZWRhdGFsb2FkaW5nYCkuIEFsbCBgc291cmNlZGF0YWxvYWRpbmdgXG4gKiBldmVudHMgYXJlIGZvbGxvd2VkIGJ5IGEgYHNvdXJjZWRhdGFgIG9yIGBlcnJvcmAgZXZlbnQuIFNlZVxuICogW2BNYXBEYXRhRXZlbnRgXSgjTWFwRGF0YUV2ZW50KSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAqXG4gKiBAZXZlbnQgc291cmNlZGF0YWxvYWRpbmdcbiAqIEBtZW1iZXJvZiBNYXBcbiAqIEBpbnN0YW5jZVxuICogQHByb3BlcnR5IHtNYXBEYXRhRXZlbnR9IGRhdGFcbiAqL1xuXG4vKipcbiAqIEZpcmVkIHdoZW4gb25lIG9mIHRoZSBtYXAncyBzb3VyY2VzJyB0aWxlcyBiZWdpbnMgbG9hZGluZyBvciBjaGFuZ2luZ1xuICogYXN5bmNyb25vdXNseS4gQWxsIGB0aWxlZGF0YWxvYWRpbmdgIGV2ZW50cyBhcmUgZm9sbG93ZWQgYnkgYSBgdGlsZWRhdGFgXG4gKiBvciBgZXJyb3JgIGV2ZW50LiBTZWUgW2BNYXBEYXRhRXZlbnRgXSgjTWFwRGF0YUV2ZW50KSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAqXG4gKiBAZXZlbnQgdGlsZWRhdGFsb2FkaW5nXG4gKiBAbWVtYmVyb2YgTWFwXG4gKiBAaW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7TWFwRGF0YUV2ZW50fSBkYXRhXG4gKi9cblxuIC8qKlxuICAqIEEgYE1hcERhdGFFdmVudGAgb2JqZWN0IGlzIGVtaXR0ZWQgd2l0aCB0aGUgW2BNYXAjZGF0YWBdKCNNYXAuZXZlbnQ6ZGF0YSlcbiAgKiBhbmQgW2BNYXAjZGF0YWxvYWRpbmdgXSgjTWFwLmV2ZW50OmRhdGFsb2FkaW5nKSBldmVudHMuIFBvc3NpYmxlIHZhbHVlcyBmb3JcbiAgKiBgZGF0YVR5cGVgcyBhcmU6XG4gICpcbiAgKiAtIGAnc291cmNlJ2A6IFRoZSBub24tdGlsZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCBhbnkgc291cmNlXG4gICogLSBgJ3N0eWxlJ2A6IFRoZSBbc3R5bGVdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLXN0eWxlLXNwZWMvKSB1c2VkIGJ5IHRoZSBtYXBcbiAgKiAtIGAndGlsZSdgOiBBIHZlY3RvciBvciByYXN0ZXIgdGlsZVxuICAqXG4gICogQHR5cGVkZWYge09iamVjdH0gTWFwRGF0YUV2ZW50XG4gICogQHByb3BlcnR5IHtzdHJpbmd9IHR5cGUgVGhlIGV2ZW50IHR5cGUuXG4gICogQHByb3BlcnR5IHtzdHJpbmd9IGRhdGFUeXBlIFRoZSB0eXBlIG9mIGRhdGEgdGhhdCBoYXMgY2hhbmdlZC4gT25lIG9mIGAnc291cmNlJ2AsIGAnc3R5bGUnYC5cbiAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpc1NvdXJjZUxvYWRlZF0gVHJ1ZSBpZiB0aGUgZXZlbnQgaGFzIGEgYGRhdGFUeXBlYCBvZiBgc291cmNlYCBhbmQgdGhlIHNvdXJjZSBoYXMgbm8gb3V0c3RhbmRpbmcgbmV0d29yayByZXF1ZXN0cy5cbiAgKiBAcHJvcGVydHkge09iamVjdH0gW3NvdXJjZV0gVGhlIFtzdHlsZSBzcGVjIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzb3VyY2VdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLXN0eWxlLXNwZWMvI3NvdXJjZXMpIGlmIHRoZSBldmVudCBoYXMgYSBgZGF0YVR5cGVgIG9mIGBzb3VyY2VgLlxuICAqIEBwcm9wZXJ0eSB7Q29vcmRpbmF0ZX0gW2Nvb3JkXSBUaGUgY29vcmRpbmF0ZSBvZiB0aGUgdGlsZSBpZiB0aGUgZXZlbnQgaGFzIGEgYGRhdGFUeXBlYCBvZiBgdGlsZWAuXG4gICovXG5cbiAvKipcbiAqIEZpcmVkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBtYXAgaGFzIGJlZW4gcmVtb3ZlZCB3aXRoIFtgTWFwI3JlbW92ZWBdKCNNYXAjcmVtb3ZlKS5cbiAqXG4gKiBAZXZlbnQgcmVtb3ZlXG4gKiBAbWVtYmVyb2YgTWFwXG4gKiBAaW5zdGFuY2VcbiAqL1xuXG4gIC8qKlxuICogRmlyZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIG1hcCBoYXMgYmVlbiByZXNpemVkLlxuICpcbiAqIEBldmVudCByZXNpemVcbiAqIEBtZW1iZXJvZiBNYXBcbiAqIEBpbnN0YW5jZVxuICovXG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IERPTSA9IHJlcXVpcmUoJy4uL3V0aWwvZG9tJyk7XG5jb25zdCBMbmdMYXQgPSByZXF1aXJlKCcuLi9nZW8vbG5nX2xhdCcpO1xuY29uc3QgUG9pbnQgPSByZXF1aXJlKCdwb2ludC1nZW9tZXRyeScpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXJrZXIgY29tcG9uZW50XG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50PX0gZWxlbWVudCBET00gZWxlbWVudCB0byB1c2UgYXMgYSBtYXJrZXIgKGNyZWF0ZXMgYSBkaXYgZWxlbWVudCBieSBkZWZhdWx0KVxuICogQHBhcmFtIHtPYmplY3Q9fSBvcHRpb25zXG4gKiBAcGFyYW0ge1BvaW50TGlrZT19IG9wdGlvbnMub2Zmc2V0IFRoZSBvZmZzZXQgaW4gcGl4ZWxzIGFzIGEgW2BQb2ludExpa2VgXSgjUG9pbnRMaWtlKSBvYmplY3QgdG8gYXBwbHkgcmVsYXRpdmUgdG8gdGhlIGVsZW1lbnQncyB0b3AgbGVmdCBjb3JuZXIuIE5lZ2F0aXZlcyBpbmRpY2F0ZSBsZWZ0IGFuZCB1cC5cbiAqIEBleGFtcGxlXG4gKiB2YXIgbWFya2VyID0gbmV3IG1hcGJveGdsLk1hcmtlcigpXG4gKiAgIC5zZXRMbmdMYXQoWzMwLjUsIDUwLjVdKVxuICogICAuYWRkVG8obWFwKTtcbiAqIEBzZWUgW0FkZCBjdXN0b20gaWNvbnMgd2l0aCBNYXJrZXJzXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL2N1c3RvbS1tYXJrZXItaWNvbnMvKVxuICovXG5jbGFzcyBNYXJrZXIge1xuXG4gICAgY29uc3RydWN0b3IoZWxlbWVudCwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLl9vZmZzZXQgPSBQb2ludC5jb252ZXJ0KG9wdGlvbnMgJiYgb3B0aW9ucy5vZmZzZXQgfHwgWzAsIDBdKTtcblxuICAgICAgICB0aGlzLl91cGRhdGUgPSB0aGlzLl91cGRhdGUuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5fb25NYXBDbGljayA9IHRoaXMuX29uTWFwQ2xpY2suYmluZCh0aGlzKTtcblxuICAgICAgICBpZiAoIWVsZW1lbnQpIGVsZW1lbnQgPSBET00uY3JlYXRlKCdkaXYnKTtcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdtYXBib3hnbC1tYXJrZXInKTtcbiAgICAgICAgdGhpcy5fZWxlbWVudCA9IGVsZW1lbnQ7XG5cbiAgICAgICAgdGhpcy5fcG9wdXAgPSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEF0dGFjaGVzIHRoZSBtYXJrZXIgdG8gYSBtYXBcbiAgICAgKiBAcGFyYW0ge01hcH0gbWFwXG4gICAgICogQHJldHVybnMge01hcmtlcn0gYHRoaXNgXG4gICAgICovXG4gICAgYWRkVG8obWFwKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlKCk7XG4gICAgICAgIHRoaXMuX21hcCA9IG1hcDtcbiAgICAgICAgbWFwLmdldENhbnZhc0NvbnRhaW5lcigpLmFwcGVuZENoaWxkKHRoaXMuX2VsZW1lbnQpO1xuICAgICAgICBtYXAub24oJ21vdmUnLCB0aGlzLl91cGRhdGUpO1xuICAgICAgICBtYXAub24oJ21vdmVlbmQnLCB0aGlzLl91cGRhdGUpO1xuICAgICAgICB0aGlzLl91cGRhdGUoKTtcblxuICAgICAgICAvLyBJZiB3ZSBhdHRhY2hlZCB0aGUgYGNsaWNrYCBsaXN0ZW5lciB0byB0aGUgbWFya2VyIGVsZW1lbnQsIHRoZSBwb3B1cFxuICAgICAgICAvLyB3b3VsZCBjbG9zZSBvbmNlIHRoZSBldmVudCBwcm9wb2dhdGVkIHRvIGBtYXBgIGR1ZSB0byB0aGVcbiAgICAgICAgLy8gYFBvcHVwI19vbkNsaWNrQ2xvc2VgIGxpc3RlbmVyLlxuICAgICAgICB0aGlzLl9tYXAub24oJ2NsaWNrJywgdGhpcy5fb25NYXBDbGljayk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgbWFya2VyIGZyb20gYSBtYXBcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHZhciBtYXJrZXIgPSBuZXcgbWFwYm94Z2wuTWFya2VyKCkuYWRkVG8obWFwKTtcbiAgICAgKiBtYXJrZXIucmVtb3ZlKCk7XG4gICAgICogQHJldHVybnMge01hcmtlcn0gYHRoaXNgXG4gICAgICovXG4gICAgcmVtb3ZlKCkge1xuICAgICAgICBpZiAodGhpcy5fbWFwKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXAub2ZmKCdjbGljaycsIHRoaXMuX29uTWFwQ2xpY2spO1xuICAgICAgICAgICAgdGhpcy5fbWFwLm9mZignbW92ZScsIHRoaXMuX3VwZGF0ZSk7XG4gICAgICAgICAgICB0aGlzLl9tYXAub2ZmKCdtb3ZlZW5kJywgdGhpcy5fdXBkYXRlKTtcbiAgICAgICAgICAgIHRoaXMuX21hcCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgRE9NLnJlbW92ZSh0aGlzLl9lbGVtZW50KTtcbiAgICAgICAgaWYgKHRoaXMuX3BvcHVwKSB0aGlzLl9wb3B1cC5yZW1vdmUoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBtYXJrZXIncyBnZW9ncmFwaGljYWwgbG9jYXRpb25cbiAgICAgKiBAcmV0dXJucyB7TG5nTGF0fVxuICAgICAqL1xuICAgIGdldExuZ0xhdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xuZ0xhdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIG1hcmtlcidzIGdlb2dyYXBoaWNhbCBwb3NpdGlvbiBhbmQgbW92ZSBpdC5cbiAgICAgKiBAcGFyYW0ge0xuZ0xhdH0gbG5nbGF0XG4gICAgICogQHJldHVybnMge01hcmtlcn0gYHRoaXNgXG4gICAgICovXG4gICAgc2V0TG5nTGF0KGxuZ2xhdCkge1xuICAgICAgICB0aGlzLl9sbmdMYXQgPSBMbmdMYXQuY29udmVydChsbmdsYXQpO1xuICAgICAgICBpZiAodGhpcy5fcG9wdXApIHRoaXMuX3BvcHVwLnNldExuZ0xhdCh0aGlzLl9sbmdMYXQpO1xuICAgICAgICB0aGlzLl91cGRhdGUoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgZ2V0RWxlbWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2VsZW1lbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQmluZHMgYSBQb3B1cCB0byB0aGUgTWFya2VyXG4gICAgICogQHBhcmFtIHtQb3B1cD19IHBvcHVwIGFuIGluc3RhbmNlIG9mIHRoZSBgUG9wdXBgIGNsYXNzLiBJZiB1bmRlZmluZWQgb3IgbnVsbCwgYW55IHBvcHVwXG4gICAgICogc2V0IG9uIHRoaXMgYE1hcmtlcmAgaW5zdGFuY2UgaXMgdW5zZXRcbiAgICAgKiBAcmV0dXJucyB7TWFya2VyfSBgdGhpc2BcbiAgICAgKi9cblxuICAgIHNldFBvcHVwKHBvcHVwKSB7XG4gICAgICAgIGlmICh0aGlzLl9wb3B1cCkge1xuICAgICAgICAgICAgdGhpcy5fcG9wdXAucmVtb3ZlKCk7XG4gICAgICAgICAgICB0aGlzLl9wb3B1cCA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocG9wdXApIHtcbiAgICAgICAgICAgIHRoaXMuX3BvcHVwID0gcG9wdXA7XG4gICAgICAgICAgICB0aGlzLl9wb3B1cC5zZXRMbmdMYXQodGhpcy5fbG5nTGF0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIF9vbk1hcENsaWNrKGV2ZW50KSB7XG4gICAgICAgIGNvbnN0IHRhcmdldEVsZW1lbnQgPSBldmVudC5vcmlnaW5hbEV2ZW50LnRhcmdldDtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuX2VsZW1lbnQ7XG5cbiAgICAgICAgaWYgKHRoaXMuX3BvcHVwICYmICh0YXJnZXRFbGVtZW50ID09PSBlbGVtZW50IHx8IGVsZW1lbnQuY29udGFpbnModGFyZ2V0RWxlbWVudCkpKSB7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZVBvcHVwKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBQb3B1cCBpbnN0YW5jZSB0aGF0IGlzIGJvdW5kIHRvIHRoZSBNYXJrZXJcbiAgICAgKiBAcmV0dXJucyB7UG9wdXB9IHBvcHVwXG4gICAgICovXG4gICAgZ2V0UG9wdXAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wb3B1cDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPcGVucyBvciBjbG9zZXMgdGhlIGJvdW5kIHBvcHVwLCBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgc3RhdGVcbiAgICAgKiBAcmV0dXJucyB7TWFya2VyfSBgdGhpc2BcbiAgICAgKi9cbiAgICB0b2dnbGVQb3B1cCgpIHtcbiAgICAgICAgY29uc3QgcG9wdXAgPSB0aGlzLl9wb3B1cDtcblxuICAgICAgICBpZiAoIXBvcHVwKSByZXR1cm47XG4gICAgICAgIGVsc2UgaWYgKHBvcHVwLmlzT3BlbigpKSBwb3B1cC5yZW1vdmUoKTtcbiAgICAgICAgZWxzZSBwb3B1cC5hZGRUbyh0aGlzLl9tYXApO1xuICAgIH1cblxuICAgIF91cGRhdGUoZSkge1xuICAgICAgICBpZiAoIXRoaXMuX21hcCkgcmV0dXJuO1xuICAgICAgICBsZXQgcG9zID0gdGhpcy5fbWFwLnByb2plY3QodGhpcy5fbG5nTGF0KS5fYWRkKHRoaXMuX29mZnNldCk7XG4gICAgICAgIC8vIGJlY2F1c2Ugcm91ZGluZyB0aGUgY29vcmRpbmF0ZXMgYXQgZXZlcnkgYG1vdmVgIGV2ZW50IGNhdXNlcyBzdHV0dGVyZWQgem9vbWluZ1xuICAgICAgICAvLyB3ZSBvbmx5IHJvdW5kIHRoZW0gd2hlbiBfdXBkYXRlIGlzIGNhbGxlZCB3aXRoIGBtb3ZlZW5kYCBvciB3aGVuIGl0cyBjYWxsZWQgd2l0aFxuICAgICAgICAvLyBubyBhcmd1bWVudHMgKHdoZW4gdGhlIE1hcmtlciBpcyBpbml0aWFsaXplZCBvciBNYXJrZXIjc2V0TG5nTGF0IGlzIGludm9rZWQpLlxuICAgICAgICBpZiAoIWUgfHwgZS50eXBlID09PSBcIm1vdmVlbmRcIikgcG9zID0gcG9zLnJvdW5kKCk7XG4gICAgICAgIERPTS5zZXRUcmFuc2Zvcm0odGhpcy5fZWxlbWVudCwgYHRyYW5zbGF0ZSgke3Bvcy54fXB4LCAke3Bvcy55fXB4KWApO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBNYXJrZXI7XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHV0aWwgPSByZXF1aXJlKCcuLi91dGlsL3V0aWwnKTtcbmNvbnN0IEV2ZW50ZWQgPSByZXF1aXJlKCcuLi91dGlsL2V2ZW50ZWQnKTtcbmNvbnN0IERPTSA9IHJlcXVpcmUoJy4uL3V0aWwvZG9tJyk7XG5jb25zdCBMbmdMYXQgPSByZXF1aXJlKCcuLi9nZW8vbG5nX2xhdCcpO1xuY29uc3QgUG9pbnQgPSByZXF1aXJlKCdwb2ludC1nZW9tZXRyeScpO1xuY29uc3Qgd2luZG93ID0gcmVxdWlyZSgnLi4vdXRpbC93aW5kb3cnKTtcblxuY29uc3QgZGVmYXVsdE9wdGlvbnMgPSB7XG4gICAgY2xvc2VCdXR0b246IHRydWUsXG4gICAgY2xvc2VPbkNsaWNrOiB0cnVlXG59O1xuXG4vKipcbiAqIEEgcG9wdXAgY29tcG9uZW50LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuY2xvc2VCdXR0b249dHJ1ZV0gSWYgYHRydWVgLCBhIGNsb3NlIGJ1dHRvbiB3aWxsIGFwcGVhciBpbiB0aGVcbiAqICAgdG9wIHJpZ2h0IGNvcm5lciBvZiB0aGUgcG9wdXAuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmNsb3NlT25DbGljaz10cnVlXSBJZiBgdHJ1ZWAsIHRoZSBwb3B1cCB3aWxsIGNsb3NlZCB3aGVuIHRoZVxuICogICBtYXAgaXMgY2xpY2tlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5hbmNob3JdIC0gQSBzdHJpbmcgaW5kaWNhdGluZyB0aGUgcG9wdXAncyBsb2NhdGlvbiByZWxhdGl2ZSB0b1xuICogICB0aGUgY29vcmRpbmF0ZSBzZXQgdmlhIFtQb3B1cCNzZXRMbmdMYXRdKCNQb3B1cCNzZXRMbmdMYXQpLlxuICogICBPcHRpb25zIGFyZSBgJ3RvcCdgLCBgJ2JvdHRvbSdgLCBgJ2xlZnQnYCwgYCdyaWdodCdgLCBgJ3RvcC1sZWZ0J2AsXG4gKiAgIGAndG9wLXJpZ2h0J2AsIGAnYm90dG9tLWxlZnQnYCwgYW5kIGAnYm90dG9tLXJpZ2h0J2AuIElmIHVuc2V0IHRoZSBhbmNob3Igd2lsbCBiZVxuICogICBkeW5hbWljYWxseSBzZXQgdG8gZW5zdXJlIHRoZSBwb3B1cCBmYWxscyB3aXRoaW4gdGhlIG1hcCBjb250YWluZXIgd2l0aCBhIHByZWZlcmVuY2VcbiAqICAgZm9yIGAnYm90dG9tJ2AuXG4gKiBAcGFyYW0ge251bWJlcnxQb2ludExpa2V8T2JqZWN0fSBbb3B0aW9ucy5vZmZzZXRdIC1cbiAqICBBIHBpeGVsIG9mZnNldCBhcHBsaWVkIHRvIHRoZSBwb3B1cCdzIGxvY2F0aW9uIHNwZWNpZmllZCBhczpcbiAqICAgLSBhIHNpbmdsZSBudW1iZXIgc3BlY2lmeWluZyBhIGRpc3RhbmNlIGZyb20gdGhlIHBvcHVwJ3MgbG9jYXRpb25cbiAqICAgLSBhIFtgUG9pbnRMaWtlYF0oI1BvaW50TGlrZSkgc3BlY2lmeWluZyBhIGNvbnN0YW50IG9mZnNldFxuICogICAtIGFuIG9iamVjdCBvZiBbYFBvaW50TGlrZWBdKCNQb2ludExpa2UpcyBzcGVjaWZpbmcgYW4gb2Zmc2V0IGZvciBlYWNoIGFuY2hvciBwb3NpdGlvblxuICogIE5lZ2F0aXZlIG9mZnNldHMgaW5kaWNhdGUgbGVmdCBhbmQgdXAuXG4gKiBAZXhhbXBsZVxuICogdmFyIG1hcmtlckhlaWdodCA9IDUwLCBtYXJrZXJSYWRpdXMgPSAxMCwgbGluZWFyT2Zmc2V0ID0gMjU7XG4gKiB2YXIgcG9wdXBPZmZzZXRzID0ge1xuICogICd0b3AnOiBbMCwgMF0sXG4gKiAgJ3RvcC1sZWZ0JzogWzAsMF0sXG4gKiAgJ3RvcC1yaWdodCc6IFswLDBdLFxuICogICdib3R0b20nOiBbMCwgLW1hcmtlckhlaWdodF0sXG4gKiAgJ2JvdHRvbS1sZWZ0JzogW2xpbmVhck9mZnNldCwgKG1hcmtlckhlaWdodCAtIG1hcmtlclJhZGl1cyArIGxpbmVhck9mZnNldCkgKiAtMV0sXG4gKiAgJ2JvdHRvbS1yaWdodCc6IFstbGluZWFyT2Zmc2V0LCAobWFya2VySGVpZ2h0IC0gbWFya2VyUmFkaXVzICsgbGluZWFyT2Zmc2V0KSAqIC0xXSxcbiAqICAnbGVmdCc6IFttYXJrZXJSYWRpdXMsIChtYXJrZXJIZWlnaHQgLSBtYXJrZXJSYWRpdXMpICogLTFdLFxuICogICdyaWdodCc6IFstbWFya2VyUmFkaXVzLCAobWFya2VySGVpZ2h0IC0gbWFya2VyUmFkaXVzKSAqIC0xXVxuICogIH07XG4gKiB2YXIgcG9wdXAgPSBuZXcgbWFwYm94Z2wuUG9wdXAoe29mZnNldDpwb3B1cE9mZnNldHN9KVxuICogICAuc2V0TG5nTGF0KGUubG5nTGF0KVxuICogICAuc2V0SFRNTChcIjxoMT5IZWxsbyBXb3JsZCE8L2gxPlwiKVxuICogICAuYWRkVG8obWFwKTtcbiAqIEBzZWUgW0Rpc3BsYXkgYSBwb3B1cF0oaHR0cHM6Ly93d3cubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvZXhhbXBsZS9wb3B1cC8pXG4gKiBAc2VlIFtEaXNwbGF5IGEgcG9wdXAgb24gaG92ZXJdKGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vbWFwYm94LWdsLWpzL2V4YW1wbGUvcG9wdXAtb24taG92ZXIvKVxuICogQHNlZSBbRGlzcGxheSBhIHBvcHVwIG9uIGNsaWNrXShodHRwczovL3d3dy5tYXBib3guY29tL21hcGJveC1nbC1qcy9leGFtcGxlL3BvcHVwLW9uLWNsaWNrLylcbiAqL1xuY2xhc3MgUG9wdXAgZXh0ZW5kcyBFdmVudGVkIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IHV0aWwuZXh0ZW5kKE9iamVjdC5jcmVhdGUoZGVmYXVsdE9wdGlvbnMpLCBvcHRpb25zKTtcbiAgICAgICAgdXRpbC5iaW5kQWxsKFtcbiAgICAgICAgICAgICdfdXBkYXRlJyxcbiAgICAgICAgICAgICdfb25DbGlja0Nsb3NlJ10sXG4gICAgICAgICAgICB0aGlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIHRoZSBwb3B1cCB0byBhIG1hcC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7TWFwfSBtYXAgVGhlIE1hcGJveCBHTCBKUyBtYXAgdG8gYWRkIHRoZSBwb3B1cCB0by5cbiAgICAgKiBAcmV0dXJucyB7UG9wdXB9IGB0aGlzYFxuICAgICAqL1xuICAgIGFkZFRvKG1hcCkge1xuICAgICAgICB0aGlzLl9tYXAgPSBtYXA7XG4gICAgICAgIHRoaXMuX21hcC5vbignbW92ZScsIHRoaXMuX3VwZGF0ZSk7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuY2xvc2VPbkNsaWNrKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXAub24oJ2NsaWNrJywgdGhpcy5fb25DbGlja0Nsb3NlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl91cGRhdGUoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgcG9wdXAgaXMgb3BlbiwgYGZhbHNlYCBpZiBpdCBpcyBjbG9zZWQuXG4gICAgICovXG4gICAgaXNPcGVuKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9tYXA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgcG9wdXAgZnJvbSB0aGUgbWFwIGl0IGhhcyBiZWVuIGFkZGVkIHRvLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiB2YXIgcG9wdXAgPSBuZXcgbWFwYm94Z2wuUG9wdXAoKS5hZGRUbyhtYXApO1xuICAgICAqIHBvcHVwLnJlbW92ZSgpO1xuICAgICAqIEByZXR1cm5zIHtQb3B1cH0gYHRoaXNgXG4gICAgICovXG4gICAgcmVtb3ZlKCkge1xuICAgICAgICBpZiAodGhpcy5fY29udGVudCAmJiB0aGlzLl9jb250ZW50LnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRlbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLl9jb250ZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9jb250YWluZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuX2NvbnRhaW5lcik7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fY29udGFpbmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX21hcCkge1xuICAgICAgICAgICAgdGhpcy5fbWFwLm9mZignbW92ZScsIHRoaXMuX3VwZGF0ZSk7XG4gICAgICAgICAgICB0aGlzLl9tYXAub2ZmKCdjbGljaycsIHRoaXMuX29uQ2xpY2tDbG9zZSk7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fbWFwO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpcmVkIHdoZW4gdGhlIHBvcHVwIGlzIGNsb3NlZCBtYW51YWxseSBvciBwcm9ncmFtYXRpY2FsbHkuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBldmVudCBjbG9zZVxuICAgICAgICAgKiBAbWVtYmVyb2YgUG9wdXBcbiAgICAgICAgICogQGluc3RhbmNlXG4gICAgICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICAgICAqIEBwcm9wZXJ0eSB7UG9wdXB9IHBvcHVwIG9iamVjdCB0aGF0IHdhcyBjbG9zZWRcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZmlyZSgnY2xvc2UnKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBnZW9ncmFwaGljYWwgbG9jYXRpb24gb2YgdGhlIHBvcHVwJ3MgYW5jaG9yLlxuICAgICAqXG4gICAgICogQHJldHVybnMge0xuZ0xhdH0gVGhlIGdlb2dyYXBoaWNhbCBsb2NhdGlvbiBvZiB0aGUgcG9wdXAncyBhbmNob3IuXG4gICAgICovXG4gICAgZ2V0TG5nTGF0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG5nTGF0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGdlb2dyYXBoaWNhbCBsb2NhdGlvbiBvZiB0aGUgcG9wdXAncyBhbmNob3IsIGFuZCBtb3ZlcyB0aGUgcG9wdXAgdG8gaXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0xuZ0xhdExpa2V9IGxuZ2xhdCBUaGUgZ2VvZ3JhcGhpY2FsIGxvY2F0aW9uIHRvIHNldCBhcyB0aGUgcG9wdXAncyBhbmNob3IuXG4gICAgICogQHJldHVybnMge1BvcHVwfSBgdGhpc2BcbiAgICAgKi9cbiAgICBzZXRMbmdMYXQobG5nbGF0KSB7XG4gICAgICAgIHRoaXMuX2xuZ0xhdCA9IExuZ0xhdC5jb252ZXJ0KGxuZ2xhdCk7XG4gICAgICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBwb3B1cCdzIGNvbnRlbnQgdG8gYSBzdHJpbmcgb2YgdGV4dC5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBhIFtUZXh0XShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvVGV4dCkgbm9kZSBpbiB0aGUgRE9NLFxuICAgICAqIHNvIGl0IGNhbm5vdCBpbnNlcnQgcmF3IEhUTUwuIFVzZSB0aGlzIG1ldGhvZCBmb3Igc2VjdXJpdHkgYWdhaW5zdCBYU1NcbiAgICAgKiBpZiB0aGUgcG9wdXAgY29udGVudCBpcyB1c2VyLXByb3ZpZGVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgVGV4dHVhbCBjb250ZW50IGZvciB0aGUgcG9wdXAuXG4gICAgICogQHJldHVybnMge1BvcHVwfSBgdGhpc2BcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHZhciBwb3B1cCA9IG5ldyBtYXBib3hnbC5Qb3B1cCgpXG4gICAgICogICAuc2V0TG5nTGF0KGUubG5nTGF0KVxuICAgICAqICAgLnNldFRleHQoJ0hlbGxvLCB3b3JsZCEnKVxuICAgICAqICAgLmFkZFRvKG1hcCk7XG4gICAgICovXG4gICAgc2V0VGV4dCh0ZXh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldERPTUNvbnRlbnQod2luZG93LmRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRleHQpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBwb3B1cCdzIGNvbnRlbnQgdG8gdGhlIEhUTUwgcHJvdmlkZWQgYXMgYSBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBwZXJmb3JtIEhUTUwgZmlsdGVyaW5nIG9yIHNhbml0aXphdGlvbiwgYW5kIG11c3QgYmVcbiAgICAgKiB1c2VkIG9ubHkgd2l0aCB0cnVzdGVkIGNvbnRlbnQuIENvbnNpZGVyIFtgc2V0VGV4dGBdKCNQb3B1cCNzZXRUZXh0KSBpZlxuICAgICAqIHRoZSBjb250ZW50IGlzIGFuIHVudHJ1c3RlZCB0ZXh0IHN0cmluZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBodG1sIEEgc3RyaW5nIHJlcHJlc2VudGluZyBIVE1MIGNvbnRlbnQgZm9yIHRoZSBwb3B1cC5cbiAgICAgKiBAcmV0dXJucyB7UG9wdXB9IGB0aGlzYFxuICAgICAqL1xuICAgIHNldEhUTUwoaHRtbCkge1xuICAgICAgICBjb25zdCBmcmFnID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcbiAgICAgICAgY29uc3QgdGVtcCA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdib2R5Jyk7XG4gICAgICAgIGxldCBjaGlsZDtcbiAgICAgICAgdGVtcC5pbm5lckhUTUwgPSBodG1sO1xuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgY2hpbGQgPSB0ZW1wLmZpcnN0Q2hpbGQ7XG4gICAgICAgICAgICBpZiAoIWNoaWxkKSBicmVhaztcbiAgICAgICAgICAgIGZyYWcuYXBwZW5kQ2hpbGQoY2hpbGQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0RE9NQ29udGVudChmcmFnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBwb3B1cCdzIGNvbnRlbnQgdG8gdGhlIGVsZW1lbnQgcHJvdmlkZWQgYXMgYSBET00gbm9kZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Tm9kZX0gaHRtbE5vZGUgQSBET00gbm9kZSB0byBiZSB1c2VkIGFzIGNvbnRlbnQgZm9yIHRoZSBwb3B1cC5cbiAgICAgKiBAcmV0dXJucyB7UG9wdXB9IGB0aGlzYFxuICAgICAqIEBleGFtcGxlXG4gICAgICogLy8gY3JlYXRlIGFuIGVsZW1lbnQgd2l0aCB0aGUgcG9wdXAgY29udGVudFxuICAgICAqIHZhciBkaXYgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICogZGl2LmlubmVySFRNTCA9ICdIZWxsbywgd29ybGQhJztcbiAgICAgKiB2YXIgcG9wdXAgPSBuZXcgbWFwYm94Z2wuUG9wdXAoKVxuICAgICAqICAgLnNldExuZ0xhdChlLmxuZ0xhdClcbiAgICAgKiAgIC5zZXRET01Db250ZW50KGRpdilcbiAgICAgKiAgIC5hZGRUbyhtYXApO1xuICAgICAqL1xuICAgIHNldERPTUNvbnRlbnQoaHRtbE5vZGUpIHtcbiAgICAgICAgdGhpcy5fY3JlYXRlQ29udGVudCgpO1xuICAgICAgICB0aGlzLl9jb250ZW50LmFwcGVuZENoaWxkKGh0bWxOb2RlKTtcbiAgICAgICAgdGhpcy5fdXBkYXRlKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIF9jcmVhdGVDb250ZW50KCkge1xuICAgICAgICBpZiAodGhpcy5fY29udGVudCAmJiB0aGlzLl9jb250ZW50LnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRlbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLl9jb250ZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2NvbnRlbnQgPSBET00uY3JlYXRlKCdkaXYnLCAnbWFwYm94Z2wtcG9wdXAtY29udGVudCcsIHRoaXMuX2NvbnRhaW5lcik7XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5jbG9zZUJ1dHRvbikge1xuICAgICAgICAgICAgdGhpcy5fY2xvc2VCdXR0b24gPSBET00uY3JlYXRlKCdidXR0b24nLCAnbWFwYm94Z2wtcG9wdXAtY2xvc2UtYnV0dG9uJywgdGhpcy5fY29udGVudCk7XG4gICAgICAgICAgICB0aGlzLl9jbG9zZUJ1dHRvbi50eXBlID0gJ2J1dHRvbic7XG4gICAgICAgICAgICB0aGlzLl9jbG9zZUJ1dHRvbi5pbm5lckhUTUwgPSAnJiMyMTU7JztcbiAgICAgICAgICAgIHRoaXMuX2Nsb3NlQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fb25DbGlja0Nsb3NlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF91cGRhdGUoKSB7XG4gICAgICAgIGlmICghdGhpcy5fbWFwIHx8ICF0aGlzLl9sbmdMYXQgfHwgIXRoaXMuX2NvbnRlbnQpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgaWYgKCF0aGlzLl9jb250YWluZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lciA9IERPTS5jcmVhdGUoJ2RpdicsICdtYXBib3hnbC1wb3B1cCcsIHRoaXMuX21hcC5nZXRDb250YWluZXIoKSk7XG4gICAgICAgICAgICB0aGlzLl90aXAgICAgICAgPSBET00uY3JlYXRlKCdkaXYnLCAnbWFwYm94Z2wtcG9wdXAtdGlwJywgdGhpcy5fY29udGFpbmVyKTtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLl9jb250ZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBhbmNob3IgPSB0aGlzLm9wdGlvbnMuYW5jaG9yO1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBub3JtYWxpemVPZmZzZXQodGhpcy5vcHRpb25zLm9mZnNldCk7XG4gICAgICAgIGNvbnN0IHBvcyA9IHRoaXMuX21hcC5wcm9qZWN0KHRoaXMuX2xuZ0xhdCkucm91bmQoKTtcblxuICAgICAgICBpZiAoIWFuY2hvcikge1xuICAgICAgICAgICAgY29uc3Qgd2lkdGggPSB0aGlzLl9jb250YWluZXIub2Zmc2V0V2lkdGgsXG4gICAgICAgICAgICAgICAgaGVpZ2h0ID0gdGhpcy5fY29udGFpbmVyLm9mZnNldEhlaWdodDtcblxuICAgICAgICAgICAgaWYgKHBvcy55ICsgb2Zmc2V0LmJvdHRvbS55IDwgaGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgYW5jaG9yID0gWyd0b3AnXTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocG9zLnkgPiB0aGlzLl9tYXAudHJhbnNmb3JtLmhlaWdodCAtIGhlaWdodCkge1xuICAgICAgICAgICAgICAgIGFuY2hvciA9IFsnYm90dG9tJ107XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGFuY2hvciA9IFtdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocG9zLnggPCB3aWR0aCAvIDIpIHtcbiAgICAgICAgICAgICAgICBhbmNob3IucHVzaCgnbGVmdCcpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwb3MueCA+IHRoaXMuX21hcC50cmFuc2Zvcm0ud2lkdGggLSB3aWR0aCAvIDIpIHtcbiAgICAgICAgICAgICAgICBhbmNob3IucHVzaCgncmlnaHQnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGFuY2hvci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBhbmNob3IgPSAnYm90dG9tJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYW5jaG9yID0gYW5jaG9yLmpvaW4oJy0nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG9mZnNldGVkUG9zID0gcG9zLmFkZChvZmZzZXRbYW5jaG9yXSk7XG5cbiAgICAgICAgY29uc3QgYW5jaG9yVHJhbnNsYXRlID0ge1xuICAgICAgICAgICAgJ3RvcCc6ICd0cmFuc2xhdGUoLTUwJSwwKScsXG4gICAgICAgICAgICAndG9wLWxlZnQnOiAndHJhbnNsYXRlKDAsMCknLFxuICAgICAgICAgICAgJ3RvcC1yaWdodCc6ICd0cmFuc2xhdGUoLTEwMCUsMCknLFxuICAgICAgICAgICAgJ2JvdHRvbSc6ICd0cmFuc2xhdGUoLTUwJSwtMTAwJSknLFxuICAgICAgICAgICAgJ2JvdHRvbS1sZWZ0JzogJ3RyYW5zbGF0ZSgwLC0xMDAlKScsXG4gICAgICAgICAgICAnYm90dG9tLXJpZ2h0JzogJ3RyYW5zbGF0ZSgtMTAwJSwtMTAwJSknLFxuICAgICAgICAgICAgJ2xlZnQnOiAndHJhbnNsYXRlKDAsLTUwJSknLFxuICAgICAgICAgICAgJ3JpZ2h0JzogJ3RyYW5zbGF0ZSgtMTAwJSwtNTAlKSdcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBjbGFzc0xpc3QgPSB0aGlzLl9jb250YWluZXIuY2xhc3NMaXN0O1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBhbmNob3JUcmFuc2xhdGUpIHtcbiAgICAgICAgICAgIGNsYXNzTGlzdC5yZW1vdmUoYG1hcGJveGdsLXBvcHVwLWFuY2hvci0ke2tleX1gKTtcbiAgICAgICAgfVxuICAgICAgICBjbGFzc0xpc3QuYWRkKGBtYXBib3hnbC1wb3B1cC1hbmNob3ItJHthbmNob3J9YCk7XG5cbiAgICAgICAgRE9NLnNldFRyYW5zZm9ybSh0aGlzLl9jb250YWluZXIsIGAke2FuY2hvclRyYW5zbGF0ZVthbmNob3JdfSB0cmFuc2xhdGUoJHtvZmZzZXRlZFBvcy54fXB4LCR7b2Zmc2V0ZWRQb3MueX1weClgKTtcbiAgICB9XG5cbiAgICBfb25DbGlja0Nsb3NlKCkge1xuICAgICAgICB0aGlzLnJlbW92ZSgpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplT2Zmc2V0KG9mZnNldCkge1xuXG4gICAgaWYgKCFvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZU9mZnNldChuZXcgUG9pbnQoMCwgMCkpO1xuXG4gICAgfSBlbHNlIGlmICh0eXBlb2Ygb2Zmc2V0ID09PSAnbnVtYmVyJykge1xuICAgICAgICAvLyBpbnB1dCBzcGVjaWZpZXMgYSByYWRpdXMgZnJvbSB3aGljaCB0byBjYWxjdWxhdGUgb2Zmc2V0cyBhdCBhbGwgcG9zaXRpb25zXG4gICAgICAgIGNvbnN0IGNvcm5lck9mZnNldCA9IE1hdGgucm91bmQoTWF0aC5zcXJ0KDAuNSAqIE1hdGgucG93KG9mZnNldCwgMikpKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICd0b3AnOiBuZXcgUG9pbnQoMCwgb2Zmc2V0KSxcbiAgICAgICAgICAgICd0b3AtbGVmdCc6IG5ldyBQb2ludChjb3JuZXJPZmZzZXQsIGNvcm5lck9mZnNldCksXG4gICAgICAgICAgICAndG9wLXJpZ2h0JzogbmV3IFBvaW50KC1jb3JuZXJPZmZzZXQsIGNvcm5lck9mZnNldCksXG4gICAgICAgICAgICAnYm90dG9tJzogbmV3IFBvaW50KDAsIC1vZmZzZXQpLFxuICAgICAgICAgICAgJ2JvdHRvbS1sZWZ0JzogbmV3IFBvaW50KGNvcm5lck9mZnNldCwgLWNvcm5lck9mZnNldCksXG4gICAgICAgICAgICAnYm90dG9tLXJpZ2h0JzogbmV3IFBvaW50KC1jb3JuZXJPZmZzZXQsIC1jb3JuZXJPZmZzZXQpLFxuICAgICAgICAgICAgJ2xlZnQnOiBuZXcgUG9pbnQob2Zmc2V0LCAwKSxcbiAgICAgICAgICAgICdyaWdodCc6IG5ldyBQb2ludCgtb2Zmc2V0LCAwKVxuICAgICAgICB9O1xuXG4gICAgfSBlbHNlIGlmIChpc1BvaW50TGlrZShvZmZzZXQpKSB7XG4gICAgICAgIC8vIGlucHV0IHNwZWNpZmllcyBhIHNpbmdsZSBvZmZzZXQgdG8gYmUgYXBwbGllZCB0byBhbGwgcG9zaXRpb25zXG4gICAgICAgIGNvbnN0IGNvbnZlcnRlZE9mZnNldCA9IFBvaW50LmNvbnZlcnQob2Zmc2V0KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICd0b3AnOiBjb252ZXJ0ZWRPZmZzZXQsXG4gICAgICAgICAgICAndG9wLWxlZnQnOiBjb252ZXJ0ZWRPZmZzZXQsXG4gICAgICAgICAgICAndG9wLXJpZ2h0JzogY29udmVydGVkT2Zmc2V0LFxuICAgICAgICAgICAgJ2JvdHRvbSc6IGNvbnZlcnRlZE9mZnNldCxcbiAgICAgICAgICAgICdib3R0b20tbGVmdCc6IGNvbnZlcnRlZE9mZnNldCxcbiAgICAgICAgICAgICdib3R0b20tcmlnaHQnOiBjb252ZXJ0ZWRPZmZzZXQsXG4gICAgICAgICAgICAnbGVmdCc6IGNvbnZlcnRlZE9mZnNldCxcbiAgICAgICAgICAgICdyaWdodCc6IGNvbnZlcnRlZE9mZnNldFxuICAgICAgICB9O1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gaW5wdXQgc3BlY2lmaWVzIGFuIG9mZnNldCBwZXIgcG9zaXRpb25cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICd0b3AnOiBQb2ludC5jb252ZXJ0KG9mZnNldFsndG9wJ10gfHwgWzAsIDBdKSxcbiAgICAgICAgICAgICd0b3AtbGVmdCc6IFBvaW50LmNvbnZlcnQob2Zmc2V0Wyd0b3AtbGVmdCddIHx8IFswLCAwXSksXG4gICAgICAgICAgICAndG9wLXJpZ2h0JzogUG9pbnQuY29udmVydChvZmZzZXRbJ3RvcC1yaWdodCddIHx8IFswLCAwXSksXG4gICAgICAgICAgICAnYm90dG9tJzogUG9pbnQuY29udmVydChvZmZzZXRbJ2JvdHRvbSddIHx8IFswLCAwXSksXG4gICAgICAgICAgICAnYm90dG9tLWxlZnQnOiBQb2ludC5jb252ZXJ0KG9mZnNldFsnYm90dG9tLWxlZnQnXSB8fCBbMCwgMF0pLFxuICAgICAgICAgICAgJ2JvdHRvbS1yaWdodCc6IFBvaW50LmNvbnZlcnQob2Zmc2V0Wydib3R0b20tcmlnaHQnXSB8fCBbMCwgMF0pLFxuICAgICAgICAgICAgJ2xlZnQnOiBQb2ludC5jb252ZXJ0KG9mZnNldFsnbGVmdCddIHx8IFswLCAwXSksXG4gICAgICAgICAgICAncmlnaHQnOiBQb2ludC5jb252ZXJ0KG9mZnNldFsncmlnaHQnXSB8fCBbMCwgMF0pXG4gICAgICAgIH07XG4gICAgfVxufVxuXG5mdW5jdGlvbiBpc1BvaW50TGlrZShpbnB1dCkge1xuICAgIHJldHVybiBpbnB1dCBpbnN0YW5jZW9mIFBvaW50IHx8IEFycmF5LmlzQXJyYXkoaW5wdXQpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFBvcHVwO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBbQWN0b3IgZGVzaWduIHBhdHRlcm5dKGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQWN0b3JfbW9kZWwpXG4gKiB0aGF0IG1haW50YWlucyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gYXN5bmNocm9ub3VzIHRhc2tzIGFuZCB0aGUgb2JqZWN0c1xuICogdGhhdCBzcGluIHRoZW0gb2ZmIC0gaW4gdGhpcyBjYXNlLCB0YXNrcyBsaWtlIHBhcnNpbmcgcGFydHMgb2Ygc3R5bGVzLFxuICogb3duZWQgYnkgdGhlIHN0eWxlc1xuICpcbiAqIEBwYXJhbSB7V2ViV29ya2VyfSB0YXJnZXRcbiAqIEBwYXJhbSB7V2ViV29ya2VyfSBwYXJlbnRcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gbWFwSWQgQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIE1hcCBpbnN0YW5jZSB1c2luZyB0aGlzIEFjdG9yLlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgQWN0b3Ige1xuICAgIGNvbnN0cnVjdG9yKHRhcmdldCwgcGFyZW50LCBtYXBJZCkge1xuICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldDtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgIHRoaXMubWFwSWQgPSBtYXBJZDtcbiAgICAgICAgdGhpcy5jYWxsYmFja3MgPSB7fTtcbiAgICAgICAgdGhpcy5jYWxsYmFja0lEID0gMDtcbiAgICAgICAgdGhpcy5yZWNlaXZlID0gdGhpcy5yZWNlaXZlLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMudGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLnJlY2VpdmUsIGZhbHNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZW5kcyBhIG1lc3NhZ2UgZnJvbSBhIG1haW4tdGhyZWFkIG1hcCB0byBhIFdvcmtlciBvciBmcm9tIGEgV29ya2VyIGJhY2sgdG9cbiAgICAgKiBhIG1haW4tdGhyZWFkIG1hcCBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIFRoZSBuYW1lIG9mIHRoZSB0YXJnZXQgbWV0aG9kIHRvIGludm9rZSBvciAnW3NvdXJjZS10eXBlXS5uYW1lJyBmb3IgYSBtZXRob2Qgb24gYSBXb3JrZXJTb3VyY2UuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGFcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2FsbGJhY2tdXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2J1ZmZlcnNdIEEgbGlzdCBvZiBidWZmZXJzIHRvIFwidHJhbnNmZXJcIiAoc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9UcmFuc2ZlcmFibGUpXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFt0YXJnZXRNYXBJZF0gQSBwYXJ0aWN1bGFyIG1hcElkIHRvIHdoaWNoIHRvIHNlbmQgdGhpcyBtZXNzYWdlLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgc2VuZCh0eXBlLCBkYXRhLCBjYWxsYmFjaywgYnVmZmVycywgdGFyZ2V0TWFwSWQpIHtcbiAgICAgICAgY29uc3QgaWQgPSBjYWxsYmFjayA/IGAke3RoaXMubWFwSWR9OiR7dGhpcy5jYWxsYmFja0lEKyt9YCA6IG51bGw7XG4gICAgICAgIGlmIChjYWxsYmFjaykgdGhpcy5jYWxsYmFja3NbaWRdID0gY2FsbGJhY2s7XG4gICAgICAgIHRoaXMudGFyZ2V0LnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgIHRhcmdldE1hcElkOiB0YXJnZXRNYXBJZCxcbiAgICAgICAgICAgIHNvdXJjZU1hcElkOiB0aGlzLm1hcElkLFxuICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgIGlkOiBTdHJpbmcoaWQpLFxuICAgICAgICAgICAgZGF0YTogZGF0YVxuICAgICAgICB9LCBidWZmZXJzKTtcbiAgICB9XG5cbiAgICByZWNlaXZlKG1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IG1lc3NhZ2UuZGF0YSxcbiAgICAgICAgICAgIGlkID0gZGF0YS5pZDtcbiAgICAgICAgbGV0IGNhbGxiYWNrO1xuXG4gICAgICAgIGlmIChkYXRhLnRhcmdldE1hcElkICYmIHRoaXMubWFwSWQgIT09IGRhdGEudGFyZ2V0TWFwSWQpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY29uc3QgZG9uZSA9IChlcnIsIGRhdGEsIGJ1ZmZlcnMpID0+IHtcbiAgICAgICAgICAgIHRoaXMudGFyZ2V0LnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICBzb3VyY2VNYXBJZDogdGhpcy5tYXBJZCxcbiAgICAgICAgICAgICAgICB0eXBlOiAnPHJlc3BvbnNlPicsXG4gICAgICAgICAgICAgICAgaWQ6IFN0cmluZyhpZCksXG4gICAgICAgICAgICAgICAgZXJyb3I6IGVyciA/IFN0cmluZyhlcnIpIDogbnVsbCxcbiAgICAgICAgICAgICAgICBkYXRhOiBkYXRhXG4gICAgICAgICAgICB9LCBidWZmZXJzKTtcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoZGF0YS50eXBlID09PSAnPHJlc3BvbnNlPicpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gdGhpcy5jYWxsYmFja3NbZGF0YS5pZF07XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5jYWxsYmFja3NbZGF0YS5pZF07XG4gICAgICAgICAgICBpZiAoY2FsbGJhY2spIGNhbGxiYWNrKGRhdGEuZXJyb3IgfHwgbnVsbCwgZGF0YS5kYXRhKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZGF0YS5pZCAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5wYXJlbnRbZGF0YS50eXBlXSkge1xuICAgICAgICAgICAgLy8gZGF0YS50eXBlID09ICdsb2FkVGlsZScsICdyZW1vdmVUaWxlJywgZXRjLlxuICAgICAgICAgICAgdGhpcy5wYXJlbnRbZGF0YS50eXBlXShkYXRhLnNvdXJjZU1hcElkLCBkYXRhLmRhdGEsIGRvbmUpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkYXRhLmlkICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLnBhcmVudC5nZXRXb3JrZXJTb3VyY2UpIHtcbiAgICAgICAgICAgIC8vIGRhdGEudHlwZSA9PSBzb3VyY2V0eXBlLm1ldGhvZFxuICAgICAgICAgICAgY29uc3Qga2V5cyA9IGRhdGEudHlwZS5zcGxpdCgnLicpO1xuICAgICAgICAgICAgY29uc3Qgd29ya2VyU291cmNlID0gdGhpcy5wYXJlbnQuZ2V0V29ya2VyU291cmNlKGRhdGEuc291cmNlTWFwSWQsIGtleXNbMF0pO1xuICAgICAgICAgICAgd29ya2VyU291cmNlW2tleXNbMV1dKGRhdGEuZGF0YSwgZG9uZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnBhcmVudFtkYXRhLnR5cGVdKGRhdGEuZGF0YSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZW1vdmUoKSB7XG4gICAgICAgIHRoaXMudGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLnJlY2VpdmUsIGZhbHNlKTtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gQWN0b3I7XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHdpbmRvdyA9IHJlcXVpcmUoJy4vd2luZG93Jyk7XG5cbmV4cG9ydHMuZ2V0SlNPTiA9IGZ1bmN0aW9uKHVybCwgY2FsbGJhY2spIHtcbiAgICBjb25zdCB4aHIgPSBuZXcgd2luZG93LlhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgeGhyLm9wZW4oJ0dFVCcsIHVybCwgdHJ1ZSk7XG4gICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoJ0FjY2VwdCcsICdhcHBsaWNhdGlvbi9qc29uJyk7XG4gICAgeGhyLm9uZXJyb3IgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgIGNhbGxiYWNrKGUpO1xuICAgIH07XG4gICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoeGhyLnN0YXR1cyA+PSAyMDAgJiYgeGhyLnN0YXR1cyA8IDMwMCAmJiB4aHIucmVzcG9uc2UpIHtcbiAgICAgICAgICAgIGxldCBkYXRhO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBkYXRhID0gSlNPTi5wYXJzZSh4aHIucmVzcG9uc2UpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYWxsYmFjayhudWxsLCBkYXRhKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKG5ldyBFcnJvcih4aHIuc3RhdHVzVGV4dCkpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICB4aHIuc2VuZCgpO1xuICAgIHJldHVybiB4aHI7XG59O1xuXG5leHBvcnRzLmdldEFycmF5QnVmZmVyID0gZnVuY3Rpb24odXJsLCBjYWxsYmFjaykge1xuICAgIGNvbnN0IHhociA9IG5ldyB3aW5kb3cuWE1MSHR0cFJlcXVlc3QoKTtcbiAgICB4aHIub3BlbignR0VUJywgdXJsLCB0cnVlKTtcbiAgICB4aHIucmVzcG9uc2VUeXBlID0gJ2FycmF5YnVmZmVyJztcbiAgICB4aHIub25lcnJvciA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgY2FsbGJhY2soZSk7XG4gICAgfTtcbiAgICB4aHIub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICh4aHIucmVzcG9uc2UuYnl0ZUxlbmd0aCA9PT0gMCAmJiB4aHIuc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoJ2h0dHAgc3RhdHVzIDIwMCByZXR1cm5lZCB3aXRob3V0IGNvbnRlbnQuJykpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh4aHIuc3RhdHVzID49IDIwMCAmJiB4aHIuc3RhdHVzIDwgMzAwICYmIHhoci5yZXNwb25zZSkge1xuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwge1xuICAgICAgICAgICAgICAgIGRhdGE6IHhoci5yZXNwb25zZSxcbiAgICAgICAgICAgICAgICBjYWNoZUNvbnRyb2w6IHhoci5nZXRSZXNwb25zZUhlYWRlcignQ2FjaGUtQ29udHJvbCcpLFxuICAgICAgICAgICAgICAgIGV4cGlyZXM6IHhoci5nZXRSZXNwb25zZUhlYWRlcignRXhwaXJlcycpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKG5ldyBFcnJvcih4aHIuc3RhdHVzVGV4dCkpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICB4aHIuc2VuZCgpO1xuICAgIHJldHVybiB4aHI7XG59O1xuXG5mdW5jdGlvbiBzYW1lT3JpZ2luKHVybCkge1xuICAgIGNvbnN0IGEgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgIGEuaHJlZiA9IHVybDtcbiAgICByZXR1cm4gYS5wcm90b2NvbCA9PT0gd2luZG93LmRvY3VtZW50LmxvY2F0aW9uLnByb3RvY29sICYmIGEuaG9zdCA9PT0gd2luZG93LmRvY3VtZW50LmxvY2F0aW9uLmhvc3Q7XG59XG5cbmNvbnN0IHRyYW5zcGFyZW50UG5nVXJsID0gJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQUVBQUFBQkNBWUFBQUFmRmNTSkFBQUFDMGxFUVZRWVYyTmdBQUlBQUFVQUFhclZ5RkVBQUFBQVNVVk9SSzVDWUlJPSc7XG5cbmV4cG9ydHMuZ2V0SW1hZ2UgPSBmdW5jdGlvbih1cmwsIGNhbGxiYWNrKSB7XG4gICAgLy8gcmVxdWVzdCB0aGUgaW1hZ2Ugd2l0aCBYSFIgdG8gd29yayBhcm91bmQgY2FjaGluZyBpc3N1ZXNcbiAgICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wtanMvaXNzdWVzLzE0NzBcbiAgICByZXR1cm4gZXhwb3J0cy5nZXRBcnJheUJ1ZmZlcih1cmwsIChlcnIsIGltZ0RhdGEpID0+IHtcbiAgICAgICAgaWYgKGVycikgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICAgIGNvbnN0IGltZyA9IG5ldyB3aW5kb3cuSW1hZ2UoKTtcbiAgICAgICAgY29uc3QgVVJMID0gd2luZG93LlVSTCB8fCB3aW5kb3cud2Via2l0VVJMO1xuICAgICAgICBpbWcub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgaW1nKTtcbiAgICAgICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwoaW1nLnNyYyk7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGJsb2IgPSBuZXcgd2luZG93LkJsb2IoW25ldyBVaW50OEFycmF5KGltZ0RhdGEuZGF0YSldLCB7IHR5cGU6ICdpbWFnZS9wbmcnIH0pO1xuICAgICAgICBpbWcuY2FjaGVDb250cm9sID0gaW1nRGF0YS5jYWNoZUNvbnRyb2w7XG4gICAgICAgIGltZy5leHBpcmVzID0gaW1nRGF0YS5leHBpcmVzO1xuICAgICAgICBpbWcuc3JjID0gaW1nRGF0YS5kYXRhLmJ5dGVMZW5ndGggPyBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpIDogdHJhbnNwYXJlbnRQbmdVcmw7XG4gICAgfSk7XG59O1xuXG5leHBvcnRzLmdldFZpZGVvID0gZnVuY3Rpb24odXJscywgY2FsbGJhY2spIHtcbiAgICBjb25zdCB2aWRlbyA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCd2aWRlbycpO1xuICAgIHZpZGVvLm9ubG9hZHN0YXJ0ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIGNhbGxiYWNrKG51bGwsIHZpZGVvKTtcbiAgICB9O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdXJscy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBzID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NvdXJjZScpO1xuICAgICAgICBpZiAoIXNhbWVPcmlnaW4odXJsc1tpXSkpIHtcbiAgICAgICAgICAgIHZpZGVvLmNyb3NzT3JpZ2luID0gJ0Fub255bW91cyc7XG4gICAgICAgIH1cbiAgICAgICAgcy5zcmMgPSB1cmxzW2ldO1xuICAgICAgICB2aWRlby5hcHBlbmRDaGlsZChzKTtcbiAgICB9XG4gICAgcmV0dXJuIHZpZGVvO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBAbW9kdWxlIGJyb3dzZXJcbiAqIEBwcml2YXRlXG4gKi9cblxuY29uc3Qgd2luZG93ID0gcmVxdWlyZSgnLi93aW5kb3cnKTtcblxuLyoqXG4gKiBQcm92aWRlcyBhIGZ1bmN0aW9uIHRoYXQgb3V0cHV0cyBtaWxsaXNlY29uZHM6IGVpdGhlciBwZXJmb3JtYW5jZS5ub3coKVxuICogb3IgYSBmYWxsYmFjayB0byBEYXRlLm5vdygpXG4gKi9cbm1vZHVsZS5leHBvcnRzLm5vdyA9IChmdW5jdGlvbigpIHtcbiAgICBpZiAod2luZG93LnBlcmZvcm1hbmNlICYmXG4gICAgICAgIHdpbmRvdy5wZXJmb3JtYW5jZS5ub3cpIHtcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5wZXJmb3JtYW5jZS5ub3cuYmluZCh3aW5kb3cucGVyZm9ybWFuY2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBEYXRlLm5vdy5iaW5kKERhdGUpO1xuICAgIH1cbn0oKSk7XG5cbmNvbnN0IGZyYW1lID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSB8fFxuICAgIHdpbmRvdy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcbiAgICB3aW5kb3cud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8XG4gICAgd2luZG93Lm1zUmVxdWVzdEFuaW1hdGlvbkZyYW1lO1xuXG5leHBvcnRzLmZyYW1lID0gZnVuY3Rpb24oZm4pIHtcbiAgICByZXR1cm4gZnJhbWUoZm4pO1xufTtcblxuY29uc3QgY2FuY2VsID0gd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lIHx8XG4gICAgd2luZG93Lm1vekNhbmNlbEFuaW1hdGlvbkZyYW1lIHx8XG4gICAgd2luZG93LndlYmtpdENhbmNlbEFuaW1hdGlvbkZyYW1lIHx8XG4gICAgd2luZG93Lm1zQ2FuY2VsQW5pbWF0aW9uRnJhbWU7XG5cbmV4cG9ydHMuY2FuY2VsRnJhbWUgPSBmdW5jdGlvbihpZCkge1xuICAgIGNhbmNlbChpZCk7XG59O1xuXG5leHBvcnRzLnRpbWVkID0gZnVuY3Rpb24gKGZuLCBkdXIsIGN0eCkge1xuICAgIGlmICghZHVyKSB7XG4gICAgICAgIGZuLmNhbGwoY3R4LCAxKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgbGV0IGFib3J0ID0gZmFsc2U7XG4gICAgY29uc3Qgc3RhcnQgPSBtb2R1bGUuZXhwb3J0cy5ub3coKTtcblxuICAgIGZ1bmN0aW9uIHRpY2sobm93KSB7XG4gICAgICAgIGlmIChhYm9ydCkgcmV0dXJuO1xuICAgICAgICBub3cgPSBtb2R1bGUuZXhwb3J0cy5ub3coKTtcblxuICAgICAgICBpZiAobm93ID49IHN0YXJ0ICsgZHVyKSB7XG4gICAgICAgICAgICBmbi5jYWxsKGN0eCwgMSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmbi5jYWxsKGN0eCwgKG5vdyAtIHN0YXJ0KSAvIGR1cik7XG4gICAgICAgICAgICBleHBvcnRzLmZyYW1lKHRpY2spO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZXhwb3J0cy5mcmFtZSh0aWNrKTtcblxuICAgIHJldHVybiBmdW5jdGlvbigpIHsgYWJvcnQgPSB0cnVlOyB9O1xufTtcblxuZXhwb3J0cy5nZXRJbWFnZURhdGEgPSBmdW5jdGlvbiAoaW1nKSB7XG4gICAgY29uc3QgY2FudmFzID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIGNvbnN0IGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICBjYW52YXMud2lkdGggPSBpbWcud2lkdGg7XG4gICAgY2FudmFzLmhlaWdodCA9IGltZy5oZWlnaHQ7XG4gICAgY29udGV4dC5kcmF3SW1hZ2UoaW1nLCAwLCAwKTtcbiAgICByZXR1cm4gY29udGV4dC5nZXRJbWFnZURhdGEoMCwgMCwgaW1nLndpZHRoLCBpbWcuaGVpZ2h0KS5kYXRhO1xufTtcblxuLyoqXG4gKiBUZXN0IGlmIHRoZSBjdXJyZW50IGJyb3dzZXIgc3VwcG9ydHMgTWFwYm94IEdMIEpTXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5mYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0PWZhbHNlXSBSZXR1cm4gYGZhbHNlYFxuICogICBpZiB0aGUgcGVyZm9ybWFuY2Ugb2YgTWFwYm94IEdMIEpTIHdvdWxkIGJlIGRyYW1hdGljYWxseSB3b3JzZSB0aGFuXG4gKiAgIGV4cGVjdGVkIChpLmUuIGEgc29mdHdhcmUgcmVuZGVyZXIgd291bGQgYmUgdXNlZClcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbmV4cG9ydHMuc3VwcG9ydGVkID0gcmVxdWlyZSgnbWFwYm94LWdsLXN1cHBvcnRlZCcpO1xuXG5leHBvcnRzLmhhcmR3YXJlQ29uY3VycmVuY3kgPSB3aW5kb3cubmF2aWdhdG9yLmhhcmR3YXJlQ29uY3VycmVuY3kgfHwgNDtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdkZXZpY2VQaXhlbFJhdGlvJywge1xuICAgIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbzsgfVxufSk7XG5cbmV4cG9ydHMuc3VwcG9ydHNXZWJwID0gZmFsc2U7XG5cbmNvbnN0IHdlYnBJbWdUZXN0ID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpO1xud2VicEltZ1Rlc3Qub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgZXhwb3J0cy5zdXBwb3J0c1dlYnAgPSB0cnVlO1xufTtcbndlYnBJbWdUZXN0LnNyYyA9ICdkYXRhOmltYWdlL3dlYnA7YmFzZTY0LFVrbEdSaDRBQUFCWFJVSlFWbEE0VEJFQUFBQXZBUUFBQUFmUS8vNzN2LytCaU9oL0FBQT0nO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBXZWJXb3JraWZ5ID0gcmVxdWlyZSgnd2Vid29ya2lmeScpO1xuY29uc3Qgd2luZG93ID0gcmVxdWlyZSgnLi4vd2luZG93Jyk7XG5jb25zdCB3b3JrZXJVUkwgPSB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgV2ViV29ya2lmeShyZXF1aXJlKCcuLi8uLi9zb3VyY2Uvd29ya2VyJyksIHtiYXJlOiB0cnVlfSkpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbmV3IHdpbmRvdy5Xb3JrZXIod29ya2VyVVJMKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qIGVzbGludC1lbnYgYnJvd3NlciAqL1xubW9kdWxlLmV4cG9ydHMgPSBzZWxmO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBxdWlja3NlbGVjdCA9IHJlcXVpcmUoJ3F1aWNrc2VsZWN0Jyk7XG5jb25zdCBjYWxjdWxhdGVTaWduZWRBcmVhID0gcmVxdWlyZSgnLi91dGlsJykuY2FsY3VsYXRlU2lnbmVkQXJlYTtcblxuLy8gY2xhc3NpZmllcyBhbiBhcnJheSBvZiByaW5ncyBpbnRvIHBvbHlnb25zIHdpdGggb3V0ZXIgcmluZ3MgYW5kIGhvbGVzXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGNsYXNzaWZ5UmluZ3MocmluZ3MsIG1heFJpbmdzKSB7XG4gICAgY29uc3QgbGVuID0gcmluZ3MubGVuZ3RoO1xuXG4gICAgaWYgKGxlbiA8PSAxKSByZXR1cm4gW3JpbmdzXTtcblxuICAgIGNvbnN0IHBvbHlnb25zID0gW107XG4gICAgbGV0IHBvbHlnb24sXG4gICAgICAgIGNjdztcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgY29uc3QgYXJlYSA9IGNhbGN1bGF0ZVNpZ25lZEFyZWEocmluZ3NbaV0pO1xuICAgICAgICBpZiAoYXJlYSA9PT0gMCkgY29udGludWU7XG5cbiAgICAgICAgcmluZ3NbaV0uYXJlYSA9IE1hdGguYWJzKGFyZWEpO1xuXG4gICAgICAgIGlmIChjY3cgPT09IHVuZGVmaW5lZCkgY2N3ID0gYXJlYSA8IDA7XG5cbiAgICAgICAgaWYgKGNjdyA9PT0gYXJlYSA8IDApIHtcbiAgICAgICAgICAgIGlmIChwb2x5Z29uKSBwb2x5Z29ucy5wdXNoKHBvbHlnb24pO1xuICAgICAgICAgICAgcG9seWdvbiA9IFtyaW5nc1tpXV07XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBvbHlnb24ucHVzaChyaW5nc1tpXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHBvbHlnb24pIHBvbHlnb25zLnB1c2gocG9seWdvbik7XG5cbiAgICAvLyBFYXJjdXQgcGVyZm9ybWFuY2UgZGVncmFnZXMgd2l0aCB0aGUgIyBvZiByaW5ncyBpbiBhIHBvbHlnb24uIEZvciB0aGlzXG4gICAgLy8gcmVhc29uLCB3ZSBsaW1pdCBzdHJpcCBvdXQgYWxsIGJ1dCB0aGUgYG1heFJpbmdzYCBsYXJnZXN0IHJpbmdzLlxuICAgIGlmIChtYXhSaW5ncyA+IDEpIHtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBwb2x5Z29ucy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgaWYgKHBvbHlnb25zW2pdLmxlbmd0aCA8PSBtYXhSaW5ncykgY29udGludWU7XG4gICAgICAgICAgICBxdWlja3NlbGVjdChwb2x5Z29uc1tqXSwgbWF4UmluZ3MsIDEsIHBvbHlnb25zW2pdLmxlbmd0aCAtIDEsIGNvbXBhcmVBcmVhcyk7XG4gICAgICAgICAgICBwb2x5Z29uc1tqXSA9IHBvbHlnb25zW2pdLnNsaWNlKDAsIG1heFJpbmdzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwb2x5Z29ucztcbn07XG5cbmZ1bmN0aW9uIGNvbXBhcmVBcmVhcyhhLCBiKSB7XG4gICAgcmV0dXJuIGIuYXJlYSAtIGEuYXJlYTtcbn1cbiIsIid1c2Ugc3RyaWN0Jztcbi8vICAgICAgXG5cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgXG4gICBcblxuY29uc3QgY29uZmlnICAgICAgICAgPSB7XG4gICAgQVBJX1VSTDogJ2h0dHBzOi8vYXBpLm1hcGJveC5jb20nLFxuICAgIFJFUVVJUkVfQUNDRVNTX1RPS0VOOiB0cnVlLFxuICAgIEFDQ0VTU19UT0tFTjogbnVsbFxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBjb25maWc7XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpO1xuXG5jbGFzcyBEaWN0aW9uYXJ5Q29kZXIge1xuXG4gICAgY29uc3RydWN0b3Ioc3RyaW5ncykge1xuICAgICAgICB0aGlzLl9zdHJpbmdUb051bWJlciA9IHt9O1xuICAgICAgICB0aGlzLl9udW1iZXJUb1N0cmluZyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0cmluZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHN0cmluZyA9IHN0cmluZ3NbaV07XG4gICAgICAgICAgICB0aGlzLl9zdHJpbmdUb051bWJlcltzdHJpbmddID0gaTtcbiAgICAgICAgICAgIHRoaXMuX251bWJlclRvU3RyaW5nW2ldID0gc3RyaW5nO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZW5jb2RlKHN0cmluZykge1xuICAgICAgICBhc3NlcnQoc3RyaW5nIGluIHRoaXMuX3N0cmluZ1RvTnVtYmVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0cmluZ1RvTnVtYmVyW3N0cmluZ107XG4gICAgfVxuXG4gICAgZGVjb2RlKG4pIHtcbiAgICAgICAgYXNzZXJ0KG4gPCB0aGlzLl9udW1iZXJUb1N0cmluZy5sZW5ndGgpO1xuICAgICAgICByZXR1cm4gdGhpcy5fbnVtYmVyVG9TdHJpbmdbbl07XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IERpY3Rpb25hcnlDb2RlcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xuY29uc3QgQWN0b3IgPSByZXF1aXJlKCcuL2FjdG9yJyk7XG5cbi8qKlxuICogUmVzcG9uc2libGUgZm9yIHNlbmRpbmcgbWVzc2FnZXMgZnJvbSBhIHtAbGluayBTb3VyY2V9IHRvIGFuIGFzc29jaWF0ZWRcbiAqIHtAbGluayBXb3JrZXJTb3VyY2V9LlxuICpcbiAqIEBpbnRlcmZhY2UgRGlzcGF0Y2hlclxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgRGlzcGF0Y2hlciB7XG5cbiAgICBjb25zdHJ1Y3Rvcih3b3JrZXJQb29sLCBwYXJlbnQpIHtcbiAgICAgICAgdGhpcy53b3JrZXJQb29sID0gd29ya2VyUG9vbDtcbiAgICAgICAgdGhpcy5hY3RvcnMgPSBbXTtcbiAgICAgICAgdGhpcy5jdXJyZW50QWN0b3IgPSAwO1xuICAgICAgICB0aGlzLmlkID0gdXRpbC51bmlxdWVJZCgpO1xuICAgICAgICBjb25zdCB3b3JrZXJzID0gdGhpcy53b3JrZXJQb29sLmFjcXVpcmUodGhpcy5pZCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgd29ya2Vycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qgd29ya2VyID0gd29ya2Vyc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IGFjdG9yID0gbmV3IEFjdG9yKHdvcmtlciwgcGFyZW50LCB0aGlzLmlkKTtcbiAgICAgICAgICAgIGFjdG9yLm5hbWUgPSBgV29ya2VyICR7aX1gO1xuICAgICAgICAgICAgdGhpcy5hY3RvcnMucHVzaChhY3Rvcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCcm9hZGNhc3QgYSBtZXNzYWdlIHRvIGFsbCBXb3JrZXJzLlxuICAgICAqIEBtZXRob2RcbiAgICAgKiBAbmFtZSBicm9hZGNhc3RcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICAgKiBAbWVtYmVyb2YgRGlzcGF0Y2hlclxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqL1xuICAgIGJyb2FkY2FzdCh0eXBlLCBkYXRhLCBjYikge1xuICAgICAgICBjYiA9IGNiIHx8IGZ1bmN0aW9uICgpIHt9O1xuICAgICAgICB1dGlsLmFzeW5jQWxsKHRoaXMuYWN0b3JzLCAoYWN0b3IsIGRvbmUpID0+IHtcbiAgICAgICAgICAgIGFjdG9yLnNlbmQodHlwZSwgZGF0YSwgZG9uZSk7XG4gICAgICAgIH0sIGNiKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZW5kIGEgbWVzc2FnZSB0byBhIFdvcmtlci5cbiAgICAgKiBAbWV0aG9kXG4gICAgICogQG5hbWUgc2VuZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGFcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfHVuZGVmaW5lZH0gW3RhcmdldElEXSBUaGUgSUQgb2YgdGhlIFdvcmtlciB0byB3aGljaCB0byBzZW5kIHRoaXMgbWVzc2FnZS4gT21pdCB0byBhbGxvdyB0aGUgZGlzcGF0Y2hlciB0byBjaG9vc2UuXG4gICAgICogQHJldHVybnMge251bWJlcn0gVGhlIElEIG9mIHRoZSB3b3JrZXIgdG8gd2hpY2ggdGhlIG1lc3NhZ2Ugd2FzIHNlbnQuXG4gICAgICogQG1lbWJlcm9mIERpc3BhdGNoZXJcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKi9cbiAgICBzZW5kKHR5cGUsIGRhdGEsIGNhbGxiYWNrLCB0YXJnZXRJRCwgYnVmZmVycykge1xuICAgICAgICBpZiAodHlwZW9mIHRhcmdldElEICE9PSAnbnVtYmVyJyB8fCBpc05hTih0YXJnZXRJRCkpIHtcbiAgICAgICAgICAgIC8vIFVzZSByb3VuZCByb2JpbiB0byBzZW5kIHJlcXVlc3RzIHRvIHdlYiB3b3JrZXJzLlxuICAgICAgICAgICAgdGFyZ2V0SUQgPSB0aGlzLmN1cnJlbnRBY3RvciA9ICh0aGlzLmN1cnJlbnRBY3RvciArIDEpICUgdGhpcy5hY3RvcnMubGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hY3RvcnNbdGFyZ2V0SURdLnNlbmQodHlwZSwgZGF0YSwgY2FsbGJhY2ssIGJ1ZmZlcnMpO1xuICAgICAgICByZXR1cm4gdGFyZ2V0SUQ7XG4gICAgfVxuXG4gICAgcmVtb3ZlKCkge1xuICAgICAgICB0aGlzLmFjdG9ycy5mb3JFYWNoKChhY3RvcikgPT4geyBhY3Rvci5yZW1vdmUoKTsgfSk7XG4gICAgICAgIHRoaXMuYWN0b3JzID0gW107XG4gICAgICAgIHRoaXMud29ya2VyUG9vbC5yZWxlYXNlKHRoaXMuaWQpO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBEaXNwYXRjaGVyO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBQb2ludCA9IHJlcXVpcmUoJ3BvaW50LWdlb21ldHJ5Jyk7XG5jb25zdCB3aW5kb3cgPSByZXF1aXJlKCcuL3dpbmRvdycpO1xuXG5leHBvcnRzLmNyZWF0ZSA9IGZ1bmN0aW9uICh0YWdOYW1lLCBjbGFzc05hbWUsIGNvbnRhaW5lcikge1xuICAgIGNvbnN0IGVsID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnTmFtZSk7XG4gICAgaWYgKGNsYXNzTmFtZSkgZWwuY2xhc3NOYW1lID0gY2xhc3NOYW1lO1xuICAgIGlmIChjb250YWluZXIpIGNvbnRhaW5lci5hcHBlbmRDaGlsZChlbCk7XG4gICAgcmV0dXJuIGVsO1xufTtcblxuY29uc3QgZG9jU3R5bGUgPSB3aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlO1xuXG5mdW5jdGlvbiB0ZXN0UHJvcChwcm9wcykge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHByb3BzW2ldIGluIGRvY1N0eWxlKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvcHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHByb3BzWzBdO1xufVxuXG5jb25zdCBzZWxlY3RQcm9wID0gdGVzdFByb3AoWyd1c2VyU2VsZWN0JywgJ01velVzZXJTZWxlY3QnLCAnV2Via2l0VXNlclNlbGVjdCcsICdtc1VzZXJTZWxlY3QnXSk7XG5sZXQgdXNlclNlbGVjdDtcbmV4cG9ydHMuZGlzYWJsZURyYWcgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHNlbGVjdFByb3ApIHtcbiAgICAgICAgdXNlclNlbGVjdCA9IGRvY1N0eWxlW3NlbGVjdFByb3BdO1xuICAgICAgICBkb2NTdHlsZVtzZWxlY3RQcm9wXSA9ICdub25lJztcbiAgICB9XG59O1xuZXhwb3J0cy5lbmFibGVEcmFnID0gZnVuY3Rpb24gKCkge1xuICAgIGlmIChzZWxlY3RQcm9wKSB7XG4gICAgICAgIGRvY1N0eWxlW3NlbGVjdFByb3BdID0gdXNlclNlbGVjdDtcbiAgICB9XG59O1xuXG5jb25zdCB0cmFuc2Zvcm1Qcm9wID0gdGVzdFByb3AoWyd0cmFuc2Zvcm0nLCAnV2Via2l0VHJhbnNmb3JtJ10pO1xuZXhwb3J0cy5zZXRUcmFuc2Zvcm0gPSBmdW5jdGlvbihlbCwgdmFsdWUpIHtcbiAgICBlbC5zdHlsZVt0cmFuc2Zvcm1Qcm9wXSA9IHZhbHVlO1xufTtcblxuLy8gU3VwcHJlc3MgdGhlIG5leHQgY2xpY2ssIGJ1dCBvbmx5IGlmIGl0J3MgaW1tZWRpYXRlLlxuZnVuY3Rpb24gc3VwcHJlc3NDbGljayhlKSB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc3VwcHJlc3NDbGljaywgdHJ1ZSk7XG59XG5leHBvcnRzLnN1cHByZXNzQ2xpY2sgPSBmdW5jdGlvbigpIHtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBzdXBwcmVzc0NsaWNrLCB0cnVlKTtcbiAgICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHN1cHByZXNzQ2xpY2ssIHRydWUpO1xuICAgIH0sIDApO1xufTtcblxuZXhwb3J0cy5tb3VzZVBvcyA9IGZ1bmN0aW9uIChlbCwgZSkge1xuICAgIGNvbnN0IHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBlID0gZS50b3VjaGVzID8gZS50b3VjaGVzWzBdIDogZTtcbiAgICByZXR1cm4gbmV3IFBvaW50KFxuICAgICAgICBlLmNsaWVudFggLSByZWN0LmxlZnQgLSBlbC5jbGllbnRMZWZ0LFxuICAgICAgICBlLmNsaWVudFkgLSByZWN0LnRvcCAtIGVsLmNsaWVudFRvcFxuICAgICk7XG59O1xuXG5leHBvcnRzLnRvdWNoUG9zID0gZnVuY3Rpb24gKGVsLCBlKSB7XG4gICAgY29uc3QgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFxuICAgICAgICBwb2ludHMgPSBbXTtcbiAgICBjb25zdCB0b3VjaGVzID0gKGUudHlwZSA9PT0gJ3RvdWNoZW5kJykgPyBlLmNoYW5nZWRUb3VjaGVzIDogZS50b3VjaGVzO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdG91Y2hlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBwb2ludHMucHVzaChuZXcgUG9pbnQoXG4gICAgICAgICAgICB0b3VjaGVzW2ldLmNsaWVudFggLSByZWN0LmxlZnQgLSBlbC5jbGllbnRMZWZ0LFxuICAgICAgICAgICAgdG91Y2hlc1tpXS5jbGllbnRZIC0gcmVjdC50b3AgLSBlbC5jbGllbnRUb3BcbiAgICAgICAgKSk7XG4gICAgfVxuICAgIHJldHVybiBwb2ludHM7XG59O1xuXG5leHBvcnRzLnJlbW92ZSA9IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICBpZiAobm9kZS5wYXJlbnROb2RlKSB7XG4gICAgICAgIG5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChub2RlKTtcbiAgICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCB1dGlsID0gcmVxdWlyZSgnLi91dGlsJyk7XG5cbi8qKlxuICogTWV0aG9kcyBtaXhlZCBpbiB0byBvdGhlciBjbGFzc2VzIGZvciBldmVudCBjYXBhYmlsaXRpZXMuXG4gKlxuICogQG1peGluIEV2ZW50ZWRcbiAqL1xuY2xhc3MgRXZlbnRlZCB7XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgbGlzdGVuZXIgdG8gYSBzcGVjaWZpZWQgZXZlbnQgdHlwZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIFRoZSBldmVudCB0eXBlIHRvIGFkZCBhIGxpc3RlbiBmb3IuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXIgVGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBldmVudCBpcyBmaXJlZC5cbiAgICAgKiAgIFRoZSBsaXN0ZW5lciBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCB0aGUgZGF0YSBvYmplY3QgcGFzc2VkIHRvIGBmaXJlYCxcbiAgICAgKiAgIGV4dGVuZGVkIHdpdGggYHRhcmdldGAgYW5kIGB0eXBlYCBwcm9wZXJ0aWVzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IGB0aGlzYFxuICAgICAqL1xuICAgIG9uKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuX2xpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVycyB8fCB7fTtcbiAgICAgICAgdGhpcy5fbGlzdGVuZXJzW3R5cGVdID0gdGhpcy5fbGlzdGVuZXJzW3R5cGVdIHx8IFtdO1xuICAgICAgICB0aGlzLl9saXN0ZW5lcnNbdHlwZV0ucHVzaChsaXN0ZW5lcik7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBldmVudCBsaXN0ZW5lci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIFRoZSBldmVudCB0eXBlIHRvIHJlbW92ZSBsaXN0ZW5lcnMgZm9yLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyIFRoZSBsaXN0ZW5lciBmdW5jdGlvbiB0byByZW1vdmUuXG4gICAgICogQHJldHVybnMge09iamVjdH0gYHRoaXNgXG4gICAgICovXG4gICAgb2ZmKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgICAgIGlmICh0aGlzLl9saXN0ZW5lcnMgJiYgdGhpcy5fbGlzdGVuZXJzW3R5cGVdKSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuX2xpc3RlbmVyc1t0eXBlXS5pbmRleE9mKGxpc3RlbmVyKTtcbiAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9saXN0ZW5lcnNbdHlwZV0uc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBsaXN0ZW5lciB0aGF0IHdpbGwgYmUgY2FsbGVkIG9ubHkgb25jZSB0byBhIHNwZWNpZmllZCBldmVudCB0eXBlLlxuICAgICAqXG4gICAgICogVGhlIGxpc3RlbmVyIHdpbGwgYmUgY2FsbGVkIGZpcnN0IHRpbWUgdGhlIGV2ZW50IGZpcmVzIGFmdGVyIHRoZSBsaXN0ZW5lciBpcyByZWdpc3RlcmVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgVGhlIGV2ZW50IHR5cGUgdG8gbGlzdGVuIGZvci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lciBUaGUgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGV2ZW50IGlzIGZpcmVkIHRoZSBmaXJzdCB0aW1lLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IGB0aGlzYFxuICAgICAqL1xuICAgIG9uY2UodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgICAgY29uc3Qgd3JhcHBlciA9IChkYXRhKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9mZih0eXBlLCB3cmFwcGVyKTtcbiAgICAgICAgICAgIGxpc3RlbmVyLmNhbGwodGhpcywgZGF0YSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMub24odHlwZSwgd3JhcHBlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpcmVzIGFuIGV2ZW50IG9mIHRoZSBzcGVjaWZpZWQgdHlwZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIFRoZSB0eXBlIG9mIGV2ZW50IHRvIGZpcmUuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtkYXRhXSBEYXRhIHRvIGJlIHBhc3NlZCB0byBhbnkgbGlzdGVuZXJzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IGB0aGlzYFxuICAgICAqL1xuICAgIGZpcmUodHlwZSwgZGF0YSkge1xuICAgICAgICBpZiAodGhpcy5saXN0ZW5zKHR5cGUpKSB7XG5cbiAgICAgICAgICAgIGRhdGEgPSB1dGlsLmV4dGVuZCh7fSwgZGF0YSwge3R5cGU6IHR5cGUsIHRhcmdldDogdGhpc30pO1xuXG4gICAgICAgICAgICAvLyBtYWtlIHN1cmUgYWRkaW5nIG9yIHJlbW92aW5nIGxpc3RlbmVycyBpbnNpZGUgb3RoZXIgbGlzdGVuZXJzIHdvbid0IGNhdXNlIGFuIGluZmluaXRlIGxvb3BcbiAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVycyAmJiB0aGlzLl9saXN0ZW5lcnNbdHlwZV0gPyB0aGlzLl9saXN0ZW5lcnNbdHlwZV0uc2xpY2UoKSA6IFtdO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxpc3RlbmVyc1tpXS5jYWxsKHRoaXMsIGRhdGEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5fZXZlbnRlZFBhcmVudCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50ZWRQYXJlbnQuZmlyZSh0eXBlLCB1dGlsLmV4dGVuZCh7fSwgZGF0YSwgdGhpcy5fZXZlbnRlZFBhcmVudERhdGEpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAvLyBUbyBlbnN1cmUgdGhhdCBubyBlcnJvciBldmVudHMgYXJlIGRyb3BwZWQsIHByaW50IHRoZW0gdG8gdGhlXG4gICAgICAgIC8vIGNvbnNvbGUgaWYgdGhleSBoYXZlIG5vIGxpc3RlbmVycy5cbiAgICAgICAgfSBlbHNlIGlmICh1dGlsLmVuZHNXaXRoKHR5cGUsICdlcnJvcicpKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKChkYXRhICYmIGRhdGEuZXJyb3IpIHx8IGRhdGEgfHwgJ0VtcHR5IGVycm9yIGV2ZW50Jyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgdHJ1ZSBpZiB0aGlzIGluc3RhbmNlIG9mIEV2ZW50ZWQgb3IgYW55IGZvcndhcmRlZWQgaW5zdGFuY2VzIG9mIEV2ZW50ZWQgaGF2ZSBhIGxpc3RlbmVyIGZvciB0aGUgc3BlY2lmaWVkIHR5cGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBUaGUgZXZlbnQgdHlwZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIHJlZ2lzdGVyZWQgbGlzdGVuZXIgZm9yIHNwZWNpZmllZCBldmVudCB0eXBlLCBgZmFsc2VgIG90aGVyd2lzZVxuICAgICAqL1xuICAgIGxpc3RlbnModHlwZSkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKHRoaXMuX2xpc3RlbmVycyAmJiB0aGlzLl9saXN0ZW5lcnNbdHlwZV0pIHx8XG4gICAgICAgICAgICAodGhpcy5fZXZlbnRlZFBhcmVudCAmJiB0aGlzLl9ldmVudGVkUGFyZW50Lmxpc3RlbnModHlwZSkpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQnViYmxlIGFsbCBldmVudHMgZmlyZWQgYnkgdGhpcyBpbnN0YW5jZSBvZiBFdmVudGVkIHRvIHRoaXMgcGFyZW50IGluc3RhbmNlIG9mIEV2ZW50ZWQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7cGFyZW50fVxuICAgICAqIEBwYXJhbSB7ZGF0YX1cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBgdGhpc2BcbiAgICAgKi9cbiAgICBzZXRFdmVudGVkUGFyZW50KHBhcmVudCwgZGF0YSkge1xuICAgICAgICB0aGlzLl9ldmVudGVkUGFyZW50ID0gcGFyZW50O1xuICAgICAgICB0aGlzLl9ldmVudGVkUGFyZW50RGF0YSA9IHR5cGVvZiBkYXRhID09PSAnZnVuY3Rpb24nID8gZGF0YSgpIDogZGF0YTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gRXZlbnRlZDtcbiIsIid1c2Ugc3RyaWN0JztcbmNvbnN0IFF1ZXVlID0gcmVxdWlyZSgndGlueXF1ZXVlJyk7XG5jb25zdCBQb2ludCA9IHJlcXVpcmUoJ3BvaW50LWdlb21ldHJ5Jyk7XG5jb25zdCBkaXN0VG9TZWdtZW50U3F1YXJlZCA9IHJlcXVpcmUoJy4vaW50ZXJzZWN0aW9uX3Rlc3RzJykuZGlzdFRvU2VnbWVudFNxdWFyZWQ7XG5cbi8qKlxuICogRmluZHMgYW4gYXBwcm94aW1hdGlvbiBvZiBhIHBvbHlnb24ncyBQb2xlIE9mIEluYWNjZXNzaWJpbGl5IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1BvbGVfb2ZfaW5hY2Nlc3NpYmlsaXR5XG4gKiBUaGlzIGlzIGEgY29weSBvZiBodHRwOi8vZ2l0aHViLmNvbS9tYXBib3gvcG9seWxhYmVsIGFkYXB0ZWQgdG8gdXNlIFBvaW50c1xuICpcbiAqIEBwYXJhbSB7QXJyYXk8QXJyYXk8UG9pbnQ+Pn0gTGlzdCBvZiBwb2x5Z29uIHJpbmdzIGZpcnN0IGl0ZW0gaW4gYXJyYXkgaXMgdGhlIG91dGVyIHJpbmcgZm9sbG93ZWQgb3B0aW9uYWxseSBieSB0aGUgbGlzdCBvZiBob2xlcywgc2hvdWxkIGJlIGFuIGVsZW1lbnQgb2YgdGhlIHJlc3VsdCBvZiB1dGlsL2NsYXNzaWZ5X3JpbmdzXG4gKiBAcGFyYW0ge251bWJlcn0gW3ByZWNpc2lvbj0xXSBTcGVjaWZpZWQgaW4gaW5wdXQgY29vcmRpbmF0ZSB1bml0cy4gSWYgMCByZXR1cm5zIGFmdGVyIGZpcnN0IHJ1biwgaWYgPiAwIHJlcGVhdGVkbHkgbmFycm93cyB0aGUgc2VhcmNoIHNwYWNlIHVudGlsIHRoZSByYWRpdXMgb2YgdGhlIGFyZWEgc2VhcmNoZWQgZm9yIHRoZSBiZXN0IHBvbGUgaXMgbGVzcyB0aGFuIHByZWNpc2lvblxuICogQHBhcmFtIHtib29sfSBbZGVidWc9ZmFsc2VdIFByaW50IHNvbWUgc3RhdGlzdGljcyB0byB0aGUgY29uc29sZSBkdXJpbmcgZXhlY3V0aW9uXG4gKlxuICogQHJldHVybnMge1BvaW50fSBQb2xlIG9mIEluYWNjZXNzaWJpbGl5LlxuICogQHByaXZhdGVcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAocG9seWdvblJpbmdzLCBwcmVjaXNpb24sIGRlYnVnKSB7XG4gICAgcHJlY2lzaW9uID0gcHJlY2lzaW9uIHx8IDEuMDtcblxuICAgIC8vIGZpbmQgdGhlIGJvdW5kaW5nIGJveCBvZiB0aGUgb3V0ZXIgcmluZ1xuICAgIGxldCBtaW5YLCBtaW5ZLCBtYXhYLCBtYXhZO1xuICAgIGNvbnN0IG91dGVyUmluZyA9IHBvbHlnb25SaW5nc1swXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG91dGVyUmluZy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBwID0gb3V0ZXJSaW5nW2ldO1xuICAgICAgICBpZiAoIWkgfHwgcC54IDwgbWluWCkgbWluWCA9IHAueDtcbiAgICAgICAgaWYgKCFpIHx8IHAueSA8IG1pblkpIG1pblkgPSBwLnk7XG4gICAgICAgIGlmICghaSB8fCBwLnggPiBtYXhYKSBtYXhYID0gcC54O1xuICAgICAgICBpZiAoIWkgfHwgcC55ID4gbWF4WSkgbWF4WSA9IHAueTtcbiAgICB9XG5cbiAgICBjb25zdCB3aWR0aCA9IG1heFggLSBtaW5YO1xuICAgIGNvbnN0IGhlaWdodCA9IG1heFkgLSBtaW5ZO1xuICAgIGNvbnN0IGNlbGxTaXplID0gTWF0aC5taW4od2lkdGgsIGhlaWdodCk7XG4gICAgbGV0IGggPSBjZWxsU2l6ZSAvIDI7XG5cbiAgICAvLyBhIHByaW9yaXR5IHF1ZXVlIG9mIGNlbGxzIGluIG9yZGVyIG9mIHRoZWlyIFwicG90ZW50aWFsXCIgKG1heCBkaXN0YW5jZSB0byBwb2x5Z29uKVxuICAgIGNvbnN0IGNlbGxRdWV1ZSA9IG5ldyBRdWV1ZShudWxsLCBjb21wYXJlTWF4KTtcblxuICAgIC8vIGNvdmVyIHBvbHlnb24gd2l0aCBpbml0aWFsIGNlbGxzXG4gICAgZm9yIChsZXQgeCA9IG1pblg7IHggPCBtYXhYOyB4ICs9IGNlbGxTaXplKSB7XG4gICAgICAgIGZvciAobGV0IHkgPSBtaW5ZOyB5IDwgbWF4WTsgeSArPSBjZWxsU2l6ZSkge1xuICAgICAgICAgICAgY2VsbFF1ZXVlLnB1c2gobmV3IENlbGwoeCArIGgsIHkgKyBoLCBoLCBwb2x5Z29uUmluZ3MpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIHRha2UgY2VudHJvaWQgYXMgdGhlIGZpcnN0IGJlc3QgZ3Vlc3NcbiAgICBsZXQgYmVzdENlbGwgPSBnZXRDZW50cm9pZENlbGwocG9seWdvblJpbmdzKTtcbiAgICBsZXQgbnVtUHJvYmVzID0gY2VsbFF1ZXVlLmxlbmd0aDtcblxuICAgIHdoaWxlIChjZWxsUXVldWUubGVuZ3RoKSB7XG4gICAgICAgIC8vIHBpY2sgdGhlIG1vc3QgcHJvbWlzaW5nIGNlbGwgZnJvbSB0aGUgcXVldWVcbiAgICAgICAgY29uc3QgY2VsbCA9IGNlbGxRdWV1ZS5wb3AoKTtcblxuICAgICAgICAvLyB1cGRhdGUgdGhlIGJlc3QgY2VsbCBpZiB3ZSBmb3VuZCBhIGJldHRlciBvbmVcbiAgICAgICAgaWYgKGNlbGwuZCA+IGJlc3RDZWxsLmQpIHtcbiAgICAgICAgICAgIGJlc3RDZWxsID0gY2VsbDtcbiAgICAgICAgICAgIGlmIChkZWJ1ZykgY29uc29sZS5sb2coJ2ZvdW5kIGJlc3QgJWQgYWZ0ZXIgJWQgcHJvYmVzJywgTWF0aC5yb3VuZCgxZTQgKiBjZWxsLmQpIC8gMWU0LCBudW1Qcm9iZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZG8gbm90IGRyaWxsIGRvd24gZnVydGhlciBpZiB0aGVyZSdzIG5vIGNoYW5jZSBvZiBhIGJldHRlciBzb2x1dGlvblxuICAgICAgICBpZiAoY2VsbC5tYXggLSBiZXN0Q2VsbC5kIDw9IHByZWNpc2lvbikgY29udGludWU7XG5cbiAgICAgICAgLy8gc3BsaXQgdGhlIGNlbGwgaW50byBmb3VyIGNlbGxzXG4gICAgICAgIGggPSBjZWxsLmggLyAyO1xuICAgICAgICBjZWxsUXVldWUucHVzaChuZXcgQ2VsbChjZWxsLnAueCAtIGgsIGNlbGwucC55IC0gaCwgaCwgcG9seWdvblJpbmdzKSk7XG4gICAgICAgIGNlbGxRdWV1ZS5wdXNoKG5ldyBDZWxsKGNlbGwucC54ICsgaCwgY2VsbC5wLnkgLSBoLCBoLCBwb2x5Z29uUmluZ3MpKTtcbiAgICAgICAgY2VsbFF1ZXVlLnB1c2gobmV3IENlbGwoY2VsbC5wLnggLSBoLCBjZWxsLnAueSArIGgsIGgsIHBvbHlnb25SaW5ncykpO1xuICAgICAgICBjZWxsUXVldWUucHVzaChuZXcgQ2VsbChjZWxsLnAueCArIGgsIGNlbGwucC55ICsgaCwgaCwgcG9seWdvblJpbmdzKSk7XG4gICAgICAgIG51bVByb2JlcyArPSA0O1xuICAgIH1cblxuICAgIGlmIChkZWJ1Zykge1xuICAgICAgICBjb25zb2xlLmxvZyhgbnVtIHByb2JlczogJHtudW1Qcm9iZXN9YCk7XG4gICAgICAgIGNvbnNvbGUubG9nKGBiZXN0IGRpc3RhbmNlOiAke2Jlc3RDZWxsLmR9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJlc3RDZWxsLnA7XG59O1xuXG5mdW5jdGlvbiBjb21wYXJlTWF4KGEsIGIpIHtcbiAgICByZXR1cm4gYi5tYXggLSBhLm1heDtcbn1cblxuZnVuY3Rpb24gQ2VsbCh4LCB5LCBoLCBwb2x5Z29uKSB7XG4gICAgdGhpcy5wID0gbmV3IFBvaW50KHgsIHkpO1xuICAgIHRoaXMuaCA9IGg7IC8vIGhhbGYgdGhlIGNlbGwgc2l6ZVxuICAgIHRoaXMuZCA9IHBvaW50VG9Qb2x5Z29uRGlzdCh0aGlzLnAsIHBvbHlnb24pOyAvLyBkaXN0YW5jZSBmcm9tIGNlbGwgY2VudGVyIHRvIHBvbHlnb25cbiAgICB0aGlzLm1heCA9IHRoaXMuZCArIHRoaXMuaCAqIE1hdGguU1FSVDI7IC8vIG1heCBkaXN0YW5jZSB0byBwb2x5Z29uIHdpdGhpbiBhIGNlbGxcbn1cblxuLy8gc2lnbmVkIGRpc3RhbmNlIGZyb20gcG9pbnQgdG8gcG9seWdvbiBvdXRsaW5lIChuZWdhdGl2ZSBpZiBwb2ludCBpcyBvdXRzaWRlKVxuZnVuY3Rpb24gcG9pbnRUb1BvbHlnb25EaXN0KHAsIHBvbHlnb24pIHtcbiAgICBsZXQgaW5zaWRlID0gZmFsc2U7XG4gICAgbGV0IG1pbkRpc3RTcSA9IEluZmluaXR5O1xuXG4gICAgZm9yIChsZXQgayA9IDA7IGsgPCBwb2x5Z29uLmxlbmd0aDsgaysrKSB7XG4gICAgICAgIGNvbnN0IHJpbmcgPSBwb2x5Z29uW2tdO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSByaW5nLmxlbmd0aCwgaiA9IGxlbiAtIDE7IGkgPCBsZW47IGogPSBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGEgPSByaW5nW2ldO1xuICAgICAgICAgICAgY29uc3QgYiA9IHJpbmdbal07XG5cbiAgICAgICAgICAgIGlmICgoYS55ID4gcC55ICE9PSBiLnkgPiBwLnkpICYmXG4gICAgICAgICAgICAgICAgKHAueCA8IChiLnggLSBhLngpICogKHAueSAtIGEueSkgLyAoYi55IC0gYS55KSArIGEueCkpIGluc2lkZSA9ICFpbnNpZGU7XG5cbiAgICAgICAgICAgIG1pbkRpc3RTcSA9IE1hdGgubWluKG1pbkRpc3RTcSwgZGlzdFRvU2VnbWVudFNxdWFyZWQocCwgYSwgYikpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIChpbnNpZGUgPyAxIDogLTEpICogTWF0aC5zcXJ0KG1pbkRpc3RTcSk7XG59XG5cbi8vIGdldCBwb2x5Z29uIGNlbnRyb2lkXG5mdW5jdGlvbiBnZXRDZW50cm9pZENlbGwocG9seWdvbikge1xuICAgIGxldCBhcmVhID0gMDtcbiAgICBsZXQgeCA9IDA7XG4gICAgbGV0IHkgPSAwO1xuICAgIGNvbnN0IHBvaW50cyA9IHBvbHlnb25bMF07XG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHBvaW50cy5sZW5ndGgsIGogPSBsZW4gLSAxOyBpIDwgbGVuOyBqID0gaSsrKSB7XG4gICAgICAgIGNvbnN0IGEgPSBwb2ludHNbaV07XG4gICAgICAgIGNvbnN0IGIgPSBwb2ludHNbal07XG4gICAgICAgIGNvbnN0IGYgPSBhLnggKiBiLnkgLSBiLnggKiBhLnk7XG4gICAgICAgIHggKz0gKGEueCArIGIueCkgKiBmO1xuICAgICAgICB5ICs9IChhLnkgKyBiLnkpICogZjtcbiAgICAgICAgYXJlYSArPSBmICogMztcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBDZWxsKHggLyBhcmVhLCB5IC8gYXJlYSwgMCwgcG9seWdvbik7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gR2x5cGhzO1xuXG5mdW5jdGlvbiBHbHlwaHMocGJmLCBlbmQpIHtcbiAgICB0aGlzLnN0YWNrcyA9IHBiZi5yZWFkRmllbGRzKHJlYWRGb250c3RhY2tzLCBbXSwgZW5kKTtcbn1cblxuZnVuY3Rpb24gcmVhZEZvbnRzdGFja3ModGFnLCBzdGFja3MsIHBiZikge1xuICAgIGlmICh0YWcgPT09IDEpIHtcbiAgICAgICAgY29uc3QgZm9udHN0YWNrID0gcGJmLnJlYWRNZXNzYWdlKHJlYWRGb250c3RhY2ssIHtnbHlwaHM6IHt9fSk7XG4gICAgICAgIHN0YWNrcy5wdXNoKGZvbnRzdGFjayk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiByZWFkRm9udHN0YWNrKHRhZywgZm9udHN0YWNrLCBwYmYpIHtcbiAgICBpZiAodGFnID09PSAxKSBmb250c3RhY2submFtZSA9IHBiZi5yZWFkU3RyaW5nKCk7XG4gICAgZWxzZSBpZiAodGFnID09PSAyKSBmb250c3RhY2sucmFuZ2UgPSBwYmYucmVhZFN0cmluZygpO1xuICAgIGVsc2UgaWYgKHRhZyA9PT0gMykge1xuICAgICAgICBjb25zdCBnbHlwaCA9IHBiZi5yZWFkTWVzc2FnZShyZWFkR2x5cGgsIHt9KTtcbiAgICAgICAgZm9udHN0YWNrLmdseXBoc1tnbHlwaC5pZF0gPSBnbHlwaDtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHJlYWRHbHlwaCh0YWcsIGdseXBoLCBwYmYpIHtcbiAgICBpZiAodGFnID09PSAxKSBnbHlwaC5pZCA9IHBiZi5yZWFkVmFyaW50KCk7XG4gICAgZWxzZSBpZiAodGFnID09PSAyKSBnbHlwaC5iaXRtYXAgPSBwYmYucmVhZEJ5dGVzKCk7XG4gICAgZWxzZSBpZiAodGFnID09PSAzKSBnbHlwaC53aWR0aCA9IHBiZi5yZWFkVmFyaW50KCk7XG4gICAgZWxzZSBpZiAodGFnID09PSA0KSBnbHlwaC5oZWlnaHQgPSBwYmYucmVhZFZhcmludCgpO1xuICAgIGVsc2UgaWYgKHRhZyA9PT0gNSkgZ2x5cGgubGVmdCA9IHBiZi5yZWFkU1ZhcmludCgpO1xuICAgIGVsc2UgaWYgKHRhZyA9PT0gNikgZ2x5cGgudG9wID0gcGJmLnJlYWRTVmFyaW50KCk7XG4gICAgZWxzZSBpZiAodGFnID09PSA3KSBnbHlwaC5hZHZhbmNlID0gcGJmLnJlYWRWYXJpbnQoKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBpbnRlcnBvbGF0ZTtcblxuZnVuY3Rpb24gaW50ZXJwb2xhdGUoYSwgYiwgdCkge1xuICAgIHJldHVybiAoYSAqICgxIC0gdCkpICsgKGIgKiB0KTtcbn1cblxuaW50ZXJwb2xhdGUubnVtYmVyID0gaW50ZXJwb2xhdGU7XG5cbmludGVycG9sYXRlLnZlYzIgPSBmdW5jdGlvbihmcm9tLCB0bywgdCkge1xuICAgIHJldHVybiBbXG4gICAgICAgIGludGVycG9sYXRlKGZyb21bMF0sIHRvWzBdLCB0KSxcbiAgICAgICAgaW50ZXJwb2xhdGUoZnJvbVsxXSwgdG9bMV0sIHQpXG4gICAgXTtcbn07XG5cbi8qXG4gKiBJbnRlcnBvbGF0ZSBiZXR3ZWVuIHR3byBjb2xvcnMgZ2l2ZW4gYXMgNC1lbGVtZW50IGFycmF5cy5cbiAqXG4gKiBAcGFyYW0ge0NvbG9yfSBmcm9tXG4gKiBAcGFyYW0ge0NvbG9yfSB0b1xuICogQHBhcmFtIHtudW1iZXJ9IHQgaW50ZXJwb2xhdGlvbiBmYWN0b3IgYmV0d2VlbiAwIGFuZCAxXG4gKiBAcmV0dXJucyB7Q29sb3J9IGludGVycG9sYXRlZCBjb2xvclxuICovXG5pbnRlcnBvbGF0ZS5jb2xvciA9IGZ1bmN0aW9uKGZyb20sIHRvLCB0KSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgaW50ZXJwb2xhdGUoZnJvbVswXSwgdG9bMF0sIHQpLFxuICAgICAgICBpbnRlcnBvbGF0ZShmcm9tWzFdLCB0b1sxXSwgdCksXG4gICAgICAgIGludGVycG9sYXRlKGZyb21bMl0sIHRvWzJdLCB0KSxcbiAgICAgICAgaW50ZXJwb2xhdGUoZnJvbVszXSwgdG9bM10sIHQpXG4gICAgXTtcbn07XG5cbmludGVycG9sYXRlLmFycmF5ID0gZnVuY3Rpb24oZnJvbSwgdG8sIHQpIHtcbiAgICByZXR1cm4gZnJvbS5tYXAoKGQsIGkpID0+IHtcbiAgICAgICAgcmV0dXJuIGludGVycG9sYXRlKGQsIHRvW2ldLCB0KTtcbiAgICB9KTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IGlzQ291bnRlckNsb2Nrd2lzZSA9IHJlcXVpcmUoJy4vdXRpbCcpLmlzQ291bnRlckNsb2Nrd2lzZTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgbXVsdGlQb2x5Z29uSW50ZXJzZWN0c0J1ZmZlcmVkTXVsdGlQb2ludDogbXVsdGlQb2x5Z29uSW50ZXJzZWN0c0J1ZmZlcmVkTXVsdGlQb2ludCxcbiAgICBtdWx0aVBvbHlnb25JbnRlcnNlY3RzTXVsdGlQb2x5Z29uOiBtdWx0aVBvbHlnb25JbnRlcnNlY3RzTXVsdGlQb2x5Z29uLFxuICAgIG11bHRpUG9seWdvbkludGVyc2VjdHNCdWZmZXJlZE11bHRpTGluZTogbXVsdGlQb2x5Z29uSW50ZXJzZWN0c0J1ZmZlcmVkTXVsdGlMaW5lLFxuICAgIHBvbHlnb25JbnRlcnNlY3RzUG9seWdvbjogcG9seWdvbkludGVyc2VjdHNQb2x5Z29uLFxuICAgIGRpc3RUb1NlZ21lbnRTcXVhcmVkOiBkaXN0VG9TZWdtZW50U3F1YXJlZFxufTtcblxuZnVuY3Rpb24gcG9seWdvbkludGVyc2VjdHNQb2x5Z29uKHBvbHlnb25BLCBwb2x5Z29uQikge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9seWdvbkEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHBvbHlnb25Db250YWluc1BvaW50KHBvbHlnb25CLCBwb2x5Z29uQVtpXSkpIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9seWdvbkIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHBvbHlnb25Db250YWluc1BvaW50KHBvbHlnb25BLCBwb2x5Z29uQltpXSkpIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChsaW5lSW50ZXJzZWN0c0xpbmUocG9seWdvbkEsIHBvbHlnb25CKSkgcmV0dXJuIHRydWU7XG5cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIG11bHRpUG9seWdvbkludGVyc2VjdHNCdWZmZXJlZE11bHRpUG9pbnQobXVsdGlQb2x5Z29uLCByaW5ncywgcmFkaXVzKSB7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBtdWx0aVBvbHlnb24ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgY29uc3QgcG9seWdvbiA9IG11bHRpUG9seWdvbltqXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByaW5ncy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgcmluZyA9IHJpbmdzW2ldO1xuICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCByaW5nLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcG9pbnQgPSByaW5nW2tdO1xuICAgICAgICAgICAgICAgIGlmIChwb2x5Z29uQ29udGFpbnNQb2ludChwb2x5Z29uLCBwb2ludCkpIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIGlmIChwb2ludEludGVyc2VjdHNCdWZmZXJlZExpbmUocG9pbnQsIHBvbHlnb24sIHJhZGl1cykpIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gbXVsdGlQb2x5Z29uSW50ZXJzZWN0c011bHRpUG9seWdvbihtdWx0aVBvbHlnb25BLCBtdWx0aVBvbHlnb25CKSB7XG5cbiAgICBpZiAobXVsdGlQb2x5Z29uQS5sZW5ndGggPT09IDEgJiYgbXVsdGlQb2x5Z29uQVswXS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIG11bHRpUG9seWdvbkNvbnRhaW5zUG9pbnQobXVsdGlQb2x5Z29uQiwgbXVsdGlQb2x5Z29uQVswXVswXSk7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgbSA9IDA7IG0gPCBtdWx0aVBvbHlnb25CLmxlbmd0aDsgbSsrKSB7XG4gICAgICAgIGNvbnN0IHJpbmcgPSBtdWx0aVBvbHlnb25CW21dO1xuICAgICAgICBmb3IgKGxldCBuID0gMDsgbiA8IHJpbmcubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICAgIGlmIChtdWx0aVBvbHlnb25Db250YWluc1BvaW50KG11bHRpUG9seWdvbkEsIHJpbmdbbl0pKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZvciAobGV0IGogPSAwOyBqIDwgbXVsdGlQb2x5Z29uQS5sZW5ndGg7IGorKykge1xuICAgICAgICBjb25zdCBwb2x5Z29uID0gbXVsdGlQb2x5Z29uQVtqXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb2x5Z29uLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAobXVsdGlQb2x5Z29uQ29udGFpbnNQb2ludChtdWx0aVBvbHlnb25CLCBwb2x5Z29uW2ldKSkgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IG11bHRpUG9seWdvbkIubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgIGlmIChsaW5lSW50ZXJzZWN0c0xpbmUocG9seWdvbiwgbXVsdGlQb2x5Z29uQltrXSkpIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBtdWx0aVBvbHlnb25JbnRlcnNlY3RzQnVmZmVyZWRNdWx0aUxpbmUobXVsdGlQb2x5Z29uLCBtdWx0aUxpbmUsIHJhZGl1cykge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbXVsdGlMaW5lLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGxpbmUgPSBtdWx0aUxpbmVbaV07XG5cbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBtdWx0aVBvbHlnb24ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHBvbHlnb24gPSBtdWx0aVBvbHlnb25bal07XG5cbiAgICAgICAgICAgIGlmIChwb2x5Z29uLmxlbmd0aCA+PSAzKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBsaW5lLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwb2x5Z29uQ29udGFpbnNQb2ludChwb2x5Z29uLCBsaW5lW2tdKSkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobGluZUludGVyc2VjdHNCdWZmZXJlZExpbmUocG9seWdvbiwgbGluZSwgcmFkaXVzKSkgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBsaW5lSW50ZXJzZWN0c0J1ZmZlcmVkTGluZShsaW5lQSwgbGluZUIsIHJhZGl1cykge1xuXG4gICAgaWYgKGxpbmVBLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgaWYgKGxpbmVJbnRlcnNlY3RzTGluZShsaW5lQSwgbGluZUIpKSByZXR1cm4gdHJ1ZTtcblxuICAgICAgICAvLyBDaGVjayB3aGV0aGVyIGFueSBwb2ludCBpbiBlaXRoZXIgbGluZSBpcyB3aXRoaW4gcmFkaXVzIG9mIHRoZSBvdGhlciBsaW5lXG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbGluZUIubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGlmIChwb2ludEludGVyc2VjdHNCdWZmZXJlZExpbmUobGluZUJbal0sIGxpbmVBLCByYWRpdXMpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZvciAobGV0IGsgPSAwOyBrIDwgbGluZUEubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgaWYgKHBvaW50SW50ZXJzZWN0c0J1ZmZlcmVkTGluZShsaW5lQVtrXSwgbGluZUIsIHJhZGl1cykpIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gbGluZUludGVyc2VjdHNMaW5lKGxpbmVBLCBsaW5lQikge1xuICAgIGlmIChsaW5lQS5sZW5ndGggPT09IDAgfHwgbGluZUIubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lQS5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgY29uc3QgYTAgPSBsaW5lQVtpXTtcbiAgICAgICAgY29uc3QgYTEgPSBsaW5lQVtpICsgMV07XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbGluZUIubGVuZ3RoIC0gMTsgaisrKSB7XG4gICAgICAgICAgICBjb25zdCBiMCA9IGxpbmVCW2pdO1xuICAgICAgICAgICAgY29uc3QgYjEgPSBsaW5lQltqICsgMV07XG4gICAgICAgICAgICBpZiAobGluZVNlZ21lbnRJbnRlcnNlY3RzTGluZVNlZ21lbnQoYTAsIGExLCBiMCwgYjEpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGxpbmVTZWdtZW50SW50ZXJzZWN0c0xpbmVTZWdtZW50KGEwLCBhMSwgYjAsIGIxKSB7XG4gICAgcmV0dXJuIGlzQ291bnRlckNsb2Nrd2lzZShhMCwgYjAsIGIxKSAhPT0gaXNDb3VudGVyQ2xvY2t3aXNlKGExLCBiMCwgYjEpICYmXG4gICAgICAgIGlzQ291bnRlckNsb2Nrd2lzZShhMCwgYTEsIGIwKSAhPT0gaXNDb3VudGVyQ2xvY2t3aXNlKGEwLCBhMSwgYjEpO1xufVxuXG5mdW5jdGlvbiBwb2ludEludGVyc2VjdHNCdWZmZXJlZExpbmUocCwgbGluZSwgcmFkaXVzKSB7XG4gICAgY29uc3QgcmFkaXVzU3F1YXJlZCA9IHJhZGl1cyAqIHJhZGl1cztcblxuICAgIGlmIChsaW5lLmxlbmd0aCA9PT0gMSkgcmV0dXJuIHAuZGlzdFNxcihsaW5lWzBdKSA8IHJhZGl1c1NxdWFyZWQ7XG5cbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IGxpbmUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgLy8gRmluZCBsaW5lIHNlZ21lbnRzIHRoYXQgaGF2ZSBhIGRpc3RhbmNlIDw9IHJhZGl1c14yIHRvIHBcbiAgICAgICAgLy8gSW4gdGhhdCBjYXNlLCB3ZSB0cmVhdCB0aGUgbGluZSBhcyBcImNvbnRhaW5pbmcgcG9pbnQgcFwiLlxuICAgICAgICBjb25zdCB2ID0gbGluZVtpIC0gMV0sIHcgPSBsaW5lW2ldO1xuICAgICAgICBpZiAoZGlzdFRvU2VnbWVudFNxdWFyZWQocCwgdiwgdykgPCByYWRpdXNTcXVhcmVkKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyBDb2RlIGZyb20gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMTUwMTcyNS8zMzEzNzkuXG5mdW5jdGlvbiBkaXN0VG9TZWdtZW50U3F1YXJlZChwLCB2LCB3KSB7XG4gICAgY29uc3QgbDIgPSB2LmRpc3RTcXIodyk7XG4gICAgaWYgKGwyID09PSAwKSByZXR1cm4gcC5kaXN0U3FyKHYpO1xuICAgIGNvbnN0IHQgPSAoKHAueCAtIHYueCkgKiAody54IC0gdi54KSArIChwLnkgLSB2LnkpICogKHcueSAtIHYueSkpIC8gbDI7XG4gICAgaWYgKHQgPCAwKSByZXR1cm4gcC5kaXN0U3FyKHYpO1xuICAgIGlmICh0ID4gMSkgcmV0dXJuIHAuZGlzdFNxcih3KTtcbiAgICByZXR1cm4gcC5kaXN0U3FyKHcuc3ViKHYpLl9tdWx0KHQpLl9hZGQodikpO1xufVxuXG4vLyBwb2ludCBpbiBwb2x5Z29uIHJheSBjYXN0aW5nIGFsZ29yaXRobVxuZnVuY3Rpb24gbXVsdGlQb2x5Z29uQ29udGFpbnNQb2ludChyaW5ncywgcCkge1xuICAgIGxldCBjID0gZmFsc2UsXG4gICAgICAgIHJpbmcsIHAxLCBwMjtcblxuICAgIGZvciAobGV0IGsgPSAwOyBrIDwgcmluZ3MubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgcmluZyA9IHJpbmdzW2tdO1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgaiA9IHJpbmcubGVuZ3RoIC0gMTsgaSA8IHJpbmcubGVuZ3RoOyBqID0gaSsrKSB7XG4gICAgICAgICAgICBwMSA9IHJpbmdbaV07XG4gICAgICAgICAgICBwMiA9IHJpbmdbal07XG4gICAgICAgICAgICBpZiAoKChwMS55ID4gcC55KSAhPT0gKHAyLnkgPiBwLnkpKSAmJiAocC54IDwgKHAyLnggLSBwMS54KSAqIChwLnkgLSBwMS55KSAvIChwMi55IC0gcDEueSkgKyBwMS54KSkge1xuICAgICAgICAgICAgICAgIGMgPSAhYztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYztcbn1cblxuZnVuY3Rpb24gcG9seWdvbkNvbnRhaW5zUG9pbnQocmluZywgcCkge1xuICAgIGxldCBjID0gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDAsIGogPSByaW5nLmxlbmd0aCAtIDE7IGkgPCByaW5nLmxlbmd0aDsgaiA9IGkrKykge1xuICAgICAgICBjb25zdCBwMSA9IHJpbmdbaV07XG4gICAgICAgIGNvbnN0IHAyID0gcmluZ1tqXTtcbiAgICAgICAgaWYgKCgocDEueSA+IHAueSkgIT09IChwMi55ID4gcC55KSkgJiYgKHAueCA8IChwMi54IC0gcDEueCkgKiAocC55IC0gcDEueSkgLyAocDIueSAtIHAxLnkpICsgcDEueCkpIHtcbiAgICAgICAgICAgIGMgPSAhYztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYztcbn1cbiIsIid1c2Ugc3RyaWN0Jztcbi8vICAgICAgXG5cbi8vIFRoZSBmb2xsb3dpbmcgdGFibGUgY29tZXMgZnJvbSA8aHR0cDovL3d3dy51bmljb2RlLm9yZy9QdWJsaWMvOS4wLjAvdWNkL0Jsb2Nrcy50eHQ+LlxuLy8gS2VlcCBpdCBzeW5jaHJvbml6ZWQgd2l0aCA8aHR0cDovL3d3dy51bmljb2RlLm9yZy9QdWJsaWMvVUNEL2xhdGVzdC91Y2QvQmxvY2tzLnR4dD4uXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG5jb25zdCB1bmljb2RlQmxvY2tMb29rdXAgICAgICAgICAgICAgICAgICAgICA9IHtcbiAgICAvLyAnQmFzaWMgTGF0aW4nOiAoY2hhcikgPT4gY2hhciA+PSAweDAwMDAgJiYgY2hhciA8PSAweDAwN0YsXG4gICAgJ0xhdGluLTEgU3VwcGxlbWVudCc6IChjaGFyKSA9PiBjaGFyID49IDB4MDA4MCAmJiBjaGFyIDw9IDB4MDBGRixcbiAgICAvLyAnTGF0aW4gRXh0ZW5kZWQtQSc6IChjaGFyKSA9PiBjaGFyID49IDB4MDEwMCAmJiBjaGFyIDw9IDB4MDE3RixcbiAgICAvLyAnTGF0aW4gRXh0ZW5kZWQtQic6IChjaGFyKSA9PiBjaGFyID49IDB4MDE4MCAmJiBjaGFyIDw9IDB4MDI0RixcbiAgICAvLyAnSVBBIEV4dGVuc2lvbnMnOiAoY2hhcikgPT4gY2hhciA+PSAweDAyNTAgJiYgY2hhciA8PSAweDAyQUYsXG4gICAgLy8gJ1NwYWNpbmcgTW9kaWZpZXIgTGV0dGVycyc6IChjaGFyKSA9PiBjaGFyID49IDB4MDJCMCAmJiBjaGFyIDw9IDB4MDJGRixcbiAgICAvLyAnQ29tYmluaW5nIERpYWNyaXRpY2FsIE1hcmtzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgwMzAwICYmIGNoYXIgPD0gMHgwMzZGLFxuICAgIC8vICdHcmVlayBhbmQgQ29wdGljJzogKGNoYXIpID0+IGNoYXIgPj0gMHgwMzcwICYmIGNoYXIgPD0gMHgwM0ZGLFxuICAgIC8vICdDeXJpbGxpYyc6IChjaGFyKSA9PiBjaGFyID49IDB4MDQwMCAmJiBjaGFyIDw9IDB4MDRGRixcbiAgICAvLyAnQ3lyaWxsaWMgU3VwcGxlbWVudCc6IChjaGFyKSA9PiBjaGFyID49IDB4MDUwMCAmJiBjaGFyIDw9IDB4MDUyRixcbiAgICAvLyAnQXJtZW5pYW4nOiAoY2hhcikgPT4gY2hhciA+PSAweDA1MzAgJiYgY2hhciA8PSAweDA1OEYsXG4gICAgLy8gJ0hlYnJldyc6IChjaGFyKSA9PiBjaGFyID49IDB4MDU5MCAmJiBjaGFyIDw9IDB4MDVGRixcbiAgICAvLyAnQXJhYmljJzogKGNoYXIpID0+IGNoYXIgPj0gMHgwNjAwICYmIGNoYXIgPD0gMHgwNkZGLFxuICAgIC8vICdTeXJpYWMnOiAoY2hhcikgPT4gY2hhciA+PSAweDA3MDAgJiYgY2hhciA8PSAweDA3NEYsXG4gICAgLy8gJ0FyYWJpYyBTdXBwbGVtZW50JzogKGNoYXIpID0+IGNoYXIgPj0gMHgwNzUwICYmIGNoYXIgPD0gMHgwNzdGLFxuICAgIC8vICdUaGFhbmEnOiAoY2hhcikgPT4gY2hhciA+PSAweDA3ODAgJiYgY2hhciA8PSAweDA3QkYsXG4gICAgLy8gJ05Lbyc6IChjaGFyKSA9PiBjaGFyID49IDB4MDdDMCAmJiBjaGFyIDw9IDB4MDdGRixcbiAgICAvLyAnU2FtYXJpdGFuJzogKGNoYXIpID0+IGNoYXIgPj0gMHgwODAwICYmIGNoYXIgPD0gMHgwODNGLFxuICAgIC8vICdNYW5kYWljJzogKGNoYXIpID0+IGNoYXIgPj0gMHgwODQwICYmIGNoYXIgPD0gMHgwODVGLFxuICAgIC8vICdBcmFiaWMgRXh0ZW5kZWQtQSc6IChjaGFyKSA9PiBjaGFyID49IDB4MDhBMCAmJiBjaGFyIDw9IDB4MDhGRixcbiAgICAvLyAnRGV2YW5hZ2FyaSc6IChjaGFyKSA9PiBjaGFyID49IDB4MDkwMCAmJiBjaGFyIDw9IDB4MDk3RixcbiAgICAvLyAnQmVuZ2FsaSc6IChjaGFyKSA9PiBjaGFyID49IDB4MDk4MCAmJiBjaGFyIDw9IDB4MDlGRixcbiAgICAvLyAnR3VybXVraGknOiAoY2hhcikgPT4gY2hhciA+PSAweDBBMDAgJiYgY2hhciA8PSAweDBBN0YsXG4gICAgLy8gJ0d1amFyYXRpJzogKGNoYXIpID0+IGNoYXIgPj0gMHgwQTgwICYmIGNoYXIgPD0gMHgwQUZGLFxuICAgIC8vICdPcml5YSc6IChjaGFyKSA9PiBjaGFyID49IDB4MEIwMCAmJiBjaGFyIDw9IDB4MEI3RixcbiAgICAvLyAnVGFtaWwnOiAoY2hhcikgPT4gY2hhciA+PSAweDBCODAgJiYgY2hhciA8PSAweDBCRkYsXG4gICAgLy8gJ1RlbHVndSc6IChjaGFyKSA9PiBjaGFyID49IDB4MEMwMCAmJiBjaGFyIDw9IDB4MEM3RixcbiAgICAvLyAnS2FubmFkYSc6IChjaGFyKSA9PiBjaGFyID49IDB4MEM4MCAmJiBjaGFyIDw9IDB4MENGRixcbiAgICAvLyAnTWFsYXlhbGFtJzogKGNoYXIpID0+IGNoYXIgPj0gMHgwRDAwICYmIGNoYXIgPD0gMHgwRDdGLFxuICAgIC8vICdTaW5oYWxhJzogKGNoYXIpID0+IGNoYXIgPj0gMHgwRDgwICYmIGNoYXIgPD0gMHgwREZGLFxuICAgIC8vICdUaGFpJzogKGNoYXIpID0+IGNoYXIgPj0gMHgwRTAwICYmIGNoYXIgPD0gMHgwRTdGLFxuICAgIC8vICdMYW8nOiAoY2hhcikgPT4gY2hhciA+PSAweDBFODAgJiYgY2hhciA8PSAweDBFRkYsXG4gICAgLy8gJ1RpYmV0YW4nOiAoY2hhcikgPT4gY2hhciA+PSAweDBGMDAgJiYgY2hhciA8PSAweDBGRkYsXG4gICAgLy8gJ015YW5tYXInOiAoY2hhcikgPT4gY2hhciA+PSAweDEwMDAgJiYgY2hhciA8PSAweDEwOUYsXG4gICAgLy8gJ0dlb3JnaWFuJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMEEwICYmIGNoYXIgPD0gMHgxMEZGLFxuICAgICdIYW5ndWwgSmFtbyc6IChjaGFyKSA9PiBjaGFyID49IDB4MTEwMCAmJiBjaGFyIDw9IDB4MTFGRixcbiAgICAvLyAnRXRoaW9waWMnOiAoY2hhcikgPT4gY2hhciA+PSAweDEyMDAgJiYgY2hhciA8PSAweDEzN0YsXG4gICAgLy8gJ0V0aGlvcGljIFN1cHBsZW1lbnQnOiAoY2hhcikgPT4gY2hhciA+PSAweDEzODAgJiYgY2hhciA8PSAweDEzOUYsXG4gICAgLy8gJ0NoZXJva2VlJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxM0EwICYmIGNoYXIgPD0gMHgxM0ZGLFxuICAgICdVbmlmaWVkIENhbmFkaWFuIEFib3JpZ2luYWwgU3lsbGFiaWNzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxNDAwICYmIGNoYXIgPD0gMHgxNjdGLFxuICAgIC8vICdPZ2hhbSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTY4MCAmJiBjaGFyIDw9IDB4MTY5RixcbiAgICAvLyAnUnVuaWMnOiAoY2hhcikgPT4gY2hhciA+PSAweDE2QTAgJiYgY2hhciA8PSAweDE2RkYsXG4gICAgLy8gJ1RhZ2Fsb2cnOiAoY2hhcikgPT4gY2hhciA+PSAweDE3MDAgJiYgY2hhciA8PSAweDE3MUYsXG4gICAgLy8gJ0hhbnVub28nOiAoY2hhcikgPT4gY2hhciA+PSAweDE3MjAgJiYgY2hhciA8PSAweDE3M0YsXG4gICAgLy8gJ0J1aGlkJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxNzQwICYmIGNoYXIgPD0gMHgxNzVGLFxuICAgIC8vICdUYWdiYW53YSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTc2MCAmJiBjaGFyIDw9IDB4MTc3RixcbiAgICAvLyAnS2htZXInOiAoY2hhcikgPT4gY2hhciA+PSAweDE3ODAgJiYgY2hhciA8PSAweDE3RkYsXG4gICAgLy8gJ01vbmdvbGlhbic6IChjaGFyKSA9PiBjaGFyID49IDB4MTgwMCAmJiBjaGFyIDw9IDB4MThBRixcbiAgICAnVW5pZmllZCBDYW5hZGlhbiBBYm9yaWdpbmFsIFN5bGxhYmljcyBFeHRlbmRlZCc6IChjaGFyKSA9PiBjaGFyID49IDB4MThCMCAmJiBjaGFyIDw9IDB4MThGRixcbiAgICAvLyAnTGltYnUnOiAoY2hhcikgPT4gY2hhciA+PSAweDE5MDAgJiYgY2hhciA8PSAweDE5NEYsXG4gICAgLy8gJ1RhaSBMZSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTk1MCAmJiBjaGFyIDw9IDB4MTk3RixcbiAgICAvLyAnTmV3IFRhaSBMdWUnOiAoY2hhcikgPT4gY2hhciA+PSAweDE5ODAgJiYgY2hhciA8PSAweDE5REYsXG4gICAgLy8gJ0tobWVyIFN5bWJvbHMnOiAoY2hhcikgPT4gY2hhciA+PSAweDE5RTAgJiYgY2hhciA8PSAweDE5RkYsXG4gICAgLy8gJ0J1Z2luZXNlJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxQTAwICYmIGNoYXIgPD0gMHgxQTFGLFxuICAgIC8vICdUYWkgVGhhbSc6IChjaGFyKSA9PiBjaGFyID49IDB4MUEyMCAmJiBjaGFyIDw9IDB4MUFBRixcbiAgICAvLyAnQ29tYmluaW5nIERpYWNyaXRpY2FsIE1hcmtzIEV4dGVuZGVkJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxQUIwICYmIGNoYXIgPD0gMHgxQUZGLFxuICAgIC8vICdCYWxpbmVzZSc6IChjaGFyKSA9PiBjaGFyID49IDB4MUIwMCAmJiBjaGFyIDw9IDB4MUI3RixcbiAgICAvLyAnU3VuZGFuZXNlJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxQjgwICYmIGNoYXIgPD0gMHgxQkJGLFxuICAgIC8vICdCYXRhayc6IChjaGFyKSA9PiBjaGFyID49IDB4MUJDMCAmJiBjaGFyIDw9IDB4MUJGRixcbiAgICAvLyAnTGVwY2hhJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxQzAwICYmIGNoYXIgPD0gMHgxQzRGLFxuICAgIC8vICdPbCBDaGlraSc6IChjaGFyKSA9PiBjaGFyID49IDB4MUM1MCAmJiBjaGFyIDw9IDB4MUM3RixcbiAgICAvLyAnQ3lyaWxsaWMgRXh0ZW5kZWQtQyc6IChjaGFyKSA9PiBjaGFyID49IDB4MUM4MCAmJiBjaGFyIDw9IDB4MUM4RixcbiAgICAvLyAnU3VuZGFuZXNlIFN1cHBsZW1lbnQnOiAoY2hhcikgPT4gY2hhciA+PSAweDFDQzAgJiYgY2hhciA8PSAweDFDQ0YsXG4gICAgLy8gJ1ZlZGljIEV4dGVuc2lvbnMnOiAoY2hhcikgPT4gY2hhciA+PSAweDFDRDAgJiYgY2hhciA8PSAweDFDRkYsXG4gICAgLy8gJ1Bob25ldGljIEV4dGVuc2lvbnMnOiAoY2hhcikgPT4gY2hhciA+PSAweDFEMDAgJiYgY2hhciA8PSAweDFEN0YsXG4gICAgLy8gJ1Bob25ldGljIEV4dGVuc2lvbnMgU3VwcGxlbWVudCc6IChjaGFyKSA9PiBjaGFyID49IDB4MUQ4MCAmJiBjaGFyIDw9IDB4MURCRixcbiAgICAvLyAnQ29tYmluaW5nIERpYWNyaXRpY2FsIE1hcmtzIFN1cHBsZW1lbnQnOiAoY2hhcikgPT4gY2hhciA+PSAweDFEQzAgJiYgY2hhciA8PSAweDFERkYsXG4gICAgLy8gJ0xhdGluIEV4dGVuZGVkIEFkZGl0aW9uYWwnOiAoY2hhcikgPT4gY2hhciA+PSAweDFFMDAgJiYgY2hhciA8PSAweDFFRkYsXG4gICAgLy8gJ0dyZWVrIEV4dGVuZGVkJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRjAwICYmIGNoYXIgPD0gMHgxRkZGLFxuICAgICdHZW5lcmFsIFB1bmN0dWF0aW9uJzogKGNoYXIpID0+IGNoYXIgPj0gMHgyMDAwICYmIGNoYXIgPD0gMHgyMDZGLFxuICAgIC8vICdTdXBlcnNjcmlwdHMgYW5kIFN1YnNjcmlwdHMnOiAoY2hhcikgPT4gY2hhciA+PSAweDIwNzAgJiYgY2hhciA8PSAweDIwOUYsXG4gICAgLy8gJ0N1cnJlbmN5IFN5bWJvbHMnOiAoY2hhcikgPT4gY2hhciA+PSAweDIwQTAgJiYgY2hhciA8PSAweDIwQ0YsXG4gICAgLy8gJ0NvbWJpbmluZyBEaWFjcml0aWNhbCBNYXJrcyBmb3IgU3ltYm9scyc6IChjaGFyKSA9PiBjaGFyID49IDB4MjBEMCAmJiBjaGFyIDw9IDB4MjBGRixcbiAgICAnTGV0dGVybGlrZSBTeW1ib2xzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgyMTAwICYmIGNoYXIgPD0gMHgyMTRGLFxuICAgICdOdW1iZXIgRm9ybXMnOiAoY2hhcikgPT4gY2hhciA+PSAweDIxNTAgJiYgY2hhciA8PSAweDIxOEYsXG4gICAgLy8gJ0Fycm93cyc6IChjaGFyKSA9PiBjaGFyID49IDB4MjE5MCAmJiBjaGFyIDw9IDB4MjFGRixcbiAgICAvLyAnTWF0aGVtYXRpY2FsIE9wZXJhdG9ycyc6IChjaGFyKSA9PiBjaGFyID49IDB4MjIwMCAmJiBjaGFyIDw9IDB4MjJGRixcbiAgICAnTWlzY2VsbGFuZW91cyBUZWNobmljYWwnOiAoY2hhcikgPT4gY2hhciA+PSAweDIzMDAgJiYgY2hhciA8PSAweDIzRkYsXG4gICAgJ0NvbnRyb2wgUGljdHVyZXMnOiAoY2hhcikgPT4gY2hhciA+PSAweDI0MDAgJiYgY2hhciA8PSAweDI0M0YsXG4gICAgJ09wdGljYWwgQ2hhcmFjdGVyIFJlY29nbml0aW9uJzogKGNoYXIpID0+IGNoYXIgPj0gMHgyNDQwICYmIGNoYXIgPD0gMHgyNDVGLFxuICAgICdFbmNsb3NlZCBBbHBoYW51bWVyaWNzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgyNDYwICYmIGNoYXIgPD0gMHgyNEZGLFxuICAgIC8vICdCb3ggRHJhd2luZyc6IChjaGFyKSA9PiBjaGFyID49IDB4MjUwMCAmJiBjaGFyIDw9IDB4MjU3RixcbiAgICAvLyAnQmxvY2sgRWxlbWVudHMnOiAoY2hhcikgPT4gY2hhciA+PSAweDI1ODAgJiYgY2hhciA8PSAweDI1OUYsXG4gICAgJ0dlb21ldHJpYyBTaGFwZXMnOiAoY2hhcikgPT4gY2hhciA+PSAweDI1QTAgJiYgY2hhciA8PSAweDI1RkYsXG4gICAgJ01pc2NlbGxhbmVvdXMgU3ltYm9scyc6IChjaGFyKSA9PiBjaGFyID49IDB4MjYwMCAmJiBjaGFyIDw9IDB4MjZGRixcbiAgICAvLyAnRGluZ2JhdHMnOiAoY2hhcikgPT4gY2hhciA+PSAweDI3MDAgJiYgY2hhciA8PSAweDI3QkYsXG4gICAgLy8gJ01pc2NlbGxhbmVvdXMgTWF0aGVtYXRpY2FsIFN5bWJvbHMtQSc6IChjaGFyKSA9PiBjaGFyID49IDB4MjdDMCAmJiBjaGFyIDw9IDB4MjdFRixcbiAgICAvLyAnU3VwcGxlbWVudGFsIEFycm93cy1BJzogKGNoYXIpID0+IGNoYXIgPj0gMHgyN0YwICYmIGNoYXIgPD0gMHgyN0ZGLFxuICAgIC8vICdCcmFpbGxlIFBhdHRlcm5zJzogKGNoYXIpID0+IGNoYXIgPj0gMHgyODAwICYmIGNoYXIgPD0gMHgyOEZGLFxuICAgIC8vICdTdXBwbGVtZW50YWwgQXJyb3dzLUInOiAoY2hhcikgPT4gY2hhciA+PSAweDI5MDAgJiYgY2hhciA8PSAweDI5N0YsXG4gICAgLy8gJ01pc2NlbGxhbmVvdXMgTWF0aGVtYXRpY2FsIFN5bWJvbHMtQic6IChjaGFyKSA9PiBjaGFyID49IDB4Mjk4MCAmJiBjaGFyIDw9IDB4MjlGRixcbiAgICAvLyAnU3VwcGxlbWVudGFsIE1hdGhlbWF0aWNhbCBPcGVyYXRvcnMnOiAoY2hhcikgPT4gY2hhciA+PSAweDJBMDAgJiYgY2hhciA8PSAweDJBRkYsXG4gICAgJ01pc2NlbGxhbmVvdXMgU3ltYm9scyBhbmQgQXJyb3dzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgyQjAwICYmIGNoYXIgPD0gMHgyQkZGLFxuICAgIC8vICdHbGFnb2xpdGljJzogKGNoYXIpID0+IGNoYXIgPj0gMHgyQzAwICYmIGNoYXIgPD0gMHgyQzVGLFxuICAgIC8vICdMYXRpbiBFeHRlbmRlZC1DJzogKGNoYXIpID0+IGNoYXIgPj0gMHgyQzYwICYmIGNoYXIgPD0gMHgyQzdGLFxuICAgIC8vICdDb3B0aWMnOiAoY2hhcikgPT4gY2hhciA+PSAweDJDODAgJiYgY2hhciA8PSAweDJDRkYsXG4gICAgLy8gJ0dlb3JnaWFuIFN1cHBsZW1lbnQnOiAoY2hhcikgPT4gY2hhciA+PSAweDJEMDAgJiYgY2hhciA8PSAweDJEMkYsXG4gICAgLy8gJ1RpZmluYWdoJzogKGNoYXIpID0+IGNoYXIgPj0gMHgyRDMwICYmIGNoYXIgPD0gMHgyRDdGLFxuICAgIC8vICdFdGhpb3BpYyBFeHRlbmRlZCc6IChjaGFyKSA9PiBjaGFyID49IDB4MkQ4MCAmJiBjaGFyIDw9IDB4MkRERixcbiAgICAvLyAnQ3lyaWxsaWMgRXh0ZW5kZWQtQSc6IChjaGFyKSA9PiBjaGFyID49IDB4MkRFMCAmJiBjaGFyIDw9IDB4MkRGRixcbiAgICAvLyAnU3VwcGxlbWVudGFsIFB1bmN0dWF0aW9uJzogKGNoYXIpID0+IGNoYXIgPj0gMHgyRTAwICYmIGNoYXIgPD0gMHgyRTdGLFxuICAgICdDSksgUmFkaWNhbHMgU3VwcGxlbWVudCc6IChjaGFyKSA9PiBjaGFyID49IDB4MkU4MCAmJiBjaGFyIDw9IDB4MkVGRixcbiAgICAnS2FuZ3hpIFJhZGljYWxzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgyRjAwICYmIGNoYXIgPD0gMHgyRkRGLFxuICAgICdJZGVvZ3JhcGhpYyBEZXNjcmlwdGlvbiBDaGFyYWN0ZXJzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgyRkYwICYmIGNoYXIgPD0gMHgyRkZGLFxuICAgICdDSksgU3ltYm9scyBhbmQgUHVuY3R1YXRpb24nOiAoY2hhcikgPT4gY2hhciA+PSAweDMwMDAgJiYgY2hhciA8PSAweDMwM0YsXG4gICAgJ0hpcmFnYW5hJzogKGNoYXIpID0+IGNoYXIgPj0gMHgzMDQwICYmIGNoYXIgPD0gMHgzMDlGLFxuICAgICdLYXRha2FuYSc6IChjaGFyKSA9PiBjaGFyID49IDB4MzBBMCAmJiBjaGFyIDw9IDB4MzBGRixcbiAgICAnQm9wb21vZm8nOiAoY2hhcikgPT4gY2hhciA+PSAweDMxMDAgJiYgY2hhciA8PSAweDMxMkYsXG4gICAgJ0hhbmd1bCBDb21wYXRpYmlsaXR5IEphbW8nOiAoY2hhcikgPT4gY2hhciA+PSAweDMxMzAgJiYgY2hhciA8PSAweDMxOEYsXG4gICAgJ0thbmJ1bic6IChjaGFyKSA9PiBjaGFyID49IDB4MzE5MCAmJiBjaGFyIDw9IDB4MzE5RixcbiAgICAnQm9wb21vZm8gRXh0ZW5kZWQnOiAoY2hhcikgPT4gY2hhciA+PSAweDMxQTAgJiYgY2hhciA8PSAweDMxQkYsXG4gICAgJ0NKSyBTdHJva2VzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgzMUMwICYmIGNoYXIgPD0gMHgzMUVGLFxuICAgICdLYXRha2FuYSBQaG9uZXRpYyBFeHRlbnNpb25zJzogKGNoYXIpID0+IGNoYXIgPj0gMHgzMUYwICYmIGNoYXIgPD0gMHgzMUZGLFxuICAgICdFbmNsb3NlZCBDSksgTGV0dGVycyBhbmQgTW9udGhzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgzMjAwICYmIGNoYXIgPD0gMHgzMkZGLFxuICAgICdDSksgQ29tcGF0aWJpbGl0eSc6IChjaGFyKSA9PiBjaGFyID49IDB4MzMwMCAmJiBjaGFyIDw9IDB4MzNGRixcbiAgICAnQ0pLIFVuaWZpZWQgSWRlb2dyYXBocyBFeHRlbnNpb24gQSc6IChjaGFyKSA9PiBjaGFyID49IDB4MzQwMCAmJiBjaGFyIDw9IDB4NERCRixcbiAgICAnWWlqaW5nIEhleGFncmFtIFN5bWJvbHMnOiAoY2hhcikgPT4gY2hhciA+PSAweDREQzAgJiYgY2hhciA8PSAweDRERkYsXG4gICAgJ0NKSyBVbmlmaWVkIElkZW9ncmFwaHMnOiAoY2hhcikgPT4gY2hhciA+PSAweDRFMDAgJiYgY2hhciA8PSAweDlGRkYsXG4gICAgJ1lpIFN5bGxhYmxlcyc6IChjaGFyKSA9PiBjaGFyID49IDB4QTAwMCAmJiBjaGFyIDw9IDB4QTQ4RixcbiAgICAnWWkgUmFkaWNhbHMnOiAoY2hhcikgPT4gY2hhciA+PSAweEE0OTAgJiYgY2hhciA8PSAweEE0Q0YsXG4gICAgLy8gJ0xpc3UnOiAoY2hhcikgPT4gY2hhciA+PSAweEE0RDAgJiYgY2hhciA8PSAweEE0RkYsXG4gICAgLy8gJ1ZhaSc6IChjaGFyKSA9PiBjaGFyID49IDB4QTUwMCAmJiBjaGFyIDw9IDB4QTYzRixcbiAgICAvLyAnQ3lyaWxsaWMgRXh0ZW5kZWQtQic6IChjaGFyKSA9PiBjaGFyID49IDB4QTY0MCAmJiBjaGFyIDw9IDB4QTY5RixcbiAgICAvLyAnQmFtdW0nOiAoY2hhcikgPT4gY2hhciA+PSAweEE2QTAgJiYgY2hhciA8PSAweEE2RkYsXG4gICAgLy8gJ01vZGlmaWVyIFRvbmUgTGV0dGVycyc6IChjaGFyKSA9PiBjaGFyID49IDB4QTcwMCAmJiBjaGFyIDw9IDB4QTcxRixcbiAgICAvLyAnTGF0aW4gRXh0ZW5kZWQtRCc6IChjaGFyKSA9PiBjaGFyID49IDB4QTcyMCAmJiBjaGFyIDw9IDB4QTdGRixcbiAgICAvLyAnU3lsb3RpIE5hZ3JpJzogKGNoYXIpID0+IGNoYXIgPj0gMHhBODAwICYmIGNoYXIgPD0gMHhBODJGLFxuICAgIC8vICdDb21tb24gSW5kaWMgTnVtYmVyIEZvcm1zJzogKGNoYXIpID0+IGNoYXIgPj0gMHhBODMwICYmIGNoYXIgPD0gMHhBODNGLFxuICAgIC8vICdQaGFncy1wYSc6IChjaGFyKSA9PiBjaGFyID49IDB4QTg0MCAmJiBjaGFyIDw9IDB4QTg3RixcbiAgICAvLyAnU2F1cmFzaHRyYSc6IChjaGFyKSA9PiBjaGFyID49IDB4QTg4MCAmJiBjaGFyIDw9IDB4QThERixcbiAgICAvLyAnRGV2YW5hZ2FyaSBFeHRlbmRlZCc6IChjaGFyKSA9PiBjaGFyID49IDB4QThFMCAmJiBjaGFyIDw9IDB4QThGRixcbiAgICAvLyAnS2F5YWggTGknOiAoY2hhcikgPT4gY2hhciA+PSAweEE5MDAgJiYgY2hhciA8PSAweEE5MkYsXG4gICAgLy8gJ1JlamFuZyc6IChjaGFyKSA9PiBjaGFyID49IDB4QTkzMCAmJiBjaGFyIDw9IDB4QTk1RixcbiAgICAnSGFuZ3VsIEphbW8gRXh0ZW5kZWQtQSc6IChjaGFyKSA9PiBjaGFyID49IDB4QTk2MCAmJiBjaGFyIDw9IDB4QTk3RixcbiAgICAvLyAnSmF2YW5lc2UnOiAoY2hhcikgPT4gY2hhciA+PSAweEE5ODAgJiYgY2hhciA8PSAweEE5REYsXG4gICAgLy8gJ015YW5tYXIgRXh0ZW5kZWQtQic6IChjaGFyKSA9PiBjaGFyID49IDB4QTlFMCAmJiBjaGFyIDw9IDB4QTlGRixcbiAgICAvLyAnQ2hhbSc6IChjaGFyKSA9PiBjaGFyID49IDB4QUEwMCAmJiBjaGFyIDw9IDB4QUE1RixcbiAgICAvLyAnTXlhbm1hciBFeHRlbmRlZC1BJzogKGNoYXIpID0+IGNoYXIgPj0gMHhBQTYwICYmIGNoYXIgPD0gMHhBQTdGLFxuICAgIC8vICdUYWkgVmlldCc6IChjaGFyKSA9PiBjaGFyID49IDB4QUE4MCAmJiBjaGFyIDw9IDB4QUFERixcbiAgICAvLyAnTWVldGVpIE1heWVrIEV4dGVuc2lvbnMnOiAoY2hhcikgPT4gY2hhciA+PSAweEFBRTAgJiYgY2hhciA8PSAweEFBRkYsXG4gICAgLy8gJ0V0aGlvcGljIEV4dGVuZGVkLUEnOiAoY2hhcikgPT4gY2hhciA+PSAweEFCMDAgJiYgY2hhciA8PSAweEFCMkYsXG4gICAgLy8gJ0xhdGluIEV4dGVuZGVkLUUnOiAoY2hhcikgPT4gY2hhciA+PSAweEFCMzAgJiYgY2hhciA8PSAweEFCNkYsXG4gICAgLy8gJ0NoZXJva2VlIFN1cHBsZW1lbnQnOiAoY2hhcikgPT4gY2hhciA+PSAweEFCNzAgJiYgY2hhciA8PSAweEFCQkYsXG4gICAgLy8gJ01lZXRlaSBNYXllayc6IChjaGFyKSA9PiBjaGFyID49IDB4QUJDMCAmJiBjaGFyIDw9IDB4QUJGRixcbiAgICAnSGFuZ3VsIFN5bGxhYmxlcyc6IChjaGFyKSA9PiBjaGFyID49IDB4QUMwMCAmJiBjaGFyIDw9IDB4RDdBRixcbiAgICAnSGFuZ3VsIEphbW8gRXh0ZW5kZWQtQic6IChjaGFyKSA9PiBjaGFyID49IDB4RDdCMCAmJiBjaGFyIDw9IDB4RDdGRixcbiAgICAvLyAnSGlnaCBTdXJyb2dhdGVzJzogKGNoYXIpID0+IGNoYXIgPj0gMHhEODAwICYmIGNoYXIgPD0gMHhEQjdGLFxuICAgIC8vICdIaWdoIFByaXZhdGUgVXNlIFN1cnJvZ2F0ZXMnOiAoY2hhcikgPT4gY2hhciA+PSAweERCODAgJiYgY2hhciA8PSAweERCRkYsXG4gICAgLy8gJ0xvdyBTdXJyb2dhdGVzJzogKGNoYXIpID0+IGNoYXIgPj0gMHhEQzAwICYmIGNoYXIgPD0gMHhERkZGLFxuICAgICdQcml2YXRlIFVzZSBBcmVhJzogKGNoYXIpID0+IGNoYXIgPj0gMHhFMDAwICYmIGNoYXIgPD0gMHhGOEZGLFxuICAgICdDSksgQ29tcGF0aWJpbGl0eSBJZGVvZ3JhcGhzJzogKGNoYXIpID0+IGNoYXIgPj0gMHhGOTAwICYmIGNoYXIgPD0gMHhGQUZGLFxuICAgIC8vICdBbHBoYWJldGljIFByZXNlbnRhdGlvbiBGb3Jtcyc6IChjaGFyKSA9PiBjaGFyID49IDB4RkIwMCAmJiBjaGFyIDw9IDB4RkI0RixcbiAgICAvLyAnQXJhYmljIFByZXNlbnRhdGlvbiBGb3Jtcy1BJzogKGNoYXIpID0+IGNoYXIgPj0gMHhGQjUwICYmIGNoYXIgPD0gMHhGREZGLFxuICAgIC8vICdWYXJpYXRpb24gU2VsZWN0b3JzJzogKGNoYXIpID0+IGNoYXIgPj0gMHhGRTAwICYmIGNoYXIgPD0gMHhGRTBGLFxuICAgICdWZXJ0aWNhbCBGb3Jtcyc6IChjaGFyKSA9PiBjaGFyID49IDB4RkUxMCAmJiBjaGFyIDw9IDB4RkUxRixcbiAgICAvLyAnQ29tYmluaW5nIEhhbGYgTWFya3MnOiAoY2hhcikgPT4gY2hhciA+PSAweEZFMjAgJiYgY2hhciA8PSAweEZFMkYsXG4gICAgJ0NKSyBDb21wYXRpYmlsaXR5IEZvcm1zJzogKGNoYXIpID0+IGNoYXIgPj0gMHhGRTMwICYmIGNoYXIgPD0gMHhGRTRGLFxuICAgICdTbWFsbCBGb3JtIFZhcmlhbnRzJzogKGNoYXIpID0+IGNoYXIgPj0gMHhGRTUwICYmIGNoYXIgPD0gMHhGRTZGLFxuICAgIC8vICdBcmFiaWMgUHJlc2VudGF0aW9uIEZvcm1zLUInOiAoY2hhcikgPT4gY2hhciA+PSAweEZFNzAgJiYgY2hhciA8PSAweEZFRkYsXG4gICAgJ0hhbGZ3aWR0aCBhbmQgRnVsbHdpZHRoIEZvcm1zJzogKGNoYXIpID0+IGNoYXIgPj0gMHhGRjAwICYmIGNoYXIgPD0gMHhGRkVGXG4gICAgLy8gJ1NwZWNpYWxzJzogKGNoYXIpID0+IGNoYXIgPj0gMHhGRkYwICYmIGNoYXIgPD0gMHhGRkZGLFxuICAgIC8vICdMaW5lYXIgQiBTeWxsYWJhcnknOiAoY2hhcikgPT4gY2hhciA+PSAweDEwMDAwICYmIGNoYXIgPD0gMHgxMDA3RixcbiAgICAvLyAnTGluZWFyIEIgSWRlb2dyYW1zJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMDA4MCAmJiBjaGFyIDw9IDB4MTAwRkYsXG4gICAgLy8gJ0FlZ2VhbiBOdW1iZXJzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMDEwMCAmJiBjaGFyIDw9IDB4MTAxM0YsXG4gICAgLy8gJ0FuY2llbnQgR3JlZWsgTnVtYmVycyc6IChjaGFyKSA9PiBjaGFyID49IDB4MTAxNDAgJiYgY2hhciA8PSAweDEwMThGLFxuICAgIC8vICdBbmNpZW50IFN5bWJvbHMnOiAoY2hhcikgPT4gY2hhciA+PSAweDEwMTkwICYmIGNoYXIgPD0gMHgxMDFDRixcbiAgICAvLyAnUGhhaXN0b3MgRGlzYyc6IChjaGFyKSA9PiBjaGFyID49IDB4MTAxRDAgJiYgY2hhciA8PSAweDEwMUZGLFxuICAgIC8vICdMeWNpYW4nOiAoY2hhcikgPT4gY2hhciA+PSAweDEwMjgwICYmIGNoYXIgPD0gMHgxMDI5RixcbiAgICAvLyAnQ2FyaWFuJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMDJBMCAmJiBjaGFyIDw9IDB4MTAyREYsXG4gICAgLy8gJ0NvcHRpYyBFcGFjdCBOdW1iZXJzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMDJFMCAmJiBjaGFyIDw9IDB4MTAyRkYsXG4gICAgLy8gJ09sZCBJdGFsaWMnOiAoY2hhcikgPT4gY2hhciA+PSAweDEwMzAwICYmIGNoYXIgPD0gMHgxMDMyRixcbiAgICAvLyAnR290aGljJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMDMzMCAmJiBjaGFyIDw9IDB4MTAzNEYsXG4gICAgLy8gJ09sZCBQZXJtaWMnOiAoY2hhcikgPT4gY2hhciA+PSAweDEwMzUwICYmIGNoYXIgPD0gMHgxMDM3RixcbiAgICAvLyAnVWdhcml0aWMnOiAoY2hhcikgPT4gY2hhciA+PSAweDEwMzgwICYmIGNoYXIgPD0gMHgxMDM5RixcbiAgICAvLyAnT2xkIFBlcnNpYW4nOiAoY2hhcikgPT4gY2hhciA+PSAweDEwM0EwICYmIGNoYXIgPD0gMHgxMDNERixcbiAgICAvLyAnRGVzZXJldCc6IChjaGFyKSA9PiBjaGFyID49IDB4MTA0MDAgJiYgY2hhciA8PSAweDEwNDRGLFxuICAgIC8vICdTaGF2aWFuJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMDQ1MCAmJiBjaGFyIDw9IDB4MTA0N0YsXG4gICAgLy8gJ09zbWFueWEnOiAoY2hhcikgPT4gY2hhciA+PSAweDEwNDgwICYmIGNoYXIgPD0gMHgxMDRBRixcbiAgICAvLyAnT3NhZ2UnOiAoY2hhcikgPT4gY2hhciA+PSAweDEwNEIwICYmIGNoYXIgPD0gMHgxMDRGRixcbiAgICAvLyAnRWxiYXNhbic6IChjaGFyKSA9PiBjaGFyID49IDB4MTA1MDAgJiYgY2hhciA8PSAweDEwNTJGLFxuICAgIC8vICdDYXVjYXNpYW4gQWxiYW5pYW4nOiAoY2hhcikgPT4gY2hhciA+PSAweDEwNTMwICYmIGNoYXIgPD0gMHgxMDU2RixcbiAgICAvLyAnTGluZWFyIEEnOiAoY2hhcikgPT4gY2hhciA+PSAweDEwNjAwICYmIGNoYXIgPD0gMHgxMDc3RixcbiAgICAvLyAnQ3lwcmlvdCBTeWxsYWJhcnknOiAoY2hhcikgPT4gY2hhciA+PSAweDEwODAwICYmIGNoYXIgPD0gMHgxMDgzRixcbiAgICAvLyAnSW1wZXJpYWwgQXJhbWFpYyc6IChjaGFyKSA9PiBjaGFyID49IDB4MTA4NDAgJiYgY2hhciA8PSAweDEwODVGLFxuICAgIC8vICdQYWxteXJlbmUnOiAoY2hhcikgPT4gY2hhciA+PSAweDEwODYwICYmIGNoYXIgPD0gMHgxMDg3RixcbiAgICAvLyAnTmFiYXRhZWFuJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMDg4MCAmJiBjaGFyIDw9IDB4MTA4QUYsXG4gICAgLy8gJ0hhdHJhbic6IChjaGFyKSA9PiBjaGFyID49IDB4MTA4RTAgJiYgY2hhciA8PSAweDEwOEZGLFxuICAgIC8vICdQaG9lbmljaWFuJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMDkwMCAmJiBjaGFyIDw9IDB4MTA5MUYsXG4gICAgLy8gJ0x5ZGlhbic6IChjaGFyKSA9PiBjaGFyID49IDB4MTA5MjAgJiYgY2hhciA8PSAweDEwOTNGLFxuICAgIC8vICdNZXJvaXRpYyBIaWVyb2dseXBocyc6IChjaGFyKSA9PiBjaGFyID49IDB4MTA5ODAgJiYgY2hhciA8PSAweDEwOTlGLFxuICAgIC8vICdNZXJvaXRpYyBDdXJzaXZlJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMDlBMCAmJiBjaGFyIDw9IDB4MTA5RkYsXG4gICAgLy8gJ0toYXJvc2h0aGknOiAoY2hhcikgPT4gY2hhciA+PSAweDEwQTAwICYmIGNoYXIgPD0gMHgxMEE1RixcbiAgICAvLyAnT2xkIFNvdXRoIEFyYWJpYW4nOiAoY2hhcikgPT4gY2hhciA+PSAweDEwQTYwICYmIGNoYXIgPD0gMHgxMEE3RixcbiAgICAvLyAnT2xkIE5vcnRoIEFyYWJpYW4nOiAoY2hhcikgPT4gY2hhciA+PSAweDEwQTgwICYmIGNoYXIgPD0gMHgxMEE5RixcbiAgICAvLyAnTWFuaWNoYWVhbic6IChjaGFyKSA9PiBjaGFyID49IDB4MTBBQzAgJiYgY2hhciA8PSAweDEwQUZGLFxuICAgIC8vICdBdmVzdGFuJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMEIwMCAmJiBjaGFyIDw9IDB4MTBCM0YsXG4gICAgLy8gJ0luc2NyaXB0aW9uYWwgUGFydGhpYW4nOiAoY2hhcikgPT4gY2hhciA+PSAweDEwQjQwICYmIGNoYXIgPD0gMHgxMEI1RixcbiAgICAvLyAnSW5zY3JpcHRpb25hbCBQYWhsYXZpJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMEI2MCAmJiBjaGFyIDw9IDB4MTBCN0YsXG4gICAgLy8gJ1BzYWx0ZXIgUGFobGF2aSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTBCODAgJiYgY2hhciA8PSAweDEwQkFGLFxuICAgIC8vICdPbGQgVHVya2ljJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMEMwMCAmJiBjaGFyIDw9IDB4MTBDNEYsXG4gICAgLy8gJ09sZCBIdW5nYXJpYW4nOiAoY2hhcikgPT4gY2hhciA+PSAweDEwQzgwICYmIGNoYXIgPD0gMHgxMENGRixcbiAgICAvLyAnUnVtaSBOdW1lcmFsIFN5bWJvbHMnOiAoY2hhcikgPT4gY2hhciA+PSAweDEwRTYwICYmIGNoYXIgPD0gMHgxMEU3RixcbiAgICAvLyAnQnJhaG1pJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMTAwMCAmJiBjaGFyIDw9IDB4MTEwN0YsXG4gICAgLy8gJ0thaXRoaSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTEwODAgJiYgY2hhciA8PSAweDExMENGLFxuICAgIC8vICdTb3JhIFNvbXBlbmcnOiAoY2hhcikgPT4gY2hhciA+PSAweDExMEQwICYmIGNoYXIgPD0gMHgxMTBGRixcbiAgICAvLyAnQ2hha21hJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMTEwMCAmJiBjaGFyIDw9IDB4MTExNEYsXG4gICAgLy8gJ01haGFqYW5pJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMTE1MCAmJiBjaGFyIDw9IDB4MTExN0YsXG4gICAgLy8gJ1NoYXJhZGEnOiAoY2hhcikgPT4gY2hhciA+PSAweDExMTgwICYmIGNoYXIgPD0gMHgxMTFERixcbiAgICAvLyAnU2luaGFsYSBBcmNoYWljIE51bWJlcnMnOiAoY2hhcikgPT4gY2hhciA+PSAweDExMUUwICYmIGNoYXIgPD0gMHgxMTFGRixcbiAgICAvLyAnS2hvamtpJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMTIwMCAmJiBjaGFyIDw9IDB4MTEyNEYsXG4gICAgLy8gJ011bHRhbmknOiAoY2hhcikgPT4gY2hhciA+PSAweDExMjgwICYmIGNoYXIgPD0gMHgxMTJBRixcbiAgICAvLyAnS2h1ZGF3YWRpJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMTJCMCAmJiBjaGFyIDw9IDB4MTEyRkYsXG4gICAgLy8gJ0dyYW50aGEnOiAoY2hhcikgPT4gY2hhciA+PSAweDExMzAwICYmIGNoYXIgPD0gMHgxMTM3RixcbiAgICAvLyAnTmV3YSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTE0MDAgJiYgY2hhciA8PSAweDExNDdGLFxuICAgIC8vICdUaXJodXRhJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMTQ4MCAmJiBjaGFyIDw9IDB4MTE0REYsXG4gICAgLy8gJ1NpZGRoYW0nOiAoY2hhcikgPT4gY2hhciA+PSAweDExNTgwICYmIGNoYXIgPD0gMHgxMTVGRixcbiAgICAvLyAnTW9kaSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTE2MDAgJiYgY2hhciA8PSAweDExNjVGLFxuICAgIC8vICdNb25nb2xpYW4gU3VwcGxlbWVudCc6IChjaGFyKSA9PiBjaGFyID49IDB4MTE2NjAgJiYgY2hhciA8PSAweDExNjdGLFxuICAgIC8vICdUYWtyaSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTE2ODAgJiYgY2hhciA8PSAweDExNkNGLFxuICAgIC8vICdBaG9tJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMTcwMCAmJiBjaGFyIDw9IDB4MTE3M0YsXG4gICAgLy8gJ1dhcmFuZyBDaXRpJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMThBMCAmJiBjaGFyIDw9IDB4MTE4RkYsXG4gICAgLy8gJ1BhdSBDaW4gSGF1JzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMUFDMCAmJiBjaGFyIDw9IDB4MTFBRkYsXG4gICAgLy8gJ0JoYWlrc3VraSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTFDMDAgJiYgY2hhciA8PSAweDExQzZGLFxuICAgIC8vICdNYXJjaGVuJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMUM3MCAmJiBjaGFyIDw9IDB4MTFDQkYsXG4gICAgLy8gJ0N1bmVpZm9ybSc6IChjaGFyKSA9PiBjaGFyID49IDB4MTIwMDAgJiYgY2hhciA8PSAweDEyM0ZGLFxuICAgIC8vICdDdW5laWZvcm0gTnVtYmVycyBhbmQgUHVuY3R1YXRpb24nOiAoY2hhcikgPT4gY2hhciA+PSAweDEyNDAwICYmIGNoYXIgPD0gMHgxMjQ3RixcbiAgICAvLyAnRWFybHkgRHluYXN0aWMgQ3VuZWlmb3JtJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMjQ4MCAmJiBjaGFyIDw9IDB4MTI1NEYsXG4gICAgLy8gJ0VneXB0aWFuIEhpZXJvZ2x5cGhzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMzAwMCAmJiBjaGFyIDw9IDB4MTM0MkYsXG4gICAgLy8gJ0FuYXRvbGlhbiBIaWVyb2dseXBocyc6IChjaGFyKSA9PiBjaGFyID49IDB4MTQ0MDAgJiYgY2hhciA8PSAweDE0NjdGLFxuICAgIC8vICdCYW11bSBTdXBwbGVtZW50JzogKGNoYXIpID0+IGNoYXIgPj0gMHgxNjgwMCAmJiBjaGFyIDw9IDB4MTZBM0YsXG4gICAgLy8gJ01ybyc6IChjaGFyKSA9PiBjaGFyID49IDB4MTZBNDAgJiYgY2hhciA8PSAweDE2QTZGLFxuICAgIC8vICdCYXNzYSBWYWgnOiAoY2hhcikgPT4gY2hhciA+PSAweDE2QUQwICYmIGNoYXIgPD0gMHgxNkFGRixcbiAgICAvLyAnUGFoYXdoIEhtb25nJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxNkIwMCAmJiBjaGFyIDw9IDB4MTZCOEYsXG4gICAgLy8gJ01pYW8nOiAoY2hhcikgPT4gY2hhciA+PSAweDE2RjAwICYmIGNoYXIgPD0gMHgxNkY5RixcbiAgICAvLyAnSWRlb2dyYXBoaWMgU3ltYm9scyBhbmQgUHVuY3R1YXRpb24nOiAoY2hhcikgPT4gY2hhciA+PSAweDE2RkUwICYmIGNoYXIgPD0gMHgxNkZGRixcbiAgICAvLyAnVGFuZ3V0JzogKGNoYXIpID0+IGNoYXIgPj0gMHgxNzAwMCAmJiBjaGFyIDw9IDB4MTg3RkYsXG4gICAgLy8gJ1Rhbmd1dCBDb21wb25lbnRzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxODgwMCAmJiBjaGFyIDw9IDB4MThBRkYsXG4gICAgLy8gJ0thbmEgU3VwcGxlbWVudCc6IChjaGFyKSA9PiBjaGFyID49IDB4MUIwMDAgJiYgY2hhciA8PSAweDFCMEZGLFxuICAgIC8vICdEdXBsb3lhbic6IChjaGFyKSA9PiBjaGFyID49IDB4MUJDMDAgJiYgY2hhciA8PSAweDFCQzlGLFxuICAgIC8vICdTaG9ydGhhbmQgRm9ybWF0IENvbnRyb2xzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxQkNBMCAmJiBjaGFyIDw9IDB4MUJDQUYsXG4gICAgLy8gJ0J5emFudGluZSBNdXNpY2FsIFN5bWJvbHMnOiAoY2hhcikgPT4gY2hhciA+PSAweDFEMDAwICYmIGNoYXIgPD0gMHgxRDBGRixcbiAgICAvLyAnTXVzaWNhbCBTeW1ib2xzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRDEwMCAmJiBjaGFyIDw9IDB4MUQxRkYsXG4gICAgLy8gJ0FuY2llbnQgR3JlZWsgTXVzaWNhbCBOb3RhdGlvbic6IChjaGFyKSA9PiBjaGFyID49IDB4MUQyMDAgJiYgY2hhciA8PSAweDFEMjRGLFxuICAgIC8vICdUYWkgWHVhbiBKaW5nIFN5bWJvbHMnOiAoY2hhcikgPT4gY2hhciA+PSAweDFEMzAwICYmIGNoYXIgPD0gMHgxRDM1RixcbiAgICAvLyAnQ291bnRpbmcgUm9kIE51bWVyYWxzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRDM2MCAmJiBjaGFyIDw9IDB4MUQzN0YsXG4gICAgLy8gJ01hdGhlbWF0aWNhbCBBbHBoYW51bWVyaWMgU3ltYm9scyc6IChjaGFyKSA9PiBjaGFyID49IDB4MUQ0MDAgJiYgY2hhciA8PSAweDFEN0ZGLFxuICAgIC8vICdTdXR0b24gU2lnbldyaXRpbmcnOiAoY2hhcikgPT4gY2hhciA+PSAweDFEODAwICYmIGNoYXIgPD0gMHgxREFBRixcbiAgICAvLyAnR2xhZ29saXRpYyBTdXBwbGVtZW50JzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRTAwMCAmJiBjaGFyIDw9IDB4MUUwMkYsXG4gICAgLy8gJ01lbmRlIEtpa2FrdWknOiAoY2hhcikgPT4gY2hhciA+PSAweDFFODAwICYmIGNoYXIgPD0gMHgxRThERixcbiAgICAvLyAnQWRsYW0nOiAoY2hhcikgPT4gY2hhciA+PSAweDFFOTAwICYmIGNoYXIgPD0gMHgxRTk1RixcbiAgICAvLyAnQXJhYmljIE1hdGhlbWF0aWNhbCBBbHBoYWJldGljIFN5bWJvbHMnOiAoY2hhcikgPT4gY2hhciA+PSAweDFFRTAwICYmIGNoYXIgPD0gMHgxRUVGRixcbiAgICAvLyAnTWFoam9uZyBUaWxlcyc6IChjaGFyKSA9PiBjaGFyID49IDB4MUYwMDAgJiYgY2hhciA8PSAweDFGMDJGLFxuICAgIC8vICdEb21pbm8gVGlsZXMnOiAoY2hhcikgPT4gY2hhciA+PSAweDFGMDMwICYmIGNoYXIgPD0gMHgxRjA5RixcbiAgICAvLyAnUGxheWluZyBDYXJkcyc6IChjaGFyKSA9PiBjaGFyID49IDB4MUYwQTAgJiYgY2hhciA8PSAweDFGMEZGLFxuICAgIC8vICdFbmNsb3NlZCBBbHBoYW51bWVyaWMgU3VwcGxlbWVudCc6IChjaGFyKSA9PiBjaGFyID49IDB4MUYxMDAgJiYgY2hhciA8PSAweDFGMUZGLFxuICAgIC8vICdFbmNsb3NlZCBJZGVvZ3JhcGhpYyBTdXBwbGVtZW50JzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRjIwMCAmJiBjaGFyIDw9IDB4MUYyRkYsXG4gICAgLy8gJ01pc2NlbGxhbmVvdXMgU3ltYm9scyBhbmQgUGljdG9ncmFwaHMnOiAoY2hhcikgPT4gY2hhciA+PSAweDFGMzAwICYmIGNoYXIgPD0gMHgxRjVGRixcbiAgICAvLyAnRW1vdGljb25zJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRjYwMCAmJiBjaGFyIDw9IDB4MUY2NEYsXG4gICAgLy8gJ09ybmFtZW50YWwgRGluZ2JhdHMnOiAoY2hhcikgPT4gY2hhciA+PSAweDFGNjUwICYmIGNoYXIgPD0gMHgxRjY3RixcbiAgICAvLyAnVHJhbnNwb3J0IGFuZCBNYXAgU3ltYm9scyc6IChjaGFyKSA9PiBjaGFyID49IDB4MUY2ODAgJiYgY2hhciA8PSAweDFGNkZGLFxuICAgIC8vICdBbGNoZW1pY2FsIFN5bWJvbHMnOiAoY2hhcikgPT4gY2hhciA+PSAweDFGNzAwICYmIGNoYXIgPD0gMHgxRjc3RixcbiAgICAvLyAnR2VvbWV0cmljIFNoYXBlcyBFeHRlbmRlZCc6IChjaGFyKSA9PiBjaGFyID49IDB4MUY3ODAgJiYgY2hhciA8PSAweDFGN0ZGLFxuICAgIC8vICdTdXBwbGVtZW50YWwgQXJyb3dzLUMnOiAoY2hhcikgPT4gY2hhciA+PSAweDFGODAwICYmIGNoYXIgPD0gMHgxRjhGRixcbiAgICAvLyAnU3VwcGxlbWVudGFsIFN5bWJvbHMgYW5kIFBpY3RvZ3JhcGhzJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxRjkwMCAmJiBjaGFyIDw9IDB4MUY5RkYsXG4gICAgLy8gJ0NKSyBVbmlmaWVkIElkZW9ncmFwaHMgRXh0ZW5zaW9uIEInOiAoY2hhcikgPT4gY2hhciA+PSAweDIwMDAwICYmIGNoYXIgPD0gMHgyQTZERixcbiAgICAvLyAnQ0pLIFVuaWZpZWQgSWRlb2dyYXBocyBFeHRlbnNpb24gQyc6IChjaGFyKSA9PiBjaGFyID49IDB4MkE3MDAgJiYgY2hhciA8PSAweDJCNzNGLFxuICAgIC8vICdDSksgVW5pZmllZCBJZGVvZ3JhcGhzIEV4dGVuc2lvbiBEJzogKGNoYXIpID0+IGNoYXIgPj0gMHgyQjc0MCAmJiBjaGFyIDw9IDB4MkI4MUYsXG4gICAgLy8gJ0NKSyBVbmlmaWVkIElkZW9ncmFwaHMgRXh0ZW5zaW9uIEUnOiAoY2hhcikgPT4gY2hhciA+PSAweDJCODIwICYmIGNoYXIgPD0gMHgyQ0VBRixcbiAgICAvLyAnQ0pLIENvbXBhdGliaWxpdHkgSWRlb2dyYXBocyBTdXBwbGVtZW50JzogKGNoYXIpID0+IGNoYXIgPj0gMHgyRjgwMCAmJiBjaGFyIDw9IDB4MkZBMUYsXG4gICAgLy8gJ1RhZ3MnOiAoY2hhcikgPT4gY2hhciA+PSAweEUwMDAwICYmIGNoYXIgPD0gMHhFMDA3RixcbiAgICAvLyAnVmFyaWF0aW9uIFNlbGVjdG9ycyBTdXBwbGVtZW50JzogKGNoYXIpID0+IGNoYXIgPj0gMHhFMDEwMCAmJiBjaGFyIDw9IDB4RTAxRUYsXG4gICAgLy8gJ1N1cHBsZW1lbnRhcnkgUHJpdmF0ZSBVc2UgQXJlYS1BJzogKGNoYXIpID0+IGNoYXIgPj0gMHhGMDAwMCAmJiBjaGFyIDw9IDB4RkZGRkYsXG4gICAgLy8gJ1N1cHBsZW1lbnRhcnkgUHJpdmF0ZSBVc2UgQXJlYS1CJzogKGNoYXIpID0+IGNoYXIgPj0gMHgxMDAwMDAgJiYgY2hhciA8PSAweDEwRkZGRixcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gdW5pY29kZUJsb2NrTG9va3VwO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gICAgICBcblxuLyoqXG4gKiBBIFtsZWFzdC1yZWNlbnRseS11c2VkIGNhY2hlXShodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NhY2hlX2FsZ29yaXRobXMpXG4gKiB3aXRoIGhhc2ggbG9va3VwIG1hZGUgcG9zc2libGUgYnkga2VlcGluZyBhIGxpc3Qgb2Yga2V5cyBpbiBwYXJhbGxlbCB0b1xuICogYW4gYXJyYXkgb2YgZGljdGlvbmFyeSBvZiB2YWx1ZXNcbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBMUlVDYWNoZSAgICB7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWF4IG51bWJlciBvZiBwZXJtaXR0ZWQgdmFsdWVzXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25SZW1vdmUgY2FsbGJhY2sgY2FsbGVkIHdpdGggaXRlbXMgd2hlbiB0aGV5IGV4cGlyZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG1heCAgICAgICAgLCBvblJlbW92ZSAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgdGhpcy5tYXggPSBtYXg7XG4gICAgICAgIHRoaXMub25SZW1vdmUgPSBvblJlbW92ZTtcbiAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFyIHRoZSBjYWNoZVxuICAgICAqXG4gICAgICogQHJldHVybnMge0xSVUNhY2hlfSB0aGlzIGNhY2hlXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICByZXNldCgpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy5kYXRhKSB7XG4gICAgICAgICAgICB0aGlzLm9uUmVtb3ZlKHRoaXMuZGF0YVtrZXldKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGF0YSA9IHt9O1xuICAgICAgICB0aGlzLm9yZGVyID0gW107XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkIGEga2V5LCB2YWx1ZSBjb21iaW5hdGlvbiB0byB0aGUgY2FjaGUsIHRyaW1taW5nIGl0cyBzaXplIGlmIHRoaXMgcHVzaGVzXG4gICAgICogaXQgb3ZlciBtYXggbGVuZ3RoLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBsb29rdXAga2V5IGZvciB0aGUgaXRlbVxuICAgICAqIEBwYXJhbSB7Kn0gZGF0YSBhbnkgdmFsdWVcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtMUlVDYWNoZX0gdGhpcyBjYWNoZVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgYWRkKGtleSAgICAgICAgLCBkYXRhICAgKSB7XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzKGtleSkpIHtcbiAgICAgICAgICAgIHRoaXMub3JkZXIuc3BsaWNlKHRoaXMub3JkZXIuaW5kZXhPZihrZXkpLCAxKTtcbiAgICAgICAgICAgIHRoaXMuZGF0YVtrZXldID0gZGF0YTtcbiAgICAgICAgICAgIHRoaXMub3JkZXIucHVzaChrZXkpO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRhdGFba2V5XSA9IGRhdGE7XG4gICAgICAgICAgICB0aGlzLm9yZGVyLnB1c2goa2V5KTtcblxuICAgICAgICAgICAgaWYgKHRoaXMub3JkZXIubGVuZ3RoID4gdGhpcy5tYXgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZW1vdmVkRGF0YSA9IHRoaXMuZ2V0KHRoaXMub3JkZXJbMF0pO1xuICAgICAgICAgICAgICAgIGlmIChyZW1vdmVkRGF0YSkgdGhpcy5vblJlbW92ZShyZW1vdmVkRGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgdmFsdWUgYXR0YWNoZWQgdG8gYGtleWAgaXMgcHJlc2VudFxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSB0aGUga2V5IHRvIGJlIGxvb2tlZC11cFxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSB3aGV0aGVyIHRoZSBjYWNoZSBoYXMgdGhpcyB2YWx1ZVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgaGFzKGtleSAgICAgICAgKSAgICAgICAgICB7XG4gICAgICAgIHJldHVybiBrZXkgaW4gdGhpcy5kYXRhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3QgYWxsIGtleXMgaW4gdGhlIGNhY2hlXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7QXJyYXk8c3RyaW5nPn0gYW4gYXJyYXkgb2Yga2V5cyBpbiB0aGlzIGNhY2hlLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAga2V5cygpICAgICAgICAgICAgICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JkZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB2YWx1ZSBhdHRhY2hlZCB0byBhIHNwZWNpZmljIGtleS4gSWYgdGhlIGtleSBpcyBub3QgZm91bmQsXG4gICAgICogcmV0dXJucyBgbnVsbGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgdGhlIGtleSB0byBsb29rIHVwXG4gICAgICogQHJldHVybnMgeyp9IHRoZSBkYXRhLCBvciBudWxsIGlmIGl0IGlzbid0IGZvdW5kXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBnZXQoa2V5ICAgICAgICApICAgICB7XG4gICAgICAgIGlmICghdGhpcy5oYXMoa2V5KSkgeyByZXR1cm4gbnVsbDsgfVxuXG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGFba2V5XTtcblxuICAgICAgICBkZWxldGUgdGhpcy5kYXRhW2tleV07XG4gICAgICAgIHRoaXMub3JkZXIuc3BsaWNlKHRoaXMub3JkZXIuaW5kZXhPZihrZXkpLCAxKTtcblxuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYSBrZXkvdmFsdWUgY29tYmluYXRpb24gZnJvbSB0aGUgY2FjaGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IHRoZSBrZXkgZm9yIHRoZSBwYWlyIHRvIGRlbGV0ZVxuICAgICAqIEByZXR1cm5zIHtMUlVDYWNoZX0gdGhpcyBjYWNoZVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcmVtb3ZlKGtleSAgICAgICAgKSB7XG4gICAgICAgIGlmICghdGhpcy5oYXMoa2V5KSkgeyByZXR1cm4gdGhpczsgfVxuXG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGFba2V5XTtcbiAgICAgICAgZGVsZXRlIHRoaXMuZGF0YVtrZXldO1xuICAgICAgICB0aGlzLm9uUmVtb3ZlKGRhdGEpO1xuICAgICAgICB0aGlzLm9yZGVyLnNwbGljZSh0aGlzLm9yZGVyLmluZGV4T2Yoa2V5KSwgMSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hhbmdlIHRoZSBtYXggc2l6ZSBvZiB0aGUgY2FjaGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWF4IHRoZSBtYXggc2l6ZSBvZiB0aGUgY2FjaGVcbiAgICAgKiBAcmV0dXJucyB7TFJVQ2FjaGV9IHRoaXMgY2FjaGVcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHNldE1heFNpemUobWF4ICAgICAgICApICAgICAgICAgICAgICB7XG4gICAgICAgIHRoaXMubWF4ID0gbWF4O1xuXG4gICAgICAgIHdoaWxlICh0aGlzLm9yZGVyLmxlbmd0aCA+IHRoaXMubWF4KSB7XG4gICAgICAgICAgICBjb25zdCByZW1vdmVkRGF0YSA9IHRoaXMuZ2V0KHRoaXMub3JkZXJbMF0pO1xuICAgICAgICAgICAgaWYgKHJlbW92ZWREYXRhKSB0aGlzLm9uUmVtb3ZlKHJlbW92ZWREYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBMUlVDYWNoZTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vICAgICAgXG5cbmNvbnN0IGNvbmZpZyA9IHJlcXVpcmUoJy4vY29uZmlnJyk7XG5jb25zdCBicm93c2VyID0gcmVxdWlyZSgnLi9icm93c2VyJyk7XG5cbmNvbnN0IGhlbHAgPSAnU2VlIGh0dHBzOi8vd3d3Lm1hcGJveC5jb20vZGV2ZWxvcGVycy9hcGkvI2FjY2Vzcy10b2tlbnMnO1xuXG4gICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgXG4gICBcblxuZnVuY3Rpb24gbWFrZUFQSVVSTCh1cmxPYmplY3QgICAgICAgICAgICwgYWNjZXNzVG9rZW4pICAgICAgICAge1xuICAgIGNvbnN0IGFwaVVybE9iamVjdCA9IHBhcnNlVXJsKGNvbmZpZy5BUElfVVJMKTtcbiAgICB1cmxPYmplY3QucHJvdG9jb2wgPSBhcGlVcmxPYmplY3QucHJvdG9jb2w7XG4gICAgdXJsT2JqZWN0LmF1dGhvcml0eSA9IGFwaVVybE9iamVjdC5hdXRob3JpdHk7XG5cbiAgICBpZiAoIWNvbmZpZy5SRVFVSVJFX0FDQ0VTU19UT0tFTikgcmV0dXJuIGZvcm1hdFVybCh1cmxPYmplY3QpO1xuXG4gICAgYWNjZXNzVG9rZW4gPSBhY2Nlc3NUb2tlbiB8fCBjb25maWcuQUNDRVNTX1RPS0VOO1xuICAgIGlmICghYWNjZXNzVG9rZW4pXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQW4gQVBJIGFjY2VzcyB0b2tlbiBpcyByZXF1aXJlZCB0byB1c2UgTWFwYm94IEdMLiAke2hlbHB9YCk7XG4gICAgaWYgKGFjY2Vzc1Rva2VuWzBdID09PSAncycpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVXNlIGEgcHVibGljIGFjY2VzcyB0b2tlbiAocGsuKikgd2l0aCBNYXBib3ggR0wsIG5vdCBhIHNlY3JldCBhY2Nlc3MgdG9rZW4gKHNrLiopLiAke2hlbHB9YCk7XG5cbiAgICB1cmxPYmplY3QucGFyYW1zLnB1c2goYGFjY2Vzc190b2tlbj0ke2FjY2Vzc1Rva2VufWApO1xuICAgIHJldHVybiBmb3JtYXRVcmwodXJsT2JqZWN0KTtcbn1cblxuZnVuY3Rpb24gaXNNYXBib3hVUkwodXJsICAgICAgICApIHtcbiAgICByZXR1cm4gdXJsLmluZGV4T2YoJ21hcGJveDonKSA9PT0gMDtcbn1cblxuZXhwb3J0cy5pc01hcGJveFVSTCA9IGlzTWFwYm94VVJMO1xuXG5leHBvcnRzLm5vcm1hbGl6ZVN0eWxlVVJMID0gZnVuY3Rpb24odXJsICAgICAgICAsIGFjY2Vzc1Rva2VuICAgICAgICApICAgICAgICAge1xuICAgIGlmICghaXNNYXBib3hVUkwodXJsKSkgcmV0dXJuIHVybDtcbiAgICBjb25zdCB1cmxPYmplY3QgPSBwYXJzZVVybCh1cmwpO1xuICAgIHVybE9iamVjdC5wYXRoID0gYC9zdHlsZXMvdjEke3VybE9iamVjdC5wYXRofWA7XG4gICAgcmV0dXJuIG1ha2VBUElVUkwodXJsT2JqZWN0LCBhY2Nlc3NUb2tlbik7XG59O1xuXG5leHBvcnRzLm5vcm1hbGl6ZUdseXBoc1VSTCA9IGZ1bmN0aW9uKHVybCAgICAgICAgLCBhY2Nlc3NUb2tlbiAgICAgICAgKSAgICAgICAgIHtcbiAgICBpZiAoIWlzTWFwYm94VVJMKHVybCkpIHJldHVybiB1cmw7XG4gICAgY29uc3QgdXJsT2JqZWN0ID0gcGFyc2VVcmwodXJsKTtcbiAgICB1cmxPYmplY3QucGF0aCA9IGAvZm9udHMvdjEke3VybE9iamVjdC5wYXRofWA7XG4gICAgcmV0dXJuIG1ha2VBUElVUkwodXJsT2JqZWN0LCBhY2Nlc3NUb2tlbik7XG59O1xuXG5leHBvcnRzLm5vcm1hbGl6ZVNvdXJjZVVSTCA9IGZ1bmN0aW9uKHVybCAgICAgICAgLCBhY2Nlc3NUb2tlbiAgICAgICAgKSAgICAgICAgIHtcbiAgICBpZiAoIWlzTWFwYm94VVJMKHVybCkpIHJldHVybiB1cmw7XG4gICAgY29uc3QgdXJsT2JqZWN0ID0gcGFyc2VVcmwodXJsKTtcbiAgICB1cmxPYmplY3QucGF0aCA9IGAvdjQvJHt1cmxPYmplY3QuYXV0aG9yaXR5fS5qc29uYDtcbiAgICAvLyBUaWxlSlNPTiByZXF1ZXN0cyBuZWVkIGEgc2VjdXJlIGZsYWcgYXBwZW5kZWQgdG8gdGhlaXIgVVJMcyBzb1xuICAgIC8vIHRoYXQgdGhlIHNlcnZlciBrbm93cyB0byBzZW5kIFNTTC1pZmllZCByZXNvdXJjZSByZWZlcmVuY2VzLlxuICAgIHVybE9iamVjdC5wYXJhbXMucHVzaCgnc2VjdXJlJyk7XG4gICAgcmV0dXJuIG1ha2VBUElVUkwodXJsT2JqZWN0LCBhY2Nlc3NUb2tlbik7XG59O1xuXG5leHBvcnRzLm5vcm1hbGl6ZVNwcml0ZVVSTCA9IGZ1bmN0aW9uKHVybCAgICAgICAgLCBmb3JtYXQgICAgICAgICwgZXh0ZW5zaW9uICAgICAgICAsIGFjY2Vzc1Rva2VuICAgICAgICApICAgICAgICAge1xuICAgIGNvbnN0IHVybE9iamVjdCA9IHBhcnNlVXJsKHVybCk7XG4gICAgaWYgKCFpc01hcGJveFVSTCh1cmwpKSB7XG4gICAgICAgIHVybE9iamVjdC5wYXRoICs9IGAke2Zvcm1hdH0ke2V4dGVuc2lvbn1gO1xuICAgICAgICByZXR1cm4gZm9ybWF0VXJsKHVybE9iamVjdCk7XG4gICAgfVxuICAgIHVybE9iamVjdC5wYXRoID0gYC9zdHlsZXMvdjEke3VybE9iamVjdC5wYXRofS9zcHJpdGUke2Zvcm1hdH0ke2V4dGVuc2lvbn1gO1xuICAgIHJldHVybiBtYWtlQVBJVVJMKHVybE9iamVjdCwgYWNjZXNzVG9rZW4pO1xufTtcblxuY29uc3QgaW1hZ2VFeHRlbnNpb25SZSA9IC8oXFwuKHBuZ3xqcGcpXFxkKikoPz0kKS87XG5cbmV4cG9ydHMubm9ybWFsaXplVGlsZVVSTCA9IGZ1bmN0aW9uKHRpbGVVUkwgICAgICAgICwgc291cmNlVVJMICAgICAgICAgICwgdGlsZVNpemUgICAgICAgICAgKSAgICAgICAgIHtcbiAgICBpZiAoIXNvdXJjZVVSTCB8fCAhaXNNYXBib3hVUkwoc291cmNlVVJMKSkgcmV0dXJuIHRpbGVVUkw7XG5cbiAgICBjb25zdCB1cmxPYmplY3QgPSBwYXJzZVVybCh0aWxlVVJMKTtcblxuICAgIC8vIFRoZSB2NCBtYXBib3ggdGlsZSBBUEkgc3VwcG9ydHMgNTEyeDUxMiBpbWFnZSB0aWxlcyBvbmx5IHdoZW4gQDJ4XG4gICAgLy8gaXMgYXBwZW5kZWQgdG8gdGhlIHRpbGUgVVJMLiBJZiBgdGlsZVNpemU6IDUxMmAgaXMgc3BlY2lmaWVkIGZvclxuICAgIC8vIGEgTWFwYm94IHJhc3RlciBzb3VyY2UgZm9yY2UgdGhlIEAyeCBzdWZmaXggZXZlbiBpZiBhIG5vbiBoaWRwaSBkZXZpY2UuXG4gICAgY29uc3Qgc3VmZml4ID0gYnJvd3Nlci5kZXZpY2VQaXhlbFJhdGlvID49IDIgfHwgdGlsZVNpemUgPT09IDUxMiA/ICdAMngnIDogJyc7XG4gICAgY29uc3QgZXh0ZW5zaW9uID0gYnJvd3Nlci5zdXBwb3J0c1dlYnAgPyAnLndlYnAnIDogJyQxJztcbiAgICB1cmxPYmplY3QucGF0aCA9IHVybE9iamVjdC5wYXRoLnJlcGxhY2UoaW1hZ2VFeHRlbnNpb25SZSwgYCR7c3VmZml4fSR7ZXh0ZW5zaW9ufWApO1xuXG4gICAgcmVwbGFjZVRlbXBBY2Nlc3NUb2tlbih1cmxPYmplY3QucGFyYW1zKTtcbiAgICByZXR1cm4gZm9ybWF0VXJsKHVybE9iamVjdCk7XG59O1xuXG5mdW5jdGlvbiByZXBsYWNlVGVtcEFjY2Vzc1Rva2VuKHBhcmFtcyAgICAgICAgICAgICAgICkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChwYXJhbXNbaV0uaW5kZXhPZignYWNjZXNzX3Rva2VuPXRrLicpID09PSAwKSB7XG4gICAgICAgICAgICBwYXJhbXNbaV0gPSBgYWNjZXNzX3Rva2VuPSR7Y29uZmlnLkFDQ0VTU19UT0tFTiB8fCAnJ31gO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5jb25zdCB1cmxSZSA9IC9eKFxcdyspOlxcL1xcLyhbXi8/XSspKFxcL1teP10rKT9cXD8/KC4rKT8vO1xuXG5mdW5jdGlvbiBwYXJzZVVybCh1cmwgICAgICAgICkgICAgICAgICAgICB7XG4gICAgY29uc3QgcGFydHMgPSB1cmwubWF0Y2godXJsUmUpO1xuICAgIGlmICghcGFydHMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gcGFyc2UgVVJMIG9iamVjdCcpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBwcm90b2NvbDogcGFydHNbMV0sXG4gICAgICAgIGF1dGhvcml0eTogcGFydHNbMl0sXG4gICAgICAgIHBhdGg6IHBhcnRzWzNdIHx8ICcvJyxcbiAgICAgICAgcGFyYW1zOiBwYXJ0c1s0XSA/IHBhcnRzWzRdLnNwbGl0KCcmJykgOiBbXVxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFVybChvYmogICAgICAgICAgICkgICAgICAgICB7XG4gICAgY29uc3QgcGFyYW1zID0gb2JqLnBhcmFtcy5sZW5ndGggPyBgPyR7b2JqLnBhcmFtcy5qb2luKCcmJyl9YCA6ICcnO1xuICAgIHJldHVybiBgJHtvYmoucHJvdG9jb2x9Oi8vJHtvYmouYXV0aG9yaXR5fSR7b2JqLnBhdGh9JHtwYXJhbXN9YDtcbn1cbiIsIid1c2Ugc3RyaWN0Jztcbi8qIGVzbGludC1kaXNhYmxlIG5ldy1jYXAgKi9cblxuY29uc3QgaXNDaGFyID0gcmVxdWlyZSgnLi9pc19jaGFyX2luX3VuaWNvZGVfYmxvY2snKTtcblxubW9kdWxlLmV4cG9ydHMuYWxsb3dzSWRlb2dyYXBoaWNCcmVha2luZyA9IGZ1bmN0aW9uKGNoYXJzKSB7XG4gICAgZm9yIChjb25zdCBjaGFyIG9mIGNoYXJzKSB7XG4gICAgICAgIGlmICghZXhwb3J0cy5jaGFyQWxsb3dzSWRlb2dyYXBoaWNCcmVha2luZyhjaGFyLmNoYXJDb2RlQXQoMCkpKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufTtcblxubW9kdWxlLmV4cG9ydHMuYWxsb3dzVmVydGljYWxXcml0aW5nTW9kZSA9IGZ1bmN0aW9uKGNoYXJzKSB7XG4gICAgZm9yIChjb25zdCBjaGFyIG9mIGNoYXJzKSB7XG4gICAgICAgIGlmIChleHBvcnRzLmNoYXJIYXNVcHJpZ2h0VmVydGljYWxPcmllbnRhdGlvbihjaGFyLmNoYXJDb2RlQXQoMCkpKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufTtcblxubW9kdWxlLmV4cG9ydHMuY2hhckFsbG93c0lkZW9ncmFwaGljQnJlYWtpbmcgPSBmdW5jdGlvbihjaGFyKSB7XG4gICAgLy8gUmV0dXJuIGVhcmx5IGZvciBjaGFyYWN0ZXJzIG91dHNpZGUgYWxsIGlkZW9ncmFwaGljIHJhbmdlcy5cbiAgICBpZiAoY2hhciA8IDB4MkU4MCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKGlzQ2hhclsnQm9wb21vZm8gRXh0ZW5kZWQnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnQm9wb21vZm8nXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnQ0pLIENvbXBhdGliaWxpdHkgRm9ybXMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnQ0pLIENvbXBhdGliaWxpdHkgSWRlb2dyYXBocyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydDSksgQ29tcGF0aWJpbGl0eSddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydDSksgUmFkaWNhbHMgU3VwcGxlbWVudCddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydDSksgU3Ryb2tlcyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydDSksgU3ltYm9scyBhbmQgUHVuY3R1YXRpb24nXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnQ0pLIFVuaWZpZWQgSWRlb2dyYXBocyBFeHRlbnNpb24gQSddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydDSksgVW5pZmllZCBJZGVvZ3JhcGhzJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ0VuY2xvc2VkIENKSyBMZXR0ZXJzIGFuZCBNb250aHMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnSGFsZndpZHRoIGFuZCBGdWxsd2lkdGggRm9ybXMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnSGlyYWdhbmEnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnSWRlb2dyYXBoaWMgRGVzY3JpcHRpb24gQ2hhcmFjdGVycyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydLYW5neGkgUmFkaWNhbHMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnS2F0YWthbmEgUGhvbmV0aWMgRXh0ZW5zaW9ucyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydLYXRha2FuYSddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydWZXJ0aWNhbCBGb3JtcyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydZaSBSYWRpY2FscyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydZaSBTeWxsYWJsZXMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG5cbiAgICByZXR1cm4gZmFsc2U7XG59O1xuXG4vLyBUaGUgZm9sbG93aW5nIGxvZ2ljIGNvbWVzIGZyb21cbi8vIDxodHRwOi8vd3d3LnVuaWNvZGUub3JnL1B1YmxpYy92ZXJ0aWNhbC9yZXZpc2lvbi0xNi9WZXJ0aWNhbE9yaWVudGF0aW9uLTE2LnR4dD4uXG4vLyBUaGUgZGF0YSBmaWxlIGRlbm90ZXMgd2l0aCDigJxV4oCdIG9yIOKAnFR14oCdIGFueSBjb2RlcG9pbnQgdGhhdCBtYXkgYmUgZHJhd25cbi8vIHVwcmlnaHQgaW4gdmVydGljYWwgdGV4dCBidXQgZG9lcyBub3QgZGlzdGluZ3Vpc2ggYmV0d2VlbiB1cHJpZ2h0IGFuZFxuLy8g4oCcbmV1dHJhbOKAnSBjaGFyYWN0ZXJzLlxuXG4vLyBCbG9ja3MgaW4gdGhlIFVuaWNvZGUgc3VwcGxlbWVudGFyeSBwbGFuZXMgYXJlIGV4Y2x1ZGVkIGZyb20gdGhpcyBtb2R1bGUgZHVlXG4vLyB0byA8aHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBib3gtZ2wvaXNzdWVzLzI5Pi5cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIFVuaWNvZGUgY29kZXBvaW50IGlkZW50aWZpZXMgYSBjaGFyYWN0ZXIgd2l0aFxuICogdXByaWdodCBvcmllbnRhdGlvbi5cbiAqXG4gKiBBIGNoYXJhY3RlciBoYXMgdXByaWdodCBvcmllbnRhdGlvbiBpZiBpdCBpcyBkcmF3biB1cHJpZ2h0ICh1bnJvdGF0ZWQpXG4gKiB3aGV0aGVyIHRoZSBsaW5lIGlzIG9yaWVudGVkIGhvcml6b250YWxseSBvciB2ZXJ0aWNhbGx5LCBldmVuIGlmIGJvdGhcbiAqIGFkamFjZW50IGNoYXJhY3RlcnMgY2FuIGJlIHJvdGF0ZWQuIEZvciBleGFtcGxlLCBhIENoaW5lc2UgY2hhcmFjdGVyIGlzXG4gKiBhbHdheXMgZHJhd24gdXByaWdodC4gQW4gdXByaWdodGx5IG9yaWVudGVkIGNoYXJhY3RlciBjYXVzZXMgYW4gYWRqYWNlbnRcbiAqIOKAnG5ldXRyYWzigJ0gY2hhcmFjdGVyIHRvIGJlIGRyYXduIHVwcmlnaHQgYXMgd2VsbC5cbiAqL1xuZXhwb3J0cy5jaGFySGFzVXByaWdodFZlcnRpY2FsT3JpZW50YXRpb24gPSBmdW5jdGlvbihjaGFyKSB7XG4gICAgaWYgKGNoYXIgPT09IDB4MDJFQSAvKiBtb2RpZmllciBsZXR0ZXIgeWluIGRlcGFydGluZyB0b25lIG1hcmsgKi8gfHxcbiAgICAgICAgY2hhciA9PT0gMHgwMkVCIC8qIG1vZGlmaWVyIGxldHRlciB5YW5nIGRlcGFydGluZyB0b25lIG1hcmsgKi8pIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIGVhcmx5IGZvciBjaGFyYWN0ZXJzIG91dHNpZGUgYWxsIHJhbmdlcyB3aG9zZSBjaGFyYWN0ZXJzIHJlbWFpblxuICAgIC8vIHVwcmlnaHQgaW4gdmVydGljYWwgd3JpdGluZyBtb2RlLlxuICAgIGlmIChjaGFyIDwgMHgxMTAwKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAoaXNDaGFyWydCb3BvbW9mbyBFeHRlbmRlZCddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydCb3BvbW9mbyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydDSksgQ29tcGF0aWJpbGl0eSBGb3JtcyddKGNoYXIpKSB7XG4gICAgICAgIGlmICghKGNoYXIgPj0gMHhGRTQ5IC8qIGRhc2hlZCBvdmVybGluZSAqLyAmJiBjaGFyIDw9IDB4RkU0RiAvKiB3YXZ5IGxvdyBsaW5lICovKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzQ2hhclsnQ0pLIENvbXBhdGliaWxpdHkgSWRlb2dyYXBocyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydDSksgQ29tcGF0aWJpbGl0eSddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydDSksgUmFkaWNhbHMgU3VwcGxlbWVudCddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydDSksgU3Ryb2tlcyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydDSksgU3ltYm9scyBhbmQgUHVuY3R1YXRpb24nXShjaGFyKSkge1xuICAgICAgICBpZiAoIShjaGFyID49IDB4MzAwOCAvKiBsZWZ0IGFuZ2xlIGJyYWNrZXQgKi8gJiYgY2hhciA8PSAweDMwMTEgLyogcmlnaHQgYmxhY2sgbGVudGljdWxhciBicmFja2V0ICovKSAmJlxuICAgICAgICAgICAgIShjaGFyID49IDB4MzAxNCAvKiBsZWZ0IHRvcnRvaXNlIHNoZWxsIGJyYWNrZXQgKi8gJiYgY2hhciA8PSAweDMwMUYgLyogbG93IGRvdWJsZSBwcmltZSBxdW90YXRpb24gbWFyayAqLykgJiZcbiAgICAgICAgICAgIGNoYXIgIT09IDB4MzAzMCAvKiB3YXZ5IGRhc2ggKi8pIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChpc0NoYXJbJ0NKSyBVbmlmaWVkIElkZW9ncmFwaHMgRXh0ZW5zaW9uIEEnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnQ0pLIFVuaWZpZWQgSWRlb2dyYXBocyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydFbmNsb3NlZCBDSksgTGV0dGVycyBhbmQgTW9udGhzJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ0hhbmd1bCBDb21wYXRpYmlsaXR5IEphbW8nXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnSGFuZ3VsIEphbW8gRXh0ZW5kZWQtQSddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydIYW5ndWwgSmFtbyBFeHRlbmRlZC1CJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ0hhbmd1bCBKYW1vJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ0hhbmd1bCBTeWxsYWJsZXMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnSGlyYWdhbmEnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnSWRlb2dyYXBoaWMgRGVzY3JpcHRpb24gQ2hhcmFjdGVycyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydLYW5idW4nXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnS2FuZ3hpIFJhZGljYWxzJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ0thdGFrYW5hIFBob25ldGljIEV4dGVuc2lvbnMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnS2F0YWthbmEnXShjaGFyKSkge1xuICAgICAgICBpZiAoY2hhciAhPT0gMHgzMEZDIC8qIGthdGFrYW5hLWhpcmFnYW5hIHByb2xvbmdlZCBzb3VuZCBtYXJrICovKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNDaGFyWydIYWxmd2lkdGggYW5kIEZ1bGx3aWR0aCBGb3JtcyddKGNoYXIpKSB7XG4gICAgICAgIGlmIChjaGFyICE9PSAweEZGMDggLyogZnVsbHdpZHRoIGxlZnQgcGFyZW50aGVzaXMgKi8gJiZcbiAgICAgICAgICAgIGNoYXIgIT09IDB4RkYwOSAvKiBmdWxsd2lkdGggcmlnaHQgcGFyZW50aGVzaXMgKi8gJiZcbiAgICAgICAgICAgIGNoYXIgIT09IDB4RkYwRCAvKiBmdWxsd2lkdGggaHlwaGVuLW1pbnVzICovICYmXG4gICAgICAgICAgICAhKGNoYXIgPj0gMHhGRjFBIC8qIGZ1bGx3aWR0aCBjb2xvbiAqLyAmJiBjaGFyIDw9IDB4RkYxRSAvKiBmdWxsd2lkdGggZ3JlYXRlci10aGFuIHNpZ24gKi8pICYmXG4gICAgICAgICAgICBjaGFyICE9PSAweEZGM0IgLyogZnVsbHdpZHRoIGxlZnQgc3F1YXJlIGJyYWNrZXQgKi8gJiZcbiAgICAgICAgICAgIGNoYXIgIT09IDB4RkYzRCAvKiBmdWxsd2lkdGggcmlnaHQgc3F1YXJlIGJyYWNrZXQgKi8gJiZcbiAgICAgICAgICAgIGNoYXIgIT09IDB4RkYzRiAvKiBmdWxsd2lkdGggbG93IGxpbmUgKi8gJiZcbiAgICAgICAgICAgICEoY2hhciA+PSAweEZGNUIgLyogZnVsbHdpZHRoIGxlZnQgY3VybHkgYnJhY2tldCAqLyAmJiBjaGFyIDw9IDB4RkZERikgJiZcbiAgICAgICAgICAgIGNoYXIgIT09IDB4RkZFMyAvKiBmdWxsd2lkdGggbWFjcm9uICovICYmXG4gICAgICAgICAgICAhKGNoYXIgPj0gMHhGRkU4IC8qIGhhbGZ3aWR0aCBmb3JtcyBsaWdodCB2ZXJ0aWNhbCAqLyAmJiBjaGFyIDw9IDB4RkZFRikpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChpc0NoYXJbJ1NtYWxsIEZvcm0gVmFyaWFudHMnXShjaGFyKSkge1xuICAgICAgICBpZiAoIShjaGFyID49IDB4RkU1OCAvKiBzbWFsbCBlbSBkYXNoICovICYmIGNoYXIgPD0gMHhGRTVFIC8qIHNtYWxsIHJpZ2h0IHRvcnRvaXNlIHNoZWxsIGJyYWNrZXQgKi8pICYmXG4gICAgICAgICAgICAhKGNoYXIgPj0gMHhGRTYzIC8qIHNtYWxsIGh5cGhlbi1taW51cyAqLyAmJiBjaGFyIDw9IDB4RkU2NiAvKiBzbWFsbCBlcXVhbHMgc2lnbiAqLykpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChpc0NoYXJbJ1VuaWZpZWQgQ2FuYWRpYW4gQWJvcmlnaW5hbCBTeWxsYWJpY3MnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnVW5pZmllZCBDYW5hZGlhbiBBYm9yaWdpbmFsIFN5bGxhYmljcyBFeHRlbmRlZCddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydWZXJ0aWNhbCBGb3JtcyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydZaWppbmcgSGV4YWdyYW0gU3ltYm9scyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydZaSBTeWxsYWJsZXMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnWWkgUmFkaWNhbHMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG5cbiAgICByZXR1cm4gZmFsc2U7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gVW5pY29kZSBjb2RlcG9pbnQgaWRlbnRpZmllcyBhIGNoYXJhY3RlciB3aXRoXG4gKiBuZXV0cmFsIG9yaWVudGF0aW9uLlxuICpcbiAqIEEgY2hhcmFjdGVyIGhhcyBuZXV0cmFsIG9yaWVudGF0aW9uIGlmIGl0IG1heSBiZSBkcmF3biByb3RhdGVkIG9yIHVucm90YXRlZFxuICogd2hlbiB0aGUgbGluZSBpcyBvcmllbnRlZCB2ZXJ0aWNhbGx5LCBkZXBlbmRpbmcgb24gdGhlIG9yaWVudGF0aW9uIG9mIHRoZVxuICogYWRqYWNlbnQgY2hhcmFjdGVycy4gRm9yIGV4YW1wbGUsIGFsb25nIGEgdmVydGljbGx5IG9yaWVudGVkIGxpbmUsIHRoZSB2dWxnYXJcbiAqIGZyYWN0aW9uIMK9IGlzIGRyYXduIHVwcmlnaHQgYW1vbmcgQ2hpbmVzZSBjaGFyYWN0ZXJzIGJ1dCByb3RhdGVkIGFtb25nIExhdGluXG4gKiBsZXR0ZXJzLiBBIG5ldXRyYWxseSBvcmllbnRlZCBjaGFyYWN0ZXIgZG9lcyBub3QgaW5mbHVlbmNlIHdoZXRoZXIgYW5cbiAqIGFkamFjZW50IGNoYXJhY3RlciBpcyBkcmF3biB1cHJpZ2h0IG9yIHJvdGF0ZWQuXG4gKi9cbmV4cG9ydHMuY2hhckhhc05ldXRyYWxWZXJ0aWNhbE9yaWVudGF0aW9uID0gZnVuY3Rpb24oY2hhcikge1xuICAgIGlmIChpc0NoYXJbJ0xhdGluLTEgU3VwcGxlbWVudCddKGNoYXIpKSB7XG4gICAgICAgIGlmIChjaGFyID09PSAweDAwQTcgLyogc2VjdGlvbiBzaWduICovIHx8XG4gICAgICAgICAgICBjaGFyID09PSAweDAwQTkgLyogY29weXJpZ2h0IHNpZ24gKi8gfHxcbiAgICAgICAgICAgIGNoYXIgPT09IDB4MDBBRSAvKiByZWdpc3RlcmVkIHNpZ24gKi8gfHxcbiAgICAgICAgICAgIGNoYXIgPT09IDB4MDBCMSAvKiBwbHVzLW1pbnVzIHNpZ24gKi8gfHxcbiAgICAgICAgICAgIGNoYXIgPT09IDB4MDBCQyAvKiB2dWxnYXIgZnJhY3Rpb24gb25lIHF1YXJ0ZXIgKi8gfHxcbiAgICAgICAgICAgIGNoYXIgPT09IDB4MDBCRCAvKiB2dWxnYXIgZnJhY3Rpb24gb25lIGhhbGYgKi8gfHxcbiAgICAgICAgICAgIGNoYXIgPT09IDB4MDBCRSAvKiB2dWxnYXIgZnJhY3Rpb24gdGhyZWUgcXVhcnRlcnMgKi8gfHxcbiAgICAgICAgICAgIGNoYXIgPT09IDB4MDBENyAvKiBtdWx0aXBsaWNhdGlvbiBzaWduICovIHx8XG4gICAgICAgICAgICBjaGFyID09PSAweDAwRjcgLyogZGl2aXNpb24gc2lnbiAqLykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzQ2hhclsnR2VuZXJhbCBQdW5jdHVhdGlvbiddKGNoYXIpKSB7XG4gICAgICAgIGlmIChjaGFyID09PSAweDIwMTYgLyogZG91YmxlIHZlcnRpY2FsIGxpbmUgKi8gfHxcbiAgICAgICAgICAgIGNoYXIgPT09IDB4MjAyMCAvKiBkYWdnZXIgKi8gfHxcbiAgICAgICAgICAgIGNoYXIgPT09IDB4MjAyMSAvKiBkb3VibGUgZGFnZ2VyICovIHx8XG4gICAgICAgICAgICBjaGFyID09PSAweDIwMzAgLyogcGVyIG1pbGxlIHNpZ24gKi8gfHxcbiAgICAgICAgICAgIGNoYXIgPT09IDB4MjAzMSAvKiBwZXIgdGVuIHRob3VzYW5kIHNpZ24gKi8gfHxcbiAgICAgICAgICAgIGNoYXIgPT09IDB4MjAzQiAvKiByZWZlcmVuY2UgbWFyayAqLyB8fFxuICAgICAgICAgICAgY2hhciA9PT0gMHgyMDNDIC8qIGRvdWJsZSBleGNsYW1hdGlvbiBtYXJrICovIHx8XG4gICAgICAgICAgICBjaGFyID09PSAweDIwNDIgLyogYXN0ZXJpc20gKi8gfHxcbiAgICAgICAgICAgIGNoYXIgPT09IDB4MjA0NyAvKiBkb3VibGUgcXVlc3Rpb24gbWFyayAqLyB8fFxuICAgICAgICAgICAgY2hhciA9PT0gMHgyMDQ4IC8qIHF1ZXN0aW9uIGV4Y2xhbWF0aW9uIG1hcmsgKi8gfHxcbiAgICAgICAgICAgIGNoYXIgPT09IDB4MjA0OSAvKiBleGNsYW1hdGlvbiBxdWVzdGlvbiBtYXJrICovIHx8XG4gICAgICAgICAgICBjaGFyID09PSAweDIwNTEgLyogdHdvIGFzdGVyaXNrcyBhbGlnbmVkIHZlcnRpY2FsbHkgKi8pIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChpc0NoYXJbJ0xldHRlcmxpa2UgU3ltYm9scyddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydOdW1iZXIgRm9ybXMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnTWlzY2VsbGFuZW91cyBUZWNobmljYWwnXShjaGFyKSkge1xuICAgICAgICBpZiAoKGNoYXIgPj0gMHgyMzAwIC8qIGRpYW1ldGVyIHNpZ24gKi8gJiYgY2hhciA8PSAweDIzMDcgLyogd2F2eSBsaW5lICovKSB8fFxuICAgICAgICAgICAgKGNoYXIgPj0gMHgyMzBDIC8qIGJvdHRvbSByaWdodCBjcm9wICovICYmIGNoYXIgPD0gMHgyMzFGIC8qIGJvdHRvbSByaWdodCBjb3JuZXIgKi8pIHx8XG4gICAgICAgICAgICAoY2hhciA+PSAweDIzMjQgLyogdXAgYXJyb3doZWFkIGJldHdlZW4gdHdvIGhvcml6b250YWwgYmFycyAqLyAmJiBjaGFyIDw9IDB4MjMyOCAvKiBrZXlib2FyZCAqLykgfHxcbiAgICAgICAgICAgIGNoYXIgPT09IDB4MjMyQiAvKiBlcmFzZSB0byB0aGUgbGVmdCAqLyB8fFxuICAgICAgICAgICAgKGNoYXIgPj0gMHgyMzdEIC8qIHNob3VsZGVyZWQgb3BlbiBib3ggKi8gJiYgY2hhciA8PSAweDIzOUEgLyogY2xlYXIgc2NyZWVuIHN5bWJvbCAqLykgfHxcbiAgICAgICAgICAgIChjaGFyID49IDB4MjNCRSAvKiBkZW50aXN0cnkgc3ltYm9sIGxpZ2h0IHZlcnRpY2FsIGFuZCB0b3AgcmlnaHQgKi8gJiYgY2hhciA8PSAweDIzQ0QgLyogc3F1YXJlIGZvb3QgKi8pIHx8XG4gICAgICAgICAgICBjaGFyID09PSAweDIzQ0YgLyogZWplY3Qgc3ltYm9sICovIHx8XG4gICAgICAgICAgICAoY2hhciA+PSAweDIzRDEgLyogbWV0cmljYWwgYnJldmUgKi8gJiYgY2hhciA8PSAweDIzREIgLyogZnVzZSAqLykgfHxcbiAgICAgICAgICAgIChjaGFyID49IDB4MjNFMiAvKiB3aGl0ZSB0cmFwZXppdW0gKi8gJiYgY2hhciA8PSAweDIzRkYpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNDaGFyWydDb250cm9sIFBpY3R1cmVzJ10oY2hhcikgJiYgY2hhciAhPT0gMHgyNDIzIC8qIG9wZW4gYm94ICovKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydPcHRpY2FsIENoYXJhY3RlciBSZWNvZ25pdGlvbiddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydFbmNsb3NlZCBBbHBoYW51bWVyaWNzJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ0dlb21ldHJpYyBTaGFwZXMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnTWlzY2VsbGFuZW91cyBTeW1ib2xzJ10oY2hhcikpIHtcbiAgICAgICAgaWYgKCEoY2hhciA+PSAweDI2MUEgLyogYmxhY2sgbGVmdCBwb2ludGluZyBpbmRleCAqLyAmJiBjaGFyIDw9IDB4MjYxRiAvKiB3aGl0ZSBkb3duIHBvaW50aW5nIGluZGV4ICovKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzQ2hhclsnTWlzY2VsbGFuZW91cyBTeW1ib2xzIGFuZCBBcnJvd3MnXShjaGFyKSkge1xuICAgICAgICBpZiAoKGNoYXIgPj0gMHgyQjEyIC8qIHNxdWFyZSB3aXRoIHRvcCBoYWxmIGJsYWNrICovICYmIGNoYXIgPD0gMHgyQjJGIC8qIHdoaXRlIHZlcnRpY2FsIGVsbGlwc2UgKi8pIHx8XG4gICAgICAgICAgICAoY2hhciA+PSAweDJCNTAgLyogd2hpdGUgbWVkaXVtIHN0YXIgKi8gJiYgY2hhciA8PSAweDJCNTkgLyogaGVhdnkgY2lyY2xlZCBzYWx0aXJlICovKSB8fFxuICAgICAgICAgICAgKGNoYXIgPj0gMHgyQkI4IC8qIHVwd2FyZHMgd2hpdGUgYXJyb3cgZnJvbSBiYXIgd2l0aCBob3Jpem9udGFsIGJhciAqLyAmJiBjaGFyIDw9IDB4MkJFQikpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChpc0NoYXJbJ0NKSyBTeW1ib2xzIGFuZCBQdW5jdHVhdGlvbiddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydLYXRha2FuYSddKGNoYXIpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoaXNDaGFyWydQcml2YXRlIFVzZSBBcmVhJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ0NKSyBDb21wYXRpYmlsaXR5IEZvcm1zJ10oY2hhcikpIHJldHVybiB0cnVlO1xuICAgIGlmIChpc0NoYXJbJ1NtYWxsIEZvcm0gVmFyaWFudHMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzQ2hhclsnSGFsZndpZHRoIGFuZCBGdWxsd2lkdGggRm9ybXMnXShjaGFyKSkgcmV0dXJuIHRydWU7XG5cbiAgICBpZiAoY2hhciA9PT0gMHgyMjFFIC8qIGluZmluaXR5ICovIHx8XG4gICAgICAgIGNoYXIgPT09IDB4MjIzNCAvKiB0aGVyZWZvcmUgKi8gfHxcbiAgICAgICAgY2hhciA9PT0gMHgyMjM1IC8qIGJlY2F1c2UgKi8gfHxcbiAgICAgICAgKGNoYXIgPj0gMHgyNzAwIC8qIGJsYWNrIHNhZmV0eSBzY2lzc29ycyAqLyAmJiBjaGFyIDw9IDB4Mjc2NyAvKiByb3RhdGVkIGZsb3JhbCBoZWFydCBidWxsZXQgKi8pIHx8XG4gICAgICAgIChjaGFyID49IDB4Mjc3NiAvKiBkaW5nYmF0IG5lZ2F0aXZlIGNpcmNsZWQgZGlnaXQgb25lICovICYmIGNoYXIgPD0gMHgyNzkzIC8qIGRpbmdiYXQgbmVnYXRpdmUgY2lyY2xlZCBzYW5zLXNlcmlmIG51bWJlciB0ZW4gKi8pIHx8XG4gICAgICAgIGNoYXIgPT09IDB4RkZGQyAvKiBvYmplY3QgcmVwbGFjZW1lbnQgY2hhcmFjdGVyICovIHx8XG4gICAgICAgIGNoYXIgPT09IDB4RkZGRCAvKiByZXBsYWNlbWVudCBjaGFyYWN0ZXIgKi8pIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIFVuaWNvZGUgY29kZXBvaW50IGlkZW50aWZpZXMgYSBjaGFyYWN0ZXIgd2l0aFxuICogcm90YXRlZCBvcmllbnRhdGlvbi5cbiAqXG4gKiBBIGNoYXJhY3RlciBoYXMgcm90YXRlZCBvcmllbnRhdGlvbiBpZiBpdCBpcyBkcmF3biByb3RhdGVkIHdoZW4gdGhlIGxpbmUgaXNcbiAqIG9yaWVudGVkIHZlcnRpY2FsbHksIGV2ZW4gaWYgYm90aCBhZGphY2VudCBjaGFyYWN0ZXJzIGFyZSB1cHJpZ2h0LiBGb3JcbiAqIGV4YW1wbGUsIGEgTGF0aW4gbGV0dGVyIGlzIGRyYXduIHJvdGF0ZWQgYWxvbmcgYSB2ZXJ0aWNhbCBsaW5lLiBBIHJvdGF0ZWRcbiAqIGNoYXJhY3RlciBjYXVzZXMgYW4gYWRqYWNlbnQg4oCcbmV1dHJhbOKAnSBjaGFyYWN0ZXIgdG8gYmUgZHJhd24gcm90YXRlZCBhcyB3ZWxsLlxuICovXG5leHBvcnRzLmNoYXJIYXNSb3RhdGVkVmVydGljYWxPcmllbnRhdGlvbiA9IGZ1bmN0aW9uKGNoYXIpIHtcbiAgICByZXR1cm4gIShleHBvcnRzLmNoYXJIYXNVcHJpZ2h0VmVydGljYWxPcmllbnRhdGlvbihjaGFyKSB8fFxuICAgICAgICAgICAgIGV4cG9ydHMuY2hhckhhc05ldXRyYWxWZXJ0aWNhbE9yaWVudGF0aW9uKGNoYXIpKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG4vLyAgICAgIFxuXG4vLyBOb3RlOiBhbGwgXCJzaXplc1wiIGFyZSBtZWFzdXJlZCBpbiBieXRlc1xuXG5jb25zdCBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVTdHJ1Y3RBcnJheVR5cGU7XG5cbmNvbnN0IHZpZXdUeXBlcyA9IHtcbiAgICAnSW50OCc6IEludDhBcnJheSxcbiAgICAnVWludDgnOiBVaW50OEFycmF5LFxuICAgICdVaW50OENsYW1wZWQnOiBVaW50OENsYW1wZWRBcnJheSxcbiAgICAnSW50MTYnOiBJbnQxNkFycmF5LFxuICAgICdVaW50MTYnOiBVaW50MTZBcnJheSxcbiAgICAnSW50MzInOiBJbnQzMkFycmF5LFxuICAgICdVaW50MzInOiBVaW50MzJBcnJheSxcbiAgICAnRmxvYXQzMic6IEZsb2F0MzJBcnJheSxcbiAgICAnRmxvYXQ2NCc6IEZsb2F0NjRBcnJheVxufTtcblxuLyogZXNsaW50LWRpc2FibGUgbm8tdW5kZWYgKi9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbi8qIGVzbGludC1lbmFibGUgbm8tdW5kZWYgKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTdHJ1Y3RNZW1iZXJcbiAqIEBwcml2YXRlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHR5cGVcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBjb21wb25lbnRzXG4gKi9cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBTdHJ1Y3Qge1xuICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAvLyBUaGUgZm9sbG93aW5nIHByb3BlcnRpZXMgYXJlIGRlZmluZWQgb24gdGhlIHByb3RvdHlwZSBvZiBzdWIgY2xhc3Nlcy5cbiAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTdHJ1Y3RBcnJheX0gc3RydWN0QXJyYXkgVGhlIFN0cnVjdEFycmF5IHRoZSBzdHJ1Y3QgaXMgc3RvcmVkIGluXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IFRoZSBpbmRleCBvZiB0aGUgc3RydWN0IGluIHRoZSBTdHJ1Y3RBcnJheS5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHN0cnVjdEFycmF5LCBpbmRleCkge1xuICAgICAgICB0aGlzLl9zdHJ1Y3RBcnJheSA9IHN0cnVjdEFycmF5O1xuICAgICAgICB0aGlzLl9wb3MxID0gaW5kZXggKiB0aGlzLnNpemU7XG4gICAgICAgIHRoaXMuX3BvczIgPSB0aGlzLl9wb3MxIC8gMjtcbiAgICAgICAgdGhpcy5fcG9zNCA9IHRoaXMuX3BvczEgLyA0O1xuICAgICAgICB0aGlzLl9wb3M4ID0gdGhpcy5fcG9zMSAvIDg7XG4gICAgfVxufVxuXG5jb25zdCBERUZBVUxUX0NBUEFDSVRZID0gMTI4O1xuY29uc3QgUkVTSVpFX01VTFRJUExJRVIgPSA1O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgXG4gICBcblxuLyoqXG4gKiBUaGUgU3RydWN0QXJyYXkgY2xhc3MgaXMgaW5oZXJpdGVkIGJ5IHRoZSBjdXN0b20gU3RydWN0QXJyYXlUeXBlIGNsYXNzZXMgY3JlYXRlZCB3aXRoXG4gKiBgY3JlYXRlU3RydWN0QXJyYXlUeXBlKG1lbWJlcnMsIG9wdGlvbnMpYC5cbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIFN0cnVjdEFycmF5IHtcbiAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgLy8gVGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIGFlciBkZWZpbmVkIG9uIHRoZSBwcm90b3R5cGUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICBjb25zdHJ1Y3RvcihzZXJpYWxpemVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIHRoaXMuaXNUcmFuc2ZlcnJlZCA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChzZXJpYWxpemVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gQ3JlYXRlIGZyb20gYW4gc2VyaWFsaXplZCBTdHJ1Y3RBcnJheVxuICAgICAgICAgICAgdGhpcy5hcnJheUJ1ZmZlciA9IHNlcmlhbGl6ZWQuYXJyYXlCdWZmZXI7XG4gICAgICAgICAgICB0aGlzLmxlbmd0aCA9IHNlcmlhbGl6ZWQubGVuZ3RoO1xuICAgICAgICAgICAgdGhpcy5jYXBhY2l0eSA9IHRoaXMuYXJyYXlCdWZmZXIuYnl0ZUxlbmd0aCAvIHRoaXMuYnl0ZXNQZXJFbGVtZW50O1xuICAgICAgICAgICAgdGhpcy5fcmVmcmVzaFZpZXdzKCk7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IFN0cnVjdEFycmF5XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNhcGFjaXR5ID0gLTE7XG4gICAgICAgICAgICB0aGlzLnJlc2l6ZSgwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlcmlhbGl6ZSB0aGUgU3RydWN0QXJyYXkgdHlwZS4gVGhpcyBzZXJpYWxpemVzIHRoZSAqdHlwZSogbm90IGFuIGluc3RhbmNlIG9mIHRoZSB0eXBlLlxuICAgICAqL1xuICAgIHN0YXRpYyBzZXJpYWxpemUoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtZW1iZXJzOiB0aGlzLnByb3RvdHlwZS5tZW1iZXJzLFxuICAgICAgICAgICAgYWxpZ25tZW50OiB0aGlzLnByb3RvdHlwZS5TdHJ1Y3RUeXBlLnByb3RvdHlwZS5hbGlnbm1lbnQsXG4gICAgICAgICAgICBieXRlc1BlckVsZW1lbnQ6IHRoaXMucHJvdG90eXBlLmJ5dGVzUGVyRWxlbWVudFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlcmlhbGl6ZSB0aGlzIFN0cnVjdEFycmF5IGluc3RhbmNlXG4gICAgICovXG4gICAgc2VyaWFsaXplKHRyYW5zZmVyYWJsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgIGFzc2VydCghdGhpcy5pc1RyYW5zZmVycmVkKTtcblxuICAgICAgICB0aGlzLl90cmltKCk7XG5cbiAgICAgICAgaWYgKHRyYW5zZmVyYWJsZXMpIHtcbiAgICAgICAgICAgIHRoaXMuaXNUcmFuc2ZlcnJlZCA9IHRydWU7XG4gICAgICAgICAgICB0cmFuc2ZlcmFibGVzLnB1c2godGhpcy5hcnJheUJ1ZmZlcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGxlbmd0aDogdGhpcy5sZW5ndGgsXG4gICAgICAgICAgICBhcnJheUJ1ZmZlcjogdGhpcy5hcnJheUJ1ZmZlclxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgU3RydWN0IGF0IHRoZSBnaXZlbiBsb2NhdGlvbiBpbiB0aGUgYXJyYXkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IFRoZSBpbmRleCBvZiB0aGUgZWxlbWVudC5cbiAgICAgKi9cbiAgICBnZXQoaW5kZXggICAgICAgICkge1xuICAgICAgICBhc3NlcnQoIXRoaXMuaXNUcmFuc2ZlcnJlZCk7XG4gICAgICAgIHJldHVybiBuZXcgdGhpcy5TdHJ1Y3RUeXBlKHRoaXMsIGluZGV4KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNpemUgdGhlIGFycmF5IHRvIGRpc2NhcmQgdW51c2VkIGNhcGFjaXR5LlxuICAgICAqL1xuICAgIF90cmltKCkge1xuICAgICAgICBpZiAodGhpcy5sZW5ndGggIT09IHRoaXMuY2FwYWNpdHkpIHtcbiAgICAgICAgICAgIHRoaXMuY2FwYWNpdHkgPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgICAgIHRoaXMuYXJyYXlCdWZmZXIgPSB0aGlzLmFycmF5QnVmZmVyLnNsaWNlKDAsIHRoaXMubGVuZ3RoICogdGhpcy5ieXRlc1BlckVsZW1lbnQpO1xuICAgICAgICAgICAgdGhpcy5fcmVmcmVzaFZpZXdzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNpemUgdGhlIGFycmF5LlxuICAgICAqIElmIGBuYCBpcyBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQgbGVuZ3RoIHRoZW4gYWRkaXRpb25hbCBlbGVtZW50cyB3aXRoIHVuZGVmaW5lZCB2YWx1ZXMgYXJlIGFkZGVkLlxuICAgICAqIElmIGBuYCBpcyBsZXNzIHRoYW4gdGhlIGN1cnJlbnQgbGVuZ3RoIHRoZW4gdGhlIGFycmF5IHdpbGwgYmUgcmVkdWNlZCB0byB0aGUgZmlyc3QgYG5gIGVsZW1lbnRzLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBuZXcgc2l6ZSBvZiB0aGUgYXJyYXkuXG4gICAgICovXG4gICAgcmVzaXplKG4gICAgICAgICkge1xuICAgICAgICBhc3NlcnQoIXRoaXMuaXNUcmFuc2ZlcnJlZCk7XG5cbiAgICAgICAgdGhpcy5sZW5ndGggPSBuO1xuICAgICAgICBpZiAobiA+IHRoaXMuY2FwYWNpdHkpIHtcbiAgICAgICAgICAgIHRoaXMuY2FwYWNpdHkgPSBNYXRoLm1heChuLCBNYXRoLmZsb29yKHRoaXMuY2FwYWNpdHkgKiBSRVNJWkVfTVVMVElQTElFUiksIERFRkFVTFRfQ0FQQUNJVFkpO1xuICAgICAgICAgICAgdGhpcy5hcnJheUJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcih0aGlzLmNhcGFjaXR5ICogdGhpcy5ieXRlc1BlckVsZW1lbnQpO1xuXG4gICAgICAgICAgICBjb25zdCBvbGRVaW50OEFycmF5ID0gdGhpcy51aW50ODtcbiAgICAgICAgICAgIHRoaXMuX3JlZnJlc2hWaWV3cygpO1xuICAgICAgICAgICAgaWYgKG9sZFVpbnQ4QXJyYXkpIHRoaXMudWludDguc2V0KG9sZFVpbnQ4QXJyYXkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIFR5cGVkQXJyYXkgdmlld3MgZm9yIHRoZSBjdXJyZW50IEFycmF5QnVmZmVyLlxuICAgICAqL1xuICAgIF9yZWZyZXNoVmlld3MoKSB7XG4gICAgICAgIGZvciAoY29uc3QgdHlwZSBvZiB0aGlzLl91c2VkVHlwZXMpIHtcbiAgICAgICAgICAgIC8vICRGbG93Rml4TWVcbiAgICAgICAgICAgIHRoaXNbZ2V0QXJyYXlWaWV3TmFtZSh0eXBlKV0gPSBuZXcgdmlld1R5cGVzW3R5cGVdKHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT3V0cHV0IHRoZSBgU3RydWN0QXJyYXlgIGJldHdlZW4gaW5kaWNlcyBgc3RhcnRJbmRleGAgYW5kIGBlbmRJbmRleGAgYXMgYW4gYXJyYXkgb2YgYFN0cnVjdFR5cGVzYCB0byBlbmFibGUgc29ydGluZ1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydEluZGV4XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGVuZEluZGV4XG4gICAgICovXG4gICAgdG9BcnJheShzdGFydEluZGV4ICAgICAgICAsIGVuZEluZGV4ICAgICAgICApIHtcbiAgICAgICAgYXNzZXJ0KCF0aGlzLmlzVHJhbnNmZXJyZWQpO1xuXG4gICAgICAgIGNvbnN0IGFycmF5ID0gW107XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0SW5kZXg7IGkgPCBlbmRJbmRleDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBzdHJ1Y3QgPSB0aGlzLmdldChpKTtcbiAgICAgICAgICAgIGFycmF5LnB1c2goc3RydWN0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhcnJheTtcbiAgICB9XG59XG5cbmNvbnN0IHN0cnVjdEFycmF5VHlwZUNhY2hlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHt9O1xuXG4vKipcbiAqIGBjcmVhdGVTdHJ1Y3RBcnJheVR5cGVgIGlzIHVzZWQgdG8gY3JlYXRlIG5ldyBgU3RydWN0QXJyYXlgIHR5cGVzLlxuICpcbiAqIGBTdHJ1Y3RBcnJheWAgcHJvdmlkZXMgYW4gYWJzdHJhY3Rpb24gb3ZlciBgQXJyYXlCdWZmZXJgIGFuZCBgVHlwZWRBcnJheWAgbWFraW5nIGl0IGJlaGF2ZSBsaWtlXG4gKiBhbiBhcnJheSBvZiB0eXBlZCBzdHJ1Y3RzLiBBIFN0cnVjdEFycmF5IGlzIGNvbXByaXNlZCBvZiBlbGVtZW50cy4gRWFjaCBlbGVtZW50IGhhcyBhIHNldCBvZlxuICogbWVtYmVycyB0aGF0IGFyZSBkZWZpbmVkIHdoZW4gdGhlIGBTdHJ1Y3RBcnJheVR5cGVgIGlzIGNyZWF0ZWQuXG4gKlxuICogU3RydWN0QXJyYXlzIHVzZWZ1bCBmb3IgY3JlYXRpbmcgbGFyZ2UgYXJyYXlzIHRoYXQ6XG4gKiAtIGNhbiBiZSB0cmFuc2ZlcnJlZCBmcm9tIHdvcmtlcnMgYXMgYSBUcmFuc2ZlcmFibGUgb2JqZWN0XG4gKiAtIGNhbiBiZSBjb3BpZWQgY2hlYXBseVxuICogLSB1c2UgbGVzcyBtZW1vcnkgZm9yIGxvd2VyLXByZWNpc2lvbiBtZW1iZXJzXG4gKiAtIGNhbiBiZSB1c2VkIGFzIGJ1ZmZlcnMgaW4gV2ViR0wuXG4gKlxuICogQGNsYXNzXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogQHBhcmFtIHtudW1iZXJ9IG9wdGlvbnMuYWxpZ25tZW50IFVzZSBgNGAgdG8gYWxpZ24gbWVtYmVycyB0byA0IGJ5dGUgYm91bmRhcmllcy4gRGVmYXVsdCBpcyAxLlxuICogQHBhcmFtIHtBcnJheTxTdHJ1Y3RNZW1iZXI+fSBvcHRpb25zLm1lbWJlcnNcbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIFBvaW50QXJyYXlUeXBlID0gY3JlYXRlU3RydWN0QXJyYXlUeXBlKHtcbiAqICBtZW1iZXJzOiBbXG4gKiAgICAgIHsgdHlwZTogJ0ludDE2JywgbmFtZTogJ3gnIH0sXG4gKiAgICAgIHsgdHlwZTogJ0ludDE2JywgbmFtZTogJ3knIH1cbiAqICBdfSk7XG4gKlxuICogIHZhciBwb2ludEFycmF5ID0gbmV3IFBvaW50QXJyYXlUeXBlKCk7XG4gKiAgcG9pbnRBcnJheS5lbXBsYWNlQmFjaygxMCwgMTUpO1xuICogIHBvaW50QXJyYXkuZW1wbGFjZUJhY2soMjAsIDM1KTtcbiAqXG4gKiAgcG9pbnQgPSBwb2ludEFycmF5LmdldCgwKTtcbiAqICBhc3NlcnQocG9pbnQueCA9PT0gMTApO1xuICogIGFzc2VydChwb2ludC55ID09PSAxNSk7XG4gKlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVTdHJ1Y3RBcnJheVR5cGUob3B0aW9ucyAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgXG4gICkge1xuXG4gICAgY29uc3Qga2V5ID0gSlNPTi5zdHJpbmdpZnkob3B0aW9ucyk7XG5cbiAgICBpZiAoc3RydWN0QXJyYXlUeXBlQ2FjaGVba2V5XSkge1xuICAgICAgICByZXR1cm4gc3RydWN0QXJyYXlUeXBlQ2FjaGVba2V5XTtcbiAgICB9XG5cbiAgICBjb25zdCBhbGlnbm1lbnQgPSAob3B0aW9ucy5hbGlnbm1lbnQgPT09IHVuZGVmaW5lZCkgP1xuICAgICAgMSA6IG9wdGlvbnMuYWxpZ25tZW50O1xuXG4gICAgbGV0IG9mZnNldCA9IDA7XG4gICAgbGV0IG1heFNpemUgPSAwO1xuICAgIGNvbnN0IHVzZWRUeXBlcyA9IFsnVWludDgnXTtcblxuICAgIGNvbnN0IG1lbWJlcnMgPSBvcHRpb25zLm1lbWJlcnMubWFwKChtZW1iZXIpID0+IHtcbiAgICAgICAgYXNzZXJ0KG1lbWJlci5uYW1lLmxlbmd0aCk7XG4gICAgICAgIGFzc2VydChtZW1iZXIudHlwZSBpbiB2aWV3VHlwZXMpO1xuXG4gICAgICAgIGlmICh1c2VkVHlwZXMuaW5kZXhPZihtZW1iZXIudHlwZSkgPCAwKSB1c2VkVHlwZXMucHVzaChtZW1iZXIudHlwZSk7XG5cbiAgICAgICAgY29uc3QgdHlwZVNpemUgPSBzaXplT2YobWVtYmVyLnR5cGUpO1xuICAgICAgICBjb25zdCBtZW1iZXJPZmZzZXQgPSBvZmZzZXQgPSBhbGlnbihvZmZzZXQsIE1hdGgubWF4KGFsaWdubWVudCwgdHlwZVNpemUpKTtcbiAgICAgICAgY29uc3QgY29tcG9uZW50cyA9IG1lbWJlci5jb21wb25lbnRzIHx8IDE7XG5cbiAgICAgICAgbWF4U2l6ZSA9IE1hdGgubWF4KG1heFNpemUsIHR5cGVTaXplKTtcbiAgICAgICAgb2Zmc2V0ICs9IHR5cGVTaXplICogY29tcG9uZW50cztcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogbWVtYmVyLm5hbWUsXG4gICAgICAgICAgICB0eXBlOiBtZW1iZXIudHlwZSxcbiAgICAgICAgICAgIGNvbXBvbmVudHM6IGNvbXBvbmVudHMsXG4gICAgICAgICAgICBvZmZzZXQ6IG1lbWJlck9mZnNldFxuICAgICAgICB9O1xuICAgIH0pO1xuXG4gICAgY29uc3Qgc2l6ZSA9IGFsaWduKG9mZnNldCwgTWF0aC5tYXgobWF4U2l6ZSwgYWxpZ25tZW50KSk7XG5cbiAgICBjbGFzcyBTdHJ1Y3RUeXBlIGV4dGVuZHMgU3RydWN0IHt9XG5cbiAgICBTdHJ1Y3RUeXBlLnByb3RvdHlwZS5hbGlnbm1lbnQgPSBhbGlnbm1lbnQ7XG4gICAgU3RydWN0VHlwZS5wcm90b3R5cGUuc2l6ZSA9IHNpemU7XG5cbiAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiBtZW1iZXJzKSB7XG4gICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgbWVtYmVyLmNvbXBvbmVudHM7IGMrKykge1xuICAgICAgICAgICAgY29uc3QgbmFtZSA9IG1lbWJlci5uYW1lICsgKG1lbWJlci5jb21wb25lbnRzID09PSAxID8gJycgOiBjKTtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTdHJ1Y3RUeXBlLnByb3RvdHlwZSwgbmFtZSwge1xuICAgICAgICAgICAgICAgIGdldDogY3JlYXRlR2V0dGVyKG1lbWJlciwgYyksXG4gICAgICAgICAgICAgICAgc2V0OiBjcmVhdGVTZXR0ZXIobWVtYmVyLCBjKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjbGFzcyBTdHJ1Y3RBcnJheVR5cGUgZXh0ZW5kcyBTdHJ1Y3RBcnJheSB7fVxuXG4gICAgU3RydWN0QXJyYXlUeXBlLnByb3RvdHlwZS5tZW1iZXJzID0gbWVtYmVycztcbiAgICBTdHJ1Y3RBcnJheVR5cGUucHJvdG90eXBlLlN0cnVjdFR5cGUgPSBTdHJ1Y3RUeXBlO1xuICAgIFN0cnVjdEFycmF5VHlwZS5wcm90b3R5cGUuYnl0ZXNQZXJFbGVtZW50ID0gc2l6ZTtcbiAgICBTdHJ1Y3RBcnJheVR5cGUucHJvdG90eXBlLmVtcGxhY2VCYWNrID0gY3JlYXRlRW1wbGFjZUJhY2sobWVtYmVycywgc2l6ZSk7XG4gICAgU3RydWN0QXJyYXlUeXBlLnByb3RvdHlwZS5fdXNlZFR5cGVzID0gdXNlZFR5cGVzO1xuXG4gICAgc3RydWN0QXJyYXlUeXBlQ2FjaGVba2V5XSA9IFN0cnVjdEFycmF5VHlwZTtcblxuICAgIHJldHVybiBTdHJ1Y3RBcnJheVR5cGU7XG59XG5cbmZ1bmN0aW9uIGFsaWduKG9mZnNldCAgICAgICAgLCBzaXplICAgICAgICApICAgICAgICAge1xuICAgIHJldHVybiBNYXRoLmNlaWwob2Zmc2V0IC8gc2l6ZSkgKiBzaXplO1xufVxuXG5mdW5jdGlvbiBzaXplT2YodHlwZSAgICAgICAgICApICAgICAgICAge1xuICAgIHJldHVybiB2aWV3VHlwZXNbdHlwZV0uQllURVNfUEVSX0VMRU1FTlQ7XG59XG5cbmZ1bmN0aW9uIGdldEFycmF5Vmlld05hbWUodHlwZSAgICAgICAgICApICAgICAgICAge1xuICAgIHJldHVybiB0eXBlLnRvTG93ZXJDYXNlKCk7XG59XG5cbi8qXG4gKiA+IEkgc2F3IG1ham9yIHBlcmYgZ2FpbnMgYnkgc2hvcnRlbmluZyB0aGUgc291cmNlIG9mIHRoZXNlIGdlbmVyYXRlZCBtZXRob2RzIChpLmUuIHJlbmFtaW5nXG4gKiA+IGVsZW1lbnRJbmRleCB0byBpKSAobGlrZWx5IGR1ZSB0byB2OCBpbmxpbmluZyBoZXVyaXN0aWNzKS5cbiAqIC0gbHVjYXN3b2pcbiAqL1xuZnVuY3Rpb24gY3JlYXRlRW1wbGFjZUJhY2sobWVtYmVycywgYnl0ZXNQZXJFbGVtZW50KSAgICAgICAgICAge1xuICAgIGNvbnN0IHVzZWRUeXBlU2l6ZXMgPSBbXTtcbiAgICBjb25zdCBhcmdOYW1lcyA9IFtdO1xuICAgIGxldCBib2R5ID1cbiAgICAgICAgJ3ZhciBpID0gdGhpcy5sZW5ndGg7XFxuJyArXG4gICAgICAgICd0aGlzLnJlc2l6ZSh0aGlzLmxlbmd0aCArIDEpO1xcbic7XG5cbiAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiBtZW1iZXJzKSB7XG4gICAgICAgIGNvbnN0IHNpemUgPSBzaXplT2YobWVtYmVyLnR5cGUpO1xuXG4gICAgICAgIC8vIGFycmF5IG9mZnNldHMgdG8gdGhlIGVuZCBvZiBjdXJyZW50IGRhdGEgZm9yIGVhY2ggdHlwZSBzaXplXG4gICAgICAgIC8vIHZhciBve1NJWkV9ID0gaSAqIFJPVU5ERUQoYnl0ZXNQZXJFbGVtZW50IC8gc2l6ZSk7XG4gICAgICAgIGlmICh1c2VkVHlwZVNpemVzLmluZGV4T2Yoc2l6ZSkgPCAwKSB7XG4gICAgICAgICAgICB1c2VkVHlwZVNpemVzLnB1c2goc2l6ZSk7XG4gICAgICAgICAgICBib2R5ICs9IGB2YXIgbyR7c2l6ZS50b0ZpeGVkKDApfSA9IGkgKiAkeyhieXRlc1BlckVsZW1lbnQgLyBzaXplKS50b0ZpeGVkKDApfTtcXG5gO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCBtZW1iZXIuY29tcG9uZW50czsgYysrKSB7XG4gICAgICAgICAgICAvLyBhcmd1bWVudHMgdjAsIHYxLCB2MiwgLi4uIGFyZSwgaW4gb3JkZXIsIHRoZSBjb21wb25lbnRzIG9mXG4gICAgICAgICAgICAvLyBtZW1iZXIgMCwgdGhlbiB0aGUgY29tcG9uZW50cyBvZiBtZW1iZXIgMSwgZXRjLlxuICAgICAgICAgICAgY29uc3QgYXJnTmFtZSA9IGB2JHthcmdOYW1lcy5sZW5ndGh9YDtcbiAgICAgICAgICAgIC8vIFRoZSBpbmRleCBmb3IgYG1lbWJlcmAgY29tcG9uZW50IGBjYCBpbnRvIHRoZSBhcHByb3ByaWF0ZSB0eXBlIGFycmF5IGlzOlxuICAgICAgICAgICAgLy8gdGhpcy57VFlQRX1bb3tTSVpFfSArIE1FTUJFUl9PRkZTRVQgKyB7Y31dID0gdntYfVxuICAgICAgICAgICAgLy8gd2hlcmUgTUVNQkVSX09GRlNFVCA9IFJPVU5EKG1lbWJlci5vZmZzZXQgLyBzaXplKSBpcyB0aGUgcGVyLWVsZW1lbnRcbiAgICAgICAgICAgIC8vIG9mZnNldCBvZiB0aGlzIG1lbWJlciBpbnRvIHRoZSBhcnJheVxuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBgbyR7c2l6ZS50b0ZpeGVkKDApfSArICR7KG1lbWJlci5vZmZzZXQgLyBzaXplICsgYykudG9GaXhlZCgwKX1gO1xuICAgICAgICAgICAgYm9keSArPSBgdGhpcy4ke2dldEFycmF5Vmlld05hbWUobWVtYmVyLnR5cGUpfVske2luZGV4fV0gPSAke2FyZ05hbWV9O1xcbmA7XG4gICAgICAgICAgICBhcmdOYW1lcy5wdXNoKGFyZ05hbWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYm9keSArPSAncmV0dXJuIGk7JztcblxuICAgIHJldHVybiBuZXcgRnVuY3Rpb24oYXJnTmFtZXMudG9TdHJpbmcoKSwgYm9keSk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZU1lbWJlckNvbXBvbmVudFN0cmluZyhtZW1iZXIsIGNvbXBvbmVudCkge1xuICAgIGNvbnN0IGVsZW1lbnRPZmZzZXQgPSBgdGhpcy5fcG9zJHtzaXplT2YobWVtYmVyLnR5cGUpLnRvRml4ZWQoMCl9YDtcbiAgICBjb25zdCBjb21wb25lbnRPZmZzZXQgPSAobWVtYmVyLm9mZnNldCAvIHNpemVPZihtZW1iZXIudHlwZSkgKyBjb21wb25lbnQpLnRvRml4ZWQoMCk7XG4gICAgY29uc3QgaW5kZXggPSBgJHtlbGVtZW50T2Zmc2V0fSArICR7Y29tcG9uZW50T2Zmc2V0fWA7XG4gICAgcmV0dXJuIGB0aGlzLl9zdHJ1Y3RBcnJheS4ke2dldEFycmF5Vmlld05hbWUobWVtYmVyLnR5cGUpfVske2luZGV4fV1gO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVHZXR0ZXIobWVtYmVyLCBjKSB7XG4gICAgcmV0dXJuIG5ldyBGdW5jdGlvbihgcmV0dXJuICR7Y3JlYXRlTWVtYmVyQ29tcG9uZW50U3RyaW5nKG1lbWJlciwgYyl9O2ApO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVTZXR0ZXIobWVtYmVyLCBjKSB7XG4gICAgcmV0dXJuIG5ldyBGdW5jdGlvbigneCcsIGAke2NyZWF0ZU1lbWJlckNvbXBvbmVudFN0cmluZyhtZW1iZXIsIGMpfSA9IHg7YCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vICAgICAgXG5cbm1vZHVsZS5leHBvcnRzID0gcmVzb2x2ZVRva2VucztcblxuLyoqXG4gKiBSZXBsYWNlIHRva2VucyBpbiBhIHN0cmluZyB0ZW1wbGF0ZSB3aXRoIHZhbHVlcyBpbiBhbiBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvcGVydGllcyBhIGtleS92YWx1ZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0b2tlbnMgYW5kIHJlcGxhY2VtZW50c1xuICogQHBhcmFtIHtzdHJpbmd9IHRleHQgdGhlIHRlbXBsYXRlIHN0cmluZ1xuICogQHJldHVybnMge3N0cmluZ30gdGhlIHRlbXBsYXRlIHdpdGggdG9rZW5zIHJlcGxhY2VkXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiByZXNvbHZlVG9rZW5zKHByb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgLCB0ZXh0ICAgICAgICApICAgICAgICAge1xuICAgIHJldHVybiB0ZXh0LnJlcGxhY2UoL3soW157fV0rKX0vZywgKG1hdGNoLCBrZXkgICAgICAgICkgPT4ge1xuICAgICAgICByZXR1cm4ga2V5IGluIHByb3BlcnRpZXMgPyBwcm9wZXJ0aWVzW2tleV0gOiAnJztcbiAgICB9KTtcbn1cbiIsIid1c2Ugc3RyaWN0Jztcbi8vICAgICAgXG5cbmNvbnN0IFVuaXRCZXppZXIgPSByZXF1aXJlKCdAbWFwYm94L3VuaXRiZXppZXInKTtcbmNvbnN0IENvb3JkaW5hdGUgPSByZXF1aXJlKCcuLi9nZW8vY29vcmRpbmF0ZScpO1xuY29uc3QgUG9pbnQgPSByZXF1aXJlKCdwb2ludC1nZW9tZXRyeScpO1xuXG4vKipcbiAqIEdpdmVuIGEgdmFsdWUgYHRgIHRoYXQgdmFyaWVzIGJldHdlZW4gMCBhbmQgMSwgcmV0dXJuXG4gKiBhbiBpbnRlcnBvbGF0aW9uIGZ1bmN0aW9uIHRoYXQgZWFzZXMgYmV0d2VlbiAwIGFuZCAxIGluIGEgcGxlYXNpbmdcbiAqIGN1YmljIGluLW91dCBmYXNoaW9uLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydHMuZWFzZUN1YmljSW5PdXQgPSBmdW5jdGlvbih0ICAgICAgICApICAgICAgICAge1xuICAgIGlmICh0IDw9IDApIHJldHVybiAwO1xuICAgIGlmICh0ID49IDEpIHJldHVybiAxO1xuICAgIGNvbnN0IHQyID0gdCAqIHQsXG4gICAgICAgIHQzID0gdDIgKiB0O1xuICAgIHJldHVybiA0ICogKHQgPCAwLjUgPyB0MyA6IDMgKiAodCAtIHQyKSArIHQzIC0gMC43NSk7XG59O1xuXG4vKipcbiAqIEdpdmVuIGdpdmVuICh4LCB5KSwgKHgxLCB5MSkgY29udHJvbCBwb2ludHMgZm9yIGEgYmV6aWVyIGN1cnZlLFxuICogcmV0dXJuIGEgZnVuY3Rpb24gdGhhdCBpbnRlcnBvbGF0ZXMgYWxvbmcgdGhhdCBjdXJ2ZS5cbiAqXG4gKiBAcGFyYW0gcDF4IGNvbnRyb2wgcG9pbnQgMSB4IGNvb3JkaW5hdGVcbiAqIEBwYXJhbSBwMXkgY29udHJvbCBwb2ludCAxIHkgY29vcmRpbmF0ZVxuICogQHBhcmFtIHAyeCBjb250cm9sIHBvaW50IDIgeCBjb29yZGluYXRlXG4gKiBAcGFyYW0gcDJ5IGNvbnRyb2wgcG9pbnQgMiB5IGNvb3JkaW5hdGVcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydHMuYmV6aWVyID0gZnVuY3Rpb24ocDF4ICAgICAgICAsIHAxeSAgICAgICAgLCBwMnggICAgICAgICwgcDJ5ICAgICAgICApICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgIGNvbnN0IGJlemllciA9IG5ldyBVbml0QmV6aWVyKHAxeCwgcDF5LCBwMngsIHAyeSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHQgICAgICAgICkge1xuICAgICAgICByZXR1cm4gYmV6aWVyLnNvbHZlKHQpO1xuICAgIH07XG59O1xuXG4vKipcbiAqIEEgZGVmYXVsdCBiZXppZXItY3VydmUgcG93ZXJlZCBlYXNpbmcgZnVuY3Rpb24gd2l0aFxuICogY29udHJvbCBwb2ludHMgKDAuMjUsIDAuMSkgYW5kICgwLjI1LCAxKVxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydHMuZWFzZSA9IGV4cG9ydHMuYmV6aWVyKDAuMjUsIDAuMSwgMC4yNSwgMSk7XG5cbi8qKlxuICogY29uc3RyYWluIG4gdG8gdGhlIGdpdmVuIHJhbmdlIHZpYSBtaW4gKyBtYXhcbiAqXG4gKiBAcGFyYW0gbiB2YWx1ZVxuICogQHBhcmFtIG1pbiB0aGUgbWluaW11bSB2YWx1ZSB0byBiZSByZXR1cm5lZFxuICogQHBhcmFtIG1heCB0aGUgbWF4aW11bSB2YWx1ZSB0byBiZSByZXR1cm5lZFxuICogQHJldHVybnMgdGhlIGNsYW1wZWQgdmFsdWVcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydHMuY2xhbXAgPSBmdW5jdGlvbiAobiAgICAgICAgLCBtaW4gICAgICAgICwgbWF4ICAgICAgICApICAgICAgICAge1xuICAgIHJldHVybiBNYXRoLm1pbihtYXgsIE1hdGgubWF4KG1pbiwgbikpO1xufTtcblxuLyoqXG4gKiBjb25zdHJhaW4gbiB0byB0aGUgZ2l2ZW4gcmFuZ2UsIGV4Y2x1ZGluZyB0aGUgbWluaW11bSwgdmlhIG1vZHVsYXIgYXJpdGhtZXRpY1xuICpcbiAqIEBwYXJhbSBuIHZhbHVlXG4gKiBAcGFyYW0gbWluIHRoZSBtaW5pbXVtIHZhbHVlIHRvIGJlIHJldHVybmVkLCBleGNsdXNpdmVcbiAqIEBwYXJhbSBtYXggdGhlIG1heGltdW0gdmFsdWUgdG8gYmUgcmV0dXJuZWQsIGluY2x1c2l2ZVxuICogQHJldHVybnMgY29uc3RyYWluZWQgbnVtYmVyXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnRzLndyYXAgPSBmdW5jdGlvbiAobiAgICAgICAgLCBtaW4gICAgICAgICwgbWF4ICAgICAgICApICAgICAgICAge1xuICAgIGNvbnN0IGQgPSBtYXggLSBtaW47XG4gICAgY29uc3QgdyA9ICgobiAtIG1pbikgJSBkICsgZCkgJSBkICsgbWluO1xuICAgIHJldHVybiAodyA9PT0gbWluKSA/IG1heCA6IHc7XG59O1xuXG4vKlxuICogQ2FsbCBhbiBhc3luY2hyb25vdXMgZnVuY3Rpb24gb24gYW4gYXJyYXkgb2YgYXJndW1lbnRzLFxuICogY2FsbGluZyBgY2FsbGJhY2tgIHdpdGggdGhlIGNvbXBsZXRlZCByZXN1bHRzIG9mIGFsbCBjYWxscy5cbiAqXG4gKiBAcGFyYW0gYXJyYXkgaW5wdXQgdG8gZWFjaCBjYWxsIG9mIHRoZSBhc3luYyBmdW5jdGlvbi5cbiAqIEBwYXJhbSBmbiBhbiBhc3luYyBmdW5jdGlvbiB3aXRoIHNpZ25hdHVyZSAoZGF0YSwgY2FsbGJhY2spXG4gKiBAcGFyYW0gY2FsbGJhY2sgYSBjYWxsYmFjayBydW4gYWZ0ZXIgYWxsIGFzeW5jIHdvcmsgaXMgZG9uZS5cbiAqIGNhbGxlZCB3aXRoIGFuIGFycmF5LCBjb250YWluaW5nIHRoZSByZXN1bHRzIG9mIGVhY2ggYXN5bmMgY2FsbC5cbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydHMuYXN5bmNBbGwgPSBmdW5jdGlvbiAoYXJyYXkgICAgICAgICAgICAsIGZuICAgICAgICAgICwgY2FsbGJhY2sgICAgICAgICAgKSB7XG4gICAgaWYgKCFhcnJheS5sZW5ndGgpIHsgcmV0dXJuIGNhbGxiYWNrKG51bGwsIFtdKTsgfVxuICAgIGxldCByZW1haW5pbmcgPSBhcnJheS5sZW5ndGg7XG4gICAgY29uc3QgcmVzdWx0cyA9IG5ldyBBcnJheShhcnJheS5sZW5ndGgpO1xuICAgIGxldCBlcnJvciA9IG51bGw7XG4gICAgYXJyYXkuZm9yRWFjaCgoaXRlbSwgaSkgPT4ge1xuICAgICAgICBmbihpdGVtLCAoZXJyLCByZXN1bHQpID0+IHtcbiAgICAgICAgICAgIGlmIChlcnIpIGVycm9yID0gZXJyO1xuICAgICAgICAgICAgcmVzdWx0c1tpXSA9IHJlc3VsdDtcbiAgICAgICAgICAgIGlmICgtLXJlbWFpbmluZyA9PT0gMCkgY2FsbGJhY2soZXJyb3IsIHJlc3VsdHMpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn07XG5cbi8qXG4gKiBQb2x5ZmlsbCBmb3IgT2JqZWN0LnZhbHVlcy4gTm90IGZ1bGx5IHNwZWMgY29tcGxpYW50LCBidXQgd2UgZG9uJ3RcbiAqIG5lZWQgaXQgdG8gYmUuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0cy52YWx1ZXMgPSBmdW5jdGlvbiAob2JqICAgICAgICApICAgICAgICAgICAgICAgIHtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBmb3IgKGNvbnN0IGsgaW4gb2JqKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKG9ialtrXSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKlxuICogQ29tcHV0ZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBrZXlzIGluIG9uZSBvYmplY3QgYW5kIHRoZSBrZXlzXG4gKiBpbiBhbm90aGVyIG9iamVjdC5cbiAqXG4gKiBAcmV0dXJucyBrZXlzIGRpZmZlcmVuY2VcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydHMua2V5c0RpZmZlcmVuY2UgPSBmdW5jdGlvbiAob2JqICAgICAgICAsIG90aGVyICAgICAgICApICAgICAgICAgICAgICAgIHtcbiAgICBjb25zdCBkaWZmZXJlbmNlID0gW107XG4gICAgZm9yIChjb25zdCBpIGluIG9iaikge1xuICAgICAgICBpZiAoIShpIGluIG90aGVyKSkge1xuICAgICAgICAgICAgZGlmZmVyZW5jZS5wdXNoKGkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkaWZmZXJlbmNlO1xufTtcblxuLyoqXG4gKiBHaXZlbiBhIGRlc3RpbmF0aW9uIG9iamVjdCBhbmQgb3B0aW9uYWxseSBtYW55IHNvdXJjZSBvYmplY3RzLFxuICogY29weSBhbGwgcHJvcGVydGllcyBmcm9tIHRoZSBzb3VyY2Ugb2JqZWN0cyBpbnRvIHRoZSBkZXN0aW5hdGlvbi5cbiAqIFRoZSBsYXN0IHNvdXJjZSBvYmplY3QgZ2l2ZW4gb3ZlcnJpZGVzIHByb3BlcnRpZXMgZnJvbSBwcmV2aW91c1xuICogc291cmNlIG9iamVjdHMuXG4gKlxuICogQHBhcmFtIGRlc3QgZGVzdGluYXRpb24gb2JqZWN0XG4gKiBAcGFyYW0gey4uLk9iamVjdH0gc291cmNlcyBzb3VyY2VzIGZyb20gd2hpY2ggcHJvcGVydGllcyBhcmUgcHVsbGVkXG4gKiBAcHJpdmF0ZVxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbmV4cG9ydHMuZXh0ZW5kID0gZnVuY3Rpb24gKGRlc3QgICAgICAgICwgc291cmNlMCAgICAgICAgLCBzb3VyY2UxICAgICAgICAgLCBzb3VyY2UyICAgICAgICAgKSAgICAgICAgIHtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBzcmMgPSBhcmd1bWVudHNbaV07XG4gICAgICAgIGZvciAoY29uc3QgayBpbiBzcmMpIHtcbiAgICAgICAgICAgIGRlc3Rba10gPSBzcmNba107XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRlc3Q7XG59O1xuXG4vKipcbiAqIEdpdmVuIGFuIG9iamVjdCBhbmQgYSBudW1iZXIgb2YgcHJvcGVydGllcyBhcyBzdHJpbmdzLCByZXR1cm4gdmVyc2lvblxuICogb2YgdGhhdCBvYmplY3Qgd2l0aCBvbmx5IHRob3NlIHByb3BlcnRpZXMuXG4gKlxuICogQHBhcmFtIHNyYyB0aGUgb2JqZWN0XG4gKiBAcGFyYW0gcHJvcGVydGllcyBhbiBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyBjaG9zZW5cbiAqIHRvIGFwcGVhciBvbiB0aGUgcmVzdWx0aW5nIG9iamVjdC5cbiAqIEByZXR1cm5zIG9iamVjdCB3aXRoIGxpbWl0ZWQgcHJvcGVydGllcy5cbiAqIEBleGFtcGxlXG4gKiB2YXIgZm9vID0geyBuYW1lOiAnQ2hhcmxpZScsIGFnZTogMTAgfTtcbiAqIHZhciBqdXN0TmFtZSA9IHBpY2soZm9vLCBbJ25hbWUnXSk7XG4gKiAvLyBqdXN0TmFtZSA9IHsgbmFtZTogJ0NoYXJsaWUnIH1cbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydHMucGljayA9IGZ1bmN0aW9uIChzcmMgICAgICAgICwgcHJvcGVydGllcyAgICAgICAgICAgICAgICkgICAgICAgICB7XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGsgPSBwcm9wZXJ0aWVzW2ldO1xuICAgICAgICBpZiAoayBpbiBzcmMpIHtcbiAgICAgICAgICAgIHJlc3VsdFtrXSA9IHNyY1trXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufTtcblxubGV0IGlkID0gMTtcblxuLyoqXG4gKiBSZXR1cm4gYSB1bmlxdWUgbnVtZXJpYyBpZCwgc3RhcnRpbmcgYXQgMSBhbmQgaW5jcmVtZW50aW5nIHdpdGhcbiAqIGVhY2ggY2FsbC5cbiAqXG4gKiBAcmV0dXJucyB1bmlxdWUgbnVtZXJpYyBpZC5cbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydHMudW5pcXVlSWQgPSBmdW5jdGlvbiAoKSAgICAgICAgIHtcbiAgICByZXR1cm4gaWQrKztcbn07XG5cbi8qKlxuICogR2l2ZW4gYW4gYXJyYXkgb2YgbWVtYmVyIGZ1bmN0aW9uIG5hbWVzIGFzIHN0cmluZ3MsIHJlcGxhY2UgYWxsIG9mIHRoZW1cbiAqIHdpdGggYm91bmQgdmVyc2lvbnMgdGhhdCB3aWxsIGFsd2F5cyByZWZlciB0byBgY29udGV4dGAgYXMgYHRoaXNgLiBUaGlzXG4gKiBpcyB1c2VmdWwgZm9yIGNsYXNzZXMgd2hlcmUgb3RoZXJ3aXNlIGV2ZW50IGJpbmRpbmdzIHdvdWxkIHJlYXNzaWduXG4gKiBgdGhpc2AgdG8gdGhlIGV2ZW50ZWQgb2JqZWN0IG9yIHNvbWUgb3RoZXIgdmFsdWU6IHRoaXMgbGV0cyB5b3UgZW5zdXJlXG4gKiB0aGUgYHRoaXNgIHZhbHVlIGFsd2F5cy5cbiAqXG4gKiBAcGFyYW0gZm5zIGxpc3Qgb2YgbWVtYmVyIGZ1bmN0aW9uIG5hbWVzXG4gKiBAcGFyYW0gY29udGV4dCB0aGUgY29udGV4dCB2YWx1ZVxuICogQGV4YW1wbGVcbiAqIGZ1bmN0aW9uIE15Q2xhc3MoKSB7XG4gKiAgIGJpbmRBbGwoWydvbnRpbWVyJ10sIHRoaXMpO1xuICogICB0aGlzLm5hbWUgPSAnVG9tJztcbiAqIH1cbiAqIE15Q2xhc3MucHJvdG90eXBlLm9udGltZXIgPSBmdW5jdGlvbigpIHtcbiAqICAgYWxlcnQodGhpcy5uYW1lKTtcbiAqIH07XG4gKiB2YXIgbXlDbGFzcyA9IG5ldyBNeUNsYXNzKCk7XG4gKiBzZXRUaW1lb3V0KG15Q2xhc3Mub250aW1lciwgMTAwKTtcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydHMuYmluZEFsbCA9IGZ1bmN0aW9uKGZucyAgICAgICAgICAgICAgICwgY29udGV4dCAgICAgICAgKSAgICAgICB7XG4gICAgZm5zLmZvckVhY2goKGZuKSA9PiB7XG4gICAgICAgIGlmICghY29udGV4dFtmbl0pIHsgcmV0dXJuOyB9XG4gICAgICAgIGNvbnRleHRbZm5dID0gY29udGV4dFtmbl0uYmluZChjb250ZXh0KTtcbiAgICB9KTtcbn07XG5cbi8qKlxuICogR2l2ZW4gYSBsaXN0IG9mIGNvb3JkaW5hdGVzLCBnZXQgdGhlaXIgY2VudGVyIGFzIGEgY29vcmRpbmF0ZS5cbiAqXG4gKiBAcmV0dXJucyBjZW50ZXJwb2ludFxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0cy5nZXRDb29yZGluYXRlc0NlbnRlciA9IGZ1bmN0aW9uKGNvb3JkcyAgICAgICAgICAgICAgICAgICApICAgICAgICAgICAgIHtcbiAgICBsZXQgbWluWCA9IEluZmluaXR5O1xuICAgIGxldCBtaW5ZID0gSW5maW5pdHk7XG4gICAgbGV0IG1heFggPSAtSW5maW5pdHk7XG4gICAgbGV0IG1heFkgPSAtSW5maW5pdHk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvb3Jkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBtaW5YID0gTWF0aC5taW4obWluWCwgY29vcmRzW2ldLmNvbHVtbik7XG4gICAgICAgIG1pblkgPSBNYXRoLm1pbihtaW5ZLCBjb29yZHNbaV0ucm93KTtcbiAgICAgICAgbWF4WCA9IE1hdGgubWF4KG1heFgsIGNvb3Jkc1tpXS5jb2x1bW4pO1xuICAgICAgICBtYXhZID0gTWF0aC5tYXgobWF4WSwgY29vcmRzW2ldLnJvdyk7XG4gICAgfVxuXG4gICAgY29uc3QgZHggPSBtYXhYIC0gbWluWDtcbiAgICBjb25zdCBkeSA9IG1heFkgLSBtaW5ZO1xuICAgIGNvbnN0IGRNYXggPSBNYXRoLm1heChkeCwgZHkpO1xuICAgIHJldHVybiBuZXcgQ29vcmRpbmF0ZSgobWluWCArIG1heFgpIC8gMiwgKG1pblkgKyBtYXhZKSAvIDIsIDApXG4gICAgICAgIC56b29tVG8oTWF0aC5mbG9vcigtTWF0aC5sb2coZE1heCkgLyBNYXRoLkxOMikpO1xufTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSBzdHJpbmcgZW5kcyB3aXRoIGEgcGFydGljdWxhciBzdWJzdHJpbmdcbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnRzLmVuZHNXaXRoID0gZnVuY3Rpb24oc3RyaW5nICAgICAgICAsIHN1ZmZpeCAgICAgICAgKSAgICAgICAgICB7XG4gICAgcmV0dXJuIHN0cmluZy5pbmRleE9mKHN1ZmZpeCwgc3RyaW5nLmxlbmd0aCAtIHN1ZmZpeC5sZW5ndGgpICE9PSAtMTtcbn07XG5cbi8qKlxuICogQ3JlYXRlIGFuIG9iamVjdCBieSBtYXBwaW5nIGFsbCB0aGUgdmFsdWVzIG9mIGFuIGV4aXN0aW5nIG9iamVjdCB3aGlsZVxuICogcHJlc2VydmluZyB0aGVpciBrZXlzLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydHMubWFwT2JqZWN0ID0gZnVuY3Rpb24oaW5wdXQgICAgICAgICwgaXRlcmF0b3IgICAgICAgICAgLCBjb250ZXh0ICAgICAgICAgKSAgICAgICAgIHtcbiAgICBjb25zdCBvdXRwdXQgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBpbnB1dCkge1xuICAgICAgICBvdXRwdXRba2V5XSA9IGl0ZXJhdG9yLmNhbGwoY29udGV4dCB8fCB0aGlzLCBpbnB1dFtrZXldLCBrZXksIGlucHV0KTtcbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dDtcbn07XG5cbi8qKlxuICogQ3JlYXRlIGFuIG9iamVjdCBieSBmaWx0ZXJpbmcgb3V0IHZhbHVlcyBvZiBhbiBleGlzdGluZyBvYmplY3QuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0cy5maWx0ZXJPYmplY3QgPSBmdW5jdGlvbihpbnB1dCAgICAgICAgLCBpdGVyYXRvciAgICAgICAgICAsIGNvbnRleHQgICAgICAgICApICAgICAgICAge1xuICAgIGNvbnN0IG91dHB1dCA9IHt9O1xuICAgIGZvciAoY29uc3Qga2V5IGluIGlucHV0KSB7XG4gICAgICAgIGlmIChpdGVyYXRvci5jYWxsKGNvbnRleHQgfHwgdGhpcywgaW5wdXRba2V5XSwga2V5LCBpbnB1dCkpIHtcbiAgICAgICAgICAgIG91dHB1dFtrZXldID0gaW5wdXRba2V5XTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0O1xufTtcblxuLyoqXG4gKiBEZWVwbHkgY29tcGFyZXMgdHdvIG9iamVjdCBsaXRlcmFscy5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnRzLmRlZXBFcXVhbCA9IGZ1bmN0aW9uKGEgICAgICAgICwgYiAgICAgICAgKSAgICAgICAgICB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYSkpIHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGIpIHx8IGEubGVuZ3RoICE9PSBiLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghZXhwb3J0cy5kZWVwRXF1YWwoYVtpXSwgYltpXSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBhID09PSAnb2JqZWN0JyAmJiBhICE9PSBudWxsICYmIGIgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKCEodHlwZW9mIGIgPT09ICdvYmplY3QnKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoYSk7XG4gICAgICAgIGlmIChrZXlzLmxlbmd0aCAhPT0gT2JqZWN0LmtleXMoYikubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGEpIHtcbiAgICAgICAgICAgIGlmICghZXhwb3J0cy5kZWVwRXF1YWwoYVtrZXldLCBiW2tleV0pKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBhID09PSBiO1xufTtcblxuLyoqXG4gKiBEZWVwbHkgY2xvbmVzIHR3byBvYmplY3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydHMuY2xvbmUgPSBmdW5jdGlvbiAgIChpbnB1dCAgICkgICAge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGlucHV0KSkge1xuICAgICAgICByZXR1cm4gaW5wdXQubWFwKGV4cG9ydHMuY2xvbmUpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGlucHV0ID09PSAnb2JqZWN0JyAmJiBpbnB1dCkge1xuICAgICAgICByZXR1cm4gKChleHBvcnRzLm1hcE9iamVjdChpbnB1dCwgZXhwb3J0cy5jbG9uZSkgICAgICkgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBpbnB1dDtcbiAgICB9XG59O1xuXG4vKipcbiAqIENoZWNrIGlmIHR3byBhcnJheXMgaGF2ZSBhdCBsZWFzdCBvbmUgY29tbW9uIGVsZW1lbnQuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0cy5hcnJheXNJbnRlcnNlY3QgPSBmdW5jdGlvbihhICAgICAgICAgICAgLCBiICAgICAgICAgICAgKSAgICAgICAgICB7XG4gICAgZm9yIChsZXQgbCA9IDA7IGwgPCBhLmxlbmd0aDsgbCsrKSB7XG4gICAgICAgIGlmIChiLmluZGV4T2YoYVtsXSkgPj0gMCkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogUHJpbnQgYSB3YXJuaW5nIG1lc3NhZ2UgdG8gdGhlIGNvbnNvbGUgYW5kIGVuc3VyZSBkdXBsaWNhdGUgd2FybmluZyBtZXNzYWdlc1xuICogYXJlIG5vdCBwcmludGVkLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IHdhcm5PbmNlSGlzdG9yeSA9IHt9O1xuZXhwb3J0cy53YXJuT25jZSA9IGZ1bmN0aW9uKG1lc3NhZ2UgICAgICAgICkgICAgICAge1xuICAgIGlmICghd2Fybk9uY2VIaXN0b3J5W21lc3NhZ2VdKSB7XG4gICAgICAgIC8vIGNvbnNvbGUgaXNuJ3QgZGVmaW5lZCBpbiBzb21lIFdlYldvcmtlcnMsIHNlZSAjMjU1OFxuICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09IFwidW5kZWZpbmVkXCIpIGNvbnNvbGUud2FybihtZXNzYWdlKTtcbiAgICAgICAgd2Fybk9uY2VIaXN0b3J5W21lc3NhZ2VdID0gdHJ1ZTtcbiAgICB9XG59O1xuXG4vKipcbiAqIEluZGljYXRlcyBpZiB0aGUgcHJvdmlkZWQgUG9pbnRzIGFyZSBpbiBhIGNvdW50ZXIgY2xvY2t3aXNlICh0cnVlKSBvciBjbG9ja3dpc2UgKGZhbHNlKSBvcmRlclxuICpcbiAqIEByZXR1cm5zIHRydWUgZm9yIGEgY291bnRlciBjbG9ja3dpc2Ugc2V0IG9mIHBvaW50c1xuICovXG4vLyBodHRwOi8vYnJ5Y2Vib2UuY29tLzIwMDYvMTAvMjMvbGluZS1zZWdtZW50LWludGVyc2VjdGlvbi1hbGdvcml0aG0vXG5leHBvcnRzLmlzQ291bnRlckNsb2Nrd2lzZSA9IGZ1bmN0aW9uKGEgICAgICAgLCBiICAgICAgICwgYyAgICAgICApICAgICAgICAgIHtcbiAgICByZXR1cm4gKGMueSAtIGEueSkgKiAoYi54IC0gYS54KSA+IChiLnkgLSBhLnkpICogKGMueCAtIGEueCk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHNpZ25lZCBhcmVhIGZvciB0aGUgcG9seWdvbiByaW5nLiAgUG9zdGl2ZSBhcmVhcyBhcmUgZXh0ZXJpb3IgcmluZ3MgYW5kXG4gKiBoYXZlIGEgY2xvY2t3aXNlIHdpbmRpbmcuICBOZWdhdGl2ZSBhcmVhcyBhcmUgaW50ZXJpb3IgcmluZ3MgYW5kIGhhdmUgYSBjb3VudGVyIGNsb2Nrd2lzZVxuICogb3JkZXJpbmcuXG4gKlxuICogQHBhcmFtIHJpbmcgRXh0ZXJpb3Igb3IgaW50ZXJpb3IgcmluZ1xuICovXG5leHBvcnRzLmNhbGN1bGF0ZVNpZ25lZEFyZWEgPSBmdW5jdGlvbihyaW5nICAgICAgICAgICAgICApICAgICAgICAge1xuICAgIGxldCBzdW0gPSAwO1xuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSByaW5nLmxlbmd0aCwgaiA9IGxlbiAtIDEsIHAxLCBwMjsgaSA8IGxlbjsgaiA9IGkrKykge1xuICAgICAgICBwMSA9IHJpbmdbaV07XG4gICAgICAgIHAyID0gcmluZ1tqXTtcbiAgICAgICAgc3VtICs9IChwMi54IC0gcDEueCkgKiAocDEueSArIHAyLnkpO1xuICAgIH1cbiAgICByZXR1cm4gc3VtO1xufTtcblxuLyoqXG4gKiBEZXRlY3RzIGNsb3NlZCBwb2x5Z29ucywgZmlyc3QgKyBsYXN0IHBvaW50IGFyZSBlcXVhbFxuICpcbiAqIEBwYXJhbSBwb2ludHMgYXJyYXkgb2YgcG9pbnRzXG4gKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBvaW50cyBhcmUgYSBjbG9zZWQgcG9seWdvblxuICovXG5leHBvcnRzLmlzQ2xvc2VkUG9seWdvbiA9IGZ1bmN0aW9uKHBvaW50cyAgICAgICAgICAgICAgKSAgICAgICAgICB7XG4gICAgLy8gSWYgaXQgaXMgMiBwb2ludHMgdGhhdCBhcmUgdGhlIHNhbWUgdGhlbiBpdCBpcyBhIHBvaW50XG4gICAgLy8gSWYgaXQgaXMgMyBwb2ludHMgd2l0aCBzdGFydCBhbmQgZW5kIHRoZSBzYW1lIHRoZW4gaXQgaXMgYSBsaW5lXG4gICAgaWYgKHBvaW50cy5sZW5ndGggPCA0KVxuICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBwMSA9IHBvaW50c1swXTtcbiAgICBjb25zdCBwMiA9IHBvaW50c1twb2ludHMubGVuZ3RoIC0gMV07XG5cbiAgICBpZiAoTWF0aC5hYnMocDEueCAtIHAyLngpID4gMCB8fFxuICAgICAgICBNYXRoLmFicyhwMS55IC0gcDIueSkgPiAwKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBwb2x5Z29uIHNpbXBsaWZpY2F0aW9uIGNhbiBwcm9kdWNlIHBvbHlnb25zIHdpdGggemVybyBhcmVhIGFuZCBtb3JlIHRoYW4gMyBwb2ludHNcbiAgICByZXR1cm4gKE1hdGguYWJzKGV4cG9ydHMuY2FsY3VsYXRlU2lnbmVkQXJlYShwb2ludHMpKSA+IDAuMDEpO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBzcGhlcmljYWwgY29vcmRpbmF0ZXMgdG8gY2FydGVzaWFuIGNvb3JkaW5hdGVzLlxuICpcbiAqIEBwYXJhbSBzcGhlcmljYWwgU3BoZXJpY2FsIGNvb3JkaW5hdGVzLCBpbiBbcmFkaWFsLCBhemltdXRoYWwsIHBvbGFyXVxuICogQHJldHVybiBjYXJ0ZXNpYW4gY29vcmRpbmF0ZXMgaW4gW3gsIHksIHpdXG4gKi9cblxuZXhwb3J0cy5zcGhlcmljYWxUb0NhcnRlc2lhbiA9IGZ1bmN0aW9uKHNwaGVyaWNhbCAgICAgICAgICAgICAgICkgICAgICAgICAgICAgICAge1xuICAgIGNvbnN0IHIgPSBzcGhlcmljYWxbMF07XG4gICAgbGV0IGF6aW11dGhhbCA9IHNwaGVyaWNhbFsxXSxcbiAgICAgICAgcG9sYXIgPSBzcGhlcmljYWxbMl07XG4gICAgLy8gV2UgYWJzdHJhY3QgXCJub3J0aFwiL1widXBcIiAoY29tcGFzcy13aXNlKSB0byBiZSAwwrAgd2hlbiByZWFsbHkgdGhpcyBpcyA5MMKwICjPgC8yKTpcbiAgICAvLyBjb3JyZWN0IGZvciB0aGF0IGhlcmVcbiAgICBhemltdXRoYWwgKz0gOTA7XG5cbiAgICAvLyBDb252ZXJ0IGF6aW11dGhhbCBhbmQgcG9sYXIgYW5nbGVzIHRvIHJhZGlhbnNcbiAgICBhemltdXRoYWwgKj0gTWF0aC5QSSAvIDE4MDtcbiAgICBwb2xhciAqPSBNYXRoLlBJIC8gMTgwO1xuXG4gICAgLy8gc3BoZXJpY2FsIHRvIGNhcnRlc2lhbiAoeCwgeSwgeilcbiAgICByZXR1cm4gW1xuICAgICAgICByICogTWF0aC5jb3MoYXppbXV0aGFsKSAqIE1hdGguc2luKHBvbGFyKSxcbiAgICAgICAgciAqIE1hdGguc2luKGF6aW11dGhhbCkgKiBNYXRoLnNpbihwb2xhciksXG4gICAgICAgIHIgKiBNYXRoLmNvcyhwb2xhcilcbiAgICBdO1xufTtcblxuLyoqXG4gKiBQYXJzZXMgZGF0YSBmcm9tICdDYWNoZS1Db250cm9sJyBoZWFkZXJzLlxuICpcbiAqIEBwYXJhbSBjYWNoZUNvbnRyb2wgVmFsdWUgb2YgJ0NhY2hlLUNvbnRyb2wnIGhlYWRlclxuICogQHJldHVybiBvYmplY3QgY29udGFpbmluZyBwYXJzZWQgaGVhZGVyIGluZm8uXG4gKi9cblxuZXhwb3J0cy5wYXJzZUNhY2hlQ29udHJvbCA9IGZ1bmN0aW9uKGNhY2hlQ29udHJvbCAgICAgICAgKSAgICAgICAgIHtcbiAgICAvLyBUYWtlbiBmcm9tIFtXcmVja10oaHR0cHM6Ly9naXRodWIuY29tL2hhcGlqcy93cmVjaylcbiAgICBjb25zdCByZSA9IC8oPzpefCg/OlxccypcXCxcXHMqKSkoW15cXHgwMC1cXHgyMFxcKFxcKTw+QFxcLDtcXDpcXFxcXCJcXC9cXFtcXF1cXD9cXD1cXHtcXH1cXHg3Rl0rKSg/OlxcPSg/OihbXlxceDAwLVxceDIwXFwoXFwpPD5AXFwsO1xcOlxcXFxcIlxcL1xcW1xcXVxcP1xcPVxce1xcfVxceDdGXSspfCg/OlxcXCIoKD86W15cIlxcXFxdfFxcXFwuKSopXFxcIikpKT8vZztcblxuICAgIGNvbnN0IGhlYWRlciA9IHt9O1xuICAgIGNhY2hlQ29udHJvbC5yZXBsYWNlKHJlLCAoJDAsICQxLCAkMiwgJDMpID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSAkMiB8fCAkMztcbiAgICAgICAgaGVhZGVyWyQxXSA9IHZhbHVlID8gdmFsdWUudG9Mb3dlckNhc2UoKSA6IHRydWU7XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9KTtcblxuICAgIGlmIChoZWFkZXJbJ21heC1hZ2UnXSkge1xuICAgICAgICBjb25zdCBtYXhBZ2UgPSBwYXJzZUludChoZWFkZXJbJ21heC1hZ2UnXSwgMTApO1xuICAgICAgICBpZiAoaXNOYU4obWF4QWdlKSkgZGVsZXRlIGhlYWRlclsnbWF4LWFnZSddO1xuICAgICAgICBlbHNlIGhlYWRlclsnbWF4LWFnZSddID0gbWF4QWdlO1xuICAgIH1cblxuICAgIHJldHVybiBoZWFkZXI7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5jbGFzcyBGZWF0dXJlIHtcbiAgICBjb25zdHJ1Y3Rvcih2ZWN0b3JUaWxlRmVhdHVyZSwgeiwgeCwgeSkge1xuICAgICAgICB0aGlzLnR5cGUgPSAnRmVhdHVyZSc7XG5cbiAgICAgICAgdGhpcy5fdmVjdG9yVGlsZUZlYXR1cmUgPSB2ZWN0b3JUaWxlRmVhdHVyZTtcbiAgICAgICAgdmVjdG9yVGlsZUZlYXR1cmUuX3ogPSB6O1xuICAgICAgICB2ZWN0b3JUaWxlRmVhdHVyZS5feCA9IHg7XG4gICAgICAgIHZlY3RvclRpbGVGZWF0dXJlLl95ID0geTtcblxuICAgICAgICB0aGlzLnByb3BlcnRpZXMgPSB2ZWN0b3JUaWxlRmVhdHVyZS5wcm9wZXJ0aWVzO1xuXG4gICAgICAgIGlmICh2ZWN0b3JUaWxlRmVhdHVyZS5pZCAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmlkID0gdmVjdG9yVGlsZUZlYXR1cmUuaWQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXQgZ2VvbWV0cnkoKSB7XG4gICAgICAgIGlmICh0aGlzLl9nZW9tZXRyeSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLl9nZW9tZXRyeSA9IHRoaXMuX3ZlY3RvclRpbGVGZWF0dXJlLnRvR2VvSlNPTihcbiAgICAgICAgICAgICAgICB0aGlzLl92ZWN0b3JUaWxlRmVhdHVyZS5feCxcbiAgICAgICAgICAgICAgICB0aGlzLl92ZWN0b3JUaWxlRmVhdHVyZS5feSxcbiAgICAgICAgICAgICAgICB0aGlzLl92ZWN0b3JUaWxlRmVhdHVyZS5feikuZ2VvbWV0cnk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2dlb21ldHJ5O1xuICAgIH1cblxuICAgIHNldCBnZW9tZXRyeShnKSB7XG4gICAgICAgIHRoaXMuX2dlb21ldHJ5ID0gZztcbiAgICB9XG5cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIGNvbnN0IGpzb24gPSB7XG4gICAgICAgICAgICBnZW9tZXRyeTogdGhpcy5nZW9tZXRyeVxuICAgICAgICB9O1xuICAgICAgICBmb3IgKGNvbnN0IGkgaW4gdGhpcykge1xuICAgICAgICAgICAgaWYgKGkgPT09ICdfZ2VvbWV0cnknIHx8IGkgPT09ICdfdmVjdG9yVGlsZUZlYXR1cmUnKSBjb250aW51ZTtcbiAgICAgICAgICAgIGpzb25baV0gPSB0aGlzW2ldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBqc29uO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBGZWF0dXJlO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBzY3JpcHREZXRlY3Rpb24gPSByZXF1aXJlKCcuL3NjcmlwdF9kZXRlY3Rpb24nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB2ZXJ0aWNhbGl6ZVB1bmN0dWF0aW9uKGlucHV0KSB7XG4gICAgbGV0IG91dHB1dCA9ICcnO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBuZXh0Q2hhckNvZGUgPSBpbnB1dC5jaGFyQ29kZUF0KGkgKyAxKSB8fCBudWxsO1xuICAgICAgICBjb25zdCBwcmV2Q2hhckNvZGUgPSBpbnB1dC5jaGFyQ29kZUF0KGkgLSAxKSB8fCBudWxsO1xuXG4gICAgICAgIGNvbnN0IGNhblJlcGxhY2VQdW5jdHVhdGlvbiA9IChcbiAgICAgICAgICAgICghbmV4dENoYXJDb2RlIHx8ICFzY3JpcHREZXRlY3Rpb24uY2hhckhhc1JvdGF0ZWRWZXJ0aWNhbE9yaWVudGF0aW9uKG5leHRDaGFyQ29kZSkgfHwgbW9kdWxlLmV4cG9ydHMubG9va3VwW2lucHV0W2kgKyAxXV0pICYmXG4gICAgICAgICAgICAoIXByZXZDaGFyQ29kZSB8fCAhc2NyaXB0RGV0ZWN0aW9uLmNoYXJIYXNSb3RhdGVkVmVydGljYWxPcmllbnRhdGlvbihwcmV2Q2hhckNvZGUpIHx8IG1vZHVsZS5leHBvcnRzLmxvb2t1cFtpbnB1dFtpIC0gMV1dKVxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChjYW5SZXBsYWNlUHVuY3R1YXRpb24gJiYgbW9kdWxlLmV4cG9ydHMubG9va3VwW2lucHV0W2ldXSkge1xuICAgICAgICAgICAgb3V0cHV0ICs9IG1vZHVsZS5leHBvcnRzLmxvb2t1cFtpbnB1dFtpXV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvdXRwdXQgKz0gaW5wdXRbaV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb3V0cHV0O1xufTtcblxubW9kdWxlLmV4cG9ydHMubG9va3VwID0ge1xuICAgICchJzogJ++4lScsXG4gICAgJyMnOiAn77yDJyxcbiAgICAnJCc6ICfvvIQnLFxuICAgICclJzogJ++8hScsXG4gICAgJyYnOiAn77yGJyxcbiAgICAnKCc6ICfvuLUnLFxuICAgICcpJzogJ++4ticsXG4gICAgJyonOiAn77yKJyxcbiAgICAnKyc6ICfvvIsnLFxuICAgICcsJzogJ++4kCcsXG4gICAgJy0nOiAn77iyJyxcbiAgICAnLic6ICfjg7snLFxuICAgICcvJzogJ++8jycsXG4gICAgJzonOiAn77iTJyxcbiAgICAnOyc6ICfvuJQnLFxuICAgICc8JzogJ++4vycsXG4gICAgJz0nOiAn77ydJyxcbiAgICAnPic6ICfvuYAnLFxuICAgICc/JzogJ++4licsXG4gICAgJ0AnOiAn77ygJyxcbiAgICAnWyc6ICfvuYcnLFxuICAgICdcXFxcJzogJ++8vCcsXG4gICAgJ10nOiAn77mIJyxcbiAgICAnXic6ICfvvL4nLFxuICAgICdfJzogJ++4sycsXG4gICAgJ2AnOiAn772AJyxcbiAgICAneyc6ICfvuLcnLFxuICAgICd8JzogJ+KAlScsXG4gICAgJ30nOiAn77i4JyxcbiAgICAnfic6ICfvvZ4nLFxuICAgICfCoic6ICfvv6AnLFxuICAgICfCoyc6ICfvv6EnLFxuICAgICfCpSc6ICfvv6UnLFxuICAgICfCpic6ICfvv6QnLFxuICAgICfCrCc6ICfvv6InLFxuICAgICfCryc6ICfvv6MnLFxuICAgICfigJMnOiAn77iyJyxcbiAgICAn4oCUJzogJ++4sScsXG4gICAgJ+KAmCc6ICfvuYMnLFxuICAgICfigJknOiAn77mEJyxcbiAgICAn4oCcJzogJ++5gScsXG4gICAgJ+KAnSc6ICfvuYInLFxuICAgICfigKYnOiAn77iZJyxcbiAgICAn4oCnJzogJ+ODuycsXG4gICAgJ+KCqSc6ICfvv6YnLFxuICAgICfjgIEnOiAn77iRJyxcbiAgICAn44CCJzogJ++4kicsXG4gICAgJ+OAiCc6ICfvuL8nLFxuICAgICfjgIknOiAn77mAJyxcbiAgICAn44CKJzogJ++4vScsXG4gICAgJ+OAiyc6ICfvuL4nLFxuICAgICfjgIwnOiAn77mBJyxcbiAgICAn44CNJzogJ++5gicsXG4gICAgJ+OAjic6ICfvuYMnLFxuICAgICfjgI8nOiAn77mEJyxcbiAgICAn44CQJzogJ++4uycsXG4gICAgJ+OAkSc6ICfvuLwnLFxuICAgICfjgJQnOiAn77i5JyxcbiAgICAn44CVJzogJ++4uicsXG4gICAgJ+OAlic6ICfvuJcnLFxuICAgICfjgJcnOiAn77iYJyxcbiAgICAn77yBJzogJ++4lScsXG4gICAgJ++8iCc6ICfvuLUnLFxuICAgICfvvIknOiAn77i2JyxcbiAgICAn77yMJzogJ++4kCcsXG4gICAgJ++8jSc6ICfvuLInLFxuICAgICfvvI4nOiAn44O7JyxcbiAgICAn77yaJzogJ++4kycsXG4gICAgJ++8myc6ICfvuJQnLFxuICAgICfvvJwnOiAn77i/JyxcbiAgICAn77yeJzogJ++5gCcsXG4gICAgJ++8nyc6ICfvuJYnLFxuICAgICfvvLsnOiAn77mHJyxcbiAgICAn77y9JzogJ++5iCcsXG4gICAgJ++8vyc6ICfvuLMnLFxuICAgICfvvZsnOiAn77i3JyxcbiAgICAn772cJzogJ+KAlScsXG4gICAgJ++9nSc6ICfvuLgnLFxuICAgICfvvZ8nOiAn77i1JyxcbiAgICAn772gJzogJ++4ticsXG4gICAgJ++9oSc6ICfvuJInLFxuICAgICfvvaInOiAn77mBJyxcbiAgICAn772jJzogJ++5gidcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpO1xuY29uc3QgV2ViV29ya2VyID0gcmVxdWlyZSgnLi93ZWJfd29ya2VyJyk7XG5cbi8qKlxuICogQ29uc3RydWN0cyBhIHdvcmtlciBwb29sLlxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgV29ya2VyUG9vbCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuYWN0aXZlID0ge307XG4gICAgfVxuXG4gICAgYWNxdWlyZShtYXBJZCkge1xuICAgICAgICBpZiAoIXRoaXMud29ya2Vycykge1xuICAgICAgICAgICAgLy8gTGF6aWx5IGxvb2sgdXAgdGhlIHZhbHVlIG9mIG1hcGJveGdsLndvcmtlckNvdW50LiAgVGhpcyBhbGxvd3NcbiAgICAgICAgICAgIC8vIGNsaWVudCBjb2RlIGEgY2hhbmNlIHRvIHNldCBpdCB3aGlsZSBjaXJjdW12ZW50aW5nIGN5Y2xpY1xuICAgICAgICAgICAgLy8gZGVwZW5kZW5jeSBwcm9ibGVtc1xuICAgICAgICAgICAgY29uc3Qgd29ya2VyQ291bnQgPSByZXF1aXJlKCcuLi9tYXBib3gtZ2wnKS53b3JrZXJDb3VudDtcbiAgICAgICAgICAgIGFzc2VydCh0eXBlb2Ygd29ya2VyQ291bnQgPT09ICdudW1iZXInICYmIHdvcmtlckNvdW50IDwgSW5maW5pdHkpO1xuXG4gICAgICAgICAgICB0aGlzLndvcmtlcnMgPSBbXTtcbiAgICAgICAgICAgIHdoaWxlICh0aGlzLndvcmtlcnMubGVuZ3RoIDwgd29ya2VyQ291bnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLndvcmtlcnMucHVzaChuZXcgV2ViV29ya2VyKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hY3RpdmVbbWFwSWRdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXMud29ya2Vycy5zbGljZSgpO1xuICAgIH1cblxuICAgIHJlbGVhc2UobWFwSWQpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuYWN0aXZlW21hcElkXTtcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuYWN0aXZlKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMud29ya2Vycy5mb3JFYWNoKCh3KSA9PiB7XG4gICAgICAgICAgICAgICAgdy50ZXJtaW5hdGUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy53b3JrZXJzID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBXb3JrZXJQb29sO1xuIiwiKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKSA6XG4gICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKGZhY3RvcnkpIDpcbiAgICAoZ2xvYmFsLmdsTWF0cml4ID0gZmFjdG9yeSgpKTtcbn0odGhpcywgKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiBjcmVhdGUoKSB7XG4gICAgdmFyIG91dCA9IG5ldyBGbG9hdDMyQXJyYXkoMyk7XG4gICAgb3V0WzBdID0gMDtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gICAgcmV0dXJuIG91dDtcbn1cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5mdW5jdGlvbiB0cmFuc2Zvcm1NYXQzKG91dCwgYSwgbSkge1xuICAgIHZhciB4ID0gYVswXSwgeSA9IGFbMV0sIHogPSBhWzJdO1xuICAgIG91dFswXSA9IHggKiBtWzBdICsgeSAqIG1bM10gKyB6ICogbVs2XTtcbiAgICBvdXRbMV0gPSB4ICogbVsxXSArIHkgKiBtWzRdICsgeiAqIG1bN107XG4gICAgb3V0WzJdID0geCAqIG1bMl0gKyB5ICogbVs1XSArIHogKiBtWzhdO1xuICAgIHJldHVybiBvdXQ7XG59XG5cblxuXG5cbnZhciB2ZWMgPSBjcmVhdGUoKTtcblxuZnVuY3Rpb24gY3JlYXRlJDEoKSB7XG4gICAgdmFyIG91dCA9IG5ldyBGbG9hdDMyQXJyYXkoNCk7XG4gICAgb3V0WzBdID0gMDtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gICAgb3V0WzNdID0gMDtcbiAgICByZXR1cm4gb3V0O1xufVxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5mdW5jdGlvbiBzY2FsZSQxKG91dCwgYSwgYikge1xuICAgIG91dFswXSA9IGFbMF0gKiBiO1xuICAgIG91dFsxXSA9IGFbMV0gKiBiO1xuICAgIG91dFsyXSA9IGFbMl0gKiBiO1xuICAgIG91dFszXSA9IGFbM10gKiBiO1xuICAgIHJldHVybiBvdXQ7XG59XG5cblxuXG5cblxuXG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZSQxKG91dCwgYSkge1xuICAgIHZhciB4ID0gYVswXSxcbiAgICAgICAgeSA9IGFbMV0sXG4gICAgICAgIHogPSBhWzJdLFxuICAgICAgICB3ID0gYVszXTtcbiAgICB2YXIgbGVuID0geCAqIHggKyB5ICogeSArIHogKiB6ICsgdyAqIHc7XG4gICAgaWYgKGxlbiA+IDApIHtcbiAgICAgICAgbGVuID0gMSAvIE1hdGguc3FydChsZW4pO1xuICAgICAgICBvdXRbMF0gPSB4ICogbGVuO1xuICAgICAgICBvdXRbMV0gPSB5ICogbGVuO1xuICAgICAgICBvdXRbMl0gPSB6ICogbGVuO1xuICAgICAgICBvdXRbM10gPSB3ICogbGVuO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xufVxuXG5cblxuZnVuY3Rpb24gdHJhbnNmb3JtTWF0NCQxKG91dCwgYSwgbSkge1xuICAgIHZhciB4ID0gYVswXSwgeSA9IGFbMV0sIHogPSBhWzJdLCB3ID0gYVszXTtcbiAgICBvdXRbMF0gPSBtWzBdICogeCArIG1bNF0gKiB5ICsgbVs4XSAqIHogKyBtWzEyXSAqIHc7XG4gICAgb3V0WzFdID0gbVsxXSAqIHggKyBtWzVdICogeSArIG1bOV0gKiB6ICsgbVsxM10gKiB3O1xuICAgIG91dFsyXSA9IG1bMl0gKiB4ICsgbVs2XSAqIHkgKyBtWzEwXSAqIHogKyBtWzE0XSAqIHc7XG4gICAgb3V0WzNdID0gbVszXSAqIHggKyBtWzddICogeSArIG1bMTFdICogeiArIG1bMTVdICogdztcbiAgICByZXR1cm4gb3V0O1xufVxuXG52YXIgdmVjJDEgPSBjcmVhdGUkMSgpO1xuXG5mdW5jdGlvbiBjcmVhdGUkMigpIHtcbiAgICB2YXIgb3V0ID0gbmV3IEZsb2F0MzJBcnJheSg0KTtcbiAgICBvdXRbMF0gPSAxO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAxO1xuICAgIHJldHVybiBvdXQ7XG59XG5cblxuXG5cblxuXG5cblxuXG5cbmZ1bmN0aW9uIHJvdGF0ZShvdXQsIGEsIHJhZCkge1xuICAgIHZhciBhMCA9IGFbMF0sIGExID0gYVsxXSwgYTIgPSBhWzJdLCBhMyA9IGFbM10sXG4gICAgICAgIHMgPSBNYXRoLnNpbihyYWQpLFxuICAgICAgICBjID0gTWF0aC5jb3MocmFkKTtcbiAgICBvdXRbMF0gPSBhMCAqICBjICsgYTIgKiBzO1xuICAgIG91dFsxXSA9IGExICogIGMgKyBhMyAqIHM7XG4gICAgb3V0WzJdID0gYTAgKiAtcyArIGEyICogYztcbiAgICBvdXRbM10gPSBhMSAqIC1zICsgYTMgKiBjO1xuICAgIHJldHVybiBvdXQ7XG59XG5mdW5jdGlvbiBzY2FsZSQyKG91dCwgYSwgdikge1xuICAgIHZhciBhMCA9IGFbMF0sIGExID0gYVsxXSwgYTIgPSBhWzJdLCBhMyA9IGFbM10sXG4gICAgICAgIHYwID0gdlswXSwgdjEgPSB2WzFdO1xuICAgIG91dFswXSA9IGEwICogdjA7XG4gICAgb3V0WzFdID0gYTEgKiB2MDtcbiAgICBvdXRbMl0gPSBhMiAqIHYxO1xuICAgIG91dFszXSA9IGEzICogdjE7XG4gICAgcmV0dXJuIG91dDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlJDMoKSB7XG4gICAgdmFyIG91dCA9IG5ldyBGbG9hdDMyQXJyYXkoOSk7XG4gICAgb3V0WzBdID0gMTtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gICAgb3V0WzNdID0gMDtcbiAgICBvdXRbNF0gPSAxO1xuICAgIG91dFs1XSA9IDA7XG4gICAgb3V0WzZdID0gMDtcbiAgICBvdXRbN10gPSAwO1xuICAgIG91dFs4XSA9IDE7XG4gICAgcmV0dXJuIG91dDtcbn1cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmZ1bmN0aW9uIGZyb21Sb3RhdGlvbiQxKG91dCwgcmFkKSB7XG4gICAgdmFyIHMgPSBNYXRoLnNpbihyYWQpLCBjID0gTWF0aC5jb3MocmFkKTtcbiAgICBvdXRbMF0gPSBjO1xuICAgIG91dFsxXSA9IHM7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAtcztcbiAgICBvdXRbNF0gPSBjO1xuICAgIG91dFs1XSA9IDA7XG4gICAgb3V0WzZdID0gMDtcbiAgICBvdXRbN10gPSAwO1xuICAgIG91dFs4XSA9IDE7XG4gICAgcmV0dXJuIG91dDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlJDQoKSB7XG4gICAgdmFyIG91dCA9IG5ldyBGbG9hdDMyQXJyYXkoMTYpO1xuICAgIG91dFswXSA9IDE7XG4gICAgb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSAwO1xuICAgIG91dFszXSA9IDA7XG4gICAgb3V0WzRdID0gMDtcbiAgICBvdXRbNV0gPSAxO1xuICAgIG91dFs2XSA9IDA7XG4gICAgb3V0WzddID0gMDtcbiAgICBvdXRbOF0gPSAwO1xuICAgIG91dFs5XSA9IDA7XG4gICAgb3V0WzEwXSA9IDE7XG4gICAgb3V0WzExXSA9IDA7XG4gICAgb3V0WzEyXSA9IDA7XG4gICAgb3V0WzEzXSA9IDA7XG4gICAgb3V0WzE0XSA9IDA7XG4gICAgb3V0WzE1XSA9IDE7XG4gICAgcmV0dXJuIG91dDtcbn1cblxuXG5cblxuZnVuY3Rpb24gaWRlbnRpdHkkMihvdXQpIHtcbiAgICBvdXRbMF0gPSAxO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAwO1xuICAgIG91dFs0XSA9IDA7XG4gICAgb3V0WzVdID0gMTtcbiAgICBvdXRbNl0gPSAwO1xuICAgIG91dFs3XSA9IDA7XG4gICAgb3V0WzhdID0gMDtcbiAgICBvdXRbOV0gPSAwO1xuICAgIG91dFsxMF0gPSAxO1xuICAgIG91dFsxMV0gPSAwO1xuICAgIG91dFsxMl0gPSAwO1xuICAgIG91dFsxM10gPSAwO1xuICAgIG91dFsxNF0gPSAwO1xuICAgIG91dFsxNV0gPSAxO1xuICAgIHJldHVybiBvdXQ7XG59XG5cbmZ1bmN0aW9uIGludmVydCQyKG91dCwgYSkge1xuICAgIHZhciBhMDAgPSBhWzBdLCBhMDEgPSBhWzFdLCBhMDIgPSBhWzJdLCBhMDMgPSBhWzNdLFxuICAgICAgICBhMTAgPSBhWzRdLCBhMTEgPSBhWzVdLCBhMTIgPSBhWzZdLCBhMTMgPSBhWzddLFxuICAgICAgICBhMjAgPSBhWzhdLCBhMjEgPSBhWzldLCBhMjIgPSBhWzEwXSwgYTIzID0gYVsxMV0sXG4gICAgICAgIGEzMCA9IGFbMTJdLCBhMzEgPSBhWzEzXSwgYTMyID0gYVsxNF0sIGEzMyA9IGFbMTVdLFxuICAgICAgICBiMDAgPSBhMDAgKiBhMTEgLSBhMDEgKiBhMTAsXG4gICAgICAgIGIwMSA9IGEwMCAqIGExMiAtIGEwMiAqIGExMCxcbiAgICAgICAgYjAyID0gYTAwICogYTEzIC0gYTAzICogYTEwLFxuICAgICAgICBiMDMgPSBhMDEgKiBhMTIgLSBhMDIgKiBhMTEsXG4gICAgICAgIGIwNCA9IGEwMSAqIGExMyAtIGEwMyAqIGExMSxcbiAgICAgICAgYjA1ID0gYTAyICogYTEzIC0gYTAzICogYTEyLFxuICAgICAgICBiMDYgPSBhMjAgKiBhMzEgLSBhMjEgKiBhMzAsXG4gICAgICAgIGIwNyA9IGEyMCAqIGEzMiAtIGEyMiAqIGEzMCxcbiAgICAgICAgYjA4ID0gYTIwICogYTMzIC0gYTIzICogYTMwLFxuICAgICAgICBiMDkgPSBhMjEgKiBhMzIgLSBhMjIgKiBhMzEsXG4gICAgICAgIGIxMCA9IGEyMSAqIGEzMyAtIGEyMyAqIGEzMSxcbiAgICAgICAgYjExID0gYTIyICogYTMzIC0gYTIzICogYTMyLFxuICAgICAgICBkZXQgPSBiMDAgKiBiMTEgLSBiMDEgKiBiMTAgKyBiMDIgKiBiMDkgKyBiMDMgKiBiMDggLSBiMDQgKiBiMDcgKyBiMDUgKiBiMDY7XG4gICAgaWYgKCFkZXQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGRldCA9IDEuMCAvIGRldDtcbiAgICBvdXRbMF0gPSAoYTExICogYjExIC0gYTEyICogYjEwICsgYTEzICogYjA5KSAqIGRldDtcbiAgICBvdXRbMV0gPSAoYTAyICogYjEwIC0gYTAxICogYjExIC0gYTAzICogYjA5KSAqIGRldDtcbiAgICBvdXRbMl0gPSAoYTMxICogYjA1IC0gYTMyICogYjA0ICsgYTMzICogYjAzKSAqIGRldDtcbiAgICBvdXRbM10gPSAoYTIyICogYjA0IC0gYTIxICogYjA1IC0gYTIzICogYjAzKSAqIGRldDtcbiAgICBvdXRbNF0gPSAoYTEyICogYjA4IC0gYTEwICogYjExIC0gYTEzICogYjA3KSAqIGRldDtcbiAgICBvdXRbNV0gPSAoYTAwICogYjExIC0gYTAyICogYjA4ICsgYTAzICogYjA3KSAqIGRldDtcbiAgICBvdXRbNl0gPSAoYTMyICogYjAyIC0gYTMwICogYjA1IC0gYTMzICogYjAxKSAqIGRldDtcbiAgICBvdXRbN10gPSAoYTIwICogYjA1IC0gYTIyICogYjAyICsgYTIzICogYjAxKSAqIGRldDtcbiAgICBvdXRbOF0gPSAoYTEwICogYjEwIC0gYTExICogYjA4ICsgYTEzICogYjA2KSAqIGRldDtcbiAgICBvdXRbOV0gPSAoYTAxICogYjA4IC0gYTAwICogYjEwIC0gYTAzICogYjA2KSAqIGRldDtcbiAgICBvdXRbMTBdID0gKGEzMCAqIGIwNCAtIGEzMSAqIGIwMiArIGEzMyAqIGIwMCkgKiBkZXQ7XG4gICAgb3V0WzExXSA9IChhMjEgKiBiMDIgLSBhMjAgKiBiMDQgLSBhMjMgKiBiMDApICogZGV0O1xuICAgIG91dFsxMl0gPSAoYTExICogYjA3IC0gYTEwICogYjA5IC0gYTEyICogYjA2KSAqIGRldDtcbiAgICBvdXRbMTNdID0gKGEwMCAqIGIwOSAtIGEwMSAqIGIwNyArIGEwMiAqIGIwNikgKiBkZXQ7XG4gICAgb3V0WzE0XSA9IChhMzEgKiBiMDEgLSBhMzAgKiBiMDMgLSBhMzIgKiBiMDApICogZGV0O1xuICAgIG91dFsxNV0gPSAoYTIwICogYjAzIC0gYTIxICogYjAxICsgYTIyICogYjAwKSAqIGRldDtcbiAgICByZXR1cm4gb3V0O1xufVxuXG5cbmZ1bmN0aW9uIG11bHRpcGx5JDQob3V0LCBhLCBiKSB7XG4gICAgdmFyIGEwMCA9IGFbMF0sIGEwMSA9IGFbMV0sIGEwMiA9IGFbMl0sIGEwMyA9IGFbM10sXG4gICAgICAgIGExMCA9IGFbNF0sIGExMSA9IGFbNV0sIGExMiA9IGFbNl0sIGExMyA9IGFbN10sXG4gICAgICAgIGEyMCA9IGFbOF0sIGEyMSA9IGFbOV0sIGEyMiA9IGFbMTBdLCBhMjMgPSBhWzExXSxcbiAgICAgICAgYTMwID0gYVsxMl0sIGEzMSA9IGFbMTNdLCBhMzIgPSBhWzE0XSwgYTMzID0gYVsxNV07XG4gICAgdmFyIGIwICA9IGJbMF0sIGIxID0gYlsxXSwgYjIgPSBiWzJdLCBiMyA9IGJbM107XG4gICAgb3V0WzBdID0gYjAgKiBhMDAgKyBiMSAqIGExMCArIGIyICogYTIwICsgYjMgKiBhMzA7XG4gICAgb3V0WzFdID0gYjAgKiBhMDEgKyBiMSAqIGExMSArIGIyICogYTIxICsgYjMgKiBhMzE7XG4gICAgb3V0WzJdID0gYjAgKiBhMDIgKyBiMSAqIGExMiArIGIyICogYTIyICsgYjMgKiBhMzI7XG4gICAgb3V0WzNdID0gYjAgKiBhMDMgKyBiMSAqIGExMyArIGIyICogYTIzICsgYjMgKiBhMzM7XG4gICAgYjAgPSBiWzRdOyBiMSA9IGJbNV07IGIyID0gYls2XTsgYjMgPSBiWzddO1xuICAgIG91dFs0XSA9IGIwICogYTAwICsgYjEgKiBhMTAgKyBiMiAqIGEyMCArIGIzICogYTMwO1xuICAgIG91dFs1XSA9IGIwICogYTAxICsgYjEgKiBhMTEgKyBiMiAqIGEyMSArIGIzICogYTMxO1xuICAgIG91dFs2XSA9IGIwICogYTAyICsgYjEgKiBhMTIgKyBiMiAqIGEyMiArIGIzICogYTMyO1xuICAgIG91dFs3XSA9IGIwICogYTAzICsgYjEgKiBhMTMgKyBiMiAqIGEyMyArIGIzICogYTMzO1xuICAgIGIwID0gYls4XTsgYjEgPSBiWzldOyBiMiA9IGJbMTBdOyBiMyA9IGJbMTFdO1xuICAgIG91dFs4XSA9IGIwICogYTAwICsgYjEgKiBhMTAgKyBiMiAqIGEyMCArIGIzICogYTMwO1xuICAgIG91dFs5XSA9IGIwICogYTAxICsgYjEgKiBhMTEgKyBiMiAqIGEyMSArIGIzICogYTMxO1xuICAgIG91dFsxMF0gPSBiMCAqIGEwMiArIGIxICogYTEyICsgYjIgKiBhMjIgKyBiMyAqIGEzMjtcbiAgICBvdXRbMTFdID0gYjAgKiBhMDMgKyBiMSAqIGExMyArIGIyICogYTIzICsgYjMgKiBhMzM7XG4gICAgYjAgPSBiWzEyXTsgYjEgPSBiWzEzXTsgYjIgPSBiWzE0XTsgYjMgPSBiWzE1XTtcbiAgICBvdXRbMTJdID0gYjAgKiBhMDAgKyBiMSAqIGExMCArIGIyICogYTIwICsgYjMgKiBhMzA7XG4gICAgb3V0WzEzXSA9IGIwICogYTAxICsgYjEgKiBhMTEgKyBiMiAqIGEyMSArIGIzICogYTMxO1xuICAgIG91dFsxNF0gPSBiMCAqIGEwMiArIGIxICogYTEyICsgYjIgKiBhMjIgKyBiMyAqIGEzMjtcbiAgICBvdXRbMTVdID0gYjAgKiBhMDMgKyBiMSAqIGExMyArIGIyICogYTIzICsgYjMgKiBhMzM7XG4gICAgcmV0dXJuIG91dDtcbn1cbmZ1bmN0aW9uIHRyYW5zbGF0ZSQxKG91dCwgYSwgdikge1xuICAgIHZhciB4ID0gdlswXSwgeSA9IHZbMV0sIHogPSB2WzJdLFxuICAgICAgICBhMDAsIGEwMSwgYTAyLCBhMDMsXG4gICAgICAgIGExMCwgYTExLCBhMTIsIGExMyxcbiAgICAgICAgYTIwLCBhMjEsIGEyMiwgYTIzO1xuICAgIGlmIChhID09PSBvdXQpIHtcbiAgICAgICAgb3V0WzEyXSA9IGFbMF0gKiB4ICsgYVs0XSAqIHkgKyBhWzhdICogeiArIGFbMTJdO1xuICAgICAgICBvdXRbMTNdID0gYVsxXSAqIHggKyBhWzVdICogeSArIGFbOV0gKiB6ICsgYVsxM107XG4gICAgICAgIG91dFsxNF0gPSBhWzJdICogeCArIGFbNl0gKiB5ICsgYVsxMF0gKiB6ICsgYVsxNF07XG4gICAgICAgIG91dFsxNV0gPSBhWzNdICogeCArIGFbN10gKiB5ICsgYVsxMV0gKiB6ICsgYVsxNV07XG4gICAgfSBlbHNlIHtcbiAgICAgICAgYTAwID0gYVswXTsgYTAxID0gYVsxXTsgYTAyID0gYVsyXTsgYTAzID0gYVszXTtcbiAgICAgICAgYTEwID0gYVs0XTsgYTExID0gYVs1XTsgYTEyID0gYVs2XTsgYTEzID0gYVs3XTtcbiAgICAgICAgYTIwID0gYVs4XTsgYTIxID0gYVs5XTsgYTIyID0gYVsxMF07IGEyMyA9IGFbMTFdO1xuICAgICAgICBvdXRbMF0gPSBhMDA7IG91dFsxXSA9IGEwMTsgb3V0WzJdID0gYTAyOyBvdXRbM10gPSBhMDM7XG4gICAgICAgIG91dFs0XSA9IGExMDsgb3V0WzVdID0gYTExOyBvdXRbNl0gPSBhMTI7IG91dFs3XSA9IGExMztcbiAgICAgICAgb3V0WzhdID0gYTIwOyBvdXRbOV0gPSBhMjE7IG91dFsxMF0gPSBhMjI7IG91dFsxMV0gPSBhMjM7XG4gICAgICAgIG91dFsxMl0gPSBhMDAgKiB4ICsgYTEwICogeSArIGEyMCAqIHogKyBhWzEyXTtcbiAgICAgICAgb3V0WzEzXSA9IGEwMSAqIHggKyBhMTEgKiB5ICsgYTIxICogeiArIGFbMTNdO1xuICAgICAgICBvdXRbMTRdID0gYTAyICogeCArIGExMiAqIHkgKyBhMjIgKiB6ICsgYVsxNF07XG4gICAgICAgIG91dFsxNV0gPSBhMDMgKiB4ICsgYTEzICogeSArIGEyMyAqIHogKyBhWzE1XTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbn1cbmZ1bmN0aW9uIHNjYWxlJDQob3V0LCBhLCB2KSB7XG4gICAgdmFyIHggPSB2WzBdLCB5ID0gdlsxXSwgeiA9IHZbMl07XG4gICAgb3V0WzBdID0gYVswXSAqIHg7XG4gICAgb3V0WzFdID0gYVsxXSAqIHg7XG4gICAgb3V0WzJdID0gYVsyXSAqIHg7XG4gICAgb3V0WzNdID0gYVszXSAqIHg7XG4gICAgb3V0WzRdID0gYVs0XSAqIHk7XG4gICAgb3V0WzVdID0gYVs1XSAqIHk7XG4gICAgb3V0WzZdID0gYVs2XSAqIHk7XG4gICAgb3V0WzddID0gYVs3XSAqIHk7XG4gICAgb3V0WzhdID0gYVs4XSAqIHo7XG4gICAgb3V0WzldID0gYVs5XSAqIHo7XG4gICAgb3V0WzEwXSA9IGFbMTBdICogejtcbiAgICBvdXRbMTFdID0gYVsxMV0gKiB6O1xuICAgIG91dFsxMl0gPSBhWzEyXTtcbiAgICBvdXRbMTNdID0gYVsxM107XG4gICAgb3V0WzE0XSA9IGFbMTRdO1xuICAgIG91dFsxNV0gPSBhWzE1XTtcbiAgICByZXR1cm4gb3V0O1xufVxuXG5mdW5jdGlvbiByb3RhdGVYJDEob3V0LCBhLCByYWQpIHtcbiAgICB2YXIgcyA9IE1hdGguc2luKHJhZCksXG4gICAgICAgIGMgPSBNYXRoLmNvcyhyYWQpLFxuICAgICAgICBhMTAgPSBhWzRdLFxuICAgICAgICBhMTEgPSBhWzVdLFxuICAgICAgICBhMTIgPSBhWzZdLFxuICAgICAgICBhMTMgPSBhWzddLFxuICAgICAgICBhMjAgPSBhWzhdLFxuICAgICAgICBhMjEgPSBhWzldLFxuICAgICAgICBhMjIgPSBhWzEwXSxcbiAgICAgICAgYTIzID0gYVsxMV07XG4gICAgaWYgKGEgIT09IG91dCkge1xuICAgICAgICBvdXRbMF0gID0gYVswXTtcbiAgICAgICAgb3V0WzFdICA9IGFbMV07XG4gICAgICAgIG91dFsyXSAgPSBhWzJdO1xuICAgICAgICBvdXRbM10gID0gYVszXTtcbiAgICAgICAgb3V0WzEyXSA9IGFbMTJdO1xuICAgICAgICBvdXRbMTNdID0gYVsxM107XG4gICAgICAgIG91dFsxNF0gPSBhWzE0XTtcbiAgICAgICAgb3V0WzE1XSA9IGFbMTVdO1xuICAgIH1cbiAgICBvdXRbNF0gPSBhMTAgKiBjICsgYTIwICogcztcbiAgICBvdXRbNV0gPSBhMTEgKiBjICsgYTIxICogcztcbiAgICBvdXRbNl0gPSBhMTIgKiBjICsgYTIyICogcztcbiAgICBvdXRbN10gPSBhMTMgKiBjICsgYTIzICogcztcbiAgICBvdXRbOF0gPSBhMjAgKiBjIC0gYTEwICogcztcbiAgICBvdXRbOV0gPSBhMjEgKiBjIC0gYTExICogcztcbiAgICBvdXRbMTBdID0gYTIyICogYyAtIGExMiAqIHM7XG4gICAgb3V0WzExXSA9IGEyMyAqIGMgLSBhMTMgKiBzO1xuICAgIHJldHVybiBvdXQ7XG59XG5cbmZ1bmN0aW9uIHJvdGF0ZVokMShvdXQsIGEsIHJhZCkge1xuICAgIHZhciBzID0gTWF0aC5zaW4ocmFkKSxcbiAgICAgICAgYyA9IE1hdGguY29zKHJhZCksXG4gICAgICAgIGEwMCA9IGFbMF0sXG4gICAgICAgIGEwMSA9IGFbMV0sXG4gICAgICAgIGEwMiA9IGFbMl0sXG4gICAgICAgIGEwMyA9IGFbM10sXG4gICAgICAgIGExMCA9IGFbNF0sXG4gICAgICAgIGExMSA9IGFbNV0sXG4gICAgICAgIGExMiA9IGFbNl0sXG4gICAgICAgIGExMyA9IGFbN107XG4gICAgaWYgKGEgIT09IG91dCkge1xuICAgICAgICBvdXRbOF0gID0gYVs4XTtcbiAgICAgICAgb3V0WzldICA9IGFbOV07XG4gICAgICAgIG91dFsxMF0gPSBhWzEwXTtcbiAgICAgICAgb3V0WzExXSA9IGFbMTFdO1xuICAgICAgICBvdXRbMTJdID0gYVsxMl07XG4gICAgICAgIG91dFsxM10gPSBhWzEzXTtcbiAgICAgICAgb3V0WzE0XSA9IGFbMTRdO1xuICAgICAgICBvdXRbMTVdID0gYVsxNV07XG4gICAgfVxuICAgIG91dFswXSA9IGEwMCAqIGMgKyBhMTAgKiBzO1xuICAgIG91dFsxXSA9IGEwMSAqIGMgKyBhMTEgKiBzO1xuICAgIG91dFsyXSA9IGEwMiAqIGMgKyBhMTIgKiBzO1xuICAgIG91dFszXSA9IGEwMyAqIGMgKyBhMTMgKiBzO1xuICAgIG91dFs0XSA9IGExMCAqIGMgLSBhMDAgKiBzO1xuICAgIG91dFs1XSA9IGExMSAqIGMgLSBhMDEgKiBzO1xuICAgIG91dFs2XSA9IGExMiAqIGMgLSBhMDIgKiBzO1xuICAgIG91dFs3XSA9IGExMyAqIGMgLSBhMDMgKiBzO1xuICAgIHJldHVybiBvdXQ7XG59XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuZnVuY3Rpb24gcGVyc3BlY3RpdmUob3V0LCBmb3Z5LCBhc3BlY3QsIG5lYXIsIGZhcikge1xuICAgIHZhciBmID0gMS4wIC8gTWF0aC50YW4oZm92eSAvIDIpLFxuICAgICAgICBuZiA9IDEgLyAobmVhciAtIGZhcik7XG4gICAgb3V0WzBdID0gZiAvIGFzcGVjdDtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gICAgb3V0WzNdID0gMDtcbiAgICBvdXRbNF0gPSAwO1xuICAgIG91dFs1XSA9IGY7XG4gICAgb3V0WzZdID0gMDtcbiAgICBvdXRbN10gPSAwO1xuICAgIG91dFs4XSA9IDA7XG4gICAgb3V0WzldID0gMDtcbiAgICBvdXRbMTBdID0gKGZhciArIG5lYXIpICogbmY7XG4gICAgb3V0WzExXSA9IC0xO1xuICAgIG91dFsxMl0gPSAwO1xuICAgIG91dFsxM10gPSAwO1xuICAgIG91dFsxNF0gPSAoMiAqIGZhciAqIG5lYXIpICogbmY7XG4gICAgb3V0WzE1XSA9IDA7XG4gICAgcmV0dXJuIG91dDtcbn1cblxuZnVuY3Rpb24gb3J0aG8ob3V0LCBsZWZ0LCByaWdodCwgYm90dG9tLCB0b3AsIG5lYXIsIGZhcikge1xuICAgIHZhciBsciA9IDEgLyAobGVmdCAtIHJpZ2h0KSxcbiAgICAgICAgYnQgPSAxIC8gKGJvdHRvbSAtIHRvcCksXG4gICAgICAgIG5mID0gMSAvIChuZWFyIC0gZmFyKTtcbiAgICBvdXRbMF0gPSAtMiAqIGxyO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAwO1xuICAgIG91dFs0XSA9IDA7XG4gICAgb3V0WzVdID0gLTIgKiBidDtcbiAgICBvdXRbNl0gPSAwO1xuICAgIG91dFs3XSA9IDA7XG4gICAgb3V0WzhdID0gMDtcbiAgICBvdXRbOV0gPSAwO1xuICAgIG91dFsxMF0gPSAyICogbmY7XG4gICAgb3V0WzExXSA9IDA7XG4gICAgb3V0WzEyXSA9IChsZWZ0ICsgcmlnaHQpICogbHI7XG4gICAgb3V0WzEzXSA9ICh0b3AgKyBib3R0b20pICogYnQ7XG4gICAgb3V0WzE0XSA9IChmYXIgKyBuZWFyKSAqIG5mO1xuICAgIG91dFsxNV0gPSAxO1xuICAgIHJldHVybiBvdXQ7XG59XG5cbnZhciBtYXBib3hCdWlsZCA9IHtcbiAgICB2ZWMzOiB7XG4gICAgICAgIHRyYW5zZm9ybU1hdDM6IHRyYW5zZm9ybU1hdDNcbiAgICB9LFxuICAgIHZlYzQ6IHtcbiAgICAgICAgdHJhbnNmb3JtTWF0NDogdHJhbnNmb3JtTWF0NCQxXG4gICAgfSxcbiAgICBtYXQyOiB7XG4gICAgICAgIGNyZWF0ZTogY3JlYXRlJDIsXG4gICAgICAgIHJvdGF0ZTogcm90YXRlLFxuICAgICAgICBzY2FsZTogc2NhbGUkMlxuICAgIH0sXG4gICAgbWF0Mzoge1xuICAgICAgICBjcmVhdGU6IGNyZWF0ZSQzLFxuICAgICAgICBmcm9tUm90YXRpb246IGZyb21Sb3RhdGlvbiQxXG4gICAgfSxcbiAgICBtYXQ0OiB7XG4gICAgICAgIGNyZWF0ZTogY3JlYXRlJDQsXG4gICAgICAgIGlkZW50aXR5OiBpZGVudGl0eSQyLFxuICAgICAgICB0cmFuc2xhdGU6IHRyYW5zbGF0ZSQxLFxuICAgICAgICBzY2FsZTogc2NhbGUkNCxcbiAgICAgICAgbXVsdGlwbHk6IG11bHRpcGx5JDQsXG4gICAgICAgIHBlcnNwZWN0aXZlOiBwZXJzcGVjdGl2ZSxcbiAgICAgICAgcm90YXRlWDogcm90YXRlWCQxLFxuICAgICAgICByb3RhdGVaOiByb3RhdGVaJDEsXG4gICAgICAgIGludmVydDogaW52ZXJ0JDIsXG4gICAgICAgIG9ydGhvOiBvcnRob1xuICAgIH1cbn07XG5cbnJldHVybiBtYXBib3hCdWlsZDtcblxufSkpKTtcbiIsIi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMDggQXBwbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zXG4gKiBhcmUgbWV0OlxuICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0XG4gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlXG4gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuICpcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWVxuICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUlxuICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1JcbiAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLFxuICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLFxuICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SXG4gKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZXG4gKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRVxuICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqXG4gKiBQb3J0ZWQgZnJvbSBXZWJraXRcbiAqIGh0dHA6Ly9zdm4ud2Via2l0Lm9yZy9yZXBvc2l0b3J5L3dlYmtpdC90cnVuay9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Vbml0QmV6aWVyLmhcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IFVuaXRCZXppZXI7XG5cbmZ1bmN0aW9uIFVuaXRCZXppZXIocDF4LCBwMXksIHAyeCwgcDJ5KSB7XG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBwb2x5bm9taWFsIGNvZWZmaWNpZW50cywgaW1wbGljaXQgZmlyc3QgYW5kIGxhc3QgY29udHJvbCBwb2ludHMgYXJlICgwLDApIGFuZCAoMSwxKS5cbiAgICB0aGlzLmN4ID0gMy4wICogcDF4O1xuICAgIHRoaXMuYnggPSAzLjAgKiAocDJ4IC0gcDF4KSAtIHRoaXMuY3g7XG4gICAgdGhpcy5heCA9IDEuMCAtIHRoaXMuY3ggLSB0aGlzLmJ4O1xuXG4gICAgdGhpcy5jeSA9IDMuMCAqIHAxeTtcbiAgICB0aGlzLmJ5ID0gMy4wICogKHAyeSAtIHAxeSkgLSB0aGlzLmN5O1xuICAgIHRoaXMuYXkgPSAxLjAgLSB0aGlzLmN5IC0gdGhpcy5ieTtcblxuICAgIHRoaXMucDF4ID0gcDF4O1xuICAgIHRoaXMucDF5ID0gcDJ5O1xuICAgIHRoaXMucDJ4ID0gcDJ4O1xuICAgIHRoaXMucDJ5ID0gcDJ5O1xufVxuXG5Vbml0QmV6aWVyLnByb3RvdHlwZS5zYW1wbGVDdXJ2ZVggPSBmdW5jdGlvbih0KSB7XG4gICAgLy8gYGF4IHReMyArIGJ4IHReMiArIGN4IHQnIGV4cGFuZGVkIHVzaW5nIEhvcm5lcidzIHJ1bGUuXG4gICAgcmV0dXJuICgodGhpcy5heCAqIHQgKyB0aGlzLmJ4KSAqIHQgKyB0aGlzLmN4KSAqIHQ7XG59O1xuXG5Vbml0QmV6aWVyLnByb3RvdHlwZS5zYW1wbGVDdXJ2ZVkgPSBmdW5jdGlvbih0KSB7XG4gICAgcmV0dXJuICgodGhpcy5heSAqIHQgKyB0aGlzLmJ5KSAqIHQgKyB0aGlzLmN5KSAqIHQ7XG59O1xuXG5Vbml0QmV6aWVyLnByb3RvdHlwZS5zYW1wbGVDdXJ2ZURlcml2YXRpdmVYID0gZnVuY3Rpb24odCkge1xuICAgIHJldHVybiAoMy4wICogdGhpcy5heCAqIHQgKyAyLjAgKiB0aGlzLmJ4KSAqIHQgKyB0aGlzLmN4O1xufTtcblxuVW5pdEJlemllci5wcm90b3R5cGUuc29sdmVDdXJ2ZVggPSBmdW5jdGlvbih4LCBlcHNpbG9uKSB7XG4gICAgaWYgKHR5cGVvZiBlcHNpbG9uID09PSAndW5kZWZpbmVkJykgZXBzaWxvbiA9IDFlLTY7XG5cbiAgICB2YXIgdDAsIHQxLCB0MiwgeDIsIGk7XG5cbiAgICAvLyBGaXJzdCB0cnkgYSBmZXcgaXRlcmF0aW9ucyBvZiBOZXd0b24ncyBtZXRob2QgLS0gbm9ybWFsbHkgdmVyeSBmYXN0LlxuICAgIGZvciAodDIgPSB4LCBpID0gMDsgaSA8IDg7IGkrKykge1xuXG4gICAgICAgIHgyID0gdGhpcy5zYW1wbGVDdXJ2ZVgodDIpIC0geDtcbiAgICAgICAgaWYgKE1hdGguYWJzKHgyKSA8IGVwc2lsb24pIHJldHVybiB0MjtcblxuICAgICAgICB2YXIgZDIgPSB0aGlzLnNhbXBsZUN1cnZlRGVyaXZhdGl2ZVgodDIpO1xuICAgICAgICBpZiAoTWF0aC5hYnMoZDIpIDwgMWUtNikgYnJlYWs7XG5cbiAgICAgICAgdDIgPSB0MiAtIHgyIC8gZDI7XG4gICAgfVxuXG4gICAgLy8gRmFsbCBiYWNrIHRvIHRoZSBiaXNlY3Rpb24gbWV0aG9kIGZvciByZWxpYWJpbGl0eS5cbiAgICB0MCA9IDAuMDtcbiAgICB0MSA9IDEuMDtcbiAgICB0MiA9IHg7XG5cbiAgICBpZiAodDIgPCB0MCkgcmV0dXJuIHQwO1xuICAgIGlmICh0MiA+IHQxKSByZXR1cm4gdDE7XG5cbiAgICB3aGlsZSAodDAgPCB0MSkge1xuXG4gICAgICAgIHgyID0gdGhpcy5zYW1wbGVDdXJ2ZVgodDIpO1xuICAgICAgICBpZiAoTWF0aC5hYnMoeDIgLSB4KSA8IGVwc2lsb24pIHJldHVybiB0MjtcblxuICAgICAgICBpZiAoeCA+IHgyKSB7XG4gICAgICAgICAgICB0MCA9IHQyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdDEgPSB0MjtcbiAgICAgICAgfVxuXG4gICAgICAgIHQyID0gKHQxIC0gdDApICogMC41ICsgdDA7XG4gICAgfVxuXG4gICAgLy8gRmFpbHVyZS5cbiAgICByZXR1cm4gdDI7XG59O1xuXG5Vbml0QmV6aWVyLnByb3RvdHlwZS5zb2x2ZSA9IGZ1bmN0aW9uKHgsIGVwc2lsb24pIHtcbiAgICByZXR1cm4gdGhpcy5zYW1wbGVDdXJ2ZVkodGhpcy5zb2x2ZUN1cnZlWCh4LCBlcHNpbG9uKSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyBjb21wYXJlIGFuZCBpc0J1ZmZlciB0YWtlbiBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyL2Jsb2IvNjgwZTllNWU0ODhmMjJhYWMyNzU5OWE1N2RjODQ0YTYzMTU5MjhkZC9pbmRleC5qc1xuLy8gb3JpZ2luYWwgbm90aWNlOlxuXG4vKiFcbiAqIFRoZSBidWZmZXIgbW9kdWxlIGZyb20gbm9kZS5qcywgZm9yIHRoZSBicm93c2VyLlxuICpcbiAqIEBhdXRob3IgICBGZXJvc3MgQWJvdWtoYWRpamVoIDxmZXJvc3NAZmVyb3NzLm9yZz4gPGh0dHA6Ly9mZXJvc3Mub3JnPlxuICogQGxpY2Vuc2UgIE1JVFxuICovXG5mdW5jdGlvbiBjb21wYXJlKGEsIGIpIHtcbiAgaWYgKGEgPT09IGIpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHZhciB4ID0gYS5sZW5ndGg7XG4gIHZhciB5ID0gYi5sZW5ndGg7XG5cbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IE1hdGgubWluKHgsIHkpOyBpIDwgbGVuOyArK2kpIHtcbiAgICBpZiAoYVtpXSAhPT0gYltpXSkge1xuICAgICAgeCA9IGFbaV07XG4gICAgICB5ID0gYltpXTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGlmICh4IDwgeSkge1xuICAgIHJldHVybiAtMTtcbiAgfVxuICBpZiAoeSA8IHgpIHtcbiAgICByZXR1cm4gMTtcbiAgfVxuICByZXR1cm4gMDtcbn1cbmZ1bmN0aW9uIGlzQnVmZmVyKGIpIHtcbiAgaWYgKGdsb2JhbC5CdWZmZXIgJiYgdHlwZW9mIGdsb2JhbC5CdWZmZXIuaXNCdWZmZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZ2xvYmFsLkJ1ZmZlci5pc0J1ZmZlcihiKTtcbiAgfVxuICByZXR1cm4gISEoYiAhPSBudWxsICYmIGIuX2lzQnVmZmVyKTtcbn1cblxuLy8gYmFzZWQgb24gbm9kZSBhc3NlcnQsIG9yaWdpbmFsIG5vdGljZTpcblxuLy8gaHR0cDovL3dpa2kuY29tbW9uanMub3JnL3dpa2kvVW5pdF9UZXN0aW5nLzEuMFxuLy9cbi8vIFRISVMgSVMgTk9UIFRFU1RFRCBOT1IgTElLRUxZIFRPIFdPUksgT1VUU0lERSBWOCFcbi8vXG4vLyBPcmlnaW5hbGx5IGZyb20gbmFyd2hhbC5qcyAoaHR0cDovL25hcndoYWxqcy5vcmcpXG4vLyBDb3B5cmlnaHQgKGMpIDIwMDkgVGhvbWFzIFJvYmluc29uIDwyODBub3J0aC5jb20+XG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgJ1NvZnR3YXJlJyksIHRvXG4vLyBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZVxuLy8gcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yXG4vLyBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICdBUyBJUycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTlxuLy8gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTlxuLy8gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbnZhciB1dGlsID0gcmVxdWlyZSgndXRpbC8nKTtcbnZhciBoYXNPd24gPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIHBTbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTtcbnZhciBmdW5jdGlvbnNIYXZlTmFtZXMgPSAoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZnVuY3Rpb24gZm9vKCkge30ubmFtZSA9PT0gJ2Zvbyc7XG59KCkpO1xuZnVuY3Rpb24gcFRvU3RyaW5nIChvYmopIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopO1xufVxuZnVuY3Rpb24gaXNWaWV3KGFycmJ1Zikge1xuICBpZiAoaXNCdWZmZXIoYXJyYnVmKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAodHlwZW9mIGdsb2JhbC5BcnJheUJ1ZmZlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAodHlwZW9mIEFycmF5QnVmZmVyLmlzVmlldyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBBcnJheUJ1ZmZlci5pc1ZpZXcoYXJyYnVmKTtcbiAgfVxuICBpZiAoIWFycmJ1Zikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoYXJyYnVmIGluc3RhbmNlb2YgRGF0YVZpZXcpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoYXJyYnVmLmJ1ZmZlciAmJiBhcnJidWYuYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG4vLyAxLiBUaGUgYXNzZXJ0IG1vZHVsZSBwcm92aWRlcyBmdW5jdGlvbnMgdGhhdCB0aHJvd1xuLy8gQXNzZXJ0aW9uRXJyb3IncyB3aGVuIHBhcnRpY3VsYXIgY29uZGl0aW9ucyBhcmUgbm90IG1ldC4gVGhlXG4vLyBhc3NlcnQgbW9kdWxlIG11c3QgY29uZm9ybSB0byB0aGUgZm9sbG93aW5nIGludGVyZmFjZS5cblxudmFyIGFzc2VydCA9IG1vZHVsZS5leHBvcnRzID0gb2s7XG5cbi8vIDIuIFRoZSBBc3NlcnRpb25FcnJvciBpcyBkZWZpbmVkIGluIGFzc2VydC5cbi8vIG5ldyBhc3NlcnQuQXNzZXJ0aW9uRXJyb3IoeyBtZXNzYWdlOiBtZXNzYWdlLFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbDogYWN0dWFsLFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBleHBlY3RlZCB9KVxuXG52YXIgcmVnZXggPSAvXFxzKmZ1bmN0aW9uXFxzKyhbXlxcKFxcc10qKVxccyovO1xuLy8gYmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL2xqaGFyYi9mdW5jdGlvbi5wcm90b3R5cGUubmFtZS9ibG9iL2FkZWVlZWM4YmZjYzYwNjhiMTg3ZDdkOWZiM2Q1YmIxZDNhMzA4OTkvaW1wbGVtZW50YXRpb24uanNcbmZ1bmN0aW9uIGdldE5hbWUoZnVuYykge1xuICBpZiAoIXV0aWwuaXNGdW5jdGlvbihmdW5jKSkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoZnVuY3Rpb25zSGF2ZU5hbWVzKSB7XG4gICAgcmV0dXJuIGZ1bmMubmFtZTtcbiAgfVxuICB2YXIgc3RyID0gZnVuYy50b1N0cmluZygpO1xuICB2YXIgbWF0Y2ggPSBzdHIubWF0Y2gocmVnZXgpO1xuICByZXR1cm4gbWF0Y2ggJiYgbWF0Y2hbMV07XG59XG5hc3NlcnQuQXNzZXJ0aW9uRXJyb3IgPSBmdW5jdGlvbiBBc3NlcnRpb25FcnJvcihvcHRpb25zKSB7XG4gIHRoaXMubmFtZSA9ICdBc3NlcnRpb25FcnJvcic7XG4gIHRoaXMuYWN0dWFsID0gb3B0aW9ucy5hY3R1YWw7XG4gIHRoaXMuZXhwZWN0ZWQgPSBvcHRpb25zLmV4cGVjdGVkO1xuICB0aGlzLm9wZXJhdG9yID0gb3B0aW9ucy5vcGVyYXRvcjtcbiAgaWYgKG9wdGlvbnMubWVzc2FnZSkge1xuICAgIHRoaXMubWVzc2FnZSA9IG9wdGlvbnMubWVzc2FnZTtcbiAgICB0aGlzLmdlbmVyYXRlZE1lc3NhZ2UgPSBmYWxzZTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLm1lc3NhZ2UgPSBnZXRNZXNzYWdlKHRoaXMpO1xuICAgIHRoaXMuZ2VuZXJhdGVkTWVzc2FnZSA9IHRydWU7XG4gIH1cbiAgdmFyIHN0YWNrU3RhcnRGdW5jdGlvbiA9IG9wdGlvbnMuc3RhY2tTdGFydEZ1bmN0aW9uIHx8IGZhaWw7XG4gIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkge1xuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHN0YWNrU3RhcnRGdW5jdGlvbik7XG4gIH0gZWxzZSB7XG4gICAgLy8gbm9uIHY4IGJyb3dzZXJzIHNvIHdlIGNhbiBoYXZlIGEgc3RhY2t0cmFjZVxuICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoKTtcbiAgICBpZiAoZXJyLnN0YWNrKSB7XG4gICAgICB2YXIgb3V0ID0gZXJyLnN0YWNrO1xuXG4gICAgICAvLyB0cnkgdG8gc3RyaXAgdXNlbGVzcyBmcmFtZXNcbiAgICAgIHZhciBmbl9uYW1lID0gZ2V0TmFtZShzdGFja1N0YXJ0RnVuY3Rpb24pO1xuICAgICAgdmFyIGlkeCA9IG91dC5pbmRleE9mKCdcXG4nICsgZm5fbmFtZSk7XG4gICAgICBpZiAoaWR4ID49IDApIHtcbiAgICAgICAgLy8gb25jZSB3ZSBoYXZlIGxvY2F0ZWQgdGhlIGZ1bmN0aW9uIGZyYW1lXG4gICAgICAgIC8vIHdlIG5lZWQgdG8gc3RyaXAgb3V0IGV2ZXJ5dGhpbmcgYmVmb3JlIGl0IChhbmQgaXRzIGxpbmUpXG4gICAgICAgIHZhciBuZXh0X2xpbmUgPSBvdXQuaW5kZXhPZignXFxuJywgaWR4ICsgMSk7XG4gICAgICAgIG91dCA9IG91dC5zdWJzdHJpbmcobmV4dF9saW5lICsgMSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc3RhY2sgPSBvdXQ7XG4gICAgfVxuICB9XG59O1xuXG4vLyBhc3NlcnQuQXNzZXJ0aW9uRXJyb3IgaW5zdGFuY2VvZiBFcnJvclxudXRpbC5pbmhlcml0cyhhc3NlcnQuQXNzZXJ0aW9uRXJyb3IsIEVycm9yKTtcblxuZnVuY3Rpb24gdHJ1bmNhdGUocywgbikge1xuICBpZiAodHlwZW9mIHMgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHMubGVuZ3RoIDwgbiA/IHMgOiBzLnNsaWNlKDAsIG4pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBzO1xuICB9XG59XG5mdW5jdGlvbiBpbnNwZWN0KHNvbWV0aGluZykge1xuICBpZiAoZnVuY3Rpb25zSGF2ZU5hbWVzIHx8ICF1dGlsLmlzRnVuY3Rpb24oc29tZXRoaW5nKSkge1xuICAgIHJldHVybiB1dGlsLmluc3BlY3Qoc29tZXRoaW5nKTtcbiAgfVxuICB2YXIgcmF3bmFtZSA9IGdldE5hbWUoc29tZXRoaW5nKTtcbiAgdmFyIG5hbWUgPSByYXduYW1lID8gJzogJyArIHJhd25hbWUgOiAnJztcbiAgcmV0dXJuICdbRnVuY3Rpb24nICsgIG5hbWUgKyAnXSc7XG59XG5mdW5jdGlvbiBnZXRNZXNzYWdlKHNlbGYpIHtcbiAgcmV0dXJuIHRydW5jYXRlKGluc3BlY3Qoc2VsZi5hY3R1YWwpLCAxMjgpICsgJyAnICtcbiAgICAgICAgIHNlbGYub3BlcmF0b3IgKyAnICcgK1xuICAgICAgICAgdHJ1bmNhdGUoaW5zcGVjdChzZWxmLmV4cGVjdGVkKSwgMTI4KTtcbn1cblxuLy8gQXQgcHJlc2VudCBvbmx5IHRoZSB0aHJlZSBrZXlzIG1lbnRpb25lZCBhYm92ZSBhcmUgdXNlZCBhbmRcbi8vIHVuZGVyc3Rvb2QgYnkgdGhlIHNwZWMuIEltcGxlbWVudGF0aW9ucyBvciBzdWIgbW9kdWxlcyBjYW4gcGFzc1xuLy8gb3RoZXIga2V5cyB0byB0aGUgQXNzZXJ0aW9uRXJyb3IncyBjb25zdHJ1Y3RvciAtIHRoZXkgd2lsbCBiZVxuLy8gaWdub3JlZC5cblxuLy8gMy4gQWxsIG9mIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIG11c3QgdGhyb3cgYW4gQXNzZXJ0aW9uRXJyb3Jcbi8vIHdoZW4gYSBjb3JyZXNwb25kaW5nIGNvbmRpdGlvbiBpcyBub3QgbWV0LCB3aXRoIGEgbWVzc2FnZSB0aGF0XG4vLyBtYXkgYmUgdW5kZWZpbmVkIGlmIG5vdCBwcm92aWRlZC4gIEFsbCBhc3NlcnRpb24gbWV0aG9kcyBwcm92aWRlXG4vLyBib3RoIHRoZSBhY3R1YWwgYW5kIGV4cGVjdGVkIHZhbHVlcyB0byB0aGUgYXNzZXJ0aW9uIGVycm9yIGZvclxuLy8gZGlzcGxheSBwdXJwb3Nlcy5cblxuZnVuY3Rpb24gZmFpbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCBvcGVyYXRvciwgc3RhY2tTdGFydEZ1bmN0aW9uKSB7XG4gIHRocm93IG5ldyBhc3NlcnQuQXNzZXJ0aW9uRXJyb3Ioe1xuICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgYWN0dWFsOiBhY3R1YWwsXG4gICAgZXhwZWN0ZWQ6IGV4cGVjdGVkLFxuICAgIG9wZXJhdG9yOiBvcGVyYXRvcixcbiAgICBzdGFja1N0YXJ0RnVuY3Rpb246IHN0YWNrU3RhcnRGdW5jdGlvblxuICB9KTtcbn1cblxuLy8gRVhURU5TSU9OISBhbGxvd3MgZm9yIHdlbGwgYmVoYXZlZCBlcnJvcnMgZGVmaW5lZCBlbHNld2hlcmUuXG5hc3NlcnQuZmFpbCA9IGZhaWw7XG5cbi8vIDQuIFB1cmUgYXNzZXJ0aW9uIHRlc3RzIHdoZXRoZXIgYSB2YWx1ZSBpcyB0cnV0aHksIGFzIGRldGVybWluZWRcbi8vIGJ5ICEhZ3VhcmQuXG4vLyBhc3NlcnQub2soZ3VhcmQsIG1lc3NhZ2Vfb3B0KTtcbi8vIFRoaXMgc3RhdGVtZW50IGlzIGVxdWl2YWxlbnQgdG8gYXNzZXJ0LmVxdWFsKHRydWUsICEhZ3VhcmQsXG4vLyBtZXNzYWdlX29wdCk7LiBUbyB0ZXN0IHN0cmljdGx5IGZvciB0aGUgdmFsdWUgdHJ1ZSwgdXNlXG4vLyBhc3NlcnQuc3RyaWN0RXF1YWwodHJ1ZSwgZ3VhcmQsIG1lc3NhZ2Vfb3B0KTsuXG5cbmZ1bmN0aW9uIG9rKHZhbHVlLCBtZXNzYWdlKSB7XG4gIGlmICghdmFsdWUpIGZhaWwodmFsdWUsIHRydWUsIG1lc3NhZ2UsICc9PScsIGFzc2VydC5vayk7XG59XG5hc3NlcnQub2sgPSBvaztcblxuLy8gNS4gVGhlIGVxdWFsaXR5IGFzc2VydGlvbiB0ZXN0cyBzaGFsbG93LCBjb2VyY2l2ZSBlcXVhbGl0eSB3aXRoXG4vLyA9PS5cbi8vIGFzc2VydC5lcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlX29wdCk7XG5cbmFzc2VydC5lcXVhbCA9IGZ1bmN0aW9uIGVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpIHtcbiAgaWYgKGFjdHVhbCAhPSBleHBlY3RlZCkgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCAnPT0nLCBhc3NlcnQuZXF1YWwpO1xufTtcblxuLy8gNi4gVGhlIG5vbi1lcXVhbGl0eSBhc3NlcnRpb24gdGVzdHMgZm9yIHdoZXRoZXIgdHdvIG9iamVjdHMgYXJlIG5vdCBlcXVhbFxuLy8gd2l0aCAhPSBhc3NlcnQubm90RXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZV9vcHQpO1xuXG5hc3NlcnQubm90RXF1YWwgPSBmdW5jdGlvbiBub3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKSB7XG4gIGlmIChhY3R1YWwgPT0gZXhwZWN0ZWQpIHtcbiAgICBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsICchPScsIGFzc2VydC5ub3RFcXVhbCk7XG4gIH1cbn07XG5cbi8vIDcuIFRoZSBlcXVpdmFsZW5jZSBhc3NlcnRpb24gdGVzdHMgYSBkZWVwIGVxdWFsaXR5IHJlbGF0aW9uLlxuLy8gYXNzZXJ0LmRlZXBFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlX29wdCk7XG5cbmFzc2VydC5kZWVwRXF1YWwgPSBmdW5jdGlvbiBkZWVwRXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkge1xuICBpZiAoIV9kZWVwRXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgZmFsc2UpKSB7XG4gICAgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCAnZGVlcEVxdWFsJywgYXNzZXJ0LmRlZXBFcXVhbCk7XG4gIH1cbn07XG5cbmFzc2VydC5kZWVwU3RyaWN0RXF1YWwgPSBmdW5jdGlvbiBkZWVwU3RyaWN0RXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkge1xuICBpZiAoIV9kZWVwRXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgdHJ1ZSkpIHtcbiAgICBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsICdkZWVwU3RyaWN0RXF1YWwnLCBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gX2RlZXBFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBzdHJpY3QsIG1lbW9zKSB7XG4gIC8vIDcuMS4gQWxsIGlkZW50aWNhbCB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQsIGFzIGRldGVybWluZWQgYnkgPT09LlxuICBpZiAoYWN0dWFsID09PSBleHBlY3RlZCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2UgaWYgKGlzQnVmZmVyKGFjdHVhbCkgJiYgaXNCdWZmZXIoZXhwZWN0ZWQpKSB7XG4gICAgcmV0dXJuIGNvbXBhcmUoYWN0dWFsLCBleHBlY3RlZCkgPT09IDA7XG5cbiAgLy8gNy4yLiBJZiB0aGUgZXhwZWN0ZWQgdmFsdWUgaXMgYSBEYXRlIG9iamVjdCwgdGhlIGFjdHVhbCB2YWx1ZSBpc1xuICAvLyBlcXVpdmFsZW50IGlmIGl0IGlzIGFsc28gYSBEYXRlIG9iamVjdCB0aGF0IHJlZmVycyB0byB0aGUgc2FtZSB0aW1lLlxuICB9IGVsc2UgaWYgKHV0aWwuaXNEYXRlKGFjdHVhbCkgJiYgdXRpbC5pc0RhdGUoZXhwZWN0ZWQpKSB7XG4gICAgcmV0dXJuIGFjdHVhbC5nZXRUaW1lKCkgPT09IGV4cGVjdGVkLmdldFRpbWUoKTtcblxuICAvLyA3LjMgSWYgdGhlIGV4cGVjdGVkIHZhbHVlIGlzIGEgUmVnRXhwIG9iamVjdCwgdGhlIGFjdHVhbCB2YWx1ZSBpc1xuICAvLyBlcXVpdmFsZW50IGlmIGl0IGlzIGFsc28gYSBSZWdFeHAgb2JqZWN0IHdpdGggdGhlIHNhbWUgc291cmNlIGFuZFxuICAvLyBwcm9wZXJ0aWVzIChgZ2xvYmFsYCwgYG11bHRpbGluZWAsIGBsYXN0SW5kZXhgLCBgaWdub3JlQ2FzZWApLlxuICB9IGVsc2UgaWYgKHV0aWwuaXNSZWdFeHAoYWN0dWFsKSAmJiB1dGlsLmlzUmVnRXhwKGV4cGVjdGVkKSkge1xuICAgIHJldHVybiBhY3R1YWwuc291cmNlID09PSBleHBlY3RlZC5zb3VyY2UgJiZcbiAgICAgICAgICAgYWN0dWFsLmdsb2JhbCA9PT0gZXhwZWN0ZWQuZ2xvYmFsICYmXG4gICAgICAgICAgIGFjdHVhbC5tdWx0aWxpbmUgPT09IGV4cGVjdGVkLm11bHRpbGluZSAmJlxuICAgICAgICAgICBhY3R1YWwubGFzdEluZGV4ID09PSBleHBlY3RlZC5sYXN0SW5kZXggJiZcbiAgICAgICAgICAgYWN0dWFsLmlnbm9yZUNhc2UgPT09IGV4cGVjdGVkLmlnbm9yZUNhc2U7XG5cbiAgLy8gNy40LiBPdGhlciBwYWlycyB0aGF0IGRvIG5vdCBib3RoIHBhc3MgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnLFxuICAvLyBlcXVpdmFsZW5jZSBpcyBkZXRlcm1pbmVkIGJ5ID09LlxuICB9IGVsc2UgaWYgKChhY3R1YWwgPT09IG51bGwgfHwgdHlwZW9mIGFjdHVhbCAhPT0gJ29iamVjdCcpICYmXG4gICAgICAgICAgICAgKGV4cGVjdGVkID09PSBudWxsIHx8IHR5cGVvZiBleHBlY3RlZCAhPT0gJ29iamVjdCcpKSB7XG4gICAgcmV0dXJuIHN0cmljdCA/IGFjdHVhbCA9PT0gZXhwZWN0ZWQgOiBhY3R1YWwgPT0gZXhwZWN0ZWQ7XG5cbiAgLy8gSWYgYm90aCB2YWx1ZXMgYXJlIGluc3RhbmNlcyBvZiB0eXBlZCBhcnJheXMsIHdyYXAgdGhlaXIgdW5kZXJseWluZ1xuICAvLyBBcnJheUJ1ZmZlcnMgaW4gYSBCdWZmZXIgZWFjaCB0byBpbmNyZWFzZSBwZXJmb3JtYW5jZVxuICAvLyBUaGlzIG9wdGltaXphdGlvbiByZXF1aXJlcyB0aGUgYXJyYXlzIHRvIGhhdmUgdGhlIHNhbWUgdHlwZSBhcyBjaGVja2VkIGJ5XG4gIC8vIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcgKGFrYSBwVG9TdHJpbmcpLiBOZXZlciBwZXJmb3JtIGJpbmFyeVxuICAvLyBjb21wYXJpc29ucyBmb3IgRmxvYXQqQXJyYXlzLCB0aG91Z2gsIHNpbmNlIGUuZy4gKzAgPT09IC0wIGJ1dCB0aGVpclxuICAvLyBiaXQgcGF0dGVybnMgYXJlIG5vdCBpZGVudGljYWwuXG4gIH0gZWxzZSBpZiAoaXNWaWV3KGFjdHVhbCkgJiYgaXNWaWV3KGV4cGVjdGVkKSAmJlxuICAgICAgICAgICAgIHBUb1N0cmluZyhhY3R1YWwpID09PSBwVG9TdHJpbmcoZXhwZWN0ZWQpICYmXG4gICAgICAgICAgICAgIShhY3R1YWwgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkgfHxcbiAgICAgICAgICAgICAgIGFjdHVhbCBpbnN0YW5jZW9mIEZsb2F0NjRBcnJheSkpIHtcbiAgICByZXR1cm4gY29tcGFyZShuZXcgVWludDhBcnJheShhY3R1YWwuYnVmZmVyKSxcbiAgICAgICAgICAgICAgICAgICBuZXcgVWludDhBcnJheShleHBlY3RlZC5idWZmZXIpKSA9PT0gMDtcblxuICAvLyA3LjUgRm9yIGFsbCBvdGhlciBPYmplY3QgcGFpcnMsIGluY2x1ZGluZyBBcnJheSBvYmplY3RzLCBlcXVpdmFsZW5jZSBpc1xuICAvLyBkZXRlcm1pbmVkIGJ5IGhhdmluZyB0aGUgc2FtZSBudW1iZXIgb2Ygb3duZWQgcHJvcGVydGllcyAoYXMgdmVyaWZpZWRcbiAgLy8gd2l0aCBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwpLCB0aGUgc2FtZSBzZXQgb2Yga2V5c1xuICAvLyAoYWx0aG91Z2ggbm90IG5lY2Vzc2FyaWx5IHRoZSBzYW1lIG9yZGVyKSwgZXF1aXZhbGVudCB2YWx1ZXMgZm9yIGV2ZXJ5XG4gIC8vIGNvcnJlc3BvbmRpbmcga2V5LCBhbmQgYW4gaWRlbnRpY2FsICdwcm90b3R5cGUnIHByb3BlcnR5LiBOb3RlOiB0aGlzXG4gIC8vIGFjY291bnRzIGZvciBib3RoIG5hbWVkIGFuZCBpbmRleGVkIHByb3BlcnRpZXMgb24gQXJyYXlzLlxuICB9IGVsc2UgaWYgKGlzQnVmZmVyKGFjdHVhbCkgIT09IGlzQnVmZmVyKGV4cGVjdGVkKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBlbHNlIHtcbiAgICBtZW1vcyA9IG1lbW9zIHx8IHthY3R1YWw6IFtdLCBleHBlY3RlZDogW119O1xuXG4gICAgdmFyIGFjdHVhbEluZGV4ID0gbWVtb3MuYWN0dWFsLmluZGV4T2YoYWN0dWFsKTtcbiAgICBpZiAoYWN0dWFsSW5kZXggIT09IC0xKSB7XG4gICAgICBpZiAoYWN0dWFsSW5kZXggPT09IG1lbW9zLmV4cGVjdGVkLmluZGV4T2YoZXhwZWN0ZWQpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIG1lbW9zLmFjdHVhbC5wdXNoKGFjdHVhbCk7XG4gICAgbWVtb3MuZXhwZWN0ZWQucHVzaChleHBlY3RlZCk7XG5cbiAgICByZXR1cm4gb2JqRXF1aXYoYWN0dWFsLCBleHBlY3RlZCwgc3RyaWN0LCBtZW1vcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNBcmd1bWVudHMob2JqZWN0KSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqZWN0KSA9PSAnW29iamVjdCBBcmd1bWVudHNdJztcbn1cblxuZnVuY3Rpb24gb2JqRXF1aXYoYSwgYiwgc3RyaWN0LCBhY3R1YWxWaXNpdGVkT2JqZWN0cykge1xuICBpZiAoYSA9PT0gbnVsbCB8fCBhID09PSB1bmRlZmluZWQgfHwgYiA9PT0gbnVsbCB8fCBiID09PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIGZhbHNlO1xuICAvLyBpZiBvbmUgaXMgYSBwcmltaXRpdmUsIHRoZSBvdGhlciBtdXN0IGJlIHNhbWVcbiAgaWYgKHV0aWwuaXNQcmltaXRpdmUoYSkgfHwgdXRpbC5pc1ByaW1pdGl2ZShiKSlcbiAgICByZXR1cm4gYSA9PT0gYjtcbiAgaWYgKHN0cmljdCAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoYSkgIT09IE9iamVjdC5nZXRQcm90b3R5cGVPZihiKSlcbiAgICByZXR1cm4gZmFsc2U7XG4gIHZhciBhSXNBcmdzID0gaXNBcmd1bWVudHMoYSk7XG4gIHZhciBiSXNBcmdzID0gaXNBcmd1bWVudHMoYik7XG4gIGlmICgoYUlzQXJncyAmJiAhYklzQXJncykgfHwgKCFhSXNBcmdzICYmIGJJc0FyZ3MpKVxuICAgIHJldHVybiBmYWxzZTtcbiAgaWYgKGFJc0FyZ3MpIHtcbiAgICBhID0gcFNsaWNlLmNhbGwoYSk7XG4gICAgYiA9IHBTbGljZS5jYWxsKGIpO1xuICAgIHJldHVybiBfZGVlcEVxdWFsKGEsIGIsIHN0cmljdCk7XG4gIH1cbiAgdmFyIGthID0gb2JqZWN0S2V5cyhhKTtcbiAgdmFyIGtiID0gb2JqZWN0S2V5cyhiKTtcbiAgdmFyIGtleSwgaTtcbiAgLy8gaGF2aW5nIHRoZSBzYW1lIG51bWJlciBvZiBvd25lZCBwcm9wZXJ0aWVzIChrZXlzIGluY29ycG9yYXRlc1xuICAvLyBoYXNPd25Qcm9wZXJ0eSlcbiAgaWYgKGthLmxlbmd0aCAhPT0ga2IubGVuZ3RoKVxuICAgIHJldHVybiBmYWxzZTtcbiAgLy90aGUgc2FtZSBzZXQgb2Yga2V5cyAoYWx0aG91Z2ggbm90IG5lY2Vzc2FyaWx5IHRoZSBzYW1lIG9yZGVyKSxcbiAga2Euc29ydCgpO1xuICBrYi5zb3J0KCk7XG4gIC8vfn5+Y2hlYXAga2V5IHRlc3RcbiAgZm9yIChpID0ga2EubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBpZiAoa2FbaV0gIT09IGtiW2ldKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vZXF1aXZhbGVudCB2YWx1ZXMgZm9yIGV2ZXJ5IGNvcnJlc3BvbmRpbmcga2V5LCBhbmRcbiAgLy9+fn5wb3NzaWJseSBleHBlbnNpdmUgZGVlcCB0ZXN0XG4gIGZvciAoaSA9IGthLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAga2V5ID0ga2FbaV07XG4gICAgaWYgKCFfZGVlcEVxdWFsKGFba2V5XSwgYltrZXldLCBzdHJpY3QsIGFjdHVhbFZpc2l0ZWRPYmplY3RzKSlcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLy8gOC4gVGhlIG5vbi1lcXVpdmFsZW5jZSBhc3NlcnRpb24gdGVzdHMgZm9yIGFueSBkZWVwIGluZXF1YWxpdHkuXG4vLyBhc3NlcnQubm90RGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2Vfb3B0KTtcblxuYXNzZXJ0Lm5vdERlZXBFcXVhbCA9IGZ1bmN0aW9uIG5vdERlZXBFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKSB7XG4gIGlmIChfZGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIGZhbHNlKSkge1xuICAgIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgJ25vdERlZXBFcXVhbCcsIGFzc2VydC5ub3REZWVwRXF1YWwpO1xuICB9XG59O1xuXG5hc3NlcnQubm90RGVlcFN0cmljdEVxdWFsID0gbm90RGVlcFN0cmljdEVxdWFsO1xuZnVuY3Rpb24gbm90RGVlcFN0cmljdEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpIHtcbiAgaWYgKF9kZWVwRXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgdHJ1ZSkpIHtcbiAgICBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsICdub3REZWVwU3RyaWN0RXF1YWwnLCBub3REZWVwU3RyaWN0RXF1YWwpO1xuICB9XG59XG5cblxuLy8gOS4gVGhlIHN0cmljdCBlcXVhbGl0eSBhc3NlcnRpb24gdGVzdHMgc3RyaWN0IGVxdWFsaXR5LCBhcyBkZXRlcm1pbmVkIGJ5ID09PS5cbi8vIGFzc2VydC5zdHJpY3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlX29wdCk7XG5cbmFzc2VydC5zdHJpY3RFcXVhbCA9IGZ1bmN0aW9uIHN0cmljdEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpIHtcbiAgaWYgKGFjdHVhbCAhPT0gZXhwZWN0ZWQpIHtcbiAgICBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsICc9PT0nLCBhc3NlcnQuc3RyaWN0RXF1YWwpO1xuICB9XG59O1xuXG4vLyAxMC4gVGhlIHN0cmljdCBub24tZXF1YWxpdHkgYXNzZXJ0aW9uIHRlc3RzIGZvciBzdHJpY3QgaW5lcXVhbGl0eSwgYXNcbi8vIGRldGVybWluZWQgYnkgIT09LiAgYXNzZXJ0Lm5vdFN0cmljdEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2Vfb3B0KTtcblxuYXNzZXJ0Lm5vdFN0cmljdEVxdWFsID0gZnVuY3Rpb24gbm90U3RyaWN0RXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkge1xuICBpZiAoYWN0dWFsID09PSBleHBlY3RlZCkge1xuICAgIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgJyE9PScsIGFzc2VydC5ub3RTdHJpY3RFcXVhbCk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGV4cGVjdGVkRXhjZXB0aW9uKGFjdHVhbCwgZXhwZWN0ZWQpIHtcbiAgaWYgKCFhY3R1YWwgfHwgIWV4cGVjdGVkKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChleHBlY3RlZCkgPT0gJ1tvYmplY3QgUmVnRXhwXScpIHtcbiAgICByZXR1cm4gZXhwZWN0ZWQudGVzdChhY3R1YWwpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBpZiAoYWN0dWFsIGluc3RhbmNlb2YgZXhwZWN0ZWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIElnbm9yZS4gIFRoZSBpbnN0YW5jZW9mIGNoZWNrIGRvZXNuJ3Qgd29yayBmb3IgYXJyb3cgZnVuY3Rpb25zLlxuICB9XG5cbiAgaWYgKEVycm9yLmlzUHJvdG90eXBlT2YoZXhwZWN0ZWQpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIGV4cGVjdGVkLmNhbGwoe30sIGFjdHVhbCkgPT09IHRydWU7XG59XG5cbmZ1bmN0aW9uIF90cnlCbG9jayhibG9jaykge1xuICB2YXIgZXJyb3I7XG4gIHRyeSB7XG4gICAgYmxvY2soKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGVycm9yID0gZTtcbiAgfVxuICByZXR1cm4gZXJyb3I7XG59XG5cbmZ1bmN0aW9uIF90aHJvd3Moc2hvdWxkVGhyb3csIGJsb2NrLCBleHBlY3RlZCwgbWVzc2FnZSkge1xuICB2YXIgYWN0dWFsO1xuXG4gIGlmICh0eXBlb2YgYmxvY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImJsb2NrXCIgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gIH1cblxuICBpZiAodHlwZW9mIGV4cGVjdGVkID09PSAnc3RyaW5nJykge1xuICAgIG1lc3NhZ2UgPSBleHBlY3RlZDtcbiAgICBleHBlY3RlZCA9IG51bGw7XG4gIH1cblxuICBhY3R1YWwgPSBfdHJ5QmxvY2soYmxvY2spO1xuXG4gIG1lc3NhZ2UgPSAoZXhwZWN0ZWQgJiYgZXhwZWN0ZWQubmFtZSA/ICcgKCcgKyBleHBlY3RlZC5uYW1lICsgJykuJyA6ICcuJykgK1xuICAgICAgICAgICAgKG1lc3NhZ2UgPyAnICcgKyBtZXNzYWdlIDogJy4nKTtcblxuICBpZiAoc2hvdWxkVGhyb3cgJiYgIWFjdHVhbCkge1xuICAgIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgJ01pc3NpbmcgZXhwZWN0ZWQgZXhjZXB0aW9uJyArIG1lc3NhZ2UpO1xuICB9XG5cbiAgdmFyIHVzZXJQcm92aWRlZE1lc3NhZ2UgPSB0eXBlb2YgbWVzc2FnZSA9PT0gJ3N0cmluZyc7XG4gIHZhciBpc1Vud2FudGVkRXhjZXB0aW9uID0gIXNob3VsZFRocm93ICYmIHV0aWwuaXNFcnJvcihhY3R1YWwpO1xuICB2YXIgaXNVbmV4cGVjdGVkRXhjZXB0aW9uID0gIXNob3VsZFRocm93ICYmIGFjdHVhbCAmJiAhZXhwZWN0ZWQ7XG5cbiAgaWYgKChpc1Vud2FudGVkRXhjZXB0aW9uICYmXG4gICAgICB1c2VyUHJvdmlkZWRNZXNzYWdlICYmXG4gICAgICBleHBlY3RlZEV4Y2VwdGlvbihhY3R1YWwsIGV4cGVjdGVkKSkgfHxcbiAgICAgIGlzVW5leHBlY3RlZEV4Y2VwdGlvbikge1xuICAgIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgJ0dvdCB1bndhbnRlZCBleGNlcHRpb24nICsgbWVzc2FnZSk7XG4gIH1cblxuICBpZiAoKHNob3VsZFRocm93ICYmIGFjdHVhbCAmJiBleHBlY3RlZCAmJlxuICAgICAgIWV4cGVjdGVkRXhjZXB0aW9uKGFjdHVhbCwgZXhwZWN0ZWQpKSB8fCAoIXNob3VsZFRocm93ICYmIGFjdHVhbCkpIHtcbiAgICB0aHJvdyBhY3R1YWw7XG4gIH1cbn1cblxuLy8gMTEuIEV4cGVjdGVkIHRvIHRocm93IGFuIGVycm9yOlxuLy8gYXNzZXJ0LnRocm93cyhibG9jaywgRXJyb3Jfb3B0LCBtZXNzYWdlX29wdCk7XG5cbmFzc2VydC50aHJvd3MgPSBmdW5jdGlvbihibG9jaywgLypvcHRpb25hbCovZXJyb3IsIC8qb3B0aW9uYWwqL21lc3NhZ2UpIHtcbiAgX3Rocm93cyh0cnVlLCBibG9jaywgZXJyb3IsIG1lc3NhZ2UpO1xufTtcblxuLy8gRVhURU5TSU9OISBUaGlzIGlzIGFubm95aW5nIHRvIHdyaXRlIG91dHNpZGUgdGhpcyBtb2R1bGUuXG5hc3NlcnQuZG9lc05vdFRocm93ID0gZnVuY3Rpb24oYmxvY2ssIC8qb3B0aW9uYWwqL2Vycm9yLCAvKm9wdGlvbmFsKi9tZXNzYWdlKSB7XG4gIF90aHJvd3MoZmFsc2UsIGJsb2NrLCBlcnJvciwgbWVzc2FnZSk7XG59O1xuXG5hc3NlcnQuaWZFcnJvciA9IGZ1bmN0aW9uKGVycikgeyBpZiAoZXJyKSB0aHJvdyBlcnI7IH07XG5cbnZhciBvYmplY3RLZXlzID0gT2JqZWN0LmtleXMgfHwgZnVuY3Rpb24gKG9iaikge1xuICB2YXIga2V5cyA9IFtdO1xuICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgaWYgKGhhc093bi5jYWxsKG9iaiwga2V5KSkga2V5cy5wdXNoKGtleSk7XG4gIH1cbiAgcmV0dXJuIGtleXM7XG59O1xuIiwiLy8gKGMpIERlYW4gTWNOYW1lZSA8ZGVhbkBnbWFpbC5jb20+LCAyMDEyLlxuLy9cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9kZWFubS9jc3MtY29sb3ItcGFyc2VyLWpzXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG9cbi8vIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlXG4vLyByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Jcbi8vIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkdcbi8vIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1Ncbi8vIElOIFRIRSBTT0ZUV0FSRS5cblxuLy8gaHR0cDovL3d3dy53My5vcmcvVFIvY3NzMy1jb2xvci9cbnZhciBrQ1NTQ29sb3JUYWJsZSA9IHtcbiAgXCJ0cmFuc3BhcmVudFwiOiBbMCwwLDAsMF0sIFwiYWxpY2VibHVlXCI6IFsyNDAsMjQ4LDI1NSwxXSxcbiAgXCJhbnRpcXVld2hpdGVcIjogWzI1MCwyMzUsMjE1LDFdLCBcImFxdWFcIjogWzAsMjU1LDI1NSwxXSxcbiAgXCJhcXVhbWFyaW5lXCI6IFsxMjcsMjU1LDIxMiwxXSwgXCJhenVyZVwiOiBbMjQwLDI1NSwyNTUsMV0sXG4gIFwiYmVpZ2VcIjogWzI0NSwyNDUsMjIwLDFdLCBcImJpc3F1ZVwiOiBbMjU1LDIyOCwxOTYsMV0sXG4gIFwiYmxhY2tcIjogWzAsMCwwLDFdLCBcImJsYW5jaGVkYWxtb25kXCI6IFsyNTUsMjM1LDIwNSwxXSxcbiAgXCJibHVlXCI6IFswLDAsMjU1LDFdLCBcImJsdWV2aW9sZXRcIjogWzEzOCw0MywyMjYsMV0sXG4gIFwiYnJvd25cIjogWzE2NSw0Miw0MiwxXSwgXCJidXJseXdvb2RcIjogWzIyMiwxODQsMTM1LDFdLFxuICBcImNhZGV0Ymx1ZVwiOiBbOTUsMTU4LDE2MCwxXSwgXCJjaGFydHJldXNlXCI6IFsxMjcsMjU1LDAsMV0sXG4gIFwiY2hvY29sYXRlXCI6IFsyMTAsMTA1LDMwLDFdLCBcImNvcmFsXCI6IFsyNTUsMTI3LDgwLDFdLFxuICBcImNvcm5mbG93ZXJibHVlXCI6IFsxMDAsMTQ5LDIzNywxXSwgXCJjb3Juc2lsa1wiOiBbMjU1LDI0OCwyMjAsMV0sXG4gIFwiY3JpbXNvblwiOiBbMjIwLDIwLDYwLDFdLCBcImN5YW5cIjogWzAsMjU1LDI1NSwxXSxcbiAgXCJkYXJrYmx1ZVwiOiBbMCwwLDEzOSwxXSwgXCJkYXJrY3lhblwiOiBbMCwxMzksMTM5LDFdLFxuICBcImRhcmtnb2xkZW5yb2RcIjogWzE4NCwxMzQsMTEsMV0sIFwiZGFya2dyYXlcIjogWzE2OSwxNjksMTY5LDFdLFxuICBcImRhcmtncmVlblwiOiBbMCwxMDAsMCwxXSwgXCJkYXJrZ3JleVwiOiBbMTY5LDE2OSwxNjksMV0sXG4gIFwiZGFya2toYWtpXCI6IFsxODksMTgzLDEwNywxXSwgXCJkYXJrbWFnZW50YVwiOiBbMTM5LDAsMTM5LDFdLFxuICBcImRhcmtvbGl2ZWdyZWVuXCI6IFs4NSwxMDcsNDcsMV0sIFwiZGFya29yYW5nZVwiOiBbMjU1LDE0MCwwLDFdLFxuICBcImRhcmtvcmNoaWRcIjogWzE1Myw1MCwyMDQsMV0sIFwiZGFya3JlZFwiOiBbMTM5LDAsMCwxXSxcbiAgXCJkYXJrc2FsbW9uXCI6IFsyMzMsMTUwLDEyMiwxXSwgXCJkYXJrc2VhZ3JlZW5cIjogWzE0MywxODgsMTQzLDFdLFxuICBcImRhcmtzbGF0ZWJsdWVcIjogWzcyLDYxLDEzOSwxXSwgXCJkYXJrc2xhdGVncmF5XCI6IFs0Nyw3OSw3OSwxXSxcbiAgXCJkYXJrc2xhdGVncmV5XCI6IFs0Nyw3OSw3OSwxXSwgXCJkYXJrdHVycXVvaXNlXCI6IFswLDIwNiwyMDksMV0sXG4gIFwiZGFya3Zpb2xldFwiOiBbMTQ4LDAsMjExLDFdLCBcImRlZXBwaW5rXCI6IFsyNTUsMjAsMTQ3LDFdLFxuICBcImRlZXBza3libHVlXCI6IFswLDE5MSwyNTUsMV0sIFwiZGltZ3JheVwiOiBbMTA1LDEwNSwxMDUsMV0sXG4gIFwiZGltZ3JleVwiOiBbMTA1LDEwNSwxMDUsMV0sIFwiZG9kZ2VyYmx1ZVwiOiBbMzAsMTQ0LDI1NSwxXSxcbiAgXCJmaXJlYnJpY2tcIjogWzE3OCwzNCwzNCwxXSwgXCJmbG9yYWx3aGl0ZVwiOiBbMjU1LDI1MCwyNDAsMV0sXG4gIFwiZm9yZXN0Z3JlZW5cIjogWzM0LDEzOSwzNCwxXSwgXCJmdWNoc2lhXCI6IFsyNTUsMCwyNTUsMV0sXG4gIFwiZ2FpbnNib3JvXCI6IFsyMjAsMjIwLDIyMCwxXSwgXCJnaG9zdHdoaXRlXCI6IFsyNDgsMjQ4LDI1NSwxXSxcbiAgXCJnb2xkXCI6IFsyNTUsMjE1LDAsMV0sIFwiZ29sZGVucm9kXCI6IFsyMTgsMTY1LDMyLDFdLFxuICBcImdyYXlcIjogWzEyOCwxMjgsMTI4LDFdLCBcImdyZWVuXCI6IFswLDEyOCwwLDFdLFxuICBcImdyZWVueWVsbG93XCI6IFsxNzMsMjU1LDQ3LDFdLCBcImdyZXlcIjogWzEyOCwxMjgsMTI4LDFdLFxuICBcImhvbmV5ZGV3XCI6IFsyNDAsMjU1LDI0MCwxXSwgXCJob3RwaW5rXCI6IFsyNTUsMTA1LDE4MCwxXSxcbiAgXCJpbmRpYW5yZWRcIjogWzIwNSw5Miw5MiwxXSwgXCJpbmRpZ29cIjogWzc1LDAsMTMwLDFdLFxuICBcIml2b3J5XCI6IFsyNTUsMjU1LDI0MCwxXSwgXCJraGFraVwiOiBbMjQwLDIzMCwxNDAsMV0sXG4gIFwibGF2ZW5kZXJcIjogWzIzMCwyMzAsMjUwLDFdLCBcImxhdmVuZGVyYmx1c2hcIjogWzI1NSwyNDAsMjQ1LDFdLFxuICBcImxhd25ncmVlblwiOiBbMTI0LDI1MiwwLDFdLCBcImxlbW9uY2hpZmZvblwiOiBbMjU1LDI1MCwyMDUsMV0sXG4gIFwibGlnaHRibHVlXCI6IFsxNzMsMjE2LDIzMCwxXSwgXCJsaWdodGNvcmFsXCI6IFsyNDAsMTI4LDEyOCwxXSxcbiAgXCJsaWdodGN5YW5cIjogWzIyNCwyNTUsMjU1LDFdLCBcImxpZ2h0Z29sZGVucm9keWVsbG93XCI6IFsyNTAsMjUwLDIxMCwxXSxcbiAgXCJsaWdodGdyYXlcIjogWzIxMSwyMTEsMjExLDFdLCBcImxpZ2h0Z3JlZW5cIjogWzE0NCwyMzgsMTQ0LDFdLFxuICBcImxpZ2h0Z3JleVwiOiBbMjExLDIxMSwyMTEsMV0sIFwibGlnaHRwaW5rXCI6IFsyNTUsMTgyLDE5MywxXSxcbiAgXCJsaWdodHNhbG1vblwiOiBbMjU1LDE2MCwxMjIsMV0sIFwibGlnaHRzZWFncmVlblwiOiBbMzIsMTc4LDE3MCwxXSxcbiAgXCJsaWdodHNreWJsdWVcIjogWzEzNSwyMDYsMjUwLDFdLCBcImxpZ2h0c2xhdGVncmF5XCI6IFsxMTksMTM2LDE1MywxXSxcbiAgXCJsaWdodHNsYXRlZ3JleVwiOiBbMTE5LDEzNiwxNTMsMV0sIFwibGlnaHRzdGVlbGJsdWVcIjogWzE3NiwxOTYsMjIyLDFdLFxuICBcImxpZ2h0eWVsbG93XCI6IFsyNTUsMjU1LDIyNCwxXSwgXCJsaW1lXCI6IFswLDI1NSwwLDFdLFxuICBcImxpbWVncmVlblwiOiBbNTAsMjA1LDUwLDFdLCBcImxpbmVuXCI6IFsyNTAsMjQwLDIzMCwxXSxcbiAgXCJtYWdlbnRhXCI6IFsyNTUsMCwyNTUsMV0sIFwibWFyb29uXCI6IFsxMjgsMCwwLDFdLFxuICBcIm1lZGl1bWFxdWFtYXJpbmVcIjogWzEwMiwyMDUsMTcwLDFdLCBcIm1lZGl1bWJsdWVcIjogWzAsMCwyMDUsMV0sXG4gIFwibWVkaXVtb3JjaGlkXCI6IFsxODYsODUsMjExLDFdLCBcIm1lZGl1bXB1cnBsZVwiOiBbMTQ3LDExMiwyMTksMV0sXG4gIFwibWVkaXVtc2VhZ3JlZW5cIjogWzYwLDE3OSwxMTMsMV0sIFwibWVkaXVtc2xhdGVibHVlXCI6IFsxMjMsMTA0LDIzOCwxXSxcbiAgXCJtZWRpdW1zcHJpbmdncmVlblwiOiBbMCwyNTAsMTU0LDFdLCBcIm1lZGl1bXR1cnF1b2lzZVwiOiBbNzIsMjA5LDIwNCwxXSxcbiAgXCJtZWRpdW12aW9sZXRyZWRcIjogWzE5OSwyMSwxMzMsMV0sIFwibWlkbmlnaHRibHVlXCI6IFsyNSwyNSwxMTIsMV0sXG4gIFwibWludGNyZWFtXCI6IFsyNDUsMjU1LDI1MCwxXSwgXCJtaXN0eXJvc2VcIjogWzI1NSwyMjgsMjI1LDFdLFxuICBcIm1vY2Nhc2luXCI6IFsyNTUsMjI4LDE4MSwxXSwgXCJuYXZham93aGl0ZVwiOiBbMjU1LDIyMiwxNzMsMV0sXG4gIFwibmF2eVwiOiBbMCwwLDEyOCwxXSwgXCJvbGRsYWNlXCI6IFsyNTMsMjQ1LDIzMCwxXSxcbiAgXCJvbGl2ZVwiOiBbMTI4LDEyOCwwLDFdLCBcIm9saXZlZHJhYlwiOiBbMTA3LDE0MiwzNSwxXSxcbiAgXCJvcmFuZ2VcIjogWzI1NSwxNjUsMCwxXSwgXCJvcmFuZ2VyZWRcIjogWzI1NSw2OSwwLDFdLFxuICBcIm9yY2hpZFwiOiBbMjE4LDExMiwyMTQsMV0sIFwicGFsZWdvbGRlbnJvZFwiOiBbMjM4LDIzMiwxNzAsMV0sXG4gIFwicGFsZWdyZWVuXCI6IFsxNTIsMjUxLDE1MiwxXSwgXCJwYWxldHVycXVvaXNlXCI6IFsxNzUsMjM4LDIzOCwxXSxcbiAgXCJwYWxldmlvbGV0cmVkXCI6IFsyMTksMTEyLDE0NywxXSwgXCJwYXBheWF3aGlwXCI6IFsyNTUsMjM5LDIxMywxXSxcbiAgXCJwZWFjaHB1ZmZcIjogWzI1NSwyMTgsMTg1LDFdLCBcInBlcnVcIjogWzIwNSwxMzMsNjMsMV0sXG4gIFwicGlua1wiOiBbMjU1LDE5MiwyMDMsMV0sIFwicGx1bVwiOiBbMjIxLDE2MCwyMjEsMV0sXG4gIFwicG93ZGVyYmx1ZVwiOiBbMTc2LDIyNCwyMzAsMV0sIFwicHVycGxlXCI6IFsxMjgsMCwxMjgsMV0sXG4gIFwicmViZWNjYXB1cnBsZVwiOiBbMTAyLDUxLDE1MywxXSxcbiAgXCJyZWRcIjogWzI1NSwwLDAsMV0sIFwicm9zeWJyb3duXCI6IFsxODgsMTQzLDE0MywxXSxcbiAgXCJyb3lhbGJsdWVcIjogWzY1LDEwNSwyMjUsMV0sIFwic2FkZGxlYnJvd25cIjogWzEzOSw2OSwxOSwxXSxcbiAgXCJzYWxtb25cIjogWzI1MCwxMjgsMTE0LDFdLCBcInNhbmR5YnJvd25cIjogWzI0NCwxNjQsOTYsMV0sXG4gIFwic2VhZ3JlZW5cIjogWzQ2LDEzOSw4NywxXSwgXCJzZWFzaGVsbFwiOiBbMjU1LDI0NSwyMzgsMV0sXG4gIFwic2llbm5hXCI6IFsxNjAsODIsNDUsMV0sIFwic2lsdmVyXCI6IFsxOTIsMTkyLDE5MiwxXSxcbiAgXCJza3libHVlXCI6IFsxMzUsMjA2LDIzNSwxXSwgXCJzbGF0ZWJsdWVcIjogWzEwNiw5MCwyMDUsMV0sXG4gIFwic2xhdGVncmF5XCI6IFsxMTIsMTI4LDE0NCwxXSwgXCJzbGF0ZWdyZXlcIjogWzExMiwxMjgsMTQ0LDFdLFxuICBcInNub3dcIjogWzI1NSwyNTAsMjUwLDFdLCBcInNwcmluZ2dyZWVuXCI6IFswLDI1NSwxMjcsMV0sXG4gIFwic3RlZWxibHVlXCI6IFs3MCwxMzAsMTgwLDFdLCBcInRhblwiOiBbMjEwLDE4MCwxNDAsMV0sXG4gIFwidGVhbFwiOiBbMCwxMjgsMTI4LDFdLCBcInRoaXN0bGVcIjogWzIxNiwxOTEsMjE2LDFdLFxuICBcInRvbWF0b1wiOiBbMjU1LDk5LDcxLDFdLCBcInR1cnF1b2lzZVwiOiBbNjQsMjI0LDIwOCwxXSxcbiAgXCJ2aW9sZXRcIjogWzIzOCwxMzAsMjM4LDFdLCBcIndoZWF0XCI6IFsyNDUsMjIyLDE3OSwxXSxcbiAgXCJ3aGl0ZVwiOiBbMjU1LDI1NSwyNTUsMV0sIFwid2hpdGVzbW9rZVwiOiBbMjQ1LDI0NSwyNDUsMV0sXG4gIFwieWVsbG93XCI6IFsyNTUsMjU1LDAsMV0sIFwieWVsbG93Z3JlZW5cIjogWzE1NCwyMDUsNTAsMV19XG5cbmZ1bmN0aW9uIGNsYW1wX2Nzc19ieXRlKGkpIHsgIC8vIENsYW1wIHRvIGludGVnZXIgMCAuLiAyNTUuXG4gIGkgPSBNYXRoLnJvdW5kKGkpOyAgLy8gU2VlbXMgdG8gYmUgd2hhdCBDaHJvbWUgZG9lcyAodnMgdHJ1bmNhdGlvbikuXG4gIHJldHVybiBpIDwgMCA/IDAgOiBpID4gMjU1ID8gMjU1IDogaTtcbn1cblxuZnVuY3Rpb24gY2xhbXBfY3NzX2Zsb2F0KGYpIHsgIC8vIENsYW1wIHRvIGZsb2F0IDAuMCAuLiAxLjAuXG4gIHJldHVybiBmIDwgMCA/IDAgOiBmID4gMSA/IDEgOiBmO1xufVxuXG5mdW5jdGlvbiBwYXJzZV9jc3NfaW50KHN0cikgeyAgLy8gaW50IG9yIHBlcmNlbnRhZ2UuXG4gIGlmIChzdHJbc3RyLmxlbmd0aCAtIDFdID09PSAnJScpXG4gICAgcmV0dXJuIGNsYW1wX2Nzc19ieXRlKHBhcnNlRmxvYXQoc3RyKSAvIDEwMCAqIDI1NSk7XG4gIHJldHVybiBjbGFtcF9jc3NfYnl0ZShwYXJzZUludChzdHIpKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VfY3NzX2Zsb2F0KHN0cikgeyAgLy8gZmxvYXQgb3IgcGVyY2VudGFnZS5cbiAgaWYgKHN0cltzdHIubGVuZ3RoIC0gMV0gPT09ICclJylcbiAgICByZXR1cm4gY2xhbXBfY3NzX2Zsb2F0KHBhcnNlRmxvYXQoc3RyKSAvIDEwMCk7XG4gIHJldHVybiBjbGFtcF9jc3NfZmxvYXQocGFyc2VGbG9hdChzdHIpKTtcbn1cblxuZnVuY3Rpb24gY3NzX2h1ZV90b19yZ2IobTEsIG0yLCBoKSB7XG4gIGlmIChoIDwgMCkgaCArPSAxO1xuICBlbHNlIGlmIChoID4gMSkgaCAtPSAxO1xuXG4gIGlmIChoICogNiA8IDEpIHJldHVybiBtMSArIChtMiAtIG0xKSAqIGggKiA2O1xuICBpZiAoaCAqIDIgPCAxKSByZXR1cm4gbTI7XG4gIGlmIChoICogMyA8IDIpIHJldHVybiBtMSArIChtMiAtIG0xKSAqICgyLzMgLSBoKSAqIDY7XG4gIHJldHVybiBtMTtcbn1cblxuZnVuY3Rpb24gcGFyc2VDU1NDb2xvcihjc3Nfc3RyKSB7XG4gIC8vIFJlbW92ZSBhbGwgd2hpdGVzcGFjZSwgbm90IGNvbXBsaWFudCwgYnV0IHNob3VsZCBqdXN0IGJlIG1vcmUgYWNjZXB0aW5nLlxuICB2YXIgc3RyID0gY3NzX3N0ci5yZXBsYWNlKC8gL2csICcnKS50b0xvd2VyQ2FzZSgpO1xuXG4gIC8vIENvbG9yIGtleXdvcmRzIChhbmQgdHJhbnNwYXJlbnQpIGxvb2t1cC5cbiAgaWYgKHN0ciBpbiBrQ1NTQ29sb3JUYWJsZSkgcmV0dXJuIGtDU1NDb2xvclRhYmxlW3N0cl0uc2xpY2UoKTsgIC8vIGR1cC5cblxuICAvLyAjYWJjIGFuZCAjYWJjMTIzIHN5bnRheC5cbiAgaWYgKHN0clswXSA9PT0gJyMnKSB7XG4gICAgaWYgKHN0ci5sZW5ndGggPT09IDQpIHtcbiAgICAgIHZhciBpdiA9IHBhcnNlSW50KHN0ci5zdWJzdHIoMSksIDE2KTsgIC8vIFRPRE8oZGVhbm0pOiBTdHJpY3RlciBwYXJzaW5nLlxuICAgICAgaWYgKCEoaXYgPj0gMCAmJiBpdiA8PSAweGZmZikpIHJldHVybiBudWxsOyAgLy8gQ292ZXJzIE5hTi5cbiAgICAgIHJldHVybiBbKChpdiAmIDB4ZjAwKSA+PiA0KSB8ICgoaXYgJiAweGYwMCkgPj4gOCksXG4gICAgICAgICAgICAgIChpdiAmIDB4ZjApIHwgKChpdiAmIDB4ZjApID4+IDQpLFxuICAgICAgICAgICAgICAoaXYgJiAweGYpIHwgKChpdiAmIDB4ZikgPDwgNCksXG4gICAgICAgICAgICAgIDFdO1xuICAgIH0gZWxzZSBpZiAoc3RyLmxlbmd0aCA9PT0gNykge1xuICAgICAgdmFyIGl2ID0gcGFyc2VJbnQoc3RyLnN1YnN0cigxKSwgMTYpOyAgLy8gVE9ETyhkZWFubSk6IFN0cmljdGVyIHBhcnNpbmcuXG4gICAgICBpZiAoIShpdiA+PSAwICYmIGl2IDw9IDB4ZmZmZmZmKSkgcmV0dXJuIG51bGw7ICAvLyBDb3ZlcnMgTmFOLlxuICAgICAgcmV0dXJuIFsoaXYgJiAweGZmMDAwMCkgPj4gMTYsXG4gICAgICAgICAgICAgIChpdiAmIDB4ZmYwMCkgPj4gOCxcbiAgICAgICAgICAgICAgaXYgJiAweGZmLFxuICAgICAgICAgICAgICAxXTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBvcCA9IHN0ci5pbmRleE9mKCcoJyksIGVwID0gc3RyLmluZGV4T2YoJyknKTtcbiAgaWYgKG9wICE9PSAtMSAmJiBlcCArIDEgPT09IHN0ci5sZW5ndGgpIHtcbiAgICB2YXIgZm5hbWUgPSBzdHIuc3Vic3RyKDAsIG9wKTtcbiAgICB2YXIgcGFyYW1zID0gc3RyLnN1YnN0cihvcCsxLCBlcC0ob3ArMSkpLnNwbGl0KCcsJyk7XG4gICAgdmFyIGFscGhhID0gMTsgIC8vIFRvIGFsbG93IGNhc2UgZmFsbHRocm91Z2guXG4gICAgc3dpdGNoIChmbmFtZSkge1xuICAgICAgY2FzZSAncmdiYSc6XG4gICAgICAgIGlmIChwYXJhbXMubGVuZ3RoICE9PSA0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgYWxwaGEgPSBwYXJzZV9jc3NfZmxvYXQocGFyYW1zLnBvcCgpKTtcbiAgICAgICAgLy8gRmFsbCB0aHJvdWdoLlxuICAgICAgY2FzZSAncmdiJzpcbiAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggIT09IDMpIHJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4gW3BhcnNlX2Nzc19pbnQocGFyYW1zWzBdKSxcbiAgICAgICAgICAgICAgICBwYXJzZV9jc3NfaW50KHBhcmFtc1sxXSksXG4gICAgICAgICAgICAgICAgcGFyc2VfY3NzX2ludChwYXJhbXNbMl0pLFxuICAgICAgICAgICAgICAgIGFscGhhXTtcbiAgICAgIGNhc2UgJ2hzbGEnOlxuICAgICAgICBpZiAocGFyYW1zLmxlbmd0aCAhPT0gNCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGFscGhhID0gcGFyc2VfY3NzX2Zsb2F0KHBhcmFtcy5wb3AoKSk7XG4gICAgICAgIC8vIEZhbGwgdGhyb3VnaC5cbiAgICAgIGNhc2UgJ2hzbCc6XG4gICAgICAgIGlmIChwYXJhbXMubGVuZ3RoICE9PSAzKSByZXR1cm4gbnVsbDtcbiAgICAgICAgdmFyIGggPSAoKChwYXJzZUZsb2F0KHBhcmFtc1swXSkgJSAzNjApICsgMzYwKSAlIDM2MCkgLyAzNjA7ICAvLyAwIC4uIDFcbiAgICAgICAgLy8gTk9URShkZWFubSk6IEFjY29yZGluZyB0byB0aGUgQ1NTIHNwZWMgcy9sIHNob3VsZCBvbmx5IGJlXG4gICAgICAgIC8vIHBlcmNlbnRhZ2VzLCBidXQgd2UgZG9uJ3QgYm90aGVyIGFuZCBsZXQgZmxvYXQgb3IgcGVyY2VudGFnZS5cbiAgICAgICAgdmFyIHMgPSBwYXJzZV9jc3NfZmxvYXQocGFyYW1zWzFdKTtcbiAgICAgICAgdmFyIGwgPSBwYXJzZV9jc3NfZmxvYXQocGFyYW1zWzJdKTtcbiAgICAgICAgdmFyIG0yID0gbCA8PSAwLjUgPyBsICogKHMgKyAxKSA6IGwgKyBzIC0gbCAqIHM7XG4gICAgICAgIHZhciBtMSA9IGwgKiAyIC0gbTI7XG4gICAgICAgIHJldHVybiBbY2xhbXBfY3NzX2J5dGUoY3NzX2h1ZV90b19yZ2IobTEsIG0yLCBoKzEvMykgKiAyNTUpLFxuICAgICAgICAgICAgICAgIGNsYW1wX2Nzc19ieXRlKGNzc19odWVfdG9fcmdiKG0xLCBtMiwgaCkgKiAyNTUpLFxuICAgICAgICAgICAgICAgIGNsYW1wX2Nzc19ieXRlKGNzc19odWVfdG9fcmdiKG0xLCBtMiwgaC0xLzMpICogMjU1KSxcbiAgICAgICAgICAgICAgICBhbHBoYV07XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxudHJ5IHsgZXhwb3J0cy5wYXJzZUNTU0NvbG9yID0gcGFyc2VDU1NDb2xvciB9IGNhdGNoKGUpIHsgfVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGVhcmN1dDtcblxuZnVuY3Rpb24gZWFyY3V0KGRhdGEsIGhvbGVJbmRpY2VzLCBkaW0pIHtcblxuICAgIGRpbSA9IGRpbSB8fCAyO1xuXG4gICAgdmFyIGhhc0hvbGVzID0gaG9sZUluZGljZXMgJiYgaG9sZUluZGljZXMubGVuZ3RoLFxuICAgICAgICBvdXRlckxlbiA9IGhhc0hvbGVzID8gaG9sZUluZGljZXNbMF0gKiBkaW0gOiBkYXRhLmxlbmd0aCxcbiAgICAgICAgb3V0ZXJOb2RlID0gbGlua2VkTGlzdChkYXRhLCAwLCBvdXRlckxlbiwgZGltLCB0cnVlKSxcbiAgICAgICAgdHJpYW5nbGVzID0gW107XG5cbiAgICBpZiAoIW91dGVyTm9kZSkgcmV0dXJuIHRyaWFuZ2xlcztcblxuICAgIHZhciBtaW5YLCBtaW5ZLCBtYXhYLCBtYXhZLCB4LCB5LCBzaXplO1xuXG4gICAgaWYgKGhhc0hvbGVzKSBvdXRlck5vZGUgPSBlbGltaW5hdGVIb2xlcyhkYXRhLCBob2xlSW5kaWNlcywgb3V0ZXJOb2RlLCBkaW0pO1xuXG4gICAgLy8gaWYgdGhlIHNoYXBlIGlzIG5vdCB0b28gc2ltcGxlLCB3ZSdsbCB1c2Ugei1vcmRlciBjdXJ2ZSBoYXNoIGxhdGVyOyBjYWxjdWxhdGUgcG9seWdvbiBiYm94XG4gICAgaWYgKGRhdGEubGVuZ3RoID4gODAgKiBkaW0pIHtcbiAgICAgICAgbWluWCA9IG1heFggPSBkYXRhWzBdO1xuICAgICAgICBtaW5ZID0gbWF4WSA9IGRhdGFbMV07XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IGRpbTsgaSA8IG91dGVyTGVuOyBpICs9IGRpbSkge1xuICAgICAgICAgICAgeCA9IGRhdGFbaV07XG4gICAgICAgICAgICB5ID0gZGF0YVtpICsgMV07XG4gICAgICAgICAgICBpZiAoeCA8IG1pblgpIG1pblggPSB4O1xuICAgICAgICAgICAgaWYgKHkgPCBtaW5ZKSBtaW5ZID0geTtcbiAgICAgICAgICAgIGlmICh4ID4gbWF4WCkgbWF4WCA9IHg7XG4gICAgICAgICAgICBpZiAoeSA+IG1heFkpIG1heFkgPSB5O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gbWluWCwgbWluWSBhbmQgc2l6ZSBhcmUgbGF0ZXIgdXNlZCB0byB0cmFuc2Zvcm0gY29vcmRzIGludG8gaW50ZWdlcnMgZm9yIHotb3JkZXIgY2FsY3VsYXRpb25cbiAgICAgICAgc2l6ZSA9IE1hdGgubWF4KG1heFggLSBtaW5YLCBtYXhZIC0gbWluWSk7XG4gICAgfVxuXG4gICAgZWFyY3V0TGlua2VkKG91dGVyTm9kZSwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIHNpemUpO1xuXG4gICAgcmV0dXJuIHRyaWFuZ2xlcztcbn1cblxuLy8gY3JlYXRlIGEgY2lyY3VsYXIgZG91Ymx5IGxpbmtlZCBsaXN0IGZyb20gcG9seWdvbiBwb2ludHMgaW4gdGhlIHNwZWNpZmllZCB3aW5kaW5nIG9yZGVyXG5mdW5jdGlvbiBsaW5rZWRMaXN0KGRhdGEsIHN0YXJ0LCBlbmQsIGRpbSwgY2xvY2t3aXNlKSB7XG4gICAgdmFyIGksIGxhc3Q7XG5cbiAgICBpZiAoY2xvY2t3aXNlID09PSAoc2lnbmVkQXJlYShkYXRhLCBzdGFydCwgZW5kLCBkaW0pID4gMCkpIHtcbiAgICAgICAgZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7IGkgKz0gZGltKSBsYXN0ID0gaW5zZXJ0Tm9kZShpLCBkYXRhW2ldLCBkYXRhW2kgKyAxXSwgbGFzdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChpID0gZW5kIC0gZGltOyBpID49IHN0YXJ0OyBpIC09IGRpbSkgbGFzdCA9IGluc2VydE5vZGUoaSwgZGF0YVtpXSwgZGF0YVtpICsgMV0sIGxhc3QpO1xuICAgIH1cblxuICAgIGlmIChsYXN0ICYmIGVxdWFscyhsYXN0LCBsYXN0Lm5leHQpKSB7XG4gICAgICAgIHJlbW92ZU5vZGUobGFzdCk7XG4gICAgICAgIGxhc3QgPSBsYXN0Lm5leHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxhc3Q7XG59XG5cbi8vIGVsaW1pbmF0ZSBjb2xpbmVhciBvciBkdXBsaWNhdGUgcG9pbnRzXG5mdW5jdGlvbiBmaWx0ZXJQb2ludHMoc3RhcnQsIGVuZCkge1xuICAgIGlmICghc3RhcnQpIHJldHVybiBzdGFydDtcbiAgICBpZiAoIWVuZCkgZW5kID0gc3RhcnQ7XG5cbiAgICB2YXIgcCA9IHN0YXJ0LFxuICAgICAgICBhZ2FpbjtcbiAgICBkbyB7XG4gICAgICAgIGFnYWluID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKCFwLnN0ZWluZXIgJiYgKGVxdWFscyhwLCBwLm5leHQpIHx8IGFyZWEocC5wcmV2LCBwLCBwLm5leHQpID09PSAwKSkge1xuICAgICAgICAgICAgcmVtb3ZlTm9kZShwKTtcbiAgICAgICAgICAgIHAgPSBlbmQgPSBwLnByZXY7XG4gICAgICAgICAgICBpZiAocCA9PT0gcC5uZXh0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGFnYWluID0gdHJ1ZTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcCA9IHAubmV4dDtcbiAgICAgICAgfVxuICAgIH0gd2hpbGUgKGFnYWluIHx8IHAgIT09IGVuZCk7XG5cbiAgICByZXR1cm4gZW5kO1xufVxuXG4vLyBtYWluIGVhciBzbGljaW5nIGxvb3Agd2hpY2ggdHJpYW5ndWxhdGVzIGEgcG9seWdvbiAoZ2l2ZW4gYXMgYSBsaW5rZWQgbGlzdClcbmZ1bmN0aW9uIGVhcmN1dExpbmtlZChlYXIsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBzaXplLCBwYXNzKSB7XG4gICAgaWYgKCFlYXIpIHJldHVybjtcblxuICAgIC8vIGludGVybGluayBwb2x5Z29uIG5vZGVzIGluIHotb3JkZXJcbiAgICBpZiAoIXBhc3MgJiYgc2l6ZSkgaW5kZXhDdXJ2ZShlYXIsIG1pblgsIG1pblksIHNpemUpO1xuXG4gICAgdmFyIHN0b3AgPSBlYXIsXG4gICAgICAgIHByZXYsIG5leHQ7XG5cbiAgICAvLyBpdGVyYXRlIHRocm91Z2ggZWFycywgc2xpY2luZyB0aGVtIG9uZSBieSBvbmVcbiAgICB3aGlsZSAoZWFyLnByZXYgIT09IGVhci5uZXh0KSB7XG4gICAgICAgIHByZXYgPSBlYXIucHJldjtcbiAgICAgICAgbmV4dCA9IGVhci5uZXh0O1xuXG4gICAgICAgIGlmIChzaXplID8gaXNFYXJIYXNoZWQoZWFyLCBtaW5YLCBtaW5ZLCBzaXplKSA6IGlzRWFyKGVhcikpIHtcbiAgICAgICAgICAgIC8vIGN1dCBvZmYgdGhlIHRyaWFuZ2xlXG4gICAgICAgICAgICB0cmlhbmdsZXMucHVzaChwcmV2LmkgLyBkaW0pO1xuICAgICAgICAgICAgdHJpYW5nbGVzLnB1c2goZWFyLmkgLyBkaW0pO1xuICAgICAgICAgICAgdHJpYW5nbGVzLnB1c2gobmV4dC5pIC8gZGltKTtcblxuICAgICAgICAgICAgcmVtb3ZlTm9kZShlYXIpO1xuXG4gICAgICAgICAgICAvLyBza2lwcGluZyB0aGUgbmV4dCB2ZXJ0aWNlIGxlYWRzIHRvIGxlc3Mgc2xpdmVyIHRyaWFuZ2xlc1xuICAgICAgICAgICAgZWFyID0gbmV4dC5uZXh0O1xuICAgICAgICAgICAgc3RvcCA9IG5leHQubmV4dDtcblxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBlYXIgPSBuZXh0O1xuXG4gICAgICAgIC8vIGlmIHdlIGxvb3BlZCB0aHJvdWdoIHRoZSB3aG9sZSByZW1haW5pbmcgcG9seWdvbiBhbmQgY2FuJ3QgZmluZCBhbnkgbW9yZSBlYXJzXG4gICAgICAgIGlmIChlYXIgPT09IHN0b3ApIHtcbiAgICAgICAgICAgIC8vIHRyeSBmaWx0ZXJpbmcgcG9pbnRzIGFuZCBzbGljaW5nIGFnYWluXG4gICAgICAgICAgICBpZiAoIXBhc3MpIHtcbiAgICAgICAgICAgICAgICBlYXJjdXRMaW5rZWQoZmlsdGVyUG9pbnRzKGVhciksIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBzaXplLCAxKTtcblxuICAgICAgICAgICAgLy8gaWYgdGhpcyBkaWRuJ3Qgd29yaywgdHJ5IGN1cmluZyBhbGwgc21hbGwgc2VsZi1pbnRlcnNlY3Rpb25zIGxvY2FsbHlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFzcyA9PT0gMSkge1xuICAgICAgICAgICAgICAgIGVhciA9IGN1cmVMb2NhbEludGVyc2VjdGlvbnMoZWFyLCB0cmlhbmdsZXMsIGRpbSk7XG4gICAgICAgICAgICAgICAgZWFyY3V0TGlua2VkKGVhciwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIHNpemUsIDIpO1xuXG4gICAgICAgICAgICAvLyBhcyBhIGxhc3QgcmVzb3J0LCB0cnkgc3BsaXR0aW5nIHRoZSByZW1haW5pbmcgcG9seWdvbiBpbnRvIHR3b1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwYXNzID09PSAyKSB7XG4gICAgICAgICAgICAgICAgc3BsaXRFYXJjdXQoZWFyLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgc2l6ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vLyBjaGVjayB3aGV0aGVyIGEgcG9seWdvbiBub2RlIGZvcm1zIGEgdmFsaWQgZWFyIHdpdGggYWRqYWNlbnQgbm9kZXNcbmZ1bmN0aW9uIGlzRWFyKGVhcikge1xuICAgIHZhciBhID0gZWFyLnByZXYsXG4gICAgICAgIGIgPSBlYXIsXG4gICAgICAgIGMgPSBlYXIubmV4dDtcblxuICAgIGlmIChhcmVhKGEsIGIsIGMpID49IDApIHJldHVybiBmYWxzZTsgLy8gcmVmbGV4LCBjYW4ndCBiZSBhbiBlYXJcblxuICAgIC8vIG5vdyBtYWtlIHN1cmUgd2UgZG9uJ3QgaGF2ZSBvdGhlciBwb2ludHMgaW5zaWRlIHRoZSBwb3RlbnRpYWwgZWFyXG4gICAgdmFyIHAgPSBlYXIubmV4dC5uZXh0O1xuXG4gICAgd2hpbGUgKHAgIT09IGVhci5wcmV2KSB7XG4gICAgICAgIGlmIChwb2ludEluVHJpYW5nbGUoYS54LCBhLnksIGIueCwgYi55LCBjLngsIGMueSwgcC54LCBwLnkpICYmXG4gICAgICAgICAgICBhcmVhKHAucHJldiwgcCwgcC5uZXh0KSA+PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHAgPSBwLm5leHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGlzRWFySGFzaGVkKGVhciwgbWluWCwgbWluWSwgc2l6ZSkge1xuICAgIHZhciBhID0gZWFyLnByZXYsXG4gICAgICAgIGIgPSBlYXIsXG4gICAgICAgIGMgPSBlYXIubmV4dDtcblxuICAgIGlmIChhcmVhKGEsIGIsIGMpID49IDApIHJldHVybiBmYWxzZTsgLy8gcmVmbGV4LCBjYW4ndCBiZSBhbiBlYXJcblxuICAgIC8vIHRyaWFuZ2xlIGJib3g7IG1pbiAmIG1heCBhcmUgY2FsY3VsYXRlZCBsaWtlIHRoaXMgZm9yIHNwZWVkXG4gICAgdmFyIG1pblRYID0gYS54IDwgYi54ID8gKGEueCA8IGMueCA/IGEueCA6IGMueCkgOiAoYi54IDwgYy54ID8gYi54IDogYy54KSxcbiAgICAgICAgbWluVFkgPSBhLnkgPCBiLnkgPyAoYS55IDwgYy55ID8gYS55IDogYy55KSA6IChiLnkgPCBjLnkgPyBiLnkgOiBjLnkpLFxuICAgICAgICBtYXhUWCA9IGEueCA+IGIueCA/IChhLnggPiBjLnggPyBhLnggOiBjLngpIDogKGIueCA+IGMueCA/IGIueCA6IGMueCksXG4gICAgICAgIG1heFRZID0gYS55ID4gYi55ID8gKGEueSA+IGMueSA/IGEueSA6IGMueSkgOiAoYi55ID4gYy55ID8gYi55IDogYy55KTtcblxuICAgIC8vIHotb3JkZXIgcmFuZ2UgZm9yIHRoZSBjdXJyZW50IHRyaWFuZ2xlIGJib3g7XG4gICAgdmFyIG1pblogPSB6T3JkZXIobWluVFgsIG1pblRZLCBtaW5YLCBtaW5ZLCBzaXplKSxcbiAgICAgICAgbWF4WiA9IHpPcmRlcihtYXhUWCwgbWF4VFksIG1pblgsIG1pblksIHNpemUpO1xuXG4gICAgLy8gZmlyc3QgbG9vayBmb3IgcG9pbnRzIGluc2lkZSB0aGUgdHJpYW5nbGUgaW4gaW5jcmVhc2luZyB6LW9yZGVyXG4gICAgdmFyIHAgPSBlYXIubmV4dFo7XG5cbiAgICB3aGlsZSAocCAmJiBwLnogPD0gbWF4Wikge1xuICAgICAgICBpZiAocCAhPT0gZWFyLnByZXYgJiYgcCAhPT0gZWFyLm5leHQgJiZcbiAgICAgICAgICAgIHBvaW50SW5UcmlhbmdsZShhLngsIGEueSwgYi54LCBiLnksIGMueCwgYy55LCBwLngsIHAueSkgJiZcbiAgICAgICAgICAgIGFyZWEocC5wcmV2LCBwLCBwLm5leHQpID49IDApIHJldHVybiBmYWxzZTtcbiAgICAgICAgcCA9IHAubmV4dFo7XG4gICAgfVxuXG4gICAgLy8gdGhlbiBsb29rIGZvciBwb2ludHMgaW4gZGVjcmVhc2luZyB6LW9yZGVyXG4gICAgcCA9IGVhci5wcmV2WjtcblxuICAgIHdoaWxlIChwICYmIHAueiA+PSBtaW5aKSB7XG4gICAgICAgIGlmIChwICE9PSBlYXIucHJldiAmJiBwICE9PSBlYXIubmV4dCAmJlxuICAgICAgICAgICAgcG9pbnRJblRyaWFuZ2xlKGEueCwgYS55LCBiLngsIGIueSwgYy54LCBjLnksIHAueCwgcC55KSAmJlxuICAgICAgICAgICAgYXJlYShwLnByZXYsIHAsIHAubmV4dCkgPj0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBwID0gcC5wcmV2WjtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuLy8gZ28gdGhyb3VnaCBhbGwgcG9seWdvbiBub2RlcyBhbmQgY3VyZSBzbWFsbCBsb2NhbCBzZWxmLWludGVyc2VjdGlvbnNcbmZ1bmN0aW9uIGN1cmVMb2NhbEludGVyc2VjdGlvbnMoc3RhcnQsIHRyaWFuZ2xlcywgZGltKSB7XG4gICAgdmFyIHAgPSBzdGFydDtcbiAgICBkbyB7XG4gICAgICAgIHZhciBhID0gcC5wcmV2LFxuICAgICAgICAgICAgYiA9IHAubmV4dC5uZXh0O1xuXG4gICAgICAgIGlmICghZXF1YWxzKGEsIGIpICYmIGludGVyc2VjdHMoYSwgcCwgcC5uZXh0LCBiKSAmJiBsb2NhbGx5SW5zaWRlKGEsIGIpICYmIGxvY2FsbHlJbnNpZGUoYiwgYSkpIHtcblxuICAgICAgICAgICAgdHJpYW5nbGVzLnB1c2goYS5pIC8gZGltKTtcbiAgICAgICAgICAgIHRyaWFuZ2xlcy5wdXNoKHAuaSAvIGRpbSk7XG4gICAgICAgICAgICB0cmlhbmdsZXMucHVzaChiLmkgLyBkaW0pO1xuXG4gICAgICAgICAgICAvLyByZW1vdmUgdHdvIG5vZGVzIGludm9sdmVkXG4gICAgICAgICAgICByZW1vdmVOb2RlKHApO1xuICAgICAgICAgICAgcmVtb3ZlTm9kZShwLm5leHQpO1xuXG4gICAgICAgICAgICBwID0gc3RhcnQgPSBiO1xuICAgICAgICB9XG4gICAgICAgIHAgPSBwLm5leHQ7XG4gICAgfSB3aGlsZSAocCAhPT0gc3RhcnQpO1xuXG4gICAgcmV0dXJuIHA7XG59XG5cbi8vIHRyeSBzcGxpdHRpbmcgcG9seWdvbiBpbnRvIHR3byBhbmQgdHJpYW5ndWxhdGUgdGhlbSBpbmRlcGVuZGVudGx5XG5mdW5jdGlvbiBzcGxpdEVhcmN1dChzdGFydCwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIHNpemUpIHtcbiAgICAvLyBsb29rIGZvciBhIHZhbGlkIGRpYWdvbmFsIHRoYXQgZGl2aWRlcyB0aGUgcG9seWdvbiBpbnRvIHR3b1xuICAgIHZhciBhID0gc3RhcnQ7XG4gICAgZG8ge1xuICAgICAgICB2YXIgYiA9IGEubmV4dC5uZXh0O1xuICAgICAgICB3aGlsZSAoYiAhPT0gYS5wcmV2KSB7XG4gICAgICAgICAgICBpZiAoYS5pICE9PSBiLmkgJiYgaXNWYWxpZERpYWdvbmFsKGEsIGIpKSB7XG4gICAgICAgICAgICAgICAgLy8gc3BsaXQgdGhlIHBvbHlnb24gaW4gdHdvIGJ5IHRoZSBkaWFnb25hbFxuICAgICAgICAgICAgICAgIHZhciBjID0gc3BsaXRQb2x5Z29uKGEsIGIpO1xuXG4gICAgICAgICAgICAgICAgLy8gZmlsdGVyIGNvbGluZWFyIHBvaW50cyBhcm91bmQgdGhlIGN1dHNcbiAgICAgICAgICAgICAgICBhID0gZmlsdGVyUG9pbnRzKGEsIGEubmV4dCk7XG4gICAgICAgICAgICAgICAgYyA9IGZpbHRlclBvaW50cyhjLCBjLm5leHQpO1xuXG4gICAgICAgICAgICAgICAgLy8gcnVuIGVhcmN1dCBvbiBlYWNoIGhhbGZcbiAgICAgICAgICAgICAgICBlYXJjdXRMaW5rZWQoYSwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIHNpemUpO1xuICAgICAgICAgICAgICAgIGVhcmN1dExpbmtlZChjLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgc2l6ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYiA9IGIubmV4dDtcbiAgICAgICAgfVxuICAgICAgICBhID0gYS5uZXh0O1xuICAgIH0gd2hpbGUgKGEgIT09IHN0YXJ0KTtcbn1cblxuLy8gbGluayBldmVyeSBob2xlIGludG8gdGhlIG91dGVyIGxvb3AsIHByb2R1Y2luZyBhIHNpbmdsZS1yaW5nIHBvbHlnb24gd2l0aG91dCBob2xlc1xuZnVuY3Rpb24gZWxpbWluYXRlSG9sZXMoZGF0YSwgaG9sZUluZGljZXMsIG91dGVyTm9kZSwgZGltKSB7XG4gICAgdmFyIHF1ZXVlID0gW10sXG4gICAgICAgIGksIGxlbiwgc3RhcnQsIGVuZCwgbGlzdDtcblxuICAgIGZvciAoaSA9IDAsIGxlbiA9IGhvbGVJbmRpY2VzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIHN0YXJ0ID0gaG9sZUluZGljZXNbaV0gKiBkaW07XG4gICAgICAgIGVuZCA9IGkgPCBsZW4gLSAxID8gaG9sZUluZGljZXNbaSArIDFdICogZGltIDogZGF0YS5sZW5ndGg7XG4gICAgICAgIGxpc3QgPSBsaW5rZWRMaXN0KGRhdGEsIHN0YXJ0LCBlbmQsIGRpbSwgZmFsc2UpO1xuICAgICAgICBpZiAobGlzdCA9PT0gbGlzdC5uZXh0KSBsaXN0LnN0ZWluZXIgPSB0cnVlO1xuICAgICAgICBxdWV1ZS5wdXNoKGdldExlZnRtb3N0KGxpc3QpKTtcbiAgICB9XG5cbiAgICBxdWV1ZS5zb3J0KGNvbXBhcmVYKTtcblxuICAgIC8vIHByb2Nlc3MgaG9sZXMgZnJvbSBsZWZ0IHRvIHJpZ2h0XG4gICAgZm9yIChpID0gMDsgaSA8IHF1ZXVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGVsaW1pbmF0ZUhvbGUocXVldWVbaV0sIG91dGVyTm9kZSk7XG4gICAgICAgIG91dGVyTm9kZSA9IGZpbHRlclBvaW50cyhvdXRlck5vZGUsIG91dGVyTm9kZS5uZXh0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3V0ZXJOb2RlO1xufVxuXG5mdW5jdGlvbiBjb21wYXJlWChhLCBiKSB7XG4gICAgcmV0dXJuIGEueCAtIGIueDtcbn1cblxuLy8gZmluZCBhIGJyaWRnZSBiZXR3ZWVuIHZlcnRpY2VzIHRoYXQgY29ubmVjdHMgaG9sZSB3aXRoIGFuIG91dGVyIHJpbmcgYW5kIGFuZCBsaW5rIGl0XG5mdW5jdGlvbiBlbGltaW5hdGVIb2xlKGhvbGUsIG91dGVyTm9kZSkge1xuICAgIG91dGVyTm9kZSA9IGZpbmRIb2xlQnJpZGdlKGhvbGUsIG91dGVyTm9kZSk7XG4gICAgaWYgKG91dGVyTm9kZSkge1xuICAgICAgICB2YXIgYiA9IHNwbGl0UG9seWdvbihvdXRlck5vZGUsIGhvbGUpO1xuICAgICAgICBmaWx0ZXJQb2ludHMoYiwgYi5uZXh0KTtcbiAgICB9XG59XG5cbi8vIERhdmlkIEViZXJseSdzIGFsZ29yaXRobSBmb3IgZmluZGluZyBhIGJyaWRnZSBiZXR3ZWVuIGhvbGUgYW5kIG91dGVyIHBvbHlnb25cbmZ1bmN0aW9uIGZpbmRIb2xlQnJpZGdlKGhvbGUsIG91dGVyTm9kZSkge1xuICAgIHZhciBwID0gb3V0ZXJOb2RlLFxuICAgICAgICBoeCA9IGhvbGUueCxcbiAgICAgICAgaHkgPSBob2xlLnksXG4gICAgICAgIHF4ID0gLUluZmluaXR5LFxuICAgICAgICBtO1xuXG4gICAgLy8gZmluZCBhIHNlZ21lbnQgaW50ZXJzZWN0ZWQgYnkgYSByYXkgZnJvbSB0aGUgaG9sZSdzIGxlZnRtb3N0IHBvaW50IHRvIHRoZSBsZWZ0O1xuICAgIC8vIHNlZ21lbnQncyBlbmRwb2ludCB3aXRoIGxlc3NlciB4IHdpbGwgYmUgcG90ZW50aWFsIGNvbm5lY3Rpb24gcG9pbnRcbiAgICBkbyB7XG4gICAgICAgIGlmIChoeSA8PSBwLnkgJiYgaHkgPj0gcC5uZXh0LnkpIHtcbiAgICAgICAgICAgIHZhciB4ID0gcC54ICsgKGh5IC0gcC55KSAqIChwLm5leHQueCAtIHAueCkgLyAocC5uZXh0LnkgLSBwLnkpO1xuICAgICAgICAgICAgaWYgKHggPD0gaHggJiYgeCA+IHF4KSB7XG4gICAgICAgICAgICAgICAgcXggPSB4O1xuICAgICAgICAgICAgICAgIGlmICh4ID09PSBoeCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaHkgPT09IHAueSkgcmV0dXJuIHA7XG4gICAgICAgICAgICAgICAgICAgIGlmIChoeSA9PT0gcC5uZXh0LnkpIHJldHVybiBwLm5leHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG0gPSBwLnggPCBwLm5leHQueCA/IHAgOiBwLm5leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcCA9IHAubmV4dDtcbiAgICB9IHdoaWxlIChwICE9PSBvdXRlck5vZGUpO1xuXG4gICAgaWYgKCFtKSByZXR1cm4gbnVsbDtcblxuICAgIGlmIChoeCA9PT0gcXgpIHJldHVybiBtLnByZXY7IC8vIGhvbGUgdG91Y2hlcyBvdXRlciBzZWdtZW50OyBwaWNrIGxvd2VyIGVuZHBvaW50XG5cbiAgICAvLyBsb29rIGZvciBwb2ludHMgaW5zaWRlIHRoZSB0cmlhbmdsZSBvZiBob2xlIHBvaW50LCBzZWdtZW50IGludGVyc2VjdGlvbiBhbmQgZW5kcG9pbnQ7XG4gICAgLy8gaWYgdGhlcmUgYXJlIG5vIHBvaW50cyBmb3VuZCwgd2UgaGF2ZSBhIHZhbGlkIGNvbm5lY3Rpb247XG4gICAgLy8gb3RoZXJ3aXNlIGNob29zZSB0aGUgcG9pbnQgb2YgdGhlIG1pbmltdW0gYW5nbGUgd2l0aCB0aGUgcmF5IGFzIGNvbm5lY3Rpb24gcG9pbnRcblxuICAgIHZhciBzdG9wID0gbSxcbiAgICAgICAgbXggPSBtLngsXG4gICAgICAgIG15ID0gbS55LFxuICAgICAgICB0YW5NaW4gPSBJbmZpbml0eSxcbiAgICAgICAgdGFuO1xuXG4gICAgcCA9IG0ubmV4dDtcblxuICAgIHdoaWxlIChwICE9PSBzdG9wKSB7XG4gICAgICAgIGlmIChoeCA+PSBwLnggJiYgcC54ID49IG14ICYmXG4gICAgICAgICAgICAgICAgcG9pbnRJblRyaWFuZ2xlKGh5IDwgbXkgPyBoeCA6IHF4LCBoeSwgbXgsIG15LCBoeSA8IG15ID8gcXggOiBoeCwgaHksIHAueCwgcC55KSkge1xuXG4gICAgICAgICAgICB0YW4gPSBNYXRoLmFicyhoeSAtIHAueSkgLyAoaHggLSBwLngpOyAvLyB0YW5nZW50aWFsXG5cbiAgICAgICAgICAgIGlmICgodGFuIDwgdGFuTWluIHx8ICh0YW4gPT09IHRhbk1pbiAmJiBwLnggPiBtLngpKSAmJiBsb2NhbGx5SW5zaWRlKHAsIGhvbGUpKSB7XG4gICAgICAgICAgICAgICAgbSA9IHA7XG4gICAgICAgICAgICAgICAgdGFuTWluID0gdGFuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcCA9IHAubmV4dDtcbiAgICB9XG5cbiAgICByZXR1cm4gbTtcbn1cblxuLy8gaW50ZXJsaW5rIHBvbHlnb24gbm9kZXMgaW4gei1vcmRlclxuZnVuY3Rpb24gaW5kZXhDdXJ2ZShzdGFydCwgbWluWCwgbWluWSwgc2l6ZSkge1xuICAgIHZhciBwID0gc3RhcnQ7XG4gICAgZG8ge1xuICAgICAgICBpZiAocC56ID09PSBudWxsKSBwLnogPSB6T3JkZXIocC54LCBwLnksIG1pblgsIG1pblksIHNpemUpO1xuICAgICAgICBwLnByZXZaID0gcC5wcmV2O1xuICAgICAgICBwLm5leHRaID0gcC5uZXh0O1xuICAgICAgICBwID0gcC5uZXh0O1xuICAgIH0gd2hpbGUgKHAgIT09IHN0YXJ0KTtcblxuICAgIHAucHJldloubmV4dFogPSBudWxsO1xuICAgIHAucHJldlogPSBudWxsO1xuXG4gICAgc29ydExpbmtlZChwKTtcbn1cblxuLy8gU2ltb24gVGF0aGFtJ3MgbGlua2VkIGxpc3QgbWVyZ2Ugc29ydCBhbGdvcml0aG1cbi8vIGh0dHA6Ly93d3cuY2hpYXJrLmdyZWVuZW5kLm9yZy51ay9+c2d0YXRoYW0vYWxnb3JpdGhtcy9saXN0c29ydC5odG1sXG5mdW5jdGlvbiBzb3J0TGlua2VkKGxpc3QpIHtcbiAgICB2YXIgaSwgcCwgcSwgZSwgdGFpbCwgbnVtTWVyZ2VzLCBwU2l6ZSwgcVNpemUsXG4gICAgICAgIGluU2l6ZSA9IDE7XG5cbiAgICBkbyB7XG4gICAgICAgIHAgPSBsaXN0O1xuICAgICAgICBsaXN0ID0gbnVsbDtcbiAgICAgICAgdGFpbCA9IG51bGw7XG4gICAgICAgIG51bU1lcmdlcyA9IDA7XG5cbiAgICAgICAgd2hpbGUgKHApIHtcbiAgICAgICAgICAgIG51bU1lcmdlcysrO1xuICAgICAgICAgICAgcSA9IHA7XG4gICAgICAgICAgICBwU2l6ZSA9IDA7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaW5TaXplOyBpKyspIHtcbiAgICAgICAgICAgICAgICBwU2l6ZSsrO1xuICAgICAgICAgICAgICAgIHEgPSBxLm5leHRaO1xuICAgICAgICAgICAgICAgIGlmICghcSkgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHFTaXplID0gaW5TaXplO1xuXG4gICAgICAgICAgICB3aGlsZSAocFNpemUgPiAwIHx8IChxU2l6ZSA+IDAgJiYgcSkpIHtcblxuICAgICAgICAgICAgICAgIGlmIChwU2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBlID0gcTtcbiAgICAgICAgICAgICAgICAgICAgcSA9IHEubmV4dFo7XG4gICAgICAgICAgICAgICAgICAgIHFTaXplLS07XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChxU2l6ZSA9PT0gMCB8fCAhcSkge1xuICAgICAgICAgICAgICAgICAgICBlID0gcDtcbiAgICAgICAgICAgICAgICAgICAgcCA9IHAubmV4dFo7XG4gICAgICAgICAgICAgICAgICAgIHBTaXplLS07XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwLnogPD0gcS56KSB7XG4gICAgICAgICAgICAgICAgICAgIGUgPSBwO1xuICAgICAgICAgICAgICAgICAgICBwID0gcC5uZXh0WjtcbiAgICAgICAgICAgICAgICAgICAgcFNpemUtLTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBlID0gcTtcbiAgICAgICAgICAgICAgICAgICAgcSA9IHEubmV4dFo7XG4gICAgICAgICAgICAgICAgICAgIHFTaXplLS07XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHRhaWwpIHRhaWwubmV4dFogPSBlO1xuICAgICAgICAgICAgICAgIGVsc2UgbGlzdCA9IGU7XG5cbiAgICAgICAgICAgICAgICBlLnByZXZaID0gdGFpbDtcbiAgICAgICAgICAgICAgICB0YWlsID0gZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcCA9IHE7XG4gICAgICAgIH1cblxuICAgICAgICB0YWlsLm5leHRaID0gbnVsbDtcbiAgICAgICAgaW5TaXplICo9IDI7XG5cbiAgICB9IHdoaWxlIChudW1NZXJnZXMgPiAxKTtcblxuICAgIHJldHVybiBsaXN0O1xufVxuXG4vLyB6LW9yZGVyIG9mIGEgcG9pbnQgZ2l2ZW4gY29vcmRzIGFuZCBzaXplIG9mIHRoZSBkYXRhIGJvdW5kaW5nIGJveFxuZnVuY3Rpb24gek9yZGVyKHgsIHksIG1pblgsIG1pblksIHNpemUpIHtcbiAgICAvLyBjb29yZHMgYXJlIHRyYW5zZm9ybWVkIGludG8gbm9uLW5lZ2F0aXZlIDE1LWJpdCBpbnRlZ2VyIHJhbmdlXG4gICAgeCA9IDMyNzY3ICogKHggLSBtaW5YKSAvIHNpemU7XG4gICAgeSA9IDMyNzY3ICogKHkgLSBtaW5ZKSAvIHNpemU7XG5cbiAgICB4ID0gKHggfCAoeCA8PCA4KSkgJiAweDAwRkYwMEZGO1xuICAgIHggPSAoeCB8ICh4IDw8IDQpKSAmIDB4MEYwRjBGMEY7XG4gICAgeCA9ICh4IHwgKHggPDwgMikpICYgMHgzMzMzMzMzMztcbiAgICB4ID0gKHggfCAoeCA8PCAxKSkgJiAweDU1NTU1NTU1O1xuXG4gICAgeSA9ICh5IHwgKHkgPDwgOCkpICYgMHgwMEZGMDBGRjtcbiAgICB5ID0gKHkgfCAoeSA8PCA0KSkgJiAweDBGMEYwRjBGO1xuICAgIHkgPSAoeSB8ICh5IDw8IDIpKSAmIDB4MzMzMzMzMzM7XG4gICAgeSA9ICh5IHwgKHkgPDwgMSkpICYgMHg1NTU1NTU1NTtcblxuICAgIHJldHVybiB4IHwgKHkgPDwgMSk7XG59XG5cbi8vIGZpbmQgdGhlIGxlZnRtb3N0IG5vZGUgb2YgYSBwb2x5Z29uIHJpbmdcbmZ1bmN0aW9uIGdldExlZnRtb3N0KHN0YXJ0KSB7XG4gICAgdmFyIHAgPSBzdGFydCxcbiAgICAgICAgbGVmdG1vc3QgPSBzdGFydDtcbiAgICBkbyB7XG4gICAgICAgIGlmIChwLnggPCBsZWZ0bW9zdC54KSBsZWZ0bW9zdCA9IHA7XG4gICAgICAgIHAgPSBwLm5leHQ7XG4gICAgfSB3aGlsZSAocCAhPT0gc3RhcnQpO1xuXG4gICAgcmV0dXJuIGxlZnRtb3N0O1xufVxuXG4vLyBjaGVjayBpZiBhIHBvaW50IGxpZXMgd2l0aGluIGEgY29udmV4IHRyaWFuZ2xlXG5mdW5jdGlvbiBwb2ludEluVHJpYW5nbGUoYXgsIGF5LCBieCwgYnksIGN4LCBjeSwgcHgsIHB5KSB7XG4gICAgcmV0dXJuIChjeCAtIHB4KSAqIChheSAtIHB5KSAtIChheCAtIHB4KSAqIChjeSAtIHB5KSA+PSAwICYmXG4gICAgICAgICAgIChheCAtIHB4KSAqIChieSAtIHB5KSAtIChieCAtIHB4KSAqIChheSAtIHB5KSA+PSAwICYmXG4gICAgICAgICAgIChieCAtIHB4KSAqIChjeSAtIHB5KSAtIChjeCAtIHB4KSAqIChieSAtIHB5KSA+PSAwO1xufVxuXG4vLyBjaGVjayBpZiBhIGRpYWdvbmFsIGJldHdlZW4gdHdvIHBvbHlnb24gbm9kZXMgaXMgdmFsaWQgKGxpZXMgaW4gcG9seWdvbiBpbnRlcmlvcilcbmZ1bmN0aW9uIGlzVmFsaWREaWFnb25hbChhLCBiKSB7XG4gICAgcmV0dXJuIGEubmV4dC5pICE9PSBiLmkgJiYgYS5wcmV2LmkgIT09IGIuaSAmJiAhaW50ZXJzZWN0c1BvbHlnb24oYSwgYikgJiZcbiAgICAgICAgICAgbG9jYWxseUluc2lkZShhLCBiKSAmJiBsb2NhbGx5SW5zaWRlKGIsIGEpICYmIG1pZGRsZUluc2lkZShhLCBiKTtcbn1cblxuLy8gc2lnbmVkIGFyZWEgb2YgYSB0cmlhbmdsZVxuZnVuY3Rpb24gYXJlYShwLCBxLCByKSB7XG4gICAgcmV0dXJuIChxLnkgLSBwLnkpICogKHIueCAtIHEueCkgLSAocS54IC0gcC54KSAqIChyLnkgLSBxLnkpO1xufVxuXG4vLyBjaGVjayBpZiB0d28gcG9pbnRzIGFyZSBlcXVhbFxuZnVuY3Rpb24gZXF1YWxzKHAxLCBwMikge1xuICAgIHJldHVybiBwMS54ID09PSBwMi54ICYmIHAxLnkgPT09IHAyLnk7XG59XG5cbi8vIGNoZWNrIGlmIHR3byBzZWdtZW50cyBpbnRlcnNlY3RcbmZ1bmN0aW9uIGludGVyc2VjdHMocDEsIHExLCBwMiwgcTIpIHtcbiAgICBpZiAoKGVxdWFscyhwMSwgcTEpICYmIGVxdWFscyhwMiwgcTIpKSB8fFxuICAgICAgICAoZXF1YWxzKHAxLCBxMikgJiYgZXF1YWxzKHAyLCBxMSkpKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gYXJlYShwMSwgcTEsIHAyKSA+IDAgIT09IGFyZWEocDEsIHExLCBxMikgPiAwICYmXG4gICAgICAgICAgIGFyZWEocDIsIHEyLCBwMSkgPiAwICE9PSBhcmVhKHAyLCBxMiwgcTEpID4gMDtcbn1cblxuLy8gY2hlY2sgaWYgYSBwb2x5Z29uIGRpYWdvbmFsIGludGVyc2VjdHMgYW55IHBvbHlnb24gc2VnbWVudHNcbmZ1bmN0aW9uIGludGVyc2VjdHNQb2x5Z29uKGEsIGIpIHtcbiAgICB2YXIgcCA9IGE7XG4gICAgZG8ge1xuICAgICAgICBpZiAocC5pICE9PSBhLmkgJiYgcC5uZXh0LmkgIT09IGEuaSAmJiBwLmkgIT09IGIuaSAmJiBwLm5leHQuaSAhPT0gYi5pICYmXG4gICAgICAgICAgICAgICAgaW50ZXJzZWN0cyhwLCBwLm5leHQsIGEsIGIpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgcCA9IHAubmV4dDtcbiAgICB9IHdoaWxlIChwICE9PSBhKTtcblxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuLy8gY2hlY2sgaWYgYSBwb2x5Z29uIGRpYWdvbmFsIGlzIGxvY2FsbHkgaW5zaWRlIHRoZSBwb2x5Z29uXG5mdW5jdGlvbiBsb2NhbGx5SW5zaWRlKGEsIGIpIHtcbiAgICByZXR1cm4gYXJlYShhLnByZXYsIGEsIGEubmV4dCkgPCAwID9cbiAgICAgICAgYXJlYShhLCBiLCBhLm5leHQpID49IDAgJiYgYXJlYShhLCBhLnByZXYsIGIpID49IDAgOlxuICAgICAgICBhcmVhKGEsIGIsIGEucHJldikgPCAwIHx8IGFyZWEoYSwgYS5uZXh0LCBiKSA8IDA7XG59XG5cbi8vIGNoZWNrIGlmIHRoZSBtaWRkbGUgcG9pbnQgb2YgYSBwb2x5Z29uIGRpYWdvbmFsIGlzIGluc2lkZSB0aGUgcG9seWdvblxuZnVuY3Rpb24gbWlkZGxlSW5zaWRlKGEsIGIpIHtcbiAgICB2YXIgcCA9IGEsXG4gICAgICAgIGluc2lkZSA9IGZhbHNlLFxuICAgICAgICBweCA9IChhLnggKyBiLngpIC8gMixcbiAgICAgICAgcHkgPSAoYS55ICsgYi55KSAvIDI7XG4gICAgZG8ge1xuICAgICAgICBpZiAoKChwLnkgPiBweSkgIT09IChwLm5leHQueSA+IHB5KSkgJiYgKHB4IDwgKHAubmV4dC54IC0gcC54KSAqIChweSAtIHAueSkgLyAocC5uZXh0LnkgLSBwLnkpICsgcC54KSlcbiAgICAgICAgICAgIGluc2lkZSA9ICFpbnNpZGU7XG4gICAgICAgIHAgPSBwLm5leHQ7XG4gICAgfSB3aGlsZSAocCAhPT0gYSk7XG5cbiAgICByZXR1cm4gaW5zaWRlO1xufVxuXG4vLyBsaW5rIHR3byBwb2x5Z29uIHZlcnRpY2VzIHdpdGggYSBicmlkZ2U7IGlmIHRoZSB2ZXJ0aWNlcyBiZWxvbmcgdG8gdGhlIHNhbWUgcmluZywgaXQgc3BsaXRzIHBvbHlnb24gaW50byB0d287XG4vLyBpZiBvbmUgYmVsb25ncyB0byB0aGUgb3V0ZXIgcmluZyBhbmQgYW5vdGhlciB0byBhIGhvbGUsIGl0IG1lcmdlcyBpdCBpbnRvIGEgc2luZ2xlIHJpbmdcbmZ1bmN0aW9uIHNwbGl0UG9seWdvbihhLCBiKSB7XG4gICAgdmFyIGEyID0gbmV3IE5vZGUoYS5pLCBhLngsIGEueSksXG4gICAgICAgIGIyID0gbmV3IE5vZGUoYi5pLCBiLngsIGIueSksXG4gICAgICAgIGFuID0gYS5uZXh0LFxuICAgICAgICBicCA9IGIucHJldjtcblxuICAgIGEubmV4dCA9IGI7XG4gICAgYi5wcmV2ID0gYTtcblxuICAgIGEyLm5leHQgPSBhbjtcbiAgICBhbi5wcmV2ID0gYTI7XG5cbiAgICBiMi5uZXh0ID0gYTI7XG4gICAgYTIucHJldiA9IGIyO1xuXG4gICAgYnAubmV4dCA9IGIyO1xuICAgIGIyLnByZXYgPSBicDtcblxuICAgIHJldHVybiBiMjtcbn1cblxuLy8gY3JlYXRlIGEgbm9kZSBhbmQgb3B0aW9uYWxseSBsaW5rIGl0IHdpdGggcHJldmlvdXMgb25lIChpbiBhIGNpcmN1bGFyIGRvdWJseSBsaW5rZWQgbGlzdClcbmZ1bmN0aW9uIGluc2VydE5vZGUoaSwgeCwgeSwgbGFzdCkge1xuICAgIHZhciBwID0gbmV3IE5vZGUoaSwgeCwgeSk7XG5cbiAgICBpZiAoIWxhc3QpIHtcbiAgICAgICAgcC5wcmV2ID0gcDtcbiAgICAgICAgcC5uZXh0ID0gcDtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIHAubmV4dCA9IGxhc3QubmV4dDtcbiAgICAgICAgcC5wcmV2ID0gbGFzdDtcbiAgICAgICAgbGFzdC5uZXh0LnByZXYgPSBwO1xuICAgICAgICBsYXN0Lm5leHQgPSBwO1xuICAgIH1cbiAgICByZXR1cm4gcDtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlTm9kZShwKSB7XG4gICAgcC5uZXh0LnByZXYgPSBwLnByZXY7XG4gICAgcC5wcmV2Lm5leHQgPSBwLm5leHQ7XG5cbiAgICBpZiAocC5wcmV2WikgcC5wcmV2Wi5uZXh0WiA9IHAubmV4dFo7XG4gICAgaWYgKHAubmV4dFopIHAubmV4dFoucHJldlogPSBwLnByZXZaO1xufVxuXG5mdW5jdGlvbiBOb2RlKGksIHgsIHkpIHtcbiAgICAvLyB2ZXJ0aWNlIGluZGV4IGluIGNvb3JkaW5hdGVzIGFycmF5XG4gICAgdGhpcy5pID0gaTtcblxuICAgIC8vIHZlcnRleCBjb29yZGluYXRlc1xuICAgIHRoaXMueCA9IHg7XG4gICAgdGhpcy55ID0geTtcblxuICAgIC8vIHByZXZpb3VzIGFuZCBuZXh0IHZlcnRpY2Ugbm9kZXMgaW4gYSBwb2x5Z29uIHJpbmdcbiAgICB0aGlzLnByZXYgPSBudWxsO1xuICAgIHRoaXMubmV4dCA9IG51bGw7XG5cbiAgICAvLyB6LW9yZGVyIGN1cnZlIHZhbHVlXG4gICAgdGhpcy56ID0gbnVsbDtcblxuICAgIC8vIHByZXZpb3VzIGFuZCBuZXh0IG5vZGVzIGluIHotb3JkZXJcbiAgICB0aGlzLnByZXZaID0gbnVsbDtcbiAgICB0aGlzLm5leHRaID0gbnVsbDtcblxuICAgIC8vIGluZGljYXRlcyB3aGV0aGVyIHRoaXMgaXMgYSBzdGVpbmVyIHBvaW50XG4gICAgdGhpcy5zdGVpbmVyID0gZmFsc2U7XG59XG5cbi8vIHJldHVybiBhIHBlcmNlbnRhZ2UgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBwb2x5Z29uIGFyZWEgYW5kIGl0cyB0cmlhbmd1bGF0aW9uIGFyZWE7XG4vLyB1c2VkIHRvIHZlcmlmeSBjb3JyZWN0bmVzcyBvZiB0cmlhbmd1bGF0aW9uXG5lYXJjdXQuZGV2aWF0aW9uID0gZnVuY3Rpb24gKGRhdGEsIGhvbGVJbmRpY2VzLCBkaW0sIHRyaWFuZ2xlcykge1xuICAgIHZhciBoYXNIb2xlcyA9IGhvbGVJbmRpY2VzICYmIGhvbGVJbmRpY2VzLmxlbmd0aDtcbiAgICB2YXIgb3V0ZXJMZW4gPSBoYXNIb2xlcyA/IGhvbGVJbmRpY2VzWzBdICogZGltIDogZGF0YS5sZW5ndGg7XG5cbiAgICB2YXIgcG9seWdvbkFyZWEgPSBNYXRoLmFicyhzaWduZWRBcmVhKGRhdGEsIDAsIG91dGVyTGVuLCBkaW0pKTtcbiAgICBpZiAoaGFzSG9sZXMpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGhvbGVJbmRpY2VzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgc3RhcnQgPSBob2xlSW5kaWNlc1tpXSAqIGRpbTtcbiAgICAgICAgICAgIHZhciBlbmQgPSBpIDwgbGVuIC0gMSA/IGhvbGVJbmRpY2VzW2kgKyAxXSAqIGRpbSA6IGRhdGEubGVuZ3RoO1xuICAgICAgICAgICAgcG9seWdvbkFyZWEgLT0gTWF0aC5hYnMoc2lnbmVkQXJlYShkYXRhLCBzdGFydCwgZW5kLCBkaW0pKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciB0cmlhbmdsZXNBcmVhID0gMDtcbiAgICBmb3IgKGkgPSAwOyBpIDwgdHJpYW5nbGVzLmxlbmd0aDsgaSArPSAzKSB7XG4gICAgICAgIHZhciBhID0gdHJpYW5nbGVzW2ldICogZGltO1xuICAgICAgICB2YXIgYiA9IHRyaWFuZ2xlc1tpICsgMV0gKiBkaW07XG4gICAgICAgIHZhciBjID0gdHJpYW5nbGVzW2kgKyAyXSAqIGRpbTtcbiAgICAgICAgdHJpYW5nbGVzQXJlYSArPSBNYXRoLmFicyhcbiAgICAgICAgICAgIChkYXRhW2FdIC0gZGF0YVtjXSkgKiAoZGF0YVtiICsgMV0gLSBkYXRhW2EgKyAxXSkgLVxuICAgICAgICAgICAgKGRhdGFbYV0gLSBkYXRhW2JdKSAqIChkYXRhW2MgKyAxXSAtIGRhdGFbYSArIDFdKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBvbHlnb25BcmVhID09PSAwICYmIHRyaWFuZ2xlc0FyZWEgPT09IDAgPyAwIDpcbiAgICAgICAgTWF0aC5hYnMoKHRyaWFuZ2xlc0FyZWEgLSBwb2x5Z29uQXJlYSkgLyBwb2x5Z29uQXJlYSk7XG59O1xuXG5mdW5jdGlvbiBzaWduZWRBcmVhKGRhdGEsIHN0YXJ0LCBlbmQsIGRpbSkge1xuICAgIHZhciBzdW0gPSAwO1xuICAgIGZvciAodmFyIGkgPSBzdGFydCwgaiA9IGVuZCAtIGRpbTsgaSA8IGVuZDsgaSArPSBkaW0pIHtcbiAgICAgICAgc3VtICs9IChkYXRhW2pdIC0gZGF0YVtpXSkgKiAoZGF0YVtpICsgMV0gKyBkYXRhW2ogKyAxXSk7XG4gICAgICAgIGogPSBpO1xuICAgIH1cbiAgICByZXR1cm4gc3VtO1xufVxuXG4vLyB0dXJuIGEgcG9seWdvbiBpbiBhIG11bHRpLWRpbWVuc2lvbmFsIGFycmF5IGZvcm0gKGUuZy4gYXMgaW4gR2VvSlNPTikgaW50byBhIGZvcm0gRWFyY3V0IGFjY2VwdHNcbmVhcmN1dC5mbGF0dGVuID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICB2YXIgZGltID0gZGF0YVswXVswXS5sZW5ndGgsXG4gICAgICAgIHJlc3VsdCA9IHt2ZXJ0aWNlczogW10sIGhvbGVzOiBbXSwgZGltZW5zaW9uczogZGltfSxcbiAgICAgICAgaG9sZUluZGV4ID0gMDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGRhdGFbaV0ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGZvciAodmFyIGQgPSAwOyBkIDwgZGltOyBkKyspIHJlc3VsdC52ZXJ0aWNlcy5wdXNoKGRhdGFbaV1bal1bZF0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpID4gMCkge1xuICAgICAgICAgICAgaG9sZUluZGV4ICs9IGRhdGFbaSAtIDFdLmxlbmd0aDtcbiAgICAgICAgICAgIHJlc3VsdC5ob2xlcy5wdXNoKGhvbGVJbmRleCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCJ2YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZyxcblx0aXNBcnJheSA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24ob2JqKXtcblx0XHRyZXR1cm4gdG9TdHJpbmcuY2FsbChvYmopID09PSBcIltvYmplY3QgQXJyYXldXCI7XG5cdH0sXG5cdG9iaktleXMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbihvYmopIHtcblx0XHRcdHZhciBrZXlzID0gW107XG5cdFx0XHRmb3IgKHZhciBuYW1lIGluIG9iaikge1xuXHRcdFx0XHRpZiAob2JqLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG5cdFx0XHRcdFx0a2V5cy5wdXNoKG5hbWUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4ga2V5cztcblx0XHR9LFxuXHRzdHJSZWcgPSAvW1xcdTAwMDAtXFx1MDAxZlwiXFxcXF0vZyxcblx0c3RyUmVwbGFjZSA9IGZ1bmN0aW9uKHN0cikge1xuXHRcdHZhciBjb2RlID0gc3RyLmNoYXJDb2RlQXQoMCk7XG5cdFx0c3dpdGNoIChjb2RlKSB7XG5cdFx0XHRjYXNlIDM0OiByZXR1cm4gJ1xcXFxcIic7XG5cdFx0XHRjYXNlIDkyOiByZXR1cm4gJ1xcXFxcXFxcJztcblx0XHRcdGNhc2UgMTI6IHJldHVybiBcIlxcXFxmXCI7XG5cdFx0XHRjYXNlIDEwOiByZXR1cm4gXCJcXFxcblwiO1xuXHRcdFx0Y2FzZSAxMzogcmV0dXJuIFwiXFxcXHJcIjtcblx0XHRcdGNhc2UgOTogcmV0dXJuIFwiXFxcXHRcIjtcblx0XHRcdGNhc2UgODogcmV0dXJuIFwiXFxcXGJcIjtcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdGlmIChjb2RlID4gMTUpIHtcblx0XHRcdFx0XHRyZXR1cm4gXCJcXFxcdTAwXCIgKyBjb2RlLnRvU3RyaW5nKDE2KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZXR1cm4gXCJcXFxcdTAwMFwiICsgY29kZS50b1N0cmluZygxNik7XG5cdFx0XHRcdH1cblx0XHR9XG5cdH07XG5cbi8qKlxuICogU2ltcGxlIHN0YWJsZSBzdHJpbmdpZnkuIE9iamVjdCBrZXlzIHNvcnRlZC4gTm8gb3B0aW9ucywgbm8gc3BhY2VzLlxuICogQHBhcmFtIHsqfSB2YWxcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gc2ltcGxlU3RhYmxlU3RyaW5naWZ5KHZhbCkge1xuXHRpZiAodmFsICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gJycrIHNzcyh2YWwpO1xuXHR9XG59O1xuXG5tb2R1bGUuZXhwb3J0cy5zdHJpbmdTZWFyY2ggPSBzdHJSZWc7XG5tb2R1bGUuZXhwb3J0cy5zdHJpbmdSZXBsYWNlID0gc3RyUmVwbGFjZTtcblxuZnVuY3Rpb24gc3NzKHZhbCkge1xuXHR2YXIgaSwgbWF4LCBzdHIsIGtleXMsIGtleSwgcGFzcztcblx0c3dpdGNoICh0eXBlb2YgdmFsKSB7XG5cdFx0Y2FzZSBcIm9iamVjdFwiOlxuXHRcdFx0aWYgKHZhbCA9PT0gbnVsbCkge1xuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdH0gZWxzZSBpZiAoaXNBcnJheSh2YWwpKSB7XG5cdFx0XHRcdHN0ciA9ICdbJztcblx0XHRcdFx0bWF4ID0gdmFsLmxlbmd0aCAtIDE7XG5cdFx0XHRcdGZvciAoaSA9IDA7IGkgPCBtYXg7IGkrKykge1xuXHRcdFx0XHRcdHN0ciArPSBzc3ModmFsW2ldKSArICcsJztcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAobWF4ID4gLTEpIHtcblx0XHRcdFx0XHRzdHIgKz0gc3NzKHZhbFtpXSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHN0ciArICddJztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIG9ubHkgb2JqZWN0IGlzIGxlZnRcblx0XHRcdFx0a2V5cyA9IG9iaktleXModmFsKS5zb3J0KCk7XG5cdFx0XHRcdG1heCA9IGtleXMubGVuZ3RoO1xuXHRcdFx0XHRzdHIgPSBcIntcIjtcblx0XHRcdFx0a2V5ID0ga2V5c1tpID0gMF07XG5cdFx0XHRcdHBhc3MgPSBtYXggPiAwICYmIHZhbFtrZXldICE9PSB1bmRlZmluZWQ7XG5cdFx0XHRcdHdoaWxlIChpIDwgbWF4KSB7XG5cdFx0XHRcdFx0aWYgKHBhc3MpIHtcblx0XHRcdFx0XHRcdHN0ciArPSAnXCInICsga2V5LnJlcGxhY2Uoc3RyUmVnLCBzdHJSZXBsYWNlKSArICdcIjonICsgc3NzKHZhbFtrZXldKTtcblx0XHRcdFx0XHRcdGtleSA9IGtleXNbKytpXTtcblx0XHRcdFx0XHRcdHBhc3MgPSBpIDwgbWF4ICYmIHZhbFtrZXldICE9PSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHRpZiAocGFzcykge1xuXHRcdFx0XHRcdFx0XHRzdHIgKz0gJywnO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRrZXkgPSBrZXlzWysraV07XG5cdFx0XHRcdFx0XHRwYXNzID0gaSA8IG1heCAmJiB2YWxba2V5XSAhPT0gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gc3RyICsgJ30nO1xuXHRcdFx0fVxuXHRcdGNhc2UgXCJ1bmRlZmluZWRcIjpcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdGNhc2UgXCJzdHJpbmdcIjpcblx0XHRcdHJldHVybiAnXCInICsgdmFsLnJlcGxhY2Uoc3RyUmVnLCBzdHJSZXBsYWNlKSArICdcIic7XG5cdFx0ZGVmYXVsdDpcblx0XHRcdHJldHVybiB2YWw7XG5cdH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVGaWx0ZXI7XG5cbnZhciB0eXBlcyA9IFsnVW5rbm93bicsICdQb2ludCcsICdMaW5lU3RyaW5nJywgJ1BvbHlnb24nXTtcblxuLyoqXG4gKiBHaXZlbiBhIGZpbHRlciBleHByZXNzZWQgYXMgbmVzdGVkIGFycmF5cywgcmV0dXJuIGEgbmV3IGZ1bmN0aW9uXG4gKiB0aGF0IGV2YWx1YXRlcyB3aGV0aGVyIGEgZ2l2ZW4gZmVhdHVyZSAod2l0aCBhIC5wcm9wZXJ0aWVzIG9yIC50YWdzIHByb3BlcnR5KVxuICogcGFzc2VzIGl0cyB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGZpbHRlciBtYXBib3ggZ2wgZmlsdGVyXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IGZpbHRlci1ldmFsdWF0aW5nIGZ1bmN0aW9uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUZpbHRlcihmaWx0ZXIpIHtcbiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uKCdmJywgJ3ZhciBwID0gKGYgJiYgZi5wcm9wZXJ0aWVzIHx8IHt9KTsgcmV0dXJuICcgKyBjb21waWxlKGZpbHRlcikpO1xufVxuXG5mdW5jdGlvbiBjb21waWxlKGZpbHRlcikge1xuICAgIGlmICghZmlsdGVyKSByZXR1cm4gJ3RydWUnO1xuICAgIHZhciBvcCA9IGZpbHRlclswXTtcbiAgICBpZiAoZmlsdGVyLmxlbmd0aCA8PSAxKSByZXR1cm4gb3AgPT09ICdhbnknID8gJ2ZhbHNlJyA6ICd0cnVlJztcbiAgICB2YXIgc3RyID1cbiAgICAgICAgb3AgPT09ICc9PScgPyBjb21waWxlQ29tcGFyaXNvbk9wKGZpbHRlclsxXSwgZmlsdGVyWzJdLCAnPT09JywgZmFsc2UpIDpcbiAgICAgICAgb3AgPT09ICchPScgPyBjb21waWxlQ29tcGFyaXNvbk9wKGZpbHRlclsxXSwgZmlsdGVyWzJdLCAnIT09JywgZmFsc2UpIDpcbiAgICAgICAgb3AgPT09ICc8JyB8fFxuICAgICAgICBvcCA9PT0gJz4nIHx8XG4gICAgICAgIG9wID09PSAnPD0nIHx8XG4gICAgICAgIG9wID09PSAnPj0nID8gY29tcGlsZUNvbXBhcmlzb25PcChmaWx0ZXJbMV0sIGZpbHRlclsyXSwgb3AsIHRydWUpIDpcbiAgICAgICAgb3AgPT09ICdhbnknID8gY29tcGlsZUxvZ2ljYWxPcChmaWx0ZXIuc2xpY2UoMSksICd8fCcpIDpcbiAgICAgICAgb3AgPT09ICdhbGwnID8gY29tcGlsZUxvZ2ljYWxPcChmaWx0ZXIuc2xpY2UoMSksICcmJicpIDpcbiAgICAgICAgb3AgPT09ICdub25lJyA/IGNvbXBpbGVOZWdhdGlvbihjb21waWxlTG9naWNhbE9wKGZpbHRlci5zbGljZSgxKSwgJ3x8JykpIDpcbiAgICAgICAgb3AgPT09ICdpbicgPyBjb21waWxlSW5PcChmaWx0ZXJbMV0sIGZpbHRlci5zbGljZSgyKSkgOlxuICAgICAgICBvcCA9PT0gJyFpbicgPyBjb21waWxlTmVnYXRpb24oY29tcGlsZUluT3AoZmlsdGVyWzFdLCBmaWx0ZXIuc2xpY2UoMikpKSA6XG4gICAgICAgIG9wID09PSAnaGFzJyA/IGNvbXBpbGVIYXNPcChmaWx0ZXJbMV0pIDpcbiAgICAgICAgb3AgPT09ICchaGFzJyA/IGNvbXBpbGVOZWdhdGlvbihjb21waWxlSGFzT3AoW2ZpbHRlclsxXV0pKSA6XG4gICAgICAgICd0cnVlJztcbiAgICByZXR1cm4gJygnICsgc3RyICsgJyknO1xufVxuXG5mdW5jdGlvbiBjb21waWxlUHJvcGVydHlSZWZlcmVuY2UocHJvcGVydHkpIHtcbiAgICByZXR1cm4gcHJvcGVydHkgPT09ICckdHlwZScgPyAnZi50eXBlJyA6XG4gICAgICAgIHByb3BlcnR5ID09PSAnJGlkJyA/ICdmLmlkJyA6XG4gICAgICAgICdwWycgKyBKU09OLnN0cmluZ2lmeShwcm9wZXJ0eSkgKyAnXSc7XG59XG5cbmZ1bmN0aW9uIGNvbXBpbGVDb21wYXJpc29uT3AocHJvcGVydHksIHZhbHVlLCBvcCwgY2hlY2tUeXBlKSB7XG4gICAgdmFyIGxlZnQgPSBjb21waWxlUHJvcGVydHlSZWZlcmVuY2UocHJvcGVydHkpO1xuICAgIHZhciByaWdodCA9IHByb3BlcnR5ID09PSAnJHR5cGUnID8gdHlwZXMuaW5kZXhPZih2YWx1ZSkgOiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgcmV0dXJuIChjaGVja1R5cGUgPyAndHlwZW9mICcgKyBsZWZ0ICsgJz09PSB0eXBlb2YgJyArIHJpZ2h0ICsgJyYmJyA6ICcnKSArIGxlZnQgKyBvcCArIHJpZ2h0O1xufVxuXG5mdW5jdGlvbiBjb21waWxlTG9naWNhbE9wKGV4cHJlc3Npb25zLCBvcCkge1xuICAgIHJldHVybiBleHByZXNzaW9ucy5tYXAoY29tcGlsZSkuam9pbihvcCk7XG59XG5cbmZ1bmN0aW9uIGNvbXBpbGVJbk9wKHByb3BlcnR5LCB2YWx1ZXMpIHtcbiAgICBpZiAocHJvcGVydHkgPT09ICckdHlwZScpIHZhbHVlcyA9IHZhbHVlcy5tYXAoZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIHR5cGVzLmluZGV4T2YodmFsdWUpOyB9KTtcbiAgICB2YXIgbGVmdCA9IEpTT04uc3RyaW5naWZ5KHZhbHVlcy5zb3J0KGNvbXBhcmUpKTtcbiAgICB2YXIgcmlnaHQgPSBjb21waWxlUHJvcGVydHlSZWZlcmVuY2UocHJvcGVydHkpO1xuXG4gICAgaWYgKHZhbHVlcy5sZW5ndGggPD0gMjAwKSByZXR1cm4gbGVmdCArICcuaW5kZXhPZignICsgcmlnaHQgKyAnKSAhPT0gLTEnO1xuXG4gICAgcmV0dXJuICdmdW5jdGlvbih2LCBhLCBpLCBqKSB7JyArXG4gICAgICAgICd3aGlsZSAoaSA8PSBqKSB7IHZhciBtID0gKGkgKyBqKSA+PiAxOycgK1xuICAgICAgICAnICAgIGlmIChhW21dID09PSB2KSByZXR1cm4gdHJ1ZTsgaWYgKGFbbV0gPiB2KSBqID0gbSAtIDE7IGVsc2UgaSA9IG0gKyAxOycgK1xuICAgICAgICAnfScgK1xuICAgICdyZXR1cm4gZmFsc2U7IH0oJyArIHJpZ2h0ICsgJywgJyArIGxlZnQgKyAnLDAsJyArICh2YWx1ZXMubGVuZ3RoIC0gMSkgKyAnKSc7XG59XG5cbmZ1bmN0aW9uIGNvbXBpbGVIYXNPcChwcm9wZXJ0eSkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShwcm9wZXJ0eSkgKyAnIGluIHAnO1xufVxuXG5mdW5jdGlvbiBjb21waWxlTmVnYXRpb24oZXhwcmVzc2lvbikge1xuICAgIHJldHVybiAnISgnICsgZXhwcmVzc2lvbiArICcpJztcbn1cblxuLy8gQ29tcGFyaXNvbiBmdW5jdGlvbiB0byBzb3J0IG51bWJlcnMgYW5kIHN0cmluZ3NcbmZ1bmN0aW9uIGNvbXBhcmUoYSwgYikge1xuICAgIHJldHVybiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogMDtcbn1cbiIsInZhciB3Z3M4NCA9IHJlcXVpcmUoJ3dnczg0Jyk7XG5cbm1vZHVsZS5leHBvcnRzLmdlb21ldHJ5ID0gZ2VvbWV0cnk7XG5tb2R1bGUuZXhwb3J0cy5yaW5nID0gcmluZ0FyZWE7XG5cbmZ1bmN0aW9uIGdlb21ldHJ5KF8pIHtcbiAgICBpZiAoXy50eXBlID09PSAnUG9seWdvbicpIHJldHVybiBwb2x5Z29uQXJlYShfLmNvb3JkaW5hdGVzKTtcbiAgICBlbHNlIGlmIChfLnR5cGUgPT09ICdNdWx0aVBvbHlnb24nKSB7XG4gICAgICAgIHZhciBhcmVhID0gMDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBfLmNvb3JkaW5hdGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhcmVhICs9IHBvbHlnb25BcmVhKF8uY29vcmRpbmF0ZXNbaV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcmVhO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gcG9seWdvbkFyZWEoY29vcmRzKSB7XG4gICAgdmFyIGFyZWEgPSAwO1xuICAgIGlmIChjb29yZHMgJiYgY29vcmRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYXJlYSArPSBNYXRoLmFicyhyaW5nQXJlYShjb29yZHNbMF0pKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBjb29yZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGFyZWEgLT0gTWF0aC5hYnMocmluZ0FyZWEoY29vcmRzW2ldKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFyZWE7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlIHRoZSBhcHByb3hpbWF0ZSBhcmVhIG9mIHRoZSBwb2x5Z29uIHdlcmUgaXQgcHJvamVjdGVkIG9udG9cbiAqICAgICB0aGUgZWFydGguICBOb3RlIHRoYXQgdGhpcyBhcmVhIHdpbGwgYmUgcG9zaXRpdmUgaWYgcmluZyBpcyBvcmllbnRlZFxuICogICAgIGNsb2Nrd2lzZSwgb3RoZXJ3aXNlIGl0IHdpbGwgYmUgbmVnYXRpdmUuXG4gKlxuICogUmVmZXJlbmNlOlxuICogUm9iZXJ0LiBHLiBDaGFtYmVybGFpbiBhbmQgV2lsbGlhbSBILiBEdXF1ZXR0ZSwgXCJTb21lIEFsZ29yaXRobXMgZm9yXG4gKiAgICAgUG9seWdvbnMgb24gYSBTcGhlcmVcIiwgSlBMIFB1YmxpY2F0aW9uIDA3LTAzLCBKZXQgUHJvcHVsc2lvblxuICogICAgIExhYm9yYXRvcnksIFBhc2FkZW5hLCBDQSwgSnVuZSAyMDA3IGh0dHA6Ly90cnMtbmV3LmpwbC5uYXNhLmdvdi9kc3BhY2UvaGFuZGxlLzIwMTQvNDA0MDlcbiAqXG4gKiBSZXR1cm5zOlxuICoge2Zsb2F0fSBUaGUgYXBwcm94aW1hdGUgc2lnbmVkIGdlb2Rlc2ljIGFyZWEgb2YgdGhlIHBvbHlnb24gaW4gc3F1YXJlXG4gKiAgICAgbWV0ZXJzLlxuICovXG5cbmZ1bmN0aW9uIHJpbmdBcmVhKGNvb3Jkcykge1xuICAgIHZhciBhcmVhID0gMDtcblxuICAgIGlmIChjb29yZHMubGVuZ3RoID4gMikge1xuICAgICAgICB2YXIgcDEsIHAyO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvb3Jkcy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICAgIHAxID0gY29vcmRzW2ldO1xuICAgICAgICAgICAgcDIgPSBjb29yZHNbaSArIDFdO1xuICAgICAgICAgICAgYXJlYSArPSByYWQocDJbMF0gLSBwMVswXSkgKiAoMiArIE1hdGguc2luKHJhZChwMVsxXSkpICsgTWF0aC5zaW4ocmFkKHAyWzFdKSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXJlYSA9IGFyZWEgKiB3Z3M4NC5SQURJVVMgKiB3Z3M4NC5SQURJVVMgLyAyO1xuICAgIH1cblxuICAgIHJldHVybiBhcmVhO1xufVxuXG5mdW5jdGlvbiByYWQoXykge1xuICAgIHJldHVybiBfICogTWF0aC5QSSAvIDE4MDtcbn1cbiIsInZhciBnZW9qc29uQXJlYSA9IHJlcXVpcmUoJ2dlb2pzb24tYXJlYScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJld2luZDtcblxuZnVuY3Rpb24gcmV3aW5kKGdqLCBvdXRlcikge1xuICAgIHN3aXRjaCAoKGdqICYmIGdqLnR5cGUpIHx8IG51bGwpIHtcbiAgICAgICAgY2FzZSAnRmVhdHVyZUNvbGxlY3Rpb24nOlxuICAgICAgICAgICAgZ2ouZmVhdHVyZXMgPSBnai5mZWF0dXJlcy5tYXAoY3VycnlPdXRlcihyZXdpbmQsIG91dGVyKSk7XG4gICAgICAgICAgICByZXR1cm4gZ2o7XG4gICAgICAgIGNhc2UgJ0ZlYXR1cmUnOlxuICAgICAgICAgICAgZ2ouZ2VvbWV0cnkgPSByZXdpbmQoZ2ouZ2VvbWV0cnksIG91dGVyKTtcbiAgICAgICAgICAgIHJldHVybiBnajtcbiAgICAgICAgY2FzZSAnUG9seWdvbic6XG4gICAgICAgIGNhc2UgJ011bHRpUG9seWdvbic6XG4gICAgICAgICAgICByZXR1cm4gY29ycmVjdChnaiwgb3V0ZXIpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIGdqO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gY3VycnlPdXRlcihhLCBiKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGEoXywgYik7IH07XG59XG5cbmZ1bmN0aW9uIGNvcnJlY3QoXywgb3V0ZXIpIHtcbiAgICBpZiAoXy50eXBlID09PSAnUG9seWdvbicpIHtcbiAgICAgICAgXy5jb29yZGluYXRlcyA9IGNvcnJlY3RSaW5ncyhfLmNvb3JkaW5hdGVzLCBvdXRlcik7XG4gICAgfSBlbHNlIGlmIChfLnR5cGUgPT09ICdNdWx0aVBvbHlnb24nKSB7XG4gICAgICAgIF8uY29vcmRpbmF0ZXMgPSBfLmNvb3JkaW5hdGVzLm1hcChjdXJyeU91dGVyKGNvcnJlY3RSaW5ncywgb3V0ZXIpKTtcbiAgICB9XG4gICAgcmV0dXJuIF87XG59XG5cbmZ1bmN0aW9uIGNvcnJlY3RSaW5ncyhfLCBvdXRlcikge1xuICAgIG91dGVyID0gISFvdXRlcjtcbiAgICBfWzBdID0gd2luZChfWzBdLCAhb3V0ZXIpO1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgXy5sZW5ndGg7IGkrKykge1xuICAgICAgICBfW2ldID0gd2luZChfW2ldLCBvdXRlcik7XG4gICAgfVxuICAgIHJldHVybiBfO1xufVxuXG5mdW5jdGlvbiB3aW5kKF8sIGRpcikge1xuICAgIHJldHVybiBjdyhfKSA9PT0gZGlyID8gXyA6IF8ucmV2ZXJzZSgpO1xufVxuXG5mdW5jdGlvbiBjdyhfKSB7XG4gICAgcmV0dXJuIGdlb2pzb25BcmVhLnJpbmcoXykgPj0gMDtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBjbGlwO1xuXG52YXIgY3JlYXRlRmVhdHVyZSA9IHJlcXVpcmUoJy4vZmVhdHVyZScpO1xuXG4vKiBjbGlwIGZlYXR1cmVzIGJldHdlZW4gdHdvIGF4aXMtcGFyYWxsZWwgbGluZXM6XG4gKiAgICAgfCAgICAgICAgfFxuICogIF9fX3xfX18gICAgIHwgICAgIC9cbiAqIC8gICB8ICAgXFxfX19ffF9fX18vXG4gKiAgICAgfCAgICAgICAgfFxuICovXG5cbmZ1bmN0aW9uIGNsaXAoZmVhdHVyZXMsIHNjYWxlLCBrMSwgazIsIGF4aXMsIGludGVyc2VjdCwgbWluQWxsLCBtYXhBbGwpIHtcblxuICAgIGsxIC89IHNjYWxlO1xuICAgIGsyIC89IHNjYWxlO1xuXG4gICAgaWYgKG1pbkFsbCA+PSBrMSAmJiBtYXhBbGwgPD0gazIpIHJldHVybiBmZWF0dXJlczsgLy8gdHJpdmlhbCBhY2NlcHRcbiAgICBlbHNlIGlmIChtaW5BbGwgPiBrMiB8fCBtYXhBbGwgPCBrMSkgcmV0dXJuIG51bGw7IC8vIHRyaXZpYWwgcmVqZWN0XG5cbiAgICB2YXIgY2xpcHBlZCA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmZWF0dXJlcy5sZW5ndGg7IGkrKykge1xuXG4gICAgICAgIHZhciBmZWF0dXJlID0gZmVhdHVyZXNbaV0sXG4gICAgICAgICAgICBnZW9tZXRyeSA9IGZlYXR1cmUuZ2VvbWV0cnksXG4gICAgICAgICAgICB0eXBlID0gZmVhdHVyZS50eXBlLFxuICAgICAgICAgICAgbWluLCBtYXg7XG5cbiAgICAgICAgbWluID0gZmVhdHVyZS5taW5bYXhpc107XG4gICAgICAgIG1heCA9IGZlYXR1cmUubWF4W2F4aXNdO1xuXG4gICAgICAgIGlmIChtaW4gPj0gazEgJiYgbWF4IDw9IGsyKSB7IC8vIHRyaXZpYWwgYWNjZXB0XG4gICAgICAgICAgICBjbGlwcGVkLnB1c2goZmVhdHVyZSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSBlbHNlIGlmIChtaW4gPiBrMiB8fCBtYXggPCBrMSkgY29udGludWU7IC8vIHRyaXZpYWwgcmVqZWN0XG5cbiAgICAgICAgdmFyIHNsaWNlcyA9IHR5cGUgPT09IDEgP1xuICAgICAgICAgICAgICAgIGNsaXBQb2ludHMoZ2VvbWV0cnksIGsxLCBrMiwgYXhpcykgOlxuICAgICAgICAgICAgICAgIGNsaXBHZW9tZXRyeShnZW9tZXRyeSwgazEsIGsyLCBheGlzLCBpbnRlcnNlY3QsIHR5cGUgPT09IDMpO1xuXG4gICAgICAgIGlmIChzbGljZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAvLyBpZiBhIGZlYXR1cmUgZ290IGNsaXBwZWQsIGl0IHdpbGwgbGlrZWx5IGdldCBjbGlwcGVkIG9uIHRoZSBuZXh0IHpvb20gbGV2ZWwgYXMgd2VsbCxcbiAgICAgICAgICAgIC8vIHNvIHRoZXJlJ3Mgbm8gbmVlZCB0byByZWNhbGN1bGF0ZSBiYm94ZXNcbiAgICAgICAgICAgIGNsaXBwZWQucHVzaChjcmVhdGVGZWF0dXJlKGZlYXR1cmUudGFncywgdHlwZSwgc2xpY2VzLCBmZWF0dXJlLmlkKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY2xpcHBlZC5sZW5ndGggPyBjbGlwcGVkIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gY2xpcFBvaW50cyhnZW9tZXRyeSwgazEsIGsyLCBheGlzKSB7XG4gICAgdmFyIHNsaWNlID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdlb21ldHJ5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBhID0gZ2VvbWV0cnlbaV0sXG4gICAgICAgICAgICBhayA9IGFbYXhpc107XG5cbiAgICAgICAgaWYgKGFrID49IGsxICYmIGFrIDw9IGsyKSBzbGljZS5wdXNoKGEpO1xuICAgIH1cbiAgICByZXR1cm4gc2xpY2U7XG59XG5cbmZ1bmN0aW9uIGNsaXBHZW9tZXRyeShnZW9tZXRyeSwgazEsIGsyLCBheGlzLCBpbnRlcnNlY3QsIGNsb3NlZCkge1xuXG4gICAgdmFyIHNsaWNlcyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBnZW9tZXRyeS5sZW5ndGg7IGkrKykge1xuXG4gICAgICAgIHZhciBhayA9IDAsXG4gICAgICAgICAgICBiayA9IDAsXG4gICAgICAgICAgICBiID0gbnVsbCxcbiAgICAgICAgICAgIHBvaW50cyA9IGdlb21ldHJ5W2ldLFxuICAgICAgICAgICAgYXJlYSA9IHBvaW50cy5hcmVhLFxuICAgICAgICAgICAgZGlzdCA9IHBvaW50cy5kaXN0LFxuICAgICAgICAgICAgb3V0ZXIgPSBwb2ludHMub3V0ZXIsXG4gICAgICAgICAgICBsZW4gPSBwb2ludHMubGVuZ3RoLFxuICAgICAgICAgICAgYSwgaiwgbGFzdDtcblxuICAgICAgICB2YXIgc2xpY2UgPSBbXTtcblxuICAgICAgICBmb3IgKGogPSAwOyBqIDwgbGVuIC0gMTsgaisrKSB7XG4gICAgICAgICAgICBhID0gYiB8fCBwb2ludHNbal07XG4gICAgICAgICAgICBiID0gcG9pbnRzW2ogKyAxXTtcbiAgICAgICAgICAgIGFrID0gYmsgfHwgYVtheGlzXTtcbiAgICAgICAgICAgIGJrID0gYltheGlzXTtcblxuICAgICAgICAgICAgaWYgKGFrIDwgazEpIHtcblxuICAgICAgICAgICAgICAgIGlmICgoYmsgPiBrMikpIHsgLy8gLS0tfC0tLS0tfC0tPlxuICAgICAgICAgICAgICAgICAgICBzbGljZS5wdXNoKGludGVyc2VjdChhLCBiLCBrMSksIGludGVyc2VjdChhLCBiLCBrMikpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNsb3NlZCkgc2xpY2UgPSBuZXdTbGljZShzbGljZXMsIHNsaWNlLCBhcmVhLCBkaXN0LCBvdXRlcik7XG5cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJrID49IGsxKSBzbGljZS5wdXNoKGludGVyc2VjdChhLCBiLCBrMSkpOyAvLyAtLS18LS0+ICB8XG5cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYWsgPiBrMikge1xuXG4gICAgICAgICAgICAgICAgaWYgKChiayA8IGsxKSkgeyAvLyA8LS18LS0tLS18LS0tXG4gICAgICAgICAgICAgICAgICAgIHNsaWNlLnB1c2goaW50ZXJzZWN0KGEsIGIsIGsyKSwgaW50ZXJzZWN0KGEsIGIsIGsxKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY2xvc2VkKSBzbGljZSA9IG5ld1NsaWNlKHNsaWNlcywgc2xpY2UsIGFyZWEsIGRpc3QsIG91dGVyKTtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYmsgPD0gazIpIHNsaWNlLnB1c2goaW50ZXJzZWN0KGEsIGIsIGsyKSk7IC8vIHwgIDwtLXwtLS1cblxuICAgICAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgICAgICAgIHNsaWNlLnB1c2goYSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoYmsgPCBrMSkgeyAvLyA8LS18LS0tICB8XG4gICAgICAgICAgICAgICAgICAgIHNsaWNlLnB1c2goaW50ZXJzZWN0KGEsIGIsIGsxKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY2xvc2VkKSBzbGljZSA9IG5ld1NsaWNlKHNsaWNlcywgc2xpY2UsIGFyZWEsIGRpc3QsIG91dGVyKTtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYmsgPiBrMikgeyAvLyB8ICAtLS18LS0+XG4gICAgICAgICAgICAgICAgICAgIHNsaWNlLnB1c2goaW50ZXJzZWN0KGEsIGIsIGsyKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY2xvc2VkKSBzbGljZSA9IG5ld1NsaWNlKHNsaWNlcywgc2xpY2UsIGFyZWEsIGRpc3QsIG91dGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gfCAtLT4gfFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gYWRkIHRoZSBsYXN0IHBvaW50XG4gICAgICAgIGEgPSBwb2ludHNbbGVuIC0gMV07XG4gICAgICAgIGFrID0gYVtheGlzXTtcbiAgICAgICAgaWYgKGFrID49IGsxICYmIGFrIDw9IGsyKSBzbGljZS5wdXNoKGEpO1xuXG4gICAgICAgIC8vIGNsb3NlIHRoZSBwb2x5Z29uIGlmIGl0cyBlbmRwb2ludHMgYXJlIG5vdCB0aGUgc2FtZSBhZnRlciBjbGlwcGluZ1xuXG4gICAgICAgIGxhc3QgPSBzbGljZVtzbGljZS5sZW5ndGggLSAxXTtcbiAgICAgICAgaWYgKGNsb3NlZCAmJiBsYXN0ICYmIChzbGljZVswXVswXSAhPT0gbGFzdFswXSB8fCBzbGljZVswXVsxXSAhPT0gbGFzdFsxXSkpIHNsaWNlLnB1c2goc2xpY2VbMF0pO1xuXG4gICAgICAgIC8vIGFkZCB0aGUgZmluYWwgc2xpY2VcbiAgICAgICAgbmV3U2xpY2Uoc2xpY2VzLCBzbGljZSwgYXJlYSwgZGlzdCwgb3V0ZXIpO1xuICAgIH1cblxuICAgIHJldHVybiBzbGljZXM7XG59XG5cbmZ1bmN0aW9uIG5ld1NsaWNlKHNsaWNlcywgc2xpY2UsIGFyZWEsIGRpc3QsIG91dGVyKSB7XG4gICAgaWYgKHNsaWNlLmxlbmd0aCkge1xuICAgICAgICAvLyB3ZSBkb24ndCByZWNhbGN1bGF0ZSB0aGUgYXJlYS9sZW5ndGggb2YgdGhlIHVuY2xpcHBlZCBnZW9tZXRyeSBiZWNhdXNlIHRoZSBjYXNlIHdoZXJlIGl0IGdvZXNcbiAgICAgICAgLy8gYmVsb3cgdGhlIHZpc2liaWxpdHkgdGhyZXNob2xkIGFzIGEgcmVzdWx0IG9mIGNsaXBwaW5nIGlzIHJhcmUsIHNvIHdlIGF2b2lkIGRvaW5nIHVubmVjZXNzYXJ5IHdvcmtcbiAgICAgICAgc2xpY2UuYXJlYSA9IGFyZWE7XG4gICAgICAgIHNsaWNlLmRpc3QgPSBkaXN0O1xuICAgICAgICBpZiAob3V0ZXIgIT09IHVuZGVmaW5lZCkgc2xpY2Uub3V0ZXIgPSBvdXRlcjtcblxuICAgICAgICBzbGljZXMucHVzaChzbGljZSk7XG4gICAgfVxuICAgIHJldHVybiBbXTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBjb252ZXJ0O1xuXG52YXIgc2ltcGxpZnkgPSByZXF1aXJlKCcuL3NpbXBsaWZ5Jyk7XG52YXIgY3JlYXRlRmVhdHVyZSA9IHJlcXVpcmUoJy4vZmVhdHVyZScpO1xuXG4vLyBjb252ZXJ0cyBHZW9KU09OIGZlYXR1cmUgaW50byBhbiBpbnRlcm1lZGlhdGUgcHJvamVjdGVkIEpTT04gdmVjdG9yIGZvcm1hdCB3aXRoIHNpbXBsaWZpY2F0aW9uIGRhdGFcblxuZnVuY3Rpb24gY29udmVydChkYXRhLCB0b2xlcmFuY2UpIHtcbiAgICB2YXIgZmVhdHVyZXMgPSBbXTtcblxuICAgIGlmIChkYXRhLnR5cGUgPT09ICdGZWF0dXJlQ29sbGVjdGlvbicpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhLmZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb252ZXJ0RmVhdHVyZShmZWF0dXJlcywgZGF0YS5mZWF0dXJlc1tpXSwgdG9sZXJhbmNlKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZGF0YS50eXBlID09PSAnRmVhdHVyZScpIHtcbiAgICAgICAgY29udmVydEZlYXR1cmUoZmVhdHVyZXMsIGRhdGEsIHRvbGVyYW5jZSk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBzaW5nbGUgZ2VvbWV0cnkgb3IgYSBnZW9tZXRyeSBjb2xsZWN0aW9uXG4gICAgICAgIGNvbnZlcnRGZWF0dXJlKGZlYXR1cmVzLCB7Z2VvbWV0cnk6IGRhdGF9LCB0b2xlcmFuY2UpO1xuICAgIH1cbiAgICByZXR1cm4gZmVhdHVyZXM7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRGZWF0dXJlKGZlYXR1cmVzLCBmZWF0dXJlLCB0b2xlcmFuY2UpIHtcbiAgICBpZiAoZmVhdHVyZS5nZW9tZXRyeSA9PT0gbnVsbCkge1xuICAgICAgICAvLyBpZ25vcmUgZmVhdHVyZXMgd2l0aCBudWxsIGdlb21ldHJ5XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgZ2VvbSA9IGZlYXR1cmUuZ2VvbWV0cnksXG4gICAgICAgIHR5cGUgPSBnZW9tLnR5cGUsXG4gICAgICAgIGNvb3JkcyA9IGdlb20uY29vcmRpbmF0ZXMsXG4gICAgICAgIHRhZ3MgPSBmZWF0dXJlLnByb3BlcnRpZXMsXG4gICAgICAgIGlkID0gZmVhdHVyZS5pZCxcbiAgICAgICAgaSwgaiwgcmluZ3MsIHByb2plY3RlZFJpbmc7XG5cbiAgICBpZiAodHlwZSA9PT0gJ1BvaW50Jykge1xuICAgICAgICBmZWF0dXJlcy5wdXNoKGNyZWF0ZUZlYXR1cmUodGFncywgMSwgW3Byb2plY3RQb2ludChjb29yZHMpXSwgaWQpKTtcblxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ011bHRpUG9pbnQnKSB7XG4gICAgICAgIGZlYXR1cmVzLnB1c2goY3JlYXRlRmVhdHVyZSh0YWdzLCAxLCBwcm9qZWN0KGNvb3JkcyksIGlkKSk7XG5cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdMaW5lU3RyaW5nJykge1xuICAgICAgICBmZWF0dXJlcy5wdXNoKGNyZWF0ZUZlYXR1cmUodGFncywgMiwgW3Byb2plY3QoY29vcmRzLCB0b2xlcmFuY2UpXSwgaWQpKTtcblxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ011bHRpTGluZVN0cmluZycgfHwgdHlwZSA9PT0gJ1BvbHlnb24nKSB7XG4gICAgICAgIHJpbmdzID0gW107XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb29yZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHByb2plY3RlZFJpbmcgPSBwcm9qZWN0KGNvb3Jkc1tpXSwgdG9sZXJhbmNlKTtcbiAgICAgICAgICAgIGlmICh0eXBlID09PSAnUG9seWdvbicpIHByb2plY3RlZFJpbmcub3V0ZXIgPSAoaSA9PT0gMCk7XG4gICAgICAgICAgICByaW5ncy5wdXNoKHByb2plY3RlZFJpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGZlYXR1cmVzLnB1c2goY3JlYXRlRmVhdHVyZSh0YWdzLCB0eXBlID09PSAnUG9seWdvbicgPyAzIDogMiwgcmluZ3MsIGlkKSk7XG5cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdNdWx0aVBvbHlnb24nKSB7XG4gICAgICAgIHJpbmdzID0gW107XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb29yZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBjb29yZHNbaV0ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICBwcm9qZWN0ZWRSaW5nID0gcHJvamVjdChjb29yZHNbaV1bal0sIHRvbGVyYW5jZSk7XG4gICAgICAgICAgICAgICAgcHJvamVjdGVkUmluZy5vdXRlciA9IChqID09PSAwKTtcbiAgICAgICAgICAgICAgICByaW5ncy5wdXNoKHByb2plY3RlZFJpbmcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZlYXR1cmVzLnB1c2goY3JlYXRlRmVhdHVyZSh0YWdzLCAzLCByaW5ncywgaWQpKTtcblxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ0dlb21ldHJ5Q29sbGVjdGlvbicpIHtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGdlb20uZ2VvbWV0cmllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29udmVydEZlYXR1cmUoZmVhdHVyZXMsIHtcbiAgICAgICAgICAgICAgICBnZW9tZXRyeTogZ2VvbS5nZW9tZXRyaWVzW2ldLFxuICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IHRhZ3NcbiAgICAgICAgICAgIH0sIHRvbGVyYW5jZSk7XG4gICAgICAgIH1cblxuICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW5wdXQgZGF0YSBpcyBub3QgYSB2YWxpZCBHZW9KU09OIG9iamVjdC4nKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHByb2plY3QobG9ubGF0cywgdG9sZXJhbmNlKSB7XG4gICAgdmFyIHByb2plY3RlZCA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbG9ubGF0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBwcm9qZWN0ZWQucHVzaChwcm9qZWN0UG9pbnQobG9ubGF0c1tpXSkpO1xuICAgIH1cbiAgICBpZiAodG9sZXJhbmNlKSB7XG4gICAgICAgIHNpbXBsaWZ5KHByb2plY3RlZCwgdG9sZXJhbmNlKTtcbiAgICAgICAgY2FsY1NpemUocHJvamVjdGVkKTtcbiAgICB9XG4gICAgcmV0dXJuIHByb2plY3RlZDtcbn1cblxuZnVuY3Rpb24gcHJvamVjdFBvaW50KHApIHtcbiAgICB2YXIgc2luID0gTWF0aC5zaW4ocFsxXSAqIE1hdGguUEkgLyAxODApLFxuICAgICAgICB4ID0gKHBbMF0gLyAzNjAgKyAwLjUpLFxuICAgICAgICB5ID0gKDAuNSAtIDAuMjUgKiBNYXRoLmxvZygoMSArIHNpbikgLyAoMSAtIHNpbikpIC8gTWF0aC5QSSk7XG5cbiAgICB5ID0geSA8IDAgPyAwIDpcbiAgICAgICAgeSA+IDEgPyAxIDogeTtcblxuICAgIHJldHVybiBbeCwgeSwgMF07XG59XG5cbi8vIGNhbGN1bGF0ZSBhcmVhIGFuZCBsZW5ndGggb2YgdGhlIHBvbHlcbmZ1bmN0aW9uIGNhbGNTaXplKHBvaW50cykge1xuICAgIHZhciBhcmVhID0gMCxcbiAgICAgICAgZGlzdCA9IDA7XG5cbiAgICBmb3IgKHZhciBpID0gMCwgYSwgYjsgaSA8IHBvaW50cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgYSA9IGIgfHwgcG9pbnRzW2ldO1xuICAgICAgICBiID0gcG9pbnRzW2kgKyAxXTtcblxuICAgICAgICBhcmVhICs9IGFbMF0gKiBiWzFdIC0gYlswXSAqIGFbMV07XG5cbiAgICAgICAgLy8gdXNlIE1hbmhhdHRhbiBkaXN0YW5jZSBpbnN0ZWFkIG9mIEV1Y2xpZGlhbiBvbmUgdG8gYXZvaWQgZXhwZW5zaXZlIHNxdWFyZSByb290IGNvbXB1dGF0aW9uXG4gICAgICAgIGRpc3QgKz0gTWF0aC5hYnMoYlswXSAtIGFbMF0pICsgTWF0aC5hYnMoYlsxXSAtIGFbMV0pO1xuICAgIH1cbiAgICBwb2ludHMuYXJlYSA9IE1hdGguYWJzKGFyZWEgLyAyKTtcbiAgICBwb2ludHMuZGlzdCA9IGRpc3Q7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlRmVhdHVyZTtcblxuZnVuY3Rpb24gY3JlYXRlRmVhdHVyZSh0YWdzLCB0eXBlLCBnZW9tLCBpZCkge1xuICAgIHZhciBmZWF0dXJlID0ge1xuICAgICAgICBpZDogaWQgfHwgbnVsbCxcbiAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgZ2VvbWV0cnk6IGdlb20sXG4gICAgICAgIHRhZ3M6IHRhZ3MgfHwgbnVsbCxcbiAgICAgICAgbWluOiBbSW5maW5pdHksIEluZmluaXR5XSwgLy8gaW5pdGlhbCBiYm94IHZhbHVlc1xuICAgICAgICBtYXg6IFstSW5maW5pdHksIC1JbmZpbml0eV1cbiAgICB9O1xuICAgIGNhbGNCQm94KGZlYXR1cmUpO1xuICAgIHJldHVybiBmZWF0dXJlO1xufVxuXG4vLyBjYWxjdWxhdGUgdGhlIGZlYXR1cmUgYm91bmRpbmcgYm94IGZvciBmYXN0ZXIgY2xpcHBpbmcgbGF0ZXJcbmZ1bmN0aW9uIGNhbGNCQm94KGZlYXR1cmUpIHtcbiAgICB2YXIgZ2VvbWV0cnkgPSBmZWF0dXJlLmdlb21ldHJ5LFxuICAgICAgICBtaW4gPSBmZWF0dXJlLm1pbixcbiAgICAgICAgbWF4ID0gZmVhdHVyZS5tYXg7XG5cbiAgICBpZiAoZmVhdHVyZS50eXBlID09PSAxKSB7XG4gICAgICAgIGNhbGNSaW5nQkJveChtaW4sIG1heCwgZ2VvbWV0cnkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ2VvbWV0cnkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNhbGNSaW5nQkJveChtaW4sIG1heCwgZ2VvbWV0cnlbaV0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZlYXR1cmU7XG59XG5cbmZ1bmN0aW9uIGNhbGNSaW5nQkJveChtaW4sIG1heCwgcG9pbnRzKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIHA7IGkgPCBwb2ludHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcCA9IHBvaW50c1tpXTtcbiAgICAgICAgbWluWzBdID0gTWF0aC5taW4ocFswXSwgbWluWzBdKTtcbiAgICAgICAgbWF4WzBdID0gTWF0aC5tYXgocFswXSwgbWF4WzBdKTtcbiAgICAgICAgbWluWzFdID0gTWF0aC5taW4ocFsxXSwgbWluWzFdKTtcbiAgICAgICAgbWF4WzFdID0gTWF0aC5tYXgocFsxXSwgbWF4WzFdKTtcbiAgICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2VvanNvbnZ0O1xuXG52YXIgY29udmVydCA9IHJlcXVpcmUoJy4vY29udmVydCcpLCAgICAgLy8gR2VvSlNPTiBjb252ZXJzaW9uIGFuZCBwcmVwcm9jZXNzaW5nXG4gICAgdHJhbnNmb3JtID0gcmVxdWlyZSgnLi90cmFuc2Zvcm0nKSwgLy8gY29vcmRpbmF0ZSB0cmFuc2Zvcm1hdGlvblxuICAgIGNsaXAgPSByZXF1aXJlKCcuL2NsaXAnKSwgICAgICAgICAgIC8vIHN0cmlwZSBjbGlwcGluZyBhbGdvcml0aG1cbiAgICB3cmFwID0gcmVxdWlyZSgnLi93cmFwJyksICAgICAgICAgICAvLyBkYXRlIGxpbmUgcHJvY2Vzc2luZ1xuICAgIGNyZWF0ZVRpbGUgPSByZXF1aXJlKCcuL3RpbGUnKTsgICAgIC8vIGZpbmFsIHNpbXBsaWZpZWQgdGlsZSBnZW5lcmF0aW9uXG5cblxuZnVuY3Rpb24gZ2VvanNvbnZ0KGRhdGEsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IEdlb0pTT05WVChkYXRhLCBvcHRpb25zKTtcbn1cblxuZnVuY3Rpb24gR2VvSlNPTlZUKGRhdGEsIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zID0gZXh0ZW5kKE9iamVjdC5jcmVhdGUodGhpcy5vcHRpb25zKSwgb3B0aW9ucyk7XG5cbiAgICB2YXIgZGVidWcgPSBvcHRpb25zLmRlYnVnO1xuXG4gICAgaWYgKGRlYnVnKSBjb25zb2xlLnRpbWUoJ3ByZXByb2Nlc3MgZGF0YScpO1xuXG4gICAgdmFyIHoyID0gMSA8PCBvcHRpb25zLm1heFpvb20sIC8vIDJeelxuICAgICAgICBmZWF0dXJlcyA9IGNvbnZlcnQoZGF0YSwgb3B0aW9ucy50b2xlcmFuY2UgLyAoejIgKiBvcHRpb25zLmV4dGVudCkpO1xuXG4gICAgdGhpcy50aWxlcyA9IHt9O1xuICAgIHRoaXMudGlsZUNvb3JkcyA9IFtdO1xuXG4gICAgaWYgKGRlYnVnKSB7XG4gICAgICAgIGNvbnNvbGUudGltZUVuZCgncHJlcHJvY2VzcyBkYXRhJyk7XG4gICAgICAgIGNvbnNvbGUubG9nKCdpbmRleDogbWF4Wm9vbTogJWQsIG1heFBvaW50czogJWQnLCBvcHRpb25zLmluZGV4TWF4Wm9vbSwgb3B0aW9ucy5pbmRleE1heFBvaW50cyk7XG4gICAgICAgIGNvbnNvbGUudGltZSgnZ2VuZXJhdGUgdGlsZXMnKTtcbiAgICAgICAgdGhpcy5zdGF0cyA9IHt9O1xuICAgICAgICB0aGlzLnRvdGFsID0gMDtcbiAgICB9XG5cbiAgICBmZWF0dXJlcyA9IHdyYXAoZmVhdHVyZXMsIG9wdGlvbnMuYnVmZmVyIC8gb3B0aW9ucy5leHRlbnQsIGludGVyc2VjdFgpO1xuXG4gICAgLy8gc3RhcnQgc2xpY2luZyBmcm9tIHRoZSB0b3AgdGlsZSBkb3duXG4gICAgaWYgKGZlYXR1cmVzLmxlbmd0aCkgdGhpcy5zcGxpdFRpbGUoZmVhdHVyZXMsIDAsIDAsIDApO1xuXG4gICAgaWYgKGRlYnVnKSB7XG4gICAgICAgIGlmIChmZWF0dXJlcy5sZW5ndGgpIGNvbnNvbGUubG9nKCdmZWF0dXJlczogJWQsIHBvaW50czogJWQnLCB0aGlzLnRpbGVzWzBdLm51bUZlYXR1cmVzLCB0aGlzLnRpbGVzWzBdLm51bVBvaW50cyk7XG4gICAgICAgIGNvbnNvbGUudGltZUVuZCgnZ2VuZXJhdGUgdGlsZXMnKTtcbiAgICAgICAgY29uc29sZS5sb2coJ3RpbGVzIGdlbmVyYXRlZDonLCB0aGlzLnRvdGFsLCBKU09OLnN0cmluZ2lmeSh0aGlzLnN0YXRzKSk7XG4gICAgfVxufVxuXG5HZW9KU09OVlQucHJvdG90eXBlLm9wdGlvbnMgPSB7XG4gICAgbWF4Wm9vbTogMTQsICAgICAgICAgICAgLy8gbWF4IHpvb20gdG8gcHJlc2VydmUgZGV0YWlsIG9uXG4gICAgaW5kZXhNYXhab29tOiA1LCAgICAgICAgLy8gbWF4IHpvb20gaW4gdGhlIHRpbGUgaW5kZXhcbiAgICBpbmRleE1heFBvaW50czogMTAwMDAwLCAvLyBtYXggbnVtYmVyIG9mIHBvaW50cyBwZXIgdGlsZSBpbiB0aGUgdGlsZSBpbmRleFxuICAgIHNvbGlkQ2hpbGRyZW46IGZhbHNlLCAgIC8vIHdoZXRoZXIgdG8gdGlsZSBzb2xpZCBzcXVhcmUgdGlsZXMgZnVydGhlclxuICAgIHRvbGVyYW5jZTogMywgICAgICAgICAgIC8vIHNpbXBsaWZpY2F0aW9uIHRvbGVyYW5jZSAoaGlnaGVyIG1lYW5zIHNpbXBsZXIpXG4gICAgZXh0ZW50OiA0MDk2LCAgICAgICAgICAgLy8gdGlsZSBleHRlbnRcbiAgICBidWZmZXI6IDY0LCAgICAgICAgICAgICAvLyB0aWxlIGJ1ZmZlciBvbiBlYWNoIHNpZGVcbiAgICBkZWJ1ZzogMCAgICAgICAgICAgICAgICAvLyBsb2dnaW5nIGxldmVsICgwLCAxIG9yIDIpXG59O1xuXG5HZW9KU09OVlQucHJvdG90eXBlLnNwbGl0VGlsZSA9IGZ1bmN0aW9uIChmZWF0dXJlcywgeiwgeCwgeSwgY3osIGN4LCBjeSkge1xuXG4gICAgdmFyIHN0YWNrID0gW2ZlYXR1cmVzLCB6LCB4LCB5XSxcbiAgICAgICAgb3B0aW9ucyA9IHRoaXMub3B0aW9ucyxcbiAgICAgICAgZGVidWcgPSBvcHRpb25zLmRlYnVnLFxuICAgICAgICBzb2xpZCA9IG51bGw7XG5cbiAgICAvLyBhdm9pZCByZWN1cnNpb24gYnkgdXNpbmcgYSBwcm9jZXNzaW5nIHF1ZXVlXG4gICAgd2hpbGUgKHN0YWNrLmxlbmd0aCkge1xuICAgICAgICB5ID0gc3RhY2sucG9wKCk7XG4gICAgICAgIHggPSBzdGFjay5wb3AoKTtcbiAgICAgICAgeiA9IHN0YWNrLnBvcCgpO1xuICAgICAgICBmZWF0dXJlcyA9IHN0YWNrLnBvcCgpO1xuXG4gICAgICAgIHZhciB6MiA9IDEgPDwgeixcbiAgICAgICAgICAgIGlkID0gdG9JRCh6LCB4LCB5KSxcbiAgICAgICAgICAgIHRpbGUgPSB0aGlzLnRpbGVzW2lkXSxcbiAgICAgICAgICAgIHRpbGVUb2xlcmFuY2UgPSB6ID09PSBvcHRpb25zLm1heFpvb20gPyAwIDogb3B0aW9ucy50b2xlcmFuY2UgLyAoejIgKiBvcHRpb25zLmV4dGVudCk7XG5cbiAgICAgICAgaWYgKCF0aWxlKSB7XG4gICAgICAgICAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLnRpbWUoJ2NyZWF0aW9uJyk7XG5cbiAgICAgICAgICAgIHRpbGUgPSB0aGlzLnRpbGVzW2lkXSA9IGNyZWF0ZVRpbGUoZmVhdHVyZXMsIHoyLCB4LCB5LCB0aWxlVG9sZXJhbmNlLCB6ID09PSBvcHRpb25zLm1heFpvb20pO1xuICAgICAgICAgICAgdGhpcy50aWxlQ29vcmRzLnB1c2goe3o6IHosIHg6IHgsIHk6IHl9KTtcblxuICAgICAgICAgICAgaWYgKGRlYnVnKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlYnVnID4gMSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygndGlsZSB6JWQtJWQtJWQgKGZlYXR1cmVzOiAlZCwgcG9pbnRzOiAlZCwgc2ltcGxpZmllZDogJWQpJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHosIHgsIHksIHRpbGUubnVtRmVhdHVyZXMsIHRpbGUubnVtUG9pbnRzLCB0aWxlLm51bVNpbXBsaWZpZWQpO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLnRpbWVFbmQoJ2NyZWF0aW9uJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBrZXkgPSAneicgKyB6O1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdHNba2V5XSA9ICh0aGlzLnN0YXRzW2tleV0gfHwgMCkgKyAxO1xuICAgICAgICAgICAgICAgIHRoaXMudG90YWwrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNhdmUgcmVmZXJlbmNlIHRvIG9yaWdpbmFsIGdlb21ldHJ5IGluIHRpbGUgc28gdGhhdCB3ZSBjYW4gZHJpbGwgZG93biBsYXRlciBpZiB3ZSBzdG9wIG5vd1xuICAgICAgICB0aWxlLnNvdXJjZSA9IGZlYXR1cmVzO1xuXG4gICAgICAgIC8vIGlmIGl0J3MgdGhlIGZpcnN0LXBhc3MgdGlsaW5nXG4gICAgICAgIGlmICghY3opIHtcbiAgICAgICAgICAgIC8vIHN0b3AgdGlsaW5nIGlmIHdlIHJlYWNoZWQgbWF4IHpvb20sIG9yIGlmIHRoZSB0aWxlIGlzIHRvbyBzaW1wbGVcbiAgICAgICAgICAgIGlmICh6ID09PSBvcHRpb25zLmluZGV4TWF4Wm9vbSB8fCB0aWxlLm51bVBvaW50cyA8PSBvcHRpb25zLmluZGV4TWF4UG9pbnRzKSBjb250aW51ZTtcblxuICAgICAgICAvLyBpZiBhIGRyaWxsZG93biB0byBhIHNwZWNpZmljIHRpbGVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHN0b3AgdGlsaW5nIGlmIHdlIHJlYWNoZWQgYmFzZSB6b29tIG9yIG91ciB0YXJnZXQgdGlsZSB6b29tXG4gICAgICAgICAgICBpZiAoeiA9PT0gb3B0aW9ucy5tYXhab29tIHx8IHogPT09IGN6KSBjb250aW51ZTtcblxuICAgICAgICAgICAgLy8gc3RvcCB0aWxpbmcgaWYgaXQncyBub3QgYW4gYW5jZXN0b3Igb2YgdGhlIHRhcmdldCB0aWxlXG4gICAgICAgICAgICB2YXIgbSA9IDEgPDwgKGN6IC0geik7XG4gICAgICAgICAgICBpZiAoeCAhPT0gTWF0aC5mbG9vcihjeCAvIG0pIHx8IHkgIT09IE1hdGguZmxvb3IoY3kgLyBtKSkgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzdG9wIHRpbGluZyBpZiB0aGUgdGlsZSBpcyBzb2xpZCBjbGlwcGVkIHNxdWFyZVxuICAgICAgICBpZiAoIW9wdGlvbnMuc29saWRDaGlsZHJlbiAmJiBpc0NsaXBwZWRTcXVhcmUodGlsZSwgb3B0aW9ucy5leHRlbnQsIG9wdGlvbnMuYnVmZmVyKSkge1xuICAgICAgICAgICAgaWYgKGN6KSBzb2xpZCA9IHo7IC8vIGFuZCByZW1lbWJlciB0aGUgem9vbSBpZiB3ZSdyZSBkcmlsbGluZyBkb3duXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlmIHdlIHNsaWNlIGZ1cnRoZXIgZG93biwgbm8gbmVlZCB0byBrZWVwIHNvdXJjZSBnZW9tZXRyeVxuICAgICAgICB0aWxlLnNvdXJjZSA9IG51bGw7XG5cbiAgICAgICAgaWYgKGRlYnVnID4gMSkgY29uc29sZS50aW1lKCdjbGlwcGluZycpO1xuXG4gICAgICAgIC8vIHZhbHVlcyB3ZSdsbCB1c2UgZm9yIGNsaXBwaW5nXG4gICAgICAgIHZhciBrMSA9IDAuNSAqIG9wdGlvbnMuYnVmZmVyIC8gb3B0aW9ucy5leHRlbnQsXG4gICAgICAgICAgICBrMiA9IDAuNSAtIGsxLFxuICAgICAgICAgICAgazMgPSAwLjUgKyBrMSxcbiAgICAgICAgICAgIGs0ID0gMSArIGsxLFxuICAgICAgICAgICAgdGwsIGJsLCB0ciwgYnIsIGxlZnQsIHJpZ2h0O1xuXG4gICAgICAgIHRsID0gYmwgPSB0ciA9IGJyID0gbnVsbDtcblxuICAgICAgICBsZWZ0ICA9IGNsaXAoZmVhdHVyZXMsIHoyLCB4IC0gazEsIHggKyBrMywgMCwgaW50ZXJzZWN0WCwgdGlsZS5taW5bMF0sIHRpbGUubWF4WzBdKTtcbiAgICAgICAgcmlnaHQgPSBjbGlwKGZlYXR1cmVzLCB6MiwgeCArIGsyLCB4ICsgazQsIDAsIGludGVyc2VjdFgsIHRpbGUubWluWzBdLCB0aWxlLm1heFswXSk7XG5cbiAgICAgICAgaWYgKGxlZnQpIHtcbiAgICAgICAgICAgIHRsID0gY2xpcChsZWZ0LCB6MiwgeSAtIGsxLCB5ICsgazMsIDEsIGludGVyc2VjdFksIHRpbGUubWluWzFdLCB0aWxlLm1heFsxXSk7XG4gICAgICAgICAgICBibCA9IGNsaXAobGVmdCwgejIsIHkgKyBrMiwgeSArIGs0LCAxLCBpbnRlcnNlY3RZLCB0aWxlLm1pblsxXSwgdGlsZS5tYXhbMV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJpZ2h0KSB7XG4gICAgICAgICAgICB0ciA9IGNsaXAocmlnaHQsIHoyLCB5IC0gazEsIHkgKyBrMywgMSwgaW50ZXJzZWN0WSwgdGlsZS5taW5bMV0sIHRpbGUubWF4WzFdKTtcbiAgICAgICAgICAgIGJyID0gY2xpcChyaWdodCwgejIsIHkgKyBrMiwgeSArIGs0LCAxLCBpbnRlcnNlY3RZLCB0aWxlLm1pblsxXSwgdGlsZS5tYXhbMV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRlYnVnID4gMSkgY29uc29sZS50aW1lRW5kKCdjbGlwcGluZycpO1xuXG4gICAgICAgIGlmIChmZWF0dXJlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHN0YWNrLnB1c2godGwgfHwgW10sIHogKyAxLCB4ICogMiwgICAgIHkgKiAyKTtcbiAgICAgICAgICAgIHN0YWNrLnB1c2goYmwgfHwgW10sIHogKyAxLCB4ICogMiwgICAgIHkgKiAyICsgMSk7XG4gICAgICAgICAgICBzdGFjay5wdXNoKHRyIHx8IFtdLCB6ICsgMSwgeCAqIDIgKyAxLCB5ICogMik7XG4gICAgICAgICAgICBzdGFjay5wdXNoKGJyIHx8IFtdLCB6ICsgMSwgeCAqIDIgKyAxLCB5ICogMiArIDEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNvbGlkO1xufTtcblxuR2VvSlNPTlZULnByb3RvdHlwZS5nZXRUaWxlID0gZnVuY3Rpb24gKHosIHgsIHkpIHtcbiAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucyxcbiAgICAgICAgZXh0ZW50ID0gb3B0aW9ucy5leHRlbnQsXG4gICAgICAgIGRlYnVnID0gb3B0aW9ucy5kZWJ1ZztcblxuICAgIHZhciB6MiA9IDEgPDwgejtcbiAgICB4ID0gKCh4ICUgejIpICsgejIpICUgejI7IC8vIHdyYXAgdGlsZSB4IGNvb3JkaW5hdGVcblxuICAgIHZhciBpZCA9IHRvSUQoeiwgeCwgeSk7XG4gICAgaWYgKHRoaXMudGlsZXNbaWRdKSByZXR1cm4gdHJhbnNmb3JtLnRpbGUodGhpcy50aWxlc1tpZF0sIGV4dGVudCk7XG5cbiAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLmxvZygnZHJpbGxpbmcgZG93biB0byB6JWQtJWQtJWQnLCB6LCB4LCB5KTtcblxuICAgIHZhciB6MCA9IHosXG4gICAgICAgIHgwID0geCxcbiAgICAgICAgeTAgPSB5LFxuICAgICAgICBwYXJlbnQ7XG5cbiAgICB3aGlsZSAoIXBhcmVudCAmJiB6MCA+IDApIHtcbiAgICAgICAgejAtLTtcbiAgICAgICAgeDAgPSBNYXRoLmZsb29yKHgwIC8gMik7XG4gICAgICAgIHkwID0gTWF0aC5mbG9vcih5MCAvIDIpO1xuICAgICAgICBwYXJlbnQgPSB0aGlzLnRpbGVzW3RvSUQoejAsIHgwLCB5MCldO1xuICAgIH1cblxuICAgIGlmICghcGFyZW50IHx8ICFwYXJlbnQuc291cmNlKSByZXR1cm4gbnVsbDtcblxuICAgIC8vIGlmIHdlIGZvdW5kIGEgcGFyZW50IHRpbGUgY29udGFpbmluZyB0aGUgb3JpZ2luYWwgZ2VvbWV0cnksIHdlIGNhbiBkcmlsbCBkb3duIGZyb20gaXRcbiAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLmxvZygnZm91bmQgcGFyZW50IHRpbGUgeiVkLSVkLSVkJywgejAsIHgwLCB5MCk7XG5cbiAgICAvLyBpdCBwYXJlbnQgdGlsZSBpcyBhIHNvbGlkIGNsaXBwZWQgc3F1YXJlLCByZXR1cm4gaXQgaW5zdGVhZCBzaW5jZSBpdCdzIGlkZW50aWNhbFxuICAgIGlmIChpc0NsaXBwZWRTcXVhcmUocGFyZW50LCBleHRlbnQsIG9wdGlvbnMuYnVmZmVyKSkgcmV0dXJuIHRyYW5zZm9ybS50aWxlKHBhcmVudCwgZXh0ZW50KTtcblxuICAgIGlmIChkZWJ1ZyA+IDEpIGNvbnNvbGUudGltZSgnZHJpbGxpbmcgZG93bicpO1xuICAgIHZhciBzb2xpZCA9IHRoaXMuc3BsaXRUaWxlKHBhcmVudC5zb3VyY2UsIHowLCB4MCwgeTAsIHosIHgsIHkpO1xuICAgIGlmIChkZWJ1ZyA+IDEpIGNvbnNvbGUudGltZUVuZCgnZHJpbGxpbmcgZG93bicpO1xuXG4gICAgLy8gb25lIG9mIHRoZSBwYXJlbnQgdGlsZXMgd2FzIGEgc29saWQgY2xpcHBlZCBzcXVhcmVcbiAgICBpZiAoc29saWQgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIG0gPSAxIDw8ICh6IC0gc29saWQpO1xuICAgICAgICBpZCA9IHRvSUQoc29saWQsIE1hdGguZmxvb3IoeCAvIG0pLCBNYXRoLmZsb29yKHkgLyBtKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMudGlsZXNbaWRdID8gdHJhbnNmb3JtLnRpbGUodGhpcy50aWxlc1tpZF0sIGV4dGVudCkgOiBudWxsO1xufTtcblxuZnVuY3Rpb24gdG9JRCh6LCB4LCB5KSB7XG4gICAgcmV0dXJuICgoKDEgPDwgeikgKiB5ICsgeCkgKiAzMikgKyB6O1xufVxuXG5mdW5jdGlvbiBpbnRlcnNlY3RYKGEsIGIsIHgpIHtcbiAgICByZXR1cm4gW3gsICh4IC0gYVswXSkgKiAoYlsxXSAtIGFbMV0pIC8gKGJbMF0gLSBhWzBdKSArIGFbMV0sIDFdO1xufVxuZnVuY3Rpb24gaW50ZXJzZWN0WShhLCBiLCB5KSB7XG4gICAgcmV0dXJuIFsoeSAtIGFbMV0pICogKGJbMF0gLSBhWzBdKSAvIChiWzFdIC0gYVsxXSkgKyBhWzBdLCB5LCAxXTtcbn1cblxuZnVuY3Rpb24gZXh0ZW5kKGRlc3QsIHNyYykge1xuICAgIGZvciAodmFyIGkgaW4gc3JjKSBkZXN0W2ldID0gc3JjW2ldO1xuICAgIHJldHVybiBkZXN0O1xufVxuXG4vLyBjaGVja3Mgd2hldGhlciBhIHRpbGUgaXMgYSB3aG9sZS1hcmVhIGZpbGwgYWZ0ZXIgY2xpcHBpbmc7IGlmIGl0IGlzLCB0aGVyZSdzIG5vIHNlbnNlIHNsaWNpbmcgaXQgZnVydGhlclxuZnVuY3Rpb24gaXNDbGlwcGVkU3F1YXJlKHRpbGUsIGV4dGVudCwgYnVmZmVyKSB7XG5cbiAgICB2YXIgZmVhdHVyZXMgPSB0aWxlLnNvdXJjZTtcbiAgICBpZiAoZmVhdHVyZXMubGVuZ3RoICE9PSAxKSByZXR1cm4gZmFsc2U7XG5cbiAgICB2YXIgZmVhdHVyZSA9IGZlYXR1cmVzWzBdO1xuICAgIGlmIChmZWF0dXJlLnR5cGUgIT09IDMgfHwgZmVhdHVyZS5nZW9tZXRyeS5sZW5ndGggPiAxKSByZXR1cm4gZmFsc2U7XG5cbiAgICB2YXIgbGVuID0gZmVhdHVyZS5nZW9tZXRyeVswXS5sZW5ndGg7XG4gICAgaWYgKGxlbiAhPT0gNSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICB2YXIgcCA9IHRyYW5zZm9ybS5wb2ludChmZWF0dXJlLmdlb21ldHJ5WzBdW2ldLCBleHRlbnQsIHRpbGUuejIsIHRpbGUueCwgdGlsZS55KTtcbiAgICAgICAgaWYgKChwWzBdICE9PSAtYnVmZmVyICYmIHBbMF0gIT09IGV4dGVudCArIGJ1ZmZlcikgfHxcbiAgICAgICAgICAgIChwWzFdICE9PSAtYnVmZmVyICYmIHBbMV0gIT09IGV4dGVudCArIGJ1ZmZlcikpIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBzaW1wbGlmeTtcblxuLy8gY2FsY3VsYXRlIHNpbXBsaWZpY2F0aW9uIGRhdGEgdXNpbmcgb3B0aW1pemVkIERvdWdsYXMtUGV1Y2tlciBhbGdvcml0aG1cblxuZnVuY3Rpb24gc2ltcGxpZnkocG9pbnRzLCB0b2xlcmFuY2UpIHtcblxuICAgIHZhciBzcVRvbGVyYW5jZSA9IHRvbGVyYW5jZSAqIHRvbGVyYW5jZSxcbiAgICAgICAgbGVuID0gcG9pbnRzLmxlbmd0aCxcbiAgICAgICAgZmlyc3QgPSAwLFxuICAgICAgICBsYXN0ID0gbGVuIC0gMSxcbiAgICAgICAgc3RhY2sgPSBbXSxcbiAgICAgICAgaSwgbWF4U3FEaXN0LCBzcURpc3QsIGluZGV4O1xuXG4gICAgLy8gYWx3YXlzIHJldGFpbiB0aGUgZW5kcG9pbnRzICgxIGlzIHRoZSBtYXggdmFsdWUpXG4gICAgcG9pbnRzW2ZpcnN0XVsyXSA9IDE7XG4gICAgcG9pbnRzW2xhc3RdWzJdID0gMTtcblxuICAgIC8vIGF2b2lkIHJlY3Vyc2lvbiBieSB1c2luZyBhIHN0YWNrXG4gICAgd2hpbGUgKGxhc3QpIHtcblxuICAgICAgICBtYXhTcURpc3QgPSAwO1xuXG4gICAgICAgIGZvciAoaSA9IGZpcnN0ICsgMTsgaSA8IGxhc3Q7IGkrKykge1xuICAgICAgICAgICAgc3FEaXN0ID0gZ2V0U3FTZWdEaXN0KHBvaW50c1tpXSwgcG9pbnRzW2ZpcnN0XSwgcG9pbnRzW2xhc3RdKTtcblxuICAgICAgICAgICAgaWYgKHNxRGlzdCA+IG1heFNxRGlzdCkge1xuICAgICAgICAgICAgICAgIGluZGV4ID0gaTtcbiAgICAgICAgICAgICAgICBtYXhTcURpc3QgPSBzcURpc3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWF4U3FEaXN0ID4gc3FUb2xlcmFuY2UpIHtcbiAgICAgICAgICAgIHBvaW50c1tpbmRleF1bMl0gPSBtYXhTcURpc3Q7IC8vIHNhdmUgdGhlIHBvaW50IGltcG9ydGFuY2UgaW4gc3F1YXJlZCBwaXhlbHMgYXMgYSB6IGNvb3JkaW5hdGVcbiAgICAgICAgICAgIHN0YWNrLnB1c2goZmlyc3QpO1xuICAgICAgICAgICAgc3RhY2sucHVzaChpbmRleCk7XG4gICAgICAgICAgICBmaXJzdCA9IGluZGV4O1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsYXN0ID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBmaXJzdCA9IHN0YWNrLnBvcCgpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vLyBzcXVhcmUgZGlzdGFuY2UgZnJvbSBhIHBvaW50IHRvIGEgc2VnbWVudFxuZnVuY3Rpb24gZ2V0U3FTZWdEaXN0KHAsIGEsIGIpIHtcblxuICAgIHZhciB4ID0gYVswXSwgeSA9IGFbMV0sXG4gICAgICAgIGJ4ID0gYlswXSwgYnkgPSBiWzFdLFxuICAgICAgICBweCA9IHBbMF0sIHB5ID0gcFsxXSxcbiAgICAgICAgZHggPSBieCAtIHgsXG4gICAgICAgIGR5ID0gYnkgLSB5O1xuXG4gICAgaWYgKGR4ICE9PSAwIHx8IGR5ICE9PSAwKSB7XG5cbiAgICAgICAgdmFyIHQgPSAoKHB4IC0geCkgKiBkeCArIChweSAtIHkpICogZHkpIC8gKGR4ICogZHggKyBkeSAqIGR5KTtcblxuICAgICAgICBpZiAodCA+IDEpIHtcbiAgICAgICAgICAgIHggPSBieDtcbiAgICAgICAgICAgIHkgPSBieTtcblxuICAgICAgICB9IGVsc2UgaWYgKHQgPiAwKSB7XG4gICAgICAgICAgICB4ICs9IGR4ICogdDtcbiAgICAgICAgICAgIHkgKz0gZHkgKiB0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZHggPSBweCAtIHg7XG4gICAgZHkgPSBweSAtIHk7XG5cbiAgICByZXR1cm4gZHggKiBkeCArIGR5ICogZHk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlVGlsZTtcblxuZnVuY3Rpb24gY3JlYXRlVGlsZShmZWF0dXJlcywgejIsIHR4LCB0eSwgdG9sZXJhbmNlLCBub1NpbXBsaWZ5KSB7XG4gICAgdmFyIHRpbGUgPSB7XG4gICAgICAgIGZlYXR1cmVzOiBbXSxcbiAgICAgICAgbnVtUG9pbnRzOiAwLFxuICAgICAgICBudW1TaW1wbGlmaWVkOiAwLFxuICAgICAgICBudW1GZWF0dXJlczogMCxcbiAgICAgICAgc291cmNlOiBudWxsLFxuICAgICAgICB4OiB0eCxcbiAgICAgICAgeTogdHksXG4gICAgICAgIHoyOiB6MixcbiAgICAgICAgdHJhbnNmb3JtZWQ6IGZhbHNlLFxuICAgICAgICBtaW46IFsyLCAxXSxcbiAgICAgICAgbWF4OiBbLTEsIDBdXG4gICAgfTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRpbGUubnVtRmVhdHVyZXMrKztcbiAgICAgICAgYWRkRmVhdHVyZSh0aWxlLCBmZWF0dXJlc1tpXSwgdG9sZXJhbmNlLCBub1NpbXBsaWZ5KTtcblxuICAgICAgICB2YXIgbWluID0gZmVhdHVyZXNbaV0ubWluLFxuICAgICAgICAgICAgbWF4ID0gZmVhdHVyZXNbaV0ubWF4O1xuXG4gICAgICAgIGlmIChtaW5bMF0gPCB0aWxlLm1pblswXSkgdGlsZS5taW5bMF0gPSBtaW5bMF07XG4gICAgICAgIGlmIChtaW5bMV0gPCB0aWxlLm1pblsxXSkgdGlsZS5taW5bMV0gPSBtaW5bMV07XG4gICAgICAgIGlmIChtYXhbMF0gPiB0aWxlLm1heFswXSkgdGlsZS5tYXhbMF0gPSBtYXhbMF07XG4gICAgICAgIGlmIChtYXhbMV0gPiB0aWxlLm1heFsxXSkgdGlsZS5tYXhbMV0gPSBtYXhbMV07XG4gICAgfVxuICAgIHJldHVybiB0aWxlO1xufVxuXG5mdW5jdGlvbiBhZGRGZWF0dXJlKHRpbGUsIGZlYXR1cmUsIHRvbGVyYW5jZSwgbm9TaW1wbGlmeSkge1xuXG4gICAgdmFyIGdlb20gPSBmZWF0dXJlLmdlb21ldHJ5LFxuICAgICAgICB0eXBlID0gZmVhdHVyZS50eXBlLFxuICAgICAgICBzaW1wbGlmaWVkID0gW10sXG4gICAgICAgIHNxVG9sZXJhbmNlID0gdG9sZXJhbmNlICogdG9sZXJhbmNlLFxuICAgICAgICBpLCBqLCByaW5nLCBwO1xuXG4gICAgaWYgKHR5cGUgPT09IDEpIHtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGdlb20ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHNpbXBsaWZpZWQucHVzaChnZW9tW2ldKTtcbiAgICAgICAgICAgIHRpbGUubnVtUG9pbnRzKys7XG4gICAgICAgICAgICB0aWxlLm51bVNpbXBsaWZpZWQrKztcbiAgICAgICAgfVxuXG4gICAgfSBlbHNlIHtcblxuICAgICAgICAvLyBzaW1wbGlmeSBhbmQgdHJhbnNmb3JtIHByb2plY3RlZCBjb29yZGluYXRlcyBmb3IgdGlsZSBnZW9tZXRyeVxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZ2VvbS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcmluZyA9IGdlb21baV07XG5cbiAgICAgICAgICAgIC8vIGZpbHRlciBvdXQgdGlueSBwb2x5bGluZXMgJiBwb2x5Z29uc1xuICAgICAgICAgICAgaWYgKCFub1NpbXBsaWZ5ICYmICgodHlwZSA9PT0gMiAmJiByaW5nLmRpc3QgPCB0b2xlcmFuY2UpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0eXBlID09PSAzICYmIHJpbmcuYXJlYSA8IHNxVG9sZXJhbmNlKSkpIHtcbiAgICAgICAgICAgICAgICB0aWxlLm51bVBvaW50cyArPSByaW5nLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHNpbXBsaWZpZWRSaW5nID0gW107XG5cbiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCByaW5nLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgcCA9IHJpbmdbal07XG4gICAgICAgICAgICAgICAgLy8ga2VlcCBwb2ludHMgd2l0aCBpbXBvcnRhbmNlID4gdG9sZXJhbmNlXG4gICAgICAgICAgICAgICAgaWYgKG5vU2ltcGxpZnkgfHwgcFsyXSA+IHNxVG9sZXJhbmNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHNpbXBsaWZpZWRSaW5nLnB1c2gocCk7XG4gICAgICAgICAgICAgICAgICAgIHRpbGUubnVtU2ltcGxpZmllZCsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aWxlLm51bVBvaW50cysrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gMykgcmV3aW5kKHNpbXBsaWZpZWRSaW5nLCByaW5nLm91dGVyKTtcblxuICAgICAgICAgICAgc2ltcGxpZmllZC5wdXNoKHNpbXBsaWZpZWRSaW5nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzaW1wbGlmaWVkLmxlbmd0aCkge1xuICAgICAgICB2YXIgdGlsZUZlYXR1cmUgPSB7XG4gICAgICAgICAgICBnZW9tZXRyeTogc2ltcGxpZmllZCxcbiAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICB0YWdzOiBmZWF0dXJlLnRhZ3MgfHwgbnVsbFxuICAgICAgICB9O1xuICAgICAgICBpZiAoZmVhdHVyZS5pZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGlsZUZlYXR1cmUuaWQgPSBmZWF0dXJlLmlkO1xuICAgICAgICB9XG4gICAgICAgIHRpbGUuZmVhdHVyZXMucHVzaCh0aWxlRmVhdHVyZSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiByZXdpbmQocmluZywgY2xvY2t3aXNlKSB7XG4gICAgdmFyIGFyZWEgPSBzaWduZWRBcmVhKHJpbmcpO1xuICAgIGlmIChhcmVhIDwgMCA9PT0gY2xvY2t3aXNlKSByaW5nLnJldmVyc2UoKTtcbn1cblxuZnVuY3Rpb24gc2lnbmVkQXJlYShyaW5nKSB7XG4gICAgdmFyIHN1bSA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHJpbmcubGVuZ3RoLCBqID0gbGVuIC0gMSwgcDEsIHAyOyBpIDwgbGVuOyBqID0gaSsrKSB7XG4gICAgICAgIHAxID0gcmluZ1tpXTtcbiAgICAgICAgcDIgPSByaW5nW2pdO1xuICAgICAgICBzdW0gKz0gKHAyWzBdIC0gcDFbMF0pICogKHAxWzFdICsgcDJbMV0pO1xuICAgIH1cbiAgICByZXR1cm4gc3VtO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLnRpbGUgPSB0cmFuc2Zvcm1UaWxlO1xuZXhwb3J0cy5wb2ludCA9IHRyYW5zZm9ybVBvaW50O1xuXG4vLyBUcmFuc2Zvcm1zIHRoZSBjb29yZGluYXRlcyBvZiBlYWNoIGZlYXR1cmUgaW4gdGhlIGdpdmVuIHRpbGUgZnJvbVxuLy8gbWVyY2F0b3ItcHJvamVjdGVkIHNwYWNlIGludG8gKGV4dGVudCB4IGV4dGVudCkgdGlsZSBzcGFjZS5cbmZ1bmN0aW9uIHRyYW5zZm9ybVRpbGUodGlsZSwgZXh0ZW50KSB7XG4gICAgaWYgKHRpbGUudHJhbnNmb3JtZWQpIHJldHVybiB0aWxlO1xuXG4gICAgdmFyIHoyID0gdGlsZS56MixcbiAgICAgICAgdHggPSB0aWxlLngsXG4gICAgICAgIHR5ID0gdGlsZS55LFxuICAgICAgICBpLCBqLCBrO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IHRpbGUuZmVhdHVyZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGZlYXR1cmUgPSB0aWxlLmZlYXR1cmVzW2ldLFxuICAgICAgICAgICAgZ2VvbSA9IGZlYXR1cmUuZ2VvbWV0cnksXG4gICAgICAgICAgICB0eXBlID0gZmVhdHVyZS50eXBlO1xuXG4gICAgICAgIGlmICh0eXBlID09PSAxKSB7XG4gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgZ2VvbS5sZW5ndGg7IGorKykgZ2VvbVtqXSA9IHRyYW5zZm9ybVBvaW50KGdlb21bal0sIGV4dGVudCwgejIsIHR4LCB0eSk7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBnZW9tLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJpbmcgPSBnZW9tW2pdO1xuICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCByaW5nLmxlbmd0aDsgaysrKSByaW5nW2tdID0gdHJhbnNmb3JtUG9pbnQocmluZ1trXSwgZXh0ZW50LCB6MiwgdHgsIHR5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRpbGUudHJhbnNmb3JtZWQgPSB0cnVlO1xuXG4gICAgcmV0dXJuIHRpbGU7XG59XG5cbmZ1bmN0aW9uIHRyYW5zZm9ybVBvaW50KHAsIGV4dGVudCwgejIsIHR4LCB0eSkge1xuICAgIHZhciB4ID0gTWF0aC5yb3VuZChleHRlbnQgKiAocFswXSAqIHoyIC0gdHgpKSxcbiAgICAgICAgeSA9IE1hdGgucm91bmQoZXh0ZW50ICogKHBbMV0gKiB6MiAtIHR5KSk7XG4gICAgcmV0dXJuIFt4LCB5XTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGNsaXAgPSByZXF1aXJlKCcuL2NsaXAnKTtcbnZhciBjcmVhdGVGZWF0dXJlID0gcmVxdWlyZSgnLi9mZWF0dXJlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gd3JhcDtcblxuZnVuY3Rpb24gd3JhcChmZWF0dXJlcywgYnVmZmVyLCBpbnRlcnNlY3RYKSB7XG4gICAgdmFyIG1lcmdlZCA9IGZlYXR1cmVzLFxuICAgICAgICBsZWZ0ICA9IGNsaXAoZmVhdHVyZXMsIDEsIC0xIC0gYnVmZmVyLCBidWZmZXIsICAgICAwLCBpbnRlcnNlY3RYLCAtMSwgMiksIC8vIGxlZnQgd29ybGQgY29weVxuICAgICAgICByaWdodCA9IGNsaXAoZmVhdHVyZXMsIDEsICAxIC0gYnVmZmVyLCAyICsgYnVmZmVyLCAwLCBpbnRlcnNlY3RYLCAtMSwgMik7IC8vIHJpZ2h0IHdvcmxkIGNvcHlcblxuICAgIGlmIChsZWZ0IHx8IHJpZ2h0KSB7XG4gICAgICAgIG1lcmdlZCA9IGNsaXAoZmVhdHVyZXMsIDEsIC1idWZmZXIsIDEgKyBidWZmZXIsIDAsIGludGVyc2VjdFgsIC0xLCAyKSB8fCBbXTsgLy8gY2VudGVyIHdvcmxkIGNvcHlcblxuICAgICAgICBpZiAobGVmdCkgbWVyZ2VkID0gc2hpZnRGZWF0dXJlQ29vcmRzKGxlZnQsIDEpLmNvbmNhdChtZXJnZWQpOyAvLyBtZXJnZSBsZWZ0IGludG8gY2VudGVyXG4gICAgICAgIGlmIChyaWdodCkgbWVyZ2VkID0gbWVyZ2VkLmNvbmNhdChzaGlmdEZlYXR1cmVDb29yZHMocmlnaHQsIC0xKSk7IC8vIG1lcmdlIHJpZ2h0IGludG8gY2VudGVyXG4gICAgfVxuXG4gICAgcmV0dXJuIG1lcmdlZDtcbn1cblxuZnVuY3Rpb24gc2hpZnRGZWF0dXJlQ29vcmRzKGZlYXR1cmVzLCBvZmZzZXQpIHtcbiAgICB2YXIgbmV3RmVhdHVyZXMgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmVhdHVyZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGZlYXR1cmUgPSBmZWF0dXJlc1tpXSxcbiAgICAgICAgICAgIHR5cGUgPSBmZWF0dXJlLnR5cGU7XG5cbiAgICAgICAgdmFyIG5ld0dlb21ldHJ5O1xuXG4gICAgICAgIGlmICh0eXBlID09PSAxKSB7XG4gICAgICAgICAgICBuZXdHZW9tZXRyeSA9IHNoaWZ0Q29vcmRzKGZlYXR1cmUuZ2VvbWV0cnksIG9mZnNldCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZXdHZW9tZXRyeSA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBmZWF0dXJlLmdlb21ldHJ5Lmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgbmV3R2VvbWV0cnkucHVzaChzaGlmdENvb3JkcyhmZWF0dXJlLmdlb21ldHJ5W2pdLCBvZmZzZXQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG5ld0ZlYXR1cmVzLnB1c2goY3JlYXRlRmVhdHVyZShmZWF0dXJlLnRhZ3MsIHR5cGUsIG5ld0dlb21ldHJ5LCBmZWF0dXJlLmlkKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ld0ZlYXR1cmVzO1xufVxuXG5mdW5jdGlvbiBzaGlmdENvb3Jkcyhwb2ludHMsIG9mZnNldCkge1xuICAgIHZhciBuZXdQb2ludHMgPSBbXTtcbiAgICBuZXdQb2ludHMuYXJlYSA9IHBvaW50cy5hcmVhO1xuICAgIG5ld1BvaW50cy5kaXN0ID0gcG9pbnRzLmRpc3Q7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBuZXdQb2ludHMucHVzaChbcG9pbnRzW2ldWzBdICsgb2Zmc2V0LCBwb2ludHNbaV1bMV0sIHBvaW50c1tpXVsyXV0pO1xuICAgIH1cbiAgICByZXR1cm4gbmV3UG9pbnRzO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEdyaWRJbmRleDtcblxudmFyIE5VTV9QQVJBTVMgPSAzO1xuXG5mdW5jdGlvbiBHcmlkSW5kZXgoZXh0ZW50LCBuLCBwYWRkaW5nKSB7XG4gICAgdmFyIGNlbGxzID0gdGhpcy5jZWxscyA9IFtdO1xuXG4gICAgaWYgKGV4dGVudCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgICAgIHRoaXMuYXJyYXlCdWZmZXIgPSBleHRlbnQ7XG4gICAgICAgIHZhciBhcnJheSA9IG5ldyBJbnQzMkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO1xuICAgICAgICBleHRlbnQgPSBhcnJheVswXTtcbiAgICAgICAgbiA9IGFycmF5WzFdO1xuICAgICAgICBwYWRkaW5nID0gYXJyYXlbMl07XG5cbiAgICAgICAgdGhpcy5kID0gbiArIDIgKiBwYWRkaW5nO1xuICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IHRoaXMuZCAqIHRoaXMuZDsgaysrKSB7XG4gICAgICAgICAgICB2YXIgc3RhcnQgPSBhcnJheVtOVU1fUEFSQU1TICsga107XG4gICAgICAgICAgICB2YXIgZW5kID0gYXJyYXlbTlVNX1BBUkFNUyArIGsgKyAxXTtcbiAgICAgICAgICAgIGNlbGxzLnB1c2goc3RhcnQgPT09IGVuZCA/XG4gICAgICAgICAgICAgICAgICAgIG51bGwgOlxuICAgICAgICAgICAgICAgICAgICBhcnJheS5zdWJhcnJheShzdGFydCwgZW5kKSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGtleXNPZmZzZXQgPSBhcnJheVtOVU1fUEFSQU1TICsgY2VsbHMubGVuZ3RoXTtcbiAgICAgICAgdmFyIGJib3hlc09mZnNldCA9IGFycmF5W05VTV9QQVJBTVMgKyBjZWxscy5sZW5ndGggKyAxXTtcbiAgICAgICAgdGhpcy5rZXlzID0gYXJyYXkuc3ViYXJyYXkoa2V5c09mZnNldCwgYmJveGVzT2Zmc2V0KTtcbiAgICAgICAgdGhpcy5iYm94ZXMgPSBhcnJheS5zdWJhcnJheShiYm94ZXNPZmZzZXQpO1xuXG4gICAgICAgIHRoaXMuaW5zZXJ0ID0gdGhpcy5faW5zZXJ0UmVhZG9ubHk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmQgPSBuICsgMiAqIHBhZGRpbmc7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5kICogdGhpcy5kOyBpKyspIHtcbiAgICAgICAgICAgIGNlbGxzLnB1c2goW10pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMua2V5cyA9IFtdO1xuICAgICAgICB0aGlzLmJib3hlcyA9IFtdO1xuICAgIH1cblxuICAgIHRoaXMubiA9IG47XG4gICAgdGhpcy5leHRlbnQgPSBleHRlbnQ7XG4gICAgdGhpcy5wYWRkaW5nID0gcGFkZGluZztcbiAgICB0aGlzLnNjYWxlID0gbiAvIGV4dGVudDtcbiAgICB0aGlzLnVpZCA9IDA7XG5cbiAgICB2YXIgcCA9IChwYWRkaW5nIC8gbikgKiBleHRlbnQ7XG4gICAgdGhpcy5taW4gPSAtcDtcbiAgICB0aGlzLm1heCA9IGV4dGVudCArIHA7XG59XG5cblxuR3JpZEluZGV4LnByb3RvdHlwZS5pbnNlcnQgPSBmdW5jdGlvbihrZXksIHgxLCB5MSwgeDIsIHkyKSB7XG4gICAgdGhpcy5fZm9yRWFjaENlbGwoeDEsIHkxLCB4MiwgeTIsIHRoaXMuX2luc2VydENlbGwsIHRoaXMudWlkKyspO1xuICAgIHRoaXMua2V5cy5wdXNoKGtleSk7XG4gICAgdGhpcy5iYm94ZXMucHVzaCh4MSk7XG4gICAgdGhpcy5iYm94ZXMucHVzaCh5MSk7XG4gICAgdGhpcy5iYm94ZXMucHVzaCh4Mik7XG4gICAgdGhpcy5iYm94ZXMucHVzaCh5Mik7XG59O1xuXG5HcmlkSW5kZXgucHJvdG90eXBlLl9pbnNlcnRSZWFkb25seSA9IGZ1bmN0aW9uKCkge1xuICAgIHRocm93ICdDYW5ub3QgaW5zZXJ0IGludG8gYSBHcmlkSW5kZXggY3JlYXRlZCBmcm9tIGFuIEFycmF5QnVmZmVyLic7XG59O1xuXG5HcmlkSW5kZXgucHJvdG90eXBlLl9pbnNlcnRDZWxsID0gZnVuY3Rpb24oeDEsIHkxLCB4MiwgeTIsIGNlbGxJbmRleCwgdWlkKSB7XG4gICAgdGhpcy5jZWxsc1tjZWxsSW5kZXhdLnB1c2godWlkKTtcbn07XG5cbkdyaWRJbmRleC5wcm90b3R5cGUucXVlcnkgPSBmdW5jdGlvbih4MSwgeTEsIHgyLCB5Mikge1xuICAgIHZhciBtaW4gPSB0aGlzLm1pbjtcbiAgICB2YXIgbWF4ID0gdGhpcy5tYXg7XG4gICAgaWYgKHgxIDw9IG1pbiAmJiB5MSA8PSBtaW4gJiYgbWF4IDw9IHgyICYmIG1heCA8PSB5Mikge1xuICAgICAgICAvLyBXZSB1c2UgYEFycmF5I3NsaWNlYCBiZWNhdXNlIGB0aGlzLmtleXNgIG1heSBiZSBhIGBJbnQzMkFycmF5YCBhbmRcbiAgICAgICAgLy8gc29tZSBicm93c2VycyAoU2FmYXJpIGFuZCBJRSkgZG8gbm90IHN1cHBvcnQgYFR5cGVkQXJyYXkjc2xpY2VgXG4gICAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL1R5cGVkQXJyYXkvc2xpY2UjQnJvd3Nlcl9jb21wYXRpYmlsaXR5XG4gICAgICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLmtleXMpO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgICB2YXIgc2VlblVpZHMgPSB7fTtcbiAgICAgICAgdGhpcy5fZm9yRWFjaENlbGwoeDEsIHkxLCB4MiwgeTIsIHRoaXMuX3F1ZXJ5Q2VsbCwgcmVzdWx0LCBzZWVuVWlkcyk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufTtcblxuR3JpZEluZGV4LnByb3RvdHlwZS5fcXVlcnlDZWxsID0gZnVuY3Rpb24oeDEsIHkxLCB4MiwgeTIsIGNlbGxJbmRleCwgcmVzdWx0LCBzZWVuVWlkcykge1xuICAgIHZhciBjZWxsID0gdGhpcy5jZWxsc1tjZWxsSW5kZXhdO1xuICAgIGlmIChjZWxsICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBrZXlzID0gdGhpcy5rZXlzO1xuICAgICAgICB2YXIgYmJveGVzID0gdGhpcy5iYm94ZXM7XG4gICAgICAgIGZvciAodmFyIHUgPSAwOyB1IDwgY2VsbC5sZW5ndGg7IHUrKykge1xuICAgICAgICAgICAgdmFyIHVpZCA9IGNlbGxbdV07XG4gICAgICAgICAgICBpZiAoc2VlblVpZHNbdWlkXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdmFyIG9mZnNldCA9IHVpZCAqIDQ7XG4gICAgICAgICAgICAgICAgaWYgKCh4MSA8PSBiYm94ZXNbb2Zmc2V0ICsgMl0pICYmXG4gICAgICAgICAgICAgICAgICAgICh5MSA8PSBiYm94ZXNbb2Zmc2V0ICsgM10pICYmXG4gICAgICAgICAgICAgICAgICAgICh4MiA+PSBiYm94ZXNbb2Zmc2V0ICsgMF0pICYmXG4gICAgICAgICAgICAgICAgICAgICh5MiA+PSBiYm94ZXNbb2Zmc2V0ICsgMV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlZW5VaWRzW3VpZF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChrZXlzW3VpZF0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHNlZW5VaWRzW3VpZF0gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5HcmlkSW5kZXgucHJvdG90eXBlLl9mb3JFYWNoQ2VsbCA9IGZ1bmN0aW9uKHgxLCB5MSwgeDIsIHkyLCBmbiwgYXJnMSwgYXJnMikge1xuICAgIHZhciBjeDEgPSB0aGlzLl9jb252ZXJ0VG9DZWxsQ29vcmQoeDEpO1xuICAgIHZhciBjeTEgPSB0aGlzLl9jb252ZXJ0VG9DZWxsQ29vcmQoeTEpO1xuICAgIHZhciBjeDIgPSB0aGlzLl9jb252ZXJ0VG9DZWxsQ29vcmQoeDIpO1xuICAgIHZhciBjeTIgPSB0aGlzLl9jb252ZXJ0VG9DZWxsQ29vcmQoeTIpO1xuICAgIGZvciAodmFyIHggPSBjeDE7IHggPD0gY3gyOyB4KyspIHtcbiAgICAgICAgZm9yICh2YXIgeSA9IGN5MTsgeSA8PSBjeTI7IHkrKykge1xuICAgICAgICAgICAgdmFyIGNlbGxJbmRleCA9IHRoaXMuZCAqIHkgKyB4O1xuICAgICAgICAgICAgaWYgKGZuLmNhbGwodGhpcywgeDEsIHkxLCB4MiwgeTIsIGNlbGxJbmRleCwgYXJnMSwgYXJnMikpIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbkdyaWRJbmRleC5wcm90b3R5cGUuX2NvbnZlcnRUb0NlbGxDb29yZCA9IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5taW4odGhpcy5kIC0gMSwgTWF0aC5mbG9vcih4ICogdGhpcy5zY2FsZSkgKyB0aGlzLnBhZGRpbmcpKTtcbn07XG5cbkdyaWRJbmRleC5wcm90b3R5cGUudG9BcnJheUJ1ZmZlciA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLmFycmF5QnVmZmVyKSByZXR1cm4gdGhpcy5hcnJheUJ1ZmZlcjtcblxuICAgIHZhciBjZWxscyA9IHRoaXMuY2VsbHM7XG5cbiAgICB2YXIgbWV0YWRhdGFMZW5ndGggPSBOVU1fUEFSQU1TICsgdGhpcy5jZWxscy5sZW5ndGggKyAxICsgMTtcbiAgICB2YXIgdG90YWxDZWxsTGVuZ3RoID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2VsbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdG90YWxDZWxsTGVuZ3RoICs9IHRoaXMuY2VsbHNbaV0ubGVuZ3RoO1xuICAgIH1cblxuICAgIHZhciBhcnJheSA9IG5ldyBJbnQzMkFycmF5KG1ldGFkYXRhTGVuZ3RoICsgdG90YWxDZWxsTGVuZ3RoICsgdGhpcy5rZXlzLmxlbmd0aCArIHRoaXMuYmJveGVzLmxlbmd0aCk7XG4gICAgYXJyYXlbMF0gPSB0aGlzLmV4dGVudDtcbiAgICBhcnJheVsxXSA9IHRoaXMubjtcbiAgICBhcnJheVsyXSA9IHRoaXMucGFkZGluZztcblxuICAgIHZhciBvZmZzZXQgPSBtZXRhZGF0YUxlbmd0aDtcbiAgICBmb3IgKHZhciBrID0gMDsgayA8IGNlbGxzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgIHZhciBjZWxsID0gY2VsbHNba107XG4gICAgICAgIGFycmF5W05VTV9QQVJBTVMgKyBrXSA9IG9mZnNldDtcbiAgICAgICAgYXJyYXkuc2V0KGNlbGwsIG9mZnNldCk7XG4gICAgICAgIG9mZnNldCArPSBjZWxsLmxlbmd0aDtcbiAgICB9XG5cbiAgICBhcnJheVtOVU1fUEFSQU1TICsgY2VsbHMubGVuZ3RoXSA9IG9mZnNldDtcbiAgICBhcnJheS5zZXQodGhpcy5rZXlzLCBvZmZzZXQpO1xuICAgIG9mZnNldCArPSB0aGlzLmtleXMubGVuZ3RoO1xuXG4gICAgYXJyYXlbTlVNX1BBUkFNUyArIGNlbGxzLmxlbmd0aCArIDFdID0gb2Zmc2V0O1xuICAgIGFycmF5LnNldCh0aGlzLmJib3hlcywgb2Zmc2V0KTtcbiAgICBvZmZzZXQgKz0gdGhpcy5iYm94ZXMubGVuZ3RoO1xuXG4gICAgcmV0dXJuIGFycmF5LmJ1ZmZlcjtcbn07XG4iLCJleHBvcnRzLnJlYWQgPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbVxuICB2YXIgZUxlbiA9IG5CeXRlcyAqIDggLSBtTGVuIC0gMVxuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMVxuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDFcbiAgdmFyIG5CaXRzID0gLTdcbiAgdmFyIGkgPSBpc0xFID8gKG5CeXRlcyAtIDEpIDogMFxuICB2YXIgZCA9IGlzTEUgPyAtMSA6IDFcbiAgdmFyIHMgPSBidWZmZXJbb2Zmc2V0ICsgaV1cblxuICBpICs9IGRcblxuICBlID0gcyAmICgoMSA8PCAoLW5CaXRzKSkgLSAxKVxuICBzID4+PSAoLW5CaXRzKVxuICBuQml0cyArPSBlTGVuXG4gIGZvciAoOyBuQml0cyA+IDA7IGUgPSBlICogMjU2ICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgbSA9IGUgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgZSA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gbUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBtID0gbSAqIDI1NiArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIGlmIChlID09PSAwKSB7XG4gICAgZSA9IDEgLSBlQmlhc1xuICB9IGVsc2UgaWYgKGUgPT09IGVNYXgpIHtcbiAgICByZXR1cm4gbSA/IE5hTiA6ICgocyA/IC0xIDogMSkgKiBJbmZpbml0eSlcbiAgfSBlbHNlIHtcbiAgICBtID0gbSArIE1hdGgucG93KDIsIG1MZW4pXG4gICAgZSA9IGUgLSBlQmlhc1xuICB9XG4gIHJldHVybiAocyA/IC0xIDogMSkgKiBtICogTWF0aC5wb3coMiwgZSAtIG1MZW4pXG59XG5cbmV4cG9ydHMud3JpdGUgPSBmdW5jdGlvbiAoYnVmZmVyLCB2YWx1ZSwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHtcbiAgdmFyIGUsIG0sIGNcbiAgdmFyIGVMZW4gPSBuQnl0ZXMgKiA4IC0gbUxlbiAtIDFcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDFcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxXG4gIHZhciBydCA9IChtTGVuID09PSAyMyA/IE1hdGgucG93KDIsIC0yNCkgLSBNYXRoLnBvdygyLCAtNzcpIDogMClcbiAgdmFyIGkgPSBpc0xFID8gMCA6IChuQnl0ZXMgLSAxKVxuICB2YXIgZCA9IGlzTEUgPyAxIDogLTFcbiAgdmFyIHMgPSB2YWx1ZSA8IDAgfHwgKHZhbHVlID09PSAwICYmIDEgLyB2YWx1ZSA8IDApID8gMSA6IDBcblxuICB2YWx1ZSA9IE1hdGguYWJzKHZhbHVlKVxuXG4gIGlmIChpc05hTih2YWx1ZSkgfHwgdmFsdWUgPT09IEluZmluaXR5KSB7XG4gICAgbSA9IGlzTmFOKHZhbHVlKSA/IDEgOiAwXG4gICAgZSA9IGVNYXhcbiAgfSBlbHNlIHtcbiAgICBlID0gTWF0aC5mbG9vcihNYXRoLmxvZyh2YWx1ZSkgLyBNYXRoLkxOMilcbiAgICBpZiAodmFsdWUgKiAoYyA9IE1hdGgucG93KDIsIC1lKSkgPCAxKSB7XG4gICAgICBlLS1cbiAgICAgIGMgKj0gMlxuICAgIH1cbiAgICBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIHZhbHVlICs9IHJ0IC8gY1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSArPSBydCAqIE1hdGgucG93KDIsIDEgLSBlQmlhcylcbiAgICB9XG4gICAgaWYgKHZhbHVlICogYyA+PSAyKSB7XG4gICAgICBlKytcbiAgICAgIGMgLz0gMlxuICAgIH1cblxuICAgIGlmIChlICsgZUJpYXMgPj0gZU1heCkge1xuICAgICAgbSA9IDBcbiAgICAgIGUgPSBlTWF4XG4gICAgfSBlbHNlIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgbSA9ICh2YWx1ZSAqIGMgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pXG4gICAgICBlID0gZSArIGVCaWFzXG4gICAgfSBlbHNlIHtcbiAgICAgIG0gPSB2YWx1ZSAqIE1hdGgucG93KDIsIGVCaWFzIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKVxuICAgICAgZSA9IDBcbiAgICB9XG4gIH1cblxuICBmb3IgKDsgbUxlbiA+PSA4OyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBtICYgMHhmZiwgaSArPSBkLCBtIC89IDI1NiwgbUxlbiAtPSA4KSB7fVxuXG4gIGUgPSAoZSA8PCBtTGVuKSB8IG1cbiAgZUxlbiArPSBtTGVuXG4gIGZvciAoOyBlTGVuID4gMDsgYnVmZmVyW29mZnNldCArIGldID0gZSAmIDB4ZmYsIGkgKz0gZCwgZSAvPSAyNTYsIGVMZW4gLT0gOCkge31cblxuICBidWZmZXJbb2Zmc2V0ICsgaSAtIGRdIHw9IHMgKiAxMjhcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHNvcnQgPSByZXF1aXJlKCcuL3NvcnQnKTtcbnZhciByYW5nZSA9IHJlcXVpcmUoJy4vcmFuZ2UnKTtcbnZhciB3aXRoaW4gPSByZXF1aXJlKCcuL3dpdGhpbicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGtkYnVzaDtcblxuZnVuY3Rpb24ga2RidXNoKHBvaW50cywgZ2V0WCwgZ2V0WSwgbm9kZVNpemUsIEFycmF5VHlwZSkge1xuICAgIHJldHVybiBuZXcgS0RCdXNoKHBvaW50cywgZ2V0WCwgZ2V0WSwgbm9kZVNpemUsIEFycmF5VHlwZSk7XG59XG5cbmZ1bmN0aW9uIEtEQnVzaChwb2ludHMsIGdldFgsIGdldFksIG5vZGVTaXplLCBBcnJheVR5cGUpIHtcbiAgICBnZXRYID0gZ2V0WCB8fCBkZWZhdWx0R2V0WDtcbiAgICBnZXRZID0gZ2V0WSB8fCBkZWZhdWx0R2V0WTtcbiAgICBBcnJheVR5cGUgPSBBcnJheVR5cGUgfHwgQXJyYXk7XG5cbiAgICB0aGlzLm5vZGVTaXplID0gbm9kZVNpemUgfHwgNjQ7XG4gICAgdGhpcy5wb2ludHMgPSBwb2ludHM7XG5cbiAgICB0aGlzLmlkcyA9IG5ldyBBcnJheVR5cGUocG9pbnRzLmxlbmd0aCk7XG4gICAgdGhpcy5jb29yZHMgPSBuZXcgQXJyYXlUeXBlKHBvaW50cy5sZW5ndGggKiAyKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMuaWRzW2ldID0gaTtcbiAgICAgICAgdGhpcy5jb29yZHNbMiAqIGldID0gZ2V0WChwb2ludHNbaV0pO1xuICAgICAgICB0aGlzLmNvb3Jkc1syICogaSArIDFdID0gZ2V0WShwb2ludHNbaV0pO1xuICAgIH1cblxuICAgIHNvcnQodGhpcy5pZHMsIHRoaXMuY29vcmRzLCB0aGlzLm5vZGVTaXplLCAwLCB0aGlzLmlkcy5sZW5ndGggLSAxLCAwKTtcbn1cblxuS0RCdXNoLnByb3RvdHlwZSA9IHtcbiAgICByYW5nZTogZnVuY3Rpb24gKG1pblgsIG1pblksIG1heFgsIG1heFkpIHtcbiAgICAgICAgcmV0dXJuIHJhbmdlKHRoaXMuaWRzLCB0aGlzLmNvb3JkcywgbWluWCwgbWluWSwgbWF4WCwgbWF4WSwgdGhpcy5ub2RlU2l6ZSk7XG4gICAgfSxcblxuICAgIHdpdGhpbjogZnVuY3Rpb24gKHgsIHksIHIpIHtcbiAgICAgICAgcmV0dXJuIHdpdGhpbih0aGlzLmlkcywgdGhpcy5jb29yZHMsIHgsIHksIHIsIHRoaXMubm9kZVNpemUpO1xuICAgIH1cbn07XG5cbmZ1bmN0aW9uIGRlZmF1bHRHZXRYKHApIHsgcmV0dXJuIHBbMF07IH1cbmZ1bmN0aW9uIGRlZmF1bHRHZXRZKHApIHsgcmV0dXJuIHBbMV07IH1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSByYW5nZTtcblxuZnVuY3Rpb24gcmFuZ2UoaWRzLCBjb29yZHMsIG1pblgsIG1pblksIG1heFgsIG1heFksIG5vZGVTaXplKSB7XG4gICAgdmFyIHN0YWNrID0gWzAsIGlkcy5sZW5ndGggLSAxLCAwXTtcbiAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgdmFyIHgsIHk7XG5cbiAgICB3aGlsZSAoc3RhY2subGVuZ3RoKSB7XG4gICAgICAgIHZhciBheGlzID0gc3RhY2sucG9wKCk7XG4gICAgICAgIHZhciByaWdodCA9IHN0YWNrLnBvcCgpO1xuICAgICAgICB2YXIgbGVmdCA9IHN0YWNrLnBvcCgpO1xuXG4gICAgICAgIGlmIChyaWdodCAtIGxlZnQgPD0gbm9kZVNpemUpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSBsZWZ0OyBpIDw9IHJpZ2h0OyBpKyspIHtcbiAgICAgICAgICAgICAgICB4ID0gY29vcmRzWzIgKiBpXTtcbiAgICAgICAgICAgICAgICB5ID0gY29vcmRzWzIgKiBpICsgMV07XG4gICAgICAgICAgICAgICAgaWYgKHggPj0gbWluWCAmJiB4IDw9IG1heFggJiYgeSA+PSBtaW5ZICYmIHkgPD0gbWF4WSkgcmVzdWx0LnB1c2goaWRzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG0gPSBNYXRoLmZsb29yKChsZWZ0ICsgcmlnaHQpIC8gMik7XG5cbiAgICAgICAgeCA9IGNvb3Jkc1syICogbV07XG4gICAgICAgIHkgPSBjb29yZHNbMiAqIG0gKyAxXTtcblxuICAgICAgICBpZiAoeCA+PSBtaW5YICYmIHggPD0gbWF4WCAmJiB5ID49IG1pblkgJiYgeSA8PSBtYXhZKSByZXN1bHQucHVzaChpZHNbbV0pO1xuXG4gICAgICAgIHZhciBuZXh0QXhpcyA9IChheGlzICsgMSkgJSAyO1xuXG4gICAgICAgIGlmIChheGlzID09PSAwID8gbWluWCA8PSB4IDogbWluWSA8PSB5KSB7XG4gICAgICAgICAgICBzdGFjay5wdXNoKGxlZnQpO1xuICAgICAgICAgICAgc3RhY2sucHVzaChtIC0gMSk7XG4gICAgICAgICAgICBzdGFjay5wdXNoKG5leHRBeGlzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXhpcyA9PT0gMCA/IG1heFggPj0geCA6IG1heFkgPj0geSkge1xuICAgICAgICAgICAgc3RhY2sucHVzaChtICsgMSk7XG4gICAgICAgICAgICBzdGFjay5wdXNoKHJpZ2h0KTtcbiAgICAgICAgICAgIHN0YWNrLnB1c2gobmV4dEF4aXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBzb3J0S0Q7XG5cbmZ1bmN0aW9uIHNvcnRLRChpZHMsIGNvb3Jkcywgbm9kZVNpemUsIGxlZnQsIHJpZ2h0LCBkZXB0aCkge1xuICAgIGlmIChyaWdodCAtIGxlZnQgPD0gbm9kZVNpemUpIHJldHVybjtcblxuICAgIHZhciBtID0gTWF0aC5mbG9vcigobGVmdCArIHJpZ2h0KSAvIDIpO1xuXG4gICAgc2VsZWN0KGlkcywgY29vcmRzLCBtLCBsZWZ0LCByaWdodCwgZGVwdGggJSAyKTtcblxuICAgIHNvcnRLRChpZHMsIGNvb3Jkcywgbm9kZVNpemUsIGxlZnQsIG0gLSAxLCBkZXB0aCArIDEpO1xuICAgIHNvcnRLRChpZHMsIGNvb3Jkcywgbm9kZVNpemUsIG0gKyAxLCByaWdodCwgZGVwdGggKyAxKTtcbn1cblxuZnVuY3Rpb24gc2VsZWN0KGlkcywgY29vcmRzLCBrLCBsZWZ0LCByaWdodCwgaW5jKSB7XG5cbiAgICB3aGlsZSAocmlnaHQgPiBsZWZ0KSB7XG4gICAgICAgIGlmIChyaWdodCAtIGxlZnQgPiA2MDApIHtcbiAgICAgICAgICAgIHZhciBuID0gcmlnaHQgLSBsZWZ0ICsgMTtcbiAgICAgICAgICAgIHZhciBtID0gayAtIGxlZnQgKyAxO1xuICAgICAgICAgICAgdmFyIHogPSBNYXRoLmxvZyhuKTtcbiAgICAgICAgICAgIHZhciBzID0gMC41ICogTWF0aC5leHAoMiAqIHogLyAzKTtcbiAgICAgICAgICAgIHZhciBzZCA9IDAuNSAqIE1hdGguc3FydCh6ICogcyAqIChuIC0gcykgLyBuKSAqIChtIC0gbiAvIDIgPCAwID8gLTEgOiAxKTtcbiAgICAgICAgICAgIHZhciBuZXdMZWZ0ID0gTWF0aC5tYXgobGVmdCwgTWF0aC5mbG9vcihrIC0gbSAqIHMgLyBuICsgc2QpKTtcbiAgICAgICAgICAgIHZhciBuZXdSaWdodCA9IE1hdGgubWluKHJpZ2h0LCBNYXRoLmZsb29yKGsgKyAobiAtIG0pICogcyAvIG4gKyBzZCkpO1xuICAgICAgICAgICAgc2VsZWN0KGlkcywgY29vcmRzLCBrLCBuZXdMZWZ0LCBuZXdSaWdodCwgaW5jKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB0ID0gY29vcmRzWzIgKiBrICsgaW5jXTtcbiAgICAgICAgdmFyIGkgPSBsZWZ0O1xuICAgICAgICB2YXIgaiA9IHJpZ2h0O1xuXG4gICAgICAgIHN3YXBJdGVtKGlkcywgY29vcmRzLCBsZWZ0LCBrKTtcbiAgICAgICAgaWYgKGNvb3Jkc1syICogcmlnaHQgKyBpbmNdID4gdCkgc3dhcEl0ZW0oaWRzLCBjb29yZHMsIGxlZnQsIHJpZ2h0KTtcblxuICAgICAgICB3aGlsZSAoaSA8IGopIHtcbiAgICAgICAgICAgIHN3YXBJdGVtKGlkcywgY29vcmRzLCBpLCBqKTtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIGotLTtcbiAgICAgICAgICAgIHdoaWxlIChjb29yZHNbMiAqIGkgKyBpbmNdIDwgdCkgaSsrO1xuICAgICAgICAgICAgd2hpbGUgKGNvb3Jkc1syICogaiArIGluY10gPiB0KSBqLS07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29vcmRzWzIgKiBsZWZ0ICsgaW5jXSA9PT0gdCkgc3dhcEl0ZW0oaWRzLCBjb29yZHMsIGxlZnQsIGopO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGorKztcbiAgICAgICAgICAgIHN3YXBJdGVtKGlkcywgY29vcmRzLCBqLCByaWdodCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaiA8PSBrKSBsZWZ0ID0gaiArIDE7XG4gICAgICAgIGlmIChrIDw9IGopIHJpZ2h0ID0gaiAtIDE7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBzd2FwSXRlbShpZHMsIGNvb3JkcywgaSwgaikge1xuICAgIHN3YXAoaWRzLCBpLCBqKTtcbiAgICBzd2FwKGNvb3JkcywgMiAqIGksIDIgKiBqKTtcbiAgICBzd2FwKGNvb3JkcywgMiAqIGkgKyAxLCAyICogaiArIDEpO1xufVxuXG5mdW5jdGlvbiBzd2FwKGFyciwgaSwgaikge1xuICAgIHZhciB0bXAgPSBhcnJbaV07XG4gICAgYXJyW2ldID0gYXJyW2pdO1xuICAgIGFycltqXSA9IHRtcDtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSB3aXRoaW47XG5cbmZ1bmN0aW9uIHdpdGhpbihpZHMsIGNvb3JkcywgcXgsIHF5LCByLCBub2RlU2l6ZSkge1xuICAgIHZhciBzdGFjayA9IFswLCBpZHMubGVuZ3RoIC0gMSwgMF07XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIHZhciByMiA9IHIgKiByO1xuXG4gICAgd2hpbGUgKHN0YWNrLmxlbmd0aCkge1xuICAgICAgICB2YXIgYXhpcyA9IHN0YWNrLnBvcCgpO1xuICAgICAgICB2YXIgcmlnaHQgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgdmFyIGxlZnQgPSBzdGFjay5wb3AoKTtcblxuICAgICAgICBpZiAocmlnaHQgLSBsZWZ0IDw9IG5vZGVTaXplKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gbGVmdDsgaSA8PSByaWdodDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNxRGlzdChjb29yZHNbMiAqIGldLCBjb29yZHNbMiAqIGkgKyAxXSwgcXgsIHF5KSA8PSByMikgcmVzdWx0LnB1c2goaWRzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG0gPSBNYXRoLmZsb29yKChsZWZ0ICsgcmlnaHQpIC8gMik7XG5cbiAgICAgICAgdmFyIHggPSBjb29yZHNbMiAqIG1dO1xuICAgICAgICB2YXIgeSA9IGNvb3Jkc1syICogbSArIDFdO1xuXG4gICAgICAgIGlmIChzcURpc3QoeCwgeSwgcXgsIHF5KSA8PSByMikgcmVzdWx0LnB1c2goaWRzW21dKTtcblxuICAgICAgICB2YXIgbmV4dEF4aXMgPSAoYXhpcyArIDEpICUgMjtcblxuICAgICAgICBpZiAoYXhpcyA9PT0gMCA/IHF4IC0gciA8PSB4IDogcXkgLSByIDw9IHkpIHtcbiAgICAgICAgICAgIHN0YWNrLnB1c2gobGVmdCk7XG4gICAgICAgICAgICBzdGFjay5wdXNoKG0gLSAxKTtcbiAgICAgICAgICAgIHN0YWNrLnB1c2gobmV4dEF4aXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChheGlzID09PSAwID8gcXggKyByID49IHggOiBxeSArIHIgPj0geSkge1xuICAgICAgICAgICAgc3RhY2sucHVzaChtICsgMSk7XG4gICAgICAgICAgICBzdGFjay5wdXNoKHJpZ2h0KTtcbiAgICAgICAgICAgIHN0YWNrLnB1c2gobmV4dEF4aXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gc3FEaXN0KGF4LCBheSwgYngsIGJ5KSB7XG4gICAgdmFyIGR4ID0gYXggLSBieDtcbiAgICB2YXIgZHkgPSBheSAtIGJ5O1xuICAgIHJldHVybiBkeCAqIGR4ICsgZHkgKiBkeTtcbn1cbiIsIi8qKlxuICogbG9kYXNoIDMuMC43IChDdXN0b20gQnVpbGQpIDxodHRwczovL2xvZGFzaC5jb20vPlxuICogQnVpbGQ6IGBsb2Rhc2ggbW9kZXJuIG1vZHVsYXJpemUgZXhwb3J0cz1cIm5wbVwiIC1vIC4vYFxuICogQ29weXJpZ2h0IDIwMTItMjAxNSBUaGUgRG9qbyBGb3VuZGF0aW9uIDxodHRwOi8vZG9qb2ZvdW5kYXRpb24ub3JnLz5cbiAqIEJhc2VkIG9uIFVuZGVyc2NvcmUuanMgMS44LjMgPGh0dHA6Ly91bmRlcnNjb3JlanMub3JnL0xJQ0VOU0U+XG4gKiBDb3B5cmlnaHQgMjAwOS0yMDE1IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzXG4gKiBBdmFpbGFibGUgdW5kZXIgTUlUIGxpY2Vuc2UgPGh0dHBzOi8vbG9kYXNoLmNvbS9saWNlbnNlPlxuICovXG52YXIgaXNBcnJheSA9IHJlcXVpcmUoJ2xvZGFzaC5pc2FycmF5JyksXG4gICAgaXNUeXBlZEFycmF5ID0gcmVxdWlyZSgnbG9kYXNoLmlzdHlwZWRhcnJheScpLFxuICAgIGtleXMgPSByZXF1aXJlKCdsb2Rhc2gua2V5cycpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgYXJnc1RhZyA9ICdbb2JqZWN0IEFyZ3VtZW50c10nLFxuICAgIGFycmF5VGFnID0gJ1tvYmplY3QgQXJyYXldJyxcbiAgICBib29sVGFnID0gJ1tvYmplY3QgQm9vbGVhbl0nLFxuICAgIGRhdGVUYWcgPSAnW29iamVjdCBEYXRlXScsXG4gICAgZXJyb3JUYWcgPSAnW29iamVjdCBFcnJvcl0nLFxuICAgIG51bWJlclRhZyA9ICdbb2JqZWN0IE51bWJlcl0nLFxuICAgIG9iamVjdFRhZyA9ICdbb2JqZWN0IE9iamVjdF0nLFxuICAgIHJlZ2V4cFRhZyA9ICdbb2JqZWN0IFJlZ0V4cF0nLFxuICAgIHN0cmluZ1RhZyA9ICdbb2JqZWN0IFN0cmluZ10nO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0TGlrZSh2YWx1ZSkge1xuICByZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCc7XG59XG5cbi8qKiBVc2VkIGZvciBuYXRpdmUgbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIFVzZWQgdG8gcmVzb2x2ZSB0aGUgW2B0b1N0cmluZ1RhZ2BdKGh0dHBzOi8vcGVvcGxlLm1vemlsbGEub3JnL35qb3JlbmRvcmZmL2VzNi1kcmFmdC5odG1sI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgb2JqVG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uc29tZWAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yIGNhbGxiYWNrXG4gKiBzaG9ydGhhbmRzIGFuZCBgdGhpc2AgYmluZGluZy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFueSBlbGVtZW50IHBhc3NlcyB0aGUgcHJlZGljYXRlIGNoZWNrLFxuICogIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYXJyYXlTb21lKGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBpZiAocHJlZGljYXRlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc0VxdWFsYCB3aXRob3V0IHN1cHBvcnQgZm9yIGB0aGlzYCBiaW5kaW5nXG4gKiBgY3VzdG9taXplcmAgZnVuY3Rpb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmluZyB2YWx1ZXMuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0xvb3NlXSBTcGVjaWZ5IHBlcmZvcm1pbmcgcGFydGlhbCBjb21wYXJpc29ucy5cbiAqIEBwYXJhbSB7QXJyYXl9IFtzdGFja0FdIFRyYWNrcyB0cmF2ZXJzZWQgYHZhbHVlYCBvYmplY3RzLlxuICogQHBhcmFtIHtBcnJheX0gW3N0YWNrQl0gVHJhY2tzIHRyYXZlcnNlZCBgb3RoZXJgIG9iamVjdHMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNFcXVhbCh2YWx1ZSwgb3RoZXIsIGN1c3RvbWl6ZXIsIGlzTG9vc2UsIHN0YWNrQSwgc3RhY2tCKSB7XG4gIGlmICh2YWx1ZSA9PT0gb3RoZXIpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAodmFsdWUgPT0gbnVsbCB8fCBvdGhlciA9PSBudWxsIHx8ICghaXNPYmplY3QodmFsdWUpICYmICFpc09iamVjdExpa2Uob3RoZXIpKSkge1xuICAgIHJldHVybiB2YWx1ZSAhPT0gdmFsdWUgJiYgb3RoZXIgIT09IG90aGVyO1xuICB9XG4gIHJldHVybiBiYXNlSXNFcXVhbERlZXAodmFsdWUsIG90aGVyLCBiYXNlSXNFcXVhbCwgY3VzdG9taXplciwgaXNMb29zZSwgc3RhY2tBLCBzdGFja0IpO1xufVxuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUlzRXF1YWxgIGZvciBhcnJheXMgYW5kIG9iamVjdHMgd2hpY2ggcGVyZm9ybXNcbiAqIGRlZXAgY29tcGFyaXNvbnMgYW5kIHRyYWNrcyB0cmF2ZXJzZWQgb2JqZWN0cyBlbmFibGluZyBvYmplY3RzIHdpdGggY2lyY3VsYXJcbiAqIHJlZmVyZW5jZXMgdG8gYmUgY29tcGFyZWQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjb21wYXJlLlxuICogQHBhcmFtIHtPYmplY3R9IG90aGVyIFRoZSBvdGhlciBvYmplY3QgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGVxdWFsRnVuYyBUaGUgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGVxdWl2YWxlbnRzIG9mIHZhbHVlcy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmluZyBvYmplY3RzLlxuICogQHBhcmFtIHtib29sZWFufSBbaXNMb29zZV0gU3BlY2lmeSBwZXJmb3JtaW5nIHBhcnRpYWwgY29tcGFyaXNvbnMuXG4gKiBAcGFyYW0ge0FycmF5fSBbc3RhY2tBPVtdXSBUcmFja3MgdHJhdmVyc2VkIGB2YWx1ZWAgb2JqZWN0cy5cbiAqIEBwYXJhbSB7QXJyYXl9IFtzdGFja0I9W11dIFRyYWNrcyB0cmF2ZXJzZWQgYG90aGVyYCBvYmplY3RzLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBvYmplY3RzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc0VxdWFsRGVlcChvYmplY3QsIG90aGVyLCBlcXVhbEZ1bmMsIGN1c3RvbWl6ZXIsIGlzTG9vc2UsIHN0YWNrQSwgc3RhY2tCKSB7XG4gIHZhciBvYmpJc0FyciA9IGlzQXJyYXkob2JqZWN0KSxcbiAgICAgIG90aElzQXJyID0gaXNBcnJheShvdGhlciksXG4gICAgICBvYmpUYWcgPSBhcnJheVRhZyxcbiAgICAgIG90aFRhZyA9IGFycmF5VGFnO1xuXG4gIGlmICghb2JqSXNBcnIpIHtcbiAgICBvYmpUYWcgPSBvYmpUb1N0cmluZy5jYWxsKG9iamVjdCk7XG4gICAgaWYgKG9ialRhZyA9PSBhcmdzVGFnKSB7XG4gICAgICBvYmpUYWcgPSBvYmplY3RUYWc7XG4gICAgfSBlbHNlIGlmIChvYmpUYWcgIT0gb2JqZWN0VGFnKSB7XG4gICAgICBvYmpJc0FyciA9IGlzVHlwZWRBcnJheShvYmplY3QpO1xuICAgIH1cbiAgfVxuICBpZiAoIW90aElzQXJyKSB7XG4gICAgb3RoVGFnID0gb2JqVG9TdHJpbmcuY2FsbChvdGhlcik7XG4gICAgaWYgKG90aFRhZyA9PSBhcmdzVGFnKSB7XG4gICAgICBvdGhUYWcgPSBvYmplY3RUYWc7XG4gICAgfSBlbHNlIGlmIChvdGhUYWcgIT0gb2JqZWN0VGFnKSB7XG4gICAgICBvdGhJc0FyciA9IGlzVHlwZWRBcnJheShvdGhlcik7XG4gICAgfVxuICB9XG4gIHZhciBvYmpJc09iaiA9IG9ialRhZyA9PSBvYmplY3RUYWcsXG4gICAgICBvdGhJc09iaiA9IG90aFRhZyA9PSBvYmplY3RUYWcsXG4gICAgICBpc1NhbWVUYWcgPSBvYmpUYWcgPT0gb3RoVGFnO1xuXG4gIGlmIChpc1NhbWVUYWcgJiYgIShvYmpJc0FyciB8fCBvYmpJc09iaikpIHtcbiAgICByZXR1cm4gZXF1YWxCeVRhZyhvYmplY3QsIG90aGVyLCBvYmpUYWcpO1xuICB9XG4gIGlmICghaXNMb29zZSkge1xuICAgIHZhciBvYmpJc1dyYXBwZWQgPSBvYmpJc09iaiAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgJ19fd3JhcHBlZF9fJyksXG4gICAgICAgIG90aElzV3JhcHBlZCA9IG90aElzT2JqICYmIGhhc093blByb3BlcnR5LmNhbGwob3RoZXIsICdfX3dyYXBwZWRfXycpO1xuXG4gICAgaWYgKG9iaklzV3JhcHBlZCB8fCBvdGhJc1dyYXBwZWQpIHtcbiAgICAgIHJldHVybiBlcXVhbEZ1bmMob2JqSXNXcmFwcGVkID8gb2JqZWN0LnZhbHVlKCkgOiBvYmplY3QsIG90aElzV3JhcHBlZCA/IG90aGVyLnZhbHVlKCkgOiBvdGhlciwgY3VzdG9taXplciwgaXNMb29zZSwgc3RhY2tBLCBzdGFja0IpO1xuICAgIH1cbiAgfVxuICBpZiAoIWlzU2FtZVRhZykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvLyBBc3N1bWUgY3ljbGljIHZhbHVlcyBhcmUgZXF1YWwuXG4gIC8vIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGRldGVjdGluZyBjaXJjdWxhciByZWZlcmVuY2VzIHNlZSBodHRwczovL2VzNS5naXRodWIuaW8vI0pPLlxuICBzdGFja0EgfHwgKHN0YWNrQSA9IFtdKTtcbiAgc3RhY2tCIHx8IChzdGFja0IgPSBbXSk7XG5cbiAgdmFyIGxlbmd0aCA9IHN0YWNrQS5sZW5ndGg7XG4gIHdoaWxlIChsZW5ndGgtLSkge1xuICAgIGlmIChzdGFja0FbbGVuZ3RoXSA9PSBvYmplY3QpIHtcbiAgICAgIHJldHVybiBzdGFja0JbbGVuZ3RoXSA9PSBvdGhlcjtcbiAgICB9XG4gIH1cbiAgLy8gQWRkIGBvYmplY3RgIGFuZCBgb3RoZXJgIHRvIHRoZSBzdGFjayBvZiB0cmF2ZXJzZWQgb2JqZWN0cy5cbiAgc3RhY2tBLnB1c2gob2JqZWN0KTtcbiAgc3RhY2tCLnB1c2gob3RoZXIpO1xuXG4gIHZhciByZXN1bHQgPSAob2JqSXNBcnIgPyBlcXVhbEFycmF5cyA6IGVxdWFsT2JqZWN0cykob2JqZWN0LCBvdGhlciwgZXF1YWxGdW5jLCBjdXN0b21pemVyLCBpc0xvb3NlLCBzdGFja0EsIHN0YWNrQik7XG5cbiAgc3RhY2tBLnBvcCgpO1xuICBzdGFja0IucG9wKCk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VJc0VxdWFsRGVlcGAgZm9yIGFycmF5cyB3aXRoIHN1cHBvcnQgZm9yXG4gKiBwYXJ0aWFsIGRlZXAgY29tcGFyaXNvbnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBjb21wYXJlLlxuICogQHBhcmFtIHtBcnJheX0gb3RoZXIgVGhlIG90aGVyIGFycmF5IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpbmcgYXJyYXlzLlxuICogQHBhcmFtIHtib29sZWFufSBbaXNMb29zZV0gU3BlY2lmeSBwZXJmb3JtaW5nIHBhcnRpYWwgY29tcGFyaXNvbnMuXG4gKiBAcGFyYW0ge0FycmF5fSBbc3RhY2tBXSBUcmFja3MgdHJhdmVyc2VkIGB2YWx1ZWAgb2JqZWN0cy5cbiAqIEBwYXJhbSB7QXJyYXl9IFtzdGFja0JdIFRyYWNrcyB0cmF2ZXJzZWQgYG90aGVyYCBvYmplY3RzLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBhcnJheXMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gZXF1YWxBcnJheXMoYXJyYXksIG90aGVyLCBlcXVhbEZ1bmMsIGN1c3RvbWl6ZXIsIGlzTG9vc2UsIHN0YWNrQSwgc3RhY2tCKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgYXJyTGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgb3RoTGVuZ3RoID0gb3RoZXIubGVuZ3RoO1xuXG4gIGlmIChhcnJMZW5ndGggIT0gb3RoTGVuZ3RoICYmICEoaXNMb29zZSAmJiBvdGhMZW5ndGggPiBhcnJMZW5ndGgpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vIElnbm9yZSBub24taW5kZXggcHJvcGVydGllcy5cbiAgd2hpbGUgKCsraW5kZXggPCBhcnJMZW5ndGgpIHtcbiAgICB2YXIgYXJyVmFsdWUgPSBhcnJheVtpbmRleF0sXG4gICAgICAgIG90aFZhbHVlID0gb3RoZXJbaW5kZXhdLFxuICAgICAgICByZXN1bHQgPSBjdXN0b21pemVyID8gY3VzdG9taXplcihpc0xvb3NlID8gb3RoVmFsdWUgOiBhcnJWYWx1ZSwgaXNMb29zZSA/IGFyclZhbHVlIDogb3RoVmFsdWUsIGluZGV4KSA6IHVuZGVmaW5lZDtcblxuICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLy8gUmVjdXJzaXZlbHkgY29tcGFyZSBhcnJheXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICBpZiAoaXNMb29zZSkge1xuICAgICAgaWYgKCFhcnJheVNvbWUob3RoZXIsIGZ1bmN0aW9uKG90aFZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gYXJyVmFsdWUgPT09IG90aFZhbHVlIHx8IGVxdWFsRnVuYyhhcnJWYWx1ZSwgb3RoVmFsdWUsIGN1c3RvbWl6ZXIsIGlzTG9vc2UsIHN0YWNrQSwgc3RhY2tCKTtcbiAgICAgICAgICB9KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghKGFyclZhbHVlID09PSBvdGhWYWx1ZSB8fCBlcXVhbEZ1bmMoYXJyVmFsdWUsIG90aFZhbHVlLCBjdXN0b21pemVyLCBpc0xvb3NlLCBzdGFja0EsIHN0YWNrQikpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUlzRXF1YWxEZWVwYCBmb3IgY29tcGFyaW5nIG9iamVjdHMgb2ZcbiAqIHRoZSBzYW1lIGB0b1N0cmluZ1RhZ2AuXG4gKlxuICogKipOb3RlOioqIFRoaXMgZnVuY3Rpb24gb25seSBzdXBwb3J0cyBjb21wYXJpbmcgdmFsdWVzIHdpdGggdGFncyBvZlxuICogYEJvb2xlYW5gLCBgRGF0ZWAsIGBFcnJvcmAsIGBOdW1iZXJgLCBgUmVnRXhwYCwgb3IgYFN0cmluZ2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZSBUaGUgb2JqZWN0IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge09iamVjdH0gb3RoZXIgVGhlIG90aGVyIG9iamVjdCB0byBjb21wYXJlLlxuICogQHBhcmFtIHtzdHJpbmd9IHRhZyBUaGUgYHRvU3RyaW5nVGFnYCBvZiB0aGUgb2JqZWN0cyB0byBjb21wYXJlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBvYmplY3RzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGVxdWFsQnlUYWcob2JqZWN0LCBvdGhlciwgdGFnKSB7XG4gIHN3aXRjaCAodGFnKSB7XG4gICAgY2FzZSBib29sVGFnOlxuICAgIGNhc2UgZGF0ZVRhZzpcbiAgICAgIC8vIENvZXJjZSBkYXRlcyBhbmQgYm9vbGVhbnMgdG8gbnVtYmVycywgZGF0ZXMgdG8gbWlsbGlzZWNvbmRzIGFuZCBib29sZWFuc1xuICAgICAgLy8gdG8gYDFgIG9yIGAwYCB0cmVhdGluZyBpbnZhbGlkIGRhdGVzIGNvZXJjZWQgdG8gYE5hTmAgYXMgbm90IGVxdWFsLlxuICAgICAgcmV0dXJuICtvYmplY3QgPT0gK290aGVyO1xuXG4gICAgY2FzZSBlcnJvclRhZzpcbiAgICAgIHJldHVybiBvYmplY3QubmFtZSA9PSBvdGhlci5uYW1lICYmIG9iamVjdC5tZXNzYWdlID09IG90aGVyLm1lc3NhZ2U7XG5cbiAgICBjYXNlIG51bWJlclRhZzpcbiAgICAgIC8vIFRyZWF0IGBOYU5gIHZzLiBgTmFOYCBhcyBlcXVhbC5cbiAgICAgIHJldHVybiAob2JqZWN0ICE9ICtvYmplY3QpXG4gICAgICAgID8gb3RoZXIgIT0gK290aGVyXG4gICAgICAgIDogb2JqZWN0ID09ICtvdGhlcjtcblxuICAgIGNhc2UgcmVnZXhwVGFnOlxuICAgIGNhc2Ugc3RyaW5nVGFnOlxuICAgICAgLy8gQ29lcmNlIHJlZ2V4ZXMgdG8gc3RyaW5ncyBhbmQgdHJlYXQgc3RyaW5ncyBwcmltaXRpdmVzIGFuZCBzdHJpbmdcbiAgICAgIC8vIG9iamVjdHMgYXMgZXF1YWwuIFNlZSBodHRwczovL2VzNS5naXRodWIuaW8vI3gxNS4xMC42LjQgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgIHJldHVybiBvYmplY3QgPT0gKG90aGVyICsgJycpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VJc0VxdWFsRGVlcGAgZm9yIG9iamVjdHMgd2l0aCBzdXBwb3J0IGZvclxuICogcGFydGlhbCBkZWVwIGNvbXBhcmlzb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvdGhlciBUaGUgb3RoZXIgb2JqZWN0IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpbmcgdmFsdWVzLlxuICogQHBhcmFtIHtib29sZWFufSBbaXNMb29zZV0gU3BlY2lmeSBwZXJmb3JtaW5nIHBhcnRpYWwgY29tcGFyaXNvbnMuXG4gKiBAcGFyYW0ge0FycmF5fSBbc3RhY2tBXSBUcmFja3MgdHJhdmVyc2VkIGB2YWx1ZWAgb2JqZWN0cy5cbiAqIEBwYXJhbSB7QXJyYXl9IFtzdGFja0JdIFRyYWNrcyB0cmF2ZXJzZWQgYG90aGVyYCBvYmplY3RzLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBvYmplY3RzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGVxdWFsT2JqZWN0cyhvYmplY3QsIG90aGVyLCBlcXVhbEZ1bmMsIGN1c3RvbWl6ZXIsIGlzTG9vc2UsIHN0YWNrQSwgc3RhY2tCKSB7XG4gIHZhciBvYmpQcm9wcyA9IGtleXMob2JqZWN0KSxcbiAgICAgIG9iakxlbmd0aCA9IG9ialByb3BzLmxlbmd0aCxcbiAgICAgIG90aFByb3BzID0ga2V5cyhvdGhlciksXG4gICAgICBvdGhMZW5ndGggPSBvdGhQcm9wcy5sZW5ndGg7XG5cbiAgaWYgKG9iakxlbmd0aCAhPSBvdGhMZW5ndGggJiYgIWlzTG9vc2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIGluZGV4ID0gb2JqTGVuZ3RoO1xuICB3aGlsZSAoaW5kZXgtLSkge1xuICAgIHZhciBrZXkgPSBvYmpQcm9wc1tpbmRleF07XG4gICAgaWYgKCEoaXNMb29zZSA/IGtleSBpbiBvdGhlciA6IGhhc093blByb3BlcnR5LmNhbGwob3RoZXIsIGtleSkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHZhciBza2lwQ3RvciA9IGlzTG9vc2U7XG4gIHdoaWxlICgrK2luZGV4IDwgb2JqTGVuZ3RoKSB7XG4gICAga2V5ID0gb2JqUHJvcHNbaW5kZXhdO1xuICAgIHZhciBvYmpWYWx1ZSA9IG9iamVjdFtrZXldLFxuICAgICAgICBvdGhWYWx1ZSA9IG90aGVyW2tleV0sXG4gICAgICAgIHJlc3VsdCA9IGN1c3RvbWl6ZXIgPyBjdXN0b21pemVyKGlzTG9vc2UgPyBvdGhWYWx1ZSA6IG9ialZhbHVlLCBpc0xvb3NlPyBvYmpWYWx1ZSA6IG90aFZhbHVlLCBrZXkpIDogdW5kZWZpbmVkO1xuXG4gICAgLy8gUmVjdXJzaXZlbHkgY29tcGFyZSBvYmplY3RzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgaWYgKCEocmVzdWx0ID09PSB1bmRlZmluZWQgPyBlcXVhbEZ1bmMob2JqVmFsdWUsIG90aFZhbHVlLCBjdXN0b21pemVyLCBpc0xvb3NlLCBzdGFja0EsIHN0YWNrQikgOiByZXN1bHQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHNraXBDdG9yIHx8IChza2lwQ3RvciA9IGtleSA9PSAnY29uc3RydWN0b3InKTtcbiAgfVxuICBpZiAoIXNraXBDdG9yKSB7XG4gICAgdmFyIG9iakN0b3IgPSBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICAgIG90aEN0b3IgPSBvdGhlci5jb25zdHJ1Y3RvcjtcblxuICAgIC8vIE5vbiBgT2JqZWN0YCBvYmplY3QgaW5zdGFuY2VzIHdpdGggZGlmZmVyZW50IGNvbnN0cnVjdG9ycyBhcmUgbm90IGVxdWFsLlxuICAgIGlmIChvYmpDdG9yICE9IG90aEN0b3IgJiZcbiAgICAgICAgKCdjb25zdHJ1Y3RvcicgaW4gb2JqZWN0ICYmICdjb25zdHJ1Y3RvcicgaW4gb3RoZXIpICYmXG4gICAgICAgICEodHlwZW9mIG9iakN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBvYmpDdG9yIGluc3RhbmNlb2Ygb2JqQ3RvciAmJlxuICAgICAgICAgIHR5cGVvZiBvdGhDdG9yID09ICdmdW5jdGlvbicgJiYgb3RoQ3RvciBpbnN0YW5jZW9mIG90aEN0b3IpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHRoZSBbbGFuZ3VhZ2UgdHlwZV0oaHR0cHM6Ly9lczUuZ2l0aHViLmlvLyN4OCkgb2YgYE9iamVjdGAuXG4gKiAoZS5nLiBhcnJheXMsIGZ1bmN0aW9ucywgb2JqZWN0cywgcmVnZXhlcywgYG5ldyBOdW1iZXIoMClgLCBhbmQgYG5ldyBTdHJpbmcoJycpYClcbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3Qoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KDEpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcbiAgLy8gQXZvaWQgYSBWOCBKSVQgYnVnIGluIENocm9tZSAxOS0yMC5cbiAgLy8gU2VlIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0yMjkxIGZvciBtb3JlIGRldGFpbHMuXG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICByZXR1cm4gISF2YWx1ZSAmJiAodHlwZSA9PSAnb2JqZWN0JyB8fCB0eXBlID09ICdmdW5jdGlvbicpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VJc0VxdWFsO1xuIiwiLyoqXG4gKiBsb2Rhc2ggMy4wLjEgKEN1c3RvbSBCdWlsZCkgPGh0dHBzOi8vbG9kYXNoLmNvbS8+XG4gKiBCdWlsZDogYGxvZGFzaCBtb2Rlcm4gbW9kdWxhcml6ZSBleHBvcnRzPVwibnBtXCIgLW8gLi9gXG4gKiBDb3B5cmlnaHQgMjAxMi0yMDE1IFRoZSBEb2pvIEZvdW5kYXRpb24gPGh0dHA6Ly9kb2pvZm91bmRhdGlvbi5vcmcvPlxuICogQmFzZWQgb24gVW5kZXJzY29yZS5qcyAxLjguMyA8aHR0cDovL3VuZGVyc2NvcmVqcy5vcmcvTElDRU5TRT5cbiAqIENvcHlyaWdodCAyMDA5LTIwMTUgSmVyZW15IEFzaGtlbmFzLCBEb2N1bWVudENsb3VkIGFuZCBJbnZlc3RpZ2F0aXZlIFJlcG9ydGVycyAmIEVkaXRvcnNcbiAqIEF2YWlsYWJsZSB1bmRlciBNSVQgbGljZW5zZSA8aHR0cHM6Ly9sb2Rhc2guY29tL2xpY2Vuc2U+XG4gKi9cblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VDYWxsYmFja2Agd2hpY2ggb25seSBzdXBwb3J0cyBgdGhpc2AgYmluZGluZ1xuICogYW5kIHNwZWNpZnlpbmcgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgdG8gcHJvdmlkZSB0byBgZnVuY2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGJpbmQuXG4gKiBAcGFyYW0geyp9IHRoaXNBcmcgVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbYXJnQ291bnRdIFRoZSBudW1iZXIgb2YgYXJndW1lbnRzIHRvIHByb3ZpZGUgdG8gYGZ1bmNgLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBjYWxsYmFjay5cbiAqL1xuZnVuY3Rpb24gYmluZENhbGxiYWNrKGZ1bmMsIHRoaXNBcmcsIGFyZ0NvdW50KSB7XG4gIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGlkZW50aXR5O1xuICB9XG4gIGlmICh0aGlzQXJnID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZnVuYztcbiAgfVxuICBzd2l0Y2ggKGFyZ0NvdW50KSB7XG4gICAgY2FzZSAxOiByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgdmFsdWUpO1xuICAgIH07XG4gICAgY2FzZSAzOiByZXR1cm4gZnVuY3Rpb24odmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSB7XG4gICAgICByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbik7XG4gICAgfTtcbiAgICBjYXNlIDQ6IHJldHVybiBmdW5jdGlvbihhY2N1bXVsYXRvciwgdmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSB7XG4gICAgICByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGFjY3VtdWxhdG9yLCB2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pO1xuICAgIH07XG4gICAgY2FzZSA1OiByZXR1cm4gZnVuY3Rpb24odmFsdWUsIG90aGVyLCBrZXksIG9iamVjdCwgc291cmNlKSB7XG4gICAgICByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIHZhbHVlLCBvdGhlciwga2V5LCBvYmplY3QsIHNvdXJjZSk7XG4gICAgfTtcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpc0FyZywgYXJndW1lbnRzKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBmaXJzdCBhcmd1bWVudCBwcm92aWRlZCB0byBpdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IFV0aWxpdHlcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgQW55IHZhbHVlLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgYHZhbHVlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ3VzZXInOiAnZnJlZCcgfTtcbiAqXG4gKiBfLmlkZW50aXR5KG9iamVjdCkgPT09IG9iamVjdDtcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gaWRlbnRpdHkodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJpbmRDYWxsYmFjaztcbiIsIi8qKlxuICogbG9kYXNoIDMuOS4xIChDdXN0b20gQnVpbGQpIDxodHRwczovL2xvZGFzaC5jb20vPlxuICogQnVpbGQ6IGBsb2Rhc2ggbW9kZXJuIG1vZHVsYXJpemUgZXhwb3J0cz1cIm5wbVwiIC1vIC4vYFxuICogQ29weXJpZ2h0IDIwMTItMjAxNSBUaGUgRG9qbyBGb3VuZGF0aW9uIDxodHRwOi8vZG9qb2ZvdW5kYXRpb24ub3JnLz5cbiAqIEJhc2VkIG9uIFVuZGVyc2NvcmUuanMgMS44LjMgPGh0dHA6Ly91bmRlcnNjb3JlanMub3JnL0xJQ0VOU0U+XG4gKiBDb3B5cmlnaHQgMjAwOS0yMDE1IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzXG4gKiBBdmFpbGFibGUgdW5kZXIgTUlUIGxpY2Vuc2UgPGh0dHBzOi8vbG9kYXNoLmNvbS9saWNlbnNlPlxuICovXG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBmdW5jVGFnID0gJ1tvYmplY3QgRnVuY3Rpb25dJztcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGhvc3QgY29uc3RydWN0b3JzIChTYWZhcmkgPiA1KS4gKi9cbnZhciByZUlzSG9zdEN0b3IgPSAvXlxcW29iamVjdCAuKz9Db25zdHJ1Y3RvclxcXSQvO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0TGlrZSh2YWx1ZSkge1xuICByZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCc7XG59XG5cbi8qKiBVc2VkIGZvciBuYXRpdmUgbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byByZXNvbHZlIHRoZSBkZWNvbXBpbGVkIHNvdXJjZSBvZiBmdW5jdGlvbnMuICovXG52YXIgZm5Ub1N0cmluZyA9IEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZztcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgb2JqVG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGlmIGEgbWV0aG9kIGlzIG5hdGl2ZS4gKi9cbnZhciByZUlzTmF0aXZlID0gUmVnRXhwKCdeJyArXG4gIGZuVG9TdHJpbmcuY2FsbChoYXNPd25Qcm9wZXJ0eSkucmVwbGFjZSgvW1xcXFxeJC4qKz8oKVtcXF17fXxdL2csICdcXFxcJCYnKVxuICAucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXFxcXCgpfCBmb3IgLis/KD89XFxcXFxcXSkvZywgJyQxLio/JykgKyAnJCdcbik7XG5cbi8qKlxuICogR2V0cyB0aGUgbmF0aXZlIGZ1bmN0aW9uIGF0IGBrZXlgIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIG1ldGhvZCB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZnVuY3Rpb24gaWYgaXQncyBuYXRpdmUsIGVsc2UgYHVuZGVmaW5lZGAuXG4gKi9cbmZ1bmN0aW9uIGdldE5hdGl2ZShvYmplY3QsIGtleSkge1xuICB2YXIgdmFsdWUgPSBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IG9iamVjdFtrZXldO1xuICByZXR1cm4gaXNOYXRpdmUodmFsdWUpID8gdmFsdWUgOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBGdW5jdGlvbmAgb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBjb3JyZWN0bHkgY2xhc3NpZmllZCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzRnVuY3Rpb24oXyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0Z1bmN0aW9uKC9hYmMvKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpIHtcbiAgLy8gVGhlIHVzZSBvZiBgT2JqZWN0I3RvU3RyaW5nYCBhdm9pZHMgaXNzdWVzIHdpdGggdGhlIGB0eXBlb2ZgIG9wZXJhdG9yXG4gIC8vIGluIG9sZGVyIHZlcnNpb25zIG9mIENocm9tZSBhbmQgU2FmYXJpIHdoaWNoIHJldHVybiAnZnVuY3Rpb24nIGZvciByZWdleGVzXG4gIC8vIGFuZCBTYWZhcmkgOCBlcXVpdmFsZW50cyB3aGljaCByZXR1cm4gJ29iamVjdCcgZm9yIHR5cGVkIGFycmF5IGNvbnN0cnVjdG9ycy5cbiAgcmV0dXJuIGlzT2JqZWN0KHZhbHVlKSAmJiBvYmpUb1N0cmluZy5jYWxsKHZhbHVlKSA9PSBmdW5jVGFnO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHRoZSBbbGFuZ3VhZ2UgdHlwZV0oaHR0cHM6Ly9lczUuZ2l0aHViLmlvLyN4OCkgb2YgYE9iamVjdGAuXG4gKiAoZS5nLiBhcnJheXMsIGZ1bmN0aW9ucywgb2JqZWN0cywgcmVnZXhlcywgYG5ldyBOdW1iZXIoMClgLCBhbmQgYG5ldyBTdHJpbmcoJycpYClcbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3Qoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KDEpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcbiAgLy8gQXZvaWQgYSBWOCBKSVQgYnVnIGluIENocm9tZSAxOS0yMC5cbiAgLy8gU2VlIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0yMjkxIGZvciBtb3JlIGRldGFpbHMuXG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICByZXR1cm4gISF2YWx1ZSAmJiAodHlwZSA9PSAnb2JqZWN0JyB8fCB0eXBlID09ICdmdW5jdGlvbicpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgbmF0aXZlIGZ1bmN0aW9uLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIG5hdGl2ZSBmdW5jdGlvbiwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzTmF0aXZlKEFycmF5LnByb3RvdHlwZS5wdXNoKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzTmF0aXZlKF8pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNOYXRpdmUodmFsdWUpIHtcbiAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgcmV0dXJuIHJlSXNOYXRpdmUudGVzdChmblRvU3RyaW5nLmNhbGwodmFsdWUpKTtcbiAgfVxuICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiByZUlzSG9zdEN0b3IudGVzdCh2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0TmF0aXZlO1xuIiwiLyoqXG4gKiBsb2Rhc2ggKEN1c3RvbSBCdWlsZCkgPGh0dHBzOi8vbG9kYXNoLmNvbS8+XG4gKiBCdWlsZDogYGxvZGFzaCBtb2R1bGFyaXplIGV4cG9ydHM9XCJucG1cIiAtbyAuL2BcbiAqIENvcHlyaWdodCBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzIDxodHRwczovL2pxdWVyeS5vcmcvPlxuICogUmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UgPGh0dHBzOi8vbG9kYXNoLmNvbS9saWNlbnNlPlxuICogQmFzZWQgb24gVW5kZXJzY29yZS5qcyAxLjguMyA8aHR0cDovL3VuZGVyc2NvcmVqcy5vcmcvTElDRU5TRT5cbiAqIENvcHlyaWdodCBKZXJlbXkgQXNoa2VuYXMsIERvY3VtZW50Q2xvdWQgYW5kIEludmVzdGlnYXRpdmUgUmVwb3J0ZXJzICYgRWRpdG9yc1xuICovXG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIE1BWF9TQUZFX0lOVEVHRVIgPSA5MDA3MTk5MjU0NzQwOTkxO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgYXJnc1RhZyA9ICdbb2JqZWN0IEFyZ3VtZW50c10nLFxuICAgIGZ1bmNUYWcgPSAnW29iamVjdCBGdW5jdGlvbl0nLFxuICAgIGdlblRhZyA9ICdbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXSc7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZVxuICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cbnZhciBvYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IG9iamVjdFByb3RvLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGxpa2VseSBhbiBgYXJndW1lbnRzYCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYGFyZ3VtZW50c2Agb2JqZWN0LFxuICogIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0FyZ3VtZW50cyhmdW5jdGlvbigpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJndW1lbnRzKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0FyZ3VtZW50cyh2YWx1ZSkge1xuICAvLyBTYWZhcmkgOC4xIG1ha2VzIGBhcmd1bWVudHMuY2FsbGVlYCBlbnVtZXJhYmxlIGluIHN0cmljdCBtb2RlLlxuICByZXR1cm4gaXNBcnJheUxpa2VPYmplY3QodmFsdWUpICYmIGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsICdjYWxsZWUnKSAmJlxuICAgICghcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh2YWx1ZSwgJ2NhbGxlZScpIHx8IG9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpID09IGFyZ3NUYWcpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFycmF5LWxpa2UuIEEgdmFsdWUgaXMgY29uc2lkZXJlZCBhcnJheS1saWtlIGlmIGl0J3NcbiAqIG5vdCBhIGZ1bmN0aW9uIGFuZCBoYXMgYSBgdmFsdWUubGVuZ3RoYCB0aGF0J3MgYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gb3JcbiAqIGVxdWFsIHRvIGAwYCBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUmAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYXJyYXktbGlrZSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZShkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlKCdhYmMnKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0FycmF5TGlrZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiBpc0xlbmd0aCh2YWx1ZS5sZW5ndGgpICYmICFpc0Z1bmN0aW9uKHZhbHVlKTtcbn1cblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmlzQXJyYXlMaWtlYCBleGNlcHQgdGhhdCBpdCBhbHNvIGNoZWNrcyBpZiBgdmFsdWVgXG4gKiBpcyBhbiBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYXJyYXktbGlrZSBvYmplY3QsXG4gKiAgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlT2JqZWN0KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZU9iamVjdChkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlT2JqZWN0KCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0FycmF5TGlrZU9iamVjdChfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBcnJheUxpa2VPYmplY3QodmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgaXNBcnJheUxpa2UodmFsdWUpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgRnVuY3Rpb25gIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGZ1bmN0aW9uLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNGdW5jdGlvbihfKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzRnVuY3Rpb24oL2FiYy8pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNGdW5jdGlvbih2YWx1ZSkge1xuICAvLyBUaGUgdXNlIG9mIGBPYmplY3QjdG9TdHJpbmdgIGF2b2lkcyBpc3N1ZXMgd2l0aCB0aGUgYHR5cGVvZmAgb3BlcmF0b3JcbiAgLy8gaW4gU2FmYXJpIDgtOSB3aGljaCByZXR1cm5zICdvYmplY3QnIGZvciB0eXBlZCBhcnJheSBhbmQgb3RoZXIgY29uc3RydWN0b3JzLlxuICB2YXIgdGFnID0gaXNPYmplY3QodmFsdWUpID8gb2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSkgOiAnJztcbiAgcmV0dXJuIHRhZyA9PSBmdW5jVGFnIHx8IHRhZyA9PSBnZW5UYWc7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBhcnJheS1saWtlIGxlbmd0aC5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgbG9vc2VseSBiYXNlZCBvblxuICogW2BUb0xlbmd0aGBdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXRvbGVuZ3RoKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGxlbmd0aCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzTGVuZ3RoKDMpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNMZW5ndGgoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNMZW5ndGgoSW5maW5pdHkpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzTGVuZ3RoKCczJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0xlbmd0aCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdudW1iZXInICYmXG4gICAgdmFsdWUgPiAtMSAmJiB2YWx1ZSAlIDEgPT0gMCAmJiB2YWx1ZSA8PSBNQVhfU0FGRV9JTlRFR0VSO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHRoZVxuICogW2xhbmd1YWdlIHR5cGVdKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1lY21hc2NyaXB0LWxhbmd1YWdlLXR5cGVzKVxuICogb2YgYE9iamVjdGAuIChlLmcuIGFycmF5cywgZnVuY3Rpb25zLCBvYmplY3RzLCByZWdleGVzLCBgbmV3IE51bWJlcigwKWAsIGFuZCBgbmV3IFN0cmluZygnJylgKVxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0KHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChfLm5vb3ApO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdCh2YWx1ZSkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgcmV0dXJuICEhdmFsdWUgJiYgKHR5cGUgPT0gJ29iamVjdCcgfHwgdHlwZSA9PSAnZnVuY3Rpb24nKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZS4gQSB2YWx1ZSBpcyBvYmplY3QtbGlrZSBpZiBpdCdzIG5vdCBgbnVsbGBcbiAqIGFuZCBoYXMgYSBgdHlwZW9mYCByZXN1bHQgb2YgXCJvYmplY3RcIi5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZSh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0TGlrZSh2YWx1ZSkge1xuICByZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNBcmd1bWVudHM7XG4iLCIvKipcbiAqIGxvZGFzaCAzLjAuNCAoQ3VzdG9tIEJ1aWxkKSA8aHR0cHM6Ly9sb2Rhc2guY29tLz5cbiAqIEJ1aWxkOiBgbG9kYXNoIG1vZGVybiBtb2R1bGFyaXplIGV4cG9ydHM9XCJucG1cIiAtbyAuL2BcbiAqIENvcHlyaWdodCAyMDEyLTIwMTUgVGhlIERvam8gRm91bmRhdGlvbiA8aHR0cDovL2Rvam9mb3VuZGF0aW9uLm9yZy8+XG4gKiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzIDEuOC4zIDxodHRwOi8vdW5kZXJzY29yZWpzLm9yZy9MSUNFTlNFPlxuICogQ29weXJpZ2h0IDIwMDktMjAxNSBKZXJlbXkgQXNoa2VuYXMsIERvY3VtZW50Q2xvdWQgYW5kIEludmVzdGlnYXRpdmUgUmVwb3J0ZXJzICYgRWRpdG9yc1xuICogQXZhaWxhYmxlIHVuZGVyIE1JVCBsaWNlbnNlIDxodHRwczovL2xvZGFzaC5jb20vbGljZW5zZT5cbiAqL1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgYXJyYXlUYWcgPSAnW29iamVjdCBBcnJheV0nLFxuICAgIGZ1bmNUYWcgPSAnW29iamVjdCBGdW5jdGlvbl0nO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgaG9zdCBjb25zdHJ1Y3RvcnMgKFNhZmFyaSA+IDUpLiAqL1xudmFyIHJlSXNIb3N0Q3RvciA9IC9eXFxbb2JqZWN0IC4rP0NvbnN0cnVjdG9yXFxdJC87XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlKSB7XG4gIHJldHVybiAhIXZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jztcbn1cblxuLyoqIFVzZWQgZm9yIG5hdGl2ZSBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIHJlc29sdmUgdGhlIGRlY29tcGlsZWQgc291cmNlIG9mIGZ1bmN0aW9ucy4gKi9cbnZhciBmblRvU3RyaW5nID0gRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIFVzZWQgdG8gcmVzb2x2ZSB0aGUgW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cbnZhciBvYmpUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgaWYgYSBtZXRob2QgaXMgbmF0aXZlLiAqL1xudmFyIHJlSXNOYXRpdmUgPSBSZWdFeHAoJ14nICtcbiAgZm5Ub1N0cmluZy5jYWxsKGhhc093blByb3BlcnR5KS5yZXBsYWNlKC9bXFxcXF4kLiorPygpW1xcXXt9fF0vZywgJ1xcXFwkJicpXG4gIC5yZXBsYWNlKC9oYXNPd25Qcm9wZXJ0eXwoZnVuY3Rpb24pLio/KD89XFxcXFxcKCl8IGZvciAuKz8oPz1cXFxcXFxdKS9nLCAnJDEuKj8nKSArICckJ1xuKTtcblxuLyogTmF0aXZlIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVJc0FycmF5ID0gZ2V0TmF0aXZlKEFycmF5LCAnaXNBcnJheScpO1xuXG4vKipcbiAqIFVzZWQgYXMgdGhlIFttYXhpbXVtIGxlbmd0aF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtbnVtYmVyLm1heF9zYWZlX2ludGVnZXIpXG4gKiBvZiBhbiBhcnJheS1saWtlIHZhbHVlLlxuICovXG52YXIgTUFYX1NBRkVfSU5URUdFUiA9IDkwMDcxOTkyNTQ3NDA5OTE7XG5cbi8qKlxuICogR2V0cyB0aGUgbmF0aXZlIGZ1bmN0aW9uIGF0IGBrZXlgIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIG1ldGhvZCB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZnVuY3Rpb24gaWYgaXQncyBuYXRpdmUsIGVsc2UgYHVuZGVmaW5lZGAuXG4gKi9cbmZ1bmN0aW9uIGdldE5hdGl2ZShvYmplY3QsIGtleSkge1xuICB2YXIgdmFsdWUgPSBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IG9iamVjdFtrZXldO1xuICByZXR1cm4gaXNOYXRpdmUodmFsdWUpID8gdmFsdWUgOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBhcnJheS1saWtlIGxlbmd0aC5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBmdW5jdGlvbiBpcyBiYXNlZCBvbiBbYFRvTGVuZ3RoYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtdG9sZW5ndGgpLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgbGVuZ3RoLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzTGVuZ3RoKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgJiYgdmFsdWUgPiAtMSAmJiB2YWx1ZSAlIDEgPT0gMCAmJiB2YWx1ZSA8PSBNQVhfU0FGRV9JTlRFR0VSO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYW4gYEFycmF5YCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGNvcnJlY3RseSBjbGFzc2lmaWVkLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcnJheShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheShmdW5jdGlvbigpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBpc0FycmF5ID0gbmF0aXZlSXNBcnJheSB8fCBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBpc0xlbmd0aCh2YWx1ZS5sZW5ndGgpICYmIG9ialRvU3RyaW5nLmNhbGwodmFsdWUpID09IGFycmF5VGFnO1xufTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYEZ1bmN0aW9uYCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGNvcnJlY3RseSBjbGFzc2lmaWVkLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNGdW5jdGlvbihfKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzRnVuY3Rpb24oL2FiYy8pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNGdW5jdGlvbih2YWx1ZSkge1xuICAvLyBUaGUgdXNlIG9mIGBPYmplY3QjdG9TdHJpbmdgIGF2b2lkcyBpc3N1ZXMgd2l0aCB0aGUgYHR5cGVvZmAgb3BlcmF0b3JcbiAgLy8gaW4gb2xkZXIgdmVyc2lvbnMgb2YgQ2hyb21lIGFuZCBTYWZhcmkgd2hpY2ggcmV0dXJuICdmdW5jdGlvbicgZm9yIHJlZ2V4ZXNcbiAgLy8gYW5kIFNhZmFyaSA4IGVxdWl2YWxlbnRzIHdoaWNoIHJldHVybiAnb2JqZWN0JyBmb3IgdHlwZWQgYXJyYXkgY29uc3RydWN0b3JzLlxuICByZXR1cm4gaXNPYmplY3QodmFsdWUpICYmIG9ialRvU3RyaW5nLmNhbGwodmFsdWUpID09IGZ1bmNUYWc7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgdGhlIFtsYW5ndWFnZSB0eXBlXShodHRwczovL2VzNS5naXRodWIuaW8vI3g4KSBvZiBgT2JqZWN0YC5cbiAqIChlLmcuIGFycmF5cywgZnVuY3Rpb25zLCBvYmplY3RzLCByZWdleGVzLCBgbmV3IE51bWJlcigwKWAsIGFuZCBgbmV3IFN0cmluZygnJylgKVxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdCh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoMSk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdCh2YWx1ZSkge1xuICAvLyBBdm9pZCBhIFY4IEpJVCBidWcgaW4gQ2hyb21lIDE5LTIwLlxuICAvLyBTZWUgaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTIyOTEgZm9yIG1vcmUgZGV0YWlscy5cbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIHJldHVybiAhIXZhbHVlICYmICh0eXBlID09ICdvYmplY3QnIHx8IHR5cGUgPT0gJ2Z1bmN0aW9uJyk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBuYXRpdmUgZnVuY3Rpb24uXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgbmF0aXZlIGZ1bmN0aW9uLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNOYXRpdmUoQXJyYXkucHJvdG90eXBlLnB1c2gpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNOYXRpdmUoXyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc05hdGl2ZSh2YWx1ZSkge1xuICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICByZXR1cm4gcmVJc05hdGl2ZS50ZXN0KGZuVG9TdHJpbmcuY2FsbCh2YWx1ZSkpO1xuICB9XG4gIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIHJlSXNIb3N0Q3Rvci50ZXN0KHZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0FycmF5O1xuIiwiLyoqXG4gKiBsb2Rhc2ggMy4wLjYgKEN1c3RvbSBCdWlsZCkgPGh0dHBzOi8vbG9kYXNoLmNvbS8+XG4gKiBCdWlsZDogYGxvZGFzaCBtb2R1bGFyaXplIGV4cG9ydHM9XCJucG1cIiAtbyAuL2BcbiAqIENvcHlyaWdodCBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzIDxodHRwczovL2pxdWVyeS5vcmcvPlxuICogUmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UgPGh0dHBzOi8vbG9kYXNoLmNvbS9saWNlbnNlPlxuICogQmFzZWQgb24gVW5kZXJzY29yZS5qcyAxLjguMyA8aHR0cDovL3VuZGVyc2NvcmVqcy5vcmcvTElDRU5TRT5cbiAqIENvcHlyaWdodCBKZXJlbXkgQXNoa2VuYXMsIERvY3VtZW50Q2xvdWQgYW5kIEludmVzdGlnYXRpdmUgUmVwb3J0ZXJzICYgRWRpdG9yc1xuICovXG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIE1BWF9TQUZFX0lOVEVHRVIgPSA5MDA3MTk5MjU0NzQwOTkxO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgYXJnc1RhZyA9ICdbb2JqZWN0IEFyZ3VtZW50c10nLFxuICAgIGFycmF5VGFnID0gJ1tvYmplY3QgQXJyYXldJyxcbiAgICBib29sVGFnID0gJ1tvYmplY3QgQm9vbGVhbl0nLFxuICAgIGRhdGVUYWcgPSAnW29iamVjdCBEYXRlXScsXG4gICAgZXJyb3JUYWcgPSAnW29iamVjdCBFcnJvcl0nLFxuICAgIGZ1bmNUYWcgPSAnW29iamVjdCBGdW5jdGlvbl0nLFxuICAgIG1hcFRhZyA9ICdbb2JqZWN0IE1hcF0nLFxuICAgIG51bWJlclRhZyA9ICdbb2JqZWN0IE51bWJlcl0nLFxuICAgIG9iamVjdFRhZyA9ICdbb2JqZWN0IE9iamVjdF0nLFxuICAgIHJlZ2V4cFRhZyA9ICdbb2JqZWN0IFJlZ0V4cF0nLFxuICAgIHNldFRhZyA9ICdbb2JqZWN0IFNldF0nLFxuICAgIHN0cmluZ1RhZyA9ICdbb2JqZWN0IFN0cmluZ10nLFxuICAgIHdlYWtNYXBUYWcgPSAnW29iamVjdCBXZWFrTWFwXSc7XG5cbnZhciBhcnJheUJ1ZmZlclRhZyA9ICdbb2JqZWN0IEFycmF5QnVmZmVyXScsXG4gICAgZGF0YVZpZXdUYWcgPSAnW29iamVjdCBEYXRhVmlld10nLFxuICAgIGZsb2F0MzJUYWcgPSAnW29iamVjdCBGbG9hdDMyQXJyYXldJyxcbiAgICBmbG9hdDY0VGFnID0gJ1tvYmplY3QgRmxvYXQ2NEFycmF5XScsXG4gICAgaW50OFRhZyA9ICdbb2JqZWN0IEludDhBcnJheV0nLFxuICAgIGludDE2VGFnID0gJ1tvYmplY3QgSW50MTZBcnJheV0nLFxuICAgIGludDMyVGFnID0gJ1tvYmplY3QgSW50MzJBcnJheV0nLFxuICAgIHVpbnQ4VGFnID0gJ1tvYmplY3QgVWludDhBcnJheV0nLFxuICAgIHVpbnQ4Q2xhbXBlZFRhZyA9ICdbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XScsXG4gICAgdWludDE2VGFnID0gJ1tvYmplY3QgVWludDE2QXJyYXldJyxcbiAgICB1aW50MzJUYWcgPSAnW29iamVjdCBVaW50MzJBcnJheV0nO1xuXG4vKiogVXNlZCB0byBpZGVudGlmeSBgdG9TdHJpbmdUYWdgIHZhbHVlcyBvZiB0eXBlZCBhcnJheXMuICovXG52YXIgdHlwZWRBcnJheVRhZ3MgPSB7fTtcbnR5cGVkQXJyYXlUYWdzW2Zsb2F0MzJUYWddID0gdHlwZWRBcnJheVRhZ3NbZmxvYXQ2NFRhZ10gPVxudHlwZWRBcnJheVRhZ3NbaW50OFRhZ10gPSB0eXBlZEFycmF5VGFnc1tpbnQxNlRhZ10gPVxudHlwZWRBcnJheVRhZ3NbaW50MzJUYWddID0gdHlwZWRBcnJheVRhZ3NbdWludDhUYWddID1cbnR5cGVkQXJyYXlUYWdzW3VpbnQ4Q2xhbXBlZFRhZ10gPSB0eXBlZEFycmF5VGFnc1t1aW50MTZUYWddID1cbnR5cGVkQXJyYXlUYWdzW3VpbnQzMlRhZ10gPSB0cnVlO1xudHlwZWRBcnJheVRhZ3NbYXJnc1RhZ10gPSB0eXBlZEFycmF5VGFnc1thcnJheVRhZ10gPVxudHlwZWRBcnJheVRhZ3NbYXJyYXlCdWZmZXJUYWddID0gdHlwZWRBcnJheVRhZ3NbYm9vbFRhZ10gPVxudHlwZWRBcnJheVRhZ3NbZGF0YVZpZXdUYWddID0gdHlwZWRBcnJheVRhZ3NbZGF0ZVRhZ10gPVxudHlwZWRBcnJheVRhZ3NbZXJyb3JUYWddID0gdHlwZWRBcnJheVRhZ3NbZnVuY1RhZ10gPVxudHlwZWRBcnJheVRhZ3NbbWFwVGFnXSA9IHR5cGVkQXJyYXlUYWdzW251bWJlclRhZ10gPVxudHlwZWRBcnJheVRhZ3Nbb2JqZWN0VGFnXSA9IHR5cGVkQXJyYXlUYWdzW3JlZ2V4cFRhZ10gPVxudHlwZWRBcnJheVRhZ3Nbc2V0VGFnXSA9IHR5cGVkQXJyYXlUYWdzW3N0cmluZ1RhZ10gPVxudHlwZWRBcnJheVRhZ3Nbd2Vha01hcFRhZ10gPSBmYWxzZTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgb2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGFycmF5LWxpa2UgbGVuZ3RoLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIGZ1bmN0aW9uIGlzIGxvb3NlbHkgYmFzZWQgb25cbiAqIFtgVG9MZW5ndGhgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy10b2xlbmd0aCkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBsZW5ndGgsXG4gKiAgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzTGVuZ3RoKDMpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNMZW5ndGgoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNMZW5ndGgoSW5maW5pdHkpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzTGVuZ3RoKCczJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0xlbmd0aCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdudW1iZXInICYmXG4gICAgdmFsdWUgPiAtMSAmJiB2YWx1ZSAlIDEgPT0gMCAmJiB2YWx1ZSA8PSBNQVhfU0FGRV9JTlRFR0VSO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLiBBIHZhbHVlIGlzIG9iamVjdC1saWtlIGlmIGl0J3Mgbm90IGBudWxsYFxuICogYW5kIGhhcyBhIGB0eXBlb2ZgIHJlc3VsdCBvZiBcIm9iamVjdFwiLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlKSB7XG4gIHJldHVybiAhIXZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jztcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgdHlwZWQgYXJyYXkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgY29ycmVjdGx5IGNsYXNzaWZpZWQsXG4gKiAgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzVHlwZWRBcnJheShuZXcgVWludDhBcnJheSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1R5cGVkQXJyYXkoW10pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNUeXBlZEFycmF5KHZhbHVlKSB7XG4gIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmXG4gICAgaXNMZW5ndGgodmFsdWUubGVuZ3RoKSAmJiAhIXR5cGVkQXJyYXlUYWdzW29iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpXTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc1R5cGVkQXJyYXk7XG4iLCIvKipcbiAqIGxvZGFzaCAzLjEuMiAoQ3VzdG9tIEJ1aWxkKSA8aHR0cHM6Ly9sb2Rhc2guY29tLz5cbiAqIEJ1aWxkOiBgbG9kYXNoIG1vZGVybiBtb2R1bGFyaXplIGV4cG9ydHM9XCJucG1cIiAtbyAuL2BcbiAqIENvcHlyaWdodCAyMDEyLTIwMTUgVGhlIERvam8gRm91bmRhdGlvbiA8aHR0cDovL2Rvam9mb3VuZGF0aW9uLm9yZy8+XG4gKiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzIDEuOC4zIDxodHRwOi8vdW5kZXJzY29yZWpzLm9yZy9MSUNFTlNFPlxuICogQ29weXJpZ2h0IDIwMDktMjAxNSBKZXJlbXkgQXNoa2VuYXMsIERvY3VtZW50Q2xvdWQgYW5kIEludmVzdGlnYXRpdmUgUmVwb3J0ZXJzICYgRWRpdG9yc1xuICogQXZhaWxhYmxlIHVuZGVyIE1JVCBsaWNlbnNlIDxodHRwczovL2xvZGFzaC5jb20vbGljZW5zZT5cbiAqL1xudmFyIGdldE5hdGl2ZSA9IHJlcXVpcmUoJ2xvZGFzaC5fZ2V0bmF0aXZlJyksXG4gICAgaXNBcmd1bWVudHMgPSByZXF1aXJlKCdsb2Rhc2guaXNhcmd1bWVudHMnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnbG9kYXNoLmlzYXJyYXknKTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IHVuc2lnbmVkIGludGVnZXIgdmFsdWVzLiAqL1xudmFyIHJlSXNVaW50ID0gL15cXGQrJC87XG5cbi8qKiBVc2VkIGZvciBuYXRpdmUgbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKiBOYXRpdmUgbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZUtleXMgPSBnZXROYXRpdmUoT2JqZWN0LCAna2V5cycpO1xuXG4vKipcbiAqIFVzZWQgYXMgdGhlIFttYXhpbXVtIGxlbmd0aF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtbnVtYmVyLm1heF9zYWZlX2ludGVnZXIpXG4gKiBvZiBhbiBhcnJheS1saWtlIHZhbHVlLlxuICovXG52YXIgTUFYX1NBRkVfSU5URUdFUiA9IDkwMDcxOTkyNTQ3NDA5OTE7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucHJvcGVydHlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgZGVlcCBwYXRocy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gYmFzZVByb3BlcnR5KGtleSkge1xuICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gdW5kZWZpbmVkIDogb2JqZWN0W2tleV07XG4gIH07XG59XG5cbi8qKlxuICogR2V0cyB0aGUgXCJsZW5ndGhcIiBwcm9wZXJ0eSB2YWx1ZSBvZiBgb2JqZWN0YC5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGF2b2lkIGEgW0pJVCBidWddKGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNDI3OTIpXG4gKiB0aGF0IGFmZmVjdHMgU2FmYXJpIG9uIGF0IGxlYXN0IGlPUyA4LjEtOC4zIEFSTTY0LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgXCJsZW5ndGhcIiB2YWx1ZS5cbiAqL1xudmFyIGdldExlbmd0aCA9IGJhc2VQcm9wZXJ0eSgnbGVuZ3RoJyk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYXJyYXktbGlrZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhcnJheS1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzQXJyYXlMaWtlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIGlzTGVuZ3RoKGdldExlbmd0aCh2YWx1ZSkpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgYXJyYXktbGlrZSBpbmRleC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcGFyYW0ge251bWJlcn0gW2xlbmd0aD1NQVhfU0FGRV9JTlRFR0VSXSBUaGUgdXBwZXIgYm91bmRzIG9mIGEgdmFsaWQgaW5kZXguXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGluZGV4LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzSW5kZXgodmFsdWUsIGxlbmd0aCkge1xuICB2YWx1ZSA9ICh0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgfHwgcmVJc1VpbnQudGVzdCh2YWx1ZSkpID8gK3ZhbHVlIDogLTE7XG4gIGxlbmd0aCA9IGxlbmd0aCA9PSBudWxsID8gTUFYX1NBRkVfSU5URUdFUiA6IGxlbmd0aDtcbiAgcmV0dXJuIHZhbHVlID4gLTEgJiYgdmFsdWUgJSAxID09IDAgJiYgdmFsdWUgPCBsZW5ndGg7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBhcnJheS1saWtlIGxlbmd0aC5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBmdW5jdGlvbiBpcyBiYXNlZCBvbiBbYFRvTGVuZ3RoYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtdG9sZW5ndGgpLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgbGVuZ3RoLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzTGVuZ3RoKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgJiYgdmFsdWUgPiAtMSAmJiB2YWx1ZSAlIDEgPT0gMCAmJiB2YWx1ZSA8PSBNQVhfU0FGRV9JTlRFR0VSO1xufVxuXG4vKipcbiAqIEEgZmFsbGJhY2sgaW1wbGVtZW50YXRpb24gb2YgYE9iamVjdC5rZXlzYCB3aGljaCBjcmVhdGVzIGFuIGFycmF5IG9mIHRoZVxuICogb3duIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gKi9cbmZ1bmN0aW9uIHNoaW1LZXlzKG9iamVjdCkge1xuICB2YXIgcHJvcHMgPSBrZXlzSW4ob2JqZWN0KSxcbiAgICAgIHByb3BzTGVuZ3RoID0gcHJvcHMubGVuZ3RoLFxuICAgICAgbGVuZ3RoID0gcHJvcHNMZW5ndGggJiYgb2JqZWN0Lmxlbmd0aDtcblxuICB2YXIgYWxsb3dJbmRleGVzID0gISFsZW5ndGggJiYgaXNMZW5ndGgobGVuZ3RoKSAmJlxuICAgIChpc0FycmF5KG9iamVjdCkgfHwgaXNBcmd1bWVudHMob2JqZWN0KSk7XG5cbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICByZXN1bHQgPSBbXTtcblxuICB3aGlsZSAoKytpbmRleCA8IHByb3BzTGVuZ3RoKSB7XG4gICAgdmFyIGtleSA9IHByb3BzW2luZGV4XTtcbiAgICBpZiAoKGFsbG93SW5kZXhlcyAmJiBpc0luZGV4KGtleSwgbGVuZ3RoKSkgfHwgaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgdGhlIFtsYW5ndWFnZSB0eXBlXShodHRwczovL2VzNS5naXRodWIuaW8vI3g4KSBvZiBgT2JqZWN0YC5cbiAqIChlLmcuIGFycmF5cywgZnVuY3Rpb25zLCBvYmplY3RzLCByZWdleGVzLCBgbmV3IE51bWJlcigwKWAsIGFuZCBgbmV3IFN0cmluZygnJylgKVxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdCh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoMSk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdCh2YWx1ZSkge1xuICAvLyBBdm9pZCBhIFY4IEpJVCBidWcgaW4gQ2hyb21lIDE5LTIwLlxuICAvLyBTZWUgaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTIyOTEgZm9yIG1vcmUgZGV0YWlscy5cbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIHJldHVybiAhIXZhbHVlICYmICh0eXBlID09ICdvYmplY3QnIHx8IHR5cGUgPT0gJ2Z1bmN0aW9uJyk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgb2YgYG9iamVjdGAuXG4gKlxuICogKipOb3RlOioqIE5vbi1vYmplY3QgdmFsdWVzIGFyZSBjb2VyY2VkIHRvIG9iamVjdHMuIFNlZSB0aGVcbiAqIFtFUyBzcGVjXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1vYmplY3Qua2V5cylcbiAqIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gKiBAZXhhbXBsZVxuICpcbiAqIGZ1bmN0aW9uIEZvbygpIHtcbiAqICAgdGhpcy5hID0gMTtcbiAqICAgdGhpcy5iID0gMjtcbiAqIH1cbiAqXG4gKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICpcbiAqIF8ua2V5cyhuZXcgRm9vKTtcbiAqIC8vID0+IFsnYScsICdiJ10gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAqXG4gKiBfLmtleXMoJ2hpJyk7XG4gKiAvLyA9PiBbJzAnLCAnMSddXG4gKi9cbnZhciBrZXlzID0gIW5hdGl2ZUtleXMgPyBzaGltS2V5cyA6IGZ1bmN0aW9uKG9iamVjdCkge1xuICB2YXIgQ3RvciA9IG9iamVjdCA9PSBudWxsID8gdW5kZWZpbmVkIDogb2JqZWN0LmNvbnN0cnVjdG9yO1xuICBpZiAoKHR5cGVvZiBDdG9yID09ICdmdW5jdGlvbicgJiYgQ3Rvci5wcm90b3R5cGUgPT09IG9iamVjdCkgfHxcbiAgICAgICh0eXBlb2Ygb2JqZWN0ICE9ICdmdW5jdGlvbicgJiYgaXNBcnJheUxpa2Uob2JqZWN0KSkpIHtcbiAgICByZXR1cm4gc2hpbUtleXMob2JqZWN0KTtcbiAgfVxuICByZXR1cm4gaXNPYmplY3Qob2JqZWN0KSA/IG5hdGl2ZUtleXMob2JqZWN0KSA6IFtdO1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIG9mIGBvYmplY3RgLlxuICpcbiAqICoqTm90ZToqKiBOb24tb2JqZWN0IHZhbHVlcyBhcmUgY29lcmNlZCB0byBvYmplY3RzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBGb28oKSB7XG4gKiAgIHRoaXMuYSA9IDE7XG4gKiAgIHRoaXMuYiA9IDI7XG4gKiB9XG4gKlxuICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAqXG4gKiBfLmtleXNJbihuZXcgRm9vKTtcbiAqIC8vID0+IFsnYScsICdiJywgJ2MnXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICovXG5mdW5jdGlvbiBrZXlzSW4ob2JqZWN0KSB7XG4gIGlmIChvYmplY3QgPT0gbnVsbCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBpZiAoIWlzT2JqZWN0KG9iamVjdCkpIHtcbiAgICBvYmplY3QgPSBPYmplY3Qob2JqZWN0KTtcbiAgfVxuICB2YXIgbGVuZ3RoID0gb2JqZWN0Lmxlbmd0aDtcbiAgbGVuZ3RoID0gKGxlbmd0aCAmJiBpc0xlbmd0aChsZW5ndGgpICYmXG4gICAgKGlzQXJyYXkob2JqZWN0KSB8fCBpc0FyZ3VtZW50cyhvYmplY3QpKSAmJiBsZW5ndGgpIHx8IDA7XG5cbiAgdmFyIEN0b3IgPSBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICBpbmRleCA9IC0xLFxuICAgICAgaXNQcm90byA9IHR5cGVvZiBDdG9yID09ICdmdW5jdGlvbicgJiYgQ3Rvci5wcm90b3R5cGUgPT09IG9iamVjdCxcbiAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCksXG4gICAgICBza2lwSW5kZXhlcyA9IGxlbmd0aCA+IDA7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICByZXN1bHRbaW5kZXhdID0gKGluZGV4ICsgJycpO1xuICB9XG4gIGZvciAodmFyIGtleSBpbiBvYmplY3QpIHtcbiAgICBpZiAoIShza2lwSW5kZXhlcyAmJiBpc0luZGV4KGtleSwgbGVuZ3RoKSkgJiZcbiAgICAgICAgIShrZXkgPT0gJ2NvbnN0cnVjdG9yJyAmJiAoaXNQcm90byB8fCAhaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkpKSkge1xuICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBrZXlzO1xuIiwiLy8gQ29uc3RhbnRzXG52YXIgS24gPSAxOCxcbiAgICBYbiA9IDAuOTUwNDcwLCAvLyBENjUgc3RhbmRhcmQgcmVmZXJlbnRcbiAgICBZbiA9IDEsXG4gICAgWm4gPSAxLjA4ODgzMCxcbiAgICB0MCA9IDQgLyAyOSxcbiAgICB0MSA9IDYgLyAyOSxcbiAgICB0MiA9IDMgKiB0MSAqIHQxLFxuICAgIHQzID0gdDEgKiB0MSAqIHQxLFxuICAgIGRlZzJyYWQgPSBNYXRoLlBJIC8gMTgwLFxuICAgIHJhZDJkZWcgPSAxODAgLyBNYXRoLlBJO1xuXG4vLyBVdGlsaXRpZXNcbmZ1bmN0aW9uIHh5ejJsYWIodCkge1xuICAgIHJldHVybiB0ID4gdDMgPyBNYXRoLnBvdyh0LCAxIC8gMykgOiB0IC8gdDIgKyB0MDtcbn1cblxuZnVuY3Rpb24gbGFiMnh5eih0KSB7XG4gICAgcmV0dXJuIHQgPiB0MSA/IHQgKiB0ICogdCA6IHQyICogKHQgLSB0MCk7XG59XG5cbmZ1bmN0aW9uIHh5ejJyZ2IoeCkge1xuICAgIHJldHVybiAyNTUgKiAoeCA8PSAwLjAwMzEzMDggPyAxMi45MiAqIHggOiAxLjA1NSAqIE1hdGgucG93KHgsIDEgLyAyLjQpIC0gMC4wNTUpO1xufVxuXG5mdW5jdGlvbiByZ2IyeHl6KHgpIHtcbiAgICByZXR1cm4gKHggLz0gMjU1KSA8PSAwLjA0MDQ1ID8geCAvIDEyLjkyIDogTWF0aC5wb3coKHggKyAwLjA1NSkgLyAxLjA1NSwgMi40KTtcbn1cblxuLy8gTEFCXG5mdW5jdGlvbiByZ2JUb0xhYihyZ2JDb2xvcikge1xuICAgIHZhciBiID0gcmdiMnh5eihyZ2JDb2xvclswXSksXG4gICAgICAgIGEgPSByZ2IyeHl6KHJnYkNvbG9yWzFdKSxcbiAgICAgICAgbCA9IHJnYjJ4eXoocmdiQ29sb3JbMl0pLFxuICAgICAgICB4ID0geHl6MmxhYigoMC40MTI0NTY0ICogYiArIDAuMzU3NTc2MSAqIGEgKyAwLjE4MDQzNzUgKiBsKSAvIFhuKSxcbiAgICAgICAgeSA9IHh5ejJsYWIoKDAuMjEyNjcyOSAqIGIgKyAwLjcxNTE1MjIgKiBhICsgMC4wNzIxNzUwICogbCkgLyBZbiksXG4gICAgICAgIHogPSB4eXoybGFiKCgwLjAxOTMzMzkgKiBiICsgMC4xMTkxOTIwICogYSArIDAuOTUwMzA0MSAqIGwpIC8gWm4pO1xuXG4gICAgcmV0dXJuIFtcbiAgICAgICAgMTE2ICogeSAtIDE2LFxuICAgICAgICA1MDAgKiAoeCAtIHkpLFxuICAgICAgICAyMDAgKiAoeSAtIHopLFxuICAgICAgICByZ2JDb2xvclszXVxuICAgIF07XG59XG5cbmZ1bmN0aW9uIGxhYlRvUmdiKGxhYkNvbG9yKSB7XG4gICAgdmFyIHkgPSAobGFiQ29sb3JbMF0gKyAxNikgLyAxMTYsXG4gICAgICAgIHggPSBpc05hTihsYWJDb2xvclsxXSkgPyB5IDogeSArIGxhYkNvbG9yWzFdIC8gNTAwLFxuICAgICAgICB6ID0gaXNOYU4obGFiQ29sb3JbMl0pID8geSA6IHkgLSBsYWJDb2xvclsyXSAvIDIwMDtcbiAgICB5ID0gWW4gKiBsYWIyeHl6KHkpO1xuICAgIHggPSBYbiAqIGxhYjJ4eXooeCk7XG4gICAgeiA9IFpuICogbGFiMnh5eih6KTtcbiAgICByZXR1cm4gW1xuICAgICAgICB4eXoycmdiKDMuMjQwNDU0MiAqIHggLSAxLjUzNzEzODUgKiB5IC0gMC40OTg1MzE0ICogeiksIC8vIEQ2NSAtPiBzUkdCXG4gICAgICAgIHh5ejJyZ2IoLTAuOTY5MjY2MCAqIHggKyAxLjg3NjAxMDggKiB5ICsgMC4wNDE1NTYwICogeiksXG4gICAgICAgIHh5ejJyZ2IoMC4wNTU2NDM0ICogeCAtIDAuMjA0MDI1OSAqIHkgKyAxLjA1NzIyNTIgKiB6KSxcbiAgICAgICAgbGFiQ29sb3JbM11cbiAgICBdO1xufVxuXG4vLyBIQ0xcbmZ1bmN0aW9uIHJnYlRvSGNsKHJnYkNvbG9yKSB7XG4gIHZhciBsYWJDb2xvciA9IHJnYlRvTGFiKHJnYkNvbG9yKTtcbiAgdmFyIGwgPSBsYWJDb2xvclswXSxcbiAgICBhID0gbGFiQ29sb3JbMV0sXG4gICAgYiA9IGxhYkNvbG9yWzJdO1xuICB2YXIgaCA9IE1hdGguYXRhbjIoYiwgYSkgKiByYWQyZGVnO1xuICByZXR1cm4gW1xuICAgICAgaCA8IDAgPyBoICsgMzYwIDogaCxcbiAgICAgIE1hdGguc3FydChhICogYSArIGIgKiBiKSxcbiAgICAgIGwsXG4gICAgICByZ2JDb2xvclszXVxuICBdO1xufVxuXG5mdW5jdGlvbiBoY2xUb1JnYihoY2xDb2xvcikge1xuICB2YXIgaCA9IGhjbENvbG9yWzBdICogZGVnMnJhZCxcbiAgICBjID0gaGNsQ29sb3JbMV0sXG4gICAgbCA9IGhjbENvbG9yWzJdO1xuICByZXR1cm4gbGFiVG9SZ2IoW1xuICAgICAgbCxcbiAgICAgIE1hdGguY29zKGgpICogYyxcbiAgICAgIE1hdGguc2luKGgpICogYyxcbiAgICAgIGhjbENvbG9yWzNdXG4gIF0pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9e1xuICBsYWI6IHtcbiAgICBmb3J3YXJkOiByZ2JUb0xhYixcbiAgICByZXZlcnNlOiBsYWJUb1JnYlxuICB9LFxuICBoY2w6IHtcbiAgICBmb3J3YXJkOiByZ2JUb0hjbCxcbiAgICByZXZlcnNlOiBoY2xUb1JnYlxuICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY29sb3JTcGFjZXMgPSByZXF1aXJlKCcuL2NvbG9yX3NwYWNlcycpO1xuXG5mdW5jdGlvbiBpZGVudGl0eUZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4geDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRnVuY3Rpb24ocGFyYW1ldGVycywgZGVmYXVsdFR5cGUpIHtcbiAgICB2YXIgZnVuO1xuXG4gICAgaWYgKCFpc0Z1bmN0aW9uRGVmaW5pdGlvbihwYXJhbWV0ZXJzKSkge1xuICAgICAgICBmdW4gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHBhcmFtZXRlcnM7IH07XG4gICAgICAgIGZ1bi5pc0ZlYXR1cmVDb25zdGFudCA9IHRydWU7XG4gICAgICAgIGZ1bi5pc1pvb21Db25zdGFudCA9IHRydWU7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgem9vbUFuZEZlYXR1cmVEZXBlbmRlbnQgPSBwYXJhbWV0ZXJzLnN0b3BzICYmIHR5cGVvZiBwYXJhbWV0ZXJzLnN0b3BzWzBdWzBdID09PSAnb2JqZWN0JztcbiAgICAgICAgdmFyIGZlYXR1cmVEZXBlbmRlbnQgPSB6b29tQW5kRmVhdHVyZURlcGVuZGVudCB8fCBwYXJhbWV0ZXJzLnByb3BlcnR5ICE9PSB1bmRlZmluZWQ7XG4gICAgICAgIHZhciB6b29tRGVwZW5kZW50ID0gem9vbUFuZEZlYXR1cmVEZXBlbmRlbnQgfHwgIWZlYXR1cmVEZXBlbmRlbnQ7XG4gICAgICAgIHZhciBpbnB1dFR5cGUgPSBwYXJhbWV0ZXJzLnN0b3BzICYmIHR5cGVvZiAoem9vbUFuZEZlYXR1cmVEZXBlbmRlbnQgPyBwYXJhbWV0ZXJzLnN0b3BzWzBdWzBdLnByb3BlcnR5IDogcGFyYW1ldGVycy5zdG9wc1swXVswXSk7XG4gICAgICAgIHZhciB0eXBlID0gcGFyYW1ldGVycy50eXBlIHx8IGRlZmF1bHRUeXBlIHx8IChpbnB1dFR5cGUgPT09ICdzdHJpbmcnID8gJ2NhdGVnb3JpY2FsJyA6ICdleHBvbmVudGlhbCcpO1xuXG4gICAgICAgIHZhciBpbm5lckZ1bjtcbiAgICAgICAgaWYgKHR5cGUgPT09ICdleHBvbmVudGlhbCcpIHtcbiAgICAgICAgICAgIGlubmVyRnVuID0gZXZhbHVhdGVFeHBvbmVudGlhbEZ1bmN0aW9uO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdpbnRlcnZhbCcpIHtcbiAgICAgICAgICAgIGlubmVyRnVuID0gZXZhbHVhdGVJbnRlcnZhbEZ1bmN0aW9uO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdjYXRlZ29yaWNhbCcpIHtcbiAgICAgICAgICAgIGlubmVyRnVuID0gZXZhbHVhdGVDYXRlZ29yaWNhbEZ1bmN0aW9uO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdpZGVudGl0eScpIHtcbiAgICAgICAgICAgIGlubmVyRnVuID0gZXZhbHVhdGVJZGVudGl0eUZ1bmN0aW9uO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIGZ1bmN0aW9uIHR5cGUgXCInICsgdHlwZSArICdcIicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG91dHB1dEZ1bmN0aW9uO1xuXG4gICAgICAgIC8vIElmIHdlJ3JlIGludGVycG9sYXRpbmcgY29sb3JzIGluIGEgY29sb3Igc3lzdGVtIG90aGVyIHRoYW4gUkdCQSxcbiAgICAgICAgLy8gZmlyc3QgdHJhbnNsYXRlIGFsbCBzdG9wIHZhbHVlcyB0byB0aGF0IGNvbG9yIHN5c3RlbSwgdGhlbiBpbnRlcnBvbGF0ZVxuICAgICAgICAvLyBhcnJheXMgYXMgdXN1YWwuIFRoZSBgb3V0cHV0RnVuY3Rpb25gIG9wdGlvbiBsZXRzIHVzIHRoZW4gdHJhbnNsYXRlXG4gICAgICAgIC8vIHRoZSByZXN1bHQgb2YgdGhhdCBpbnRlcnBvbGF0aW9uIGJhY2sgaW50byBSR0JBLlxuICAgICAgICBpZiAocGFyYW1ldGVycy5jb2xvclNwYWNlICYmIHBhcmFtZXRlcnMuY29sb3JTcGFjZSAhPT0gJ3JnYicpIHtcbiAgICAgICAgICAgIGlmIChjb2xvclNwYWNlc1twYXJhbWV0ZXJzLmNvbG9yU3BhY2VdKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNvbG9yc3BhY2UgPSBjb2xvclNwYWNlc1twYXJhbWV0ZXJzLmNvbG9yU3BhY2VdO1xuICAgICAgICAgICAgICAgIC8vIEF2b2lkIG11dGF0aW5nIHRoZSBwYXJhbWV0ZXJzIHZhbHVlXG4gICAgICAgICAgICAgICAgcGFyYW1ldGVycyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocGFyYW1ldGVycykpO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIHMgPSAwOyBzIDwgcGFyYW1ldGVycy5zdG9wcy5sZW5ndGg7IHMrKykge1xuICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLnN0b3BzW3NdID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycy5zdG9wc1tzXVswXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yc3BhY2UuZm9yd2FyZChwYXJhbWV0ZXJzLnN0b3BzW3NdWzFdKVxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBvdXRwdXRGdW5jdGlvbiA9IGNvbG9yc3BhY2UucmV2ZXJzZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIGNvbG9yIHNwYWNlOiAnICsgcGFyYW1ldGVycy5jb2xvclNwYWNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG91dHB1dEZ1bmN0aW9uID0gaWRlbnRpdHlGdW5jdGlvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh6b29tQW5kRmVhdHVyZURlcGVuZGVudCkge1xuICAgICAgICAgICAgdmFyIGZlYXR1cmVGdW5jdGlvbnMgPSB7fTtcbiAgICAgICAgICAgIHZhciBmZWF0dXJlRnVuY3Rpb25TdG9wcyA9IFtdO1xuICAgICAgICAgICAgZm9yIChzID0gMDsgcyA8IHBhcmFtZXRlcnMuc3RvcHMubGVuZ3RoOyBzKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgc3RvcCA9IHBhcmFtZXRlcnMuc3RvcHNbc107XG4gICAgICAgICAgICAgICAgaWYgKGZlYXR1cmVGdW5jdGlvbnNbc3RvcFswXS56b29tXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGZlYXR1cmVGdW5jdGlvbnNbc3RvcFswXS56b29tXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHpvb206IHN0b3BbMF0uem9vbSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHBhcmFtZXRlcnMudHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5OiBwYXJhbWV0ZXJzLnByb3BlcnR5LFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RvcHM6IFtdXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZlYXR1cmVGdW5jdGlvbnNbc3RvcFswXS56b29tXS5zdG9wcy5wdXNoKFtzdG9wWzBdLnZhbHVlLCBzdG9wWzFdXSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAodmFyIHogaW4gZmVhdHVyZUZ1bmN0aW9ucykge1xuICAgICAgICAgICAgICAgIGZlYXR1cmVGdW5jdGlvblN0b3BzLnB1c2goW2ZlYXR1cmVGdW5jdGlvbnNbel0uem9vbSwgY3JlYXRlRnVuY3Rpb24oZmVhdHVyZUZ1bmN0aW9uc1t6XSldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1biA9IGZ1bmN0aW9uKHpvb20sIGZlYXR1cmUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb3V0cHV0RnVuY3Rpb24oZXZhbHVhdGVFeHBvbmVudGlhbEZ1bmN0aW9uKHtcbiAgICAgICAgICAgICAgICAgIHN0b3BzOiBmZWF0dXJlRnVuY3Rpb25TdG9wcyxcbiAgICAgICAgICAgICAgICAgIGJhc2U6IHBhcmFtZXRlcnMuYmFzZVxuICAgICAgICAgICAgICAgIH0sIHpvb20pKHpvb20sIGZlYXR1cmUpKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBmdW4uaXNGZWF0dXJlQ29uc3RhbnQgPSBmYWxzZTtcbiAgICAgICAgICAgIGZ1bi5pc1pvb21Db25zdGFudCA9IGZhbHNlO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoem9vbURlcGVuZGVudCkge1xuICAgICAgICAgICAgZnVuID0gZnVuY3Rpb24oem9vbSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBvdXRwdXRGdW5jdGlvbihpbm5lckZ1bihwYXJhbWV0ZXJzLCB6b29tKSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZnVuLmlzRmVhdHVyZUNvbnN0YW50ID0gdHJ1ZTtcbiAgICAgICAgICAgIGZ1bi5pc1pvb21Db25zdGFudCA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZnVuID0gZnVuY3Rpb24oem9vbSwgZmVhdHVyZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBvdXRwdXRGdW5jdGlvbihcbiAgICAgICAgICAgICAgICAgIGlubmVyRnVuKHBhcmFtZXRlcnMsIGZlYXR1cmVbcGFyYW1ldGVycy5wcm9wZXJ0eV0pKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBmdW4uaXNGZWF0dXJlQ29uc3RhbnQgPSBmYWxzZTtcbiAgICAgICAgICAgIGZ1bi5pc1pvb21Db25zdGFudCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZnVuO1xufVxuXG5mdW5jdGlvbiBldmFsdWF0ZUNhdGVnb3JpY2FsRnVuY3Rpb24ocGFyYW1ldGVycywgaW5wdXQpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcmFtZXRlcnMuc3RvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGlucHV0ID09PSBwYXJhbWV0ZXJzLnN0b3BzW2ldWzBdKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyYW1ldGVycy5zdG9wc1tpXVsxXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcGFyYW1ldGVycy5zdG9wc1swXVsxXTtcbn1cblxuZnVuY3Rpb24gZXZhbHVhdGVJbnRlcnZhbEZ1bmN0aW9uKHBhcmFtZXRlcnMsIGlucHV0KSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJhbWV0ZXJzLnN0b3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChpbnB1dCA8IHBhcmFtZXRlcnMuc3RvcHNbaV1bMF0pIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gcGFyYW1ldGVycy5zdG9wc1tNYXRoLm1heChpIC0gMSwgMCldWzFdO1xufVxuXG5mdW5jdGlvbiBldmFsdWF0ZUV4cG9uZW50aWFsRnVuY3Rpb24ocGFyYW1ldGVycywgaW5wdXQpIHtcbiAgICB2YXIgYmFzZSA9IHBhcmFtZXRlcnMuYmFzZSAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5iYXNlIDogMTtcblxuICAgIHZhciBpID0gMDtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBpZiAoaSA+PSBwYXJhbWV0ZXJzLnN0b3BzLmxlbmd0aCkgYnJlYWs7XG4gICAgICAgIGVsc2UgaWYgKGlucHV0IDw9IHBhcmFtZXRlcnMuc3RvcHNbaV1bMF0pIGJyZWFrO1xuICAgICAgICBlbHNlIGkrKztcbiAgICB9XG5cbiAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gcGFyYW1ldGVycy5zdG9wc1tpXVsxXTtcblxuICAgIH0gZWxzZSBpZiAoaSA9PT0gcGFyYW1ldGVycy5zdG9wcy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHBhcmFtZXRlcnMuc3RvcHNbaSAtIDFdWzFdO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGludGVycG9sYXRlKFxuICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICBiYXNlLFxuICAgICAgICAgICAgcGFyYW1ldGVycy5zdG9wc1tpIC0gMV1bMF0sXG4gICAgICAgICAgICBwYXJhbWV0ZXJzLnN0b3BzW2ldWzBdLFxuICAgICAgICAgICAgcGFyYW1ldGVycy5zdG9wc1tpIC0gMV1bMV0sXG4gICAgICAgICAgICBwYXJhbWV0ZXJzLnN0b3BzW2ldWzFdXG4gICAgICAgICk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBldmFsdWF0ZUlkZW50aXR5RnVuY3Rpb24ocGFyYW1ldGVycywgaW5wdXQpIHtcbiAgICByZXR1cm4gaW5wdXQ7XG59XG5cblxuZnVuY3Rpb24gaW50ZXJwb2xhdGUoaW5wdXQsIGJhc2UsIGlucHV0TG93ZXIsIGlucHV0VXBwZXIsIG91dHB1dExvd2VyLCBvdXRwdXRVcHBlcikge1xuICAgIGlmICh0eXBlb2Ygb3V0cHV0TG93ZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIGV2YWx1YXRlZExvd2VyID0gb3V0cHV0TG93ZXIuYXBwbHkodW5kZWZpbmVkLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgdmFyIGV2YWx1YXRlZFVwcGVyID0gb3V0cHV0VXBwZXIuYXBwbHkodW5kZWZpbmVkLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgcmV0dXJuIGludGVycG9sYXRlKGlucHV0LCBiYXNlLCBpbnB1dExvd2VyLCBpbnB1dFVwcGVyLCBldmFsdWF0ZWRMb3dlciwgZXZhbHVhdGVkVXBwZXIpO1xuICAgICAgICB9O1xuICAgIH0gZWxzZSBpZiAob3V0cHV0TG93ZXIubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBpbnRlcnBvbGF0ZUFycmF5KGlucHV0LCBiYXNlLCBpbnB1dExvd2VyLCBpbnB1dFVwcGVyLCBvdXRwdXRMb3dlciwgb3V0cHV0VXBwZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBpbnRlcnBvbGF0ZU51bWJlcihpbnB1dCwgYmFzZSwgaW5wdXRMb3dlciwgaW5wdXRVcHBlciwgb3V0cHV0TG93ZXIsIG91dHB1dFVwcGVyKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGludGVycG9sYXRlTnVtYmVyKGlucHV0LCBiYXNlLCBpbnB1dExvd2VyLCBpbnB1dFVwcGVyLCBvdXRwdXRMb3dlciwgb3V0cHV0VXBwZXIpIHtcbiAgICB2YXIgZGlmZmVyZW5jZSA9ICBpbnB1dFVwcGVyIC0gaW5wdXRMb3dlcjtcbiAgICB2YXIgcHJvZ3Jlc3MgPSBpbnB1dCAtIGlucHV0TG93ZXI7XG5cbiAgICB2YXIgcmF0aW87XG4gICAgaWYgKGJhc2UgPT09IDEpIHtcbiAgICAgICAgcmF0aW8gPSBwcm9ncmVzcyAvIGRpZmZlcmVuY2U7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmF0aW8gPSAoTWF0aC5wb3coYmFzZSwgcHJvZ3Jlc3MpIC0gMSkgLyAoTWF0aC5wb3coYmFzZSwgZGlmZmVyZW5jZSkgLSAxKTtcbiAgICB9XG5cbiAgICByZXR1cm4gKG91dHB1dExvd2VyICogKDEgLSByYXRpbykpICsgKG91dHB1dFVwcGVyICogcmF0aW8pO1xufVxuXG5mdW5jdGlvbiBpbnRlcnBvbGF0ZUFycmF5KGlucHV0LCBiYXNlLCBpbnB1dExvd2VyLCBpbnB1dFVwcGVyLCBvdXRwdXRMb3dlciwgb3V0cHV0VXBwZXIpIHtcbiAgICB2YXIgb3V0cHV0ID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvdXRwdXRMb3dlci5sZW5ndGg7IGkrKykge1xuICAgICAgICBvdXRwdXRbaV0gPSBpbnRlcnBvbGF0ZU51bWJlcihpbnB1dCwgYmFzZSwgaW5wdXRMb3dlciwgaW5wdXRVcHBlciwgb3V0cHV0TG93ZXJbaV0sIG91dHB1dFVwcGVyW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dDtcbn1cblxuZnVuY3Rpb24gaXNGdW5jdGlvbkRlZmluaXRpb24odmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAodmFsdWUuc3RvcHMgfHwgdmFsdWUudHlwZSA9PT0gJ2lkZW50aXR5Jyk7XG59XG5cblxubW9kdWxlLmV4cG9ydHMuaXNGdW5jdGlvbkRlZmluaXRpb24gPSBpc0Z1bmN0aW9uRGVmaW5pdGlvbjtcblxubW9kdWxlLmV4cG9ydHMuaW50ZXJwb2xhdGVkID0gZnVuY3Rpb24ocGFyYW1ldGVycykge1xuICAgIHJldHVybiBjcmVhdGVGdW5jdGlvbihwYXJhbWV0ZXJzLCAnZXhwb25lbnRpYWwnKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzWydwaWVjZXdpc2UtY29uc3RhbnQnXSA9IGZ1bmN0aW9uKHBhcmFtZXRlcnMpIHtcbiAgICByZXR1cm4gY3JlYXRlRnVuY3Rpb24ocGFyYW1ldGVycywgJ2ludGVydmFsJyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgcmVmUHJvcGVydGllcyA9IHJlcXVpcmUoJy4vdXRpbC9yZWZfcHJvcGVydGllcycpO1xuXG5mdW5jdGlvbiBkZXJlZihsYXllciwgcGFyZW50KSB7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuXG4gICAgZm9yICh2YXIgayBpbiBsYXllcikge1xuICAgICAgICBpZiAoayAhPT0gJ3JlZicpIHtcbiAgICAgICAgICAgIHJlc3VsdFtrXSA9IGxheWVyW2tdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVmUHJvcGVydGllcy5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7XG4gICAgICAgIGlmIChrIGluIHBhcmVudCkge1xuICAgICAgICAgICAgcmVzdWx0W2tdID0gcGFyZW50W2tdO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGRlcmVmTGF5ZXJzO1xuXG4vKipcbiAqIEdpdmVuIGFuIGFycmF5IG9mIGxheWVycywgc29tZSBvZiB3aGljaCBtYXkgY29udGFpbiBgcmVmYCBwcm9wZXJ0aWVzXG4gKiB3aG9zZSB2YWx1ZSBpcyB0aGUgYGlkYCBvZiBhbm90aGVyIHByb3BlcnR5LCByZXR1cm4gYSBuZXcgYXJyYXkgd2hlcmVcbiAqIHN1Y2ggbGF5ZXJzIGhhdmUgYmVlbiBhdWdtZW50ZWQgd2l0aCB0aGUgJ3R5cGUnLCAnc291cmNlJywgZXRjLiBwcm9wZXJ0aWVzXG4gKiBmcm9tIHRoZSBwYXJlbnQgbGF5ZXIsIGFuZCB0aGUgYHJlZmAgcHJvcGVydHkgaGFzIGJlZW4gcmVtb3ZlZC5cbiAqXG4gKiBUaGUgaW5wdXQgaXMgbm90IG1vZGlmaWVkLiBUaGUgb3V0cHV0IG1heSBjb250YWluIHJlZmVyZW5jZXMgdG8gcG9ydGlvbnNcbiAqIG9mIHRoZSBpbnB1dC5cbiAqXG4gKiBAcGFyYW0ge0FycmF5PExheWVyPn0gbGF5ZXJzXG4gKiBAcmV0dXJucyB7QXJyYXk8TGF5ZXI+fVxuICovXG5mdW5jdGlvbiBkZXJlZkxheWVycyhsYXllcnMpIHtcbiAgICBsYXllcnMgPSBsYXllcnMuc2xpY2UoKTtcblxuICAgIHZhciBtYXAgPSBPYmplY3QuY3JlYXRlKG51bGwpLCBpO1xuICAgIGZvciAoaSA9IDA7IGkgPCBsYXllcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbWFwW2xheWVyc1tpXS5pZF0gPSBsYXllcnNbaV07XG4gICAgfVxuXG4gICAgZm9yIChpID0gMDsgaSA8IGxheWVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoJ3JlZicgaW4gbGF5ZXJzW2ldKSB7XG4gICAgICAgICAgICBsYXllcnNbaV0gPSBkZXJlZihsYXllcnNbaV0sIG1hcFtsYXllcnNbaV0ucmVmXSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbGF5ZXJzO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaXNFcXVhbCA9IHJlcXVpcmUoJ2xvZGFzaC5pc2VxdWFsJyk7XG5cbnZhciBvcGVyYXRpb25zID0ge1xuXG4gICAgLypcbiAgICAgKiB7IGNvbW1hbmQ6ICdzZXRTdHlsZScsIGFyZ3M6IFtzdHlsZXNoZWV0XSB9XG4gICAgICovXG4gICAgc2V0U3R5bGU6ICdzZXRTdHlsZScsXG5cbiAgICAvKlxuICAgICAqIHsgY29tbWFuZDogJ2FkZExheWVyJywgYXJnczogW2xheWVyLCAnYmVmb3JlTGF5ZXJJZCddIH1cbiAgICAgKi9cbiAgICBhZGRMYXllcjogJ2FkZExheWVyJyxcblxuICAgIC8qXG4gICAgICogeyBjb21tYW5kOiAncmVtb3ZlTGF5ZXInLCBhcmdzOiBbJ2xheWVySWQnXSB9XG4gICAgICovXG4gICAgcmVtb3ZlTGF5ZXI6ICdyZW1vdmVMYXllcicsXG5cbiAgICAvKlxuICAgICAqIHsgY29tbWFuZDogJ3NldFBhaW50UHJvcGVydHknLCBhcmdzOiBbJ2xheWVySWQnLCAncHJvcCcsIHZhbHVlXSB9XG4gICAgICovXG4gICAgc2V0UGFpbnRQcm9wZXJ0eTogJ3NldFBhaW50UHJvcGVydHknLFxuXG4gICAgLypcbiAgICAgKiB7IGNvbW1hbmQ6ICdzZXRMYXlvdXRQcm9wZXJ0eScsIGFyZ3M6IFsnbGF5ZXJJZCcsICdwcm9wJywgdmFsdWVdIH1cbiAgICAgKi9cbiAgICBzZXRMYXlvdXRQcm9wZXJ0eTogJ3NldExheW91dFByb3BlcnR5JyxcblxuICAgIC8qXG4gICAgICogeyBjb21tYW5kOiAnc2V0RmlsdGVyJywgYXJnczogWydsYXllcklkJywgZmlsdGVyXSB9XG4gICAgICovXG4gICAgc2V0RmlsdGVyOiAnc2V0RmlsdGVyJyxcblxuICAgIC8qXG4gICAgICogeyBjb21tYW5kOiAnYWRkU291cmNlJywgYXJnczogWydzb3VyY2VJZCcsIHNvdXJjZV0gfVxuICAgICAqL1xuICAgIGFkZFNvdXJjZTogJ2FkZFNvdXJjZScsXG5cbiAgICAvKlxuICAgICAqIHsgY29tbWFuZDogJ3JlbW92ZVNvdXJjZScsIGFyZ3M6IFsnc291cmNlSWQnXSB9XG4gICAgICovXG4gICAgcmVtb3ZlU291cmNlOiAncmVtb3ZlU291cmNlJyxcblxuICAgIC8qXG4gICAgICogeyBjb21tYW5kOiAnc2V0TGF5ZXJab29tUmFuZ2UnLCBhcmdzOiBbJ2xheWVySWQnLCAwLCAyMl0gfVxuICAgICAqL1xuICAgIHNldExheWVyWm9vbVJhbmdlOiAnc2V0TGF5ZXJab29tUmFuZ2UnLFxuXG4gICAgLypcbiAgICAgKiB7IGNvbW1hbmQ6ICdzZXRMYXllclByb3BlcnR5JywgYXJnczogWydsYXllcklkJywgJ3Byb3AnLCB2YWx1ZV0gfVxuICAgICAqL1xuICAgIHNldExheWVyUHJvcGVydHk6ICdzZXRMYXllclByb3BlcnR5JyxcblxuICAgIC8qXG4gICAgICogeyBjb21tYW5kOiAnc2V0Q2VudGVyJywgYXJnczogW1tsb24sIGxhdF1dIH1cbiAgICAgKi9cbiAgICBzZXRDZW50ZXI6ICdzZXRDZW50ZXInLFxuXG4gICAgLypcbiAgICAgKiB7IGNvbW1hbmQ6ICdzZXRab29tJywgYXJnczogW3pvb21dIH1cbiAgICAgKi9cbiAgICBzZXRab29tOiAnc2V0Wm9vbScsXG5cbiAgICAvKlxuICAgICAqIHsgY29tbWFuZDogJ3NldEJlYXJpbmcnLCBhcmdzOiBbYmVhcmluZ10gfVxuICAgICAqL1xuICAgIHNldEJlYXJpbmc6ICdzZXRCZWFyaW5nJyxcblxuICAgIC8qXG4gICAgICogeyBjb21tYW5kOiAnc2V0UGl0Y2gnLCBhcmdzOiBbcGl0Y2hdIH1cbiAgICAgKi9cbiAgICBzZXRQaXRjaDogJ3NldFBpdGNoJyxcblxuICAgIC8qXG4gICAgICogeyBjb21tYW5kOiAnc2V0U3ByaXRlJywgYXJnczogWydzcHJpdGVVcmwnXSB9XG4gICAgICovXG4gICAgc2V0U3ByaXRlOiAnc2V0U3ByaXRlJyxcblxuICAgIC8qXG4gICAgICogeyBjb21tYW5kOiAnc2V0R2x5cGhzJywgYXJnczogWydnbHlwaHNVcmwnXSB9XG4gICAgICovXG4gICAgc2V0R2x5cGhzOiAnc2V0R2x5cGhzJyxcblxuICAgIC8qXG4gICAgICogeyBjb21tYW5kOiAnc2V0VHJhbnNpdGlvbicsIGFyZ3M6IFt0cmFuc2l0aW9uXSB9XG4gICAgICovXG4gICAgc2V0VHJhbnNpdGlvbjogJ3NldFRyYW5zaXRpb24nLFxuXG4gICAgLypcbiAgICAgKiB7IGNvbW1hbmQ6ICdzZXRMaWdodGluZycsIGFyZ3M6IFtsaWdodFByb3BlcnRpZXNdIH1cbiAgICAgKi9cbiAgICBzZXRMaWdodDogJ3NldExpZ2h0J1xuXG59O1xuXG5cbmZ1bmN0aW9uIGRpZmZTb3VyY2VzKGJlZm9yZSwgYWZ0ZXIsIGNvbW1hbmRzLCBzb3VyY2VzUmVtb3ZlZCkge1xuICAgIGJlZm9yZSA9IGJlZm9yZSB8fCB7fTtcbiAgICBhZnRlciA9IGFmdGVyIHx8IHt9O1xuXG4gICAgdmFyIHNvdXJjZUlkO1xuXG4gICAgLy8gbG9vayBmb3Igc291cmNlcyB0byByZW1vdmVcbiAgICBmb3IgKHNvdXJjZUlkIGluIGJlZm9yZSkge1xuICAgICAgICBpZiAoIWJlZm9yZS5oYXNPd25Qcm9wZXJ0eShzb3VyY2VJZCkpIGNvbnRpbnVlO1xuICAgICAgICBpZiAoIWFmdGVyLmhhc093blByb3BlcnR5KHNvdXJjZUlkKSkge1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IG9wZXJhdGlvbnMucmVtb3ZlU291cmNlLCBhcmdzOiBbc291cmNlSWRdIH0pO1xuICAgICAgICAgICAgc291cmNlc1JlbW92ZWRbc291cmNlSWRdID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGxvb2sgZm9yIHNvdXJjZXMgdG8gYWRkL3VwZGF0ZVxuICAgIGZvciAoc291cmNlSWQgaW4gYWZ0ZXIpIHtcbiAgICAgICAgaWYgKCFhZnRlci5oYXNPd25Qcm9wZXJ0eShzb3VyY2VJZCkpIGNvbnRpbnVlO1xuICAgICAgICBpZiAoIWJlZm9yZS5oYXNPd25Qcm9wZXJ0eShzb3VyY2VJZCkpIHtcbiAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBvcGVyYXRpb25zLmFkZFNvdXJjZSwgYXJnczogW3NvdXJjZUlkLCBhZnRlcltzb3VyY2VJZF1dIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKCFpc0VxdWFsKGJlZm9yZVtzb3VyY2VJZF0sIGFmdGVyW3NvdXJjZUlkXSkpIHtcbiAgICAgICAgICAgIC8vIG5vIHVwZGF0ZSBjb21tYW5kLCBtdXN0IHJlbW92ZSB0aGVuIGFkZFxuICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IG9wZXJhdGlvbnMucmVtb3ZlU291cmNlLCBhcmdzOiBbc291cmNlSWRdIH0pO1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IG9wZXJhdGlvbnMuYWRkU291cmNlLCBhcmdzOiBbc291cmNlSWQsIGFmdGVyW3NvdXJjZUlkXV0gfSk7XG4gICAgICAgICAgICBzb3VyY2VzUmVtb3ZlZFtzb3VyY2VJZF0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkaWZmTGF5ZXJQcm9wZXJ0eUNoYW5nZXMoYmVmb3JlLCBhZnRlciwgY29tbWFuZHMsIGxheWVySWQsIGtsYXNzLCBjb21tYW5kKSB7XG4gICAgYmVmb3JlID0gYmVmb3JlIHx8IHt9O1xuICAgIGFmdGVyID0gYWZ0ZXIgfHwge307XG5cbiAgICB2YXIgcHJvcDtcblxuICAgIGZvciAocHJvcCBpbiBiZWZvcmUpIHtcbiAgICAgICAgaWYgKCFiZWZvcmUuaGFzT3duUHJvcGVydHkocHJvcCkpIGNvbnRpbnVlO1xuICAgICAgICBpZiAoIWlzRXF1YWwoYmVmb3JlW3Byb3BdLCBhZnRlcltwcm9wXSkpIHtcbiAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBjb21tYW5kLCBhcmdzOiBbbGF5ZXJJZCwgcHJvcCwgYWZ0ZXJbcHJvcF0sIGtsYXNzXSB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKHByb3AgaW4gYWZ0ZXIpIHtcbiAgICAgICAgaWYgKCFhZnRlci5oYXNPd25Qcm9wZXJ0eShwcm9wKSB8fCBiZWZvcmUuaGFzT3duUHJvcGVydHkocHJvcCkpIGNvbnRpbnVlO1xuICAgICAgICBpZiAoIWlzRXF1YWwoYmVmb3JlW3Byb3BdLCBhZnRlcltwcm9wXSkpIHtcbiAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBjb21tYW5kLCBhcmdzOiBbbGF5ZXJJZCwgcHJvcCwgYWZ0ZXJbcHJvcF0sIGtsYXNzXSB9KTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gcGx1Y2tJZChsYXllcikge1xuICAgIHJldHVybiBsYXllci5pZDtcbn1cbmZ1bmN0aW9uIGluZGV4QnlJZChncm91cCwgbGF5ZXIpIHtcbiAgICBncm91cFtsYXllci5pZF0gPSBsYXllcjtcbiAgICByZXR1cm4gZ3JvdXA7XG59XG5cbmZ1bmN0aW9uIGRpZmZMYXllcnMoYmVmb3JlLCBhZnRlciwgY29tbWFuZHMpIHtcbiAgICBiZWZvcmUgPSBiZWZvcmUgfHwgW107XG4gICAgYWZ0ZXIgPSBhZnRlciB8fCBbXTtcblxuICAgIC8vIG9yZGVyIG9mIGxheWVycyBieSBpZFxuICAgIHZhciBiZWZvcmVPcmRlciA9IGJlZm9yZS5tYXAocGx1Y2tJZCk7XG4gICAgdmFyIGFmdGVyT3JkZXIgPSBhZnRlci5tYXAocGx1Y2tJZCk7XG5cbiAgICAvLyBpbmRleCBvZiBsYXllciBieSBpZFxuICAgIHZhciBiZWZvcmVJbmRleCA9IGJlZm9yZS5yZWR1Y2UoaW5kZXhCeUlkLCB7fSk7XG4gICAgdmFyIGFmdGVySW5kZXggPSBhZnRlci5yZWR1Y2UoaW5kZXhCeUlkLCB7fSk7XG5cbiAgICAvLyB0cmFjayBvcmRlciBvZiBsYXllcnMgYXMgaWYgdGhleSBoYXZlIGJlZW4gbXV0YXRlZFxuICAgIHZhciB0cmFja2VyID0gYmVmb3JlT3JkZXIuc2xpY2UoKTtcblxuICAgIC8vIGxheWVycyB0aGF0IGhhdmUgYmVlbiBhZGRlZCBkbyBub3QgbmVlZCB0byBiZSBkaWZmZWRcbiAgICB2YXIgY2xlYW4gPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gICAgdmFyIGksIGQsIGxheWVySWQsIGJlZm9yZUxheWVyLCBhZnRlckxheWVyLCBpbnNlcnRCZWZvcmVMYXllcklkLCBwcm9wO1xuXG4gICAgLy8gcmVtb3ZlIGxheWVyc1xuICAgIGZvciAoaSA9IDAsIGQgPSAwOyBpIDwgYmVmb3JlT3JkZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGF5ZXJJZCA9IGJlZm9yZU9yZGVyW2ldO1xuICAgICAgICBpZiAoIWFmdGVySW5kZXguaGFzT3duUHJvcGVydHkobGF5ZXJJZCkpIHtcbiAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBvcGVyYXRpb25zLnJlbW92ZUxheWVyLCBhcmdzOiBbbGF5ZXJJZF0gfSk7XG4gICAgICAgICAgICB0cmFja2VyLnNwbGljZSh0cmFja2VyLmluZGV4T2YobGF5ZXJJZCwgZCksIDEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gbGltaXQgd2hlcmUgaW4gdHJhY2tlciB3ZSBuZWVkIHRvIGxvb2sgZm9yIGEgbWF0Y2hcbiAgICAgICAgICAgIGQrKztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGFkZC9yZW9yZGVyIGxheWVyc1xuICAgIGZvciAoaSA9IDAsIGQgPSAwOyBpIDwgYWZ0ZXJPcmRlci5sZW5ndGg7IGkrKykge1xuICAgICAgICAvLyB3b3JrIGJhY2t3YXJkcyBhcyBpbnNlcnQgaXMgYmVmb3JlIGFuIGV4aXN0aW5nIGxheWVyXG4gICAgICAgIGxheWVySWQgPSBhZnRlck9yZGVyW2FmdGVyT3JkZXIubGVuZ3RoIC0gMSAtIGldO1xuXG4gICAgICAgIGlmICh0cmFja2VyW3RyYWNrZXIubGVuZ3RoIC0gMSAtIGldID09PSBsYXllcklkKSBjb250aW51ZTtcblxuICAgICAgICBpZiAoYmVmb3JlSW5kZXguaGFzT3duUHJvcGVydHkobGF5ZXJJZCkpIHtcbiAgICAgICAgICAgIC8vIHJlbW92ZSB0aGUgbGF5ZXIgYmVmb3JlIHdlIGluc2VydCBhdCB0aGUgY29ycmVjdCBwb3NpdGlvblxuICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IG9wZXJhdGlvbnMucmVtb3ZlTGF5ZXIsIGFyZ3M6IFtsYXllcklkXSB9KTtcbiAgICAgICAgICAgIHRyYWNrZXIuc3BsaWNlKHRyYWNrZXIubGFzdEluZGV4T2YobGF5ZXJJZCwgdHJhY2tlci5sZW5ndGggLSBkKSwgMSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBsaW1pdCB3aGVyZSBpbiB0cmFja2VyIHdlIG5lZWQgdG8gbG9vayBmb3IgYSBtYXRjaFxuICAgICAgICAgICAgZCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gYWRkIGxheWVyIGF0IGNvcnJlY3QgcG9zaXRpb25cbiAgICAgICAgaW5zZXJ0QmVmb3JlTGF5ZXJJZCA9IHRyYWNrZXJbdHJhY2tlci5sZW5ndGggLSBpXTtcbiAgICAgICAgY29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IG9wZXJhdGlvbnMuYWRkTGF5ZXIsIGFyZ3M6IFthZnRlckluZGV4W2xheWVySWRdLCBpbnNlcnRCZWZvcmVMYXllcklkXSB9KTtcbiAgICAgICAgdHJhY2tlci5zcGxpY2UodHJhY2tlci5sZW5ndGggLSBpLCAwLCBsYXllcklkKTtcbiAgICAgICAgY2xlYW5bbGF5ZXJJZF0gPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIHVwZGF0ZSBsYXllcnNcbiAgICBmb3IgKGkgPSAwOyBpIDwgYWZ0ZXJPcmRlci5sZW5ndGg7IGkrKykge1xuICAgICAgICBsYXllcklkID0gYWZ0ZXJPcmRlcltpXTtcbiAgICAgICAgYmVmb3JlTGF5ZXIgPSBiZWZvcmVJbmRleFtsYXllcklkXTtcbiAgICAgICAgYWZ0ZXJMYXllciA9IGFmdGVySW5kZXhbbGF5ZXJJZF07XG5cbiAgICAgICAgLy8gbm8gbmVlZCB0byB1cGRhdGUgaWYgcHJldmlvdXNseSBhZGRlZCAobmV3IG9yIG1vdmVkKVxuICAgICAgICBpZiAoY2xlYW5bbGF5ZXJJZF0gfHwgaXNFcXVhbChiZWZvcmVMYXllciwgYWZ0ZXJMYXllcikpIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIElmIHNvdXJjZSwgc291cmNlLWxheWVyLCBvciB0eXBlIGhhdmUgY2hhbmdlcywgdGhlbiByZW1vdmUgdGhlIGxheWVyXG4gICAgICAgIC8vIGFuZCBhZGQgaXQgYmFjayAnZnJvbSBzY3JhdGNoJy5cbiAgICAgICAgaWYgKCFpc0VxdWFsKGJlZm9yZUxheWVyLnNvdXJjZSwgYWZ0ZXJMYXllci5zb3VyY2UpIHx8ICFpc0VxdWFsKGJlZm9yZUxheWVyWydzb3VyY2UtbGF5ZXInXSwgYWZ0ZXJMYXllclsnc291cmNlLWxheWVyJ10pIHx8ICFpc0VxdWFsKGJlZm9yZUxheWVyLnR5cGUsIGFmdGVyTGF5ZXIudHlwZSkpIHtcbiAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBvcGVyYXRpb25zLnJlbW92ZUxheWVyLCBhcmdzOiBbbGF5ZXJJZF0gfSk7XG4gICAgICAgICAgICAvLyB3ZSBhZGQgdGhlIGxheWVyIGJhY2sgYXQgdGhlIHNhbWUgcG9zaXRpb24gaXQgd2FzIGFscmVhZHkgaW4sIHNvXG4gICAgICAgICAgICAvLyB0aGVyZSdzIG5vIG5lZWQgdG8gdXBkYXRlIHRoZSBgdHJhY2tlcmBcbiAgICAgICAgICAgIGluc2VydEJlZm9yZUxheWVySWQgPSB0cmFja2VyW3RyYWNrZXIubGFzdEluZGV4T2YobGF5ZXJJZCkgKyAxXTtcbiAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBvcGVyYXRpb25zLmFkZExheWVyLCBhcmdzOiBbYWZ0ZXJMYXllciwgaW5zZXJ0QmVmb3JlTGF5ZXJJZF0gfSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGxheW91dCwgcGFpbnQsIGZpbHRlciwgbWluem9vbSwgbWF4em9vbVxuICAgICAgICBkaWZmTGF5ZXJQcm9wZXJ0eUNoYW5nZXMoYmVmb3JlTGF5ZXIubGF5b3V0LCBhZnRlckxheWVyLmxheW91dCwgY29tbWFuZHMsIGxheWVySWQsIG51bGwsIG9wZXJhdGlvbnMuc2V0TGF5b3V0UHJvcGVydHkpO1xuICAgICAgICBkaWZmTGF5ZXJQcm9wZXJ0eUNoYW5nZXMoYmVmb3JlTGF5ZXIucGFpbnQsIGFmdGVyTGF5ZXIucGFpbnQsIGNvbW1hbmRzLCBsYXllcklkLCBudWxsLCBvcGVyYXRpb25zLnNldFBhaW50UHJvcGVydHkpO1xuICAgICAgICBpZiAoIWlzRXF1YWwoYmVmb3JlTGF5ZXIuZmlsdGVyLCBhZnRlckxheWVyLmZpbHRlcikpIHtcbiAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBvcGVyYXRpb25zLnNldEZpbHRlciwgYXJnczogW2xheWVySWQsIGFmdGVyTGF5ZXIuZmlsdGVyXSB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzRXF1YWwoYmVmb3JlTGF5ZXIubWluem9vbSwgYWZ0ZXJMYXllci5taW56b29tKSB8fCAhaXNFcXVhbChiZWZvcmVMYXllci5tYXh6b29tLCBhZnRlckxheWVyLm1heHpvb20pKSB7XG4gICAgICAgICAgICBjb21tYW5kcy5wdXNoKHsgY29tbWFuZDogb3BlcmF0aW9ucy5zZXRMYXllclpvb21SYW5nZSwgYXJnczogW2xheWVySWQsIGFmdGVyTGF5ZXIubWluem9vbSwgYWZ0ZXJMYXllci5tYXh6b29tXSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGhhbmRsZSBhbGwgb3RoZXIgbGF5ZXIgcHJvcHMsIGluY2x1ZGluZyBwYWludC4qXG4gICAgICAgIGZvciAocHJvcCBpbiBiZWZvcmVMYXllcikge1xuICAgICAgICAgICAgaWYgKCFiZWZvcmVMYXllci5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgY29udGludWU7XG4gICAgICAgICAgICBpZiAocHJvcCA9PT0gJ2xheW91dCcgfHwgcHJvcCA9PT0gJ3BhaW50JyB8fCBwcm9wID09PSAnZmlsdGVyJ1xuICAgICAgICAgICAgICAgIHx8IHByb3AgPT09ICdtZXRhZGF0YScgfHwgcHJvcCA9PT0gJ21pbnpvb20nIHx8IHByb3AgPT09ICdtYXh6b29tJykgY29udGludWU7XG4gICAgICAgICAgICBpZiAocHJvcC5pbmRleE9mKCdwYWludC4nKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGRpZmZMYXllclByb3BlcnR5Q2hhbmdlcyhiZWZvcmVMYXllcltwcm9wXSwgYWZ0ZXJMYXllcltwcm9wXSwgY29tbWFuZHMsIGxheWVySWQsIHByb3Auc2xpY2UoNiksIG9wZXJhdGlvbnMuc2V0UGFpbnRQcm9wZXJ0eSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFpc0VxdWFsKGJlZm9yZUxheWVyW3Byb3BdLCBhZnRlckxheWVyW3Byb3BdKSkge1xuICAgICAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBvcGVyYXRpb25zLnNldExheWVyUHJvcGVydHksIGFyZ3M6IFtsYXllcklkLCBwcm9wLCBhZnRlckxheWVyW3Byb3BdXSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKHByb3AgaW4gYWZ0ZXJMYXllcikge1xuICAgICAgICAgICAgaWYgKCFhZnRlckxheWVyLmhhc093blByb3BlcnR5KHByb3ApIHx8IGJlZm9yZUxheWVyLmhhc093blByb3BlcnR5KHByb3ApKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChwcm9wID09PSAnbGF5b3V0JyB8fCBwcm9wID09PSAncGFpbnQnIHx8IHByb3AgPT09ICdmaWx0ZXInXG4gICAgICAgICAgICAgICAgfHwgcHJvcCA9PT0gJ21ldGFkYXRhJyB8fCBwcm9wID09PSAnbWluem9vbScgfHwgcHJvcCA9PT0gJ21heHpvb20nKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChwcm9wLmluZGV4T2YoJ3BhaW50LicpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgZGlmZkxheWVyUHJvcGVydHlDaGFuZ2VzKGJlZm9yZUxheWVyW3Byb3BdLCBhZnRlckxheWVyW3Byb3BdLCBjb21tYW5kcywgbGF5ZXJJZCwgcHJvcC5zbGljZSg2KSwgb3BlcmF0aW9ucy5zZXRQYWludFByb3BlcnR5KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzRXF1YWwoYmVmb3JlTGF5ZXJbcHJvcF0sIGFmdGVyTGF5ZXJbcHJvcF0pKSB7XG4gICAgICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IG9wZXJhdGlvbnMuc2V0TGF5ZXJQcm9wZXJ0eSwgYXJnczogW2xheWVySWQsIHByb3AsIGFmdGVyTGF5ZXJbcHJvcF1dIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIERpZmYgdHdvIHN0eWxlc2hlZXRcbiAqXG4gKiBDcmVhdGVzIHNlbWFudGljbHkgYXdhcmUgZGlmZnMgdGhhdCBjYW4gZWFzaWx5IGJlIGFwcGxpZWQgYXQgcnVudGltZS5cbiAqIE9wZXJhdGlvbnMgcHJvZHVjZWQgYnkgdGhlIGRpZmYgY2xvc2VseSByZXNlbWJsZSB0aGUgbWFwYm94LWdsLWpzIEFQSS4gQW55XG4gKiBlcnJvciBjcmVhdGluZyB0aGUgZGlmZiB3aWxsIGZhbGwgYmFjayB0byB0aGUgJ3NldFN0eWxlJyBvcGVyYXRpb24uXG4gKlxuICogRXhhbXBsZSBkaWZmOlxuICogW1xuICogICAgIHsgY29tbWFuZDogJ3NldENvbnN0YW50JywgYXJnczogWydAd2F0ZXInLCAnIzAwMDBGRiddIH0sXG4gKiAgICAgeyBjb21tYW5kOiAnc2V0UGFpbnRQcm9wZXJ0eScsIGFyZ3M6IFsnYmFja2dyb3VuZCcsICdiYWNrZ3JvdW5kLWNvbG9yJywgJ2JsYWNrJ10gfVxuICogXVxuICpcbiAqIEBwYXJhbSB7Kn0gW2JlZm9yZV0gc3R5bGVzaGVldCB0byBjb21wYXJlIGZyb21cbiAqIEBwYXJhbSB7Kn0gYWZ0ZXIgc3R5bGVzaGVldCB0byBjb21wYXJlIHRvXG4gKiBAcmV0dXJucyBBcnJheSBsaXN0IG9mIGNoYW5nZXNcbiAqL1xuZnVuY3Rpb24gZGlmZlN0eWxlcyhiZWZvcmUsIGFmdGVyKSB7XG4gICAgaWYgKCFiZWZvcmUpIHJldHVybiBbeyBjb21tYW5kOiBvcGVyYXRpb25zLnNldFN0eWxlLCBhcmdzOiBbYWZ0ZXJdIH1dO1xuXG4gICAgdmFyIGNvbW1hbmRzID0gW107XG5cbiAgICB0cnkge1xuICAgICAgICAvLyBIYW5kbGUgY2hhbmdlcyB0byB0b3AtbGV2ZWwgcHJvcGVydGllc1xuICAgICAgICBpZiAoIWlzRXF1YWwoYmVmb3JlLnZlcnNpb24sIGFmdGVyLnZlcnNpb24pKSB7XG4gICAgICAgICAgICByZXR1cm4gW3sgY29tbWFuZDogb3BlcmF0aW9ucy5zZXRTdHlsZSwgYXJnczogW2FmdGVyXSB9XTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzRXF1YWwoYmVmb3JlLmNlbnRlciwgYWZ0ZXIuY2VudGVyKSkge1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IG9wZXJhdGlvbnMuc2V0Q2VudGVyLCBhcmdzOiBbYWZ0ZXIuY2VudGVyXSB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzRXF1YWwoYmVmb3JlLnpvb20sIGFmdGVyLnpvb20pKSB7XG4gICAgICAgICAgICBjb21tYW5kcy5wdXNoKHsgY29tbWFuZDogb3BlcmF0aW9ucy5zZXRab29tLCBhcmdzOiBbYWZ0ZXIuem9vbV0gfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc0VxdWFsKGJlZm9yZS5iZWFyaW5nLCBhZnRlci5iZWFyaW5nKSkge1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IG9wZXJhdGlvbnMuc2V0QmVhcmluZywgYXJnczogW2FmdGVyLmJlYXJpbmddIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNFcXVhbChiZWZvcmUucGl0Y2gsIGFmdGVyLnBpdGNoKSkge1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IG9wZXJhdGlvbnMuc2V0UGl0Y2gsIGFyZ3M6IFthZnRlci5waXRjaF0gfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc0VxdWFsKGJlZm9yZS5zcHJpdGUsIGFmdGVyLnNwcml0ZSkpIHtcbiAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBvcGVyYXRpb25zLnNldFNwcml0ZSwgYXJnczogW2FmdGVyLnNwcml0ZV0gfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc0VxdWFsKGJlZm9yZS5nbHlwaHMsIGFmdGVyLmdseXBocykpIHtcbiAgICAgICAgICAgIGNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBvcGVyYXRpb25zLnNldEdseXBocywgYXJnczogW2FmdGVyLmdseXBoc10gfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc0VxdWFsKGJlZm9yZS50cmFuc2l0aW9uLCBhZnRlci50cmFuc2l0aW9uKSkge1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IG9wZXJhdGlvbnMuc2V0VHJhbnNpdGlvbiwgYXJnczogW2FmdGVyLnRyYW5zaXRpb25dIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNFcXVhbChiZWZvcmUubGlnaHQsIGFmdGVyLmxpZ2h0KSkge1xuICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IG9wZXJhdGlvbnMuc2V0TGlnaHQsIGFyZ3M6IFthZnRlci5saWdodF0gfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIYW5kbGUgY2hhbmdlcyB0byBgc291cmNlc2BcbiAgICAgICAgLy8gSWYgYSBzb3VyY2UgaXMgdG8gYmUgcmVtb3ZlZCwgd2UgYWxzby0tYmVmb3JlIHRoZSByZW1vdmVTb3VyY2VcbiAgICAgICAgLy8gY29tbWFuZC0tbmVlZCB0byByZW1vdmUgYWxsIHRoZSBzdHlsZSBsYXllcnMgdGhhdCBkZXBlbmQgb24gaXQuXG4gICAgICAgIHZhciBzb3VyY2VzUmVtb3ZlZCA9IHt9O1xuXG4gICAgICAgIC8vIEZpcnN0IGNvbGxlY3QgdGhlIHthZGQscmVtb3ZlfVNvdXJjZSBjb21tYW5kc1xuICAgICAgICB2YXIgcmVtb3ZlT3JBZGRTb3VyY2VDb21tYW5kcyA9IFtdO1xuICAgICAgICBkaWZmU291cmNlcyhiZWZvcmUuc291cmNlcywgYWZ0ZXIuc291cmNlcywgcmVtb3ZlT3JBZGRTb3VyY2VDb21tYW5kcywgc291cmNlc1JlbW92ZWQpO1xuXG4gICAgICAgIC8vIFB1c2ggYSByZW1vdmVMYXllciBjb21tYW5kIGZvciBlYWNoIHN0eWxlIGxheWVyIHRoYXQgZGVwZW5kcyBvbiBhXG4gICAgICAgIC8vIHNvdXJjZSB0aGF0J3MgYmVpbmcgcmVtb3ZlZC5cbiAgICAgICAgLy8gQWxzbywgZXhjbHVkZSBhbnkgc3VjaCBsYXllcnMgdGhlbSBmcm9tIHRoZSBpbnB1dCB0byBgZGlmZkxheWVyc2BcbiAgICAgICAgLy8gYmVsb3csIHNvIHRoYXQgZGlmZkxheWVycyBwcm9kdWNlcyB0aGUgYXBwcm9wcmlhdGUgYGFkZExheWVyc2BcbiAgICAgICAgLy8gY29tbWFuZFxuICAgICAgICB2YXIgYmVmb3JlTGF5ZXJzID0gW107XG4gICAgICAgIGlmIChiZWZvcmUubGF5ZXJzKSB7XG4gICAgICAgICAgICBiZWZvcmUubGF5ZXJzLmZvckVhY2goZnVuY3Rpb24gKGxheWVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNvdXJjZXNSZW1vdmVkW2xheWVyLnNvdXJjZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IG9wZXJhdGlvbnMucmVtb3ZlTGF5ZXIsIGFyZ3M6IFtsYXllci5pZF0gfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYmVmb3JlTGF5ZXJzLnB1c2gobGF5ZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbW1hbmRzID0gY29tbWFuZHMuY29uY2F0KHJlbW92ZU9yQWRkU291cmNlQ29tbWFuZHMpO1xuXG4gICAgICAgIC8vIEhhbmRsZSBjaGFuZ2VzIHRvIGBsYXllcnNgXG4gICAgICAgIGRpZmZMYXllcnMoYmVmb3JlTGF5ZXJzLCBhZnRlci5sYXllcnMsIGNvbW1hbmRzKTtcblxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gZmFsbCBiYWNrIHRvIHNldFN0eWxlXG4gICAgICAgIGNvbnNvbGUud2FybignVW5hYmxlIHRvIGNvbXB1dGUgc3R5bGUgZGlmZjonLCBlKTtcbiAgICAgICAgY29tbWFuZHMgPSBbeyBjb21tYW5kOiBvcGVyYXRpb25zLnNldFN0eWxlLCBhcmdzOiBbYWZ0ZXJdIH1dO1xuICAgIH1cblxuICAgIHJldHVybiBjb21tYW5kcztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBkaWZmU3R5bGVzO1xubW9kdWxlLmV4cG9ydHMub3BlcmF0aW9ucyA9IG9wZXJhdGlvbnM7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBmb3JtYXQgPSByZXF1aXJlKCd1dGlsJykuZm9ybWF0O1xuXG5mdW5jdGlvbiBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSAvKiwgbWVzc2FnZSwgLi4uKi8pIHtcbiAgICB0aGlzLm1lc3NhZ2UgPSAoXG4gICAgICAgIChrZXkgPyBrZXkgKyAnOiAnIDogJycpICtcbiAgICAgICAgZm9ybWF0LmFwcGx5KGZvcm1hdCwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKSlcbiAgICApO1xuXG4gICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUuX19saW5lX18pIHtcbiAgICAgICAgdGhpcy5saW5lID0gdmFsdWUuX19saW5lX187XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFZhbGlkYXRpb25FcnJvcjtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHJlZlByb3BlcnRpZXMgPSByZXF1aXJlKCcuL3V0aWwvcmVmX3Byb3BlcnRpZXMnKTtcbnZhciBzdHJpbmdpZnkgPSByZXF1aXJlKCdmYXN0LXN0YWJsZS1zdHJpbmdpZnknKTtcblxuZnVuY3Rpb24ga2V5KGxheWVyKSB7XG4gICAgcmV0dXJuIHN0cmluZ2lmeShyZWZQcm9wZXJ0aWVzLm1hcChmdW5jdGlvbiAoaykge1xuICAgICAgICByZXR1cm4gbGF5ZXJba107XG4gICAgfSkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdyb3VwQnlMYXlvdXQ7XG5cbi8qKlxuICogR2l2ZW4gYW4gYXJyYXkgb2YgbGF5ZXJzLCByZXR1cm4gYW4gYXJyYXkgb2YgYXJyYXlzIG9mIGxheWVycyB3aGVyZSBhbGxcbiAqIGxheWVycyBpbiBlYWNoIGdyb3VwIGhhdmUgaWRlbnRpY2FsIGxheW91dC1hZmZlY3RpbmcgcHJvcGVydGllcy4gVGhlc2VcbiAqIGFyZSB0aGUgcHJvcGVydGllcyB0aGF0IHdlcmUgZm9ybWVybHkgdXNlZCBieSBleHBsaWNpdCBgcmVmYCBtZWNoYW5pc21cbiAqIGZvciBsYXllcnM6ICd0eXBlJywgJ3NvdXJjZScsICdzb3VyY2UtbGF5ZXInLCAnbWluem9vbScsICdtYXh6b29tJyxcbiAqICdmaWx0ZXInLCBhbmQgJ2xheW91dCcuXG4gKlxuICogVGhlIGlucHV0IGlzIG5vdCBtb2RpZmllZC4gVGhlIG91dHB1dCBsYXllcnMgYXJlIHJlZmVyZW5jZXMgdG8gdGhlXG4gKiBpbnB1dCBsYXllcnMuXG4gKlxuICogQHBhcmFtIHtBcnJheTxMYXllcj59IGxheWVyc1xuICogQHJldHVybnMge0FycmF5PEFycmF5PExheWVyPj59XG4gKi9cbmZ1bmN0aW9uIGdyb3VwQnlMYXlvdXQobGF5ZXJzKSB7XG4gICAgdmFyIGdyb3VwcyA9IHt9LCBpLCBrO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IGxheWVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICBrID0ga2V5KGxheWVyc1tpXSk7XG4gICAgICAgIHZhciBncm91cCA9IGdyb3Vwc1trXTtcbiAgICAgICAgaWYgKCFncm91cCkge1xuICAgICAgICAgICAgZ3JvdXAgPSBncm91cHNba10gPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBncm91cC5wdXNoKGxheWVyc1tpXSk7XG4gICAgfVxuXG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuXG4gICAgZm9yIChrIGluIGdyb3Vwcykge1xuICAgICAgICByZXN1bHQucHVzaChncm91cHNba10pO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG91dHB1dCkge1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBpbnB1dCA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgZm9yICh2YXIgayBpbiBpbnB1dCkge1xuICAgICAgICAgICAgb3V0cHV0W2tdID0gaW5wdXRba107XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2V0VHlwZSh2YWwpIHtcbiAgICBpZiAodmFsIGluc3RhbmNlb2YgTnVtYmVyKSB7XG4gICAgICAgIHJldHVybiAnbnVtYmVyJztcbiAgICB9IGVsc2UgaWYgKHZhbCBpbnN0YW5jZW9mIFN0cmluZykge1xuICAgICAgICByZXR1cm4gJ3N0cmluZyc7XG4gICAgfSBlbHNlIGlmICh2YWwgaW5zdGFuY2VvZiBCb29sZWFuKSB7XG4gICAgICAgIHJldHVybiAnYm9vbGVhbic7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAgICAgcmV0dXJuICdhcnJheSc7XG4gICAgfSBlbHNlIGlmICh2YWwgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuICdudWxsJztcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbDtcbiAgICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFsndHlwZScsICdzb3VyY2UnLCAnc291cmNlLWxheWVyJywgJ21pbnpvb20nLCAnbWF4em9vbScsICdmaWx0ZXInLCAnbGF5b3V0J107XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIFR1cm4ganNvbmxpbnQtbGluZXMtcHJpbWl0aXZlcyBvYmplY3RzIGludG8gcHJpbWl0aXZlIG9iamVjdHNcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gdW5idW5kbGUodmFsdWUpIHtcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIgfHwgdmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcgfHwgdmFsdWUgaW5zdGFuY2VvZiBCb29sZWFuKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS52YWx1ZU9mKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBWYWxpZGF0aW9uRXJyb3IgPSByZXF1aXJlKCcuLi9lcnJvci92YWxpZGF0aW9uX2Vycm9yJyk7XG52YXIgZ2V0VHlwZSA9IHJlcXVpcmUoJy4uL3V0aWwvZ2V0X3R5cGUnKTtcbnZhciBleHRlbmQgPSByZXF1aXJlKCcuLi91dGlsL2V4dGVuZCcpO1xuXG4vLyBNYWluIHJlY3Vyc2l2ZSB2YWxpZGF0aW9uIGZ1bmN0aW9uLiBUcmFja3M6XG4vL1xuLy8gLSBrZXk6IHN0cmluZyByZXByZXNlbnRpbmcgbG9jYXRpb24gb2YgdmFsaWRhdGlvbiBpbiBzdHlsZSB0cmVlLiBVc2VkIG9ubHlcbi8vICAgZm9yIG1vcmUgaW5mb3JtYXRpdmUgZXJyb3IgcmVwb3J0aW5nLlxuLy8gLSB2YWx1ZTogY3VycmVudCB2YWx1ZSBmcm9tIHN0eWxlIGJlaW5nIGV2YWx1YXRlZC4gTWF5IGJlIGFueXRoaW5nIGZyb20gYVxuLy8gICBoaWdoIGxldmVsIG9iamVjdCB0aGF0IG5lZWRzIHRvIGJlIGRlc2NlbmRlZCBpbnRvIGRlZXBlciBvciBhIHNpbXBsZVxuLy8gICBzY2FsYXIgdmFsdWUuXG4vLyAtIHZhbHVlU3BlYzogY3VycmVudCBzcGVjIGJlaW5nIGV2YWx1YXRlZC4gVHJhY2tzIHZhbHVlLlxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHZhbGlkYXRlKG9wdGlvbnMpIHtcblxuICAgIHZhciB2YWxpZGF0ZUZ1bmN0aW9uID0gcmVxdWlyZSgnLi92YWxpZGF0ZV9mdW5jdGlvbicpO1xuICAgIHZhciB2YWxpZGF0ZU9iamVjdCA9IHJlcXVpcmUoJy4vdmFsaWRhdGVfb2JqZWN0Jyk7XG4gICAgdmFyIFZBTElEQVRPUlMgPSB7XG4gICAgICAgICcqJzogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH0sXG4gICAgICAgICdhcnJheSc6IHJlcXVpcmUoJy4vdmFsaWRhdGVfYXJyYXknKSxcbiAgICAgICAgJ2Jvb2xlYW4nOiByZXF1aXJlKCcuL3ZhbGlkYXRlX2Jvb2xlYW4nKSxcbiAgICAgICAgJ251bWJlcic6IHJlcXVpcmUoJy4vdmFsaWRhdGVfbnVtYmVyJyksXG4gICAgICAgICdjb2xvcic6IHJlcXVpcmUoJy4vdmFsaWRhdGVfY29sb3InKSxcbiAgICAgICAgJ2NvbnN0YW50cyc6IHJlcXVpcmUoJy4vdmFsaWRhdGVfY29uc3RhbnRzJyksXG4gICAgICAgICdlbnVtJzogcmVxdWlyZSgnLi92YWxpZGF0ZV9lbnVtJyksXG4gICAgICAgICdmaWx0ZXInOiByZXF1aXJlKCcuL3ZhbGlkYXRlX2ZpbHRlcicpLFxuICAgICAgICAnZnVuY3Rpb24nOiByZXF1aXJlKCcuL3ZhbGlkYXRlX2Z1bmN0aW9uJyksXG4gICAgICAgICdsYXllcic6IHJlcXVpcmUoJy4vdmFsaWRhdGVfbGF5ZXInKSxcbiAgICAgICAgJ29iamVjdCc6IHJlcXVpcmUoJy4vdmFsaWRhdGVfb2JqZWN0JyksXG4gICAgICAgICdzb3VyY2UnOiByZXF1aXJlKCcuL3ZhbGlkYXRlX3NvdXJjZScpLFxuICAgICAgICAnbGlnaHQnOiByZXF1aXJlKCcuL3ZhbGlkYXRlX2xpZ2h0JyksXG4gICAgICAgICdzdHJpbmcnOiByZXF1aXJlKCcuL3ZhbGlkYXRlX3N0cmluZycpXG4gICAgfTtcblxuICAgIHZhciB2YWx1ZSA9IG9wdGlvbnMudmFsdWU7XG4gICAgdmFyIHZhbHVlU3BlYyA9IG9wdGlvbnMudmFsdWVTcGVjO1xuICAgIHZhciBrZXkgPSBvcHRpb25zLmtleTtcbiAgICB2YXIgc3R5bGVTcGVjID0gb3B0aW9ucy5zdHlsZVNwZWM7XG4gICAgdmFyIHN0eWxlID0gb3B0aW9ucy5zdHlsZTtcblxuICAgIGlmIChnZXRUeXBlKHZhbHVlKSA9PT0gJ3N0cmluZycgJiYgdmFsdWVbMF0gPT09ICdAJykge1xuICAgICAgICBpZiAoc3R5bGVTcGVjLiR2ZXJzaW9uID4gNykge1xuICAgICAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsICdjb25zdGFudHMgaGF2ZSBiZWVuIGRlcHJlY2F0ZWQgYXMgb2YgdjgnKV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEodmFsdWUgaW4gc3R5bGUuY29uc3RhbnRzKSkge1xuICAgICAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsICdjb25zdGFudCBcIiVzXCIgbm90IGZvdW5kJywgdmFsdWUpXTtcbiAgICAgICAgfVxuICAgICAgICBvcHRpb25zID0gZXh0ZW5kKHt9LCBvcHRpb25zLCB7IHZhbHVlOiBzdHlsZS5jb25zdGFudHNbdmFsdWVdIH0pO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZVNwZWMuZnVuY3Rpb24gJiYgZ2V0VHlwZSh2YWx1ZSkgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiB2YWxpZGF0ZUZ1bmN0aW9uKG9wdGlvbnMpO1xuXG4gICAgfSBlbHNlIGlmICh2YWx1ZVNwZWMudHlwZSAmJiBWQUxJREFUT1JTW3ZhbHVlU3BlYy50eXBlXSkge1xuICAgICAgICByZXR1cm4gVkFMSURBVE9SU1t2YWx1ZVNwZWMudHlwZV0ob3B0aW9ucyk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdmFsaWRhdGVPYmplY3QoZXh0ZW5kKHt9LCBvcHRpb25zLCB7XG4gICAgICAgICAgICB2YWx1ZVNwZWM6IHZhbHVlU3BlYy50eXBlID8gc3R5bGVTcGVjW3ZhbHVlU3BlYy50eXBlXSA6IHZhbHVlU3BlY1xuICAgICAgICB9KSk7XG4gICAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGdldFR5cGUgPSByZXF1aXJlKCcuLi91dGlsL2dldF90eXBlJyk7XG52YXIgdmFsaWRhdGUgPSByZXF1aXJlKCcuL3ZhbGlkYXRlJyk7XG52YXIgVmFsaWRhdGlvbkVycm9yID0gcmVxdWlyZSgnLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHZhbGlkYXRlQXJyYXkob3B0aW9ucykge1xuICAgIHZhciBhcnJheSA9IG9wdGlvbnMudmFsdWU7XG4gICAgdmFyIGFycmF5U3BlYyA9IG9wdGlvbnMudmFsdWVTcGVjO1xuICAgIHZhciBzdHlsZSA9IG9wdGlvbnMuc3R5bGU7XG4gICAgdmFyIHN0eWxlU3BlYyA9IG9wdGlvbnMuc3R5bGVTcGVjO1xuICAgIHZhciBrZXkgPSBvcHRpb25zLmtleTtcbiAgICB2YXIgdmFsaWRhdGVBcnJheUVsZW1lbnQgPSBvcHRpb25zLmFycmF5RWxlbWVudFZhbGlkYXRvciB8fCB2YWxpZGF0ZTtcblxuICAgIGlmIChnZXRUeXBlKGFycmF5KSAhPT0gJ2FycmF5Jykge1xuICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCBhcnJheSwgJ2FycmF5IGV4cGVjdGVkLCAlcyBmb3VuZCcsIGdldFR5cGUoYXJyYXkpKV07XG4gICAgfVxuXG4gICAgaWYgKGFycmF5U3BlYy5sZW5ndGggJiYgYXJyYXkubGVuZ3RoICE9PSBhcnJheVNwZWMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihrZXksIGFycmF5LCAnYXJyYXkgbGVuZ3RoICVkIGV4cGVjdGVkLCBsZW5ndGggJWQgZm91bmQnLCBhcnJheVNwZWMubGVuZ3RoLCBhcnJheS5sZW5ndGgpXTtcbiAgICB9XG5cbiAgICBpZiAoYXJyYXlTcGVjWydtaW4tbGVuZ3RoJ10gJiYgYXJyYXkubGVuZ3RoIDwgYXJyYXlTcGVjWydtaW4tbGVuZ3RoJ10pIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgYXJyYXksICdhcnJheSBsZW5ndGggYXQgbGVhc3QgJWQgZXhwZWN0ZWQsIGxlbmd0aCAlZCBmb3VuZCcsIGFycmF5U3BlY1snbWluLWxlbmd0aCddLCBhcnJheS5sZW5ndGgpXTtcbiAgICB9XG5cbiAgICB2YXIgYXJyYXlFbGVtZW50U3BlYyA9IHtcbiAgICAgICAgXCJ0eXBlXCI6IGFycmF5U3BlYy52YWx1ZVxuICAgIH07XG5cbiAgICBpZiAoc3R5bGVTcGVjLiR2ZXJzaW9uIDwgNykge1xuICAgICAgICBhcnJheUVsZW1lbnRTcGVjLmZ1bmN0aW9uID0gYXJyYXlTcGVjLmZ1bmN0aW9uO1xuICAgIH1cblxuICAgIGlmIChnZXRUeXBlKGFycmF5U3BlYy52YWx1ZSkgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGFycmF5RWxlbWVudFNwZWMgPSBhcnJheVNwZWMudmFsdWU7XG4gICAgfVxuXG4gICAgdmFyIGVycm9ycyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdCh2YWxpZGF0ZUFycmF5RWxlbWVudCh7XG4gICAgICAgICAgICBhcnJheTogYXJyYXksXG4gICAgICAgICAgICBhcnJheUluZGV4OiBpLFxuICAgICAgICAgICAgdmFsdWU6IGFycmF5W2ldLFxuICAgICAgICAgICAgdmFsdWVTcGVjOiBhcnJheUVsZW1lbnRTcGVjLFxuICAgICAgICAgICAgc3R5bGU6IHN0eWxlLFxuICAgICAgICAgICAgc3R5bGVTcGVjOiBzdHlsZVNwZWMsXG4gICAgICAgICAgICBrZXk6IGtleSArICdbJyArIGkgKyAnXSdcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICByZXR1cm4gZXJyb3JzO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGdldFR5cGUgPSByZXF1aXJlKCcuLi91dGlsL2dldF90eXBlJyk7XG52YXIgVmFsaWRhdGlvbkVycm9yID0gcmVxdWlyZSgnLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHZhbGlkYXRlQm9vbGVhbihvcHRpb25zKSB7XG4gICAgdmFyIHZhbHVlID0gb3B0aW9ucy52YWx1ZTtcbiAgICB2YXIga2V5ID0gb3B0aW9ucy5rZXk7XG4gICAgdmFyIHR5cGUgPSBnZXRUeXBlKHZhbHVlKTtcblxuICAgIGlmICh0eXBlICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsICdib29sZWFuIGV4cGVjdGVkLCAlcyBmb3VuZCcsIHR5cGUpXTtcbiAgICB9XG5cbiAgICByZXR1cm4gW107XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVmFsaWRhdGlvbkVycm9yID0gcmVxdWlyZSgnLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvcicpO1xudmFyIGdldFR5cGUgPSByZXF1aXJlKCcuLi91dGlsL2dldF90eXBlJyk7XG52YXIgcGFyc2VDU1NDb2xvciA9IHJlcXVpcmUoJ2Nzc2NvbG9ycGFyc2VyJykucGFyc2VDU1NDb2xvcjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB2YWxpZGF0ZUNvbG9yKG9wdGlvbnMpIHtcbiAgICB2YXIga2V5ID0gb3B0aW9ucy5rZXk7XG4gICAgdmFyIHZhbHVlID0gb3B0aW9ucy52YWx1ZTtcbiAgICB2YXIgdHlwZSA9IGdldFR5cGUodmFsdWUpO1xuXG4gICAgaWYgKHR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCAnY29sb3IgZXhwZWN0ZWQsICVzIGZvdW5kJywgdHlwZSldO1xuICAgIH1cblxuICAgIGlmIChwYXJzZUNTU0NvbG9yKHZhbHVlKSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSwgJ2NvbG9yIGV4cGVjdGVkLCBcIiVzXCIgZm91bmQnLCB2YWx1ZSldO1xuICAgIH1cblxuICAgIHJldHVybiBbXTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBWYWxpZGF0aW9uRXJyb3IgPSByZXF1aXJlKCcuLi9lcnJvci92YWxpZGF0aW9uX2Vycm9yJyk7XG52YXIgZ2V0VHlwZSA9IHJlcXVpcmUoJy4uL3V0aWwvZ2V0X3R5cGUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB2YWxpZGF0ZUNvbnN0YW50cyhvcHRpb25zKSB7XG4gICAgdmFyIGtleSA9IG9wdGlvbnMua2V5O1xuICAgIHZhciBjb25zdGFudHMgPSBvcHRpb25zLnZhbHVlO1xuICAgIHZhciBzdHlsZVNwZWMgPSBvcHRpb25zLnN0eWxlU3BlYztcblxuICAgIGlmIChzdHlsZVNwZWMuJHZlcnNpb24gPiA3KSB7XG4gICAgICAgIGlmIChjb25zdGFudHMpIHtcbiAgICAgICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihrZXksIGNvbnN0YW50cywgJ2NvbnN0YW50cyBoYXZlIGJlZW4gZGVwcmVjYXRlZCBhcyBvZiB2OCcpXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciB0eXBlID0gZ2V0VHlwZShjb25zdGFudHMpO1xuICAgICAgICBpZiAodHlwZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihrZXksIGNvbnN0YW50cywgJ29iamVjdCBleHBlY3RlZCwgJXMgZm91bmQnLCB0eXBlKV07XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZXJyb3JzID0gW107XG4gICAgICAgIGZvciAodmFyIGNvbnN0YW50TmFtZSBpbiBjb25zdGFudHMpIHtcbiAgICAgICAgICAgIGlmIChjb25zdGFudE5hbWVbMF0gIT09ICdAJykge1xuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5ICsgJy4nICsgY29uc3RhbnROYW1lLCBjb25zdGFudHNbY29uc3RhbnROYW1lXSwgJ2NvbnN0YW50cyBtdXN0IHN0YXJ0IHdpdGggXCJAXCInKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVycm9ycztcbiAgICB9XG5cbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBWYWxpZGF0aW9uRXJyb3IgPSByZXF1aXJlKCcuLi9lcnJvci92YWxpZGF0aW9uX2Vycm9yJyk7XG52YXIgdW5idW5kbGUgPSByZXF1aXJlKCcuLi91dGlsL3VuYnVuZGxlX2pzb25saW50Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gdmFsaWRhdGVFbnVtKG9wdGlvbnMpIHtcbiAgICB2YXIga2V5ID0gb3B0aW9ucy5rZXk7XG4gICAgdmFyIHZhbHVlID0gb3B0aW9ucy52YWx1ZTtcbiAgICB2YXIgdmFsdWVTcGVjID0gb3B0aW9ucy52YWx1ZVNwZWM7XG4gICAgdmFyIGVycm9ycyA9IFtdO1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWVTcGVjLnZhbHVlcykpIHsgLy8gPD12N1xuICAgICAgICBpZiAodmFsdWVTcGVjLnZhbHVlcy5pbmRleE9mKHVuYnVuZGxlKHZhbHVlKSkgPT09IC0xKSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsICdleHBlY3RlZCBvbmUgb2YgWyVzXSwgJXMgZm91bmQnLCB2YWx1ZVNwZWMudmFsdWVzLmpvaW4oJywgJyksIHZhbHVlKSk7XG4gICAgICAgIH1cbiAgICB9IGVsc2UgeyAvLyA+PXY4XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyh2YWx1ZVNwZWMudmFsdWVzKS5pbmRleE9mKHVuYnVuZGxlKHZhbHVlKSkgPT09IC0xKSB7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsICdleHBlY3RlZCBvbmUgb2YgWyVzXSwgJXMgZm91bmQnLCBPYmplY3Qua2V5cyh2YWx1ZVNwZWMudmFsdWVzKS5qb2luKCcsICcpLCB2YWx1ZSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBlcnJvcnM7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVmFsaWRhdGlvbkVycm9yID0gcmVxdWlyZSgnLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvcicpO1xudmFyIHZhbGlkYXRlRW51bSA9IHJlcXVpcmUoJy4vdmFsaWRhdGVfZW51bScpO1xudmFyIGdldFR5cGUgPSByZXF1aXJlKCcuLi91dGlsL2dldF90eXBlJyk7XG52YXIgdW5idW5kbGUgPSByZXF1aXJlKCcuLi91dGlsL3VuYnVuZGxlX2pzb25saW50Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gdmFsaWRhdGVGaWx0ZXIob3B0aW9ucykge1xuICAgIHZhciB2YWx1ZSA9IG9wdGlvbnMudmFsdWU7XG4gICAgdmFyIGtleSA9IG9wdGlvbnMua2V5O1xuICAgIHZhciBzdHlsZVNwZWMgPSBvcHRpb25zLnN0eWxlU3BlYztcbiAgICB2YXIgdHlwZTtcblxuICAgIHZhciBlcnJvcnMgPSBbXTtcblxuICAgIGlmIChnZXRUeXBlKHZhbHVlKSAhPT0gJ2FycmF5Jykge1xuICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSwgJ2FycmF5IGV4cGVjdGVkLCAlcyBmb3VuZCcsIGdldFR5cGUodmFsdWUpKV07XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlLmxlbmd0aCA8IDEpIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsICdmaWx0ZXIgYXJyYXkgbXVzdCBoYXZlIGF0IGxlYXN0IDEgZWxlbWVudCcpXTtcbiAgICB9XG5cbiAgICBlcnJvcnMgPSBlcnJvcnMuY29uY2F0KHZhbGlkYXRlRW51bSh7XG4gICAgICAgIGtleToga2V5ICsgJ1swXScsXG4gICAgICAgIHZhbHVlOiB2YWx1ZVswXSxcbiAgICAgICAgdmFsdWVTcGVjOiBzdHlsZVNwZWMuZmlsdGVyX29wZXJhdG9yLFxuICAgICAgICBzdHlsZTogb3B0aW9ucy5zdHlsZSxcbiAgICAgICAgc3R5bGVTcGVjOiBvcHRpb25zLnN0eWxlU3BlY1xuICAgIH0pKTtcblxuICAgIHN3aXRjaCAodW5idW5kbGUodmFsdWVbMF0pKSB7XG4gICAgICAgIGNhc2UgJzwnOlxuICAgICAgICBjYXNlICc8PSc6XG4gICAgICAgIGNhc2UgJz4nOlxuICAgICAgICBjYXNlICc+PSc6XG4gICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoID49IDIgJiYgdmFsdWVbMV0gPT0gJyR0eXBlJykge1xuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSwgJ1wiJHR5cGVcIiBjYW5ub3QgYmUgdXNlIHdpdGggb3BlcmF0b3IgXCIlc1wiJywgdmFsdWVbMF0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgICBjYXNlICc9PSc6XG4gICAgICAgIGNhc2UgJyE9JzpcbiAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggIT0gMykge1xuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSwgJ2ZpbHRlciBhcnJheSBmb3Igb3BlcmF0b3IgXCIlc1wiIG11c3QgaGF2ZSAzIGVsZW1lbnRzJywgdmFsdWVbMF0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgICBjYXNlICdpbic6XG4gICAgICAgIGNhc2UgJyFpbic6XG4gICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoID49IDIpIHtcbiAgICAgICAgICAgICAgICB0eXBlID0gZ2V0VHlwZSh2YWx1ZVsxXSk7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5ICsgJ1sxXScsIHZhbHVlWzFdLCAnc3RyaW5nIGV4cGVjdGVkLCAlcyBmb3VuZCcsIHR5cGUpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlWzFdWzBdID09PSAnQCcpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXkgKyAnWzFdJywgdmFsdWVbMV0sICdmaWx0ZXIga2V5IGNhbm5vdCBiZSBhIGNvbnN0YW50JykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAyOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0eXBlID0gZ2V0VHlwZSh2YWx1ZVtpXSk7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlWzFdID09ICckdHlwZScpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdCh2YWxpZGF0ZUVudW0oe1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBrZXkgKyAnWycgKyBpICsgJ10nLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlW2ldLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTcGVjOiBzdHlsZVNwZWMuZ2VvbWV0cnlfdHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlOiBvcHRpb25zLnN0eWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVTcGVjOiBvcHRpb25zLnN0eWxlU3BlY1xuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnc3RyaW5nJyAmJiB2YWx1ZVtpXVswXSA9PT0gJ0AnKSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5ICsgJ1snICsgaSArICddJywgdmFsdWVbaV0sICdmaWx0ZXIgdmFsdWUgY2Fubm90IGJlIGEgY29uc3RhbnQnKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlICE9PSAnc3RyaW5nJyAmJiB0eXBlICE9PSAnbnVtYmVyJyAmJiB0eXBlICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXkgKyAnWycgKyBpICsgJ10nLCB2YWx1ZVtpXSwgJ3N0cmluZywgbnVtYmVyLCBvciBib29sZWFuIGV4cGVjdGVkLCAlcyBmb3VuZCcsIHR5cGUpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdhbnknOlxuICAgICAgICBjYXNlICdhbGwnOlxuICAgICAgICBjYXNlICdub25lJzpcbiAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGVycm9ycyA9IGVycm9ycy5jb25jYXQodmFsaWRhdGVGaWx0ZXIoe1xuICAgICAgICAgICAgICAgICAgICBrZXk6IGtleSArICdbJyArIGkgKyAnXScsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZVtpXSxcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU6IG9wdGlvbnMuc3R5bGUsXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlU3BlYzogb3B0aW9ucy5zdHlsZVNwZWNcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdoYXMnOlxuICAgICAgICBjYXNlICchaGFzJzpcbiAgICAgICAgICAgIHR5cGUgPSBnZXRUeXBlKHZhbHVlWzFdKTtcbiAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggIT09IDIpIHtcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsICdmaWx0ZXIgYXJyYXkgZm9yIFwiJXNcIiBvcGVyYXRvciBtdXN0IGhhdmUgMiBlbGVtZW50cycsIHZhbHVlWzBdKSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXkgKyAnWzFdJywgdmFsdWVbMV0sICdzdHJpbmcgZXhwZWN0ZWQsICVzIGZvdW5kJywgdHlwZSkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZVsxXVswXSA9PT0gJ0AnKSB7XG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXkgKyAnWzFdJywgdmFsdWVbMV0sICdmaWx0ZXIga2V5IGNhbm5vdCBiZSBhIGNvbnN0YW50JykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICB9XG5cbiAgICByZXR1cm4gZXJyb3JzO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFZhbGlkYXRpb25FcnJvciA9IHJlcXVpcmUoJy4uL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3InKTtcbnZhciBnZXRUeXBlID0gcmVxdWlyZSgnLi4vdXRpbC9nZXRfdHlwZScpO1xudmFyIHZhbGlkYXRlID0gcmVxdWlyZSgnLi92YWxpZGF0ZScpO1xudmFyIHZhbGlkYXRlT2JqZWN0ID0gcmVxdWlyZSgnLi92YWxpZGF0ZV9vYmplY3QnKTtcbnZhciB2YWxpZGF0ZUFycmF5ID0gcmVxdWlyZSgnLi92YWxpZGF0ZV9hcnJheScpO1xudmFyIHZhbGlkYXRlTnVtYmVyID0gcmVxdWlyZSgnLi92YWxpZGF0ZV9udW1iZXInKTtcbnZhciB1bmJ1bmRsZSA9IHJlcXVpcmUoJy4uL3V0aWwvdW5idW5kbGVfanNvbmxpbnQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB2YWxpZGF0ZUZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICB2YXIgZnVuY3Rpb25WYWx1ZVNwZWMgPSBvcHRpb25zLnZhbHVlU3BlYztcbiAgICB2YXIgZnVuY3Rpb25UeXBlID0gdW5idW5kbGUob3B0aW9ucy52YWx1ZS50eXBlKTtcbiAgICB2YXIgc3RvcEtleVR5cGU7XG4gICAgdmFyIHN0b3BEb21haW5WYWx1ZXMgPSB7fTtcbiAgICB2YXIgcHJldmlvdXNTdG9wRG9tYWluVmFsdWU7XG4gICAgdmFyIHByZXZpb3VzU3RvcERvbWFpblpvb207XG5cbiAgICB2YXIgaXNab29tRnVuY3Rpb24gPSBmdW5jdGlvblR5cGUgIT09ICdjYXRlZ29yaWNhbCcgJiYgb3B0aW9ucy52YWx1ZS5wcm9wZXJ0eSA9PT0gdW5kZWZpbmVkO1xuICAgIHZhciBpc1Byb3BlcnR5RnVuY3Rpb24gPSAhaXNab29tRnVuY3Rpb247XG4gICAgdmFyIGlzWm9vbUFuZFByb3BlcnR5RnVuY3Rpb24gPVxuICAgICAgICBnZXRUeXBlKG9wdGlvbnMudmFsdWUuc3RvcHMpID09PSAnYXJyYXknICYmXG4gICAgICAgIGdldFR5cGUob3B0aW9ucy52YWx1ZS5zdG9wc1swXSkgPT09ICdhcnJheScgJiZcbiAgICAgICAgZ2V0VHlwZShvcHRpb25zLnZhbHVlLnN0b3BzWzBdWzBdKSA9PT0gJ29iamVjdCc7XG5cbiAgICB2YXIgZXJyb3JzID0gdmFsaWRhdGVPYmplY3Qoe1xuICAgICAgICBrZXk6IG9wdGlvbnMua2V5LFxuICAgICAgICB2YWx1ZTogb3B0aW9ucy52YWx1ZSxcbiAgICAgICAgdmFsdWVTcGVjOiBvcHRpb25zLnN0eWxlU3BlYy5mdW5jdGlvbixcbiAgICAgICAgc3R5bGU6IG9wdGlvbnMuc3R5bGUsXG4gICAgICAgIHN0eWxlU3BlYzogb3B0aW9ucy5zdHlsZVNwZWMsXG4gICAgICAgIG9iamVjdEVsZW1lbnRWYWxpZGF0b3JzOiB7IHN0b3BzOiB2YWxpZGF0ZUZ1bmN0aW9uU3RvcHMgfVxuICAgIH0pO1xuXG4gICAgaWYgKGZ1bmN0aW9uVHlwZSAhPT0gJ2lkZW50aXR5JyAmJiAhb3B0aW9ucy52YWx1ZS5zdG9wcykge1xuICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKG9wdGlvbnMua2V5LCBvcHRpb25zLnZhbHVlLCAnbWlzc2luZyByZXF1aXJlZCBwcm9wZXJ0eSBcInN0b3BzXCInKSk7XG4gICAgfVxuXG4gICAgaWYgKGZ1bmN0aW9uVHlwZSA9PT0gJ2V4cG9uZW50aWFsJyAmJiBvcHRpb25zLnZhbHVlU3BlY1snZnVuY3Rpb24nXSA9PT0gJ3BpZWNld2lzZS1jb25zdGFudCcpIHtcbiAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgb3B0aW9ucy52YWx1ZSwgJ2V4cG9uZW50aWFsIGZ1bmN0aW9ucyBub3Qgc3VwcG9ydGVkJykpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnN0eWxlU3BlYy4kdmVyc2lvbiA+PSA4KSB7XG4gICAgICAgaWYgKGlzUHJvcGVydHlGdW5jdGlvbiAmJiAhb3B0aW9ucy52YWx1ZVNwZWNbJ3Byb3BlcnR5LWZ1bmN0aW9uJ10pIHtcbiAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgb3B0aW9ucy52YWx1ZSwgJ3Byb3BlcnR5IGZ1bmN0aW9ucyBub3Qgc3VwcG9ydGVkJykpO1xuICAgICAgIH0gZWxzZSBpZiAoaXNab29tRnVuY3Rpb24gJiYgIW9wdGlvbnMudmFsdWVTcGVjWyd6b29tLWZ1bmN0aW9uJ10pIHtcbiAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgb3B0aW9ucy52YWx1ZSwgJ3pvb20gZnVuY3Rpb25zIG5vdCBzdXBwb3J0ZWQnKSk7XG4gICAgICAgfVxuICAgIH1cblxuICAgIGlmICgoZnVuY3Rpb25UeXBlID09PSAnY2F0ZWdvcmljYWwnIHx8IGlzWm9vbUFuZFByb3BlcnR5RnVuY3Rpb24pICYmIG9wdGlvbnMudmFsdWUucHJvcGVydHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKG9wdGlvbnMua2V5LCBvcHRpb25zLnZhbHVlLCAnXCJwcm9wZXJ0eVwiIHByb3BlcnR5IGlzIHJlcXVpcmVkJykpO1xuICAgIH1cblxuICAgIHJldHVybiBlcnJvcnM7XG5cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZUZ1bmN0aW9uU3RvcHMob3B0aW9ucykge1xuICAgICAgICBpZiAoZnVuY3Rpb25UeXBlID09PSAnaWRlbnRpdHknKSB7XG4gICAgICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Iob3B0aW9ucy5rZXksIG9wdGlvbnMudmFsdWUsICdpZGVudGl0eSBmdW5jdGlvbiBtYXkgbm90IGhhdmUgYSBcInN0b3BzXCIgcHJvcGVydHknKV07XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZXJyb3JzID0gW107XG4gICAgICAgIHZhciB2YWx1ZSA9IG9wdGlvbnMudmFsdWU7XG5cbiAgICAgICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdCh2YWxpZGF0ZUFycmF5KHtcbiAgICAgICAgICAgIGtleTogb3B0aW9ucy5rZXksXG4gICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgICB2YWx1ZVNwZWM6IG9wdGlvbnMudmFsdWVTcGVjLFxuICAgICAgICAgICAgc3R5bGU6IG9wdGlvbnMuc3R5bGUsXG4gICAgICAgICAgICBzdHlsZVNwZWM6IG9wdGlvbnMuc3R5bGVTcGVjLFxuICAgICAgICAgICAgYXJyYXlFbGVtZW50VmFsaWRhdG9yOiB2YWxpZGF0ZUZ1bmN0aW9uU3RvcFxuICAgICAgICB9KSk7XG5cbiAgICAgICAgaWYgKGdldFR5cGUodmFsdWUpID09PSAnYXJyYXknICYmIHZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgdmFsdWUsICdhcnJheSBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIHN0b3AnKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZXJyb3JzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHZhbGlkYXRlRnVuY3Rpb25TdG9wKG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIGVycm9ycyA9IFtdO1xuICAgICAgICB2YXIgdmFsdWUgPSBvcHRpb25zLnZhbHVlO1xuICAgICAgICB2YXIga2V5ID0gb3B0aW9ucy5rZXk7XG5cbiAgICAgICAgaWYgKGdldFR5cGUodmFsdWUpICE9PSAnYXJyYXknKSB7XG4gICAgICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSwgJ2FycmF5IGV4cGVjdGVkLCAlcyBmb3VuZCcsIGdldFR5cGUodmFsdWUpKV07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWUubGVuZ3RoICE9PSAyKSB7XG4gICAgICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSwgJ2FycmF5IGxlbmd0aCAlZCBleHBlY3RlZCwgbGVuZ3RoICVkIGZvdW5kJywgMiwgdmFsdWUubGVuZ3RoKV07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNab29tQW5kUHJvcGVydHlGdW5jdGlvbikge1xuICAgICAgICAgICAgaWYgKGdldFR5cGUodmFsdWVbMF0pICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCAnb2JqZWN0IGV4cGVjdGVkLCAlcyBmb3VuZCcsIGdldFR5cGUodmFsdWVbMF0pKV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodmFsdWVbMF0uem9vbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsICdvYmplY3Qgc3RvcCBrZXkgbXVzdCBoYXZlIHpvb20nKV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodmFsdWVbMF0udmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCAnb2JqZWN0IHN0b3Aga2V5IG11c3QgaGF2ZSB2YWx1ZScpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwcmV2aW91c1N0b3BEb21haW5ab29tICYmIHByZXZpb3VzU3RvcERvbWFpblpvb20gPiB1bmJ1bmRsZSh2YWx1ZVswXS56b29tKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlWzBdLnpvb20sICdzdG9wIHpvb20gdmFsdWVzIG11c3QgYXBwZWFyIGluIGFzY2VuZGluZyBvcmRlcicpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh1bmJ1bmRsZSh2YWx1ZVswXS56b29tKSAhPT0gcHJldmlvdXNTdG9wRG9tYWluWm9vbSkge1xuICAgICAgICAgICAgICAgIHByZXZpb3VzU3RvcERvbWFpblpvb20gPSB1bmJ1bmRsZSh2YWx1ZVswXS56b29tKTtcbiAgICAgICAgICAgICAgICBwcmV2aW91c1N0b3BEb21haW5WYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVycm9ycyA9IGVycm9ycy5jb25jYXQodmFsaWRhdGVPYmplY3Qoe1xuICAgICAgICAgICAgICAgIGtleToga2V5ICsgJ1swXScsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlWzBdLFxuICAgICAgICAgICAgICAgIHZhbHVlU3BlYzogeyB6b29tOiB7fSB9LFxuICAgICAgICAgICAgICAgIHN0eWxlOiBvcHRpb25zLnN0eWxlLFxuICAgICAgICAgICAgICAgIHN0eWxlU3BlYzogb3B0aW9ucy5zdHlsZVNwZWMsXG4gICAgICAgICAgICAgICAgb2JqZWN0RWxlbWVudFZhbGlkYXRvcnM6IHsgem9vbTogdmFsaWRhdGVOdW1iZXIsIHZhbHVlOiB2YWxpZGF0ZVN0b3BEb21haW5WYWx1ZSB9XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlcnJvcnMgPSBlcnJvcnMuY29uY2F0KHZhbGlkYXRlU3RvcERvbWFpblZhbHVlKHtcbiAgICAgICAgICAgICAgICBrZXk6IGtleSArICdbMF0nLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZVswXSxcbiAgICAgICAgICAgICAgICB2YWx1ZVNwZWM6IHt9LFxuICAgICAgICAgICAgICAgIHN0eWxlOiBvcHRpb25zLnN0eWxlLFxuICAgICAgICAgICAgICAgIHN0eWxlU3BlYzogb3B0aW9ucy5zdHlsZVNwZWNcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVycm9ycyA9IGVycm9ycy5jb25jYXQodmFsaWRhdGUoe1xuICAgICAgICAgICAga2V5OiBrZXkgKyAnWzFdJyxcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZVsxXSxcbiAgICAgICAgICAgIHZhbHVlU3BlYzogZnVuY3Rpb25WYWx1ZVNwZWMsXG4gICAgICAgICAgICBzdHlsZTogb3B0aW9ucy5zdHlsZSxcbiAgICAgICAgICAgIHN0eWxlU3BlYzogb3B0aW9ucy5zdHlsZVNwZWNcbiAgICAgICAgfSkpO1xuXG4gICAgICAgIGlmIChnZXRUeXBlKHZhbHVlWzBdKSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIGlmIChmdW5jdGlvblZhbHVlU3BlYy5mdW5jdGlvbiA9PT0gJ3BpZWNld2lzZS1jb25zdGFudCcgJiYgdmFsdWVbMF0gJSAxICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXkgKyAnWzBdJywgdmFsdWVbMF0sICd6b29tIGxldmVsIGZvciBwaWVjZXdpc2UtY29uc3RhbnQgZnVuY3Rpb25zIG11c3QgYmUgYW4gaW50ZWdlcicpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlcnJvcnM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdmFsaWRhdGVTdG9wRG9tYWluVmFsdWUob3B0aW9ucykge1xuICAgICAgICB2YXIgdHlwZSA9IGdldFR5cGUob3B0aW9ucy52YWx1ZSk7XG4gICAgICAgIHZhciB2YWx1ZSA9IHVuYnVuZGxlKG9wdGlvbnMudmFsdWUpO1xuXG4gICAgICAgIGlmICghc3RvcEtleVR5cGUpIHtcbiAgICAgICAgICAgIHN0b3BLZXlUeXBlID0gdHlwZTtcbiAgICAgICAgICAgIGlmICghZnVuY3Rpb25UeXBlICYmIHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgZnVuY3Rpb25UeXBlID0gJ2NhdGVnb3JpY2FsJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0eXBlICE9PSBzdG9wS2V5VHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKG9wdGlvbnMua2V5LCBvcHRpb25zLnZhbHVlLCAnJXMgc3RvcCBkb21haW4gdHlwZSBtdXN0IG1hdGNoIHByZXZpb3VzIHN0b3AgZG9tYWluIHR5cGUgJXMnLCB0eXBlLCBzdG9wS2V5VHlwZSldO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGUgIT09ICdudW1iZXInICYmIHR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Iob3B0aW9ucy5rZXksIG9wdGlvbnMudmFsdWUsICdwcm9wZXJ0eSB2YWx1ZSBtdXN0IGJlIGEgbnVtYmVyIG9yIHN0cmluZycpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlICE9PSAnbnVtYmVyJyAmJiBmdW5jdGlvblR5cGUgIT09ICdjYXRlZ29yaWNhbCcpIHtcbiAgICAgICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgb3B0aW9ucy52YWx1ZSwgJ251bWJlciBleHBlY3RlZCwgJXMgZm91bmQnLCB0eXBlKV07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZnVuY3Rpb25UeXBlID09PSAnY2F0ZWdvcmljYWwnICYmIHR5cGUgPT09ICdudW1iZXInICYmICghaXNGaW5pdGUodmFsdWUpIHx8IE1hdGguZmxvb3IodmFsdWUpICE9PSB2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgb3B0aW9ucy52YWx1ZSwgJ2ludGVnZXIgZXhwZWN0ZWQsIGZvdW5kICVzJywgdmFsdWUpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlID09PSAnbnVtYmVyJyAmJiBwcmV2aW91c1N0b3BEb21haW5WYWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlIDwgcHJldmlvdXNTdG9wRG9tYWluVmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihvcHRpb25zLmtleSwgb3B0aW9ucy52YWx1ZSwgJ3N0b3AgZG9tYWluIHZhbHVlcyBtdXN0IGFwcGVhciBpbiBhc2NlbmRpbmcgb3JkZXInKV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwcmV2aW91c1N0b3BEb21haW5WYWx1ZSA9IHZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZ1bmN0aW9uVHlwZSA9PT0gJ2NhdGVnb3JpY2FsJyAmJiB2YWx1ZSBpbiBzdG9wRG9tYWluVmFsdWVzKSB7XG4gICAgICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Iob3B0aW9ucy5rZXksIG9wdGlvbnMudmFsdWUsICdzdG9wIGRvbWFpbiB2YWx1ZXMgbXVzdCBiZSB1bmlxdWUnKV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdG9wRG9tYWluVmFsdWVzW3ZhbHVlXSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVmFsaWRhdGlvbkVycm9yID0gcmVxdWlyZSgnLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvcicpO1xudmFyIHZhbGlkYXRlU3RyaW5nID0gcmVxdWlyZSgnLi92YWxpZGF0ZV9zdHJpbmcnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgdmFyIHZhbHVlID0gb3B0aW9ucy52YWx1ZTtcbiAgICB2YXIga2V5ID0gb3B0aW9ucy5rZXk7XG5cbiAgICB2YXIgZXJyb3JzID0gdmFsaWRhdGVTdHJpbmcob3B0aW9ucyk7XG4gICAgaWYgKGVycm9ycy5sZW5ndGgpIHJldHVybiBlcnJvcnM7XG5cbiAgICBpZiAodmFsdWUuaW5kZXhPZigne2ZvbnRzdGFja30nKSA9PT0gLTEpIHtcbiAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIHZhbHVlLCAnXCJnbHlwaHNcIiB1cmwgbXVzdCBpbmNsdWRlIGEgXCJ7Zm9udHN0YWNrfVwiIHRva2VuJykpO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZS5pbmRleE9mKCd7cmFuZ2V9JykgPT09IC0xKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSwgJ1wiZ2x5cGhzXCIgdXJsIG11c3QgaW5jbHVkZSBhIFwie3JhbmdlfVwiIHRva2VuJykpO1xuICAgIH1cblxuICAgIHJldHVybiBlcnJvcnM7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVmFsaWRhdGlvbkVycm9yID0gcmVxdWlyZSgnLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvcicpO1xudmFyIHVuYnVuZGxlID0gcmVxdWlyZSgnLi4vdXRpbC91bmJ1bmRsZV9qc29ubGludCcpO1xudmFyIHZhbGlkYXRlT2JqZWN0ID0gcmVxdWlyZSgnLi92YWxpZGF0ZV9vYmplY3QnKTtcbnZhciB2YWxpZGF0ZUZpbHRlciA9IHJlcXVpcmUoJy4vdmFsaWRhdGVfZmlsdGVyJyk7XG52YXIgdmFsaWRhdGVQYWludFByb3BlcnR5ID0gcmVxdWlyZSgnLi92YWxpZGF0ZV9wYWludF9wcm9wZXJ0eScpO1xudmFyIHZhbGlkYXRlTGF5b3V0UHJvcGVydHkgPSByZXF1aXJlKCcuL3ZhbGlkYXRlX2xheW91dF9wcm9wZXJ0eScpO1xudmFyIGV4dGVuZCA9IHJlcXVpcmUoJy4uL3V0aWwvZXh0ZW5kJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gdmFsaWRhdGVMYXllcihvcHRpb25zKSB7XG4gICAgdmFyIGVycm9ycyA9IFtdO1xuXG4gICAgdmFyIGxheWVyID0gb3B0aW9ucy52YWx1ZTtcbiAgICB2YXIga2V5ID0gb3B0aW9ucy5rZXk7XG4gICAgdmFyIHN0eWxlID0gb3B0aW9ucy5zdHlsZTtcbiAgICB2YXIgc3R5bGVTcGVjID0gb3B0aW9ucy5zdHlsZVNwZWM7XG5cbiAgICBpZiAoIWxheWVyLnR5cGUgJiYgIWxheWVyLnJlZikge1xuICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgbGF5ZXIsICdlaXRoZXIgXCJ0eXBlXCIgb3IgXCJyZWZcIiBpcyByZXF1aXJlZCcpKTtcbiAgICB9XG4gICAgdmFyIHR5cGUgPSB1bmJ1bmRsZShsYXllci50eXBlKTtcbiAgICB2YXIgcmVmID0gdW5idW5kbGUobGF5ZXIucmVmKTtcblxuICAgIGlmIChsYXllci5pZCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9wdGlvbnMuYXJyYXlJbmRleDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgb3RoZXJMYXllciA9IHN0eWxlLmxheWVyc1tpXTtcbiAgICAgICAgICAgIGlmICh1bmJ1bmRsZShvdGhlckxheWVyLmlkKSA9PT0gdW5idW5kbGUobGF5ZXIuaWQpKSB7XG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIGxheWVyLmlkLCAnZHVwbGljYXRlIGxheWVyIGlkIFwiJXNcIiwgcHJldmlvdXNseSB1c2VkIGF0IGxpbmUgJWQnLCBsYXllci5pZCwgb3RoZXJMYXllci5pZC5fX2xpbmVfXykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCdyZWYnIGluIGxheWVyKSB7XG4gICAgICAgIFsndHlwZScsICdzb3VyY2UnLCAnc291cmNlLWxheWVyJywgJ2ZpbHRlcicsICdsYXlvdXQnXS5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7XG4gICAgICAgICAgICBpZiAocCBpbiBsYXllcikge1xuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCBsYXllcltwXSwgJ1wiJXNcIiBpcyBwcm9oaWJpdGVkIGZvciByZWYgbGF5ZXJzJywgcCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgcGFyZW50O1xuXG4gICAgICAgIHN0eWxlLmxheWVycy5mb3JFYWNoKGZ1bmN0aW9uKGxheWVyKSB7XG4gICAgICAgICAgICBpZiAobGF5ZXIuaWQgPT0gcmVmKSBwYXJlbnQgPSBsYXllcjtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCFwYXJlbnQpIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCBsYXllci5yZWYsICdyZWYgbGF5ZXIgXCIlc1wiIG5vdCBmb3VuZCcsIHJlZikpO1xuICAgICAgICB9IGVsc2UgaWYgKHBhcmVudC5yZWYpIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCBsYXllci5yZWYsICdyZWYgY2Fubm90IHJlZmVyZW5jZSBhbm90aGVyIHJlZiBsYXllcicpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHR5cGUgPSB1bmJ1bmRsZShwYXJlbnQudHlwZSk7XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGUgIT09ICdiYWNrZ3JvdW5kJykge1xuICAgICAgICBpZiAoIWxheWVyLnNvdXJjZSkge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2gobmV3IFZhbGlkYXRpb25FcnJvcihrZXksIGxheWVyLCAnbWlzc2luZyByZXF1aXJlZCBwcm9wZXJ0eSBcInNvdXJjZVwiJykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIHNvdXJjZSA9IHN0eWxlLnNvdXJjZXMgJiYgc3R5bGUuc291cmNlc1tsYXllci5zb3VyY2VdO1xuICAgICAgICAgICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgbGF5ZXIuc291cmNlLCAnc291cmNlIFwiJXNcIiBub3QgZm91bmQnLCBsYXllci5zb3VyY2UpKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc291cmNlLnR5cGUgPT0gJ3ZlY3RvcicgJiYgdHlwZSA9PSAncmFzdGVyJykge1xuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCBsYXllci5zb3VyY2UsICdsYXllciBcIiVzXCIgcmVxdWlyZXMgYSByYXN0ZXIgc291cmNlJywgbGF5ZXIuaWQpKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc291cmNlLnR5cGUgPT0gJ3Jhc3RlcicgJiYgdHlwZSAhPSAncmFzdGVyJykge1xuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCBsYXllci5zb3VyY2UsICdsYXllciBcIiVzXCIgcmVxdWlyZXMgYSB2ZWN0b3Igc291cmNlJywgbGF5ZXIuaWQpKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc291cmNlLnR5cGUgPT0gJ3ZlY3RvcicgJiYgIWxheWVyWydzb3VyY2UtbGF5ZXInXSkge1xuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCBsYXllciwgJ2xheWVyIFwiJXNcIiBtdXN0IHNwZWNpZnkgYSBcInNvdXJjZS1sYXllclwiJywgbGF5ZXIuaWQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGVycm9ycyA9IGVycm9ycy5jb25jYXQodmFsaWRhdGVPYmplY3Qoe1xuICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgdmFsdWU6IGxheWVyLFxuICAgICAgICB2YWx1ZVNwZWM6IHN0eWxlU3BlYy5sYXllcixcbiAgICAgICAgc3R5bGU6IG9wdGlvbnMuc3R5bGUsXG4gICAgICAgIHN0eWxlU3BlYzogb3B0aW9ucy5zdHlsZVNwZWMsXG4gICAgICAgIG9iamVjdEVsZW1lbnRWYWxpZGF0b3JzOiB7XG4gICAgICAgICAgICAnKic6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBmaWx0ZXI6IHZhbGlkYXRlRmlsdGVyLFxuICAgICAgICAgICAgbGF5b3V0OiBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRlT2JqZWN0KHtcbiAgICAgICAgICAgICAgICAgICAgbGF5ZXI6IGxheWVyLFxuICAgICAgICAgICAgICAgICAgICBrZXk6IG9wdGlvbnMua2V5LFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogb3B0aW9ucy52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU6IG9wdGlvbnMuc3R5bGUsXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlU3BlYzogb3B0aW9ucy5zdHlsZVNwZWMsXG4gICAgICAgICAgICAgICAgICAgIG9iamVjdEVsZW1lbnRWYWxpZGF0b3JzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAnKic6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsaWRhdGVMYXlvdXRQcm9wZXJ0eShleHRlbmQoe2xheWVyVHlwZTogdHlwZX0sIG9wdGlvbnMpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBhaW50OiBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRlT2JqZWN0KHtcbiAgICAgICAgICAgICAgICAgICAgbGF5ZXI6IGxheWVyLFxuICAgICAgICAgICAgICAgICAgICBrZXk6IG9wdGlvbnMua2V5LFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogb3B0aW9ucy52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU6IG9wdGlvbnMuc3R5bGUsXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlU3BlYzogb3B0aW9ucy5zdHlsZVNwZWMsXG4gICAgICAgICAgICAgICAgICAgIG9iamVjdEVsZW1lbnRWYWxpZGF0b3JzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAnKic6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsaWRhdGVQYWludFByb3BlcnR5KGV4dGVuZCh7bGF5ZXJUeXBlOiB0eXBlfSwgb3B0aW9ucykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KSk7XG5cbiAgICByZXR1cm4gZXJyb3JzO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHZhbGlkYXRlID0gcmVxdWlyZSgnLi92YWxpZGF0ZScpO1xudmFyIFZhbGlkYXRpb25FcnJvciA9IHJlcXVpcmUoJy4uL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3InKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB2YWxpZGF0ZUxheW91dFByb3BlcnR5KG9wdGlvbnMpIHtcbiAgICB2YXIga2V5ID0gb3B0aW9ucy5rZXk7XG4gICAgdmFyIHN0eWxlID0gb3B0aW9ucy5zdHlsZTtcbiAgICB2YXIgc3R5bGVTcGVjID0gb3B0aW9ucy5zdHlsZVNwZWM7XG4gICAgdmFyIHZhbHVlID0gb3B0aW9ucy52YWx1ZTtcbiAgICB2YXIgcHJvcGVydHlLZXkgPSBvcHRpb25zLm9iamVjdEtleTtcbiAgICB2YXIgbGF5ZXJTcGVjID0gc3R5bGVTcGVjWydsYXlvdXRfJyArIG9wdGlvbnMubGF5ZXJUeXBlXTtcblxuICAgIGlmICghbGF5ZXJTcGVjKSByZXR1cm4gW107XG5cbiAgICBpZiAob3B0aW9ucy52YWx1ZVNwZWMgfHwgbGF5ZXJTcGVjW3Byb3BlcnR5S2V5XSkge1xuICAgICAgICB2YXIgZXJyb3JzID0gW107XG5cbiAgICAgICAgaWYgKG9wdGlvbnMubGF5ZXJUeXBlID09PSAnc3ltYm9sJykge1xuICAgICAgICAgICAgaWYgKHByb3BlcnR5S2V5ID09PSAnaWNvbi1pbWFnZScgJiYgc3R5bGUgJiYgIXN0eWxlLnNwcml0ZSkge1xuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSwgJ3VzZSBvZiBcImljb24taW1hZ2VcIiByZXF1aXJlcyBhIHN0eWxlIFwic3ByaXRlXCIgcHJvcGVydHknKSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5S2V5ID09PSAndGV4dC1maWVsZCcgJiYgc3R5bGUgJiYgIXN0eWxlLmdseXBocykge1xuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSwgJ3VzZSBvZiBcInRleHQtZmllbGRcIiByZXF1aXJlcyBhIHN0eWxlIFwiZ2x5cGhzXCIgcHJvcGVydHknKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZXJyb3JzLmNvbmNhdCh2YWxpZGF0ZSh7XG4gICAgICAgICAgICBrZXk6IG9wdGlvbnMua2V5LFxuICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgdmFsdWVTcGVjOiBvcHRpb25zLnZhbHVlU3BlYyB8fCBsYXllclNwZWNbcHJvcGVydHlLZXldLFxuICAgICAgICAgICAgc3R5bGU6IHN0eWxlLFxuICAgICAgICAgICAgc3R5bGVTcGVjOiBzdHlsZVNwZWNcbiAgICAgICAgfSkpO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsICd1bmtub3duIHByb3BlcnR5IFwiJXNcIicsIHByb3BlcnR5S2V5KV07XG4gICAgfVxuXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVmFsaWRhdGlvbkVycm9yID0gcmVxdWlyZSgnLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvcicpO1xudmFyIGdldFR5cGUgPSByZXF1aXJlKCcuLi91dGlsL2dldF90eXBlJyk7XG52YXIgdmFsaWRhdGUgPSByZXF1aXJlKCcuL3ZhbGlkYXRlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gdmFsaWRhdGVMaWdodChvcHRpb25zKSB7XG4gICAgdmFyIGxpZ2h0ID0gb3B0aW9ucy52YWx1ZTtcbiAgICB2YXIgc3R5bGVTcGVjID0gb3B0aW9ucy5zdHlsZVNwZWM7XG4gICAgdmFyIGxpZ2h0U3BlYyA9IHN0eWxlU3BlYy5saWdodDtcbiAgICB2YXIgc3R5bGUgPSBvcHRpb25zLnN0eWxlO1xuXG4gICAgdmFyIGVycm9ycyA9IFtdO1xuXG4gICAgdmFyIHJvb3RUeXBlID0gZ2V0VHlwZShsaWdodCk7XG4gICAgaWYgKGxpZ2h0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGVycm9ycztcbiAgICB9IGVsc2UgaWYgKHJvb3RUeXBlICE9PSAnb2JqZWN0Jykge1xuICAgICAgICBlcnJvcnMgPSBlcnJvcnMuY29uY2F0KFtuZXcgVmFsaWRhdGlvbkVycm9yKCdsaWdodCcsIGxpZ2h0LCAnb2JqZWN0IGV4cGVjdGVkLCAlcyBmb3VuZCcsIHJvb3RUeXBlKV0pO1xuICAgICAgICByZXR1cm4gZXJyb3JzO1xuICAgIH1cblxuICAgIGZvciAodmFyIGtleSBpbiBsaWdodCkge1xuICAgICAgICB2YXIgdHJhbnNpdGlvbk1hdGNoID0ga2V5Lm1hdGNoKC9eKC4qKS10cmFuc2l0aW9uJC8pO1xuXG4gICAgICAgIGlmICh0cmFuc2l0aW9uTWF0Y2ggJiYgbGlnaHRTcGVjW3RyYW5zaXRpb25NYXRjaFsxXV0gJiYgbGlnaHRTcGVjW3RyYW5zaXRpb25NYXRjaFsxXV0udHJhbnNpdGlvbikge1xuICAgICAgICAgICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdCh2YWxpZGF0ZSh7XG4gICAgICAgICAgICAgICAga2V5OiBrZXksXG4gICAgICAgICAgICAgICAgdmFsdWU6IGxpZ2h0W2tleV0sXG4gICAgICAgICAgICAgICAgdmFsdWVTcGVjOiBzdHlsZVNwZWMudHJhbnNpdGlvbixcbiAgICAgICAgICAgICAgICBzdHlsZTogc3R5bGUsXG4gICAgICAgICAgICAgICAgc3R5bGVTcGVjOiBzdHlsZVNwZWNcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChsaWdodFNwZWNba2V5XSkge1xuICAgICAgICAgICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdCh2YWxpZGF0ZSh7XG4gICAgICAgICAgICAgICAga2V5OiBrZXksXG4gICAgICAgICAgICAgICAgdmFsdWU6IGxpZ2h0W2tleV0sXG4gICAgICAgICAgICAgICAgdmFsdWVTcGVjOiBsaWdodFNwZWNba2V5XSxcbiAgICAgICAgICAgICAgICBzdHlsZTogc3R5bGUsXG4gICAgICAgICAgICAgICAgc3R5bGVTcGVjOiBzdHlsZVNwZWNcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVycm9ycyA9IGVycm9ycy5jb25jYXQoW25ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCBsaWdodFtrZXldLCAndW5rbm93biBwcm9wZXJ0eSBcIiVzXCInLCBrZXkpXSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZXJyb3JzO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGdldFR5cGUgPSByZXF1aXJlKCcuLi91dGlsL2dldF90eXBlJyk7XG52YXIgVmFsaWRhdGlvbkVycm9yID0gcmVxdWlyZSgnLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHZhbGlkYXRlTnVtYmVyKG9wdGlvbnMpIHtcbiAgICB2YXIga2V5ID0gb3B0aW9ucy5rZXk7XG4gICAgdmFyIHZhbHVlID0gb3B0aW9ucy52YWx1ZTtcbiAgICB2YXIgdmFsdWVTcGVjID0gb3B0aW9ucy52YWx1ZVNwZWM7XG4gICAgdmFyIHR5cGUgPSBnZXRUeXBlKHZhbHVlKTtcblxuICAgIGlmICh0eXBlICE9PSAnbnVtYmVyJykge1xuICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSwgJ251bWJlciBleHBlY3RlZCwgJXMgZm91bmQnLCB0eXBlKV07XG4gICAgfVxuXG4gICAgaWYgKCdtaW5pbXVtJyBpbiB2YWx1ZVNwZWMgJiYgdmFsdWUgPCB2YWx1ZVNwZWMubWluaW11bSkge1xuICAgICAgICByZXR1cm4gW25ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCB2YWx1ZSwgJyVzIGlzIGxlc3MgdGhhbiB0aGUgbWluaW11bSB2YWx1ZSAlcycsIHZhbHVlLCB2YWx1ZVNwZWMubWluaW11bSldO1xuICAgIH1cblxuICAgIGlmICgnbWF4aW11bScgaW4gdmFsdWVTcGVjICYmIHZhbHVlID4gdmFsdWVTcGVjLm1heGltdW0pIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsICclcyBpcyBncmVhdGVyIHRoYW4gdGhlIG1heGltdW0gdmFsdWUgJXMnLCB2YWx1ZSwgdmFsdWVTcGVjLm1heGltdW0pXTtcbiAgICB9XG5cbiAgICByZXR1cm4gW107XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVmFsaWRhdGlvbkVycm9yID0gcmVxdWlyZSgnLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvcicpO1xudmFyIGdldFR5cGUgPSByZXF1aXJlKCcuLi91dGlsL2dldF90eXBlJyk7XG52YXIgdmFsaWRhdGVTcGVjID0gcmVxdWlyZSgnLi92YWxpZGF0ZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHZhbGlkYXRlT2JqZWN0KG9wdGlvbnMpIHtcbiAgICB2YXIga2V5ID0gb3B0aW9ucy5rZXk7XG4gICAgdmFyIG9iamVjdCA9IG9wdGlvbnMudmFsdWU7XG4gICAgdmFyIGVsZW1lbnRTcGVjcyA9IG9wdGlvbnMudmFsdWVTcGVjIHx8IHt9O1xuICAgIHZhciBlbGVtZW50VmFsaWRhdG9ycyA9IG9wdGlvbnMub2JqZWN0RWxlbWVudFZhbGlkYXRvcnMgfHwge307XG4gICAgdmFyIHN0eWxlID0gb3B0aW9ucy5zdHlsZTtcbiAgICB2YXIgc3R5bGVTcGVjID0gb3B0aW9ucy5zdHlsZVNwZWM7XG4gICAgdmFyIGVycm9ycyA9IFtdO1xuXG4gICAgdmFyIHR5cGUgPSBnZXRUeXBlKG9iamVjdCk7XG4gICAgaWYgKHR5cGUgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBbbmV3IFZhbGlkYXRpb25FcnJvcihrZXksIG9iamVjdCwgJ29iamVjdCBleHBlY3RlZCwgJXMgZm91bmQnLCB0eXBlKV07XG4gICAgfVxuXG4gICAgZm9yICh2YXIgb2JqZWN0S2V5IGluIG9iamVjdCkge1xuICAgICAgICB2YXIgZWxlbWVudFNwZWNLZXkgPSBvYmplY3RLZXkuc3BsaXQoJy4nKVswXTsgLy8gdHJlYXQgJ3BhaW50LionIGFzICdwYWludCdcbiAgICAgICAgdmFyIGVsZW1lbnRTcGVjID0gZWxlbWVudFNwZWNzW2VsZW1lbnRTcGVjS2V5XSB8fCBlbGVtZW50U3BlY3NbJyonXTtcblxuICAgICAgICB2YXIgdmFsaWRhdGVFbGVtZW50O1xuICAgICAgICBpZiAoZWxlbWVudFZhbGlkYXRvcnNbZWxlbWVudFNwZWNLZXldKSB7XG4gICAgICAgICAgICB2YWxpZGF0ZUVsZW1lbnQgPSBlbGVtZW50VmFsaWRhdG9yc1tlbGVtZW50U3BlY0tleV07XG4gICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudFNwZWNzW2VsZW1lbnRTcGVjS2V5XSkge1xuICAgICAgICAgICAgdmFsaWRhdGVFbGVtZW50ID0gdmFsaWRhdGVTcGVjO1xuICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnRWYWxpZGF0b3JzWycqJ10pIHtcbiAgICAgICAgICAgIHZhbGlkYXRlRWxlbWVudCA9IGVsZW1lbnRWYWxpZGF0b3JzWycqJ107XG4gICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudFNwZWNzWycqJ10pIHtcbiAgICAgICAgICAgIHZhbGlkYXRlRWxlbWVudCA9IHZhbGlkYXRlU3BlYztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCBvYmplY3Rbb2JqZWN0S2V5XSwgJ3Vua25vd24gcHJvcGVydHkgXCIlc1wiJywgb2JqZWN0S2V5KSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVycm9ycyA9IGVycm9ycy5jb25jYXQodmFsaWRhdGVFbGVtZW50KHtcbiAgICAgICAgICAgIGtleTogKGtleSA/IGtleSArICcuJyA6IGtleSkgKyBvYmplY3RLZXksXG4gICAgICAgICAgICB2YWx1ZTogb2JqZWN0W29iamVjdEtleV0sXG4gICAgICAgICAgICB2YWx1ZVNwZWM6IGVsZW1lbnRTcGVjLFxuICAgICAgICAgICAgc3R5bGU6IHN0eWxlLFxuICAgICAgICAgICAgc3R5bGVTcGVjOiBzdHlsZVNwZWMsXG4gICAgICAgICAgICBvYmplY3Q6IG9iamVjdCxcbiAgICAgICAgICAgIG9iamVjdEtleTogb2JqZWN0S2V5XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBmb3IgKGVsZW1lbnRTcGVjS2V5IGluIGVsZW1lbnRTcGVjcykge1xuICAgICAgICBpZiAoZWxlbWVudFNwZWNzW2VsZW1lbnRTcGVjS2V5XS5yZXF1aXJlZCAmJiBlbGVtZW50U3BlY3NbZWxlbWVudFNwZWNLZXldWydkZWZhdWx0J10gPT09IHVuZGVmaW5lZCAmJiBvYmplY3RbZWxlbWVudFNwZWNLZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5LCBvYmplY3QsICdtaXNzaW5nIHJlcXVpcmVkIHByb3BlcnR5IFwiJXNcIicsIGVsZW1lbnRTcGVjS2V5KSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZXJyb3JzO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHZhbGlkYXRlID0gcmVxdWlyZSgnLi92YWxpZGF0ZScpO1xudmFyIFZhbGlkYXRpb25FcnJvciA9IHJlcXVpcmUoJy4uL2Vycm9yL3ZhbGlkYXRpb25fZXJyb3InKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB2YWxpZGF0ZVBhaW50UHJvcGVydHkob3B0aW9ucykge1xuICAgIHZhciBrZXkgPSBvcHRpb25zLmtleTtcbiAgICB2YXIgc3R5bGUgPSBvcHRpb25zLnN0eWxlO1xuICAgIHZhciBzdHlsZVNwZWMgPSBvcHRpb25zLnN0eWxlU3BlYztcbiAgICB2YXIgdmFsdWUgPSBvcHRpb25zLnZhbHVlO1xuICAgIHZhciBwcm9wZXJ0eUtleSA9IG9wdGlvbnMub2JqZWN0S2V5O1xuICAgIHZhciBsYXllclNwZWMgPSBzdHlsZVNwZWNbJ3BhaW50XycgKyBvcHRpb25zLmxheWVyVHlwZV07XG5cbiAgICBpZiAoIWxheWVyU3BlYykgcmV0dXJuIFtdO1xuXG4gICAgdmFyIHRyYW5zaXRpb25NYXRjaCA9IHByb3BlcnR5S2V5Lm1hdGNoKC9eKC4qKS10cmFuc2l0aW9uJC8pO1xuXG4gICAgaWYgKHRyYW5zaXRpb25NYXRjaCAmJiBsYXllclNwZWNbdHJhbnNpdGlvbk1hdGNoWzFdXSAmJiBsYXllclNwZWNbdHJhbnNpdGlvbk1hdGNoWzFdXS50cmFuc2l0aW9uKSB7XG4gICAgICAgIHJldHVybiB2YWxpZGF0ZSh7XG4gICAgICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgIHZhbHVlU3BlYzogc3R5bGVTcGVjLnRyYW5zaXRpb24sXG4gICAgICAgICAgICBzdHlsZTogc3R5bGUsXG4gICAgICAgICAgICBzdHlsZVNwZWM6IHN0eWxlU3BlY1xuICAgICAgICB9KTtcblxuICAgIH0gZWxzZSBpZiAob3B0aW9ucy52YWx1ZVNwZWMgfHwgbGF5ZXJTcGVjW3Byb3BlcnR5S2V5XSkge1xuICAgICAgICByZXR1cm4gdmFsaWRhdGUoe1xuICAgICAgICAgICAga2V5OiBvcHRpb25zLmtleSxcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgIHZhbHVlU3BlYzogb3B0aW9ucy52YWx1ZVNwZWMgfHwgbGF5ZXJTcGVjW3Byb3BlcnR5S2V5XSxcbiAgICAgICAgICAgIHN0eWxlOiBzdHlsZSxcbiAgICAgICAgICAgIHN0eWxlU3BlYzogc3R5bGVTcGVjXG4gICAgICAgIH0pO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsICd1bmtub3duIHByb3BlcnR5IFwiJXNcIicsIHByb3BlcnR5S2V5KV07XG4gICAgfVxuXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVmFsaWRhdGlvbkVycm9yID0gcmVxdWlyZSgnLi4vZXJyb3IvdmFsaWRhdGlvbl9lcnJvcicpO1xudmFyIHVuYnVuZGxlID0gcmVxdWlyZSgnLi4vdXRpbC91bmJ1bmRsZV9qc29ubGludCcpO1xudmFyIHZhbGlkYXRlT2JqZWN0ID0gcmVxdWlyZSgnLi92YWxpZGF0ZV9vYmplY3QnKTtcbnZhciB2YWxpZGF0ZUVudW0gPSByZXF1aXJlKCcuL3ZhbGlkYXRlX2VudW0nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB2YWxpZGF0ZVNvdXJjZShvcHRpb25zKSB7XG4gICAgdmFyIHZhbHVlID0gb3B0aW9ucy52YWx1ZTtcbiAgICB2YXIga2V5ID0gb3B0aW9ucy5rZXk7XG4gICAgdmFyIHN0eWxlU3BlYyA9IG9wdGlvbnMuc3R5bGVTcGVjO1xuICAgIHZhciBzdHlsZSA9IG9wdGlvbnMuc3R5bGU7XG5cbiAgICBpZiAoIXZhbHVlLnR5cGUpIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsICdcInR5cGVcIiBpcyByZXF1aXJlZCcpXTtcbiAgICB9XG5cbiAgICB2YXIgdHlwZSA9IHVuYnVuZGxlKHZhbHVlLnR5cGUpO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlICd2ZWN0b3InOlxuICAgICAgICBjYXNlICdyYXN0ZXInOlxuICAgICAgICAgICAgdmFyIGVycm9ycyA9IFtdO1xuICAgICAgICAgICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdCh2YWxpZGF0ZU9iamVjdCh7XG4gICAgICAgICAgICAgICAga2V5OiBrZXksXG4gICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgICAgIHZhbHVlU3BlYzogc3R5bGVTcGVjLnNvdXJjZV90aWxlLFxuICAgICAgICAgICAgICAgIHN0eWxlOiBvcHRpb25zLnN0eWxlLFxuICAgICAgICAgICAgICAgIHN0eWxlU3BlYzogc3R5bGVTcGVjXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICBpZiAoJ3VybCcgaW4gdmFsdWUpIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBwcm9wIGluIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChbJ3R5cGUnLCAndXJsJywgJ3RpbGVTaXplJ10uaW5kZXhPZihwcm9wKSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBWYWxpZGF0aW9uRXJyb3Ioa2V5ICsgJy4nICsgcHJvcCwgdmFsdWVbcHJvcF0sICdhIHNvdXJjZSB3aXRoIGEgXCJ1cmxcIiBwcm9wZXJ0eSBtYXkgbm90IGluY2x1ZGUgYSBcIiVzXCIgcHJvcGVydHknLCBwcm9wKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZXJyb3JzO1xuXG4gICAgICAgIGNhc2UgJ2dlb2pzb24nOlxuICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRlT2JqZWN0KHtcbiAgICAgICAgICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgICAgICAgdmFsdWVTcGVjOiBzdHlsZVNwZWMuc291cmNlX2dlb2pzb24sXG4gICAgICAgICAgICAgICAgc3R5bGU6IHN0eWxlLFxuICAgICAgICAgICAgICAgIHN0eWxlU3BlYzogc3R5bGVTcGVjXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBjYXNlICd2aWRlbyc6XG4gICAgICAgICAgICByZXR1cm4gdmFsaWRhdGVPYmplY3Qoe1xuICAgICAgICAgICAgICAgIGtleToga2V5LFxuICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgICAgICB2YWx1ZVNwZWM6IHN0eWxlU3BlYy5zb3VyY2VfdmlkZW8sXG4gICAgICAgICAgICAgICAgc3R5bGU6IHN0eWxlLFxuICAgICAgICAgICAgICAgIHN0eWxlU3BlYzogc3R5bGVTcGVjXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBjYXNlICdpbWFnZSc6XG4gICAgICAgICAgICByZXR1cm4gdmFsaWRhdGVPYmplY3Qoe1xuICAgICAgICAgICAgICAgIGtleToga2V5LFxuICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgICAgICB2YWx1ZVNwZWM6IHN0eWxlU3BlYy5zb3VyY2VfaW1hZ2UsXG4gICAgICAgICAgICAgICAgc3R5bGU6IHN0eWxlLFxuICAgICAgICAgICAgICAgIHN0eWxlU3BlYzogc3R5bGVTcGVjXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBjYXNlICdjYW52YXMnOlxuICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRlT2JqZWN0KHtcbiAgICAgICAgICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgICAgICAgdmFsdWVTcGVjOiBzdHlsZVNwZWMuc291cmNlX2NhbnZhcyxcbiAgICAgICAgICAgICAgICBzdHlsZTogc3R5bGUsXG4gICAgICAgICAgICAgICAgc3R5bGVTcGVjOiBzdHlsZVNwZWNcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gdmFsaWRhdGVFbnVtKHtcbiAgICAgICAgICAgICAgICBrZXk6IGtleSArICcudHlwZScsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlLnR5cGUsXG4gICAgICAgICAgICAgICAgdmFsdWVTcGVjOiB7dmFsdWVzOiBbJ3ZlY3RvcicsICdyYXN0ZXInLCAnZ2VvanNvbicsICd2aWRlbycsICdpbWFnZScsICdjYW52YXMnXX0sXG4gICAgICAgICAgICAgICAgc3R5bGU6IHN0eWxlLFxuICAgICAgICAgICAgICAgIHN0eWxlU3BlYzogc3R5bGVTcGVjXG4gICAgICAgICAgICB9KTtcbiAgICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZ2V0VHlwZSA9IHJlcXVpcmUoJy4uL3V0aWwvZ2V0X3R5cGUnKTtcbnZhciBWYWxpZGF0aW9uRXJyb3IgPSByZXF1aXJlKCcuLi9lcnJvci92YWxpZGF0aW9uX2Vycm9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gdmFsaWRhdGVTdHJpbmcob3B0aW9ucykge1xuICAgIHZhciB2YWx1ZSA9IG9wdGlvbnMudmFsdWU7XG4gICAgdmFyIGtleSA9IG9wdGlvbnMua2V5O1xuICAgIHZhciB0eXBlID0gZ2V0VHlwZSh2YWx1ZSk7XG5cbiAgICBpZiAodHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIFtuZXcgVmFsaWRhdGlvbkVycm9yKGtleSwgdmFsdWUsICdzdHJpbmcgZXhwZWN0ZWQsICVzIGZvdW5kJywgdHlwZSldO1xuICAgIH1cblxuICAgIHJldHVybiBbXTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB2YWxpZGF0ZUNvbnN0YW50cyA9IHJlcXVpcmUoJy4vdmFsaWRhdGUvdmFsaWRhdGVfY29uc3RhbnRzJyk7XG52YXIgdmFsaWRhdGUgPSByZXF1aXJlKCcuL3ZhbGlkYXRlL3ZhbGlkYXRlJyk7XG52YXIgbGF0ZXN0U3R5bGVTcGVjID0gcmVxdWlyZSgnLi4vcmVmZXJlbmNlL2xhdGVzdC5taW4nKTtcbnZhciB2YWxpZGF0ZUdseXBoc1VSTCA9IHJlcXVpcmUoJy4vdmFsaWRhdGUvdmFsaWRhdGVfZ2x5cGhzX3VybCcpO1xuXG4vKipcbiAqIFZhbGlkYXRlIGEgTWFwYm94IEdMIHN0eWxlIGFnYWluc3QgdGhlIHN0eWxlIHNwZWNpZmljYXRpb24uIFRoaXMgZW50cnlwb2ludCxcbiAqIGBtYXBib3gtZ2wtc3R5bGUtc3BlYy9saWIvdmFsaWRhdGVfc3R5bGUubWluYCwgaXMgZGVzaWduZWQgdG8gcHJvZHVjZSBhc1xuICogc21hbGwgYSBicm93c2VyaWZ5IGJ1bmRsZSBhcyBwb3NzaWJsZSBieSBvbWl0dGluZyB1bm5lY2Vzc2FyeSBmdW5jdGlvbmFsaXR5XG4gKiBhbmQgbGVnYWN5IHN0eWxlIHNwZWNpZmljYXRpb25zLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzdHlsZSBUaGUgc3R5bGUgdG8gYmUgdmFsaWRhdGVkLlxuICogQHBhcmFtIHtPYmplY3R9IFtzdHlsZVNwZWNdIFRoZSBzdHlsZSBzcGVjaWZpY2F0aW9uIHRvIHZhbGlkYXRlIGFnYWluc3QuXG4gKiAgICAgSWYgb21pdHRlZCwgdGhlIGxhdGVzdCBzdHlsZSBzcGVjIGlzIHVzZWQuXG4gKiBAcmV0dXJucyB7QXJyYXk8VmFsaWRhdGlvbkVycm9yPn1cbiAqIEBleGFtcGxlXG4gKiAgIHZhciB2YWxpZGF0ZSA9IHJlcXVpcmUoJ21hcGJveC1nbC1zdHlsZS1zcGVjL2xpYi92YWxpZGF0ZV9zdHlsZS5taW4nKTtcbiAqICAgdmFyIGVycm9ycyA9IHZhbGlkYXRlKHN0eWxlKTtcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVTdHlsZU1pbihzdHlsZSwgc3R5bGVTcGVjKSB7XG4gICAgc3R5bGVTcGVjID0gc3R5bGVTcGVjIHx8IGxhdGVzdFN0eWxlU3BlYztcblxuICAgIHZhciBlcnJvcnMgPSBbXTtcblxuICAgIGVycm9ycyA9IGVycm9ycy5jb25jYXQodmFsaWRhdGUoe1xuICAgICAgICBrZXk6ICcnLFxuICAgICAgICB2YWx1ZTogc3R5bGUsXG4gICAgICAgIHZhbHVlU3BlYzogc3R5bGVTcGVjLiRyb290LFxuICAgICAgICBzdHlsZVNwZWM6IHN0eWxlU3BlYyxcbiAgICAgICAgc3R5bGU6IHN0eWxlLFxuICAgICAgICBvYmplY3RFbGVtZW50VmFsaWRhdG9yczoge1xuICAgICAgICAgICAgZ2x5cGhzOiB2YWxpZGF0ZUdseXBoc1VSTCxcbiAgICAgICAgICAgICcqJzogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSkpO1xuXG4gICAgaWYgKHN0eWxlU3BlYy4kdmVyc2lvbiA+IDcgJiYgc3R5bGUuY29uc3RhbnRzKSB7XG4gICAgICAgIGVycm9ycyA9IGVycm9ycy5jb25jYXQodmFsaWRhdGVDb25zdGFudHMoe1xuICAgICAgICAgICAga2V5OiAnY29uc3RhbnRzJyxcbiAgICAgICAgICAgIHZhbHVlOiBzdHlsZS5jb25zdGFudHMsXG4gICAgICAgICAgICBzdHlsZTogc3R5bGUsXG4gICAgICAgICAgICBzdHlsZVNwZWM6IHN0eWxlU3BlY1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNvcnRFcnJvcnMoZXJyb3JzKTtcbn1cblxudmFsaWRhdGVTdHlsZU1pbi5zb3VyY2UgPSB3cmFwQ2xlYW5FcnJvcnMocmVxdWlyZSgnLi92YWxpZGF0ZS92YWxpZGF0ZV9zb3VyY2UnKSk7XG52YWxpZGF0ZVN0eWxlTWluLmxpZ2h0ID0gd3JhcENsZWFuRXJyb3JzKHJlcXVpcmUoJy4vdmFsaWRhdGUvdmFsaWRhdGVfbGlnaHQnKSk7XG52YWxpZGF0ZVN0eWxlTWluLmxheWVyID0gd3JhcENsZWFuRXJyb3JzKHJlcXVpcmUoJy4vdmFsaWRhdGUvdmFsaWRhdGVfbGF5ZXInKSk7XG52YWxpZGF0ZVN0eWxlTWluLmZpbHRlciA9IHdyYXBDbGVhbkVycm9ycyhyZXF1aXJlKCcuL3ZhbGlkYXRlL3ZhbGlkYXRlX2ZpbHRlcicpKTtcbnZhbGlkYXRlU3R5bGVNaW4ucGFpbnRQcm9wZXJ0eSA9IHdyYXBDbGVhbkVycm9ycyhyZXF1aXJlKCcuL3ZhbGlkYXRlL3ZhbGlkYXRlX3BhaW50X3Byb3BlcnR5JykpO1xudmFsaWRhdGVTdHlsZU1pbi5sYXlvdXRQcm9wZXJ0eSA9IHdyYXBDbGVhbkVycm9ycyhyZXF1aXJlKCcuL3ZhbGlkYXRlL3ZhbGlkYXRlX2xheW91dF9wcm9wZXJ0eScpKTtcblxuZnVuY3Rpb24gc29ydEVycm9ycyhlcnJvcnMpIHtcbiAgICByZXR1cm4gW10uY29uY2F0KGVycm9ycykuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICByZXR1cm4gYS5saW5lIC0gYi5saW5lO1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiB3cmFwQ2xlYW5FcnJvcnMoaW5uZXIpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBzb3J0RXJyb3JzKGlubmVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICAgIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdmFsaWRhdGVTdHlsZU1pbjtcbiIsIi8qKlxuICogbG9kYXNoIDMuMC40IChDdXN0b20gQnVpbGQpIDxodHRwczovL2xvZGFzaC5jb20vPlxuICogQnVpbGQ6IGBsb2Rhc2ggbW9kZXJuIG1vZHVsYXJpemUgZXhwb3J0cz1cIm5wbVwiIC1vIC4vYFxuICogQ29weXJpZ2h0IDIwMTItMjAxNSBUaGUgRG9qbyBGb3VuZGF0aW9uIDxodHRwOi8vZG9qb2ZvdW5kYXRpb24ub3JnLz5cbiAqIEJhc2VkIG9uIFVuZGVyc2NvcmUuanMgMS44LjMgPGh0dHA6Ly91bmRlcnNjb3JlanMub3JnL0xJQ0VOU0U+XG4gKiBDb3B5cmlnaHQgMjAwOS0yMDE1IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzXG4gKiBBdmFpbGFibGUgdW5kZXIgTUlUIGxpY2Vuc2UgPGh0dHBzOi8vbG9kYXNoLmNvbS9saWNlbnNlPlxuICovXG52YXIgYmFzZUlzRXF1YWwgPSByZXF1aXJlKCdsb2Rhc2guX2Jhc2Vpc2VxdWFsJyksXG4gICAgYmluZENhbGxiYWNrID0gcmVxdWlyZSgnbG9kYXNoLl9iaW5kY2FsbGJhY2snKTtcblxuLyoqXG4gKiBQZXJmb3JtcyBhIGRlZXAgY29tcGFyaXNvbiBiZXR3ZWVuIHR3byB2YWx1ZXMgdG8gZGV0ZXJtaW5lIGlmIHRoZXkgYXJlXG4gKiBlcXVpdmFsZW50LiBJZiBgY3VzdG9taXplcmAgaXMgcHJvdmlkZWQgaXQgaXMgaW52b2tlZCB0byBjb21wYXJlIHZhbHVlcy5cbiAqIElmIGBjdXN0b21pemVyYCByZXR1cm5zIGB1bmRlZmluZWRgIGNvbXBhcmlzb25zIGFyZSBoYW5kbGVkIGJ5IHRoZSBtZXRob2RcbiAqIGluc3RlYWQuIFRoZSBgY3VzdG9taXplcmAgaXMgYm91bmQgdG8gYHRoaXNBcmdgIGFuZCBpbnZva2VkIHdpdGggdGhyZWVcbiAqIGFyZ3VtZW50czogKHZhbHVlLCBvdGhlciBbLCBpbmRleHxrZXldKS5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2Qgc3VwcG9ydHMgY29tcGFyaW5nIGFycmF5cywgYm9vbGVhbnMsIGBEYXRlYCBvYmplY3RzLFxuICogbnVtYmVycywgYE9iamVjdGAgb2JqZWN0cywgcmVnZXhlcywgYW5kIHN0cmluZ3MuIE9iamVjdHMgYXJlIGNvbXBhcmVkIGJ5XG4gKiB0aGVpciBvd24sIG5vdCBpbmhlcml0ZWQsIGVudW1lcmFibGUgcHJvcGVydGllcy4gRnVuY3Rpb25zIGFuZCBET00gbm9kZXNcbiAqIGFyZSAqKm5vdCoqIHN1cHBvcnRlZC4gUHJvdmlkZSBhIGN1c3RvbWl6ZXIgZnVuY3Rpb24gdG8gZXh0ZW5kIHN1cHBvcnRcbiAqIGZvciBjb21wYXJpbmcgb3RoZXIgdmFsdWVzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAYWxpYXMgZXFcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIHZhbHVlIGNvbXBhcmlzb25zLlxuICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBjdXN0b21pemVyYC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICd1c2VyJzogJ2ZyZWQnIH07XG4gKiB2YXIgb3RoZXIgPSB7ICd1c2VyJzogJ2ZyZWQnIH07XG4gKlxuICogb2JqZWN0ID09IG90aGVyO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzRXF1YWwob2JqZWN0LCBvdGhlcik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogLy8gdXNpbmcgYSBjdXN0b21pemVyIGNhbGxiYWNrXG4gKiB2YXIgYXJyYXkgPSBbJ2hlbGxvJywgJ2dvb2RieWUnXTtcbiAqIHZhciBvdGhlciA9IFsnaGknLCAnZ29vZGJ5ZSddO1xuICpcbiAqIF8uaXNFcXVhbChhcnJheSwgb3RoZXIsIGZ1bmN0aW9uKHZhbHVlLCBvdGhlcikge1xuICogICBpZiAoXy5ldmVyeShbdmFsdWUsIG90aGVyXSwgUmVnRXhwLnByb3RvdHlwZS50ZXN0LCAvXmgoPzppfGVsbG8pJC8pKSB7XG4gKiAgICAgcmV0dXJuIHRydWU7XG4gKiAgIH1cbiAqIH0pO1xuICogLy8gPT4gdHJ1ZVxuICovXG5mdW5jdGlvbiBpc0VxdWFsKHZhbHVlLCBvdGhlciwgY3VzdG9taXplciwgdGhpc0FyZykge1xuICBjdXN0b21pemVyID0gdHlwZW9mIGN1c3RvbWl6ZXIgPT0gJ2Z1bmN0aW9uJyA/IGJpbmRDYWxsYmFjayhjdXN0b21pemVyLCB0aGlzQXJnLCAzKSA6IHVuZGVmaW5lZDtcbiAgdmFyIHJlc3VsdCA9IGN1c3RvbWl6ZXIgPyBjdXN0b21pemVyKHZhbHVlLCBvdGhlcikgOiB1bmRlZmluZWQ7XG4gIHJldHVybiAgcmVzdWx0ID09PSB1bmRlZmluZWQgPyBiYXNlSXNFcXVhbCh2YWx1ZSwgb3RoZXIsIGN1c3RvbWl6ZXIpIDogISFyZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNFcXVhbDtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi92OC5taW4uanNvbicpO1xuIiwibW9kdWxlLmV4cG9ydHM9e1wiJHZlcnNpb25cIjo4LFwiJHJvb3RcIjp7XCJ2ZXJzaW9uXCI6e1wicmVxdWlyZWRcIjp0cnVlLFwidHlwZVwiOlwiZW51bVwiLFwidmFsdWVzXCI6WzhdfSxcIm5hbWVcIjp7XCJ0eXBlXCI6XCJzdHJpbmdcIn0sXCJtZXRhZGF0YVwiOntcInR5cGVcIjpcIipcIn0sXCJjZW50ZXJcIjp7XCJ0eXBlXCI6XCJhcnJheVwiLFwidmFsdWVcIjpcIm51bWJlclwifSxcInpvb21cIjp7XCJ0eXBlXCI6XCJudW1iZXJcIn0sXCJiZWFyaW5nXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MCxcInBlcmlvZFwiOjM2MCxcInVuaXRzXCI6XCJkZWdyZWVzXCJ9LFwicGl0Y2hcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjowLFwidW5pdHNcIjpcImRlZ3JlZXNcIn0sXCJsaWdodFwiOntcInR5cGVcIjpcImxpZ2h0XCJ9LFwic291cmNlc1wiOntcInJlcXVpcmVkXCI6dHJ1ZSxcInR5cGVcIjpcInNvdXJjZXNcIn0sXCJzcHJpdGVcIjp7XCJ0eXBlXCI6XCJzdHJpbmdcIn0sXCJnbHlwaHNcIjp7XCJ0eXBlXCI6XCJzdHJpbmdcIn0sXCJ0cmFuc2l0aW9uXCI6e1widHlwZVwiOlwidHJhbnNpdGlvblwifSxcImxheWVyc1wiOntcInJlcXVpcmVkXCI6dHJ1ZSxcInR5cGVcIjpcImFycmF5XCIsXCJ2YWx1ZVwiOlwibGF5ZXJcIn19LFwic291cmNlc1wiOntcIipcIjp7XCJ0eXBlXCI6XCJzb3VyY2VcIn19LFwic291cmNlXCI6W1wic291cmNlX3RpbGVcIixcInNvdXJjZV9nZW9qc29uXCIsXCJzb3VyY2VfdmlkZW9cIixcInNvdXJjZV9pbWFnZVwiLFwic291cmNlX2NhbnZhc1wiXSxcInNvdXJjZV90aWxlXCI6e1widHlwZVwiOntcInJlcXVpcmVkXCI6dHJ1ZSxcInR5cGVcIjpcImVudW1cIixcInZhbHVlc1wiOntcInZlY3RvclwiOnt9LFwicmFzdGVyXCI6e319fSxcInVybFwiOntcInR5cGVcIjpcInN0cmluZ1wifSxcInRpbGVzXCI6e1widHlwZVwiOlwiYXJyYXlcIixcInZhbHVlXCI6XCJzdHJpbmdcIn0sXCJtaW56b29tXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MH0sXCJtYXh6b29tXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MjJ9LFwidGlsZVNpemVcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjo1MTIsXCJ1bml0c1wiOlwicGl4ZWxzXCJ9LFwiKlwiOntcInR5cGVcIjpcIipcIn19LFwic291cmNlX2dlb2pzb25cIjp7XCJ0eXBlXCI6e1wicmVxdWlyZWRcIjp0cnVlLFwidHlwZVwiOlwiZW51bVwiLFwidmFsdWVzXCI6e1wiZ2VvanNvblwiOnt9fX0sXCJkYXRhXCI6e1widHlwZVwiOlwiKlwifSxcIm1heHpvb21cIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjoxOH0sXCJidWZmZXJcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjoxMjgsXCJtYXhpbXVtXCI6NTEyLFwibWluaW11bVwiOjB9LFwidG9sZXJhbmNlXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MC4zNzV9LFwiY2x1c3RlclwiOntcInR5cGVcIjpcImJvb2xlYW5cIixcImRlZmF1bHRcIjpmYWxzZX0sXCJjbHVzdGVyUmFkaXVzXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6NTAsXCJtaW5pbXVtXCI6MH0sXCJjbHVzdGVyTWF4Wm9vbVwiOntcInR5cGVcIjpcIm51bWJlclwifX0sXCJzb3VyY2VfdmlkZW9cIjp7XCJ0eXBlXCI6e1wicmVxdWlyZWRcIjp0cnVlLFwidHlwZVwiOlwiZW51bVwiLFwidmFsdWVzXCI6e1widmlkZW9cIjp7fX19LFwidXJsc1wiOntcInJlcXVpcmVkXCI6dHJ1ZSxcInR5cGVcIjpcImFycmF5XCIsXCJ2YWx1ZVwiOlwic3RyaW5nXCJ9LFwiY29vcmRpbmF0ZXNcIjp7XCJyZXF1aXJlZFwiOnRydWUsXCJ0eXBlXCI6XCJhcnJheVwiLFwibGVuZ3RoXCI6NCxcInZhbHVlXCI6e1widHlwZVwiOlwiYXJyYXlcIixcImxlbmd0aFwiOjIsXCJ2YWx1ZVwiOlwibnVtYmVyXCJ9fX0sXCJzb3VyY2VfaW1hZ2VcIjp7XCJ0eXBlXCI6e1wicmVxdWlyZWRcIjp0cnVlLFwidHlwZVwiOlwiZW51bVwiLFwidmFsdWVzXCI6e1wiaW1hZ2VcIjp7fX19LFwidXJsXCI6e1wicmVxdWlyZWRcIjp0cnVlLFwidHlwZVwiOlwic3RyaW5nXCJ9LFwiY29vcmRpbmF0ZXNcIjp7XCJyZXF1aXJlZFwiOnRydWUsXCJ0eXBlXCI6XCJhcnJheVwiLFwibGVuZ3RoXCI6NCxcInZhbHVlXCI6e1widHlwZVwiOlwiYXJyYXlcIixcImxlbmd0aFwiOjIsXCJ2YWx1ZVwiOlwibnVtYmVyXCJ9fX0sXCJzb3VyY2VfY2FudmFzXCI6e1widHlwZVwiOntcInJlcXVpcmVkXCI6dHJ1ZSxcInR5cGVcIjpcImVudW1cIixcInZhbHVlc1wiOntcImNhbnZhc1wiOnt9fX0sXCJjb29yZGluYXRlc1wiOntcInJlcXVpcmVkXCI6dHJ1ZSxcInR5cGVcIjpcImFycmF5XCIsXCJsZW5ndGhcIjo0LFwidmFsdWVcIjp7XCJ0eXBlXCI6XCJhcnJheVwiLFwibGVuZ3RoXCI6MixcInZhbHVlXCI6XCJudW1iZXJcIn19LFwiYW5pbWF0ZVwiOntcInR5cGVcIjpcImJvb2xlYW5cIixcImRlZmF1bHRcIjpcInRydWVcIn0sXCJjYW52YXNcIjp7XCJ0eXBlXCI6XCJzdHJpbmdcIixcInJlcXVpcmVkXCI6dHJ1ZX19LFwibGF5ZXJcIjp7XCJpZFwiOntcInR5cGVcIjpcInN0cmluZ1wiLFwicmVxdWlyZWRcIjp0cnVlfSxcInR5cGVcIjp7XCJ0eXBlXCI6XCJlbnVtXCIsXCJ2YWx1ZXNcIjp7XCJmaWxsXCI6e30sXCJsaW5lXCI6e30sXCJzeW1ib2xcIjp7fSxcImNpcmNsZVwiOnt9LFwiZmlsbC1leHRydXNpb25cIjp7fSxcInJhc3RlclwiOnt9LFwiYmFja2dyb3VuZFwiOnt9fX0sXCJtZXRhZGF0YVwiOntcInR5cGVcIjpcIipcIn0sXCJyZWZcIjp7XCJ0eXBlXCI6XCJzdHJpbmdcIn0sXCJzb3VyY2VcIjp7XCJ0eXBlXCI6XCJzdHJpbmdcIn0sXCJzb3VyY2UtbGF5ZXJcIjp7XCJ0eXBlXCI6XCJzdHJpbmdcIn0sXCJtaW56b29tXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJtaW5pbXVtXCI6MCxcIm1heGltdW1cIjoyNH0sXCJtYXh6b29tXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJtaW5pbXVtXCI6MCxcIm1heGltdW1cIjoyNH0sXCJmaWx0ZXJcIjp7XCJ0eXBlXCI6XCJmaWx0ZXJcIn0sXCJsYXlvdXRcIjp7XCJ0eXBlXCI6XCJsYXlvdXRcIn0sXCJwYWludFwiOntcInR5cGVcIjpcInBhaW50XCJ9LFwicGFpbnQuKlwiOntcInR5cGVcIjpcInBhaW50XCJ9fSxcImxheW91dFwiOltcImxheW91dF9maWxsXCIsXCJsYXlvdXRfbGluZVwiLFwibGF5b3V0X2NpcmNsZVwiLFwibGF5b3V0X2ZpbGwtZXh0cnVzaW9uXCIsXCJsYXlvdXRfc3ltYm9sXCIsXCJsYXlvdXRfcmFzdGVyXCIsXCJsYXlvdXRfYmFja2dyb3VuZFwiXSxcImxheW91dF9iYWNrZ3JvdW5kXCI6e1widmlzaWJpbGl0eVwiOntcInR5cGVcIjpcImVudW1cIixcInZhbHVlc1wiOntcInZpc2libGVcIjp7fSxcIm5vbmVcIjp7fX0sXCJkZWZhdWx0XCI6XCJ2aXNpYmxlXCJ9fSxcImxheW91dF9maWxsXCI6e1widmlzaWJpbGl0eVwiOntcInR5cGVcIjpcImVudW1cIixcInZhbHVlc1wiOntcInZpc2libGVcIjp7fSxcIm5vbmVcIjp7fX0sXCJkZWZhdWx0XCI6XCJ2aXNpYmxlXCJ9fSxcImxheW91dF9jaXJjbGVcIjp7XCJ2aXNpYmlsaXR5XCI6e1widHlwZVwiOlwiZW51bVwiLFwidmFsdWVzXCI6e1widmlzaWJsZVwiOnt9LFwibm9uZVwiOnt9fSxcImRlZmF1bHRcIjpcInZpc2libGVcIn19LFwibGF5b3V0X2ZpbGwtZXh0cnVzaW9uXCI6e1widmlzaWJpbGl0eVwiOntcInR5cGVcIjpcImVudW1cIixcInZhbHVlc1wiOntcInZpc2libGVcIjp7fSxcIm5vbmVcIjp7fX0sXCJkZWZhdWx0XCI6XCJ2aXNpYmxlXCJ9fSxcImxheW91dF9saW5lXCI6e1wibGluZS1jYXBcIjp7XCJ0eXBlXCI6XCJlbnVtXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInZhbHVlc1wiOntcImJ1dHRcIjp7fSxcInJvdW5kXCI6e30sXCJzcXVhcmVcIjp7fX0sXCJkZWZhdWx0XCI6XCJidXR0XCJ9LFwibGluZS1qb2luXCI6e1widHlwZVwiOlwiZW51bVwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJ2YWx1ZXNcIjp7XCJiZXZlbFwiOnt9LFwicm91bmRcIjp7fSxcIm1pdGVyXCI6e319LFwiZGVmYXVsdFwiOlwibWl0ZXJcIn0sXCJsaW5lLW1pdGVyLWxpbWl0XCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwicmVxdWlyZXNcIjpbe1wibGluZS1qb2luXCI6XCJtaXRlclwifV19LFwibGluZS1yb3VuZC1saW1pdFwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjEuMDUsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInJlcXVpcmVzXCI6W3tcImxpbmUtam9pblwiOlwicm91bmRcIn1dfSxcInZpc2liaWxpdHlcIjp7XCJ0eXBlXCI6XCJlbnVtXCIsXCJ2YWx1ZXNcIjp7XCJ2aXNpYmxlXCI6e30sXCJub25lXCI6e319LFwiZGVmYXVsdFwiOlwidmlzaWJsZVwifX0sXCJsYXlvdXRfc3ltYm9sXCI6e1wic3ltYm9sLXBsYWNlbWVudFwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwidmFsdWVzXCI6e1wicG9pbnRcIjp7fSxcImxpbmVcIjp7fX0sXCJkZWZhdWx0XCI6XCJwb2ludFwifSxcInN5bWJvbC1zcGFjaW5nXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MjUwLFwibWluaW11bVwiOjEsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInVuaXRzXCI6XCJwaXhlbHNcIixcInJlcXVpcmVzXCI6W3tcInN5bWJvbC1wbGFjZW1lbnRcIjpcImxpbmVcIn1dfSxcInN5bWJvbC1hdm9pZC1lZGdlc1wiOntcInR5cGVcIjpcImJvb2xlYW5cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwiZGVmYXVsdFwiOmZhbHNlfSxcImljb24tYWxsb3ctb3ZlcmxhcFwiOntcInR5cGVcIjpcImJvb2xlYW5cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwiZGVmYXVsdFwiOmZhbHNlLFwicmVxdWlyZXNcIjpbXCJpY29uLWltYWdlXCJdfSxcImljb24taWdub3JlLXBsYWNlbWVudFwiOntcInR5cGVcIjpcImJvb2xlYW5cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwiZGVmYXVsdFwiOmZhbHNlLFwicmVxdWlyZXNcIjpbXCJpY29uLWltYWdlXCJdfSxcImljb24tb3B0aW9uYWxcIjp7XCJ0eXBlXCI6XCJib29sZWFuXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcImRlZmF1bHRcIjpmYWxzZSxcInJlcXVpcmVzXCI6W1wiaWNvbi1pbWFnZVwiLFwidGV4dC1maWVsZFwiXX0sXCJpY29uLXJvdGF0aW9uLWFsaWdubWVudFwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwidmFsdWVzXCI6e1wibWFwXCI6e30sXCJ2aWV3cG9ydFwiOnt9LFwiYXV0b1wiOnt9fSxcImRlZmF1bHRcIjpcImF1dG9cIixcInJlcXVpcmVzXCI6W1wiaWNvbi1pbWFnZVwiXX0sXCJpY29uLXNpemVcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjoxLFwibWluaW11bVwiOjAsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInJlcXVpcmVzXCI6W1wiaWNvbi1pbWFnZVwiXX0sXCJpY29uLXRleHQtZml0XCI6e1widHlwZVwiOlwiZW51bVwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJ2YWx1ZXNcIjp7XCJub25lXCI6e30sXCJ3aWR0aFwiOnt9LFwiaGVpZ2h0XCI6e30sXCJib3RoXCI6e319LFwiZGVmYXVsdFwiOlwibm9uZVwiLFwicmVxdWlyZXNcIjpbXCJpY29uLWltYWdlXCIsXCJ0ZXh0LWZpZWxkXCJdfSxcImljb24tdGV4dC1maXQtcGFkZGluZ1wiOntcInR5cGVcIjpcImFycmF5XCIsXCJ2YWx1ZVwiOlwibnVtYmVyXCIsXCJsZW5ndGhcIjo0LFwiZGVmYXVsdFwiOlswLDAsMCwwXSxcInVuaXRzXCI6XCJwaXhlbHNcIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwicmVxdWlyZXNcIjpbXCJpY29uLWltYWdlXCIsXCJ0ZXh0LWZpZWxkXCIse1wiaWNvbi10ZXh0LWZpdFwiOltcImJvdGhcIixcIndpZHRoXCIsXCJoZWlnaHRcIl19XX0sXCJpY29uLWltYWdlXCI6e1widHlwZVwiOlwic3RyaW5nXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInRva2Vuc1wiOnRydWV9LFwiaWNvbi1yb3RhdGVcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjowLFwicGVyaW9kXCI6MzYwLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJwcm9wZXJ0eS1mdW5jdGlvblwiOnRydWUsXCJ1bml0c1wiOlwiZGVncmVlc1wiLFwicmVxdWlyZXNcIjpbXCJpY29uLWltYWdlXCJdfSxcImljb24tcGFkZGluZ1wiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjIsXCJtaW5pbXVtXCI6MCxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwidW5pdHNcIjpcInBpeGVsc1wiLFwicmVxdWlyZXNcIjpbXCJpY29uLWltYWdlXCJdfSxcImljb24ta2VlcC11cHJpZ2h0XCI6e1widHlwZVwiOlwiYm9vbGVhblwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJkZWZhdWx0XCI6ZmFsc2UsXCJyZXF1aXJlc1wiOltcImljb24taW1hZ2VcIix7XCJpY29uLXJvdGF0aW9uLWFsaWdubWVudFwiOlwibWFwXCJ9LHtcInN5bWJvbC1wbGFjZW1lbnRcIjpcImxpbmVcIn1dfSxcImljb24tb2Zmc2V0XCI6e1widHlwZVwiOlwiYXJyYXlcIixcInZhbHVlXCI6XCJudW1iZXJcIixcImxlbmd0aFwiOjIsXCJkZWZhdWx0XCI6WzAsMF0sXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInByb3BlcnR5LWZ1bmN0aW9uXCI6dHJ1ZSxcInJlcXVpcmVzXCI6W1wiaWNvbi1pbWFnZVwiXX0sXCJ0ZXh0LXBpdGNoLWFsaWdubWVudFwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwidmFsdWVzXCI6e1wibWFwXCI6e30sXCJ2aWV3cG9ydFwiOnt9LFwiYXV0b1wiOnt9fSxcImRlZmF1bHRcIjpcImF1dG9cIixcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiXX0sXCJ0ZXh0LXJvdGF0aW9uLWFsaWdubWVudFwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwidmFsdWVzXCI6e1wibWFwXCI6e30sXCJ2aWV3cG9ydFwiOnt9LFwiYXV0b1wiOnt9fSxcImRlZmF1bHRcIjpcImF1dG9cIixcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiXX0sXCJ0ZXh0LWZpZWxkXCI6e1widHlwZVwiOlwic3RyaW5nXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcImRlZmF1bHRcIjpcIlwiLFwidG9rZW5zXCI6dHJ1ZX0sXCJ0ZXh0LWZvbnRcIjp7XCJ0eXBlXCI6XCJhcnJheVwiLFwidmFsdWVcIjpcInN0cmluZ1wiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJkZWZhdWx0XCI6W1wiT3BlbiBTYW5zIFJlZ3VsYXJcIixcIkFyaWFsIFVuaWNvZGUgTVMgUmVndWxhclwiXSxcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiXX0sXCJ0ZXh0LXNpemVcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjoxNixcIm1pbmltdW1cIjowLFwidW5pdHNcIjpcInBpeGVsc1wiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIl19LFwidGV4dC1tYXgtd2lkdGhcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjoxMCxcIm1pbmltdW1cIjowLFwidW5pdHNcIjpcImVtc1wiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIl19LFwidGV4dC1saW5lLWhlaWdodFwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjEuMixcInVuaXRzXCI6XCJlbXNcIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCJdfSxcInRleHQtbGV0dGVyLXNwYWNpbmdcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjowLFwidW5pdHNcIjpcImVtc1wiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIl19LFwidGV4dC1qdXN0aWZ5XCI6e1widHlwZVwiOlwiZW51bVwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJ2YWx1ZXNcIjp7XCJsZWZ0XCI6e30sXCJjZW50ZXJcIjp7fSxcInJpZ2h0XCI6e319LFwiZGVmYXVsdFwiOlwiY2VudGVyXCIsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIl19LFwidGV4dC1hbmNob3JcIjp7XCJ0eXBlXCI6XCJlbnVtXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInZhbHVlc1wiOntcImNlbnRlclwiOnt9LFwibGVmdFwiOnt9LFwicmlnaHRcIjp7fSxcInRvcFwiOnt9LFwiYm90dG9tXCI6e30sXCJ0b3AtbGVmdFwiOnt9LFwidG9wLXJpZ2h0XCI6e30sXCJib3R0b20tbGVmdFwiOnt9LFwiYm90dG9tLXJpZ2h0XCI6e319LFwiZGVmYXVsdFwiOlwiY2VudGVyXCIsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIl19LFwidGV4dC1tYXgtYW5nbGVcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjo0NSxcInVuaXRzXCI6XCJkZWdyZWVzXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiLHtcInN5bWJvbC1wbGFjZW1lbnRcIjpcImxpbmVcIn1dfSxcInRleHQtcm90YXRlXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MCxcInBlcmlvZFwiOjM2MCxcInVuaXRzXCI6XCJkZWdyZWVzXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiXX0sXCJ0ZXh0LXBhZGRpbmdcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjoyLFwibWluaW11bVwiOjAsXCJ1bml0c1wiOlwicGl4ZWxzXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiXX0sXCJ0ZXh0LWtlZXAtdXByaWdodFwiOntcInR5cGVcIjpcImJvb2xlYW5cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwiZGVmYXVsdFwiOnRydWUsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIix7XCJ0ZXh0LXJvdGF0aW9uLWFsaWdubWVudFwiOlwibWFwXCJ9LHtcInN5bWJvbC1wbGFjZW1lbnRcIjpcImxpbmVcIn1dfSxcInRleHQtdHJhbnNmb3JtXCI6e1widHlwZVwiOlwiZW51bVwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJ2YWx1ZXNcIjp7XCJub25lXCI6e30sXCJ1cHBlcmNhc2VcIjp7fSxcImxvd2VyY2FzZVwiOnt9fSxcImRlZmF1bHRcIjpcIm5vbmVcIixcInJlcXVpcmVzXCI6W1widGV4dC1maWVsZFwiXX0sXCJ0ZXh0LW9mZnNldFwiOntcInR5cGVcIjpcImFycmF5XCIsXCJ2YWx1ZVwiOlwibnVtYmVyXCIsXCJ1bml0c1wiOlwiZW1zXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcImxlbmd0aFwiOjIsXCJkZWZhdWx0XCI6WzAsMF0sXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIl19LFwidGV4dC1hbGxvdy1vdmVybGFwXCI6e1widHlwZVwiOlwiYm9vbGVhblwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJkZWZhdWx0XCI6ZmFsc2UsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIl19LFwidGV4dC1pZ25vcmUtcGxhY2VtZW50XCI6e1widHlwZVwiOlwiYm9vbGVhblwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJkZWZhdWx0XCI6ZmFsc2UsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIl19LFwidGV4dC1vcHRpb25hbFwiOntcInR5cGVcIjpcImJvb2xlYW5cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwiZGVmYXVsdFwiOmZhbHNlLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCIsXCJpY29uLWltYWdlXCJdfSxcInZpc2liaWxpdHlcIjp7XCJ0eXBlXCI6XCJlbnVtXCIsXCJ2YWx1ZXNcIjp7XCJ2aXNpYmxlXCI6e30sXCJub25lXCI6e319LFwiZGVmYXVsdFwiOlwidmlzaWJsZVwifX0sXCJsYXlvdXRfcmFzdGVyXCI6e1widmlzaWJpbGl0eVwiOntcInR5cGVcIjpcImVudW1cIixcInZhbHVlc1wiOntcInZpc2libGVcIjp7fSxcIm5vbmVcIjp7fX0sXCJkZWZhdWx0XCI6XCJ2aXNpYmxlXCJ9fSxcImZpbHRlclwiOntcInR5cGVcIjpcImFycmF5XCIsXCJ2YWx1ZVwiOlwiKlwifSxcImZpbHRlcl9vcGVyYXRvclwiOntcInR5cGVcIjpcImVudW1cIixcInZhbHVlc1wiOntcIj09XCI6e30sXCIhPVwiOnt9LFwiPlwiOnt9LFwiPj1cIjp7fSxcIjxcIjp7fSxcIjw9XCI6e30sXCJpblwiOnt9LFwiIWluXCI6e30sXCJhbGxcIjp7fSxcImFueVwiOnt9LFwibm9uZVwiOnt9LFwiaGFzXCI6e30sXCIhaGFzXCI6e319fSxcImdlb21ldHJ5X3R5cGVcIjp7XCJ0eXBlXCI6XCJlbnVtXCIsXCJ2YWx1ZXNcIjp7XCJQb2ludFwiOnt9LFwiTGluZVN0cmluZ1wiOnt9LFwiUG9seWdvblwiOnt9fX0sXCJmdW5jdGlvblwiOntcInN0b3BzXCI6e1widHlwZVwiOlwiYXJyYXlcIixcInZhbHVlXCI6XCJmdW5jdGlvbl9zdG9wXCJ9LFwiYmFzZVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjEsXCJtaW5pbXVtXCI6MH0sXCJwcm9wZXJ0eVwiOntcInR5cGVcIjpcInN0cmluZ1wiLFwiZGVmYXVsdFwiOlwiJHpvb21cIn0sXCJ0eXBlXCI6e1widHlwZVwiOlwiZW51bVwiLFwidmFsdWVzXCI6e1wiaWRlbnRpdHlcIjp7fSxcImV4cG9uZW50aWFsXCI6e30sXCJpbnRlcnZhbFwiOnt9LFwiY2F0ZWdvcmljYWxcIjp7fX0sXCJkZWZhdWx0XCI6XCJleHBvbmVudGlhbFwifSxcImNvbG9yU3BhY2VcIjp7XCJ0eXBlXCI6XCJlbnVtXCIsXCJ2YWx1ZXNcIjp7XCJyZ2JcIjp7fSxcImxhYlwiOnt9LFwiaGNsXCI6e319LFwiZGVmYXVsdFwiOlwicmdiXCJ9fSxcImZ1bmN0aW9uX3N0b3BcIjp7XCJ0eXBlXCI6XCJhcnJheVwiLFwibWluaW11bVwiOjAsXCJtYXhpbXVtXCI6MjIsXCJ2YWx1ZVwiOltcIm51bWJlclwiLFwiY29sb3JcIl0sXCJsZW5ndGhcIjoyfSxcImxpZ2h0XCI6e1wiYW5jaG9yXCI6e1widHlwZVwiOlwiZW51bVwiLFwiZGVmYXVsdFwiOlwidmlld3BvcnRcIixcInZhbHVlc1wiOntcIm1hcFwiOnt9LFwidmlld3BvcnRcIjp7fX0sXCJ0cmFuc2l0aW9uXCI6ZmFsc2V9LFwicG9zaXRpb25cIjp7XCJ0eXBlXCI6XCJhcnJheVwiLFwiZGVmYXVsdFwiOlsxLjE1LDIxMCwzMF0sXCJsZW5ndGhcIjozLFwidmFsdWVcIjpcIm51bWJlclwiLFwidHJhbnNpdGlvblwiOnRydWUsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInByb3BlcnR5LWZ1bmN0aW9uXCI6ZmFsc2V9LFwiY29sb3JcIjp7XCJ0eXBlXCI6XCJjb2xvclwiLFwiZGVmYXVsdFwiOlwiI2ZmZmZmZlwiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJwcm9wZXJ0eS1mdW5jdGlvblwiOmZhbHNlLFwidHJhbnNpdGlvblwiOnRydWV9LFwiaW50ZW5zaXR5XCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MC41LFwibWluaW11bVwiOjAsXCJtYXhpbXVtXCI6MSxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwicHJvcGVydHktZnVuY3Rpb25cIjpmYWxzZSxcInRyYW5zaXRpb25cIjp0cnVlfX0sXCJwYWludFwiOltcInBhaW50X2ZpbGxcIixcInBhaW50X2xpbmVcIixcInBhaW50X2NpcmNsZVwiLFwicGFpbnRfZmlsbC1leHRydXNpb25cIixcInBhaW50X3N5bWJvbFwiLFwicGFpbnRfcmFzdGVyXCIsXCJwYWludF9iYWNrZ3JvdW5kXCJdLFwicGFpbnRfZmlsbFwiOntcImZpbGwtYW50aWFsaWFzXCI6e1widHlwZVwiOlwiYm9vbGVhblwiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJkZWZhdWx0XCI6dHJ1ZX0sXCJmaWxsLW9wYWNpdHlcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwicHJvcGVydHktZnVuY3Rpb25cIjp0cnVlLFwiZGVmYXVsdFwiOjEsXCJtaW5pbXVtXCI6MCxcIm1heGltdW1cIjoxLFwidHJhbnNpdGlvblwiOnRydWV9LFwiZmlsbC1jb2xvclwiOntcInR5cGVcIjpcImNvbG9yXCIsXCJkZWZhdWx0XCI6XCIjMDAwMDAwXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInByb3BlcnR5LWZ1bmN0aW9uXCI6dHJ1ZSxcInRyYW5zaXRpb25cIjp0cnVlLFwicmVxdWlyZXNcIjpbe1wiIVwiOlwiZmlsbC1wYXR0ZXJuXCJ9XX0sXCJmaWxsLW91dGxpbmUtY29sb3JcIjp7XCJ0eXBlXCI6XCJjb2xvclwiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJwcm9wZXJ0eS1mdW5jdGlvblwiOnRydWUsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInJlcXVpcmVzXCI6W3tcIiFcIjpcImZpbGwtcGF0dGVyblwifSx7XCJmaWxsLWFudGlhbGlhc1wiOnRydWV9XX0sXCJmaWxsLXRyYW5zbGF0ZVwiOntcInR5cGVcIjpcImFycmF5XCIsXCJ2YWx1ZVwiOlwibnVtYmVyXCIsXCJsZW5ndGhcIjoyLFwiZGVmYXVsdFwiOlswLDBdLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInVuaXRzXCI6XCJwaXhlbHNcIn0sXCJmaWxsLXRyYW5zbGF0ZS1hbmNob3JcIjp7XCJ0eXBlXCI6XCJlbnVtXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInZhbHVlc1wiOntcIm1hcFwiOnt9LFwidmlld3BvcnRcIjp7fX0sXCJkZWZhdWx0XCI6XCJtYXBcIixcInJlcXVpcmVzXCI6W1wiZmlsbC10cmFuc2xhdGVcIl19LFwiZmlsbC1wYXR0ZXJuXCI6e1widHlwZVwiOlwic3RyaW5nXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInRyYW5zaXRpb25cIjp0cnVlfX0sXCJwYWludF9maWxsLWV4dHJ1c2lvblwiOntcImZpbGwtZXh0cnVzaW9uLW9wYWNpdHlcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwicHJvcGVydHktZnVuY3Rpb25cIjpmYWxzZSxcImRlZmF1bHRcIjoxLFwibWluaW11bVwiOjAsXCJtYXhpbXVtXCI6MSxcInRyYW5zaXRpb25cIjp0cnVlfSxcImZpbGwtZXh0cnVzaW9uLWNvbG9yXCI6e1widHlwZVwiOlwiY29sb3JcIixcImRlZmF1bHRcIjpcIiMwMDAwMDBcIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwicHJvcGVydHktZnVuY3Rpb25cIjp0cnVlLFwidHJhbnNpdGlvblwiOnRydWUsXCJyZXF1aXJlc1wiOlt7XCIhXCI6XCJmaWxsLWV4dHJ1c2lvbi1wYXR0ZXJuXCJ9XX0sXCJmaWxsLWV4dHJ1c2lvbi10cmFuc2xhdGVcIjp7XCJ0eXBlXCI6XCJhcnJheVwiLFwidmFsdWVcIjpcIm51bWJlclwiLFwibGVuZ3RoXCI6MixcImRlZmF1bHRcIjpbMCwwXSxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwidHJhbnNpdGlvblwiOnRydWUsXCJ1bml0c1wiOlwicGl4ZWxzXCJ9LFwiZmlsbC1leHRydXNpb24tdHJhbnNsYXRlLWFuY2hvclwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwidmFsdWVzXCI6e1wibWFwXCI6e30sXCJ2aWV3cG9ydFwiOnt9fSxcImRlZmF1bHRcIjpcIm1hcFwiLFwicmVxdWlyZXNcIjpbXCJmaWxsLWV4dHJ1c2lvbi10cmFuc2xhdGVcIl19LFwiZmlsbC1leHRydXNpb24tcGF0dGVyblwiOntcInR5cGVcIjpcInN0cmluZ1wiLFwiZnVuY3Rpb25cIjpcInBpZWNld2lzZS1jb25zdGFudFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJ0cmFuc2l0aW9uXCI6dHJ1ZX0sXCJmaWxsLWV4dHJ1c2lvbi1oZWlnaHRcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwicHJvcGVydHktZnVuY3Rpb25cIjp0cnVlLFwiZGVmYXVsdFwiOjAsXCJtaW5pbXVtXCI6MCxcInVuaXRzXCI6XCJtZXRlcnNcIixcInRyYW5zaXRpb25cIjp0cnVlfSxcImZpbGwtZXh0cnVzaW9uLWJhc2VcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwicHJvcGVydHktZnVuY3Rpb25cIjp0cnVlLFwiZGVmYXVsdFwiOjAsXCJtaW5pbXVtXCI6MCxcInVuaXRzXCI6XCJtZXRlcnNcIixcInRyYW5zaXRpb25cIjp0cnVlLFwicmVxdWlyZXNcIjpbXCJmaWxsLWV4dHJ1c2lvbi1oZWlnaHRcIl19fSxcInBhaW50X2xpbmVcIjp7XCJsaW5lLW9wYWNpdHlcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwicHJvcGVydHktZnVuY3Rpb25cIjp0cnVlLFwiZGVmYXVsdFwiOjEsXCJtaW5pbXVtXCI6MCxcIm1heGltdW1cIjoxLFwidHJhbnNpdGlvblwiOnRydWV9LFwibGluZS1jb2xvclwiOntcInR5cGVcIjpcImNvbG9yXCIsXCJkZWZhdWx0XCI6XCIjMDAwMDAwXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInByb3BlcnR5LWZ1bmN0aW9uXCI6dHJ1ZSxcInRyYW5zaXRpb25cIjp0cnVlLFwicmVxdWlyZXNcIjpbe1wiIVwiOlwibGluZS1wYXR0ZXJuXCJ9XX0sXCJsaW5lLXRyYW5zbGF0ZVwiOntcInR5cGVcIjpcImFycmF5XCIsXCJ2YWx1ZVwiOlwibnVtYmVyXCIsXCJsZW5ndGhcIjoyLFwiZGVmYXVsdFwiOlswLDBdLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInVuaXRzXCI6XCJwaXhlbHNcIn0sXCJsaW5lLXRyYW5zbGF0ZS1hbmNob3JcIjp7XCJ0eXBlXCI6XCJlbnVtXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInZhbHVlc1wiOntcIm1hcFwiOnt9LFwidmlld3BvcnRcIjp7fX0sXCJkZWZhdWx0XCI6XCJtYXBcIixcInJlcXVpcmVzXCI6W1wibGluZS10cmFuc2xhdGVcIl19LFwibGluZS13aWR0aFwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjEsXCJtaW5pbXVtXCI6MCxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwidHJhbnNpdGlvblwiOnRydWUsXCJ1bml0c1wiOlwicGl4ZWxzXCJ9LFwibGluZS1nYXAtd2lkdGhcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjowLFwibWluaW11bVwiOjAsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInByb3BlcnR5LWZ1bmN0aW9uXCI6dHJ1ZSxcInRyYW5zaXRpb25cIjp0cnVlLFwidW5pdHNcIjpcInBpeGVsc1wifSxcImxpbmUtb2Zmc2V0XCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MCxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwicHJvcGVydHktZnVuY3Rpb25cIjp0cnVlLFwidHJhbnNpdGlvblwiOnRydWUsXCJ1bml0c1wiOlwicGl4ZWxzXCJ9LFwibGluZS1ibHVyXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MCxcIm1pbmltdW1cIjowLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJwcm9wZXJ0eS1mdW5jdGlvblwiOnRydWUsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInVuaXRzXCI6XCJwaXhlbHNcIn0sXCJsaW5lLWRhc2hhcnJheVwiOntcInR5cGVcIjpcImFycmF5XCIsXCJ2YWx1ZVwiOlwibnVtYmVyXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcIm1pbmltdW1cIjowLFwidHJhbnNpdGlvblwiOnRydWUsXCJ1bml0c1wiOlwibGluZSB3aWR0aHNcIixcInJlcXVpcmVzXCI6W3tcIiFcIjpcImxpbmUtcGF0dGVyblwifV19LFwibGluZS1wYXR0ZXJuXCI6e1widHlwZVwiOlwic3RyaW5nXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInRyYW5zaXRpb25cIjp0cnVlfX0sXCJwYWludF9jaXJjbGVcIjp7XCJjaXJjbGUtcmFkaXVzXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6NSxcIm1pbmltdW1cIjowLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJwcm9wZXJ0eS1mdW5jdGlvblwiOnRydWUsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInVuaXRzXCI6XCJwaXhlbHNcIn0sXCJjaXJjbGUtY29sb3JcIjp7XCJ0eXBlXCI6XCJjb2xvclwiLFwiZGVmYXVsdFwiOlwiIzAwMDAwMFwiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJwcm9wZXJ0eS1mdW5jdGlvblwiOnRydWUsXCJ0cmFuc2l0aW9uXCI6dHJ1ZX0sXCJjaXJjbGUtYmx1clwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjAsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInByb3BlcnR5LWZ1bmN0aW9uXCI6dHJ1ZSxcInRyYW5zaXRpb25cIjp0cnVlfSxcImNpcmNsZS1vcGFjaXR5XCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MSxcIm1pbmltdW1cIjowLFwibWF4aW11bVwiOjEsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInByb3BlcnR5LWZ1bmN0aW9uXCI6dHJ1ZSxcInRyYW5zaXRpb25cIjp0cnVlfSxcImNpcmNsZS10cmFuc2xhdGVcIjp7XCJ0eXBlXCI6XCJhcnJheVwiLFwidmFsdWVcIjpcIm51bWJlclwiLFwibGVuZ3RoXCI6MixcImRlZmF1bHRcIjpbMCwwXSxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwidHJhbnNpdGlvblwiOnRydWUsXCJ1bml0c1wiOlwicGl4ZWxzXCJ9LFwiY2lyY2xlLXRyYW5zbGF0ZS1hbmNob3JcIjp7XCJ0eXBlXCI6XCJlbnVtXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInZhbHVlc1wiOntcIm1hcFwiOnt9LFwidmlld3BvcnRcIjp7fX0sXCJkZWZhdWx0XCI6XCJtYXBcIixcInJlcXVpcmVzXCI6W1wiY2lyY2xlLXRyYW5zbGF0ZVwiXX0sXCJjaXJjbGUtcGl0Y2gtc2NhbGVcIjp7XCJ0eXBlXCI6XCJlbnVtXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInZhbHVlc1wiOntcIm1hcFwiOnt9LFwidmlld3BvcnRcIjp7fX0sXCJkZWZhdWx0XCI6XCJtYXBcIn0sXCJjaXJjbGUtc3Ryb2tlLXdpZHRoXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MCxcIm1pbmltdW1cIjowLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJwcm9wZXJ0eS1mdW5jdGlvblwiOnRydWUsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInVuaXRzXCI6XCJwaXhlbHNcIn0sXCJjaXJjbGUtc3Ryb2tlLWNvbG9yXCI6e1widHlwZVwiOlwiY29sb3JcIixcImRlZmF1bHRcIjpcIiMwMDAwMDBcIixcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwicHJvcGVydHktZnVuY3Rpb25cIjp0cnVlLFwidHJhbnNpdGlvblwiOnRydWV9LFwiY2lyY2xlLXN0cm9rZS1vcGFjaXR5XCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MSxcIm1pbmltdW1cIjowLFwibWF4aW11bVwiOjEsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInByb3BlcnR5LWZ1bmN0aW9uXCI6dHJ1ZSxcInRyYW5zaXRpb25cIjp0cnVlfX0sXCJwYWludF9zeW1ib2xcIjp7XCJpY29uLW9wYWNpdHlcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjoxLFwibWluaW11bVwiOjAsXCJtYXhpbXVtXCI6MSxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwidHJhbnNpdGlvblwiOnRydWUsXCJyZXF1aXJlc1wiOltcImljb24taW1hZ2VcIl19LFwiaWNvbi1jb2xvclwiOntcInR5cGVcIjpcImNvbG9yXCIsXCJkZWZhdWx0XCI6XCIjMDAwMDAwXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInRyYW5zaXRpb25cIjp0cnVlLFwicmVxdWlyZXNcIjpbXCJpY29uLWltYWdlXCJdfSxcImljb24taGFsby1jb2xvclwiOntcInR5cGVcIjpcImNvbG9yXCIsXCJkZWZhdWx0XCI6XCJyZ2JhKDAsIDAsIDAsIDApXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInRyYW5zaXRpb25cIjp0cnVlLFwicmVxdWlyZXNcIjpbXCJpY29uLWltYWdlXCJdfSxcImljb24taGFsby13aWR0aFwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjAsXCJtaW5pbXVtXCI6MCxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwidHJhbnNpdGlvblwiOnRydWUsXCJ1bml0c1wiOlwicGl4ZWxzXCIsXCJyZXF1aXJlc1wiOltcImljb24taW1hZ2VcIl19LFwiaWNvbi1oYWxvLWJsdXJcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjowLFwibWluaW11bVwiOjAsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInRyYW5zaXRpb25cIjp0cnVlLFwidW5pdHNcIjpcInBpeGVsc1wiLFwicmVxdWlyZXNcIjpbXCJpY29uLWltYWdlXCJdfSxcImljb24tdHJhbnNsYXRlXCI6e1widHlwZVwiOlwiYXJyYXlcIixcInZhbHVlXCI6XCJudW1iZXJcIixcImxlbmd0aFwiOjIsXCJkZWZhdWx0XCI6WzAsMF0sXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInRyYW5zaXRpb25cIjp0cnVlLFwidW5pdHNcIjpcInBpeGVsc1wiLFwicmVxdWlyZXNcIjpbXCJpY29uLWltYWdlXCJdfSxcImljb24tdHJhbnNsYXRlLWFuY2hvclwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwidmFsdWVzXCI6e1wibWFwXCI6e30sXCJ2aWV3cG9ydFwiOnt9fSxcImRlZmF1bHRcIjpcIm1hcFwiLFwicmVxdWlyZXNcIjpbXCJpY29uLWltYWdlXCIsXCJpY29uLXRyYW5zbGF0ZVwiXX0sXCJ0ZXh0LW9wYWNpdHlcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjoxLFwibWluaW11bVwiOjAsXCJtYXhpbXVtXCI6MSxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwidHJhbnNpdGlvblwiOnRydWUsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIl19LFwidGV4dC1jb2xvclwiOntcInR5cGVcIjpcImNvbG9yXCIsXCJkZWZhdWx0XCI6XCIjMDAwMDAwXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInRyYW5zaXRpb25cIjp0cnVlLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCJdfSxcInRleHQtaGFsby1jb2xvclwiOntcInR5cGVcIjpcImNvbG9yXCIsXCJkZWZhdWx0XCI6XCJyZ2JhKDAsIDAsIDAsIDApXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInRyYW5zaXRpb25cIjp0cnVlLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCJdfSxcInRleHQtaGFsby13aWR0aFwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjAsXCJtaW5pbXVtXCI6MCxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwidHJhbnNpdGlvblwiOnRydWUsXCJ1bml0c1wiOlwicGl4ZWxzXCIsXCJyZXF1aXJlc1wiOltcInRleHQtZmllbGRcIl19LFwidGV4dC1oYWxvLWJsdXJcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjowLFwibWluaW11bVwiOjAsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInRyYW5zaXRpb25cIjp0cnVlLFwidW5pdHNcIjpcInBpeGVsc1wiLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCJdfSxcInRleHQtdHJhbnNsYXRlXCI6e1widHlwZVwiOlwiYXJyYXlcIixcInZhbHVlXCI6XCJudW1iZXJcIixcImxlbmd0aFwiOjIsXCJkZWZhdWx0XCI6WzAsMF0sXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInRyYW5zaXRpb25cIjp0cnVlLFwidW5pdHNcIjpcInBpeGVsc1wiLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCJdfSxcInRleHQtdHJhbnNsYXRlLWFuY2hvclwiOntcInR5cGVcIjpcImVudW1cIixcImZ1bmN0aW9uXCI6XCJwaWVjZXdpc2UtY29uc3RhbnRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwidmFsdWVzXCI6e1wibWFwXCI6e30sXCJ2aWV3cG9ydFwiOnt9fSxcImRlZmF1bHRcIjpcIm1hcFwiLFwicmVxdWlyZXNcIjpbXCJ0ZXh0LWZpZWxkXCIsXCJ0ZXh0LXRyYW5zbGF0ZVwiXX19LFwicGFpbnRfcmFzdGVyXCI6e1wicmFzdGVyLW9wYWNpdHlcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjoxLFwibWluaW11bVwiOjAsXCJtYXhpbXVtXCI6MSxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwidHJhbnNpdGlvblwiOnRydWV9LFwicmFzdGVyLWh1ZS1yb3RhdGVcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjowLFwicGVyaW9kXCI6MzYwLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInVuaXRzXCI6XCJkZWdyZWVzXCJ9LFwicmFzdGVyLWJyaWdodG5lc3MtbWluXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJmdW5jdGlvblwiOlwiaW50ZXJwb2xhdGVkXCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcImRlZmF1bHRcIjowLFwibWluaW11bVwiOjAsXCJtYXhpbXVtXCI6MSxcInRyYW5zaXRpb25cIjp0cnVlfSxcInJhc3Rlci1icmlnaHRuZXNzLW1heFwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJkZWZhdWx0XCI6MSxcIm1pbmltdW1cIjowLFwibWF4aW11bVwiOjEsXCJ0cmFuc2l0aW9uXCI6dHJ1ZX0sXCJyYXN0ZXItc2F0dXJhdGlvblwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjAsXCJtaW5pbXVtXCI6LTEsXCJtYXhpbXVtXCI6MSxcImZ1bmN0aW9uXCI6XCJpbnRlcnBvbGF0ZWRcIixcInpvb20tZnVuY3Rpb25cIjp0cnVlLFwidHJhbnNpdGlvblwiOnRydWV9LFwicmFzdGVyLWNvbnRyYXN0XCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MCxcIm1pbmltdW1cIjotMSxcIm1heGltdW1cIjoxLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJ0cmFuc2l0aW9uXCI6dHJ1ZX0sXCJyYXN0ZXItZmFkZS1kdXJhdGlvblwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjMwMCxcIm1pbmltdW1cIjowLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInVuaXRzXCI6XCJtaWxsaXNlY29uZHNcIn19LFwicGFpbnRfYmFja2dyb3VuZFwiOntcImJhY2tncm91bmQtY29sb3JcIjp7XCJ0eXBlXCI6XCJjb2xvclwiLFwiZGVmYXVsdFwiOlwiIzAwMDAwMFwiLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJ0cmFuc2l0aW9uXCI6dHJ1ZSxcInJlcXVpcmVzXCI6W3tcIiFcIjpcImJhY2tncm91bmQtcGF0dGVyblwifV19LFwiYmFja2dyb3VuZC1wYXR0ZXJuXCI6e1widHlwZVwiOlwic3RyaW5nXCIsXCJmdW5jdGlvblwiOlwicGllY2V3aXNlLWNvbnN0YW50XCIsXCJ6b29tLWZ1bmN0aW9uXCI6dHJ1ZSxcInRyYW5zaXRpb25cIjp0cnVlfSxcImJhY2tncm91bmQtb3BhY2l0eVwiOntcInR5cGVcIjpcIm51bWJlclwiLFwiZGVmYXVsdFwiOjEsXCJtaW5pbXVtXCI6MCxcIm1heGltdW1cIjoxLFwiZnVuY3Rpb25cIjpcImludGVycG9sYXRlZFwiLFwiem9vbS1mdW5jdGlvblwiOnRydWUsXCJ0cmFuc2l0aW9uXCI6dHJ1ZX19LFwidHJhbnNpdGlvblwiOntcImR1cmF0aW9uXCI6e1widHlwZVwiOlwibnVtYmVyXCIsXCJkZWZhdWx0XCI6MzAwLFwibWluaW11bVwiOjAsXCJ1bml0c1wiOlwibWlsbGlzZWNvbmRzXCJ9LFwiZGVsYXlcIjp7XCJ0eXBlXCI6XCJudW1iZXJcIixcImRlZmF1bHRcIjowLFwibWluaW11bVwiOjAsXCJ1bml0c1wiOlwibWlsbGlzZWNvbmRzXCJ9fX0iLCIndXNlIHN0cmljdCc7XG5cbmlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cykge1xuICAgIG1vZHVsZS5leHBvcnRzID0gaXNTdXBwb3J0ZWQ7XG59IGVsc2UgaWYgKHdpbmRvdykge1xuICAgIHdpbmRvdy5tYXBib3hnbCA9IHdpbmRvdy5tYXBib3hnbCB8fCB7fTtcbiAgICB3aW5kb3cubWFwYm94Z2wuc3VwcG9ydGVkID0gaXNTdXBwb3J0ZWQ7XG59XG5cbi8qKlxuICogVGVzdCB3aGV0aGVyIHRoZSBjdXJyZW50IGJyb3dzZXIgc3VwcG9ydHMgTWFwYm94IEdMIEpTXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5mYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0PWZhbHNlXSBSZXR1cm4gYGZhbHNlYFxuICogICBpZiB0aGUgcGVyZm9ybWFuY2Ugb2YgTWFwYm94IEdMIEpTIHdvdWxkIGJlIGRyYW1hdGljYWxseSB3b3JzZSB0aGFuXG4gKiAgIGV4cGVjdGVkIChpLmUuIGEgc29mdHdhcmUgcmVuZGVyZXIgaXMgd291bGQgYmUgdXNlZClcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzU3VwcG9ydGVkKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gISEoXG4gICAgICAgIGlzQnJvd3NlcigpICYmXG4gICAgICAgIGlzQXJyYXlTdXBwb3J0ZWQoKSAmJlxuICAgICAgICBpc0Z1bmN0aW9uU3VwcG9ydGVkKCkgJiZcbiAgICAgICAgaXNPYmplY3RTdXBwb3J0ZWQoKSAmJlxuICAgICAgICBpc0pTT05TdXBwb3J0ZWQoKSAmJlxuICAgICAgICBpc1dvcmtlclN1cHBvcnRlZCgpICYmXG4gICAgICAgIGlzVWludDhDbGFtcGVkQXJyYXlTdXBwb3J0ZWQoKSAmJlxuICAgICAgICBpc1dlYkdMU3VwcG9ydGVkQ2FjaGVkKG9wdGlvbnMgJiYgb3B0aW9ucy5mYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0KVxuICAgICk7XG59XG5cbmZ1bmN0aW9uIGlzQnJvd3NlcigpIHtcbiAgICByZXR1cm4gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJztcbn1cblxuZnVuY3Rpb24gaXNBcnJheVN1cHBvcnRlZCgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgICBBcnJheS5wcm90b3R5cGUgJiZcbiAgICAgICAgQXJyYXkucHJvdG90eXBlLmV2ZXJ5ICYmXG4gICAgICAgIEFycmF5LnByb3RvdHlwZS5maWx0ZXIgJiZcbiAgICAgICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2ggJiZcbiAgICAgICAgQXJyYXkucHJvdG90eXBlLmluZGV4T2YgJiZcbiAgICAgICAgQXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mICYmXG4gICAgICAgIEFycmF5LnByb3RvdHlwZS5tYXAgJiZcbiAgICAgICAgQXJyYXkucHJvdG90eXBlLnNvbWUgJiZcbiAgICAgICAgQXJyYXkucHJvdG90eXBlLnJlZHVjZSAmJlxuICAgICAgICBBcnJheS5wcm90b3R5cGUucmVkdWNlUmlnaHQgJiZcbiAgICAgICAgQXJyYXkuaXNBcnJheVxuICAgICk7XG59XG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb25TdXBwb3J0ZWQoKSB7XG4gICAgcmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZSAmJiBGdW5jdGlvbi5wcm90b3R5cGUuYmluZDtcbn1cblxuZnVuY3Rpb24gaXNPYmplY3RTdXBwb3J0ZWQoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICAgT2JqZWN0LmtleXMgJiZcbiAgICAgICAgT2JqZWN0LmNyZWF0ZSAmJlxuICAgICAgICBPYmplY3QuZ2V0UHJvdG90eXBlT2YgJiZcbiAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgJiZcbiAgICAgICAgT2JqZWN0LmlzU2VhbGVkICYmXG4gICAgICAgIE9iamVjdC5pc0Zyb3plbiAmJlxuICAgICAgICBPYmplY3QuaXNFeHRlbnNpYmxlICYmXG4gICAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgJiZcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5ICYmXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzICYmXG4gICAgICAgIE9iamVjdC5zZWFsICYmXG4gICAgICAgIE9iamVjdC5mcmVlemUgJiZcbiAgICAgICAgT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zXG4gICAgKTtcbn1cblxuZnVuY3Rpb24gaXNKU09OU3VwcG9ydGVkKCkge1xuICAgIHJldHVybiAnSlNPTicgaW4gd2luZG93ICYmICdwYXJzZScgaW4gSlNPTiAmJiAnc3RyaW5naWZ5JyBpbiBKU09OO1xufVxuXG5mdW5jdGlvbiBpc1dvcmtlclN1cHBvcnRlZCgpIHtcbiAgICByZXR1cm4gJ1dvcmtlcicgaW4gd2luZG93O1xufVxuXG4vLyBJRTExIG9ubHkgc3VwcG9ydHMgYFVpbnQ4Q2xhbXBlZEFycmF5YCBhcyBvZiB2ZXJzaW9uXG4vLyBbS0IyOTI5NDM3XShodHRwczovL3N1cHBvcnQubWljcm9zb2Z0LmNvbS9lbi11cy9rYi8yOTI5NDM3KVxuZnVuY3Rpb24gaXNVaW50OENsYW1wZWRBcnJheVN1cHBvcnRlZCgpIHtcbiAgICByZXR1cm4gJ1VpbnQ4Q2xhbXBlZEFycmF5JyBpbiB3aW5kb3c7XG59XG5cbnZhciBpc1dlYkdMU3VwcG9ydGVkQ2FjaGUgPSB7fTtcbmZ1bmN0aW9uIGlzV2ViR0xTdXBwb3J0ZWRDYWNoZWQoZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdCkge1xuXG4gICAgaWYgKGlzV2ViR0xTdXBwb3J0ZWRDYWNoZVtmYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlzV2ViR0xTdXBwb3J0ZWRDYWNoZVtmYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0XSA9IGlzV2ViR0xTdXBwb3J0ZWQoZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGlzV2ViR0xTdXBwb3J0ZWRDYWNoZVtmYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0XTtcbn1cblxuaXNTdXBwb3J0ZWQud2ViR0xDb250ZXh0QXR0cmlidXRlcyA9IHtcbiAgICBhbnRpYWxpYXM6IGZhbHNlLFxuICAgIGFscGhhOiB0cnVlLFxuICAgIHN0ZW5jaWw6IHRydWUsXG4gICAgZGVwdGg6IHRydWVcbn07XG5cbmZ1bmN0aW9uIGlzV2ViR0xTdXBwb3J0ZWQoZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdCkge1xuXG4gICAgdmFyIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuXG4gICAgdmFyIGF0dHJpYnV0ZXMgPSBPYmplY3QuY3JlYXRlKGlzU3VwcG9ydGVkLndlYkdMQ29udGV4dEF0dHJpYnV0ZXMpO1xuICAgIGF0dHJpYnV0ZXMuZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdCA9IGZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQ7XG5cbiAgICBpZiAoY2FudmFzLnByb2JhYmx5U3VwcG9ydHNDb250ZXh0KSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBjYW52YXMucHJvYmFibHlTdXBwb3J0c0NvbnRleHQoJ3dlYmdsJywgYXR0cmlidXRlcykgfHxcbiAgICAgICAgICAgIGNhbnZhcy5wcm9iYWJseVN1cHBvcnRzQ29udGV4dCgnZXhwZXJpbWVudGFsLXdlYmdsJywgYXR0cmlidXRlcylcbiAgICAgICAgKTtcblxuICAgIH0gZWxzZSBpZiAoY2FudmFzLnN1cHBvcnRzQ29udGV4dCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgY2FudmFzLnN1cHBvcnRzQ29udGV4dCgnd2ViZ2wnLCBhdHRyaWJ1dGVzKSB8fFxuICAgICAgICAgICAgY2FudmFzLnN1cHBvcnRzQ29udGV4dCgnZXhwZXJpbWVudGFsLXdlYmdsJywgYXR0cmlidXRlcylcbiAgICAgICAgKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBjYW52YXMuZ2V0Q29udGV4dCgnd2ViZ2wnLCBhdHRyaWJ1dGVzKSB8fFxuICAgICAgICAgICAgY2FudmFzLmdldENvbnRleHQoJ2V4cGVyaW1lbnRhbC13ZWJnbCcsIGF0dHJpYnV0ZXMpXG4gICAgICAgICk7XG4gICAgfVxufVxuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIHJlc29sdmVzIC4gYW5kIC4uIGVsZW1lbnRzIGluIGEgcGF0aCBhcnJheSB3aXRoIGRpcmVjdG9yeSBuYW1lcyB0aGVyZVxuLy8gbXVzdCBiZSBubyBzbGFzaGVzLCBlbXB0eSBlbGVtZW50cywgb3IgZGV2aWNlIG5hbWVzIChjOlxcKSBpbiB0aGUgYXJyYXlcbi8vIChzbyBhbHNvIG5vIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHNsYXNoZXMgLSBpdCBkb2VzIG5vdCBkaXN0aW5ndWlzaFxuLy8gcmVsYXRpdmUgYW5kIGFic29sdXRlIHBhdGhzKVxuZnVuY3Rpb24gbm9ybWFsaXplQXJyYXkocGFydHMsIGFsbG93QWJvdmVSb290KSB7XG4gIC8vIGlmIHRoZSBwYXRoIHRyaWVzIHRvIGdvIGFib3ZlIHRoZSByb290LCBgdXBgIGVuZHMgdXAgPiAwXG4gIHZhciB1cCA9IDA7XG4gIGZvciAodmFyIGkgPSBwYXJ0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIHZhciBsYXN0ID0gcGFydHNbaV07XG4gICAgaWYgKGxhc3QgPT09ICcuJykge1xuICAgICAgcGFydHMuc3BsaWNlKGksIDEpO1xuICAgIH0gZWxzZSBpZiAobGFzdCA9PT0gJy4uJykge1xuICAgICAgcGFydHMuc3BsaWNlKGksIDEpO1xuICAgICAgdXArKztcbiAgICB9IGVsc2UgaWYgKHVwKSB7XG4gICAgICBwYXJ0cy5zcGxpY2UoaSwgMSk7XG4gICAgICB1cC0tO1xuICAgIH1cbiAgfVxuXG4gIC8vIGlmIHRoZSBwYXRoIGlzIGFsbG93ZWQgdG8gZ28gYWJvdmUgdGhlIHJvb3QsIHJlc3RvcmUgbGVhZGluZyAuLnNcbiAgaWYgKGFsbG93QWJvdmVSb290KSB7XG4gICAgZm9yICg7IHVwLS07IHVwKSB7XG4gICAgICBwYXJ0cy51bnNoaWZ0KCcuLicpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwYXJ0cztcbn1cblxuLy8gU3BsaXQgYSBmaWxlbmFtZSBpbnRvIFtyb290LCBkaXIsIGJhc2VuYW1lLCBleHRdLCB1bml4IHZlcnNpb25cbi8vICdyb290JyBpcyBqdXN0IGEgc2xhc2gsIG9yIG5vdGhpbmcuXG52YXIgc3BsaXRQYXRoUmUgPVxuICAgIC9eKFxcLz98KShbXFxzXFxTXSo/KSgoPzpcXC57MSwyfXxbXlxcL10rP3wpKFxcLlteLlxcL10qfCkpKD86W1xcL10qKSQvO1xudmFyIHNwbGl0UGF0aCA9IGZ1bmN0aW9uKGZpbGVuYW1lKSB7XG4gIHJldHVybiBzcGxpdFBhdGhSZS5leGVjKGZpbGVuYW1lKS5zbGljZSgxKTtcbn07XG5cbi8vIHBhdGgucmVzb2x2ZShbZnJvbSAuLi5dLCB0bylcbi8vIHBvc2l4IHZlcnNpb25cbmV4cG9ydHMucmVzb2x2ZSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgcmVzb2x2ZWRQYXRoID0gJycsXG4gICAgICByZXNvbHZlZEFic29sdXRlID0gZmFsc2U7XG5cbiAgZm9yICh2YXIgaSA9IGFyZ3VtZW50cy5sZW5ndGggLSAxOyBpID49IC0xICYmICFyZXNvbHZlZEFic29sdXRlOyBpLS0pIHtcbiAgICB2YXIgcGF0aCA9IChpID49IDApID8gYXJndW1lbnRzW2ldIDogcHJvY2Vzcy5jd2QoKTtcblxuICAgIC8vIFNraXAgZW1wdHkgYW5kIGludmFsaWQgZW50cmllc1xuICAgIGlmICh0eXBlb2YgcGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50cyB0byBwYXRoLnJlc29sdmUgbXVzdCBiZSBzdHJpbmdzJyk7XG4gICAgfSBlbHNlIGlmICghcGF0aCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgcmVzb2x2ZWRQYXRoID0gcGF0aCArICcvJyArIHJlc29sdmVkUGF0aDtcbiAgICByZXNvbHZlZEFic29sdXRlID0gcGF0aC5jaGFyQXQoMCkgPT09ICcvJztcbiAgfVxuXG4gIC8vIEF0IHRoaXMgcG9pbnQgdGhlIHBhdGggc2hvdWxkIGJlIHJlc29sdmVkIHRvIGEgZnVsbCBhYnNvbHV0ZSBwYXRoLCBidXRcbiAgLy8gaGFuZGxlIHJlbGF0aXZlIHBhdGhzIHRvIGJlIHNhZmUgKG1pZ2h0IGhhcHBlbiB3aGVuIHByb2Nlc3MuY3dkKCkgZmFpbHMpXG5cbiAgLy8gTm9ybWFsaXplIHRoZSBwYXRoXG4gIHJlc29sdmVkUGF0aCA9IG5vcm1hbGl6ZUFycmF5KGZpbHRlcihyZXNvbHZlZFBhdGguc3BsaXQoJy8nKSwgZnVuY3Rpb24ocCkge1xuICAgIHJldHVybiAhIXA7XG4gIH0pLCAhcmVzb2x2ZWRBYnNvbHV0ZSkuam9pbignLycpO1xuXG4gIHJldHVybiAoKHJlc29sdmVkQWJzb2x1dGUgPyAnLycgOiAnJykgKyByZXNvbHZlZFBhdGgpIHx8ICcuJztcbn07XG5cbi8vIHBhdGgubm9ybWFsaXplKHBhdGgpXG4vLyBwb3NpeCB2ZXJzaW9uXG5leHBvcnRzLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uKHBhdGgpIHtcbiAgdmFyIGlzQWJzb2x1dGUgPSBleHBvcnRzLmlzQWJzb2x1dGUocGF0aCksXG4gICAgICB0cmFpbGluZ1NsYXNoID0gc3Vic3RyKHBhdGgsIC0xKSA9PT0gJy8nO1xuXG4gIC8vIE5vcm1hbGl6ZSB0aGUgcGF0aFxuICBwYXRoID0gbm9ybWFsaXplQXJyYXkoZmlsdGVyKHBhdGguc3BsaXQoJy8nKSwgZnVuY3Rpb24ocCkge1xuICAgIHJldHVybiAhIXA7XG4gIH0pLCAhaXNBYnNvbHV0ZSkuam9pbignLycpO1xuXG4gIGlmICghcGF0aCAmJiAhaXNBYnNvbHV0ZSkge1xuICAgIHBhdGggPSAnLic7XG4gIH1cbiAgaWYgKHBhdGggJiYgdHJhaWxpbmdTbGFzaCkge1xuICAgIHBhdGggKz0gJy8nO1xuICB9XG5cbiAgcmV0dXJuIChpc0Fic29sdXRlID8gJy8nIDogJycpICsgcGF0aDtcbn07XG5cbi8vIHBvc2l4IHZlcnNpb25cbmV4cG9ydHMuaXNBYnNvbHV0ZSA9IGZ1bmN0aW9uKHBhdGgpIHtcbiAgcmV0dXJuIHBhdGguY2hhckF0KDApID09PSAnLyc7XG59O1xuXG4vLyBwb3NpeCB2ZXJzaW9uXG5leHBvcnRzLmpvaW4gPSBmdW5jdGlvbigpIHtcbiAgdmFyIHBhdGhzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKTtcbiAgcmV0dXJuIGV4cG9ydHMubm9ybWFsaXplKGZpbHRlcihwYXRocywgZnVuY3Rpb24ocCwgaW5kZXgpIHtcbiAgICBpZiAodHlwZW9mIHAgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudHMgdG8gcGF0aC5qb2luIG11c3QgYmUgc3RyaW5ncycpO1xuICAgIH1cbiAgICByZXR1cm4gcDtcbiAgfSkuam9pbignLycpKTtcbn07XG5cblxuLy8gcGF0aC5yZWxhdGl2ZShmcm9tLCB0bylcbi8vIHBvc2l4IHZlcnNpb25cbmV4cG9ydHMucmVsYXRpdmUgPSBmdW5jdGlvbihmcm9tLCB0bykge1xuICBmcm9tID0gZXhwb3J0cy5yZXNvbHZlKGZyb20pLnN1YnN0cigxKTtcbiAgdG8gPSBleHBvcnRzLnJlc29sdmUodG8pLnN1YnN0cigxKTtcblxuICBmdW5jdGlvbiB0cmltKGFycikge1xuICAgIHZhciBzdGFydCA9IDA7XG4gICAgZm9yICg7IHN0YXJ0IDwgYXJyLmxlbmd0aDsgc3RhcnQrKykge1xuICAgICAgaWYgKGFycltzdGFydF0gIT09ICcnKSBicmVhaztcbiAgICB9XG5cbiAgICB2YXIgZW5kID0gYXJyLmxlbmd0aCAtIDE7XG4gICAgZm9yICg7IGVuZCA+PSAwOyBlbmQtLSkge1xuICAgICAgaWYgKGFycltlbmRdICE9PSAnJykgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKHN0YXJ0ID4gZW5kKSByZXR1cm4gW107XG4gICAgcmV0dXJuIGFyci5zbGljZShzdGFydCwgZW5kIC0gc3RhcnQgKyAxKTtcbiAgfVxuXG4gIHZhciBmcm9tUGFydHMgPSB0cmltKGZyb20uc3BsaXQoJy8nKSk7XG4gIHZhciB0b1BhcnRzID0gdHJpbSh0by5zcGxpdCgnLycpKTtcblxuICB2YXIgbGVuZ3RoID0gTWF0aC5taW4oZnJvbVBhcnRzLmxlbmd0aCwgdG9QYXJ0cy5sZW5ndGgpO1xuICB2YXIgc2FtZVBhcnRzTGVuZ3RoID0gbGVuZ3RoO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGZyb21QYXJ0c1tpXSAhPT0gdG9QYXJ0c1tpXSkge1xuICAgICAgc2FtZVBhcnRzTGVuZ3RoID0gaTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHZhciBvdXRwdXRQYXJ0cyA9IFtdO1xuICBmb3IgKHZhciBpID0gc2FtZVBhcnRzTGVuZ3RoOyBpIDwgZnJvbVBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgb3V0cHV0UGFydHMucHVzaCgnLi4nKTtcbiAgfVxuXG4gIG91dHB1dFBhcnRzID0gb3V0cHV0UGFydHMuY29uY2F0KHRvUGFydHMuc2xpY2Uoc2FtZVBhcnRzTGVuZ3RoKSk7XG5cbiAgcmV0dXJuIG91dHB1dFBhcnRzLmpvaW4oJy8nKTtcbn07XG5cbmV4cG9ydHMuc2VwID0gJy8nO1xuZXhwb3J0cy5kZWxpbWl0ZXIgPSAnOic7XG5cbmV4cG9ydHMuZGlybmFtZSA9IGZ1bmN0aW9uKHBhdGgpIHtcbiAgdmFyIHJlc3VsdCA9IHNwbGl0UGF0aChwYXRoKSxcbiAgICAgIHJvb3QgPSByZXN1bHRbMF0sXG4gICAgICBkaXIgPSByZXN1bHRbMV07XG5cbiAgaWYgKCFyb290ICYmICFkaXIpIHtcbiAgICAvLyBObyBkaXJuYW1lIHdoYXRzb2V2ZXJcbiAgICByZXR1cm4gJy4nO1xuICB9XG5cbiAgaWYgKGRpcikge1xuICAgIC8vIEl0IGhhcyBhIGRpcm5hbWUsIHN0cmlwIHRyYWlsaW5nIHNsYXNoXG4gICAgZGlyID0gZGlyLnN1YnN0cigwLCBkaXIubGVuZ3RoIC0gMSk7XG4gIH1cblxuICByZXR1cm4gcm9vdCArIGRpcjtcbn07XG5cblxuZXhwb3J0cy5iYXNlbmFtZSA9IGZ1bmN0aW9uKHBhdGgsIGV4dCkge1xuICB2YXIgZiA9IHNwbGl0UGF0aChwYXRoKVsyXTtcbiAgLy8gVE9ETzogbWFrZSB0aGlzIGNvbXBhcmlzb24gY2FzZS1pbnNlbnNpdGl2ZSBvbiB3aW5kb3dzP1xuICBpZiAoZXh0ICYmIGYuc3Vic3RyKC0xICogZXh0Lmxlbmd0aCkgPT09IGV4dCkge1xuICAgIGYgPSBmLnN1YnN0cigwLCBmLmxlbmd0aCAtIGV4dC5sZW5ndGgpO1xuICB9XG4gIHJldHVybiBmO1xufTtcblxuXG5leHBvcnRzLmV4dG5hbWUgPSBmdW5jdGlvbihwYXRoKSB7XG4gIHJldHVybiBzcGxpdFBhdGgocGF0aClbM107XG59O1xuXG5mdW5jdGlvbiBmaWx0ZXIgKHhzLCBmKSB7XG4gICAgaWYgKHhzLmZpbHRlcikgcmV0dXJuIHhzLmZpbHRlcihmKTtcbiAgICB2YXIgcmVzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB4cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoZih4c1tpXSwgaSwgeHMpKSByZXMucHVzaCh4c1tpXSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG5cbi8vIFN0cmluZy5wcm90b3R5cGUuc3Vic3RyIC0gbmVnYXRpdmUgaW5kZXggZG9uJ3Qgd29yayBpbiBJRThcbnZhciBzdWJzdHIgPSAnYWInLnN1YnN0cigtMSkgPT09ICdiJ1xuICAgID8gZnVuY3Rpb24gKHN0ciwgc3RhcnQsIGxlbikgeyByZXR1cm4gc3RyLnN1YnN0cihzdGFydCwgbGVuKSB9XG4gICAgOiBmdW5jdGlvbiAoc3RyLCBzdGFydCwgbGVuKSB7XG4gICAgICAgIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gc3RyLmxlbmd0aCArIHN0YXJ0O1xuICAgICAgICByZXR1cm4gc3RyLnN1YnN0cihzdGFydCwgbGVuKTtcbiAgICB9XG47XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIGxpZ2h0d2VpZ2h0IEJ1ZmZlciBzaGltIGZvciBwYmYgYnJvd3NlciBidWlsZFxuLy8gYmFzZWQgb24gY29kZSBmcm9tIGdpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlciAoTUlULWxpY2Vuc2VkKVxuXG5tb2R1bGUuZXhwb3J0cyA9IEJ1ZmZlcjtcblxudmFyIGllZWU3NTQgPSByZXF1aXJlKCdpZWVlNzU0Jyk7XG5cbnZhciBCdWZmZXJNZXRob2RzO1xuXG5mdW5jdGlvbiBCdWZmZXIobGVuZ3RoKSB7XG4gICAgdmFyIGFycjtcbiAgICBpZiAobGVuZ3RoICYmIGxlbmd0aC5sZW5ndGgpIHtcbiAgICAgICAgYXJyID0gbGVuZ3RoO1xuICAgICAgICBsZW5ndGggPSBhcnIubGVuZ3RoO1xuICAgIH1cbiAgICB2YXIgYnVmID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoIHx8IDApO1xuICAgIGlmIChhcnIpIGJ1Zi5zZXQoYXJyKTtcblxuICAgIGJ1Zi5yZWFkVUludDMyTEUgPSBCdWZmZXJNZXRob2RzLnJlYWRVSW50MzJMRTtcbiAgICBidWYud3JpdGVVSW50MzJMRSA9IEJ1ZmZlck1ldGhvZHMud3JpdGVVSW50MzJMRTtcbiAgICBidWYucmVhZEludDMyTEUgPSBCdWZmZXJNZXRob2RzLnJlYWRJbnQzMkxFO1xuICAgIGJ1Zi53cml0ZUludDMyTEUgPSBCdWZmZXJNZXRob2RzLndyaXRlSW50MzJMRTtcbiAgICBidWYucmVhZEZsb2F0TEUgPSBCdWZmZXJNZXRob2RzLnJlYWRGbG9hdExFO1xuICAgIGJ1Zi53cml0ZUZsb2F0TEUgPSBCdWZmZXJNZXRob2RzLndyaXRlRmxvYXRMRTtcbiAgICBidWYucmVhZERvdWJsZUxFID0gQnVmZmVyTWV0aG9kcy5yZWFkRG91YmxlTEU7XG4gICAgYnVmLndyaXRlRG91YmxlTEUgPSBCdWZmZXJNZXRob2RzLndyaXRlRG91YmxlTEU7XG4gICAgYnVmLnRvU3RyaW5nID0gQnVmZmVyTWV0aG9kcy50b1N0cmluZztcbiAgICBidWYud3JpdGUgPSBCdWZmZXJNZXRob2RzLndyaXRlO1xuICAgIGJ1Zi5zbGljZSA9IEJ1ZmZlck1ldGhvZHMuc2xpY2U7XG4gICAgYnVmLmNvcHkgPSBCdWZmZXJNZXRob2RzLmNvcHk7XG5cbiAgICBidWYuX2lzQnVmZmVyID0gdHJ1ZTtcbiAgICByZXR1cm4gYnVmO1xufVxuXG52YXIgbGFzdFN0ciwgbGFzdFN0ckVuY29kZWQ7XG5cbkJ1ZmZlck1ldGhvZHMgPSB7XG4gICAgcmVhZFVJbnQzMkxFOiBmdW5jdGlvbihwb3MpIHtcbiAgICAgICAgcmV0dXJuICgodGhpc1twb3NdKSB8XG4gICAgICAgICAgICAodGhpc1twb3MgKyAxXSA8PCA4KSB8XG4gICAgICAgICAgICAodGhpc1twb3MgKyAyXSA8PCAxNikpICtcbiAgICAgICAgICAgICh0aGlzW3BvcyArIDNdICogMHgxMDAwMDAwKTtcbiAgICB9LFxuXG4gICAgd3JpdGVVSW50MzJMRTogZnVuY3Rpb24odmFsLCBwb3MpIHtcbiAgICAgICAgdGhpc1twb3NdID0gdmFsO1xuICAgICAgICB0aGlzW3BvcyArIDFdID0gKHZhbCA+Pj4gOCk7XG4gICAgICAgIHRoaXNbcG9zICsgMl0gPSAodmFsID4+PiAxNik7XG4gICAgICAgIHRoaXNbcG9zICsgM10gPSAodmFsID4+PiAyNCk7XG4gICAgfSxcblxuICAgIHJlYWRJbnQzMkxFOiBmdW5jdGlvbihwb3MpIHtcbiAgICAgICAgcmV0dXJuICgodGhpc1twb3NdKSB8XG4gICAgICAgICAgICAodGhpc1twb3MgKyAxXSA8PCA4KSB8XG4gICAgICAgICAgICAodGhpc1twb3MgKyAyXSA8PCAxNikpICtcbiAgICAgICAgICAgICh0aGlzW3BvcyArIDNdIDw8IDI0KTtcbiAgICB9LFxuXG4gICAgcmVhZEZsb2F0TEU6ICBmdW5jdGlvbihwb3MpIHsgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBwb3MsIHRydWUsIDIzLCA0KTsgfSxcbiAgICByZWFkRG91YmxlTEU6IGZ1bmN0aW9uKHBvcykgeyByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIHBvcywgdHJ1ZSwgNTIsIDgpOyB9LFxuXG4gICAgd3JpdGVGbG9hdExFOiAgZnVuY3Rpb24odmFsLCBwb3MpIHsgcmV0dXJuIGllZWU3NTQud3JpdGUodGhpcywgdmFsLCBwb3MsIHRydWUsIDIzLCA0KTsgfSxcbiAgICB3cml0ZURvdWJsZUxFOiBmdW5jdGlvbih2YWwsIHBvcykgeyByZXR1cm4gaWVlZTc1NC53cml0ZSh0aGlzLCB2YWwsIHBvcywgdHJ1ZSwgNTIsIDgpOyB9LFxuXG4gICAgdG9TdHJpbmc6IGZ1bmN0aW9uKGVuY29kaW5nLCBzdGFydCwgZW5kKSB7XG4gICAgICAgIHZhciBzdHIgPSAnJyxcbiAgICAgICAgICAgIHRtcCA9ICcnO1xuXG4gICAgICAgIHN0YXJ0ID0gc3RhcnQgfHwgMDtcbiAgICAgICAgZW5kID0gTWF0aC5taW4odGhpcy5sZW5ndGgsIGVuZCB8fCB0aGlzLmxlbmd0aCk7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBjaCA9IHRoaXNbaV07XG4gICAgICAgICAgICBpZiAoY2ggPD0gMHg3Rikge1xuICAgICAgICAgICAgICAgIHN0ciArPSBkZWNvZGVVUklDb21wb25lbnQodG1wKSArIFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpO1xuICAgICAgICAgICAgICAgIHRtcCA9ICcnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0bXAgKz0gJyUnICsgY2gudG9TdHJpbmcoMTYpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgc3RyICs9IGRlY29kZVVSSUNvbXBvbmVudCh0bXApO1xuXG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfSxcblxuICAgIHdyaXRlOiBmdW5jdGlvbihzdHIsIHBvcykge1xuICAgICAgICB2YXIgYnl0ZXMgPSBzdHIgPT09IGxhc3RTdHIgPyBsYXN0U3RyRW5jb2RlZCA6IGVuY29kZVN0cmluZyhzdHIpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzW3BvcyArIGldID0gYnl0ZXNbaV07XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgc2xpY2U6IGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ViYXJyYXkoc3RhcnQsIGVuZCk7XG4gICAgfSxcblxuICAgIGNvcHk6IGZ1bmN0aW9uKGJ1ZiwgcG9zKSB7XG4gICAgICAgIHBvcyA9IHBvcyB8fCAwO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGJ1Zltwb3MgKyBpXSA9IHRoaXNbaV07XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5CdWZmZXJNZXRob2RzLndyaXRlSW50MzJMRSA9IEJ1ZmZlck1ldGhvZHMud3JpdGVVSW50MzJMRTtcblxuQnVmZmVyLmJ5dGVMZW5ndGggPSBmdW5jdGlvbihzdHIpIHtcbiAgICBsYXN0U3RyID0gc3RyO1xuICAgIGxhc3RTdHJFbmNvZGVkID0gZW5jb2RlU3RyaW5nKHN0cik7XG4gICAgcmV0dXJuIGxhc3RTdHJFbmNvZGVkLmxlbmd0aDtcbn07XG5cbkJ1ZmZlci5pc0J1ZmZlciA9IGZ1bmN0aW9uKGJ1Zikge1xuICAgIHJldHVybiAhIShidWYgJiYgYnVmLl9pc0J1ZmZlcik7XG59O1xuXG5mdW5jdGlvbiBlbmNvZGVTdHJpbmcoc3RyKSB7XG4gICAgdmFyIGxlbmd0aCA9IHN0ci5sZW5ndGgsXG4gICAgICAgIGJ5dGVzID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMCwgYywgbGVhZDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGMgPSBzdHIuY2hhckNvZGVBdChpKTsgLy8gY29kZSBwb2ludFxuXG4gICAgICAgIGlmIChjID4gMHhEN0ZGICYmIGMgPCAweEUwMDApIHtcblxuICAgICAgICAgICAgaWYgKGxlYWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoYyA8IDB4REMwMCkge1xuICAgICAgICAgICAgICAgICAgICBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpO1xuICAgICAgICAgICAgICAgICAgICBsZWFkID0gYztcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjID0gbGVhZCAtIDB4RDgwMCA8PCAxMCB8IGMgLSAweERDMDAgfCAweDEwMDAwO1xuICAgICAgICAgICAgICAgICAgICBsZWFkID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGMgPiAweERCRkYgfHwgKGkgKyAxID09PSBsZW5ndGgpKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpO1xuICAgICAgICAgICAgICAgIGVsc2UgbGVhZCA9IGM7XG5cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2UgaWYgKGxlYWQpIHtcbiAgICAgICAgICAgIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRCk7XG4gICAgICAgICAgICBsZWFkID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjIDwgMHg4MCkgYnl0ZXMucHVzaChjKTtcbiAgICAgICAgZWxzZSBpZiAoYyA8IDB4ODAwKSBieXRlcy5wdXNoKGMgPj4gMHg2IHwgMHhDMCwgYyAmIDB4M0YgfCAweDgwKTtcbiAgICAgICAgZWxzZSBpZiAoYyA8IDB4MTAwMDApIGJ5dGVzLnB1c2goYyA+PiAweEMgfCAweEUwLCBjID4+IDB4NiAmIDB4M0YgfCAweDgwLCBjICYgMHgzRiB8IDB4ODApO1xuICAgICAgICBlbHNlIGJ5dGVzLnB1c2goYyA+PiAweDEyIHwgMHhGMCwgYyA+PiAweEMgJiAweDNGIHwgMHg4MCwgYyA+PiAweDYgJiAweDNGIHwgMHg4MCwgYyAmIDB4M0YgfCAweDgwKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ5dGVzO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFBiZjtcblxudmFyIEJ1ZmZlciA9IGdsb2JhbC5CdWZmZXIgfHwgcmVxdWlyZSgnLi9idWZmZXInKTtcblxuZnVuY3Rpb24gUGJmKGJ1Zikge1xuICAgIHRoaXMuYnVmID0gIUJ1ZmZlci5pc0J1ZmZlcihidWYpID8gbmV3IEJ1ZmZlcihidWYgfHwgMCkgOiBidWY7XG4gICAgdGhpcy5wb3MgPSAwO1xuICAgIHRoaXMubGVuZ3RoID0gdGhpcy5idWYubGVuZ3RoO1xufVxuXG5QYmYuVmFyaW50ICA9IDA7IC8vIHZhcmludDogaW50MzIsIGludDY0LCB1aW50MzIsIHVpbnQ2NCwgc2ludDMyLCBzaW50NjQsIGJvb2wsIGVudW1cblBiZi5GaXhlZDY0ID0gMTsgLy8gNjQtYml0OiBkb3VibGUsIGZpeGVkNjQsIHNmaXhlZDY0XG5QYmYuQnl0ZXMgICA9IDI7IC8vIGxlbmd0aC1kZWxpbWl0ZWQ6IHN0cmluZywgYnl0ZXMsIGVtYmVkZGVkIG1lc3NhZ2VzLCBwYWNrZWQgcmVwZWF0ZWQgZmllbGRzXG5QYmYuRml4ZWQzMiA9IDU7IC8vIDMyLWJpdDogZmxvYXQsIGZpeGVkMzIsIHNmaXhlZDMyXG5cbnZhciBTSElGVF9MRUZUXzMyID0gKDEgPDwgMTYpICogKDEgPDwgMTYpLFxuICAgIFNISUZUX1JJR0hUXzMyID0gMSAvIFNISUZUX0xFRlRfMzIsXG4gICAgUE9XXzJfNjMgPSBNYXRoLnBvdygyLCA2Myk7XG5cblBiZi5wcm90b3R5cGUgPSB7XG5cbiAgICBkZXN0cm95OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5idWYgPSBudWxsO1xuICAgIH0sXG5cbiAgICAvLyA9PT0gUkVBRElORyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gICAgcmVhZEZpZWxkczogZnVuY3Rpb24ocmVhZEZpZWxkLCByZXN1bHQsIGVuZCkge1xuICAgICAgICBlbmQgPSBlbmQgfHwgdGhpcy5sZW5ndGg7XG5cbiAgICAgICAgd2hpbGUgKHRoaXMucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICB2YXIgdmFsID0gdGhpcy5yZWFkVmFyaW50KCksXG4gICAgICAgICAgICAgICAgdGFnID0gdmFsID4+IDMsXG4gICAgICAgICAgICAgICAgc3RhcnRQb3MgPSB0aGlzLnBvcztcblxuICAgICAgICAgICAgcmVhZEZpZWxkKHRhZywgcmVzdWx0LCB0aGlzKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMucG9zID09PSBzdGFydFBvcykgdGhpcy5za2lwKHZhbCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxuXG4gICAgcmVhZE1lc3NhZ2U6IGZ1bmN0aW9uKHJlYWRGaWVsZCwgcmVzdWx0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWRGaWVsZHMocmVhZEZpZWxkLCByZXN1bHQsIHRoaXMucmVhZFZhcmludCgpICsgdGhpcy5wb3MpO1xuICAgIH0sXG5cbiAgICByZWFkRml4ZWQzMjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB2YWwgPSB0aGlzLmJ1Zi5yZWFkVUludDMyTEUodGhpcy5wb3MpO1xuICAgICAgICB0aGlzLnBvcyArPSA0O1xuICAgICAgICByZXR1cm4gdmFsO1xuICAgIH0sXG5cbiAgICByZWFkU0ZpeGVkMzI6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgdmFsID0gdGhpcy5idWYucmVhZEludDMyTEUodGhpcy5wb3MpO1xuICAgICAgICB0aGlzLnBvcyArPSA0O1xuICAgICAgICByZXR1cm4gdmFsO1xuICAgIH0sXG5cbiAgICAvLyA2NC1iaXQgaW50IGhhbmRsaW5nIGlzIGJhc2VkIG9uIGdpdGh1Yi5jb20vZHB3L25vZGUtYnVmZmVyLW1vcmUtaW50cyAoTUlULWxpY2Vuc2VkKVxuXG4gICAgcmVhZEZpeGVkNjQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgdmFsID0gdGhpcy5idWYucmVhZFVJbnQzMkxFKHRoaXMucG9zKSArIHRoaXMuYnVmLnJlYWRVSW50MzJMRSh0aGlzLnBvcyArIDQpICogU0hJRlRfTEVGVF8zMjtcbiAgICAgICAgdGhpcy5wb3MgKz0gODtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9LFxuXG4gICAgcmVhZFNGaXhlZDY0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHZhbCA9IHRoaXMuYnVmLnJlYWRVSW50MzJMRSh0aGlzLnBvcykgKyB0aGlzLmJ1Zi5yZWFkSW50MzJMRSh0aGlzLnBvcyArIDQpICogU0hJRlRfTEVGVF8zMjtcbiAgICAgICAgdGhpcy5wb3MgKz0gODtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9LFxuXG4gICAgcmVhZEZsb2F0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHZhbCA9IHRoaXMuYnVmLnJlYWRGbG9hdExFKHRoaXMucG9zKTtcbiAgICAgICAgdGhpcy5wb3MgKz0gNDtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9LFxuXG4gICAgcmVhZERvdWJsZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB2YWwgPSB0aGlzLmJ1Zi5yZWFkRG91YmxlTEUodGhpcy5wb3MpO1xuICAgICAgICB0aGlzLnBvcyArPSA4O1xuICAgICAgICByZXR1cm4gdmFsO1xuICAgIH0sXG5cbiAgICByZWFkVmFyaW50OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGJ1ZiA9IHRoaXMuYnVmLFxuICAgICAgICAgICAgdmFsLCBiO1xuXG4gICAgICAgIGIgPSBidWZbdGhpcy5wb3MrK107IHZhbCAgPSAgYiAmIDB4N2Y7ICAgICAgICBpZiAoYiA8IDB4ODApIHJldHVybiB2YWw7XG4gICAgICAgIGIgPSBidWZbdGhpcy5wb3MrK107IHZhbCB8PSAoYiAmIDB4N2YpIDw8IDc7ICBpZiAoYiA8IDB4ODApIHJldHVybiB2YWw7XG4gICAgICAgIGIgPSBidWZbdGhpcy5wb3MrK107IHZhbCB8PSAoYiAmIDB4N2YpIDw8IDE0OyBpZiAoYiA8IDB4ODApIHJldHVybiB2YWw7XG4gICAgICAgIGIgPSBidWZbdGhpcy5wb3MrK107IHZhbCB8PSAoYiAmIDB4N2YpIDw8IDIxOyBpZiAoYiA8IDB4ODApIHJldHVybiB2YWw7XG5cbiAgICAgICAgcmV0dXJuIHJlYWRWYXJpbnRSZW1haW5kZXIodmFsLCB0aGlzKTtcbiAgICB9LFxuXG4gICAgcmVhZFZhcmludDY0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHN0YXJ0UG9zID0gdGhpcy5wb3MsXG4gICAgICAgICAgICB2YWwgPSB0aGlzLnJlYWRWYXJpbnQoKTtcblxuICAgICAgICBpZiAodmFsIDwgUE9XXzJfNjMpIHJldHVybiB2YWw7XG5cbiAgICAgICAgdmFyIHBvcyA9IHRoaXMucG9zIC0gMjtcbiAgICAgICAgd2hpbGUgKHRoaXMuYnVmW3Bvc10gPT09IDB4ZmYpIHBvcy0tO1xuICAgICAgICBpZiAocG9zIDwgc3RhcnRQb3MpIHBvcyA9IHN0YXJ0UG9zO1xuXG4gICAgICAgIHZhbCA9IDA7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcG9zIC0gc3RhcnRQb3MgKyAxOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBiID0gfnRoaXMuYnVmW3N0YXJ0UG9zICsgaV0gJiAweDdmO1xuICAgICAgICAgICAgdmFsICs9IGkgPCA0ID8gYiA8PCBpICogNyA6IGIgKiBNYXRoLnBvdygyLCBpICogNyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gLXZhbCAtIDE7XG4gICAgfSxcblxuICAgIHJlYWRTVmFyaW50OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIG51bSA9IHRoaXMucmVhZFZhcmludCgpO1xuICAgICAgICByZXR1cm4gbnVtICUgMiA9PT0gMSA/IChudW0gKyAxKSAvIC0yIDogbnVtIC8gMjsgLy8gemlnemFnIGVuY29kaW5nXG4gICAgfSxcblxuICAgIHJlYWRCb29sZWFuOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4odGhpcy5yZWFkVmFyaW50KCkpO1xuICAgIH0sXG5cbiAgICByZWFkU3RyaW5nOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGVuZCA9IHRoaXMucmVhZFZhcmludCgpICsgdGhpcy5wb3MsXG4gICAgICAgICAgICBzdHIgPSB0aGlzLmJ1Zi50b1N0cmluZygndXRmOCcsIHRoaXMucG9zLCBlbmQpO1xuICAgICAgICB0aGlzLnBvcyA9IGVuZDtcbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9LFxuXG4gICAgcmVhZEJ5dGVzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGVuZCA9IHRoaXMucmVhZFZhcmludCgpICsgdGhpcy5wb3MsXG4gICAgICAgICAgICBidWZmZXIgPSB0aGlzLmJ1Zi5zbGljZSh0aGlzLnBvcywgZW5kKTtcbiAgICAgICAgdGhpcy5wb3MgPSBlbmQ7XG4gICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgfSxcblxuICAgIC8vIHZlcmJvc2UgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnM7IGRvZXNuJ3QgYWZmZWN0IGd6aXBwZWQgc2l6ZVxuXG4gICAgcmVhZFBhY2tlZFZhcmludDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlbmQgPSB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zLCBhcnIgPSBbXTtcbiAgICAgICAgd2hpbGUgKHRoaXMucG9zIDwgZW5kKSBhcnIucHVzaCh0aGlzLnJlYWRWYXJpbnQoKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcbiAgICByZWFkUGFja2VkU1ZhcmludDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlbmQgPSB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zLCBhcnIgPSBbXTtcbiAgICAgICAgd2hpbGUgKHRoaXMucG9zIDwgZW5kKSBhcnIucHVzaCh0aGlzLnJlYWRTVmFyaW50KCkpO1xuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH0sXG4gICAgcmVhZFBhY2tlZEJvb2xlYW46IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZW5kID0gdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcywgYXJyID0gW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkQm9vbGVhbigpKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuICAgIHJlYWRQYWNrZWRGbG9hdDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlbmQgPSB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zLCBhcnIgPSBbXTtcbiAgICAgICAgd2hpbGUgKHRoaXMucG9zIDwgZW5kKSBhcnIucHVzaCh0aGlzLnJlYWRGbG9hdCgpKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuICAgIHJlYWRQYWNrZWREb3VibGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZW5kID0gdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcywgYXJyID0gW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkRG91YmxlKCkpO1xuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH0sXG4gICAgcmVhZFBhY2tlZEZpeGVkMzI6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZW5kID0gdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcywgYXJyID0gW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkRml4ZWQzMigpKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuICAgIHJlYWRQYWNrZWRTRml4ZWQzMjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlbmQgPSB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zLCBhcnIgPSBbXTtcbiAgICAgICAgd2hpbGUgKHRoaXMucG9zIDwgZW5kKSBhcnIucHVzaCh0aGlzLnJlYWRTRml4ZWQzMigpKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuICAgIHJlYWRQYWNrZWRGaXhlZDY0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGVuZCA9IHRoaXMucmVhZFZhcmludCgpICsgdGhpcy5wb3MsIGFyciA9IFtdO1xuICAgICAgICB3aGlsZSAodGhpcy5wb3MgPCBlbmQpIGFyci5wdXNoKHRoaXMucmVhZEZpeGVkNjQoKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcbiAgICByZWFkUGFja2VkU0ZpeGVkNjQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZW5kID0gdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcywgYXJyID0gW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkU0ZpeGVkNjQoKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcblxuICAgIHNraXA6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB2YXIgdHlwZSA9IHZhbCAmIDB4NztcbiAgICAgICAgaWYgKHR5cGUgPT09IFBiZi5WYXJpbnQpIHdoaWxlICh0aGlzLmJ1Zlt0aGlzLnBvcysrXSA+IDB4N2YpIHt9XG4gICAgICAgIGVsc2UgaWYgKHR5cGUgPT09IFBiZi5CeXRlcykgdGhpcy5wb3MgPSB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zO1xuICAgICAgICBlbHNlIGlmICh0eXBlID09PSBQYmYuRml4ZWQzMikgdGhpcy5wb3MgKz0gNDtcbiAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gUGJmLkZpeGVkNjQpIHRoaXMucG9zICs9IDg7XG4gICAgICAgIGVsc2UgdGhyb3cgbmV3IEVycm9yKCdVbmltcGxlbWVudGVkIHR5cGU6ICcgKyB0eXBlKTtcbiAgICB9LFxuXG4gICAgLy8gPT09IFdSSVRJTkcgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAgIHdyaXRlVGFnOiBmdW5jdGlvbih0YWcsIHR5cGUpIHtcbiAgICAgICAgdGhpcy53cml0ZVZhcmludCgodGFnIDw8IDMpIHwgdHlwZSk7XG4gICAgfSxcblxuICAgIHJlYWxsb2M6IGZ1bmN0aW9uKG1pbikge1xuICAgICAgICB2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGggfHwgMTY7XG5cbiAgICAgICAgd2hpbGUgKGxlbmd0aCA8IHRoaXMucG9zICsgbWluKSBsZW5ndGggKj0gMjtcblxuICAgICAgICBpZiAobGVuZ3RoICE9PSB0aGlzLmxlbmd0aCkge1xuICAgICAgICAgICAgdmFyIGJ1ZiA9IG5ldyBCdWZmZXIobGVuZ3RoKTtcbiAgICAgICAgICAgIHRoaXMuYnVmLmNvcHkoYnVmKTtcbiAgICAgICAgICAgIHRoaXMuYnVmID0gYnVmO1xuICAgICAgICAgICAgdGhpcy5sZW5ndGggPSBsZW5ndGg7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZmluaXNoOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5sZW5ndGggPSB0aGlzLnBvcztcbiAgICAgICAgdGhpcy5wb3MgPSAwO1xuICAgICAgICByZXR1cm4gdGhpcy5idWYuc2xpY2UoMCwgdGhpcy5sZW5ndGgpO1xuICAgIH0sXG5cbiAgICB3cml0ZUZpeGVkMzI6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB0aGlzLnJlYWxsb2MoNCk7XG4gICAgICAgIHRoaXMuYnVmLndyaXRlVUludDMyTEUodmFsLCB0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMucG9zICs9IDQ7XG4gICAgfSxcblxuICAgIHdyaXRlU0ZpeGVkMzI6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB0aGlzLnJlYWxsb2MoNCk7XG4gICAgICAgIHRoaXMuYnVmLndyaXRlSW50MzJMRSh2YWwsIHRoaXMucG9zKTtcbiAgICAgICAgdGhpcy5wb3MgKz0gNDtcbiAgICB9LFxuXG4gICAgd3JpdGVGaXhlZDY0OiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdGhpcy5yZWFsbG9jKDgpO1xuICAgICAgICB0aGlzLmJ1Zi53cml0ZUludDMyTEUodmFsICYgLTEsIHRoaXMucG9zKTtcbiAgICAgICAgdGhpcy5idWYud3JpdGVVSW50MzJMRShNYXRoLmZsb29yKHZhbCAqIFNISUZUX1JJR0hUXzMyKSwgdGhpcy5wb3MgKyA0KTtcbiAgICAgICAgdGhpcy5wb3MgKz0gODtcbiAgICB9LFxuXG4gICAgd3JpdGVTRml4ZWQ2NDogZnVuY3Rpb24odmFsKSB7XG4gICAgICAgIHRoaXMucmVhbGxvYyg4KTtcbiAgICAgICAgdGhpcy5idWYud3JpdGVJbnQzMkxFKHZhbCAmIC0xLCB0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMuYnVmLndyaXRlSW50MzJMRShNYXRoLmZsb29yKHZhbCAqIFNISUZUX1JJR0hUXzMyKSwgdGhpcy5wb3MgKyA0KTtcbiAgICAgICAgdGhpcy5wb3MgKz0gODtcbiAgICB9LFxuXG4gICAgd3JpdGVWYXJpbnQ6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB2YWwgPSArdmFsO1xuXG4gICAgICAgIGlmICh2YWwgPiAweGZmZmZmZmYpIHtcbiAgICAgICAgICAgIHdyaXRlQmlnVmFyaW50KHZhbCwgdGhpcyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlYWxsb2MoNCk7XG5cbiAgICAgICAgdGhpcy5idWZbdGhpcy5wb3MrK10gPSAgICAgICAgICAgdmFsICYgMHg3ZiAgfCAodmFsID4gMHg3ZiA/IDB4ODAgOiAwKTsgaWYgKHZhbCA8PSAweDdmKSByZXR1cm47XG4gICAgICAgIHRoaXMuYnVmW3RoaXMucG9zKytdID0gKCh2YWwgPj4+PSA3KSAmIDB4N2YpIHwgKHZhbCA+IDB4N2YgPyAweDgwIDogMCk7IGlmICh2YWwgPD0gMHg3ZikgcmV0dXJuO1xuICAgICAgICB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9ICgodmFsID4+Pj0gNykgJiAweDdmKSB8ICh2YWwgPiAweDdmID8gMHg4MCA6IDApOyBpZiAodmFsIDw9IDB4N2YpIHJldHVybjtcbiAgICAgICAgdGhpcy5idWZbdGhpcy5wb3MrK10gPSAgICh2YWwgPj4+IDcpICYgMHg3ZjtcbiAgICB9LFxuXG4gICAgd3JpdGVTVmFyaW50OiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVZhcmludCh2YWwgPCAwID8gLXZhbCAqIDIgLSAxIDogdmFsICogMik7XG4gICAgfSxcblxuICAgIHdyaXRlQm9vbGVhbjogZnVuY3Rpb24odmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVWYXJpbnQoQm9vbGVhbih2YWwpKTtcbiAgICB9LFxuXG4gICAgd3JpdGVTdHJpbmc6IGZ1bmN0aW9uKHN0cikge1xuICAgICAgICBzdHIgPSBTdHJpbmcoc3RyKTtcbiAgICAgICAgdmFyIGJ5dGVzID0gQnVmZmVyLmJ5dGVMZW5ndGgoc3RyKTtcbiAgICAgICAgdGhpcy53cml0ZVZhcmludChieXRlcyk7XG4gICAgICAgIHRoaXMucmVhbGxvYyhieXRlcyk7XG4gICAgICAgIHRoaXMuYnVmLndyaXRlKHN0ciwgdGhpcy5wb3MpO1xuICAgICAgICB0aGlzLnBvcyArPSBieXRlcztcbiAgICB9LFxuXG4gICAgd3JpdGVGbG9hdDogZnVuY3Rpb24odmFsKSB7XG4gICAgICAgIHRoaXMucmVhbGxvYyg0KTtcbiAgICAgICAgdGhpcy5idWYud3JpdGVGbG9hdExFKHZhbCwgdGhpcy5wb3MpO1xuICAgICAgICB0aGlzLnBvcyArPSA0O1xuICAgIH0sXG5cbiAgICB3cml0ZURvdWJsZTogZnVuY3Rpb24odmFsKSB7XG4gICAgICAgIHRoaXMucmVhbGxvYyg4KTtcbiAgICAgICAgdGhpcy5idWYud3JpdGVEb3VibGVMRSh2YWwsIHRoaXMucG9zKTtcbiAgICAgICAgdGhpcy5wb3MgKz0gODtcbiAgICB9LFxuXG4gICAgd3JpdGVCeXRlczogZnVuY3Rpb24oYnVmZmVyKSB7XG4gICAgICAgIHZhciBsZW4gPSBidWZmZXIubGVuZ3RoO1xuICAgICAgICB0aGlzLndyaXRlVmFyaW50KGxlbik7XG4gICAgICAgIHRoaXMucmVhbGxvYyhsZW4pO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9IGJ1ZmZlcltpXTtcbiAgICB9LFxuXG4gICAgd3JpdGVSYXdNZXNzYWdlOiBmdW5jdGlvbihmbiwgb2JqKSB7XG4gICAgICAgIHRoaXMucG9zKys7IC8vIHJlc2VydmUgMSBieXRlIGZvciBzaG9ydCBtZXNzYWdlIGxlbmd0aFxuXG4gICAgICAgIC8vIHdyaXRlIHRoZSBtZXNzYWdlIGRpcmVjdGx5IHRvIHRoZSBidWZmZXIgYW5kIHNlZSBob3cgbXVjaCB3YXMgd3JpdHRlblxuICAgICAgICB2YXIgc3RhcnRQb3MgPSB0aGlzLnBvcztcbiAgICAgICAgZm4ob2JqLCB0aGlzKTtcbiAgICAgICAgdmFyIGxlbiA9IHRoaXMucG9zIC0gc3RhcnRQb3M7XG5cbiAgICAgICAgaWYgKGxlbiA+PSAweDgwKSByZWFsbG9jRm9yUmF3TWVzc2FnZShzdGFydFBvcywgbGVuLCB0aGlzKTtcblxuICAgICAgICAvLyBmaW5hbGx5LCB3cml0ZSB0aGUgbWVzc2FnZSBsZW5ndGggaW4gdGhlIHJlc2VydmVkIHBsYWNlIGFuZCByZXN0b3JlIHRoZSBwb3NpdGlvblxuICAgICAgICB0aGlzLnBvcyA9IHN0YXJ0UG9zIC0gMTtcbiAgICAgICAgdGhpcy53cml0ZVZhcmludChsZW4pO1xuICAgICAgICB0aGlzLnBvcyArPSBsZW47XG4gICAgfSxcblxuICAgIHdyaXRlTWVzc2FnZTogZnVuY3Rpb24odGFnLCBmbiwgb2JqKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuQnl0ZXMpO1xuICAgICAgICB0aGlzLndyaXRlUmF3TWVzc2FnZShmbiwgb2JqKTtcbiAgICB9LFxuXG4gICAgd3JpdGVQYWNrZWRWYXJpbnQ6ICAgZnVuY3Rpb24odGFnLCBhcnIpIHsgdGhpcy53cml0ZU1lc3NhZ2UodGFnLCB3cml0ZVBhY2tlZFZhcmludCwgYXJyKTsgICB9LFxuICAgIHdyaXRlUGFja2VkU1ZhcmludDogIGZ1bmN0aW9uKHRhZywgYXJyKSB7IHRoaXMud3JpdGVNZXNzYWdlKHRhZywgd3JpdGVQYWNrZWRTVmFyaW50LCBhcnIpOyAgfSxcbiAgICB3cml0ZVBhY2tlZEJvb2xlYW46ICBmdW5jdGlvbih0YWcsIGFycikgeyB0aGlzLndyaXRlTWVzc2FnZSh0YWcsIHdyaXRlUGFja2VkQm9vbGVhbiwgYXJyKTsgIH0sXG4gICAgd3JpdGVQYWNrZWRGbG9hdDogICAgZnVuY3Rpb24odGFnLCBhcnIpIHsgdGhpcy53cml0ZU1lc3NhZ2UodGFnLCB3cml0ZVBhY2tlZEZsb2F0LCBhcnIpOyAgICB9LFxuICAgIHdyaXRlUGFja2VkRG91YmxlOiAgIGZ1bmN0aW9uKHRhZywgYXJyKSB7IHRoaXMud3JpdGVNZXNzYWdlKHRhZywgd3JpdGVQYWNrZWREb3VibGUsIGFycik7ICAgfSxcbiAgICB3cml0ZVBhY2tlZEZpeGVkMzI6ICBmdW5jdGlvbih0YWcsIGFycikgeyB0aGlzLndyaXRlTWVzc2FnZSh0YWcsIHdyaXRlUGFja2VkRml4ZWQzMiwgYXJyKTsgIH0sXG4gICAgd3JpdGVQYWNrZWRTRml4ZWQzMjogZnVuY3Rpb24odGFnLCBhcnIpIHsgdGhpcy53cml0ZU1lc3NhZ2UodGFnLCB3cml0ZVBhY2tlZFNGaXhlZDMyLCBhcnIpOyB9LFxuICAgIHdyaXRlUGFja2VkRml4ZWQ2NDogIGZ1bmN0aW9uKHRhZywgYXJyKSB7IHRoaXMud3JpdGVNZXNzYWdlKHRhZywgd3JpdGVQYWNrZWRGaXhlZDY0LCBhcnIpOyAgfSxcbiAgICB3cml0ZVBhY2tlZFNGaXhlZDY0OiBmdW5jdGlvbih0YWcsIGFycikgeyB0aGlzLndyaXRlTWVzc2FnZSh0YWcsIHdyaXRlUGFja2VkU0ZpeGVkNjQsIGFycik7IH0sXG5cbiAgICB3cml0ZUJ5dGVzRmllbGQ6IGZ1bmN0aW9uKHRhZywgYnVmZmVyKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuQnl0ZXMpO1xuICAgICAgICB0aGlzLndyaXRlQnl0ZXMoYnVmZmVyKTtcbiAgICB9LFxuICAgIHdyaXRlRml4ZWQzMkZpZWxkOiBmdW5jdGlvbih0YWcsIHZhbCkge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHRhZywgUGJmLkZpeGVkMzIpO1xuICAgICAgICB0aGlzLndyaXRlRml4ZWQzMih2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVTRml4ZWQzMkZpZWxkOiBmdW5jdGlvbih0YWcsIHZhbCkge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHRhZywgUGJmLkZpeGVkMzIpO1xuICAgICAgICB0aGlzLndyaXRlU0ZpeGVkMzIodmFsKTtcbiAgICB9LFxuICAgIHdyaXRlRml4ZWQ2NEZpZWxkOiBmdW5jdGlvbih0YWcsIHZhbCkge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHRhZywgUGJmLkZpeGVkNjQpO1xuICAgICAgICB0aGlzLndyaXRlRml4ZWQ2NCh2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVTRml4ZWQ2NEZpZWxkOiBmdW5jdGlvbih0YWcsIHZhbCkge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHRhZywgUGJmLkZpeGVkNjQpO1xuICAgICAgICB0aGlzLndyaXRlU0ZpeGVkNjQodmFsKTtcbiAgICB9LFxuICAgIHdyaXRlVmFyaW50RmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuVmFyaW50KTtcbiAgICAgICAgdGhpcy53cml0ZVZhcmludCh2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVTVmFyaW50RmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuVmFyaW50KTtcbiAgICAgICAgdGhpcy53cml0ZVNWYXJpbnQodmFsKTtcbiAgICB9LFxuICAgIHdyaXRlU3RyaW5nRmllbGQ6IGZ1bmN0aW9uKHRhZywgc3RyKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuQnl0ZXMpO1xuICAgICAgICB0aGlzLndyaXRlU3RyaW5nKHN0cik7XG4gICAgfSxcbiAgICB3cml0ZUZsb2F0RmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuRml4ZWQzMik7XG4gICAgICAgIHRoaXMud3JpdGVGbG9hdCh2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVEb3VibGVGaWVsZDogZnVuY3Rpb24odGFnLCB2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5GaXhlZDY0KTtcbiAgICAgICAgdGhpcy53cml0ZURvdWJsZSh2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVCb29sZWFuRmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVWYXJpbnRGaWVsZCh0YWcsIEJvb2xlYW4odmFsKSk7XG4gICAgfVxufTtcblxuZnVuY3Rpb24gcmVhZFZhcmludFJlbWFpbmRlcih2YWwsIHBiZikge1xuICAgIHZhciBidWYgPSBwYmYuYnVmLCBiO1xuXG4gICAgYiA9IGJ1ZltwYmYucG9zKytdOyB2YWwgKz0gKGIgJiAweDdmKSAqIDB4MTAwMDAwMDA7ICAgICAgICAgaWYgKGIgPCAweDgwKSByZXR1cm4gdmFsO1xuICAgIGIgPSBidWZbcGJmLnBvcysrXTsgdmFsICs9IChiICYgMHg3ZikgKiAweDgwMDAwMDAwMDsgICAgICAgIGlmIChiIDwgMHg4MCkgcmV0dXJuIHZhbDtcbiAgICBiID0gYnVmW3BiZi5wb3MrK107IHZhbCArPSAoYiAmIDB4N2YpICogMHg0MDAwMDAwMDAwMDsgICAgICBpZiAoYiA8IDB4ODApIHJldHVybiB2YWw7XG4gICAgYiA9IGJ1ZltwYmYucG9zKytdOyB2YWwgKz0gKGIgJiAweDdmKSAqIDB4MjAwMDAwMDAwMDAwMDsgICAgaWYgKGIgPCAweDgwKSByZXR1cm4gdmFsO1xuICAgIGIgPSBidWZbcGJmLnBvcysrXTsgdmFsICs9IChiICYgMHg3ZikgKiAweDEwMDAwMDAwMDAwMDAwMDsgIGlmIChiIDwgMHg4MCkgcmV0dXJuIHZhbDtcbiAgICBiID0gYnVmW3BiZi5wb3MrK107IHZhbCArPSAoYiAmIDB4N2YpICogMHg4MDAwMDAwMDAwMDAwMDAwOyBpZiAoYiA8IDB4ODApIHJldHVybiB2YWw7XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHZhcmludCBub3QgbW9yZSB0aGFuIDEwIGJ5dGVzJyk7XG59XG5cbmZ1bmN0aW9uIHdyaXRlQmlnVmFyaW50KHZhbCwgcGJmKSB7XG4gICAgcGJmLnJlYWxsb2MoMTApO1xuXG4gICAgdmFyIG1heFBvcyA9IHBiZi5wb3MgKyAxMDtcblxuICAgIHdoaWxlICh2YWwgPj0gMSkge1xuICAgICAgICBpZiAocGJmLnBvcyA+PSBtYXhQb3MpIHRocm93IG5ldyBFcnJvcignR2l2ZW4gdmFyaW50IGRvZXNuXFwndCBmaXQgaW50byAxMCBieXRlcycpO1xuICAgICAgICB2YXIgYiA9IHZhbCAmIDB4ZmY7XG4gICAgICAgIHBiZi5idWZbcGJmLnBvcysrXSA9IGIgfCAodmFsID49IDB4ODAgPyAweDgwIDogMCk7XG4gICAgICAgIHZhbCAvPSAweDgwO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gcmVhbGxvY0ZvclJhd01lc3NhZ2Uoc3RhcnRQb3MsIGxlbiwgcGJmKSB7XG4gICAgdmFyIGV4dHJhTGVuID1cbiAgICAgICAgbGVuIDw9IDB4M2ZmZiA/IDEgOlxuICAgICAgICBsZW4gPD0gMHgxZmZmZmYgPyAyIDpcbiAgICAgICAgbGVuIDw9IDB4ZmZmZmZmZiA/IDMgOiBNYXRoLmNlaWwoTWF0aC5sb2cobGVuKSAvIChNYXRoLkxOMiAqIDcpKTtcblxuICAgIC8vIGlmIDEgYnl0ZSBpc24ndCBlbm91Z2ggZm9yIGVuY29kaW5nIG1lc3NhZ2UgbGVuZ3RoLCBzaGlmdCB0aGUgZGF0YSB0byB0aGUgcmlnaHRcbiAgICBwYmYucmVhbGxvYyhleHRyYUxlbik7XG4gICAgZm9yICh2YXIgaSA9IHBiZi5wb3MgLSAxOyBpID49IHN0YXJ0UG9zOyBpLS0pIHBiZi5idWZbaSArIGV4dHJhTGVuXSA9IHBiZi5idWZbaV07XG59XG5cbmZ1bmN0aW9uIHdyaXRlUGFja2VkVmFyaW50KGFyciwgcGJmKSAgIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHBiZi53cml0ZVZhcmludChhcnJbaV0pOyAgIH1cbmZ1bmN0aW9uIHdyaXRlUGFja2VkU1ZhcmludChhcnIsIHBiZikgIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHBiZi53cml0ZVNWYXJpbnQoYXJyW2ldKTsgIH1cbmZ1bmN0aW9uIHdyaXRlUGFja2VkRmxvYXQoYXJyLCBwYmYpICAgIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHBiZi53cml0ZUZsb2F0KGFycltpXSk7ICAgIH1cbmZ1bmN0aW9uIHdyaXRlUGFja2VkRG91YmxlKGFyciwgcGJmKSAgIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHBiZi53cml0ZURvdWJsZShhcnJbaV0pOyAgIH1cbmZ1bmN0aW9uIHdyaXRlUGFja2VkQm9vbGVhbihhcnIsIHBiZikgIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHBiZi53cml0ZUJvb2xlYW4oYXJyW2ldKTsgIH1cbmZ1bmN0aW9uIHdyaXRlUGFja2VkRml4ZWQzMihhcnIsIHBiZikgIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHBiZi53cml0ZUZpeGVkMzIoYXJyW2ldKTsgIH1cbmZ1bmN0aW9uIHdyaXRlUGFja2VkU0ZpeGVkMzIoYXJyLCBwYmYpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHBiZi53cml0ZVNGaXhlZDMyKGFycltpXSk7IH1cbmZ1bmN0aW9uIHdyaXRlUGFja2VkRml4ZWQ2NChhcnIsIHBiZikgIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHBiZi53cml0ZUZpeGVkNjQoYXJyW2ldKTsgIH1cbmZ1bmN0aW9uIHdyaXRlUGFja2VkU0ZpeGVkNjQoYXJyLCBwYmYpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHBiZi53cml0ZVNGaXhlZDY0KGFycltpXSk7IH1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBQb2ludDtcblxuZnVuY3Rpb24gUG9pbnQoeCwgeSkge1xuICAgIHRoaXMueCA9IHg7XG4gICAgdGhpcy55ID0geTtcbn1cblxuUG9pbnQucHJvdG90eXBlID0ge1xuICAgIGNsb25lOiBmdW5jdGlvbigpIHsgcmV0dXJuIG5ldyBQb2ludCh0aGlzLngsIHRoaXMueSk7IH0sXG5cbiAgICBhZGQ6ICAgICBmdW5jdGlvbihwKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX2FkZChwKTsgICAgIH0sXG4gICAgc3ViOiAgICAgZnVuY3Rpb24ocCkgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9zdWIocCk7ICAgICB9LFxuICAgIG11bHQ6ICAgIGZ1bmN0aW9uKGspIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fbXVsdChrKTsgICAgfSxcbiAgICBkaXY6ICAgICBmdW5jdGlvbihrKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX2RpdihrKTsgICAgIH0sXG4gICAgcm90YXRlOiAgZnVuY3Rpb24oYSkgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9yb3RhdGUoYSk7ICB9LFxuICAgIG1hdE11bHQ6IGZ1bmN0aW9uKG0pIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fbWF0TXVsdChtKTsgfSxcbiAgICB1bml0OiAgICBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fdW5pdCgpOyB9LFxuICAgIHBlcnA6ICAgIGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9wZXJwKCk7IH0sXG4gICAgcm91bmQ6ICAgZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX3JvdW5kKCk7IH0sXG5cbiAgICBtYWc6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KHRoaXMueCAqIHRoaXMueCArIHRoaXMueSAqIHRoaXMueSk7XG4gICAgfSxcblxuICAgIGVxdWFsczogZnVuY3Rpb24ocCkge1xuICAgICAgICByZXR1cm4gdGhpcy54ID09PSBwLnggJiZcbiAgICAgICAgICAgICAgIHRoaXMueSA9PT0gcC55O1xuICAgIH0sXG5cbiAgICBkaXN0OiBmdW5jdGlvbihwKSB7XG4gICAgICAgIHJldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0U3FyKHApKTtcbiAgICB9LFxuXG4gICAgZGlzdFNxcjogZnVuY3Rpb24ocCkge1xuICAgICAgICB2YXIgZHggPSBwLnggLSB0aGlzLngsXG4gICAgICAgICAgICBkeSA9IHAueSAtIHRoaXMueTtcbiAgICAgICAgcmV0dXJuIGR4ICogZHggKyBkeSAqIGR5O1xuICAgIH0sXG5cbiAgICBhbmdsZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBNYXRoLmF0YW4yKHRoaXMueSwgdGhpcy54KTtcbiAgICB9LFxuXG4gICAgYW5nbGVUbzogZnVuY3Rpb24oYikge1xuICAgICAgICByZXR1cm4gTWF0aC5hdGFuMih0aGlzLnkgLSBiLnksIHRoaXMueCAtIGIueCk7XG4gICAgfSxcblxuICAgIGFuZ2xlV2l0aDogZnVuY3Rpb24oYikge1xuICAgICAgICByZXR1cm4gdGhpcy5hbmdsZVdpdGhTZXAoYi54LCBiLnkpO1xuICAgIH0sXG5cbiAgICAvLyBGaW5kIHRoZSBhbmdsZSBvZiB0aGUgdHdvIHZlY3RvcnMsIHNvbHZpbmcgdGhlIGZvcm11bGEgZm9yIHRoZSBjcm9zcyBwcm9kdWN0IGEgeCBiID0gfGF8fGJ8c2luKM64KSBmb3IgzrguXG4gICAgYW5nbGVXaXRoU2VwOiBmdW5jdGlvbih4LCB5KSB7XG4gICAgICAgIHJldHVybiBNYXRoLmF0YW4yKFxuICAgICAgICAgICAgdGhpcy54ICogeSAtIHRoaXMueSAqIHgsXG4gICAgICAgICAgICB0aGlzLnggKiB4ICsgdGhpcy55ICogeSk7XG4gICAgfSxcblxuICAgIF9tYXRNdWx0OiBmdW5jdGlvbihtKSB7XG4gICAgICAgIHZhciB4ID0gbVswXSAqIHRoaXMueCArIG1bMV0gKiB0aGlzLnksXG4gICAgICAgICAgICB5ID0gbVsyXSAqIHRoaXMueCArIG1bM10gKiB0aGlzLnk7XG4gICAgICAgIHRoaXMueCA9IHg7XG4gICAgICAgIHRoaXMueSA9IHk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfYWRkOiBmdW5jdGlvbihwKSB7XG4gICAgICAgIHRoaXMueCArPSBwLng7XG4gICAgICAgIHRoaXMueSArPSBwLnk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfc3ViOiBmdW5jdGlvbihwKSB7XG4gICAgICAgIHRoaXMueCAtPSBwLng7XG4gICAgICAgIHRoaXMueSAtPSBwLnk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfbXVsdDogZnVuY3Rpb24oaykge1xuICAgICAgICB0aGlzLnggKj0gaztcbiAgICAgICAgdGhpcy55ICo9IGs7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfZGl2OiBmdW5jdGlvbihrKSB7XG4gICAgICAgIHRoaXMueCAvPSBrO1xuICAgICAgICB0aGlzLnkgLz0gaztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF91bml0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5fZGl2KHRoaXMubWFnKCkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX3BlcnA6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgeSA9IHRoaXMueTtcbiAgICAgICAgdGhpcy55ID0gdGhpcy54O1xuICAgICAgICB0aGlzLnggPSAteTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF9yb3RhdGU6IGZ1bmN0aW9uKGFuZ2xlKSB7XG4gICAgICAgIHZhciBjb3MgPSBNYXRoLmNvcyhhbmdsZSksXG4gICAgICAgICAgICBzaW4gPSBNYXRoLnNpbihhbmdsZSksXG4gICAgICAgICAgICB4ID0gY29zICogdGhpcy54IC0gc2luICogdGhpcy55LFxuICAgICAgICAgICAgeSA9IHNpbiAqIHRoaXMueCArIGNvcyAqIHRoaXMueTtcbiAgICAgICAgdGhpcy54ID0geDtcbiAgICAgICAgdGhpcy55ID0geTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF9yb3VuZDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMueCA9IE1hdGgucm91bmQodGhpcy54KTtcbiAgICAgICAgdGhpcy55ID0gTWF0aC5yb3VuZCh0aGlzLnkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59O1xuXG4vLyBjb25zdHJ1Y3RzIFBvaW50IGZyb20gYW4gYXJyYXkgaWYgbmVjZXNzYXJ5XG5Qb2ludC5jb252ZXJ0ID0gZnVuY3Rpb24gKGEpIHtcbiAgICBpZiAoYSBpbnN0YW5jZW9mIFBvaW50KSB7XG4gICAgICAgIHJldHVybiBhO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShhKSkge1xuICAgICAgICByZXR1cm4gbmV3IFBvaW50KGFbMF0sIGFbMV0pO1xuICAgIH1cbiAgICByZXR1cm4gYTtcbn07XG4iLCIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLy8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG4vLyBkb24ndCBicmVhayB0aGluZ3MuICBCdXQgd2UgbmVlZCB0byB3cmFwIGl0IGluIGEgdHJ5IGNhdGNoIGluIGNhc2UgaXQgaXNcbi8vIHdyYXBwZWQgaW4gc3RyaWN0IG1vZGUgY29kZSB3aGljaCBkb2Vzbid0IGRlZmluZSBhbnkgZ2xvYmFscy4gIEl0J3MgaW5zaWRlIGFcbi8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cbnZhciBjYWNoZWRTZXRUaW1lb3V0O1xudmFyIGNhY2hlZENsZWFyVGltZW91dDtcblxuZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG4oZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgIH1cbn0gKCkpXG5mdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG59XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpO1xuICAgIH1cbn07XG5cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcnRpYWxTb3J0O1xuXG4vLyBGbG95ZC1SaXZlc3Qgc2VsZWN0aW9uIGFsZ29yaXRobTpcbi8vIFJlYXJyYW5nZSBpdGVtcyBzbyB0aGF0IGFsbCBpdGVtcyBpbiB0aGUgW2xlZnQsIGtdIHJhbmdlIGFyZSBzbWFsbGVyIHRoYW4gYWxsIGl0ZW1zIGluIChrLCByaWdodF07XG4vLyBUaGUgay10aCBlbGVtZW50IHdpbGwgaGF2ZSB0aGUgKGsgLSBsZWZ0ICsgMSl0aCBzbWFsbGVzdCB2YWx1ZSBpbiBbbGVmdCwgcmlnaHRdXG5cbmZ1bmN0aW9uIHBhcnRpYWxTb3J0KGFyciwgaywgbGVmdCwgcmlnaHQsIGNvbXBhcmUpIHtcbiAgICBsZWZ0ID0gbGVmdCB8fCAwO1xuICAgIHJpZ2h0ID0gcmlnaHQgfHwgKGFyci5sZW5ndGggLSAxKTtcbiAgICBjb21wYXJlID0gY29tcGFyZSB8fCBkZWZhdWx0Q29tcGFyZTtcblxuICAgIHdoaWxlIChyaWdodCA+IGxlZnQpIHtcbiAgICAgICAgaWYgKHJpZ2h0IC0gbGVmdCA+IDYwMCkge1xuICAgICAgICAgICAgdmFyIG4gPSByaWdodCAtIGxlZnQgKyAxO1xuICAgICAgICAgICAgdmFyIG0gPSBrIC0gbGVmdCArIDE7XG4gICAgICAgICAgICB2YXIgeiA9IE1hdGgubG9nKG4pO1xuICAgICAgICAgICAgdmFyIHMgPSAwLjUgKiBNYXRoLmV4cCgyICogeiAvIDMpO1xuICAgICAgICAgICAgdmFyIHNkID0gMC41ICogTWF0aC5zcXJ0KHogKiBzICogKG4gLSBzKSAvIG4pICogKG0gLSBuIC8gMiA8IDAgPyAtMSA6IDEpO1xuICAgICAgICAgICAgdmFyIG5ld0xlZnQgPSBNYXRoLm1heChsZWZ0LCBNYXRoLmZsb29yKGsgLSBtICogcyAvIG4gKyBzZCkpO1xuICAgICAgICAgICAgdmFyIG5ld1JpZ2h0ID0gTWF0aC5taW4ocmlnaHQsIE1hdGguZmxvb3IoayArIChuIC0gbSkgKiBzIC8gbiArIHNkKSk7XG4gICAgICAgICAgICBwYXJ0aWFsU29ydChhcnIsIGssIG5ld0xlZnQsIG5ld1JpZ2h0LCBjb21wYXJlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB0ID0gYXJyW2tdO1xuICAgICAgICB2YXIgaSA9IGxlZnQ7XG4gICAgICAgIHZhciBqID0gcmlnaHQ7XG5cbiAgICAgICAgc3dhcChhcnIsIGxlZnQsIGspO1xuICAgICAgICBpZiAoY29tcGFyZShhcnJbcmlnaHRdLCB0KSA+IDApIHN3YXAoYXJyLCBsZWZ0LCByaWdodCk7XG5cbiAgICAgICAgd2hpbGUgKGkgPCBqKSB7XG4gICAgICAgICAgICBzd2FwKGFyciwgaSwgaik7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgICAgICBqLS07XG4gICAgICAgICAgICB3aGlsZSAoY29tcGFyZShhcnJbaV0sIHQpIDwgMCkgaSsrO1xuICAgICAgICAgICAgd2hpbGUgKGNvbXBhcmUoYXJyW2pdLCB0KSA+IDApIGotLTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb21wYXJlKGFycltsZWZ0XSwgdCkgPT09IDApIHN3YXAoYXJyLCBsZWZ0LCBqKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBqKys7XG4gICAgICAgICAgICBzd2FwKGFyciwgaiwgcmlnaHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGogPD0gaykgbGVmdCA9IGogKyAxO1xuICAgICAgICBpZiAoayA8PSBqKSByaWdodCA9IGogLSAxO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gc3dhcChhcnIsIGksIGopIHtcbiAgICB2YXIgdG1wID0gYXJyW2ldO1xuICAgIGFycltpXSA9IGFycltqXTtcbiAgICBhcnJbal0gPSB0bXA7XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRDb21wYXJlKGEsIGIpIHtcbiAgICByZXR1cm4gYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IDA7XG59XG4iLCIoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpIDpcbiAgICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoZmFjdG9yeSkgOlxuICAgIChnbG9iYWwuU2hlbGZQYWNrID0gZmFjdG9yeSgpKTtcbn0odGhpcywgZnVuY3Rpb24gKCkge1xuXG4vKipcbiAqIENyZWF0ZSBhIG5ldyBTaGVsZlBhY2sgYmluIGFsbG9jYXRvci5cbiAqXG4gKiBVc2VzIHRoZSBTaGVsZiBCZXN0IEhlaWdodCBGaXQgYWxnb3JpdGhtIGZyb21cbiAqIGh0dHA6Ly9jbGIuZGVtb24uZmkvZmlsZXMvUmVjdGFuZ2xlQmluUGFjay5wZGZcbiAqXG4gKiBAY2xhc3MgIFNoZWxmUGFja1xuICogQHBhcmFtICB7bnVtYmVyfSAgW3c9NjRdICBJbml0aWFsIHdpZHRoIG9mIHRoZSBzcHJpdGVcbiAqIEBwYXJhbSAge251bWJlcn0gIFtoPTY0XSAgSW5pdGlhbCB3aWR0aCBvZiB0aGUgc3ByaXRlXG4gKiBAcGFyYW0gIHtPYmplY3R9ICBbb3B0aW9uc11cbiAqIEBwYXJhbSAge2Jvb2xlYW59IFtvcHRpb25zLmF1dG9SZXNpemU9ZmFsc2VdICBJZiBgdHJ1ZWAsIHRoZSBzcHJpdGUgd2lsbCBhdXRvbWF0aWNhbGx5IGdyb3dcbiAqIEBleGFtcGxlXG4gKiB2YXIgc3ByaXRlID0gbmV3IFNoZWxmUGFjayg2NCwgNjQsIHsgYXV0b1Jlc2l6ZTogZmFsc2UgfSk7XG4gKi9cbmZ1bmN0aW9uIFNoZWxmUGFjayh3LCBoLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgdGhpcy53ID0gdyB8fCA2NDtcbiAgICB0aGlzLmggPSBoIHx8IDY0O1xuICAgIHRoaXMuYXV0b1Jlc2l6ZSA9ICEhb3B0aW9ucy5hdXRvUmVzaXplO1xuICAgIHRoaXMuc2hlbHZlcyA9IFtdO1xuICAgIHRoaXMuc3RhdHMgPSB7fTtcbiAgICB0aGlzLmNvdW50ID0gZnVuY3Rpb24oaCkge1xuICAgICAgICB0aGlzLnN0YXRzW2hdID0gKHRoaXMuc3RhdHNbaF0gfCAwKSArIDE7XG4gICAgfTtcbn1cblxuLyoqXG4gKiBCYXRjaCBwYWNrIG11bHRpcGxlIGJpbnMgaW50byB0aGUgc3ByaXRlLlxuICpcbiAqIEBwYXJhbSAgIHtBcnJheX0gICBiaW5zIEFycmF5IG9mIHJlcXVlc3RlZCBiaW5zIC0gZWFjaCBvYmplY3Qgc2hvdWxkIGhhdmUgYHdpZHRoYCwgYGhlaWdodGAgKG9yIGB3YCwgYGhgKSBwcm9wZXJ0aWVzXG4gKiBAcGFyYW0gICB7T2JqZWN0fSAgW29wdGlvbnNdXG4gKiBAcGFyYW0gICB7Ym9vbGVhbn0gW29wdGlvbnMuaW5QbGFjZT1mYWxzZV0gSWYgYHRydWVgLCB0aGUgc3VwcGxpZWQgYmluIG9iamVjdHMgd2lsbCBiZSB1cGRhdGVkIGlucGxhY2Ugd2l0aCBgeGAgYW5kIGB5YCBwcm9wZXJ0aWVzXG4gKiBAcmV0dXJucyB7QXJyYXl9ICAgQXJyYXkgb2YgYWxsb2NhdGVkIGJpbnMgLSBlYWNoIGJpbiBpcyBhbiBvYmplY3Qgd2l0aCBgeGAsIGB5YCwgYHdgLCBgaGAgcHJvcGVydGllc1xuICogQGV4YW1wbGVcbiAqIHZhciBiaW5zID0gW1xuICogICAgIHsgaWQ6ICdhJywgd2lkdGg6IDEyLCBoZWlnaHQ6IDEyIH0sXG4gKiAgICAgeyBpZDogJ2InLCB3aWR0aDogMTIsIGhlaWdodDogMTYgfSxcbiAqICAgICB7IGlkOiAnYycsIHdpZHRoOiAxMiwgaGVpZ2h0OiAyNCB9XG4gKiBdO1xuICogdmFyIHJlc3VsdHMgPSBzcHJpdGUucGFjayhiaW5zLCB7IGluUGxhY2U6IGZhbHNlIH0pO1xuICovXG5TaGVsZlBhY2sucHJvdG90eXBlLnBhY2sgPSBmdW5jdGlvbihiaW5zLCBvcHRpb25zKSB7XG4gICAgYmlucyA9IFtdLmNvbmNhdChiaW5zKTtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgIHZhciByZXN1bHRzID0gW10sXG4gICAgICAgIHcsIGgsIGFsbG9jYXRpb247XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJpbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdyA9IGJpbnNbaV0udyB8fCBiaW5zW2ldLndpZHRoO1xuICAgICAgICBoID0gYmluc1tpXS5oIHx8IGJpbnNbaV0uaGVpZ2h0O1xuICAgICAgICBpZiAodyAmJiBoKSB7XG4gICAgICAgICAgICBhbGxvY2F0aW9uID0gdGhpcy5wYWNrT25lKHcsIGgpO1xuICAgICAgICAgICAgaWYgKCFhbGxvY2F0aW9uKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5pblBsYWNlKSB7XG4gICAgICAgICAgICAgICAgYmluc1tpXS54ID0gYWxsb2NhdGlvbi54O1xuICAgICAgICAgICAgICAgIGJpbnNbaV0ueSA9IGFsbG9jYXRpb24ueTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdHMucHVzaChhbGxvY2F0aW9uKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNocmluayB0aGUgd2lkdGgvaGVpZ2h0IG9mIHRoZSBzcHJpdGUgdG8gdGhlIGJhcmUgbWluaW11bS5cbiAgICAvLyBTaW5jZSBzaGVsZi1wYWNrIGRvdWJsZXMgZmlyc3Qgd2lkdGgsIHRoZW4gaGVpZ2h0IHdoZW4gcnVubmluZyBvdXQgb2Ygc2hlbGYgc3BhY2VcbiAgICAvLyB0aGlzIGNhbiByZXN1bHQgaW4gZmFpcmx5IGxhcmdlIHVudXNlZCBzcGFjZSBib3RoIGluIHdpZHRoIGFuZCBoZWlnaHQgaWYgdGhhdCBoYXBwZW5zXG4gICAgLy8gdG93YXJkcyB0aGUgZW5kIG9mIGJpbiBwYWNraW5nLlxuICAgIGlmICh0aGlzLnNoZWx2ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICB2YXIgdzIgPSAwO1xuICAgICAgICB2YXIgaDIgPSAwO1xuXG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdGhpcy5zaGVsdmVzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICB2YXIgc2hlbGYgPSB0aGlzLnNoZWx2ZXNbal07XG4gICAgICAgICAgICBoMiArPSBzaGVsZi5oO1xuICAgICAgICAgICAgdzIgPSBNYXRoLm1heChzaGVsZi53IC0gc2hlbGYuZnJlZSwgdzIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZXNpemUodzIsIGgyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbn07XG5cbi8qKlxuICogUGFjayBhIHNpbmdsZSBiaW4gaW50byB0aGUgc3ByaXRlLlxuICpcbiAqIEBwYXJhbSAgIHtudW1iZXJ9ICB3ICAgV2lkdGggb2YgdGhlIGJpbiB0byBhbGxvY2F0ZVxuICogQHBhcmFtICAge251bWJlcn0gIGggICBIZWlnaHQgb2YgdGhlIGJpbiB0byBhbGxvY2F0ZVxuICogQHJldHVybnMge09iamVjdH0gIEFsbG9jYXRlZCBiaW4gb2JqZWN0IHdpdGggYHhgLCBgeWAsIGB3YCwgYGhgIHByb3BlcnRpZXMsIG9yIGBudWxsYCBpZiBhbGxvY2F0aW9uIGZhaWxlZFxuICogQGV4YW1wbGVcbiAqIHZhciByZXN1bHRzID0gc3ByaXRlLnBhY2tPbmUoMTIsIDE2KTtcbiAqL1xuU2hlbGZQYWNrLnByb3RvdHlwZS5wYWNrT25lID0gZnVuY3Rpb24odywgaCkge1xuICAgIHZhciB5ID0gMCxcbiAgICAgICAgYmVzdCA9IHsgc2hlbGY6IC0xLCB3YXN0ZTogSW5maW5pdHkgfSxcbiAgICAgICAgc2hlbGYsIHdhc3RlO1xuXG4gICAgLy8gZmluZCB0aGUgYmVzdCBzaGVsZlxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5zaGVsdmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHNoZWxmID0gdGhpcy5zaGVsdmVzW2ldO1xuICAgICAgICB5ICs9IHNoZWxmLmg7XG5cbiAgICAgICAgLy8gZXhhY3RseSB0aGUgcmlnaHQgaGVpZ2h0IHdpdGggd2lkdGggdG8gc3BhcmUsIHBhY2sgaXQuLlxuICAgICAgICBpZiAoaCA9PT0gc2hlbGYuaCAmJiB3IDw9IHNoZWxmLmZyZWUpIHtcbiAgICAgICAgICAgIHRoaXMuY291bnQoaCk7XG4gICAgICAgICAgICByZXR1cm4gc2hlbGYuYWxsb2ModywgaCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbm90IGVub3VnaCBoZWlnaHQgb3Igd2lkdGgsIHNraXAgaXQuLlxuICAgICAgICBpZiAoaCA+IHNoZWxmLmggfHwgdyA+IHNoZWxmLmZyZWUpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIG1heWJlIGVub3VnaCBoZWlnaHQgb3Igd2lkdGgsIG1pbmltaXplIHdhc3RlLi5cbiAgICAgICAgaWYgKGggPCBzaGVsZi5oICYmIHcgPD0gc2hlbGYuZnJlZSkge1xuICAgICAgICAgICAgd2FzdGUgPSBzaGVsZi5oIC0gaDtcbiAgICAgICAgICAgIGlmICh3YXN0ZSA8IGJlc3Qud2FzdGUpIHtcbiAgICAgICAgICAgICAgICBiZXN0Lndhc3RlID0gd2FzdGU7XG4gICAgICAgICAgICAgICAgYmVzdC5zaGVsZiA9IGk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoYmVzdC5zaGVsZiAhPT0gLTEpIHtcbiAgICAgICAgc2hlbGYgPSB0aGlzLnNoZWx2ZXNbYmVzdC5zaGVsZl07XG4gICAgICAgIHRoaXMuY291bnQoaCk7XG4gICAgICAgIHJldHVybiBzaGVsZi5hbGxvYyh3LCBoKTtcbiAgICB9XG5cbiAgICAvLyBhZGQgc2hlbGYuLlxuICAgIGlmIChoIDw9ICh0aGlzLmggLSB5KSAmJiB3IDw9IHRoaXMudykge1xuICAgICAgICBzaGVsZiA9IG5ldyBTaGVsZih5LCB0aGlzLncsIGgpO1xuICAgICAgICB0aGlzLnNoZWx2ZXMucHVzaChzaGVsZik7XG4gICAgICAgIHRoaXMuY291bnQoaCk7XG4gICAgICAgIHJldHVybiBzaGVsZi5hbGxvYyh3LCBoKTtcbiAgICB9XG5cbiAgICAvLyBubyBtb3JlIHNwYWNlLi5cbiAgICAvLyBJZiBgYXV0b1Jlc2l6ZWAgb3B0aW9uIGlzIHNldCwgZ3JvdyB0aGUgc3ByaXRlIGFzIGZvbGxvd3M6XG4gICAgLy8gICogZG91YmxlIHdoaWNoZXZlciBzcHJpdGUgZGltZW5zaW9uIGlzIHNtYWxsZXIgKGB3MWAgb3IgYGgxYClcbiAgICAvLyAgKiBpZiBzcHJpdGUgZGltZW5zaW9ucyBhcmUgZXF1YWwsIGdyb3cgd2lkdGggYmVmb3JlIGhlaWdodFxuICAgIC8vICAqIGFjY29tb2RhdGUgdmVyeSBsYXJnZSBiaW4gcmVxdWVzdHMgKGJpZyBgd2Agb3IgYGhgKVxuICAgIGlmICh0aGlzLmF1dG9SZXNpemUpIHtcbiAgICAgICAgdmFyIGgxLCBoMiwgdzEsIHcyO1xuXG4gICAgICAgIGgxID0gaDIgPSB0aGlzLmg7XG4gICAgICAgIHcxID0gdzIgPSB0aGlzLnc7XG5cbiAgICAgICAgaWYgKHcxIDw9IGgxIHx8IHcgPiB3MSkgeyAgIC8vIGdyb3cgd2lkdGguLlxuICAgICAgICAgICAgdzIgPSBNYXRoLm1heCh3LCB3MSkgKiAyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoMSA8IHcxIHx8IGggPiBoMSkgeyAgICAvLyBncm93IGhlaWdodC4uXG4gICAgICAgICAgICBoMiA9IE1hdGgubWF4KGgsIGgxKSAqIDI7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlc2l6ZSh3MiwgaDIpO1xuICAgICAgICByZXR1cm4gdGhpcy5wYWNrT25lKHcsIGgpOyAgLy8gcmV0cnlcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbn07XG5cbi8qKlxuICogQ2xlYXIgdGhlIHNwcml0ZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogc3ByaXRlLmNsZWFyKCk7XG4gKi9cblNoZWxmUGFjay5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnNoZWx2ZXMgPSBbXTtcbiAgICB0aGlzLnN0YXRzID0ge307XG59O1xuXG4vKipcbiAqIFJlc2l6ZSB0aGUgc3ByaXRlLlxuICpcbiAqIEBwYXJhbSAgIHtudW1iZXJ9ICB3ICBSZXF1ZXN0ZWQgbmV3IHNwcml0ZSB3aWR0aFxuICogQHBhcmFtICAge251bWJlcn0gIGggIFJlcXVlc3RlZCBuZXcgc3ByaXRlIGhlaWdodFxuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiByZXNpemUgc3VjY2VlZGVkLCBgZmFsc2VgIGlmIGZhaWxlZFxuICogQGV4YW1wbGVcbiAqIHNwcml0ZS5yZXNpemUoMjU2LCAyNTYpO1xuICovXG5TaGVsZlBhY2sucHJvdG90eXBlLnJlc2l6ZSA9IGZ1bmN0aW9uKHcsIGgpIHtcbiAgICB0aGlzLncgPSB3O1xuICAgIHRoaXMuaCA9IGg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnNoZWx2ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy5zaGVsdmVzW2ldLnJlc2l6ZSh3KTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59O1xuXG5cblxuLyoqXG4gKiBDcmVhdGUgYSBuZXcgU2hlbGYuXG4gKlxuICogQHByaXZhdGVcbiAqIEBjbGFzcyAgU2hlbGZcbiAqIEBwYXJhbSAge251bWJlcn0gIHkgICBUb3AgY29vcmRpbmF0ZSBvZiB0aGUgbmV3IHNoZWxmXG4gKiBAcGFyYW0gIHtudW1iZXJ9ICB3ICAgV2lkdGggb2YgdGhlIG5ldyBzaGVsZlxuICogQHBhcmFtICB7bnVtYmVyfSAgaCAgIEhlaWdodCBvZiB0aGUgbmV3IHNoZWxmXG4gKiBAZXhhbXBsZVxuICogdmFyIHNoZWxmID0gbmV3IFNoZWxmKDY0LCA1MTIsIDI0KTtcbiAqL1xuZnVuY3Rpb24gU2hlbGYoeSwgdywgaCkge1xuICAgIHRoaXMueCA9IDA7XG4gICAgdGhpcy55ID0geTtcbiAgICB0aGlzLncgPSB0aGlzLmZyZWUgPSB3O1xuICAgIHRoaXMuaCA9IGg7XG59XG5cbi8qKlxuICogQWxsb2NhdGUgYSBzaW5nbGUgYmluIGludG8gdGhlIHNoZWxmLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0gICB7bnVtYmVyfSAgdyAgIFdpZHRoIG9mIHRoZSBiaW4gdG8gYWxsb2NhdGVcbiAqIEBwYXJhbSAgIHtudW1iZXJ9ICBoICAgSGVpZ2h0IG9mIHRoZSBiaW4gdG8gYWxsb2NhdGVcbiAqIEByZXR1cm5zIHtPYmplY3R9ICBBbGxvY2F0ZWQgYmluIG9iamVjdCB3aXRoIGB4YCwgYHlgLCBgd2AsIGBoYCBwcm9wZXJ0aWVzLCBvciBgbnVsbGAgaWYgYWxsb2NhdGlvbiBmYWlsZWRcbiAqIEBleGFtcGxlXG4gKiBzaGVsZi5hbGxvYygxMiwgMTYpO1xuICovXG5TaGVsZi5wcm90b3R5cGUuYWxsb2MgPSBmdW5jdGlvbih3LCBoKSB7XG4gICAgaWYgKHcgPiB0aGlzLmZyZWUgfHwgaCA+IHRoaXMuaCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdmFyIHggPSB0aGlzLng7XG4gICAgdGhpcy54ICs9IHc7XG4gICAgdGhpcy5mcmVlIC09IHc7XG4gICAgcmV0dXJuIHsgeDogeCwgeTogdGhpcy55LCB3OiB3LCBoOiBoLCB3aWR0aDogdywgaGVpZ2h0OiBoIH07XG59O1xuXG4vKipcbiAqIFJlc2l6ZSB0aGUgc2hlbGYuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSAgIHtudW1iZXJ9ICB3ICBSZXF1ZXN0ZWQgbmV3IHdpZHRoIG9mIHRoZSBzaGVsZlxuICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgcmVzaXplIHN1Y2NlZWRlZCwgZmFsc2UgaWYgZmFpbGVkXG4gKiBAZXhhbXBsZVxuICogc2hlbGYucmVzaXplKDUxMik7XG4gKi9cblNoZWxmLnByb3RvdHlwZS5yZXNpemUgPSBmdW5jdGlvbih3KSB7XG4gICAgdGhpcy5mcmVlICs9ICh3IC0gdGhpcy53KTtcbiAgICB0aGlzLncgPSB3O1xuICAgIHJldHVybiB0cnVlO1xufTtcblxucmV0dXJuIFNoZWxmUGFjaztcblxufSkpOyIsIid1c2Ugc3RyaWN0JztcblxudmFyIGtkYnVzaCA9IHJlcXVpcmUoJ2tkYnVzaCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHN1cGVyY2x1c3RlcjtcblxuZnVuY3Rpb24gc3VwZXJjbHVzdGVyKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IFN1cGVyQ2x1c3RlcihvcHRpb25zKTtcbn1cblxuZnVuY3Rpb24gU3VwZXJDbHVzdGVyKG9wdGlvbnMpIHtcbiAgICB0aGlzLm9wdGlvbnMgPSBleHRlbmQoT2JqZWN0LmNyZWF0ZSh0aGlzLm9wdGlvbnMpLCBvcHRpb25zKTtcbiAgICB0aGlzLnRyZWVzID0gbmV3IEFycmF5KHRoaXMub3B0aW9ucy5tYXhab29tICsgMSk7XG59XG5cblN1cGVyQ2x1c3Rlci5wcm90b3R5cGUgPSB7XG4gICAgb3B0aW9uczoge1xuICAgICAgICBtaW5ab29tOiAwLCAgIC8vIG1pbiB6b29tIHRvIGdlbmVyYXRlIGNsdXN0ZXJzIG9uXG4gICAgICAgIG1heFpvb206IDE2LCAgLy8gbWF4IHpvb20gbGV2ZWwgdG8gY2x1c3RlciB0aGUgcG9pbnRzIG9uXG4gICAgICAgIHJhZGl1czogNDAsICAgLy8gY2x1c3RlciByYWRpdXMgaW4gcGl4ZWxzXG4gICAgICAgIGV4dGVudDogNTEyLCAgLy8gdGlsZSBleHRlbnQgKHJhZGl1cyBpcyBjYWxjdWxhdGVkIHJlbGF0aXZlIHRvIGl0KVxuICAgICAgICBub2RlU2l6ZTogNjQsIC8vIHNpemUgb2YgdGhlIEtELXRyZWUgbGVhZiBub2RlLCBhZmZlY3RzIHBlcmZvcm1hbmNlXG4gICAgICAgIGxvZzogZmFsc2UgICAgLy8gd2hldGhlciB0byBsb2cgdGltaW5nIGluZm9cbiAgICB9LFxuXG4gICAgbG9hZDogZnVuY3Rpb24gKHBvaW50cykge1xuICAgICAgICB2YXIgbG9nID0gdGhpcy5vcHRpb25zLmxvZztcblxuICAgICAgICBpZiAobG9nKSBjb25zb2xlLnRpbWUoJ3RvdGFsIHRpbWUnKTtcblxuICAgICAgICB2YXIgdGltZXJJZCA9ICdwcmVwYXJlICcgKyBwb2ludHMubGVuZ3RoICsgJyBwb2ludHMnO1xuICAgICAgICBpZiAobG9nKSBjb25zb2xlLnRpbWUodGltZXJJZCk7XG5cbiAgICAgICAgdGhpcy5wb2ludHMgPSBwb2ludHM7XG5cbiAgICAgICAgLy8gZ2VuZXJhdGUgYSBjbHVzdGVyIG9iamVjdCBmb3IgZWFjaCBwb2ludFxuICAgICAgICB2YXIgY2x1c3RlcnMgPSBwb2ludHMubWFwKGNyZWF0ZVBvaW50Q2x1c3Rlcik7XG4gICAgICAgIGlmIChsb2cpIGNvbnNvbGUudGltZUVuZCh0aW1lcklkKTtcblxuICAgICAgICAvLyBjbHVzdGVyIHBvaW50cyBvbiBtYXggem9vbSwgdGhlbiBjbHVzdGVyIHRoZSByZXN1bHRzIG9uIHByZXZpb3VzIHpvb20sIGV0Yy47XG4gICAgICAgIC8vIHJlc3VsdHMgaW4gYSBjbHVzdGVyIGhpZXJhcmNoeSBhY3Jvc3Mgem9vbSBsZXZlbHNcbiAgICAgICAgZm9yICh2YXIgeiA9IHRoaXMub3B0aW9ucy5tYXhab29tOyB6ID49IHRoaXMub3B0aW9ucy5taW5ab29tOyB6LS0pIHtcbiAgICAgICAgICAgIHZhciBub3cgPSArRGF0ZS5ub3coKTtcblxuICAgICAgICAgICAgLy8gaW5kZXggaW5wdXQgcG9pbnRzIGludG8gYSBLRC10cmVlXG4gICAgICAgICAgICB0aGlzLnRyZWVzW3ogKyAxXSA9IGtkYnVzaChjbHVzdGVycywgZ2V0WCwgZ2V0WSwgdGhpcy5vcHRpb25zLm5vZGVTaXplLCBGbG9hdDMyQXJyYXkpO1xuXG4gICAgICAgICAgICBjbHVzdGVycyA9IHRoaXMuX2NsdXN0ZXIoY2x1c3RlcnMsIHopOyAvLyBjcmVhdGUgYSBuZXcgc2V0IG9mIGNsdXN0ZXJzIGZvciB0aGUgem9vbVxuXG4gICAgICAgICAgICBpZiAobG9nKSBjb25zb2xlLmxvZygneiVkOiAlZCBjbHVzdGVycyBpbiAlZG1zJywgeiwgY2x1c3RlcnMubGVuZ3RoLCArRGF0ZS5ub3coKSAtIG5vdyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpbmRleCB0b3AtbGV2ZWwgY2x1c3RlcnNcbiAgICAgICAgdGhpcy50cmVlc1t0aGlzLm9wdGlvbnMubWluWm9vbV0gPSBrZGJ1c2goY2x1c3RlcnMsIGdldFgsIGdldFksIHRoaXMub3B0aW9ucy5ub2RlU2l6ZSwgRmxvYXQzMkFycmF5KTtcblxuICAgICAgICBpZiAobG9nKSBjb25zb2xlLnRpbWVFbmQoJ3RvdGFsIHRpbWUnKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgZ2V0Q2x1c3RlcnM6IGZ1bmN0aW9uIChiYm94LCB6b29tKSB7XG4gICAgICAgIHZhciB0cmVlID0gdGhpcy50cmVlc1t0aGlzLl9saW1pdFpvb20oem9vbSldO1xuICAgICAgICB2YXIgaWRzID0gdHJlZS5yYW5nZShsbmdYKGJib3hbMF0pLCBsYXRZKGJib3hbM10pLCBsbmdYKGJib3hbMl0pLCBsYXRZKGJib3hbMV0pKTtcbiAgICAgICAgdmFyIGNsdXN0ZXJzID0gW107XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgYyA9IHRyZWUucG9pbnRzW2lkc1tpXV07XG4gICAgICAgICAgICBjbHVzdGVycy5wdXNoKGMuaWQgIT09IC0xID8gdGhpcy5wb2ludHNbYy5pZF0gOiBnZXRDbHVzdGVySlNPTihjKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNsdXN0ZXJzO1xuICAgIH0sXG5cbiAgICBnZXRUaWxlOiBmdW5jdGlvbiAoeiwgeCwgeSkge1xuICAgICAgICB2YXIgdHJlZSA9IHRoaXMudHJlZXNbdGhpcy5fbGltaXRab29tKHopXTtcbiAgICAgICAgdmFyIHoyID0gTWF0aC5wb3coMiwgeik7XG4gICAgICAgIHZhciBleHRlbnQgPSB0aGlzLm9wdGlvbnMuZXh0ZW50O1xuICAgICAgICB2YXIgciA9IHRoaXMub3B0aW9ucy5yYWRpdXM7XG4gICAgICAgIHZhciBwID0gciAvIGV4dGVudDtcbiAgICAgICAgdmFyIHRvcCA9ICh5IC0gcCkgLyB6MjtcbiAgICAgICAgdmFyIGJvdHRvbSA9ICh5ICsgMSArIHApIC8gejI7XG5cbiAgICAgICAgdmFyIHRpbGUgPSB7XG4gICAgICAgICAgICBmZWF0dXJlczogW11cbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLl9hZGRUaWxlRmVhdHVyZXMoXG4gICAgICAgICAgICB0cmVlLnJhbmdlKCh4IC0gcCkgLyB6MiwgdG9wLCAoeCArIDEgKyBwKSAvIHoyLCBib3R0b20pLFxuICAgICAgICAgICAgdHJlZS5wb2ludHMsIHgsIHksIHoyLCB0aWxlKTtcblxuICAgICAgICBpZiAoeCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5fYWRkVGlsZUZlYXR1cmVzKFxuICAgICAgICAgICAgICAgIHRyZWUucmFuZ2UoMSAtIHAgLyB6MiwgdG9wLCAxLCBib3R0b20pLFxuICAgICAgICAgICAgICAgIHRyZWUucG9pbnRzLCB6MiwgeSwgejIsIHRpbGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh4ID09PSB6MiAtIDEpIHtcbiAgICAgICAgICAgIHRoaXMuX2FkZFRpbGVGZWF0dXJlcyhcbiAgICAgICAgICAgICAgICB0cmVlLnJhbmdlKDAsIHRvcCwgcCAvIHoyLCBib3R0b20pLFxuICAgICAgICAgICAgICAgIHRyZWUucG9pbnRzLCAtMSwgeSwgejIsIHRpbGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRpbGUuZmVhdHVyZXMubGVuZ3RoID8gdGlsZSA6IG51bGw7XG4gICAgfSxcblxuICAgIF9hZGRUaWxlRmVhdHVyZXM6IGZ1bmN0aW9uIChpZHMsIHBvaW50cywgeCwgeSwgejIsIHRpbGUpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBjID0gcG9pbnRzW2lkc1tpXV07XG4gICAgICAgICAgICB0aWxlLmZlYXR1cmVzLnB1c2goe1xuICAgICAgICAgICAgICAgIHR5cGU6IDEsXG4gICAgICAgICAgICAgICAgZ2VvbWV0cnk6IFtbXG4gICAgICAgICAgICAgICAgICAgIE1hdGgucm91bmQodGhpcy5vcHRpb25zLmV4dGVudCAqIChjLnggKiB6MiAtIHgpKSxcbiAgICAgICAgICAgICAgICAgICAgTWF0aC5yb3VuZCh0aGlzLm9wdGlvbnMuZXh0ZW50ICogKGMueSAqIHoyIC0geSkpXG4gICAgICAgICAgICAgICAgXV0sXG4gICAgICAgICAgICAgICAgdGFnczogYy5pZCAhPT0gLTEgPyB0aGlzLnBvaW50c1tjLmlkXS5wcm9wZXJ0aWVzIDogZ2V0Q2x1c3RlclByb3BlcnRpZXMoYylcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIF9saW1pdFpvb206IGZ1bmN0aW9uICh6KSB7XG4gICAgICAgIHJldHVybiBNYXRoLm1heCh0aGlzLm9wdGlvbnMubWluWm9vbSwgTWF0aC5taW4oeiwgdGhpcy5vcHRpb25zLm1heFpvb20gKyAxKSk7XG4gICAgfSxcblxuICAgIF9jbHVzdGVyOiBmdW5jdGlvbiAocG9pbnRzLCB6b29tKSB7XG4gICAgICAgIHZhciBjbHVzdGVycyA9IFtdO1xuICAgICAgICB2YXIgciA9IHRoaXMub3B0aW9ucy5yYWRpdXMgLyAodGhpcy5vcHRpb25zLmV4dGVudCAqIE1hdGgucG93KDIsIHpvb20pKTtcblxuICAgICAgICAvLyBsb29wIHRocm91Z2ggZWFjaCBwb2ludFxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHAgPSBwb2ludHNbaV07XG4gICAgICAgICAgICAvLyBpZiB3ZSd2ZSBhbHJlYWR5IHZpc2l0ZWQgdGhlIHBvaW50IGF0IHRoaXMgem9vbSBsZXZlbCwgc2tpcCBpdFxuICAgICAgICAgICAgaWYgKHAuem9vbSA8PSB6b29tKSBjb250aW51ZTtcbiAgICAgICAgICAgIHAuem9vbSA9IHpvb207XG5cbiAgICAgICAgICAgIC8vIGZpbmQgYWxsIG5lYXJieSBwb2ludHNcbiAgICAgICAgICAgIHZhciB0cmVlID0gdGhpcy50cmVlc1t6b29tICsgMV07XG4gICAgICAgICAgICB2YXIgbmVpZ2hib3JJZHMgPSB0cmVlLndpdGhpbihwLngsIHAueSwgcik7XG5cbiAgICAgICAgICAgIHZhciBmb3VuZE5laWdoYm9ycyA9IGZhbHNlO1xuICAgICAgICAgICAgdmFyIG51bVBvaW50cyA9IHAubnVtUG9pbnRzO1xuICAgICAgICAgICAgdmFyIHd4ID0gcC54ICogbnVtUG9pbnRzO1xuICAgICAgICAgICAgdmFyIHd5ID0gcC55ICogbnVtUG9pbnRzO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG5laWdoYm9ySWRzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGIgPSB0cmVlLnBvaW50c1tuZWlnaGJvcklkc1tqXV07XG4gICAgICAgICAgICAgICAgLy8gZmlsdGVyIG91dCBuZWlnaGJvcnMgdGhhdCBhcmUgdG9vIGZhciBvciBhbHJlYWR5IHByb2Nlc3NlZFxuICAgICAgICAgICAgICAgIGlmICh6b29tIDwgYi56b29tKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvdW5kTmVpZ2hib3JzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYi56b29tID0gem9vbTsgLy8gc2F2ZSB0aGUgem9vbSAoc28gaXQgZG9lc24ndCBnZXQgcHJvY2Vzc2VkIHR3aWNlKVxuICAgICAgICAgICAgICAgICAgICB3eCArPSBiLnggKiBiLm51bVBvaW50czsgLy8gYWNjdW11bGF0ZSBjb29yZGluYXRlcyBmb3IgY2FsY3VsYXRpbmcgd2VpZ2h0ZWQgY2VudGVyXG4gICAgICAgICAgICAgICAgICAgIHd5ICs9IGIueSAqIGIubnVtUG9pbnRzO1xuICAgICAgICAgICAgICAgICAgICBudW1Qb2ludHMgKz0gYi5udW1Qb2ludHM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjbHVzdGVycy5wdXNoKGZvdW5kTmVpZ2hib3JzID8gY3JlYXRlQ2x1c3Rlcih3eCAvIG51bVBvaW50cywgd3kgLyBudW1Qb2ludHMsIG51bVBvaW50cywgLTEpIDogcCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY2x1c3RlcnM7XG4gICAgfVxufTtcblxuZnVuY3Rpb24gY3JlYXRlQ2x1c3Rlcih4LCB5LCBudW1Qb2ludHMsIGlkKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgeDogeCwgLy8gd2VpZ2h0ZWQgY2x1c3RlciBjZW50ZXJcbiAgICAgICAgeTogeSxcbiAgICAgICAgem9vbTogSW5maW5pdHksIC8vIHRoZSBsYXN0IHpvb20gdGhlIGNsdXN0ZXIgd2FzIHByb2Nlc3NlZCBhdFxuICAgICAgICBpZDogaWQsIC8vIGluZGV4IG9mIHRoZSBzb3VyY2UgZmVhdHVyZSBpbiB0aGUgb3JpZ2luYWwgaW5wdXQgYXJyYXlcbiAgICAgICAgbnVtUG9pbnRzOiBudW1Qb2ludHNcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVQb2ludENsdXN0ZXIocCwgaSkge1xuICAgIHZhciBjb29yZHMgPSBwLmdlb21ldHJ5LmNvb3JkaW5hdGVzO1xuICAgIHJldHVybiBjcmVhdGVDbHVzdGVyKGxuZ1goY29vcmRzWzBdKSwgbGF0WShjb29yZHNbMV0pLCAxLCBpKTtcbn1cblxuZnVuY3Rpb24gZ2V0Q2x1c3RlckpTT04oY2x1c3Rlcikge1xuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICdGZWF0dXJlJyxcbiAgICAgICAgcHJvcGVydGllczogZ2V0Q2x1c3RlclByb3BlcnRpZXMoY2x1c3RlciksXG4gICAgICAgIGdlb21ldHJ5OiB7XG4gICAgICAgICAgICB0eXBlOiAnUG9pbnQnLFxuICAgICAgICAgICAgY29vcmRpbmF0ZXM6IFt4TG5nKGNsdXN0ZXIueCksIHlMYXQoY2x1c3Rlci55KV1cbiAgICAgICAgfVxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGdldENsdXN0ZXJQcm9wZXJ0aWVzKGNsdXN0ZXIpIHtcbiAgICB2YXIgY291bnQgPSBjbHVzdGVyLm51bVBvaW50cztcbiAgICB2YXIgYWJicmV2ID0gY291bnQgPj0gMTAwMDAgPyBNYXRoLnJvdW5kKGNvdW50IC8gMTAwMCkgKyAnaycgOlxuICAgICAgICAgICAgICAgICBjb3VudCA+PSAxMDAwID8gKE1hdGgucm91bmQoY291bnQgLyAxMDApIC8gMTApICsgJ2snIDogY291bnQ7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY2x1c3RlcjogdHJ1ZSxcbiAgICAgICAgcG9pbnRfY291bnQ6IGNvdW50LFxuICAgICAgICBwb2ludF9jb3VudF9hYmJyZXZpYXRlZDogYWJicmV2XG4gICAgfTtcbn1cblxuLy8gbG9uZ2l0dWRlL2xhdGl0dWRlIHRvIHNwaGVyaWNhbCBtZXJjYXRvciBpbiBbMC4uMV0gcmFuZ2VcbmZ1bmN0aW9uIGxuZ1gobG5nKSB7XG4gICAgcmV0dXJuIGxuZyAvIDM2MCArIDAuNTtcbn1cbmZ1bmN0aW9uIGxhdFkobGF0KSB7XG4gICAgdmFyIHNpbiA9IE1hdGguc2luKGxhdCAqIE1hdGguUEkgLyAxODApLFxuICAgICAgICB5ID0gKDAuNSAtIDAuMjUgKiBNYXRoLmxvZygoMSArIHNpbikgLyAoMSAtIHNpbikpIC8gTWF0aC5QSSk7XG4gICAgcmV0dXJuIHkgPCAwID8gMCA6XG4gICAgICAgICAgIHkgPiAxID8gMSA6IHk7XG59XG5cbi8vIHNwaGVyaWNhbCBtZXJjYXRvciB0byBsb25naXR1ZGUvbGF0aXR1ZGVcbmZ1bmN0aW9uIHhMbmcoeCkge1xuICAgIHJldHVybiAoeCAtIDAuNSkgKiAzNjA7XG59XG5mdW5jdGlvbiB5TGF0KHkpIHtcbiAgICB2YXIgeTIgPSAoMTgwIC0geSAqIDM2MCkgKiBNYXRoLlBJIC8gMTgwO1xuICAgIHJldHVybiAzNjAgKiBNYXRoLmF0YW4oTWF0aC5leHAoeTIpKSAvIE1hdGguUEkgLSA5MDtcbn1cblxuZnVuY3Rpb24gZXh0ZW5kKGRlc3QsIHNyYykge1xuICAgIGZvciAodmFyIGlkIGluIHNyYykgZGVzdFtpZF0gPSBzcmNbaWRdO1xuICAgIHJldHVybiBkZXN0O1xufVxuXG5mdW5jdGlvbiBnZXRYKHApIHtcbiAgICByZXR1cm4gcC54O1xufVxuZnVuY3Rpb24gZ2V0WShwKSB7XG4gICAgcmV0dXJuIHAueTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBUaW55UXVldWU7XG5cbmZ1bmN0aW9uIFRpbnlRdWV1ZShkYXRhLCBjb21wYXJlKSB7XG4gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFRpbnlRdWV1ZSkpIHJldHVybiBuZXcgVGlueVF1ZXVlKGRhdGEsIGNvbXBhcmUpO1xuXG4gICAgdGhpcy5kYXRhID0gZGF0YSB8fCBbXTtcbiAgICB0aGlzLmxlbmd0aCA9IHRoaXMuZGF0YS5sZW5ndGg7XG4gICAgdGhpcy5jb21wYXJlID0gY29tcGFyZSB8fCBkZWZhdWx0Q29tcGFyZTtcblxuICAgIGlmIChkYXRhKSBmb3IgKHZhciBpID0gTWF0aC5mbG9vcih0aGlzLmxlbmd0aCAvIDIpOyBpID49IDA7IGktLSkgdGhpcy5fZG93bihpKTtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdENvbXBhcmUoYSwgYikge1xuICAgIHJldHVybiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogMDtcbn1cblxuVGlueVF1ZXVlLnByb3RvdHlwZSA9IHtcblxuICAgIHB1c2g6IGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgIHRoaXMuZGF0YS5wdXNoKGl0ZW0pO1xuICAgICAgICB0aGlzLmxlbmd0aCsrO1xuICAgICAgICB0aGlzLl91cCh0aGlzLmxlbmd0aCAtIDEpO1xuICAgIH0sXG5cbiAgICBwb3A6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHRvcCA9IHRoaXMuZGF0YVswXTtcbiAgICAgICAgdGhpcy5kYXRhWzBdID0gdGhpcy5kYXRhW3RoaXMubGVuZ3RoIC0gMV07XG4gICAgICAgIHRoaXMubGVuZ3RoLS07XG4gICAgICAgIHRoaXMuZGF0YS5wb3AoKTtcbiAgICAgICAgdGhpcy5fZG93bigwKTtcbiAgICAgICAgcmV0dXJuIHRvcDtcbiAgICB9LFxuXG4gICAgcGVlazogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhWzBdO1xuICAgIH0sXG5cbiAgICBfdXA6IGZ1bmN0aW9uIChwb3MpIHtcbiAgICAgICAgdmFyIGRhdGEgPSB0aGlzLmRhdGEsXG4gICAgICAgICAgICBjb21wYXJlID0gdGhpcy5jb21wYXJlO1xuXG4gICAgICAgIHdoaWxlIChwb3MgPiAwKSB7XG4gICAgICAgICAgICB2YXIgcGFyZW50ID0gTWF0aC5mbG9vcigocG9zIC0gMSkgLyAyKTtcbiAgICAgICAgICAgIGlmIChjb21wYXJlKGRhdGFbcG9zXSwgZGF0YVtwYXJlbnRdKSA8IDApIHtcbiAgICAgICAgICAgICAgICBzd2FwKGRhdGEsIHBhcmVudCwgcG9zKTtcbiAgICAgICAgICAgICAgICBwb3MgPSBwYXJlbnQ7XG5cbiAgICAgICAgICAgIH0gZWxzZSBicmVhaztcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBfZG93bjogZnVuY3Rpb24gKHBvcykge1xuICAgICAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YSxcbiAgICAgICAgICAgIGNvbXBhcmUgPSB0aGlzLmNvbXBhcmUsXG4gICAgICAgICAgICBsZW4gPSB0aGlzLmxlbmd0aDtcblxuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgdmFyIGxlZnQgPSAyICogcG9zICsgMSxcbiAgICAgICAgICAgICAgICByaWdodCA9IGxlZnQgKyAxLFxuICAgICAgICAgICAgICAgIG1pbiA9IHBvcztcblxuICAgICAgICAgICAgaWYgKGxlZnQgPCBsZW4gJiYgY29tcGFyZShkYXRhW2xlZnRdLCBkYXRhW21pbl0pIDwgMCkgbWluID0gbGVmdDtcbiAgICAgICAgICAgIGlmIChyaWdodCA8IGxlbiAmJiBjb21wYXJlKGRhdGFbcmlnaHRdLCBkYXRhW21pbl0pIDwgMCkgbWluID0gcmlnaHQ7XG5cbiAgICAgICAgICAgIGlmIChtaW4gPT09IHBvcykgcmV0dXJuO1xuXG4gICAgICAgICAgICBzd2FwKGRhdGEsIG1pbiwgcG9zKTtcbiAgICAgICAgICAgIHBvcyA9IG1pbjtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbmZ1bmN0aW9uIHN3YXAoZGF0YSwgaSwgaikge1xuICAgIHZhciB0bXAgPSBkYXRhW2ldO1xuICAgIGRhdGFbaV0gPSBkYXRhW2pdO1xuICAgIGRhdGFbal0gPSB0bXA7XG59XG4iLCJpZiAodHlwZW9mIE9iamVjdC5jcmVhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgLy8gaW1wbGVtZW50YXRpb24gZnJvbSBzdGFuZGFyZCBub2RlLmpzICd1dGlsJyBtb2R1bGVcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvclxuICAgIGN0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckN0b3IucHJvdG90eXBlLCB7XG4gICAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgICB2YWx1ZTogY3RvcixcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbn0gZWxzZSB7XG4gIC8vIG9sZCBzY2hvb2wgc2hpbSBmb3Igb2xkIGJyb3dzZXJzXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICB2YXIgVGVtcEN0b3IgPSBmdW5jdGlvbiAoKSB7fVxuICAgIFRlbXBDdG9yLnByb3RvdHlwZSA9IHN1cGVyQ3Rvci5wcm90b3R5cGVcbiAgICBjdG9yLnByb3RvdHlwZSA9IG5ldyBUZW1wQ3RvcigpXG4gICAgY3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBjdG9yXG4gIH1cbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNCdWZmZXIoYXJnKSB7XG4gIHJldHVybiBhcmcgJiYgdHlwZW9mIGFyZyA9PT0gJ29iamVjdCdcbiAgICAmJiB0eXBlb2YgYXJnLmNvcHkgPT09ICdmdW5jdGlvbidcbiAgICAmJiB0eXBlb2YgYXJnLmZpbGwgPT09ICdmdW5jdGlvbidcbiAgICAmJiB0eXBlb2YgYXJnLnJlYWRVSW50OCA9PT0gJ2Z1bmN0aW9uJztcbn0iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxudmFyIGZvcm1hdFJlZ0V4cCA9IC8lW3NkaiVdL2c7XG5leHBvcnRzLmZvcm1hdCA9IGZ1bmN0aW9uKGYpIHtcbiAgaWYgKCFpc1N0cmluZyhmKSkge1xuICAgIHZhciBvYmplY3RzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIG9iamVjdHMucHVzaChpbnNwZWN0KGFyZ3VtZW50c1tpXSkpO1xuICAgIH1cbiAgICByZXR1cm4gb2JqZWN0cy5qb2luKCcgJyk7XG4gIH1cblxuICB2YXIgaSA9IDE7XG4gIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICB2YXIgbGVuID0gYXJncy5sZW5ndGg7XG4gIHZhciBzdHIgPSBTdHJpbmcoZikucmVwbGFjZShmb3JtYXRSZWdFeHAsIGZ1bmN0aW9uKHgpIHtcbiAgICBpZiAoeCA9PT0gJyUlJykgcmV0dXJuICclJztcbiAgICBpZiAoaSA+PSBsZW4pIHJldHVybiB4O1xuICAgIHN3aXRjaCAoeCkge1xuICAgICAgY2FzZSAnJXMnOiByZXR1cm4gU3RyaW5nKGFyZ3NbaSsrXSk7XG4gICAgICBjYXNlICclZCc6IHJldHVybiBOdW1iZXIoYXJnc1tpKytdKTtcbiAgICAgIGNhc2UgJyVqJzpcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYXJnc1tpKytdKTtcbiAgICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICAgIHJldHVybiAnW0NpcmN1bGFyXSc7XG4gICAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB4O1xuICAgIH1cbiAgfSk7XG4gIGZvciAodmFyIHggPSBhcmdzW2ldOyBpIDwgbGVuOyB4ID0gYXJnc1srK2ldKSB7XG4gICAgaWYgKGlzTnVsbCh4KSB8fCAhaXNPYmplY3QoeCkpIHtcbiAgICAgIHN0ciArPSAnICcgKyB4O1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgKz0gJyAnICsgaW5zcGVjdCh4KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN0cjtcbn07XG5cblxuLy8gTWFyayB0aGF0IGEgbWV0aG9kIHNob3VsZCBub3QgYmUgdXNlZC5cbi8vIFJldHVybnMgYSBtb2RpZmllZCBmdW5jdGlvbiB3aGljaCB3YXJucyBvbmNlIGJ5IGRlZmF1bHQuXG4vLyBJZiAtLW5vLWRlcHJlY2F0aW9uIGlzIHNldCwgdGhlbiBpdCBpcyBhIG5vLW9wLlxuZXhwb3J0cy5kZXByZWNhdGUgPSBmdW5jdGlvbihmbiwgbXNnKSB7XG4gIC8vIEFsbG93IGZvciBkZXByZWNhdGluZyB0aGluZ3MgaW4gdGhlIHByb2Nlc3Mgb2Ygc3RhcnRpbmcgdXAuXG4gIGlmIChpc1VuZGVmaW5lZChnbG9iYWwucHJvY2VzcykpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZXhwb3J0cy5kZXByZWNhdGUoZm4sIG1zZykuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9XG5cbiAgaWYgKHByb2Nlc3Mubm9EZXByZWNhdGlvbiA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiBmbjtcbiAgfVxuXG4gIHZhciB3YXJuZWQgPSBmYWxzZTtcbiAgZnVuY3Rpb24gZGVwcmVjYXRlZCgpIHtcbiAgICBpZiAoIXdhcm5lZCkge1xuICAgICAgaWYgKHByb2Nlc3MudGhyb3dEZXByZWNhdGlvbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICAgIH0gZWxzZSBpZiAocHJvY2Vzcy50cmFjZURlcHJlY2F0aW9uKSB7XG4gICAgICAgIGNvbnNvbGUudHJhY2UobXNnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IobXNnKTtcbiAgICAgIH1cbiAgICAgIHdhcm5lZCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgcmV0dXJuIGRlcHJlY2F0ZWQ7XG59O1xuXG5cbnZhciBkZWJ1Z3MgPSB7fTtcbnZhciBkZWJ1Z0Vudmlyb247XG5leHBvcnRzLmRlYnVnbG9nID0gZnVuY3Rpb24oc2V0KSB7XG4gIGlmIChpc1VuZGVmaW5lZChkZWJ1Z0Vudmlyb24pKVxuICAgIGRlYnVnRW52aXJvbiA9IHByb2Nlc3MuZW52Lk5PREVfREVCVUcgfHwgJyc7XG4gIHNldCA9IHNldC50b1VwcGVyQ2FzZSgpO1xuICBpZiAoIWRlYnVnc1tzZXRdKSB7XG4gICAgaWYgKG5ldyBSZWdFeHAoJ1xcXFxiJyArIHNldCArICdcXFxcYicsICdpJykudGVzdChkZWJ1Z0Vudmlyb24pKSB7XG4gICAgICB2YXIgcGlkID0gcHJvY2Vzcy5waWQ7XG4gICAgICBkZWJ1Z3Nbc2V0XSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgbXNnID0gZXhwb3J0cy5mb3JtYXQuYXBwbHkoZXhwb3J0cywgYXJndW1lbnRzKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignJXMgJWQ6ICVzJywgc2V0LCBwaWQsIG1zZyk7XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWJ1Z3Nbc2V0XSA9IGZ1bmN0aW9uKCkge307XG4gICAgfVxuICB9XG4gIHJldHVybiBkZWJ1Z3Nbc2V0XTtcbn07XG5cblxuLyoqXG4gKiBFY2hvcyB0aGUgdmFsdWUgb2YgYSB2YWx1ZS4gVHJ5cyB0byBwcmludCB0aGUgdmFsdWUgb3V0XG4gKiBpbiB0aGUgYmVzdCB3YXkgcG9zc2libGUgZ2l2ZW4gdGhlIGRpZmZlcmVudCB0eXBlcy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gcHJpbnQgb3V0LlxuICogQHBhcmFtIHtPYmplY3R9IG9wdHMgT3B0aW9uYWwgb3B0aW9ucyBvYmplY3QgdGhhdCBhbHRlcnMgdGhlIG91dHB1dC5cbiAqL1xuLyogbGVnYWN5OiBvYmosIHNob3dIaWRkZW4sIGRlcHRoLCBjb2xvcnMqL1xuZnVuY3Rpb24gaW5zcGVjdChvYmosIG9wdHMpIHtcbiAgLy8gZGVmYXVsdCBvcHRpb25zXG4gIHZhciBjdHggPSB7XG4gICAgc2VlbjogW10sXG4gICAgc3R5bGl6ZTogc3R5bGl6ZU5vQ29sb3JcbiAgfTtcbiAgLy8gbGVnYWN5Li4uXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID49IDMpIGN0eC5kZXB0aCA9IGFyZ3VtZW50c1syXTtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gNCkgY3R4LmNvbG9ycyA9IGFyZ3VtZW50c1szXTtcbiAgaWYgKGlzQm9vbGVhbihvcHRzKSkge1xuICAgIC8vIGxlZ2FjeS4uLlxuICAgIGN0eC5zaG93SGlkZGVuID0gb3B0cztcbiAgfSBlbHNlIGlmIChvcHRzKSB7XG4gICAgLy8gZ290IGFuIFwib3B0aW9uc1wiIG9iamVjdFxuICAgIGV4cG9ydHMuX2V4dGVuZChjdHgsIG9wdHMpO1xuICB9XG4gIC8vIHNldCBkZWZhdWx0IG9wdGlvbnNcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5zaG93SGlkZGVuKSkgY3R4LnNob3dIaWRkZW4gPSBmYWxzZTtcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5kZXB0aCkpIGN0eC5kZXB0aCA9IDI7XG4gIGlmIChpc1VuZGVmaW5lZChjdHguY29sb3JzKSkgY3R4LmNvbG9ycyA9IGZhbHNlO1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LmN1c3RvbUluc3BlY3QpKSBjdHguY3VzdG9tSW5zcGVjdCA9IHRydWU7XG4gIGlmIChjdHguY29sb3JzKSBjdHguc3R5bGl6ZSA9IHN0eWxpemVXaXRoQ29sb3I7XG4gIHJldHVybiBmb3JtYXRWYWx1ZShjdHgsIG9iaiwgY3R4LmRlcHRoKTtcbn1cbmV4cG9ydHMuaW5zcGVjdCA9IGluc3BlY3Q7XG5cblxuLy8gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9BTlNJX2VzY2FwZV9jb2RlI2dyYXBoaWNzXG5pbnNwZWN0LmNvbG9ycyA9IHtcbiAgJ2JvbGQnIDogWzEsIDIyXSxcbiAgJ2l0YWxpYycgOiBbMywgMjNdLFxuICAndW5kZXJsaW5lJyA6IFs0LCAyNF0sXG4gICdpbnZlcnNlJyA6IFs3LCAyN10sXG4gICd3aGl0ZScgOiBbMzcsIDM5XSxcbiAgJ2dyZXknIDogWzkwLCAzOV0sXG4gICdibGFjaycgOiBbMzAsIDM5XSxcbiAgJ2JsdWUnIDogWzM0LCAzOV0sXG4gICdjeWFuJyA6IFszNiwgMzldLFxuICAnZ3JlZW4nIDogWzMyLCAzOV0sXG4gICdtYWdlbnRhJyA6IFszNSwgMzldLFxuICAncmVkJyA6IFszMSwgMzldLFxuICAneWVsbG93JyA6IFszMywgMzldXG59O1xuXG4vLyBEb24ndCB1c2UgJ2JsdWUnIG5vdCB2aXNpYmxlIG9uIGNtZC5leGVcbmluc3BlY3Quc3R5bGVzID0ge1xuICAnc3BlY2lhbCc6ICdjeWFuJyxcbiAgJ251bWJlcic6ICd5ZWxsb3cnLFxuICAnYm9vbGVhbic6ICd5ZWxsb3cnLFxuICAndW5kZWZpbmVkJzogJ2dyZXknLFxuICAnbnVsbCc6ICdib2xkJyxcbiAgJ3N0cmluZyc6ICdncmVlbicsXG4gICdkYXRlJzogJ21hZ2VudGEnLFxuICAvLyBcIm5hbWVcIjogaW50ZW50aW9uYWxseSBub3Qgc3R5bGluZ1xuICAncmVnZXhwJzogJ3JlZCdcbn07XG5cblxuZnVuY3Rpb24gc3R5bGl6ZVdpdGhDb2xvcihzdHIsIHN0eWxlVHlwZSkge1xuICB2YXIgc3R5bGUgPSBpbnNwZWN0LnN0eWxlc1tzdHlsZVR5cGVdO1xuXG4gIGlmIChzdHlsZSkge1xuICAgIHJldHVybiAnXFx1MDAxYlsnICsgaW5zcGVjdC5jb2xvcnNbc3R5bGVdWzBdICsgJ20nICsgc3RyICtcbiAgICAgICAgICAgJ1xcdTAwMWJbJyArIGluc3BlY3QuY29sb3JzW3N0eWxlXVsxXSArICdtJztcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gc3RyO1xuICB9XG59XG5cblxuZnVuY3Rpb24gc3R5bGl6ZU5vQ29sb3Ioc3RyLCBzdHlsZVR5cGUpIHtcbiAgcmV0dXJuIHN0cjtcbn1cblxuXG5mdW5jdGlvbiBhcnJheVRvSGFzaChhcnJheSkge1xuICB2YXIgaGFzaCA9IHt9O1xuXG4gIGFycmF5LmZvckVhY2goZnVuY3Rpb24odmFsLCBpZHgpIHtcbiAgICBoYXNoW3ZhbF0gPSB0cnVlO1xuICB9KTtcblxuICByZXR1cm4gaGFzaDtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRWYWx1ZShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMpIHtcbiAgLy8gUHJvdmlkZSBhIGhvb2sgZm9yIHVzZXItc3BlY2lmaWVkIGluc3BlY3QgZnVuY3Rpb25zLlxuICAvLyBDaGVjayB0aGF0IHZhbHVlIGlzIGFuIG9iamVjdCB3aXRoIGFuIGluc3BlY3QgZnVuY3Rpb24gb24gaXRcbiAgaWYgKGN0eC5jdXN0b21JbnNwZWN0ICYmXG4gICAgICB2YWx1ZSAmJlxuICAgICAgaXNGdW5jdGlvbih2YWx1ZS5pbnNwZWN0KSAmJlxuICAgICAgLy8gRmlsdGVyIG91dCB0aGUgdXRpbCBtb2R1bGUsIGl0J3MgaW5zcGVjdCBmdW5jdGlvbiBpcyBzcGVjaWFsXG4gICAgICB2YWx1ZS5pbnNwZWN0ICE9PSBleHBvcnRzLmluc3BlY3QgJiZcbiAgICAgIC8vIEFsc28gZmlsdGVyIG91dCBhbnkgcHJvdG90eXBlIG9iamVjdHMgdXNpbmcgdGhlIGNpcmN1bGFyIGNoZWNrLlxuICAgICAgISh2YWx1ZS5jb25zdHJ1Y3RvciAmJiB2YWx1ZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgPT09IHZhbHVlKSkge1xuICAgIHZhciByZXQgPSB2YWx1ZS5pbnNwZWN0KHJlY3Vyc2VUaW1lcywgY3R4KTtcbiAgICBpZiAoIWlzU3RyaW5nKHJldCkpIHtcbiAgICAgIHJldCA9IGZvcm1hdFZhbHVlKGN0eCwgcmV0LCByZWN1cnNlVGltZXMpO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgLy8gUHJpbWl0aXZlIHR5cGVzIGNhbm5vdCBoYXZlIHByb3BlcnRpZXNcbiAgdmFyIHByaW1pdGl2ZSA9IGZvcm1hdFByaW1pdGl2ZShjdHgsIHZhbHVlKTtcbiAgaWYgKHByaW1pdGl2ZSkge1xuICAgIHJldHVybiBwcmltaXRpdmU7XG4gIH1cblxuICAvLyBMb29rIHVwIHRoZSBrZXlzIG9mIHRoZSBvYmplY3QuXG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXModmFsdWUpO1xuICB2YXIgdmlzaWJsZUtleXMgPSBhcnJheVRvSGFzaChrZXlzKTtcblxuICBpZiAoY3R4LnNob3dIaWRkZW4pIHtcbiAgICBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModmFsdWUpO1xuICB9XG5cbiAgLy8gSUUgZG9lc24ndCBtYWtlIGVycm9yIGZpZWxkcyBub24tZW51bWVyYWJsZVxuICAvLyBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvaWUvZHd3NTJzYnQodj12cy45NCkuYXNweFxuICBpZiAoaXNFcnJvcih2YWx1ZSlcbiAgICAgICYmIChrZXlzLmluZGV4T2YoJ21lc3NhZ2UnKSA+PSAwIHx8IGtleXMuaW5kZXhPZignZGVzY3JpcHRpb24nKSA+PSAwKSkge1xuICAgIHJldHVybiBmb3JtYXRFcnJvcih2YWx1ZSk7XG4gIH1cblxuICAvLyBTb21lIHR5cGUgb2Ygb2JqZWN0IHdpdGhvdXQgcHJvcGVydGllcyBjYW4gYmUgc2hvcnRjdXR0ZWQuXG4gIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgICAgdmFyIG5hbWUgPSB2YWx1ZS5uYW1lID8gJzogJyArIHZhbHVlLm5hbWUgOiAnJztcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZSgnW0Z1bmN0aW9uJyArIG5hbWUgKyAnXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICAgIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLCAncmVnZXhwJyk7XG4gICAgfVxuICAgIGlmIChpc0RhdGUodmFsdWUpKSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksICdkYXRlJyk7XG4gICAgfVxuICAgIGlmIChpc0Vycm9yKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGZvcm1hdEVycm9yKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICB2YXIgYmFzZSA9ICcnLCBhcnJheSA9IGZhbHNlLCBicmFjZXMgPSBbJ3snLCAnfSddO1xuXG4gIC8vIE1ha2UgQXJyYXkgc2F5IHRoYXQgdGhleSBhcmUgQXJyYXlcbiAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgYXJyYXkgPSB0cnVlO1xuICAgIGJyYWNlcyA9IFsnWycsICddJ107XG4gIH1cblxuICAvLyBNYWtlIGZ1bmN0aW9ucyBzYXkgdGhhdCB0aGV5IGFyZSBmdW5jdGlvbnNcbiAgaWYgKGlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgdmFyIG4gPSB2YWx1ZS5uYW1lID8gJzogJyArIHZhbHVlLm5hbWUgOiAnJztcbiAgICBiYXNlID0gJyBbRnVuY3Rpb24nICsgbiArICddJztcbiAgfVxuXG4gIC8vIE1ha2UgUmVnRXhwcyBzYXkgdGhhdCB0aGV5IGFyZSBSZWdFeHBzXG4gIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICBiYXNlID0gJyAnICsgUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgfVxuXG4gIC8vIE1ha2UgZGF0ZXMgd2l0aCBwcm9wZXJ0aWVzIGZpcnN0IHNheSB0aGUgZGF0ZVxuICBpZiAoaXNEYXRlKHZhbHVlKSkge1xuICAgIGJhc2UgPSAnICcgKyBEYXRlLnByb3RvdHlwZS50b1VUQ1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgfVxuXG4gIC8vIE1ha2UgZXJyb3Igd2l0aCBtZXNzYWdlIGZpcnN0IHNheSB0aGUgZXJyb3JcbiAgaWYgKGlzRXJyb3IodmFsdWUpKSB7XG4gICAgYmFzZSA9ICcgJyArIGZvcm1hdEVycm9yKHZhbHVlKTtcbiAgfVxuXG4gIGlmIChrZXlzLmxlbmd0aCA9PT0gMCAmJiAoIWFycmF5IHx8IHZhbHVlLmxlbmd0aCA9PSAwKSkge1xuICAgIHJldHVybiBicmFjZXNbMF0gKyBiYXNlICsgYnJhY2VzWzFdO1xuICB9XG5cbiAgaWYgKHJlY3Vyc2VUaW1lcyA8IDApIHtcbiAgICBpZiAoaXNSZWdFeHAodmFsdWUpKSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwgJ3JlZ2V4cCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoJ1tPYmplY3RdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH1cblxuICBjdHguc2Vlbi5wdXNoKHZhbHVlKTtcblxuICB2YXIgb3V0cHV0O1xuICBpZiAoYXJyYXkpIHtcbiAgICBvdXRwdXQgPSBmb3JtYXRBcnJheShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXlzKTtcbiAgfSBlbHNlIHtcbiAgICBvdXRwdXQgPSBrZXlzLm1hcChmdW5jdGlvbihrZXkpIHtcbiAgICAgIHJldHVybiBmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXksIGFycmF5KTtcbiAgICB9KTtcbiAgfVxuXG4gIGN0eC5zZWVuLnBvcCgpO1xuXG4gIHJldHVybiByZWR1Y2VUb1NpbmdsZVN0cmluZyhvdXRwdXQsIGJhc2UsIGJyYWNlcyk7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0UHJpbWl0aXZlKGN0eCwgdmFsdWUpIHtcbiAgaWYgKGlzVW5kZWZpbmVkKHZhbHVlKSlcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoJ3VuZGVmaW5lZCcsICd1bmRlZmluZWQnKTtcbiAgaWYgKGlzU3RyaW5nKHZhbHVlKSkge1xuICAgIHZhciBzaW1wbGUgPSAnXFwnJyArIEpTT04uc3RyaW5naWZ5KHZhbHVlKS5yZXBsYWNlKC9eXCJ8XCIkL2csICcnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLycvZywgXCJcXFxcJ1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcXFxcIi9nLCAnXCInKSArICdcXCcnO1xuICAgIHJldHVybiBjdHguc3R5bGl6ZShzaW1wbGUsICdzdHJpbmcnKTtcbiAgfVxuICBpZiAoaXNOdW1iZXIodmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgnJyArIHZhbHVlLCAnbnVtYmVyJyk7XG4gIGlmIChpc0Jvb2xlYW4odmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgnJyArIHZhbHVlLCAnYm9vbGVhbicpO1xuICAvLyBGb3Igc29tZSByZWFzb24gdHlwZW9mIG51bGwgaXMgXCJvYmplY3RcIiwgc28gc3BlY2lhbCBjYXNlIGhlcmUuXG4gIGlmIChpc051bGwodmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgnbnVsbCcsICdudWxsJyk7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0RXJyb3IodmFsdWUpIHtcbiAgcmV0dXJuICdbJyArIEVycm9yLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSArICddJztcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRBcnJheShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXlzKSB7XG4gIHZhciBvdXRwdXQgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSB2YWx1ZS5sZW5ndGg7IGkgPCBsOyArK2kpIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkodmFsdWUsIFN0cmluZyhpKSkpIHtcbiAgICAgIG91dHB1dC5wdXNoKGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsXG4gICAgICAgICAgU3RyaW5nKGkpLCB0cnVlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dHB1dC5wdXNoKCcnKTtcbiAgICB9XG4gIH1cbiAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgIGlmICgha2V5Lm1hdGNoKC9eXFxkKyQvKSkge1xuICAgICAgb3V0cHV0LnB1c2goZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cyxcbiAgICAgICAgICBrZXksIHRydWUpKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gb3V0cHV0O1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleSwgYXJyYXkpIHtcbiAgdmFyIG5hbWUsIHN0ciwgZGVzYztcbiAgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodmFsdWUsIGtleSkgfHwgeyB2YWx1ZTogdmFsdWVba2V5XSB9O1xuICBpZiAoZGVzYy5nZXQpIHtcbiAgICBpZiAoZGVzYy5zZXQpIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbR2V0dGVyL1NldHRlcl0nLCAnc3BlY2lhbCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW0dldHRlcl0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoZGVzYy5zZXQpIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbU2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9XG4gIGlmICghaGFzT3duUHJvcGVydHkodmlzaWJsZUtleXMsIGtleSkpIHtcbiAgICBuYW1lID0gJ1snICsga2V5ICsgJ10nO1xuICB9XG4gIGlmICghc3RyKSB7XG4gICAgaWYgKGN0eC5zZWVuLmluZGV4T2YoZGVzYy52YWx1ZSkgPCAwKSB7XG4gICAgICBpZiAoaXNOdWxsKHJlY3Vyc2VUaW1lcykpIHtcbiAgICAgICAgc3RyID0gZm9ybWF0VmFsdWUoY3R4LCBkZXNjLnZhbHVlLCBudWxsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0ciA9IGZvcm1hdFZhbHVlKGN0eCwgZGVzYy52YWx1ZSwgcmVjdXJzZVRpbWVzIC0gMSk7XG4gICAgICB9XG4gICAgICBpZiAoc3RyLmluZGV4T2YoJ1xcbicpID4gLTEpIHtcbiAgICAgICAgaWYgKGFycmF5KSB7XG4gICAgICAgICAgc3RyID0gc3RyLnNwbGl0KCdcXG4nKS5tYXAoZnVuY3Rpb24obGluZSkge1xuICAgICAgICAgICAgcmV0dXJuICcgICcgKyBsaW5lO1xuICAgICAgICAgIH0pLmpvaW4oJ1xcbicpLnN1YnN0cigyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdHIgPSAnXFxuJyArIHN0ci5zcGxpdCgnXFxuJykubWFwKGZ1bmN0aW9uKGxpbmUpIHtcbiAgICAgICAgICAgIHJldHVybiAnICAgJyArIGxpbmU7XG4gICAgICAgICAgfSkuam9pbignXFxuJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tDaXJjdWxhcl0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfVxuICBpZiAoaXNVbmRlZmluZWQobmFtZSkpIHtcbiAgICBpZiAoYXJyYXkgJiYga2V5Lm1hdGNoKC9eXFxkKyQvKSkge1xuICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gICAgbmFtZSA9IEpTT04uc3RyaW5naWZ5KCcnICsga2V5KTtcbiAgICBpZiAobmFtZS5tYXRjaCgvXlwiKFthLXpBLVpfXVthLXpBLVpfMC05XSopXCIkLykpIHtcbiAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cigxLCBuYW1lLmxlbmd0aCAtIDIpO1xuICAgICAgbmFtZSA9IGN0eC5zdHlsaXplKG5hbWUsICduYW1lJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoLycvZywgXCJcXFxcJ1wiKVxuICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXFwiL2csICdcIicpXG4gICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8oXlwifFwiJCkvZywgXCInXCIpO1xuICAgICAgbmFtZSA9IGN0eC5zdHlsaXplKG5hbWUsICdzdHJpbmcnKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmFtZSArICc6ICcgKyBzdHI7XG59XG5cblxuZnVuY3Rpb24gcmVkdWNlVG9TaW5nbGVTdHJpbmcob3V0cHV0LCBiYXNlLCBicmFjZXMpIHtcbiAgdmFyIG51bUxpbmVzRXN0ID0gMDtcbiAgdmFyIGxlbmd0aCA9IG91dHB1dC5yZWR1Y2UoZnVuY3Rpb24ocHJldiwgY3VyKSB7XG4gICAgbnVtTGluZXNFc3QrKztcbiAgICBpZiAoY3VyLmluZGV4T2YoJ1xcbicpID49IDApIG51bUxpbmVzRXN0Kys7XG4gICAgcmV0dXJuIHByZXYgKyBjdXIucmVwbGFjZSgvXFx1MDAxYlxcW1xcZFxcZD9tL2csICcnKS5sZW5ndGggKyAxO1xuICB9LCAwKTtcblxuICBpZiAobGVuZ3RoID4gNjApIHtcbiAgICByZXR1cm4gYnJhY2VzWzBdICtcbiAgICAgICAgICAgKGJhc2UgPT09ICcnID8gJycgOiBiYXNlICsgJ1xcbiAnKSArXG4gICAgICAgICAgICcgJyArXG4gICAgICAgICAgIG91dHB1dC5qb2luKCcsXFxuICAnKSArXG4gICAgICAgICAgICcgJyArXG4gICAgICAgICAgIGJyYWNlc1sxXTtcbiAgfVxuXG4gIHJldHVybiBicmFjZXNbMF0gKyBiYXNlICsgJyAnICsgb3V0cHV0LmpvaW4oJywgJykgKyAnICcgKyBicmFjZXNbMV07XG59XG5cblxuLy8gTk9URTogVGhlc2UgdHlwZSBjaGVja2luZyBmdW5jdGlvbnMgaW50ZW50aW9uYWxseSBkb24ndCB1c2UgYGluc3RhbmNlb2ZgXG4vLyBiZWNhdXNlIGl0IGlzIGZyYWdpbGUgYW5kIGNhbiBiZSBlYXNpbHkgZmFrZWQgd2l0aCBgT2JqZWN0LmNyZWF0ZSgpYC5cbmZ1bmN0aW9uIGlzQXJyYXkoYXIpIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYXIpO1xufVxuZXhwb3J0cy5pc0FycmF5ID0gaXNBcnJheTtcblxuZnVuY3Rpb24gaXNCb29sZWFuKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nO1xufVxuZXhwb3J0cy5pc0Jvb2xlYW4gPSBpc0Jvb2xlYW47XG5cbmZ1bmN0aW9uIGlzTnVsbChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNOdWxsID0gaXNOdWxsO1xuXG5mdW5jdGlvbiBpc051bGxPclVuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PSBudWxsO1xufVxuZXhwb3J0cy5pc051bGxPclVuZGVmaW5lZCA9IGlzTnVsbE9yVW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBpc051bWJlcihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdudW1iZXInO1xufVxuZXhwb3J0cy5pc051bWJlciA9IGlzTnVtYmVyO1xuXG5mdW5jdGlvbiBpc1N0cmluZyhhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnO1xufVxuZXhwb3J0cy5pc1N0cmluZyA9IGlzU3RyaW5nO1xuXG5mdW5jdGlvbiBpc1N5bWJvbChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdzeW1ib2wnO1xufVxuZXhwb3J0cy5pc1N5bWJvbCA9IGlzU3ltYm9sO1xuXG5mdW5jdGlvbiBpc1VuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gdm9pZCAwO1xufVxuZXhwb3J0cy5pc1VuZGVmaW5lZCA9IGlzVW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBpc1JlZ0V4cChyZSkge1xuICByZXR1cm4gaXNPYmplY3QocmUpICYmIG9iamVjdFRvU3RyaW5nKHJlKSA9PT0gJ1tvYmplY3QgUmVnRXhwXSc7XG59XG5leHBvcnRzLmlzUmVnRXhwID0gaXNSZWdFeHA7XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ29iamVjdCcgJiYgYXJnICE9PSBudWxsO1xufVxuZXhwb3J0cy5pc09iamVjdCA9IGlzT2JqZWN0O1xuXG5mdW5jdGlvbiBpc0RhdGUoZCkge1xuICByZXR1cm4gaXNPYmplY3QoZCkgJiYgb2JqZWN0VG9TdHJpbmcoZCkgPT09ICdbb2JqZWN0IERhdGVdJztcbn1cbmV4cG9ydHMuaXNEYXRlID0gaXNEYXRlO1xuXG5mdW5jdGlvbiBpc0Vycm9yKGUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KGUpICYmXG4gICAgICAob2JqZWN0VG9TdHJpbmcoZSkgPT09ICdbb2JqZWN0IEVycm9yXScgfHwgZSBpbnN0YW5jZW9mIEVycm9yKTtcbn1cbmV4cG9ydHMuaXNFcnJvciA9IGlzRXJyb3I7XG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnZnVuY3Rpb24nO1xufVxuZXhwb3J0cy5pc0Z1bmN0aW9uID0gaXNGdW5jdGlvbjtcblxuZnVuY3Rpb24gaXNQcmltaXRpdmUoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IG51bGwgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdib29sZWFuJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnc3ltYm9sJyB8fCAgLy8gRVM2IHN5bWJvbFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3VuZGVmaW5lZCc7XG59XG5leHBvcnRzLmlzUHJpbWl0aXZlID0gaXNQcmltaXRpdmU7XG5cbmV4cG9ydHMuaXNCdWZmZXIgPSByZXF1aXJlKCcuL3N1cHBvcnQvaXNCdWZmZXInKTtcblxuZnVuY3Rpb24gb2JqZWN0VG9TdHJpbmcobykge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pO1xufVxuXG5cbmZ1bmN0aW9uIHBhZChuKSB7XG4gIHJldHVybiBuIDwgMTAgPyAnMCcgKyBuLnRvU3RyaW5nKDEwKSA6IG4udG9TdHJpbmcoMTApO1xufVxuXG5cbnZhciBtb250aHMgPSBbJ0phbicsICdGZWInLCAnTWFyJywgJ0FwcicsICdNYXknLCAnSnVuJywgJ0p1bCcsICdBdWcnLCAnU2VwJyxcbiAgICAgICAgICAgICAgJ09jdCcsICdOb3YnLCAnRGVjJ107XG5cbi8vIDI2IEZlYiAxNjoxOTozNFxuZnVuY3Rpb24gdGltZXN0YW1wKCkge1xuICB2YXIgZCA9IG5ldyBEYXRlKCk7XG4gIHZhciB0aW1lID0gW3BhZChkLmdldEhvdXJzKCkpLFxuICAgICAgICAgICAgICBwYWQoZC5nZXRNaW51dGVzKCkpLFxuICAgICAgICAgICAgICBwYWQoZC5nZXRTZWNvbmRzKCkpXS5qb2luKCc6Jyk7XG4gIHJldHVybiBbZC5nZXREYXRlKCksIG1vbnRoc1tkLmdldE1vbnRoKCldLCB0aW1lXS5qb2luKCcgJyk7XG59XG5cblxuLy8gbG9nIGlzIGp1c3QgYSB0aGluIHdyYXBwZXIgdG8gY29uc29sZS5sb2cgdGhhdCBwcmVwZW5kcyBhIHRpbWVzdGFtcFxuZXhwb3J0cy5sb2cgPSBmdW5jdGlvbigpIHtcbiAgY29uc29sZS5sb2coJyVzIC0gJXMnLCB0aW1lc3RhbXAoKSwgZXhwb3J0cy5mb3JtYXQuYXBwbHkoZXhwb3J0cywgYXJndW1lbnRzKSk7XG59O1xuXG5cbi8qKlxuICogSW5oZXJpdCB0aGUgcHJvdG90eXBlIG1ldGhvZHMgZnJvbSBvbmUgY29uc3RydWN0b3IgaW50byBhbm90aGVyLlxuICpcbiAqIFRoZSBGdW5jdGlvbi5wcm90b3R5cGUuaW5oZXJpdHMgZnJvbSBsYW5nLmpzIHJld3JpdHRlbiBhcyBhIHN0YW5kYWxvbmVcbiAqIGZ1bmN0aW9uIChub3Qgb24gRnVuY3Rpb24ucHJvdG90eXBlKS4gTk9URTogSWYgdGhpcyBmaWxlIGlzIHRvIGJlIGxvYWRlZFxuICogZHVyaW5nIGJvb3RzdHJhcHBpbmcgdGhpcyBmdW5jdGlvbiBuZWVkcyB0byBiZSByZXdyaXR0ZW4gdXNpbmcgc29tZSBuYXRpdmVcbiAqIGZ1bmN0aW9ucyBhcyBwcm90b3R5cGUgc2V0dXAgdXNpbmcgbm9ybWFsIEphdmFTY3JpcHQgZG9lcyBub3Qgd29yayBhc1xuICogZXhwZWN0ZWQgZHVyaW5nIGJvb3RzdHJhcHBpbmcgKHNlZSBtaXJyb3IuanMgaW4gcjExNDkwMykuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gY3RvciBDb25zdHJ1Y3RvciBmdW5jdGlvbiB3aGljaCBuZWVkcyB0byBpbmhlcml0IHRoZVxuICogICAgIHByb3RvdHlwZS5cbiAqIEBwYXJhbSB7ZnVuY3Rpb259IHN1cGVyQ3RvciBDb25zdHJ1Y3RvciBmdW5jdGlvbiB0byBpbmhlcml0IHByb3RvdHlwZSBmcm9tLlxuICovXG5leHBvcnRzLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcblxuZXhwb3J0cy5fZXh0ZW5kID0gZnVuY3Rpb24ob3JpZ2luLCBhZGQpIHtcbiAgLy8gRG9uJ3QgZG8gYW55dGhpbmcgaWYgYWRkIGlzbid0IGFuIG9iamVjdFxuICBpZiAoIWFkZCB8fCAhaXNPYmplY3QoYWRkKSkgcmV0dXJuIG9yaWdpbjtcblxuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGFkZCk7XG4gIHZhciBpID0ga2V5cy5sZW5ndGg7XG4gIHdoaWxlIChpLS0pIHtcbiAgICBvcmlnaW5ba2V5c1tpXV0gPSBhZGRba2V5c1tpXV07XG4gIH1cbiAgcmV0dXJuIG9yaWdpbjtcbn07XG5cbmZ1bmN0aW9uIGhhc093blByb3BlcnR5KG9iaiwgcHJvcCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCk7XG59XG4iLCJtb2R1bGUuZXhwb3J0cy5WZWN0b3JUaWxlID0gcmVxdWlyZSgnLi9saWIvdmVjdG9ydGlsZS5qcycpO1xubW9kdWxlLmV4cG9ydHMuVmVjdG9yVGlsZUZlYXR1cmUgPSByZXF1aXJlKCcuL2xpYi92ZWN0b3J0aWxlZmVhdHVyZS5qcycpO1xubW9kdWxlLmV4cG9ydHMuVmVjdG9yVGlsZUxheWVyID0gcmVxdWlyZSgnLi9saWIvdmVjdG9ydGlsZWxheWVyLmpzJyk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBWZWN0b3JUaWxlTGF5ZXIgPSByZXF1aXJlKCcuL3ZlY3RvcnRpbGVsYXllcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFZlY3RvclRpbGU7XG5cbmZ1bmN0aW9uIFZlY3RvclRpbGUocGJmLCBlbmQpIHtcbiAgICB0aGlzLmxheWVycyA9IHBiZi5yZWFkRmllbGRzKHJlYWRUaWxlLCB7fSwgZW5kKTtcbn1cblxuZnVuY3Rpb24gcmVhZFRpbGUodGFnLCBsYXllcnMsIHBiZikge1xuICAgIGlmICh0YWcgPT09IDMpIHtcbiAgICAgICAgdmFyIGxheWVyID0gbmV3IFZlY3RvclRpbGVMYXllcihwYmYsIHBiZi5yZWFkVmFyaW50KCkgKyBwYmYucG9zKTtcbiAgICAgICAgaWYgKGxheWVyLmxlbmd0aCkgbGF5ZXJzW2xheWVyLm5hbWVdID0gbGF5ZXI7XG4gICAgfVxufVxuXG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBQb2ludCA9IHJlcXVpcmUoJ3BvaW50LWdlb21ldHJ5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gVmVjdG9yVGlsZUZlYXR1cmU7XG5cbmZ1bmN0aW9uIFZlY3RvclRpbGVGZWF0dXJlKHBiZiwgZW5kLCBleHRlbnQsIGtleXMsIHZhbHVlcykge1xuICAgIC8vIFB1YmxpY1xuICAgIHRoaXMucHJvcGVydGllcyA9IHt9O1xuICAgIHRoaXMuZXh0ZW50ID0gZXh0ZW50O1xuICAgIHRoaXMudHlwZSA9IDA7XG5cbiAgICAvLyBQcml2YXRlXG4gICAgdGhpcy5fcGJmID0gcGJmO1xuICAgIHRoaXMuX2dlb21ldHJ5ID0gLTE7XG4gICAgdGhpcy5fa2V5cyA9IGtleXM7XG4gICAgdGhpcy5fdmFsdWVzID0gdmFsdWVzO1xuXG4gICAgcGJmLnJlYWRGaWVsZHMocmVhZEZlYXR1cmUsIHRoaXMsIGVuZCk7XG59XG5cbmZ1bmN0aW9uIHJlYWRGZWF0dXJlKHRhZywgZmVhdHVyZSwgcGJmKSB7XG4gICAgaWYgKHRhZyA9PSAxKSBmZWF0dXJlLmlkID0gcGJmLnJlYWRWYXJpbnQoKTtcbiAgICBlbHNlIGlmICh0YWcgPT0gMikgcmVhZFRhZyhwYmYsIGZlYXR1cmUpO1xuICAgIGVsc2UgaWYgKHRhZyA9PSAzKSBmZWF0dXJlLnR5cGUgPSBwYmYucmVhZFZhcmludCgpO1xuICAgIGVsc2UgaWYgKHRhZyA9PSA0KSBmZWF0dXJlLl9nZW9tZXRyeSA9IHBiZi5wb3M7XG59XG5cbmZ1bmN0aW9uIHJlYWRUYWcocGJmLCBmZWF0dXJlKSB7XG4gICAgdmFyIGVuZCA9IHBiZi5yZWFkVmFyaW50KCkgKyBwYmYucG9zO1xuXG4gICAgd2hpbGUgKHBiZi5wb3MgPCBlbmQpIHtcbiAgICAgICAgdmFyIGtleSA9IGZlYXR1cmUuX2tleXNbcGJmLnJlYWRWYXJpbnQoKV0sXG4gICAgICAgICAgICB2YWx1ZSA9IGZlYXR1cmUuX3ZhbHVlc1twYmYucmVhZFZhcmludCgpXTtcbiAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzW2tleV0gPSB2YWx1ZTtcbiAgICB9XG59XG5cblZlY3RvclRpbGVGZWF0dXJlLnR5cGVzID0gWydVbmtub3duJywgJ1BvaW50JywgJ0xpbmVTdHJpbmcnLCAnUG9seWdvbiddO1xuXG5WZWN0b3JUaWxlRmVhdHVyZS5wcm90b3R5cGUubG9hZEdlb21ldHJ5ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHBiZiA9IHRoaXMuX3BiZjtcbiAgICBwYmYucG9zID0gdGhpcy5fZ2VvbWV0cnk7XG5cbiAgICB2YXIgZW5kID0gcGJmLnJlYWRWYXJpbnQoKSArIHBiZi5wb3MsXG4gICAgICAgIGNtZCA9IDEsXG4gICAgICAgIGxlbmd0aCA9IDAsXG4gICAgICAgIHggPSAwLFxuICAgICAgICB5ID0gMCxcbiAgICAgICAgbGluZXMgPSBbXSxcbiAgICAgICAgbGluZTtcblxuICAgIHdoaWxlIChwYmYucG9zIDwgZW5kKSB7XG4gICAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgICAgICB2YXIgY21kTGVuID0gcGJmLnJlYWRWYXJpbnQoKTtcbiAgICAgICAgICAgIGNtZCA9IGNtZExlbiAmIDB4NztcbiAgICAgICAgICAgIGxlbmd0aCA9IGNtZExlbiA+PiAzO1xuICAgICAgICB9XG5cbiAgICAgICAgbGVuZ3RoLS07XG5cbiAgICAgICAgaWYgKGNtZCA9PT0gMSB8fCBjbWQgPT09IDIpIHtcbiAgICAgICAgICAgIHggKz0gcGJmLnJlYWRTVmFyaW50KCk7XG4gICAgICAgICAgICB5ICs9IHBiZi5yZWFkU1ZhcmludCgpO1xuXG4gICAgICAgICAgICBpZiAoY21kID09PSAxKSB7IC8vIG1vdmVUb1xuICAgICAgICAgICAgICAgIGlmIChsaW5lKSBsaW5lcy5wdXNoKGxpbmUpO1xuICAgICAgICAgICAgICAgIGxpbmUgPSBbXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGluZS5wdXNoKG5ldyBQb2ludCh4LCB5KSk7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjbWQgPT09IDcpIHtcblxuICAgICAgICAgICAgLy8gV29ya2Fyb3VuZCBmb3IgaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9tYXBuaWstdmVjdG9yLXRpbGUvaXNzdWVzLzkwXG4gICAgICAgICAgICBpZiAobGluZSkge1xuICAgICAgICAgICAgICAgIGxpbmUucHVzaChsaW5lWzBdLmNsb25lKCkpOyAvLyBjbG9zZVBvbHlnb25cbiAgICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIGNvbW1hbmQgJyArIGNtZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobGluZSkgbGluZXMucHVzaChsaW5lKTtcblxuICAgIHJldHVybiBsaW5lcztcbn07XG5cblZlY3RvclRpbGVGZWF0dXJlLnByb3RvdHlwZS5iYm94ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHBiZiA9IHRoaXMuX3BiZjtcbiAgICBwYmYucG9zID0gdGhpcy5fZ2VvbWV0cnk7XG5cbiAgICB2YXIgZW5kID0gcGJmLnJlYWRWYXJpbnQoKSArIHBiZi5wb3MsXG4gICAgICAgIGNtZCA9IDEsXG4gICAgICAgIGxlbmd0aCA9IDAsXG4gICAgICAgIHggPSAwLFxuICAgICAgICB5ID0gMCxcbiAgICAgICAgeDEgPSBJbmZpbml0eSxcbiAgICAgICAgeDIgPSAtSW5maW5pdHksXG4gICAgICAgIHkxID0gSW5maW5pdHksXG4gICAgICAgIHkyID0gLUluZmluaXR5O1xuXG4gICAgd2hpbGUgKHBiZi5wb3MgPCBlbmQpIHtcbiAgICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgICAgIHZhciBjbWRMZW4gPSBwYmYucmVhZFZhcmludCgpO1xuICAgICAgICAgICAgY21kID0gY21kTGVuICYgMHg3O1xuICAgICAgICAgICAgbGVuZ3RoID0gY21kTGVuID4+IDM7XG4gICAgICAgIH1cblxuICAgICAgICBsZW5ndGgtLTtcblxuICAgICAgICBpZiAoY21kID09PSAxIHx8IGNtZCA9PT0gMikge1xuICAgICAgICAgICAgeCArPSBwYmYucmVhZFNWYXJpbnQoKTtcbiAgICAgICAgICAgIHkgKz0gcGJmLnJlYWRTVmFyaW50KCk7XG4gICAgICAgICAgICBpZiAoeCA8IHgxKSB4MSA9IHg7XG4gICAgICAgICAgICBpZiAoeCA+IHgyKSB4MiA9IHg7XG4gICAgICAgICAgICBpZiAoeSA8IHkxKSB5MSA9IHk7XG4gICAgICAgICAgICBpZiAoeSA+IHkyKSB5MiA9IHk7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjbWQgIT09IDcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigndW5rbm93biBjb21tYW5kICcgKyBjbWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFt4MSwgeTEsIHgyLCB5Ml07XG59O1xuXG5WZWN0b3JUaWxlRmVhdHVyZS5wcm90b3R5cGUudG9HZW9KU09OID0gZnVuY3Rpb24oeCwgeSwgeikge1xuICAgIHZhciBzaXplID0gdGhpcy5leHRlbnQgKiBNYXRoLnBvdygyLCB6KSxcbiAgICAgICAgeDAgPSB0aGlzLmV4dGVudCAqIHgsXG4gICAgICAgIHkwID0gdGhpcy5leHRlbnQgKiB5LFxuICAgICAgICBjb29yZHMgPSB0aGlzLmxvYWRHZW9tZXRyeSgpLFxuICAgICAgICB0eXBlID0gVmVjdG9yVGlsZUZlYXR1cmUudHlwZXNbdGhpcy50eXBlXSxcbiAgICAgICAgaSwgajtcblxuICAgIGZ1bmN0aW9uIHByb2plY3QobGluZSkge1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGxpbmUubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIHZhciBwID0gbGluZVtqXSwgeTIgPSAxODAgLSAocC55ICsgeTApICogMzYwIC8gc2l6ZTtcbiAgICAgICAgICAgIGxpbmVbal0gPSBbXG4gICAgICAgICAgICAgICAgKHAueCArIHgwKSAqIDM2MCAvIHNpemUgLSAxODAsXG4gICAgICAgICAgICAgICAgMzYwIC8gTWF0aC5QSSAqIE1hdGguYXRhbihNYXRoLmV4cCh5MiAqIE1hdGguUEkgLyAxODApKSAtIDkwXG4gICAgICAgICAgICBdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICBjYXNlIDE6XG4gICAgICAgIHZhciBwb2ludHMgPSBbXTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvb3Jkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcG9pbnRzW2ldID0gY29vcmRzW2ldWzBdO1xuICAgICAgICB9XG4gICAgICAgIGNvb3JkcyA9IHBvaW50cztcbiAgICAgICAgcHJvamVjdChjb29yZHMpO1xuICAgICAgICBicmVhaztcblxuICAgIGNhc2UgMjpcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvb3Jkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcHJvamVjdChjb29yZHNbaV0pO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAzOlxuICAgICAgICBjb29yZHMgPSBjbGFzc2lmeVJpbmdzKGNvb3Jkcyk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb29yZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBjb29yZHNbaV0ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICBwcm9qZWN0KGNvb3Jkc1tpXVtqXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKGNvb3Jkcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgY29vcmRzID0gY29vcmRzWzBdO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHR5cGUgPSAnTXVsdGknICsgdHlwZTtcbiAgICB9XG5cbiAgICB2YXIgcmVzdWx0ID0ge1xuICAgICAgICB0eXBlOiBcIkZlYXR1cmVcIixcbiAgICAgICAgZ2VvbWV0cnk6IHtcbiAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICBjb29yZGluYXRlczogY29vcmRzXG4gICAgICAgIH0sXG4gICAgICAgIHByb3BlcnRpZXM6IHRoaXMucHJvcGVydGllc1xuICAgIH07XG5cbiAgICBpZiAoJ2lkJyBpbiB0aGlzKSB7XG4gICAgICAgIHJlc3VsdC5pZCA9IHRoaXMuaWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8vIGNsYXNzaWZpZXMgYW4gYXJyYXkgb2YgcmluZ3MgaW50byBwb2x5Z29ucyB3aXRoIG91dGVyIHJpbmdzIGFuZCBob2xlc1xuXG5mdW5jdGlvbiBjbGFzc2lmeVJpbmdzKHJpbmdzKSB7XG4gICAgdmFyIGxlbiA9IHJpbmdzLmxlbmd0aDtcblxuICAgIGlmIChsZW4gPD0gMSkgcmV0dXJuIFtyaW5nc107XG5cbiAgICB2YXIgcG9seWdvbnMgPSBbXSxcbiAgICAgICAgcG9seWdvbixcbiAgICAgICAgY2N3O1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICB2YXIgYXJlYSA9IHNpZ25lZEFyZWEocmluZ3NbaV0pO1xuICAgICAgICBpZiAoYXJlYSA9PT0gMCkgY29udGludWU7XG5cbiAgICAgICAgaWYgKGNjdyA9PT0gdW5kZWZpbmVkKSBjY3cgPSBhcmVhIDwgMDtcblxuICAgICAgICBpZiAoY2N3ID09PSBhcmVhIDwgMCkge1xuICAgICAgICAgICAgaWYgKHBvbHlnb24pIHBvbHlnb25zLnB1c2gocG9seWdvbik7XG4gICAgICAgICAgICBwb2x5Z29uID0gW3JpbmdzW2ldXTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcG9seWdvbi5wdXNoKHJpbmdzW2ldKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAocG9seWdvbikgcG9seWdvbnMucHVzaChwb2x5Z29uKTtcblxuICAgIHJldHVybiBwb2x5Z29ucztcbn1cblxuZnVuY3Rpb24gc2lnbmVkQXJlYShyaW5nKSB7XG4gICAgdmFyIHN1bSA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHJpbmcubGVuZ3RoLCBqID0gbGVuIC0gMSwgcDEsIHAyOyBpIDwgbGVuOyBqID0gaSsrKSB7XG4gICAgICAgIHAxID0gcmluZ1tpXTtcbiAgICAgICAgcDIgPSByaW5nW2pdO1xuICAgICAgICBzdW0gKz0gKHAyLnggLSBwMS54KSAqIChwMS55ICsgcDIueSk7XG4gICAgfVxuICAgIHJldHVybiBzdW07XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBWZWN0b3JUaWxlRmVhdHVyZSA9IHJlcXVpcmUoJy4vdmVjdG9ydGlsZWZlYXR1cmUuanMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBWZWN0b3JUaWxlTGF5ZXI7XG5cbmZ1bmN0aW9uIFZlY3RvclRpbGVMYXllcihwYmYsIGVuZCkge1xuICAgIC8vIFB1YmxpY1xuICAgIHRoaXMudmVyc2lvbiA9IDE7XG4gICAgdGhpcy5uYW1lID0gbnVsbDtcbiAgICB0aGlzLmV4dGVudCA9IDQwOTY7XG4gICAgdGhpcy5sZW5ndGggPSAwO1xuXG4gICAgLy8gUHJpdmF0ZVxuICAgIHRoaXMuX3BiZiA9IHBiZjtcbiAgICB0aGlzLl9rZXlzID0gW107XG4gICAgdGhpcy5fdmFsdWVzID0gW107XG4gICAgdGhpcy5fZmVhdHVyZXMgPSBbXTtcblxuICAgIHBiZi5yZWFkRmllbGRzKHJlYWRMYXllciwgdGhpcywgZW5kKTtcblxuICAgIHRoaXMubGVuZ3RoID0gdGhpcy5fZmVhdHVyZXMubGVuZ3RoO1xufVxuXG5mdW5jdGlvbiByZWFkTGF5ZXIodGFnLCBsYXllciwgcGJmKSB7XG4gICAgaWYgKHRhZyA9PT0gMTUpIGxheWVyLnZlcnNpb24gPSBwYmYucmVhZFZhcmludCgpO1xuICAgIGVsc2UgaWYgKHRhZyA9PT0gMSkgbGF5ZXIubmFtZSA9IHBiZi5yZWFkU3RyaW5nKCk7XG4gICAgZWxzZSBpZiAodGFnID09PSA1KSBsYXllci5leHRlbnQgPSBwYmYucmVhZFZhcmludCgpO1xuICAgIGVsc2UgaWYgKHRhZyA9PT0gMikgbGF5ZXIuX2ZlYXR1cmVzLnB1c2gocGJmLnBvcyk7XG4gICAgZWxzZSBpZiAodGFnID09PSAzKSBsYXllci5fa2V5cy5wdXNoKHBiZi5yZWFkU3RyaW5nKCkpO1xuICAgIGVsc2UgaWYgKHRhZyA9PT0gNCkgbGF5ZXIuX3ZhbHVlcy5wdXNoKHJlYWRWYWx1ZU1lc3NhZ2UocGJmKSk7XG59XG5cbmZ1bmN0aW9uIHJlYWRWYWx1ZU1lc3NhZ2UocGJmKSB7XG4gICAgdmFyIHZhbHVlID0gbnVsbCxcbiAgICAgICAgZW5kID0gcGJmLnJlYWRWYXJpbnQoKSArIHBiZi5wb3M7XG5cbiAgICB3aGlsZSAocGJmLnBvcyA8IGVuZCkge1xuICAgICAgICB2YXIgdGFnID0gcGJmLnJlYWRWYXJpbnQoKSA+PiAzO1xuXG4gICAgICAgIHZhbHVlID0gdGFnID09PSAxID8gcGJmLnJlYWRTdHJpbmcoKSA6XG4gICAgICAgICAgICB0YWcgPT09IDIgPyBwYmYucmVhZEZsb2F0KCkgOlxuICAgICAgICAgICAgdGFnID09PSAzID8gcGJmLnJlYWREb3VibGUoKSA6XG4gICAgICAgICAgICB0YWcgPT09IDQgPyBwYmYucmVhZFZhcmludDY0KCkgOlxuICAgICAgICAgICAgdGFnID09PSA1ID8gcGJmLnJlYWRWYXJpbnQoKSA6XG4gICAgICAgICAgICB0YWcgPT09IDYgPyBwYmYucmVhZFNWYXJpbnQoKSA6XG4gICAgICAgICAgICB0YWcgPT09IDcgPyBwYmYucmVhZEJvb2xlYW4oKSA6IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xufVxuXG4vLyByZXR1cm4gZmVhdHVyZSBgaWAgZnJvbSB0aGlzIGxheWVyIGFzIGEgYFZlY3RvclRpbGVGZWF0dXJlYFxuVmVjdG9yVGlsZUxheWVyLnByb3RvdHlwZS5mZWF0dXJlID0gZnVuY3Rpb24oaSkge1xuICAgIGlmIChpIDwgMCB8fCBpID49IHRoaXMuX2ZlYXR1cmVzLmxlbmd0aCkgdGhyb3cgbmV3IEVycm9yKCdmZWF0dXJlIGluZGV4IG91dCBvZiBib3VuZHMnKTtcblxuICAgIHRoaXMuX3BiZi5wb3MgPSB0aGlzLl9mZWF0dXJlc1tpXTtcblxuICAgIHZhciBlbmQgPSB0aGlzLl9wYmYucmVhZFZhcmludCgpICsgdGhpcy5fcGJmLnBvcztcbiAgICByZXR1cm4gbmV3IFZlY3RvclRpbGVGZWF0dXJlKHRoaXMuX3BiZiwgZW5kLCB0aGlzLmV4dGVudCwgdGhpcy5fa2V5cywgdGhpcy5fdmFsdWVzKTtcbn07XG4iLCJ2YXIgUGJmID0gcmVxdWlyZSgncGJmJylcbnZhciB2dHBiID0gcmVxdWlyZSgnLi92ZWN0b3ItdGlsZS1wYicpXG52YXIgR2VvSlNPTldyYXBwZXIgPSByZXF1aXJlKCcuL2xpYi9nZW9qc29uX3dyYXBwZXInKVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZyb21WZWN0b3JUaWxlSnNcbm1vZHVsZS5leHBvcnRzLmZyb21WZWN0b3JUaWxlSnMgPSBmcm9tVmVjdG9yVGlsZUpzXG5tb2R1bGUuZXhwb3J0cy5mcm9tR2VvanNvblZ0ID0gZnJvbUdlb2pzb25WdFxubW9kdWxlLmV4cG9ydHMuR2VvSlNPTldyYXBwZXIgPSBHZW9KU09OV3JhcHBlclxuXG4vKipcbiAqIFNlcmlhbGl6ZSBhIHZlY3Rvci10aWxlLWpzLWNyZWF0ZWQgdGlsZSB0byBwYmZcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdGlsZVxuICogQHJldHVybiB7QnVmZmVyfSB1bmNvbXByZXNzZWQsIHBiZi1zZXJpYWxpemVkIHRpbGUgZGF0YVxuICovXG5mdW5jdGlvbiBmcm9tVmVjdG9yVGlsZUpzICh0aWxlKSB7XG4gIHZhciBsYXllcnMgPSBbXVxuICBmb3IgKHZhciBsIGluIHRpbGUubGF5ZXJzKSB7XG4gICAgbGF5ZXJzLnB1c2gocHJlcGFyZUxheWVyKHRpbGUubGF5ZXJzW2xdKSlcbiAgfVxuXG4gIHZhciBvdXQgPSBuZXcgUGJmKClcbiAgdnRwYi50aWxlLndyaXRlKHsgbGF5ZXJzOiBsYXllcnMgfSwgb3V0KVxuICByZXR1cm4gb3V0LmZpbmlzaCgpXG59XG5cbi8qKlxuICogU2VyaWFsaXplZCBhIGdlb2pzb24tdnQtY3JlYXRlZCB0aWxlIHRvIHBiZi5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gbGF5ZXJzIC0gQW4gb2JqZWN0IG1hcHBpbmcgbGF5ZXIgbmFtZXMgdG8gZ2VvanNvbi12dC1jcmVhdGVkIHZlY3RvciB0aWxlIG9iamVjdHNcbiAqIEByZXR1cm4ge0J1ZmZlcn0gdW5jb21wcmVzc2VkLCBwYmYtc2VyaWFsaXplZCB0aWxlIGRhdGFcbiAqL1xuZnVuY3Rpb24gZnJvbUdlb2pzb25WdCAobGF5ZXJzKSB7XG4gIHZhciBsID0ge31cbiAgZm9yICh2YXIgayBpbiBsYXllcnMpIHtcbiAgICBsW2tdID0gbmV3IEdlb0pTT05XcmFwcGVyKGxheWVyc1trXS5mZWF0dXJlcylcbiAgICBsW2tdLm5hbWUgPSBrXG4gIH1cbiAgcmV0dXJuIGZyb21WZWN0b3JUaWxlSnMoe2xheWVyczogbH0pXG59XG5cbi8qKlxuICogUHJlcGFyZSB0aGUgZ2l2ZW4gbGF5ZXIgdG8gYmUgc2VyaWFsaXplZCBieSB0aGUgYXV0by1nZW5lcmF0ZWQgcGJmXG4gKiBzZXJpYWxpemVyIGJ5IGVuY29kaW5nIHRoZSBmZWF0dXJlIGdlb21ldHJ5IGFuZCBwcm9wZXJ0aWVzLlxuICovXG5mdW5jdGlvbiBwcmVwYXJlTGF5ZXIgKGxheWVyKSB7XG4gIHZhciBwcmVwYXJlZExheWVyID0ge1xuICAgIG5hbWU6IGxheWVyLm5hbWUgfHwgJycsXG4gICAgdmVyc2lvbjogbGF5ZXIudmVyc2lvbiB8fCAxLFxuICAgIGV4dGVudDogbGF5ZXIuZXh0ZW50IHx8IDQwOTYsXG4gICAga2V5czogW10sXG4gICAgdmFsdWVzOiBbXSxcbiAgICBmZWF0dXJlczogW11cbiAgfVxuXG4gIHZhciBrZXljYWNoZSA9IHt9XG4gIHZhciB2YWx1ZWNhY2hlID0ge31cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxheWVyLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGZlYXR1cmUgPSBsYXllci5mZWF0dXJlKGkpXG4gICAgZmVhdHVyZS5nZW9tZXRyeSA9IGVuY29kZUdlb21ldHJ5KGZlYXR1cmUubG9hZEdlb21ldHJ5KCkpXG5cbiAgICB2YXIgdGFncyA9IFtdXG4gICAgZm9yICh2YXIga2V5IGluIGZlYXR1cmUucHJvcGVydGllcykge1xuICAgICAgdmFyIGtleUluZGV4ID0ga2V5Y2FjaGVba2V5XVxuICAgICAgaWYgKHR5cGVvZiBrZXlJbmRleCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcHJlcGFyZWRMYXllci5rZXlzLnB1c2goa2V5KVxuICAgICAgICBrZXlJbmRleCA9IHByZXBhcmVkTGF5ZXIua2V5cy5sZW5ndGggLSAxXG4gICAgICAgIGtleWNhY2hlW2tleV0gPSBrZXlJbmRleFxuICAgICAgfVxuICAgICAgdmFyIHZhbHVlID0gd3JhcFZhbHVlKGZlYXR1cmUucHJvcGVydGllc1trZXldKVxuICAgICAgdmFyIHZhbHVlSW5kZXggPSB2YWx1ZWNhY2hlW3ZhbHVlLmtleV1cbiAgICAgIGlmICh0eXBlb2YgdmFsdWVJbmRleCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcHJlcGFyZWRMYXllci52YWx1ZXMucHVzaCh2YWx1ZSlcbiAgICAgICAgdmFsdWVJbmRleCA9IHByZXBhcmVkTGF5ZXIudmFsdWVzLmxlbmd0aCAtIDFcbiAgICAgICAgdmFsdWVjYWNoZVt2YWx1ZS5rZXldID0gdmFsdWVJbmRleFxuICAgICAgfVxuICAgICAgdGFncy5wdXNoKGtleUluZGV4KVxuICAgICAgdGFncy5wdXNoKHZhbHVlSW5kZXgpXG4gICAgfVxuXG4gICAgZmVhdHVyZS50YWdzID0gdGFnc1xuICAgIHByZXBhcmVkTGF5ZXIuZmVhdHVyZXMucHVzaChmZWF0dXJlKVxuICB9XG5cbiAgcmV0dXJuIHByZXBhcmVkTGF5ZXJcbn1cblxuZnVuY3Rpb24gY29tbWFuZCAoY21kLCBsZW5ndGgpIHtcbiAgcmV0dXJuIChsZW5ndGggPDwgMykgKyAoY21kICYgMHg3KVxufVxuXG5mdW5jdGlvbiB6aWd6YWcgKG51bSkge1xuICByZXR1cm4gKG51bSA8PCAxKSBeIChudW0gPj4gMzEpXG59XG5cbi8qKlxuICogRW5jb2RlIGEgcG9seWdvbidzIGdlb21ldHJ5IGludG8gYW4gYXJyYXkgcmVhZHkgdG8gYmUgc2VyaWFsaXplZFxuICogdG8gbWFwYm94IHZlY3RvciB0aWxlIHNwZWNpZmllZCBnZW9tZXRyeSBkYXRhLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IFJpbmdzLCBlYWNoIGJlaW5nIGFuIGFycmF5IG9mIFt4LCB5XSB0aWxlLXNwYWNlIGNvb3JkaW5hdGVzXG4gKiBAcmV0dXJuIHtBcnJheX0gZW5jb2RlZCBnZW9tZXRyeVxuICovXG5mdW5jdGlvbiBlbmNvZGVHZW9tZXRyeSAoZ2VvbWV0cnkpIHtcbiAgdmFyIGVuY29kZWQgPSBbXVxuICB2YXIgeCA9IDBcbiAgdmFyIHkgPSAwXG4gIHZhciByaW5ncyA9IGdlb21ldHJ5Lmxlbmd0aFxuICBmb3IgKHZhciByID0gMDsgciA8IHJpbmdzOyByKyspIHtcbiAgICB2YXIgcmluZyA9IGdlb21ldHJ5W3JdXG4gICAgZW5jb2RlZC5wdXNoKGNvbW1hbmQoMSwgMSkpIC8vIG1vdmV0b1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmluZy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGkgPT09IDEpIHtcbiAgICAgICAgZW5jb2RlZC5wdXNoKGNvbW1hbmQoMiwgcmluZy5sZW5ndGggLSAxKSkgLy8gbGluZXRvXG4gICAgICB9XG4gICAgICB2YXIgZHggPSByaW5nW2ldLnggLSB4XG4gICAgICB2YXIgZHkgPSByaW5nW2ldLnkgLSB5XG4gICAgICBlbmNvZGVkLnB1c2goemlnemFnKGR4KSwgemlnemFnKGR5KSlcbiAgICAgIHggKz0gZHhcbiAgICAgIHkgKz0gZHlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZW5jb2RlZFxufVxuXG4vKipcbiAqIFdyYXAgYSBwcm9wZXJ0eSB2YWx1ZSBhY2NvcmRpbmcgdG8gaXRzIHR5cGUuIFRoZSByZXR1cm5lZCBvYmplY3RcbiAqIGlzIG9mIHRoZSBmb3JtIHsgeHh4eF92YWx1ZTogcHJpbWl0aXZlVmFsdWUgfSwgd2hpY2ggaXMgd2hhdCB0aGUgZ2VuZXJhdGVkXG4gKiBwcm90b2J1ZiBzZXJpYWxpemVyIGV4cGVjdHMuXG4gKi9cbmZ1bmN0aW9uIHdyYXBWYWx1ZSAodmFsdWUpIHtcbiAgdmFyIHJlc3VsdFxuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZVxuICBpZiAodHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXN1bHQgPSB7IHN0cmluZ192YWx1ZTogdmFsdWUgfVxuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdib29sZWFuJykge1xuICAgIHJlc3VsdCA9IHsgYm9vbF92YWx1ZTogdmFsdWUgfVxuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdudW1iZXInKSB7XG4gICAgaWYgKHZhbHVlICUgMSAhPT0gMCkge1xuICAgICAgcmVzdWx0ID0geyBkb3VibGVfdmFsdWU6IHZhbHVlIH1cbiAgICB9IGVsc2UgaWYgKHZhbHVlIDwgMCkge1xuICAgICAgcmVzdWx0ID0geyBzaW50X3ZhbHVlOiB2YWx1ZSB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IHsgdWludF92YWx1ZTogdmFsdWUgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YWx1ZSA9IEpTT04uc3RyaW5naWZ5KHZhbHVlKVxuICAgIHJlc3VsdCA9IHsgc3RyaW5nX3ZhbHVlOiB2YWx1ZSB9XG4gIH1cblxuICByZXN1bHQua2V5ID0gdHlwZSArICc6JyArIHZhbHVlXG4gIHJldHVybiByZXN1bHRcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG52YXIgUG9pbnQgPSByZXF1aXJlKCdwb2ludC1nZW9tZXRyeScpXG52YXIgVmVjdG9yVGlsZUZlYXR1cmUgPSByZXF1aXJlKCd2ZWN0b3ItdGlsZScpLlZlY3RvclRpbGVGZWF0dXJlXG5cbm1vZHVsZS5leHBvcnRzID0gR2VvSlNPTldyYXBwZXJcblxuLy8gY29uZm9ybSB0byB2ZWN0b3J0aWxlIGFwaVxuZnVuY3Rpb24gR2VvSlNPTldyYXBwZXIgKGZlYXR1cmVzKSB7XG4gIHRoaXMuZmVhdHVyZXMgPSBmZWF0dXJlc1xuICB0aGlzLmxlbmd0aCA9IGZlYXR1cmVzLmxlbmd0aFxufVxuXG5HZW9KU09OV3JhcHBlci5wcm90b3R5cGUuZmVhdHVyZSA9IGZ1bmN0aW9uIChpKSB7XG4gIHJldHVybiBuZXcgRmVhdHVyZVdyYXBwZXIodGhpcy5mZWF0dXJlc1tpXSlcbn1cblxuZnVuY3Rpb24gRmVhdHVyZVdyYXBwZXIgKGZlYXR1cmUpIHtcbiAgdGhpcy5pZCA9IHR5cGVvZiBmZWF0dXJlLmlkID09PSAnbnVtYmVyJyA/IGZlYXR1cmUuaWQgOiB1bmRlZmluZWRcbiAgdGhpcy50eXBlID0gZmVhdHVyZS50eXBlXG4gIHRoaXMucmF3R2VvbWV0cnkgPSBmZWF0dXJlLnR5cGUgPT09IDEgPyBbZmVhdHVyZS5nZW9tZXRyeV0gOiBmZWF0dXJlLmdlb21ldHJ5XG4gIHRoaXMucHJvcGVydGllcyA9IGZlYXR1cmUudGFnc1xuICB0aGlzLmV4dGVudCA9IDQwOTZcbn1cblxuRmVhdHVyZVdyYXBwZXIucHJvdG90eXBlLmxvYWRHZW9tZXRyeSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHJpbmdzID0gdGhpcy5yYXdHZW9tZXRyeVxuICB0aGlzLmdlb21ldHJ5ID0gW11cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHJpbmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHJpbmcgPSByaW5nc1tpXVxuICAgIHZhciBuZXdSaW5nID0gW11cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHJpbmcubGVuZ3RoOyBqKyspIHtcbiAgICAgIG5ld1JpbmcucHVzaChuZXcgUG9pbnQocmluZ1tqXVswXSwgcmluZ1tqXVsxXSkpXG4gICAgfVxuICAgIHRoaXMuZ2VvbWV0cnkucHVzaChuZXdSaW5nKVxuICB9XG4gIHJldHVybiB0aGlzLmdlb21ldHJ5XG59XG5cbkZlYXR1cmVXcmFwcGVyLnByb3RvdHlwZS5iYm94ID0gZnVuY3Rpb24gKCkge1xuICBpZiAoIXRoaXMuZ2VvbWV0cnkpIHRoaXMubG9hZEdlb21ldHJ5KClcblxuICB2YXIgcmluZ3MgPSB0aGlzLmdlb21ldHJ5XG4gIHZhciB4MSA9IEluZmluaXR5XG4gIHZhciB4MiA9IC1JbmZpbml0eVxuICB2YXIgeTEgPSBJbmZpbml0eVxuICB2YXIgeTIgPSAtSW5maW5pdHlcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHJpbmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHJpbmcgPSByaW5nc1tpXVxuXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCByaW5nLmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIgY29vcmQgPSByaW5nW2pdXG5cbiAgICAgIHgxID0gTWF0aC5taW4oeDEsIGNvb3JkLngpXG4gICAgICB4MiA9IE1hdGgubWF4KHgyLCBjb29yZC54KVxuICAgICAgeTEgPSBNYXRoLm1pbih5MSwgY29vcmQueSlcbiAgICAgIHkyID0gTWF0aC5tYXgoeTIsIGNvb3JkLnkpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIFt4MSwgeTEsIHgyLCB5Ml1cbn1cblxuRmVhdHVyZVdyYXBwZXIucHJvdG90eXBlLnRvR2VvSlNPTiA9IFZlY3RvclRpbGVGZWF0dXJlLnByb3RvdHlwZS50b0dlb0pTT05cbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gdGlsZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbnZhciB0aWxlID0gZXhwb3J0cy50aWxlID0ge3JlYWQ6IHJlYWRUaWxlLCB3cml0ZTogd3JpdGVUaWxlfTtcblxudGlsZS5HZW9tVHlwZSA9IHtcbiAgICBcIlVua25vd25cIjogMCxcbiAgICBcIlBvaW50XCI6IDEsXG4gICAgXCJMaW5lU3RyaW5nXCI6IDIsXG4gICAgXCJQb2x5Z29uXCI6IDNcbn07XG5cbmZ1bmN0aW9uIHJlYWRUaWxlKHBiZiwgZW5kKSB7XG4gICAgcmV0dXJuIHBiZi5yZWFkRmllbGRzKHJlYWRUaWxlRmllbGQsIHtcImxheWVyc1wiOiBbXX0sIGVuZCk7XG59XG5cbmZ1bmN0aW9uIHJlYWRUaWxlRmllbGQodGFnLCB0aWxlLCBwYmYpIHtcbiAgICBpZiAodGFnID09PSAzKSB0aWxlLmxheWVycy5wdXNoKHJlYWRMYXllcihwYmYsIHBiZi5yZWFkVmFyaW50KCkgKyBwYmYucG9zKSk7XG59XG5cbmZ1bmN0aW9uIHdyaXRlVGlsZSh0aWxlLCBwYmYpIHtcbiAgICB2YXIgaTtcbiAgICBpZiAodGlsZS5sYXllcnMgIT09IHVuZGVmaW5lZCkgZm9yIChpID0gMDsgaSA8IHRpbGUubGF5ZXJzLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVNZXNzYWdlKDMsIHdyaXRlTGF5ZXIsIHRpbGUubGF5ZXJzW2ldKTtcbn1cblxuLy8gdmFsdWUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG50aWxlLnZhbHVlID0ge3JlYWQ6IHJlYWRWYWx1ZSwgd3JpdGU6IHdyaXRlVmFsdWV9O1xuXG5mdW5jdGlvbiByZWFkVmFsdWUocGJmLCBlbmQpIHtcbiAgICByZXR1cm4gcGJmLnJlYWRGaWVsZHMocmVhZFZhbHVlRmllbGQsIHt9LCBlbmQpO1xufVxuXG5mdW5jdGlvbiByZWFkVmFsdWVGaWVsZCh0YWcsIHZhbHVlLCBwYmYpIHtcbiAgICBpZiAodGFnID09PSAxKSB2YWx1ZS5zdHJpbmdfdmFsdWUgPSBwYmYucmVhZFN0cmluZygpO1xuICAgIGVsc2UgaWYgKHRhZyA9PT0gMikgdmFsdWUuZmxvYXRfdmFsdWUgPSBwYmYucmVhZEZsb2F0KCk7XG4gICAgZWxzZSBpZiAodGFnID09PSAzKSB2YWx1ZS5kb3VibGVfdmFsdWUgPSBwYmYucmVhZERvdWJsZSgpO1xuICAgIGVsc2UgaWYgKHRhZyA9PT0gNCkgdmFsdWUuaW50X3ZhbHVlID0gcGJmLnJlYWRWYXJpbnQoKTtcbiAgICBlbHNlIGlmICh0YWcgPT09IDUpIHZhbHVlLnVpbnRfdmFsdWUgPSBwYmYucmVhZFZhcmludCgpO1xuICAgIGVsc2UgaWYgKHRhZyA9PT0gNikgdmFsdWUuc2ludF92YWx1ZSA9IHBiZi5yZWFkU1ZhcmludCgpO1xuICAgIGVsc2UgaWYgKHRhZyA9PT0gNykgdmFsdWUuYm9vbF92YWx1ZSA9IHBiZi5yZWFkQm9vbGVhbigpO1xufVxuXG5mdW5jdGlvbiB3cml0ZVZhbHVlKHZhbHVlLCBwYmYpIHtcbiAgICBpZiAodmFsdWUuc3RyaW5nX3ZhbHVlICE9PSB1bmRlZmluZWQpIHBiZi53cml0ZVN0cmluZ0ZpZWxkKDEsIHZhbHVlLnN0cmluZ192YWx1ZSk7XG4gICAgaWYgKHZhbHVlLmZsb2F0X3ZhbHVlICE9PSB1bmRlZmluZWQpIHBiZi53cml0ZUZsb2F0RmllbGQoMiwgdmFsdWUuZmxvYXRfdmFsdWUpO1xuICAgIGlmICh2YWx1ZS5kb3VibGVfdmFsdWUgIT09IHVuZGVmaW5lZCkgcGJmLndyaXRlRG91YmxlRmllbGQoMywgdmFsdWUuZG91YmxlX3ZhbHVlKTtcbiAgICBpZiAodmFsdWUuaW50X3ZhbHVlICE9PSB1bmRlZmluZWQpIHBiZi53cml0ZVZhcmludEZpZWxkKDQsIHZhbHVlLmludF92YWx1ZSk7XG4gICAgaWYgKHZhbHVlLnVpbnRfdmFsdWUgIT09IHVuZGVmaW5lZCkgcGJmLndyaXRlVmFyaW50RmllbGQoNSwgdmFsdWUudWludF92YWx1ZSk7XG4gICAgaWYgKHZhbHVlLnNpbnRfdmFsdWUgIT09IHVuZGVmaW5lZCkgcGJmLndyaXRlU1ZhcmludEZpZWxkKDYsIHZhbHVlLnNpbnRfdmFsdWUpO1xuICAgIGlmICh2YWx1ZS5ib29sX3ZhbHVlICE9PSB1bmRlZmluZWQpIHBiZi53cml0ZUJvb2xlYW5GaWVsZCg3LCB2YWx1ZS5ib29sX3ZhbHVlKTtcbn1cblxuLy8gZmVhdHVyZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbnRpbGUuZmVhdHVyZSA9IHtyZWFkOiByZWFkRmVhdHVyZSwgd3JpdGU6IHdyaXRlRmVhdHVyZX07XG5cbmZ1bmN0aW9uIHJlYWRGZWF0dXJlKHBiZiwgZW5kKSB7XG4gICAgdmFyIGZlYXR1cmUgPSBwYmYucmVhZEZpZWxkcyhyZWFkRmVhdHVyZUZpZWxkLCB7fSwgZW5kKTtcbiAgICBpZiAoZmVhdHVyZS50eXBlID09PSB1bmRlZmluZWQpIGZlYXR1cmUudHlwZSA9IFwiVW5rbm93blwiO1xuICAgIHJldHVybiBmZWF0dXJlO1xufVxuXG5mdW5jdGlvbiByZWFkRmVhdHVyZUZpZWxkKHRhZywgZmVhdHVyZSwgcGJmKSB7XG4gICAgaWYgKHRhZyA9PT0gMSkgZmVhdHVyZS5pZCA9IHBiZi5yZWFkVmFyaW50KCk7XG4gICAgZWxzZSBpZiAodGFnID09PSAyKSBmZWF0dXJlLnRhZ3MgPSBwYmYucmVhZFBhY2tlZFZhcmludCgpO1xuICAgIGVsc2UgaWYgKHRhZyA9PT0gMykgZmVhdHVyZS50eXBlID0gcGJmLnJlYWRWYXJpbnQoKTtcbiAgICBlbHNlIGlmICh0YWcgPT09IDQpIGZlYXR1cmUuZ2VvbWV0cnkgPSBwYmYucmVhZFBhY2tlZFZhcmludCgpO1xufVxuXG5mdW5jdGlvbiB3cml0ZUZlYXR1cmUoZmVhdHVyZSwgcGJmKSB7XG4gICAgaWYgKGZlYXR1cmUuaWQgIT09IHVuZGVmaW5lZCkgcGJmLndyaXRlVmFyaW50RmllbGQoMSwgZmVhdHVyZS5pZCk7XG4gICAgaWYgKGZlYXR1cmUudGFncyAhPT0gdW5kZWZpbmVkKSBwYmYud3JpdGVQYWNrZWRWYXJpbnQoMiwgZmVhdHVyZS50YWdzKTtcbiAgICBpZiAoZmVhdHVyZS50eXBlICE9PSB1bmRlZmluZWQpIHBiZi53cml0ZVZhcmludEZpZWxkKDMsIGZlYXR1cmUudHlwZSk7XG4gICAgaWYgKGZlYXR1cmUuZ2VvbWV0cnkgIT09IHVuZGVmaW5lZCkgcGJmLndyaXRlUGFja2VkVmFyaW50KDQsIGZlYXR1cmUuZ2VvbWV0cnkpO1xufVxuXG4vLyBsYXllciA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbnRpbGUubGF5ZXIgPSB7cmVhZDogcmVhZExheWVyLCB3cml0ZTogd3JpdGVMYXllcn07XG5cbmZ1bmN0aW9uIHJlYWRMYXllcihwYmYsIGVuZCkge1xuICAgIHJldHVybiBwYmYucmVhZEZpZWxkcyhyZWFkTGF5ZXJGaWVsZCwge1wiZmVhdHVyZXNcIjogW10sIFwia2V5c1wiOiBbXSwgXCJ2YWx1ZXNcIjogW119LCBlbmQpO1xufVxuXG5mdW5jdGlvbiByZWFkTGF5ZXJGaWVsZCh0YWcsIGxheWVyLCBwYmYpIHtcbiAgICBpZiAodGFnID09PSAxNSkgbGF5ZXIudmVyc2lvbiA9IHBiZi5yZWFkVmFyaW50KCk7XG4gICAgZWxzZSBpZiAodGFnID09PSAxKSBsYXllci5uYW1lID0gcGJmLnJlYWRTdHJpbmcoKTtcbiAgICBlbHNlIGlmICh0YWcgPT09IDIpIGxheWVyLmZlYXR1cmVzLnB1c2gocmVhZEZlYXR1cmUocGJmLCBwYmYucmVhZFZhcmludCgpICsgcGJmLnBvcykpO1xuICAgIGVsc2UgaWYgKHRhZyA9PT0gMykgbGF5ZXIua2V5cy5wdXNoKHBiZi5yZWFkU3RyaW5nKCkpO1xuICAgIGVsc2UgaWYgKHRhZyA9PT0gNCkgbGF5ZXIudmFsdWVzLnB1c2gocmVhZFZhbHVlKHBiZiwgcGJmLnJlYWRWYXJpbnQoKSArIHBiZi5wb3MpKTtcbiAgICBlbHNlIGlmICh0YWcgPT09IDUpIGxheWVyLmV4dGVudCA9IHBiZi5yZWFkVmFyaW50KCk7XG59XG5cbmZ1bmN0aW9uIHdyaXRlTGF5ZXIobGF5ZXIsIHBiZikge1xuICAgIGlmIChsYXllci52ZXJzaW9uICE9PSB1bmRlZmluZWQpIHBiZi53cml0ZVZhcmludEZpZWxkKDE1LCBsYXllci52ZXJzaW9uKTtcbiAgICBpZiAobGF5ZXIubmFtZSAhPT0gdW5kZWZpbmVkKSBwYmYud3JpdGVTdHJpbmdGaWVsZCgxLCBsYXllci5uYW1lKTtcbiAgICB2YXIgaTtcbiAgICBpZiAobGF5ZXIuZmVhdHVyZXMgIT09IHVuZGVmaW5lZCkgZm9yIChpID0gMDsgaSA8IGxheWVyLmZlYXR1cmVzLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVNZXNzYWdlKDIsIHdyaXRlRmVhdHVyZSwgbGF5ZXIuZmVhdHVyZXNbaV0pO1xuICAgIGlmIChsYXllci5rZXlzICE9PSB1bmRlZmluZWQpIGZvciAoaSA9IDA7IGkgPCBsYXllci5rZXlzLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVTdHJpbmdGaWVsZCgzLCBsYXllci5rZXlzW2ldKTtcbiAgICBpZiAobGF5ZXIudmFsdWVzICE9PSB1bmRlZmluZWQpIGZvciAoaSA9IDA7IGkgPCBsYXllci52YWx1ZXMubGVuZ3RoOyBpKyspIHBiZi53cml0ZU1lc3NhZ2UoNCwgd3JpdGVWYWx1ZSwgbGF5ZXIudmFsdWVzW2ldKTtcbiAgICBpZiAobGF5ZXIuZXh0ZW50ICE9PSB1bmRlZmluZWQpIHBiZi53cml0ZVZhcmludEZpZWxkKDUsIGxheWVyLmV4dGVudCk7XG59XG4iLCJ2YXIgYnVuZGxlRm4gPSBhcmd1bWVudHNbM107XG52YXIgc291cmNlcyA9IGFyZ3VtZW50c1s0XTtcbnZhciBjYWNoZSA9IGFyZ3VtZW50c1s1XTtcblxudmFyIHN0cmluZ2lmeSA9IEpTT04uc3RyaW5naWZ5O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChmbiwgb3B0aW9ucykge1xuICAgIHZhciB3a2V5O1xuICAgIHZhciBjYWNoZUtleXMgPSBPYmplY3Qua2V5cyhjYWNoZSk7XG5cbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IGNhY2hlS2V5cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgdmFyIGtleSA9IGNhY2hlS2V5c1tpXTtcbiAgICAgICAgdmFyIGV4cCA9IGNhY2hlW2tleV0uZXhwb3J0cztcbiAgICAgICAgLy8gVXNpbmcgYmFiZWwgYXMgYSB0cmFuc3BpbGVyIHRvIHVzZSBlc21vZHVsZSwgdGhlIGV4cG9ydCB3aWxsIGFsd2F5c1xuICAgICAgICAvLyBiZSBhbiBvYmplY3Qgd2l0aCB0aGUgZGVmYXVsdCBleHBvcnQgYXMgYSBwcm9wZXJ0eSBvZiBpdC4gVG8gZW5zdXJlXG4gICAgICAgIC8vIHRoZSBleGlzdGluZyBhcGkgYW5kIGJhYmVsIGVzbW9kdWxlIGV4cG9ydHMgYXJlIGJvdGggc3VwcG9ydGVkIHdlXG4gICAgICAgIC8vIGNoZWNrIGZvciBib3RoXG4gICAgICAgIGlmIChleHAgPT09IGZuIHx8IGV4cCAmJiBleHAuZGVmYXVsdCA9PT0gZm4pIHtcbiAgICAgICAgICAgIHdrZXkgPSBrZXk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICghd2tleSkge1xuICAgICAgICB3a2V5ID0gTWF0aC5mbG9vcihNYXRoLnBvdygxNiwgOCkgKiBNYXRoLnJhbmRvbSgpKS50b1N0cmluZygxNik7XG4gICAgICAgIHZhciB3Y2FjaGUgPSB7fTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBjYWNoZUtleXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIga2V5ID0gY2FjaGVLZXlzW2ldO1xuICAgICAgICAgICAgd2NhY2hlW2tleV0gPSBrZXk7XG4gICAgICAgIH1cbiAgICAgICAgc291cmNlc1t3a2V5XSA9IFtcbiAgICAgICAgICAgIEZ1bmN0aW9uKFsncmVxdWlyZScsJ21vZHVsZScsJ2V4cG9ydHMnXSwgJygnICsgZm4gKyAnKShzZWxmKScpLFxuICAgICAgICAgICAgd2NhY2hlXG4gICAgICAgIF07XG4gICAgfVxuICAgIHZhciBza2V5ID0gTWF0aC5mbG9vcihNYXRoLnBvdygxNiwgOCkgKiBNYXRoLnJhbmRvbSgpKS50b1N0cmluZygxNik7XG5cbiAgICB2YXIgc2NhY2hlID0ge307IHNjYWNoZVt3a2V5XSA9IHdrZXk7XG4gICAgc291cmNlc1tza2V5XSA9IFtcbiAgICAgICAgRnVuY3Rpb24oWydyZXF1aXJlJ10sIChcbiAgICAgICAgICAgIC8vIHRyeSB0byBjYWxsIGRlZmF1bHQgaWYgZGVmaW5lZCB0byBhbHNvIHN1cHBvcnQgYmFiZWwgZXNtb2R1bGVcbiAgICAgICAgICAgIC8vIGV4cG9ydHNcbiAgICAgICAgICAgICd2YXIgZiA9IHJlcXVpcmUoJyArIHN0cmluZ2lmeSh3a2V5KSArICcpOycgK1xuICAgICAgICAgICAgJyhmLmRlZmF1bHQgPyBmLmRlZmF1bHQgOiBmKShzZWxmKTsnXG4gICAgICAgICkpLFxuICAgICAgICBzY2FjaGVcbiAgICBdO1xuXG4gICAgdmFyIHdvcmtlclNvdXJjZXMgPSB7fTtcbiAgICByZXNvbHZlU291cmNlcyhza2V5KTtcblxuICAgIGZ1bmN0aW9uIHJlc29sdmVTb3VyY2VzKGtleSkge1xuICAgICAgICB3b3JrZXJTb3VyY2VzW2tleV0gPSB0cnVlO1xuXG4gICAgICAgIGZvciAodmFyIGRlcFBhdGggaW4gc291cmNlc1trZXldWzFdKSB7XG4gICAgICAgICAgICB2YXIgZGVwS2V5ID0gc291cmNlc1trZXldWzFdW2RlcFBhdGhdO1xuICAgICAgICAgICAgaWYgKCF3b3JrZXJTb3VyY2VzW2RlcEtleV0pIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlU291cmNlcyhkZXBLZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHNyYyA9ICcoJyArIGJ1bmRsZUZuICsgJykoeydcbiAgICAgICAgKyBPYmplY3Qua2V5cyh3b3JrZXJTb3VyY2VzKS5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZ2lmeShrZXkpICsgJzpbJ1xuICAgICAgICAgICAgICAgICsgc291cmNlc1trZXldWzBdXG4gICAgICAgICAgICAgICAgKyAnLCcgKyBzdHJpbmdpZnkoc291cmNlc1trZXldWzFdKSArICddJ1xuICAgICAgICAgICAgO1xuICAgICAgICB9KS5qb2luKCcsJylcbiAgICAgICAgKyAnfSx7fSxbJyArIHN0cmluZ2lmeShza2V5KSArICddKSdcbiAgICA7XG5cbiAgICB2YXIgVVJMID0gd2luZG93LlVSTCB8fCB3aW5kb3cud2Via2l0VVJMIHx8IHdpbmRvdy5tb3pVUkwgfHwgd2luZG93Lm1zVVJMO1xuXG4gICAgdmFyIGJsb2IgPSBuZXcgQmxvYihbc3JjXSwgeyB0eXBlOiAndGV4dC9qYXZhc2NyaXB0JyB9KTtcbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmJhcmUpIHsgcmV0dXJuIGJsb2I7IH1cbiAgICB2YXIgd29ya2VyVXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICB2YXIgd29ya2VyID0gbmV3IFdvcmtlcih3b3JrZXJVcmwpO1xuICAgIHdvcmtlci5vYmplY3RVUkwgPSB3b3JrZXJVcmw7XG4gICAgcmV0dXJuIHdvcmtlcjtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cy5SQURJVVMgPSA2Mzc4MTM3O1xubW9kdWxlLmV4cG9ydHMuRkxBVFRFTklORyA9IDEvMjk4LjI1NzIyMzU2Mztcbm1vZHVsZS5leHBvcnRzLlBPTEFSX1JBRElVUyA9IDYzNTY3NTIuMzE0MjtcbiIsIihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gZmFjdG9yeShleHBvcnRzKSA6XG4gICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnZXhwb3J0cyddLCBmYWN0b3J5KSA6XG4gICAgKGZhY3RvcnkoKGdsb2JhbC5XaG9vVFMgPSBnbG9iYWwuV2hvb1RTIHx8IHt9KSkpO1xufSh0aGlzLCBmdW5jdGlvbiAoZXhwb3J0cykge1xuXG4vKipcbiAqIGdldFVSTFxuICpcbiAqIEBwYXJhbSAgICB7U3RyaW5nfSAgYmFzZVVybCAgQmFzZSB1cmwgb2YgdGhlIFdNUyBzZXJ2ZXJcbiAqIEBwYXJhbSAgICB7U3RyaW5nfSAgbGF5ZXIgICAgTGF5ZXIgbmFtZVxuICogQHBhcmFtICAgIHtOdW1iZXJ9ICB4ICAgICAgICBUaWxlIGNvb3JkaW5hdGUgeFxuICogQHBhcmFtICAgIHtOdW1iZXJ9ICB5ICAgICAgICBUaWxlIGNvb3JkaW5hdGUgeVxuICogQHBhcmFtICAgIHtOdW1iZXJ9ICB6ICAgICAgICBUaWxlIHpvb21cbiAqIEBwYXJhbSAgICB7T2JqZWN0fSAgW29wdGlvbnNdXG4gKiBAcGFyYW0gICAge1N0cmluZ30gIFtvcHRpb25zLmZvcm1hdD0naW1hZ2UvcG5nJ11cbiAqIEBwYXJhbSAgICB7U3RyaW5nfSAgW29wdGlvbnMuc2VydmljZT0nV01TJ11cbiAqIEBwYXJhbSAgICB7U3RyaW5nfSAgW29wdGlvbnMudmVyc2lvbj0nMS4xLjEnXVxuICogQHBhcmFtICAgIHtTdHJpbmd9ICBbb3B0aW9ucy5yZXF1ZXN0PSdHZXRNYXAnXVxuICogQHBhcmFtICAgIHtTdHJpbmd9ICBbb3B0aW9ucy5zcnM9J0VQU0c6Mzg1NyddXG4gKiBAcGFyYW0gICAge051bWJlcn0gIFtvcHRpb25zLndpZHRoPScyNTYnXVxuICogQHBhcmFtICAgIHtOdW1iZXJ9ICBbb3B0aW9ucy5oZWlnaHQ9JzI1NiddXG4gKiBAcmV0dXJucyAge1N0cmluZ30gIHVybFxuICogQGV4YW1wbGVcbiAqIHZhciBiYXNlVXJsID0gJ2h0dHA6Ly9nZW9kYXRhLnN0YXRlLm5qLnVzL2ltYWdlcnl3bXMvTmF0dXJhbDIwMTUnO1xuICogdmFyIGxheWVyID0gJ05hdHVyYWwyMDE1JztcbiAqIHZhciB1cmwgPSB3aG9vdHMuZ2V0VVJMKGJhc2VVcmwsIGxheWVyLCAxNTQzMDgsIDE5NzE2NywgMTkpO1xuICovXG5mdW5jdGlvbiBnZXRVUkwoYmFzZVVybCwgbGF5ZXIsIHgsIHksIHosIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgIHZhciB1cmwgPSBiYXNlVXJsICsgJz8nICsgW1xuICAgICAgICAnYmJveD0nICAgICsgZ2V0VGlsZUJCb3goeCwgeSwgeiksXG4gICAgICAgICdmb3JtYXQ9JyAgKyAob3B0aW9ucy5mb3JtYXQgfHwgJ2ltYWdlL3BuZycpLFxuICAgICAgICAnc2VydmljZT0nICsgKG9wdGlvbnMuc2VydmljZSB8fCAnV01TJyksXG4gICAgICAgICd2ZXJzaW9uPScgKyAob3B0aW9ucy52ZXJzaW9uIHx8ICcxLjEuMScpLFxuICAgICAgICAncmVxdWVzdD0nICsgKG9wdGlvbnMucmVxdWVzdCB8fCAnR2V0TWFwJyksXG4gICAgICAgICdzcnM9JyAgICAgKyAob3B0aW9ucy5zcnMgfHwgJ0VQU0c6Mzg1NycpLFxuICAgICAgICAnd2lkdGg9JyAgICsgKG9wdGlvbnMud2lkdGggfHwgMjU2KSxcbiAgICAgICAgJ2hlaWdodD0nICArIChvcHRpb25zLmhlaWdodCB8fCAyNTYpLFxuICAgICAgICAnbGF5ZXJzPScgICsgbGF5ZXJcbiAgICBdLmpvaW4oJyYnKTtcblxuICAgIHJldHVybiB1cmw7XG59XG5cblxuLyoqXG4gKiBnZXRUaWxlQkJveFxuICpcbiAqIEBwYXJhbSAgICB7TnVtYmVyfSAgeCAgVGlsZSBjb29yZGluYXRlIHhcbiAqIEBwYXJhbSAgICB7TnVtYmVyfSAgeSAgVGlsZSBjb29yZGluYXRlIHlcbiAqIEBwYXJhbSAgICB7TnVtYmVyfSAgeiAgVGlsZSB6b29tXG4gKiBAcmV0dXJucyAge1N0cmluZ30gIFN0cmluZyBvZiB0aGUgYm91bmRpbmcgYm94XG4gKi9cbmZ1bmN0aW9uIGdldFRpbGVCQm94KHgsIHksIHopIHtcbiAgICAvLyBmb3IgR29vZ2xlL09TTSB0aWxlIHNjaGVtZSB3ZSBuZWVkIHRvIGFsdGVyIHRoZSB5XG4gICAgeSA9IChNYXRoLnBvdygyLCB6KSAtIHkgLSAxKTtcblxuICAgIHZhciBtaW4gPSBnZXRNZXJjQ29vcmRzKHggKiAyNTYsIHkgKiAyNTYsIHopLFxuICAgICAgICBtYXggPSBnZXRNZXJjQ29vcmRzKCh4ICsgMSkgKiAyNTYsICh5ICsgMSkgKiAyNTYsIHopO1xuXG4gICAgcmV0dXJuIG1pblswXSArICcsJyArIG1pblsxXSArICcsJyArIG1heFswXSArICcsJyArIG1heFsxXTtcbn1cblxuXG4vKipcbiAqIGdldE1lcmNDb29yZHNcbiAqXG4gKiBAcGFyYW0gICAge051bWJlcn0gIHggIFBpeGVsIGNvb3JkaW5hdGUgeFxuICogQHBhcmFtICAgIHtOdW1iZXJ9ICB5ICBQaXhlbCBjb29yZGluYXRlIHlcbiAqIEBwYXJhbSAgICB7TnVtYmVyfSAgeiAgVGlsZSB6b29tXG4gKiBAcmV0dXJucyAge0FycmF5fSAgIFt4LCB5XVxuICovXG5mdW5jdGlvbiBnZXRNZXJjQ29vcmRzKHgsIHksIHopIHtcbiAgICB2YXIgcmVzb2x1dGlvbiA9ICgyICogTWF0aC5QSSAqIDYzNzgxMzcgLyAyNTYpIC8gTWF0aC5wb3coMiwgeiksXG4gICAgICAgIG1lcmNfeCA9ICh4ICogcmVzb2x1dGlvbiAtIDIgKiBNYXRoLlBJICAqIDYzNzgxMzcgLyAyLjApLFxuICAgICAgICBtZXJjX3kgPSAoeSAqIHJlc29sdXRpb24gLSAyICogTWF0aC5QSSAgKiA2Mzc4MTM3IC8gMi4wKTtcblxuICAgIHJldHVybiBbbWVyY194LCBtZXJjX3ldO1xufVxuXG5leHBvcnRzLmdldFVSTCA9IGdldFVSTDtcbmV4cG9ydHMuZ2V0VGlsZUJCb3ggPSBnZXRUaWxlQkJveDtcbmV4cG9ydHMuZ2V0TWVyY0Nvb3JkcyA9IGdldE1lcmNDb29yZHM7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG5cbn0pKTsiLCJtb2R1bGUuZXhwb3J0cz17XG4gIFwidmVyc2lvblwiOiBcIjAuMzIuMVwiXG59Il19 \ No newline at end of file diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.32.1/js/mapbox-gl.js b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.32.1/js/mapbox-gl.js new file mode 100644 index 000000000..21db4006f --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.32.1/js/mapbox-gl.js @@ -0,0 +1,447 @@ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.mapboxgl = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;oArrayGroup.MAX_VERTEX_ARRAY_LENGTH)&&(e=new Segment(this.layoutVertexArray.length,this.elementArray.length),this.segments.push(e)),e},ArrayGroup.prototype.prepareSegment2=function(r){var e=this.segments2[this.segments2.length-1];return(!e||e.vertexLength+r>ArrayGroup.MAX_VERTEX_ARRAY_LENGTH)&&(e=new Segment(this.layoutVertexArray.length,this.elementArray2.length),this.segments2.push(e)),e},ArrayGroup.prototype.populatePaintArrays=function(r){var e=this;for(var t in this.layerData){var a=e.layerData[t];0!==a.paintVertexArray.bytesPerElement&&a.programConfiguration.populatePaintArray(a.layer,a.paintVertexArray,e.layoutVertexArray.length,e.globalProperties,r)}},ArrayGroup.prototype.isEmpty=function(){return 0===this.layoutVertexArray.length},ArrayGroup.prototype.serialize=function(r){return{layoutVertexArray:this.layoutVertexArray.serialize(r),elementArray:this.elementArray&&this.elementArray.serialize(r),elementArray2:this.elementArray2&&this.elementArray2.serialize(r),paintVertexArrays:serializePaintVertexArrays(this.layerData,r),segments:this.segments,segments2:this.segments2}},ArrayGroup.MAX_VERTEX_ARRAY_LENGTH=Math.pow(2,16)-1,module.exports=ArrayGroup; +},{"./program_configuration":15}],2:[function(require,module,exports){ +"use strict";var ArrayGroup=require("./array_group"),BufferGroup=require("./buffer_group"),util=require("../util/util"),Bucket=function(r,e){this.zoom=r.zoom,this.overscaling=r.overscaling,this.layers=r.layers,this.index=r.index,r.arrays?this.buffers=new BufferGroup(e,r.layers,r.zoom,r.arrays):this.arrays=new ArrayGroup(e,r.layers,r.zoom)};Bucket.prototype.populate=function(r,e){for(var t=this,i=0,u=r;i=EXTENT||o<0||o>=EXTENT)){var n=r.prepareSegment(4),u=n.vertexLength;addCircleVertex(r.layoutVertexArray,l,o,-1,-1),addCircleVertex(r.layoutVertexArray,l,o,1,-1),addCircleVertex(r.layoutVertexArray,l,o,1,1),addCircleVertex(r.layoutVertexArray,l,o,-1,1),r.elementArray.emplaceBack(u,u+1,u+2),r.elementArray.emplaceBack(u,u+3,u+2),n.vertexLength+=4,n.primitiveLength+=2}}r.populatePaintArrays(e.properties)},r}(Bucket);module.exports=CircleBucket; +},{"../bucket":2,"../element_array_type":10,"../extent":11,"../load_geometry":13,"../vertex_array_type":17}],4:[function(require,module,exports){ +"use strict";var Bucket=require("../bucket"),createVertexArrayType=require("../vertex_array_type"),createElementArrayType=require("../element_array_type"),loadGeometry=require("../load_geometry"),earcut=require("earcut"),classifyRings=require("../../util/classify_rings"),EARCUT_MAX_RINGS=500,fillInterface={layoutVertexArrayType:createVertexArrayType([{name:"a_pos",components:2,type:"Int16"}]),elementArrayType:createElementArrayType(3),elementArrayType2:createElementArrayType(2),paintAttributes:[{property:"fill-color",type:"Uint8"},{property:"fill-outline-color",type:"Uint8"},{property:"fill-opacity",type:"Uint8",multiplier:255}]},FillBucket=function(e){function r(r){e.call(this,r,fillInterface)}return e&&(r.__proto__=e),r.prototype=Object.create(e&&e.prototype),r.prototype.constructor=r,r.prototype.addFeature=function(e){for(var r=this.arrays,t=0,a=classifyRings(loadGeometry(e),EARCUT_MAX_RINGS);tEXTENT)||e.y===r.y&&(e.y<0||e.y>EXTENT)}var Bucket=require("../bucket"),createVertexArrayType=require("../vertex_array_type"),createElementArrayType=require("../element_array_type"),loadGeometry=require("../load_geometry"),EXTENT=require("../extent"),earcut=require("earcut"),classifyRings=require("../../util/classify_rings"),EARCUT_MAX_RINGS=500,fillExtrusionInterface={layoutVertexArrayType:createVertexArrayType([{name:"a_pos",components:2,type:"Int16"},{name:"a_normal",components:3,type:"Int16"},{name:"a_edgedistance",components:1,type:"Int16"}]),elementArrayType:createElementArrayType(3),paintAttributes:[{property:"fill-extrusion-base",type:"Uint16"},{property:"fill-extrusion-height",type:"Uint16"},{property:"fill-extrusion-color",type:"Uint8"}]},FACTOR=Math.pow(2,13),FillExtrusionBucket=function(e){function r(r){e.call(this,r,fillExtrusionInterface)}return e&&(r.__proto__=e),r.prototype=Object.create(e&&e.prototype),r.prototype.constructor=r,r.prototype.addFeature=function(e){for(var r=this.arrays,t=0,a=classifyRings(loadGeometry(e),EARCUT_MAX_RINGS);t=1){var g=h[f-1];if(!isBoundaryEdge(A,g)){var _=A.sub(g)._perp()._unit();addVertex(r.layoutVertexArray,A.x,A.y,_.x,_.y,0,0,m),addVertex(r.layoutVertexArray,A.x,A.y,_.x,_.y,0,1,m),m+=g.dist(A),addVertex(r.layoutVertexArray,g.x,g.y,_.x,_.y,0,0,m),addVertex(r.layoutVertexArray,g.x,g.y,_.x,_.y,0,1,m);var v=p.vertexLength;r.elementArray.emplaceBack(v,v+1,v+2),r.elementArray.emplaceBack(v+1,v+2,v+3),p.vertexLength+=4,p.primitiveLength+=2}}u.push(A.x),u.push(A.y)}}}for(var T=earcut(u,c),E=0;E>6)}var Bucket=require("../bucket"),createVertexArrayType=require("../vertex_array_type"),createElementArrayType=require("../element_array_type"),loadGeometry=require("../load_geometry"),EXTENT=require("../extent"),EXTRUDE_SCALE=63,COS_HALF_SHARP_CORNER=Math.cos(37.5*(Math.PI/180)),SHARP_CORNER_OFFSET=15,LINE_DISTANCE_BUFFER_BITS=15,LINE_DISTANCE_SCALE=.5,MAX_LINE_DISTANCE=Math.pow(2,LINE_DISTANCE_BUFFER_BITS-1)/LINE_DISTANCE_SCALE,lineInterface={layoutVertexArrayType:createVertexArrayType([{name:"a_pos",components:2,type:"Int16"},{name:"a_data",components:4,type:"Uint8"}]),paintAttributes:[{property:"line-color",type:"Uint8"},{property:"line-blur",multiplier:10,type:"Uint8"},{property:"line-opacity",multiplier:10,type:"Uint8"},{property:"line-gap-width",multiplier:10,type:"Uint8",name:"a_gapwidth"},{property:"line-offset",multiplier:1,type:"Int8"}],elementArrayType:createElementArrayType()},LineBucket=function(e){function t(t){e.call(this,t,lineInterface)}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.addFeature=function(e){for(var t=this,r=this.layers[0].layout,i=r["line-join"],a=r["line-cap"],n=r["line-miter-limit"],d=r["line-round-limit"],s=0,u=loadGeometry(e,LINE_DISTANCE_BUFFER_BITS);s2&&e[s-1].equals(e[s-2]);)s--;if(!(e.length<2)){"bevel"===r&&(a=1.05);var u=SHARP_CORNER_OFFSET*(EXTENT/(512*this.overscaling)),l=e[0],p=e[s-1],o=l.equals(p),c=this.arrays,_=c.prepareSegment(10*s);if(2!==s||!o){this.distance=0;var h,y,m,E,x,C,A,v=i,f=o?"butt":i,L=!0;this.e1=this.e2=this.e3=-1,o&&(h=e[s-2],x=l.sub(h)._unit()._perp());for(var S=0;S0){var b=h.dist(y);if(b>2*u){var R=h.sub(h.sub(y)._mult(u/b)._round());d.distance+=R.dist(y),d.addCurrentVertex(R,d.distance,E.mult(1),0,0,!1,_),y=R}}var g=y&&m,B=g?r:m?v:f;if(g&&"round"===B&&(Ia&&(B="bevel"),"bevel"===B&&(I>2&&(B="flipbevel"),I100)V=x.clone().mult(-1);else{var F=E.x*x.y-E.y*x.x>0?-1:1,k=I*E.add(x).mag()/E.sub(x).mag();V._perp()._mult(k*F)}d.addCurrentVertex(h,d.distance,V,0,0,!1,_),d.addCurrentVertex(h,d.distance,V.mult(-1),0,0,!1,_)}else if("bevel"===B||"fakeround"===B){var D=E.x*x.y-E.y*x.x>0,U=-Math.sqrt(I*I-1);if(D?(A=0,C=U):(C=0,A=U),L||d.addCurrentVertex(h,d.distance,E,C,A,!1,_),"fakeround"===B){for(var q,P=Math.floor(8*(.5-(T-.5))),M=0;M=0;O--)q=E.mult((O+1)/(P+1))._add(x)._unit(),d.addPieSliceVertex(h,d.distance,q,D,_)}m&&d.addCurrentVertex(h,d.distance,x,-C,-A,!1,_)}else"butt"===B?(L||d.addCurrentVertex(h,d.distance,E,0,0,!1,_),m&&d.addCurrentVertex(h,d.distance,x,0,0,!1,_)):"square"===B?(L||(d.addCurrentVertex(h,d.distance,E,1,1,!1,_),d.e1=d.e2=-1),m&&d.addCurrentVertex(h,d.distance,x,-1,-1,!1,_)):"round"===B&&(L||(d.addCurrentVertex(h,d.distance,E,0,0,!1,_),d.addCurrentVertex(h,d.distance,E,1,1,!0,_),d.e1=d.e2=-1),m&&(d.addCurrentVertex(h,d.distance,x,-1,-1,!0,_),d.addCurrentVertex(h,d.distance,x,0,0,!1,_)));if(N&&S2*u){var H=h.add(m.sub(h)._mult(u/X)._round());d.distance+=H.dist(h),d.addCurrentVertex(H,d.distance,x.mult(1),0,0,!1,_),h=H}}L=!1}c.populatePaintArrays(t)}}},t.prototype.addCurrentVertex=function(e,t,r,i,a,n,d){var s,u=n?1:0,l=this.arrays,p=l.layoutVertexArray,o=l.elementArray;s=r.clone(),i&&s._sub(r.perp()._mult(i)),addLineVertex(p,e,s,u,0,i,t),this.e3=d.vertexLength++,this.e1>=0&&this.e2>=0&&(o.emplaceBack(this.e1,this.e2,this.e3),d.primitiveLength++),this.e1=this.e2,this.e2=this.e3,s=r.mult(-1),a&&s._sub(r.perp()._mult(a)),addLineVertex(p,e,s,u,1,-a,t),this.e3=d.vertexLength++,this.e1>=0&&this.e2>=0&&(o.emplaceBack(this.e1,this.e2,this.e3),d.primitiveLength++),this.e1=this.e2,this.e2=this.e3,t>MAX_LINE_DISTANCE/2&&(this.distance=0,this.addCurrentVertex(e,this.distance,r,i,a,n,d))},t.prototype.addPieSliceVertex=function(e,t,r,i,a){var n=i?1:0;r=r.mult(i?-1:1);var d=this.arrays,s=d.layoutVertexArray,u=d.elementArray;addLineVertex(s,e,r,0,n,0,t),this.e3=a.vertexLength++,this.e1>=0&&this.e2>=0&&(u.emplaceBack(this.e1,this.e2,this.e3),a.primitiveLength++),i?this.e2=this.e3:this.e1=this.e3},t}(Bucket);module.exports=LineBucket; +},{"../bucket":2,"../element_array_type":10,"../extent":11,"../load_geometry":13,"../vertex_array_type":17}],7:[function(require,module,exports){ +"use strict";function addVertex(e,t,o,a,r,i,n,s,l,y,c){e.emplaceBack(t,o,Math.round(64*a),Math.round(64*r),i/4,n/4,10*(y||0),c,10*(s||0),10*Math.min(l||25,25))}function addCollisionBoxVertex(e,t,o,a,r){return e.emplaceBack(t.x,t.y,Math.round(o.x),Math.round(o.y),10*a,10*r)}var Point=require("point-geometry"),ArrayGroup=require("../array_group"),BufferGroup=require("../buffer_group"),createVertexArrayType=require("../vertex_array_type"),createElementArrayType=require("../element_array_type"),EXTENT=require("../extent"),Anchor=require("../../symbol/anchor"),getAnchors=require("../../symbol/get_anchors"),resolveTokens=require("../../util/token"),Quads=require("../../symbol/quads"),Shaping=require("../../symbol/shaping"),resolveText=require("../../symbol/resolve_text"),mergeLines=require("../../symbol/mergelines"),clipLine=require("../../symbol/clip_line"),util=require("../../util/util"),scriptDetection=require("../../util/script_detection"),loadGeometry=require("../load_geometry"),CollisionFeature=require("../../symbol/collision_feature"),findPoleOfInaccessibility=require("../../util/find_pole_of_inaccessibility"),classifyRings=require("../../util/classify_rings"),VectorTileFeature=require("vector-tile").VectorTileFeature,rtlTextPlugin=require("../../source/rtl_text_plugin"),shapeText=Shaping.shapeText,shapeIcon=Shaping.shapeIcon,WritingMode=Shaping.WritingMode,getGlyphQuads=Quads.getGlyphQuads,getIconQuads=Quads.getIconQuads,elementArrayType=createElementArrayType(),layoutVertexArrayType=createVertexArrayType([{name:"a_pos",components:2,type:"Int16"},{name:"a_offset",components:2,type:"Int16"},{name:"a_texture_pos",components:2,type:"Uint16"},{name:"a_data",components:4,type:"Uint8"}]),symbolInterfaces={glyph:{layoutVertexArrayType:layoutVertexArrayType,elementArrayType:elementArrayType},icon:{layoutVertexArrayType:layoutVertexArrayType,elementArrayType:elementArrayType},collisionBox:{layoutVertexArrayType:createVertexArrayType([{name:"a_pos",components:2,type:"Int16"},{name:"a_extrude",components:2,type:"Int16"},{name:"a_data",components:2,type:"Uint8"}]),elementArrayType:createElementArrayType(2)}},SymbolBucket=function(e){var t=this;if(this.collisionBoxArray=e.collisionBoxArray,this.symbolQuadsArray=e.symbolQuadsArray,this.symbolInstancesArray=e.symbolInstancesArray,this.zoom=e.zoom,this.overscaling=e.overscaling,this.layers=e.layers,this.index=e.index,this.sdfIcons=e.sdfIcons,this.iconsNeedLinear=e.iconsNeedLinear,this.adjustedTextSize=e.adjustedTextSize,this.adjustedIconSize=e.adjustedIconSize,this.fontstack=e.fontstack,e.arrays){this.buffers={};for(var o in e.arrays)e.arrays[o]&&(t.buffers[o]=new BufferGroup(symbolInterfaces[o],e.layers,e.zoom,e.arrays[o]))}};SymbolBucket.prototype.populate=function(e,t){var o=this,a=this.layers[0].layout,r=a["text-field"],i=a["text-font"],n=a["icon-image"],s=r&&i,l=n;if(this.features=[],s||l){for(var y=t.iconDependencies,c=t.glyphDependencies,d=c[i]=c[i]||{},h=0;hEXTENT||i.y<0||i.y>EXTENT);if(!h||n){var s=n||f;a.addSymbolInstance(i,r,t,o,a.layers[0],s,a.symbolInstancesArray.length,a.collisionBoxArray,e.index,e.sourceLayerIndex,a.index,l,x,p,c,u,g,{zoom:a.zoom},e.properties)}};if("line"===b)for(var S=0,A=clipLine(e.geometry,0,0,EXTENT,EXTENT);S=0;i--)if(o.dist(r[i])7*Math.PI/4)continue}else if(r&&i&&m<=3*Math.PI/4||m>5*Math.PI/4)continue}else if(r&&i&&(m<=Math.PI/2||m>3*Math.PI/2))continue;var p=u.tl,g=u.tr,f=u.bl,b=u.br,I=u.tex,v=u.anchorPoint,S=Math.max(d+Math.log(u.minScale)/Math.LN2,h),A=Math.min(d+Math.log(u.maxScale)/Math.LN2,25);if(!(A<=S)){S===h&&(S=0);var M=Math.round(u.glyphAngle/(2*Math.PI)*256),T=e.prepareSegment(4),B=T.vertexLength;addVertex(c,v.x,v.y,p.x,p.y,I.x,I.y,S,A,h,M),addVertex(c,v.x,v.y,g.x,g.y,I.x+I.w,I.y,S,A,h,M),addVertex(c,v.x,v.y,f.x,f.y,I.x,I.y+I.h,S,A,h,M),addVertex(c,v.x,v.y,b.x,b.y,I.x+I.w,I.y+I.h,S,A,h,M),y.emplaceBack(B,B+1,B+2),y.emplaceBack(B+1,B+2,B+3),T.vertexLength+=4,T.primitiveLength+=2}}},SymbolBucket.prototype.addToDebugBuffers=function(e){for(var t=this,o=this.arrays.collisionBox,a=o.layoutVertexArray,r=o.elementArray,i=-e.angle,n=e.yStretch,s=this.symbolInstancesStartIndex;sSymbolBucket.MAX_QUADS&&util.warnOnce("Too many symbols being rendered in a tile. See https://github.com/mapbox/mapbox-gl-js/issues/2907"),E>SymbolBucket.MAX_QUADS&&util.warnOnce("Too many glyphs being rendered in a tile. See https://github.com/mapbox/mapbox-gl-js/issues/2907");var Q=(o[WritingMode.vertical]?WritingMode.vertical:0)|(o[WritingMode.horizontal]?WritingMode.horizontal:0);return this.symbolInstancesArray.emplaceBack(k,P,w,V,B,E,_,L,e.x,e.y,n,Q)},SymbolBucket.prototype.addSymbolQuad=function(e){return this.symbolQuadsArray.emplaceBack(e.anchorPoint.x,e.anchorPoint.y,e.tl.x,e.tl.y,e.tr.x,e.tr.y,e.bl.x,e.bl.y,e.br.x,e.br.y,e.tex.h,e.tex.w,e.tex.x,e.tex.y,e.anchorAngle,e.glyphAngle,e.maxScale,e.minScale,e.writingMode)},SymbolBucket.MAX_QUADS=65535,module.exports=SymbolBucket; +},{"../../source/rtl_text_plugin":49,"../../symbol/anchor":75,"../../symbol/clip_line":77,"../../symbol/collision_feature":79,"../../symbol/get_anchors":81,"../../symbol/mergelines":84,"../../symbol/quads":85,"../../symbol/resolve_text":86,"../../symbol/shaping":87,"../../util/classify_rings":113,"../../util/find_pole_of_inaccessibility":119,"../../util/script_detection":126,"../../util/token":128,"../../util/util":129,"../array_group":1,"../buffer_group":9,"../element_array_type":10,"../extent":11,"../load_geometry":13,"../vertex_array_type":17,"point-geometry":197,"vector-tile":206}],8:[function(require,module,exports){ +"use strict";var AttributeType={Int8:"BYTE",Uint8:"UNSIGNED_BYTE",Int16:"SHORT",Uint16:"UNSIGNED_SHORT"},Buffer=function(e,t,r){this.arrayBuffer=e.arrayBuffer,this.length=e.length,this.attributes=t.members,this.itemSize=t.bytesPerElement,this.type=r,this.arrayType=t};Buffer.fromStructArray=function(e,t){return new Buffer(e.serialize(),e.constructor.serialize(),t)},Buffer.prototype.bind=function(e){var t=e[this.type];this.buffer?e.bindBuffer(t,this.buffer):(this.gl=e,this.buffer=e.createBuffer(),e.bindBuffer(t,this.buffer),e.bufferData(t,this.arrayBuffer,e.STATIC_DRAW),this.arrayBuffer=null)},Buffer.prototype.setVertexAttribPointers=function(e,t,r){for(var f=this,i=0;i0?e["line-gap-width"]+2*e["line-width"]:e["line-width"]}function translate(e,t,r,i,n){if(!t[0]&&!t[1])return e;t=Point.convert(t),"viewport"===r&&t._rotate(-i);for(var a=[],o=0;or.max||d.yr.max)&&util.warnOnce("Geometry exceeds allowed extent, reduce your vector tile buffer size")}return u}; +},{"../util/util":129,"./extent":11}],14:[function(require,module,exports){ +"use strict";var createStructArrayType=require("../util/struct_array"),PosArray=createStructArrayType({members:[{name:"a_pos",type:"Int16",components:2}]});module.exports=PosArray; +},{"../util/struct_array":127}],15:[function(require,module,exports){ +"use strict";function getPaintAttributeValue(t,e,r,i){if(!t.zoomStops)return e.getPaintValue(t.property,r,i);var a=t.zoomStops.map(function(a){return e.getPaintValue(t.property,util.extend({},r,{zoom:a}),i)});return 1===a.length?a[0]:a}function normalizePaintAttribute(t,e){var r=t.property.replace(e.type+"-","").replace(/-/g,"_"),i="color"===e._paintSpecifications[t.property].type;return util.extend({name:"a_"+r,components:i?4:1,multiplier:i?255:1},t)}var createVertexArrayType=require("./vertex_array_type"),util=require("../util/util"),ProgramConfiguration=function(){this.attributes=[],this.uniforms=[],this.interpolationUniforms=[],this.pragmas={vertex:{},fragment:{}},this.cacheKey=""};ProgramConfiguration.createDynamic=function(t,e,r){for(var i=new ProgramConfiguration,a=0,n=t;a90||this.lat<-90)throw new Error("Invalid LngLat latitude value: must be between -90 and 90")};LngLat.prototype.wrap=function(){return new LngLat(wrap(this.lng,-180,180),this.lat)},LngLat.prototype.toArray=function(){return[this.lng,this.lat]},LngLat.prototype.toString=function(){return"LngLat("+this.lng+", "+this.lat+")"},LngLat.convert=function(t){if(t instanceof LngLat)return t;if(t&&t.hasOwnProperty("lng")&&t.hasOwnProperty("lat"))return new LngLat(t.lng,t.lat);if(Array.isArray(t)&&2===t.length)return new LngLat(t[0],t[1]);throw new Error("`LngLatLike` argument must be specified as a LngLat instance, an object {lng: , lat: }, or an array of [, ]")},module.exports=LngLat; +},{"../util/util":129}],20:[function(require,module,exports){ +"use strict";var LngLat=require("./lng_lat"),LngLatBounds=function(t,n){t&&(n?this.setSouthWest(t).setNorthEast(n):4===t.length?this.setSouthWest([t[0],t[1]]).setNorthEast([t[2],t[3]]):this.setSouthWest(t[0]).setNorthEast(t[1]))};LngLatBounds.prototype.setNorthEast=function(t){return this._ne=LngLat.convert(t),this},LngLatBounds.prototype.setSouthWest=function(t){return this._sw=LngLat.convert(t),this},LngLatBounds.prototype.extend=function(t){var n,e,s=this._sw,o=this._ne;if(t instanceof LngLat)n=t,e=t;else{if(!(t instanceof LngLatBounds))return Array.isArray(t)?t.every(Array.isArray)?this.extend(LngLatBounds.convert(t)):this.extend(LngLat.convert(t)):this;if(n=t._sw,e=t._ne,!n||!e)return this}return s||o?(s.lng=Math.min(n.lng,s.lng),s.lat=Math.min(n.lat,s.lat),o.lng=Math.max(e.lng,o.lng),o.lat=Math.max(e.lat,o.lat)):(this._sw=new LngLat(n.lng,n.lat),this._ne=new LngLat(e.lng,e.lat)),this},LngLatBounds.prototype.getCenter=function(){return new LngLat((this._sw.lng+this._ne.lng)/2,(this._sw.lat+this._ne.lat)/2)},LngLatBounds.prototype.getSouthWest=function(){return this._sw},LngLatBounds.prototype.getNorthEast=function(){return this._ne},LngLatBounds.prototype.getNorthWest=function(){return new LngLat(this.getWest(),this.getNorth())},LngLatBounds.prototype.getSouthEast=function(){return new LngLat(this.getEast(),this.getSouth())},LngLatBounds.prototype.getWest=function(){return this._sw.lng},LngLatBounds.prototype.getSouth=function(){return this._sw.lat},LngLatBounds.prototype.getEast=function(){return this._ne.lng},LngLatBounds.prototype.getNorth=function(){return this._ne.lat},LngLatBounds.prototype.toArray=function(){return[this._sw.toArray(),this._ne.toArray()]},LngLatBounds.prototype.toString=function(){return"LngLatBounds("+this._sw.toString()+", "+this._ne.toString()+")"},LngLatBounds.convert=function(t){return!t||t instanceof LngLatBounds?t:new LngLatBounds(t)},module.exports=LngLatBounds; +},{"./lng_lat":19}],21:[function(require,module,exports){ +"use strict";var LngLat=require("./lng_lat"),Point=require("point-geometry"),Coordinate=require("./coordinate"),util=require("../util/util"),interp=require("../util/interpolate"),TileCoord=require("../source/tile_coord"),EXTENT=require("../data/extent"),glmatrix=require("@mapbox/gl-matrix"),vec4=glmatrix.vec4,mat4=glmatrix.mat4,mat2=glmatrix.mat2,Transform=function(t,i,o){this.tileSize=512,this._renderWorldCopies=void 0===o||o,this._minZoom=t||0,this._maxZoom=i||22,this.latRange=[-85.05113,85.05113],this.width=0,this.height=0,this._center=new LngLat(0,0),this.zoom=0,this.angle=0,this._fov=.6435011087932844,this._pitch=0,this._unmodified=!0},prototypeAccessors={minZoom:{},maxZoom:{},worldSize:{},centerPoint:{},size:{},bearing:{},pitch:{},fov:{},zoom:{},center:{},unmodified:{},x:{},y:{},point:{}};prototypeAccessors.minZoom.get=function(){return this._minZoom},prototypeAccessors.minZoom.set=function(t){this._minZoom!==t&&(this._minZoom=t,this.zoom=Math.max(this.zoom,t))},prototypeAccessors.maxZoom.get=function(){return this._maxZoom},prototypeAccessors.maxZoom.set=function(t){this._maxZoom!==t&&(this._maxZoom=t,this.zoom=Math.min(this.zoom,t))},prototypeAccessors.worldSize.get=function(){return this.tileSize*this.scale},prototypeAccessors.centerPoint.get=function(){return this.size._div(2)},prototypeAccessors.size.get=function(){return new Point(this.width,this.height)},prototypeAccessors.bearing.get=function(){return-this.angle/Math.PI*180},prototypeAccessors.bearing.set=function(t){var i=-util.wrap(t,-180,180)*Math.PI/180;this.angle!==i&&(this._unmodified=!1,this.angle=i,this._calcMatrices(),this.rotationMatrix=mat2.create(),mat2.rotate(this.rotationMatrix,this.rotationMatrix,this.angle))},prototypeAccessors.pitch.get=function(){return this._pitch/Math.PI*180},prototypeAccessors.pitch.set=function(t){var i=util.clamp(t,0,60)/180*Math.PI;this._pitch!==i&&(this._unmodified=!1,this._pitch=i,this._calcMatrices())},prototypeAccessors.fov.get=function(){return this._fov/Math.PI*180},prototypeAccessors.fov.set=function(t){t=Math.max(.01,Math.min(60,t)),this._fov!==t&&(this._unmodified=!1,this._fov=t/180*Math.PI,this._calcMatrices())},prototypeAccessors.zoom.get=function(){return this._zoom},prototypeAccessors.zoom.set=function(t){var i=Math.min(Math.max(t,this.minZoom),this.maxZoom);this._zoom!==i&&(this._unmodified=!1,this._zoom=i,this.scale=this.zoomScale(i),this.tileZoom=Math.floor(i),this.zoomFraction=i-this.tileZoom,this._constrain(),this._calcMatrices())},prototypeAccessors.center.get=function(){return this._center},prototypeAccessors.center.set=function(t){t.lat===this._center.lat&&t.lng===this._center.lng||(this._unmodified=!1,this._center=t,this._constrain(),this._calcMatrices())},Transform.prototype.coveringZoomLevel=function(t){return(t.roundZoom?Math.round:Math.floor)(this.zoom+this.scaleZoom(this.tileSize/t.tileSize))},Transform.prototype.coveringTiles=function(t){var i=this.coveringZoomLevel(t),o=i;if(it.maxzoom&&(i=t.maxzoom);var e=this.pointCoordinate(this.centerPoint,i),r=new Point(e.column-.5,e.row-.5),n=[this.pointCoordinate(new Point(0,0),i),this.pointCoordinate(new Point(this.width,0),i),this.pointCoordinate(new Point(this.width,this.height),i),this.pointCoordinate(new Point(0,this.height),i)];return TileCoord.cover(i,n,t.reparseOverscaled?o:i,this._renderWorldCopies).sort(function(t,i){return r.dist(t)-r.dist(i)})},Transform.prototype.resize=function(t,i){this.width=t,this.height=i,this.pixelsToGLUnits=[2/t,-2/i],this._constrain(),this._calcMatrices()},prototypeAccessors.unmodified.get=function(){return this._unmodified},Transform.prototype.zoomScale=function(t){return Math.pow(2,t)},Transform.prototype.scaleZoom=function(t){return Math.log(t)/Math.LN2},Transform.prototype.project=function(t){return new Point(this.lngX(t.lng),this.latY(t.lat))},Transform.prototype.unproject=function(t){return new LngLat(this.xLng(t.x),this.yLat(t.y))},prototypeAccessors.x.get=function(){return this.lngX(this.center.lng)},prototypeAccessors.y.get=function(){return this.latY(this.center.lat)},prototypeAccessors.point.get=function(){return new Point(this.x,this.y)},Transform.prototype.lngX=function(t){return(180+t)*this.worldSize/360},Transform.prototype.latY=function(t){var i=180/Math.PI*Math.log(Math.tan(Math.PI/4+t*Math.PI/360));return(180-i)*this.worldSize/360},Transform.prototype.xLng=function(t){return 360*t/this.worldSize-180},Transform.prototype.yLat=function(t){var i=180-360*t/this.worldSize;return 360/Math.PI*Math.atan(Math.exp(i*Math.PI/180))-90},Transform.prototype.setLocationAtPoint=function(t,i){var o=this.pointCoordinate(i)._sub(this.pointCoordinate(this.centerPoint));this.center=this.coordinateLocation(this.locationCoordinate(t)._sub(o))},Transform.prototype.locationPoint=function(t){return this.coordinatePoint(this.locationCoordinate(t))},Transform.prototype.pointLocation=function(t){return this.coordinateLocation(this.pointCoordinate(t))},Transform.prototype.locationCoordinate=function(t){return new Coordinate(this.lngX(t.lng)/this.tileSize,this.latY(t.lat)/this.tileSize,this.zoom).zoomTo(this.tileZoom)},Transform.prototype.coordinateLocation=function(t){var i=t.zoomTo(this.zoom);return new LngLat(this.xLng(i.column*this.tileSize),this.yLat(i.row*this.tileSize))},Transform.prototype.pointCoordinate=function(t,i){void 0===i&&(i=this.tileZoom);var o=0,e=[t.x,t.y,0,1],r=[t.x,t.y,1,1];vec4.transformMat4(e,e,this.pixelMatrixInverse),vec4.transformMat4(r,r,this.pixelMatrixInverse);var n=e[3],s=r[3],a=e[0]/n,h=r[0]/s,c=e[1]/n,m=r[1]/s,p=e[2]/n,l=r[2]/s,u=p===l?0:(o-p)/(l-p);return new Coordinate(interp(a,h,u)/this.tileSize,interp(c,m,u)/this.tileSize,this.zoom)._zoomTo(i)},Transform.prototype.coordinatePoint=function(t){var i=t.zoomTo(this.zoom),o=[i.column*this.tileSize,i.row*this.tileSize,0,1];return vec4.transformMat4(o,o,this.pixelMatrix),new Point(o[0]/o[3],o[1]/o[3])},Transform.prototype.calculatePosMatrix=function(t,i){var o=t.toCoordinate(i),e=this.worldSize/this.zoomScale(o.zoom),r=mat4.identity(new Float64Array(16));return mat4.translate(r,r,[o.column*e,o.row*e,0]),mat4.scale(r,r,[e/EXTENT,e/EXTENT,1]),mat4.multiply(r,this.projMatrix,r),new Float32Array(r)},Transform.prototype._constrain=function(){if(this.center&&this.width&&this.height&&!this._constraining){this._constraining=!0;var t,i,o,e,r,n,s,a,h=this.size,c=this._unmodified;this.latRange&&(t=this.latY(this.latRange[1]),i=this.latY(this.latRange[0]),r=i-ti&&(a=i-l)}if(this.lngRange){var u=this.x,f=h.x/2;u-fe&&(s=e-f)}void 0===s&&void 0===a||(this.center=this.unproject(new Point(void 0!==s?s:this.x,void 0!==a?a:this.y))),this._unmodified=c,this._constraining=!1}},Transform.prototype._calcMatrices=function(){if(this.height){this.cameraToCenterDistance=.5/Math.tan(this._fov/2)*this.height;var t=this._fov/2,i=Math.PI/2+this._pitch,o=Math.sin(t)*this.cameraToCenterDistance/Math.sin(Math.PI-i-t),e=Math.cos(Math.PI/2-this._pitch)*o+this.cameraToCenterDistance,r=1.01*e,n=new Float64Array(16);mat4.perspective(n,this._fov,this.width/this.height,1,r),mat4.scale(n,n,[1,-1,1]),mat4.translate(n,n,[0,0,-this.cameraToCenterDistance]),mat4.rotateX(n,n,this._pitch),mat4.rotateZ(n,n,this.angle),mat4.translate(n,n,[-this.x,-this.y,0]);var s=this.worldSize/(2*Math.PI*6378137*Math.abs(Math.cos(this.center.lat*(Math.PI/180))));if(mat4.scale(n,n,[1,1,s,1]),this.projMatrix=n,n=mat4.create(),mat4.scale(n,n,[this.width/2,-this.height/2,1]),mat4.translate(n,n,[1,-1,0]),this.pixelMatrix=mat4.multiply(new Float64Array(16),n,this.projMatrix),n=mat4.invert(new Float64Array(16),this.pixelMatrix),!n)throw new Error("failed to invert matrix");this.pixelMatrixInverse=n}},Object.defineProperties(Transform.prototype,prototypeAccessors),module.exports=Transform; +},{"../data/extent":11,"../source/tile_coord":53,"../util/interpolate":121,"../util/util":129,"./coordinate":18,"./lng_lat":19,"@mapbox/gl-matrix":133,"point-geometry":197}],22:[function(require,module,exports){ +"use strict";var WorkerPool=require("./util/worker_pool"),globalWorkerPool;module.exports=function(){return globalWorkerPool||(globalWorkerPool=new WorkerPool),globalWorkerPool}; +},{"./util/worker_pool":132}],23:[function(require,module,exports){ +"use strict";var simplexFont={" ":[16,[]],"!":[10,[5,21,5,7,-1,-1,5,2,4,1,5,0,6,1,5,2]],'"':[16,[4,21,4,14,-1,-1,12,21,12,14]],"#":[21,[11,25,4,-7,-1,-1,17,25,10,-7,-1,-1,4,12,18,12,-1,-1,3,6,17,6]],$:[20,[8,25,8,-4,-1,-1,12,25,12,-4,-1,-1,17,18,15,20,12,21,8,21,5,20,3,18,3,16,4,14,5,13,7,12,13,10,15,9,16,8,17,6,17,3,15,1,12,0,8,0,5,1,3,3]],"%":[24,[21,21,3,0,-1,-1,8,21,10,19,10,17,9,15,7,14,5,14,3,16,3,18,4,20,6,21,8,21,10,20,13,19,16,19,19,20,21,21,-1,-1,17,7,15,6,14,4,14,2,16,0,18,0,20,1,21,3,21,5,19,7,17,7]],"&":[26,[23,12,23,13,22,14,21,14,20,13,19,11,17,6,15,3,13,1,11,0,7,0,5,1,4,2,3,4,3,6,4,8,5,9,12,13,13,14,14,16,14,18,13,20,11,21,9,20,8,18,8,16,9,13,11,10,16,3,18,1,20,0,22,0,23,1,23,2]],"'":[10,[5,19,4,20,5,21,6,20,6,18,5,16,4,15]],"(":[14,[11,25,9,23,7,20,5,16,4,11,4,7,5,2,7,-2,9,-5,11,-7]],")":[14,[3,25,5,23,7,20,9,16,10,11,10,7,9,2,7,-2,5,-5,3,-7]],"*":[16,[8,21,8,9,-1,-1,3,18,13,12,-1,-1,13,18,3,12]],"+":[26,[13,18,13,0,-1,-1,4,9,22,9]],",":[10,[6,1,5,0,4,1,5,2,6,1,6,-1,5,-3,4,-4]],"-":[26,[4,9,22,9]],".":[10,[5,2,4,1,5,0,6,1,5,2]],"/":[22,[20,25,2,-7]],0:[20,[9,21,6,20,4,17,3,12,3,9,4,4,6,1,9,0,11,0,14,1,16,4,17,9,17,12,16,17,14,20,11,21,9,21]],1:[20,[6,17,8,18,11,21,11,0]],2:[20,[4,16,4,17,5,19,6,20,8,21,12,21,14,20,15,19,16,17,16,15,15,13,13,10,3,0,17,0]],3:[20,[5,21,16,21,10,13,13,13,15,12,16,11,17,8,17,6,16,3,14,1,11,0,8,0,5,1,4,2,3,4]],4:[20,[13,21,3,7,18,7,-1,-1,13,21,13,0]],5:[20,[15,21,5,21,4,12,5,13,8,14,11,14,14,13,16,11,17,8,17,6,16,3,14,1,11,0,8,0,5,1,4,2,3,4]],6:[20,[16,18,15,20,12,21,10,21,7,20,5,17,4,12,4,7,5,3,7,1,10,0,11,0,14,1,16,3,17,6,17,7,16,10,14,12,11,13,10,13,7,12,5,10,4,7]],7:[20,[17,21,7,0,-1,-1,3,21,17,21]],8:[20,[8,21,5,20,4,18,4,16,5,14,7,13,11,12,14,11,16,9,17,7,17,4,16,2,15,1,12,0,8,0,5,1,4,2,3,4,3,7,4,9,6,11,9,12,13,13,15,14,16,16,16,18,15,20,12,21,8,21]],9:[20,[16,14,15,11,13,9,10,8,9,8,6,9,4,11,3,14,3,15,4,18,6,20,9,21,10,21,13,20,15,18,16,14,16,9,15,4,13,1,10,0,8,0,5,1,4,3]],":":[10,[5,14,4,13,5,12,6,13,5,14,-1,-1,5,2,4,1,5,0,6,1,5,2]],";":[10,[5,14,4,13,5,12,6,13,5,14,-1,-1,6,1,5,0,4,1,5,2,6,1,6,-1,5,-3,4,-4]],"<":[24,[20,18,4,9,20,0]],"=":[26,[4,12,22,12,-1,-1,4,6,22,6]],">":[24,[4,18,20,9,4,0]],"?":[18,[3,16,3,17,4,19,5,20,7,21,11,21,13,20,14,19,15,17,15,15,14,13,13,12,9,10,9,7,-1,-1,9,2,8,1,9,0,10,1,9,2]],"@":[27,[18,13,17,15,15,16,12,16,10,15,9,14,8,11,8,8,9,6,11,5,14,5,16,6,17,8,-1,-1,12,16,10,14,9,11,9,8,10,6,11,5,-1,-1,18,16,17,8,17,6,19,5,21,5,23,7,24,10,24,12,23,15,22,17,20,19,18,20,15,21,12,21,9,20,7,19,5,17,4,15,3,12,3,9,4,6,5,4,7,2,9,1,12,0,15,0,18,1,20,2,21,3,-1,-1,19,16,18,8,18,6,19,5]],A:[18,[9,21,1,0,-1,-1,9,21,17,0,-1,-1,4,7,14,7]],B:[21,[4,21,4,0,-1,-1,4,21,13,21,16,20,17,19,18,17,18,15,17,13,16,12,13,11,-1,-1,4,11,13,11,16,10,17,9,18,7,18,4,17,2,16,1,13,0,4,0]],C:[21,[18,16,17,18,15,20,13,21,9,21,7,20,5,18,4,16,3,13,3,8,4,5,5,3,7,1,9,0,13,0,15,1,17,3,18,5]],D:[21,[4,21,4,0,-1,-1,4,21,11,21,14,20,16,18,17,16,18,13,18,8,17,5,16,3,14,1,11,0,4,0]],E:[19,[4,21,4,0,-1,-1,4,21,17,21,-1,-1,4,11,12,11,-1,-1,4,0,17,0]],F:[18,[4,21,4,0,-1,-1,4,21,17,21,-1,-1,4,11,12,11]],G:[21,[18,16,17,18,15,20,13,21,9,21,7,20,5,18,4,16,3,13,3,8,4,5,5,3,7,1,9,0,13,0,15,1,17,3,18,5,18,8,-1,-1,13,8,18,8]],H:[22,[4,21,4,0,-1,-1,18,21,18,0,-1,-1,4,11,18,11]],I:[8,[4,21,4,0]],J:[16,[12,21,12,5,11,2,10,1,8,0,6,0,4,1,3,2,2,5,2,7]],K:[21,[4,21,4,0,-1,-1,18,21,4,7,-1,-1,9,12,18,0]],L:[17,[4,21,4,0,-1,-1,4,0,16,0]],M:[24,[4,21,4,0,-1,-1,4,21,12,0,-1,-1,20,21,12,0,-1,-1,20,21,20,0]],N:[22,[4,21,4,0,-1,-1,4,21,18,0,-1,-1,18,21,18,0]],O:[22,[9,21,7,20,5,18,4,16,3,13,3,8,4,5,5,3,7,1,9,0,13,0,15,1,17,3,18,5,19,8,19,13,18,16,17,18,15,20,13,21,9,21]],P:[21,[4,21,4,0,-1,-1,4,21,13,21,16,20,17,19,18,17,18,14,17,12,16,11,13,10,4,10]],Q:[22,[9,21,7,20,5,18,4,16,3,13,3,8,4,5,5,3,7,1,9,0,13,0,15,1,17,3,18,5,19,8,19,13,18,16,17,18,15,20,13,21,9,21,-1,-1,12,4,18,-2]],R:[21,[4,21,4,0,-1,-1,4,21,13,21,16,20,17,19,18,17,18,15,17,13,16,12,13,11,4,11,-1,-1,11,11,18,0]],S:[20,[17,18,15,20,12,21,8,21,5,20,3,18,3,16,4,14,5,13,7,12,13,10,15,9,16,8,17,6,17,3,15,1,12,0,8,0,5,1,3,3]],T:[16,[8,21,8,0,-1,-1,1,21,15,21]],U:[22,[4,21,4,6,5,3,7,1,10,0,12,0,15,1,17,3,18,6,18,21]],V:[18,[1,21,9,0,-1,-1,17,21,9,0]],W:[24,[2,21,7,0,-1,-1,12,21,7,0,-1,-1,12,21,17,0,-1,-1,22,21,17,0]],X:[20,[3,21,17,0,-1,-1,17,21,3,0]],Y:[18,[1,21,9,11,9,0,-1,-1,17,21,9,11]],Z:[20,[17,21,3,0,-1,-1,3,21,17,21,-1,-1,3,0,17,0]],"[":[14,[4,25,4,-7,-1,-1,5,25,5,-7,-1,-1,4,25,11,25,-1,-1,4,-7,11,-7]],"\\":[14,[0,21,14,-3]],"]":[14,[9,25,9,-7,-1,-1,10,25,10,-7,-1,-1,3,25,10,25,-1,-1,3,-7,10,-7]],"^":[16,[6,15,8,18,10,15,-1,-1,3,12,8,17,13,12,-1,-1,8,17,8,0]],_:[16,[0,-2,16,-2]],"`":[10,[6,21,5,20,4,18,4,16,5,15,6,16,5,17]],a:[19,[15,14,15,0,-1,-1,15,11,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3]],b:[19,[4,21,4,0,-1,-1,4,11,6,13,8,14,11,14,13,13,15,11,16,8,16,6,15,3,13,1,11,0,8,0,6,1,4,3]],c:[18,[15,11,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3]],d:[19,[15,21,15,0,-1,-1,15,11,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3]],e:[18,[3,8,15,8,15,10,14,12,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3]],f:[12,[10,21,8,21,6,20,5,17,5,0,-1,-1,2,14,9,14]],g:[19,[15,14,15,-2,14,-5,13,-6,11,-7,8,-7,6,-6,-1,-1,15,11,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3]],h:[19,[4,21,4,0,-1,-1,4,10,7,13,9,14,12,14,14,13,15,10,15,0]],i:[8,[3,21,4,20,5,21,4,22,3,21,-1,-1,4,14,4,0]],j:[10,[5,21,6,20,7,21,6,22,5,21,-1,-1,6,14,6,-3,5,-6,3,-7,1,-7]],k:[17,[4,21,4,0,-1,-1,14,14,4,4,-1,-1,8,8,15,0]],l:[8,[4,21,4,0]],m:[30,[4,14,4,0,-1,-1,4,10,7,13,9,14,12,14,14,13,15,10,15,0,-1,-1,15,10,18,13,20,14,23,14,25,13,26,10,26,0]],n:[19,[4,14,4,0,-1,-1,4,10,7,13,9,14,12,14,14,13,15,10,15,0]],o:[19,[8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3,16,6,16,8,15,11,13,13,11,14,8,14]],p:[19,[4,14,4,-7,-1,-1,4,11,6,13,8,14,11,14,13,13,15,11,16,8,16,6,15,3,13,1,11,0,8,0,6,1,4,3]],q:[19,[15,14,15,-7,-1,-1,15,11,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3]],r:[13,[4,14,4,0,-1,-1,4,8,5,11,7,13,9,14,12,14]],s:[17,[14,11,13,13,10,14,7,14,4,13,3,11,4,9,6,8,11,7,13,6,14,4,14,3,13,1,10,0,7,0,4,1,3,3]],t:[12,[5,21,5,4,6,1,8,0,10,0,-1,-1,2,14,9,14]],u:[19,[4,14,4,4,5,1,7,0,10,0,12,1,15,4,-1,-1,15,14,15,0]],v:[16,[2,14,8,0,-1,-1,14,14,8,0]],w:[22,[3,14,7,0,-1,-1,11,14,7,0,-1,-1,11,14,15,0,-1,-1,19,14,15,0]],x:[17,[3,14,14,0,-1,-1,14,14,3,0]],y:[16,[2,14,8,0,-1,-1,14,14,8,0,6,-4,4,-6,2,-7,1,-7]],z:[17,[14,14,3,0,-1,-1,3,14,14,14,-1,-1,3,0,14,0]],"{":[14,[9,25,7,24,6,23,5,21,5,19,6,17,7,16,8,14,8,12,6,10,-1,-1,7,24,6,22,6,20,7,18,8,17,9,15,9,13,8,11,4,9,8,7,9,5,9,3,8,1,7,0,6,-2,6,-4,7,-6,-1,-1,6,8,8,6,8,4,7,2,6,1,5,-1,5,-3,6,-5,7,-6,9,-7]],"|":[8,[4,25,4,-7]],"}":[14,[5,25,7,24,8,23,9,21,9,19,8,17,7,16,6,14,6,12,8,10,-1,-1,7,24,8,22,8,20,7,18,6,17,5,15,5,13,6,11,10,9,6,7,5,5,5,3,6,1,7,0,8,-2,8,-4,7,-6,-1,-1,8,8,6,6,6,4,7,2,8,1,9,-1,9,-3,8,-5,7,-6,5,-7]],"~":[24,[3,6,3,8,4,11,6,12,8,12,10,11,14,8,16,7,18,7,20,8,21,10,-1,-1,3,8,4,10,6,11,8,11,10,10,14,7,16,6,18,6,20,7,21,10,21,12]]};module.exports=function(l,n,t,e){e=e||1;var r,o,u,s,i,x,f,p,h=[];for(r=0,o=l.length;r0?1/(1-r):1+r}function saturationFactor(r){return r>0?1-1/(1.001-r):-r}function getFadeValues(r,t,a,e){var i=a.paint["raster-fade-duration"];if(r.sourceCache&&i>0){var o=Date.now(),n=(o-r.timeAdded)/i,u=t?(o-t.timeAdded)/i:-1,s=r.sourceCache.getSource(),c=e.coveringZoomLevel({tileSize:s.tileSize,roundZoom:s.roundZoom}),f=!t||Math.abs(t.coord.z-c)>Math.abs(r.coord.z-c),d=util.clamp(f?n:1-u,0,1);return t?{opacity:1,mix:1-d}:{opacity:d,mix:0}}return{opacity:1,mix:0}}var util=require("../util/util");module.exports=drawRaster; +},{"../util/util":129}],33:[function(require,module,exports){ +"use strict";function drawSymbols(t,e,i,a){if(!t.isOpaquePass){var o=!(i.layout["text-allow-overlap"]||i.layout["icon-allow-overlap"]||i.layout["text-ignore-placement"]||i.layout["icon-ignore-placement"]),r=t.gl;o?r.disable(r.STENCIL_TEST):r.enable(r.STENCIL_TEST),t.setDepthSublayer(0),t.depthMask(!1),drawLayerSymbols(t,e,i,a,!1,i.paint["icon-translate"],i.paint["icon-translate-anchor"],i.layout["icon-rotation-alignment"],i.layout["icon-rotation-alignment"],i.layout["icon-size"],i.paint["icon-halo-width"],i.paint["icon-halo-color"],i.paint["icon-halo-blur"],i.paint["icon-opacity"],i.paint["icon-color"]),drawLayerSymbols(t,e,i,a,!0,i.paint["text-translate"],i.paint["text-translate-anchor"],i.layout["text-rotation-alignment"],i.layout["text-pitch-alignment"],i.layout["text-size"],i.paint["text-halo-width"],i.paint["text-halo-color"],i.paint["text-halo-blur"],i.paint["text-opacity"],i.paint["text-color"]),e.map.showCollisionBoxes&&drawCollisionDebug(t,e,i,a)}}function drawLayerSymbols(t,e,i,a,o,r,n,l,s,u,f,m,c,p,d){if(o||!t.style.sprite||t.style.sprite.loaded()){var h=t.gl,b="map"===l,x="map"===s,g=x;g?h.enable(h.DEPTH_TEST):h.disable(h.DEPTH_TEST);for(var _,y,T=0,v=a;Tthis.previousZoom;a--)r.changeTimes[a]=e,r.changeOpacities[a]=r.opacities[a];for(a=0;a<256;a++){var s=e-r.changeTimes[a],o=255*(i?s/i:1);a<=t?r.opacities[a]=r.changeOpacities[a]+o:r.opacities[a]=r.changeOpacities[a]-o}this.changed=!0,this.previousZoom=t},FrameHistory.prototype.bind=function(e){this.texture?(e.bindTexture(e.TEXTURE_2D,this.texture),this.changed&&(e.texSubImage2D(e.TEXTURE_2D,0,0,0,256,1,e.ALPHA,e.UNSIGNED_BYTE,this.array),this.changed=!1)):(this.texture=e.createTexture(),e.bindTexture(e.TEXTURE_2D,this.texture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST),e.texImage2D(e.TEXTURE_2D,0,e.ALPHA,256,1,0,e.ALPHA,e.UNSIGNED_BYTE,this.array))},module.exports=FrameHistory; +},{}],35:[function(require,module,exports){ +"use strict";var util=require("../util/util"),LineAtlas=function(t,i){this.width=t,this.height=i,this.nextRow=0,this.bytes=4,this.data=new Uint8Array(this.width*this.height*this.bytes),this.positions={}};LineAtlas.prototype.setSprite=function(t){this.sprite=t},LineAtlas.prototype.getDash=function(t,i){var e=t.join(",")+i;return this.positions[e]||(this.positions[e]=this.addDash(t,i)),this.positions[e]},LineAtlas.prototype.addDash=function(t,i){var e=this,h=i?7:0,s=2*h+1,a=128;if(this.nextRow+s>this.height)return util.warnOnce("LineAtlas out of space"),null;for(var r=0,n=0;n0?r.pop():null},Painter.prototype.getViewportTexture=function(e,r){var t=this.reusableTextures.viewport;if(t)return t.width===e&&t.height===r?t:(this.gl.deleteTexture(t),void(this.reusableTextures.viewport=null))},Painter.prototype.lineWidth=function(e){this.gl.lineWidth(util.clamp(e,this.lineWidthRange[0],this.lineWidthRange[1]))},Painter.prototype.showOverdrawInspector=function(e){if(e||this._showOverdrawInspector){this._showOverdrawInspector=e;var r=this.gl;if(e){r.blendFunc(r.CONSTANT_COLOR,r.ONE);var t=8,i=1/t;r.blendColor(i,i,i,0),r.clearColor(0,0,0,1),r.clear(r.COLOR_BUFFER_BIT)}else r.blendFunc(r.ONE,r.ONE_MINUS_SRC_ALPHA)}},Painter.prototype.createProgram=function(e,r){var t=this.gl,i=t.createProgram(),a=shaders[e],s="#define MAPBOX_GL_JS\n#define DEVICE_PIXEL_RATIO "+browser.devicePixelRatio.toFixed(1)+"\n";this._showOverdrawInspector&&(s+="#define OVERDRAW_INSPECTOR;\n");var o=t.createShader(t.FRAGMENT_SHADER);t.shaderSource(o,r.applyPragmas(s+shaders.prelude.fragmentSource+a.fragmentSource,"fragment")),t.compileShader(o),t.attachShader(i,o);var n=t.createShader(t.VERTEX_SHADER);t.shaderSource(n,r.applyPragmas(s+shaders.prelude.vertexSource+a.vertexSource,"vertex")),t.compileShader(n),t.attachShader(i,n),t.linkProgram(i);for(var l=t.getProgramParameter(i,t.ACTIVE_ATTRIBUTES),h={program:i,numAttributes:l},u=0;u>16,n>>16),o.uniform2f(i.u_pixel_coord_lower,65535&u,65535&n)}; +},{"../source/pixels_to_tile_units":46}],38:[function(require,module,exports){ +"use strict";var path=require("path");module.exports={prelude:{fragmentSource:"#ifdef GL_ES\nprecision mediump float;\n#else\n\n#if !defined(lowp)\n#define lowp\n#endif\n\n#if !defined(mediump)\n#define mediump\n#endif\n\n#if !defined(highp)\n#define highp\n#endif\n\n#endif\n",vertexSource:"#ifdef GL_ES\nprecision highp float;\n#else\n\n#if !defined(lowp)\n#define lowp\n#endif\n\n#if !defined(mediump)\n#define mediump\n#endif\n\n#if !defined(highp)\n#define highp\n#endif\n\n#endif\n\nfloat evaluate_zoom_function_1(const vec4 values, const float t) {\n if (t < 1.0) {\n return mix(values[0], values[1], t);\n } else if (t < 2.0) {\n return mix(values[1], values[2], t - 1.0);\n } else {\n return mix(values[2], values[3], t - 2.0);\n }\n}\nvec4 evaluate_zoom_function_4(const vec4 value0, const vec4 value1, const vec4 value2, const vec4 value3, const float t) {\n if (t < 1.0) {\n return mix(value0, value1, t);\n } else if (t < 2.0) {\n return mix(value1, value2, t - 1.0);\n } else {\n return mix(value2, value3, t - 2.0);\n }\n}\n\n// The offset depends on how many pixels are between the world origin and the edge of the tile:\n// vec2 offset = mod(pixel_coord, size)\n//\n// At high zoom levels there are a ton of pixels between the world origin and the edge of the tile.\n// The glsl spec only guarantees 16 bits of precision for highp floats. We need more than that.\n//\n// The pixel_coord is passed in as two 16 bit values:\n// pixel_coord_upper = floor(pixel_coord / 2^16)\n// pixel_coord_lower = mod(pixel_coord, 2^16)\n//\n// The offset is calculated in a series of steps that should preserve this precision:\nvec2 get_pattern_pos(const vec2 pixel_coord_upper, const vec2 pixel_coord_lower,\n const vec2 pattern_size, const float tile_units_to_pixels, const vec2 pos) {\n\n vec2 offset = mod(mod(mod(pixel_coord_upper, pattern_size) * 256.0, pattern_size) * 256.0 + pixel_coord_lower, pattern_size);\n return (tile_units_to_pixels * pos + offset) / pattern_size;\n}\n"},circle:{fragmentSource:"#pragma mapbox: define lowp vec4 color\n#pragma mapbox: define mediump float radius\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp vec4 stroke_color\n#pragma mapbox: define mediump float stroke_width\n#pragma mapbox: define lowp float stroke_opacity\n\nvarying vec2 v_extrude;\nvarying lowp float v_antialiasblur;\n\nvoid main() {\n #pragma mapbox: initialize lowp vec4 color\n #pragma mapbox: initialize mediump float radius\n #pragma mapbox: initialize lowp float blur\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize lowp vec4 stroke_color\n #pragma mapbox: initialize mediump float stroke_width\n #pragma mapbox: initialize lowp float stroke_opacity\n\n float extrude_length = length(v_extrude);\n float antialiased_blur = -max(blur, v_antialiasblur);\n\n float opacity_t = smoothstep(0.0, antialiased_blur, extrude_length - 1.0);\n\n float color_t = stroke_width < 0.01 ? 0.0 : smoothstep(\n antialiased_blur,\n 0.0,\n extrude_length - radius / (radius + stroke_width)\n );\n\n gl_FragColor = opacity_t * mix(color * opacity, stroke_color * stroke_opacity, color_t);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n",vertexSource:"uniform mat4 u_matrix;\nuniform bool u_scale_with_map;\nuniform vec2 u_extrude_scale;\n\nattribute vec2 a_pos;\n\n#pragma mapbox: define lowp vec4 color\n#pragma mapbox: define mediump float radius\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp vec4 stroke_color\n#pragma mapbox: define mediump float stroke_width\n#pragma mapbox: define lowp float stroke_opacity\n\nvarying vec2 v_extrude;\nvarying lowp float v_antialiasblur;\n\nvoid main(void) {\n #pragma mapbox: initialize lowp vec4 color\n #pragma mapbox: initialize mediump float radius\n #pragma mapbox: initialize lowp float blur\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize lowp vec4 stroke_color\n #pragma mapbox: initialize mediump float stroke_width\n #pragma mapbox: initialize lowp float stroke_opacity\n\n // unencode the extrusion vector that we snuck into the a_pos vector\n v_extrude = vec2(mod(a_pos, 2.0) * 2.0 - 1.0);\n\n vec2 extrude = v_extrude * (radius + stroke_width) * u_extrude_scale;\n // multiply a_pos by 0.5, since we had it * 2 in order to sneak\n // in extrusion data\n gl_Position = u_matrix * vec4(floor(a_pos * 0.5), 0, 1);\n\n if (u_scale_with_map) {\n gl_Position.xy += extrude;\n } else {\n gl_Position.xy += extrude * gl_Position.w;\n }\n\n // This is a minimum blur distance that serves as a faux-antialiasing for\n // the circle. since blur is a ratio of the circle's size and the intent is\n // to keep the blur at roughly 1px, the two are inversely related.\n v_antialiasblur = 1.0 / DEVICE_PIXEL_RATIO / (radius + stroke_width);\n}\n"},collisionBox:{fragmentSource:"uniform float u_zoom;\nuniform float u_maxzoom;\n\nvarying float v_max_zoom;\nvarying float v_placement_zoom;\n\nvoid main() {\n\n float alpha = 0.5;\n\n gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0) * alpha;\n\n if (v_placement_zoom > u_zoom) {\n gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0) * alpha;\n }\n\n if (u_zoom >= v_max_zoom) {\n gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0) * alpha * 0.25;\n }\n\n if (v_placement_zoom >= u_maxzoom) {\n gl_FragColor = vec4(0.0, 0.0, 1.0, 1.0) * alpha * 0.2;\n }\n}\n",vertexSource:"attribute vec2 a_pos;\nattribute vec2 a_extrude;\nattribute vec2 a_data;\n\nuniform mat4 u_matrix;\nuniform float u_scale;\n\nvarying float v_max_zoom;\nvarying float v_placement_zoom;\n\nvoid main() {\n gl_Position = u_matrix * vec4(a_pos + a_extrude / u_scale, 0.0, 1.0);\n\n v_max_zoom = a_data.x;\n v_placement_zoom = a_data.y;\n}\n"},debug:{fragmentSource:"uniform lowp vec4 u_color;\n\nvoid main() {\n gl_FragColor = u_color;\n}\n",vertexSource:"attribute vec2 a_pos;\n\nuniform mat4 u_matrix;\n\nvoid main() {\n gl_Position = u_matrix * vec4(a_pos, step(32767.0, a_pos.x), 1);\n}\n"},fill:{fragmentSource:"#pragma mapbox: define lowp vec4 color\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize lowp vec4 color\n #pragma mapbox: initialize lowp float opacity\n\n gl_FragColor = color * opacity;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n",vertexSource:"attribute vec2 a_pos;\n\nuniform mat4 u_matrix;\n\n#pragma mapbox: define lowp vec4 color\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize lowp vec4 color\n #pragma mapbox: initialize lowp float opacity\n\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n}\n"},fillOutline:{fragmentSource:"#pragma mapbox: define lowp vec4 outline_color\n#pragma mapbox: define lowp float opacity\n\nvarying vec2 v_pos;\n\nvoid main() {\n #pragma mapbox: initialize lowp vec4 outline_color\n #pragma mapbox: initialize lowp float opacity\n\n float dist = length(v_pos - gl_FragCoord.xy);\n float alpha = smoothstep(1.0, 0.0, dist);\n gl_FragColor = outline_color * (alpha * opacity);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n",vertexSource:"attribute vec2 a_pos;\n\nuniform mat4 u_matrix;\nuniform vec2 u_world;\n\nvarying vec2 v_pos;\n\n#pragma mapbox: define lowp vec4 outline_color\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize lowp vec4 outline_color\n #pragma mapbox: initialize lowp float opacity\n\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n v_pos = (gl_Position.xy / gl_Position.w + 1.0) / 2.0 * u_world;\n}\n"},fillOutlinePattern:{fragmentSource:"uniform vec2 u_pattern_tl_a;\nuniform vec2 u_pattern_br_a;\nuniform vec2 u_pattern_tl_b;\nuniform vec2 u_pattern_br_b;\nuniform float u_mix;\n\nuniform sampler2D u_image;\n\nvarying vec2 v_pos_a;\nvarying vec2 v_pos_b;\nvarying vec2 v_pos;\n\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize lowp float opacity\n\n vec2 imagecoord = mod(v_pos_a, 1.0);\n vec2 pos = mix(u_pattern_tl_a, u_pattern_br_a, imagecoord);\n vec4 color1 = texture2D(u_image, pos);\n\n vec2 imagecoord_b = mod(v_pos_b, 1.0);\n vec2 pos2 = mix(u_pattern_tl_b, u_pattern_br_b, imagecoord_b);\n vec4 color2 = texture2D(u_image, pos2);\n\n // find distance to outline for alpha interpolation\n\n float dist = length(v_pos - gl_FragCoord.xy);\n float alpha = smoothstep(1.0, 0.0, dist);\n\n\n gl_FragColor = mix(color1, color2, u_mix) * alpha * opacity;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n",vertexSource:"uniform mat4 u_matrix;\nuniform vec2 u_world;\nuniform vec2 u_pattern_size_a;\nuniform vec2 u_pattern_size_b;\nuniform vec2 u_pixel_coord_upper;\nuniform vec2 u_pixel_coord_lower;\nuniform float u_scale_a;\nuniform float u_scale_b;\nuniform float u_tile_units_to_pixels;\n\nattribute vec2 a_pos;\n\nvarying vec2 v_pos_a;\nvarying vec2 v_pos_b;\nvarying vec2 v_pos;\n\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize lowp float opacity\n\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n\n v_pos_a = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, u_scale_a * u_pattern_size_a, u_tile_units_to_pixels, a_pos);\n v_pos_b = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, u_scale_b * u_pattern_size_b, u_tile_units_to_pixels, a_pos);\n\n v_pos = (gl_Position.xy / gl_Position.w + 1.0) / 2.0 * u_world;\n}\n"},fillPattern:{fragmentSource:"uniform vec2 u_pattern_tl_a;\nuniform vec2 u_pattern_br_a;\nuniform vec2 u_pattern_tl_b;\nuniform vec2 u_pattern_br_b;\nuniform float u_mix;\n\nuniform sampler2D u_image;\n\nvarying vec2 v_pos_a;\nvarying vec2 v_pos_b;\n\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize lowp float opacity\n\n vec2 imagecoord = mod(v_pos_a, 1.0);\n vec2 pos = mix(u_pattern_tl_a, u_pattern_br_a, imagecoord);\n vec4 color1 = texture2D(u_image, pos);\n\n vec2 imagecoord_b = mod(v_pos_b, 1.0);\n vec2 pos2 = mix(u_pattern_tl_b, u_pattern_br_b, imagecoord_b);\n vec4 color2 = texture2D(u_image, pos2);\n\n gl_FragColor = mix(color1, color2, u_mix) * opacity;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n",vertexSource:"uniform mat4 u_matrix;\nuniform vec2 u_pattern_size_a;\nuniform vec2 u_pattern_size_b;\nuniform vec2 u_pixel_coord_upper;\nuniform vec2 u_pixel_coord_lower;\nuniform float u_scale_a;\nuniform float u_scale_b;\nuniform float u_tile_units_to_pixels;\n\nattribute vec2 a_pos;\n\nvarying vec2 v_pos_a;\nvarying vec2 v_pos_b;\n\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize lowp float opacity\n\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n\n v_pos_a = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, u_scale_a * u_pattern_size_a, u_tile_units_to_pixels, a_pos);\n v_pos_b = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, u_scale_b * u_pattern_size_b, u_tile_units_to_pixels, a_pos);\n}\n"},fillExtrusion:{fragmentSource:"varying vec4 v_color;\n#pragma mapbox: define lowp float base\n#pragma mapbox: define lowp float height\n#pragma mapbox: define lowp vec4 color\n\nvoid main() {\n #pragma mapbox: initialize lowp float base\n #pragma mapbox: initialize lowp float height\n #pragma mapbox: initialize lowp vec4 color\n\n gl_FragColor = v_color;\n}\n",vertexSource:"uniform mat4 u_matrix;\nuniform vec3 u_lightcolor;\nuniform lowp vec3 u_lightpos;\nuniform lowp float u_lightintensity;\nuniform lowp vec4 u_outline_color;\n\nattribute vec2 a_pos;\nattribute vec3 a_normal;\nattribute float a_edgedistance;\n\nvarying vec4 v_color;\n\n#pragma mapbox: define lowp float base\n#pragma mapbox: define lowp float height\n\n#pragma mapbox: define lowp vec4 color\n\nvoid main() {\n #pragma mapbox: initialize lowp float base\n #pragma mapbox: initialize lowp float height\n #pragma mapbox: initialize lowp vec4 color\n\n float ed = a_edgedistance; // use each attrib in order to not trip a VAO assert\n float t = mod(a_normal.x, 2.0);\n\n gl_Position = u_matrix * vec4(a_pos, t > 0.0 ? height : base, 1);\n\n#ifdef OUTLINE\n color = u_outline_color;\n#endif\n\n // Relative luminance (how dark/bright is the surface color?)\n float colorvalue = color.r * 0.2126 + color.g * 0.7152 + color.b * 0.0722;\n\n v_color = vec4(0.0, 0.0, 0.0, 1.0);\n\n // Add slight ambient lighting so no extrusions are totally black\n vec4 ambientlight = vec4(0.03, 0.03, 0.03, 1.0);\n color += ambientlight;\n\n // Calculate cos(theta), where theta is the angle between surface normal and diffuse light ray\n float directional = clamp(dot(a_normal / 16384.0, u_lightpos), 0.0, 1.0);\n\n // Adjust directional so that\n // the range of values for highlight/shading is narrower\n // with lower light intensity\n // and with lighter/brighter surface colors\n directional = mix((1.0 - u_lightintensity), max((1.0 - colorvalue + u_lightintensity), 1.0), directional);\n\n // Add gradient along z axis of side surfaces\n if (a_normal.y != 0.0) {\n directional *= clamp((t + base) * pow(height / 150.0, 0.5), mix(0.7, 0.98, 1.0 - u_lightintensity), 1.0);\n }\n\n // Assign final color based on surface + ambient light color, diffuse light directional, and light color\n // with lower bounds adjusted to hue of light\n // so that shading is tinted with the complementary (opposite) color to the light color\n v_color.r += clamp(color.r * directional * u_lightcolor.r, mix(0.0, 0.3, 1.0 - u_lightcolor.r), 1.0);\n v_color.g += clamp(color.g * directional * u_lightcolor.g, mix(0.0, 0.3, 1.0 - u_lightcolor.g), 1.0);\n v_color.b += clamp(color.b * directional * u_lightcolor.b, mix(0.0, 0.3, 1.0 - u_lightcolor.b), 1.0);\n}\n"},fillExtrusionPattern:{fragmentSource:"uniform vec2 u_pattern_tl_a;\nuniform vec2 u_pattern_br_a;\nuniform vec2 u_pattern_tl_b;\nuniform vec2 u_pattern_br_b;\nuniform float u_mix;\n\nuniform sampler2D u_image;\n\nvarying vec2 v_pos_a;\nvarying vec2 v_pos_b;\nvarying vec4 v_lighting;\n\n#pragma mapbox: define lowp float base\n#pragma mapbox: define lowp float height\n\nvoid main() {\n #pragma mapbox: initialize lowp float base\n #pragma mapbox: initialize lowp float height\n\n vec2 imagecoord = mod(v_pos_a, 1.0);\n vec2 pos = mix(u_pattern_tl_a, u_pattern_br_a, imagecoord);\n vec4 color1 = texture2D(u_image, pos);\n\n vec2 imagecoord_b = mod(v_pos_b, 1.0);\n vec2 pos2 = mix(u_pattern_tl_b, u_pattern_br_b, imagecoord_b);\n vec4 color2 = texture2D(u_image, pos2);\n\n vec4 mixedColor = mix(color1, color2, u_mix);\n\n gl_FragColor = mixedColor * v_lighting;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n",vertexSource:"uniform mat4 u_matrix;\nuniform vec2 u_pattern_size_a;\nuniform vec2 u_pattern_size_b;\nuniform vec2 u_pixel_coord_upper;\nuniform vec2 u_pixel_coord_lower;\nuniform float u_scale_a;\nuniform float u_scale_b;\nuniform float u_tile_units_to_pixels;\nuniform float u_height_factor;\n\nuniform vec3 u_lightcolor;\nuniform lowp vec3 u_lightpos;\nuniform lowp float u_lightintensity;\n\nattribute vec2 a_pos;\nattribute vec3 a_normal;\nattribute float a_edgedistance;\n\nvarying vec2 v_pos_a;\nvarying vec2 v_pos_b;\nvarying vec4 v_lighting;\nvarying float v_directional;\n\n#pragma mapbox: define lowp float base\n#pragma mapbox: define lowp float height\n\nvoid main() {\n #pragma mapbox: initialize lowp float base\n #pragma mapbox: initialize lowp float height\n\n float t = mod(a_normal.x, 2.0);\n float z = t > 0.0 ? height : base;\n\n gl_Position = u_matrix * vec4(a_pos, z, 1);\n\n vec2 pos = a_normal.x == 1.0 && a_normal.y == 0.0 && a_normal.z == 16384.0\n ? a_pos // extrusion top\n : vec2(a_edgedistance, z * u_height_factor); // extrusion side\n\n v_pos_a = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, u_scale_a * u_pattern_size_a, u_tile_units_to_pixels, pos);\n v_pos_b = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, u_scale_b * u_pattern_size_b, u_tile_units_to_pixels, pos);\n\n v_lighting = vec4(0.0, 0.0, 0.0, 1.0);\n float directional = clamp(dot(a_normal / 16383.0, u_lightpos), 0.0, 1.0);\n directional = mix((1.0 - u_lightintensity), max((0.5 + u_lightintensity), 1.0), directional);\n\n if (a_normal.y != 0.0) {\n directional *= clamp((t + base) * pow(height / 150.0, 0.5), mix(0.7, 0.98, 1.0 - u_lightintensity), 1.0);\n }\n\n v_lighting.rgb += clamp(directional * u_lightcolor, mix(vec3(0.0), vec3(0.3), 1.0 - u_lightcolor), vec3(1.0));\n}\n"},extrusionTexture:{fragmentSource:"uniform sampler2D u_texture;\nuniform float u_opacity;\n\nvarying vec2 v_pos;\n\nvoid main() {\n gl_FragColor = texture2D(u_texture, v_pos) * u_opacity;\n}\n",vertexSource:"uniform mat4 u_matrix;\nuniform int u_xdim;\nuniform int u_ydim;\nattribute vec2 a_pos;\nvarying vec2 v_pos;\n\nvoid main() {\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n\n v_pos.x = a_pos.x / float(u_xdim);\n v_pos.y = 1.0 - a_pos.y / float(u_ydim);\n}\n"},line:{fragmentSource:"#pragma mapbox: define lowp vec4 color\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n\nvarying vec2 v_width2;\nvarying vec2 v_normal;\nvarying float v_gamma_scale;\n\nvoid main() {\n #pragma mapbox: initialize lowp vec4 color\n #pragma mapbox: initialize lowp float blur\n #pragma mapbox: initialize lowp float opacity\n\n // Calculate the distance of the pixel from the line in pixels.\n float dist = length(v_normal) * v_width2.s;\n\n // Calculate the antialiasing fade factor. This is either when fading in\n // the line in case of an offset line (v_width2.t) or when fading out\n // (v_width2.s)\n float blur2 = (blur + 1.0 / DEVICE_PIXEL_RATIO) * v_gamma_scale;\n float alpha = clamp(min(dist - (v_width2.t - blur2), v_width2.s - dist) / blur2, 0.0, 1.0);\n\n gl_FragColor = color * (alpha * opacity);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n",vertexSource:"\n\n// the distance over which the line edge fades out.\n// Retina devices need a smaller distance to avoid aliasing.\n#define ANTIALIASING 1.0 / DEVICE_PIXEL_RATIO / 2.0\n\n// floor(127 / 2) == 63.0\n// the maximum allowed miter limit is 2.0 at the moment. the extrude normal is\n// stored in a byte (-128..127). we scale regular normals up to length 63, but\n// there are also \"special\" normals that have a bigger length (of up to 126 in\n// this case).\n// #define scale 63.0\n#define scale 0.015873016\n\nattribute vec2 a_pos;\nattribute vec4 a_data;\n\nuniform mat4 u_matrix;\nuniform mediump float u_ratio;\nuniform mediump float u_width;\nuniform vec2 u_gl_units_to_pixels;\n\nvarying vec2 v_normal;\nvarying vec2 v_width2;\nvarying float v_gamma_scale;\n\n#pragma mapbox: define lowp vec4 color\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define mediump float gapwidth\n#pragma mapbox: define lowp float offset\n\nvoid main() {\n #pragma mapbox: initialize lowp vec4 color\n #pragma mapbox: initialize lowp float blur\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize mediump float gapwidth\n #pragma mapbox: initialize lowp float offset\n\n vec2 a_extrude = a_data.xy - 128.0;\n float a_direction = mod(a_data.z, 4.0) - 1.0;\n\n // We store the texture normals in the most insignificant bit\n // transform y so that 0 => -1 and 1 => 1\n // In the texture normal, x is 0 if the normal points straight up/down and 1 if it's a round cap\n // y is 1 if the normal points up, and -1 if it points down\n mediump vec2 normal = mod(a_pos, 2.0);\n normal.y = sign(normal.y - 0.5);\n v_normal = normal;\n\n\n // these transformations used to be applied in the JS and native code bases. \n // moved them into the shader for clarity and simplicity. \n gapwidth = gapwidth / 2.0;\n float width = u_width / 2.0;\n offset = -1.0 * offset; \n\n float inset = gapwidth + (gapwidth > 0.0 ? ANTIALIASING : 0.0);\n float outset = gapwidth + width * (gapwidth > 0.0 ? 2.0 : 1.0) + ANTIALIASING;\n\n // Scale the extrusion vector down to a normal and then up by the line width\n // of this vertex.\n mediump vec2 dist = outset * a_extrude * scale;\n\n // Calculate the offset when drawing a line that is to the side of the actual line.\n // We do this by creating a vector that points towards the extrude, but rotate\n // it when we're drawing round end points (a_direction = -1 or 1) since their\n // extrude vector points in another direction.\n mediump float u = 0.5 * a_direction;\n mediump float t = 1.0 - abs(u);\n mediump vec2 offset2 = offset * a_extrude * scale * normal.y * mat2(t, -u, u, t);\n\n // Remove the texture normal bit to get the position\n vec2 pos = floor(a_pos * 0.5);\n\n vec4 projected_extrude = u_matrix * vec4(dist / u_ratio, 0.0, 0.0);\n gl_Position = u_matrix * vec4(pos + offset2 / u_ratio, 0.0, 1.0) + projected_extrude;\n\n // calculate how much the perspective view squishes or stretches the extrude\n float extrude_length_without_perspective = length(dist);\n float extrude_length_with_perspective = length(projected_extrude.xy / gl_Position.w * u_gl_units_to_pixels);\n v_gamma_scale = extrude_length_without_perspective / extrude_length_with_perspective;\n\n v_width2 = vec2(outset, inset);\n}\n"},linePattern:{fragmentSource:"uniform vec2 u_pattern_size_a;\nuniform vec2 u_pattern_size_b;\nuniform vec2 u_pattern_tl_a;\nuniform vec2 u_pattern_br_a;\nuniform vec2 u_pattern_tl_b;\nuniform vec2 u_pattern_br_b;\nuniform float u_fade;\n\nuniform sampler2D u_image;\n\nvarying vec2 v_normal;\nvarying vec2 v_width2;\nvarying float v_linesofar;\nvarying float v_gamma_scale;\n\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize lowp float blur\n #pragma mapbox: initialize lowp float opacity\n\n // Calculate the distance of the pixel from the line in pixels.\n float dist = length(v_normal) * v_width2.s;\n\n // Calculate the antialiasing fade factor. This is either when fading in\n // the line in case of an offset line (v_width2.t) or when fading out\n // (v_width2.s)\n float blur2 = (blur + 1.0 / DEVICE_PIXEL_RATIO) * v_gamma_scale;\n float alpha = clamp(min(dist - (v_width2.t - blur2), v_width2.s - dist) / blur2, 0.0, 1.0);\n\n float x_a = mod(v_linesofar / u_pattern_size_a.x, 1.0);\n float x_b = mod(v_linesofar / u_pattern_size_b.x, 1.0);\n float y_a = 0.5 + (v_normal.y * v_width2.s / u_pattern_size_a.y);\n float y_b = 0.5 + (v_normal.y * v_width2.s / u_pattern_size_b.y);\n vec2 pos_a = mix(u_pattern_tl_a, u_pattern_br_a, vec2(x_a, y_a));\n vec2 pos_b = mix(u_pattern_tl_b, u_pattern_br_b, vec2(x_b, y_b));\n\n vec4 color = mix(texture2D(u_image, pos_a), texture2D(u_image, pos_b), u_fade);\n\n gl_FragColor = color * alpha * opacity;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n",vertexSource:"// floor(127 / 2) == 63.0\n// the maximum allowed miter limit is 2.0 at the moment. the extrude normal is\n// stored in a byte (-128..127). we scale regular normals up to length 63, but\n// there are also \"special\" normals that have a bigger length (of up to 126 in\n// this case).\n// #define scale 63.0\n#define scale 0.015873016\n\n// We scale the distance before adding it to the buffers so that we can store\n// long distances for long segments. Use this value to unscale the distance.\n#define LINE_DISTANCE_SCALE 2.0\n\n// the distance over which the line edge fades out.\n// Retina devices need a smaller distance to avoid aliasing.\n#define ANTIALIASING 1.0 / DEVICE_PIXEL_RATIO / 2.0\n\nattribute vec2 a_pos;\nattribute vec4 a_data;\n\nuniform mat4 u_matrix;\nuniform mediump float u_ratio;\nuniform mediump float u_width;\nuniform vec2 u_gl_units_to_pixels;\n\nvarying vec2 v_normal;\nvarying vec2 v_width2;\nvarying float v_linesofar;\nvarying float v_gamma_scale;\n\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp float offset\n#pragma mapbox: define mediump float gapwidth\n\nvoid main() {\n #pragma mapbox: initialize lowp float blur\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize lowp float offset\n #pragma mapbox: initialize mediump float gapwidth\n\n vec2 a_extrude = a_data.xy - 128.0;\n float a_direction = mod(a_data.z, 4.0) - 1.0;\n float a_linesofar = (floor(a_data.z / 4.0) + a_data.w * 64.0) * LINE_DISTANCE_SCALE;\n\n // We store the texture normals in the most insignificant bit\n // transform y so that 0 => -1 and 1 => 1\n // In the texture normal, x is 0 if the normal points straight up/down and 1 if it's a round cap\n // y is 1 if the normal points up, and -1 if it points down\n mediump vec2 normal = mod(a_pos, 2.0);\n normal.y = sign(normal.y - 0.5);\n v_normal = normal;\n\n // these transformations used to be applied in the JS and native code bases. \n // moved them into the shader for clarity and simplicity. \n gapwidth = gapwidth / 2.0;\n float width = u_width / 2.0;\n offset = -1.0 * offset; \n\n float inset = gapwidth + (gapwidth > 0.0 ? ANTIALIASING : 0.0);\n float outset = gapwidth + width * (gapwidth > 0.0 ? 2.0 : 1.0) + ANTIALIASING;\n\n // Scale the extrusion vector down to a normal and then up by the line width\n // of this vertex.\n mediump vec2 dist = outset * a_extrude * scale;\n\n // Calculate the offset when drawing a line that is to the side of the actual line.\n // We do this by creating a vector that points towards the extrude, but rotate\n // it when we're drawing round end points (a_direction = -1 or 1) since their\n // extrude vector points in another direction.\n mediump float u = 0.5 * a_direction;\n mediump float t = 1.0 - abs(u);\n mediump vec2 offset2 = offset * a_extrude * scale * normal.y * mat2(t, -u, u, t);\n\n // Remove the texture normal bit to get the position\n vec2 pos = floor(a_pos * 0.5);\n\n vec4 projected_extrude = u_matrix * vec4(dist / u_ratio, 0.0, 0.0);\n gl_Position = u_matrix * vec4(pos + offset2 / u_ratio, 0.0, 1.0) + projected_extrude;\n\n // calculate how much the perspective view squishes or stretches the extrude\n float extrude_length_without_perspective = length(dist);\n float extrude_length_with_perspective = length(projected_extrude.xy / gl_Position.w * u_gl_units_to_pixels);\n v_gamma_scale = extrude_length_without_perspective / extrude_length_with_perspective;\n\n v_linesofar = a_linesofar;\n v_width2 = vec2(outset, inset);\n}\n"},lineSDF:{fragmentSource:"\nuniform sampler2D u_image;\nuniform float u_sdfgamma;\nuniform float u_mix;\n\nvarying vec2 v_normal;\nvarying vec2 v_width2;\nvarying vec2 v_tex_a;\nvarying vec2 v_tex_b;\nvarying float v_gamma_scale;\n\n#pragma mapbox: define lowp vec4 color\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n #pragma mapbox: initialize lowp vec4 color\n #pragma mapbox: initialize lowp float blur\n #pragma mapbox: initialize lowp float opacity\n\n // Calculate the distance of the pixel from the line in pixels.\n float dist = length(v_normal) * v_width2.s;\n\n // Calculate the antialiasing fade factor. This is either when fading in\n // the line in case of an offset line (v_width2.t) or when fading out\n // (v_width2.s)\n float blur2 = (blur + 1.0 / DEVICE_PIXEL_RATIO) * v_gamma_scale;\n float alpha = clamp(min(dist - (v_width2.t - blur2), v_width2.s - dist) / blur2, 0.0, 1.0);\n\n float sdfdist_a = texture2D(u_image, v_tex_a).a;\n float sdfdist_b = texture2D(u_image, v_tex_b).a;\n float sdfdist = mix(sdfdist_a, sdfdist_b, u_mix);\n alpha *= smoothstep(0.5 - u_sdfgamma, 0.5 + u_sdfgamma, sdfdist);\n\n gl_FragColor = color * (alpha * opacity);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n",vertexSource:"// floor(127 / 2) == 63.0\n// the maximum allowed miter limit is 2.0 at the moment. the extrude normal is\n// stored in a byte (-128..127). we scale regular normals up to length 63, but\n// there are also \"special\" normals that have a bigger length (of up to 126 in\n// this case).\n// #define scale 63.0\n#define scale 0.015873016\n\n// We scale the distance before adding it to the buffers so that we can store\n// long distances for long segments. Use this value to unscale the distance.\n#define LINE_DISTANCE_SCALE 2.0\n\n// the distance over which the line edge fades out.\n// Retina devices need a smaller distance to avoid aliasing.\n#define ANTIALIASING 1.0 / DEVICE_PIXEL_RATIO / 2.0\n\nattribute vec2 a_pos;\nattribute vec4 a_data;\n\nuniform mat4 u_matrix;\nuniform mediump float u_ratio;\nuniform vec2 u_patternscale_a;\nuniform float u_tex_y_a;\nuniform vec2 u_patternscale_b;\nuniform float u_tex_y_b;\nuniform vec2 u_gl_units_to_pixels;\nuniform mediump float u_width;\n\nvarying vec2 v_normal;\nvarying vec2 v_width2;\nvarying vec2 v_tex_a;\nvarying vec2 v_tex_b;\nvarying float v_gamma_scale;\n\n#pragma mapbox: define lowp vec4 color\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define mediump float gapwidth\n#pragma mapbox: define lowp float offset\n\nvoid main() {\n #pragma mapbox: initialize lowp vec4 color\n #pragma mapbox: initialize lowp float blur\n #pragma mapbox: initialize lowp float opacity\n #pragma mapbox: initialize mediump float gapwidth\n #pragma mapbox: initialize lowp float offset\n\n vec2 a_extrude = a_data.xy - 128.0;\n float a_direction = mod(a_data.z, 4.0) - 1.0;\n float a_linesofar = (floor(a_data.z / 4.0) + a_data.w * 64.0) * LINE_DISTANCE_SCALE;\n\n // We store the texture normals in the most insignificant bit\n // transform y so that 0 => -1 and 1 => 1\n // In the texture normal, x is 0 if the normal points straight up/down and 1 if it's a round cap\n // y is 1 if the normal points up, and -1 if it points down\n mediump vec2 normal = mod(a_pos, 2.0);\n normal.y = sign(normal.y - 0.5);\n v_normal = normal;\n\n // these transformations used to be applied in the JS and native code bases. \n // moved them into the shader for clarity and simplicity. \n gapwidth = gapwidth / 2.0;\n float width = u_width / 2.0;\n offset = -1.0 * offset;\n \n float inset = gapwidth + (gapwidth > 0.0 ? ANTIALIASING : 0.0);\n float outset = gapwidth + width * (gapwidth > 0.0 ? 2.0 : 1.0) + ANTIALIASING;\n\n // Scale the extrusion vector down to a normal and then up by the line width\n // of this vertex.\n mediump vec2 dist =outset * a_extrude * scale;\n\n // Calculate the offset when drawing a line that is to the side of the actual line.\n // We do this by creating a vector that points towards the extrude, but rotate\n // it when we're drawing round end points (a_direction = -1 or 1) since their\n // extrude vector points in another direction.\n mediump float u = 0.5 * a_direction;\n mediump float t = 1.0 - abs(u);\n mediump vec2 offset2 = offset * a_extrude * scale * normal.y * mat2(t, -u, u, t);\n\n // Remove the texture normal bit to get the position\n vec2 pos = floor(a_pos * 0.5);\n\n vec4 projected_extrude = u_matrix * vec4(dist / u_ratio, 0.0, 0.0);\n gl_Position = u_matrix * vec4(pos + offset2 / u_ratio, 0.0, 1.0) + projected_extrude;\n\n // calculate how much the perspective view squishes or stretches the extrude\n float extrude_length_without_perspective = length(dist);\n float extrude_length_with_perspective = length(projected_extrude.xy / gl_Position.w * u_gl_units_to_pixels);\n v_gamma_scale = extrude_length_without_perspective / extrude_length_with_perspective;\n\n v_tex_a = vec2(a_linesofar * u_patternscale_a.x, normal.y * u_patternscale_a.y + u_tex_y_a);\n v_tex_b = vec2(a_linesofar * u_patternscale_b.x, normal.y * u_patternscale_b.y + u_tex_y_b);\n\n v_width2 = vec2(outset, inset);\n}\n" +},raster:{fragmentSource:"uniform float u_fade_t;\nuniform float u_opacity;\nuniform sampler2D u_image0;\nuniform sampler2D u_image1;\nvarying vec2 v_pos0;\nvarying vec2 v_pos1;\n\nuniform float u_brightness_low;\nuniform float u_brightness_high;\n\nuniform float u_saturation_factor;\nuniform float u_contrast_factor;\nuniform vec3 u_spin_weights;\n\nvoid main() {\n\n // read and cross-fade colors from the main and parent tiles\n vec4 color0 = texture2D(u_image0, v_pos0);\n vec4 color1 = texture2D(u_image1, v_pos1);\n vec4 color = mix(color0, color1, u_fade_t);\n color.a *= u_opacity;\n vec3 rgb = color.rgb;\n\n // spin\n rgb = vec3(\n dot(rgb, u_spin_weights.xyz),\n dot(rgb, u_spin_weights.zxy),\n dot(rgb, u_spin_weights.yzx));\n\n // saturation\n float average = (color.r + color.g + color.b) / 3.0;\n rgb += (average - rgb) * u_saturation_factor;\n\n // contrast\n rgb = (rgb - 0.5) * u_contrast_factor + 0.5;\n\n // brightness\n vec3 u_high_vec = vec3(u_brightness_low, u_brightness_low, u_brightness_low);\n vec3 u_low_vec = vec3(u_brightness_high, u_brightness_high, u_brightness_high);\n\n gl_FragColor = vec4(mix(u_high_vec, u_low_vec, rgb) * color.a, color.a);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n",vertexSource:"uniform mat4 u_matrix;\nuniform vec2 u_tl_parent;\nuniform float u_scale_parent;\nuniform float u_buffer_scale;\n\nattribute vec2 a_pos;\nattribute vec2 a_texture_pos;\n\nvarying vec2 v_pos0;\nvarying vec2 v_pos1;\n\nvoid main() {\n gl_Position = u_matrix * vec4(a_pos, 0, 1);\n v_pos0 = (((a_texture_pos / 32767.0) - 0.5) / u_buffer_scale ) + 0.5;\n v_pos1 = (v_pos0 * u_scale_parent) + u_tl_parent;\n}\n"},symbolIcon:{fragmentSource:"uniform sampler2D u_texture;\nuniform sampler2D u_fadetexture;\nuniform lowp float u_opacity;\n\nvarying vec2 v_tex;\nvarying vec2 v_fade_tex;\n\nvoid main() {\n lowp float alpha = texture2D(u_fadetexture, v_fade_tex).a * u_opacity;\n gl_FragColor = texture2D(u_texture, v_tex) * alpha;\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n",vertexSource:"attribute vec2 a_pos;\nattribute vec2 a_offset;\nattribute vec2 a_texture_pos;\nattribute vec4 a_data;\n\n\n// matrix is for the vertex position.\nuniform mat4 u_matrix;\n\nuniform mediump float u_zoom;\nuniform bool u_rotate_with_map;\nuniform vec2 u_extrude_scale;\n\nuniform vec2 u_texsize;\n\nvarying vec2 v_tex;\nvarying vec2 v_fade_tex;\n\nvoid main() {\n vec2 a_tex = a_texture_pos.xy;\n mediump float a_labelminzoom = a_data[0];\n mediump vec2 a_zoom = a_data.pq;\n mediump float a_minzoom = a_zoom[0];\n mediump float a_maxzoom = a_zoom[1];\n\n // u_zoom is the current zoom level adjusted for the change in font size\n mediump float z = 2.0 - step(a_minzoom, u_zoom) - (1.0 - step(a_maxzoom, u_zoom));\n\n vec2 extrude = u_extrude_scale * (a_offset / 64.0);\n if (u_rotate_with_map) {\n gl_Position = u_matrix * vec4(a_pos + extrude, 0, 1);\n gl_Position.z += z * gl_Position.w;\n } else {\n gl_Position = u_matrix * vec4(a_pos, 0, 1) + vec4(extrude, 0, 0);\n }\n\n v_tex = a_tex / u_texsize;\n v_fade_tex = vec2(a_labelminzoom / 255.0, 0.0);\n}\n"},symbolSDF:{fragmentSource:"uniform sampler2D u_texture;\nuniform sampler2D u_fadetexture;\nuniform lowp vec4 u_color;\nuniform lowp float u_opacity;\nuniform lowp float u_buffer;\nuniform lowp float u_gamma;\n\nvarying vec2 v_tex;\nvarying vec2 v_fade_tex;\nvarying float v_gamma_scale;\n\nvoid main() {\n lowp float dist = texture2D(u_texture, v_tex).a;\n lowp float fade_alpha = texture2D(u_fadetexture, v_fade_tex).a;\n lowp float gamma = u_gamma * v_gamma_scale;\n lowp float alpha = smoothstep(u_buffer - gamma, u_buffer + gamma, dist) * fade_alpha;\n\n gl_FragColor = u_color * (alpha * u_opacity);\n\n#ifdef OVERDRAW_INSPECTOR\n gl_FragColor = vec4(1.0);\n#endif\n}\n",vertexSource:"const float PI = 3.141592653589793;\n\nattribute vec2 a_pos;\nattribute vec2 a_offset;\nattribute vec2 a_texture_pos;\nattribute vec4 a_data;\n\n\n// matrix is for the vertex position.\nuniform mat4 u_matrix;\n\nuniform mediump float u_zoom;\nuniform bool u_rotate_with_map;\nuniform bool u_pitch_with_map;\nuniform mediump float u_pitch;\nuniform mediump float u_bearing;\nuniform mediump float u_aspect_ratio;\nuniform vec2 u_extrude_scale;\n\nuniform vec2 u_texsize;\n\nvarying vec2 v_tex;\nvarying vec2 v_fade_tex;\nvarying float v_gamma_scale;\n\nvoid main() {\n vec2 a_tex = a_texture_pos.xy;\n mediump float a_labelminzoom = a_data[0];\n mediump vec2 a_zoom = a_data.pq;\n mediump float a_minzoom = a_zoom[0];\n mediump float a_maxzoom = a_zoom[1];\n\n // u_zoom is the current zoom level adjusted for the change in font size\n mediump float z = 2.0 - step(a_minzoom, u_zoom) - (1.0 - step(a_maxzoom, u_zoom));\n\n // pitch-alignment: map\n // rotation-alignment: map | viewport\n if (u_pitch_with_map) {\n lowp float angle = u_rotate_with_map ? (a_data[1] / 256.0 * 2.0 * PI) : u_bearing;\n lowp float asin = sin(angle);\n lowp float acos = cos(angle);\n mat2 RotationMatrix = mat2(acos, asin, -1.0 * asin, acos);\n vec2 offset = RotationMatrix * a_offset;\n vec2 extrude = u_extrude_scale * (offset / 64.0);\n gl_Position = u_matrix * vec4(a_pos + extrude, 0, 1);\n gl_Position.z += z * gl_Position.w;\n // pitch-alignment: viewport\n // rotation-alignment: map\n } else if (u_rotate_with_map) {\n // foreshortening factor to apply on pitched maps\n // as a label goes from horizontal <=> vertical in angle\n // it goes from 0% foreshortening to up to around 70% foreshortening\n lowp float pitchfactor = 1.0 - cos(u_pitch * sin(u_pitch * 0.75));\n\n lowp float lineangle = a_data[1] / 256.0 * 2.0 * PI;\n\n // use the lineangle to position points a,b along the line\n // project the points and calculate the label angle in projected space\n // this calculation allows labels to be rendered unskewed on pitched maps\n vec4 a = u_matrix * vec4(a_pos, 0, 1);\n vec4 b = u_matrix * vec4(a_pos + vec2(cos(lineangle),sin(lineangle)), 0, 1);\n lowp float angle = atan((b[1]/b[3] - a[1]/a[3])/u_aspect_ratio, b[0]/b[3] - a[0]/a[3]);\n lowp float asin = sin(angle);\n lowp float acos = cos(angle);\n mat2 RotationMatrix = mat2(acos, -1.0 * asin, asin, acos);\n\n vec2 offset = RotationMatrix * (vec2((1.0-pitchfactor)+(pitchfactor*cos(angle*2.0)), 1.0) * a_offset);\n vec2 extrude = u_extrude_scale * (offset / 64.0);\n gl_Position = u_matrix * vec4(a_pos, 0, 1) + vec4(extrude, 0, 0);\n gl_Position.z += z * gl_Position.w;\n // pitch-alignment: viewport\n // rotation-alignment: viewport\n } else {\n vec2 extrude = u_extrude_scale * (a_offset / 64.0);\n gl_Position = u_matrix * vec4(a_pos, 0, 1) + vec4(extrude, 0, 0);\n }\n\n v_gamma_scale = gl_Position.w;\n\n v_tex = a_tex / u_texsize;\n v_fade_tex = vec2(a_labelminzoom / 255.0, 0.0);\n}\n"}}; +},{"path":194}],39:[function(require,module,exports){ +"use strict";var VertexArrayObject=function(){this.boundProgram=null,this.boundVertexBuffer=null,this.boundVertexBuffer2=null,this.boundElementBuffer=null,this.boundVertexOffset=null,this.vao=null};VertexArrayObject.prototype.bind=function(e,t,r,i,n,o){void 0===e.extVertexArrayObject&&(e.extVertexArrayObject=e.getExtension("OES_vertex_array_object"));var s=!this.vao||this.boundProgram!==t||this.boundVertexBuffer!==r||this.boundVertexBuffer2!==n||this.boundElementBuffer!==i||this.boundVertexOffset!==o;!e.extVertexArrayObject||s?(this.freshBind(e,t,r,i,n,o),this.gl=e):e.extVertexArrayObject.bindVertexArrayOES(this.vao)},VertexArrayObject.prototype.freshBind=function(e,t,r,i,n,o){var s,u=t.numAttributes;if(e.extVertexArrayObject)this.vao&&this.destroy(),this.vao=e.extVertexArrayObject.createVertexArrayOES(),e.extVertexArrayObject.bindVertexArrayOES(this.vao),s=0,this.boundProgram=t,this.boundVertexBuffer=r,this.boundVertexBuffer2=n,this.boundElementBuffer=i,this.boundVertexOffset=o;else{s=e.currentNumAttributes||0;for(var b=u;bthis.maxzoom?Math.pow(2,t.coord.z-this.maxzoom):1,r={type:this.type,uid:t.uid,coord:t.coord,zoom:t.coord.z,maxZoom:this.maxzoom,tileSize:this.tileSize,source:this.id,overscaling:i,angle:this.map.transform.angle,pitch:this.map.transform.pitch,showCollisionBoxes:this.map.showCollisionBoxes};t.workerID=this.dispatcher.send("loadTile",r,function(i,r){if(t.unloadVectorData(),!t.aborted)return i?e(i):(t.loadVectorData(r,o.map.painter),t.redoWhenDone&&(t.redoWhenDone=!1,t.redoPlacement(o)),e(null))},this.workerID)},e.prototype.abortTile=function(t){t.aborted=!0},e.prototype.unloadTile=function(t){t.unloadVectorData(),this.dispatcher.send("removeTile",{uid:t.uid,type:this.type,source:this.id},function(){},t.workerID)},e.prototype.onRemove=function(){this.dispatcher.broadcast("removeSource",{type:this.type,source:this.id},function(){})},e.prototype.serialize=function(){return{type:this.type,data:this._data}},e}(Evented);module.exports=GeoJSONSource; +},{"../data/extent":11,"../util/evented":118,"../util/util":129,"../util/window":112}],42:[function(require,module,exports){ +"use strict";var ajax=require("../util/ajax"),rewind=require("geojson-rewind"),GeoJSONWrapper=require("./geojson_wrapper"),vtpbf=require("vt-pbf"),supercluster=require("supercluster"),geojsonvt=require("geojson-vt"),VectorTileWorkerSource=require("./vector_tile_worker_source"),GeoJSONWorkerSource=function(e){function r(r,t,o){e.call(this,r,t),o&&(this.loadGeoJSON=o),this._geoJSONIndexes={}}return e&&(r.__proto__=e),r.prototype=Object.create(e&&e.prototype),r.prototype.constructor=r,r.prototype.loadVectorData=function(e,r){var t=e.source,o=e.coord;if(!this._geoJSONIndexes[t])return r(null,null);var n=this._geoJSONIndexes[t].getTile(Math.min(o.z,e.maxZoom),o.x,o.y);if(!n)return r(null,null);var u=new GeoJSONWrapper(n.features);u.name="_geojsonTileLayer";var a=vtpbf({layers:{_geojsonTileLayer:u}});0===a.byteOffset&&a.byteLength===a.buffer.byteLength||(a=new Uint8Array(a)),u.rawData=a.buffer,r(null,u)},r.prototype.loadData=function(e,r){var t=function(t,o){var n=this;return t?r(t):"object"!=typeof o?r(new Error("Input data is not a valid GeoJSON object.")):(rewind(o,!0),void this._indexData(o,e,function(t,o){return t?r(t):(n._geoJSONIndexes[e.source]=o,void r(null))}))}.bind(this);this.loadGeoJSON(e,t)},r.prototype.loadGeoJSON=function(e,r){if(e.url)ajax.getJSON(e.url,r);else{if("string"!=typeof e.data)return r(new Error("Input data is not a valid GeoJSON object."));try{return r(null,JSON.parse(e.data))}catch(e){return r(new Error("Input data is not a valid GeoJSON object."))}}},r.prototype.removeSource=function(e){this._geoJSONIndexes[e.source]&&delete this._geoJSONIndexes[e.source]},r.prototype._indexData=function(e,r,t){try{r.cluster?t(null,supercluster(r.superclusterOptions).load(e.features)):t(null,geojsonvt(e,r.geojsonVtOptions))}catch(e){return t(e)}},r}(VectorTileWorkerSource);module.exports=GeoJSONWorkerSource; +},{"../util/ajax":109,"./geojson_wrapper":43,"./vector_tile_worker_source":55,"geojson-rewind":140,"geojson-vt":144,"supercluster":201,"vt-pbf":210}],43:[function(require,module,exports){ +"use strict";var Point=require("point-geometry"),VectorTileFeature=require("vector-tile").VectorTileFeature,EXTENT=require("../data/extent"),FeatureWrapper=function(e){var t=this;if(this.type=e.type,1===e.type){this.rawGeometry=[];for(var r=0;rt)){var n=Math.pow(2,Math.min(a.coord.z,i._source.maxzoom)-Math.min(e.z,i._source.maxzoom));if(Math.floor(a.coord.x/n)===e.x&&Math.floor(a.coord.y/n)===e.y)for(o[s]=!0,r=!0;a&&a.coord.z-1>e.z;){var d=a.coord.parent(i._source.maxzoom).id;a=i._tiles[d],a&&a.hasData()&&(delete o[s],o[d]=!0)}}}return r},t.prototype.findLoadedParent=function(e,t,o){for(var i=this,r=e.z-1;r>=t;r--){e=e.parent(i._source.maxzoom);var s=i._tiles[e.id];if(s&&s.hasData())return o[e.id]=!0,s;if(i._cache.has(e.id))return o[e.id]=!0,i._cache.get(e.id)}},t.prototype.updateCacheSize=function(e){var t=Math.ceil(e.width/e.tileSize)+1,o=Math.ceil(e.height/e.tileSize)+1,i=t*o,r=5;this._cache.setMaxSize(Math.floor(i*r))},t.prototype.update=function(e){var o=this;if(this._sourceLoaded){var i,r,s,a;this.updateCacheSize(e);var n=(this._source.roundZoom?Math.round:Math.floor)(this.getZoom(e)),d=Math.max(n-t.maxOverzooming,this._source.minzoom),c=Math.max(n+t.maxUnderzooming,this._source.minzoom),h={};this._coveredTiles={};var u;for(u=this.used?this._source.coord?[this._source.coord]:e.coveringTiles({tileSize:this._source.tileSize,minzoom:this._source.minzoom,maxzoom:this._source.maxzoom,roundZoom:this._source.roundZoom,reparseOverscaled:this._source.reparseOverscaled}):[],i=0;i=Date.now())&&(o.findLoadedChildren(r,c,h)&&(h[_]=!0),a=o.findLoadedParent(r,d,l),a&&o.addTile(a.coord))}var f;for(f in l)h[f]||(o._coveredTiles[f]=!0);for(f in l)h[f]=!0;var T=util.keysDifference(this._tiles,h);for(i=0;ithis._source.maxzoom?Math.pow(2,i-this._source.maxzoom):1;t=new Tile(o,this._source.tileSize*r,this._source.maxzoom),this.loadTile(t,this._tileLoaded.bind(this,t,e.id))}return t.uses++,this._tiles[e.id]=t,this._source.fire("dataloading",{tile:t,coord:t.coord,dataType:"tile"}),t},t.prototype._setTileReloadTimer=function(e,t){var o=this,i=t.getExpiry();i&&(this._timers[e]=setTimeout(function(){o.reloadTile(e,"expired"),o._timers[e]=void 0},i-(new Date).getTime()))},t.prototype._setCacheInvalidationTimer=function(e,t){var o=this,i=t.getExpiry();i&&(this._cacheTimers[e]=setTimeout(function(){o._cache.remove(e),o._cacheTimers[e]=void 0},i-(new Date).getTime()))},t.prototype.removeTile=function(e){var t=this._tiles[e];if(t&&(t.uses--,delete this._tiles[e],this._timers[e]&&(clearTimeout(this._timers[e]),this._timers[e]=void 0),this._source.fire("data",{tile:t,coord:t.coord,dataType:"tile"}),!(t.uses>0)))if(t.hasData()){var o=t.coord.wrapped().id;this._cache.add(o,t),this._setCacheInvalidationTimer(o,t)}else t.aborted=!0,this.abortTile(t),this.unloadTile(t)},t.prototype.clearTiles=function(){var e=this;for(var t in this._tiles)e.removeTile(t);this._cache.reset()},t.prototype.tilesIn=function(e){for(var t=this,o={},i=this.getIds(),r=1/0,s=1/0,a=-(1/0),n=-(1/0),d=e[0].zoom,c=0;c=0&&p[1].y>=0){for(var _=[],f=0;fi.row){var o=t;t=i,i=o}return{x0:t.column,y0:t.row,x1:i.column,y1:i.row,dx:i.column-t.column,dy:i.row-t.row}}function scanSpans(t,i,o,r,e){var n=Math.max(o,Math.floor(i.y0)),h=Math.min(r,Math.ceil(i.y1));if(t.x0===i.x0&&t.y0===i.y0?t.x0+i.dy/t.dy*t.dx0,l=i.dx<0,u=n;ua.dy&&(h=s,s=a,a=h),s.dy>d.dy&&(h=s,s=d,d=h),a.dy>d.dy&&(h=a,a=d,d=h),s.dy&&scanSpans(d,s,r,e,n),a.dy&&scanSpans(d,a,r,e,n)}function getQuadkey(t,i,o){for(var r,e="",n=t;n>0;n--)r=1<t?new TileCoord(this.z-1,this.x,this.y,this.w):new TileCoord(this.z-1,Math.floor(this.x/2),Math.floor(this.y/2),this.w)},TileCoord.prototype.wrapped=function(){return new TileCoord(this.z,this.x,this.y,0)},TileCoord.prototype.children=function(t){if(this.z>=t)return[new TileCoord(this.z+1,this.x,this.y,this.w)];var i=this.z+1,o=2*this.x,r=2*this.y;return[new TileCoord(i,o,r,this.w),new TileCoord(i,o+1,r,this.w),new TileCoord(i,o,r+1,this.w),new TileCoord(i,o+1,r+1,this.w)]},TileCoord.cover=function(t,i,o,r){function e(t,i,e){var s,a,d,y;if(e>=0&&e<=n)for(s=t;sthis.maxzoom?Math.pow(2,e.coord.z-this.maxzoom):1,r={url:normalizeURL(e.coord.url(this.tiles,this.maxzoom,this.scheme),this.url),uid:e.uid,coord:e.coord,zoom:e.coord.z,tileSize:this.tileSize*o,type:this.type,source:this.id,overscaling:o,angle:this.map.transform.angle,pitch:this.map.transform.pitch,showCollisionBoxes:this.map.showCollisionBoxes};e.workerID&&"expired"!==e.state?"loading"===e.state?e.reloadCallback=t:this.dispatcher.send("reloadTile",r,i.bind(this),e.workerID):e.workerID=this.dispatcher.send("loadTile",r,i.bind(this))},t.prototype.abortTile=function(e){this.dispatcher.send("abortTile",{uid:e.uid,type:this.type,source:this.id},null,e.workerID)},t.prototype.unloadTile=function(e){e.unloadVectorData(),this.dispatcher.send("removeTile",{uid:e.uid,type:this.type,source:this.id},null,e.workerID)},t}(Evented);module.exports=VectorTileSource; +},{"../util/evented":118,"../util/mapbox":125,"../util/util":129,"./load_tilejson":45}],55:[function(require,module,exports){ +"use strict";var ajax=require("../util/ajax"),vt=require("vector-tile"),Protobuf=require("pbf"),WorkerTile=require("./worker_tile"),util=require("../util/util"),VectorTileWorkerSource=function(e,r,t){this.actor=e,this.layerIndex=r,t&&(this.loadVectorData=t),this.loading={},this.loaded={}};VectorTileWorkerSource.prototype.loadTile=function(e,r){function t(e,t){return delete this.loading[o][i],e?r(e):t?(a.vectorTile=t,a.parse(t,this.layerIndex,this.actor,function(e,o,i){if(e)return r(e);var a={};t.expires&&(a.expires=t.expires),t.cacheControl&&(a.cacheControl=t.cacheControl),r(null,util.extend({rawTileData:t.rawData},o,a),i)}),this.loaded[o]=this.loaded[o]||{},void(this.loaded[o][i]=a)):r(null,null)}var o=e.source,i=e.uid;this.loading[o]||(this.loading[o]={});var a=this.loading[o][i]=new WorkerTile(e);a.abort=this.loadVectorData(e,t.bind(this))},VectorTileWorkerSource.prototype.reloadTile=function(e,r){function t(e,t){if(this.reloadCallback){var o=this.reloadCallback;delete this.reloadCallback,this.parse(this.vectorTile,a.layerIndex,a.actor,o)}r(e,t)}var o=this.loaded[e.source],i=e.uid,a=this;if(o&&o[i]){var l=o[i];"parsing"===l.status?l.reloadCallback=r:"done"===l.status&&l.parse(l.vectorTile,this.layerIndex,this.actor,t.bind(l))}},VectorTileWorkerSource.prototype.abortTile=function(e){var r=this.loading[e.source],t=e.uid;r&&r[t]&&r[t].abort&&(r[t].abort(),delete r[t])},VectorTileWorkerSource.prototype.removeTile=function(e){var r=this.loaded[e.source],t=e.uid;r&&r[t]&&delete r[t]},VectorTileWorkerSource.prototype.loadVectorData=function(e,r){function t(e,t){if(e)return r(e);var o=new vt.VectorTile(new Protobuf(t.data));o.rawData=t.data,o.cacheControl=t.cacheControl,o.expires=t.expires,r(e,o)}var o=ajax.getArrayBuffer(e.url,t.bind(this));return function(){o.abort()}},VectorTileWorkerSource.prototype.redoPlacement=function(e,r){var t=this.loaded[e.source],o=this.loading[e.source],i=e.uid;if(t&&t[i]){var a=t[i],l=a.redoPlacement(e.angle,e.pitch,e.showCollisionBoxes);l.result&&r(null,l.result,l.transferables)}else o&&o[i]&&(o[i].angle=e.angle)},module.exports=VectorTileWorkerSource; +},{"../util/ajax":109,"../util/util":129,"./worker_tile":58,"pbf":196,"vector-tile":206}],56:[function(require,module,exports){ +"use strict";var ajax=require("../util/ajax"),ImageSource=require("./image_source"),VideoSource=function(t){function e(e,o,i,r){t.call(this,e,o,i,r),this.roundZoom=!0,this.type="video",this.options=o}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.load=function(){var t=this,e=this.options;this.urls=e.urls,ajax.getVideo(e.urls,function(e,o){if(e)return t.fire("error",{error:e});t.video=o,t.video.loop=!0;var i;t.video.addEventListener("playing",function(){i=t.map.style.animationLoop.set(1/0),t.map._rerender()}),t.video.addEventListener("pause",function(){t.map.style.animationLoop.cancel(i)}),t.map&&t.video.play(),t._finishLoading()})},e.prototype.getVideo=function(){return this.video},e.prototype.onAdd=function(t){this.map||(this.load(),this.map=t,this.video&&(this.video.play(),this.setCoordinates(this.coordinates)))},e.prototype.prepare=function(){!this.tile||this.video.readyState<2||this._prepareImage(this.map.painter.gl,this.video)},e.prototype.serialize=function(){return{type:"video",urls:this.urls,coordinates:this.coordinates}},e}(ImageSource);module.exports=VideoSource; +},{"../util/ajax":109,"./image_source":44}],57:[function(require,module,exports){ +"use strict";var Actor=require("../util/actor"),StyleLayerIndex=require("../style/style_layer_index"),VectorTileWorkerSource=require("./vector_tile_worker_source"),GeoJSONWorkerSource=require("./geojson_worker_source"),globalRTLTextPlugin=require("./rtl_text_plugin"),Worker=function(e){var r=this;this.self=e,this.actor=new Actor(e,this),this.layerIndexes={},this.workerSourceTypes={vector:VectorTileWorkerSource,geojson:GeoJSONWorkerSource},this.workerSources={},this.self.registerWorkerSource=function(e,o){if(r.workerSourceTypes[e])throw new Error('Worker source with name "'+e+'" already registered.');r.workerSourceTypes[e]=o},this.self.registerRTLTextPlugin=function(e){if(globalRTLTextPlugin.applyArabicShaping||globalRTLTextPlugin.processBidirectionalText)throw new Error("RTL text plugin already registered.");globalRTLTextPlugin.applyArabicShaping=e.applyArabicShaping,globalRTLTextPlugin.processBidirectionalText=e.processBidirectionalText}};Worker.prototype.setLayers=function(e,r){this.getLayerIndex(e).replace(r)},Worker.prototype.updateLayers=function(e,r){this.getLayerIndex(e).update(r.layers,r.removedIds,r.symbolOrder)},Worker.prototype.loadTile=function(e,r,o){this.getWorkerSource(e,r.type).loadTile(r,o)},Worker.prototype.reloadTile=function(e,r,o){this.getWorkerSource(e,r.type).reloadTile(r,o)},Worker.prototype.abortTile=function(e,r){this.getWorkerSource(e,r.type).abortTile(r)},Worker.prototype.removeTile=function(e,r){this.getWorkerSource(e,r.type).removeTile(r)},Worker.prototype.removeSource=function(e,r){var o=this.getWorkerSource(e,r.type);void 0!==o.removeSource&&o.removeSource(r)},Worker.prototype.redoPlacement=function(e,r,o){this.getWorkerSource(e,r.type).redoPlacement(r,o)},Worker.prototype.loadWorkerSource=function(e,r,o){try{this.self.importScripts(r.url),o()}catch(e){o(e)}},Worker.prototype.loadRTLTextPlugin=function(e,r,o){try{globalRTLTextPlugin.applyArabicShaping||globalRTLTextPlugin.processBidirectionalText||this.self.importScripts(r)}catch(e){o(e)}},Worker.prototype.getLayerIndex=function(e){var r=this.layerIndexes[e];return r||(r=this.layerIndexes[e]=new StyleLayerIndex),r},Worker.prototype.getWorkerSource=function(e,r){var o=this;if(this.workerSources[e]||(this.workerSources[e]={}),!this.workerSources[e][r]){var t={send:function(r,t,i,n){o.actor.send(r,t,i,n,e)}};this.workerSources[e][r]=new this.workerSourceTypes[r](t,this.getLayerIndex(e))}return this.workerSources[e][r]},module.exports=function(e){return new Worker(e)}; +},{"../style/style_layer_index":71,"../util/actor":108,"./geojson_worker_source":42,"./rtl_text_plugin":49,"./vector_tile_worker_source":55}],58:[function(require,module,exports){ +"use strict";function recalculateLayers(e,r){for(var i=0,s=e.layers;i=x.maxzoom||x.layout&&"none"===x.layout.visibility)){for(var z=0,A=g;z=0;w--){var C=a[r.symbolOrder[w]];C&&o.symbolBuckets.push(C)}if(0===this.symbolBuckets.length)return I(new CollisionTile(this.angle,this.pitch,this.collisionBoxArray));var T=0,q=Object.keys(c.iconDependencies),D=util.mapObject(c.glyphDependencies,function(e){return Object.keys(e).map(Number)}),O=function(e){if(e)return s(e);if(T++,2===T){for(var r=new CollisionTile(o.angle,o.pitch,o.collisionBoxArray),i=0,l=o.symbolBuckets;i=(new Date).getTime()}),!this.times.length},AnimationLoop.prototype.set=function(t){return this.times.push({id:this.n,time:t+(new Date).getTime()}),this.n++},AnimationLoop.prototype.cancel=function(t){this.times=this.times.filter(function(i){return i.id!==t})},module.exports=AnimationLoop; +},{}],60:[function(require,module,exports){ +"use strict";var Evented=require("../util/evented"),ajax=require("../util/ajax"),browser=require("../util/browser"),normalizeURL=require("../util/mapbox").normalizeSpriteURL,SpritePosition=function(){this.x=0,this.y=0,this.width=0,this.height=0,this.pixelRatio=1,this.sdf=!1},ImageSprite=function(t){function i(i,e){var a=this;t.call(this),this.base=i,this.retina=browser.devicePixelRatio>1,this.setEventedParent(e);var r=this.retina?"@2x":"";ajax.getJSON(normalizeURL(i,r,".json"),function(t,i){return t?void a.fire("error",{error:t}):(a.data=i,void(a.imgData&&a.fire("data",{dataType:"style"})))}),ajax.getImage(normalizeURL(i,r,".png"),function(t,i){if(t)return void a.fire("error",{error:t});a.imgData=browser.getImageData(i);for(var e=0;e1!==this.retina){var e=new i(this.base);e.on("data",function(){t.data=e.data,t.imgData=e.imgData,t.width=e.width,t.retina=e.retina})}},i.prototype.getSpritePosition=function(t){if(!this.loaded())return new SpritePosition;var i=this.data&&this.data[t];return i&&this.imgData?i:new SpritePosition},i}(Evented);module.exports=ImageSprite; +},{"../util/ajax":109,"../util/browser":110,"../util/evented":118,"../util/mapbox":125}],61:[function(require,module,exports){ +"use strict";var styleSpec=require("./style_spec"),util=require("../util/util"),Evented=require("../util/evented"),validateStyle=require("./validate_style"),StyleDeclaration=require("./style_declaration"),StyleTransition=require("./style_transition"),TRANSITION_SUFFIX="-transition",Light=function(t){function i(i){t.call(this),this.properties=["anchor","color","position","intensity"],this._specifications=styleSpec.light,this.set(i)}return t&&(i.__proto__=t),i.prototype=Object.create(t&&t.prototype),i.prototype.constructor=i,i.prototype.set=function(t){var i=this;if(!this._validate(validateStyle.light,t)){this._declarations={},this._transitions={},this._transitionOptions={},this.calculated={},t=util.extend({anchor:this._specifications.anchor.default,color:this._specifications.color.default,position:this._specifications.position.default,intensity:this._specifications.intensity.default},t);for(var e=0,o=this.properties;eMath.floor(e)&&(t.lastIntegerZoom=Math.floor(e+1),t.lastIntegerZoomTime=Date.now()),t.lastZoom=e},t.prototype._checkLoaded=function(){if(!this._loaded)throw new Error("Style is not done loading")},t.prototype.update=function(e,t){var r=this;if(this._changed){var i=Object.keys(this._updatedLayers),o=Object.keys(this._removedLayers);(i.length||o.length||this._updatedSymbolOrder)&&this._updateWorkerLayers(i,o);for(var s in this._updatedSources){var a=r._updatedSources[s];"reload"===a?r._reloadSource(s):"clear"===a&&r._clearSource(s)}this._applyClasses(e,t),this._resetUpdates(),this.fire("data",{dataType:"style"})}},t.prototype._updateWorkerLayers=function(e,t){var r=this,i=this._updatedSymbolOrder?this._order.filter(function(e){return"symbol"===r._layers[e].type}):null;this.dispatcher.broadcast("updateLayers",{layers:this._serializeLayers(e),removedIds:t,symbolOrder:i})},t.prototype._resetUpdates=function(){this._changed=!1,this._updatedLayers={},this._removedLayers={},this._updatedSymbolOrder=!1,this._updatedSources={},this._updatedPaintProps={},this._updatedAllPaintProps=!1},t.prototype.setState=function(e){var t=this;if(this._checkLoaded(),validateStyle.emitErrors(this,validateStyle(e)))return!1;e=util.extend({},e),e.layers=deref(e.layers);var r=diff(this.serialize(),e).filter(function(e){return!(e.command in ignoredDiffOperations)});if(0===r.length)return!1;var i=r.filter(function(e){return!(e.command in supportedDiffOperations)});if(i.length>0)throw new Error("Unimplemented: "+i.map(function(e){return e.command}).join(", ")+".");return r.forEach(function(e){"setTransition"!==e.command&&t[e.command].apply(t,e.args)}),this.stylesheet=e,!0},t.prototype.addSource=function(e,t,r){if(this._checkLoaded(),void 0!==this.sourceCaches[e])throw new Error("There is already a source with this ID");if(!t.type)throw new Error("The type property must be defined, but the only the following properties were given: "+Object.keys(t)+".");var i=["vector","raster","geojson","video","image","canvas"],o=i.indexOf(t.type)>=0;if(!o||!this._validate(validateStyle.source,"sources."+e,t,null,r)){var s=this.sourceCaches[e]=new SourceCache(e,t,this.dispatcher);s.style=this,s.setEventedParent(this,function(){return{isSourceLoaded:s.loaded(),source:s.serialize(),sourceId:e}}),s.onAdd(this.map),this._changed=!0}},t.prototype.removeSource=function(e){if(this._checkLoaded(),void 0===this.sourceCaches[e])throw new Error("There is no source with this ID");var t=this.sourceCaches[e];delete this.sourceCaches[e],delete this._updatedSources[e],t.setEventedParent(null),t.clearTiles(),t.onRemove&&t.onRemove(this.map),this._changed=!0},t.prototype.getSource=function(e){return this.sourceCaches[e]&&this.sourceCaches[e].getSource()},t.prototype.addLayer=function(e,t,r){this._checkLoaded();var i=e.id;if("object"==typeof e.source&&(this.addSource(i,e.source),e=util.extend(e,{source:i})),!this._validate(validateStyle.layer,"layers."+i,e,{arrayIndex:-1},r)){var o=StyleLayer.create(e);this._validateLayer(o),o.setEventedParent(this,{layer:{id:i}});var s=t?this._order.indexOf(t):this._order.length;if(this._order.splice(s,0,i),this._layers[i]=o,this._removedLayers[i]&&o.source){var a=this._removedLayers[i];delete this._removedLayers[i],this._updatedSources[o.source]=a.type!==o.type?"clear":"reload"}this._updateLayer(o),"symbol"===o.type&&(this._updatedSymbolOrder=!0),this.updateClasses(i)}},t.prototype.moveLayer=function(e,t){this._checkLoaded(),this._changed=!0;var r=this._layers[e];if(!r)return void this.fire("error",{error:new Error("The layer '"+e+"' does not exist in the map's style and cannot be moved.")});var i=this._order.indexOf(e);this._order.splice(i,1);var o=t?this._order.indexOf(t):this._order.length;this._order.splice(o,0,e),"symbol"===r.type&&(this._updatedSymbolOrder=!0,r.source&&!this._updatedSources[r.source]&&(this._updatedSources[r.source]="reload"))},t.prototype.removeLayer=function(e){this._checkLoaded();var t=this._layers[e];if(!t)return void this.fire("error",{error:new Error("The layer '"+e+"' does not exist in the map's style and cannot be removed.")});t.setEventedParent(null);var r=this._order.indexOf(e);this._order.splice(r,1),"symbol"===t.type&&(this._updatedSymbolOrder=!0),this._changed=!0,this._removedLayers[e]=t,delete this._layers[e],delete this._updatedLayers[e],delete this._updatedPaintProps[e]},t.prototype.getLayer=function(e){return this._layers[e]},t.prototype.setLayerZoomRange=function(e,t,r){this._checkLoaded();var i=this.getLayer(e);return i?void(i.minzoom===t&&i.maxzoom===r||(null!=t&&(i.minzoom=t),null!=r&&(i.maxzoom=r),this._updateLayer(i))):void this.fire("error",{error:new Error("The layer '"+e+"' does not exist in the map's style and cannot have zoom extent.")})},t.prototype.setFilter=function(e,t){this._checkLoaded();var r=this.getLayer(e);return r?void(null!==t&&void 0!==t&&this._validate(validateStyle.filter,"layers."+r.id+".filter",t)||util.deepEqual(r.filter,t)||(r.filter=util.clone(t),this._updateLayer(r))):void this.fire("error",{error:new Error("The layer '"+e+"' does not exist in the map's style and cannot be filtered.")})},t.prototype.getFilter=function(e){return util.clone(this.getLayer(e).filter)},t.prototype.setLayoutProperty=function(e,t,r){this._checkLoaded();var i=this.getLayer(e);return i?void(util.deepEqual(i.getLayoutProperty(t),r)||(i.setLayoutProperty(t,r),this._updateLayer(i))):void this.fire("error",{error:new Error("The layer '"+e+"' does not exist in the map's style and cannot be styled.")})},t.prototype.getLayoutProperty=function(e,t){return this.getLayer(e).getLayoutProperty(t)},t.prototype.setPaintProperty=function(e,t,r,i){this._checkLoaded();var o=this.getLayer(e);if(!o)return void this.fire("error",{error:new Error("The layer '"+e+"' does not exist in the map's style and cannot be styled.")});if(!util.deepEqual(o.getPaintProperty(t,i),r)){var s=o.isPaintValueFeatureConstant(t);o.setPaintProperty(t,r,i);var a=!(r&&MapboxGLFunction.isFunctionDefinition(r)&&"$zoom"!==r.property&&void 0!==r.property);a&&s||this._updateLayer(o),this.updateClasses(e,t)}},t.prototype.getPaintProperty=function(e,t,r){return this.getLayer(e).getPaintProperty(t,r)},t.prototype.getTransition=function(){return util.extend({duration:300,delay:0},this.stylesheet&&this.stylesheet.transition)},t.prototype.updateClasses=function(e,t){if(this._changed=!0,e){var r=this._updatedPaintProps;r[e]||(r[e]={}),r[e][t||"all"]=!0}else this._updatedAllPaintProps=!0},t.prototype.serialize=function(){var e=this;return util.filterObject({version:this.stylesheet.version,name:this.stylesheet.name,metadata:this.stylesheet.metadata,light:this.stylesheet.light,center:this.stylesheet.center,zoom:this.stylesheet.zoom,bearing:this.stylesheet.bearing,pitch:this.stylesheet.pitch,sprite:this.stylesheet.sprite,glyphs:this.stylesheet.glyphs,transition:this.stylesheet.transition,sources:util.mapObject(this.sourceCaches,function(e){return e.serialize()}),layers:this._order.map(function(t){return e._layers[t].serialize()})},function(e){return void 0!==e})},t.prototype._updateLayer=function(e){this._updatedLayers[e.id]=!0,e.source&&!this._updatedSources[e.source]&&(this._updatedSources[e.source]="reload"),this._changed=!0},t.prototype._flattenRenderedFeatures=function(e){for(var t=this,r=[],i=this._order.length-1;i>=0;i--)for(var o=t._order[i],s=0,a=e;s=this.maxzoom)||"none"===this.layout.visibility)},i.prototype.updatePaintTransitions=function(t,i,a,e,n){for(var o=this,r=util.extend({},this._paintDeclarations[""]),s=0;s=this.endTime)return e;var a=this.oldTransition.calculate(t,i,this.startTime),n=util.easeCubicInOut((o-this.startTime-this.delay)/this.duration);return this.interp(a,e,n)},StyleTransition.prototype._calculateTargetValue=function(t,i){if(!this.zoomTransitioned)return this.declaration.calculate(t,i);var o=t.zoom,e=this.zoomHistory.lastIntegerZoom,a=o>e?2:.5,n=this.declaration.calculate({zoom:o>e?o-1:o+1},i),r=this.declaration.calculate({zoom:o},i),s=Math.min((Date.now()-this.zoomHistory.lastIntegerZoomTime)/this.duration,1),l=Math.abs(o-e),u=interpolate(s,1,l);return void 0!==n&&void 0!==r?{from:n,fromScale:a,to:r,toScale:1,t:u}:void 0},module.exports=StyleTransition; +},{"../util/interpolate":121,"../util/util":129}],74:[function(require,module,exports){ +"use strict";module.exports=require("mapbox-gl-style-spec/lib/validate_style.min"),module.exports.emitErrors=function(r,e){if(e&&e.length){for(var t=0;t-a/2;){if(s--,s<0)return!1;f-=e[s].dist(i),i=e[s]}f+=e[s].dist(e[s+1]),s++;for(var l=[],o=0;fr;)o-=l.shift().angleDelta;if(o>n)return!1;s++,f+=c.dist(g)}return!0}module.exports=checkMaxAngle; +},{}],77:[function(require,module,exports){ +"use strict";function clipLine(n,x,y,o,e){for(var r=[],t=0;t=o&&w.x>=o||(P.x>=o?P=new Point(o,P.y+(w.y-P.y)*((o-P.x)/(w.x-P.x)))._round():w.x>=o&&(w=new Point(o,P.y+(w.y-P.y)*((o-P.x)/(w.x-P.x)))._round()),P.y>=e&&w.y>=e||(P.y>=e?P=new Point(P.x+(w.x-P.x)*((e-P.y)/(w.y-P.y)),e)._round():w.y>=e&&(w=new Point(P.x+(w.x-P.x)*((e-P.y)/(w.y-P.y)),e)._round()),i&&P.equals(i[i.length-1])||(i=[P],r.push(i)),i.push(w)))))}return r}var Point=require("point-geometry");module.exports=clipLine; +},{"point-geometry":197}],78:[function(require,module,exports){ +"use strict";var createStructArrayType=require("../util/struct_array"),Point=require("point-geometry"),CollisionBoxArray=createStructArrayType({members:[{type:"Int16",name:"anchorPointX"},{type:"Int16",name:"anchorPointY"},{type:"Int16",name:"x1"},{type:"Int16",name:"y1"},{type:"Int16",name:"x2"},{type:"Int16",name:"y2"},{type:"Float32",name:"maxScale"},{type:"Uint32",name:"featureIndex"},{type:"Uint16",name:"sourceLayerIndex"},{type:"Uint16",name:"bucketIndex"},{type:"Int16",name:"bbox0"},{type:"Int16",name:"bbox1"},{type:"Int16",name:"bbox2"},{type:"Int16",name:"bbox3"},{type:"Float32",name:"placementScale"}]});Object.defineProperty(CollisionBoxArray.prototype.StructType.prototype,"anchorPoint",{get:function(){return new Point(this.anchorPointX,this.anchorPointY)}}),module.exports=CollisionBoxArray; +},{"../util/struct_array":127,"point-geometry":197}],79:[function(require,module,exports){ +"use strict";var CollisionFeature=function(t,e,i,o,s,a,n,r,l,d,u){var h=n.top*r-l,x=n.bottom*r+l,f=n.left*r-l,m=n.right*r+l;if(this.boxStartIndex=t.length,d){var _=x-h,b=m-f;if(_>0)if(_=Math.max(10*r,_),u){var v=e[i.segment+1].sub(e[i.segment])._unit()._mult(b),c=[i.sub(v),i.add(v)];this._addLineCollisionBoxes(t,c,i,0,b,_,o,s,a)}else this._addLineCollisionBoxes(t,e,i,i.segment,b,_,o,s,a)}else t.emplaceBack(i.x,i.y,f,h,m,x,1/0,o,s,a,0,0,0,0,0);this.boxEndIndex=t.length};CollisionFeature.prototype._addLineCollisionBoxes=function(t,e,i,o,s,a,n,r,l){var d=a/2,u=Math.floor(s/d),h=-a/2,x=this.boxes,f=i,m=o+1,_=h;do{if(m--,m<0)return x;_-=e[m].dist(f),f=e[m]}while(_>-s/2);for(var b=e[m].dist(e[m+1]),v=0;v=e.length)return x;b=e[m].dist(e[m+1])}var g=c-_,p=e[m],C=e[m+1],B=C.sub(p)._unit()._mult(g)._add(p)._round(),M=Math.max(Math.abs(c-h)-d/2,0),y=s/2/M;t.emplaceBack(B.x,B.y,-a/2,-a/2,a/2,a/2,y,n,r,l,0,0,0,0,0)}return x},module.exports=CollisionFeature; +},{}],80:[function(require,module,exports){ +"use strict";var Point=require("point-geometry"),EXTENT=require("../data/extent"),Grid=require("grid-index"),intersectionTests=require("../util/intersection_tests"),CollisionTile=function(t,e,i){if("object"==typeof t){var r=t;i=e,t=r.angle,e=r.pitch,this.grid=new Grid(r.grid),this.ignoredGrid=new Grid(r.ignoredGrid)}else this.grid=new Grid(EXTENT,12,6),this.ignoredGrid=new Grid(EXTENT,12,0);this.minScale=.5,this.maxScale=2,this.angle=t,this.pitch=e;var a=Math.sin(t),o=Math.cos(t);if(this.rotationMatrix=[o,-a,a,o],this.reverseRotationMatrix=[o,a,-a,o],this.yStretch=1/Math.cos(e/180*Math.PI),this.yStretch=Math.pow(this.yStretch,1.3),this.collisionBoxArray=i,0===i.length){i.emplaceBack();var n=32767;i.emplaceBack(0,0,0,-n,0,n,n,0,0,0,0,0,0,0,0,0),i.emplaceBack(EXTENT,0,0,-n,0,n,n,0,0,0,0,0,0,0,0,0),i.emplaceBack(0,0,-n,0,n,0,n,0,0,0,0,0,0,0,0,0),i.emplaceBack(0,EXTENT,-n,0,n,0,n,0,0,0,0,0,0,0,0,0)}this.tempCollisionBox=i.get(0),this.edges=[i.get(1),i.get(2),i.get(3),i.get(4)]};CollisionTile.prototype.serialize=function(t){var e=this.grid.toArrayBuffer(),i=this.ignoredGrid.toArrayBuffer();return t&&(t.push(e),t.push(i)),{angle:this.angle,pitch:this.pitch,grid:e,ignoredGrid:i}},CollisionTile.prototype.placeCollisionFeature=function(t,e,i){for(var r=this,a=this.collisionBoxArray,o=this.minScale,n=this.rotationMatrix,l=this.yStretch,h=t.boxStartIndex;h=r.maxScale)return o}if(i){var S;if(r.angle){var P=r.reverseRotationMatrix,b=new Point(s.x1,s.y1).matMult(P),T=new Point(s.x2,s.y1).matMult(P),w=new Point(s.x1,s.y2).matMult(P),N=new Point(s.x2,s.y2).matMult(P);S=r.tempCollisionBox,S.anchorPointX=s.anchorPoint.x,S.anchorPointY=s.anchorPoint.y,S.x1=Math.min(b.x,T.x,w.x,N.x),S.y1=Math.min(b.y,T.x,w.x,N.x),S.x2=Math.max(b.x,T.x,w.x,N.x),S.y2=Math.max(b.y,T.x,w.x,N.x),S.maxScale=s.maxScale}else S=s;for(var B=0;B=r.maxScale)return o}}}return o},CollisionTile.prototype.queryRenderedSymbols=function(t,e){var i={},r=[];if(0===t.length||0===this.grid.length&&0===this.ignoredGrid.length)return r;for(var a=this.collisionBoxArray,o=this.rotationMatrix,n=this.yStretch,l=[],h=1/0,s=1/0,x=-(1/0),c=-(1/0),g=0;gS.maxScale)){var T=S.anchorPoint.matMult(o),w=T.x+S.x1/e,N=T.y+S.y1/e*n,B=T.x+S.x2/e,G=T.y+S.y2/e*n,E=[new Point(w,N),new Point(B,N),new Point(B,G),new Point(w,G)];intersectionTests.polygonIntersectsPolygon(l,E)&&(i[P][b]=!0,r.push(u[v]))}}return r},CollisionTile.prototype.getPlacementScale=function(t,e,i,r,a){var o=e.x-r.x,n=e.y-r.y,l=(a.x1-i.x2)/o,h=(a.x2-i.x1)/o,s=(a.y1-i.y2)*this.yStretch/n,x=(a.y2-i.y1)*this.yStretch/n;(isNaN(l)||isNaN(h))&&(l=h=1),(isNaN(s)||isNaN(x))&&(s=x=1);var c=Math.min(Math.max(l,h),Math.max(s,x)),g=a.maxScale,y=i.maxScale;return c>g&&(c=g),c>y&&(c=y),c>t&&c>=a.placementScale&&(t=c),t},CollisionTile.prototype.insertCollisionFeature=function(t,e,i){for(var r=this,a=i?this.ignoredGrid:this.grid,o=this.collisionBoxArray,n=t.boxStartIndex;n=0&&k=0&&q=0&&p+c<=s){var M=new Anchor(k,q,y,f)._round();n&&!checkMaxAngle(e,M,l,n,a)||x.push(M)}}g+=A}return i||x.length||o||(x=resample(e,g/2,t,n,a,l,o,!0,h)),x}var interpolate=require("../util/interpolate"),Anchor=require("../symbol/anchor"),checkMaxAngle=require("./check_max_angle");module.exports=getAnchors; +},{"../symbol/anchor":75,"../util/interpolate":121,"./check_max_angle":76}],82:[function(require,module,exports){ +"use strict";var ShelfPack=require("shelf-pack"),util=require("../util/util"),SIZE_GROWTH_RATE=4,DEFAULT_SIZE=128,MAX_SIZE=2048,GlyphAtlas=function(){this.width=DEFAULT_SIZE,this.height=DEFAULT_SIZE,this.bin=new ShelfPack(this.width,this.height),this.index={},this.ids={},this.data=new Uint8Array(this.width*this.height)};GlyphAtlas.prototype.getGlyphs=function(){var t,i,e,h={};for(var r in this.ids)t=r.split("#"),i=t[0],e=t[1],h[i]||(h[i]=[]),h[i].push(e);return h},GlyphAtlas.prototype.getRects=function(){var t,i,e,h=this,r={};for(var s in this.ids)t=s.split("#"),i=t[0],e=t[1],r[i]||(r[i]={}),r[i][e]=h.index[s];return r},GlyphAtlas.prototype.addGlyph=function(t,i,e,h){var r=this;if(!e)return null;var s=i+"#"+e.id;if(this.index[s])return this.ids[s].indexOf(t)<0&&this.ids[s].push(t),this.index[s];if(!e.bitmap)return null;var a=e.width+2*h,n=e.height+2*h,E=1,T=a+2*E,u=n+2*E;T+=4-T%4,u+=4-u%4;var l=this.bin.packOne(T,u);if(l||(this.resize(),l=this.bin.packOne(T,u)),!l)return util.warnOnce("glyph bitmap overflow"),null;this.index[s]=l,this.ids[s]=[t];for(var d=this.data,A=e.bitmap,_=0;_=MAX_SIZE||e>=MAX_SIZE)){this.texture&&(this.gl&&this.gl.deleteTexture(this.texture),this.texture=null),this.width*=SIZE_GROWTH_RATE,this.height*=SIZE_GROWTH_RATE,this.bin.resize(this.width,this.height);for(var h=new ArrayBuffer(this.width*this.height),r=0;r65535)return a("glyphs > 65535 not supported");void 0===this.loading[t]&&(this.loading[t]={});var l=this.loading[t];if(l[e])l[e].push(a);else{l[e]=[a];var i=256*e+"-"+(256*e+255),r=glyphUrl(t,i,this.url);ajax.getArrayBuffer(r,function(t,a){for(var i=!t&&new Glyphs(new Protobuf(a.data)),r=0;r1?2:1,this.canvas&&(this.canvas.width=this.width*this.pixelRatio,this.canvas.height=this.height*this.pixelRatio)),this.sprite=t},SpriteAtlas.prototype.addIcons=function(t,i){for(var e=this,h=0;h1||(b?(clearTimeout(b),b=null,h("dblclick",t)):b=setTimeout(l,300))}function i(e){f("touchmove",e)}function c(e){f("touchend",e)}function d(e){f("touchcancel",e)}function l(){b=null}function s(e){var t=DOM.mousePos(g,e);t.equals(L)&&h("click",e)}function v(e){h("dblclick",e),e.preventDefault()}function m(t){var n=e.dragRotate&&e.dragRotate.isActive();E||n?E&&(p=t):h("contextmenu",t),t.preventDefault()}function h(t,n){var o=DOM.mousePos(g,n);return e.fire(t,{lngLat:e.unproject(o),point:o,originalEvent:n})}function f(t,n){var o=DOM.touchPos(g,n),r=o.reduce(function(e,t,n,o){return e.add(t.div(o.length))},new Point(0,0));return e.fire(t,{lngLat:e.unproject(r),point:r,lngLats:o.map(function(t){return e.unproject(t)},this),points:o,originalEvent:n})}var g=e.getCanvasContainer(),p=null,E=!1,L=null,b=null;for(var q in handlers)e[q]=new handlers[q](e,t),t.interactive&&t[q]&&e[q].enable(t[q]);g.addEventListener("mouseout",n,!1),g.addEventListener("mousedown",o,!1),g.addEventListener("mouseup",r,!1),g.addEventListener("mousemove",a,!1),g.addEventListener("touchstart",u,!1),g.addEventListener("touchend",c,!1),g.addEventListener("touchmove",i,!1),g.addEventListener("touchcancel",d,!1),g.addEventListener("click",s,!1),g.addEventListener("dblclick",v,!1),g.addEventListener("contextmenu",m,!1)}; +},{"../util/dom":117,"./handler/box_zoom":97,"./handler/dblclick_zoom":98,"./handler/drag_pan":99,"./handler/drag_rotate":100,"./handler/keyboard":101,"./handler/scroll_zoom":102,"./handler/touch_zoom_rotate":103,"point-geometry":197}],92:[function(require,module,exports){ +"use strict";var util=require("../util/util"),interpolate=require("../util/interpolate"),browser=require("../util/browser"),LngLat=require("../geo/lng_lat"),LngLatBounds=require("../geo/lng_lat_bounds"),Point=require("point-geometry"),Evented=require("../util/evented"),Camera=function(t){function i(i,e){t.call(this),this.moving=!1,this.transform=i,this._bearingSnap=e.bearingSnap}return t&&(i.__proto__=t),i.prototype=Object.create(t&&t.prototype),i.prototype.constructor=i,i.prototype.getCenter=function(){return this.transform.center},i.prototype.setCenter=function(t,i){return this.jumpTo({center:t},i),this},i.prototype.panBy=function(t,i,e){return this.panTo(this.transform.center,util.extend({offset:Point.convert(t).mult(-1)},i),e),this},i.prototype.panTo=function(t,i,e){return this.easeTo(util.extend({center:t},i),e)},i.prototype.getZoom=function(){return this.transform.zoom},i.prototype.setZoom=function(t,i){return this.jumpTo({zoom:t},i),this},i.prototype.zoomTo=function(t,i,e){return this.easeTo(util.extend({zoom:t},i),e)},i.prototype.zoomIn=function(t,i){return this.zoomTo(this.getZoom()+1,t,i),this},i.prototype.zoomOut=function(t,i){return this.zoomTo(this.getZoom()-1,t,i),this},i.prototype.getBearing=function(){return this.transform.bearing},i.prototype.setBearing=function(t,i){return this.jumpTo({bearing:t},i),this},i.prototype.rotateTo=function(t,i,e){return this.easeTo(util.extend({bearing:t},i),e)},i.prototype.resetNorth=function(t,i){return this.rotateTo(0,util.extend({duration:1e3},t),i),this},i.prototype.snapToNorth=function(t,i){return Math.abs(this.getBearing())180&&(s.center.lng>0&&c.lng<0?c.lng+=360:s.center.lng<0&&c.lng>0&&(c.lng-=360));var d=s.zoomScale(m-h),l=s.point,v="center"in t?s.project(c).sub(a.div(d)):l,b=t.curve,z=Math.max(s.width,s.height),y=z/d,_=v.sub(l).mag();if("minZoom"in t){var M=util.clamp(Math.min(t.minZoom,h,m),s.minZoom,s.maxZoom),T=z/s.zoomScale(M-h);b=Math.sqrt(T/_*2)}var E=b*b,x=e(0),L=function(t){return n(x)/n(x+b*t)},Z=function(t){return z*((n(x)*r(x+b*t)-o(x))/E)/_},P=(e(1)-x)/b;if(Math.abs(_)<1e-6){if(Math.abs(z-y)<1e-6)return this.easeTo(t);var B=y=0)return!1;return!0}),this._container.innerHTML=t.join(" | "),this._editLink=null}},AttributionControl.prototype._updateCompact=function(){var t=this._map.getCanvasContainer().offsetWidth<=640;this._container.classList[t?"add":"remove"]("compact")},module.exports=AttributionControl; +},{"../../util/dom":117,"../../util/util":129}],94:[function(require,module,exports){ +"use strict";function checkGeolocationSupport(t){void 0!==supportsGeolocation?t(supportsGeolocation):void 0!==window.navigator.permissions?window.navigator.permissions.query({name:"geolocation"}).then(function(o){supportsGeolocation="denied"!==o.state,t(supportsGeolocation)}):(supportsGeolocation=!!window.navigator.geolocation,t(supportsGeolocation))}var Evented=require("../../util/evented"),DOM=require("../../util/dom"),window=require("../../util/window"),util=require("../../util/util"),defaultGeoPositionOptions={enableHighAccuracy:!1,timeout:6e3},className="mapboxgl-ctrl",supportsGeolocation,GeolocateControl=function(t){function o(o){t.call(this),this.options=o||{},util.bindAll(["_onSuccess","_onError","_finish","_setupUI"],this)}return t&&(o.__proto__=t),o.prototype=Object.create(t&&t.prototype),o.prototype.constructor=o,o.prototype.onAdd=function(t){return this._map=t,this._container=DOM.create("div",className+" "+className+"-group"),checkGeolocationSupport(this._setupUI),this._container},o.prototype.onRemove=function(){this._container.parentNode.removeChild(this._container),this._map=void 0},o.prototype._onSuccess=function(t){this._map.jumpTo({center:[t.coords.longitude,t.coords.latitude],zoom:17,bearing:0,pitch:0}),this.fire("geolocate",t),this._finish()},o.prototype._onError=function(t){this.fire("error",t),this._finish()},o.prototype._finish=function(){this._timeoutId&&clearTimeout(this._timeoutId),this._timeoutId=void 0},o.prototype._setupUI=function(t){t!==!1&&(this._container.addEventListener("contextmenu",function(t){return t.preventDefault()}),this._geolocateButton=DOM.create("button",className+"-icon "+className+"-geolocate",this._container),this._geolocateButton.type="button",this._geolocateButton.setAttribute("aria-label","Geolocate"),this.options.watchPosition&&this._geolocateButton.setAttribute("aria-pressed",!1),this._geolocateButton.addEventListener("click",this._onClickGeolocate.bind(this)))},o.prototype._onClickGeolocate=function(){var t=util.extend(defaultGeoPositionOptions,this.options&&this.options.positionOptions||{});this.options.watchPosition?void 0!==this._geolocationWatchID?(this._geolocateButton.classList.remove("watching"),this._geolocateButton.setAttribute("aria-pressed",!1),window.navigator.geolocation.clearWatch(this._geolocationWatchID),this._geolocationWatchID=void 0):(this._geolocateButton.classList.add("watching"),this._geolocateButton.setAttribute("aria-pressed",!0),this._geolocationWatchID=window.navigator.geolocation.watchPosition(this._onSuccess,this._onError,t)):(window.navigator.geolocation.getCurrentPosition(this._onSuccess,this._onError,t),this._timeoutId=setTimeout(this._finish,1e4))},o}(Evented);module.exports=GeolocateControl; +},{"../../util/dom":117,"../../util/evented":118,"../../util/util":129,"../../util/window":112}],95:[function(require,module,exports){ +"use strict";function copyMouseEvent(t){return new window.MouseEvent(t.type,{button:2,buttons:2,bubbles:!0,cancelable:!0,detail:t.detail,view:t.view,screenX:t.screenX,screenY:t.screenY,clientX:t.clientX,clientY:t.clientY,movementX:t.movementX,movementY:t.movementY,ctrlKey:t.ctrlKey,shiftKey:t.shiftKey,altKey:t.altKey,metaKey:t.metaKey})}var DOM=require("../../util/dom"),window=require("../../util/window"),util=require("../../util/util"),className="mapboxgl-ctrl",NavigationControl=function(){util.bindAll(["_rotateCompassArrow"],this)};NavigationControl.prototype._rotateCompassArrow=function(){var t="rotate("+this._map.transform.angle*(180/Math.PI)+"deg)";this._compassArrow.style.transform=t},NavigationControl.prototype.onAdd=function(t){return this._map=t,this._container=DOM.create("div",className+" "+className+"-group",t.getContainer()),this._container.addEventListener("contextmenu",this._onContextMenu.bind(this)),this._zoomInButton=this._createButton(className+"-icon "+className+"-zoom-in","Zoom In",t.zoomIn.bind(t)),this._zoomOutButton=this._createButton(className+"-icon "+className+"-zoom-out","Zoom Out",t.zoomOut.bind(t)),this._compass=this._createButton(className+"-icon "+className+"-compass","Reset North",t.resetNorth.bind(t)),this._compassArrow=DOM.create("span","arrow",this._compass),this._compass.addEventListener("mousedown",this._onCompassDown.bind(this)),this._onCompassMove=this._onCompassMove.bind(this),this._onCompassUp=this._onCompassUp.bind(this),this._map.on("rotate",this._rotateCompassArrow),this._rotateCompassArrow(),this._container},NavigationControl.prototype.onRemove=function(){this._container.parentNode.removeChild(this._container),this._map.off("rotate",this._rotateCompassArrow),this._map=void 0},NavigationControl.prototype._onContextMenu=function(t){t.preventDefault()},NavigationControl.prototype._onCompassDown=function(t){0===t.button&&(DOM.disableDrag(),window.document.addEventListener("mousemove",this._onCompassMove),window.document.addEventListener("mouseup",this._onCompassUp),this._map.getCanvasContainer().dispatchEvent(copyMouseEvent(t)),t.stopPropagation())},NavigationControl.prototype._onCompassMove=function(t){0===t.button&&(this._map.getCanvasContainer().dispatchEvent(copyMouseEvent(t)),t.stopPropagation())},NavigationControl.prototype._onCompassUp=function(t){0===t.button&&(window.document.removeEventListener("mousemove",this._onCompassMove),window.document.removeEventListener("mouseup",this._onCompassUp),DOM.enableDrag(),this._map.getCanvasContainer().dispatchEvent(copyMouseEvent(t)),t.stopPropagation())},NavigationControl.prototype._createButton=function(t,o,e){var n=DOM.create("button",t,this._container);return n.type="button",n.setAttribute("aria-label",o),n.addEventListener("click",function(){e()}),n},module.exports=NavigationControl; +},{"../../util/dom":117,"../../util/util":129,"../../util/window":112}],96:[function(require,module,exports){ +"use strict";function updateScale(t,e,o){var n=o&&o.maxWidth||100,i=t._container.clientHeight/2,a=getDistance(t.unproject([0,i]),t.unproject([n,i]));if(o&&"imperial"===o.unit){var r=3.2808*a;if(r>5280){var l=r/5280;setScale(e,n,l,"mi")}else setScale(e,n,r,"ft")}else setScale(e,n,a,"m")}function setScale(t,e,o,n){var i=getRoundNum(o),a=i/o;"m"===n&&i>=1e3&&(i/=1e3,n="km"),t.style.width=e*a+"px",t.innerHTML=i+n}function getDistance(t,e){var o=6371e3,n=Math.PI/180,i=t.lat*n,a=e.lat*n,r=Math.sin(i)*Math.sin(a)+Math.cos(i)*Math.cos(a)*Math.cos((e.lng-t.lng)*n),l=o*Math.acos(Math.min(r,1));return l}function getRoundNum(t){var e=Math.pow(10,(""+Math.floor(t)).length-1),o=t/e;return o=o>=10?10:o>=5?5:o>=3?3:o>=2?2:1,e*o}var DOM=require("../../util/dom"),util=require("../../util/util"),ScaleControl=function(t){this.options=t,util.bindAll(["_onMove"],this)};ScaleControl.prototype.getDefaultPosition=function(){return"bottom-left"},ScaleControl.prototype._onMove=function(){updateScale(this._map,this._container,this.options)},ScaleControl.prototype.onAdd=function(t){return this._map=t,this._container=DOM.create("div","mapboxgl-ctrl mapboxgl-ctrl-scale",t.getContainer()),this._map.on("move",this._onMove),this._onMove(),this._container},ScaleControl.prototype.onRemove=function(){this._container.parentNode.removeChild(this._container),this._map.off("move",this._onMove),this._map=void 0},module.exports=ScaleControl; +},{"../../util/dom":117,"../../util/util":129}],97:[function(require,module,exports){ +"use strict";var DOM=require("../../util/dom"),LngLatBounds=require("../../geo/lng_lat_bounds"),util=require("../../util/util"),window=require("../../util/window"),BoxZoomHandler=function(o){this._map=o,this._el=o.getCanvasContainer(),this._container=o.getContainer(),util.bindAll(["_onMouseDown","_onMouseMove","_onMouseUp","_onKeyDown"],this)};BoxZoomHandler.prototype.isEnabled=function(){return!!this._enabled},BoxZoomHandler.prototype.isActive=function(){return!!this._active},BoxZoomHandler.prototype.enable=function(){this.isEnabled()||(this._el.addEventListener("mousedown",this._onMouseDown,!1),this._enabled=!0)},BoxZoomHandler.prototype.disable=function(){this.isEnabled()&&(this._el.removeEventListener("mousedown",this._onMouseDown),this._enabled=!1)},BoxZoomHandler.prototype._onMouseDown=function(o){o.shiftKey&&0===o.button&&(window.document.addEventListener("mousemove",this._onMouseMove,!1),window.document.addEventListener("keydown",this._onKeyDown,!1),window.document.addEventListener("mouseup",this._onMouseUp,!1),DOM.disableDrag(),this._startPos=DOM.mousePos(this._el,o),this._active=!0)},BoxZoomHandler.prototype._onMouseMove=function(o){var e=this._startPos,t=DOM.mousePos(this._el,o);this._box||(this._box=DOM.create("div","mapboxgl-boxzoom",this._container),this._container.classList.add("mapboxgl-crosshair"),this._fireEvent("boxzoomstart",o));var n=Math.min(e.x,t.x),i=Math.max(e.x,t.x),s=Math.min(e.y,t.y),r=Math.max(e.y,t.y);DOM.setTransform(this._box,"translate("+n+"px,"+s+"px)"),this._box.style.width=i-n+"px",this._box.style.height=r-s+"px"},BoxZoomHandler.prototype._onMouseUp=function(o){if(0===o.button){var e=this._startPos,t=DOM.mousePos(this._el,o),n=(new LngLatBounds).extend(this._map.unproject(e)).extend(this._map.unproject(t));this._finish(),e.x===t.x&&e.y===t.y?this._fireEvent("boxzoomcancel",o):this._map.fitBounds(n,{linear:!0}).fire("boxzoomend",{originalEvent:o,boxZoomBounds:n})}},BoxZoomHandler.prototype._onKeyDown=function(o){27===o.keyCode&&(this._finish(),this._fireEvent("boxzoomcancel",o))},BoxZoomHandler.prototype._finish=function(){this._active=!1,window.document.removeEventListener("mousemove",this._onMouseMove,!1),window.document.removeEventListener("keydown",this._onKeyDown,!1),window.document.removeEventListener("mouseup",this._onMouseUp,!1),this._container.classList.remove("mapboxgl-crosshair"),this._box&&(this._box.parentNode.removeChild(this._box),this._box=null),DOM.enableDrag()},BoxZoomHandler.prototype._fireEvent=function(o,e){return this._map.fire(o,{originalEvent:e})},module.exports=BoxZoomHandler; +},{"../../geo/lng_lat_bounds":20,"../../util/dom":117,"../../util/util":129,"../../util/window":112}],98:[function(require,module,exports){ +"use strict";var DoubleClickZoomHandler=function(o){this._map=o,this._onDblClick=this._onDblClick.bind(this)};DoubleClickZoomHandler.prototype.isEnabled=function(){return!!this._enabled},DoubleClickZoomHandler.prototype.enable=function(){this.isEnabled()||(this._map.on("dblclick",this._onDblClick),this._enabled=!0)},DoubleClickZoomHandler.prototype.disable=function(){this.isEnabled()&&(this._map.off("dblclick",this._onDblClick),this._enabled=!1)},DoubleClickZoomHandler.prototype._onDblClick=function(o){this._map.zoomTo(this._map.getZoom()+(o.originalEvent.shiftKey?-1:1),{around:o.lngLat},o)},module.exports=DoubleClickZoomHandler; +},{}],99:[function(require,module,exports){ +"use strict";var DOM=require("../../util/dom"),util=require("../../util/util"),window=require("../../util/window"),inertiaLinearity=.3,inertiaEasing=util.bezier(0,0,inertiaLinearity,1),inertiaMaxSpeed=1400,inertiaDeceleration=2500,DragPanHandler=function(t){this._map=t,this._el=t.getCanvasContainer(),util.bindAll(["_onDown","_onMove","_onUp","_onTouchEnd","_onMouseUp"],this)};DragPanHandler.prototype.isEnabled=function(){return!!this._enabled},DragPanHandler.prototype.isActive=function(){return!!this._active},DragPanHandler.prototype.enable=function(){this.isEnabled()||(this._el.addEventListener("mousedown",this._onDown),this._el.addEventListener("touchstart",this._onDown),this._enabled=!0)},DragPanHandler.prototype.disable=function(){this.isEnabled()&&(this._el.removeEventListener("mousedown",this._onDown),this._el.removeEventListener("touchstart",this._onDown),this._enabled=!1)},DragPanHandler.prototype._onDown=function(t){this._ignoreEvent(t)||this.isActive()||(t.touches?(window.document.addEventListener("touchmove",this._onMove),window.document.addEventListener("touchend",this._onTouchEnd)):(window.document.addEventListener("mousemove",this._onMove),window.document.addEventListener("mouseup",this._onMouseUp)),this._active=!1,this._startPos=this._pos=DOM.mousePos(this._el,t),this._inertia=[[Date.now(),this._pos]])},DragPanHandler.prototype._onMove=function(t){if(!this._ignoreEvent(t)){this.isActive()||(this._active=!0,this._fireEvent("dragstart",t),this._fireEvent("movestart",t));var e=DOM.mousePos(this._el,t),n=this._map;n.stop(),this._drainInertiaBuffer(),this._inertia.push([Date.now(),e]),n.transform.setLocationAtPoint(n.transform.pointLocation(this._pos),e),this._fireEvent("drag",t),this._fireEvent("move",t),this._pos=e,t.preventDefault()}},DragPanHandler.prototype._onUp=function(t){var e=this;if(this.isActive()){this._active=!1,this._fireEvent("dragend",t),this._drainInertiaBuffer();var n=function(){return e._fireEvent("moveend",t)},i=this._inertia;if(i.length<2)return void n();var o=i[i.length-1],r=i[0],a=o[1].sub(r[1]),s=(o[0]-r[0])/1e3;if(0===s||o[1].equals(r[1]))return void n();var u=a.mult(inertiaLinearity/s),h=u.mag();h>inertiaMaxSpeed&&(h=inertiaMaxSpeed,u._unit()._mult(h));var d=h/(inertiaDeceleration*inertiaLinearity),v=u.mult(-d/2);this._map.panBy(v,{duration:1e3*d,easing:inertiaEasing,noMoveStart:!0},{originalEvent:t})}},DragPanHandler.prototype._onMouseUp=function(t){this._ignoreEvent(t)||(this._onUp(t),window.document.removeEventListener("mousemove",this._onMove),window.document.removeEventListener("mouseup",this._onMouseUp))},DragPanHandler.prototype._onTouchEnd=function(t){this._ignoreEvent(t)||(this._onUp(t),window.document.removeEventListener("touchmove",this._onMove),window.document.removeEventListener("touchend",this._onTouchEnd))},DragPanHandler.prototype._fireEvent=function(t,e){return this._map.fire(t,{originalEvent:e})},DragPanHandler.prototype._ignoreEvent=function(t){var e=this._map;if(e.boxZoom&&e.boxZoom.isActive())return!0;if(e.dragRotate&&e.dragRotate.isActive())return!0;if(t.touches)return t.touches.length>1;if(t.ctrlKey)return!0;var n=1,i=0;return"mousemove"===t.type?t.buttons&0===n:t.button!==i},DragPanHandler.prototype._drainInertiaBuffer=function(){for(var t=this._inertia,e=Date.now(),n=160;t.length>0&&e-t[0][0]>n;)t.shift()},module.exports=DragPanHandler; +},{"../../util/dom":117,"../../util/util":129,"../../util/window":112}],100:[function(require,module,exports){ +"use strict";var DOM=require("../../util/dom"),util=require("../../util/util"),window=require("../../util/window"),inertiaLinearity=.25,inertiaEasing=util.bezier(0,0,inertiaLinearity,1),inertiaMaxSpeed=180,inertiaDeceleration=720,DragRotateHandler=function(t,e){this._map=t,this._el=t.getCanvasContainer(),this._bearingSnap=e.bearingSnap,this._pitchWithRotate=e.pitchWithRotate!==!1,util.bindAll(["_onDown","_onMove","_onUp"],this)};DragRotateHandler.prototype.isEnabled=function(){return!!this._enabled},DragRotateHandler.prototype.isActive=function(){return!!this._active},DragRotateHandler.prototype.enable=function(){this.isEnabled()||(this._el.addEventListener("mousedown",this._onDown),this._enabled=!0)},DragRotateHandler.prototype.disable=function(){this.isEnabled()&&(this._el.removeEventListener("mousedown",this._onDown),this._enabled=!1)},DragRotateHandler.prototype._onDown=function(t){this._ignoreEvent(t)||this.isActive()||(window.document.addEventListener("mousemove",this._onMove),window.document.addEventListener("mouseup",this._onUp),this._active=!1,this._inertia=[[Date.now(),this._map.getBearing()]],this._startPos=this._pos=DOM.mousePos(this._el,t),this._center=this._map.transform.centerPoint,t.preventDefault())},DragRotateHandler.prototype._onMove=function(t){if(!this._ignoreEvent(t)){this.isActive()||(this._active=!0,this._fireEvent("rotatestart",t),this._fireEvent("movestart",t));var e=this._map;e.stop();var i=this._pos,n=DOM.mousePos(this._el,t),r=.8*(i.x-n.x),a=(i.y-n.y)*-.5,o=e.getBearing()-r,s=e.getPitch()-a,h=this._inertia,_=h[h.length-1];this._drainInertiaBuffer(),h.push([Date.now(),e._normalizeBearing(o,_[1])]),e.transform.bearing=o,this._pitchWithRotate&&(e.transform.pitch=s),this._fireEvent("rotate",t),this._fireEvent("move",t),this._pos=n}},DragRotateHandler.prototype._onUp=function(t){var e=this;if(!this._ignoreEvent(t)&&(window.document.removeEventListener("mousemove",this._onMove),window.document.removeEventListener("mouseup",this._onUp),this.isActive())){this._active=!1,this._fireEvent("rotateend",t),this._drainInertiaBuffer();var i=this._map,n=i.getBearing(),r=this._inertia,a=function(){Math.abs(n)inertiaMaxSpeed&&(l=inertiaMaxSpeed);var p=l/(inertiaDeceleration*inertiaLinearity),g=u*l*(p/2);_+=g,Math.abs(i._normalizeBearing(_,0))1;var i=t.ctrlKey?1:2,n=t.ctrlKey?0:2,r=t.button;return"undefined"!=typeof InstallTrigger&&2===t.button&&t.ctrlKey&&window.navigator.platform.toUpperCase().indexOf("MAC")>=0&&(r=0),"mousemove"===t.type?t.buttons&0===i:r!==n},DragRotateHandler.prototype._drainInertiaBuffer=function(){for(var t=this._inertia,e=Date.now(),i=160;t.length>0&&e-t[0][0]>i;)t.shift()},module.exports=DragRotateHandler; +},{"../../util/dom":117,"../../util/util":129,"../../util/window":112}],101:[function(require,module,exports){ +"use strict";function easeOut(e){return e*(2-e)}var panStep=100,bearingStep=15,pitchStep=10,KeyboardHandler=function(e){this._map=e,this._el=e.getCanvasContainer(),this._onKeyDown=this._onKeyDown.bind(this)};KeyboardHandler.prototype.isEnabled=function(){return!!this._enabled},KeyboardHandler.prototype.enable=function(){this.isEnabled()||(this._el.addEventListener("keydown",this._onKeyDown,!1),this._enabled=!0)},KeyboardHandler.prototype.disable=function(){this.isEnabled()&&(this._el.removeEventListener("keydown",this._onKeyDown),this._enabled=!1)},KeyboardHandler.prototype._onKeyDown=function(e){if(!(e.altKey||e.ctrlKey||e.metaKey)){var t=0,n=0,a=0,i=0,r=0;switch(e.keyCode){case 61:case 107:case 171:case 187:t=1;break;case 189:case 109:case 173:t=-1;break;case 37:e.shiftKey?n=-1:(e.preventDefault(),i=-1);break;case 39:e.shiftKey?n=1:(e.preventDefault(),i=1);break;case 38:e.shiftKey?a=1:(e.preventDefault(),r=-1);break;case 40:e.shiftKey?a=-1:(r=1,e.preventDefault())}var s=this._map,o=s.getZoom(),d={duration:300,delayEndEvents:500,easing:easeOut,zoom:t?Math.round(o)+t*(e.shiftKey?2:1):o,bearing:s.getBearing()+n*bearingStep,pitch:s.getPitch()+a*pitchStep,offset:[-i*panStep,-r*panStep],center:s.getCenter()};s.easeTo(d,{originalEvent:e})}},module.exports=KeyboardHandler; +},{}],102:[function(require,module,exports){ +"use strict";var DOM=require("../../util/dom"),util=require("../../util/util"),browser=require("../../util/browser"),window=require("../../util/window"),ua=window.navigator.userAgent.toLowerCase(),firefox=ua.indexOf("firefox")!==-1,safari=ua.indexOf("safari")!==-1&&ua.indexOf("chrom")===-1,ScrollZoomHandler=function(e){this._map=e,this._el=e.getCanvasContainer(),util.bindAll(["_onWheel","_onTimeout"],this)};ScrollZoomHandler.prototype.isEnabled=function(){return!!this._enabled},ScrollZoomHandler.prototype.enable=function(e){this.isEnabled()||(this._el.addEventListener("wheel",this._onWheel,!1),this._el.addEventListener("mousewheel",this._onWheel,!1),this._enabled=!0,this._aroundCenter=e&&"center"===e.around)},ScrollZoomHandler.prototype.disable=function(){this.isEnabled()&&(this._el.removeEventListener("wheel",this._onWheel),this._el.removeEventListener("mousewheel",this._onWheel),this._enabled=!1)},ScrollZoomHandler.prototype._onWheel=function(e){var t;"wheel"===e.type?(t=e.deltaY,firefox&&e.deltaMode===window.WheelEvent.DOM_DELTA_PIXEL&&(t/=browser.devicePixelRatio),e.deltaMode===window.WheelEvent.DOM_DELTA_LINE&&(t*=40)):"mousewheel"===e.type&&(t=-e.wheelDeltaY,safari&&(t/=3));var o=browser.now(),i=o-(this._time||0);this._pos=DOM.mousePos(this._el,e),this._time=o,0!==t&&t%4.000244140625===0?this._type="wheel":0!==t&&Math.abs(t)<4?this._type="trackpad":i>400?(this._type=null,this._lastValue=t,this._timeout=setTimeout(this._onTimeout,40)):this._type||(this._type=Math.abs(i*t)<200?"trackpad":"wheel",this._timeout&&(clearTimeout(this._timeout),this._timeout=null,t+=this._lastValue)),e.shiftKey&&t&&(t/=4),this._type&&this._zoom(-t,e),e.preventDefault()},ScrollZoomHandler.prototype._onTimeout=function(){this._type="wheel",this._zoom(-this._lastValue)},ScrollZoomHandler.prototype._zoom=function(e,t){if(0!==e){var o=this._map,i=2/(1+Math.exp(-Math.abs(e/100)));e<0&&0!==i&&(i=1/i);var l=o.ease?o.ease.to:o.transform.scale,s=o.transform.scaleZoom(l*i);o.zoomTo(s,{duration:"wheel"===this._type?200:0,around:this._aroundCenter?o.getCenter():o.unproject(this._pos),delayEndEvents:200,smoothEasing:!0},{originalEvent:t})}},module.exports=ScrollZoomHandler; +},{"../../util/browser":110,"../../util/dom":117,"../../util/util":129,"../../util/window":112}],103:[function(require,module,exports){ +"use strict";var DOM=require("../../util/dom"),util=require("../../util/util"),window=require("../../util/window"),inertiaLinearity=.15,inertiaEasing=util.bezier(0,0,inertiaLinearity,1),inertiaDeceleration=12,inertiaMaxSpeed=2.5,significantScaleThreshold=.15,significantRotateThreshold=4,TouchZoomRotateHandler=function(t){this._map=t,this._el=t.getCanvasContainer(),util.bindAll(["_onStart","_onMove","_onEnd"],this)};TouchZoomRotateHandler.prototype.isEnabled=function(){return!!this._enabled},TouchZoomRotateHandler.prototype.enable=function(t){this.isEnabled()||(this._el.addEventListener("touchstart",this._onStart,!1),this._enabled=!0,this._aroundCenter=t&&"center"===t.around)},TouchZoomRotateHandler.prototype.disable=function(){this.isEnabled()&&(this._el.removeEventListener("touchstart",this._onStart),this._enabled=!1)},TouchZoomRotateHandler.prototype.disableRotation=function(){this._rotationDisabled=!0},TouchZoomRotateHandler.prototype.enableRotation=function(){this._rotationDisabled=!1},TouchZoomRotateHandler.prototype._onStart=function(t){if(2===t.touches.length){var e=DOM.mousePos(this._el,t.touches[0]),o=DOM.mousePos(this._el,t.touches[1]);this._startVec=e.sub(o),this._startScale=this._map.transform.scale,this._startBearing=this._map.transform.bearing,this._gestureIntent=void 0,this._inertia=[],window.document.addEventListener("touchmove",this._onMove,!1),window.document.addEventListener("touchend",this._onEnd,!1)}},TouchZoomRotateHandler.prototype._onMove=function(t){if(2===t.touches.length){var e=DOM.mousePos(this._el,t.touches[0]),o=DOM.mousePos(this._el,t.touches[1]),i=e.add(o).div(2),n=e.sub(o),a=n.mag()/this._startVec.mag(),r=this._rotationDisabled?0:180*n.angleWith(this._startVec)/Math.PI,s=this._map;if(this._gestureIntent){var h={duration:0,around:s.unproject(i)};"rotate"===this._gestureIntent&&(h.bearing=this._startBearing+r),"zoom"!==this._gestureIntent&&"rotate"!==this._gestureIntent||(h.zoom=s.transform.scaleZoom(this._startScale*a)),s.stop(),this._drainInertiaBuffer(),this._inertia.push([Date.now(),a,i]),s.easeTo(h,{originalEvent:t})}else{var u=Math.abs(1-a)>significantScaleThreshold,d=Math.abs(r)>significantRotateThreshold;d?this._gestureIntent="rotate":u&&(this._gestureIntent="zoom"),this._gestureIntent&&(this._startVec=n,this._startScale=s.transform.scale,this._startBearing=s.transform.bearing)}t.preventDefault()}},TouchZoomRotateHandler.prototype._onEnd=function(t){window.document.removeEventListener("touchmove",this._onMove),window.document.removeEventListener("touchend",this._onEnd),this._drainInertiaBuffer();var e=this._inertia,o=this._map;if(e.length<2)return void o.snapToNorth({},{originalEvent:t});var i=e[e.length-1],n=e[0],a=o.transform.scaleZoom(this._startScale*i[1]),r=o.transform.scaleZoom(this._startScale*n[1]),s=a-r,h=(i[0]-n[0])/1e3,u=i[2];if(0===h||a===r)return void o.snapToNorth({},{originalEvent:t});var d=s*inertiaLinearity/h;Math.abs(d)>inertiaMaxSpeed&&(d=d>0?inertiaMaxSpeed:-inertiaMaxSpeed);var l=1e3*Math.abs(d/(inertiaDeceleration*inertiaLinearity)),c=a+d*l/2e3;c<0&&(c=0),o.easeTo({zoom:c,duration:l,easing:inertiaEasing,around:this._aroundCenter?o.getCenter():o.unproject(u)},{originalEvent:t})},TouchZoomRotateHandler.prototype._drainInertiaBuffer=function(){for(var t=this._inertia,e=Date.now(),o=160;t.length>2&&e-t[0][0]>o;)t.shift()},module.exports=TouchZoomRotateHandler; +},{"../../util/dom":117,"../../util/util":129,"../../util/window":112}],104:[function(require,module,exports){ +"use strict";var util=require("../util/util"),window=require("../util/window"),Hash=function(){util.bindAll(["_onHashChange","_updateHash"],this)};Hash.prototype.addTo=function(t){return this._map=t,window.addEventListener("hashchange",this._onHashChange,!1),this._map.on("moveend",this._updateHash),this},Hash.prototype.remove=function(){return window.removeEventListener("hashchange",this._onHashChange,!1),this._map.off("moveend",this._updateHash),delete this._map,this},Hash.prototype._onHashChange=function(){var t=window.location.hash.replace("#","").split("/");return t.length>=3&&(this._map.jumpTo({center:[+t[2],+t[1]],zoom:+t[0],bearing:+(t[3]||0),pitch:+(t[4]||0)}),!0)},Hash.prototype._updateHash=function(){var t=this._map.getCenter(),e=this._map.getZoom(),a=this._map.getBearing(),h=this._map.getPitch(),i=Math.max(0,Math.ceil(Math.log(e)/Math.LN2)),n="#"+Math.round(100*e)/100+"/"+t.lat.toFixed(i)+"/"+t.lng.toFixed(i);(a||h)&&(n+="/"+Math.round(10*a)/10),h&&(n+="/"+Math.round(h)),window.history.replaceState("","",n)},module.exports=Hash; +},{"../util/util":129,"../util/window":112}],105:[function(require,module,exports){ +"use strict";function removeNode(t){t.parentNode&&t.parentNode.removeChild(t)}var util=require("../util/util"),browser=require("../util/browser"),window=require("../util/window"),DOM=require("../util/dom"),Style=require("../style/style"),AnimationLoop=require("../style/animation_loop"),Painter=require("../render/painter"),Transform=require("../geo/transform"),Hash=require("./hash"),bindHandlers=require("./bind_handlers"),Camera=require("./camera"),LngLat=require("../geo/lng_lat"),LngLatBounds=require("../geo/lng_lat_bounds"),Point=require("point-geometry"),AttributionControl=require("./control/attribution_control"),isSupported=require("mapbox-gl-supported"),defaultMinZoom=0,defaultMaxZoom=20,defaultOptions={center:[0,0],zoom:0,bearing:0,pitch:0,minZoom:defaultMinZoom,maxZoom:defaultMaxZoom,interactive:!0,scrollZoom:!0,boxZoom:!0,dragRotate:!0,dragPan:!0,keyboard:!0,doubleClickZoom:!0,touchZoomRotate:!0,bearingSnap:7,hash:!1,attributionControl:!0,failIfMajorPerformanceCaveat:!1,preserveDrawingBuffer:!1,trackResize:!0,renderWorldCopies:!0},Map=function(t){function e(e){var i=this;e=util.extend({},defaultOptions,e);var o=new Transform(e.minZoom,e.maxZoom,e.renderWorldCopies);if(t.call(this,o,e),this._interactive=e.interactive,this._failIfMajorPerformanceCaveat=e.failIfMajorPerformanceCaveat,this._preserveDrawingBuffer=e.preserveDrawingBuffer,this._trackResize=e.trackResize,this._bearingSnap=e.bearingSnap,"string"==typeof e.container){if(this._container=window.document.getElementById(e.container),!this._container)throw new Error("Container '"+e.container+"' not found.")}else this._container=e.container;this.animationLoop=new AnimationLoop,e.maxBounds&&this.setMaxBounds(e.maxBounds),util.bindAll(["_onWindowOnline","_onWindowResize","_contextLost","_contextRestored","_update","_render","_onData","_onDataLoading"],this),this._setupContainer(),this._setupPainter(),this.on("move",this._update.bind(this,!1)),this.on("zoom",this._update.bind(this,!0)),this.on("moveend",function(){i.animationLoop.set(300),i._rerender()}),"undefined"!=typeof window&&(window.addEventListener("online",this._onWindowOnline,!1),window.addEventListener("resize",this._onWindowResize,!1)),bindHandlers(this,e),this._hash=e.hash&&(new Hash).addTo(this),this._hash&&this._hash._onHashChange()||this.jumpTo({center:e.center,zoom:e.zoom,bearing:e.bearing,pitch:e.pitch}),this._classes=[],this.resize(),e.classes&&this.setClasses(e.classes),e.style&&this.setStyle(e.style),e.attributionControl&&this.addControl(new AttributionControl),this.on("style.load",function(){this.transform.unmodified&&this.jumpTo(this.style.stylesheet),this.style.update(this._classes,{transition:!1})}),this.on("data",this._onData),this.on("dataloading",this._onDataLoading)}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var i={showTileBoundaries:{},showCollisionBoxes:{},showOverdrawInspector:{},repaint:{},vertices:{}};return e.prototype.addControl=function(t,e){void 0===e&&t.getDefaultPosition&&(e=t.getDefaultPosition()),void 0===e&&(e="top-right");var i=t.onAdd(this),o=this._controlPositions[e];return e.indexOf("bottom")!==-1?o.insertBefore(i,o.firstChild):o.appendChild(i),this},e.prototype.removeControl=function(t){return t.onRemove(this),this},e.prototype.addClass=function(t,e){return util.warnOnce("Style classes are deprecated and will be removed in an upcoming release of Mapbox GL JS."),this._classes.indexOf(t)>=0||""===t?this:(this._classes.push(t),this._classOptions=e,this.style&&this.style.updateClasses(),this._update(!0))},e.prototype.removeClass=function(t,e){util.warnOnce("Style classes are deprecated and will be removed in an upcoming release of Mapbox GL JS.");var i=this._classes.indexOf(t);return i<0||""===t?this:(this._classes.splice(i,1),this._classOptions=e,this.style&&this.style.updateClasses(),this._update(!0))},e.prototype.setClasses=function(t,e){util.warnOnce("Style classes are deprecated and will be removed in an upcoming release of Mapbox GL JS.");for(var i={},o=0;o=0},e.prototype.getClasses=function(){return util.warnOnce("Style classes are deprecated and will be removed in an upcoming release of Mapbox GL JS."),this._classes},e.prototype.resize=function(){var t=this._containerDimensions(),e=t[0],i=t[1];this._resizeCanvas(e,i),this.transform.resize(e,i),this.painter.resize(e,i);var o=this.painter.gl,s=o.getParameter(o.MAX_RENDERBUFFER_SIZE)/2;return(this._canvas.width>s||this._canvas.height>s)&&util.warnOnce("Map is larger than maximum size supported by this system ("+s+"px by "+s+"px)."),this.fire("movestart").fire("move").fire("resize").fire("moveend")},e.prototype.getBounds=function(){var t=new LngLatBounds(this.transform.pointLocation(new Point(0,this.transform.height)),this.transform.pointLocation(new Point(this.transform.width,0)));return(this.transform.angle||this.transform.pitch)&&(t.extend(this.transform.pointLocation(new Point(this.transform.size.x,0))),t.extend(this.transform.pointLocation(new Point(0,this.transform.size.y)))),t},e.prototype.setMaxBounds=function(t){if(t){var e=LngLatBounds.convert(t);this.transform.lngRange=[e.getWest(),e.getEast()],this.transform.latRange=[e.getSouth(),e.getNorth()],this.transform._constrain(),this._update()}else null!==t&&void 0!==t||(this.transform.lngRange=[],this.transform.latRange=[],this._update());return this},e.prototype.setMinZoom=function(t){if(t=null===t||void 0===t?defaultMinZoom:t,t>=defaultMinZoom&&t<=this.transform.maxZoom)return this.transform.minZoom=t,this._update(),this.getZoom()=this.transform.minZoom)return this.transform.maxZoom=t,this._update(),this.getZoom()>t&&this.setZoom(t),this;throw new Error("maxZoom must be greater than the current minZoom")},e.prototype.getMaxZoom=function(){return this.transform.maxZoom},e.prototype.project=function(t){return this.transform.locationPoint(LngLat.convert(t))},e.prototype.unproject=function(t){return this.transform.pointLocation(Point.convert(t))},e.prototype.queryRenderedFeatures=function(){function t(t){return t instanceof Point||Array.isArray(t)}var e,i={};return 2===arguments.length?(e=arguments[0],i=arguments[1]):1===arguments.length&&t(arguments[0])?e=arguments[0]:1===arguments.length&&(i=arguments[0]),this.style.queryRenderedFeatures(this._makeQueryGeometry(e),i,this.transform.zoom,this.transform.angle)},e.prototype._makeQueryGeometry=function(t){var e=this;void 0===t&&(t=[Point.convert([0,0]),Point.convert([this.transform.width,this.transform.height])]);var i,o=t instanceof Point||"number"==typeof t[0];if(o){var s=Point.convert(t);i=[s]}else{var r=[Point.convert(t[0]),Point.convert(t[1])];i=[r[0],new Point(r[1].x,r[0].y),r[1],new Point(r[0].x,r[1].y),r[0]]}return i=i.map(function(t){return e.transform.pointCoordinate(t)})},e.prototype.querySourceFeatures=function(t,e){return this.style.querySourceFeatures(t,e)},e.prototype.setStyle=function(t,e){var i=(!e||e.diff!==!1)&&this.style&&t&&!(t instanceof Style)&&"string"!=typeof t;if(i)try{return this.style.setState(t)&&this._update(!0),this}catch(t){util.warnOnce("Unable to perform style diff: "+(t.message||t.error||t)+". Rebuilding the style from scratch.")}return this.style&&(this.style.setEventedParent(null),this.style._remove(),this.off("rotate",this.style._redoPlacement),this.off("pitch",this.style._redoPlacement)),t?(t instanceof Style?this.style=t:this.style=new Style(t,this),this.style.setEventedParent(this,{style:this.style}),this.on("rotate",this.style._redoPlacement),this.on("pitch",this.style._redoPlacement),this):(this.style=null,this)},e.prototype.getStyle=function(){if(this.style)return this.style.serialize()},e.prototype.addSource=function(t,e){return this.style.addSource(t,e),this._update(!0),this},e.prototype.isSourceLoaded=function(t){var e=this.style&&this.style.sourceCaches[t];return void 0===e?void this.fire("error",{error:new Error("There is no source with ID '"+t+"'")}):e.loaded()},e.prototype.addSourceType=function(t,e,i){return this.style.addSourceType(t,e,i)},e.prototype.removeSource=function(t){return this.style.removeSource(t),this._update(!0),this},e.prototype.getSource=function(t){return this.style.getSource(t)},e.prototype.addLayer=function(t,e){return this.style.addLayer(t,e),this._update(!0),this},e.prototype.moveLayer=function(t,e){return this.style.moveLayer(t,e),this._update(!0),this},e.prototype.removeLayer=function(t){return this.style.removeLayer(t),this._update(!0),this},e.prototype.getLayer=function(t){return this.style.getLayer(t)},e.prototype.setFilter=function(t,e){return this.style.setFilter(t,e),this._update(!0),this},e.prototype.setLayerZoomRange=function(t,e,i){return this.style.setLayerZoomRange(t,e,i),this._update(!0),this},e.prototype.getFilter=function(t){return this.style.getFilter(t)},e.prototype.setPaintProperty=function(t,e,i,o){return this.style.setPaintProperty(t,e,i,o),this._update(!0),this},e.prototype.getPaintProperty=function(t,e,i){return this.style.getPaintProperty(t,e,i)},e.prototype.setLayoutProperty=function(t,e,i){return this.style.setLayoutProperty(t,e,i),this._update(!0),this},e.prototype.getLayoutProperty=function(t,e){return this.style.getLayoutProperty(t,e)},e.prototype.setLight=function(t){return this.style.setLight(t),this._update(!0),this},e.prototype.getLight=function(){return this.style.getLight()},e.prototype.getContainer=function(){return this._container},e.prototype.getCanvasContainer=function(){return this._canvasContainer},e.prototype.getCanvas=function(){return this._canvas},e.prototype._containerDimensions=function(){var t=0,e=0;return this._container&&(t=this._container.offsetWidth||400,e=this._container.offsetHeight||300),[t,e]},e.prototype._setupContainer=function(){var t=this._container;t.classList.add("mapboxgl-map");var e=this._canvasContainer=DOM.create("div","mapboxgl-canvas-container",t);this._interactive&&e.classList.add("mapboxgl-interactive"),this._canvas=DOM.create("canvas","mapboxgl-canvas",e),this._canvas.style.position="absolute",this._canvas.addEventListener("webglcontextlost",this._contextLost,!1),this._canvas.addEventListener("webglcontextrestored",this._contextRestored,!1),this._canvas.setAttribute("tabindex",0),this._canvas.setAttribute("aria-label","Map");var i=this._containerDimensions();this._resizeCanvas(i[0],i[1]);var o=this._controlContainer=DOM.create("div","mapboxgl-control-container",t),s=this._controlPositions={};["top-left","top-right","bottom-left","bottom-right"].forEach(function(t){s[t]=DOM.create("div","mapboxgl-ctrl-"+t,o)})},e.prototype._resizeCanvas=function(t,e){var i=window.devicePixelRatio||1;this._canvas.width=i*t,this._canvas.height=i*e,this._canvas.style.width=t+"px",this._canvas.style.height=e+"px"},e.prototype._setupPainter=function(){var t=util.extend({failIfMajorPerformanceCaveat:this._failIfMajorPerformanceCaveat,preserveDrawingBuffer:this._preserveDrawingBuffer},isSupported.webGLContextAttributes),e=this._canvas.getContext("webgl",t)||this._canvas.getContext("experimental-webgl",t);return e?void(this.painter=new Painter(e,this.transform)):void this.fire("error",{error:new Error("Failed to initialize WebGL")})},e.prototype._contextLost=function(t){t.preventDefault(),this._frameId&&browser.cancelFrame(this._frameId),this.fire("webglcontextlost",{originalEvent:t})},e.prototype._contextRestored=function(t){this._setupPainter(),this.resize(),this._update(),this.fire("webglcontextrestored",{originalEvent:t})},e.prototype.loaded=function(){return!this._styleDirty&&!this._sourcesDirty&&!(!this.style||!this.style.loaded())},e.prototype._update=function(t){return this.style?(this._styleDirty=this._styleDirty||t,this._sourcesDirty=!0,this._rerender(),this):this},e.prototype._render=function(){return this.style&&this._styleDirty&&(this._styleDirty=!1,this.style.update(this._classes,this._classOptions),this._classOptions=null,this.style._recalculate(this.transform.zoom)),this.style&&this._sourcesDirty&&(this._sourcesDirty=!1,this.style._updateSources(this.transform)),this.painter.render(this.style,{showTileBoundaries:this.showTileBoundaries,showOverdrawInspector:this._showOverdrawInspector,rotating:this.rotating,zooming:this.zooming}),this.fire("render"),this.loaded()&&!this._loaded&&(this._loaded=!0,this.fire("load")),this._frameId=null,this.animationLoop.stopped()||(this._styleDirty=!0),(this._sourcesDirty||this._repaint||this._styleDirty)&&this._rerender(),this},e.prototype.remove=function(){this._hash&&this._hash.remove(),browser.cancelFrame(this._frameId),this.setStyle(null),"undefined"!=typeof window&&window.removeEventListener("resize",this._onWindowResize,!1);var t=this.painter.gl.getExtension("WEBGL_lose_context");t&&t.loseContext(),removeNode(this._canvasContainer),removeNode(this._controlContainer),this._container.classList.remove("mapboxgl-map"),this.fire("remove")},e.prototype._rerender=function(){this.style&&!this._frameId&&(this._frameId=browser.frame(this._render))},e.prototype._onWindowOnline=function(){this._update()},e.prototype._onWindowResize=function(){this._trackResize&&this.stop().resize()._update()},i.showTileBoundaries.get=function(){return!!this._showTileBoundaries},i.showTileBoundaries.set=function(t){this._showTileBoundaries!==t&&(this._showTileBoundaries=t,this._update())},i.showCollisionBoxes.get=function(){return!!this._showCollisionBoxes},i.showCollisionBoxes.set=function(t){this._showCollisionBoxes!==t&&(this._showCollisionBoxes=t,this.style._redoPlacement())},i.showOverdrawInspector.get=function(){return!!this._showOverdrawInspector},i.showOverdrawInspector.set=function(t){this._showOverdrawInspector!==t&&(this._showOverdrawInspector=t,this._update())},i.repaint.get=function(){return!!this._repaint},i.repaint.set=function(t){this._repaint=t,this._update()},i.vertices.get=function(){return!!this._vertices},i.vertices.set=function(t){this._vertices=t,this._update()},e.prototype._onData=function(t){this._update("style"===t.dataType),this.fire(t.dataType+"data",t)},e.prototype._onDataLoading=function(t){this.fire(t.dataType+"dataloading",t)},Object.defineProperties(e.prototype,i),e}(Camera);module.exports=Map; +},{"../geo/lng_lat":19,"../geo/lng_lat_bounds":20,"../geo/transform":21,"../render/painter":36,"../style/animation_loop":59,"../style/style":63,"../util/browser":110,"../util/dom":117,"../util/util":129,"../util/window":112,"./bind_handlers":91,"./camera":92,"./control/attribution_control":93,"./hash":104,"mapbox-gl-supported":193,"point-geometry":197}],106:[function(require,module,exports){ +"use strict";var DOM=require("../util/dom"),LngLat=require("../geo/lng_lat"),Point=require("point-geometry"),Marker=function(t,e){this._offset=Point.convert(e&&e.offset||[0,0]),this._update=this._update.bind(this),this._onMapClick=this._onMapClick.bind(this),t||(t=DOM.create("div")),t.classList.add("mapboxgl-marker"),this._element=t,this._popup=null};Marker.prototype.addTo=function(t){return this.remove(),this._map=t,t.getCanvasContainer().appendChild(this._element),t.on("move",this._update),t.on("moveend",this._update),this._update(),this._map.on("click",this._onMapClick),this},Marker.prototype.remove=function(){return this._map&&(this._map.off("click",this._onMapClick),this._map.off("move",this._update),this._map.off("moveend",this._update),this._map=null),DOM.remove(this._element),this._popup&&this._popup.remove(),this},Marker.prototype.getLngLat=function(){return this._lngLat},Marker.prototype.setLngLat=function(t){return this._lngLat=LngLat.convert(t),this._popup&&this._popup.setLngLat(this._lngLat),this._update(),this},Marker.prototype.getElement=function(){return this._element},Marker.prototype.setPopup=function(t){return this._popup&&(this._popup.remove(),this._popup=null),t&&(this._popup=t,this._popup.setLngLat(this._lngLat)),this},Marker.prototype._onMapClick=function(t){var e=t.originalEvent.target,p=this._element;this._popup&&(e===p||p.contains(e))&&this.togglePopup()},Marker.prototype.getPopup=function(){return this._popup},Marker.prototype.togglePopup=function(){var t=this._popup;t&&(t.isOpen()?t.remove():t.addTo(this._map))},Marker.prototype._update=function(t){if(this._map){var e=this._map.project(this._lngLat)._add(this._offset);t&&"moveend"!==t.type||(e=e.round()),DOM.setTransform(this._element,"translate("+e.x+"px, "+e.y+"px)")}},module.exports=Marker; +},{"../geo/lng_lat":19,"../util/dom":117,"point-geometry":197}],107:[function(require,module,exports){ +"use strict";function normalizeOffset(t){if(t){if("number"==typeof t){var o=Math.round(Math.sqrt(.5*Math.pow(t,2)));return{top:new Point(0,t),"top-left":new Point(o,o),"top-right":new Point(-o,o),bottom:new Point(0,-t),"bottom-left":new Point(o,-o),"bottom-right":new Point(-o,-o),left:new Point(t,0),right:new Point(-t,0)}}if(isPointLike(t)){var e=Point.convert(t);return{top:e,"top-left":e,"top-right":e,bottom:e,"bottom-left":e,"bottom-right":e,left:e,right:e}}return{top:Point.convert(t.top||[0,0]),"top-left":Point.convert(t["top-left"]||[0,0]),"top-right":Point.convert(t["top-right"]||[0,0]),bottom:Point.convert(t.bottom||[0,0]),"bottom-left":Point.convert(t["bottom-left"]||[0,0]),"bottom-right":Point.convert(t["bottom-right"]||[0,0]),left:Point.convert(t.left||[0,0]),right:Point.convert(t.right||[0,0])}}return normalizeOffset(new Point(0,0))}function isPointLike(t){return t instanceof Point||Array.isArray(t)}var util=require("../util/util"),Evented=require("../util/evented"),DOM=require("../util/dom"),LngLat=require("../geo/lng_lat"),Point=require("point-geometry"),window=require("../util/window"),defaultOptions={closeButton:!0,closeOnClick:!0},Popup=function(t){function o(o){t.call(this),this.options=util.extend(Object.create(defaultOptions),o),util.bindAll(["_update","_onClickClose"],this)}return t&&(o.__proto__=t),o.prototype=Object.create(t&&t.prototype),o.prototype.constructor=o,o.prototype.addTo=function(t){return this._map=t,this._map.on("move",this._update),this.options.closeOnClick&&this._map.on("click",this._onClickClose),this._update(),this},o.prototype.isOpen=function(){return!!this._map},o.prototype.remove=function(){return this._content&&this._content.parentNode&&this._content.parentNode.removeChild(this._content),this._container&&(this._container.parentNode.removeChild(this._container),delete this._container),this._map&&(this._map.off("move",this._update),this._map.off("click",this._onClickClose),delete this._map),this.fire("close"),this},o.prototype.getLngLat=function(){return this._lngLat},o.prototype.setLngLat=function(t){return this._lngLat=LngLat.convert(t),this._update(),this},o.prototype.setText=function(t){return this.setDOMContent(window.document.createTextNode(t))},o.prototype.setHTML=function(t){var o,e=window.document.createDocumentFragment(),n=window.document.createElement("body");for(n.innerHTML=t;;){if(o=n.firstChild,!o)break;e.appendChild(o)}return this.setDOMContent(e)},o.prototype.setDOMContent=function(t){return this._createContent(),this._content.appendChild(t),this._update(),this},o.prototype._createContent=function(){this._content&&this._content.parentNode&&this._content.parentNode.removeChild(this._content),this._content=DOM.create("div","mapboxgl-popup-content",this._container),this.options.closeButton&&(this._closeButton=DOM.create("button","mapboxgl-popup-close-button",this._content),this._closeButton.type="button",this._closeButton.innerHTML="×",this._closeButton.addEventListener("click",this._onClickClose))},o.prototype._update=function(){if(this._map&&this._lngLat&&this._content){this._container||(this._container=DOM.create("div","mapboxgl-popup",this._map.getContainer()),this._tip=DOM.create("div","mapboxgl-popup-tip",this._container),this._container.appendChild(this._content));var t=this.options.anchor,o=normalizeOffset(this.options.offset),e=this._map.project(this._lngLat).round();if(!t){var n=this._container.offsetWidth,i=this._container.offsetHeight;t=e.y+o.bottom.ythis._map.transform.height-i?["bottom"]:[],e.xthis._map.transform.width-n/2&&t.push("right"),t=0===t.length?"bottom":t.join("-")}var r=e.add(o[t]),s={top:"translate(-50%,0)","top-left":"translate(0,0)","top-right":"translate(-100%,0)",bottom:"translate(-50%,-100%)","bottom-left":"translate(0,-100%)","bottom-right":"translate(-100%,-100%)",left:"translate(0,-50%)",right:"translate(-100%,-50%)"},p=this._container.classList;for(var a in s)p.remove("mapboxgl-popup-anchor-"+a);p.add("mapboxgl-popup-anchor-"+t),DOM.setTransform(this._container,s[t]+" translate("+r.x+"px,"+r.y+"px)")}},o.prototype._onClickClose=function(){this.remove()},o}(Evented);module.exports=Popup; +},{"../geo/lng_lat":19,"../util/dom":117,"../util/evented":118,"../util/util":129,"../util/window":112,"point-geometry":197}],108:[function(require,module,exports){ +"use strict";var Actor=function(t,e,a){this.target=t,this.parent=e,this.mapId=a,this.callbacks={},this.callbackID=0,this.receive=this.receive.bind(this),this.target.addEventListener("message",this.receive,!1)};Actor.prototype.send=function(t,e,a,r,s){var i=a?this.mapId+":"+this.callbackID++:null;a&&(this.callbacks[i]=a),this.target.postMessage({targetMapId:s,sourceMapId:this.mapId,type:t,id:String(i),data:e},r)},Actor.prototype.receive=function(t){var e,a=this,r=t.data,s=r.id;if(!r.targetMapId||this.mapId===r.targetMapId){var i=function(t,e,r){a.target.postMessage({sourceMapId:a.mapId,type:"",id:String(s),error:t?String(t):null,data:e},r)};if(""===r.type)e=this.callbacks[r.id],delete this.callbacks[r.id],e&&e(r.error||null,r.data);else if("undefined"!=typeof r.id&&this.parent[r.type])this.parent[r.type](r.sourceMapId,r.data,i);else if("undefined"!=typeof r.id&&this.parent.getWorkerSource){var p=r.type.split("."),d=this.parent.getWorkerSource(r.sourceMapId,p[0]);d[p[1]](r.data,i)}else this.parent[r.type](r.data)}},Actor.prototype.remove=function(){this.target.removeEventListener("message",this.receive,!1)},module.exports=Actor; +},{}],109:[function(require,module,exports){ +"use strict";function sameOrigin(e){var t=window.document.createElement("a");return t.href=e,t.protocol===window.document.location.protocol&&t.host===window.document.location.host}var window=require("./window");exports.getJSON=function(e,t){var n=new window.XMLHttpRequest;return n.open("GET",e,!0),n.setRequestHeader("Accept","application/json"),n.onerror=function(e){t(e)},n.onload=function(){if(n.status>=200&&n.status<300&&n.response){var e;try{e=JSON.parse(n.response)}catch(e){return t(e)}t(null,e)}else t(new Error(n.statusText))},n.send(),n},exports.getArrayBuffer=function(e,t){var n=new window.XMLHttpRequest;return n.open("GET",e,!0),n.responseType="arraybuffer",n.onerror=function(e){t(e)},n.onload=function(){return 0===n.response.byteLength&&200===n.status?t(new Error("http status 200 returned without content.")):void(n.status>=200&&n.status<300&&n.response?t(null,{data:n.response,cacheControl:n.getResponseHeader("Cache-Control"),expires:n.getResponseHeader("Expires")}):t(new Error(n.statusText)))},n.send(),n};var transparentPngUrl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQYV2NgAAIAAAUAAarVyFEAAAAASUVORK5CYII=";exports.getImage=function(e,t){return exports.getArrayBuffer(e,function(e,n){if(e)return t(e);var r=new window.Image,o=window.URL||window.webkitURL;r.onload=function(){t(null,r),o.revokeObjectURL(r.src)};var a=new window.Blob([new Uint8Array(n.data)],{type:"image/png"});r.cacheControl=n.cacheControl,r.expires=n.expires,r.src=n.data.byteLength?o.createObjectURL(a):transparentPngUrl})},exports.getVideo=function(e,t){var n=window.document.createElement("video");n.onloadstart=function(){t(null,n)};for(var r=0;r=a+n?e.call(t,1):(e.call(t,(i-a)/n),exports.frame(o)))}if(!n)return e.call(t,1),null;var r=!1,a=module.exports.now();return exports.frame(o),function(){r=!0}},exports.getImageData=function(e){var n=window.document.createElement("canvas"),t=n.getContext("2d");return n.width=e.width,n.height=e.height,t.drawImage(e,0,0),t.getImageData(0,0,e.width,e.height).data},exports.supported=require("mapbox-gl-supported"),exports.hardwareConcurrency=window.navigator.hardwareConcurrency||4,Object.defineProperty(exports,"devicePixelRatio",{get:function(){return window.devicePixelRatio}}),exports.supportsWebp=!1;var webpImgTest=window.document.createElement("img");webpImgTest.onload=function(){exports.supportsWebp=!0},webpImgTest.src="data:image/webp;base64,UklGRh4AAABXRUJQVlA4TBEAAAAvAQAAAAfQ//73v/+BiOh/AAA="; +},{"./window":112,"mapbox-gl-supported":193}],111:[function(require,module,exports){ +"use strict";var WebWorkify=require("webworkify"),window=require("../window"),workerURL=window.URL.createObjectURL(new WebWorkify(require("../../source/worker"),{bare:!0}));module.exports=function(){return new window.Worker(workerURL)}; +},{"../../source/worker":57,"../window":112,"webworkify":213}],112:[function(require,module,exports){ +"use strict";module.exports=self; +},{}],113:[function(require,module,exports){ +"use strict";function compareAreas(e,r){return r.area-e.area}var quickselect=require("quickselect"),calculateSignedArea=require("./util").calculateSignedArea;module.exports=function(e,r){var a=e.length;if(a<=1)return[e];for(var t,u,c=[],i=0;i1)for(var n=0;ne.y!=h.y>e.y&&e.x<(h.x-a.x)*(e.y-a.y)/(h.y-a.y)+a.x&&(n=!n),r=Math.min(r,distToSegmentSquared(e,a,h))}return(n?1:-1)*Math.sqrt(r)}function getCentroidCell(e){for(var t=0,n=0,r=0,o=e[0],l=0,i=o.length,s=i-1;ll)&&(l=a.x),(!u||a.y>i)&&(i=a.y)}for(var h=l-r,p=i-o,y=Math.min(h,p),x=y/2,d=new Queue(null,compareMax),g=r;gm.d&&(m=v,n&&console.log("found best %d after %d probes",Math.round(1e4*v.d)/1e4,c)),v.max-m.d<=t||(x=v.h/2,d.push(new Cell(v.p.x-x,v.p.y-x,x,e)),d.push(new Cell(v.p.x+x,v.p.y-x,x,e)),d.push(new Cell(v.p.x-x,v.p.y+x,x,e)),d.push(new Cell(v.p.x+x,v.p.y+x,x,e)),c+=4)}return n&&(console.log("num probes: "+c),console.log("best distance: "+m.d)),m.p}; +},{"./intersection_tests":122,"point-geometry":197,"tinyqueue":202}],120:[function(require,module,exports){ +"use strict";function Glyphs(a,e){this.stacks=a.readFields(readFontstacks,[],e)}function readFontstacks(a,e,r){if(1===a){var t=r.readMessage(readFontstack,{glyphs:{}});e.push(t)}}function readFontstack(a,e,r){if(1===a)e.name=r.readString();else if(2===a)e.range=r.readString();else if(3===a){var t=r.readMessage(readGlyph,{});e.glyphs[t.id]=t}}function readGlyph(a,e,r){1===a?e.id=r.readVarint():2===a?e.bitmap=r.readBytes():3===a?e.width=r.readVarint():4===a?e.height=r.readVarint():5===a?e.left=r.readSVarint():6===a?e.top=r.readSVarint():7===a&&(e.advance=r.readVarint())}module.exports=Glyphs; +},{}],121:[function(require,module,exports){ +"use strict";function interpolate(t,e,n){return t*(1-n)+e*n}module.exports=interpolate,interpolate.number=interpolate,interpolate.vec2=function(t,e,n){return[interpolate(t[0],e[0],n),interpolate(t[1],e[1],n)]},interpolate.color=function(t,e,n){return[interpolate(t[0],e[0],n),interpolate(t[1],e[1],n),interpolate(t[2],e[2],n),interpolate(t[3],e[3],n)]},interpolate.array=function(t,e,n){return t.map(function(t,r){return interpolate(t,e[r],n)})}; +},{}],122:[function(require,module,exports){ +"use strict";function polygonIntersectsPolygon(n,t){for(var e=0;e=3)for(var u=0;u1){if(lineIntersectsLine(n,t))return!0;for(var r=0;r1?n.distSqr(e):n.distSqr(e.sub(t)._mult(o)._add(t))}function multiPolygonContainsPoint(n,t){for(var e,r,o,i=!1,l=0;lt.y!=o.y>t.y&&t.x<(o.x-r.x)*(t.y-r.y)/(o.y-r.y)+r.x&&(i=!i)}return i}function polygonContainsPoint(n,t){for(var e=!1,r=0,o=n.length-1;rt.y!=l.y>t.y&&t.x<(l.x-i.x)*(t.y-i.y)/(l.y-i.y)+i.x&&(e=!e)}return e}var isCounterClockwise=require("./util").isCounterClockwise;module.exports={multiPolygonIntersectsBufferedMultiPoint:multiPolygonIntersectsBufferedMultiPoint,multiPolygonIntersectsMultiPolygon:multiPolygonIntersectsMultiPolygon,multiPolygonIntersectsBufferedMultiLine:multiPolygonIntersectsBufferedMultiLine,polygonIntersectsPolygon:polygonIntersectsPolygon,distToSegmentSquared:distToSegmentSquared}; +},{"./util":129}],123:[function(require,module,exports){ +"use strict";var unicodeBlockLookup={"Latin-1 Supplement":function(n){return n>=128&&n<=255},"Hangul Jamo":function(n){return n>=4352&&n<=4607},"Unified Canadian Aboriginal Syllabics":function(n){return n>=5120&&n<=5759},"Unified Canadian Aboriginal Syllabics Extended":function(n){return n>=6320&&n<=6399},"General Punctuation":function(n){return n>=8192&&n<=8303},"Letterlike Symbols":function(n){return n>=8448&&n<=8527},"Number Forms":function(n){return n>=8528&&n<=8591},"Miscellaneous Technical":function(n){return n>=8960&&n<=9215},"Control Pictures":function(n){return n>=9216&&n<=9279},"Optical Character Recognition":function(n){return n>=9280&&n<=9311},"Enclosed Alphanumerics":function(n){return n>=9312&&n<=9471},"Geometric Shapes":function(n){return n>=9632&&n<=9727},"Miscellaneous Symbols":function(n){return n>=9728&&n<=9983},"Miscellaneous Symbols and Arrows":function(n){return n>=11008&&n<=11263},"CJK Radicals Supplement":function(n){return n>=11904&&n<=12031},"Kangxi Radicals":function(n){return n>=12032&&n<=12255},"Ideographic Description Characters":function(n){return n>=12272&&n<=12287},"CJK Symbols and Punctuation":function(n){return n>=12288&&n<=12351},Hiragana:function(n){return n>=12352&&n<=12447},Katakana:function(n){return n>=12448&&n<=12543},Bopomofo:function(n){return n>=12544&&n<=12591},"Hangul Compatibility Jamo":function(n){return n>=12592&&n<=12687},Kanbun:function(n){return n>=12688&&n<=12703},"Bopomofo Extended":function(n){return n>=12704&&n<=12735},"CJK Strokes":function(n){return n>=12736&&n<=12783},"Katakana Phonetic Extensions":function(n){return n>=12784&&n<=12799},"Enclosed CJK Letters and Months":function(n){return n>=12800&&n<=13055},"CJK Compatibility":function(n){return n>=13056&&n<=13311},"CJK Unified Ideographs Extension A":function(n){return n>=13312&&n<=19903},"Yijing Hexagram Symbols":function(n){return n>=19904&&n<=19967},"CJK Unified Ideographs":function(n){return n>=19968&&n<=40959},"Yi Syllables":function(n){return n>=40960&&n<=42127},"Yi Radicals":function(n){return n>=42128&&n<=42191},"Hangul Jamo Extended-A":function(n){return n>=43360&&n<=43391},"Hangul Syllables":function(n){return n>=44032&&n<=55215},"Hangul Jamo Extended-B":function(n){return n>=55216&&n<=55295},"Private Use Area":function(n){return n>=57344&&n<=63743},"CJK Compatibility Ideographs":function(n){return n>=63744&&n<=64255},"Vertical Forms":function(n){return n>=65040&&n<=65055},"CJK Compatibility Forms":function(n){return n>=65072&&n<=65103},"Small Form Variants":function(n){return n>=65104&&n<=65135},"Halfwidth and Fullwidth Forms":function(n){return n>=65280&&n<=65519}};module.exports=unicodeBlockLookup; +},{}],124:[function(require,module,exports){ +"use strict";var LRUCache=function(t,e){this.max=t,this.onRemove=e,this.reset()};LRUCache.prototype.reset=function(){var t=this;for(var e in this.data)t.onRemove(t.data[e]);return this.data={},this.order=[],this},LRUCache.prototype.add=function(t,e){if(this.has(t))this.order.splice(this.order.indexOf(t),1),this.data[t]=e,this.order.push(t);else if(this.data[t]=e,this.order.push(t),this.order.length>this.max){var r=this.get(this.order[0]);r&&this.onRemove(r)}return this},LRUCache.prototype.has=function(t){return t in this.data},LRUCache.prototype.keys=function(){return this.order},LRUCache.prototype.get=function(t){if(!this.has(t))return null;var e=this.data[t];return delete this.data[t],this.order.splice(this.order.indexOf(t),1),e},LRUCache.prototype.remove=function(t){if(!this.has(t))return this;var e=this.data[t];return delete this.data[t],this.onRemove(e),this.order.splice(this.order.indexOf(t),1),this},LRUCache.prototype.setMaxSize=function(t){var e=this;for(this.max=t;this.order.length>this.max;){var r=e.get(e.order[0]);r&&e.onRemove(r)}return this},module.exports=LRUCache; +},{}],125:[function(require,module,exports){ +"use strict";function makeAPIURL(r,e){var t=parseUrl(config.API_URL);if(r.protocol=t.protocol,r.authority=t.authority,!config.REQUIRE_ACCESS_TOKEN)return formatUrl(r);if(e=e||config.ACCESS_TOKEN,!e)throw new Error("An API access token is required to use Mapbox GL. "+help);if("s"===e[0])throw new Error("Use a public access token (pk.*) with Mapbox GL, not a secret access token (sk.*). "+help);return r.params.push("access_token="+e),formatUrl(r)}function isMapboxURL(r){return 0===r.indexOf("mapbox:")}function replaceTempAccessToken(r){for(var e=0;e=2||512===t?"@2x":"",s=browser.supportsWebp?".webp":"$1";return o.path=o.path.replace(imageExtensionRe,""+a+s),replaceTempAccessToken(o.params),formatUrl(o)};var urlRe=/^(\w+):\/\/([^\/?]+)(\/[^?]+)?\??(.+)?/; +},{"./browser":110,"./config":114}],126:[function(require,module,exports){ +"use strict";var isChar=require("./is_char_in_unicode_block");module.exports.allowsIdeographicBreaking=function(a){for(var i=0,r=a;i=65097&&a<=65103)||(!!isChar["CJK Compatibility Ideographs"](a)||(!!isChar["CJK Compatibility"](a)||(!!isChar["CJK Radicals Supplement"](a)||(!!isChar["CJK Strokes"](a)||(!(!isChar["CJK Symbols and Punctuation"](a)||a>=12296&&a<=12305||a>=12308&&a<=12319||12336===a)||(!!isChar["CJK Unified Ideographs Extension A"](a)||(!!isChar["CJK Unified Ideographs"](a)||(!!isChar["Enclosed CJK Letters and Months"](a)||(!!isChar["Hangul Compatibility Jamo"](a)||(!!isChar["Hangul Jamo Extended-A"](a)||(!!isChar["Hangul Jamo Extended-B"](a)||(!!isChar["Hangul Jamo"](a)||(!!isChar["Hangul Syllables"](a)||(!!isChar.Hiragana(a)||(!!isChar["Ideographic Description Characters"](a)||(!!isChar.Kanbun(a)||(!!isChar["Kangxi Radicals"](a)||(!!isChar["Katakana Phonetic Extensions"](a)||(!(!isChar.Katakana(a)||12540===a)||(!(!isChar["Halfwidth and Fullwidth Forms"](a)||65288===a||65289===a||65293===a||a>=65306&&a<=65310||65339===a||65341===a||65343===a||a>=65371&&a<=65503||65507===a||a>=65512&&a<=65519)||(!(!isChar["Small Form Variants"](a)||a>=65112&&a<=65118||a>=65123&&a<=65126)||(!!isChar["Unified Canadian Aboriginal Syllabics"](a)||(!!isChar["Unified Canadian Aboriginal Syllabics Extended"](a)||(!!isChar["Vertical Forms"](a)||(!!isChar["Yijing Hexagram Symbols"](a)||(!!isChar["Yi Syllables"](a)||!!isChar["Yi Radicals"](a))))))))))))))))))))))))))))))},exports.charHasNeutralVerticalOrientation=function(a){return!(!isChar["Latin-1 Supplement"](a)||167!==a&&169!==a&&174!==a&&177!==a&&188!==a&&189!==a&&190!==a&&215!==a&&247!==a)||(!(!isChar["General Punctuation"](a)||8214!==a&&8224!==a&&8225!==a&&8240!==a&&8241!==a&&8251!==a&&8252!==a&&8258!==a&&8263!==a&&8264!==a&&8265!==a&&8273!==a)||(!!isChar["Letterlike Symbols"](a)||(!!isChar["Number Forms"](a)||(!(!isChar["Miscellaneous Technical"](a)||!(a>=8960&&a<=8967||a>=8972&&a<=8991||a>=8996&&a<=9e3||9003===a||a>=9085&&a<=9114||a>=9150&&a<=9165||9167===a||a>=9169&&a<=9179||a>=9186&&a<=9215))||(!(!isChar["Control Pictures"](a)||9251===a)||(!!isChar["Optical Character Recognition"](a)||(!!isChar["Enclosed Alphanumerics"](a)||(!!isChar["Geometric Shapes"](a)||(!(!isChar["Miscellaneous Symbols"](a)||a>=9754&&a<=9759)||(!(!isChar["Miscellaneous Symbols and Arrows"](a)||!(a>=11026&&a<=11055||a>=11088&&a<=11097||a>=11192&&a<=11243))||(!!isChar["CJK Symbols and Punctuation"](a)||(!!isChar.Katakana(a)||(!!isChar["Private Use Area"](a)||(!!isChar["CJK Compatibility Forms"](a)||(!!isChar["Small Form Variants"](a)||(!!isChar["Halfwidth and Fullwidth Forms"](a)||(8734===a||8756===a||8757===a||a>=9984&&a<=10087||a>=10102&&a<=10131||65532===a||65533===a)))))))))))))))))},exports.charHasRotatedVerticalOrientation=function(a){return!(exports.charHasUprightVerticalOrientation(a)||exports.charHasNeutralVerticalOrientation(a))}; +},{"./is_char_in_unicode_block":123}],127:[function(require,module,exports){ +"use strict";function createStructArrayType(t){var e=JSON.stringify(t);if(structArrayTypeCache[e])return structArrayTypeCache[e];var r=void 0===t.alignment?1:t.alignment,i=0,n=0,a=["Uint8"],o=t.members.map(function(t){a.indexOf(t.type)<0&&a.push(t.type);var e=sizeOf(t.type),o=i=align(i,Math.max(r,e)),s=t.components||1;return n=Math.max(n,e),i+=e*s,{name:t.name,type:t.type,components:s,offset:o}}),s=align(i,Math.max(n,r)),p=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e}(Struct);p.prototype.alignment=r,p.prototype.size=s;for(var y=0,c=o;ythis.capacity){this.capacity=Math.max(t,Math.floor(this.capacity*RESIZE_MULTIPLIER),DEFAULT_CAPACITY),this.arrayBuffer=new ArrayBuffer(this.capacity*this.bytesPerElement);var e=this.uint8;this._refreshViews(),e&&this.uint8.set(e)}},StructArray.prototype._refreshViews=function(){for(var t=this,e=0,r=this._usedTypes;e=1)return 1;var e=r*r,t=e*r;return 4*(r<.5?t:3*(r-e)+t-.75)},exports.bezier=function(r,e,t,n){var o=new UnitBezier(r,e,t,n);return function(r){return o.solve(r)}},exports.ease=exports.bezier(.25,.1,.25,1),exports.clamp=function(r,e,t){return Math.min(t,Math.max(e,r))},exports.wrap=function(r,e,t){var n=t-e,o=((r-e)%n+n)%n+e;return o===e?t:o},exports.asyncAll=function(r,e,t){if(!r.length)return t(null,[]);var n=r.length,o=new Array(r.length),a=null;r.forEach(function(r,i){e(r,function(r,e){r&&(a=r),o[i]=e,0===--n&&t(a,o)})})},exports.values=function(r){var e=[];for(var t in r)e.push(r[t]);return e},exports.keysDifference=function(r,e){var t=[];for(var n in r)n in e||t.push(n);return t},exports.extend=function(r,e,t,n){for(var o=arguments,a=1;a=0)return!0;return!1};var warnOnceHistory={};exports.warnOnce=function(r){warnOnceHistory[r]||("undefined"!=typeof console&&console.warn(r),warnOnceHistory[r]=!0)},exports.isCounterClockwise=function(r,e,t){return(t.y-r.y)*(e.x-r.x)>(e.y-r.y)*(t.x-r.x)},exports.calculateSignedArea=function(r){for(var e,t,n=0,o=0,a=r.length,i=a-1;o0||Math.abs(e.y-t.y)>0)&&Math.abs(exports.calculateSignedArea(r))>.01},exports.sphericalToCartesian=function(r){var e=r[0],t=r[1],n=r[2];return t+=90,t*=Math.PI/180,n*=Math.PI/180,[e*Math.cos(t)*Math.sin(n),e*Math.sin(t)*Math.sin(n),e*Math.cos(n)]},exports.parseCacheControl=function(r){var e=/(?:^|(?:\s*\,\s*))([^\x00-\x20\(\)<>@\,;\:\\"\/\[\]\?\=\{\}\x7F]+)(?:\=(?:([^\x00-\x20\(\)<>@\,;\:\\"\/\[\]\?\=\{\}\x7F]+)|(?:\"((?:[^"\\]|\\.)*)\")))?/g,t={};if(r.replace(e,function(r,e,n,o){var a=n||o;return t[e]=!a||a.toLowerCase(),""}),t["max-age"]){var n=parseInt(t["max-age"],10);isNaN(n)?delete t["max-age"]:t["max-age"]=n}return t}; +},{"../geo/coordinate":18,"@mapbox/unitbezier":134,"point-geometry":197}],130:[function(require,module,exports){ +"use strict";var Feature=function(e,t,r,o){this.type="Feature",this._vectorTileFeature=e,e._z=t,e._x=r,e._y=o,this.properties=e.properties,null!=e.id&&(this.id=e.id)},prototypeAccessors={geometry:{}};prototypeAccessors.geometry.get=function(){return void 0===this._geometry&&(this._geometry=this._vectorTileFeature.toGeoJSON(this._vectorTileFeature._x,this._vectorTileFeature._y,this._vectorTileFeature._z).geometry),this._geometry},prototypeAccessors.geometry.set=function(e){this._geometry=e},Feature.prototype.toJSON=function(){var e=this,t={geometry:this.geometry};for(var r in this)"_geometry"!==r&&"_vectorTileFeature"!==r&&(t[r]=e[r]);return t},Object.defineProperties(Feature.prototype,prototypeAccessors),module.exports=Feature; +},{}],131:[function(require,module,exports){ +"use strict";var scriptDetection=require("./script_detection");module.exports=function(t){for(var o="",e=0;e":"ï¹€","?":"︖","@":"ï¼ ","[":"﹇","\\":"ï¼¼","]":"﹈","^":"ï¼¾",_:"︳","`":"ï½€","{":"︷","|":"―","}":"︸","~":"~","¢":"ï¿ ","£":"ï¿¡","Â¥":"ï¿¥","¦":"¦","¬":"ï¿¢","¯":"ï¿£","–":"︲","â€â€":"︱","‘":"﹃","’":"﹄","“":"ï¹Â","â€Â":"﹂","…":"︙","‧":"・","â‚©":"₩","ã€Â":"︑","。":"︒","〈":"︿","〉":"ï¹€","《":"︽","》":"︾","「":"ï¹Â","ã€Â":"﹂","『":"﹃","ã€Â":"﹄","ã€Â":"︻","】":"︼","ã€â€":"︹","〕":"︺","〖":"︗","〗":"︘","ï¼Â":"︕","(":"︵",")":"︶",",":"ï¸Â","ï¼Â":"︲",".":"・",":":"︓","ï¼›":"ï¸â€","<":"︿",">":"ï¹€","?":"︖","ï¼»":"﹇","ï¼½":"﹈","_":"︳","ï½›":"︷","|":"―","ï½Â":"︸","⦅":"︵","ï½ ":"︶","。":"︒","ï½¢":"ï¹Â","ï½£":"﹂"}; +},{"./script_detection":126}],132:[function(require,module,exports){ +"use strict";var WebWorker=require("./web_worker"),WorkerPool=function(){this.active={}};WorkerPool.prototype.acquire=function(r){var e=this;if(!this.workers){var o=require("../mapbox-gl").workerCount;for(this.workers=[];this.workers.lengthr)return r;for(;eh?e=s:r=s,s=.5*(r-e)+e}return s},UnitBezier.prototype.solve=function(t,i){return this.sampleCurveY(this.solveCurveX(t,i))}; +},{}],135:[function(require,module,exports){ +function clamp_css_byte(e){return e=Math.round(e),e<0?0:e>255?255:e}function clamp_css_float(e){return e<0?0:e>1?1:e}function parse_css_int(e){return clamp_css_byte("%"===e[e.length-1]?parseFloat(e)/100*255:parseInt(e))}function parse_css_float(e){return clamp_css_float("%"===e[e.length-1]?parseFloat(e)/100:parseFloat(e))}function css_hue_to_rgb(e,r,l){return l<0?l+=1:l>1&&(l-=1),6*l<1?e+(r-e)*l*6:2*l<1?r:3*l<2?e+(r-e)*(2/3-l)*6:e}function parseCSSColor(e){var r=e.replace(/ /g,"").toLowerCase();if(r in kCSSColorTable)return kCSSColorTable[r].slice();if("#"===r[0]){if(4===r.length){var l=parseInt(r.substr(1),16);return l>=0&&l<=4095?[(3840&l)>>4|(3840&l)>>8,240&l|(240&l)>>4,15&l|(15&l)<<4,1]:null}if(7===r.length){var l=parseInt(r.substr(1),16);return l>=0&&l<=16777215?[(16711680&l)>>16,(65280&l)>>8,255&l,1]:null}return null}var a=r.indexOf("("),t=r.indexOf(")");if(a!==-1&&t+1===r.length){var n=r.substr(0,a),s=r.substr(a+1,t-(a+1)).split(","),o=1;switch(n){case"rgba":if(4!==s.length)return null;o=parse_css_float(s.pop());case"rgb":return 3!==s.length?null:[parse_css_int(s[0]),parse_css_int(s[1]),parse_css_int(s[2]),o];case"hsla":if(4!==s.length)return null;o=parse_css_float(s.pop());case"hsl":if(3!==s.length)return null;var i=(parseFloat(s[0])%360+360)%360/360,u=parse_css_float(s[1]),g=parse_css_float(s[2]),d=g<=.5?g*(u+1):g+u-g*u,c=2*g-d;return[clamp_css_byte(255*css_hue_to_rgb(c,d,i+1/3)),clamp_css_byte(255*css_hue_to_rgb(c,d,i)),clamp_css_byte(255*css_hue_to_rgb(c,d,i-1/3)),o];default:return null}}return null}var kCSSColorTable={transparent:[0,0,0,0],aliceblue:[240,248,255,1],antiquewhite:[250,235,215,1],aqua:[0,255,255,1],aquamarine:[127,255,212,1],azure:[240,255,255,1],beige:[245,245,220,1],bisque:[255,228,196,1],black:[0,0,0,1],blanchedalmond:[255,235,205,1],blue:[0,0,255,1],blueviolet:[138,43,226,1],brown:[165,42,42,1],burlywood:[222,184,135,1],cadetblue:[95,158,160,1],chartreuse:[127,255,0,1],chocolate:[210,105,30,1],coral:[255,127,80,1],cornflowerblue:[100,149,237,1],cornsilk:[255,248,220,1],crimson:[220,20,60,1],cyan:[0,255,255,1],darkblue:[0,0,139,1],darkcyan:[0,139,139,1],darkgoldenrod:[184,134,11,1],darkgray:[169,169,169,1],darkgreen:[0,100,0,1],darkgrey:[169,169,169,1],darkkhaki:[189,183,107,1],darkmagenta:[139,0,139,1],darkolivegreen:[85,107,47,1],darkorange:[255,140,0,1],darkorchid:[153,50,204,1],darkred:[139,0,0,1],darksalmon:[233,150,122,1],darkseagreen:[143,188,143,1],darkslateblue:[72,61,139,1],darkslategray:[47,79,79,1],darkslategrey:[47,79,79,1],darkturquoise:[0,206,209,1],darkviolet:[148,0,211,1],deeppink:[255,20,147,1],deepskyblue:[0,191,255,1],dimgray:[105,105,105,1],dimgrey:[105,105,105,1],dodgerblue:[30,144,255,1],firebrick:[178,34,34,1],floralwhite:[255,250,240,1],forestgreen:[34,139,34,1],fuchsia:[255,0,255,1],gainsboro:[220,220,220,1],ghostwhite:[248,248,255,1],gold:[255,215,0,1],goldenrod:[218,165,32,1],gray:[128,128,128,1],green:[0,128,0,1],greenyellow:[173,255,47,1],grey:[128,128,128,1],honeydew:[240,255,240,1],hotpink:[255,105,180,1],indianred:[205,92,92,1],indigo:[75,0,130,1],ivory:[255,255,240,1],khaki:[240,230,140,1],lavender:[230,230,250,1],lavenderblush:[255,240,245,1],lawngreen:[124,252,0,1],lemonchiffon:[255,250,205,1],lightblue:[173,216,230,1],lightcoral:[240,128,128,1],lightcyan:[224,255,255,1],lightgoldenrodyellow:[250,250,210,1],lightgray:[211,211,211,1],lightgreen:[144,238,144,1],lightgrey:[211,211,211,1],lightpink:[255,182,193,1],lightsalmon:[255,160,122,1],lightseagreen:[32,178,170,1],lightskyblue:[135,206,250,1],lightslategray:[119,136,153,1],lightslategrey:[119,136,153,1],lightsteelblue:[176,196,222,1],lightyellow:[255,255,224,1],lime:[0,255,0,1],limegreen:[50,205,50,1],linen:[250,240,230,1],magenta:[255,0,255,1],maroon:[128,0,0,1],mediumaquamarine:[102,205,170,1],mediumblue:[0,0,205,1],mediumorchid:[186,85,211,1],mediumpurple:[147,112,219,1],mediumseagreen:[60,179,113,1],mediumslateblue:[123,104,238,1],mediumspringgreen:[0,250,154,1],mediumturquoise:[72,209,204,1],mediumvioletred:[199,21,133,1],midnightblue:[25,25,112,1],mintcream:[245,255,250,1],mistyrose:[255,228,225,1],moccasin:[255,228,181,1],navajowhite:[255,222,173,1],navy:[0,0,128,1],oldlace:[253,245,230,1],olive:[128,128,0,1],olivedrab:[107,142,35,1],orange:[255,165,0,1],orangered:[255,69,0,1],orchid:[218,112,214,1],palegoldenrod:[238,232,170,1],palegreen:[152,251,152,1],paleturquoise:[175,238,238,1],palevioletred:[219,112,147,1],papayawhip:[255,239,213,1],peachpuff:[255,218,185,1],peru:[205,133,63,1],pink:[255,192,203,1],plum:[221,160,221,1],powderblue:[176,224,230,1],purple:[128,0,128,1],rebeccapurple:[102,51,153,1],red:[255,0,0,1],rosybrown:[188,143,143,1],royalblue:[65,105,225,1],saddlebrown:[139,69,19,1],salmon:[250,128,114,1],sandybrown:[244,164,96,1],seagreen:[46,139,87,1],seashell:[255,245,238,1],sienna:[160,82,45,1],silver:[192,192,192,1],skyblue:[135,206,235,1],slateblue:[106,90,205,1],slategray:[112,128,144,1],slategrey:[112,128,144,1],snow:[255,250,250,1],springgreen:[0,255,127,1],steelblue:[70,130,180,1],tan:[210,180,140,1],teal:[0,128,128,1],thistle:[216,191,216,1],tomato:[255,99,71,1],turquoise:[64,224,208,1],violet:[238,130,238,1],wheat:[245,222,179,1],white:[255,255,255,1],whitesmoke:[245,245,245,1],yellow:[255,255,0,1],yellowgreen:[154,205,50,1]};try{exports.parseCSSColor=parseCSSColor}catch(e){} +},{}],136:[function(require,module,exports){ +"use strict";function earcut(e,n,r){r=r||2;var t=n&&n.length,i=t?n[0]*r:e.length,x=linkedList(e,0,i,r,!0),a=[];if(!x)return a;var o,l,u,s,v,f,y;if(t&&(x=eliminateHoles(e,n,x,r)),e.length>80*r){o=u=e[0],l=s=e[1];for(var d=r;du&&(u=v),f>s&&(s=f);y=Math.max(u-o,s-l)}return earcutLinked(x,a,r,o,l,y),a}function linkedList(e,n,r,t,i){var x,a;if(i===signedArea(e,n,r,t)>0)for(x=n;x=n;x-=t)a=insertNode(x,e[x],e[x+1],a);return a&&equals(a,a.next)&&(removeNode(a),a=a.next),a}function filterPoints(e,n){if(!e)return e;n||(n=e);var r,t=e;do if(r=!1,t.steiner||!equals(t,t.next)&&0!==area(t.prev,t,t.next))t=t.next;else{if(removeNode(t),t=n=t.prev,t===t.next)return null;r=!0}while(r||t!==n);return n}function earcutLinked(e,n,r,t,i,x,a){if(e){!a&&x&&indexCurve(e,t,i,x);for(var o,l,u=e;e.prev!==e.next;)if(o=e.prev,l=e.next,x?isEarHashed(e,t,i,x):isEar(e))n.push(o.i/r),n.push(e.i/r),n.push(l.i/r),removeNode(e),e=l.next,u=l.next;else if(e=l,e===u){a?1===a?(e=cureLocalIntersections(e,n,r),earcutLinked(e,n,r,t,i,x,2)):2===a&&splitEarcut(e,n,r,t,i,x):earcutLinked(filterPoints(e),n,r,t,i,x,1);break}}}function isEar(e){var n=e.prev,r=e,t=e.next;if(area(n,r,t)>=0)return!1;for(var i=e.next.next;i!==e.prev;){if(pointInTriangle(n.x,n.y,r.x,r.y,t.x,t.y,i.x,i.y)&&area(i.prev,i,i.next)>=0)return!1;i=i.next}return!0}function isEarHashed(e,n,r,t){var i=e.prev,x=e,a=e.next;if(area(i,x,a)>=0)return!1;for(var o=i.xx.x?i.x>a.x?i.x:a.x:x.x>a.x?x.x:a.x,s=i.y>x.y?i.y>a.y?i.y:a.y:x.y>a.y?x.y:a.y,v=zOrder(o,l,n,r,t),f=zOrder(u,s,n,r,t),y=e.nextZ;y&&y.z<=f;){if(y!==e.prev&&y!==e.next&&pointInTriangle(i.x,i.y,x.x,x.y,a.x,a.y,y.x,y.y)&&area(y.prev,y,y.next)>=0)return!1;y=y.nextZ}for(y=e.prevZ;y&&y.z>=v;){if(y!==e.prev&&y!==e.next&&pointInTriangle(i.x,i.y,x.x,x.y,a.x,a.y,y.x,y.y)&&area(y.prev,y,y.next)>=0)return!1;y=y.prevZ}return!0}function cureLocalIntersections(e,n,r){var t=e;do{var i=t.prev,x=t.next.next;!equals(i,x)&&intersects(i,t,t.next,x)&&locallyInside(i,x)&&locallyInside(x,i)&&(n.push(i.i/r),n.push(t.i/r),n.push(x.i/r),removeNode(t),removeNode(t.next),t=e=x),t=t.next}while(t!==e);return t}function splitEarcut(e,n,r,t,i,x){var a=e;do{for(var o=a.next.next;o!==a.prev;){if(a.i!==o.i&&isValidDiagonal(a,o)){var l=splitPolygon(a,o);return a=filterPoints(a,a.next),l=filterPoints(l,l.next),earcutLinked(a,n,r,t,i,x),void earcutLinked(l,n,r,t,i,x)}o=o.next}a=a.next}while(a!==e)}function eliminateHoles(e,n,r,t){var i,x,a,o,l,u=[];for(i=0,x=n.length;i=t.next.y){var o=t.x+(x-t.y)*(t.next.x-t.x)/(t.next.y-t.y);if(o<=i&&o>a){if(a=o,o===i){if(x===t.y)return t;if(x===t.next.y)return t.next}r=t.x=t.x&&t.x>=s&&pointInTriangle(xr.x)&&locallyInside(t,e)&&(r=t,f=l)),t=t.next;return r}function indexCurve(e,n,r,t){var i=e;do null===i.z&&(i.z=zOrder(i.x,i.y,n,r,t)),i.prevZ=i.prev,i.nextZ=i.next,i=i.next;while(i!==e);i.prevZ.nextZ=null,i.prevZ=null,sortLinked(i)}function sortLinked(e){var n,r,t,i,x,a,o,l,u=1;do{for(r=e,e=null,x=null,a=0;r;){for(a++,t=r,o=0,n=0;n0||l>0&&t;)0===o?(i=t,t=t.nextZ,l--):0!==l&&t?r.z<=t.z?(i=r,r=r.nextZ,o--):(i=t,t=t.nextZ,l--):(i=r,r=r.nextZ,o--),x?x.nextZ=i:e=i,i.prevZ=x,x=i;r=t}x.nextZ=null,u*=2}while(a>1);return e}function zOrder(e,n,r,t,i){return e=32767*(e-r)/i,n=32767*(n-t)/i,e=16711935&(e|e<<8),e=252645135&(e|e<<4),e=858993459&(e|e<<2),e=1431655765&(e|e<<1),n=16711935&(n|n<<8),n=252645135&(n|n<<4),n=858993459&(n|n<<2),n=1431655765&(n|n<<1),e|n<<1}function getLeftmost(e){var n=e,r=e;do n.x=0&&(e-a)*(t-o)-(r-a)*(n-o)>=0&&(r-a)*(x-o)-(i-a)*(t-o)>=0}function isValidDiagonal(e,n){return e.next.i!==n.i&&e.prev.i!==n.i&&!intersectsPolygon(e,n)&&locallyInside(e,n)&&locallyInside(n,e)&&middleInside(e,n)}function area(e,n,r){return(n.y-e.y)*(r.x-n.x)-(n.x-e.x)*(r.y-n.y)}function equals(e,n){return e.x===n.x&&e.y===n.y}function intersects(e,n,r,t){return!!(equals(e,n)&&equals(r,t)||equals(e,t)&&equals(r,n))||area(e,n,r)>0!=area(e,n,t)>0&&area(r,t,e)>0!=area(r,t,n)>0}function intersectsPolygon(e,n){var r=e;do{if(r.i!==e.i&&r.next.i!==e.i&&r.i!==n.i&&r.next.i!==n.i&&intersects(r,r.next,e,n))return!0;r=r.next}while(r!==e);return!1}function locallyInside(e,n){return area(e.prev,e,e.next)<0?area(e,n,e.next)>=0&&area(e,e.prev,n)>=0:area(e,n,e.prev)<0||area(e,e.next,n)<0}function middleInside(e,n){var r=e,t=!1,i=(e.x+n.x)/2,x=(e.y+n.y)/2;do r.y>x!=r.next.y>x&&i<(r.next.x-r.x)*(x-r.y)/(r.next.y-r.y)+r.x&&(t=!t),r=r.next;while(r!==e);return t}function splitPolygon(e,n){var r=new Node(e.i,e.x,e.y),t=new Node(n.i,n.x,n.y),i=e.next,x=n.prev;return e.next=n,n.prev=e,r.next=i,i.prev=r,t.next=r,r.prev=t,x.next=t,t.prev=x,t}function insertNode(e,n,r,t){var i=new Node(e,n,r);return t?(i.next=t.next,i.prev=t,t.next.prev=i,t.next=i):(i.prev=i,i.next=i),i}function removeNode(e){e.next.prev=e.prev,e.prev.next=e.next,e.prevZ&&(e.prevZ.nextZ=e.nextZ),e.nextZ&&(e.nextZ.prevZ=e.prevZ)}function Node(e,n,r){this.i=e,this.x=n,this.y=r,this.prev=null,this.next=null,this.z=null,this.prevZ=null,this.nextZ=null,this.steiner=!1}function signedArea(e,n,r,t){for(var i=0,x=n,a=r-t;x0&&(t+=e[i-1].length,r.holes.push(t))}return r}; +},{}],137:[function(require,module,exports){ +function sss(r){var e,t,s,n,u,a;switch(typeof r){case"object":if(null===r)return null;if(isArray(r)){for(s="[",t=r.length-1,e=0;e-1&&(s+=sss(r[e])),s+"]"}for(n=objKeys(r).sort(),t=n.length,s="{",u=n[e=0],a=t>0&&void 0!==r[u];e15?"\\u00"+e.toString(16):"\\u000"+e.toString(16)}};module.exports=function(r){if(void 0!==r)return""+sss(r)},module.exports.stringSearch=strReg,module.exports.stringReplace=strReplace; +},{}],138:[function(require,module,exports){ +"use strict";function createFilter(e){return new Function("f","var p = (f && f.properties || {}); return "+compile(e))}function compile(e){if(!e)return"true";var i=e[0];if(e.length<=1)return"any"===i?"false":"true";var n="=="===i?compileComparisonOp(e[1],e[2],"===",!1):"!="===i?compileComparisonOp(e[1],e[2],"!==",!1):"<"===i||">"===i||"<="===i||">="===i?compileComparisonOp(e[1],e[2],i,!0):"any"===i?compileLogicalOp(e.slice(1),"||"):"all"===i?compileLogicalOp(e.slice(1),"&&"):"none"===i?compileNegation(compileLogicalOp(e.slice(1),"||")):"in"===i?compileInOp(e[1],e.slice(2)):"!in"===i?compileNegation(compileInOp(e[1],e.slice(2))):"has"===i?compileHasOp(e[1]):"!has"===i?compileNegation(compileHasOp([e[1]])):"true";return"("+n+")"}function compilePropertyReference(e){return"$type"===e?"f.type":"$id"===e?"f.id":"p["+JSON.stringify(e)+"]"}function compileComparisonOp(e,i,n,r){var o=compilePropertyReference(e),t="$type"===e?types.indexOf(i):JSON.stringify(i);return(r?"typeof "+o+"=== typeof "+t+"&&":"")+o+n+t}function compileLogicalOp(e,i){return e.map(compile).join(i)}function compileInOp(e,i){"$type"===e&&(i=i.map(function(e){return types.indexOf(e)}));var n=JSON.stringify(i.sort(compare)),r=compilePropertyReference(e);return i.length<=200?n+".indexOf("+r+") !== -1":"function(v, a, i, j) {while (i <= j) { var m = (i + j) >> 1; if (a[m] === v) return true; if (a[m] > v) j = m - 1; else i = m + 1;}return false; }("+r+", "+n+",0,"+(i.length-1)+")"}function compileHasOp(e){return JSON.stringify(e)+" in p"}function compileNegation(e){return"!("+e+")"}function compare(e,i){return ei?1:0}module.exports=createFilter;var types=["Unknown","Point","LineString","Polygon"]; +},{}],139:[function(require,module,exports){ +function geometry(r){if("Polygon"===r.type)return polygonArea(r.coordinates);if("MultiPolygon"===r.type){for(var e=0,n=0;n0){e+=Math.abs(ringArea(r[0]));for(var n=1;n2){for(var n,t,o=0;o=0}var geojsonArea=require("geojson-area");module.exports=rewind; +},{"geojson-area":139}],141:[function(require,module,exports){ +"use strict";function clip(e,r,t,n,u,i,l,s){if(t/=r,n/=r,l>=t&&s<=n)return e;if(l>n||s=t&&c<=n)h.push(o);else if(!(a>n||c=r&&s<=t&&u.push(l)}return u}function clipGeometry(e,r,t,n,u,i){for(var l=[],s=0;st?(d.push(u(h,f,r),u(h,f,t)),i||(d=newSlice(l,d,v,m,w))):o>=r&&d.push(u(h,f,r)):c>t?ot&&(d.push(u(h,f,t)),i||(d=newSlice(l,d,v,m,w))));h=g[S-1],c=h[n],c>=r&&c<=t&&d.push(h),a=d[d.length-1],i&&a&&(d[0][0]!==a[0]||d[0][1]!==a[1])&&d.push(d[0]),newSlice(l,d,v,m,w)}return l}function newSlice(e,r,t,n,u){return r.length&&(r.area=t,r.dist=n,void 0!==u&&(r.outer=u),e.push(r)),[]}module.exports=clip;var createFeature=require("./feature"); +},{"./feature":143}],142:[function(require,module,exports){ +"use strict";function convert(e,t){var r=[];if("FeatureCollection"===e.type)for(var o=0;o1?1:o,[r,o,0]}function calcSize(e){for(var t,r,o=0,a=0,i=0;i1)return!1;var r=n.geometry[0].length;if(5!==r)return!1;for(var s=0;s1&&console.time("creation"),m=this.tiles[d]=createTile(e,p,i,o,f,t===a.maxZoom),this.tileCoords.push({z:t,x:i,y:o}),u)){u>1&&(console.log("tile z%d-%d-%d (features: %d, points: %d, simplified: %d)",t,i,o,m.numFeatures,m.numPoints,m.numSimplified),console.timeEnd("creation"));var h="z"+t;this.stats[h]=(this.stats[h]||0)+1,this.total++}if(m.source=e,n){if(t===a.maxZoom||t===n)continue;var x=1<1&&console.time("clipping");var g,v,M,T,b,y,S=.5*a.buffer/a.extent,Z=.5-S,q=.5+S,w=1+S;g=v=M=T=null,b=clip(e,p,i-S,i+q,0,intersectX,m.min[0],m.max[0]),y=clip(e,p,i+Z,i+w,0,intersectX,m.min[0],m.max[0]),b&&(g=clip(b,p,o-S,o+q,1,intersectY,m.min[1],m.max[1]),v=clip(b,p,o+Z,o+w,1,intersectY,m.min[1],m.max[1])),y&&(M=clip(y,p,o-S,o+q,1,intersectY,m.min[1],m.max[1]),T=clip(y,p,o+Z,o+w,1,intersectY,m.min[1],m.max[1])),u>1&&console.timeEnd("clipping"),e.length&&(l.push(g||[],t+1,2*i,2*o),l.push(v||[],t+1,2*i,2*o+1),l.push(M||[],t+1,2*i+1,2*o),l.push(T||[],t+1,2*i+1,2*o+1))}else n&&(c=t)}return c},GeoJSONVT.prototype.getTile=function(e,t,i){var o=this.options,n=o.extent,r=o.debug,s=1<1&&console.log("drilling down to z%d-%d-%d",e,t,i);for(var a,u=e,c=t,p=i;!a&&u>0;)u--,c=Math.floor(c/2),p=Math.floor(p/2),a=this.tiles[toID(u,c,p)];if(!a||!a.source)return null;if(r>1&&console.log("found parent tile z%d-%d-%d",u,c,p),isClippedSquare(a,n,o.buffer))return transform.tile(a,n);r>1&&console.time("drilling down");var d=this.splitTile(a.source,u,c,p,e,t,i);if(r>1&&console.timeEnd("drilling down"),null!==d){var m=1<p&&(s=e,p=r);p>o?(t[s][2]=p,g.push(u),g.push(s),u=s):(n=g.pop(),u=g.pop())}}function getSqSegDist(t,i,e){var p=i[0],r=i[1],s=e[0],o=e[1],f=t[0],u=t[1],n=s-p,g=o-r;if(0!==n||0!==g){var l=((f-p)*n+(u-r)*g)/(n*n+g*g);l>1?(p=s,r=o):l>0&&(p+=n*l,r+=g*l)}return n=f-p,g=u-r,n*n+g*g}module.exports=simplify; +},{}],146:[function(require,module,exports){ +"use strict";function createTile(e,n,r,i,t,u){for(var a={features:[],numPoints:0,numSimplified:0,numFeatures:0,source:null,x:r,y:i,z2:n,transformed:!1,min:[2,1],max:[-1,0]},m=0;ma.max[0]&&(a.max[0]=l[0]),l[1]>a.max[1]&&(a.max[1]=l[1])}return a}function addFeature(e,n,r,i){var t,u,a,m,s=n.geometry,l=n.type,o=[],f=r*r;if(1===l)for(t=0;tf)&&(d.push(m),e.numSimplified++),e.numPoints++;3===l&&rewind(d,a.outer),o.push(d)}else e.numPoints+=a.length;if(o.length){var g={geometry:o,type:l,tags:n.tags||null};null!==n.id&&(g.id=n.id),e.features.push(g)}}function rewind(e,n){var r=signedArea(e);r<0===n&&e.reverse()}function signedArea(e){for(var n,r,i=0,t=0,u=e.length,a=u-1;t=a[u+0]&&s>=a[u+1]?(n[f]=!0,h.push(l[f])):n[f]=!1}}},GridIndex.prototype._forEachCell=function(t,r,e,s,i,h,n){for(var o=this._convertToCellCoord(t),l=this._convertToCellCoord(r),a=this._convertToCellCoord(e),d=this._convertToCellCoord(s),f=o;f<=a;f++)for(var u=l;u<=d;u++){var y=this.d*u+f;if(i.call(this,t,r,e,s,y,h,n))return}},GridIndex.prototype._convertToCellCoord=function(t){return Math.max(0,Math.min(this.d-1,Math.floor(t*this.scale)+this.padding))},GridIndex.prototype.toArrayBuffer=function(){if(this.arrayBuffer)return this.arrayBuffer;for(var t=this.cells,r=NUM_PARAMS+this.cells.length+1+1,e=0,s=0;s>1,i=-7,N=t?h-1:0,n=t?-1:1,s=a[o+N];for(N+=n,M=s&(1<<-i)-1,s>>=-i,i+=w;i>0;M=256*M+a[o+N],N+=n,i-=8);for(p=M&(1<<-i)-1,M>>=-i,i+=r;i>0;p=256*p+a[o+N],N+=n,i-=8);if(0===M)M=1-e;else{if(M===f)return p?NaN:(s?-1:1)*(1/0);p+=Math.pow(2,r),M-=e}return(s?-1:1)*p*Math.pow(2,M-r)},exports.write=function(a,o,t,r,h,M){var p,w,f,e=8*M-h-1,i=(1<>1,n=23===h?Math.pow(2,-24)-Math.pow(2,-77):0,s=r?0:M-1,u=r?1:-1,l=o<0||0===o&&1/o<0?1:0;for(o=Math.abs(o),isNaN(o)||o===1/0?(w=isNaN(o)?1:0,p=i):(p=Math.floor(Math.log(o)/Math.LN2),o*(f=Math.pow(2,-p))<1&&(p--,f*=2),o+=p+N>=1?n/f:n*Math.pow(2,1-N),o*f>=2&&(p++,f/=2),p+N>=i?(w=0,p=i):p+N>=1?(w=(o*f-1)*Math.pow(2,h),p+=N):(w=o*Math.pow(2,N-1)*Math.pow(2,h),p=0));h>=8;a[t+s]=255&w,s+=u,w/=256,h-=8);for(p=p<0;a[t+s]=255&p,s+=u,p/=256,e-=8);a[t+s-u]|=128*l}; +},{}],151:[function(require,module,exports){ +"use strict";function kdbush(t,i,e,s,n){return new KDBush(t,i,e,s,n)}function KDBush(t,i,e,s,n){i=i||defaultGetX,e=e||defaultGetY,n=n||Array,this.nodeSize=s||64,this.points=t,this.ids=new n(t.length),this.coords=new n(2*t.length);for(var r=0;r=s&&a<=h&&t>=u&&t<=e&&f.push(p[i]);else{var c=Math.floor((g+v)/2);a=r[2*c],t=r[2*c+1],a>=s&&a<=h&&t>=u&&t<=e&&f.push(p[c]);var d=(l+1)%2;(0===l?s<=a:u<=t)&&(n.push(g),n.push(c-1),n.push(d)),(0===l?h>=a:e>=t)&&(n.push(c+1),n.push(v),n.push(d))}}return f}module.exports=range; +},{}],153:[function(require,module,exports){ +"use strict";function sortKD(t,a,o,s,r,e){if(!(r-s<=o)){var f=Math.floor((s+r)/2);select(t,a,f,s,r,e%2),sortKD(t,a,o,s,f-1,e+1),sortKD(t,a,o,f+1,r,e+1)}}function select(t,a,o,s,r,e){for(;r>s;){if(r-s>600){var f=r-s+1,p=o-s+1,w=Math.log(f),m=.5*Math.exp(2*w/3),n=.5*Math.sqrt(w*m*(f-m)/f)*(p-f/2<0?-1:1),c=Math.max(s,Math.floor(o-p*m/f+n)),h=Math.min(r,Math.floor(o+(f-p)*m/f+n));select(t,a,o,c,h,e)}var i=a[2*o+e],l=s,M=r;for(swapItem(t,a,s,o),a[2*r+e]>i&&swapItem(t,a,s,r);li;)M--}a[2*s+e]===i?swapItem(t,a,s,M):(M++,swapItem(t,a,M,r)),M<=o&&(s=M+1),o<=M&&(r=M-1)}}function swapItem(t,a,o,s){swap(t,o,s),swap(a,2*o,2*s),swap(a,2*o+1,2*s+1)}function swap(t,a,o){var s=t[a];t[a]=t[o],t[o]=s}module.exports=sortKD; +},{}],154:[function(require,module,exports){ +"use strict";function within(s,p,r,t,u,h){for(var i=[0,s.length-1,0],o=[],n=u*u;i.length;){var e=i.pop(),a=i.pop(),f=i.pop();if(a-f<=h)for(var v=f;v<=a;v++)sqDist(p[2*v],p[2*v+1],r,t)<=n&&o.push(s[v]);else{var l=Math.floor((f+a)/2),c=p[2*l],q=p[2*l+1];sqDist(c,q,r,t)<=n&&o.push(s[l]);var D=(e+1)%2;(0===e?r-u<=c:t-u<=q)&&(i.push(f),i.push(l-1),i.push(D)),(0===e?r+u>=c:t+u>=q)&&(i.push(l+1),i.push(a),i.push(D))}}return o}function sqDist(s,p,r,t){var u=s-r,h=p-t;return u*u+h*h}module.exports=within; +},{}],155:[function(require,module,exports){ +function isObjectLike(r){return!!r&&"object"==typeof r}function arraySome(r,e){for(var a=-1,t=r.length;++as))return!1;for(;++c-1&&t%1==0&&t<=MAX_SAFE_INTEGER}function isObject(t){var e=typeof t;return!!t&&("object"==e||"function"==e)}function isObjectLike(t){return!!t&&"object"==typeof t}var MAX_SAFE_INTEGER=9007199254740991,argsTag="[object Arguments]",funcTag="[object Function]",genTag="[object GeneratorFunction]",objectProto=Object.prototype,hasOwnProperty=objectProto.hasOwnProperty,objectToString=objectProto.toString,propertyIsEnumerable=objectProto.propertyIsEnumerable;module.exports=isArguments; +},{}],159:[function(require,module,exports){ +function isObjectLike(t){return!!t&&"object"==typeof t}function getNative(t,r){var e=null==t?void 0:t[r];return isNative(e)?e:void 0}function isLength(t){return"number"==typeof t&&t>-1&&t%1==0&&t<=MAX_SAFE_INTEGER}function isFunction(t){return isObject(t)&&objToString.call(t)==funcTag}function isObject(t){var r=typeof t;return!!t&&("object"==r||"function"==r)}function isNative(t){return null!=t&&(isFunction(t)?reIsNative.test(fnToString.call(t)):isObjectLike(t)&&reIsHostCtor.test(t))}var arrayTag="[object Array]",funcTag="[object Function]",reIsHostCtor=/^\[object .+?Constructor\]$/,objectProto=Object.prototype,fnToString=Function.prototype.toString,hasOwnProperty=objectProto.hasOwnProperty,objToString=objectProto.toString,reIsNative=RegExp("^"+fnToString.call(hasOwnProperty).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),nativeIsArray=getNative(Array,"isArray"),MAX_SAFE_INTEGER=9007199254740991,isArray=nativeIsArray||function(t){return isObjectLike(t)&&isLength(t.length)&&objToString.call(t)==arrayTag};module.exports=isArray; +},{}],160:[function(require,module,exports){ +function isLength(a){return"number"==typeof a&&a>-1&&a%1==0&&a<=MAX_SAFE_INTEGER}function isObjectLike(a){return!!a&&"object"==typeof a}function isTypedArray(a){return isObjectLike(a)&&isLength(a.length)&&!!typedArrayTags[objectToString.call(a)]}var MAX_SAFE_INTEGER=9007199254740991,argsTag="[object Arguments]",arrayTag="[object Array]",boolTag="[object Boolean]",dateTag="[object Date]",errorTag="[object Error]",funcTag="[object Function]",mapTag="[object Map]",numberTag="[object Number]",objectTag="[object Object]",regexpTag="[object RegExp]",setTag="[object Set]",stringTag="[object String]",weakMapTag="[object WeakMap]",arrayBufferTag="[object ArrayBuffer]",dataViewTag="[object DataView]",float32Tag="[object Float32Array]",float64Tag="[object Float64Array]",int8Tag="[object Int8Array]",int16Tag="[object Int16Array]",int32Tag="[object Int32Array]",uint8Tag="[object Uint8Array]",uint8ClampedTag="[object Uint8ClampedArray]",uint16Tag="[object Uint16Array]",uint32Tag="[object Uint32Array]",typedArrayTags={};typedArrayTags[float32Tag]=typedArrayTags[float64Tag]=typedArrayTags[int8Tag]=typedArrayTags[int16Tag]=typedArrayTags[int32Tag]=typedArrayTags[uint8Tag]=typedArrayTags[uint8ClampedTag]=typedArrayTags[uint16Tag]=typedArrayTags[uint32Tag]=!0,typedArrayTags[argsTag]=typedArrayTags[arrayTag]=typedArrayTags[arrayBufferTag]=typedArrayTags[boolTag]=typedArrayTags[dataViewTag]=typedArrayTags[dateTag]=typedArrayTags[errorTag]=typedArrayTags[funcTag]=typedArrayTags[mapTag]=typedArrayTags[numberTag]=typedArrayTags[objectTag]=typedArrayTags[regexpTag]=typedArrayTags[setTag]=typedArrayTags[stringTag]=typedArrayTags[weakMapTag]=!1;var objectProto=Object.prototype,objectToString=objectProto.toString;module.exports=isTypedArray; +},{}],161:[function(require,module,exports){ +function baseProperty(e){return function(t){return null==t?void 0:t[e]}}function isArrayLike(e){return null!=e&&isLength(getLength(e))}function isIndex(e,t){return e="number"==typeof e||reIsUint.test(e)?+e:-1,t=null==t?MAX_SAFE_INTEGER:t,e>-1&&e%1==0&&e-1&&e%1==0&&e<=MAX_SAFE_INTEGER}function shimKeys(e){for(var t=keysIn(e),r=t.length,n=r&&e.length,s=!!n&&isLength(n)&&(isArray(e)||isArguments(e)),o=-1,i=[];++o0;++nt3?Math.pow(r,1/3):r/t2+t0}function lab2xyz(r){return r>t1?r*r*r:t2*(r-t0)}function xyz2rgb(r){return 255*(r<=.0031308?12.92*r:1.055*Math.pow(r,1/2.4)-.055)}function rgb2xyz(r){return(r/=255)<=.04045?r/12.92:Math.pow((r+.055)/1.055,2.4)}function rgbToLab(r){var t=rgb2xyz(r[0]),a=rgb2xyz(r[1]),n=rgb2xyz(r[2]),b=xyz2lab((.4124564*t+.3575761*a+.1804375*n)/Xn),o=xyz2lab((.2126729*t+.7151522*a+.072175*n)/Yn),g=xyz2lab((.0193339*t+.119192*a+.9503041*n)/Zn);return[116*o-16,500*(b-o),200*(o-g),r[3]]}function labToRgb(r){var t=(r[0]+16)/116,a=isNaN(r[1])?t:t+r[1]/500,n=isNaN(r[2])?t:t-r[2]/200;return t=Yn*lab2xyz(t),a=Xn*lab2xyz(a),n=Zn*lab2xyz(n),[xyz2rgb(3.2404542*a-1.5371385*t-.4985314*n),xyz2rgb(-.969266*a+1.8760108*t+.041556*n),xyz2rgb(.0556434*a-.2040259*t+1.0572252*n),r[3]]}function rgbToHcl(r){var t=rgbToLab(r),a=t[0],n=t[1],b=t[2],o=Math.atan2(b,n)*rad2deg;return[o<0?o+360:o,Math.sqrt(n*n+b*b),a,r[3]]}function hclToRgb(r){var t=r[0]*deg2rad,a=r[1],n=r[2];return labToRgb([n,Math.cos(t)*a,Math.sin(t)*a,r[3]])}var Kn=18,Xn=.95047,Yn=1,Zn=1.08883,t0=4/29,t1=6/29,t2=3*t1*t1,t3=t1*t1*t1,deg2rad=Math.PI/180,rad2deg=180/Math.PI;module.exports={lab:{forward:rgbToLab,reverse:labToRgb},hcl:{forward:rgbToHcl,reverse:hclToRgb}}; +},{}],163:[function(require,module,exports){ +"use strict";function identityFunction(t){return t}function createFunction(t,o){var e;if(isFunctionDefinition(t)){var n,r=t.stops&&"object"==typeof t.stops[0][0],i=r||void 0!==t.property,s=r||!i,a=t.stops&&typeof(r?t.stops[0][0].property:t.stops[0][0]),p=t.type||o||("string"===a?"categorical":"exponential");if("exponential"===p)n=evaluateExponentialFunction;else if("interval"===p)n=evaluateIntervalFunction;else if("categorical"===p)n=evaluateCategoricalFunction;else{if("identity"!==p)throw new Error('Unknown function type "'+p+'"');n=evaluateIdentityFunction}var u;if(t.colorSpace&&"rgb"!==t.colorSpace){if(!colorSpaces[t.colorSpace])throw new Error("Unknown color space: "+t.colorSpace);var c=colorSpaces[t.colorSpace];t=JSON.parse(JSON.stringify(t));for(var l=0;l=t.stops.length)break;if(o<=t.stops[n][0])break;n++}return 0===n?t.stops[n][1]:n===t.stops.length?t.stops[n-1][1]:interpolate(o,e,t.stops[n-1][0],t.stops[n][0],t.stops[n-1][1],t.stops[n][1])}function evaluateIdentityFunction(t,o){return o}function interpolate(t,o,e,n,r,i){return"function"==typeof r?function(){var s=r.apply(void 0,arguments),a=i.apply(void 0,arguments);return interpolate(t,o,e,n,s,a)}:r.length?interpolateArray(t,o,e,n,r,i):interpolateNumber(t,o,e,n,r,i)}function interpolateNumber(t,o,e,n,r,i){var s,a=n-e,p=t-e;return s=1===o?p/a:(Math.pow(o,p)-1)/(Math.pow(o,a)-1),r*(1-s)+i*s}function interpolateArray(t,o,e,n,r,i){for(var s=[],a=0;a7)return[new ValidationError(u,a,"constants have been deprecated as of v8")];if(!(a in l.constants))return[new ValidationError(u,a,'constant "%s" not found',a)];e=extend({},e,{value:l.constants[a]})}return n.function&&"object"===getType(a)?r(e):n.type&&i[n.type]?i[n.type](e):t(extend({},e,{valueSpec:n.type?o[n.type]:n}))}; +},{"../error/validation_error":166,"../util/extend":168,"../util/get_type":169,"./validate_array":173,"./validate_boolean":174,"./validate_color":175,"./validate_constants":176,"./validate_enum":177,"./validate_filter":178,"./validate_function":179,"./validate_layer":181,"./validate_light":183,"./validate_number":184,"./validate_object":185,"./validate_source":187,"./validate_string":188}],173:[function(require,module,exports){ +"use strict";var getType=require("../util/get_type"),validate=require("./validate"),ValidationError=require("../error/validation_error");module.exports=function(e){var r=e.value,t=e.valueSpec,a=e.style,n=e.styleSpec,l=e.key,i=e.arrayElementValidator||validate;if("array"!==getType(r))return[new ValidationError(l,r,"array expected, %s found",getType(r))];if(t.length&&r.length!==t.length)return[new ValidationError(l,r,"array length %d expected, length %d found",t.length,r.length)];if(t["min-length"]&&r.length7)return t?[new ValidationError(e,t,"constants have been deprecated as of v8")]:[];var o=getType(t);if("object"!==o)return[new ValidationError(e,t,"object expected, %s found",o)];var n=[];for(var i in t)"@"!==i[0]&&n.push(new ValidationError(e+"."+i,t[i],'constants must start with "@"'));return n}; +},{"../error/validation_error":166,"../util/get_type":169}],177:[function(require,module,exports){ +"use strict";var ValidationError=require("../error/validation_error"),unbundle=require("../util/unbundle_jsonlint");module.exports=function(e){var r=e.key,n=e.value,u=e.valueSpec,o=[];return Array.isArray(u.values)?u.values.indexOf(unbundle(n))===-1&&o.push(new ValidationError(r,n,"expected one of [%s], %s found",u.values.join(", "),n)):Object.keys(u.values).indexOf(unbundle(n))===-1&&o.push(new ValidationError(r,n,"expected one of [%s], %s found",Object.keys(u.values).join(", "),n)),o}; +},{"../error/validation_error":166,"../util/unbundle_jsonlint":171}],178:[function(require,module,exports){ +"use strict";var ValidationError=require("../error/validation_error"),validateEnum=require("./validate_enum"),getType=require("../util/get_type"),unbundle=require("../util/unbundle_jsonlint");module.exports=function e(t){var r,a=t.value,n=t.key,l=t.styleSpec,s=[];if("array"!==getType(a))return[new ValidationError(n,a,"array expected, %s found",getType(a))];if(a.length<1)return[new ValidationError(n,a,"filter array must have at least 1 element")];switch(s=s.concat(validateEnum({key:n+"[0]",value:a[0],valueSpec:l.filter_operator,style:t.style,styleSpec:t.styleSpec})),unbundle(a[0])){case"<":case"<=":case">":case">=":a.length>=2&&"$type"==a[1]&&s.push(new ValidationError(n,a,'"$type" cannot be use with operator "%s"',a[0]));case"==":case"!=":3!=a.length&&s.push(new ValidationError(n,a,'filter array for operator "%s" must have 3 elements',a[0]));case"in":case"!in":a.length>=2&&(r=getType(a[1]),"string"!==r?s.push(new ValidationError(n+"[1]",a[1],"string expected, %s found",r)):"@"===a[1][0]&&s.push(new ValidationError(n+"[1]",a[1],"filter key cannot be a constant")));for(var o=2;ounbundle(r[0].zoom))return[new ValidationError(o,r[0].zoom,"stop zoom values must appear in ascending order")];unbundle(r[0].zoom)!==i&&(i=unbundle(r[0].zoom),n=void 0),t=t.concat(validateObject({key:o+"[0]",value:r[0],valueSpec:{zoom:{}},style:e.style,styleSpec:e.styleSpec,objectElementValidators:{zoom:validateNumber,value:a}}))}else t=t.concat(a({key:o+"[0]",value:r[0],valueSpec:{},style:e.style,styleSpec:e.styleSpec}));return t=t.concat(validate({key:o+"[1]",value:r[1],valueSpec:l,style:e.style,styleSpec:e.styleSpec})),"number"===getType(r[0])&&"piecewise-constant"===l.function&&r[0]%1!==0&&t.push(new ValidationError(o+"[0]",r[0],"zoom level for piecewise-constant functions must be an integer")),t}function a(e){var t=getType(e.value),r=unbundle(e.value);if(o){if(t!==o)return[new ValidationError(e.key,e.value,"%s stop domain type must match previous stop domain type %s",t,o)]}else o=t,u||"string"!==t||(u="categorical");return"number"!==t&&"string"!==t?[new ValidationError(e.key,e.value,"property value must be a number or string")]:"number"!==t&&"categorical"!==u?[new ValidationError(e.key,e.value,"number expected, %s found",t)]:"categorical"!==u||"number"!==t||isFinite(r)&&Math.floor(r)===r?"number"===t&&void 0!==n&&r=8&&(y&&!e.valueSpec["property-function"]?d.push(new ValidationError(e.key,e.value,"property functions not supported")):p&&!e.valueSpec["zoom-function"]&&d.push(new ValidationError(e.key,e.value,"zoom functions not supported"))),"categorical"!==u&&!c||void 0!==e.value.property||d.push(new ValidationError(e.key,e.value,'"property" property is required')),d}; +},{"../error/validation_error":166,"../util/get_type":169,"../util/unbundle_jsonlint":171,"./validate":172,"./validate_array":173,"./validate_number":184,"./validate_object":185}],180:[function(require,module,exports){ +"use strict";var ValidationError=require("../error/validation_error"),validateString=require("./validate_string");module.exports=function(r){var e=r.value,t=r.key,a=validateString(r);return a.length?a:(e.indexOf("{fontstack}")===-1&&a.push(new ValidationError(t,e,'"glyphs" url must include a "{fontstack}" token')),e.indexOf("{range}")===-1&&a.push(new ValidationError(t,e,'"glyphs" url must include a "{range}" token')),a)}; +},{"../error/validation_error":166,"./validate_string":188}],181:[function(require,module,exports){ +"use strict";var ValidationError=require("../error/validation_error"),unbundle=require("../util/unbundle_jsonlint"),validateObject=require("./validate_object"),validateFilter=require("./validate_filter"),validatePaintProperty=require("./validate_paint_property"),validateLayoutProperty=require("./validate_layout_property"),extend=require("../util/extend");module.exports=function(e){var r=[],t=e.value,a=e.key,i=e.style,l=e.styleSpec;t.type||t.ref||r.push(new ValidationError(a,t,'either "type" or "ref" is required'));var o=unbundle(t.type),u=unbundle(t.ref);if(t.id)for(var n=0;nm.maximum?[new ValidationError(r,i,"%s is greater than the maximum value %s",i,m.maximum)]:[]}; +},{"../error/validation_error":166,"../util/get_type":169}],185:[function(require,module,exports){ +"use strict";var ValidationError=require("../error/validation_error"),getType=require("../util/get_type"),validateSpec=require("./validate");module.exports=function(e){var r=e.key,t=e.value,i=e.valueSpec||{},a=e.objectElementValidators||{},o=e.style,l=e.styleSpec,n=[],u=getType(t);if("object"!==u)return[new ValidationError(r,t,"object expected, %s found",u)];for(var p in t){var s,c=p.split(".")[0],d=i[c]||i["*"];if(a[c])s=a[c];else if(i[c])s=validateSpec;else if(a["*"])s=a["*"];else{if(!i["*"]){n.push(new ValidationError(r,t[p],'unknown property "%s"',p));continue}s=validateSpec}n=n.concat(s({key:(r?r+".":r)+p,value:t[p],valueSpec:d,style:o,styleSpec:l,object:t,objectKey:p}))}for(c in i)i[c].required&&void 0===i[c].default&&void 0===t[c]&&n.push(new ValidationError(r,t,'missing required property "%s"',c));return n}; +},{"../error/validation_error":166,"../util/get_type":169,"./validate":172}],186:[function(require,module,exports){ +"use strict";var validate=require("./validate"),ValidationError=require("../error/validation_error");module.exports=function(e){var r=e.key,a=e.style,t=e.styleSpec,i=e.value,l=e.objectKey,n=t["paint_"+e.layerType];if(!n)return[];var o=l.match(/^(.*)-transition$/);return o&&n[o[1]]&&n[o[1]].transition?validate({key:r,value:i,valueSpec:t.transition,style:a,styleSpec:t}):e.valueSpec||n[l]?validate({key:e.key,value:i,valueSpec:e.valueSpec||n[l],style:a,styleSpec:t}):[new ValidationError(r,i,'unknown property "%s"',l)]}; +},{"../error/validation_error":166,"./validate":172}],187:[function(require,module,exports){ +"use strict";var ValidationError=require("../error/validation_error"),unbundle=require("../util/unbundle_jsonlint"),validateObject=require("./validate_object"),validateEnum=require("./validate_enum");module.exports=function(e){var a=e.value,t=e.key,r=e.styleSpec,l=e.style;if(!a.type)return[new ValidationError(t,a,'"type" is required')];var u=unbundle(a.type);switch(u){case"vector":case"raster":var i=[];if(i=i.concat(validateObject({key:t,value:a,valueSpec:r.source_tile,style:e.style,styleSpec:r})),"url"in a)for(var s in a)["type","url","tileSize"].indexOf(s)<0&&i.push(new ValidationError(t+"."+s,a[s],'a source with a "url" property may not include a "%s" property',s));return i;case"geojson":return validateObject({key:t,value:a,valueSpec:r.source_geojson,style:l,styleSpec:r});case"video":return validateObject({key:t,value:a,valueSpec:r.source_video,style:l,styleSpec:r});case"image":return validateObject({key:t,value:a,valueSpec:r.source_image,style:l,styleSpec:r});case"canvas":return validateObject({key:t,value:a,valueSpec:r.source_canvas,style:l,styleSpec:r});default:return validateEnum({key:t+".type",value:a.type,valueSpec:{values:["vector","raster","geojson","video","image","canvas"]},style:l,styleSpec:r})}}; +},{"../error/validation_error":166,"../util/unbundle_jsonlint":171,"./validate_enum":177,"./validate_object":185}],188:[function(require,module,exports){ +"use strict";var getType=require("../util/get_type"),ValidationError=require("../error/validation_error");module.exports=function(r){var e=r.value,t=r.key,i=getType(e);return"string"!==i?[new ValidationError(t,e,"string expected, %s found",i)]:[]}; +},{"../error/validation_error":166,"../util/get_type":169}],189:[function(require,module,exports){ +"use strict";function validateStyleMin(e,a){a=a||latestStyleSpec;var t=[];return t=t.concat(validate({key:"",value:e,valueSpec:a.$root,styleSpec:a,style:e,objectElementValidators:{glyphs:validateGlyphsURL,"*":function(){return[]}}})),a.$version>7&&e.constants&&(t=t.concat(validateConstants({key:"constants",value:e.constants,style:e,styleSpec:a}))),sortErrors(t)}function sortErrors(e){return[].concat(e).sort(function(e,a){return e.line-a.line})}function wrapCleanErrors(e){return function(){return sortErrors(e.apply(this,arguments))}}var validateConstants=require("./validate/validate_constants"),validate=require("./validate/validate"),latestStyleSpec=require("../reference/latest.min"),validateGlyphsURL=require("./validate/validate_glyphs_url");validateStyleMin.source=wrapCleanErrors(require("./validate/validate_source")),validateStyleMin.light=wrapCleanErrors(require("./validate/validate_light")),validateStyleMin.layer=wrapCleanErrors(require("./validate/validate_layer")),validateStyleMin.filter=wrapCleanErrors(require("./validate/validate_filter")),validateStyleMin.paintProperty=wrapCleanErrors(require("./validate/validate_paint_property")),validateStyleMin.layoutProperty=wrapCleanErrors(require("./validate/validate_layout_property")),module.exports=validateStyleMin; +},{"../reference/latest.min":191,"./validate/validate":172,"./validate/validate_constants":176,"./validate/validate_filter":178,"./validate/validate_glyphs_url":180,"./validate/validate_layer":181,"./validate/validate_layout_property":182,"./validate/validate_light":183,"./validate/validate_paint_property":186,"./validate/validate_source":187}],190:[function(require,module,exports){ +function isEqual(a,l,i,e){i="function"==typeof i?bindCallback(i,e,3):void 0;var s=i?i(a,l):void 0;return void 0===s?baseIsEqual(a,l,i):!!s}var baseIsEqual=require("lodash._baseisequal"),bindCallback=require("lodash._bindcallback");module.exports=isEqual; +},{"lodash._baseisequal":155,"lodash._bindcallback":156}],191:[function(require,module,exports){ +module.exports=require("./v8.min.json"); +},{"./v8.min.json":192}],192:[function(require,module,exports){ +module.exports={"$version":8,"$root":{"version":{"required":true,"type":"enum","values":[8]},"name":{"type":"string"},"metadata":{"type":"*"},"center":{"type":"array","value":"number"},"zoom":{"type":"number"},"bearing":{"type":"number","default":0,"period":360,"units":"degrees"},"pitch":{"type":"number","default":0,"units":"degrees"},"light":{"type":"light"},"sources":{"required":true,"type":"sources"},"sprite":{"type":"string"},"glyphs":{"type":"string"},"transition":{"type":"transition"},"layers":{"required":true,"type":"array","value":"layer"}},"sources":{"*":{"type":"source"}},"source":["source_tile","source_geojson","source_video","source_image","source_canvas"],"source_tile":{"type":{"required":true,"type":"enum","values":{"vector":{},"raster":{}}},"url":{"type":"string"},"tiles":{"type":"array","value":"string"},"minzoom":{"type":"number","default":0},"maxzoom":{"type":"number","default":22},"tileSize":{"type":"number","default":512,"units":"pixels"},"*":{"type":"*"}},"source_geojson":{"type":{"required":true,"type":"enum","values":{"geojson":{}}},"data":{"type":"*"},"maxzoom":{"type":"number","default":18},"buffer":{"type":"number","default":128,"maximum":512,"minimum":0},"tolerance":{"type":"number","default":0.375},"cluster":{"type":"boolean","default":false},"clusterRadius":{"type":"number","default":50,"minimum":0},"clusterMaxZoom":{"type":"number"}},"source_video":{"type":{"required":true,"type":"enum","values":{"video":{}}},"urls":{"required":true,"type":"array","value":"string"},"coordinates":{"required":true,"type":"array","length":4,"value":{"type":"array","length":2,"value":"number"}}},"source_image":{"type":{"required":true,"type":"enum","values":{"image":{}}},"url":{"required":true,"type":"string"},"coordinates":{"required":true,"type":"array","length":4,"value":{"type":"array","length":2,"value":"number"}}},"source_canvas":{"type":{"required":true,"type":"enum","values":{"canvas":{}}},"coordinates":{"required":true,"type":"array","length":4,"value":{"type":"array","length":2,"value":"number"}},"animate":{"type":"boolean","default":"true"},"canvas":{"type":"string","required":true}},"layer":{"id":{"type":"string","required":true},"type":{"type":"enum","values":{"fill":{},"line":{},"symbol":{},"circle":{},"fill-extrusion":{},"raster":{},"background":{}}},"metadata":{"type":"*"},"ref":{"type":"string"},"source":{"type":"string"},"source-layer":{"type":"string"},"minzoom":{"type":"number","minimum":0,"maximum":24},"maxzoom":{"type":"number","minimum":0,"maximum":24},"filter":{"type":"filter"},"layout":{"type":"layout"},"paint":{"type":"paint"},"paint.*":{"type":"paint"}},"layout":["layout_fill","layout_line","layout_circle","layout_fill-extrusion","layout_symbol","layout_raster","layout_background"],"layout_background":{"visibility":{"type":"enum","values":{"visible":{},"none":{}},"default":"visible"}},"layout_fill":{"visibility":{"type":"enum","values":{"visible":{},"none":{}},"default":"visible"}},"layout_circle":{"visibility":{"type":"enum","values":{"visible":{},"none":{}},"default":"visible"}},"layout_fill-extrusion":{"visibility":{"type":"enum","values":{"visible":{},"none":{}},"default":"visible"}},"layout_line":{"line-cap":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"butt":{},"round":{},"square":{}},"default":"butt"},"line-join":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"bevel":{},"round":{},"miter":{}},"default":"miter"},"line-miter-limit":{"type":"number","default":2,"function":"interpolated","zoom-function":true,"requires":[{"line-join":"miter"}]},"line-round-limit":{"type":"number","default":1.05,"function":"interpolated","zoom-function":true,"requires":[{"line-join":"round"}]},"visibility":{"type":"enum","values":{"visible":{},"none":{}},"default":"visible"}},"layout_symbol":{"symbol-placement":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"point":{},"line":{}},"default":"point"},"symbol-spacing":{"type":"number","default":250,"minimum":1,"function":"interpolated","zoom-function":true,"units":"pixels","requires":[{"symbol-placement":"line"}]},"symbol-avoid-edges":{"type":"boolean","function":"piecewise-constant","zoom-function":true,"default":false},"icon-allow-overlap":{"type":"boolean","function":"piecewise-constant","zoom-function":true,"default":false,"requires":["icon-image"]},"icon-ignore-placement":{"type":"boolean","function":"piecewise-constant","zoom-function":true,"default":false,"requires":["icon-image"]},"icon-optional":{"type":"boolean","function":"piecewise-constant","zoom-function":true,"default":false,"requires":["icon-image","text-field"]},"icon-rotation-alignment":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"map":{},"viewport":{},"auto":{}},"default":"auto","requires":["icon-image"]},"icon-size":{"type":"number","default":1,"minimum":0,"function":"interpolated","zoom-function":true,"requires":["icon-image"]},"icon-text-fit":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"none":{},"width":{},"height":{},"both":{}},"default":"none","requires":["icon-image","text-field"]},"icon-text-fit-padding":{"type":"array","value":"number","length":4,"default":[0,0,0,0],"units":"pixels","function":"interpolated","zoom-function":true,"requires":["icon-image","text-field",{"icon-text-fit":["both","width","height"]}]},"icon-image":{"type":"string","function":"piecewise-constant","zoom-function":true,"tokens":true},"icon-rotate":{"type":"number","default":0,"period":360,"function":"interpolated","zoom-function":true,"property-function":true,"units":"degrees","requires":["icon-image"]},"icon-padding":{"type":"number","default":2,"minimum":0,"function":"interpolated","zoom-function":true,"units":"pixels","requires":["icon-image"]},"icon-keep-upright":{"type":"boolean","function":"piecewise-constant","zoom-function":true,"default":false,"requires":["icon-image",{"icon-rotation-alignment":"map"},{"symbol-placement":"line"}]},"icon-offset":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","zoom-function":true,"property-function":true,"requires":["icon-image"]},"text-pitch-alignment":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"map":{},"viewport":{},"auto":{}},"default":"auto","requires":["text-field"]},"text-rotation-alignment":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"map":{},"viewport":{},"auto":{}},"default":"auto","requires":["text-field"]},"text-field":{"type":"string","function":"piecewise-constant","zoom-function":true,"default":"","tokens":true},"text-font":{"type":"array","value":"string","function":"piecewise-constant","zoom-function":true,"default":["Open Sans Regular","Arial Unicode MS Regular"],"requires":["text-field"]},"text-size":{"type":"number","default":16,"minimum":0,"units":"pixels","function":"interpolated","zoom-function":true,"requires":["text-field"]},"text-max-width":{"type":"number","default":10,"minimum":0,"units":"ems","function":"interpolated","zoom-function":true,"requires":["text-field"]},"text-line-height":{"type":"number","default":1.2,"units":"ems","function":"interpolated","zoom-function":true,"requires":["text-field"]},"text-letter-spacing":{"type":"number","default":0,"units":"ems","function":"interpolated","zoom-function":true,"requires":["text-field"]},"text-justify":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"left":{},"center":{},"right":{}},"default":"center","requires":["text-field"]},"text-anchor":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"center":{},"left":{},"right":{},"top":{},"bottom":{},"top-left":{},"top-right":{},"bottom-left":{},"bottom-right":{}},"default":"center","requires":["text-field"]},"text-max-angle":{"type":"number","default":45,"units":"degrees","function":"interpolated","zoom-function":true,"requires":["text-field",{"symbol-placement":"line"}]},"text-rotate":{"type":"number","default":0,"period":360,"units":"degrees","function":"interpolated","zoom-function":true,"requires":["text-field"]},"text-padding":{"type":"number","default":2,"minimum":0,"units":"pixels","function":"interpolated","zoom-function":true,"requires":["text-field"]},"text-keep-upright":{"type":"boolean","function":"piecewise-constant","zoom-function":true,"default":true,"requires":["text-field",{"text-rotation-alignment":"map"},{"symbol-placement":"line"}]},"text-transform":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"none":{},"uppercase":{},"lowercase":{}},"default":"none","requires":["text-field"]},"text-offset":{"type":"array","value":"number","units":"ems","function":"interpolated","zoom-function":true,"length":2,"default":[0,0],"requires":["text-field"]},"text-allow-overlap":{"type":"boolean","function":"piecewise-constant","zoom-function":true,"default":false,"requires":["text-field"]},"text-ignore-placement":{"type":"boolean","function":"piecewise-constant","zoom-function":true,"default":false,"requires":["text-field"]},"text-optional":{"type":"boolean","function":"piecewise-constant","zoom-function":true,"default":false,"requires":["text-field","icon-image"]},"visibility":{"type":"enum","values":{"visible":{},"none":{}},"default":"visible"}},"layout_raster":{"visibility":{"type":"enum","values":{"visible":{},"none":{}},"default":"visible"}},"filter":{"type":"array","value":"*"},"filter_operator":{"type":"enum","values":{"==":{},"!=":{},">":{},">=":{},"<":{},"<=":{},"in":{},"!in":{},"all":{},"any":{},"none":{},"has":{},"!has":{}}},"geometry_type":{"type":"enum","values":{"Point":{},"LineString":{},"Polygon":{}}},"function":{"stops":{"type":"array","value":"function_stop"},"base":{"type":"number","default":1,"minimum":0},"property":{"type":"string","default":"$zoom"},"type":{"type":"enum","values":{"identity":{},"exponential":{},"interval":{},"categorical":{}},"default":"exponential"},"colorSpace":{"type":"enum","values":{"rgb":{},"lab":{},"hcl":{}},"default":"rgb"}},"function_stop":{"type":"array","minimum":0,"maximum":22,"value":["number","color"],"length":2},"light":{"anchor":{"type":"enum","default":"viewport","values":{"map":{},"viewport":{}},"transition":false},"position":{"type":"array","default":[1.15,210,30],"length":3,"value":"number","transition":true,"function":"interpolated","zoom-function":true,"property-function":false},"color":{"type":"color","default":"#ffffff","function":"interpolated","zoom-function":true,"property-function":false,"transition":true},"intensity":{"type":"number","default":0.5,"minimum":0,"maximum":1,"function":"interpolated","zoom-function":true,"property-function":false,"transition":true}},"paint":["paint_fill","paint_line","paint_circle","paint_fill-extrusion","paint_symbol","paint_raster","paint_background"],"paint_fill":{"fill-antialias":{"type":"boolean","function":"piecewise-constant","zoom-function":true,"default":true},"fill-opacity":{"type":"number","function":"interpolated","zoom-function":true,"property-function":true,"default":1,"minimum":0,"maximum":1,"transition":true},"fill-color":{"type":"color","default":"#000000","function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"requires":[{"!":"fill-pattern"}]},"fill-outline-color":{"type":"color","function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"requires":[{"!":"fill-pattern"},{"fill-antialias":true}]},"fill-translate":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","zoom-function":true,"transition":true,"units":"pixels"},"fill-translate-anchor":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"map":{},"viewport":{}},"default":"map","requires":["fill-translate"]},"fill-pattern":{"type":"string","function":"piecewise-constant","zoom-function":true,"transition":true}},"paint_fill-extrusion":{"fill-extrusion-opacity":{"type":"number","function":"interpolated","zoom-function":true,"property-function":false,"default":1,"minimum":0,"maximum":1,"transition":true},"fill-extrusion-color":{"type":"color","default":"#000000","function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"requires":[{"!":"fill-extrusion-pattern"}]},"fill-extrusion-translate":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","zoom-function":true,"transition":true,"units":"pixels"},"fill-extrusion-translate-anchor":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"map":{},"viewport":{}},"default":"map","requires":["fill-extrusion-translate"]},"fill-extrusion-pattern":{"type":"string","function":"piecewise-constant","zoom-function":true,"transition":true},"fill-extrusion-height":{"type":"number","function":"interpolated","zoom-function":true,"property-function":true,"default":0,"minimum":0,"units":"meters","transition":true},"fill-extrusion-base":{"type":"number","function":"interpolated","zoom-function":true,"property-function":true,"default":0,"minimum":0,"units":"meters","transition":true,"requires":["fill-extrusion-height"]}},"paint_line":{"line-opacity":{"type":"number","function":"interpolated","zoom-function":true,"property-function":true,"default":1,"minimum":0,"maximum":1,"transition":true},"line-color":{"type":"color","default":"#000000","function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"requires":[{"!":"line-pattern"}]},"line-translate":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","zoom-function":true,"transition":true,"units":"pixels"},"line-translate-anchor":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"map":{},"viewport":{}},"default":"map","requires":["line-translate"]},"line-width":{"type":"number","default":1,"minimum":0,"function":"interpolated","zoom-function":true,"transition":true,"units":"pixels"},"line-gap-width":{"type":"number","default":0,"minimum":0,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"units":"pixels"},"line-offset":{"type":"number","default":0,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"units":"pixels"},"line-blur":{"type":"number","default":0,"minimum":0,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"units":"pixels"},"line-dasharray":{"type":"array","value":"number","function":"piecewise-constant","zoom-function":true,"minimum":0,"transition":true,"units":"line widths","requires":[{"!":"line-pattern"}]},"line-pattern":{"type":"string","function":"piecewise-constant","zoom-function":true,"transition":true}},"paint_circle":{"circle-radius":{"type":"number","default":5,"minimum":0,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"units":"pixels"},"circle-color":{"type":"color","default":"#000000","function":"interpolated","zoom-function":true,"property-function":true,"transition":true},"circle-blur":{"type":"number","default":0,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true},"circle-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true},"circle-translate":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","zoom-function":true,"transition":true,"units":"pixels"},"circle-translate-anchor":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"map":{},"viewport":{}},"default":"map","requires":["circle-translate"]},"circle-pitch-scale":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"map":{},"viewport":{}},"default":"map"},"circle-stroke-width":{"type":"number","default":0,"minimum":0,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true,"units":"pixels"},"circle-stroke-color":{"type":"color","default":"#000000","function":"interpolated","zoom-function":true,"property-function":true,"transition":true},"circle-stroke-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"function":"interpolated","zoom-function":true,"property-function":true,"transition":true}},"paint_symbol":{"icon-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"function":"interpolated","zoom-function":true,"transition":true,"requires":["icon-image"]},"icon-color":{"type":"color","default":"#000000","function":"interpolated","zoom-function":true,"transition":true,"requires":["icon-image"]},"icon-halo-color":{"type":"color","default":"rgba(0, 0, 0, 0)","function":"interpolated","zoom-function":true,"transition":true,"requires":["icon-image"]},"icon-halo-width":{"type":"number","default":0,"minimum":0,"function":"interpolated","zoom-function":true,"transition":true,"units":"pixels","requires":["icon-image"]},"icon-halo-blur":{"type":"number","default":0,"minimum":0,"function":"interpolated","zoom-function":true,"transition":true,"units":"pixels","requires":["icon-image"]},"icon-translate":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","zoom-function":true,"transition":true,"units":"pixels","requires":["icon-image"]},"icon-translate-anchor":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"map":{},"viewport":{}},"default":"map","requires":["icon-image","icon-translate"]},"text-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"function":"interpolated","zoom-function":true,"transition":true,"requires":["text-field"]},"text-color":{"type":"color","default":"#000000","function":"interpolated","zoom-function":true,"transition":true,"requires":["text-field"]},"text-halo-color":{"type":"color","default":"rgba(0, 0, 0, 0)","function":"interpolated","zoom-function":true,"transition":true,"requires":["text-field"]},"text-halo-width":{"type":"number","default":0,"minimum":0,"function":"interpolated","zoom-function":true,"transition":true,"units":"pixels","requires":["text-field"]},"text-halo-blur":{"type":"number","default":0,"minimum":0,"function":"interpolated","zoom-function":true,"transition":true,"units":"pixels","requires":["text-field"]},"text-translate":{"type":"array","value":"number","length":2,"default":[0,0],"function":"interpolated","zoom-function":true,"transition":true,"units":"pixels","requires":["text-field"]},"text-translate-anchor":{"type":"enum","function":"piecewise-constant","zoom-function":true,"values":{"map":{},"viewport":{}},"default":"map","requires":["text-field","text-translate"]}},"paint_raster":{"raster-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"function":"interpolated","zoom-function":true,"transition":true},"raster-hue-rotate":{"type":"number","default":0,"period":360,"function":"interpolated","zoom-function":true,"transition":true,"units":"degrees"},"raster-brightness-min":{"type":"number","function":"interpolated","zoom-function":true,"default":0,"minimum":0,"maximum":1,"transition":true},"raster-brightness-max":{"type":"number","function":"interpolated","zoom-function":true,"default":1,"minimum":0,"maximum":1,"transition":true},"raster-saturation":{"type":"number","default":0,"minimum":-1,"maximum":1,"function":"interpolated","zoom-function":true,"transition":true},"raster-contrast":{"type":"number","default":0,"minimum":-1,"maximum":1,"function":"interpolated","zoom-function":true,"transition":true},"raster-fade-duration":{"type":"number","default":300,"minimum":0,"function":"interpolated","zoom-function":true,"transition":true,"units":"milliseconds"}},"paint_background":{"background-color":{"type":"color","default":"#000000","function":"interpolated","zoom-function":true,"transition":true,"requires":[{"!":"background-pattern"}]},"background-pattern":{"type":"string","function":"piecewise-constant","zoom-function":true,"transition":true},"background-opacity":{"type":"number","default":1,"minimum":0,"maximum":1,"function":"interpolated","zoom-function":true,"transition":true}},"transition":{"duration":{"type":"number","default":300,"minimum":0,"units":"milliseconds"},"delay":{"type":"number","default":0,"minimum":0,"units":"milliseconds"}}} +},{}],193:[function(require,module,exports){ +"use strict";function isSupported(e){return!!(isBrowser()&&isArraySupported()&&isFunctionSupported()&&isObjectSupported()&&isJSONSupported()&&isWorkerSupported()&&isUint8ClampedArraySupported()&&isWebGLSupportedCached(e&&e.failIfMajorPerformanceCaveat))}function isBrowser(){return"undefined"!=typeof window&&"undefined"!=typeof document}function isArraySupported(){return Array.prototype&&Array.prototype.every&&Array.prototype.filter&&Array.prototype.forEach&&Array.prototype.indexOf&&Array.prototype.lastIndexOf&&Array.prototype.map&&Array.prototype.some&&Array.prototype.reduce&&Array.prototype.reduceRight&&Array.isArray}function isFunctionSupported(){return Function.prototype&&Function.prototype.bind}function isObjectSupported(){return Object.keys&&Object.create&&Object.getPrototypeOf&&Object.getOwnPropertyNames&&Object.isSealed&&Object.isFrozen&&Object.isExtensible&&Object.getOwnPropertyDescriptor&&Object.defineProperty&&Object.defineProperties&&Object.seal&&Object.freeze&&Object.preventExtensions}function isJSONSupported(){return"JSON"in window&&"parse"in JSON&&"stringify"in JSON}function isWorkerSupported(){return"Worker"in window}function isUint8ClampedArraySupported(){return"Uint8ClampedArray"in window}function isWebGLSupportedCached(e){return void 0===isWebGLSupportedCache[e]&&(isWebGLSupportedCache[e]=isWebGLSupported(e)),isWebGLSupportedCache[e]}function isWebGLSupported(e){var t=document.createElement("canvas"),r=Object.create(isSupported.webGLContextAttributes);return r.failIfMajorPerformanceCaveat=e,t.probablySupportsContext?t.probablySupportsContext("webgl",r)||t.probablySupportsContext("experimental-webgl",r):t.supportsContext?t.supportsContext("webgl",r)||t.supportsContext("experimental-webgl",r):t.getContext("webgl",r)||t.getContext("experimental-webgl",r)}"undefined"!=typeof module&&module.exports?module.exports=isSupported:window&&(window.mapboxgl=window.mapboxgl||{},window.mapboxgl.supported=isSupported);var isWebGLSupportedCache={};isSupported.webGLContextAttributes={antialias:!1,alpha:!0,stencil:!0,depth:!0}; +},{}],194:[function(require,module,exports){ +(function (process){ +function normalizeArray(r,t){for(var e=0,n=r.length-1;n>=0;n--){var s=r[n];"."===s?r.splice(n,1):".."===s?(r.splice(n,1),e++):e&&(r.splice(n,1),e--)}if(t)for(;e--;e)r.unshift("..");return r}function filter(r,t){if(r.filter)return r.filter(t);for(var e=[],n=0;n=-1&&!t;e--){var n=e>=0?arguments[e]:process.cwd();if("string"!=typeof n)throw new TypeError("Arguments to path.resolve must be strings");n&&(r=n+"/"+r,t="/"===n.charAt(0))}return r=normalizeArray(filter(r.split("/"),function(r){return!!r}),!t).join("/"),(t?"/":"")+r||"."},exports.normalize=function(r){var t=exports.isAbsolute(r),e="/"===substr(r,-1);return r=normalizeArray(filter(r.split("/"),function(r){return!!r}),!t).join("/"),r||t||(r="."),r&&e&&(r+="/"),(t?"/":"")+r},exports.isAbsolute=function(r){return"/"===r.charAt(0)},exports.join=function(){var r=Array.prototype.slice.call(arguments,0);return exports.normalize(filter(r,function(r,t){if("string"!=typeof r)throw new TypeError("Arguments to path.join must be strings");return r}).join("/"))},exports.relative=function(r,t){function e(r){for(var t=0;t=0&&""===r[e];e--);return t>e?[]:r.slice(t,e-t+1)}r=exports.resolve(r).substr(1),t=exports.resolve(t).substr(1);for(var n=e(r.split("/")),s=e(t.split("/")),i=Math.min(n.length,s.length),o=i,u=0;u55295&&e<57344){if(!r){e>56319||o+1===n?i.push(239,191,189):r=e;continue}if(e<56320){i.push(239,191,189),r=e;continue}e=r-55296<<10|e-56320|65536,r=null}else r&&(i.push(239,191,189),r=null);e<128?i.push(e):e<2048?i.push(e>>6|192,63&e|128):e<65536?i.push(e>>12|224,e>>6&63|128,63&e|128):i.push(e>>18|240,e>>12&63|128,e>>6&63|128,63&e|128)}return i}module.exports=Buffer;var ieee754=require("ieee754"),BufferMethods,lastStr,lastStrEncoded;BufferMethods={readUInt32LE:function(t){return(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},writeUInt32LE:function(t,e){this[e]=t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24},readInt32LE:function(t){return(this[t]|this[t+1]<<8|this[t+2]<<16)+(this[t+3]<<24)},readFloatLE:function(t){return ieee754.read(this,t,!0,23,4)},readDoubleLE:function(t){return ieee754.read(this,t,!0,52,8)},writeFloatLE:function(t,e){return ieee754.write(this,t,e,!0,23,4)},writeDoubleLE:function(t,e){return ieee754.write(this,t,e,!0,52,8)},toString:function(t,e,r){var n="",i="";e=e||0,r=Math.min(this.length,r||this.length);for(var o=e;o=1;){if(i.pos>=e)throw new Error("Given varint doesn't fit into 10 bytes");var r=255&t;i.buf[i.pos++]=r|(t>=128?128:0),t/=128}}function reallocForRawMessage(t,i,e){var r=i<=16383?1:i<=2097151?2:i<=268435455?3:Math.ceil(Math.log(i)/(7*Math.LN2));e.realloc(r);for(var s=e.pos-1;s>=t;s--)e.buf[s+r]=e.buf[s]}function writePackedVarint(t,i){for(var e=0;e>3,n=this.pos;t(s,i,this),this.pos===n&&this.skip(r)}return i},readMessage:function(t,i){return this.readFields(t,i,this.readVarint()+this.pos)},readFixed32:function(){var t=this.buf.readUInt32LE(this.pos);return this.pos+=4,t},readSFixed32:function(){var t=this.buf.readInt32LE(this.pos);return this.pos+=4,t},readFixed64:function(){var t=this.buf.readUInt32LE(this.pos)+this.buf.readUInt32LE(this.pos+4)*SHIFT_LEFT_32;return this.pos+=8,t},readSFixed64:function(){var t=this.buf.readUInt32LE(this.pos)+this.buf.readInt32LE(this.pos+4)*SHIFT_LEFT_32;return this.pos+=8,t},readFloat:function(){var t=this.buf.readFloatLE(this.pos);return this.pos+=4,t},readDouble:function(){var t=this.buf.readDoubleLE(this.pos);return this.pos+=8,t},readVarint:function(){var t,i,e=this.buf;return i=e[this.pos++],t=127&i,i<128?t:(i=e[this.pos++],t|=(127&i)<<7,i<128?t:(i=e[this.pos++],t|=(127&i)<<14,i<128?t:(i=e[this.pos++],t|=(127&i)<<21,i<128?t:readVarintRemainder(t,this))))},readVarint64:function(){var t=this.pos,i=this.readVarint();if(i127;);else if(i===Pbf.Bytes)this.pos=this.readVarint()+this.pos;else if(i===Pbf.Fixed32)this.pos+=4;else{if(i!==Pbf.Fixed64)throw new Error("Unimplemented type: "+i);this.pos+=8}},writeTag:function(t,i){this.writeVarint(t<<3|i)},realloc:function(t){for(var i=this.length||16;i268435455?void writeBigVarint(t,this):(this.realloc(4),this.buf[this.pos++]=127&t|(t>127?128:0),void(t<=127||(this.buf[this.pos++]=127&(t>>>=7)|(t>127?128:0),t<=127||(this.buf[this.pos++]=127&(t>>>=7)|(t>127?128:0),t<=127||(this.buf[this.pos++]=t>>>7&127)))))},writeSVarint:function(t){this.writeVarint(t<0?2*-t-1:2*t)},writeBoolean:function(t){this.writeVarint(Boolean(t))},writeString:function(t){t=String(t);var i=Buffer.byteLength(t);this.writeVarint(i),this.realloc(i),this.buf.write(t,this.pos),this.pos+=i},writeFloat:function(t){this.realloc(4),this.buf.writeFloatLE(t,this.pos),this.pos+=4},writeDouble:function(t){this.realloc(8),this.buf.writeDoubleLE(t,this.pos),this.pos+=8},writeBytes:function(t){var i=t.length;this.writeVarint(i),this.realloc(i);for(var e=0;e=128&&reallocForRawMessage(e,r,this),this.pos=e-1,this.writeVarint(r),this.pos+=r},writeMessage:function(t,i,e){this.writeTag(t,Pbf.Bytes),this.writeRawMessage(i,e)},writePackedVarint:function(t,i){this.writeMessage(t,writePackedVarint,i)},writePackedSVarint:function(t,i){this.writeMessage(t,writePackedSVarint,i)},writePackedBoolean:function(t,i){this.writeMessage(t,writePackedBoolean,i)},writePackedFloat:function(t,i){this.writeMessage(t,writePackedFloat,i)},writePackedDouble:function(t,i){this.writeMessage(t,writePackedDouble,i)},writePackedFixed32:function(t,i){this.writeMessage(t,writePackedFixed32,i)},writePackedSFixed32:function(t,i){this.writeMessage(t,writePackedSFixed32,i)},writePackedFixed64:function(t,i){this.writeMessage(t,writePackedFixed64,i)},writePackedSFixed64:function(t,i){this.writeMessage(t,writePackedSFixed64,i)},writeBytesField:function(t,i){this.writeTag(t,Pbf.Bytes),this.writeBytes(i)},writeFixed32Field:function(t,i){this.writeTag(t,Pbf.Fixed32),this.writeFixed32(i)},writeSFixed32Field:function(t,i){this.writeTag(t,Pbf.Fixed32),this.writeSFixed32(i)},writeFixed64Field:function(t,i){this.writeTag(t,Pbf.Fixed64),this.writeFixed64(i)},writeSFixed64Field:function(t,i){this.writeTag(t,Pbf.Fixed64),this.writeSFixed64(i)},writeVarintField:function(t,i){this.writeTag(t,Pbf.Varint),this.writeVarint(i)},writeSVarintField:function(t,i){this.writeTag(t,Pbf.Varint),this.writeSVarint(i)},writeStringField:function(t,i){this.writeTag(t,Pbf.Bytes),this.writeString(i)},writeFloatField:function(t,i){this.writeTag(t,Pbf.Fixed32),this.writeFloat(i)},writeDoubleField:function(t,i){this.writeTag(t,Pbf.Fixed64),this.writeDouble(i)},writeBooleanField:function(t,i){this.writeVarintField(t,Boolean(i))}}; +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{"./buffer":195}],197:[function(require,module,exports){ +"use strict";function Point(t,n){this.x=t,this.y=n}module.exports=Point,Point.prototype={clone:function(){return new Point(this.x,this.y)},add:function(t){return this.clone()._add(t)},sub:function(t){return this.clone()._sub(t)},mult:function(t){return this.clone()._mult(t)},div:function(t){return this.clone()._div(t)},rotate:function(t){return this.clone()._rotate(t)},matMult:function(t){return this.clone()._matMult(t)},unit:function(){return this.clone()._unit()},perp:function(){return this.clone()._perp()},round:function(){return this.clone()._round()},mag:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},equals:function(t){return this.x===t.x&&this.y===t.y},dist:function(t){return Math.sqrt(this.distSqr(t))},distSqr:function(t){var n=t.x-this.x,i=t.y-this.y;return n*n+i*i},angle:function(){return Math.atan2(this.y,this.x)},angleTo:function(t){return Math.atan2(this.y-t.y,this.x-t.x)},angleWith:function(t){return this.angleWithSep(t.x,t.y)},angleWithSep:function(t,n){return Math.atan2(this.x*n-this.y*t,this.x*t+this.y*n)},_matMult:function(t){var n=t[0]*this.x+t[1]*this.y,i=t[2]*this.x+t[3]*this.y;return this.x=n,this.y=i,this},_add:function(t){return this.x+=t.x,this.y+=t.y,this},_sub:function(t){return this.x-=t.x,this.y-=t.y,this},_mult:function(t){return this.x*=t,this.y*=t,this},_div:function(t){return this.x/=t,this.y/=t,this},_unit:function(){return this._div(this.mag()),this},_perp:function(){var t=this.y;return this.y=this.x,this.x=-t,this},_rotate:function(t){var n=Math.cos(t),i=Math.sin(t),s=n*this.x-i*this.y,r=i*this.x+n*this.y;return this.x=s,this.y=r,this},_round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}},Point.convert=function(t){return t instanceof Point?t:Array.isArray(t)?new Point(t[0],t[1]):t}; +},{}],198:[function(require,module,exports){ +function defaultSetTimout(){throw new Error("setTimeout has not been defined")}function defaultClearTimeout(){throw new Error("clearTimeout has not been defined")}function runTimeout(e){if(cachedSetTimeout===setTimeout)return setTimeout(e,0);if((cachedSetTimeout===defaultSetTimout||!cachedSetTimeout)&&setTimeout)return cachedSetTimeout=setTimeout,setTimeout(e,0);try{return cachedSetTimeout(e,0)}catch(t){try{return cachedSetTimeout.call(null,e,0)}catch(t){return cachedSetTimeout.call(this,e,0)}}}function runClearTimeout(e){if(cachedClearTimeout===clearTimeout)return clearTimeout(e);if((cachedClearTimeout===defaultClearTimeout||!cachedClearTimeout)&&clearTimeout)return cachedClearTimeout=clearTimeout,clearTimeout(e);try{return cachedClearTimeout(e)}catch(t){try{return cachedClearTimeout.call(null,e)}catch(t){return cachedClearTimeout.call(this,e)}}}function cleanUpNextTick(){draining&¤tQueue&&(draining=!1,currentQueue.length?queue=currentQueue.concat(queue):queueIndex=-1,queue.length&&drainQueue())}function drainQueue(){if(!draining){var e=runTimeout(cleanUpNextTick);draining=!0;for(var t=queue.length;t;){for(currentQueue=queue,queue=[];++queueIndex1)for(var u=1;ur;){if(o-r>600){var f=o-r+1,e=t-r+1,l=Math.log(f),s=.5*Math.exp(2*l/3),i=.5*Math.sqrt(l*s*(f-s)/f)*(e-f/2<0?-1:1),n=Math.max(r,Math.floor(t-e*s/f+i)),h=Math.min(o,Math.floor(t+(f-e)*s/f+i));partialSort(a,t,n,h,p)}var u=a[t],M=r,w=o;for(swap(a,r,t),p(a[o],u)>0&&swap(a,r,o);M0;)w--}0===p(a[r],u)?swap(a,r,w):(w++,swap(a,w,o)),w<=t&&(r=w+1),t<=w&&(o=w-1)}}function swap(a,t,r){var o=a[t];a[t]=a[r],a[r]=o}function defaultCompare(a,t){return at?1:0}module.exports=partialSort; +},{}],200:[function(require,module,exports){ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):t.ShelfPack=e()}(this,function(){function t(t,e,s){s=s||{},this.w=t||64,this.h=e||64,this.autoResize=!!s.autoResize,this.shelves=[],this.stats={},this.count=function(t){this.stats[t]=(0|this.stats[t])+1}}function e(t,e,s){this.x=0,this.y=t,this.w=this.free=e,this.h=s}return t.prototype.pack=function(t,e){t=[].concat(t),e=e||{};for(var s,h,i,n=[],r=0;r0){for(var o=0,f=0,u=0;uh.h||t>h.free||sl)&&(a=2*Math.max(t,l)),(ff)&&(u=2*Math.max(s,f)),this.resize(a,u),this.packOne(t,s)}return null},t.prototype.clear=function(){this.shelves=[],this.stats={}},t.prototype.resize=function(t,e){this.w=t,this.h=e;for(var s=0;sthis.free||e>this.h)return null;var s=this.x;return this.x+=t,this.free-=t,{x:s,y:this.y,w:t,h:e,width:t,height:e}},e.prototype.resize=function(t){return this.free+=t-this.w,this.w=t,!0},t}); +},{}],201:[function(require,module,exports){ +"use strict";function supercluster(t){return new SuperCluster(t)}function SuperCluster(t){this.options=extend(Object.create(this.options),t),this.trees=new Array(this.options.maxZoom+1)}function createCluster(t,e,o,n){return{x:t,y:e,zoom:1/0,id:n,numPoints:o}}function createPointCluster(t,e){var o=t.geometry.coordinates;return createCluster(lngX(o[0]),latY(o[1]),1,e)}function getClusterJSON(t){return{type:"Feature",properties:getClusterProperties(t),geometry:{type:"Point",coordinates:[xLng(t.x),yLat(t.y)]}}}function getClusterProperties(t){var e=t.numPoints,o=e>=1e4?Math.round(e/1e3)+"k":e>=1e3?Math.round(e/100)/10+"k":e;return{cluster:!0,point_count:e,point_count_abbreviated:o}}function lngX(t){return t/360+.5}function latY(t){var e=Math.sin(t*Math.PI/180),o=.5-.25*Math.log((1+e)/(1-e))/Math.PI;return o<0?0:o>1?1:o}function xLng(t){return 360*(t-.5)}function yLat(t){var e=(180-360*t)*Math.PI/180;return 360*Math.atan(Math.exp(e))/Math.PI-90}function extend(t,e){for(var o in e)t[o]=e[o];return t}function getX(t){return t.x}function getY(t){return t.y}var kdbush=require("kdbush");module.exports=supercluster,SuperCluster.prototype={options:{minZoom:0,maxZoom:16,radius:40,extent:512,nodeSize:64,log:!1},load:function(t){var e=this.options.log;e&&console.time("total time");var o="prepare "+t.length+" points";e&&console.time(o),this.points=t;var n=t.map(createPointCluster);e&&console.timeEnd(o);for(var r=this.options.maxZoom;r>=this.options.minZoom;r--){var i=+Date.now();this.trees[r+1]=kdbush(n,getX,getY,this.options.nodeSize,Float32Array),n=this._cluster(n,r),e&&console.log("z%d: %d clusters in %dms",r,n.length,+Date.now()-i)}return this.trees[this.options.minZoom]=kdbush(n,getX,getY,this.options.nodeSize,Float32Array),e&&console.timeEnd("total time"),this},getClusters:function(t,e){for(var o=this.trees[this._limitZoom(e)],n=o.range(lngX(t[0]),latY(t[3]),lngX(t[2]),latY(t[1])),r=[],i=0;i=0;a--)this._down(a)}function defaultCompare(t,i){return ti?1:0}function swap(t,i,a){var n=t[i];t[i]=t[a],t[a]=n}module.exports=TinyQueue,TinyQueue.prototype={push:function(t){this.data.push(t),this.length++,this._up(this.length-1)},pop:function(){var t=this.data[0];return this.data[0]=this.data[this.length-1],this.length--,this.data.pop(),this._down(0),t},peek:function(){return this.data[0]},_up:function(t){for(var i=this.data,a=this.compare;t>0;){var n=Math.floor((t-1)/2);if(!(a(i[t],i[n])<0))break;swap(i,n,t),t=n}},_down:function(t){for(var i=this.data,a=this.compare,n=this.length;;){var e=2*t+1,h=e+1,s=t;if(e=3&&(t.depth=arguments[2]),arguments.length>=4&&(t.colors=arguments[3]),isBoolean(r)?t.showHidden=r:r&&exports._extend(t,r),isUndefined(t.showHidden)&&(t.showHidden=!1),isUndefined(t.depth)&&(t.depth=2),isUndefined(t.colors)&&(t.colors=!1),isUndefined(t.customInspect)&&(t.customInspect=!0),t.colors&&(t.stylize=stylizeWithColor),formatValue(t,e,t.depth)}function stylizeWithColor(e,r){var t=inspect.styles[r];return t?"["+inspect.colors[t][0]+"m"+e+"["+inspect.colors[t][1]+"m":e}function stylizeNoColor(e,r){return e}function arrayToHash(e){var r={};return e.forEach(function(e,t){r[e]=!0}),r}function formatValue(e,r,t){if(e.customInspect&&r&&isFunction(r.inspect)&&r.inspect!==exports.inspect&&(!r.constructor||r.constructor.prototype!==r)){var n=r.inspect(t,e);return isString(n)||(n=formatValue(e,n,t)),n}var i=formatPrimitive(e,r);if(i)return i;var o=Object.keys(r),s=arrayToHash(o);if(e.showHidden&&(o=Object.getOwnPropertyNames(r)),isError(r)&&(o.indexOf("message")>=0||o.indexOf("description")>=0))return formatError(r);if(0===o.length){if(isFunction(r)){var u=r.name?": "+r.name:"";return e.stylize("[Function"+u+"]","special")}if(isRegExp(r))return e.stylize(RegExp.prototype.toString.call(r),"regexp");if(isDate(r))return e.stylize(Date.prototype.toString.call(r),"date");if(isError(r))return formatError(r)}var c="",a=!1,l=["{","}"];if(isArray(r)&&(a=!0,l=["[","]"]),isFunction(r)){var p=r.name?": "+r.name:"";c=" [Function"+p+"]"}if(isRegExp(r)&&(c=" "+RegExp.prototype.toString.call(r)),isDate(r)&&(c=" "+Date.prototype.toUTCString.call(r)),isError(r)&&(c=" "+formatError(r)),0===o.length&&(!a||0==r.length))return l[0]+c+l[1];if(t<0)return isRegExp(r)?e.stylize(RegExp.prototype.toString.call(r),"regexp"):e.stylize("[Object]","special");e.seen.push(r);var f;return f=a?formatArray(e,r,t,s,o):o.map(function(n){return formatProperty(e,r,t,s,n,a)}),e.seen.pop(),reduceToSingleString(f,c,l)}function formatPrimitive(e,r){if(isUndefined(r))return e.stylize("undefined","undefined");if(isString(r)){var t="'"+JSON.stringify(r).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return e.stylize(t,"string")}return isNumber(r)?e.stylize(""+r,"number"):isBoolean(r)?e.stylize(""+r,"boolean"):isNull(r)?e.stylize("null","null"):void 0}function formatError(e){return"["+Error.prototype.toString.call(e)+"]"}function formatArray(e,r,t,n,i){for(var o=[],s=0,u=r.length;s-1&&(u=o?u.split("\n").map(function(e){return" "+e}).join("\n").substr(2):"\n"+u.split("\n").map(function(e){return" "+e}).join("\n"))):u=e.stylize("[Circular]","special")),isUndefined(s)){if(o&&i.match(/^\d+$/))return u;s=JSON.stringify(""+i),s.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(s=s.substr(1,s.length-2),s=e.stylize(s,"name")):(s=s.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),s=e.stylize(s,"string"))}return s+": "+u}function reduceToSingleString(e,r,t){var n=0,i=e.reduce(function(e,r){return n++,r.indexOf("\n")>=0&&n++,e+r.replace(/\u001b\[\d\d?m/g,"").length+1},0);return i>60?t[0]+(""===r?"":r+"\n ")+" "+e.join(",\n ")+" "+t[1]:t[0]+r+" "+e.join(", ")+" "+t[1]}function isArray(e){return Array.isArray(e)}function isBoolean(e){return"boolean"==typeof e}function isNull(e){return null===e}function isNullOrUndefined(e){return null==e}function isNumber(e){return"number"==typeof e}function isString(e){return"string"==typeof e}function isSymbol(e){return"symbol"==typeof e}function isUndefined(e){return void 0===e}function isRegExp(e){return isObject(e)&&"[object RegExp]"===objectToString(e)}function isObject(e){return"object"==typeof e&&null!==e}function isDate(e){return isObject(e)&&"[object Date]"===objectToString(e)}function isError(e){return isObject(e)&&("[object Error]"===objectToString(e)||e instanceof Error)}function isFunction(e){return"function"==typeof e}function isPrimitive(e){return null===e||"boolean"==typeof e||"number"==typeof e||"string"==typeof e||"symbol"==typeof e||"undefined"==typeof e}function objectToString(e){return Object.prototype.toString.call(e)}function pad(e){return e<10?"0"+e.toString(10):e.toString(10)}function timestamp(){var e=new Date,r=[pad(e.getHours()),pad(e.getMinutes()),pad(e.getSeconds())].join(":");return[e.getDate(),months[e.getMonth()],r].join(" ")}function hasOwnProperty(e,r){return Object.prototype.hasOwnProperty.call(e,r)}var formatRegExp=/%[sdj%]/g;exports.format=function(e){if(!isString(e)){for(var r=[],t=0;t=i)return e;switch(e){case"%s":return String(n[t++]);case"%d":return Number(n[t++]);case"%j":try{return JSON.stringify(n[t++])}catch(e){return"[Circular]"}default:return e}}),s=n[t];t>3}if(a--,1===i||2===i)o+=e.readSVarint(),n+=e.readSVarint(),1===i&&(t&&s.push(t),t=[]),t.push(new Point(o,n));else{if(7!==i)throw new Error("unknown command "+i);t&&t.push(t[0].clone())}}return t&&s.push(t),s},VectorTileFeature.prototype.bbox=function(){var e=this._pbf;e.pos=this._geometry;for(var t=e.readVarint()+e.pos,r=1,i=0,a=0,o=0,n=1/0,s=-(1/0),p=1/0,h=-(1/0);e.pos>3}if(i--,1===r||2===r)a+=e.readSVarint(),o+=e.readSVarint(),as&&(s=a),oh&&(h=o);else if(7!==r)throw new Error("unknown command "+r)}return[n,p,s,h]},VectorTileFeature.prototype.toGeoJSON=function(e,t,r){function i(e){for(var t=0;t>3;t=1===a?e.readString():2===a?e.readFloat():3===a?e.readDouble():4===a?e.readVarint64():5===a?e.readVarint():6===a?e.readSVarint():7===a?e.readBoolean():null}return t}var VectorTileFeature=require("./vectortilefeature.js");module.exports=VectorTileLayer,VectorTileLayer.prototype.feature=function(e){if(e<0||e>=this._features.length)throw new Error("feature index out of bounds");this._pbf.pos=this._features[e];var t=this._pbf.readVarint()+this._pbf.pos;return new VectorTileFeature(this._pbf,t,this.extent,this._keys,this._values)}; +},{"./vectortilefeature.js":208}],210:[function(require,module,exports){ +function fromVectorTileJs(e){var r=[];for(var o in e.layers)r.push(prepareLayer(e.layers[o]));var t=new Pbf;return vtpb.tile.write({layers:r},t),t.finish()}function fromGeojsonVt(e){var r={};for(var o in e)r[o]=new GeoJSONWrapper(e[o].features),r[o].name=o;return fromVectorTileJs({layers:r})}function prepareLayer(e){for(var r={name:e.name||"",version:e.version||1,extent:e.extent||4096,keys:[],values:[],features:[]},o={},t={},n=0;n>31}function encodeGeometry(e){for(var r=[],o=0,t=0,n=e.length,a=0;a` with a `span` element (#3268) + * Fix bug causing `Marker` instances to be translated to non-whole pixel coordinates that caused blurriness (#3270) + +#### Performance Improvements + + * Avoid unnecessary style validation (#3224) + * Share a single blob URL between all workers (#3239) + +## 0.24.0 (September 19 2016) + +#### New Features & Improvements + + * Allow querystrings in `mapbox://` URLs #3113 + * Allow "drag rotate" interaction to control pitch #3105 + * Improve performance by decreasing `Worker` script `Blob` size #3158 + * Improve vector tile performance #3067 + * Decrease size of distributed library by removing `package.json` #3174 + * Add support for new lines in `text-field` #3179 + * Make keyboard navigation smoother #3190 + * Make mouse wheel zooming smoother #3189 + * Add better error message when calling `Map#queryRenderedFeatures` on nonexistent layer #3196 + * Add support for imperial units on `Scale` control #3160 + * Add map's pitch to URL hash #3218 + +#### Bugfixes + + * Fix exception thrown when using box zoom handler #3078 + * Ensure style filters cannot be mutated by reference #3093 + * Fix exceptions thrown when opening marker-bound popup by click #3104 + * Fix bug causing fills with transparent colors and patterns to not render #3107 + * Fix order of latitudes in `Map#getBounds` #3081 + * Fix incorrect evaluation of zoom-and-property functions #2827 #3155 + * Fix incorrect evaluation of property functions #2828 #3155 + * Fix bug causing garbled text rendering when multiple maps are rendered on the page #3086 + * Fix rendering defects caused by `Map#setFilter` and map rotation on iOS 10 #3207 + * Fix bug causing image and video sources to disappear when zooming in #3010 + + +## 0.23.0 (August 25 2016) + +#### New Features & Improvements + +* Add support for `line-color` property functions #2938 +* Add `Scale` control #2940 #3042 +* Improve polygon label placement by rendering labels at the pole of inaccessability #3038 +* Add `Popup` `offset` option #1962 +* Add `Marker#bindPopup` method #3056 + +#### Performance Improvements + +* Improve performance of pages with multiple maps using a shared `WebWorker` pool #2952 + +#### Bugfixes + +* Make `LatLngBounds` obey its documented argument order (`southwest`, `northeast`), allowing bounds across the dateline #2414 :warning: **BREAKING CHANGE** :warning: +* Fix bug causing `fill-opacity` property functions to not render as expected #3061 + +## 0.22.1 (August 18 2016) + +#### New Features & Improvements + + * Reduce library size by using minified version of style specification #2998 + * Add a warning when rendering artifacts occur due to too many symbols or glyphs being rendered in a tile #2966 + +#### Bugfixes + + * Fix bug causing exception to be thrown by `Map#querySourceFeatures` #3022 + * Fix bug causing `Map#loaded` to return true while there are outstanding tile updates #2847 + +## 0.22.0 (August 11 2016) + +#### Breaking Changes + + * The `GeoJSONSource`, `VideoSource`, `ImageSource` constructors are now private. Please use `map.addSource({...})` to create sources and `map.getSource(...).setData(...)` to update GeoJSON sources. #2667 + * `Map#onError` has been removed. You may catch errors by listening for the `error` event. If no listeners are bound to `error`, error messages will be printed to the console. #2852 + +#### New Features & Improvements + + * Increase max glyph atlas size to accomodate alphabets with large numbers of characters #2930 + * Add support for filtering features on GeoJSON / vector tile `$id` #2888 + * Update geolocate icon #2973 + * Add a `close` event to `Popup`s #2953 + * Add a `offset` option to `Marker` #2885 + * Print `error` events without any listeners to the console #2852 + * Refactored `Source` interface to prepare for custom source types #2667 + +#### Bugfixes + + * Fix opacity property-functions for fill layers #2971 + * Fix `DataCloneError` in Firefox and IE11 #2559 + * Fix bug preventing camera animations from being triggered in `moveend` listeners #2944 + * Fix bug preventing `fill-outline-color` from being unset #2964 + * Fix webpack support #2887 + * Prevent buttons in controls from acting like form submit buttons #2935 + * Fix bug preventing map interactions near two controls in the same corner #2932 + * Fix crash resulting for large style batch queue #2926 + +## 0.21.0 (July 13 2016) + +#### Breaking Changes + + * GeoJSON polygon inner rings are now rewound for compliance with the [v2 vector tile](https://github.com/mapbox/vector-tile-spec/blob/master/2.1/README.md#4344-polygon-geometry-type). This may affect some uses of `line-offset`, reversing the direction of the offset. #2889 + +#### New Features & Improvements + + * Add `text-pitch-alignment` style property #2668 + * Allow query parameters on `mapbox://` URLs #2702 + * Add `icon-text-fit` and `icon-text-fit-padding` style properties #2720 + * Enable property functions for `icon-rotate` #2738 + * Enable property functions for `fill-opacity` #2733 + * Fire `Map#mouseout` events #2777 + * Allow query parameters on all sprite URLs #2772 + * Increase sprite atlas size to 1024px square, allowing more and larger sprites #2802 + * Add `Marker` class #2725 #2810 + * Add `{quadkey}` URL parameter #2805 + * Add `circle-pitch-scale` style property #2821 + +#### Bugfixes + + * Fix rendering of layers with large numbers of features #2794 + * Fix exceptions thrown during drag-rotate interactions #2840 + * Fix error when adding and removing a layer within the same update cycle #2845 + * Fix false "Geometry exceeds allowed extent" warnings #2568 + * Fix `Map#loaded` returning true while there are outstanding tile updates #2847 + * Fix style validation error thrown while removing a filter #2847 + * Fix event data object not being passed for double click events #2814 + * Fix multipolygons disappearing from map at certain zoom levels #2704 + * Fix exceptions caused by `queryRenderedFeatures` in Safari and Firefox #2822 + * Fix `mapboxgl#supported()` returning `true` in old versions of IE11 mapbox/mapbox-gl-supported#1 + +## 0.20.1 (June 21 2016) + +#### Bugfixes + +* Fixed exception thrown when changing `*-translate` properties via `setPaintProperty` (#2762) + +## 0.20.0 (June 10 2016) + +#### New Features & Improvements + + * Add limited WMS support #2612 + * Add `workerCount` constructor option #2666 + * Improve performance of `locationPoint` and `pointLocation` #2690 + * Remove "Not using VertexArrayObject extension" warning messages #2707 + * Add `version` property to mapboxgl #2660 + * Support property functions in `circle-opacity` and `circle-blur` #2693 + +#### Bugfixes + +* Fix exception thrown by "drag rotate" handler #2680 +* Return an empty array instead of an empty object from `queryRenderedFeatures` #2694 +* Fix bug causing map to not render in IE + +## 0.19.1 (June 2 2016) + +#### Bugfixes + +* Fix rendering of polygons with more than 35k vertices #2657 + +## 0.19.0 (May 31 2016) + +#### New Features & Improvements + +* Allow use of special characters in property field names #2547 +* Improve rendering speeds on fill layers #1606 +* Add data driven styling support for `fill-color` and `fill-outline-color` #2629 +* Add `has` and `!has` filter operators mapbox/feature-filter#15 +* Improve keyboard handlers with held-down keys #2530 +* Support 'tms' tile scheme #2565 +* Add `trackResize` option to `Map` #2591 + +#### Bugfixes + +* Scale circles when map is displayed at a pitch #2541 +* Fix background pattern rendering bug #2557 +* Fix bug that prevented removal of a `fill-pattern` from a fill layer #2534 +* Fix `line-pattern` and `fill-pattern`rendering #2596 +* Fix some platform specific rendering bugs #2553 +* Return empty object from `queryRenderedFeatures` before the map is loaded #2621 +* Fix "there is no texture bound to the unit 1" warnings #2509 +* Allow transitioned values to be unset #2561 + +## 0.18.0 (April 13 2016) + +#### New Features & Improvements + +* Implement zoom-and-property functions for `circle-color` and `circle-size` #2454 +* Dedupe attributions that are substrings of others #2453 +* Misc performance improvements #2483 #2488 + +#### Bugfixes + +* Fix errors when unsetting and resetting a style property #2464 +* Fix errors when updating paint properties while using classes #2496 +* Fix errors caused by race condition in unserializeBuckets #2497 +* Fix overzoomed tiles in wrapped worlds #2482 +* Fix errors caused by mutating a filter object after calling `Map#setFilter` #2495 + +## 0.17.0 (April 13 2016) + +#### Breaking Changes + +* Remove `map.batch` in favor of automatically batching style mutations (i.e. calls to `Map#setLayoutProperty`, `Map#setPaintProperty`, `Map#setFilter`, `Map#setClasses`, etc.) and applying them once per frame, significantly improving performance when updating the style frequently #2355 #2380 +* Remove `util.throttle` #2345 + +#### New Features & Improvements + +* Improve performance of all style mutation methods by only recalculating affected properties #2339 +* Improve fading of labels and icons #2376 +* Improve rendering performance by reducing work done on the main thread #2394 +* Validate filters passed to `Map#queryRenderedFeatures` and `Map#querySourceFeatures` #2349 +* Display a warning if a vector tile's geometry extent is larger than supported #2383 +* Implement property functions (i.e. data-driven styling) for `circle-color` and `circle-size` #1932 +* Add `Popup#setDOMContent` method #2436 + +#### Bugfixes + +* Fix a performance regression caused by using 1 `WebWorker` instead of `# cpus - 1` `WebWorker`s, slowing down tile loading times #2408 +* Fix a bug in which `Map#queryRenderedFeatures` would sometimes return features that had been removed #2353 +* Fix `clusterMaxZoom` option on `GeoJSONSource` not working as expected #2374 +* Fix anti-aliased rendering for pattern fills #2372 +* Fix exception caused by calling `Map#queryRenderedFeatures` or `Map#querySourceFeatures` with no arguments +* Fix exception caused by calling `Map#setLayoutProperty` for `text-field` or `icon-image` #2407 + +## 0.16.0 (March 24 2016) + +#### Breaking Changes + +* Replace `Map#featuresAt` and `Map#featuresIn` with `Map#queryRenderedFeatures` and `map.querySourceFeatures` (#2224) + * Replace `featuresAt` and `featuresIn` with `queryRenderedFeatures` + * Make `queryRenderedFeatures` synchronous, remove the callback and use the return value. + * Rename `layer` parameter to `layers` and make it an array of layer names. + * Remove the `radius` parameter. `radius` was used with `featuresAt` to account for style properties like `line-width` and `circle-radius`. `queryRenderedFeatures` accounts for these style properties. If you need to query a larger area, use a bounding box query instead of a point query. + * Remove the `includeGeometry` parameter because `queryRenderedFeatures` always includes geometries. +* `Map#debug` is renamed to `Map#showTileBoundaries` (#2284) +* `Map#collisionDebug` is renamed to `Map#showCollisionBoxes` (#2284) + +#### New Features & Improvements + +* Improve overall rendering performance. (#2221) +* Improve performance of `GeoJSONSource#setData`. (#2222) +* Add `Map#setMaxBounds` method (#2234) +* Add `isActive` and `isEnabled` methods to interaction handlers (#2238) +* Add `Map#setZoomBounds` method (#2243) +* Add touch events (#2195) +* Add `map.queryRenderedFeatures` to query the styled and rendered representations of features (#2224) +* Add `map.querySourceFeatures` to get features directly from vector tiles, independent of the style (#2224) +* Add `mapboxgl.Geolocate` control (#1939) +* Make background patterns render seamlessly across tile boundaries (#2305) + +#### Bugfixes + +* Fix calls to `setFilter`, `setLayoutProperty`, and `setLayerZoomRange` on ref children (#2228) +* Fix `undefined` bucket errors after `setFilter` calls (#2244) +* Fix bugs causing hidden symbols to be rendered (#2246, #2276) +* Fix raster flickering (#2236) +* Fix `queryRenderedFeatures` precision at high zoom levels (#2292) +* Fix holes in GeoJSON data caused by unexpected winding order (#2285) +* Fix bug causing deleted features to be returned by `queryRenderedFeatures` (#2306) +* Fix bug causing unexpected fill patterns to be rendered (#2307) +* Fix popup location with preceding sibling elements (#2311) +* Fix polygon anti-aliasing (#2319) +* Fix slivers between non-adjacent polygons (#2319) +* Fix keyboard shortcuts causing page to scroll (#2312) + +## 0.15.0 (March 1 2016) + +#### New Features & Improvements + +* Add `ImageSource#setCoordinates` and `VideoSource#setCoordinates` (#2184) + +#### Bugfixes + +* Fix flickering on raster layers (#2211) +* Fix browser hang when zooming quickly on raster layers (#2211) + +## 0.14.3 (Feb 25 2016) + +#### New Features & Improvements + +* Improve responsiveness of zooming out by using cached parent tiles (#2168) +* Improve contextual clues on style API validation (#2170) +* Improve performance of methods including `setData` (#2174) + +#### Bugfixes + +* Fix incorrectly sized line dashes (#2099) +* Fix bug in which `in` feature filter drops features (#2166) +* Fix bug preventing `Map#load` from firing when tile "Not Found" errors occured (#2176) +* Fix rendering artifacts on mobile GPUs (#2117) + +## 0.14.2 (Feb 19 2016) + +#### Bugfixes + +* Look for loaded parent tiles in cache +* Set tile cache size based on viewport size (#2137) +* Fix tile render order for layer-by-layer +* Remove source update throttling (#2139) +* Make panning while zooming more linear (#2070) +* Round points created during bucket creation (#2067) +* Correct bounds for a rotated or tilted map (#1842) +* Fix overscaled featuresAt (#2103) +* Allow using `tileSize: 512` as a switch to trade retina support for 512px raster tiles +* Fix the serialization of paint classes (#2107) +* Fixed bug where unsetting style properties could mutate the value of other style properties (#2105) +* Less slanted dashed lines near sharp corners (#967) +* Fire map#load if no initial style is set (#2042) + +## 0.14.1 (Feb 10 2016) + +#### Bugfixes + +* Fix incorrectly rotated symbols along lines near tile boundries (#2062) +* Fix broken rendering when a fill layer follows certain symbol layers (#2092) + +## 0.14.0 (Feb 8 2016) + +#### Breaking Changes + +* Switch `GeoJSONSource` clustering options from being measured in extent-units to pixels (#2026) + +#### New Features & Improvements + +* Improved error message for invalid colors (#2006) +* Added support for tiles with variable extents (#2010) +* Improved `filter` performance and maximum size (#2024) +* Changed circle rendering such that all geometry nodes are drawn, not just the geometry's outer ring (#2027) +* Added `Map#getStyle` method (#1982) + +#### Bugfixes + +* Fixed bug causing WebGL contexts to be "used up" by calling `mapboxgl.supported()` (#2018) +* Fixed non-deterministic symbol z-order sorting (#2023) +* Fixed garbled labels while zooming (#2012) +* Fixed icon jumping when touching trackpad with two fingers (#1990) +* Fixed overzoomed collision debug labels (#2033) +* Fixed dashes sliding along their line during zooming (#2039) +* Fixed overscaled `minzoom` setting for GeoJSON sources (#1651) +* Fixed overly-strict function validation for duplicate stops (#2075) +* Fixed crash due to `performance.now` not being present on some browsers (#2056) +* Fixed the unsetting of paint properties (#2037) +* Fixed bug causing multiple interaction handler event listeners to be attached (#2069) +* Fixed bug causing only a single debug box to be drawn (#2034) + +## 0.13.1 (Jan 27 2016) + +#### Bugfixes + +* Fixed broken npm package due to outdated bundled modules + +## 0.13.0 (Jan 27 2016) + +#### Bugfixes + +* Fixed easeTo pan, zoom, and rotate when initial rotation != 0 (#1950) +* Fixed rendering of tiles with an extent != 4096 (#1952) +* Fixed missing icon collision boxes (#1978) +* Fixed null `Tile#buffers` errors (#1987) + +#### New Features & Improvements + +* Added `symbol-avoid-edges` style property (#1951) +* Improved `symbol-max-angle` check algorithm (#1959) +* Added marker clustering! (#1931) +* Added zoomstart, zoom, and zoomend events (#1958) +* Disabled drag on mousedown when using boxzoom (#1907) + +## 0.12.4 (Jan 19 2016) + +#### Bugfixes + +* Fix elementGroups null value errors (#1933) +* Fix some glyph atlas overflow cases (#1923) + +## 0.12.3 (Jan 14 2016) + +#### API Improvements +* Support inline attribution options in map options (#1865) +* Improve flyTo options (#1854, #1429) + +#### Bugfixes +* Fix flickering with overscaled tiles (#1921) +* Remove Node.remove calls for IE browser compatibility (#1900) +* Match patterns at tile boundaries (#1908) +* Fix Tile#positionAt, fix query tests (#1899) +* Fix flickering on streets (#1875) +* Fix text-max-angle property (#1870) +* Fix overscaled line patterns (#1856) +* Fix patterns and icons for mismatched pixelRatios (#1851) +* Fix missing labels when text size 0 at max zoom (#1809) +* Use linear interp when pixel ratios don't match (#1601) +* Fix blank areas, flickering in raster layers (#1876, #675) +* Fix labels slipping/cropping at tile bounds (#757) + +#### UX Improvements +* Improve touch handler perceived performance (#1844) + +## 0.12.2 (Dec 22 2015) + +#### API Improvements + +* Support LngLat.convert([w, s, e, n]) (#1812) +* Invalid GeoJSON is now handled better + +#### Bugfixes + +* Fixed `Popup#addTo` when the popup is already open (#1811) +* Fixed warping when rotating / zooming really fast +* `Map#flyTo` now flies across the antimeridan if shorter (#1853) + +## 0.12.1 (Dec 8 2015) + +#### Breaking changes + +* Reversed the direction of `line-offset` (#1808) +* Renamed `Pinch` interaction handler to `TouchZoomRotate` (#1777) +* Made `Map#update` and `Map#render` private methods (#1798) +* Made `Map#remove` remove created DOM elements (#1789) + +#### API Improvements + +* Added an method to disable touch rotation (#1777) +* Added a `position` option for `Attribution` (#1689) + +#### Bugfixes + +* Ensure tile loading errors are properly reported (#1799) +* Ensure re-adding a previously removed pop-up works (#1477) + +#### UX Improvements + +* Don't round zoom level during double-click interaction (#1640) + +## 0.12.0 (Dec 2 2015) + +#### API Improvements + +* Added `line-offset` style property (#1778) + +## 0.11.5 (Dec 1 2015) + +#### Bugfixes + +* Fixed unstable symbol layer render order when adding / removing layers (#1558) +* Fire map loaded event even if raster tiles have errors +* Fix panning animation during easeTo with zoom change +* Fix pitching animation during flyTo +* Fix pitching animation during easeTo +* Prevent rotation from firing `mouseend` events (#1104) + +#### API Improvements + +* Fire `mousedown` and `mouseup` events (#1411) +* Fire `movestart` and `moveend` when panning (#1658) +* Added drag events (#1442) +* Request webp images for mapbox:// raster tiles in chrome (#1725) + +#### UX Improvements + +* Added inertia to map rotation (#620) + +## 0.11.4 (Nov 16 2015) + +#### Bugfixes + +* Fix alpha blending of alpha layers (#1684) + +## 0.11.3 (Nov 10 2015) + +#### Bugfixes + +* Fix GeoJSON rendering and performance (#1685) + +#### UX Improvements + +* Use SVG assets for UI controls (#1657) +* Zoom out with shift + dblclick (#1666) + +## 0.11.2 (Oct 29 2015) + +* Misc performance improvements + +#### Bugfixes + +* Fix sprites on systems with non-integer `devicePixelRatio`s (#1029 #1475 #1476) +* Fix layer minZoom being ignored if not less than source maxZoom +* Fix symbol placement at the start of a line (#1461) +* Fix `raster-opacity` on non-tile sources (#1270) +* Ignore boxzoom on shift-click (#1655) + +#### UX Improvements + +* Enable line breaks on common punctuation (#1115) + +#### API Improvements + +* Add toString and toArray methods to LngLat, LngLatBounds (#1571) +* Add `Transform#resize` method +* Add `Map#getLayer` method (#1183) +* Add `Transform#unmodified` property (#1452) +* Propagate WebGL context events (#1612) + +## 0.11.1 (Sep 30 2015) + +#### Bugfixes + +* Add statistics and checkboxes to debug page +* Fix `Map#featuresAt` for non-4096 vector sources (#1529) +* Don't fire `mousemove` on drag-pan +* Fix maxBounds constrains (#1539) +* Fix maxBounds infinite loop (#1538) +* Fix memory leak in worker +* Assert valid `TileCoord`, fix wrap calculation in `TileCoord#cover` (#1483) +* Abort raster tile load if not in viewport (#1490) + +#### API Improvements + +* Add `Map` event listeners for `mouseup`, `contextmenu` (right click) (#1532) + + +## 0.11.0 (Sep 11 2015) + +#### API Improvements + +* Add `Map#featuresIn`: a bounding-box feature query +* Emit stylesheet validation errors (#1436) + +#### UX Improvements + +* Handle v8 style `center`, `zoom`, `bearing`, `pitch` (#1452) +* Improve circle type styling (#1446) +* Improve dashed and patterned line antialiasing + +#### Bugfixes + +* Load images in a way that respects Cache-Control headers +* Filter for rtree matches to those crossing bbox +* Log errors by default (#1463) +* Fixed modification of `text-size` via `setLayoutProperty` (#1451) +* Throw on lat > 90 || < -90. (#1443) +* Fix circle clipping bug (#1457) + + +## 0.10.0 (Aug 21 2015) + +#### Breaking changes + +* Switched to [longitude, latitude] coordinate order, matching GeoJSON. We anticipate that mapbox-gl-js will be widely used + with GeoJSON, and in the long term having a coordinate order that is consistent with GeoJSON will lead to less confusion + and impedance mismatch than will a [latitude, longitude] order. + + The following APIs were renamed: + + * `LatLng` was renamed to `LngLat` + * `LatLngBounds` was renamed to `LngLatBounds` + * `Popup#setLatLng` was renamed to `Popup#setLngLat` + * `Popup#getLatLng` was renamed to `Popup#getLngLat` + * The `latLng` property of Map events was renamed `lngLat` + + The following APIs now expect array coordinates in [longitude, latitude] order: + + * `LngLat.convert` + * `LngLatBounds.convert` + * `Popup#setLngLat` + * The `center` and `maxBounds` options of the `Map` constructor + * The arguments to `Map#setCenter`, `Map#fitBounds`, `Map#panTo`, and `Map#project` + * The `center` option of `Map#jumpTo`, `Map#easeTo`, and `Map#flyTo` + * The `around` option of `Map#zoomTo`, `Map#rotateTo`, and `Map#easeTo` + * The `coordinates` properties of video and image sources + +* Updated to mapbox-gl-style-spec v8.0.0 ([Changelog](https://github.com/mapbox/mapbox-gl-style-spec/blob/v8.0.0/CHANGELOG.md)). Styles are + now expected to be version 8. You can use the [gl-style-migrate](https://github.com/mapbox/mapbox-gl-style-lint#migrations) + utility to update existing styles. + +* The format for `mapbox://` style and glyphs URLs has changed. For style URLs, you should now use the format + `mapbox://styles/:username/:style`. The `:style` portion of the URL no longer contains a username. For font URLs, you + should now use the format `mapbox://fonts/:username/{fontstack}/{range}.pbf`. +* Mapbox default styles are now hosted via the Styles API rather than www.mapbox.com. You can make use of the Styles API + with a `mapbox://` style URL pointing to a v8 style, e.g. `mapbox://styles/mapbox/streets-v8`. +* The v8 satellite style (`mapbox://styles/mapbox/satellite-v8`) is now a plain satellite style, and not longer supports labels + or contour lines via classes. For a labeled satellite style, use `mapbox://styles/mapbox/satellite-hybrid`. + +* Removed `mbgl.config.HTTP_URL` and `mbgl.config.FORCE_HTTPS`; https is always used when connecting to the Mapbox API. +* Renamed `mbgl.config.HTTPS_URL` to `mbgl.config.API_URL`. + +#### Bugfixes + +* Don't draw halo when halo-width is 0 (#1381) +* Reverted shader changes that degraded performance on IE + +#### API Improvements + +* You can now unset layout and paint properties via the `setLayoutProperty` and `setPaintProperty` APIs + by passing `undefined` as a property value. +* The `layer` option of `featuresAt` now supports an array of layers. + +## 0.9.0 (Jul 29 2015) + +* `glyphs` URL now normalizes without the `/v4/` prefix for `mapbox://` urls. Legacy behavior for `mapbox://fontstacks` is still maintained (#1385) +* Expose `geojson-vt` options for GeoJSON sources (#1271) +* bearing snaps to "North" within a tolerance of 7 degrees (#1059) +* Now you can directly mutate the minzoom and maxzoom layer properties with `map.setLayerZoomRange(layerId, minzoom, maxzoom)` +* Exposed `mapboxgl.Control`, a base class used by all UI controls +* Refactored handlers to be individually included in Map options, or enable/disable them individually at runtime, e.g. `map.scrollZoom.disable()`. +* New feature: Batch operations can now be done at once, improving performance for calling multiple style functions: (#1352) + + ```js + style.batch(function(s) { + s.addLayer({ id: 'first', type: 'symbol', source: 'streets' }); + s.addLayer({ id: 'second', type: 'symbol', source: 'streets' }); + s.addLayer({ id: 'third', type: 'symbol', source: 'terrain' }); + s.setPaintProperty('first', 'text-color', 'black'); + s.setPaintProperty('first', 'text-halo-color', 'white'); + }); + ``` +* Improved documentation +* `featuresAt` performance improvements by exposing `includeGeometry` option +* Better label placement along lines (#1283) +* Improvements to round linejoins on semi-transparent lines (mapbox/mapbox-gl-native#1771) +* Round zoom levels for raster tile loading (2a2aec) +* Source#reload cannot be called if source is not loaded (#1198) +* Events bubble to the canvas container for custom overlays (#1301) +* Move handlers are now bound on mousedown and touchstart events +* map.featuresAt() now works across the dateline + +## 0.8.1 (Jun 16 2015) + +* No code changes; released only to correct a build issue in 0.8.0. + +## 0.8.0 (Jun 15 2015) + +#### Breaking changes + +* `map.setView(latlng, zoom, bearing)` has been removed. Use + [`map.jumpTo(options)`](https://www.mapbox.com/mapbox-gl-js/api/#map/jumpto) instead: + + ```js + map.setView([40, -74.50], 9) // 0.7.0 or earlier + map.jumpTo({center: [40, -74.50], zoom: 9}); // now + ``` +* [`map.easeTo`](https://www.mapbox.com/mapbox-gl-js/api/#map/easeto) and + [`map.flyTo`](https://www.mapbox.com/mapbox-gl-js/api/#map/flyto) now accept a single + options object rather than positional parameters: + + ```js + map.easeTo([40, -74.50], 9, null, {duration: 400}); // 0.7.0 or earlier + map.easeTo({center: [40, -74.50], zoom: 9, duration: 400}); // now + ``` +* `mapboxgl.Source` is no longer exported. Use `map.addSource()` instead. See the + [GeoJSON line](https://www.mapbox.com/mapbox-gl-js/example/geojson-line/) or + [GeoJSON markers](https://www.mapbox.com/mapbox-gl-js/example/geojson-markers/) + examples. +* `mapboxgl.util.supported()` moved to [`mapboxgl.supported()`](https://www.mapbox.com/mapbox-gl-js/api/#mapboxgl/supported). + +#### UX improvements + +* Add perspective rendering (#1049) +* Better and faster labelling (#1079) +* Add touch interactions support on mobile devices (#949) +* Viewport-relative popup arrows (#1065) +* Normalize mousewheel zooming speed (#1060) +* Add proper handling of GeoJSON features that cross the date line (#1275) +* Sort overlapping symbols in the y direction (#470) +* Control buttons are now on a 30 pixel grid (#1143) +* Improve GeoJSON processing performance + +#### API Improvements + +* Switch to JSDoc for documentation +* Bundling with browserify is now supported +* Validate incoming map styles (#1054) +* Add `Map` `setPitch` `getPitch` +* Add `Map` `dblclick` event. (#1168) +* Add `Map` `getSource` (660a8c1) +* Add `Map` `setFilter` and `getFilter` (#985) +* Add `Map` `failIfMajorPerformanceCaveat` option (#1082) +* Add `Map` `preserveDrawingBuffer` option (#1232) +* Add `VideoSource` `getVideo()` (#1162) +* Support vector tiles with extents other than 4096 (#1227) +* Use a DOM hierarchy that supports evented overlays (#1217) +* Pass `latLng` to the event object (#1068) + +#### UX Bugfixes + +* Fix rendering glitch on iOS 8 (#750) +* Fix line triangulation errors (#1120, #992) +* Support unicode range 65280-65535 (#1108) +* Fix cracks between fill patterns (#972) +* Fix angle of icons aligned with lines (37a498a) +* Fix dashed line bug for overscaled tiles (#1132) +* Fix icon artifacts caused by sprite neighbors (#1195) + +#### API Bugfixes + +* Don't fire spurious `moveend` events on mouseup (#1107) +* Fix a race condition in `featuresAt` (#1220) +* Fix for brittle fontstack name convention (#1070) +* Fix broken `Popup` `setHTML` (#1272) +* Fix an issue with cross-origin image requests (#1269) + + +## 0.7.0 (Mar 3 2015) + +#### Breaking + +* Rename `Map` `hover` event to `mousemove`. +* Change `featuresAt` to return GeoJSON objects, including geometry (#1010) +* Remove `Map` `canvas` and `container` properties, add `getCanvas` and `getContainer` methods instead + +#### UX Improvements + +* Improve line label density +* Add boxzoom interaction (#1038) +* Add keyboard interaction (#1034) +* Faster `GeoJSONSource` `setData` without flickering (#973) + +#### API Improvements + +* Add Popup component (#325) +* Add layer API (#1022) +* Add filter API (#985) +* More efficient filter API (#1018) +* Accept plain old JS object for `addSource` (#1021) +* Reparse overscaled tiles + +#### Bugfixes + +* Fix `featuresAt` for LineStrings (#1006) +* Fix `tileSize` argument to `GeoJSON` worker (#987) +* Remove extraneous files from the npm package (#1024) +* Hide "improve map" link in print (#988) + + +## 0.6.0 (Feb 9 2015) + +#### Bugfixes + +* Add wrapped padding to sprite for repeating images (#972) +* Clear color buffers before rendering (#966) +* Make line-opacity work with line-image (#970) +* event.toElement fallback for Firefox (#932) +* skip duplicate vertices at ends of lines (#776) +* allow characters outside \w to be used in token +* Clear old tiles when new GeoJSON is loaded (#905) + +#### Improvements + +* Added `map.setPaintProperty()`, `map.getPaintProperty()`, `map.setLayoutProperty()`, and `map.getLayoutProperty()`. +* Switch to ESLint and more strict code rules (#957) +* Grab 2x raster tiles if retina (#754) +* Support for mapbox:// style URLs (#875) + +#### Breaking + +* Updated to mapbox-gl-style-spec v7.0.0 ([Changelog](https://github.com/mapbox/mapbox-gl-style-spec/blob/a2b0b561ce16015a1ef400dc870326b1b5255091/CHANGELOG.md)). Styles are + now expected to be version 7. You can use the [gl-style-migrate](https://github.com/mapbox/mapbox-gl-style-lint#migrations) + utility to update existing styles. +* HTTP_URL and HTTPS_URL config options must no longer include a `/v4` path prefix. +* `addClass`, `removeClass`, `setClasses`, `hasClass`, and `getClasses` are now methods + on Map. +* `Style#cascade` is now private, pending a public style mutation API (#755). +* The format for `featuresAt` results changed. Instead of result-per-geometry-cross-layer, + each result has a `layers` array with all layers that contain the feature. This avoids + duplication of geometry and properties in the result set. + + +## 0.5.2 (Jan 07 2015) + +#### Bugfixes + +* Remove tiles for unused sources (#863) +* Fix fill pattern alignment + +#### Improvements + +* Add GeoJSONSource maxzoom option (#760) +* Return ref layers in featuresAt (#847) +* Return any extra layer keys provided in the stylesheet in featuresAt +* Faster protobuf parsing + +## 0.5.1 (Dec 19 2014) + +#### Bugfixes + +* Fix race conditions with style loading/rendering +* Fix race conditions with setStyle +* Fix map.remove() +* Fix featuresAt properties + +## 0.5.0 (Dec 17 2014) + +#### Bugfixes + +* Fix multiple calls to setStyle + +#### Improvements + +* `featuresAt` now returns additional information +* Complete style/source/tile event suite: + style.load, style.error, style.change, + source.add, source.remove, source.load, source.error, source.change, + tile.add, tile.remove, tile.load, tile.error +* Vastly improved performance and correctness for GeoJSON sources +* Map#setStyle accepts a style URL +* Support {prefix} in tile URL templates +* Provide a source map with minified source + +#### Breaking + +* Results format for `featuresAt` changed + +## 0.4.2 (Nov 14 2014) + +#### Bugfixes + +- Ensure only one easing is active at a time (#807) +- Don't require style to perform easings (#817) +- Fix raster tiles sometimes not showing up (#761) + +#### Improvements + +- Internet Explorer 11 support (experimental) + +## 0.4.1 (Nov 10 2014) + +#### Bugfixes + +- Interpolate to the closest bearing when doing rotation animations (#818) + +## 0.4.0 (Nov 4 2014) + +#### Breaking + +- Updated to mapbox-gl-style-spec v6.0.0 ([Changelog](https://github.com/mapbox/mapbox-gl-style-spec/blob/v6.0.0/CHANGELOG.md)). Styles are + now expected to be version 6. You can use the [gl-style-migrate](https://github.com/mapbox/mapbox-gl-style-lint#migrations) + utility to update existing styles. + +## 0.3.2 (Oct 23 2014) + +#### Bugfixes + +- Fix worker initialization with deferred or async scripts + +#### Improvements + +- Added map.remove() +- CDN assets are now served with gzip compression + +## 0.3.1 (Oct 06 2014) + +#### Bugfixes + +- Fixed iteration over arrays with for/in +- Made browserify deps non-dev (#752) + +## 0.3.0 (Sep 23 2014) + +#### Breaking + +- Updated to mapbox-gl-style-spec v0.0.5 ([Changelog](https://github.com/mapbox/mapbox-gl-style-spec/blob/v0.0.5/CHANGELOG.md)). Styles are + now expected to be version 5. You can use the [gl-style-migrate](https://github.com/mapbox/mapbox-gl-style-lint#migrations) + utility to update existing styles. +- Removed support for composite layers for performance reasons. [#523](https://github.com/mapbox/mapbox-gl-js/issues/523#issuecomment-51731405) +- `raster-hue-rotate` units are now degrees. + +### Improvements + +- Added LatLng#wrap +- Added support for Mapbox fontstack API. +- Added support for remote, non-Mapbox TileJSON sources and inline TileJSON sources (#535, #698). +- Added support for `symbol-avoid-edges` property to allow labels to be placed across tile edges. +- Fixed mkdir issue on Windows (#674). +- Fixed drawing beveled line joins without overlap. + +#### Bugfixes + +- Fixed performance when underzooming a layer's minzoom. +- Fixed `raster-opacity` for regular raster layers. +- Fixed various corner cases of easing functions. +- Do not modify original stylesheet (#728). +- Inherit video source from source (#699). +- Fixed interactivity for geojson layers. +- Stop dblclick on navigation so the map does not pan (#715). + +## 0.2.2 (Aug 12 2014) + +#### Breaking + +- `map.setBearing()` no longer supports a second argument. Use `map.rotateTo` with an `offset` option and duration 0 +if you need to rotate around a point other than the map center. + +#### Improvements + +- Improved `GeoJSONSource` to also accept URL as `data` option, eliminating a huge performance bottleneck in case of large GeoJSON files. +[#669](https://github.com/mapbox/mapbox-gl-js/issues/669) [#671](https://github.com/mapbox/mapbox-gl-js/issues/671) +- Switched to a different fill outlines rendering approach. [#668](https://github.com/mapbox/mapbox-gl-js/issues/668) +- Made the minified build 12% smaller gzipped (66 KB now). +- Added `around` option to `Map` `zoomTo`/`rotateTo`. +- Made the permalink hash more compact. +- Bevel linejoins no longer overlap and look much better when drawn with transparency. + +#### Bugfixes + +- Fixed the **broken minified build**. [#679](https://github.com/mapbox/mapbox-gl-js/issues/679) +- Fixed **blurry icons** rendering. [#666](https://github.com/mapbox/mapbox-gl-js/issues/666) +- Fixed `util.supports` WebGL detection producing false positives in some cases. [#677](https://github.com/mapbox/mapbox-gl-js/issues/677) +- Fixed invalid font configuration completely blocking tile rendering. [#662](https://github.com/mapbox/mapbox-gl-js/issues/662) +- Fixed `Map` `project`/`unproject` to properly accept array-form values. +- Fixed sprite loading race condition. [#593](https://github.com/mapbox/mapbox-gl-js/issues/593) +- Fixed `GeoJSONSource` `setData` not updating the map until zoomed or panned. [#676](https://github.com/mapbox/mapbox-gl-js/issues/676) + +## 0.2.1 (Aug 8 2014) + +#### Breaking + +- Changed `Navigation` control signature: now it doesn't need `map` in constructor +and gets added with `map.addControl(nav)` or `nav.addTo(map)`. +- Updated CSS classes to have consistent naming prefixed with `mapboxgl-`. + +#### Improvements + +- Added attribution control (present by default, disable by passing `attributionControl: false` in options). +- Added rotation by dragging the compass control. +- Added grabbing cursors for the map by default. +- Added `util.inherit` and `util.debounce` functions. +- Changed the default debug page style to OSM Bright. +- Token replacements now support dashes. +- Improved navigation control design. + +#### Bugfixes + +- Fixed compass control to rotate its icon with the map. +- Fixed navigation control cursors. +- Fixed inertia going to the wrong direction in a rotated map. +- Fixed inertia race condition where error was sometimes thrown after erratic panning/zooming. + + +## 0.2.0 (Aug 6 2014) + +- First public release. diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/CONTRIBUTING.md b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/CONTRIBUTING.md new file mode 100644 index 000000000..8c6f5e60a --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/CONTRIBUTING.md @@ -0,0 +1,162 @@ +Hi, and thanks in advance for contributing to Mapbox GL. Here's how we work. Please follow these conventions when submitting an issue or pull request. + +## Preparing your Development Environment + +### OSX + +Install the Xcode Command Line Tools Package +```bash +xcode-select --install +``` + +Install [node.js](https://nodejs.org/) version 4 or greater +```bash +brew install node +``` +Install [yarn](https://yarnpkg.com/en/) +```bash +brew install yarn +``` + +Clone the repository +```bash +git clone git@github.com:mapbox/mapbox-gl-js.git +``` + +Install node module dependencies +```bash +cd mapbox-gl-js && +yarn install +``` + +### Linux + +Install [git](https://git-scm.com/), [node.js](https://nodejs.org/) (version 4 or greater), [yarn](https://yarnpkg.com/en/docs/install#linux-tab), [GNU Make](http://www.gnu.org/software/make/), and libglew-dev +```bash +sudo apt-get update && +sudo apt-get install build-essential git nodejs yarn libglew-dev libxi-dev +``` + +Clone the repository +```bash +git clone git@github.com:mapbox/mapbox-gl-js.git +``` + +Install node module dependencies +```bash +cd mapbox-gl-js && +yarn install +``` + +### Windows + +Install [git](https://git-scm.com/), [node.js](https://nodejs.org/) (version 4 or greater), [yarn](https://yarnpkg.com/en/docs/install#windows-tab), [npm and node-gyp](https://github.com/Microsoft/nodejs-guidelines/blob/master/windows-environment.md#compiling-native-addon-modules). + +Clone the repository +```bash +git clone git@github.com:mapbox/mapbox-gl-js.git +``` + + +Install node module dependencies +```bash +cd mapbox-gl-js +yarn install +``` + +Install headless-gl dependencies https://github.com/stackgl/headless-gl#windows +``` +copy node_modules/headless-gl/deps/windows/dll/x64/*.dll c:\windows\system32 +``` + +## Serving the Debug Page + +Start the debug server + +```bash +MAPBOX_ACCESS_TOKEN={YOUR MAPBOX ACCESS TOKEN} yarn run start-debug +``` + +Open the debug page at [http://localhost:9966/debug](http://localhost:9966/debug) + +## Creating a Standalone Build + +A standalone build allows you to turn the contents of this repository into `mapbox-gl.js` and `mapbox-gl.css` files that can be included on an html page. + +To create a standalone build, run +```bash +yarn run build-min +``` + +Once that command finishes, you will have a standalone build at `dist/mapbox-gl.js` and `dist/mapbox-gl.css` + +## Writing & Running Tests + +See [`test/README.md`](https://github.com/mapbox/mapbox-gl-js/blob/master/test/README.md). + +## Writing & Running Benchmarks + +See [`bench/README.md`](https://github.com/mapbox/mapbox-gl-js/blob/master/bench/README.md). + +## Code Conventions + +* We use [`error` events](https://www.mapbox.com/mapbox-gl-js/api/#Map.event:error) to report user errors. +* We use [`assert`](https://nodejs.org/api/assert.html) to check invariants that are not likely to be caused by user error. These `assert` statements are stripped out of production builds. +* We use the following ES6 features: + * `let`/`const` + * `for...of` loops (for arraylike iteration only, i.e. what is supported by [Bublé's `dangerousForOf` transform](https://buble.surge.sh/guide/#dangerous-transforms)) + * Arrow functions + * Classes + * Template strings + * Computed and shorthand object properties +* The following ES6 features are not to be used, in order to maintain support for Node 4.x, IE 11, and older mobile browsers. This may change in the future. + * Default parameters + * Rest parameters + * Spread (`...`) operator + * Destructuring + * Iterators and generators + * "Library" features such as `Map`, `Set`, `array.find`, etc. + * Modules + +### Version Control Conventions + +* We use [rebase merging](https://git-scm.com/book/en/v2/Git-Branching-Rebasing) (as opposed to [basic merging](https://git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging#Basic-Merging)) to merge branches + +## Documentation Conventions + +See [`docs/README.md`](https://github.com/mapbox/mapbox-gl-js/blob/master/docs/README.md). + +### Github Issue Labels + +Our labeling system is + + - **minimalistic:** Labels' usefulness are inversely proportional to how many we have. + - **objective:** Labels should be objective enough that any two people would agree on a labeling decision. + - **useful:** Labels should track state or capture semantic meaning that would otherwise be hard to search. + +We have divided our labels into categories to make them easier to use. + + - type (blue) + - actionable status (red) + - non-actionable status (grey) + - importance / urgency (green) + - topic / project / misc (yellow) + +## Recommended Reading + +### Learning WebGL + +- [Greggman's WebGL articles](http://webglfundamentals.org/) +- [WebGL reference card](http://www.khronos.org/files/webgl/webgl-reference-card-1_0.pdf) + +### GL Performance + +- [Debugging and Optimizing WebGL applications](https://docs.google.com/presentation/d/12AGAUmElB0oOBgbEEBfhABkIMCL3CUX7kdAPLuwZ964) +- [Graphics Pipeline Performance](http://http.developer.nvidia.com/GPUGems/gpugems_ch28.html) + +### Misc + +- [drawing antialiased lines](https://www.mapbox.com/blog/drawing-antialiased-lines/) +- [drawing text with signed distance fields](https://www.mapbox.com/blog/text-signed-distance-fields/) +- [label placement](https://www.mapbox.com/blog/placing-labels/) +- [distance fields](http://bytewrangler.blogspot.com/2011/10/signed-distance-fields.html) diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/ISSUE_TEMPLATE.md b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/ISSUE_TEMPLATE.md new file mode 100644 index 000000000..aaf149f3d --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/ISSUE_TEMPLATE.md @@ -0,0 +1,27 @@ + + +**mapbox-gl-js version**: + +### Steps to Trigger Behavior + + 1. + 2. + 3. + +### Expected Behavior + +### Actual Behavior diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/LICENSE.txt b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/LICENSE.txt new file mode 100644 index 000000000..993b8e1db --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/LICENSE.txt @@ -0,0 +1,113 @@ +Copyright (c) 2016, Mapbox + +All rights reserved. + +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 Mapbox GL JS 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. + +------------------------------------------------------------------------------- + +Contains glmatrix.js + +Copyright (c) 2013, Brandon Jones, Colin MacKenzie IV. All rights reserved. + +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. + +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 HOLDER 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. + +------------------------------------------------------------------------------- + +Contains Hershey Simplex Font: http://paulbourke.net/dataformats/hershey/ + +------------------------------------------------------------------------------- + +Contains code from glfx.js + +Copyright (C) 2011 by Evan Wallace + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +-------------------------------------------------------------------------------- + +Contains a portion of d3-color https://github.com/d3/d3-color + +Copyright 2010-2016 Mike Bostock +All rights reserved. + +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 the author nor the names of 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. diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/PULL_REQUEST_TEMPLATE.md b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 000000000..56ef2acaf --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,9 @@ +## Launch Checklist + + + + - [ ] briefly describe the changes in this PR + - [ ] write tests for all new functionality + - [ ] document any changes to public APIs + - [ ] post benchmark scores + - [ ] manually test the debug page diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/README.md b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/README.md new file mode 100644 index 000000000..6138b524d --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/README.md @@ -0,0 +1,16 @@ +# Mapbox GL JS + +Mapbox GL JS is a JavaScript library that renders interactive maps from vector tiles and Mapbox styles using WebGL. Mapbox GL JS is part of the [cross-platform Mapbox GL ecosystem](https://www.mapbox.com/maps/), which also includes compatible native SDKs for applications on [Android](https://www.mapbox.com/android-sdk/), [iOS](https://www.mapbox.com/ios-sdk/), [macOS](http://mapbox.github.io/mapbox-gl-native/macos), and [Qt](https://github.com/mapbox/mapbox-gl-native/tree/master/platform/qt). + +In addition to GL JS, this repository contains code, issues, and test fixtures that are common to both GL JS and the native SDKs. For code and issues specific to the native SDKs, see the [mapbox/mapbox-gl-native](https://github.com/mapbox/mapbox-gl-native/) repository. + +- [Getting started](https://www.mapbox.com/mapbox-gl-js/api/) +- [API documentation](https://www.mapbox.com/mapbox-gl-js/api) +- [Examples](https://www.mapbox.com/mapbox-gl-js/examples/) +- [Style documentation](https://www.mapbox.com/mapbox-gl-style-spec) +- [Open source styles](https://github.com/mapbox/mapbox-gl-styles) +- [Roadmap](https://www.mapbox.com/mapbox-gl-js/roadmap/) +- [Contributor documentation](https://github.com/mapbox/mapbox-gl-js/blob/master/CONTRIBUTING.md) + +[Mapbox GL gallery](https://www.mapbox.com/gallery/) + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/RFC_TEMPLATE.md b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/RFC_TEMPLATE.md new file mode 100644 index 000000000..72c9a2a36 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/RFC_TEMPLATE.md @@ -0,0 +1,47 @@ +## Motivation + + + +## Design Alternatives + + + +## Design + + + +### Mock-Up + + + +### Concepts + + + +### Implementation + + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/_config.mb-pages.yml b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/_config.mb-pages.yml new file mode 100755 index 000000000..7ae688f40 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/_config.mb-pages.yml @@ -0,0 +1,9 @@ +url: https://www.mapbox.com +api: https://www.mapbox.com/core +tileApi: https://api.mapbox.com +source: docs +permalink: /:categories/:title/ +baseurl: https://www.mapbox.com/mapbox-gl-js +excerpt_separator: "" +exclude: [dist] +future: true diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/_config.yml b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/_config.yml new file mode 100755 index 000000000..d8c0fb1c3 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/_config.yml @@ -0,0 +1,9 @@ +url: https://122e4e-mapbox.global.ssl.fastly.net +api: https://122e4e-mapbox.global.ssl.fastly.net/core +tileApi: https://api-maps-staging.tilestream.net +source: docs +permalink: /:categories/:title/ +baseurl: /mapbox-gl-js +excerpt_separator: "" +mapboxglbase: /mapbox-gl-js/dist +future: true diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/.eslintrc b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/.eslintrc new file mode 100644 index 000000000..c7a49ff97 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/.eslintrc @@ -0,0 +1,14 @@ +{ + "parserOptions": { + "ecmaFeatures": { + "jsx": true + } + }, + "globals": { + "React": false, + "ReactDOM": false + }, + "env": { + "browser": true + } +} diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/README.md b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/README.md new file mode 100644 index 000000000..c666bd013 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/README.md @@ -0,0 +1,93 @@ +# Benchmarks + +Benchmarks help us catch performance regressions and improve performance. + +## Running Benchmarks + +Start the benchmark server + +```bash +MAPBOX_ACCESS_TOKEN={YOUR MAPBOX ACCESS TOKEN} npm run start-bench +``` + +To run all benchmarks, open [the benchmark page, `http://localhost:9966/bench`](http://localhost:9966/bench). + +To run a specific benchmark, add its name to the url hash, for example [`http://localhost:9966/bench/#buffer`](http://localhost:9966/bench/#buffer). + +## Writing a Benchmark + +Good benchmarks + + - are precise (i.e. running it multiple times returns roughly the same result) + - operate in a way that mimics real-world usage + - use a large quantity of diverse real-world data + - are conceptually simple + +Benchmarks are implemented as a function that returns an instance of `Evented`. + +```js +createBenchmark(options: { + accessToken: string; + createMap: (options: { + width: number; + height: number; + ... // supports all options for the Map constructor + }):Map +}): Evented +``` + +The instance of `Evented` may fire any number of `log` and `error` events. The +instance of `Evented` must fire exactly one `end` event. + +### `log` + +Fire the `log` event to report benchmark progress to the user. + +```js +{ + message: string; + color: string = 'blue'; // name of a Mapbox base color https://mapbox.com/base/styling/color +} +``` + +If your benchmark has a notion of running multiple "samples", you might emit +one `log` event per sample. + +```js +benchmark.fire('log', { + message: 'Finished sample ' + i + ' in ' + formatNumber(time) + ' ms' +}); +``` + +These events have no machine-semantic meaning. + +### `end` + +Fire the `end` event to indicate the benchmark has finished running and report +its results. + +These events have both human-readable results (`message`) and machine-readable results (`score`). Smaller `score`s are "better." + +```js +{ + message: string; + score: number; +} +``` + +```js +benchmark.fire('end', { + message: 'Average time is ' + formatNumber(averageTime)) + 'ms', + score: averageTime +}); +``` + +### `error` + +Fire the `error` event to indicate the benchmark has encountered an error. + +```js +{ + error: Error; +} +``` diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/benchmarks.js b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/benchmarks.js new file mode 100644 index 000000000..78babd357 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/benchmarks.js @@ -0,0 +1,23 @@ +'use strict'; + +window.mapboxglBenchmarks = window.mapboxglBenchmarks || {}; + +const version = process.env.BENCHMARK_VERSION; +function registerBenchmark(name, benchmark) { + window.mapboxglBenchmarks[name] = window.mapboxglBenchmarks[name] || {}; + window.mapboxglBenchmarks[name][version] = benchmark; +} + +registerBenchmark('map-load', require('./benchmarks/map_load')); +registerBenchmark('style-load', require('./benchmarks/style_load')); +registerBenchmark('buffer', require('./benchmarks/buffer')); +registerBenchmark('fps', require('./benchmarks/fps')); +registerBenchmark('frame-duration', require('./benchmarks/frame_duration')); +registerBenchmark('query-point', require('./benchmarks/query_point')); +registerBenchmark('query-box', require('./benchmarks/query_box')); +registerBenchmark('geojson-setdata-small', require('./benchmarks/geojson_setdata_small')); +registerBenchmark('geojson-setdata-large', require('./benchmarks/geojson_setdata_large')); + +// Ensure the global worker pool is never drained. Browsers have resource limits +// on the max number of workers that can be created per page. +require('../src/util/global_worker_pool')().acquire(-1); diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/benchmarks/buffer.js b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/benchmarks/buffer.js new file mode 100644 index 000000000..5e2097a5b --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/benchmarks/buffer.js @@ -0,0 +1,183 @@ +'use strict'; + +const VT = require('vector-tile'); +const Protobuf = require('pbf'); +const assert = require('assert'); + +const WorkerTile = require('../../src/source/worker_tile'); +const ajax = require('../../src/util/ajax'); +const Style = require('../../src/style/style'); +const StyleLayerIndex = require('../../src/style/style_layer_index'); +const util = require('../../src/util/util'); +const Evented = require('../../src/util/evented'); +const config = require('../../src/util/config'); +const coordinates = require('../lib/coordinates'); +const formatNumber = require('../lib/format_number'); +const accessToken = require('../lib/access_token'); +const deref = require('../../src/style-spec/deref'); + +const SAMPLE_COUNT = 10; + +module.exports = function run() { + config.ACCESS_TOKEN = accessToken; + + const evented = new Evented(); + + const stylesheetURL = `https://api.mapbox.com/styles/v1/mapbox/streets-v9?access_token=${accessToken}`; + ajax.getJSON(stylesheetURL, (err, stylesheet) => { + if (err) return evented.fire('error', {error: err}); + + evented.fire('log', { + message: 'preloading assets', + color: 'dark' + }); + + preloadAssets(stylesheet, (err, assets) => { + if (err) return evented.fire('error', {error: err}); + + evented.fire('log', { + message: 'starting first test', + color: 'dark' + }); + + function getGlyphs(params, callback) { + callback(null, assets.glyphs[JSON.stringify(params)]); + } + + function getIcons(params, callback) { + callback(null, assets.icons[JSON.stringify(params)]); + } + + function getTile(url, callback) { + callback(null, assets.tiles[url]); + } + + let timeSum = 0; + let timeCount = 0; + + asyncTimesSeries(SAMPLE_COUNT, (callback) => { + runSample(stylesheet, getGlyphs, getIcons, getTile, (err, time) => { + if (err) return evented.fire('error', { error: err }); + timeSum += time; + timeCount++; + evented.fire('log', { message: `${formatNumber(time)} ms` }); + callback(); + }); + }, (err) => { + if (err) { + evented.fire('error', { error: err }); + + } else { + const timeAverage = timeSum / timeCount; + evented.fire('end', { + message: `${formatNumber(timeAverage)} ms`, + score: timeAverage + }); + } + }); + }); + + }); + + return evented; +}; + +function preloadAssets(stylesheet, callback) { + const assets = { + glyphs: {}, + icons: {}, + tiles: {} + }; + + const style = new Style(stylesheet); + + style.on('style.load', () => { + function getGlyphs(params, callback) { + style.getGlyphs(0, params, (err, glyphs) => { + assets.glyphs[JSON.stringify(params)] = glyphs; + callback(err, glyphs); + }); + } + + function getIcons(params, callback) { + style.getIcons(0, params, (err, icons) => { + assets.icons[JSON.stringify(params)] = icons; + callback(err, icons); + }); + } + + function getTile(url, callback) { + ajax.getArrayBuffer(url, (err, response) => { + assets.tiles[url] = response.data; + callback(err, response.data); + }); + } + + runSample(stylesheet, getGlyphs, getIcons, getTile, (err) => { + style._remove(); + callback(err, assets); + }); + }); + + style.on('error', (event) => { + callback(event.error); + }); + +} + +function runSample(stylesheet, getGlyphs, getIcons, getTile, callback) { + const layerIndex = new StyleLayerIndex(deref(stylesheet.layers)); + + const timeStart = performance.now(); + + util.asyncAll(coordinates, (coordinate, eachCallback) => { + const url = `https://a.tiles.mapbox.com/v4/mapbox.mapbox-terrain-v2,mapbox.mapbox-streets-v6/${coordinate.zoom}/${coordinate.row}/${coordinate.column}.vector.pbf?access_token=${config.ACCESS_TOKEN}`; + + const workerTile = new WorkerTile({ + coord: coordinate, + zoom: coordinate.zoom, + tileSize: 512, + overscaling: 1, + angle: 0, + pitch: 0, + showCollisionBoxes: false, + source: 'composite', + uid: url + }); + + const actor = { + send: function(action, params, sendCallback) { + setTimeout(() => { + if (action === 'getIcons') { + getIcons(params, sendCallback); + } else if (action === 'getGlyphs') { + getGlyphs(params, sendCallback); + } else assert(false); + }, 0); + } + }; + + getTile(url, (err, response) => { + if (err) throw err; + const data = new VT.VectorTile(new Protobuf(response)); + workerTile.parse(data, layerIndex, actor, (err) => { + if (err) return callback(err); + eachCallback(); + }); + }); + }, (err) => { + const timeEnd = performance.now(); + callback(err, timeEnd - timeStart); + }); +} + +function asyncTimesSeries(times, work, callback) { + if (times > 0) { + work((err) => { + if (err) callback(err); + else asyncTimesSeries(times - 1, work, callback); + }); + } else { + callback(); + } +} diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/benchmarks/fps.js b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/benchmarks/fps.js new file mode 100644 index 000000000..08f16755f --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/benchmarks/fps.js @@ -0,0 +1,43 @@ +'use strict'; + +const Evented = require('../../src/util/evented'); +const formatNumber = require('../lib/format_number'); +const measureFramerate = require('../lib/measure_framerate'); +const createMap = require('../lib/create_map'); + +const DURATION_MILLISECONDS = 5 * 1000; + +module.exports = function() { + const evented = new Evented(); + + const map = createMap({ + width: 1024, + height: 768, + zoom: 5, + center: [-77.032194, 38.912753], + style: 'mapbox://styles/mapbox/bright-v9' + }); + + map.on('load', () => { + map.repaint = true; + + evented.fire('log', { + message: `starting ${formatNumber(DURATION_MILLISECONDS / 1000)} second test`, + color: 'dark' + }); + + measureFramerate(DURATION_MILLISECONDS, (err, fps) => { + map.remove(); + if (err) { + evented.fire('error', { error: err }); + } else { + evented.fire('end', { + message: `${formatNumber(fps)} fps`, + score: 1 / fps + }); + } + }); + }); + + return evented; +}; diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/benchmarks/frame_duration.js b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/benchmarks/frame_duration.js new file mode 100644 index 000000000..e16a4bfa4 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/benchmarks/frame_duration.js @@ -0,0 +1,118 @@ +'use strict'; + +const Evented = require('../../src/util/evented'); +const formatNumber = require('../lib/format_number'); +const createMap = require('../lib/create_map'); + +const DURATION_MILLISECONDS = 1 * 5000; + +const zooms = [4, 8, 11, 13, 15, 17]; +const results = []; + +module.exports = function(options) { + // The goal of this benchmark is to measure the time it takes to run the cpu + // part of rendering. While the gpu rendering happens asynchronously, sometimes + // when the gpu falls behind the cpu commands synchronously wait for the gpu to catch up. + // This ends up affecting the duration of the call on the cpu. + // + // Setting the devicePixelRatio to a small number makes the canvas very small. + // This greatly reduces the amount of work the gpu needs to do and reduces the + // impact the actual rendering has on this benchmark. + window.devicePixelRatio = 1 / 16; + + const evented = new Evented(); + + asyncSeries(zooms.length, runZoom, done); + + function runZoom(times, callback) { + const index = zooms.length - times; + + measureFrameTime(options, zooms[index], (err_, result) => { + results[index] = result; + evented.fire('log', { + message: `${formatNumber(result.sum / result.count * 10) / 10} ms, ${ + formatNumber(result.countAbove16 / result.count * 100)}% > 16 ms at zoom ${zooms[index]}` + }); + callback(); + }); + } + + function done() { + let sum = 0; + let count = 0; + let countAbove16 = 0; + for (let i = 0; i < results.length; i++) { + const result = results[i]; + sum += result.sum; + count += result.count; + countAbove16 += result.countAbove16; + } + evented.fire('end', { + message: `${formatNumber(sum / count * 10) / 10} ms, ${formatNumber(countAbove16 / count * 100)}% > 16ms`, + score: sum / count + }); + } + + return evented; +}; + +function measureFrameTime(options, zoom, callback) { + + const map = createMap({ + width: 1024, + height: 768, + zoom: zoom, + center: [-77.032194, 38.912753], + style: 'mapbox://styles/mapbox/streets-v9' + }); + + map.on('load', () => { + + map.repaint = true; + + // adding a delay seems to make the results more consistent + window.setTimeout(() => { + let sum = 0; + let count = 0; + let countAbove16 = 0; + const start = performance.now(); + + map._realrender = map._render; + map._render = function() { + map._styleDirty = true; + map._sourcesDirty = true; + + const frameStart = performance.now(); + map._realrender(); + const frameEnd = performance.now(); + const duration = frameEnd - frameStart; + + sum += duration; + count++; + if (duration >= 16) countAbove16++; + + if (frameEnd - start > DURATION_MILLISECONDS) { + map.repaint = false; + map.remove(); + map.getContainer().remove(); + callback(undefined, { + sum: sum, + count: count, + countAbove16: countAbove16 + }); + } + }; + }, 100); + }); +} + +function asyncSeries(times, work, callback) { + if (times > 0) { + work(times, (err) => { + if (err) callback(err); + else asyncSeries(times - 1, work, callback); + }); + } else { + callback(); + } +} diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/benchmarks/geojson_setdata_large.js b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/benchmarks/geojson_setdata_large.js new file mode 100644 index 000000000..364dfe2c1 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/benchmarks/geojson_setdata_large.js @@ -0,0 +1,42 @@ +'use strict'; + +const Evented = require('../../src/util/evented'); +const formatNumber = require('../lib/format_number'); +const setDataPerf = require('../lib/set_data_perf'); +const setupGeoJSONMap = require('../lib/setup_geojson_map'); +const createMap = require('../lib/create_map'); +const ajax = require('../../src/util/ajax'); + +module.exports = function() { + const evented = new Evented(); + + setTimeout(() => { + evented.fire('log', {message: 'downloading large geojson'}); + }, 0); + + ajax.getJSON('http://d2ad6b4ur7yvpq.cloudfront.net/naturalearth-3.3.0/ne_50m_land.geojson', (err, data) => { + evented.fire('log', {message: 'starting test'}); + + if (err) return evented.fire('error', {error: err}); + + let map = createMap({ + width: 1024, + height: 768, + zoom: 5, + center: [-77.032194, 38.912753], + style: 'mapbox://styles/mapbox/bright-v9' + }); + + map.on('load', () => { + map = setupGeoJSONMap(map); + + setDataPerf(map.style.sourceCaches.geojson, data, (err, ms) => { + if (err) return evented.fire('error', {error: err}); + map.remove(); + evented.fire('end', {message: `${formatNumber(ms)} ms`, score: ms}); + }); + }); + }); + + return evented; +}; diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/benchmarks/geojson_setdata_small.js b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/benchmarks/geojson_setdata_small.js new file mode 100644 index 000000000..1e65065b5 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/benchmarks/geojson_setdata_small.js @@ -0,0 +1,43 @@ +'use strict'; + +const Evented = require('../../src/util/evented'); +const formatNumber = require('../lib/format_number'); +const setDataPerf = require('../lib/set_data_perf'); +const setupGeoJSONMap = require('../lib/setup_geojson_map'); +const createMap = require('../lib/create_map'); + +const featureCollection = { + 'type': 'FeatureCollection', + 'features': [{ + 'type': 'Feature', + 'properties': {}, + 'geometry': { + 'type': 'Point', + 'coordinates': [ -77.032194, 38.912753 ] + } + }] +}; + +module.exports = function() { + const evented = new Evented(); + + let map = createMap({ + width: 1024, + height: 768, + zoom: 5, + center: [-77.032194, 38.912753], + style: 'mapbox://styles/mapbox/bright-v9' + }); + + map.on('load', () => { + map = setupGeoJSONMap(map); + + setDataPerf(map.style.sourceCaches.geojson, featureCollection, (err, ms) => { + map.remove(); + if (err) return evented.fire('error', {error: err}); + evented.fire('end', {message: `${formatNumber(ms)} ms`, score: ms}); + }); + }); + + return evented; +}; diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/benchmarks/map_load.js b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/benchmarks/map_load.js new file mode 100644 index 000000000..82870cdf0 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/benchmarks/map_load.js @@ -0,0 +1,49 @@ +'use strict'; + +const Evented = require('../../src/util/evented'); +const formatNumber = require('../lib/format_number'); +const createMap = require('../lib/create_map'); + +module.exports = function() { + const evented = new Evented(); + + const mapsOnPage = 6; + + evented.fire('log', { message: `Creating ${mapsOnPage} maps` }); + + let loaded = 0; + const maps = []; + const start = Date.now(); + for (let i = 0; i < mapsOnPage; i++) { + const map = maps[i] = createMap({ + style: { + version: 8, + sources: {}, + layers: [] + } + }); + map.on('load', onload.bind(null, map)); + map.on('error', (err) => { + evented.fire('error', err); + }); + } + + function onload () { + if (++loaded >= mapsOnPage) { + const duration = Date.now() - start; + for (let i = 0; i < maps.length; i++) { + maps[i].remove(); + } + evented.fire('end', { + message: `${formatNumber(duration)} ms`, + score: duration + }); + done(); + } + } + + function done () { + } + + return evented; +}; diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/benchmarks/query_box.js b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/benchmarks/query_box.js new file mode 100644 index 000000000..83f651d90 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/benchmarks/query_box.js @@ -0,0 +1,83 @@ +'use strict'; + +const Evented = require('../../src/util/evented'); +const createMap = require('../lib/create_map'); + +const width = 1024; +const height = 768; + +const numSamples = 10; + +const zoomLevels = []; +for (let i = 4; i < 19; i++) { + zoomLevels.push(i); +} + +module.exports = function() { + const evented = new Evented(); + + let sum = 0; + let count = 0; + + asyncSeries(zoomLevels.length, (n, callback) => { + const zoomLevel = zoomLevels[zoomLevels.length - n]; + const map = createMap({ + width: width, + height: height, + zoom: zoomLevel, + center: [-77.032194, 38.912753], + style: 'mapbox://styles/mapbox/streets-v9' + }); + map.getContainer().style.display = 'none'; + + map.on('load', () => { + + let zoomSum = 0; + let zoomCount = 0; + asyncSeries(numSamples, (n, callback) => { + const start = performance.now(); + map.queryRenderedFeatures({}); + const duration = performance.now() - start; + sum += duration; + count++; + zoomSum += duration; + zoomCount++; + callback(); + }, () => { + evented.fire('log', { + message: `${(zoomSum / zoomCount).toFixed(2)} ms at zoom ${zoomLevel}` + }); + map.remove(); + callback(); + }); + }); + }, done); + + + function done() { + const average = sum / count; + evented.fire('end', { + message: `${(average).toFixed(2)} ms`, + score: average + }); + } + setTimeout(() => { + evented.fire('log', { + message: 'loading assets', + color: 'dark' + }); + }, 0); + + return evented; +}; + +function asyncSeries(times, work, callback) { + if (times > 0) { + work(times, (err) => { + if (err) callback(err); + else asyncSeries(times - 1, work, callback); + }); + } else { + callback(); + } +} diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/benchmarks/query_point.js b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/benchmarks/query_point.js new file mode 100644 index 000000000..e22848893 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/benchmarks/query_point.js @@ -0,0 +1,93 @@ +'use strict'; + +const Evented = require('../../src/util/evented'); +const createMap = require('../lib/create_map'); + +const width = 1024; +const height = 768; + +const zoomLevels = []; +for (let i = 4; i < 19; i++) { + zoomLevels.push(i); +} + +const queryPoints = []; +const d = 20; +for (let x = 0; x < d; x++) { + for (let y = 0; y < d; y++) { + queryPoints.push([ + (x / d) * width, + (y / d) * height + ]); + } +} + +module.exports = function() { + const evented = new Evented(); + + let sum = 0; + let count = 0; + + asyncSeries(zoomLevels.length, (n, callback) => { + const zoomLevel = zoomLevels[zoomLevels.length - n]; + const map = createMap({ + width: width, + height: height, + zoom: zoomLevel, + center: [-77.032194, 38.912753], + style: 'mapbox://styles/mapbox/streets-v9' + }); + map.getContainer().style.display = 'none'; + + map.on('load', () => { + + let zoomSum = 0; + let zoomCount = 0; + asyncSeries(queryPoints.length, (n, callback) => { + const queryPoint = queryPoints[queryPoints.length - n]; + const start = performance.now(); + map.queryRenderedFeatures(queryPoint, {}); + const duration = performance.now() - start; + sum += duration; + count++; + zoomSum += duration; + zoomCount++; + callback(); + }, () => { + map.remove(); + evented.fire('log', { + message: `${(zoomSum / zoomCount).toFixed(2)} ms at zoom ${zoomLevel}` + }); + callback(); + }); + }); + }, done); + + + function done() { + const average = sum / count; + evented.fire('end', { + message: `${(average).toFixed(2)} ms`, + score: average + }); + } + setTimeout(() => { + evented.fire('log', { + message: 'loading assets', + color: 'dark' + }); + }, 0); + + return evented; +}; + +function asyncSeries(times, work, callback) { + if (times > 0) { + work(times, (err) => { + if (err) callback(err); + else asyncSeries(times - 1, work, callback); + }); + } else { + callback(); + } +} diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/benchmarks/style_load.js b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/benchmarks/style_load.js new file mode 100644 index 000000000..b026fa95c --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/benchmarks/style_load.js @@ -0,0 +1,57 @@ +'use strict'; + +const Evented = require('../../src/util/evented'); +const ajax = require('../../src/util/ajax'); +const config = require('../../src/util/config'); +const Style = require('../../src/style/style'); +const formatNumber = require('../lib/format_number'); +const accessToken = require('../lib/access_token'); + +module.exports = function() { + config.ACCESS_TOKEN = accessToken; + + const evented = new Evented(); + + const stylesheetURL = `https://api.mapbox.com/styles/v1/mapbox/streets-v9?access_token=${accessToken}`; + ajax.getJSON(stylesheetURL, (err, json) => { + if (err) { + return evented.fire('error', {error: err}); + } + + let timeSum = 0; + let timeCount = 0; + + asyncTimesSeries(20, (callback) => { + const timeStart = performance.now(); + new Style(json) + .on('error', (err) => { + evented.fire('error', { error: err }); + }) + .on('style.load', () => { + const time = performance.now() - timeStart; + timeSum += time; + timeCount++; + callback(); + }); + }, () => { + const timeAverage = timeSum / timeCount; + evented.fire('end', { + message: `${formatNumber(timeAverage)} ms`, + score: timeAverage + }); + }); + }); + + return evented; +}; + +function asyncTimesSeries(times, work, callback) { + if (times > 0) { + work((err) => { + if (err) callback(err); + else asyncTimesSeries(times - 1, work, callback); + }); + } else { + callback(); + } +} diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/benchmarks_view.js b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/benchmarks_view.js new file mode 100644 index 000000000..b8f57b1e0 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/benchmarks_view.js @@ -0,0 +1,261 @@ +'use strict'; +/*eslint no-unused-vars: ["error", { "varsIgnorePattern": "BenchmarksView|clipboard" }]*/ + +const Clipboard = require('clipboard'); + +// Benchmark results seem to be more consistent with a warmup and cooldown +// period. These values are measured in milliseconds. +const benchmarkCooldownTime = 250; +const benchmarkWarmupTime = 250; + +const BenchmarksView = React.createClass({ + + render: function() { + return
+ {this.renderSidebarBenchmarks()} + {this.renderBenchmarks()} +
; + }, + + renderSidebarBenchmarks: function() { + return
; + }, + + renderSidebarBenchmark: function(name) { + return
+

{name}

+ {Object.keys(this.state.results[name]).map(this.renderSidebarBenchmarkVersion.bind(this, name))} +
; + }, + + renderSidebarBenchmarkVersion: function(name, version) { + const results = this.state.results[name][version]; + const that = this; + + return
+ {version}: {results.message || '...'} +
; + }, + + renderTextBenchmarks: function() { + const versions = []; + for (const name in this.state.results) { + for (const version in this.state.results[name]) { + if (versions.indexOf(version) < 0) { + versions.push(version); + } + } + } + + let output = `benchmark | ${versions.join(' | ')}\n---`; + for (let i = 0; i < versions.length; i++) { + output += ' | ---'; + } + output += '\n'; + + for (const name in this.state.results) { + output += `**${name}**`; + for (const version of versions) { + const result = this.state.results[name][version]; + output += ` | ${result && result.message || 'n\/a'} `; + } + output += '\n'; + } + return output; + }, + + renderBenchmarks: function() { + return
+ {Object.keys(this.state.results).map(this.renderBenchmark)} +
; + }, + + renderBenchmark: function(name) { + return
+ {Object.keys(this.state.results[name]).map(this.renderBenchmarkVersion.bind(this, name))} +
; + }, + + renderBenchmarkVersion: function(name, version) { + const results = this.state.results[name][version]; + return ( +
+ +

{name} on {version}

+ {results.logs.map((log, index) => { + return
{log.message}
; + })} +
+ ); + }, + + scrollToBenchmark: function(name, version) { + const duration = 300; + const startTime = (new Date()).getTime(); + const startYOffset = window.pageYOffset; + + requestAnimationFrame(function frame() { + const endYOffset = document.getElementById(name + version).offsetTop; + const time = (new Date()).getTime(); + const yOffset = Math.min((time - startTime) / duration, 1) * (endYOffset - startYOffset) + startYOffset; + window.scrollTo(0, yOffset); + if (time < startTime + duration) requestAnimationFrame(frame); + }); + }, + + getInitialState: function() { + const results = {}; + + for (const name in this.props.benchmarks) { + for (const version in this.props.benchmarks[name]) { + if (!this.props.benchmarkFilter || this.props.benchmarkFilter(name, version)) { + results[name] = results[name] || {}; + results[name][version] = { + status: 'waiting', + logs: [] + }; + } + } + } + + return { results: results }; + }, + + componentDidMount: function() { + const that = this; + + asyncSeries(Object.keys(that.state.results), (name, callback) => { + asyncSeries(Object.keys(that.state.results[name]), (version, callback) => { + that.scrollToBenchmark(name, version); + that.runBenchmark(name, version, callback); + }, callback); + }, (err) => { + if (err) throw err; + }); + }, + + runBenchmark: function(name, version, outerCallback) { + const that = this; + const results = this.state.results[name][version]; + + function log(color, message) { + results.logs.push({ + color: color || 'blue', + message: message + }); + that.forceUpdate(); + } + + function callback() { + setTimeout(outerCallback, benchmarkCooldownTime); + } + + results.status = 'running'; + this.scrollToBenchmark(name, version); + log('dark', 'starting'); + + setTimeout(() => { + const emitter = that.props.benchmarks[name][version](); + + emitter.on('log', (event) => { + log(event.color, event.message); + + }); + + emitter.on('end', (event) => { + results.message = event.message; + results.status = 'ended'; + log('green', event.message); + callback(); + + }); + + emitter.on('error', (event) => { + results.status = 'errored'; + log('red', event.error); + callback(); + }); + + }, benchmarkWarmupTime); + }, + + getBenchmarkVersionStatus: function(name, version) { + return this.state.results[name][version].status; + }, + + getBenchmarkStatus: function(name) { + return reduceStatuses(Object.keys(this.state.results[name]).map(function(version) { + return this.getBenchmarkVersionStatus(name, version); + }, this)); + }, + + getStatus() { + return reduceStatuses(Object.keys(this.state.results).map(function(name) { + return this.getBenchmarkStatus(name); + }, this)); + } +}); + +function reduceStatuses(statuses) { + if (statuses.indexOf('running') !== -1) { + return 'running'; + } else if (statuses.indexOf('waiting') !== -1) { + return 'waiting'; + } else { + return 'ended'; + } +} + +const clipboard = new Clipboard('.clipboard'); + +ReactDOM.render( + , + document.getElementById('benchmarks') +); + +function asyncSeries(array, iterator, callback) { + if (array.length) { + iterator(array[0], (err) => { + if (err) callback(err); + else asyncSeries(array.slice(1), iterator, callback); + }); + } else { + callback(); + } +} diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/data/naturalearth-land.json b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/data/naturalearth-land.json new file mode 100644 index 000000000..617998fc4 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/data/naturalearth-land.json @@ -0,0 +1 @@ +{"type":"FeatureCollection","features":[{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[179.99921875,-16.168554687500006],[179.84824218750003,-16.30166015625001],[179.79384765625002,-16.37031250000001],[179.74814453125003,-16.4462890625],[179.619140625,-16.527734375],[179.56416015625,-16.63691406250001],[179.56816406250005,-16.74746093750001],[179.69707031250005,-16.631933593750006],[179.841015625,-16.5375],[179.8849609375,-16.51845703125001],[179.93037109375,-16.51943359375001],[179.92656250000005,-16.55166015625001],[179.90595703125,-16.58359375],[179.89003906250002,-16.6669921875],[179.9279296875,-16.744433593750003],[179.82080078125,-16.736914062500006],[179.71474609375002,-16.74355468750001],[179.58896484375003,-16.78701171875001],[179.46542968750003,-16.80605468750001],[179.41933593750002,-16.80654296875001],[179.375,-16.7919921875],[179.34599609375005,-16.76972656250001],[179.32333984375003,-16.718066406250003],[179.30048828125,-16.71035156250001],[179.20234375,-16.712695312500003],[179.05546875000005,-16.813574218750006],[179.0068359375,-16.900195312500003],[178.950390625,-16.90400390625001],[178.88369140625002,-16.886035156250003],[178.8029296875,-16.9521484375],[178.70664062500003,-16.976171875],[178.6650390625,-16.920019531250006],[178.63808593750002,-16.85126953125001],[178.6037109375,-16.800585937500003],[178.49746093750002,-16.787890625],[178.51376953125003,-16.72607421875],[178.5419921875,-16.700488281250003],[178.56777343750002,-16.663867187500003],[178.58359375000003,-16.621875],[178.63427734375,-16.648535156250006],[178.68632812500005,-16.665625],[178.74453125000002,-16.63417968750001],[178.80507812500002,-16.631445312500006],[178.86572265625,-16.5400390625],[178.96054687500003,-16.4828125],[179.09140625000003,-16.4375],[179.224609375,-16.40517578125001],[179.29355468750003,-16.39863281250001],[179.35917968750005,-16.3798828125],[179.47509765625,-16.29414062500001],[179.5517578125,-16.24990234375001],[179.63525390625,-16.223242187500006],[179.7150390625,-16.207617187500006],[179.78886718750005,-16.221484375],[179.84814453125,-16.21425781250001],[180,-16.152929687500006],[179.99921875,-16.168554687500006]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[177.23417968750005,-17.147070312500006],[177.1828125,-17.163867187500003],[177.21015625,-17.084277343750003],[177.2392578125,-17.059375],[177.25751953125,-17.05419921875],[177.28740234375005,-17.048632812500003],[177.27578125000002,-17.10488281250001],[177.23417968750005,-17.147070312500006]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[127.37265625000003,0.791308593749989],[127.33837890625,0.758447265624994],[127.30605468750002,0.769433593749994],[127.28642578125005,0.811914062499994],[127.29277343750005,0.842480468749997],[127.31982421875,0.862011718749997],[127.35380859375005,0.847460937499989],[127.37265625000003,0.791308593749989]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-81.33481445312499,24.65048828124999],[-81.36479492187499,24.629931640625003],[-81.379052734375,24.636279296875003],[-81.379052734375,24.666259765625],[-81.42167968749999,24.732617187499997],[-81.420068359375,24.75],[-81.32231445312499,24.68505859375],[-81.31982421875,24.667626953124994],[-81.33481445312499,24.65048828124999]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-80.82939453124999,24.803662109374997],[-80.84833984375,24.803662109374997],[-80.8388671875,24.81787109375],[-80.79941406249999,24.84628906249999],[-80.78520507812499,24.835253906250003],[-80.786767578125,24.821044921875],[-80.82939453124999,24.803662109374997]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-80.63828125,24.90317382812499],[-80.66513671874999,24.8984375],[-80.62568359375,24.941113281249997],[-80.61459960937499,24.937939453124997],[-80.63828125,24.90317382812499]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[143.17890625,-11.954492187500009],[143.15292968750003,-12.075878906250011],[143.1046875,-12.169628906250011],[143.09902343750002,-12.225976562500009],[143.11025390625002,-12.303515625],[143.190625,-12.361230468750009],[143.2541015625,-12.397656250000011],[143.28964843750003,-12.498828125],[143.4015625,-12.639941406250003],[143.39755859375003,-12.736132812500003],[143.45771484375,-12.855761718750003],[143.51201171875005,-13.09453125],[143.5294921875,-13.303808593750006],[143.58662109375,-13.443652343750003],[143.54843750000003,-13.741015625],[143.58925781250002,-13.86279296875],[143.64335937500005,-13.963671875],[143.7072265625,-14.16455078125],[143.75634765625,-14.348828125000011],[143.82236328125003,-14.401074218750011],[143.96181640625002,-14.462890625],[144.10585937500002,-14.39453125],[144.20986328125002,-14.301953125000011],[144.32167968750002,-14.279394531250006],[144.47304687500002,-14.231835937500009],[144.58642578125,-14.354687500000011],[144.64804687500003,-14.492480468750003],[144.91572265625,-14.67431640625],[145.064453125,-14.791015625],[145.17998046875005,-14.85693359375],[145.28769531250003,-14.943164062500003],[145.27695312500003,-15.029394531250006],[145.25166015625,-15.097460937500003],[145.27617187500005,-15.20390625],[145.29306640625003,-15.327246093750006],[145.27158203125003,-15.476660156250006],[145.34951171875002,-15.7015625],[145.37539062500002,-15.881054687500011],[145.4580078125,-16.056445312500003],[145.45185546875,-16.236914062500006],[145.43642578125002,-16.304980468750003],[145.42607421875005,-16.40615234375001],[145.4904296875,-16.53212890625001],[145.54990234375003,-16.625097656250006],[145.63828125000003,-16.72607421875],[145.75478515625002,-16.879492187500006],[145.837890625,-16.91035156250001],[145.912109375,-16.9125],[145.90195312500003,-17.07021484375001],[146.0498046875,-17.38105468750001],[146.12587890625002,-17.63525390625],[146.07402343750005,-17.97734375],[146.02285156250002,-18.17578125],[146.0322265625,-18.27285156250001],[146.22304687500002,-18.509863281250006],[146.333203125,-18.5537109375],[146.31171875,-18.66669921875001],[146.296875,-18.84121093750001],[146.38339843750003,-18.97705078125],[146.48115234375,-19.078710937500006],[146.58730468750002,-19.139453125],[146.69199218750003,-19.18740234375001],[146.82900390625002,-19.23574218750001],[147.00263671875,-19.25605468750001],[147.0927734375,-19.332617187500006],[147.13876953125003,-19.393164062500006],[147.278125,-19.414160156250006],[147.34150390625,-19.402929687500006],[147.41855468750003,-19.378125],[147.4708984375,-19.41933593750001],[147.509765625,-19.47412109375],[147.58603515625003,-19.62275390625001],[147.7423828125,-19.770117187500006],[147.85322265625,-19.794726562500003],[147.915625,-19.869238281250006],[148.00449218750003,-19.88955078125001],[148.0810546875,-19.89863281250001],[148.1896484375,-19.955859375],[148.36689453125,-20.0875],[148.52675781250002,-20.10888671875],[148.60048828125002,-20.14521484375001],[148.759375,-20.28955078125],[148.82099609375,-20.36640625000001],[148.884765625,-20.480859375],[148.80507812500002,-20.49169921875],[148.72998046875,-20.4677734375],[148.68369140625003,-20.580175781250006],[148.78945312500002,-20.735644531250003],[148.91240234375005,-20.84521484375],[149.060546875,-20.96113281250001],[149.20488281250005,-21.125097656250006],[149.24140625,-21.25019531250001],[149.2802734375,-21.29951171875001],[149.329296875,-21.47607421875],[149.4541015625,-21.578710937500006],[149.46005859375003,-21.765429687500003],[149.52402343750003,-22.02363281250001],[149.595703125,-22.257617187500003],[149.64531250000005,-22.32832031250001],[149.70390625000005,-22.440527343750006],[149.77158203125003,-22.42626953125],[149.8224609375,-22.38984375000001],[149.92031250000002,-22.50136718750001],[149.97441406250005,-22.55068359375001],[150.00556640625,-22.521582031250006],[149.94189453125,-22.30810546875],[149.98125,-22.18427734375001],[150.02060546875003,-22.168359375],[150.076171875,-22.164453125],[150.14296875000002,-22.265429687500003],[150.23486328125,-22.37294921875001],[150.40507812500005,-22.46894531250001],[150.54130859375005,-22.55908203125],[150.57958984375,-22.555761718750006],[150.56435546875002,-22.486132812500003],[150.5685546875,-22.38398437500001],[150.62285156250005,-22.367285156250006],[150.67246093750003,-22.41816406250001],[150.7638671875,-22.576171875],[150.78281250000003,-22.902929687500006],[150.78300781250005,-23.1765625],[150.84316406250002,-23.4580078125],[150.93105468750002,-23.53193359375001],[150.98876953125,-23.60175781250001],[151.08769531250005,-23.69609375],[151.15380859375,-23.78408203125001],[151.236328125,-23.825],[151.50078125000005,-24.01240234375001],[151.575390625,-24.03359375],[151.69091796875,-24.038378906250003],[151.83164062500003,-24.12294921875001],[151.90273437500002,-24.200976562500003],[152.05537109375,-24.494433593750003],[152.1298828125,-24.59755859375001],[152.28203125000005,-24.699316406250006],[152.353125,-24.732519531250006],[152.45634765625005,-24.80244140625001],[152.4931640625,-24.90400390625001],[152.50205078125003,-24.963964843750006],[152.56328125000005,-25.072070312500003],[152.654296875,-25.201953125],[152.78916015625003,-25.27412109375001],[152.91347656250002,-25.43212890625],[152.92050781250003,-25.688574218750006],[152.98496093750003,-25.816210937500003],[153.02822265625002,-25.87031250000001],[153.12548828125,-25.92265625],[153.16494140625002,-25.964160156250003],[153.0841796875,-26.303808593750006],[153.162109375,-26.982714843750003],[153.11679687500003,-27.194433593750006],[153.19794921875,-27.4046875],[153.3857421875,-27.7685546875],[153.42841796875,-27.89765625000001],[153.45488281250005,-28.04833984375],[153.57568359375,-28.240527343750003],[153.56914062500005,-28.53339843750001],[153.61689453125,-28.67304687500001],[153.60458984375003,-28.8544921875],[153.46220703125005,-29.05019531250001],[153.34804687500002,-29.29042968750001],[153.34697265625005,-29.49658203125],[153.27236328125002,-29.89248046875001],[153.223828125,-29.998632812500006],[153.18818359375,-30.163867187500003],[153.03056640625005,-30.56337890625001],[153.02373046875005,-30.72011718750001],[153.0478515625,-30.90712890625001],[153.02158203125003,-31.08662109375001],[152.98222656250005,-31.208789062500003],[152.94394531250003,-31.434863281250003],[152.78583984375,-31.78632812500001],[152.55927734375,-32.045703125],[152.54531250000002,-32.24306640625001],[152.5166015625,-32.330175781250006],[152.47041015625,-32.4390625],[152.33125,-32.55751953125001],[152.24746093750002,-32.60869140625],[152.21572265625002,-32.678125],[152.13652343750005,-32.678125],[152.13457031250005,-32.69990234375001],[152.18808593750003,-32.7216796875],[152.1642578125,-32.757421875],[151.954296875,-32.8203125],[151.81289062500002,-32.90107421875001],[151.66835937500002,-33.0986328125],[151.60771484375005,-33.20185546875001],[151.53007812500005,-33.30097656250001],[151.48378906250002,-33.3474609375],[151.46337890625,-33.39736328125001],[151.43203125000002,-33.521582031250006],[151.35751953125003,-33.5439453125],[151.29208984375003,-33.58095703125001],[151.32275390625,-33.699316406250006],[151.28837890625005,-33.83486328125001],[151.2802734375,-33.92666015625001],[151.24462890625,-33.98505859375001],[151.20166015625,-33.96406250000001],[151.16787109375002,-33.9734375],[151.12480468750005,-34.00527343750001],[151.19121093750005,-34.015234375],[151.23154296875003,-34.0296875],[151.08994140625003,-34.1625],[150.96035156250002,-34.29707031250001],[150.92744140625,-34.38662109375001],[150.8712890625,-34.499121093750006],[150.821875,-34.74921875000001],[150.78105468750005,-34.8921875],[150.80917968750003,-34.99384765625001],[150.80458984375002,-35.01289062500001],[150.774609375,-35.02041015625001],[150.7560546875,-35.00712890625],[150.69736328125003,-35.04189453125001],[150.68095703125005,-35.07666015625],[150.70566406250003,-35.119726562500006],[150.72216796875,-35.1345703125],[150.71464843750005,-35.15517578125001],[150.69033203125002,-35.177734375],[150.63447265625,-35.17763671875001],[150.56748046875003,-35.21425781250001],[150.37412109375003,-35.58417968750001],[150.2921875,-35.68232421875001],[150.1953125,-35.83359375],[150.15849609375005,-35.97060546875001],[150.12890625,-36.12041015625],[150.09531250000003,-36.37265625],[150.06279296875005,-36.550390625],[149.98818359375002,-36.722753906250006],[149.96025390625005,-36.8455078125],[149.95058593750002,-37.08027343750001],[149.986328125,-37.258398437500006],[149.962890625,-37.35302734375],[149.96230468750002,-37.44384765625],[149.93271484375003,-37.52851562500001],[149.809375,-37.5478515625],[149.708984375,-37.6169921875],[149.5654296875,-37.72998046875],[149.48085937500002,-37.77119140625001],[149.29843750000003,-37.80214843750001],[148.94394531250003,-37.78847656250001],[148.2625,-37.830664062500006],[148.13066406250005,-37.856054687500006],[147.87675781250005,-37.934179687500006],[147.63144531250003,-38.0556640625],[147.39560546875003,-38.219140625],[146.85683593750002,-38.663476562499994],[146.4357421875,-38.711816406249994],[146.35625,-38.711816406249994],[146.29257812500003,-38.699804687500006],[146.21748046875,-38.727441406249994],[146.21621093750002,-38.78271484375],[146.28554687500002,-38.840234375],[146.33662109375,-38.89423828125001],[146.426953125,-38.81962890625002],[146.46660156250005,-38.84033203125],[146.481640625,-38.977929687499994],[146.48378906250002,-39.065039062500006],[146.45664062500003,-39.1123046875],[146.4,-39.1455078125],[146.3400390625,-39.12382812500002],[146.33203125,-39.07666015625],[146.25429687500002,-38.964453125],[146.1583984375,-38.86572265625],[146.06992187500003,-38.834082031250006],[146.01816406250003,-38.867089843749994],[145.93535156250005,-38.901757812499994],[145.86552734375005,-38.775976562500006],[145.79082031250005,-38.6669921875],[145.69189453125,-38.655664062499994],[145.60634765625002,-38.656835937500006],[145.5353515625,-38.60966796875002],[145.39726562500005,-38.53535156250001],[145.42421875000002,-38.47734375000002],[145.46279296875002,-38.41630859375002],[145.5421875,-38.39384765625002],[145.51835937500005,-38.311425781249994],[145.47578125,-38.24375],[145.36640625,-38.225683593750006],[145.29277343750005,-38.23759765625002],[145.24892578125002,-38.29121093750001],[145.19121093750005,-38.38359375000002],[144.95957031250003,-38.50078125000002],[144.84726562500003,-38.43632812500002],[144.7177734375,-38.34033203125],[144.7802734375,-38.34736328125001],[144.91142578125005,-38.34404296875002],[145.02011718750003,-38.258398437500006],[145.06699218750003,-38.20488281250002],[145.11992187500005,-38.09130859375],[145.04960937500005,-38.01093750000001],[144.98486328125,-37.952246093750006],[144.89130859375,-37.89980468750001],[144.53847656250002,-38.0771484375],[144.46533203125,-38.1025390625],[144.3955078125,-38.13691406250001],[144.5177734375,-38.16640625],[144.58945312500003,-38.157617187499994],[144.665234375,-38.2099609375],[144.54365234375,-38.284082031249994],[144.44785156250003,-38.3037109375],[144.32871093750003,-38.348242187500006],[144.1015625,-38.462304687499994],[143.81171875,-38.698828125],[143.68671875,-38.76689453125002],[143.53896484375002,-38.820898437500006],[143.33847656250003,-38.7578125],[143.22646484375002,-38.7431640625],[143.08261718750003,-38.645898437499994],[142.84023437500002,-38.58085937500002],[142.61210937500005,-38.45166015625],[142.45585937500005,-38.386328125],[142.34453125000005,-38.372167968750006],[142.1876953125,-38.3994140625],[141.92470703125002,-38.283789062500006],[141.725,-38.271386718749994],[141.5939453125,-38.387792968750006],[141.49179687500003,-38.379785156249994],[141.42421875000002,-38.36347656250001],[141.2138671875,-38.171972656250006],[141.0109375,-38.07695312500002],[140.62724609375005,-38.028417968750006],[140.39042968750005,-37.89667968750001],[140.212109375,-37.6421875],[139.87480468750005,-37.35205078125],[139.78427734375003,-37.24580078125001],[139.74228515625003,-37.141699218750006],[139.7384765625,-37.0595703125],[139.78388671875,-36.90263671875],[139.84658203125002,-36.748046875],[139.85732421875002,-36.662109375],[139.72900390625,-36.37138671875],[139.54873046875002,-36.0966796875],[139.46591796875003,-36.010351562500006],[139.24492187500005,-35.82734375000001],[139.03769531250003,-35.6892578125],[138.98505859375,-35.617578125],[138.9689453125,-35.58076171875001],[139.06689453125,-35.5984375],[139.1125,-35.54228515625],[139.17802734375005,-35.523046875],[139.23056640625003,-35.59765625],[139.28945312500002,-35.611328125],[139.29208984375003,-35.4859375],[139.32509765625002,-35.42666015625001],[139.30253906250005,-35.3994140625],[139.28251953125005,-35.375390625],[139.19277343750002,-35.347265625],[139.09375,-35.38955078125001],[139.01767578125003,-35.44326171875001],[138.915234375,-35.488867187500006],[138.87529296875005,-35.53681640625001],[138.77099609375,-35.53837890625],[138.7296875,-35.55078125],[138.521875,-35.6423828125],[138.38925781250003,-35.64472656250001],[138.184375,-35.61269531250001],[138.2521484375,-35.48652343750001],[138.33291015625002,-35.41171875],[138.39980468750002,-35.32578125],[138.51113281250002,-35.0244140625],[138.48994140625,-34.76357421875001],[138.43623046875,-34.65625],[138.26435546875,-34.44033203125001],[138.18623046875,-34.307226562500006],[138.08925781250002,-34.16982421875001],[138.04130859375005,-34.2498046875],[138.01230468750003,-34.334082031250006],[137.91923828125005,-34.4560546875],[137.87412109375003,-34.72744140625001],[137.69169921875005,-35.14296875],[137.56640625,-35.148046875],[137.45957031250003,-35.13134765625],[137.27236328125002,-35.1787109375],[137.14443359375002,-35.236425781250006],[137.02988281250003,-35.23652343750001],[136.96660156250005,-35.2548828125],[136.88359375000005,-35.23974609375],[137.01425781250003,-34.9158203125],[137.12841796875,-34.92470703125001],[137.25205078125003,-34.91152343750001],[137.30839843750005,-34.9169921875],[137.39101562500002,-34.91328125000001],[137.454296875,-34.764453125],[137.49296875000005,-34.597753906250006],[137.46855468750005,-34.490234375],[137.458984375,-34.37890625],[137.48359375,-34.25214843750001],[137.49384765625,-34.1611328125],[137.650390625,-33.85908203125001],[137.78085937500003,-33.703125],[137.9318359375,-33.5791015625],[137.91396484375002,-33.461328125],[137.86601562500005,-33.3140625],[137.85234375000005,-33.20078125],[137.92431640625,-33.165136718750006],[137.99257812500002,-33.09423828125],[137.91318359375003,-32.77070312500001],[137.86308593750005,-32.67373046875001],[137.783203125,-32.578125],[137.78183593750003,-32.701953125],[137.79091796875002,-32.8232421875],[137.68017578125,-32.97802734375],[137.53623046875003,-33.08916015625],[137.44228515625002,-33.19355468750001],[137.35419921875,-33.43017578125],[137.2373046875,-33.629492187500006],[137.13027343750002,-33.70302734375001],[137.03447265625005,-33.71953125],[136.9365234375,-33.75019531250001],[136.78349609375005,-33.8296875],[136.63554687500005,-33.896582031250006],[136.52587890625,-33.9841796875],[136.4306640625,-34.02998046875001],[136.12109375,-34.4287109375],[135.9796875,-34.56191406250001],[135.95058593750002,-34.61572265625],[135.89101562500002,-34.6609375],[135.90263671875005,-34.72382812500001],[135.95058593750002,-34.76679687500001],[135.99853515625,-34.94375],[135.9697265625,-34.98183593750001],[135.919140625,-34.9619140625],[135.79238281250002,-34.86328125],[135.7125,-34.89921875],[135.64755859375003,-34.93964843750001],[135.48085937500002,-34.758203125],[135.41171875000003,-34.71552734375001],[135.32421875,-34.642675781250006],[135.2306640625,-34.57978515625001],[135.19082031250002,-34.57265625],[135.123046875,-34.5857421875],[135.12958984375,-34.53652343750001],[135.1759765625,-34.49658203125],[135.216796875,-34.4873046875],[135.29248046875,-34.54560546875001],[135.37871093750005,-34.59765625],[135.42734375000003,-34.601953125],[135.45,-34.5810546875],[135.36796875000005,-34.375585937500006],[135.31201171875,-34.19550781250001],[135.286328125,-34.14228515625001],[135.2189453125,-33.959765625],[135.18544921875002,-33.90673828125],[135.04208984375003,-33.777734375],[134.88876953125003,-33.62636718750001],[134.8466796875,-33.44462890625],[134.791015625,-33.32832031250001],[134.71904296875005,-33.25517578125],[134.60771484375005,-33.19013671875001],[134.30126953125,-33.1650390625],[134.17353515625,-32.979101562500006],[134.10039062500005,-32.748632812500006],[134.1583984375,-32.7333984375],[134.22714843750003,-32.730566406250006],[134.24921875,-32.65869140625],[134.23417968750005,-32.54853515625001],[133.93017578125,-32.41171875],[133.78671875000003,-32.26884765625],[133.66533203125005,-32.20722656250001],[133.55136718750003,-32.18291015625],[133.4005859375,-32.1884765625],[133.212109375,-32.18378906250001],[132.75742187500003,-31.95625],[132.6486328125,-31.949316406250006],[132.32363281250002,-32.02001953125],[132.21464843750005,-32.00712890625],[131.72119140625,-31.6962890625],[131.39316406250003,-31.54853515625001],[131.28496093750005,-31.52099609375],[131.14365234375003,-31.495703125],[131.029296875,-31.531835937500006],[130.94814453125002,-31.56582031250001],[130.78300781250005,-31.60400390625],[130.12978515625002,-31.5791015625],[129.56884765625,-31.627246093750003],[129.1876953125,-31.659960937500003],[128.94619140625002,-31.70263671875],[128.54609375,-31.8876953125],[128.06767578125005,-32.066503906250006],[127.67802734375005,-32.15126953125001],[127.31982421875,-32.2640625],[127.08408203125003,-32.296875],[126.779296875,-32.3109375],[126.13652343749999,-32.2568359375],[125.91718750000001,-32.296972656250006],[125.56748046875003,-32.505859375],[125.46367187499999,-32.55654296875001],[125.2666015625,-32.61445312500001],[124.7587890625,-32.88271484375001],[124.52460937500001,-32.94013671875001],[124.37324218750001,-32.95839843750001],[124.24375,-33.015234375],[124.12607421875003,-33.12939453125],[123.96718750000002,-33.4462890625],[123.86835937500001,-33.59638671875001],[123.650390625,-33.836328125],[123.5068359375,-33.91621093750001],[123.36542968750001,-33.905371093750006],[123.20761718750003,-33.98828125],[123.06757812500001,-33.90058593750001],[122.95566406250003,-33.8837890625],[122.77753906250001,-33.89082031250001],[122.15097656250003,-33.991796875],[122.06113281250003,-33.87441406250001],[121.94638671875003,-33.85673828125],[121.72968750000001,-33.8625],[121.40507812499999,-33.826757812500006],[120.81455078125003,-33.87128906250001],[120.53056640624999,-33.9197265625],[120.41835937500002,-33.96308593750001],[120.209375,-33.93544921875001],[119.85410156250003,-33.974707031250006],[119.72910156250003,-34.04150390625],[119.63515625000002,-34.101171875],[119.45058593750002,-34.368261718750006],[119.24765625000003,-34.45644531250001],[119.08134765624999,-34.459375],[118.89531249999999,-34.47988281250001],[118.52011718750003,-34.737109375],[118.13554687499999,-34.98662109375],[118.00644531250003,-35.01328125],[117.86308593749999,-35.05498046875],[117.67539062500003,-35.07490234375001],[117.58193359375002,-35.097753906250006],[117.14394531250002,-35.03369140625],[116.86542968750001,-35.02656250000001],[116.51718750000003,-34.987890625],[116.21708984374999,-34.865820312500006],[115.98671875000002,-34.795019531250006],[115.72626953125001,-34.52607421875001],[115.56503906250003,-34.42578125],[115.27763671874999,-34.30390625000001],[115.19482421875,-34.30849609375001],[115.1279296875,-34.341796875],[115.0087890625,-34.255859375],[115.00566406249999,-34.145117187500006],[114.97343749999999,-34.051171875],[114.97568359375003,-33.80419921875],[114.99384765625001,-33.51533203125001],[115.09892578124999,-33.58027343750001],[115.181640625,-33.64345703125001],[115.35878906250002,-33.63994140625],[115.51533203125001,-33.531347656250006],[115.6044921875,-33.37226562500001],[115.68300781250002,-33.19287109375],[115.6708984375,-33.00214843750001],[115.61855468750002,-32.6669921875],[115.654296875,-32.59658203125001],[115.70791015625002,-32.56796875],[115.72539062499999,-32.40107421875001],[115.73808593749999,-31.88789062500001],[115.69843750000001,-31.69453125000001],[115.45458984375,-31.302539062500003],[115.29433593750002,-30.96181640625001],[115.17685546875003,-30.80800781250001],[115.07792968749999,-30.56044921875001],[114.99453125000002,-30.21621093750001],[114.96884765625003,-30.042285156250003],[114.94208984375001,-29.72158203125001],[114.97138671875001,-29.53974609375001],[114.958984375,-29.43359375],[114.85683593750002,-29.14296875],[114.62841796875,-28.87177734375001],[114.59062,-28.77167968750001],[114.591796875,-28.66621093750001],[114.53740234374999,-28.54287109375001],[114.353515625,-28.294921875],[114.16513671875003,-28.080664062500006],[114.13349609375001,-27.97646484375001],[114.09843749999999,-27.544238281250003],[114.02812,-27.347265625],[113.709375,-26.847753906250006],[113.3330078125,-26.41738281250001],[113.23105468750003,-26.24140625000001],[113.18476562500001,-26.182226562500006],[113.21074218749999,-26.17421875],[113.253125,-26.197265625],[113.30009765624999,-26.240234375],[113.3232421875,-26.24384765625001],[113.34531250000003,-26.208300781250003],[113.34287109375003,-26.126074218750006],[113.35605468750003,-26.08046875],[113.38896484374999,-26.105566406250006],[113.42744140625001,-26.198046875],[113.54658203125001,-26.43671875000001],[113.58164062500003,-26.55810546875],[113.73369140624999,-26.59511718750001],[113.78037109375003,-26.56328125],[113.83642578125,-26.500585937500006],[113.85283203124999,-26.332128906250006],[113.77578125000002,-26.255957031250006],[113.70644531250002,-26.2236328125],[113.58906250000001,-26.0986328125],[113.51337890625001,-25.89833984375001],[113.39531249999999,-25.71328125],[113.39736328125002,-25.64716796875001],[113.45136718750001,-25.59912109375],[113.53945312500002,-25.62519531250001],[113.62119140625003,-25.73164062500001],[113.71308593750001,-25.83076171875001],[113.69785156250003,-26.004199218750003],[113.68359375,-26.05166015625001],[113.69169921874999,-26.09169921875001],[113.72373046875003,-26.12978515625001],[113.76582031250001,-26.159765625],[113.81181640624999,-26.115820312500006],[113.85390625000002,-26.014453125],[113.8798828125,-26.027636718750003],[113.9423828125,-26.25869140625001],[113.99199218749999,-26.32148437500001],[114.09033203125,-26.393652343750006],[114.17597656250001,-26.3375],[114.21572265625002,-26.289453125],[114.20332031250001,-26.12636718750001],[114.228515625,-25.96875],[114.21425781250002,-25.8515625],[113.99277343750003,-25.54482421875001],[113.79238281250002,-25.16572265625001],[113.67080078125002,-24.97705078125],[113.56923828125002,-24.69296875],[113.50351562500003,-24.59462890625001],[113.41767578125001,-24.435644531250006],[113.41298828125002,-24.254003906250006],[113.42128906250002,-24.13232421875],[113.48984375000003,-23.86962890625],[113.55292968750001,-23.7328125],[113.75703125000001,-23.41816406250001],[113.76699218750002,-23.282519531250003],[113.76484375000001,-23.18046875],[113.794921875,-23.02363281250001],[113.79511718750001,-22.91455078125],[113.76787109374999,-22.812890625],[113.68281250000001,-22.637792968750006],[113.79501953125003,-22.332128906250006],[113.95839843750002,-21.93916015625001],[114.02285156250002,-21.881445312500006],[114.12392578125002,-21.82861328125],[114.142578125,-21.909765625],[114.0927734375,-22.18134765625001],[114.16386718749999,-22.323339843750006],[114.1416015625,-22.48310546875001],[114.20517578125003,-22.455859375],[114.30351562499999,-22.425390625],[114.37773437499999,-22.34150390625001],[114.4169921875,-22.261035156250003],[114.60283203124999,-21.9421875],[114.70927734374999,-21.82343750000001],[114.85908203125001,-21.7359375],[115.16171875000003,-21.63056640625001],[115.45615234375003,-21.49169921875],[115.59609375000002,-21.35810546875001],[115.771484375,-21.242285156250006],[115.8935546875,-21.11669921875],[116.01093750000001,-21.030371093750006],[116.60585937500002,-20.71337890625],[116.70673828125001,-20.65380859375],[116.83632812500002,-20.647070312500006],[116.99531250000001,-20.65761718750001],[117.13906250000002,-20.640917968750003],[117.29277343749999,-20.71308593750001],[117.40625,-20.72119140625],[117.68388671874999,-20.64277343750001],[117.83232421874999,-20.572558593750003],[118.08730468750002,-20.419042968750006],[118.19921875,-20.37519531250001],[118.45830078124999,-20.32666015625],[118.75146484375,-20.26191406250001],[119.1044921875,-19.99531250000001],[119.35878906250002,-20.012304687500006],[119.5859375,-20.03828125000001],[119.76777343750001,-19.95839843750001],[120.1962890625,-19.909472656250003],[120.43369140625003,-19.84199218750001],[120.87841796875,-19.6650390625],[120.99794921875002,-19.60439453125001],[121.17978515625003,-19.47792968750001],[121.33769531249999,-19.319921875],[121.49355468750002,-19.1064453125],[121.58945312500003,-18.915136718750006],[121.63066406249999,-18.81660156250001],[121.72197265624999,-18.659960937500003],[121.78486328125001,-18.5359375],[121.83378906249999,-18.47705078125],[122.00625,-18.393652343750006],[122.26210937500002,-18.15908203125001],[122.34541015625001,-18.111914062500006],[122.36093750000003,-18.036914062500003],[122.30576171875003,-17.994921875],[122.23740234375003,-17.968554687500003],[122.19130859375002,-17.7203125],[122.1474609375,-17.54902343750001],[122.14316406250003,-17.42841796875001],[122.16025390625003,-17.31367187500001],[122.26093750000001,-17.1357421875],[122.33271484375001,-17.059375],[122.43203125000002,-16.97041015625001],[122.52255859375003,-16.94287109375],[122.59794921874999,-16.86494140625001],[122.72041015625001,-16.787695312500006],[122.77207031250003,-16.71015625000001],[122.84804687500002,-16.55244140625001],[122.91679687499999,-16.4326171875],[122.970703125,-16.436816406250003],[123.07441406250001,-16.71533203125],[123.14208984375,-16.863085937500003],[123.26591796874999,-17.03681640625001],[123.38320312500002,-17.292773437500003],[123.47880859374999,-17.409960937500003],[123.52519531249999,-17.48574218750001],[123.56308593750003,-17.52089843750001],[123.57148437500001,-17.472265625],[123.56181640624999,-17.41542968750001],[123.60791015625,-17.21992187500001],[123.58632812500002,-17.08271484375001],[123.59355468749999,-17.030371093750006],[123.61767578125,-17.00830078125],[123.6640625,-17.023242187500003],[123.75380859375002,-17.09980468750001],[123.79902343750001,-17.12714843750001],[123.8310546875,-17.12080078125001],[123.82949218750002,-16.996875],[123.87441406250002,-16.91865234375001],[123.85634765625002,-16.86474609375],[123.77812,-16.867773437500006],[123.74501953125002,-16.80097656250001],[123.68046874999999,-16.7236328125],[123.60712890625001,-16.668066406250006],[123.51796875000002,-16.54072265625001],[123.49042968750001,-16.49072265625],[123.52509765625001,-16.467578125],[123.58134765624999,-16.47089843750001],[123.6259765625,-16.416308593750003],[123.646484375,-16.343066406250003],[123.60703125000003,-16.22402343750001],[123.6474609375,-16.17988281250001],[123.72890625000002,-16.192480468750006],[123.85917968749999,-16.38232421875],[123.91523437500001,-16.363574218750003],[123.96132812500002,-16.286914062500003],[124.04443359375,-16.264941406250003],[124.12978515625002,-16.27880859375],[124.18603515625,-16.33359375],[124.30039062500003,-16.38828125],[124.45273437500003,-16.38203125000001],[124.52998046875001,-16.39521484375001],[124.6923828125,-16.38613281250001],[124.77197265625,-16.402636718750003],[124.75703125000001,-16.373339843750003],[124.66923828124999,-16.33876953125001],[124.5703125,-16.331835937500003],[124.45449218750002,-16.335253906250003],[124.40488281250003,-16.298925781250006],[124.38828125000003,-16.20302734375001],[124.41640625000002,-16.13349609375001],[124.4345703125,-16.103808593750003],[124.50996093750001,-16.116308593750006],[124.57685546875001,-16.113671875],[124.58505859375003,-16.020117187500006],[124.60859375000001,-15.9375],[124.64853515625003,-15.870214843750006],[124.64833984375002,-15.80546875],[124.60664062500001,-15.82265625],[124.50429687500002,-15.972460937500003],[124.45527343750001,-15.8505859375],[124.38164062499999,-15.758203125],[124.39658203125003,-15.625878906250009],[124.43955078125003,-15.493554687500009],[124.50566406249999,-15.475390625],[124.56162109375003,-15.496289062500011],[124.64433593749999,-15.418847656250009],[124.69091796875,-15.359667968750003],[124.68017578125,-15.31103515625],[124.69257812500001,-15.273632812500011],[124.75048828125,-15.285253906250006],[124.97207031250002,-15.404296875],[125.01640624999999,-15.466503906250011],[125.06298828125,-15.442285156250009],[125.07792968749999,-15.37451171875],[125.07294921875001,-15.306738281250006],[125.02402343750003,-15.316992187500006],[124.9091796875,-15.31005859375],[124.88271484375002,-15.27197265625],[124.89267578125003,-15.240527343750003],[124.83906250000001,-15.160742187500006],[124.91416015625003,-15.109960937500006],[124.97871093750001,-15.106640625000011],[125.02333984375002,-15.071875],[125.02402343750003,-15.0244140625],[125.03818359375003,-15.004101562500011],[125.07294921875001,-15.032324218750006],[125.18867187500001,-15.04541015625],[125.30234375000003,-15.106835937500009],[125.35566406250001,-15.119824218750011],[125.37558593750003,-15.086816406250009],[125.3837890625,-15.015625],[125.24326171875003,-14.944531250000011],[125.23945312500001,-14.874609375],[125.18037109375001,-14.794042968750006],[125.1787109375,-14.714746093750009],[125.26650390625002,-14.6484375],[125.28457031250002,-14.584082031250006],[125.33544921875,-14.557910156250003],[125.43593750000002,-14.556835937500011],[125.50371093749999,-14.502246093750003],[125.57978515625001,-14.483203125],[125.59833984375001,-14.361621093750003],[125.59707031250002,-14.278125],[125.62773437499999,-14.256640625],[125.70458984375,-14.29140625],[125.68125,-14.387988281250003],[125.68095703124999,-14.480175781250011],[125.66162109375,-14.529492187500011],[125.69052734375003,-14.525390625],[125.70839843750002,-14.5048828125],[125.73847656250001,-14.4443359375],[125.81953125000001,-14.469140625],[125.83955078125001,-14.533886718750011],[125.85009765625,-14.597265625],[125.890625,-14.61796875],[125.94609374999999,-14.520410156250009],[126.02070312500001,-14.49453125],[126.0166015625,-14.371289062500011],[126.04482421875002,-14.283007812500003],[126.05361328125002,-14.216699218750009],[126.10087890624999,-14.184375],[126.111328125,-14.1140625],[126.07343750000001,-14.065527343750006],[126.05390625000001,-13.977246093750011],[126.11904296875002,-13.957714843750011],[126.18427734375001,-14.002050781250006],[126.22822265625001,-14.113378906250006],[126.25849609375001,-14.16357421875],[126.298828125,-14.13623046875],[126.32304687499999,-14.062109375],[126.40312,-14.018945312500009],[126.482421875,-14.07890625],[126.56972656250002,-14.1609375],[126.67910156250002,-14.08935546875],[126.78066406250002,-13.955175781250006],[126.76445312499999,-13.873046875],[126.77558593750001,-13.788476562500009],[126.90322265625002,-13.744140625],[127.00605468750001,-13.776757812500009],[127.09921875000003,-13.867382812500011],[127.29306640625003,-13.934765625000011],[127.45761718750003,-14.031445312500011],[127.53105468750005,-14.094628906250009],[127.6728515625,-14.195117187500003],[127.76347656250005,-14.299414062500006],[127.88759765625002,-14.48515625],[128.18046875000005,-14.711621093750011],[128.1994140625,-14.751757812500003],[128.15986328125,-14.827343750000011],[128.12441406250002,-14.924121093750003],[128.08046875000002,-15.087988281250006],[128.06943359375003,-15.329296875000011],[128.11171875000002,-15.31201171875],[128.15546875,-15.2255859375],[128.20175781250003,-15.243359375000011],[128.25468750000005,-15.298535156250011],[128.258984375,-15.24560546875],[128.22724609375,-15.213574218750011],[128.17294921875003,-15.102246093750011],[128.175,-15.043164062500011],[128.21835937500003,-14.995703125],[128.28515625,-14.938867187500009],[128.35820312500005,-14.901660156250003],[128.40322265625002,-14.869140625],[128.40986328125,-14.82890625],[128.47744140625002,-14.787988281250009],[128.57578125000003,-14.774511718750006],[128.63554687500005,-14.780957031250011],[129.05820312500003,-14.884375],[129.16513671875003,-14.987597656250003],[129.17519531250002,-15.115039062500003],[129.2158203125,-15.160253906250006],[129.23789062500003,-15.080175781250006],[129.23359375,-14.906054687500003],[129.267578125,-14.871484375],[129.38125,-14.8984375],[129.458984375,-14.933203125],[129.56708984375,-15.04736328125],[129.58769531250005,-15.103320312500003],[129.634765625,-15.139746093750006],[129.65029296875002,-15.086816406250009],[129.62822265625005,-15.011816406250006],[129.61269531250002,-14.925878906250006],[129.63710937500002,-14.850976562500009],[129.76347656250005,-14.845019531250003],[129.84873046875003,-14.82890625],[129.80839843750005,-14.799707031250009],[129.75351562500003,-14.78955078125],[129.66298828125002,-14.720898437500011],[129.6046875,-14.647070312500006],[129.69863281250002,-14.575292968750006],[129.69794921875,-14.557421875],[129.60791015625,-14.559667968750006],[129.48388671875,-14.48974609375],[129.37871093750005,-14.392480468750009],[129.4591796875,-14.213476562500006],[129.61962890625,-14.038378906250003],[129.70986328125002,-13.97998046875],[129.71835937500003,-13.9208984375],[129.76171875,-13.811914062500009],[129.7892578125,-13.719921875000011],[129.79716796875005,-13.6484375],[129.8388671875,-13.572949218750011],[129.93789062500002,-13.501660156250011],[130.07265625000002,-13.476171875],[130.1359375,-13.448339843750006],[130.19931640625003,-13.382617187500003],[130.259765625,-13.30224609375],[130.1349609375,-13.1455078125],[130.14531250000005,-13.059179687500006],[130.1681640625,-12.957421875],[130.31796875000003,-12.882910156250006],[130.39990234375,-12.687890625],[130.45419921875003,-12.65859375],[130.571875,-12.664355468750003],[130.61748046875005,-12.646875],[130.6095703125,-12.491308593750006],[130.62265625000003,-12.431054687500009],[130.67236328125,-12.406933593750011],[130.73613281250005,-12.427734375],[130.7765625,-12.495312500000011],[130.8673828125,-12.557812500000011],[130.89824218750005,-12.523632812500011],[130.88291015625003,-12.455078125],[130.87382812500005,-12.3671875],[130.95664062500003,-12.348242187500006],[131.0234375,-12.342871093750006],[131.03007812500005,-12.27109375],[131.01953125,-12.2138671875],[131.04570312500005,-12.189648437500011],[131.219921875,-12.177929687500011],[131.26542968750005,-12.119042968750009],[131.29160156250003,-12.06787109375],[131.31376953125005,-12.095898437500011],[131.34208984375005,-12.210058593750006],[131.43828125000005,-12.276953125],[131.72626953125,-12.278125],[131.88798828125005,-12.23193359375],[131.95673828125,-12.25927734375],[132.06406250000003,-12.28076171875],[132.18232421875,-12.226953125],[132.25322265625005,-12.18603515625],[132.3720703125,-12.239160156250009],[132.41103515625002,-12.295117187500011],[132.4416015625,-12.176367187500006],[132.51054687500005,-12.134863281250006],[132.58378906250005,-12.110253906250009],[132.67636718750003,-12.130078125000011],[132.71279296875002,-12.1234375],[132.63046875000003,-12.03515625],[132.63525390625,-11.9546875],[132.6298828125,-11.835839843750009],[132.6447265625,-11.727148437500006],[132.67421875000002,-11.649023437500006],[132.47519531250003,-11.491503906250003],[132.27792968750003,-11.467675781250009],[132.13359375000005,-11.500683593750011],[132.07285156250003,-11.474707031250006],[131.94462890625005,-11.348535156250009],[131.8224609375,-11.302441406250011],[131.81181640625005,-11.271386718750009],[131.96152343750003,-11.180859375000011],[132.0185546875,-11.196386718750006],[132.10576171875005,-11.281152343750009],[132.15546875,-11.311132812500006],[132.19775390625,-11.304980468750003],[132.225,-11.23876953125],[132.2626953125,-11.204003906250009],[132.333984375,-11.223535156250009],[132.55732421875,-11.366894531250011],[132.6828125,-11.505566406250011],[132.7470703125,-11.468945312500011],[132.85712890625,-11.39111328125],[132.96103515625003,-11.407324218750006],[133.02490234375,-11.452832031250011],[133.11435546875003,-11.621777343750011],[133.18525390625,-11.705664062500006],[133.35615234375,-11.728222656250011],[133.44316406250005,-11.760351562500006],[133.533203125,-11.816210937500003],[133.6544921875,-11.811328125],[133.90419921875002,-11.83203125],[134.13945312500005,-11.940136718750011],[134.23710937500005,-12.007714843750009],[134.35107421875,-12.02578125],[134.41738281250002,-12.052734375],[134.5380859375,-12.060839843750003],[134.73027343750005,-11.984375],[134.81640625,-12.0546875],[134.8546875,-12.1025390625],[135.02968750000002,-12.19375],[135.21796875,-12.2216796875],[135.35234375000005,-12.129199218750003],[135.54873046875002,-12.060644531250006],[135.685546875,-11.956152343750006],[135.78847656250002,-11.90703125],[135.88525390625,-11.821679687500009],[135.92246093750003,-11.82578125],[135.84355468750005,-11.905468750000011],[135.833984375,-11.95068359375],[135.89580078125005,-11.96953125],[135.88945312500005,-11.992773437500006],[135.80429687500003,-12.054785156250006],[135.70253906250002,-12.151562500000011],[135.70439453125005,-12.209863281250009],[135.74394531250005,-12.24169921875],[135.79082031250005,-12.2275390625],[135.857421875,-12.178515625],[135.93779296875005,-12.152148437500003],[136.00849609375,-12.19140625],[136.0314453125,-12.330859375],[136.08183593750005,-12.422460937500006],[136.19267578125005,-12.43515625],[136.26064453125002,-12.433789062500011],[136.32851562500002,-12.305566406250009],[136.29189453125002,-12.196386718750006],[136.24990234375002,-12.173046875000011],[136.27011718750003,-12.131640625],[136.443359375,-11.951464843750003],[136.540234375,-11.957617187500006],[136.60976562500002,-12.13359375],[136.71943359375,-12.226464843750009],[136.83642578125,-12.219140625],[136.8974609375,-12.243554687500009],[136.9474609375,-12.349902343750003],[136.53701171875002,-12.784277343750006],[136.5177734375,-12.8328125],[136.57304687500005,-12.91162109375],[136.59433593750003,-13.003808593750009],[136.46103515625003,-13.225195312500006],[136.41191406250005,-13.236132812500003],[136.36455078125005,-13.176367187500006],[136.294140625,-13.137988281250003],[136.23232421875002,-13.164941406250009],[136.16611328125003,-13.181054687500009],[135.92734375000003,-13.304296875],[135.92919921875,-13.62158203125],[135.98955078125005,-13.81015625],[135.95449218750002,-13.934863281250003],[135.88339843750003,-14.153125],[135.80634765625,-14.234179687500003],[135.74453125000002,-14.28662109375],[135.53886718750005,-14.5849609375],[135.47324218750003,-14.656640625],[135.40517578125002,-14.758203125],[135.42802734375005,-14.855664062500011],[135.4533203125,-14.923144531250003],[135.53076171875,-15.000390625],[135.83261718750003,-15.16015625],[135.96953125000005,-15.270214843750011],[136.20537109375005,-15.403417968750006],[136.25927734375,-15.495214843750006],[136.29140625000002,-15.570117187500003],[136.4619140625,-15.6552734375],[136.58359375000003,-15.70654296875],[136.61875,-15.693359375],[136.64414062500003,-15.675585937500003],[136.67460937500005,-15.675390625],[136.70488281250005,-15.685253906250011],[136.70009765625002,-15.751953125],[136.68671875,-15.788476562500009],[136.69814453125002,-15.8349609375],[136.78466796875,-15.894238281250011],[136.92265625000005,-15.892382812500003],[137.0021484375,-15.878320312500009],[137.08984375,-15.941308593750009],[137.1689453125,-15.982128906250011],[137.29931640625,-16.06630859375001],[137.5263671875,-16.167089843750006],[137.70371093750003,-16.233007812500006],[137.91289062500005,-16.4765625],[138.07158203125005,-16.616992187500003],[138.24501953125002,-16.718359375],[138.50566406250005,-16.78955078125],[138.62568359375,-16.77783203125],[138.8203125,-16.860644531250003],[139.00986328125003,-16.89931640625001],[139.1103515625,-17.0140625],[139.14453125,-17.10107421875],[139.15410156250005,-17.167773437500003],[139.24843750000002,-17.32861328125],[139.44052734375003,-17.38056640625001],[139.6896484375,-17.54072265625001],[139.89453125,-17.611328125],[139.94599609375,-17.653613281250003],[140.03583984375,-17.70263671875],[140.20966796875,-17.704394531250003],[140.51113281250002,-17.62451171875],[140.6484375,-17.54375],[140.83046875000002,-17.414453125],[140.91582031250005,-17.19257812500001],[140.966015625,-17.01455078125001],[141.21914062500002,-16.64619140625001],[141.29140625000002,-16.463476562500006],[141.3556640625,-16.22109375],[141.41191406250005,-16.06953125000001],[141.39316406250003,-15.9046875],[141.45156250000002,-15.605273437500003],[141.58144531250002,-15.195410156250006],[141.62548828125,-15.056640625],[141.603515625,-14.852734375000011],[141.52294921875,-14.470117187500009],[141.55898437500002,-14.337890625],[141.59433593750003,-14.15283203125],[141.53544921875005,-14.018652343750006],[141.4806640625,-13.9267578125],[141.47255859375002,-13.797558593750011],[141.5341796875,-13.553808593750006],[141.58876953125002,-13.425097656250003],[141.64541015625002,-13.259082031250003],[141.61357421875005,-12.943457031250006],[141.7345703125,-12.83349609375],[141.7822265625,-12.778710937500009],[141.87578125000005,-12.778222656250009],[141.92031250000002,-12.802929687500011],[141.92978515625003,-12.73984375],[141.89287109375005,-12.681347656250011],[141.87832031250002,-12.61328125],[141.85214843750003,-12.578710937500006],[141.79453125000003,-12.566601562500011],[141.74667968750003,-12.529394531250006],[141.677734375,-12.491406250000011],[141.68857421875003,-12.35107421875],[141.80576171875003,-12.080078125],[141.87050781250002,-11.9755859375],[141.91298828125002,-12.019238281250011],[141.9611328125,-12.054296875],[141.9677734375,-11.976269531250011],[141.95156250000002,-11.896191406250011],[142.04052734375,-11.631738281250009],[142.13896484375005,-11.273242187500003],[142.16835937500002,-10.946582031250003],[142.32646484375005,-10.884179687500009],[142.40683593750003,-10.80224609375],[142.45644531250002,-10.707324218750003],[142.54482421875002,-10.707324218750003],[142.60507812500003,-10.748242187500011],[142.5654296875,-10.819433593750006],[142.552734375,-10.874414062500009],[142.72304687500002,-11.010449218750011],[142.77968750000002,-11.115332031250006],[142.80332031250003,-11.213964843750006],[142.83681640625002,-11.306933593750003],[142.85292968750002,-11.432226562500006],[142.8505859375,-11.63232421875],[142.87255859375,-11.821386718750006],[142.93398437500002,-11.880761718750009],[142.9884765625,-11.919042968750006],[143.06640625,-11.924121093750003],[143.17890625,-11.954492187500009]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[178.28017578125002,-17.37197265625001],[178.28017578125002,-17.41621093750001],[178.30947265625002,-17.435351562500003],[178.33857421875,-17.4384765625],[178.41093750000005,-17.523046875],[178.52324218750005,-17.595800781250006],[178.59160156250005,-17.651464843750006],[178.595703125,-17.699023437500003],[178.57490234375,-17.749316406250003],[178.60380859375005,-17.83935546875],[178.61787109375,-17.93281250000001],[178.66767578125,-18.080859375],[178.59736328125,-18.108984375],[178.48671875000002,-18.1123046875],[178.4611328125,-18.138964843750003],[178.42343750000003,-18.12421875000001],[178.33154296875,-18.13525390625],[178.24375,-18.183984375],[178.16015625,-18.25019531250001],[178.06396484375,-18.250390625],[177.95546875000002,-18.2640625],[177.84707031250002,-18.2548828125],[177.77080078125005,-18.21953125],[177.63642578125,-18.18105468750001],[177.45732421875005,-18.148242187500003],[177.38320312500002,-18.120703125],[177.32138671875003,-18.07753906250001],[177.26347656250005,-17.96865234375001],[177.2548828125,-17.91494140625001],[177.26396484375005,-17.86347656250001],[177.31630859375002,-17.84609375],[177.36015625000005,-17.82001953125001],[177.36640625,-17.78603515625001],[177.3857421875,-17.762304687500006],[177.41093750000005,-17.753710937500003],[177.42324218750002,-17.7373046875],[177.40556640625005,-17.68212890625],[177.40068359375005,-17.631640625],[177.50449218750003,-17.53955078125],[177.61796875000005,-17.461035156250006],[177.81796875000003,-17.388476562500003],[177.94023437500005,-17.395117187500006],[178.12763671875,-17.33925781250001],[178.18759765625003,-17.31298828125],[178.24716796875003,-17.3291015625],[178.28017578125002,-17.37197265625001]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[164.20234375,-20.24609375],[164.31513671875,-20.308886718750003],[164.43593750000002,-20.2822265625],[164.5880859375,-20.381152343750003],[164.97568359375003,-20.68105468750001],[165.11191406250003,-20.74453125],[165.19179687500002,-20.768847656250003],[165.25234375000002,-20.81796875],[165.306640625,-20.887011718750003],[165.38056640625,-20.935839843750003],[165.4125,-20.98134765625001],[165.42050781250003,-21.042773437500003],[165.44716796875002,-21.08056640625],[165.58242187500002,-21.179980468750003],[165.66279296875,-21.2671875],[165.774609375,-21.31171875000001],[165.82285156250003,-21.36376953125],[165.88535156250003,-21.38916015625],[165.94951171875005,-21.4423828125],[166.0578125,-21.48388671875],[166.30332031250003,-21.63720703125],[166.49296875000005,-21.7828125],[166.5875,-21.872851562500003],[166.6896484375,-21.95302734375001],[166.82011718750005,-22.01699218750001],[166.9423828125,-22.090136718750003],[167.00429687500002,-22.261523437500003],[166.97031250000003,-22.322851562500006],[166.9,-22.353320312500003],[166.8349609375,-22.35546875],[166.77412109375,-22.37617187500001],[166.57060546875005,-22.26552734375001],[166.52216796875,-22.24921875000001],[166.46796875,-22.25605468750001],[166.4376953125,-22.231542968750006],[166.41640625000002,-22.19619140625001],[166.29228515625005,-22.155078125],[166.17666015625002,-22.089160156250003],[166.14316406250003,-22.04443359375],[166.12373046875,-21.98876953125],[166.09609375000002,-21.956640625],[165.93300781250002,-21.908007812500003],[165.8234375,-21.853808593750003],[165.74384765625,-21.77734375],[165.62021484375003,-21.72421875],[165.42763671875002,-21.615039062500003],[165.32861328125,-21.580078125],[165.24199218750005,-21.525488281250006],[165.01015625000002,-21.32685546875001],[164.92744140625,-21.28984375],[164.85527343750005,-21.2015625],[164.65566406250002,-20.99208984375001],[164.55947265625002,-20.905859375],[164.45468750000003,-20.8291015625],[164.37451171875,-20.7392578125],[164.31289062500002,-20.63271484375001],[164.16972656250005,-20.48017578125001],[164.15214843750005,-20.41494140625001],[164.15810546875002,-20.347949218750003],[164.12363281250003,-20.30488281250001],[164.06503906250003,-20.278613281250003],[164.0373046875,-20.23359375000001],[164.04052734375,-20.1728515625],[164.05966796875003,-20.14150390625001],[164.20234375,-20.24609375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[127.73271484375005,0.84814453125],[127.80537109375001,0.825927734375],[127.88105468750001,0.832128906249991],[127.91865234375001,0.876806640624991],[127.92910156250002,0.934716796874994],[127.96728515625,1.042578125],[128.05527343750003,1.115625],[128.11699218750005,1.127050781249991],[128.16074218750003,1.1578125],[128.153125,1.237890625],[128.157421875,1.316601562499997],[128.22246093750005,1.400634765625],[128.42412109375005,1.517529296874997],[128.5392578125,1.559228515624994],[128.68837890625002,1.572558593749989],[128.70517578125003,1.527734375],[128.68808593750003,1.463720703124991],[128.71689453125003,1.367285156249991],[128.70263671875,1.106396484374997],[128.66875,1.069433593749991],[128.51455078125002,0.979248046875],[128.34599609375005,0.907128906249994],[128.298828125,0.876806640624991],[128.25722656250002,0.804980468749989],[128.26064453125002,0.733789062499994],[128.39794921875,0.638818359374994],[128.61123046875002,0.549951171874994],[128.6552734375,0.508251953124997],[128.6837890625,0.4384765625],[128.6916015625,0.3603515625],[128.74326171875003,0.3232421875],[128.8154296875,0.305371093749997],[128.86328125,0.268359374999989],[128.899609375,0.216259765624997],[128.54042968750002,0.337890625],[128.446484375,0.391552734374997],[128.33281250000005,0.39794921875],[128.22060546875002,0.414257812499997],[128.10605468750003,0.460888671874997],[127.98310546875001,0.471875],[127.92441406250003,0.438085937499991],[127.9013671875,0.372265625],[127.88740234375001,0.29833984375],[127.91464843750003,0.206298828125],[127.91220703125003,0.150537109374994],[127.88896484375005,0.049511718749997],[127.97783203125005,-0.248339843750003],[128.08945312500003,-0.485253906250009],[128.25351562500003,-0.731640625000011],[128.33457031250003,-0.816308593750009],[128.42548828125,-0.892675781250006],[128.278125,-0.870019531250009],[128.2333984375,-0.787695312500006],[128.04638671875,-0.7060546875],[128.01083984375003,-0.657324218750006],[127.88896484375005,-0.423535156250011],[127.85332031250005,-0.3798828125],[127.74082031250003,-0.300390625],[127.69160156250001,-0.241894531250011],[127.6748046875,-0.162890625],[127.68740234375002,-0.079931640625006],[127.68134765625001,0.034863281249997],[127.68544921875002,0.149023437499991],[127.70869140625001,0.2880859375],[127.66865234375001,0.336767578124991],[127.6162109375,0.382910156249991],[127.55537109375001,0.489648437499994],[127.537109375,0.610888671874989],[127.54179687500005,0.6806640625],[127.56699218750003,0.742529296874991],[127.60068359375003,0.796044921874994],[127.60800781250003,0.848242187499991],[127.52041015625002,0.924023437499997],[127.42851562500005,1.139990234374991],[127.42031250000002,1.251953125],[127.537109375,1.467480468749997],[127.53466796875,1.572070312499989],[127.55791015625005,1.634228515624997],[127.57070312500002,1.700146484374997],[127.63173828125002,1.843701171874997],[127.7314453125,1.966113281249989],[127.89990234375,2.137353515624994],[127.96425781250002,2.174707031249994],[128.03642578125005,2.199023437499989],[128.04277343750005,2.157080078124991],[128.03125,2.119873046875],[127.90673828125,1.945654296874991],[127.89013671875,1.906298828124989],[127.88681640625003,1.832958984374997],[127.94648437500001,1.789648437499991],[128.0109375,1.701220703124989],[128.02373046875005,1.58349609375],[128.02587890625,1.458105468749991],[128.01171875,1.331738281249997],[127.98769531250002,1.289599609374989],[127.88535156250003,1.162792968749997],[127.65283203125,1.013867187499997],[127.63300781250001,0.977197265624994],[127.634375,0.936132812499991],[127.67744140625001,0.886572265624991],[127.73271484375005,0.84814453125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[69.18486328125002,-49.10957031250001],[69.26513671875,-49.11542968750001],[69.31425781250002,-49.10625],[69.53496093750002,-48.97431640625001],[69.5927734375,-48.97099609375002],[69.58730468750002,-49.07197265625001],[69.64404296875,-49.11738281250001],[69.572265625,-49.129003906250006],[69.43623046875001,-49.1240234375],[69.40507812500002,-49.181738281250006],[69.54238281250002,-49.25566406250002],[69.61074218750002,-49.26582031250001],[69.6666015625,-49.26494140625002],[69.77070312500001,-49.248144531250006],[69.85439453125002,-49.221582031249994],[69.983984375,-49.15986328125001],[70.06132812500002,-49.13603515625002],[70.20839843750002,-49.13496093750001],[70.28496093750002,-49.07646484375002],[70.32021484375002,-49.05859375],[70.40625,-49.061132812500006],[70.48427734375002,-49.083886718749994],[70.530859375,-49.13691406250001],[70.55546875000002,-49.20146484375002],[70.53681640625001,-49.265527343749994],[70.48505859375001,-49.32763671875],[70.38984375000001,-49.365625],[70.41142578125002,-49.41093750000002],[70.38613281250002,-49.433984375],[70.33837890625,-49.43525390625001],[70.29765625000002,-49.4248046875],[70.23779296875,-49.37158203125],[70.16582031250002,-49.34296875000001],[69.9931640625,-49.34492187500001],[69.915625,-49.348535156249994],[69.90214843750002,-49.389257812500006],[69.86113281250002,-49.420507812500006],[69.818359375,-49.43769531250001],[69.75996093750001,-49.43017578125],[69.74921875000001,-49.44755859375002],[69.7802734375,-49.490136718749994],[69.85595703125,-49.544042968750006],[69.98642578125,-49.581640625],[70.06289062500002,-49.58935546875],[70.07343750000001,-49.51777343750001],[70.16582031250002,-49.509375],[70.24775390625001,-49.530664062499994],[70.30712890625,-49.58349609375],[70.2587890625,-49.60078125000001],[70.21621093750002,-49.628808593749994],[70.20742187500002,-49.6650390625],[70.12431640625002,-49.70439453125002],[70.07509765625002,-49.70859375],[69.9189453125,-49.689355468749994],[69.82607421875002,-49.644921875],[69.80390625000001,-49.61357421875002],[69.7466796875,-49.60175781250001],[69.68203125000002,-49.6421875],[69.612890625,-49.650976562500006],[69.47763671875,-49.61738281250001],[69.35273437500001,-49.56318359375001],[69.27460937500001,-49.54277343750002],[69.153125,-49.5296875],[69.0859375,-49.652929687500006],[68.99296875000002,-49.704980468749994],[68.87265625,-49.709863281249994],[68.81474609375002,-49.699609375],[68.7828125,-49.651269531249994],[68.79121093750001,-49.599609375],[68.810546875,-49.550195312499994],[68.84833984375001,-49.499609375],[68.8720703125,-49.4443359375],[68.8619140625,-49.3921875],[68.81845703125,-49.35390625],[68.84140625,-49.28535156250001],[68.798828125,-49.23164062500001],[68.81357421875,-49.19208984375001],[68.8833984375,-49.164941406249994],[68.85380859375002,-49.14130859375001],[68.81669921875002,-49.13505859375002],[68.79013671875,-49.10371093750001],[68.76953125,-49.06591796875],[68.79658203125001,-48.994726562500006],[68.8369140625,-48.926171875],[68.83203125,-48.848730468750006],[68.90029296875002,-48.77558593750001],[68.95869140625001,-48.69384765625],[69.00244140625,-48.661230468750006],[69.0572265625,-48.65644531250001],[69.08125,-48.679296875],[69.09306640625002,-48.72392578125002],[69.07158203125002,-48.752832031249994],[69.12275390625001,-48.766015625],[69.13613281250002,-48.86103515625001],[69.1041015625,-48.89990234375],[69.09941406250002,-48.937597656250006],[69.03271484375,-49.017578125],[69.05214843750002,-49.081933593749994],[69.18486328125002,-49.10957031250001]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[63.37382812500002,80.70009765625],[63.187597656250006,80.697607421875],[63.00214843750001,80.712841796875],[62.76044921875001,80.7626953125],[62.52031250000002,80.821875],[62.59257812500002,80.85302734375],[62.8193359375,80.893798828125],[63.115820312500006,80.966796875],[63.61474609375,80.980908203125],[63.85595703125,80.98115234375],[64.095703125,80.99833984375],[64.16591796875002,81.0357421875],[64.21044921875,81.10634765625],[64.255859375,81.14443359375],[64.31015625,81.1751953125],[64.57539062500001,81.198486328125],[64.80205078125002,81.197265625],[65.02773437500002,81.169482421875],[65.17197265625,81.14404296875],[65.30976562500001,81.096435546875],[65.38203125000001,81.05673828125],[65.36005859375001,81.008203125],[65.3720703125,80.968017578125],[65.43740234375002,80.930712890625],[64.99746093750002,80.818896484375],[64.54833984375,80.755419921875],[63.37382812500002,80.70009765625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[57.95625,80.1232421875],[57.80009765625002,80.104052734375],[57.39228515625001,80.13916015625],[57.33232421875002,80.15810546875],[57.28144531250001,80.193896484375],[57.21406250000001,80.328271484375],[57.21171875000002,80.36845703125],[57.18623046875001,80.396240234375],[57.08339843750002,80.44521484375],[57.01113281250002,80.468310546875],[57.075,80.4939453125],[57.52197265625,80.475390625],[58.48046875,80.46474609375],[58.9716796875,80.415869140625],[59.11591796875001,80.388427734375],[59.25546875,80.343212890625],[58.39794921875,80.31875],[58.28388671875001,80.297802734375],[58.285742187500006,80.24814453125],[58.25546875,80.201806640625],[58.163183593750006,80.196533203125],[57.95625,80.1232421875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-25.432324218749983,70.921337890625],[-25.397216796875,70.862451171875],[-25.393652343749977,70.83466796875],[-25.4013671875,70.811279296875],[-25.420800781249994,70.794580078125],[-25.4677734375,70.7796875],[-25.380126953125,70.740576171875],[-25.351660156249977,70.714306640625],[-25.346337890624994,70.693310546875],[-25.402246093749994,70.652685546875],[-25.80058593749999,70.59892578125],[-25.911328124999983,70.573046875],[-26.049707031249994,70.509130859375],[-26.217871093749977,70.454052734375],[-26.273876953124983,70.454345703125],[-26.33916015624999,70.51142578125],[-26.604687499999983,70.553369140625],[-27.10478515624999,70.531494140625],[-27.690039062500006,70.478662109375],[-27.89799804687499,70.45400390625],[-28.003027343750006,70.467138671875],[-28.035253906250006,70.48681640625],[-28.036816406249983,70.51435546875],[-27.967529296875,70.59482421875],[-27.939550781250006,70.615283203125],[-27.805273437500006,70.642041015625],[-27.714208984375006,70.71279296875],[-27.743994140625006,70.78974609375],[-27.708935546874983,70.897119140625],[-27.61723632812499,70.91376953125],[-27.3875,70.875634765625],[-27.238867187500006,70.867578125],[-26.9755859375,70.8626953125],[-26.621777343749983,70.875634765625],[-26.33745117187499,70.91923828125],[-25.81889648437499,71.04365234375],[-25.726806640625,71.042041015625],[-25.660839843749983,70.99794921875],[-25.6123046875,70.976318359375],[-25.458251953125,70.942529296875],[-25.432324218749983,70.921337890625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[159.75039062500002,-9.272656250000011],[159.97060546875002,-9.433300781250011],[160.06533203125002,-9.418652343750011],[160.35458984375003,-9.421582031250011],[160.52519531250005,-9.536230468750006],[160.62548828125,-9.5888671875],[160.6818359375,-9.691601562500011],[160.75146484375,-9.715039062500011],[160.79433593750002,-9.767382812500003],[160.81894531250003,-9.86279296875],[160.80166015625002,-9.878320312500009],[160.7130859375,-9.913867187500003],[160.64921875000005,-9.928613281250009],[160.481640625,-9.894726562500011],[160.32109375000005,-9.8212890625],[160.00234375000002,-9.812402343750009],[159.8537109375,-9.79150390625],[159.802734375,-9.763476562500003],[159.75546875000003,-9.72607421875],[159.68046875000005,-9.636816406250006],[159.621875,-9.532128906250009],[159.6123046875,-9.470703125],[159.607421875,-9.353808593750003],[159.62558593750003,-9.311230468750011],[159.68632812500005,-9.268652343750006],[159.75039062500002,-9.272656250000011]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[117.31113281250003,8.439599609374994],[117.21855468749999,8.367285156249991],[117.228515625,8.456689453124994],[117.255859375,8.540966796874997],[117.34990234374999,8.713574218749997],[117.41777343749999,8.766650390624989],[117.52998046875001,8.902587890625],[117.59326171875,8.968310546874989],[117.74492187499999,9.098242187499991],[117.884765625,9.240673828124997],[117.93154296875002,9.251269531249989],[117.98300781250003,9.25341796875],[118.02382812500002,9.269775390625],[118.11484375000003,9.3466796875],[118.34394531250001,9.602783203125],[118.53339843750001,9.793652343749997],[118.7275390625,10.035009765624991],[118.82011718749999,10.105322265624991],[118.84511718750002,10.131298828124997],[119.02382812500002,10.353564453124989],[119.07988281249999,10.385839843749991],[119.14306640625,10.409277343749991],[119.18603515625,10.439453125],[119.22382812500001,10.477294921875],[119.28701171875002,10.574023437499989],[119.31269531250001,10.687109375],[119.29667968749999,10.7509765625],[119.26113281250002,10.845166015624997],[119.3056640625,10.9736328125],[119.34072265625002,11.032910156249997],[119.46533203125,11.293798828124991],[119.50126953124999,11.346435546875],[119.55332031250003,11.313525390624989],[119.56025390625001,11.266796875],[119.53457031250002,11.156835937499991],[119.53261718750002,11.101611328124989],[119.56191406250002,11.045507812499991],[119.52666015624999,10.953173828124989],[119.61611328125002,10.707373046874991],[119.68437,10.551708984374997],[119.68691406250002,10.500341796874991],[119.59521484375,10.407421875],[119.54052734375,10.379345703124997],[119.42246093750003,10.354394531249994],[119.36933593750001,10.327294921874994],[119.28476562500003,10.251708984375],[119.23193359375,10.152148437499989],[119.21855468749999,10.100683593749991],[119.19150390625003,10.061083984374989],[118.94863281250002,9.993457031249989],[118.83466796875001,9.949316406249991],[118.78212890625002,9.916113281249991],[118.75498046875003,9.862109374999989],[118.77382812500002,9.766796875],[118.56962890624999,9.422753906249994],[118.50449218750003,9.332666015624994],[118.43496093750002,9.256005859374994],[118.349609375,9.201464843749989],[118.22929687499999,9.16796875],[118.13408203124999,9.101367187499989],[118.06943359375003,8.983544921874994],[117.98955078124999,8.877099609374994],[117.88857421875002,8.798242187499994],[117.77978515625,8.728613281249991],[117.67988281250001,8.677832031249991],[117.57216796875002,8.641992187499994],[117.53964843750003,8.595605468749994],[117.5166015625,8.538330078125],[117.46914062500002,8.511376953124994],[117.4125,8.495849609375],[117.31113281250003,8.439599609374994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[122.49619140625003,11.615087890624991],[122.61269531250002,11.564160156249997],[122.72626953125001,11.60791015625],[122.83808593750001,11.595654296874997],[122.93125,11.529296875],[122.90078125000002,11.487353515624989],[122.89453125,11.441308593749994],[123.10273437500001,11.541455078124997],[123.15830078125003,11.535546875],[123.15644531250001,11.442529296874994],[123.14414062500003,11.363574218749989],[123.11953125000002,11.286816406249997],[123.07548828124999,11.196875],[123.01650390625002,11.116503906249989],[122.93876953124999,11.058154296874989],[122.8466796875,11.0224609375],[122.80292968750001,10.990039062499989],[122.78945312500002,10.941210937499989],[122.79111328125003,10.879736328124991],[122.76992187500002,10.823828125],[122.67314453124999,10.800927734374994],[122.52207031250003,10.69189453125],[122.19765625000002,10.622900390624991],[122.10859375000001,10.575537109374991],[122.0517578125,10.5140625],[121.98837890625003,10.458300781249989],[121.95400390625002,10.444384765624989],[121.93828124999999,10.470898437499997],[121.93378906250001,10.49365234375],[121.98007812500003,10.638574218749994],[121.97236328125001,10.698876953124994],[121.95029296875003,10.757373046874989],[121.96435546875,10.871679687499991],[122.02070312500001,10.979101562499991],[122.05087890625003,11.097363281249997],[122.05966796875003,11.32568359375],[122.103515625,11.642919921874991],[122.10136718749999,11.680859375],[122.06699218750003,11.723730468749991],[121.94082031250002,11.75830078125],[121.89121093750003,11.790869140624991],[121.916015625,11.854345703124991],[121.96367187499999,11.897363281249994],[122.02919921875002,11.895410156249994],[122.08681640625002,11.855078125],[122.29072265625001,11.772021484374989],[122.39921874999999,11.702197265624989],[122.49619140625003,11.615087890624991]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[123.130859375,9.064111328124994],[123.06464843750001,9.053369140624994],[122.99472656250003,9.058837890625],[122.94785156250003,9.107958984374989],[122.86660156250002,9.31982421875],[122.7724609375,9.371337890625],[122.66455078125,9.410351562499997],[122.6103515625,9.443212890624991],[122.5625,9.4828125],[122.41093749999999,9.693896484374989],[122.39951171875003,9.823046874999989],[122.42558593749999,9.89609375],[122.47148437499999,9.961523437499991],[122.52324218749999,9.979199218749997],[122.64824218749999,9.981542968749991],[122.71298828125003,9.990136718749994],[122.85556640625003,10.0869140625],[122.86582031250003,10.125],[122.86650390624999,10.284033203124991],[122.85234374999999,10.395263671875],[122.81699218750003,10.503808593749994],[122.85556640625003,10.553417968749997],[122.90585937500003,10.6025390625],[122.95839843750002,10.698339843749991],[122.96875,10.765722656249991],[122.9697265625,10.836181640625],[122.98330078125002,10.886621093749994],[123.0244140625,10.911816406249997],[123.22177734375003,10.988671875],[123.25664062499999,10.993945312499989],[123.51064453125002,10.923046875],[123.5625,10.816064453124994],[123.56757812500001,10.78076171875],[123.52773437500002,10.662011718749994],[123.49287109375001,10.582324218749989],[123.40693359375001,10.458984375],[123.34355468749999,10.325390625],[123.29609375000001,10.12451171875],[123.26621093750003,10.059033203124997],[123.18662109375003,9.933300781249997],[123.16201171875002,9.8642578125],[123.16269531250003,9.714648437499989],[123.1494140625,9.659326171874994],[123.14980468750002,9.606152343749997],[123.30839843749999,9.356982421874989],[123.321875,9.317480468749991],[123.32050781250001,9.27294921875],[123.29335937500002,9.21728515625],[123.22871093750001,9.121386718749989],[123.19248046875003,9.087890625],[123.130859375,9.064111328124994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[124.57460937500002,11.343066406249989],[124.64433593749999,11.30810546875],[124.72431640625001,11.322070312499989],[124.82109374999999,11.401416015624989],[124.92998046874999,11.372851562499989],[124.99394531249999,11.255908203124989],[125.02656250000001,11.211718749999989],[125.04433593750002,11.13525390625],[125.03974609375001,10.951904296875],[125.01318359375,10.785693359374989],[125.03378906250003,10.75146484375],[125.08388671875002,10.721582031249994],[125.12753906250003,10.684716796874994],[125.16416015625003,10.637451171875],[125.18769531250001,10.584863281249994],[125.19716796875002,10.457226562499997],[125.26005859374999,10.349609375],[125.26845703125002,10.307714843749991],[125.25332031250002,10.263818359374994],[125.1484375,10.272412109374997],[125.14003906250002,10.2353515625],[125.142578125,10.189453125],[125.10537109375002,10.218310546874989],[125.0439453125,10.3234375],[124.9875,10.367578125],[125.0048828125,10.197070312499989],[125.02353515625003,10.115283203124989],[125.02656250000001,10.033105468749994],[124.92910156250002,10.095898437499997],[124.81279296874999,10.134619140624991],[124.78076171875,10.168066406249991],[124.79169921875001,10.274560546874994],[124.78955078125,10.327539062499994],[124.73769531250002,10.439746093749989],[124.79863281249999,10.682226562499991],[124.79716796874999,10.731787109374991],[124.78671875000003,10.781396484374994],[124.73867187500002,10.879736328124991],[124.66269531250003,10.961962890624989],[124.61611328125002,10.962207031249989],[124.50283203125002,10.904443359374994],[124.44550781250001,10.923583984375],[124.41171875000003,11.150341796874997],[124.36601562499999,11.370703125],[124.33095703125002,11.427099609374991],[124.30820312500003,11.486181640624991],[124.33066406250003,11.535205078124989],[124.37412109375003,11.514990234374991],[124.43593750000002,11.457226562499997],[124.51093750000001,11.423876953124989],[124.54824218750002,11.39501953125],[124.57460937500002,11.343066406249989]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[125.23955078124999,12.527880859374989],[125.31035156249999,12.4462890625],[125.32753906250002,12.38720703125],[125.32021484375002,12.321826171874989],[125.35224609375001,12.292773437499989],[125.40878906250003,12.284863281249997],[125.48125,12.251953125],[125.53564453125,12.19140625],[125.50332031250002,12.135791015624989],[125.51337890625001,12.054589843749994],[125.45654296875,11.952539062499994],[125.46425781250002,11.771582031249991],[125.49687,11.713769531249994],[125.5,11.655419921874994],[125.49179687500003,11.594335937499991],[125.50576171875002,11.544238281249989],[125.59296875000001,11.378222656249989],[125.60898437500003,11.323046874999989],[125.58232421874999,11.279492187499997],[125.57353515624999,11.238232421874997],[125.62734375000002,11.23388671875],[125.70400390625002,11.164794921875],[125.74912109375003,11.073583984374991],[125.73564453124999,11.049609374999989],[125.67441406250003,11.120800781249997],[125.628125,11.13203125],[125.43183593750001,11.112597656249989],[125.3115234375,11.142285156249997],[125.2333984375,11.145068359374989],[125.15585937500003,11.267041015624997],[125.087890625,11.287353515625],[125.03427734375003,11.341259765624997],[124.9453125,11.479150390624994],[124.9169921875,11.558398437499989],[124.97890625000002,11.638476562499989],[124.99824218750001,11.70234375],[124.99501953125002,11.764941406249989],[124.93564453125003,11.754638671875],[124.88427734375,11.775488281249991],[124.82109374999999,11.852099609374989],[124.79580078125002,11.896337890624991],[124.74980468749999,11.933349609375],[124.6767578125,12.020898437499994],[124.571875,12.055126953124997],[124.52910156249999,12.079199218749991],[124.44570312500002,12.152783203124997],[124.38486328125003,12.243994140624991],[124.32578125000003,12.40380859375],[124.29472656249999,12.5693359375],[124.56582031250002,12.526220703124991],[124.84013671874999,12.534570312499994],[125.15019531249999,12.572558593749989],[125.23955078124999,12.527880859374989]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[120.70439453124999,13.4794921875],[120.75537109375,13.470996093750003],[120.91533203124999,13.501074218749991],[120.98076171874999,13.485986328124994],[121.02470703124999,13.4287109375],[121.07929687500001,13.410742187499991],[121.12246093750002,13.38125],[121.20273437500003,13.432324218749997],[121.284375,13.374121093749991],[121.35683593750002,13.265478515624991],[121.44218749999999,13.188427734374997],[121.52275390624999,13.131201171874991],[121.53867187500003,13.0888671875],[121.48974609375,13.019580078124989],[121.47480468750001,12.931591796874997],[121.47968750000001,12.837109375],[121.540625,12.63818359375],[121.51923828125001,12.584228515625],[121.4580078125,12.507958984374994],[121.41230468750001,12.423046875],[121.41816406250001,12.388769531249991],[121.40009765625001,12.360742187499994],[121.39433593749999,12.300585937499989],[121.35683593750002,12.313085937499991],[121.32236328125003,12.303613281249994],[121.28886718749999,12.276708984374991],[121.23671875000002,12.218798828124989],[121.15546875000001,12.236328125],[121.11699218749999,12.25341796875],[121.10761718750001,12.303613281249994],[121.08339843750002,12.338964843749991],[121.04853515625001,12.359960937499991],[120.9625,12.446533203125],[120.92216796874999,12.511621093749994],[120.92148437500003,12.581103515624989],[120.8994140625,12.645849609374991],[120.85478515624999,12.703662109374989],[120.79599609375003,12.747998046874997],[120.7763671875,12.790576171874989],[120.76875,12.840917968749991],[120.763671875,12.969824218749991],[120.68027343750003,13.130615234375],[120.6513671875,13.169140625],[120.57314453125002,13.208886718749994],[120.50830078125,13.260058593750003],[120.48066406250001,13.31103515625],[120.45546875000002,13.393505859374997],[120.43808593750003,13.405419921874994],[120.3875,13.401660156250003],[120.33847656250003,13.412353515625],[120.35273437500001,13.472949218750003],[120.40126953125002,13.517041015624997],[120.46835937500003,13.522412109374997],[120.6533203125,13.497607421875003],[120.70439453124999,13.4794921875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[155.95761718750003,-6.686816406250003],[155.93320312500003,-6.780468750000011],[155.91494140625002,-6.796679687500003],[155.89189453125005,-6.761523437500003],[155.80498046875005,-6.795605468750011],[155.76347656250005,-6.834375],[155.71933593750003,-6.86279296875],[155.6173828125,-6.85595703125],[155.52089843750002,-6.830273437500011],[155.42734375000003,-6.78271484375],[155.34404296875005,-6.7216796875],[155.26054687500005,-6.626074218750006],[155.20859375000003,-6.52685546875],[155.23447265625003,-6.41162109375],[155.2021484375,-6.3076171875],[155.04462890625,-6.233691406250003],[155.01015625000002,-6.209765625],[154.94023437500005,-6.106152343750011],[154.8703125,-6.061425781250009],[154.78193359375,-5.970703125],[154.75927734375,-5.931347656250011],[154.72109375000002,-5.816503906250006],[154.708984375,-5.7470703125],[154.74111328125002,-5.5453125],[154.72929687500005,-5.444433593750006],[154.77265625,-5.4541015625],[154.81845703125003,-5.494042968750009],[154.87050781250002,-5.521386718750009],[154.9970703125,-5.539941406250009],[155.09384765625003,-5.620214843750006],[155.18671875,-5.776953125],[155.19785156250003,-5.828320312500011],[155.2275390625,-5.865234375],[155.32304687500005,-5.931738281250006],[155.37255859375,-5.974414062500003],[155.4669921875,-6.145117187500006],[155.51933593750005,-6.181542968750009],[155.5810546875,-6.196191406250009],[155.63847656250005,-6.220800781250006],[155.73417968750005,-6.295703125],[155.82255859375005,-6.38046875],[155.88222656250002,-6.469628906250009],[155.92763671875002,-6.565039062500006],[155.95761718750003,-6.686816406250003]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[152.9658203125,-4.75634765625],[152.89169921875003,-4.832421875],[152.84560546875002,-4.761523437500003],[152.78652343750002,-4.699414062500011],[152.73994140625,-4.635839843750006],[152.6806640625,-4.4984375],[152.677734375,-4.42919921875],[152.693359375,-4.35595703125],[152.69677734375,-4.28203125],[152.6681640625,-4.1318359375],[152.59843750000005,-3.994824218750011],[152.35576171875005,-3.668164062500011],[152.27939453125003,-3.582421875],[152.19218750000005,-3.505859375],[152.13632812500003,-3.487109375],[152.02324218750005,-3.46875],[151.97294921875005,-3.453417968750003],[151.87978515625002,-3.400097656250011],[151.7931640625,-3.337890625],[151.57851562500002,-3.153515625000011],[151.4650390625,-3.101367187500003],[151.40507812500005,-3.036914062500003],[151.06679687500002,-2.829003906250009],[150.96806640625005,-2.779882812500006],[150.8478515625,-2.77978515625],[150.74609375,-2.738867187500006],[150.82646484375005,-2.712890625],[150.84296875,-2.6435546875],[150.825390625,-2.572949218750011],[150.9953125,-2.68828125],[151.17460937500005,-2.7890625],[151.22646484375002,-2.870312500000011],[151.31474609375005,-2.875292968750003],[151.47539062500005,-2.942480468750006],[151.58574218750005,-3.003027343750006],[151.68984375000002,-3.072851562500006],[151.80712890625,-3.1728515625],[152.03291015625,-3.251367187500009],[152.06503906250003,-3.279882812500006],[152.17939453125,-3.410351562500011],[152.32949218750002,-3.52099609375],[152.38046875000003,-3.581933593750009],[153.016796875,-4.105664062500011],[153.12421875,-4.25234375],[153.13251953125,-4.352441406250009],[153.1115234375,-4.391699218750006],[153.04433593750002,-4.476367187500003],[153.04560546875,-4.576367187500011],[153.02324218750005,-4.666308593750003],[152.9658203125,-4.75634765625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[138.5353515625,-8.273632812500011],[138.29628906250002,-8.405175781250009],[137.98281250000002,-8.381933593750006],[137.871875,-8.3796875],[137.6876953125,-8.41171875],[137.650390625,-8.386132812500009],[137.68515625000003,-8.26220703125],[137.83251953125,-7.932226562500006],[138.00751953125,-7.6416015625],[138.08183593750005,-7.566210937500003],[138.18535156250005,-7.495312500000011],[138.29550781250003,-7.4384765625],[138.54384765625002,-7.379589843750011],[138.76982421875005,-7.390429687500003],[138.801953125,-7.414648437500006],[138.8994140625,-7.511621093750009],[138.96259765625,-7.587988281250006],[138.98906250000005,-7.69609375],[138.89296875000002,-7.882128906250003],[138.78593750000005,-8.05908203125],[138.61171875000002,-8.198339843750006],[138.5353515625,-8.273632812500011]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[129.75468750000005,-2.865820312500006],[129.984375,-2.976660156250006],[130.10341796875002,-2.99296875],[130.30361328125002,-2.978515625],[130.3791015625,-2.989355468750006],[130.56992187500003,-3.130859375],[130.62558593750003,-3.22802734375],[130.64169921875003,-3.311914062500009],[130.67109375,-3.391503906250009],[130.71806640625005,-3.411328125000011],[130.7734375,-3.41875],[130.84560546875002,-3.533300781250006],[130.85996093750003,-3.5703125],[130.80507812500002,-3.857714843750003],[130.58037109375005,-3.748828125],[130.36308593750005,-3.625195312500011],[130.2697265625,-3.579296875000011],[130.01953125,-3.474707031250006],[129.98115234375,-3.438867187500009],[129.953125,-3.3916015625],[129.84414062500002,-3.3271484375],[129.62666015625,-3.3171875],[129.54501953125003,-3.31884765625],[129.51171875,-3.328515625],[129.52041015625002,-3.363183593750009],[129.5216796875,-3.433691406250006],[129.46767578125002,-3.453222656250006],[129.33281250000005,-3.40869140625],[129.212109375,-3.392675781250006],[129.1076171875,-3.34921875],[128.96748046875,-3.326074218750009],[128.95205078125002,-3.30419921875],[128.9640625,-3.271679687500011],[128.95781250000005,-3.241113281250009],[128.92539062500003,-3.229296875],[128.8625,-3.234960937500006],[128.8017578125,-3.265625],[128.75126953125005,-3.300488281250011],[128.676953125,-3.396582031250006],[128.63896484375005,-3.433398437500003],[128.5166015625,-3.449121093750009],[128.46591796875003,-3.43984375],[128.41923828125005,-3.416015625],[128.27998046875,-3.240527343750003],[128.23300781250003,-3.20263671875],[128.1806640625,-3.171679687500003],[128.13203125,-3.157421875000011],[128.08212890625003,-3.18408203125],[128.05576171875003,-3.238574218750003],[128.0439453125,-3.303320312500006],[128.03007812500005,-3.340527343750011],[127.97001953125005,-3.4443359375],[127.92041015625,-3.506054687500011],[127.90234375,-3.496289062500011],[127.92783203125003,-3.397265625],[127.92792968750001,-3.34140625],[127.89716796875001,-3.282324218750006],[127.8779296875,-3.222070312500009],[128.11337890625003,-2.9345703125],[128.19853515625005,-2.865917968750011],[128.56982421875,-2.8421875],[128.79052734375,-2.856640625000011],[128.91074218750003,-2.849609375],[128.99111328125002,-2.828515625],[129.05771484375003,-2.838476562500006],[129.07431640625003,-2.895117187500006],[129.11630859375003,-2.93701171875],[129.17441406250003,-2.933496093750009],[129.27958984375005,-2.8890625],[129.37109375,-2.820507812500011],[129.42734375000003,-2.790722656250011],[129.48417968750005,-2.785742187500006],[129.54296875,-2.790332031250003],[129.60048828125002,-2.80615234375],[129.75468750000005,-2.865820312500006]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[126.86113281249999,-3.087890625],[127.02548828125003,-3.166015625],[127.06289062500002,-3.216992187500011],[127.09238281250003,-3.277539062500011],[127.12470703125001,-3.310839843750003],[127.16347656250002,-3.338085937500011],[127.22734375000005,-3.391015625],[127.24423828125003,-3.47109375],[127.22958984375003,-3.633007812500011],[127.15517578125002,-3.647265625],[127.08505859375003,-3.6708984375],[126.94091796875,-3.764550781250009],[126.86992187499999,-3.782910156250011],[126.79414062500001,-3.789160156250006],[126.74033203125003,-3.813671875000011],[126.68632812499999,-3.823632812500009],[126.54667968749999,-3.771679687500011],[126.4111328125,-3.710644531250011],[126.21455078125001,-3.605175781250011],[126.17832031250003,-3.579394531250003],[126.14667968750001,-3.522753906250003],[126.05654296875002,-3.420996093750006],[126.03398437499999,-3.355859375],[126.02646484375003,-3.170507812500006],[126.05009765624999,-3.128125],[126.08828125000002,-3.10546875],[126.21962890625002,-3.148144531250011],[126.30625,-3.103222656250011],[126.55507812500002,-3.065234375],[126.80830078125001,-3.069140625],[126.86113281249999,-3.087890625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[122.78291015625001,-8.61171875],[122.64150390625002,-8.647265625],[122.55380859375003,-8.680957031250003],[122.47021484375,-8.725488281250009],[122.41728515624999,-8.734667968750003],[122.32148437500001,-8.73828125],[122.18574218750001,-8.730273437500003],[122.09414062500002,-8.744726562500006],[121.83867187499999,-8.8603515625],[121.73828125,-8.870410156250003],[121.6513671875,-8.898730468750003],[121.62128906250001,-8.853808593750003],[121.58457031250003,-8.820605468750003],[121.49960937500003,-8.812207031250011],[121.41464843750003,-8.81484375],[121.32832031250001,-8.916894531250009],[121.19082031250002,-8.8955078125],[121.1375,-8.904492187500011],[121.08613281250001,-8.925976562500011],[121.03525390625003,-8.935449218750009],[120.98183593750002,-8.928320312500006],[120.78095703125001,-8.848828125000011],[120.55048828125001,-8.801855468750006],[120.31953125000001,-8.8203125],[120.12089843749999,-8.776953125],[120.01210937500002,-8.81015625],[119.909375,-8.857617187500011],[119.87910156250001,-8.8076171875],[119.84140625000003,-8.763574218750009],[119.80791015624999,-8.69765625],[119.80703125000002,-8.622949218750009],[119.81816406249999,-8.570507812500011],[119.84765625,-8.522851562500009],[119.86611328125002,-8.47314453125],[119.87480468749999,-8.419824218750009],[119.91826171874999,-8.445117187500003],[119.96376953125002,-8.435546875],[120.09921875000003,-8.377539062500006],[120.23115234375001,-8.28984375],[120.35410156250003,-8.2578125],[120.42490234375003,-8.248925781250009],[120.48554687500001,-8.26611328125],[120.54716796874999,-8.259863281250006],[120.61025390625002,-8.240429687500011],[120.70957031250003,-8.307812500000011],[120.75136718750002,-8.321484375000011],[120.88613281250002,-8.32666015625],[121.00869140625002,-8.365527343750003],[121.1181640625,-8.423535156250011],[121.27666015624999,-8.477929687500009],[121.37197265625002,-8.550878906250006],[121.44453125000001,-8.577832031250011],[121.49843750000002,-8.585156250000011],[121.54794921875003,-8.575292968750006],[121.6103515625,-8.526171875],[121.68339843749999,-8.505859375],[121.7470703125,-8.506640625],[121.86289062500003,-8.493945312500003],[121.91171875000003,-8.482128906250011],[121.96650390625001,-8.455175781250006],[122.02011718750003,-8.471875],[122.06708984375001,-8.496679687500006],[122.26308593750002,-8.624902343750009],[122.3232421875,-8.628320312500009],[122.43349609375002,-8.600781250000011],[122.46660156249999,-8.56640625],[122.48359375000001,-8.513574218750009],[122.51376953125003,-8.469628906250009],[122.55585937500001,-8.431542968750009],[122.603515625,-8.402441406250006],[122.75,-8.353125],[122.85048828125002,-8.304394531250011],[122.91914062500001,-8.221875],[122.75859374999999,-8.1859375],[122.79238281250002,-8.1265625],[122.845703125,-8.09326171875],[122.9169921875,-8.105566406250006],[122.97832031249999,-8.151953125],[123.00595703125003,-8.3291015625],[122.95546875000002,-8.354101562500006],[122.92363281249999,-8.380957031250006],[122.90214843749999,-8.416308593750003],[122.81113281250003,-8.481152343750011],[122.84677734375003,-8.562207031250011],[122.82001953125001,-8.595703125],[122.78291015625001,-8.61171875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[120.0125,-9.374707031250011],[120.0576171875,-9.419726562500003],[120.22109375000002,-9.50634765625],[120.248046875,-9.542871093750009],[120.25830078125,-9.603125],[120.29111328125003,-9.647851562500009],[120.36474609375,-9.6546875],[120.44365234374999,-9.645605468750006],[120.50371093749999,-9.674023437500011],[120.55556640625002,-9.719042968750003],[120.63261718749999,-9.806445312500003],[120.70039062500001,-9.903125],[120.78447265624999,-9.95703125],[120.83261718750003,-10.0375],[120.80419921875,-10.108496093750006],[120.69804687499999,-10.206640625],[120.64042968749999,-10.227929687500009],[120.56171875000001,-10.235644531250003],[120.43916015625001,-10.294042968750006],[120.39453125,-10.263476562500003],[120.25546875000003,-10.242285156250006],[120.14482421874999,-10.200097656250009],[120.05195312500001,-10.122851562500003],[119.99843750000002,-10.039746093750011],[119.9306640625,-9.966503906250011],[119.81279296874999,-9.91748046875],[119.60107421875,-9.773535156250006],[119.47031250000003,-9.760546875],[119.41650390625,-9.77109375],[119.36259765624999,-9.771777343750003],[119.08544921875,-9.706933593750009],[119.04238281250002,-9.669042968750006],[119.00839843750003,-9.620507812500009],[118.97734374999999,-9.572851562500006],[118.95878906249999,-9.519335937500003],[118.994140625,-9.472070312500009],[119.03144531250001,-9.440234375],[119.18564453125003,-9.384472656250011],[119.2958984375,-9.3671875],[119.42392578125003,-9.369824218750011],[119.61474609375,-9.352441406250009],[119.79511718750001,-9.38046875],[119.85078125000001,-9.359570312500011],[119.94208984375001,-9.301464843750011],[119.97382812500001,-9.321582031250003],[120.0125,-9.374707031250011]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[118.24238281250001,-8.317773437500009],[118.29238281250002,-8.357226562500003],[118.337890625,-8.353515625],[118.43320312500003,-8.293261718750003],[118.490625,-8.271484375],[118.55214843750002,-8.270410156250009],[118.61191406250003,-8.280664062500009],[118.67060546875001,-8.323437500000011],[118.69179687500002,-8.393457031250009],[118.7138671875,-8.414941406250009],[118.74833984374999,-8.331152343750006],[118.79423828124999,-8.305859375000011],[118.845703125,-8.293066406250006],[118.92617187500002,-8.29765625],[118.98779296875,-8.337695312500003],[119.04384765625002,-8.456738281250011],[119.04208984375003,-8.5609375],[119.0625,-8.599804687500011],[119.10107421875,-8.628222656250003],[119.12968749999999,-8.668164062500011],[119.10419921875001,-8.7099609375],[119.07890624999999,-8.73046875],[119.00625,-8.749609375],[118.97148437499999,-8.7412109375],[118.93935546875002,-8.713085937500011],[118.9033203125,-8.702734375],[118.82119140625002,-8.712109375000011],[118.74589843749999,-8.735449218750006],[118.75625,-8.773632812500011],[118.81806640625001,-8.790820312500003],[118.83671874999999,-8.808886718750003],[118.83261718750003,-8.833398437500009],[118.80830078125001,-8.83828125],[118.72792968750002,-8.805273437500006],[118.67363281249999,-8.811914062500009],[118.47861328125003,-8.8564453125],[118.42695312500001,-8.85546875],[118.39785156250002,-8.813378906250009],[118.39990234375,-8.703710937500006],[118.37890625,-8.674609375],[118.23398437500003,-8.807812500000011],[118.18994140625,-8.840527343750011],[118.13154296875001,-8.85595703125],[118.07070312500002,-8.8505859375],[117.86123046875002,-8.931445312500003],[117.79541015625,-8.920117187500011],[117.73164062500001,-8.919921875],[117.50791015625003,-9.007519531250011],[117.38789062500001,-9.031933593750011],[117.32636718750001,-9.03369140625],[117.26503906250002,-9.026171875],[117.21025390624999,-9.034082031250009],[117.16123046875003,-9.069238281250009],[117.06132812499999,-9.099023437500009],[116.95820312500001,-9.076367187500011],[116.87109375,-9.046191406250003],[116.78847656250002,-9.00634765625],[116.76796875000002,-8.95546875],[116.77207031250003,-8.894335937500003],[116.80693359374999,-8.8109375],[116.78310546875002,-8.664648437500006],[116.80126953125,-8.597949218750003],[116.83505859375003,-8.532421875000011],[116.88623046875,-8.50830078125],[116.953125,-8.50341796875],[117.06367187500001,-8.444433593750006],[117.16484374999999,-8.3671875],[117.2236328125,-8.37451171875],[117.35664062500001,-8.428515625],[117.4345703125,-8.434960937500009],[117.56708984375001,-8.426367187500006],[117.62177734375001,-8.459570312500006],[117.64335937499999,-8.535546875],[117.6728515625,-8.56328125],[117.71210937500001,-8.582617187500006],[117.80605468750002,-8.711132812500011],[117.89316406250003,-8.704394531250003],[117.96953124999999,-8.72802734375],[118.10410156250003,-8.650292968750009],[118.20595703125002,-8.652148437500003],[118.23486328125,-8.591894531250006],[118.17402343750001,-8.527539062500011],[118.10048828125002,-8.475195312500006],[118.06103515625,-8.464257812500009],[118.01787109374999,-8.467382812500006],[117.97910156250003,-8.458886718750009],[117.81484375000002,-8.342089843750003],[117.76640624999999,-8.279003906250011],[117.73837890625003,-8.20458984375],[117.75527343750002,-8.149511718750006],[117.86826171875003,-8.100878906250003],[117.92099609375003,-8.089062500000011],[118.11748046874999,-8.122265625000011],[118.15068359374999,-8.15],[118.20283203125001,-8.267285156250011],[118.24238281250001,-8.317773437500009]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[116.64082031250001,-8.613867187500006],[116.51425781250003,-8.820996093750011],[116.55937,-8.854394531250009],[116.58652343750003,-8.886132812500009],[116.37724609374999,-8.929003906250003],[116.28984374999999,-8.906152343750009],[116.23935546875003,-8.912109375],[116.02675781250002,-8.873144531250006],[115.87460937500003,-8.825585937500009],[115.85732421875002,-8.787890625],[115.86933593750001,-8.742773437500006],[115.91445312500002,-8.758007812500011],[116.03164062500002,-8.765234375],[116.07646484374999,-8.744921875],[116.07773437500003,-8.611328125],[116.06113281250003,-8.437402343750009],[116.21982421875003,-8.295214843750003],[116.30429687500003,-8.237988281250011],[116.40156250000001,-8.204199218750006],[116.64697265625,-8.28271484375],[116.6875,-8.304101562500009],[116.71894531250001,-8.336035156250006],[116.73408203125001,-8.386914062500011],[116.64082031250001,-8.613867187500006]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[115.44785156250003,-8.155175781250009],[115.54941406250003,-8.208300781250003],[115.69091796875,-8.363574218750003],[115.70429687500001,-8.407128906250009],[115.66142578124999,-8.4482421875],[115.55996093750002,-8.51416015625],[115.33378906249999,-8.61572265625],[115.29501953125003,-8.663671875],[115.24716796875003,-8.757519531250011],[115.23613281249999,-8.797558593750011],[115.22021484375,-8.819531250000011],[115.19423828125002,-8.83544921875],[115.14492187500002,-8.849023437500009],[115.09150390625001,-8.829394531250003],[115.13974609375003,-8.768945312500009],[115.1416015625,-8.696875],[115.10566406250001,-8.629492187500006],[115.05507812500002,-8.573046875],[114.95205078125002,-8.496386718750003],[114.84208984374999,-8.428515625],[114.73134765625002,-8.393945312500009],[114.61318359375002,-8.378320312500009],[114.57089843750003,-8.345410156250011],[114.50175781249999,-8.260839843750006],[114.47890625000002,-8.214746093750009],[114.46757812499999,-8.166308593750003],[114.47529296875001,-8.119433593750003],[114.50429687500002,-8.116601562500009],[114.62001953125002,-8.127734375],[114.8330078125,-8.1826171875],[114.9384765625,-8.187109375],[114.99814453125003,-8.174414062500006],[115.15400390625001,-8.065722656250003],[115.19101562500003,-8.067480468750006],[115.34023437500002,-8.115429687500011],[115.44785156250003,-8.155175781250009]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[106.04570312499999,-1.66943359375],[106.080078125,-1.73828125],[106.12714843750001,-1.800195312500009],[106.16171875000003,-1.866992187500003],[106.20878906249999,-2.188671875000011],[106.36591796875001,-2.46484375],[106.81845703125003,-2.573339843750006],[106.74433593750001,-2.61796875],[106.70664062500003,-2.658007812500003],[106.67880859375003,-2.704003906250009],[106.61201171875001,-2.8955078125],[106.61855468750002,-2.936132812500006],[106.65761718750002,-3.001171875000011],[106.66718750000001,-3.07177734375],[106.61054687500001,-3.071386718750006],[106.54677734375002,-3.055566406250009],[106.49609375,-3.029003906250011],[106.44873046875,-2.994238281250006],[106.39736328125002,-2.966601562500003],[106.34160156249999,-2.94873046875],[106.25009765625003,-2.89404296875],[106.12587890625002,-2.855371093750009],[105.99873046875001,-2.824902343750011],[105.93720703125001,-2.743554687500009],[105.90800781249999,-2.643261718750011],[105.93906250000003,-2.493457031250003],[105.90761718750002,-2.451953125],[105.86240234375003,-2.415429687500009],[105.80683593750001,-2.307421875],[105.78583984375001,-2.181347656250011],[105.70527343750001,-2.132617187500003],[105.59902343750002,-2.103125],[105.552734375,-2.079003906250009],[105.34287109375003,-2.125097656250006],[105.29257812500003,-2.1142578125],[105.24765625000003,-2.079394531250003],[105.13339843750003,-2.042578125],[105.1376953125,-1.97265625],[105.19101562500003,-1.916894531250009],[105.31621093749999,-1.860546875000011],[105.37480468749999,-1.813183593750011],[105.38652343749999,-1.75078125],[105.3642578125,-1.705078125],[105.37314453125003,-1.657324218750006],[105.41269531250003,-1.611035156250011],[105.45957031250003,-1.57470703125],[105.58544921875,-1.526757812500009],[105.64042968749999,-1.610449218750006],[105.66757812500003,-1.680371093750011],[105.70087890625001,-1.731054687500006],[105.75449218750003,-1.65869140625],[105.72041015625001,-1.533886718750011],[105.81611328125001,-1.506054687500011],[105.91005859375002,-1.504980468750006],[105.98095703125,-1.539160156250006],[106.02734375,-1.593164062500009],[106.04570312499999,-1.66943359375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[22.61738281250001,58.621240234374994],[22.688378906250023,58.597021484375],[22.753808593750023,58.6046875],[22.820117187500017,58.621533203125],[22.964257812500023,58.605712890625],[23.292871093750023,58.48349609375],[23.3232421875,58.450830078124994],[23.12714843750001,58.435986328125],[23.082617187500006,58.398486328125],[23.035449218750017,58.372314453125],[22.979882812500023,58.3638671875],[22.885156250000023,58.311279296875],[22.75703125000001,58.260888671874994],[22.730273437500017,58.2306640625],[22.498437500000023,58.236230468749994],[22.371679687500006,58.217138671875],[22.269335937500017,58.1607421875],[22.227343750000017,58.051806640625],[22.152441406250006,57.966796875],[22.076269531250006,57.93603515625],[21.996875,57.93134765625],[21.97802734375,57.96328125],[21.98554687500001,57.995166015624996],[22.152929687500006,58.11533203125],[22.18769531250001,58.154345703125],[22.104394531250023,58.1716796875],[22.034570312500023,58.21337890625],[21.882128906250017,58.262353515624994],[21.8544921875,58.301660156249994],[21.891015625000023,58.304589843749994],[21.924414062500006,58.315869140625],[21.96503906250001,58.348828125],[21.98408203125001,58.386669921875],[21.8623046875,58.49716796875],[21.924414062500006,58.5142578125],[22.001855468750023,58.51025390625],[22.081347656250017,58.478125],[22.168554687500006,58.5158203125],[22.20556640625,58.521386718749994],[22.2666015625,58.507958984374994],[22.328125,58.580859375],[22.474414062500017,58.604882812499994],[22.546972656250006,58.627392578125],[22.61738281250001,58.621240234374994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[21.60810546875001,78.595703125],[21.74560546875,78.572021484375],[22.04316406250001,78.576953125],[22.207324218750017,78.407666015625],[22.29951171875001,78.228173828125],[22.449316406250006,78.215234375],[22.73457031250001,78.23994140625],[22.988867187500006,78.251953125],[23.119238281250006,78.238623046875],[23.351660156250006,78.186279296875],[23.451953125000017,78.149462890625],[23.364648437500023,78.1205078125],[23.151953125,78.0880859375],[23.11669921875,77.99150390625],[23.33056640625,77.957861328125],[23.683984375000023,77.875439453125],[23.88300781250001,77.86474609375],[24.23828125,77.89853515625],[24.57148437500001,77.834423828125],[24.90185546875,77.756591796875],[24.129785156250023,77.658251953125],[24.061914062500023,77.630615234375],[23.954980468750023,77.55771484375],[23.841210937500023,77.49775390625],[23.736132812500017,77.462353515625],[23.505175781250017,77.401416015625],[23.380859375,77.380322265625],[23.101367187500017,77.38505859375],[22.996679687500006,77.360791015625],[22.899511718750006,77.311376953125],[22.8017578125,77.27578125],[22.5537109375,77.266650390625],[22.42695312500001,77.31591796875],[22.468847656250006,77.331103515625],[22.486621093750017,77.360107421875],[22.442480468750006,77.429345703125],[22.67890625000001,77.500146484375],[22.73261718750001,77.53935546875],[22.685351562500017,77.553515625],[22.62031250000001,77.549609375],[22.4482421875,77.571142578125],[22.397265625000017,77.5701171875],[22.25458984375001,77.528857421875],[22.05683593750001,77.501171875],[21.85615234375001,77.494140625],[21.049902343750006,77.440966796875],[20.928125,77.45966796875],[20.873144531250006,77.56533203125],[21.201074218750023,77.619482421875],[21.25146484375,77.7109375],[21.33417968750001,77.77177734375],[21.43085937500001,77.812109375],[21.6083984375,77.916064453125],[21.653125,77.92353515625],[21.21044921875,78.00576171875],[21.035449218750017,78.0591796875],[20.84492187500001,78.165869140625],[20.786425781250017,78.2521484375],[20.5283203125,78.3255859375],[20.56025390625001,78.419384765625],[20.37275390625001,78.41201171875],[20.227929687500023,78.47783203125],[20.362695312500023,78.514794921875],[21.046875,78.55673828125],[21.45478515625001,78.59755859375],[21.60810546875001,78.595703125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[62.16777343750002,80.834765625],[62.22773437500001,80.794384765625],[62.19179687500002,80.730224609375],[62.11455078125002,80.68369140625],[62.07578125,80.616943359375],[61.769140625,80.601025390625],[61.68125,80.586328125],[61.59746093750002,80.5349609375],[61.28515625,80.504736328125],[61.05126953125,80.418603515625],[60.722265625,80.43466796875],[60.2783203125,80.49443359375],[59.90019531250002,80.44609375],[59.64980468750002,80.43125],[59.34638671875001,80.505029296875],[59.30439453125001,80.521533203125],[59.288183593750006,80.57265625],[59.30625,80.6177734375],[59.38652343750002,80.712548828125],[59.4951171875,80.76650390625],[59.549414062500006,80.78359375],[59.59228515625,80.81650390625],[59.7158203125,80.836376953125],[60.09453125000002,80.848583984375],[60.234960937500006,80.837744140625],[60.27802734375001,80.80146484375],[60.481542968750006,80.804248046875],[60.82021484375002,80.8265625],[61.31318359375001,80.862646484375],[61.59746093750002,80.892919921875],[61.8505859375,80.8859375],[62.10292968750002,80.8666015625],[62.16777343750002,80.834765625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[47.441992187500006,80.853662109375],[47.899511718750006,80.8126953125],[48.243261718750006,80.823486328125],[48.34521484375,80.818994140625],[48.44570312500002,80.806005859375],[48.54736328125,80.779052734375],[48.6865234375,80.7177734375],[48.68359375,80.633251953125],[48.62548828125,80.629296875],[48.04433593750002,80.6681640625],[47.77734375,80.75625],[47.70527343750001,80.765185546875],[47.60009765625,80.741943359375],[47.512304687500006,80.687939453125],[47.414160156250006,80.67451171875],[47.30390625000001,80.606201171875],[47.1982421875,80.61494140625],[47.14492187500002,80.609033203125],[47.01103515625002,80.562109375],[46.67753906250002,80.561328125],[46.62392578125002,80.540673828125],[46.513671875,80.475537109375],[46.378125,80.456787109375],[46.14140625000002,80.446728515625],[46.05986328125002,80.4837890625],[46.02363281250001,80.540869140625],[45.96904296875002,80.569482421875],[45.64082031250001,80.536962890625],[45.389257812500006,80.560302734375],[45.14921875000002,80.59873046875],[44.90498046875001,80.611279296875],[45.12451171875,80.65224609375],[46.32744140625002,80.73515625],[46.79912109375002,80.755224609375],[47.020605468750006,80.814404296875],[47.35234375000002,80.8529296875],[47.441992187500006,80.853662109375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[50.278125,80.92724609375],[50.43144531250002,80.910888671875],[50.80107421875002,80.91416015625],[50.91767578125001,80.8904296875],[51.45478515625001,80.744677734375],[51.59101562500001,80.740771484375],[51.70361328125,80.687646484375],[51.14619140625001,80.603955078125],[50.96083984375002,80.540478515625],[50.27968750000002,80.52734375],[49.84599609375002,80.49765625],[49.74980468750002,80.4720703125],[49.79414062500001,80.425341796875],[49.5859375,80.3765625],[48.89609375,80.369189453125],[48.81103515625,80.3537109375],[48.67705078125002,80.300048828125],[48.68896484375,80.290283203125],[48.921972656250006,80.276806640625],[48.959570312500006,80.265673828125],[48.990820312500006,80.2423828125],[49.0107421875,80.207421875],[48.9775390625,80.16259765625],[48.89189453125002,80.155322265625],[48.79736328125,80.1611328125],[48.58173828125001,80.195361328125],[48.55458984375002,80.18330078125],[48.53261718750002,80.158251953125],[48.466796875,80.110107421875],[48.38623046875,80.09580078125],[48.16718750000001,80.132763671875],[48.09589843750001,80.122314453125],[48.02578125000002,80.099462890625],[47.93994140625,80.088623046875],[47.7373046875,80.081689453125],[47.632421875,80.111962890625],[47.72314453125,80.1513671875],[47.9775390625,80.212548828125],[47.89296875000002,80.2392578125],[47.64238281250002,80.2453125],[47.4443359375,80.230126953125],[47.34306640625002,80.188525390625],[47.248632812500006,80.180224609375],[46.99101562500002,80.182763671875],[46.84589843750001,80.23720703125],[46.73818359375002,80.257666015625],[46.64443359375002,80.300341796875],[47.402929687500006,80.444775390625],[47.65605468750002,80.500537109375],[47.89580078125002,80.529052734375],[48.20820312500001,80.543896484375],[48.30615234375,80.561572265625],[48.40263671875002,80.568798828125],[48.46474609375002,80.558056640625],[48.625097656250006,80.50830078125],[49.08779296875002,80.515771484375],[49.18525390625001,80.558642578125],[49.19267578125002,80.656005859375],[49.1474609375,80.712109375],[49.24433593750001,80.82138671875],[49.5078125,80.86533203125],[50.12431640625002,80.923876953125],[50.278125,80.92724609375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[50.265234375,69.185595703125],[50.28300781250002,69.0888671875],[50.22060546875002,69.048779296875],[50.16445312500002,69.037548828125],[50.14091796875002,69.09814453125],[50.09394531250001,69.125537109375],[49.92080078125002,69.053271484375],[49.83984375,68.973779296875],[49.62626953125002,68.859716796875],[49.18046875000002,68.77841796875],[48.91035156250001,68.74306640625],[48.6669921875,68.733154296875],[48.4390625,68.8048828125],[48.31591796875,68.9423828125],[48.29443359375,68.984228515625],[48.27880859375,69.04033203125],[48.2802734375,69.096630859375],[48.29628906250002,69.18388671875],[48.319921875,69.26923828125],[48.41386718750002,69.345654296875],[48.63134765625,69.43603515625],[48.84492187500001,69.4947265625],[48.95332031250001,69.50927734375],[49.225195312500006,69.51123046875],[49.99628906250001,69.309423828125],[50.16728515625002,69.257080078125],[50.265234375,69.185595703125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[60.45048828125002,69.93486328125],[60.48066406250001,69.885498046875],[60.47724609375001,69.793701171875],[60.44023437500002,69.725927734375],[60.3271484375,69.715283203125],[60.215917968750006,69.6876953125],[60.02617187500002,69.717041015625],[59.91953125,69.69697265625],[59.81279296875002,69.695654296875],[59.724609375,69.706201171875],[59.63701171875002,69.721044921875],[59.578222656250006,69.738623046875],[59.58125,69.790869140625],[59.50263671875001,69.8662109375],[59.38154296875001,69.8904296875],[59.26835937500002,69.8984375],[59.14423828125001,69.921923828125],[59.08251953125,69.910791015625],[59.004003906250006,69.88330078125],[58.952734375,69.8927734375],[58.68007812500002,70.051025390625],[58.63417968750002,70.088037109375],[58.605566406250006,70.12919921875],[58.56806640625001,70.1556640625],[58.47304687500002,70.266845703125],[58.51992187500002,70.318310546875],[58.615332031250006,70.350830078125],[58.67802734375002,70.3595703125],[58.79423828125002,70.432958984375],[59.00527343750002,70.465185546875],[59.04804687500001,70.460498046875],[59.08828125000002,70.437109375],[59.30986328125002,70.361669921875],[59.42597656250001,70.3109375],[59.52910156250002,70.248974609375],[59.636328125,70.197021484375],[59.95585937500002,70.108349609375],[60.17226562500002,70.0228515625],[60.392578125,69.96240234375],[60.45048828125002,69.93486328125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[70.67392578125,73.09501953125],[70.38037109375,73.048095703125],[70.29833984375,73.044482421875],[70.11865234375,73.056298828125],[70.04072265625001,73.037158203125],[69.92011718750001,73.084521484375],[69.93037109375001,73.126611328125],[69.98564453125002,73.16923828125],[70.01875,73.22431640625],[69.99589843750002,73.359375],[70.14960937500001,73.4447265625],[70.35,73.47763671875],[70.94023437500002,73.514404296875],[71.02324218750002,73.50419921875],[71.1412109375,73.477978515625],[71.23164062500001,73.44775390625],[71.351171875,73.372216796875],[71.444921875,73.34208984375],[71.58955078125001,73.283154296875],[71.63046875,73.2248046875],[71.62617187500001,73.173974609375],[71.35566406250001,73.162451171875],[70.88671875,73.11962890625],[70.67392578125,73.09501953125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[92.68349609375002,79.685205078125],[92.440625,79.67548828125],[92.15371093750002,79.68466796875],[91.68359375,79.790576171875],[91.37626953124999,79.835498046875],[91.12607421875003,79.904931640625],[91.0703125,79.981494140625],[91.22929687499999,80.030712890625],[91.42597656250001,80.04921875],[91.751953125,80.052294921875],[92.17343750000003,80.045458984375],[92.5927734375,79.996533203125],[93.48154296875003,79.94111328125],[93.803125,79.904541015625],[93.603515625,79.816748046875],[93.38203125000001,79.78388671875],[93.15507812499999,79.73759765625],[92.92626953125,79.7044921875],[92.68349609375002,79.685205078125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[113.38720703125,74.400439453125],[113.353125,74.352978515625],[113.29921875000002,74.317138671875],[113.25888671875003,74.272705078125],[113.19023437499999,74.239306640625],[112.97763671875003,74.196826171875],[112.81132812499999,74.1029296875],[112.78242187500001,74.095068359375],[112.19580078125,74.146240234375],[112.10507812500003,74.163232421875],[111.912109375,74.21923828125],[111.64296875000002,74.27294921875],[111.50341796875,74.353076171875],[111.57011718749999,74.368310546875],[111.6375,74.37431640625],[111.87978515625002,74.363818359375],[111.94921875,74.38876953125],[111.98281250000002,74.456298828125],[111.98935546875003,74.496240234375],[112.00761718749999,74.5267578125],[112.08447265625,74.548974609375],[112.95175781250003,74.47958984375],[113.28623046875003,74.441015625],[113.38720703125,74.400439453125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[141.01025390625,73.999462890625],[140.50722656250002,73.91865234375],[140.40947265625005,73.9216796875],[140.18320312500003,74.00458984375],[140.1015625,74.18427734375],[140.1935546875,74.23671875],[140.30029296875,74.2572265625],[140.407421875,74.266455078125],[140.84921875000003,74.273779296875],[140.9443359375,74.2646484375],[141.03857421875,74.242724609375],[141.07949218750002,74.209326171875],[141.09746093750005,74.167822265625],[141.046875,74.050390625],[141.01025390625,73.999462890625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[23.85224609375001,35.535449218749996],[23.92060546875001,35.528173828125],[24.01328125,35.529443359374994],[24.034375,35.535400390625],[24.093359375,35.59384765625],[24.166015625,35.59521484375],[24.19775390625,35.537451171875],[24.1240234375,35.51083984375],[24.108984375,35.49580078125],[24.123144531250006,35.483642578125],[24.178515625000017,35.459521484374996],[24.25537109375,35.468603515625],[24.257714843750023,35.423144531249996],[24.27490234375,35.385986328125],[24.312890625000023,35.363818359374996],[24.35400390625,35.35947265625],[24.444921875,35.366015625],[24.534570312500023,35.380761718749994],[24.626953125,35.409912109375],[24.721289062500006,35.4248046875],[25.003125,35.40986328125],[25.104296875000017,35.346923828125],[25.296777343750023,35.33935546875],[25.475683593750006,35.306201171874996],[25.569628906250017,35.328076171875],[25.73017578125001,35.348583984375],[25.755859375,35.3263671875],[25.735156250000017,35.184033203125],[25.745019531250023,35.142724609374994],[25.791308593750017,35.122851562499996],[25.83710937500001,35.132568359375],[25.893359375000017,35.17919921875],[26.02802734375001,35.215283203125],[26.167871093750023,35.215087890625],[26.285546875000023,35.309765625],[26.320214843750023,35.31513671875],[26.298632812500017,35.268603515624996],[26.280859375,35.159228515624996],[26.25556640625001,35.095166015625],[26.24433593750001,35.044677734375],[26.165625,35.018603515624996],[26.046679687500017,35.01416015625],[25.8296875,35.025195312499996],[25.6109375,35.00732421875],[25.20576171875001,34.959277343749996],[24.7998046875,34.934472656249994],[24.745214843750006,34.950634765625],[24.743945312500017,35.01435546875],[24.735156250000017,35.05830078125],[24.708886718750023,35.0890625],[24.583398437500023,35.11533203125],[24.463671875000017,35.1603515625],[23.99433593750001,35.221923828125],[23.883593750000017,35.24609375],[23.703906250000017,35.23349609375],[23.638085937500023,35.23515625],[23.5927734375,35.257226562499994],[23.561621093750006,35.295166015625],[23.54755859375001,35.415576171874996],[23.56982421875,35.534765625],[23.608691406250017,35.566259765625],[23.6265625,35.53037109375],[23.672656250000017,35.513916015625],[23.715429687500006,35.550146484375],[23.71503906250001,35.604736328125],[23.736914062500006,35.655517578125],[23.770800781250017,35.634228515625],[23.793359375000023,35.556201171874996],[23.85224609375001,35.535449218749996]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[23.415429687500023,38.958642578124994],[23.471972656250017,38.85009765625],[23.525,38.8134765625],[23.63623046875,38.77021484375],[23.6884765625,38.764697265624996],[23.878222656250017,38.686572265624996],[24.099023437500023,38.67099609375],[24.127539062500006,38.648486328124996],[24.154687500000023,38.58828125],[24.19970703125,38.541015625],[24.211035156250006,38.504248046875],[24.1875,38.463427734374996],[24.220117187500023,38.338623046875],[24.275781250000023,38.220019531249996],[24.359667968750017,38.1625],[24.463964843750006,38.1451171875],[24.563281250000017,38.147509765624996],[24.58837890625,38.123974609375],[24.578515625000023,38.020166015624994],[24.536523437500023,37.979736328125],[24.502343750000023,37.969921875],[24.47265625,37.980517578124996],[24.44580078125,38.00498046875],[24.41650390625,38.016552734375],[24.359472656250006,38.0185546875],[24.317773437500023,38.060351562499996],[24.212011718750006,38.117529296875],[24.19257812500001,38.151660156249996],[24.1890625,38.204296875],[24.144140625,38.243066406249994],[24.102832031250017,38.316845703125],[24.063574218750006,38.337207031249996],[24.041894531250023,38.37412109375],[24.040136718750006,38.389990234375],[23.88623046875,38.400732421875],[23.7587890625,38.401220703125],[23.650781250000023,38.44306640625],[23.61738281250001,38.552539062499996],[23.553320312500006,38.581982421875],[23.505273437500023,38.612939453124994],[23.465234375000023,38.655859375],[23.364062500000017,38.735009765624994],[23.25214843750001,38.801220703125],[23.143945312500023,38.84482421875],[23.029101562500017,38.873388671875],[22.93574218750001,38.839648437499996],[22.88134765625,38.84765625],[22.87031250000001,38.870507812499994],[22.986328125,38.915917968749994],[23.145800781250017,39.002685546875],[23.258203125000023,39.03134765625],[23.31269531250001,39.034912109375],[23.415429687500023,38.958642578124994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[34.46318359375002,35.593505859375],[33.941992187500006,35.292041015624996],[33.90791015625001,35.202392578125],[33.93125,35.140380859375],[34.004492187500006,35.065234375],[34.02363281250001,35.045556640624994],[34.05019531250002,34.98837890625],[33.9365234375,34.971484375],[33.82246093750001,34.96591796875],[33.75898437500001,34.9732421875],[33.69941406250001,34.969873046874994],[33.51445312500002,34.806445312499996],[33.41494140625002,34.750878906249994],[33.29658203125001,34.717724609375],[33.17607421875002,34.698046875],[33.11552734375002,34.695556640625],[33.06230468750002,34.6748046875],[33.02490234375,34.6369140625],[33.02392578125,34.6],[33.007910156250006,34.569580078125],[32.94179687500002,34.57587890625],[32.91425781250001,34.635498046875],[32.8671875,34.6611328125],[32.750097656250006,34.647802734375],[32.69296875,34.649365234375],[32.50556640625001,34.70625],[32.44902343750002,34.729443359375],[32.41376953125001,34.77802734375],[32.31718750000002,34.9533203125],[32.30097656250001,35.082958984375],[32.39091796875002,35.0498046875],[32.475,35.089990234374994],[32.55595703125002,35.15576171875],[32.65234375,35.182666015624996],[32.71269531250002,35.171044921874994],[32.77236328125002,35.159570312499994],[32.8798828125,35.180566406249994],[32.926367187500006,35.278076171875],[32.94160156250001,35.390429687499996],[33.12343750000002,35.358203125],[33.30781250000001,35.34150390625],[33.45878906250002,35.335888671875],[33.60761718750001,35.354150390624994],[34.0634765625,35.473974609375],[34.192480468750006,35.545703125],[34.27236328125002,35.569970703124994],[34.4111328125,35.629296875],[34.55605468750002,35.662060546875],[34.46318359375002,35.593505859375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[19.076464843750017,57.8359375],[18.99375,57.812109375],[18.945117187500017,57.7416015625],[18.878125,57.7296875],[18.813867187500023,57.706201171875],[18.790917968750023,57.48310546875],[18.90791015625001,57.39833984375],[18.843652343750023,57.386474609375],[18.78486328125001,57.361083984375],[18.74287109375001,57.323535156249996],[18.69990234375001,57.242724609374996],[18.538476562500023,57.196923828125],[18.477343750000017,57.163037109375],[18.38720703125,57.087646484375],[18.340234375000023,56.97822265625],[18.248925781250023,56.93154296875],[18.146386718750023,56.9205078125],[18.20654296875,57.01015625],[18.28535156250001,57.083203125],[18.209570312500006,57.13330078125],[18.163964843750023,57.21171875],[18.105078125,57.271875],[18.151953125,57.3390625],[18.12890625,57.449169921875],[18.136523437500017,57.556640625],[18.204882812500017,57.610888671874996],[18.283203125,57.655126953125],[18.405175781250023,57.7568359375],[18.537402343750017,57.83056640625],[18.721875,57.863720703125],[18.80517578125,57.833154296875],[18.841113281250017,57.900195312499996],[18.90058593750001,57.915478515625],[18.956445312500023,57.9],[19.076464843750017,57.8359375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[12.56875,55.78505859375],[12.571191406250023,55.6849609375],[12.545214843750017,55.655810546874996],[12.507031250000011,55.63662109375],[12.407128906250023,55.616259765624996],[12.320605468750017,55.587841796875],[12.243457031250017,55.537890625],[12.215039062500011,55.46650390625],[12.275390625,55.4142578125],[12.385156250000023,55.38564453125],[12.4130859375,55.286181640624996],[12.322460937500011,55.237109375],[12.089941406250006,55.188134765625],[12.065527343750006,55.069921875],[12.073046875000017,54.9767578125],[12.06884765625,54.909033203125],[12.050390625,54.81533203125],[11.8623046875,54.772607421875],[11.740917968750011,54.915332031249996],[11.73984375,54.972460937499996],[11.70361328125,55.03916015625],[11.69677734375,55.095996093749996],[11.65380859375,55.1869140625],[11.475878906250017,55.2115234375],[11.406835937500006,55.21474609375],[11.310253906250011,55.1978515625],[11.286328125000011,55.204443359375],[11.170703125000017,55.32861328125],[11.189746093750017,55.465625],[11.128027343750006,55.534765625],[11.119531250000023,55.566064453125],[11.120996093750023,55.600732421875],[11.0703125,55.629296875],[11.0087890625,55.64443359375],[10.978906250000023,55.721533203125],[11.049609375000017,55.740234375],[11.224414062500017,55.731201171875],[11.275488281250006,55.736474609375],[11.322265625,55.7525390625],[11.463671875000017,55.879296875],[11.459570312500006,55.9072265625],[11.474707031250006,55.94345703125],[11.627734375000017,55.956884765625],[11.695898437500006,55.90791015625],[11.682226562500006,55.8294921875],[11.69091796875,55.72900390625],[11.783593750000023,55.70166015625],[11.819726562500023,55.69765625],[11.858300781250023,55.771875],[11.885351562500006,55.807958984375],[11.922070312500011,55.828076171875],[11.9345703125,55.8958984375],[11.912792968750011,55.937304687499996],[11.866406250000011,55.9681640625],[12.039648437500006,56.0521484375],[12.218945312500011,56.11865234375],[12.3232421875,56.122119140624996],[12.42822265625,56.105859375],[12.525781250000023,56.0833984375],[12.578710937500006,56.0640625],[12.6083984375,56.033007812499996],[12.54296875,55.958984375],[12.524804687500023,55.91845703125],[12.56875,55.78505859375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[10.645117187500006,55.609814453125],[10.686816406250017,55.5576171875],[10.738085937500017,55.446337890624996],[10.819238281250023,55.321875],[10.785351562500011,55.269775390625],[10.808398437500017,55.20302734375],[10.785253906250006,55.1333984375],[10.623828125000017,55.05244140625],[10.442773437500023,55.048779296875],[10.254589843750011,55.087890625],[9.98876953125,55.16318359375],[9.967382812500006,55.20546875],[9.930078125000023,55.22890625],[9.858984375,55.357226562499996],[9.860644531250017,55.515478515625],[9.994238281250006,55.535302734375],[10.2861328125,55.61083984375],[10.353613281250006,55.598974609375],[10.424023437500011,55.560351562499996],[10.505078125000011,55.558056640625],[10.622753906250011,55.612841796874996],[10.645117187500006,55.609814453125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[3.145312500000017,39.790087890624996],[3.241113281250023,39.756689453125],[3.342187500000023,39.78671875],[3.395898437500023,39.777294921875],[3.448925781250011,39.76123046875],[3.461816406250023,39.69775390625],[3.414648437500006,39.6271484375],[3.348730468750006,39.5556640625],[3.29296875,39.47705078125],[3.244726562500006,39.386621093749994],[3.154589843750017,39.333251953125],[3.072851562500006,39.30126953125],[2.900097656250011,39.368359375],[2.7998046875,39.385058593749996],[2.769824218750017,39.41025390625],[2.745996093750023,39.51025390625],[2.700585937500023,39.542138671874994],[2.634082031250017,39.556201171874996],[2.575878906250011,39.530664062499994],[2.49951171875,39.477880859375],[2.458789062500017,39.53046875],[2.394335937500017,39.540380859375],[2.370019531250023,39.572070312499996],[2.371289062500011,39.613085937499996],[2.784960937500017,39.854833984375],[2.90478515625,39.90830078125],[3.15869140625,39.970507812499996],[3.197558593750017,39.961083984374994],[3.164453125000023,39.92421875],[3.1669921875,39.90771484375],[3.198632812500023,39.88984375],[3.19091796875,39.861376953124996],[3.15869140625,39.836572265624994],[3.145312500000017,39.790087890624996]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-120.55625,-73.75605468750001],[-120.378125,-73.85585937500002],[-120.31230468749999,-73.92197265625],[-120.2724609375,-73.98916015625002],[-120.989501953125,-74.15703125000002],[-121.01904296875,-74.1734375],[-121.0541015625,-74.25996093750001],[-121.03642578124999,-74.279296875],[-121.00468749999999,-74.29287109375002],[-121.00244140625,-74.32636718750001],[-121.06240234375,-74.33730468750002],[-122.28662109375,-74.403125],[-122.85908203125,-74.34267578125002],[-122.938427734375,-74.30205078125002],[-122.9560546875,-74.24033203125],[-122.890625,-74.22705078125],[-122.76474609375,-74.21865234375002],[-122.794189453125,-74.1904296875],[-122.875244140625,-74.1412109375],[-122.88076171875,-74.09902343750002],[-122.71000976562499,-73.99365234375],[-122.62470703125,-73.96552734375001],[-122.951171875,-73.86660156250002],[-122.991552734375,-73.84414062500002],[-123.03466796875,-73.83759765625001],[-123.1908203125,-73.84931640625001],[-123.34619140625,-73.84306640625002],[-123.29179687499999,-73.80302734375002],[-123.24907226562499,-73.73867187500002],[-123.112158203125,-73.6822265625],[-123.0125,-73.67294921875],[-122.91044921874999,-73.6796875],[-122.435693359375,-73.681640625],[-121.96669921875,-73.71181640625002],[-121.497314453125,-73.73281250000002],[-120.72221679687499,-73.751953125],[-120.55625,-73.75605468750001]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-126.32988281249999,-73.28623046875],[-126.065283203125,-73.31484375000002],[-125.97587890624999,-73.35683593750002],[-125.856640625,-73.38828125],[-125.735791015625,-73.40566406250002],[-125.626806640625,-73.45322265625],[-125.56132812499999,-73.53642578125002],[-125.50390625,-73.5625],[-125.326171875,-73.61787109375001],[-125.26396484374999,-73.66640625000002],[-125.27607421875,-73.69052734375],[-125.61240234375,-73.71074218750002],[-125.72319335937499,-73.702734375],[-125.82841796874999,-73.718359375],[-125.85991210937499,-73.7486328125],[-125.85703125,-73.78017578125002],[-125.798583984375,-73.80195312500001],[-125.6744140625,-73.82216796875002],[-125.552392578125,-73.82011718750002],[-125.32685546875,-73.7955078125],[-125.22441406249999,-73.80078125],[-125.1087890625,-73.82597656250002],[-124.993408203125,-73.82978515625001],[-124.69438476562499,-73.749609375],[-124.61748046874999,-73.73525390625002],[-124.539990234375,-73.73974609375],[-124.128515625,-73.833984375],[-124.04204101562499,-73.88037109375],[-124.100537109375,-73.9068359375],[-124.151806640625,-73.94423828125002],[-124.129345703125,-73.97109375000002],[-123.93232421875,-74.00800781250001],[-123.851171875,-74.05703125000002],[-123.800439453125,-74.07626953125],[-123.81103515625,-74.11738281250001],[-123.83876953125,-74.16826171875002],[-123.83671874999999,-74.22568359375],[-123.93740234375,-74.25615234375002],[-123.98247070312499,-74.25605468750001],[-124.1994140625,-74.2255859375],[-124.872998046875,-74.20830078125002],[-125.08955078125,-74.18242187500002],[-125.42080078125,-74.069921875],[-125.54931640625,-74.06269531250001],[-125.68271484375,-74.03544921875002],[-125.886865234375,-73.95458984375],[-126.244091796875,-73.89091796875002],[-126.4716796875,-73.812109375],[-126.465576171875,-73.74628906250001],[-126.49609375,-73.7001953125],[-126.53837890624999,-73.68017578125],[-126.582666015625,-73.669921875],[-126.7109375,-73.65361328125002],[-126.838232421875,-73.65732421875],[-126.90166015624999,-73.6767578125],[-127.00639648437499,-73.72578125000001],[-127.1220703125,-73.73417968750002],[-127.21162109375,-73.72441406250002],[-127.231640625,-73.7134765625],[-127.23291015625,-73.585546875],[-127.33203125,-73.56748046875],[-127.41435546874999,-73.51630859375001],[-127.429052734375,-73.446875],[-127.39433593749999,-73.38222656250002],[-127.26762695312499,-73.30400390625002],[-127.12353515625,-73.29433593750002],[-126.97783203124999,-73.30800781250002],[-126.82998046875,-73.29082031250002],[-126.596875,-73.27890625],[-126.32988281249999,-73.28623046875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-66.17363281249999,-80.07783203125001],[-66.2671875,-80.08144531250002],[-66.319482421875,-80.07509765625002],[-66.36689453125,-80.054296875],[-66.410400390625,-79.97333984375001],[-66.90419921875,-79.90888671875001],[-66.962353515625,-79.87265625],[-66.99365234375,-79.79335937500002],[-67.07724609374999,-79.76181640625],[-67.719140625,-79.62021484375],[-67.770751953125,-79.589453125],[-67.808740234375,-79.5458984375],[-67.687939453125,-79.52841796875],[-67.438232421875,-79.56035156250002],[-66.97890625,-79.56865234375002],[-66.881298828125,-79.58222656250001],[-66.78520507812499,-79.6080078125],[-66.27377929687499,-79.61201171875001],[-66.01416015625,-79.62441406250002],[-65.8703125,-79.73769531250002],[-65.579248046875,-79.77080078125002],[-65.53955078125,-79.8369140625],[-65.50444335937499,-79.95429687500001],[-65.89902343749999,-80.04052734375],[-65.989404296875,-80.05400390625002],[-66.17363281249999,-80.07783203125001]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-57.84599609374999,-64.05390625000001],[-57.808544921875,-64.06757812500001],[-57.773681640625,-64.0615234375],[-57.741162109375,-64.0478515625],[-57.71005859374999,-64.01513671875],[-57.592919921874994,-63.96708984375002],[-57.479736328125,-63.96162109375001],[-57.51708984375,-64.01064453125002],[-57.249462890625,-64.09707031250002],[-57.27280273437499,-64.16621093750001],[-57.222265625,-64.22138671875001],[-57.32763671875,-64.23779296875],[-57.413964843749994,-64.2958984375],[-57.33837890625,-64.31826171875002],[-57.294677734375,-64.36699218750002],[-57.387890625,-64.37890625],[-57.58076171875,-64.35039062500002],[-57.683203125,-64.35722656250002],[-57.67075195312499,-64.31093750000002],[-57.7033203125,-64.29326171875002],[-57.82285156249999,-64.30205078125002],[-57.871484375,-64.4009765625],[-57.909765625,-64.41005859375002],[-57.95224609374999,-64.39404296875],[-57.92070312499999,-64.33125],[-57.97109375,-64.32041015625],[-58.02158203124999,-64.32158203125002],[-58.16948242187499,-64.36855468750002],[-58.2140625,-64.3697265625],[-58.304443359375,-64.31455078125],[-58.019970703125,-64.24199218750002],[-58.1376953125,-64.20615234375],[-58.16220703124999,-64.1607421875],[-58.14707031249999,-64.09736328125001],[-58.250439453125,-64.10683593750002],[-58.352001953125,-64.13066406250002],[-58.397607421874994,-64.134765625],[-58.43808593749999,-64.11347656250001],[-58.424951171874994,-64.06777343750002],[-58.34189453124999,-63.99433593750001],[-58.274804687499994,-63.91621093750001],[-58.145654296874994,-63.87763671875001],[-58.07036132812499,-63.84746093750002],[-57.970703125,-63.83466796875001],[-57.925683593749994,-63.80605468750002],[-57.83134765624999,-63.803808593750006],[-57.7794921875,-63.868261718750006],[-57.780664062499994,-63.906835937500006],[-57.82695312499999,-63.94921875],[-57.84599609374999,-64.05390625000001]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-63.180566406249994,-64.46953125000002],[-63.276953125,-64.57333984375],[-63.130517578124994,-64.57236328125],[-63.03208007812499,-64.53496093750002],[-62.92822265625,-64.51933593750002],[-62.83652343749999,-64.571875],[-63.0255859375,-64.6109375],[-63.202587890625,-64.6802734375],[-63.27543945312499,-64.7173828125],[-63.354882812499994,-64.73388671875],[-63.45781249999999,-64.72734375000002],[-63.55844726562499,-64.73417968750002],[-63.646875,-64.80302734375002],[-63.739501953125,-64.83427734375002],[-63.769921875,-64.80839843750002],[-63.80439453125,-64.79150390625],[-64.007080078125,-64.7685546875],[-64.09916992187499,-64.73271484375002],[-64.183740234375,-64.7095703125],[-64.27207031249999,-64.69755859375002],[-64.226220703125,-64.6353515625],[-64.17109375,-64.58193359375002],[-63.867138671875,-64.509765625],[-63.896923828125,-64.48710937500002],[-63.916162109374994,-64.45722656250001],[-63.67441406249999,-64.42138671875],[-63.66831054687499,-64.38398437500001],[-63.68310546875,-64.3427734375],[-63.60556640624999,-64.31416015625001],[-63.5341796875,-64.27294921875],[-63.485595703125,-64.26054687500002],[-63.33359375,-64.2662109375],[-63.229638671874994,-64.32363281250002],[-63.270703125,-64.38066406250002],[-63.180566406249994,-64.46953125000002]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-73.706640625,-70.63515625000002],[-73.55034179687499,-70.72343750000002],[-73.69453125,-70.79433593750002],[-74.205029296875,-70.92412109375002],[-74.50473632812499,-70.97343750000002],[-74.805810546875,-71.0123046875],[-76.17631835937499,-71.132421875],[-76.27128906249999,-71.1328125],[-76.36396484375,-71.116796875],[-76.421484375,-71.0904296875],[-76.51152343749999,-70.9908203125],[-76.500244140625,-70.94140625],[-76.37763671875,-70.894140625],[-76.24887695312499,-70.86376953125],[-76.0345703125,-70.8359375],[-75.21000976562499,-70.77255859375],[-75.126953125,-70.75175781250002],[-75.05991210937499,-70.70556640625],[-75.037548828125,-70.65058593750001],[-75.007470703125,-70.60888671875],[-74.95361328125,-70.59023437500002],[-74.89848632812499,-70.59052734375001],[-74.790478515625,-70.63095703125],[-74.58969726562499,-70.7919921875],[-74.52714843749999,-70.76972656250001],[-74.46865234375,-70.72666015625],[-74.45615234374999,-70.58671875000002],[-74.40097656249999,-70.57587890625001],[-74.225,-70.61464843750002],[-74.11455078124999,-70.65537109375],[-74.11264648437499,-70.5767578125],[-74.038330078125,-70.55292968750001],[-73.95781249999999,-70.56093750000002],[-73.87949218749999,-70.578125],[-73.706640625,-70.63515625000002]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-74.98710937499999,-69.72783203125002],[-74.81015625,-69.75244140625],[-74.54970703125,-69.8609375],[-74.46542968749999,-69.91689453125002],[-74.43798828125,-69.94960937500002],[-74.46005859374999,-69.9716796875],[-74.57841796874999,-69.998046875],[-74.67177734375,-70.13173828125002],[-74.848828125,-70.179296875],[-75.26840820312499,-70.1494140625],[-75.7267578125,-70.09609375000002],[-75.76445312499999,-70.08505859375],[-75.804150390625,-70.03818359375],[-75.812939453125,-69.983984375],[-75.759521484375,-69.91611328125],[-75.68134765625,-69.88164062500002],[-75.33994140624999,-69.84023437500002],[-75.313916015625,-69.81679687500002],[-75.26455078125,-69.74931640625002],[-75.178955078125,-69.73515625000002],[-75.136376953125,-69.740625],[-74.98710937499999,-69.72783203125002]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-98.09111328124999,-71.9125],[-98.175927734375,-72.01845703125002],[-98.16796875,-72.123046875],[-97.92314453124999,-72.11660156250002],[-97.816015625,-71.91884765625002],[-97.58476562499999,-71.88261718750002],[-97.47348632812499,-72.00029296875002],[-97.581982421875,-72.09511718750002],[-97.525634765625,-72.14921875000002],[-97.46025390624999,-72.18828125000002],[-97.34521484375,-72.1890625],[-97.24199218749999,-72.1318359375],[-97.1955078125,-72.09101562500001],[-97.15478515625,-72.04541015625],[-97.08872070312499,-71.94404296875001],[-96.86943359374999,-71.85097656250002],[-96.38334960937499,-71.83632812500002],[-96.125,-71.8955078125],[-96.29819335937499,-72.04511718750001],[-96.71494140624999,-72.13164062500002],[-96.97890625,-72.221875],[-96.89013671875,-72.24697265625002],[-96.79873046875,-72.25947265625001],[-96.71757812499999,-72.25546875],[-96.48232421875,-72.2076171875],[-95.90634765624999,-72.12197265625002],[-95.68540039062499,-72.056640625],[-95.609375,-72.06845703125],[-95.609521484375,-72.175],[-95.53105468749999,-72.24873046875001],[-95.575390625,-72.40996093750002],[-95.82568359375,-72.43896484375],[-96.07817382812499,-72.45380859375001],[-96.014306640625,-72.52470703125002],[-96.02988281249999,-72.554296875],[-96.0517578125,-72.57724609375],[-96.69267578124999,-72.54765625000002],[-96.80390625,-72.55800781250002],[-96.914794921875,-72.57832031250001],[-97.02763671874999,-72.573828125],[-97.25029296874999,-72.52089843750002],[-97.36552734374999,-72.52177734375002],[-97.59560546875,-72.54765625000002],[-97.8283203125,-72.55703125000002],[-98.16342773437499,-72.55605468750002],[-98.4078125,-72.54765625000002],[-98.64067382812499,-72.48974609375],[-98.88154296875,-72.4732421875],[-99.148828125,-72.47197265625002],[-99.434326171875,-72.40664062500002],[-99.67236328125,-72.3798828125],[-100.01425781249999,-72.31240234375002],[-100.10405273437499,-72.28701171875002],[-100.19521484375,-72.27265625000001],[-100.357421875,-72.278125],[-101.601953125,-72.17568359375002],[-101.784765625,-72.177734375],[-101.9033203125,-72.19033203125002],[-102.022119140625,-72.18496093750002],[-102.264794921875,-72.13525390625],[-102.313623046875,-72.0810546875],[-102.28828125,-72.03212890625002],[-102.2365234375,-72.00927734375],[-102.128125,-71.98544921875],[-100.40092773437499,-71.86572265625],[-100.21865234375,-71.83291015625002],[-100.084619140625,-71.8369140625],[-99.98515624999999,-71.939453125],[-99.833203125,-72.04609375000001],[-99.78398437499999,-72.04433593750002],[-99.73491210937499,-72.03300781250002],[-99.56308593749999,-71.944921875],[-99.2541015625,-71.97216796875],[-99.08212890624999,-71.93251953125002],[-98.96455078125,-71.85429687500002],[-98.6154296875,-71.76376953125],[-98.394287109375,-71.78154296875002],[-98.18916015625,-71.82001953125001],[-98.09111328124999,-71.9125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-74.354443359375,-73.09843750000002],[-74.49892578125,-73.22919921875001],[-74.5224609375,-73.24394531250002],[-74.66767578125,-73.27529296875002],[-74.615380859375,-73.31142578125002],[-74.57548828124999,-73.327734375],[-74.55063476562499,-73.369140625],[-74.46713867187499,-73.42714843750002],[-74.36611328125,-73.46425781250002],[-74.452099609375,-73.5654296875],[-74.574658203125,-73.611328125],[-75.900830078125,-73.3326171875],[-76.00322265624999,-73.28798828125002],[-76.053125,-73.25468750000002],[-76.09042968749999,-73.20283203125001],[-76.09638671875,-73.15048828125],[-76.06240234375,-73.10878906250002],[-76.01767578124999,-73.08544921875],[-75.89765625,-73.05634765625001],[-75.774658203125,-73.054296875],[-75.505859375,-73.10888671875],[-75.46757812499999,-73.10107421875],[-75.417236328125,-73.05156250000002],[-75.27622070312499,-73.050390625],[-75.24384765625,-73.009375],[-75.439453125,-72.99423828125],[-75.60029296875,-72.95263671875],[-75.70175781249999,-72.91103515625002],[-75.73105468749999,-72.87929687500002],[-75.37685546875,-72.82041015625],[-74.473876953125,-72.89375],[-74.335546875,-72.9189453125],[-74.27578125,-72.95126953125],[-74.223876953125,-72.9970703125],[-74.354443359375,-73.09843750000002]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-67.9884765625,-67.47441406250002],[-68.092529296875,-67.538671875],[-68.17509765624999,-67.558203125],[-68.250390625,-67.5396484375],[-68.32509765625,-67.53242187500001],[-68.381298828125,-67.55537109375001],[-68.439404296875,-67.65625],[-68.50673828125,-67.70712890625],[-68.58041992187499,-67.73281250000002],[-68.62236328124999,-67.72255859375002],[-68.6640625,-67.72285156250001],[-68.73369140624999,-67.745703125],[-68.818310546875,-67.75341796875],[-68.9013671875,-67.74423828125],[-68.98232421875,-67.67998046875002],[-69.09755859375,-67.60273437500001],[-69.120361328125,-67.57792968750002],[-69.13803710937499,-67.515234375],[-69.13266601562499,-67.45263671875],[-69.082421875,-67.403125],[-68.819921875,-67.23359375000001],[-68.73359375,-67.1572265625],[-68.65634765624999,-67.07041015625],[-68.574609375,-66.99257812500002],[-68.41684570312499,-66.85332031250002],[-68.3359375,-66.80205078125002],[-67.937646484375,-66.6568359375],[-67.830517578125,-66.62431640625002],[-67.7111328125,-66.63300781250001],[-67.68115234375,-66.708984375],[-67.74082031249999,-66.74619140625],[-67.932373046875,-66.84453125000002],[-67.969189453125,-66.98212890625001],[-67.968408203125,-67.0322265625],[-67.94892578125,-67.04482421875002],[-67.87607421874999,-67.06240234375002],[-67.827783203125,-67.08193359375002],[-67.761181640625,-67.12294921875002],[-67.68784179687499,-67.14736328125002],[-67.848046875,-67.21914062500002],[-67.95634765624999,-67.25537109375],[-68.03007812499999,-67.3],[-68.17514648437499,-67.34414062500002],[-68.235107421875,-67.37197265625002],[-68.14443359375,-67.382421875],[-68.006982421875,-67.41796875],[-67.969482421875,-67.45029296875],[-67.9884765625,-67.47441406250002]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-178.87646484375,71.57705078125],[-178.43896484375,71.541162109375],[-178.353564453125,71.52919921875],[-178.214697265625,71.481640625],[-178.13388671875,71.465478515625],[-178.056640625,71.43759765625],[-177.9748046875,71.39052734375],[-177.8169921875,71.339990234375],[-177.584130859375,71.281689453125],[-177.532177734375,71.2630859375],[-177.498486328125,71.219140625],[-177.523583984375,71.16689453125],[-177.82177734375,71.067578125],[-178.0626953125,71.041943359375],[-178.527978515625,71.014794921875],[-179.156884765625,70.93984375],[-179.415673828125,70.918994140625],[-179.506689453125,70.9234375],[-179.734033203125,70.9716796875],[-180,70.993017578125],[-180,71.0943359375],[-179.999951171875,71.184228515625],[-179.999951171875,71.39970703125],[-180,71.4646484375],[-180,71.537744140625],[-179.844873046875,71.5509765625],[-179.691015625,71.577978515625],[-179.54638671875,71.582421875],[-179.40205078125,71.566650390625],[-179.256494140625,71.5716796875],[-179.111572265625,71.59619140625],[-178.99404296875,71.593212890625],[-178.87646484375,71.57705078125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-58.85019531249999,-51.269921875],[-58.697509765625,-51.328515625],[-58.50625,-51.30810546875],[-58.42583007812499,-51.32421875],[-58.37871093749999,-51.373046875],[-58.40673828125,-51.418359375],[-58.467431640624994,-51.41181640625001],[-58.51923828125,-51.423925781250006],[-58.508935546874994,-51.48359375000001],[-58.47373046874999,-51.50908203125002],[-58.27158203124999,-51.57470703125],[-58.234521484374994,-51.57861328125],[-58.241113281249994,-51.55107421875002],[-58.27622070312499,-51.50605468750001],[-58.289306640625,-51.45751953125],[-58.259228515625,-51.417089843750006],[-58.206445312499994,-51.4046875],[-57.976513671875,-51.384375],[-57.922509765624994,-51.40351562500001],[-57.808496093749994,-51.51796875],[-57.915429687499994,-51.533789062500006],[-57.96044921875,-51.58320312500001],[-57.866357421874994,-51.604589843750006],[-57.79179687499999,-51.636132812499994],[-57.83115234374999,-51.6845703125],[-57.83818359374999,-51.70917968750001],[-58.00395507812499,-51.74345703125002],[-58.15092773437499,-51.76542968750002],[-58.21762695312499,-51.82246093750001],[-58.33598632812499,-51.86376953125],[-58.683496093749994,-51.93623046875001],[-58.64306640625,-51.99482421875001],[-58.6376953125,-52.023046875],[-58.652783203125,-52.09921875],[-59.13125,-52.007910156250006],[-59.19584960937499,-52.017675781250006],[-59.068017578124994,-52.17304687500001],[-59.16279296875,-52.201757812500006],[-59.25634765625,-52.18310546875],[-59.34150390625,-52.19599609375001],[-59.395654296874994,-52.308007812499994],[-59.5322265625,-52.236425781250006],[-59.64873046874999,-52.134375],[-59.649169921875,-52.077246093750006],[-59.53666992187499,-51.970605468749994],[-59.57080078125,-51.925390625],[-59.308740234374994,-51.78046875000001],[-59.26176757812499,-51.7373046875],[-59.18002929687499,-51.7125],[-59.09541015625,-51.7041015625],[-59.059521484375,-51.685449218749994],[-59.065380859375,-51.65019531250002],[-59.09946289062499,-51.589746093749994],[-59.096630859375,-51.49140625000001],[-58.886669921875,-51.35791015625],[-58.91748046875,-51.272070312500006],[-58.85019531249999,-51.269921875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-37.10332031249999,-54.065625],[-37.00605468749998,-54.1142578125],[-36.92890624999998,-54.081152343750006],[-36.84892578124999,-54.085058593750006],[-36.80517578125,-54.101464843749994],[-36.76005859374999,-54.10771484375002],[-36.70380859374998,-54.10810546875001],[-36.60688476562498,-54.18984375],[-36.64741210937498,-54.262304687500006],[-36.541015625,-54.248046875],[-36.448632812499994,-54.30839843750002],[-36.40673828125,-54.303320312500006],[-36.385839843750006,-54.27890625],[-36.32646484374999,-54.25117187500001],[-36.285253906250006,-54.288671875],[-36.23564453124999,-54.360449218750006],[-36.172607421875,-54.382226562499994],[-36.11689453124998,-54.45830078125002],[-36.073144531249994,-54.554101562499994],[-36.033105468749994,-54.56767578125002],[-35.96464843749999,-54.56806640625001],[-35.89531249999999,-54.554785156250006],[-35.921533203124994,-54.6375],[-35.91328124999998,-54.710839843749994],[-35.798583984375,-54.76347656250002],[-35.866943359375,-54.792382812499994],[-35.93891601562498,-54.83427734375002],[-36.08549804687499,-54.866796875],[-36.123632812500006,-54.852929687499994],[-36.251708984375,-54.779882812500006],[-36.31147460937498,-54.69375],[-36.44575195312498,-54.570703125],[-36.472070312499994,-54.53447265625002],[-36.50654296874998,-54.51123046875],[-36.62812,-54.49609375],[-36.734960937500006,-54.46660156250002],[-36.823876953124994,-54.404296875],[-36.851708984374994,-54.36601562500002],[-36.885986328125,-54.339453125],[-37.006738281249994,-54.340917968750006],[-37.08281249999999,-54.3115234375],[-37.158105468749994,-54.271484375],[-37.49765625,-54.155859375],[-37.63090820312499,-54.16748046875],[-37.692285156249994,-54.134765625],[-37.68901367187499,-54.076757812500006],[-37.61884765624998,-54.042089843750006],[-37.91279296874998,-54.02890625],[-38.017431640625006,-54.00800781250001],[-37.94550781249998,-53.99560546875],[-37.53583984374998,-53.99375],[-37.382226562499994,-53.98408203125001],[-37.36875,-54.009179687499994],[-37.2328125,-54.060546875],[-37.10332031249999,-54.065625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-73.773388671875,-43.34589843750001],[-73.848583984375,-43.366796875],[-73.918701171875,-43.371972656249994],[-73.98994140625,-43.35664062500001],[-74.114404296875,-43.35791015625],[-74.23857421874999,-43.31884765625],[-74.354931640625,-43.263574218749994],[-74.387353515625,-43.23164062500001],[-74.37314453124999,-43.18574218750001],[-74.28935546874999,-43.079492187499994],[-74.20947265625,-42.87871093750002],[-74.15629882812499,-42.59052734375001],[-74.198828125,-42.481347656249994],[-74.1935546875,-42.43603515625],[-74.174072265625,-42.38154296875001],[-74.16435546874999,-42.32548828125002],[-74.1703125,-42.268945312499994],[-74.16020507812499,-42.21640625],[-74.07231445312499,-42.105859375],[-74.05937,-42.05625],[-74.0568359375,-42.00234375],[-74.018798828125,-41.89091796875002],[-74.030517578125,-41.85400390625],[-74.06303710937499,-41.82275390625],[-74.03666992187499,-41.795507812500006],[-73.73095703125,-41.87724609375002],[-73.52783203125,-41.89628906250002],[-73.51694335937499,-41.980859375],[-73.477783203125,-42.04716796875002],[-73.4544921875,-42.165917968749994],[-73.42290039062499,-42.19287109375],[-73.43925781249999,-42.27783203125],[-73.5328125,-42.314453125],[-73.524560546875,-42.392578125],[-73.47080078124999,-42.46630859375],[-73.549267578125,-42.492578125],[-73.63388671874999,-42.508203125],[-73.653466796875,-42.528710937499994],[-73.71474609375,-42.54472656250002],[-73.7892578125,-42.58574218750002],[-73.766845703125,-42.621875],[-73.673046875,-42.70439453125002],[-73.56826171875,-42.761621093749994],[-73.5107421875,-42.84716796875],[-73.43632812499999,-42.9365234375],[-73.47265625,-42.993261718750006],[-73.54082031249999,-43.07373046875],[-73.649609375,-43.12714843750001],[-73.749658203125,-43.159082031249994],[-73.737890625,-43.29140625],[-73.773388671875,-43.34589843750001]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-60.28623046874999,-51.4619140625],[-60.141552734375,-51.48095703125],[-60.008691406249994,-51.410546875],[-59.91708984374999,-51.388085937499994],[-59.84160156249999,-51.4033203125],[-59.78842773437499,-51.44599609375001],[-59.711328125,-51.43925781250002],[-59.49345703124999,-51.39570312500001],[-59.465087890625,-51.410546875],[-59.387597656249994,-51.359960937500006],[-59.32084960937499,-51.38359375000002],[-59.26806640625,-51.42753906250002],[-59.2939453125,-51.478515625],[-59.35419921875,-51.51093750000001],[-59.39243164062499,-51.55615234375],[-59.43701171875,-51.592675781249994],[-59.51420898437499,-51.6265625],[-59.573193359375,-51.68085937500001],[-59.71489257812499,-51.807714843750006],[-59.92138671875,-51.96953125000002],[-59.98974609375,-51.98408203125001],[-60.132275390625,-51.99384765625001],[-60.19375,-51.98271484375002],[-60.246337890625,-51.986425781250006],[-60.28828125,-52.07373046875],[-60.353466796875,-52.13994140625002],[-60.384228515625,-52.15400390625001],[-60.45200195312499,-52.160253906250006],[-60.48408203125,-52.1703125],[-60.50839843749999,-52.194726562499994],[-60.68637695312499,-52.188378906249994],[-60.81220703125,-52.14775390625002],[-60.96142578125,-52.05732421875001],[-60.7625,-51.94648437500001],[-60.591064453125,-51.9515625],[-60.44975585937499,-51.87714843750001],[-60.33447265625,-51.83955078125001],[-60.288671875,-51.80126953125],[-60.2384765625,-51.77197265625],[-60.23813476562499,-51.733789062499994],[-60.276513671874994,-51.71660156250002],[-60.3283203125,-51.718359375],[-60.37958984375,-51.73515625000002],[-60.50009765624999,-51.75654296875001],[-60.58251953125,-51.71269531250002],[-60.528076171875,-51.696386718750006],[-60.467236328125,-51.697167968749994],[-60.28095703125,-51.65605468750002],[-60.24516601562499,-51.63886718750001],[-60.302636718749994,-51.58046875],[-60.414941406249994,-51.545019531250006],[-60.505810546875,-51.485449218750006],[-60.52275390624999,-51.46318359375002],[-60.51826171875,-51.427832031250006],[-60.56845703124999,-51.3578125],[-60.51572265624999,-51.35429687500002],[-60.445458984374994,-51.3994140625],[-60.28623046874999,-51.4619140625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-74.476171875,-49.147851562499994],[-74.466796875,-49.29453125],[-74.48359375,-49.44189453125],[-74.52207031249999,-49.622949218749994],[-74.515771484375,-49.659570312499994],[-74.470849609375,-49.668554687500006],[-74.45883789062499,-49.69111328125001],[-74.47197265624999,-49.786230468750006],[-74.49609375,-49.859472656250006],[-74.542578125,-49.91914062500001],[-74.56982421875,-49.99072265625],[-74.5947265625,-50.00664062500002],[-74.703369140625,-50.01923828125001],[-74.76298828124999,-50.01142578125001],[-74.81083984374999,-49.9296875],[-74.82470703125,-49.879492187500006],[-74.821923828125,-49.813867187499994],[-74.88041992187499,-49.72587890625002],[-74.8822265625,-49.69218750000002],[-74.859326171875,-49.634179687499994],[-74.81201171875,-49.60527343750002],[-74.804833984375,-49.516015625],[-74.781005859375,-49.4892578125],[-74.72705078125,-49.45234375000001],[-74.71884765624999,-49.43701171875],[-74.723828125,-49.423828125],[-74.74384765625,-49.422460937500006],[-74.960107421875,-49.53300781250002],[-74.98129882812499,-49.56416015625001],[-74.99082031249999,-49.60566406250001],[-74.99350585937499,-49.75175781250002],[-75.03154296874999,-49.83623046875002],[-75.066015625,-49.85234375000002],[-75.166943359375,-49.85595703125],[-75.30009765624999,-49.84746093750002],[-75.451171875,-49.769921875],[-75.5498046875,-49.79130859375002],[-75.57011718749999,-49.69707031250002],[-75.520751953125,-49.621679687500006],[-75.337060546875,-49.62822265625002],[-75.305859375,-49.494042968749994],[-75.364208984375,-49.4625],[-75.428857421875,-49.40839843750001],[-75.46748046875,-49.35888671875],[-75.43315429687499,-49.32207031250002],[-75.32666015625,-49.268652343750006],[-75.26962890624999,-49.26289062500001],[-75.21684570312499,-49.29277343750002],[-75.08603515624999,-49.27021484375001],[-75.093701171875,-49.18535156250002],[-75.21015625,-49.148046875],[-75.184228515625,-49.08359375],[-75.037109375,-49.022070312500006],[-74.94921875,-48.96015625000001],[-74.94521484375,-48.88945312500002],[-74.98076171874999,-48.81884765625],[-74.96953124999999,-48.79130859375002],[-74.896240234375,-48.73320312500002],[-74.79345703125,-48.705078125],[-74.74667968749999,-48.708886718749994],[-74.6515625,-48.749902343749994],[-74.5666015625,-48.754785156249994],[-74.54609375,-48.76689453125002],[-74.5306640625,-48.812597656250006],[-74.476171875,-49.147851562499994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-72.98613281249999,-44.78007812500002],[-73.228466796875,-44.859960937500006],[-73.35,-44.83320312500001],[-73.39707031249999,-44.774316406249994],[-73.420068359375,-44.72480468750001],[-73.445068359375,-44.641015625],[-73.40366210937499,-44.59609375],[-73.31494140625,-44.531347656250006],[-73.281982421875,-44.48955078125002],[-73.266015625,-44.44023437500002],[-73.27158203124999,-44.394140625],[-73.260009765625,-44.35029296875001],[-73.20771484375,-44.3349609375],[-73.02841796874999,-44.38408203125002],[-72.842431640625,-44.45771484375001],[-72.7763671875,-44.50859375000002],[-72.7640625,-44.54902343750001],[-72.8453125,-44.63847656250002],[-72.89716796875,-44.712011718750006],[-72.98613281249999,-44.78007812500002]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-61.80112304687499,49.093896484374994],[-62.21953124999999,49.0791015625],[-62.552636718749994,49.140869140625],[-62.79960937499999,49.170703125],[-63.04150390625,49.224951171875],[-63.565869140625,49.399316406249994],[-63.625878906249994,49.459912109375],[-63.676220703125,49.534326171874994],[-63.776611328125,49.602001953125],[-63.884912109374994,49.65771484375],[-64.44003906249999,49.827734375],[-64.48520507812499,49.886962890625],[-64.37294921875,49.925927734374994],[-64.24375,49.944384765624996],[-64.13144531249999,49.941650390625],[-63.76015625,49.875244140625],[-63.2919921875,49.816845703125],[-63.088818359375,49.772705078125],[-62.858544921874994,49.70546875],[-62.633447265624994,49.623925781249994],[-62.1330078125,49.407080078125],[-62.04306640624999,49.389794921874994],[-61.817138671875,49.283544921875],[-61.73583984375,49.203759765624994],[-61.69614257812499,49.139013671875],[-61.745507812499994,49.105761718749996],[-61.80112304687499,49.093896484374994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-61.10517578125,45.944726562499994],[-61.07133789062499,45.937109375],[-60.93657226562499,45.985546875],[-60.865234375,45.98349609375],[-60.868408203125,45.948632812499994],[-60.984277343749994,45.910693359374996],[-61.037548828125,45.882226562499994],[-60.970605468749994,45.855810546875],[-60.97153320312499,45.83798828125],[-61.051953125,45.79501953125],[-61.09208984374999,45.748388671875],[-61.059033203125,45.703369140625],[-60.93037109375,45.747705078124994],[-60.877587890624994,45.748095703124996],[-60.806103515625,45.738085937499996],[-60.737890625,45.751416015625],[-60.69907226562499,45.773339843749994],[-60.47236328125,45.946533203125],[-60.460595703124994,45.968701171875],[-60.70488281249999,45.932910156249996],[-60.733300781249994,45.956591796874996],[-60.573193359375,46.061425781249994],[-60.58574218749999,46.116650390625],[-60.50493164062499,46.203857421875],[-60.430859375,46.255615234375],[-60.37651367187499,46.284570312499994],[-60.29794921874999,46.31123046875],[-60.24384765625,46.2701171875],[-60.226464843749994,46.195556640625],[-60.09248046875,46.206005859375],[-59.96142578125,46.190966796874996],[-59.86503906249999,46.159521484375],[-59.85,46.14140625],[-59.848779296874994,46.112939453124994],[-59.88090820312499,46.06162109375],[-59.934033203125,46.019433593749994],[-59.828027343749994,45.965136718749996],[-59.8421875,45.941552734374994],[-60.0158203125,45.88046875],[-60.114453125,45.818896484374996],[-60.205078125,45.743017578125],[-60.38608398437499,45.654638671875],[-60.67294921874999,45.5908203125],[-60.76372070312499,45.5908203125],[-60.87158203125,45.610693359375],[-60.97861328124999,45.60615234375],[-61.08369140625,45.582373046875],[-61.186425781249994,45.585009765624996],[-61.236328125,45.572509765625],[-61.28369140625,45.573876953124994],[-61.3234375,45.598486328125],[-61.408349609374994,45.669091796874994],[-61.44980468749999,45.716210937499994],[-61.4953125,45.941455078124996],[-61.480615234374994,46.059765625],[-61.408642578125,46.170361328125],[-61.302197265625,46.24384765625],[-61.24052734374999,46.302539062499996],[-60.98251953124999,46.65048828125],[-60.93198242187499,46.729443359375],[-60.87016601562499,46.796777343749994],[-60.759667968749994,46.86337890625],[-60.616650390625,46.97578125],[-60.571044921875,46.998828125],[-60.48906249999999,47.009716796875],[-60.408203125,47.003515625],[-60.43134765625,46.962939453124996],[-60.425439453124994,46.923193359375],[-60.33173828125,46.767822265625],[-60.332910156249994,46.73701171875],[-60.38408203124999,46.613330078124996],[-60.482421875,46.413525390625],[-60.507714843749994,46.303369140624994],[-60.49453125,46.270263671875],[-60.534423828125,46.21455078125],[-60.57685546875,46.172167968749996],[-60.74482421875,46.092675781249994],[-60.83056640625,46.074121093749994],[-60.91220703124999,46.044580078124994],[-61.10517578125,45.944726562499994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-171.463037109375,63.640039062499994],[-171.4478515625,63.615673828125],[-171.343359375,63.61962890625],[-171.196923828125,63.609130859375],[-171.03486328125,63.585498046875],[-170.874609375,63.593994140625],[-170.672509765625,63.668847656249994],[-170.55185546875,63.6884765625],[-170.430419921875,63.698828125],[-170.299365234375,63.680615234375],[-170.1712890625,63.64091796875],[-170.121826171875,63.617529296875],[-170.082421875,63.57666015625],[-170.056298828125,63.527197265625],[-170.0173828125,63.491748046875],[-169.77744140625,63.447998046875],[-169.62412109375,63.430566406249994],[-169.58720703125,63.406591796875],[-169.554541015625,63.373486328125],[-169.427587890625,63.34833984375],[-169.295068359375,63.35751953125],[-169.22109375,63.348583984375],[-168.996044921875,63.347314453124994],[-168.716015625,63.310595703125],[-168.761328125,63.213769531249994],[-168.852392578125,63.171240234375],[-169.109033203125,63.184912109375],[-169.364697265625,63.171142578125],[-169.470849609375,63.1212890625],[-169.55927734375,63.058203125],[-169.5712890625,62.99677734375],[-169.6228515625,62.9685546875],[-169.6763671875,62.956103515625],[-169.71982421875,62.990087890625],[-169.777783203125,63.09375],[-169.818603515625,63.12236328125],[-169.863427734375,63.140380859375],[-169.9884765625,63.17314453125],[-170.115380859375,63.19384765625],[-170.189599609375,63.196337890625],[-170.243115234375,63.232275390625],[-170.272705078125,63.28427734375],[-170.32353515625,63.3111328125],[-170.424169921875,63.349267578124994],[-170.527099609375,63.379296875],[-170.848388671875,63.444384765625],[-170.954052734375,63.4529296875],[-171.06123046875,63.4458984375],[-171.176025390625,63.4162109375],[-171.2873046875,63.37216796875],[-171.401171875,63.339257812499994],[-171.519140625,63.331982421875],[-171.6318359375,63.351220703124994],[-171.737841796875,63.39423828125],[-171.790966796875,63.424707031249994],[-171.819384765625,63.47724609375],[-171.817919921875,63.529833984375],[-171.803515625,63.580517578125],[-171.74638671875,63.703076171875],[-171.646484375,63.727001953125],[-171.463037109375,63.640039062499994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-166.13544921875,60.383544921875],[-166.04365234375,60.333935546875],[-165.994921875,60.33115234375],[-165.84091796875,60.346240234375],[-165.78447265625,60.335595703124994],[-165.7296875,60.314208984375],[-165.69580078125,60.28154296875],[-165.68935546875,60.22412109375],[-165.714404296875,60.1728515625],[-165.70693359375,60.1005859375],[-165.712353515625,60.0693359375],[-165.63056640625,60.028369140625],[-165.605029296875,59.972802734374994],[-165.591796875,59.913134765625],[-165.769287109375,59.893212890624994],[-165.946728515625,59.890039062499994],[-166.099853515625,59.849609375],[-166.131201171875,59.819775390625],[-166.106689453125,59.775439453125],[-166.14873046875,59.764111328125],[-166.187548828125,59.773828125],[-166.26162109375,59.814892578125],[-166.34296875,59.834423828125],[-166.62763671875,59.864648437499994],[-166.98505859375,59.98388671875],[-167.1388671875,60.008544921875],[-167.2951171875,60.095703125],[-167.43642578125,60.206640625],[-167.3443359375,60.224462890625],[-167.251708984375,60.233544921874994],[-166.836328125,60.2169921875],[-166.784375,60.296435546875],[-166.73095703125,60.316259765625],[-166.598974609375,60.338769531249994],[-166.47568359375,60.382763671875],[-166.420361328125,60.381689453125],[-166.3638671875,60.36474609375],[-166.24697265625,60.391162109375],[-166.1849609375,60.39677734375],[-166.13544921875,60.383544921875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-163.476025390625,54.980712890625],[-163.378955078125,54.81552734375],[-163.3369140625,54.783203125],[-163.27451171875,54.765576171875],[-163.187109375,54.74775390625],[-163.13505859375,54.723291015625],[-163.0892578125,54.686083984374996],[-163.083251953125,54.668994140624996],[-163.35810546875,54.735693359375],[-163.530859375,54.638330078125],[-163.5830078125,54.62568359375],[-164.073291015625,54.62099609375],[-164.1712890625,54.60302734375],[-164.234619140625,54.571337890624996],[-164.3466796875,54.482421875],[-164.403515625,54.4478515625],[-164.4634765625,54.42734375],[-164.5908203125,54.404345703124996],[-164.743798828125,54.407470703125],[-164.8234375,54.419091796875],[-164.866162109375,54.461376953125],[-164.903955078125,54.544775390625],[-164.9037109375,54.56796875],[-164.887646484375,54.6078125],[-164.75146484375,54.662939453125],[-164.706201171875,54.6919921875],[-164.52978515625,54.880859375],[-164.47861328125,54.9068359375],[-164.42431640625,54.91318359375],[-164.273681640625,54.900048828125],[-164.145068359375,54.955126953124996],[-163.86796875,55.039111328124996],[-163.80712890625,55.049072265625],[-163.607470703125,55.050830078124996],[-163.55302734375,55.037841796875],[-163.510888671875,55.014306640625],[-163.476025390625,54.980712890625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-77.261474609375,18.457421875],[-77.13955078125,18.421484375],[-77.01376953124999,18.40292968749999],[-76.959375,18.40185546875],[-76.908203125,18.390429687500003],[-76.79326171874999,18.304296875],[-76.70073242187499,18.25717773437499],[-76.349853515625,18.15185546875],[-76.23276367187499,17.9703125],[-76.21079101562499,17.913525390624997],[-76.30146484375,17.879833984374997],[-76.41552734375,17.868212890625003],[-76.524609375,17.8662109375],[-76.625390625,17.90097656249999],[-76.669384765625,17.927636718749994],[-76.77431640625,17.9404296875],[-76.748291015625,17.964892578125003],[-76.79482421875,17.976318359375],[-76.85322265625,17.97373046874999],[-76.896240234375,17.904101562500003],[-76.94414062499999,17.848779296874994],[-77.03593749999999,17.85410156249999],[-77.0712890625,17.901269531249994],[-77.11948242187499,17.880078125],[-77.1583984375,17.84506835937499],[-77.20498046875,17.71494140624999],[-77.27988281249999,17.779541015625],[-77.36142578124999,17.833691406249997],[-77.4638671875,17.85605468749999],[-77.67075195312499,17.85971679687499],[-77.76816406249999,17.877392578124997],[-77.84941406249999,17.9875],[-77.881298828125,18.01904296875],[-77.96298828124999,18.047558593749997],[-78.04448242187499,18.173828125],[-78.0736328125,18.191162109375],[-78.294091796875,18.218066406250003],[-78.339501953125,18.28720703124999],[-78.32597656249999,18.349755859374994],[-78.25244140625,18.42626953125],[-78.21669921875,18.44809570312499],[-78.09453124999999,18.44482421875],[-77.978173828125,18.467822265625003],[-77.92685546874999,18.500683593749997],[-77.8734375,18.522216796875],[-77.451611328125,18.467041015625],[-77.354248046875,18.466455078124994],[-77.261474609375,18.457421875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-66.12939453125,18.444921875],[-66.09848632812499,18.425195312499994],[-66.06840820312499,18.428027343750003],[-66.09267578125,18.468994140625],[-66.07041015624999,18.468994140625],[-65.87875976562499,18.44384765625],[-65.75556640625,18.401611328125],[-65.62880859375,18.381396484375003],[-65.620849609375,18.242333984374994],[-65.718408203125,18.186669921874994],[-65.7822265625,18.128613281249997],[-65.834130859375,18.057324218749997],[-65.97080078124999,17.974365234375],[-66.135498046875,17.949462890625],[-66.24501953125,17.947265625],[-66.285888671875,17.949951171875],[-66.32578125,17.964160156250003],[-66.40854492187499,17.950585937499994],[-66.51079101562499,17.987011718749997],[-66.59843749999999,17.97788085937499],[-66.772412109375,17.986572265625],[-66.83759765625,17.955078125],[-66.9,17.947900390624994],[-66.96123046874999,17.953759765624994],[-67.013330078125,17.96787109374999],[-67.14238281249999,17.966699218749994],[-67.196875,17.994189453125003],[-67.17431640625,18.152539062499997],[-67.17246093749999,18.22421875],[-67.20415039062499,18.283398437499997],[-67.23896484375,18.32065429687499],[-67.2640625,18.36459960937499],[-67.21337890625,18.393603515625003],[-67.17177734375,18.435791015625],[-67.158642578125,18.49921875],[-67.113037109375,18.514794921874994],[-67.05961914062499,18.522167968749997],[-66.812890625,18.49252929687499],[-66.18857421874999,18.47578125],[-66.153076171875,18.470654296874997],[-66.12939453125,18.444921875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-152.898046875,57.82392578125],[-152.8908203125,57.768994140625],[-152.850146484375,57.775683593749996],[-152.696240234375,57.832275390625],[-152.616015625,57.848876953125],[-152.511572265625,57.85146484375],[-152.428759765625,57.82568359375],[-152.4119140625,57.805908203125],[-152.419140625,57.78232421875],[-152.485400390625,57.734423828124996],[-152.4826171875,57.7033203125],[-152.411474609375,57.64609375],[-152.2365234375,57.614892578125],[-152.215283203125,57.597705078124996],[-152.2162109375,57.577001953125],[-152.336669921875,57.482226562499996],[-152.380859375,57.460107421875],[-152.41220703125,57.45478515625],[-152.63095703125,57.471826171875],[-152.83115234375,57.502880859375],[-152.912158203125,57.508154296875],[-152.940771484375,57.498095703124996],[-152.9974609375,57.4689453125],[-152.9568359375,57.4603515625],[-152.78134765625,57.453417968749996],[-152.71953125,57.41083984375],[-152.692529296875,57.37958984375],[-152.679052734375,57.3451171875],[-152.7140625,57.33095703125],[-152.789111328125,57.320654296875],[-152.879052734375,57.32080078125],[-152.990283203125,57.281982421875],[-153.051611328125,57.237646484375],[-153.274365234375,57.226367187499996],[-153.443701171875,57.1671875],[-153.503564453125,57.137988281249996],[-153.5244140625,57.103076171874996],[-153.58828125,57.077685546874996],[-153.732568359375,57.05234375],[-153.646533203125,57.029589843749996],[-153.633056640625,57.0103515625],[-153.6314453125,56.983691406249996],[-153.643310546875,56.960742187499996],[-153.7572265625,56.858349609375],[-153.972705078125,56.77421875],[-154.02734375,56.777978515625],[-154.05078125,56.7884765625],[-154.07001953125,56.804541015625],[-154.070849609375,56.820654296875],[-153.793212890625,56.989501953125],[-153.80419921875,56.997802734375],[-153.879736328125,57.003515625],[-153.999365234375,57.049951171875],[-154.0837890625,57.020068359374996],[-154.102978515625,57.021240234375],[-154.08046875,57.06103515625],[-154.025439453125,57.10849609375],[-154.03505859375,57.121826171875],[-154.06533203125,57.13369140625],[-154.13486328125,57.140771484375],[-154.24375,57.143017578125],[-154.3244140625,57.131787109375],[-154.376806640625,57.10703125],[-154.381103515625,57.096533203125],[-154.26953125,57.099462890625],[-154.239208984375,57.086865234375],[-154.209130859375,57.063330078125],[-154.1908203125,57.0361328125],[-154.184326171875,57.005322265625],[-154.20771484375,56.963818359375],[-154.2609375,56.911767578125],[-154.33896484375,56.9208984375],[-154.498779296875,57.036572265625],[-154.5693359375,57.205908203125],[-154.70595703125,57.3353515625],[-154.71220703125,57.366259765624996],[-154.673193359375,57.44609375],[-154.535302734375,57.559423828125],[-154.387060546875,57.590478515625],[-154.2814453125,57.6380859375],[-154.179345703125,57.65244140625],[-154.116162109375,57.651220703125],[-154.029833984375,57.630712890625],[-153.99501953125,57.5873046875],[-154.015869140625,57.56689453125],[-154.00791015625,57.55615234375],[-153.94736328125,57.530078125],[-153.881884765625,57.439013671874996],[-153.805419921875,57.358203125],[-153.75458984375,57.325341796875],[-153.6876953125,57.305126953125],[-153.75693359375,57.366845703125],[-153.797802734375,57.44326171875],[-153.818359375,57.59560546875],[-153.838134765625,57.63583984375],[-153.799462890625,57.6466796875],[-153.69013671875,57.64072265625],[-153.6931640625,57.663427734375],[-153.80849609375,57.71474609375],[-153.879443359375,57.757177734375],[-153.906103515625,57.790771484375],[-153.904443359375,57.819873046874996],[-153.841552734375,57.862841796874996],[-153.805810546875,57.87509765625],[-153.768994140625,57.88037109375],[-153.69560546875,57.871240234375],[-153.662646484375,57.8578125],[-153.5685546875,57.761083984375],[-153.524462890625,57.731005859374996],[-153.487939453125,57.73095703125],[-153.454052734375,57.747021484375],[-153.422705078125,57.779150390625],[-153.3904296875,57.798388671874996],[-153.35712890625,57.8046875],[-153.252392578125,57.790478515625],[-153.21748046875,57.795751953125],[-153.20029296875,57.82001953125],[-153.201025390625,57.86328125],[-153.1751953125,57.878857421875],[-153.16884765625,57.91064453125],[-153.225927734375,57.9576171875],[-153.16044921875,57.971972656249996],[-152.94326171875,57.93603515625],[-152.850390625,57.896777343749996],[-152.898046875,57.82392578125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-152.416943359375,58.360205078125],[-152.38076171875,58.352099609375],[-152.343017578125,58.41162109375],[-152.316259765625,58.413476562499994],[-152.19794921875,58.3630859375],[-152.125244140625,58.374267578125],[-152.078515625,58.312353515625],[-152.03662109375,58.306689453125],[-151.99775390625,58.314208984375],[-151.974365234375,58.30986328125],[-151.98251953125,58.2443359375],[-152.068896484375,58.1779296875],[-152.10908203125,58.1611328125],[-152.165478515625,58.178271484375],[-152.1865234375,58.18466796875],[-152.223583984375,58.214013671874994],[-152.25166015625,58.251123046874994],[-152.268359375,58.251708984375],[-152.334375,58.208056640625],[-152.332666015625,58.1865234375],[-152.305224609375,58.154052734375],[-152.309228515625,58.13388671875],[-152.38115234375,58.124267578125],[-152.451611328125,58.129248046875],[-152.537646484375,58.100976562499994],[-152.558203125,58.118603515625],[-152.571337890625,58.168212890625],[-152.5982421875,58.16259765625],[-152.63876953125,58.101806640625],[-152.683056640625,58.063330078125],[-152.7638671875,58.031396484374994],[-152.78154296875,58.01591796875],[-152.84072265625,58.013818359374994],[-152.92841796875,57.993701171874996],[-152.982568359375,57.9970703125],[-153.30546875,58.0630859375],[-153.38134765625,58.08720703125],[-153.1158203125,58.238525390625],[-152.976123046875,58.297021484374994],[-152.895361328125,58.293847656249994],[-152.81455078125,58.275634765625],[-152.771875,58.278564453125],[-152.768701171875,58.345605468749994],[-152.8439453125,58.39560546875],[-152.84111328125,58.41640625],[-152.674658203125,58.450585937499994],[-152.6123046875,58.445703125],[-152.5435546875,58.428173828125],[-152.478466796875,58.39970703125],[-152.416943359375,58.360205078125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-130.979150390625,55.48916015625],[-131.013916015625,55.379296875],[-131.082763671875,55.266796875],[-131.187890625,55.206298828125],[-131.261865234375,55.219775390624996],[-131.31630859375,55.268505859375],[-131.366845703125,55.2658203125],[-131.420703125,55.27587890625],[-131.450927734375,55.31630859375],[-131.42236328125,55.368408203125],[-131.44755859375,55.4087890625],[-131.47451171875,55.373486328125],[-131.521826171875,55.341064453125],[-131.64130859375,55.29892578125],[-131.723681640625,55.218359375],[-131.7625,55.165820312499996],[-131.810986328125,55.223095703125],[-131.8419921875,55.358691406249996],[-131.84609375,55.416259765625],[-131.75947265625,55.503076171875],[-131.64755859375,55.585546875],[-131.624951171875,55.831689453125],[-131.26923828125,55.955371093749996],[-131.236181640625,55.948974609375],[-131.120654296875,55.856640625],[-130.997802734375,55.72763671875],[-130.965966796875,55.66953125],[-130.9650390625,55.568017578125],[-130.979150390625,55.48916015625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-133.56611328125,56.339208984375],[-133.376611328125,56.3177734375],[-133.202978515625,56.31982421875],[-133.143701171875,56.278564453125],[-133.1044921875,56.235107421875],[-133.08173828125,56.194189453125],[-133.075439453125,56.155859375],[-133.080126953125,56.128710937499996],[-133.101220703125,56.0998046875],[-133.096630859375,56.0900390625],[-132.757568359375,55.99501953125],[-132.597607421875,55.89501953125],[-132.5337890625,55.84248046875],[-132.49697265625,55.798095703125],[-132.43017578125,55.68701171875],[-132.2888671875,55.55810546875],[-132.21474609375,55.518847656249996],[-132.172705078125,55.480615234375],[-132.196337890625,55.479150390625],[-132.2958984375,55.507470703125],[-132.511279296875,55.5939453125],[-132.528857421875,55.590478515625],[-132.54833984375,55.543701171875],[-132.58173828125,55.50263671875],[-132.631298828125,55.473193359374996],[-132.5916015625,55.46435546875],[-132.41787109375,55.48291015625],[-132.272021484375,55.3986328125],[-132.215283203125,55.383544921875],[-132.16025390625,55.322998046875],[-132.1583984375,55.2998046875],[-132.1904296875,55.25498046875],[-132.214892578125,55.236767578125],[-132.206689453125,55.224414062499996],[-132.165966796875,55.218017578125],[-132.005078125,55.230615234375],[-131.976416015625,55.20859375],[-132.000390625,55.033837890625],[-131.977587890625,54.969482421875],[-131.9779296875,54.940234375],[-131.99658203125,54.901416015624996],[-131.997216796875,54.868603515625],[-131.98271484375,54.834912109375],[-131.980859375,54.804833984375],[-132.0216796875,54.726318359375],[-132.06474609375,54.713134765625],[-132.134326171875,54.712548828125],[-132.1892578125,54.73486328125],[-132.26630859375,54.80234375],[-132.34130859375,54.9072265625],[-132.37021484375,54.922216796875],[-132.46865234375,54.937939453125],[-132.486474609375,54.950390625],[-132.549365234375,54.952587890625],[-132.59384765625,54.995751953125],[-132.5884765625,55.05234375],[-132.626953125,55.11005859375],[-132.62216796875,55.1359375],[-132.66533203125,55.146777343749996],[-132.7017578125,55.130517578125],[-132.682861328125,55.07392578125],[-132.704150390625,55.030078125],[-132.78232421875,55.048486328125],[-132.91259765625,55.1884765625],[-133.060595703125,55.300927734375],[-133.1185546875,55.32763671875],[-133.10302734375,55.36025390625],[-133.030029296875,55.3775390625],[-132.97080078125,55.376171875],[-132.95888671875,55.395556640624996],[-133.082470703125,55.5041015625],[-133.07841796875,55.534912109375],[-133.0333984375,55.589697265625],[-133.0896484375,55.612597656249996],[-133.24375,55.59541015625],[-133.2982421875,55.606884765625],[-133.342822265625,55.650830078125],[-133.368994140625,55.68896484375],[-133.502734375,55.6958984375],[-133.553271484375,55.691162109375],[-133.640478515625,55.748779296875],[-133.68017578125,55.78515625],[-133.664404296875,55.80380859375],[-133.58408203125,55.8365234375],[-133.537158203125,55.83193359375],[-133.44697265625,55.797021484375],[-133.41171875,55.79833984375],[-133.322119140625,55.84462890625],[-133.30849609375,55.886474609375],[-133.24150390625,55.92080078125],[-133.2521484375,55.957080078124996],[-133.289208984375,56.018701171875],[-133.371240234375,56.035888671875],[-133.538623046875,55.999267578125],[-133.684228515625,55.9427734375],[-133.742529296875,55.96484375],[-133.75517578125,55.999462890625],[-133.59921875,56.09365234375],[-133.530859375,56.145654296875],[-133.544091796875,56.176513671875],[-133.59443359375,56.216357421874996],[-133.5986328125,56.316259765625],[-133.56611328125,56.339208984375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-133.3662109375,57.003515625],[-133.29970703125,56.97216796875],[-133.263525390625,57.00498046875],[-133.19599609375,57.003466796874996],[-133.07080078125,56.974267578125],[-132.996240234375,56.930419921875],[-132.954150390625,56.8802734375],[-132.9505859375,56.850439453125],[-132.963330078125,56.782568359375],[-132.95400390625,56.7130859375],[-132.9591796875,56.677050781249996],[-132.97587890625,56.647265625],[-133.0041015625,56.62373046875],[-133.034912109375,56.620751953125],[-133.132373046875,56.683251953125],[-133.243994140625,56.795849609375],[-133.328955078125,56.830078125],[-133.332421875,56.818505859375],[-133.30908203125,56.78623046875],[-133.239697265625,56.72568359375],[-133.22724609375,56.689257812499996],[-133.178466796875,56.644824218749996],[-133.156640625,56.611132812499996],[-133.14423828125,56.56689453125],[-133.1447265625,56.52822265625],[-133.158154296875,56.495166015624996],[-133.180810546875,56.473974609375],[-133.212646484375,56.464599609375],[-133.382763671875,56.473876953125],[-133.4841796875,56.4517578125],[-133.602783203125,56.464111328125],[-133.63134765625,56.484033203125],[-133.649267578125,56.516796875],[-133.65830078125,56.5962890625],[-133.68818359375,56.710009765624996],[-133.68095703125,56.797509765625],[-133.75751953125,56.87666015625],[-133.823046875,56.924365234374996],[-133.91728515625,56.967089843749996],[-133.979443359375,57.009570312499996],[-133.962353515625,57.04345703125],[-133.865966796875,57.068701171875],[-133.70771484375,57.062841796875],[-133.3662109375,57.003515625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-134.969775390625,57.351416015625],[-134.88486328125,57.24169921875],[-134.823193359375,57.156542968749996],[-134.768505859375,57.05419921875],[-134.67685546875,56.84228515625],[-134.63408203125,56.762109375],[-134.620703125,56.718310546874996],[-134.610546875,56.60341796875],[-134.62431640625,56.5787109375],[-134.651708984375,56.5560546875],[-134.657080078125,56.523242187499996],[-134.631689453125,56.43564453125],[-134.630029296875,56.30244140625],[-134.65400390625,56.227490234375],[-134.681884765625,56.216162109375],[-134.75029296875,56.240771484374996],[-134.8064453125,56.28125],[-134.847998046875,56.323486328125],[-134.950146484375,56.456835937499996],[-134.98056640625,56.5189453125],[-134.982421875,56.563623046875],[-134.966650390625,56.596142578125],[-134.933203125,56.616357421875],[-134.87509765625,56.670458984374996],[-134.883447265625,56.679052734375],[-134.927587890625,56.6669921875],[-135.017822265625,56.66015625],[-135.09716796875,56.70283203125],[-135.159033203125,56.725390625],[-135.14658203125,56.80234375],[-135.163134765625,56.82412109375],[-135.284814453125,56.800341796874996],[-135.330615234375,56.821875],[-135.34062,56.85078125],[-135.33837890625,56.893994140625],[-135.31513671875,56.9318359375],[-135.199609375,57.02734375],[-135.21123046875,57.044921875],[-135.2673828125,57.048876953124996],[-135.341357421875,57.081591796874996],[-135.37529296875,57.188427734375],[-135.454931640625,57.2494140625],[-135.501953125,57.24384765625],[-135.608935546875,57.071435546875],[-135.661865234375,57.033740234374996],[-135.8123046875,57.009521484375],[-135.781640625,57.05751953125],[-135.767724609375,57.100390625],[-135.821142578125,57.230419921875],[-135.82275390625,57.280419921875],[-135.787109375,57.31728515625],[-135.680908203125,57.332568359374996],[-135.62451171875,57.35439453125],[-135.58056640625,57.389990234375],[-135.56962890625,57.42470703125],[-135.4873046875,57.51650390625],[-135.448681640625,57.534375],[-135.3462890625,57.53310546875],[-135.1306640625,57.431640625],[-135.065234375,57.41669921875],[-134.969775390625,57.351416015625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-134.6802734375,58.161669921875],[-134.426123046875,58.138818359374994],[-134.240087890625,58.143994140625],[-134.070166015625,57.99453125],[-133.96552734375,57.873779296875],[-133.9041015625,57.789208984375],[-133.869287109375,57.70751953125],[-133.82275390625,57.628662109375],[-133.826904296875,57.617578125],[-133.925,57.67080078125],[-133.995556640625,57.778466796875],[-134.031640625,57.820605468749996],[-134.067236328125,57.839599609375],[-134.104736328125,57.879345703125],[-134.1775390625,57.982177734375],[-134.1802734375,58.011132812499994],[-134.21259765625,58.037939453125],[-134.249951171875,58.049169921875],[-134.292333984375,58.0447265625],[-134.306884765625,58.034375],[-134.300390625,57.963427734374996],[-134.26708984375,57.884521484375],[-134.08369140625,57.712255859375],[-133.9611328125,57.61416015625],[-133.93701171875,57.581591796874996],[-133.920849609375,57.491992187499996],[-133.97373046875,57.4513671875],[-133.908837890625,57.368701171874996],[-133.9111328125,57.3525390625],[-133.92529296875,57.336767578125],[-134.100048828125,57.300097656249996],[-134.26015625,57.146777343749996],[-134.435302734375,57.056982421875],[-134.516015625,57.042578125],[-134.55478515625,57.057568359375],[-134.59150390625,57.0919921875],[-134.6130859375,57.137939453125],[-134.61953125,57.1955078125],[-134.57587890625,57.231738281249996],[-134.489208984375,57.420166015625],[-134.486767578125,57.48203125],[-134.59482421875,57.567822265625],[-134.65986328125,57.6380859375],[-134.6951171875,57.73603515625],[-134.7541015625,57.99501953125],[-134.781494140625,58.07783203125],[-134.8201171875,58.146875],[-134.869970703125,58.202099609375],[-134.907666015625,58.26279296875],[-134.93310546875,58.328955078125],[-134.923486328125,58.354638671874994],[-134.836962890625,58.320166015625],[-134.733203125,58.225],[-134.6802734375,58.161669921875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-135.73037109375,58.24423828125],[-135.5875,58.14677734375],[-135.586279296875,58.124414062499994],[-135.615380859375,58.057470703125],[-135.693115234375,58.038525390625],[-135.671142578125,58.0119140625],[-135.613232421875,57.991845703125],[-135.572021484375,58.008544921875],[-135.42119140625,58.102392578125],[-135.37470703125,58.122119140625],[-135.346630859375,58.12412109375],[-135.162841796875,58.095849609374994],[-135.002099609375,58.05107421875],[-134.9546875,58.01533203125],[-134.927978515625,57.952783203125],[-134.970654296875,57.817236328125],[-135.102587890625,57.79365234375],[-135.16474609375,57.79609375],[-135.231201171875,57.8158203125],[-135.3384765625,57.76865234375],[-135.249560546875,57.732568359375],[-134.978857421875,57.724365234375],[-134.896630859375,57.647998046874996],[-134.873095703125,57.589208984375],[-134.931494140625,57.48115234375],[-135.08486328125,57.511035156249996],[-135.22021484375,57.5736328125],[-135.4978515625,57.662255859375],[-135.564208984375,57.66640625],[-135.608544921875,57.650732421875],[-135.620654296875,57.596972656249996],[-135.617822265625,57.48037109375],[-135.691943359375,57.419921875],[-135.910791015625,57.446582031249996],[-135.9966796875,57.53486328125],[-136.076611328125,57.674560546875],[-136.37822265625,57.839990234375],[-136.459912109375,57.873095703124996],[-136.568603515625,57.97216796875],[-136.52509765625,58.0505859375],[-136.5123046875,58.09599609375],[-136.45439453125,58.1080078125],[-136.36953125,58.14306640625],[-136.32197265625,58.218896484374994],[-136.245703125,58.157470703125],[-136.14375,58.098486328125],[-136.142333984375,58.15390625],[-136.094384765625,58.198144531249994],[-135.994384765625,58.196533203125],[-135.947412109375,58.205810546875],[-135.88173828125,58.24716796875],[-135.787060546875,58.268505859375],[-135.73037109375,58.24423828125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-128.55244140625,52.939746093749996],[-128.50654296875,52.620703125],[-128.509912109375,52.518603515624996],[-128.576806640625,52.451806640625],[-128.6240234375,52.339892578124996],[-128.678955078125,52.2896484375],[-128.730908203125,52.35654296875],[-128.735546875,52.467724609375],[-128.7494140625,52.5560546875],[-128.766455078125,52.598388671875],[-128.746337890625,52.76337890625],[-128.76962890625,52.751220703125],[-128.831201171875,52.67880859375],[-128.8998046875,52.673828125],[-129.0228515625,52.75595703125],[-129.084716796875,52.8224609375],[-129.094873046875,52.891845703125],[-129.175927734375,52.96494140625],[-129.184326171875,52.990673828125],[-129.177685546875,53.017919921875],[-129.111083984375,53.090673828125],[-129.08408203125,53.139697265624996],[-129.0603515625,53.240625],[-129.033251953125,53.279931640625],[-128.97021484375,53.274365234375],[-128.85771484375,53.228564453124996],[-128.740380859375,53.178857421875],[-128.632666015625,53.1125],[-128.55244140625,52.939746093749996]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-132.655517578125,54.127490234374996],[-132.5640625,54.068652343749996],[-132.34443359375,54.1060546875],[-132.303369140625,54.098876953125],[-132.26162109375,54.076318359375],[-132.21591796875,54.02841796875],[-132.16611328125,53.955224609375],[-132.155126953125,53.8751953125],[-132.17509765625,53.846533203125],[-132.214501953125,53.814746093749996],[-132.564892578125,53.687646484375],[-132.57412109375,53.675390625],[-132.567138671875,53.66396484375],[-132.53466796875,53.651708984375],[-132.464404296875,53.6533203125],[-132.186962890625,53.684814453125],[-132.1716796875,53.706835937499996],[-132.15224609375,53.806982421875],[-132.114013671875,53.86015625],[-132.110595703125,53.90029296875],[-132.135888671875,53.995849609375],[-132.134423828125,54.03427734375],[-131.9408203125,54.0419921875],[-131.81962890625,54.07734375],[-131.695947265625,54.1431640625],[-131.667626953125,54.141357421875],[-131.685400390625,54.022802734375],[-131.7025390625,53.986376953124996],[-131.821142578125,53.84150390625],[-131.88916015625,53.71396484375],[-131.922314453125,53.587890625],[-131.928076171875,53.379199218749996],[-131.957421875,53.30869140625],[-132.011328125,53.265185546874996],[-132.347265625,53.189208984375],[-132.520458984375,53.19404296875],[-132.6748046875,53.26318359375],[-132.747509765625,53.310498046875],[-132.692578125,53.36787109375],[-132.65478515625,53.370556640625],[-132.546240234375,53.35927734375],[-132.46240234375,53.337890625],[-132.425,53.336962890624996],[-132.43134765625,53.350439453125],[-132.670166015625,53.45859375],[-132.84501953125,53.50771484375],[-132.897998046875,53.5626953125],[-132.899560546875,53.60537109375],[-132.91337890625,53.629199218749996],[-133.05224609375,53.778125],[-133.0794921875,53.83701171875],[-133.09765625,53.920263671875],[-133.09794921875,54.005615234375],[-133.0638671875,54.14404296875],[-133.048388671875,54.158935546875],[-132.991455078125,54.1578125],[-132.89306640625,54.140771484375],[-132.655517578125,54.127490234374996]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-131.7537109375,53.195556640625],[-131.65234375,53.102978515625],[-131.62216796875,53.020068359374996],[-131.63466796875,52.922167968749996],[-131.795263671875,52.885058593749996],[-131.8796875,52.9146484375],[-131.916357421875,52.909130859375],[-131.97177734375,52.879833984375],[-131.90439453125,52.86669921875],[-131.81005859375,52.818701171875],[-131.727294921875,52.756396484374996],[-131.610595703125,52.74521484375],[-131.455224609375,52.701708984374996],[-131.572802734375,52.623339843749996],[-131.590576171875,52.57822265625],[-131.443896484375,52.4533203125],[-131.42998046875,52.422119140625],[-131.3830078125,52.41572265625],[-131.2736328125,52.425830078124996],[-131.259716796875,52.41591796875],[-131.2599609375,52.3900390625],[-131.32705078125,52.317529296875],[-131.319921875,52.303076171875],[-131.2591796875,52.291650390625],[-131.142626953125,52.29111328125],[-131.116162109375,52.219091796875],[-131.221533203125,52.153613281249996],[-131.421875,52.23798828125],[-131.5111328125,52.322070312499996],[-131.562060546875,52.399951171874996],[-131.623681640625,52.443994140625],[-131.80966796875,52.54169921875],[-132.092236328125,52.752783203125],[-132.165087890625,52.78330078125],[-132.23857421875,52.866796875],[-132.2599609375,52.906982421875],[-132.25810546875,52.933886718749996],[-132.229541015625,52.948095703125],[-132.144921875,52.957470703125],[-132.14375,52.999316406249996],[-132.468701171875,53.071875],[-132.504833984375,53.08671875],[-132.54677734375,53.1375],[-132.52421875,53.144921875],[-132.34541015625,53.136083984375],[-132.15390625,53.160498046875],[-132.0359375,53.179150390625],[-131.989501953125,53.201953125],[-131.893115234375,53.2314453125],[-131.853466796875,53.229736328125],[-131.7537109375,53.195556640625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-63.811279296875,46.468701171875],[-63.78422851562499,46.454638671874996],[-63.73701171875,46.480517578124996],[-63.68144531249999,46.561914062499994],[-63.534375,46.540625],[-63.456494140625,46.50390625],[-63.41313476562499,46.512011718749996],[-63.36865234375,46.508251953125],[-63.286083984375,46.460205078125],[-63.12939453125,46.422216796875],[-62.964013671874994,46.427734375],[-62.71201171874999,46.45029296875],[-62.68193359374999,46.459423828125],[-62.423095703125,46.478271484375],[-62.16357421875,46.487207031249994],[-62.07426757812499,46.465722656249994],[-62.04086914062499,46.445703125],[-62.02373046874999,46.42158203125],[-62.171777343749994,46.355371093749994],[-62.319970703124994,46.2783203125],[-62.52607421875,46.202880859375],[-62.552001953125,46.165917968749994],[-62.539208984374994,46.097949218749996],[-62.54326171874999,46.028662109375],[-62.502587890624994,46.02294921875],[-62.47807617187499,45.99970703125],[-62.53134765624999,45.977294921875],[-62.7431640625,45.96689453125],[-62.8048828125,45.973193359374996],[-62.878369140625,46.001367187499994],[-62.903515625,46.068261718749994],[-62.99462890625,46.058447265625],[-63.02207031249999,46.0666015625],[-62.89453125,46.123583984374996],[-62.95263671875,46.195166015625],[-63.015039062499994,46.18994140625],[-63.05634765625,46.223925781249996],[-63.0529296875,46.269824218749996],[-62.9951171875,46.292138671874994],[-62.978466796875,46.316357421875],[-63.056884765625,46.295361328125],[-63.11699218749999,46.252832031249994],[-63.194726562499994,46.23671875],[-63.27080078124999,46.2],[-63.152783203125,46.188330078125],[-63.21347656249999,46.15986328125],[-63.276611328125,46.153271484375],[-63.56889648437499,46.209228515625],[-63.641015625,46.23046875],[-63.73178710937499,46.2890625],[-63.800537109375,46.367333984374994],[-63.76323242187499,46.370361328125],[-63.75053710937499,46.384375],[-63.75864257812499,46.397607421874994],[-63.860546875,46.408154296875],[-64.0197265625,46.404833984374996],[-64.11083984375,46.425439453124994],[-64.10654296874999,46.562109375],[-64.13603515624999,46.59970703125],[-64.23564453124999,46.6314453125],[-64.38803710937499,46.640869140625],[-64.40312,46.6916015625],[-64.35458984374999,46.76923828125],[-64.27998046875,46.835742187499996],[-64.22324218749999,46.901269531249994],[-64.15693359375,46.954882812499996],[-63.993554687499994,47.061572265624996],[-63.997265625,46.981738281249996],[-63.98149414062499,46.912988281249994],[-64.087890625,46.775439453124996],[-63.90302734375,46.639111328125],[-63.879296875,46.608984375],[-63.863720703125,46.57236328125],[-63.875634765624994,46.538671875],[-63.90556640624999,46.5087890625],[-63.83359375,46.493896484375],[-63.811279296875,46.468701171875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-72.509765625,40.98603515625],[-72.58085937499999,40.921337890625],[-72.5166015625,40.914794921875],[-72.461328125,40.9337890625],[-72.40898437499999,40.97216796875],[-72.28745117187499,41.024072265624994],[-72.18388671874999,41.046777343749994],[-72.15126953125,41.05146484375],[-72.10190429687499,41.015039062499994],[-72.00395507812499,41.044287109375],[-71.90322265625,41.060693359374994],[-72.33896484374999,40.894140625],[-72.42807617187499,40.875390625],[-72.55556640625,40.82578125],[-72.67607421874999,40.790625],[-72.762841796875,40.77783203125],[-73.194287109375,40.654199218749994],[-73.228515625,40.651513671874994],[-73.26552734375,40.66357421875],[-73.62089843749999,40.599902343749996],[-73.766748046875,40.592724609375],[-73.899560546875,40.5705078125],[-73.80131835937499,40.62177734375],[-73.79916992187499,40.640966796875],[-73.82265625,40.65595703125],[-73.8751953125,40.651611328125],[-73.92900390624999,40.598828125],[-74.014892578125,40.581201171874994],[-74.03203124999999,40.638671875],[-74.003369140625,40.683154296874996],[-73.96455078125,40.725341796875],[-73.87924804687499,40.791650390624994],[-73.7572265625,40.83369140625],[-73.69521484375,40.870019531249994],[-73.65224609375,40.838037109374994],[-73.642822265625,40.88125],[-73.609765625,40.906201171875],[-73.573828125,40.91962890625],[-73.48740234374999,40.919970703124996],[-73.440869140625,40.9267578125],[-73.4072265625,40.94111328125],[-73.372705078125,40.943798828125],[-73.27817382812499,40.92421875],[-73.18583984374999,40.929833984374994],[-73.111279296875,40.956884765625],[-73.03378906249999,40.965966796874994],[-72.82880859375,40.972070312499994],[-72.62509765624999,40.991845703124994],[-72.54365234375,41.027001953124994],[-72.37255859375,41.125537109374996],[-72.27412109375,41.15302734375],[-72.427392578125,41.038525390625],[-72.509765625,40.98603515625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[151.915625,-4.296777343750009],[151.96757812500005,-4.316992187500006],[152.1171875,-4.212207031250003],[152.197265625,-4.28515625],[152.29941406250003,-4.320703125],[152.40566406250002,-4.340722656250009],[152.36357421875005,-4.490820312500006],[152.37607421875003,-4.560253906250011],[152.403515625,-4.629296875],[152.4,-4.73125],[152.35117187500003,-4.822167968750009],[152.25761718750005,-4.9546875],[152.21572265625002,-4.979199218750011],[152.16660156250003,-4.9931640625],[152.01328125000003,-5.003808593750009],[151.98369140625005,-5.074414062500011],[151.99394531250005,-5.149023437500006],[152.07685546875,-5.2470703125],[152.14296875000002,-5.35703125],[152.07705078125002,-5.458300781250003],[151.96845703125,-5.52880859375],[151.8654296875,-5.56484375],[151.69492187500003,-5.543554687500006],[151.51513671875,-5.55234375],[151.4814453125,-5.590917968750006],[151.48046875,-5.654589843750003],[151.45517578125003,-5.703125],[151.42246093750003,-5.747363281250003],[151.33125,-5.839062500000011],[151.22929687500005,-5.919921875],[151.0900390625,-5.996679687500006],[151.0431640625,-6.015039062500009],[150.919921875,-6.027246093750009],[150.80898437500002,-6.071386718750006],[150.75957031250005,-6.114453125000011],[150.70576171875,-6.1494140625],[150.5880859375,-6.187792968750003],[150.47353515625002,-6.263378906250011],[150.42832031250003,-6.276171875],[150.19082031250002,-6.289355468750003],[149.85097656250002,-6.29296875],[149.75029296875005,-6.300878906250006],[149.6525390625,-6.290429687500009],[149.59843750000005,-6.260937500000011],[149.48300781250003,-6.124804687500003],[149.38232421875,-6.078125],[149.27265625,-6.079492187500009],[149.12656250000003,-6.127636718750011],[149.09902343750002,-6.116992187500003],[148.80751953125002,-5.91640625],[148.71914062500002,-5.867382812500011],[148.62480468750005,-5.830761718750011],[148.509765625,-5.805371093750011],[148.40117187500005,-5.765039062500009],[148.33720703125005,-5.66943359375],[148.3447265625,-5.544921875],[148.43203125000002,-5.471777343750006],[148.56494140625,-5.507910156250006],[148.61582031250003,-5.507421875],[148.66582031250005,-5.486621093750003],[148.72431640625,-5.493261718750006],[148.78349609375005,-5.511621093750009],[148.99921875,-5.484570312500011],[149.1240234375,-5.522656250000011],[149.2453125,-5.573046875],[149.35888671875,-5.583984375],[149.47539062500005,-5.5732421875],[149.63173828125002,-5.516015625],[149.68105468750002,-5.523535156250006],[149.83144531250002,-5.524121093750011],[149.96279296875002,-5.44775390625],[150.0119140625,-5.139550781250009],[150.04531250000002,-5.03466796875],[150.0900390625,-5.011816406250006],[150.122265625,-5.018164062500006],[150.17031250000002,-5.070605468750003],[150.10869140625005,-5.136035156250003],[150.08154296875,-5.186425781250009],[150.0724609375,-5.3095703125],[150.10625,-5.429003906250003],[150.18310546875,-5.523632812500011],[150.29873046875002,-5.53564453125],[150.40439453125003,-5.47314453125],[150.51943359375002,-5.460253906250003],[150.62578125000005,-5.520898437500009],[150.73447265625003,-5.510449218750011],[150.784375,-5.470898437500011],[150.84257812500005,-5.453710937500006],[150.90029296875002,-5.447167968750009],[150.95292968750005,-5.423730468750009],[151.02226562500005,-5.320703125],[151.06884765625,-5.204492187500009],[151.13779296875003,-5.112890625],[151.32656250000002,-4.960351562500009],[151.38095703125003,-4.941308593750009],[151.43984375000002,-4.930957031250003],[151.57255859375005,-4.9375],[151.67119140625005,-4.88330078125],[151.67890625,-4.761035156250003],[151.66464843750003,-4.637011718750003],[151.551953125,-4.345507812500003],[151.54423828125005,-4.29921875],[151.560546875,-4.247363281250003],[151.59306640625005,-4.20078125],[151.70371093750003,-4.2],[151.8193359375,-4.216992187500011],[151.86474609375,-4.260839843750006],[151.915625,-4.296777343750009]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[127.29609375000001,-8.424511718750011],[127.11455078124999,-8.58359375],[126.91523437500001,-8.715234375],[126.79248046875,-8.755078125000011],[126.66542968750002,-8.78203125],[126.56855468750001,-8.832910156250009],[126.48691406250003,-8.912695312500006],[126.38251953125001,-8.957617187500006],[126.26474609375003,-8.972753906250006],[126.16425781250001,-8.996679687500006],[126.07304687499999,-9.043554687500006],[125.94609374999999,-9.123925781250009],[125.89472656250001,-9.132128906250003],[125.84033203125,-9.130175781250003],[125.73515624999999,-9.1609375],[125.40800781249999,-9.27578125],[125.21025390624999,-9.403515625000011],[124.99794921875002,-9.565332031250009],[124.96308593750001,-9.665625],[124.841796875,-9.759765625],[124.70839843750002,-9.914160156250006],[124.60185546874999,-9.99296875],[124.50820312500002,-10.086132812500011],[124.42753906249999,-10.148632812500011],[124.32675781250003,-10.169824218750009],[124.17597656250001,-10.183300781250011],[123.97109375000002,-10.294824218750009],[123.85761718750001,-10.343554687500003],[123.74726562500001,-10.34716796875],[123.64414062500003,-10.3109375],[123.60478515624999,-10.270117187500006],[123.61406249999999,-10.215039062500011],[123.64824218749999,-10.167773437500003],[123.69013671875001,-10.128808593750009],[123.71640625000003,-10.07861328125],[123.59941406249999,-10.01513671875],[123.58925781250002,-9.966796875],[123.6357421875,-9.838085937500011],[123.66582031249999,-9.705273437500011],[123.709375,-9.61484375],[123.87675781249999,-9.453125],[123.97714843750003,-9.372949218750009],[124.19814453125002,-9.256152343750003],[124.57548828124999,-9.155371093750006],[124.64589843750002,-9.11669921875],[124.70820312500001,-9.061816406250003],[124.88974609375003,-8.968457031250011],[125.02695312500003,-8.859082031250011],[125.11572265625,-8.7080078125],[125.17802734374999,-8.647851562500009],[125.32314453125002,-8.59130859375],[125.3818359375,-8.575390625000011],[125.80429687500003,-8.4921875],[125.90507812499999,-8.486523437500011],[126.1728515625,-8.488964843750011],[126.53105468749999,-8.470800781250006],[126.61972656250003,-8.45947265625],[126.73457031250001,-8.422753906250009],[126.845703125,-8.37734375],[126.90468750000002,-8.341601562500003],[126.96640625000003,-8.315722656250003],[127.05849609375002,-8.348242187500006],[127.21484375,-8.372949218750009],[127.25703125000001,-8.39453125],[127.29609375000001,-8.424511718750011]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[145.04296875,-40.78671875],[145.15869140625,-40.790625],[145.22431640625,-40.76513671875],[145.28300781250005,-40.769921875],[145.34941406250005,-40.82636718750001],[145.42939453125,-40.85820312500002],[145.48515625000005,-40.85234375000002],[145.53349609375005,-40.86396484375001],[145.57646484375005,-40.90410156250002],[145.68603515625,-40.9390625],[145.73378906250002,-40.962011718750006],[145.775390625,-40.997167968750006],[145.821484375,-41.02460937500001],[146.11113281250005,-41.118066406249994],[146.31748046875003,-41.163476562499994],[146.5744140625,-41.14238281250002],[146.6505859375,-41.1162109375],[146.72343750000005,-41.078027343749994],[146.78603515625002,-41.113671875],[146.84814453125,-41.168066406250006],[146.83603515625003,-41.109375],[146.856640625,-41.05830078125001],[146.91943359375,-41.01777343750001],[146.98984375000003,-40.99238281250001],[147.10576171875005,-40.994238281250006],[147.21884765625003,-40.9833984375],[147.26894531250002,-40.95976562500002],[147.3205078125,-40.956445312499994],[147.3876953125,-40.98554687500001],[147.45478515625,-41.00166015625001],[147.50078125000005,-40.96416015625002],[147.579296875,-40.875585937500006],[147.62167968750003,-40.8447265625],[147.81767578125005,-40.871679687500006],[147.87294921875002,-40.87255859375],[147.96875,-40.77958984375002],[148.03281250000003,-40.78095703125001],[148.21523437500002,-40.854882812499994],[148.29287109375002,-40.94707031250002],[148.28544921875005,-41.115332031250006],[148.29160156250003,-41.17460937500002],[148.30625,-41.23310546875001],[148.31220703125,-41.349707031250006],[148.28984375000005,-41.46503906250001],[148.28691406250005,-41.55498046875002],[148.29658203125,-41.64619140625001],[148.28759765625,-41.81572265625002],[148.31572265625005,-41.927734375],[148.30166015625002,-42.00419921875002],[148.30146484375,-42.039941406249994],[148.32802734375002,-42.07373046875],[148.3408203125,-42.11113281250002],[148.3310546875,-42.1591796875],[148.34257812500005,-42.21533203125],[148.33125,-42.261621093749994],[148.29033203125005,-42.254980468750006],[148.27695312500003,-42.21943359375001],[148.28457031250002,-42.1734375],[148.27714843750005,-42.13642578125001],[148.25576171875002,-42.102636718750006],[148.18310546875,-42.06474609375002],[148.20439453125005,-42.0419921875],[148.24160156250002,-42.021875],[148.21367187500005,-41.97001953125002],[148.1671875,-42.012304687500006],[148.14121093750003,-42.06982421875],[148.15625,-42.08828125],[148.12753906250003,-42.10371093750001],[148.0666015625,-42.1703125],[148.02275390625005,-42.25947265625001],[148.0048828125,-42.345117187499994],[148.009375,-42.4359375],[147.97353515625002,-42.505859375],[147.92441406250003,-42.57246093750001],[147.912109375,-42.65849609375002],[147.9150390625,-42.81640625],[147.95771484375,-42.96044921875],[147.98085937500002,-43.15703125000002],[147.94541015625003,-43.18183593750001],[147.83857421875,-43.19511718750002],[147.78583984375,-43.22001953125002],[147.69892578125,-43.12255859375],[147.64794921875,-43.020605468750006],[147.68730468750005,-42.979882812499994],[147.77392578125,-43.00341796875],[147.80039062500003,-42.98027343750002],[147.80742187500005,-42.9541015625],[147.8,-42.928125],[147.69345703125003,-42.871972656249994],[147.57382812500003,-42.845703125],[147.53583984375,-42.878027343750006],[147.5490234375,-42.974511718749994],[147.53671875000003,-42.996484375],[147.45234375,-43.03339843750001],[147.40800781250005,-42.89384765625002],[147.29794921875003,-42.790917968749994],[147.301953125,-42.84052734375001],[147.34765625,-42.92656250000002],[147.34267578125002,-42.964453125],[147.325,-43.01347656250002],[147.28076171875,-43.03173828125],[147.259765625,-43.07109375000002],[147.259765625,-43.12646484375],[147.24501953125002,-43.215917968750006],[147.1728515625,-43.255859375],[146.99697265625002,-43.156347656250006],[146.98486328125,-43.18984375],[146.9875,-43.21875],[147.07734375,-43.27587890625],[147.03593750000005,-43.31904296875001],[147.00468750000005,-43.36962890625],[146.95468750000003,-43.50244140625],[146.87392578125002,-43.6125],[146.83427734375005,-43.61933593750001],[146.69921875,-43.601953125],[146.54853515625,-43.508886718750006],[146.41318359375003,-43.51953125],[146.18671875,-43.512792968750006],[146.0431640625,-43.54716796875002],[146.01308593750002,-43.44482421875],[145.98173828125005,-43.40839843750001],[145.99443359375005,-43.376074218750006],[146.10878906250002,-43.354394531249994],[146.22636718750005,-43.35527343750002],[146.2080078125,-43.31621093750002],[146.17646484375,-43.3017578125],[146.12509765625003,-43.31123046875001],[145.97529296875,-43.27714843750002],[145.8732421875,-43.292382812499994],[145.802734375,-43.244042968749994],[145.68154296875002,-43.07597656250002],[145.60996093750003,-42.99824218750001],[145.5673828125,-42.96796875000001],[145.517578125,-42.95136718750001],[145.48759765625005,-42.926660156249994],[145.26816406250003,-42.544335937499994],[145.23710937500005,-42.45556640625],[145.19882812500003,-42.230859375],[145.37294921875002,-42.338476562500006],[145.43486328125005,-42.40654296875002],[145.46826171875,-42.49287109375001],[145.52724609375002,-42.38818359375],[145.5166015625,-42.3544921875],[145.3603515625,-42.2275390625],[145.33964843750005,-42.19072265625002],[145.3310546875,-42.147070312500006],[145.29443359375,-42.191015625],[145.23486328125,-42.19697265625001],[145.258984375,-42.107324218749994],[145.23818359375002,-42.019628906250006],[145.05537109375,-41.826757812500006],[144.91552734375,-41.64404296875],[144.77792968750003,-41.418847656249994],[144.76611328125,-41.390039062499994],[144.76435546875,-41.34150390625001],[144.69775390625,-41.19072265625002],[144.66240234375005,-41.07890625000002],[144.64609375000003,-40.980859375],[144.70966796875,-40.78291015625001],[144.71855468750005,-40.672265625],[144.8185546875,-40.7216796875],[145.04296875,-40.78671875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[96.52656250000001,81.0755859375],[96.56308593750003,81.030078125],[96.69326171875002,80.994189453125],[96.75498046875003,80.957861328125],[97.41367187500003,80.841845703125],[97.70302734375002,80.826708984375],[97.83183593749999,80.798291015625],[97.86992187499999,80.76328125],[97.8564453125,80.698095703125],[97.74716796875003,80.698681640625],[97.66542968750002,80.678076171875],[97.22138671875001,80.65244140625],[97.11308593749999,80.6140625],[97.025390625,80.535546875],[97.07255859374999,80.519873046875],[97.11503906249999,80.49658203125],[97.25019531250001,80.36298828125],[97.28681640625001,80.342529296875],[97.4169921875,80.32314453125],[97.29843750000003,80.27275390625],[97.17519531250002,80.241015625],[95.85576171874999,80.176953125],[94.96132812500002,80.150390625],[94.66123046875003,80.122802734375],[94.56503906250003,80.12607421875],[94.32841796874999,80.076025390625],[93.87236328124999,80.010107421875],[93.65468750000002,80.009619140625],[93.00234375000002,80.102099609375],[92.20156250000002,80.179296875],[92.09218750000002,80.22333984375],[91.8916015625,80.249267578125],[91.63740234375001,80.269921875],[91.52382812500002,80.358544921875],[91.68779296874999,80.418505859375],[91.89667968750001,80.4775390625],[92.24667968750003,80.49912109375],[92.57792968749999,80.533251953125],[92.82675781250003,80.6185546875],[92.98105468750003,80.702978515625],[93.2625,80.791259765625],[92.77294921875,80.76865234375],[92.59257812499999,80.780859375],[92.61015624999999,80.810009765625],[92.71035156250002,80.87216796875],[92.7646484375,80.89306640625],[92.93867187500001,80.925830078125],[93.06513671875001,80.9884765625],[93.35869140624999,81.031689453125],[93.49736328124999,81.039208984375],[93.63671875,81.038134765625],[93.88886718750001,81.0583984375],[94.14013671875,81.089453125],[94.37548828125,81.107373046875],[94.61162109374999,81.1146484375],[94.837890625,81.139404296875],[95.06093750000002,81.1880859375],[95.15957031250002,81.27099609375],[95.80068359375002,81.28046875],[95.90195312500003,81.260595703125],[95.98398437500003,81.21142578125],[96.0751953125,81.1927734375],[96.18691406250002,81.183935546875],[96.47109375000002,81.099267578125],[96.52656250000001,81.0755859375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[97.67451171875001,80.158251953125],[97.90361328124999,80.09501953125],[98.01777343750001,80.0228515625],[97.90673828125,80.003759765625],[97.80791015624999,79.956298828125],[97.75996093750001,79.895849609375],[97.626953125,79.850439453125],[97.59130859375,79.774951171875],[97.65166015624999,79.76064453125],[97.72451171875002,79.781396484375],[97.87070312500003,79.85263671875],[98.06455078125003,79.90107421875],[98.27324218749999,79.87412109375],[98.353125,79.884326171875],[98.4990234375,79.953125],[98.471875,80.009130859375],[98.53183593750003,80.043603515625],[98.59648437499999,80.052197265625],[98.86591796875001,80.04541015625],[99.294921875,80.016357421875],[99.37070312500003,79.986376953125],[99.47304687500002,79.970166015625],[99.5361328125,79.94130859375],[99.7265625,79.919921875],[99.818359375,79.898193359375],[99.94658203124999,79.848974609375],[100.06123046875001,79.777099609375],[99.91582031249999,79.738330078125],[99.83925781250002,79.6689453125],[99.80546874999999,79.653076171875],[99.78164062500002,79.628271484375],[99.77109375000003,79.567724609375],[99.74882812499999,79.515185546875],[99.72119140625,79.491845703125],[99.70625,79.4634765625],[99.72158203125002,79.385107421875],[99.6806640625,79.32333984375],[99.53730468750001,79.2765625],[99.38779296875003,79.274755859375],[99.16708984375003,79.306298828125],[99.10439453125002,79.30537109375],[99.04179687499999,79.293017578125],[99.3173828125,79.227197265625],[99.51728515625001,79.13017578125],[99.75078124999999,79.107666015625],[99.81464843750001,79.095849609375],[99.89960937500001,79.006396484375],[99.92929687500003,78.96142578125],[99.54082031249999,78.852734375],[99.43955078125003,78.834228515625],[98.81953125000001,78.81826171875],[98.4111328125,78.78779296875],[98.28251953124999,78.79501953125],[98.05419921875,78.82099609375],[97.90517578125002,78.810205078125],[97.68857421875003,78.82734375],[97.55546874999999,78.8265625],[97.24814453125003,78.868017578125],[96.93291015624999,78.933935546875],[96.87119140625003,78.963818359375],[96.80781250000001,78.9849609375],[96.42998046874999,79.00302734375],[96.34736328125001,79.015869140625],[95.79648437500003,79.001416015625],[95.70283203125001,79.01201171875],[95.53105468749999,79.098095703125],[95.43691406250002,79.09931640625],[95.13320312500002,79.049609375],[95.02041015625002,79.052685546875],[94.791015625,79.08662109375],[94.65234375,79.127490234375],[94.63164062499999,79.140869140625],[94.61972656250003,79.1923828125],[94.48212890625001,79.218603515625],[94.31376953124999,79.30751953125],[94.21875,79.40234375],[93.75859374999999,79.451416015625],[93.47871093750001,79.462744140625],[93.27226562499999,79.4583984375],[93.07080078125,79.4953125],[93.40468750000002,79.631591796875],[93.84726562500003,79.70166015625],[94.03818359375003,79.756005859375],[94.25712890624999,79.829736328125],[94.34726562500003,79.941943359375],[94.71943359375001,80.01123046875],[94.81503906250003,80.034814453125],[94.94677734375,80.0892578125],[94.9873046875,80.096826171875],[95.28134765625003,80.030517578125],[95.33798828125003,80.042138671875],[95.39072265625003,80.072802734375],[95.49755859375,80.105615234375],[95.85781250000002,80.110009765625],[96.1625,80.096826171875],[96.27734375,80.11005859375],[96.41660156250003,80.104345703125],[97.12050781250002,80.15302734375],[97.58681640625002,80.16826171875],[97.67451171875001,80.158251953125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[102.884765625,79.253955078125],[102.78730468750001,79.176416015625],[102.74580078125001,79.1060546875],[102.44785156250003,78.87666015625],[102.41230468750001,78.83544921875],[102.58730468750002,78.8712890625],[102.74765625000003,78.949560546875],[102.84482421875003,79.01435546875],[102.95039062500001,79.05576171875],[103.07568359375,79.056494140625],[103.19912109375002,79.0712890625],[103.43339843749999,79.126123046875],[103.6728515625,79.15],[103.80078125,79.149267578125],[103.92568359375002,79.1232421875],[104.00400390625003,79.062548828125],[104.09111328124999,79.01318359375],[104.40419921875002,78.977099609375],[104.44921875,78.963916015625],[104.47695312500002,78.92333984375],[104.45205078125002,78.880029296875],[104.63320312500002,78.83515625],[104.88105468750001,78.8548828125],[105.0146484375,78.843310546875],[105.14599609375,78.81884765625],[105.20458984375,78.779931640625],[105.25605468750001,78.7330078125],[105.31015625000003,78.666162109375],[105.34267578125002,78.5939453125],[105.31259765625003,78.49990234375],[104.83261718750003,78.352734375],[104.74179687500003,78.33974609375],[104.51943359375002,78.34921875],[104.29746093750003,78.33505859375],[103.71933593750003,78.258251953125],[103.003125,78.255859375],[102.79667968749999,78.187890625],[102.734375,78.189892578125],[102.67314453124999,78.201708984375],[102.6171875,78.224609375],[102.18046874999999,78.205322265625],[101.6923828125,78.1943359375],[101.2041015625,78.191943359375],[101.03994140625002,78.14296875],[100.54121093750001,78.047509765625],[100.08222656250001,77.975],[99.84501953124999,77.9568359375],[99.50029296874999,77.97607421875],[99.39169921875003,78.00068359375],[99.287109375,78.0380859375],[99.43867187500001,78.083935546875],[99.54560546875001,78.178564453125],[99.67792968750001,78.23349609375],[100.01894531250002,78.338916015625],[100.05751953125002,78.38037109375],[100.12353515625,78.470458984375],[100.16298828125002,78.503955078125],[100.21503906250001,78.535791015625],[100.25722656250002,78.573828125],[100.2626953125,78.631494140625],[100.28398437499999,78.67919921875],[100.41640625000002,78.753173828125],[100.515625,78.78779296875],[100.61962890625,78.797412109375],[100.87558593750003,78.78359375],[100.95576171875001,78.7884765625],[100.89794921875,78.812451171875],[100.85625,78.89775390625],[100.86455078124999,78.925830078125],[100.9013671875,78.980078125],[100.96542968750003,79.00654296875],[101.03085937500003,79.023291015625],[101.06816406249999,79.096240234375],[101.05224609375,79.1232421875],[101.14882812500002,79.156884765625],[101.19609374999999,79.204443359375],[101.31044921875002,79.2326171875],[101.54306640625003,79.254443359375],[101.55527343750003,79.312646484375],[101.59062,79.350439453125],[101.64335937499999,79.361376953125],[101.76132812500003,79.37197265625],[101.82421875,79.37021484375],[101.912109375,79.31162109375],[102.00527343750002,79.263671875],[102.12851562500003,79.252490234375],[102.25126953124999,79.2560546875],[102.17724609375,79.31259765625],[102.1806640625,79.373388671875],[102.22509765625,79.412939453125],[102.28242187500001,79.430078125],[102.40488281250003,79.433203125],[102.78984374999999,79.392138671875],[103.04160156250003,79.33154296875],[103.09794921874999,79.29912109375],[103.05244140625001,79.28251953125],[102.93964843750001,79.27119140625],[102.884765625,79.253955078125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[140.04873046875002,75.828955078125],[140.15214843750005,75.809814453125],[140.2744140625,75.822412109375],[140.38906250000002,75.795849609375],[140.4962890625,75.689794921875],[140.54667968750005,75.66318359375],[140.60214843750003,75.6439453125],[140.65673828125,75.634130859375],[140.81591796875,75.630712890625],[140.88925781250003,75.652001953125],[140.94414062500005,75.70048828125],[140.9404296875,75.74951171875],[140.92656250000005,75.79892578125],[140.92578125,75.866845703125],[140.95029296875003,75.92734375],[140.9853515625,75.964501953125],[141.03261718750002,75.98896484375],[141.29931640625,76.06376953125],[141.48544921875003,76.137158203125],[141.74228515625003,76.108056640625],[142.00146484375,76.0435546875],[142.46035156250002,75.90361328125],[142.66953125000003,75.863427734375],[142.9267578125,75.826904296875],[143.18515625000003,75.813623046875],[143.31113281250003,75.822314453125],[143.55996093750002,75.860400390625],[143.68583984375005,75.863671875],[145.25527343750002,75.585595703125],[145.309765625,75.5640625],[145.35996093750003,75.53046875],[145.0234375,75.48974609375],[144.803125,75.416064453125],[144.7267578125,75.365576171875],[144.81425781250005,75.32451171875],[144.88349609375,75.2689453125],[144.40781250000003,75.102294921875],[144.216015625,75.0591796875],[144.0197265625,75.044677734375],[143.62587890625002,75.083984375],[143.39609375000003,75.082861328125],[143.17031250000002,75.11689453125],[142.9220703125,75.217431640625],[142.82011718750005,75.267822265625],[142.7294921875,75.337646484375],[142.69960937500002,75.448876953125],[142.73447265625003,75.544580078125],[142.86757812500002,75.57177734375],[142.98603515625,75.633251953125],[143.00244140625,75.65986328125],[142.94179687500002,75.71328125],[142.55156250000005,75.7208984375],[142.30791015625005,75.69169921875],[142.08623046875005,75.66064453125],[142.15107421875,75.457568359375],[142.19882812500003,75.39267578125],[142.26474609375003,75.346142578125],[142.61679687500003,75.133251953125],[142.69697265625,75.103076171875],[142.9296875,75.06240234375],[143.1279296875,74.9703125],[142.77822265625002,74.8677734375],[142.62607421875003,74.83740234375],[142.47275390625003,74.82041015625],[142.37841796875,74.828564453125],[142.28740234375005,74.84990234375],[142.18417968750003,74.899609375],[142.1,74.9509765625],[141.9873046875,74.991259765625],[141.74843750000002,74.982568359375],[141.52998046875,74.94716796875],[141.31044921875002,74.923193359375],[140.66074218750003,74.8818359375],[140.4638671875,74.8560546875],[140.26787109375005,74.846923828125],[140.01103515625005,74.894775390625],[139.75820312500002,74.96376953125],[139.68125,74.9640625],[139.60585937500002,74.94560546875],[139.548046875,74.904052734375],[139.51230468750003,74.83779296875],[139.43007812500002,74.74921875],[139.32558593750002,74.68681640625],[139.21533203125,74.65966796875],[139.09912109375,74.65654296875],[138.98173828125005,74.673681640625],[138.865625,74.700927734375],[138.09228515625,74.7974609375],[138.00136718750002,74.827001953125],[137.9150390625,74.870849609375],[137.68300781250002,75.008544921875],[137.56806640625,75.040576171875],[137.44697265625,75.05419921875],[137.21796875,75.12373046875],[137.00625,75.235009765625],[136.96230468750002,75.270361328125],[136.94765625000002,75.325537109375],[136.982421875,75.36533203125],[137.166015625,75.34658203125],[137.28974609375,75.3486328125],[137.21523437500002,75.55439453125],[137.26884765625005,75.7494140625],[137.35849609375003,75.781640625],[137.70654296875,75.7595703125],[137.59355468750005,75.823388671875],[137.501171875,75.90966796875],[137.560546875,75.955224609375],[137.62539062500002,75.98818359375],[137.7744140625,76.015673828125],[137.97705078125,76.027783203125],[138.03867187500003,76.047265625],[138.09599609375005,76.080517578125],[138.20761718750003,76.11494140625],[138.4306640625,76.130078125],[138.81396484375,76.19970703125],[138.91953125000003,76.196728515625],[139.017578125,76.160107421875],[139.10917968750005,76.108349609375],[139.21132812500002,76.080712890625],[139.528515625,76.013427734375],[139.743359375,75.953076171875],[140.04873046875002,75.828955078125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[142.18486328125005,73.8958984375],[142.43505859375,73.8515625],[142.63916015625,73.803076171875],[143.34375,73.56875],[143.41074218750003,73.520849609375],[143.46396484375003,73.45888671875],[143.49130859375003,73.246435546875],[143.45146484375005,73.231298828125],[143.19326171875002,73.220751953125],[142.84160156250005,73.24482421875],[142.5869140625,73.2533203125],[142.34218750000002,73.252880859375],[142.12636718750002,73.281689453125],[141.5966796875,73.31083984375],[141.18271484375003,73.389208984375],[140.75400390625003,73.446044921875],[140.66279296875,73.452001953125],[140.39248046875002,73.4353515625],[140.02695312500003,73.36142578125],[139.92509765625005,73.355224609375],[139.78554687500002,73.355224609375],[139.685546875,73.425732421875],[139.9201171875,73.448583984375],[140.15517578125002,73.45751953125],[140.38066406250005,73.4830078125],[140.59355468750005,73.56455078125],[140.6974609375,73.629150390625],[140.8837890625,73.7775390625],[140.98359375,73.83154296875],[141.08476562500005,73.865869140625],[141.18994140625,73.87646484375],[141.31191406250002,73.871875],[141.68193359375005,73.90419921875],[141.9318359375,73.91494140625],[142.18486328125005,73.8958984375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[146.79521484375005,75.370751953125],[147.06035156250005,75.364306640625],[147.4435546875,75.43798828125],[147.49697265625002,75.44052734375],[148.43242187500005,75.413525390625],[148.50888671875003,75.387451171875],[148.51884765625005,75.336474609375],[148.48916015625002,75.309375],[148.475,75.272412109375],[148.59013671875005,75.236376953125],[148.89218750000003,75.228125],[149.083203125,75.262060546875],[149.64531250000005,75.244580078125],[150.10390625000002,75.21923828125],[150.28066406250002,75.164013671875],[150.4171875,75.134326171875],[150.53056640625005,75.099853515625],[150.61289062500003,75.120166015625],[150.69033203125002,75.155322265625],[150.75693359375003,75.16240234375],[150.82236328125003,75.15654296875],[150.64628906250005,74.944580078125],[150.5802734375,74.9189453125],[150.33125,74.866796875],[149.8380859375,74.7953125],[149.596875,74.772607421875],[149.05019531250002,74.7724609375],[148.296875,74.800439453125],[148.09238281250003,74.82568359375],[147.971875,74.85732421875],[147.74091796875,74.931982421875],[147.62685546875002,74.958935546875],[147.25703125,74.98427734375],[147.14404296875,74.9984375],[146.92490234375003,75.0625],[146.7033203125,75.114208984375],[146.14853515625003,75.198291015625],[146.18613281250003,75.295556640625],[146.25761718750005,75.39375],[146.34296875,75.480908203125],[146.4384765625,75.558203125],[146.5375,75.581787109375],[146.7509765625,75.51044921875],[146.7482421875,75.428662109375],[146.79521484375005,75.370751953125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[173.26943359375002,-34.93476562500001],[173.28457031250002,-34.980566406250006],[173.33994140625003,-34.94794921875001],[173.38125,-34.896484375],[173.44785156250003,-34.844335937500006],[173.438671875,-34.928515625],[173.47265625,-34.94697265625001],[173.69375,-35.0056640625],[173.7392578125,-35.05458984375001],[173.78623046875003,-35.06855468750001],[173.81279296875005,-35.04121093750001],[173.8439453125,-35.02626953125001],[173.923828125,-35.05712890625],[174.10400390625,-35.14287109375],[174.11894531250005,-35.17236328125],[174.10976562500002,-35.21640625],[174.11875,-35.26289062500001],[174.14316406250003,-35.3],[174.20322265625003,-35.30859375],[174.28291015625,-35.253515625],[174.3203125,-35.246679687500006],[174.37333984375005,-35.32451171875],[174.39316406250003,-35.36855468750001],[174.3849609375,-35.36708984375001],[174.419140625,-35.410742187500006],[174.46474609375002,-35.4541015625],[174.54345703125,-35.58203125],[174.53173828125,-35.626953125],[174.50859375000005,-35.66738281250001],[174.58066406250003,-35.785546875],[174.53349609375005,-35.79375],[174.39101562500002,-35.77373046875],[174.39580078125005,-35.79736328125],[174.4787109375,-35.88408203125],[174.54873046875002,-36.006640625],[174.60488281250002,-36.08056640625],[174.80214843750002,-36.30947265625001],[174.7724609375,-36.39091796875],[174.77705078125,-36.44462890625],[174.75175781250005,-36.490820312500006],[174.81923828125002,-36.612109375],[174.77714843750005,-36.64980468750001],[174.74921875,-36.774023437500006],[174.71865234375002,-36.79580078125001],[174.72246093750005,-36.84121093750001],[174.801953125,-36.85322265625001],[174.84990234375005,-36.87255859375],[174.89140625000005,-36.909375],[174.9171875,-36.8650390625],[174.95205078125002,-36.85292968750001],[175.0470703125,-36.912207031250006],[175.2451171875,-36.971289062500006],[175.29951171875,-36.993261718750006],[175.32646484375005,-37.04091796875001],[175.3466796875,-37.15615234375001],[175.38535156250003,-37.20693359375001],[175.4609375,-37.21669921875001],[175.54248046875,-37.20136718750001],[175.56816406250005,-37.159375],[175.551953125,-37.046484375],[175.4931640625,-36.86572265625],[175.49287109375,-36.80693359375],[175.50126953125005,-36.748046875],[175.48740234375003,-36.689550781250006],[175.4580078125,-36.63427734375],[175.42636718750003,-36.591894531250006],[175.38554687500005,-36.55634765625001],[175.39980468750002,-36.50078125],[175.46083984375002,-36.475683593750006],[175.49765625000003,-36.52265625000001],[175.52802734375,-36.57929687500001],[175.68144531250005,-36.74697265625001],[175.77216796875,-36.73515625],[175.78066406250002,-36.80458984375001],[175.84218750000002,-36.875097656250006],[175.876171875,-36.95771484375001],[175.92109375,-37.20458984375],[175.99013671875002,-37.43701171875],[176.11455078125005,-37.53828125000001],[176.12900390625003,-37.58671875],[176.05332031250003,-37.56171875000001],[176.02988281250003,-37.576269531250006],[176.03789062500005,-37.600683593750006],[176.1083984375,-37.645117187500006],[176.19111328125,-37.6669921875],[176.2431640625,-37.6638671875],[176.29169921875,-37.680078125],[176.61474609375,-37.83095703125001],[176.77001953125,-37.8896484375],[177.16181640625,-37.98574218750001],[177.27402343750003,-37.99345703125],[177.3359375,-37.990820312500006],[177.4533203125,-37.957421875],[177.55830078125,-37.8974609375],[177.64892578125,-37.80781250000001],[177.72734375000005,-37.70556640625],[177.8126953125,-37.65595703125001],[177.90947265625005,-37.61689453125001],[177.9580078125,-37.580664062500006],[178.00917968750002,-37.55488281250001],[178.27216796875,-37.56689453125],[178.36074218750002,-37.61845703125],[178.47597656250002,-37.659765625],[178.53623046875003,-37.69208984375001],[178.51601562500002,-37.7576171875],[178.44707031250005,-37.85439453125001],[178.39394531250002,-37.96025390625],[178.34726562500003,-38.20087890625001],[178.3154296875,-38.44404296875001],[178.26767578125003,-38.551171875],[178.1806640625,-38.633691406249994],[178.08486328125002,-38.693945312500006],[177.97617187500003,-38.722265625],[177.93212890625,-38.860253906249994],[177.9103515625,-39.02177734375002],[177.91660156250003,-39.062402343749994],[177.9513671875,-39.09453125000002],[177.965625,-39.142480468749994],[177.90878906250003,-39.23955078125002],[177.87548828125,-39.225488281249994],[177.82871093750003,-39.14472656250001],[177.7861328125,-39.1109375],[177.65585937500003,-39.08574218750002],[177.52294921875,-39.073828125],[177.40751953125005,-39.081152343750006],[177.29658203125,-39.115820312500006],[177.12871093750005,-39.186132812500006],[177.07675781250003,-39.221777343750006],[177.03125,-39.26689453125002],[176.9541015625,-39.367578125],[176.9357421875,-39.49072265625],[176.93925781250005,-39.555273437500006],[176.96660156250005,-39.60517578125001],[177.10986328125,-39.67314453125002],[176.96796875,-39.910742187500006],[176.84218750000002,-40.1578125],[176.770703125,-40.228417968749994],[176.68876953125005,-40.29345703125],[176.6115234375,-40.441992187500006],[176.47646484375002,-40.57001953125001],[176.38515625000002,-40.66767578125001],[176.31386718750002,-40.768945312499994],[176.25175781250005,-40.876855468749994],[176.11865234375,-41.02910156250002],[176.05996093750002,-41.12968750000002],[175.98291015625,-41.21328125],[175.83964843750005,-41.32011718750002],[175.68730468750005,-41.41171875],[175.44707031250005,-41.53828125000001],[175.38027343750002,-41.580078125],[175.309765625,-41.61064453125002],[175.22216796875,-41.57441406250001],[175.20449218750002,-41.53496093750002],[175.18466796875003,-41.44902343750002],[175.165625,-41.417382812499994],[175.05390625,-41.391210937500006],[174.90605468750005,-41.43291015625002],[174.88134765625,-41.42402343750001],[174.8751953125,-41.404296875],[174.875,-41.278222656249994],[174.90019531250005,-41.24267578125],[174.865625,-41.223046875],[174.83154296875,-41.23076171875002],[174.81972656250002,-41.26289062500001],[174.84121093750002,-41.29072265625001],[174.75703125,-41.325292968750006],[174.66953125000003,-41.326269531250006],[174.64296875000002,-41.31269531250001],[174.63535156250003,-41.289453125],[174.65654296875005,-41.25126953125002],[174.68486328125005,-41.217675781249994],[174.84775390625003,-41.05878906250001],[175.016796875,-40.84765625],[175.1625,-40.62158203125],[175.20048828125005,-40.50537109375],[175.2541015625,-40.28935546875002],[175.21015625,-40.19941406250001],[175.15595703125,-40.11494140625001],[175.00927734375,-39.9521484375],[174.81376953125005,-39.86015625000002],[174.68730468750005,-39.84716796875],[174.56748046875003,-39.81298828125],[174.45468750000003,-39.73515625000002],[174.35205078125,-39.64335937500002],[174.1486328125,-39.56816406250002],[173.934375,-39.50908203125002],[173.81210937500003,-39.42578125],[173.78300781250005,-39.37617187500001],[173.763671875,-39.31875],[173.76640625000005,-39.26533203125001],[173.78164062500002,-39.21123046875002],[173.80605468750002,-39.16953125],[173.84433593750003,-39.13935546875001],[174.07138671875003,-39.03125],[174.31171875,-38.97109375],[174.35605468750003,-38.97216796875],[174.3984375,-38.96259765625001],[174.45849609375,-38.92578125],[174.56621093750005,-38.84160156250002],[174.59736328125,-38.785058593749994],[174.61855468750002,-38.60527343750002],[174.65302734375,-38.428320312500006],[174.71533203125,-38.2255859375],[174.80927734375,-38.09980468750001],[174.8400390625,-38.02265625000001],[174.80166015625002,-37.8955078125],[174.83681640625002,-37.84892578125],[174.87958984375,-37.82080078125],[174.92802734375005,-37.8044921875],[174.84599609375005,-37.68515625],[174.74941406250002,-37.5046875],[174.72919921875,-37.44873046875],[174.74394531250005,-37.39345703125001],[174.76767578125003,-37.33906250000001],[174.70742187500002,-37.325292968750006],[174.67255859375,-37.27314453125001],[174.58583984375002,-37.097753906250006],[174.60966796875005,-37.069921875],[174.65966796875,-37.08876953125001],[174.73427734375002,-37.215234375],[174.74638671875005,-37.15009765625001],[174.80361328125002,-37.11005859375001],[174.86386718750003,-37.08925781250001],[174.92890625,-37.084765625],[174.78203125000005,-36.94375],[174.73291015625,-36.94941406250001],[174.66796875,-36.971875],[174.60146484375002,-36.98574218750001],[174.53652343750002,-36.97333984375001],[174.4755859375,-36.94189453125],[174.44453125,-36.88251953125001],[174.40605468750005,-36.76826171875001],[174.38193359375003,-36.72597656250001],[174.18886718750002,-36.492285156250006],[174.24570312500003,-36.484960937500006],[174.4015625,-36.601953125],[174.43173828125003,-36.564550781250006],[174.454296875,-36.5107421875],[174.446875,-36.45087890625001],[174.40957031250002,-36.40556640625],[174.35410156250003,-36.3759765625],[174.353125,-36.322851562500006],[174.39541015625002,-36.27412109375001],[174.3927734375,-36.2400390625],[174.30351562500005,-36.170507812500006],[174.26787109375005,-36.1630859375],[174.25205078125003,-36.19560546875],[174.2775390625,-36.24375],[174.25371093750005,-36.249121093750006],[174.03642578125005,-36.12246093750001],[173.96933593750003,-36.020605468750006],[173.91445312500002,-35.90869140625],[173.90888671875,-35.954199218750006],[173.91728515625005,-36.018164062500006],[174.003125,-36.1462890625],[174.14238281250005,-36.289453125],[174.16640625000002,-36.32763671875],[174.14580078125005,-36.376953125],[174.09746093750005,-36.391015625],[174.0546875,-36.359765625],[173.99101562500005,-36.23720703125001],[173.94511718750005,-36.175878906250006],[173.41220703125003,-35.542578125],[173.48027343750005,-35.458984375],[173.58583984375002,-35.38857421875001],[173.6103515625,-35.3572265625],[173.626171875,-35.319140625],[173.58164062500003,-35.312597656250006],[173.54169921875,-35.3298828125],[173.49609375,-35.3623046875],[173.454296875,-35.39921875],[173.40166015625005,-35.48115234375001],[173.37636718750002,-35.500097656250006],[173.31396484375,-35.443359375],[173.290234375,-35.408300781250006],[173.2912109375,-35.366308593750006],[173.27451171875003,-35.3396484375],[173.228125,-35.33125],[173.16015625,-35.24775390625001],[173.11669921875,-35.20527343750001],[173.18876953125005,-35.12373046875001],[173.190625,-35.016210937500006],[173.11728515625003,-34.9033203125],[173.02958984375005,-34.799902343750006],[172.86074218750002,-34.63232421875],[172.70595703125002,-34.455175781250006],[172.87373046875,-34.43291015625],[173.0439453125,-34.42910156250001],[172.96376953125002,-34.53515625],[172.99980468750005,-34.596484375],[173.05439453125,-34.6482421875],[173.17109375,-34.80693359375],[173.18125,-34.85273437500001],[173.24052734375005,-34.899023437500006],[173.26943359375002,-34.93476562500001]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[173.11533203125003,-41.279296875],[173.23085937500002,-41.2841796875],[173.33779296875002,-41.2109375],[173.447265625,-41.1513671875],[173.5625,-41.10205078125],[173.73789062500003,-40.98896484375001],[173.78378906250003,-40.97236328125001],[173.89755859375003,-40.95078125],[173.94716796875002,-40.92412109375002],[174.00244140625,-40.91777343750002],[173.95283203125,-40.98486328125],[173.88984375,-41.007226562499994],[173.8798828125,-41.03144531250001],[173.91513671875003,-41.07011718750002],[173.8603515625,-41.124414062499994],[173.86240234375003,-41.19208984375001],[173.7978515625,-41.27197265625],[173.89707031250003,-41.239355468750006],[173.93339843750005,-41.18730468750002],[173.91464843750003,-41.15800781250002],[173.95761718750003,-41.09990234375002],[174.02402343750003,-41.072265625],[173.99755859375,-41.028125],[173.99941406250002,-40.993261718750006],[174.08056640625,-41.00615234375002],[174.12119140625003,-41.00468750000002],[174.15322265625002,-40.99091796875001],[174.21181640625002,-40.985449218750006],[174.223828125,-41.0244140625],[174.30253906250005,-41.01953125],[174.27392578125,-41.06875],[174.21367187500005,-41.125585937500006],[174.19951171875005,-41.16015625],[174.103125,-41.217382812500006],[174.03857421875,-41.24189453125001],[174.13808593750002,-41.24824218750001],[174.28359375000002,-41.17158203125001],[174.3701171875,-41.10371093750001],[174.36757812500002,-41.188378906249994],[174.29726562500002,-41.264257812500006],[174.23710937500005,-41.31220703125001],[174.16953125000003,-41.327050781249994],[174.10205078125,-41.36591796875001],[174.0693359375,-41.42949218750002],[174.07294921875,-41.4716796875],[174.09238281250003,-41.50517578125002],[174.1611328125,-41.56181640625002],[174.08369140625,-41.670800781249994],[174.169921875,-41.6572265625],[174.21708984375005,-41.677734375],[174.28310546875002,-41.740625],[174.243359375,-41.813085937500006],[174.21542968750003,-41.850195312500006],[174.04726562500002,-42.003027343750006],[173.97392578125005,-42.08056640625],[173.88798828125005,-42.13017578125002],[173.88916015625,-42.21162109375001],[173.83984375,-42.270898437499994],[173.58925781250002,-42.47392578125002],[173.5451171875,-42.51796875],[173.34755859375002,-42.8408203125],[173.22119140625,-42.9765625],[173.14882812500002,-43.02275390625002],[173.07236328125003,-43.06025390625001],[172.8888671875,-43.12421875000001],[172.80800781250002,-43.19775390625],[172.71855468750005,-43.2587890625],[172.6240234375,-43.2724609375],[172.626953125,-43.29951171875001],[172.6875,-43.31464843750001],[172.73476562500002,-43.35478515625002],[172.69970703125,-43.39970703125002],[172.63222656250002,-43.42792968750001],[172.56220703125,-43.43603515625],[172.52666015625005,-43.464746093749994],[172.69345703125003,-43.4443359375],[172.7404296875,-43.467871093750006],[172.74921875,-43.51728515625001],[172.7666015625,-43.561914062499994],[172.80703125000002,-43.620996093749994],[172.947265625,-43.65859375],[173.0732421875,-43.676171875],[173.09804687500002,-43.703515625],[173.11689453125,-43.7978515625],[173.0939453125,-43.844140625],[173.065625,-43.874609375],[173.02333984375002,-43.88544921875001],[172.92060546875,-43.89140625000002],[172.81767578125005,-43.8701171875],[172.74931640625005,-43.813085937500006],[172.5546875,-43.83134765625002],[172.50273437500005,-43.843652343749994],[172.47597656250002,-43.833398437499994],[172.58378906250005,-43.773535156250006],[172.52724609375002,-43.73945312500001],[172.48037109375002,-43.726660156250006],[172.4296875,-43.746484375],[172.39560546875003,-43.77783203125],[172.38525390625,-43.82958984375],[172.35039062500005,-43.859375],[172.29658203125,-43.86787109375001],[172.220703125,-43.825],[172.14580078125005,-43.763574218749994],[172.03554687500002,-43.701757812500006],[172.05224609375,-43.74003906250002],[172.13720703125,-43.83378906250002],[172.17978515625003,-43.89599609375],[172.08076171875,-43.94560546875002],[171.97763671875003,-43.984277343749994],[171.890625,-44.006933593750006],[171.80839843750005,-44.04228515625002],[171.71201171875003,-44.09746093750002],[171.65898437500005,-44.1171875],[171.5177734375,-44.11835937500001],[171.442578125,-44.135839843750006],[171.41748046875,-44.20869140625001],[171.36455078125005,-44.254980468750006],[171.24072265625,-44.26416015625],[171.2853515625,-44.278710937499994],[171.31298828125,-44.301855468750006],[171.23105468750003,-44.52119140625001],[171.2130859375,-44.612207031249994],[171.19785156250003,-44.76787109375002],[171.14628906250005,-44.91230468750001],[170.9990234375,-44.91142578125002],[171.02285156250002,-44.93701171875],[171.13417968750002,-44.97773437500001],[171.11328125,-45.03925781250001],[170.99072265625,-45.151464843750006],[170.9396484375,-45.21640625],[170.88994140625005,-45.373925781249994],[170.81523437500005,-45.519140625],[170.70058593750002,-45.68427734375001],[170.69970703125,-45.713964843750006],[170.73984375000003,-45.75605468750001],[170.78847656250002,-45.79248046875],[170.7912109375,-45.843847656250006],[170.77626953125002,-45.87089843750002],[170.72177734375003,-45.878027343750006],[170.67421875000002,-45.89570312500001],[170.419140625,-45.941015625],[170.33544921875,-45.991796875],[170.266796875,-46.082617187500006],[170.18613281250003,-46.16083984375001],[169.91826171875005,-46.334375],[169.7607421875,-46.47978515625002],[169.72910156250003,-46.521386718749994],[169.68662109375003,-46.551660156249994],[169.34228515625,-46.620507812499994],[169.0986328125,-46.63066406250002],[168.9658203125,-46.61298828125001],[168.83779296875002,-46.578222656250006],[168.766796875,-46.566308593749994],[168.63144531250003,-46.58759765625001],[168.572265625,-46.61103515625001],[168.46640625000003,-46.587890625],[168.38212890625005,-46.605371093749994],[168.35722656250005,-46.58837890625],[168.32568359375,-46.54570312500002],[168.34306640625005,-46.48906250000002],[168.31972656250002,-46.447167968749994],[168.26621093750003,-46.41875],[168.23027343750005,-46.3857421875],[168.18916015625,-46.362207031249994],[168.07734375,-46.352929687499994],[167.900390625,-46.367773437500006],[167.8419921875,-46.3662109375],[167.72207031250002,-46.227148437500006],[167.68222656250003,-46.19296875],[167.53945312500002,-46.148535156250006],[167.490625,-46.1546875],[167.4142578125,-46.22890625],[167.36894531250005,-46.24150390625002],[167.10029296875,-46.249414062499994],[166.83076171875,-46.225488281249994],[166.73154296875003,-46.197851562500006],[166.712109375,-46.133691406249994],[166.91669921875,-45.95722656250001],[166.8564453125,-45.980859375],[166.73027343750005,-46.052734375],[166.64990234375,-46.04169921875001],[166.72695312500002,-45.96328125],[166.73378906250002,-45.928320312500006],[166.71796875,-45.88935546875001],[166.61269531250002,-45.95537109375002],[166.4931640625,-45.9638671875],[166.47763671875003,-45.902734375],[166.48828125,-45.83183593750002],[166.512890625,-45.81171875000001],[166.83603515625003,-45.774511718750006],[166.95253906250002,-45.75019531250001],[167.00332031250002,-45.71210937500001],[166.80996093750002,-45.69902343750002],[166.79765625000005,-45.645605468750006],[166.82558593750002,-45.60283203125002],[166.99082031250003,-45.53173828125],[166.86904296875002,-45.549902343750006],[166.73398437500003,-45.543554687500006],[166.74306640625002,-45.46845703125001],[166.7783203125,-45.40966796875],[166.919921875,-45.40791015625001],[166.87558593750003,-45.367578125],[166.86923828125003,-45.31123046875001],[166.90859375000002,-45.30742187500002],[167.05214843750002,-45.383203125],[167.15566406250002,-45.41093750000002],[167.11210937500005,-45.35390625],[167.11777343750003,-45.31796875],[167.14531250000005,-45.301855468750006],[167.23007812500003,-45.29033203125002],[167.20683593750005,-45.2802734375],[167.12734375000002,-45.26582031250001],[167.03281250000003,-45.22246093750002],[167.02265625,-45.176660156249994],[167.02587890625,-45.123632812500006],[167.1279296875,-45.05078125],[167.18818359375,-45.094140625],[167.25947265625,-45.08222656250001],[167.205078125,-45.04814453125002],[167.171875,-44.9970703125],[167.19453125,-44.963476562500006],[167.41074218750003,-44.82792968750002],[167.46621093750002,-44.95830078125002],[167.47919921875,-44.9150390625],[167.48212890625,-44.873925781249994],[167.45625,-44.83828125],[167.4599609375,-44.80234375],[167.48496093750003,-44.771386718749994],[167.57763671875,-44.740820312500006],[167.69814453125002,-44.64130859375001],[167.78701171875002,-44.59501953125002],[167.859375,-44.62470703125001],[167.90898437500005,-44.66474609375001],[167.9015625,-44.625],[167.86640625,-44.59208984375002],[167.85654296875003,-44.50068359375001],[168.01835937500005,-44.358789062499994],[168.19619140625002,-44.2236328125],[168.36660156250002,-44.08203125],[168.45742187500002,-44.03056640625002],[168.65097656250003,-43.97216796875],[168.77480468750002,-43.996484375],[168.80644531250005,-43.99199218750002],[168.9904296875,-43.88994140625002],[169.06650390625003,-43.86347656250001],[169.1359375,-43.89990234375],[169.17890625,-43.9130859375],[169.1357421875,-43.81982421875],[169.16953125000003,-43.77705078125001],[169.32314453125002,-43.7015625],[169.51523437500003,-43.623632812500006],[169.66152343750002,-43.591210937499994],[169.76923828125,-43.538476562499994],[169.83388671875002,-43.537011718749994],[169.82402343750005,-43.497167968750006],[169.83505859375003,-43.458984375],[169.8908203125,-43.46162109375001],[169.90800781250005,-43.44658203125002],[169.85898437500003,-43.42597656250001],[170.017578125,-43.34941406250002],[170.1037109375,-43.265039062499994],[170.14882812500002,-43.24755859375],[170.1896484375,-43.222070312499994],[170.240234375,-43.16386718750002],[170.3,-43.144628906250006],[170.35576171875005,-43.15361328125002],[170.39609375000003,-43.182226562500006],[170.37431640625005,-43.134667968749994],[170.30283203125003,-43.10761718750001],[170.37949218750003,-43.06621093750002],[170.45869140625,-43.037695312500006],[170.53583984375,-43.058496093749994],[170.61181640625,-43.091796875],[170.53583984375,-43.04072265625001],[170.5236328125,-43.00898437500001],[170.61552734375005,-42.97246093750002],[170.66542968750002,-42.96123046875002],[170.73525390625002,-43.02978515625],[170.72529296875,-42.975488281249994],[170.74160156250002,-42.92734375],[170.84033203125,-42.8486328125],[170.969921875,-42.718359375],[171.01142578125,-42.763671875],[171.0177734375,-42.81875],[171.01171875,-42.88505859375002],[171.03837890625005,-42.86210937500002],[171.04755859375,-42.801855468750006],[171.02773437500002,-42.69609375000002],[171.18955078125003,-42.50048828125],[171.22128906250003,-42.478613281250006],[171.25703125,-42.46533203125],[171.31337890625002,-42.46015625000001],[171.29609375,-42.430566406249994],[171.25224609375005,-42.401953125],[171.29648437500003,-42.30253906250002],[171.32265625000002,-42.1890625],[171.36025390625002,-42.079980468749994],[171.42060546875,-41.973046875],[171.48623046875002,-41.79472656250002],[171.536328125,-41.75751953125001],[171.67216796875005,-41.744726562500006],[171.731640625,-41.719628906249994],[171.83066406250003,-41.655175781249994],[171.94804687500005,-41.538671875],[172.0107421875,-41.444726562499994],[172.09335937500003,-41.2015625],[172.13945312500005,-40.947265625],[172.27275390625005,-40.758691406249994],[172.46816406250002,-40.622167968750006],[172.640625,-40.51826171875001],[172.7111328125,-40.496679687500006],[172.83017578125003,-40.49003906250002],[172.94365234375005,-40.51875],[172.7326171875,-40.54375],[172.7111328125,-40.605371093749994],[172.70439453125005,-40.66777343750002],[172.72890625000002,-40.7236328125],[172.766796875,-40.7734375],[172.869140625,-40.8203125],[172.98867187500002,-40.848242187500006],[173.04228515625005,-40.95361328125],[173.05214843750002,-41.07861328125],[173.06865234375005,-41.18583984375002],[173.11533203125003,-41.279296875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[126.00595703125003,9.320947265624994],[126.08759765625001,9.2607421875],[126.193359375,9.276708984374991],[126.19199218750003,9.124902343749994],[126.20908203125003,9.08056640625],[126.30458984375002,8.952050781249994],[126.31953125000001,8.8447265625],[126.26298828124999,8.743945312499989],[126.22021484375,8.6962890625],[126.1416015625,8.627294921874991],[126.13955078125002,8.595654296874997],[126.17304687500001,8.56005859375],[126.28232421875003,8.539306640625],[126.36533203125003,8.48388671875],[126.37978515625002,8.326757812499991],[126.45869140625001,8.202832031249997],[126.45664062500003,8.148779296874991],[126.42529296875,7.927441406249997],[126.43535156249999,7.832812499999989],[126.49443359374999,7.756982421874994],[126.54443359375,7.724804687499997],[126.57011718749999,7.67724609375],[126.59335937500003,7.546777343749994],[126.58925781250002,7.325146484374997],[126.58154296875,7.247753906249997],[126.54667968749999,7.175830078124989],[126.43906250000003,7.012353515624994],[126.29404296875003,6.88232421875],[126.21689453125003,6.891015625],[126.19208984375001,6.8525390625],[126.240234375,6.73388671875],[126.22119140625,6.4833984375],[126.18935546875002,6.309667968749991],[126.14248046875002,6.397558593749991],[126.10976562500002,6.489648437499994],[126.080078125,6.733349609374997],[126.04306640625003,6.843164062499994],[125.98496093750003,6.943554687499997],[125.96162109375001,7.033203125],[125.90117187499999,7.116992187499989],[125.82441406250001,7.333300781249989],[125.77363281250001,7.322167968749994],[125.68925781249999,7.263037109374991],[125.67021484374999,7.222314453124994],[125.66025390625003,7.160595703124997],[125.64072265625003,7.105078125],[125.54218750000001,7.0166015625],[125.46474609375002,6.9111328125],[125.40097656250003,6.795751953124991],[125.38066406249999,6.68994140625],[125.43291015624999,6.607128906249997],[125.48662109374999,6.57373046875],[125.56455078125003,6.499609375],[125.58847656250003,6.465771484374997],[125.67070312499999,6.225],[125.66796875,5.978662109374994],[125.60781250000002,5.870166015624989],[125.45585937499999,5.664257812499997],[125.34648437499999,5.598974609374991],[125.28789062499999,5.632275390624997],[125.24101562499999,5.756933593749991],[125.23320312499999,5.808300781249997],[125.26494140624999,5.925585937499989],[125.26845703125002,6.033154296874997],[125.23154296875003,6.06953125],[125.19101562500003,6.0625],[125.17402343750001,6.046972656249991],[125.076171875,5.90625],[125.03535156250001,5.870654296874989],[124.97519531250003,5.86572265625],[124.92734375000003,5.875341796874991],[124.63632812500003,5.998193359374994],[124.39882812500002,6.119726562499991],[124.21279296875002,6.233251953124991],[124.078125,6.404443359374994],[124.04970703125002,6.532568359374991],[124.04814453124999,6.666552734374989],[123.98789062500003,6.862988281249997],[123.98085937500002,6.9296875],[123.98525390625002,6.993701171874989],[124.04511718750001,7.114111328124991],[124.11757812500002,7.175097656249989],[124.158203125,7.218798828124989],[124.19072265624999,7.267333984375],[124.212890625,7.332128906249991],[124.20664062500003,7.396435546874997],[124.18242187499999,7.43671875],[124.06796875000003,7.577880859375],[123.96845703125001,7.664648437499991],[123.76474609375003,7.742626953124997],[123.71738281250003,7.785400390625],[123.66582031249999,7.817773437499994],[123.60888671875,7.831640625],[123.55322265625,7.832128906249991],[123.49306640625002,7.807910156249989],[123.47744140625002,7.75634765625],[123.48164062500001,7.710253906249989],[123.47636718749999,7.665380859374991],[123.39091796874999,7.407519531249989],[123.28203124999999,7.464111328125],[123.17822265625,7.529443359374994],[123.15068359374999,7.5751953125],[123.13876953125003,7.629931640624989],[123.12119140625003,7.666894531249994],[123.0966796875,7.700439453125],[123.04892578125003,7.614355468749991],[122.98955078124999,7.546289062499994],[122.91689453125002,7.530517578125],[122.84296875000001,7.529296875],[122.81875,7.558496093749994],[122.79179687499999,7.722460937499989],[122.71396484375003,7.774121093749997],[122.6162109375,7.763134765624997],[122.49794921875002,7.672753906249994],[122.47441406249999,7.638964843749989],[122.44863281250002,7.561132812499991],[122.31972656250002,7.340234375],[122.25146484375,7.170019531249991],[122.17617187500002,7.004199218749989],[122.14248046875002,6.949658203124997],[122.09814453125,6.913720703124994],[122.02763671874999,6.928613281249994],[121.96425781250002,6.968212890624997],[121.90419921875002,7.0751953125],[121.92460937499999,7.199511718749989],[121.99111328125002,7.278759765624997],[122.04716796874999,7.363574218749989],[122.11484375000003,7.659912109375],[122.11992187499999,7.765380859375],[122.1318359375,7.810498046874997],[122.24335937500001,7.945117187499989],[122.33710937500001,8.028417968749991],[122.38671875,8.0458984375],[122.58945312500003,8.093310546874989],[122.67294921875003,8.133105468749989],[122.80439453125001,8.133691406249994],[122.9111328125,8.156445312499997],[122.99628906250001,8.220507812499989],[123.00273437499999,8.286914062499989],[122.99882812499999,8.356054687499991],[123.017578125,8.398339843749994],[123.05058593749999,8.433935546874991],[123.09589843750001,8.480810546874991],[123.14716796875001,8.516015625],[123.29287109375002,8.541455078124997],[123.34121093750002,8.570410156249991],[123.38017578124999,8.615625],[123.4345703125,8.703320312499997],[123.49892578125002,8.681542968749994],[123.56367187500001,8.6474609375],[123.68007812500002,8.62060546875],[123.78339843750001,8.547705078124991],[123.84921875000003,8.432714843749991],[123.86054687500001,8.376074218749991],[123.87744140625,8.188818359374991],[123.85341796875002,8.145117187499991],[123.753125,8.058251953124994],[123.79941406250003,8.049121093749989],[123.93115234375,8.12841796875],[123.99687,8.158984374999989],[124.159375,8.201464843749989],[124.19765625000002,8.229541015624989],[124.22578125000001,8.271386718749994],[124.283203125,8.385986328125],[124.3251953125,8.508447265624994],[124.35791015625,8.559423828124991],[124.40488281250003,8.599853515625],[124.45126953125003,8.606347656249994],[124.62177734375001,8.52265625],[124.73115234375001,8.56298828125],[124.76171875,8.689794921874991],[124.78681640625001,8.874121093749991],[124.80615234375,8.924023437499997],[124.86894531249999,8.972265625],[124.94384765625,8.956689453124994],[125.04638671875,8.890527343749994],[125.14101562500002,8.86875],[125.17617187500002,8.922070312499997],[125.20966796875001,9.027148437499989],[125.24785156249999,9.0265625],[125.37558593750003,8.991796875],[125.49873046875001,9.014746093749991],[125.53339843750001,9.140917968749989],[125.51015625000002,9.27587890625],[125.41396484375002,9.669189453125],[125.47128906250003,9.756787109374997],[125.52089843750002,9.759130859374991],[125.64248046875002,9.654492187499997],[125.87666015625001,9.513134765624997],[125.95468750000003,9.426660156249994],[126.00595703125003,9.320947265624994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[121.1015625,18.615283203125003],[121.25449218750003,18.563427734374997],[121.59296875000001,18.37646484375],[121.716796875,18.330078125],[121.84560546875002,18.29541015625],[121.94755859374999,18.28515625],[122.03847656250002,18.327929687500003],[122.07695312499999,18.37167968749999],[122.14667968750001,18.486572265625],[122.22119140625,18.500634765624994],[122.26552734375002,18.45883789062499],[122.2998046875,18.402783203124997],[122.31503906250003,18.3203125],[122.29384765625002,18.234277343749994],[122.22285156250001,18.157128906249994],[122.17949218749999,18.064257812500003],[122.15097656250003,17.756494140624994],[122.15234375,17.66440429687499],[122.17519531250002,17.57568359375],[122.23681640625,17.434863281250003],[122.26904296875,17.395263671875],[122.3623046875,17.344873046874994],[122.3875,17.306787109374994],[122.39287109374999,17.23837890624999],[122.40751953124999,17.178125],[122.46787109375003,17.15512695312499],[122.51914062500003,17.12485351562499],[122.5,17.058007812499994],[122.46796875000001,16.990039062500003],[122.42578125,16.82265625],[122.22587890624999,16.435205078124994],[122.21416015624999,16.351513671874997],[122.13515625000002,16.184814453125],[121.97470703125003,16.157910156249997],[121.78867187500003,16.077441406250003],[121.68515625000003,16.01474609374999],[121.59531250000003,15.933251953124994],[121.56093750000002,15.826757812499991],[121.59042968750003,15.778027343749997],[121.60917968749999,15.726025390624997],[121.60703125000003,15.669824218749994],[121.57919921875003,15.623193359374994],[121.48984375000003,15.509521484375],[121.45205078125002,15.416650390624994],[121.41191406249999,15.375048828125003],[121.39228515625001,15.324414062499997],[121.39892578125,15.2666015625],[121.43496093750002,15.21630859375],[121.5439453125,14.999169921874994],[121.66054687500002,14.789501953124997],[121.68564453125003,14.765429687500003],[121.69541015625003,14.7373046875],[121.62656250000003,14.681738281249991],[121.6279296875,14.581152343749991],[121.64853515625003,14.481494140625003],[121.75185546875002,14.234179687500003],[121.7666015625,14.168066406249991],[121.80048828125001,14.113867187499991],[121.85332031249999,14.063085937499991],[121.91171875000003,14.020410156249994],[122.07958984375,13.947119140624991],[122.14433593749999,13.932714843749991],[122.21171874999999,13.93017578125],[122.22841796875002,13.9794921875],[122.2875,13.996191406249991],[122.2744140625,14.044726562500003],[122.20253906250002,14.111669921874991],[122.19970703125,14.148046875],[122.2375,14.175048828125],[122.28261718750002,14.190820312499994],[122.38369140625002,14.263867187499997],[122.49082031250003,14.322363281249991],[122.62714843750001,14.317529296874994],[122.76103515624999,14.284863281249997],[122.85605468750003,14.25078125],[122.93417968750003,14.188085937499991],[123.01455078125002,14.079833984375],[123.07099609375001,13.9599609375],[123.07070312500002,13.902734375],[123.05693359374999,13.845458984375],[123.05996093750002,13.788769531249997],[123.10195312500002,13.750244140625],[123.2314453125,13.747363281250003],[123.29697265625003,13.83642578125],[123.30537109375001,13.936572265625003],[123.25927734375,13.975439453124991],[123.28046875000001,14.024804687499994],[123.3203125,14.061669921874994],[123.37744140625,14.028662109374991],[123.43232421875001,13.966259765624997],[123.6328125,13.898486328125003],[123.68408203125,13.897021484375003],[123.72597656250002,13.884326171875003],[123.81572265624999,13.837109375],[123.85761718750001,13.799609375],[123.80625,13.721728515625003],[123.60712890625001,13.704443359374991],[123.54960937499999,13.645751953125],[123.60810546875001,13.528076171875],[123.70361328125,13.431591796874997],[123.76484375000001,13.353515625],[123.81923828125002,13.269482421874997],[123.81660156250001,13.191601562499997],[123.78515625,13.110546875],[123.87275390625001,13.116992187499989],[123.95517578125003,13.099707031249991],[124.06914062499999,13.031933593749997],[124.10458984375003,13.025],[124.14277343750001,13.035791015624994],[124.13730468750003,12.791162109374994],[124.05976562500001,12.567089843749997],[123.96171874999999,12.594970703125],[123.87783203125002,12.689697265625],[123.89492187500002,12.804980468749989],[123.94853515624999,12.91640625],[123.91796875,12.93994140625],[123.86386718750003,12.9306640625],[123.80234375000003,12.905566406249989],[123.73603515625001,12.896923828124997],[123.62675781249999,12.911767578124994],[123.40234375,13.033105468749994],[123.31093750000002,13.044091796874994],[123.29042968750002,13.099023437499994],[123.29550781250003,13.215576171875],[123.20595703125002,13.353515625],[123.19160156250001,13.402880859375003],[123.16328125000001,13.441748046874991],[122.89619140625001,13.591943359374994],[122.86347656250001,13.617236328125003],[122.78134765625003,13.737060546875],[122.59521484375,13.907617187499994],[122.54306640625003,13.925048828125],[122.486328125,13.929980468750003],[122.46796875000001,13.88671875],[122.49375,13.820214843749994],[122.50419921874999,13.763085937499994],[122.50019531250001,13.703173828125003],[122.50800781250001,13.656835937499991],[122.59619140625,13.56201171875],[122.609375,13.517138671875003],[122.66787109375002,13.395361328124991],[122.67509765624999,13.253173828125],[122.59990234374999,13.194140624999989],[122.51523437500003,13.260009765625],[122.5125,13.313623046874994],[122.49794921875002,13.363525390625],[122.40693359375001,13.492773437499991],[122.37656250000003,13.520605468749991],[122.20527343750001,13.648242187500003],[122.07275390625,13.788378906250003],[121.77792968750003,13.937646484374994],[121.74287109375001,13.945849609375003],[121.69169921874999,13.9345703125],[121.64345703125002,13.915966796874997],[121.50107421875003,13.8421875],[121.45078125000003,13.790771484375],[121.4462890625,13.711865234374997],[121.34414062500002,13.649121093749997],[121.20351562500002,13.640283203124994],[121.09550781249999,13.679492187500003],[121.00615234374999,13.758105468750003],[120.93232421875001,13.761865234374994],[120.84072265625002,13.884716796874997],[120.72910156250003,13.900537109374994],[120.63710937500002,13.804492187500003],[120.61738281250001,13.9953125],[120.61679687500003,14.188037109375003],[120.64267578125003,14.244335937499997],[120.68828124999999,14.291210937499997],[120.92207031250001,14.493115234374997],[120.95156250000002,14.557958984374991],[120.94130859375002,14.645068359375003],[120.88808593750002,14.715771484374997],[120.80449218749999,14.7587890625],[120.70791015625002,14.776611328125],[120.63828125000003,14.816162109375],[120.58369140625001,14.88125],[120.54677734375002,14.76611328125],[120.58271484375001,14.594628906249994],[120.58867187499999,14.483105468749997],[120.5556640625,14.441357421874997],[120.49570312500003,14.440185546875],[120.43876953124999,14.453369140625],[120.39609375000003,14.493310546874994],[120.365234375,14.608300781249994],[120.28388671875001,14.684375],[120.25078124999999,14.793310546874991],[120.2138671875,14.808789062499997],[120.13798828124999,14.800390625],[120.08212890625003,14.85107421875],[120.04453125000003,14.978125],[120.03662109375,15.114550781250003],[120.00498046875003,15.229248046875],[119.959375,15.340234375],[119.93281250000001,15.430908203125],[119.8916015625,15.837695312500003],[119.88144531250003,15.875],[119.85966796874999,15.90576171875],[119.80820312500003,15.951953125],[119.76894531250002,16.008447265624994],[119.76181640625003,16.054980468750003],[119.77255859375003,16.255126953125],[119.79023437500001,16.30332031249999],[119.83076171875001,16.3265625],[119.88613281250002,16.287402343750003],[119.93037109375001,16.23876953125],[119.98515624999999,16.21542968749999],[120.03339843750001,16.1845703125],[120.1240234375,16.066210937500003],[120.15976562500003,16.04765625],[120.27128906249999,16.051416015624994],[120.33701171875003,16.066455078125003],[120.36875,16.109570312499997],[120.38876953125003,16.1609375],[120.38925781250003,16.221630859374997],[120.325,16.400341796874997],[120.30527343750003,16.529248046874997],[120.30439453125001,16.645458984374997],[120.32119140625002,16.761865234374994],[120.40888671875001,16.955615234375003],[120.42011718750001,17.090087890625],[120.41171875000003,17.269921875],[120.42714843750002,17.376904296874997],[120.42451171875001,17.43833007812499],[120.3720703125,17.535107421874997],[120.3583984375,17.63818359375],[120.50507812500001,18.162646484375003],[120.55097656250001,18.2640625],[120.58447265625,18.36875],[120.59970703125003,18.507861328125003],[120.709375,18.545947265625003],[120.81376953124999,18.603417968749994],[120.86777343750003,18.598925781250003],[120.925,18.585107421874994],[121.05136718750003,18.613671875],[121.1015625,18.615283203125003]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[133.47265625,-0.726171875],[133.7236328125,-0.741406250000011],[133.85029296875,-0.7314453125],[133.97451171875002,-0.744335937500011],[134.02490234375,-0.769726562500011],[134.1115234375,-0.846777343750006],[134.08671875000005,-0.897363281250009],[134.07197265625,-1.001855468750009],[134.1162109375,-1.102441406250009],[134.18828125000005,-1.203125],[134.24716796875003,-1.310546875],[134.25957031250005,-1.362988281250011],[134.23720703125002,-1.47412109375],[134.2169921875,-1.529101562500003],[134.14541015625002,-1.620800781250011],[134.10585937500002,-1.720996093750003],[134.13125,-1.84453125],[134.14541015625002,-1.96875],[134.1427734375,-2.082910156250009],[134.15566406250002,-2.195214843750009],[134.19482421875,-2.30908203125],[134.36210937500005,-2.620996093750009],[134.4599609375,-2.832324218750003],[134.4912109375,-2.714257812500009],[134.48330078125002,-2.5830078125],[134.51796875000002,-2.53564453125],[134.56689453125,-2.510449218750011],[134.62744140625,-2.53671875],[134.6447265625,-2.58984375],[134.64902343750003,-2.705859375],[134.7021484375,-2.93359375],[134.76982421875005,-2.944042968750011],[134.84335937500003,-2.9091796875],[134.85537109375002,-2.978808593750003],[134.852734375,-3.107617187500011],[134.88681640625003,-3.209863281250009],[134.9171875,-3.249902343750009],[135.03740234375005,-3.333105468750006],[135.09218750000002,-3.348535156250009],[135.25156250000003,-3.368554687500009],[135.37158203125,-3.374902343750009],[135.48662109375005,-3.345117187500009],[135.5607421875,-3.26875],[135.62773437500005,-3.18603515625],[135.85917968750005,-2.995312500000011],[135.92617187500002,-2.904101562500003],[135.99072265625,-2.764257812500006],[136.01298828125005,-2.734277343750009],[136.24326171875003,-2.583105468750006],[136.26953125,-2.529492187500011],[136.30253906250005,-2.425683593750009],[136.35244140625002,-2.3251953125],[136.38994140625005,-2.273339843750009],[136.6123046875,-2.224316406250011],[136.84326171875,-2.19765625],[137.07207031250005,-2.105078125],[137.17109375,-2.025488281250006],[137.17578125,-1.97314453125],[137.12548828125,-1.88125],[137.12343750000002,-1.840917968750006],[137.17646484375,-1.802148437500009],[137.38056640625,-1.685644531250006],[137.61660156250002,-1.565820312500009],[137.80625,-1.483203125],[137.9111328125,-1.483789062500009],[138.0078125,-1.556542968750009],[138.11093750000003,-1.615917968750011],[138.64980468750002,-1.791113281250006],[138.73613281250005,-1.845507812500003],[138.81142578125002,-1.917773437500003],[138.919140625,-1.967871093750006],[139.03945312500002,-1.992089843750009],[139.14882812500002,-2.038867187500003],[139.25263671875,-2.09921875],[139.48183593750002,-2.211816406250009],[139.78955078125,-2.348242187500006],[139.868359375,-2.3564453125],[140.15458984375005,-2.35],[140.20400390625002,-2.375683593750011],[140.2509765625,-2.412011718750009],[140.29462890625,-2.42041015625],[140.62255859375,-2.44580078125],[140.673046875,-2.472070312500009],[140.72050781250005,-2.508105468750003],[140.74746093750002,-2.607128906250011],[141.10478515625005,-2.611328125],[141.18564453125003,-2.627832031250009],[141.68681640625005,-2.845019531250003],[141.83652343750003,-2.93212890625],[141.8875,-2.952539062500009],[141.93779296875005,-2.953320312500011],[141.98574218750002,-2.963574218750011],[142.21152343750003,-3.08349609375],[142.5490234375,-3.20458984375],[142.90517578125002,-3.320703125],[143.015625,-3.344921875000011],[143.12998046875003,-3.355078125],[143.37832031250002,-3.3953125],[143.508984375,-3.43115234375],[143.70058593750002,-3.573339843750006],[143.79716796875005,-3.617285156250006],[143.8876953125,-3.697460937500011],[144.0158203125,-3.78359375],[144.06640625,-3.80517578125],[144.12197265625002,-3.815234375],[144.24794921875002,-3.818261718750009],[144.37441406250002,-3.802734375],[144.42656250000005,-3.809667968750006],[144.477734375,-3.825292968750006],[144.52451171875003,-3.855273437500003],[144.54824218750002,-3.9130859375],[144.62666015625,-3.993066406250009],[144.73789062500003,-4.029101562500003],[144.84345703125,-4.101464843750009],[144.9384765625,-4.188183593750011],[145.00839843750003,-4.275488281250006],[145.08779296875002,-4.34912109375],[145.2080078125,-4.380273437500009],[145.33457031250003,-4.38525390625],[145.76699218750002,-4.823046875],[145.7880859375,-4.890625],[145.79287109375002,-5.177929687500011],[145.74521484375003,-5.402441406250006],[145.85283203125005,-5.471289062500006],[145.99941406250002,-5.4970703125],[146.20537109375005,-5.545117187500011],[146.40341796875003,-5.616601562500009],[147.03427734375003,-5.919238281250003],[147.12089843750005,-5.945019531250011],[147.2482421875,-5.954785156250011],[147.37666015625,-5.95078125],[147.42275390625002,-5.966210937500009],[147.5185546875,-6.02109375],[147.56669921875005,-6.056933593750003],[147.65302734375,-6.15478515625],[147.73007812500003,-6.261132812500009],[147.762890625,-6.29150390625],[147.80205078125005,-6.315234375],[147.82451171875005,-6.373046875],[147.8544921875,-6.551171875],[147.84550781250005,-6.662402343750003],[147.81044921875002,-6.70361328125],[147.70957031250003,-6.7236328125],[147.35576171875005,-6.742382812500011],[147.119140625,-6.7216796875],[146.95361328125,-6.834082031250006],[146.94921875,-6.883105468750003],[146.96074218750005,-6.928808593750006],[147.10488281250002,-7.1669921875],[147.19003906250003,-7.378125],[147.26015625000002,-7.464062500000011],[147.36533203125003,-7.533789062500006],[147.458984375,-7.6162109375],[147.5451171875,-7.7109375],[147.72431640625,-7.876269531250003],[147.821875,-7.9375],[147.93613281250003,-7.975390625],[148.12675781250005,-8.103613281250006],[148.15195312500003,-8.160253906250006],[148.20644531250002,-8.338671875],[148.22998046875,-8.459667968750011],[148.23359375,-8.509570312500003],[148.246875,-8.554296875],[148.41445312500002,-8.663964843750009],[148.451171875,-8.694531250000011],[148.52587890625,-8.938574218750006],[148.58310546875003,-9.0517578125],[148.67949218750005,-9.091992187500011],[148.79179687500005,-9.089453125],[149.09746093750005,-9.016894531250003],[149.14169921875003,-9.014550781250009],[149.19833984375003,-9.03125],[149.24765625000003,-9.070996093750011],[149.26406250000002,-9.180761718750006],[149.21621093750002,-9.2958984375],[149.20302734375002,-9.406835937500006],[149.26318359375,-9.497851562500003],[149.41875,-9.56884765625],[149.47578125,-9.58828125],[149.75576171875002,-9.6109375],[149.865625,-9.630078125000011],[149.97353515625002,-9.660742187500006],[150.01103515625005,-9.688183593750011],[149.98466796875005,-9.737011718750011],[149.92822265625,-9.760839843750006],[149.86435546875003,-9.770605468750006],[149.76123046875,-9.805859375000011],[149.76308593750002,-9.86865234375],[149.8212890625,-9.934179687500006],[149.87441406250002,-10.012988281250003],[149.919140625,-10.041601562500006],[149.96757812500005,-10.060742187500011],[150.08857421875,-10.088085937500011],[150.20625,-10.125585937500006],[150.28388671875,-10.162890625],[150.36406250000005,-10.189648437500011],[150.53886718750005,-10.206738281250011],[150.6669921875,-10.257128906250003],[150.84951171875002,-10.236035156250011],[150.69130859375002,-10.31787109375],[150.63681640625003,-10.337988281250006],[150.44609375000005,-10.307324218750011],[150.41025390625003,-10.339257812500009],[150.48886718750003,-10.42578125],[150.60546875,-10.484082031250011],[150.64716796875,-10.51796875],[150.61796875000005,-10.5576171875],[150.482421875,-10.636914062500011],[150.42578125,-10.648535156250006],[150.31992187500003,-10.654882812500006],[150.14238281250005,-10.620703125],[150.016796875,-10.5771484375],[149.98154296875003,-10.517675781250006],[149.94804687500005,-10.482617187500011],[149.83476562500005,-10.398828125],[149.7541015625,-10.35302734375],[149.6513671875,-10.3375],[149.54433593750002,-10.338476562500006],[149.35263671875003,-10.289746093750011],[148.93681640625005,-10.255175781250003],[148.83769531250005,-10.233984375],[148.712890625,-10.166894531250009],[148.65419921875002,-10.157324218750006],[148.59121093750002,-10.178417968750011],[148.43056640625002,-10.19140625],[148.38339843750003,-10.185449218750009],[148.26875,-10.128222656250003],[148.15048828125003,-10.107324218750009],[148.10126953125,-10.12451171875],[148.05136718750003,-10.128320312500009],[147.89013671875,-10.08740234375],[147.76865234375003,-10.070117187500003],[147.66884765625002,-10.013085937500009],[147.61435546875003,-9.959765625],[147.553125,-9.912402343750003],[147.49648437500002,-9.790429687500009],[147.40830078125003,-9.674707031250009],[147.29892578125003,-9.57958984375],[147.064453125,-9.426074218750003],[147.01718750000003,-9.387890625000011],[146.92539062500003,-9.247167968750006],[146.93037109375,-9.15390625],[146.96376953125002,-9.0595703125],[146.91328125,-9.091699218750009],[146.85625,-9.087695312500003],[146.69658203125005,-9.025390625],[146.630859375,-8.951171875],[146.52412109375,-8.749707031250011],[146.45585937500005,-8.6435546875],[146.29648437500003,-8.45556640625],[146.25058593750003,-8.343945312500011],[146.18408203125,-8.246386718750003],[146.14296875000002,-8.210253906250003],[146.10878906250002,-8.16845703125],[146.07851562500002,-8.114160156250009],[146.033203125,-8.076367187500011],[145.81093750000002,-7.992773437500006],[145.77177734375005,-7.96640625],[145.7287109375,-7.952441406250003],[145.56337890625002,-7.94384765625],[145.4677734375,-7.930078125],[145.2875,-7.861621093750003],[145.1943359375,-7.841113281250003],[145.08232421875005,-7.828125],[144.973828125,-7.802148437500009],[144.9208984375,-7.776660156250003],[144.88535156250003,-7.733593750000011],[144.8642578125,-7.631542968750011],[144.7734375,-7.642480468750009],[144.684375,-7.624804687500003],[144.59794921875005,-7.588964843750006],[144.50986328125003,-7.5673828125],[144.44970703125,-7.59814453125],[144.43125,-7.679394531250011],[144.40341796875003,-7.68359375],[144.35185546875005,-7.6669921875],[144.326171875,-7.6767578125],[144.27021484375,-7.714257812500009],[144.22539062500005,-7.764941406250003],[144.14287109375005,-7.757226562500009],[143.9736328125,-7.705957031250009],[143.89824218750005,-7.673828125],[143.8341796875,-7.615917968750011],[143.77910156250005,-7.550097656250003],[143.72333984375,-7.498242187500011],[143.65488281250003,-7.460351562500009],[143.74208984375002,-7.5498046875],[143.94228515625002,-7.944238281250009],[143.89218750000003,-7.951855468750011],[143.840625,-7.94189453125],[143.88798828125005,-8.017675781250006],[143.83339843750002,-8.029101562500003],[143.779296875,-8.028222656250009],[143.6650390625,-7.995507812500009],[143.55156250000005,-7.984667968750003],[143.51816406250003,-8.000683593750011],[143.5421875,-8.029101562500003],[143.58203125,-8.112695312500009],[143.61376953125,-8.200390625000011],[143.45,-8.23984375],[143.28203125000005,-8.263867187500011],[143.094921875,-8.311230468750011],[142.90546875,-8.314453125],[142.80830078125,-8.2875],[142.70859375000003,-8.272265625],[142.61503906250005,-8.2875],[142.52412109375,-8.321679687500009],[142.44755859375005,-8.316210937500003],[142.39921875000005,-8.2546875],[142.37646484375,-8.2080078125],[142.34746093750005,-8.16748046875],[142.27587890625,-8.173925781250006],[142.20683593750005,-8.19580078125],[142.32509765625002,-8.198339843750006],[142.360546875,-8.25],[142.39101562500002,-8.312695312500011],[142.4748046875,-8.369433593750003],[142.57597656250005,-8.335644531250011],[142.79794921875003,-8.345019531250003],[143.013671875,-8.44384765625],[143.06484375000002,-8.455175781250006],[143.11181640625,-8.474511718750009],[143.22294921875005,-8.572167968750009],[143.30673828125003,-8.6609375],[143.37724609375005,-8.76220703125],[143.39218750000003,-8.801855468750006],[143.3875,-8.908203125],[143.3662109375,-8.961035156250006],[143.22685546875005,-9.0359375],[143.07822265625003,-9.092480468750011],[142.85917968750005,-9.20263671875],[142.64716796875,-9.327832031250011],[142.53574218750003,-9.303320312500006],[142.43525390625,-9.237011718750011],[142.39628906250005,-9.219042968750003],[142.29277343750005,-9.182910156250003],[142.22958984375003,-9.169921875],[141.97890625000002,-9.198144531250009],[141.72734375000005,-9.212597656250011],[141.62158203125,-9.211328125],[141.51875,-9.190136718750011],[141.40566406250002,-9.150683593750003],[141.29365234375,-9.168164062500011],[141.2169921875,-9.214453125],[141.13320312500002,-9.221289062500006],[140.92460937500005,-9.085058593750006],[140.78652343750002,-8.973730468750006],[140.66152343750002,-8.846777343750006],[140.5810546875,-8.728320312500003],[140.48974609375,-8.620410156250003],[140.10166015625003,-8.300585937500003],[140.0029296875,-8.195507812500011],[139.98330078125002,-8.16650390625],[139.99257812500002,-8.139355468750011],[140.03740234375005,-8.083984375],[140.11699218750005,-7.923730468750009],[140.03378906250003,-8.022753906250003],[139.934765625,-8.101171875],[139.79082031250005,-8.106347656250009],[139.6494140625,-8.125390625],[139.5185546875,-8.172753906250009],[139.38564453125002,-8.1890625],[139.31914062500005,-8.165820312500003],[139.27910156250005,-8.10693359375],[139.25830078125,-8.046582031250011],[139.24882812500005,-7.982421875],[139.19296875000003,-8.086132812500011],[139.083203125,-8.142871093750003],[138.93349609375002,-8.262402343750011],[138.890625,-8.23779296875],[138.86474609375,-8.192285156250009],[138.85615234375,-8.145117187500006],[138.88505859375005,-8.0947265625],[138.90546875,-8.041210937500011],[138.93593750000002,-7.9130859375],[139.00302734375003,-7.837597656250011],[139.04570312500005,-7.69140625],[139.07363281250002,-7.639257812500006],[139.08798828125003,-7.587207031250003],[139.04892578125003,-7.5283203125],[138.98300781250003,-7.508203125],[138.93789062500002,-7.472460937500003],[138.88554687500005,-7.373242187500011],[138.853125,-7.339648437500003],[138.79365234375,-7.298925781250006],[138.74794921875002,-7.25146484375],[138.79843750000003,-7.215722656250009],[138.86484375000003,-7.201367187500011],[138.91933593750002,-7.20361328125],[139.01796875000002,-7.225878906250003],[139.0625,-7.227148437500006],[139.17685546875003,-7.1904296875],[139.11259765625005,-7.201757812500006],[139.0490234375,-7.200585937500009],[138.845703125,-7.136328125],[138.72001953125005,-7.06982421875],[138.60136718750005,-6.9365234375],[138.60019531250003,-6.910742187500006],[138.6837890625,-6.886523437500003],[138.86455078125005,-6.8583984375],[138.80849609375002,-6.790429687500009],[138.72666015625003,-6.731152343750011],[138.69814453125002,-6.625683593750011],[138.64218750000003,-6.560449218750009],[138.52158203125003,-6.453808593750011],[138.438671875,-6.343359375],[138.368359375,-6.118554687500009],[138.29628906250002,-5.949023437500003],[138.31386718750002,-5.8875],[138.37460937500003,-5.843652343750009],[138.28281250000003,-5.838574218750011],[138.19960937500002,-5.80703125],[138.24355468750002,-5.724414062500003],[138.33964843750005,-5.675683593750009],[138.2521484375,-5.688183593750011],[138.16650390625,-5.712011718750006],[138.12744140625,-5.716503906250011],[138.087109375,-5.709179687500011],[138.06591796875,-5.675976562500011],[138.06308593750003,-5.62890625],[138.07558593750002,-5.545800781250009],[138.06083984375005,-5.465234375],[137.98496093750003,-5.427636718750009],[137.92226562500002,-5.3701171875],[137.88681640625003,-5.348828125000011],[137.84033203125,-5.350488281250009],[137.79521484375005,-5.31201171875],[137.75908203125005,-5.256152343750003],[137.306640625,-5.014355468750011],[137.27978515625,-4.945410156250006],[137.23789062500003,-4.975683593750006],[137.19589843750003,-4.990429687500011],[137.14375,-4.95078125],[137.08925781250002,-4.924414062500006],[137.02968750000002,-4.9287109375],[136.974609375,-4.907324218750006],[136.9169921875,-4.895117187500006],[136.85683593750002,-4.893164062500006],[136.61884765625,-4.81875],[136.39375,-4.701269531250006],[136.21064453125,-4.650683593750003],[136.09746093750005,-4.584765625],[135.9796875,-4.530859375],[135.71660156250005,-4.478417968750009],[135.4501953125,-4.443066406250011],[135.35390625000002,-4.441796875],[135.27314453125,-4.453125],[135.19560546875005,-4.45068359375],[134.75419921875005,-4.195410156250006],[134.6796875,-4.0791015625],[134.68691406250002,-4.011132812500009],[134.70654296875,-3.954785156250011],[134.88652343750005,-3.9384765625],[134.759765625,-3.922167968750003],[134.70761718750003,-3.929882812500011],[134.60341796875002,-3.97607421875],[134.546875,-3.979296875],[134.46718750000002,-3.948632812500009],[134.39101562500002,-3.909960937500003],[134.26621093750003,-3.94580078125],[134.20234375,-3.887011718750003],[134.18046875000005,-3.825097656250009],[134.14707031250003,-3.796777343750009],[134.1,-3.799707031250009],[134.03691406250005,-3.821972656250011],[133.973828125,-3.81796875],[133.93320312500003,-3.775585937500011],[133.90400390625,-3.720117187500009],[133.86074218750002,-3.680371093750011],[133.80849609375002,-3.65],[133.72304687500002,-3.577929687500003],[133.67832031250003,-3.4794921875],[133.68339843750005,-3.309179687500006],[133.69716796875002,-3.248144531250006],[133.78164062500002,-3.14892578125],[133.84150390625,-3.054785156250006],[133.76738281250005,-3.044335937500009],[133.700390625,-3.0875],[133.67197265625003,-3.1318359375],[133.66074218750003,-3.185546875],[133.653125,-3.364355468750006],[133.59941406250005,-3.416113281250006],[133.51816406250003,-3.411914062500003],[133.54228515625005,-3.51640625],[133.50917968750002,-3.615527343750003],[133.41513671875003,-3.732128906250011],[133.4072265625,-3.78515625],[133.42226562500002,-3.842578125],[133.40087890625,-3.899023437500006],[133.24873046875,-4.062304687500003],[133.19804687500005,-4.070117187500003],[133.08515625,-4.069042968750011],[132.96855468750005,-4.094921875000011],[132.91445312500002,-4.056933593750003],[132.8701171875,-4.007421875],[132.837109375,-3.948925781250011],[132.79091796875002,-3.828125],[132.75390625,-3.70361328125],[132.86972656250003,-3.550976562500011],[132.82978515625,-3.412988281250009],[132.75136718750002,-3.294628906250011],[132.55351562500005,-3.130664062500003],[132.34824218750003,-2.97509765625],[132.25498046875003,-2.943457031250006],[132.10205078125,-2.929589843750009],[132.05390625,-2.91455078125],[132.00634765625,-2.856054687500006],[131.97119140625,-2.78857421875],[132.06689453125,-2.759570312500003],[132.2306640625,-2.680371093750011],[132.32333984375003,-2.684179687500006],[132.57548828125005,-2.727148437500006],[132.65292968750003,-2.766210937500006],[132.725,-2.7890625],[132.89726562500005,-2.658203125],[133.03378906250003,-2.487402343750006],[133.11884765625,-2.450292968750006],[133.19101562500003,-2.437792968750003],[133.26494140625005,-2.454296875000011],[133.41142578125005,-2.513964843750003],[133.5265625,-2.541699218750011],[133.60869140625005,-2.547167968750003],[133.6515625,-2.6005859375],[133.70009765625002,-2.624609375],[133.7109375,-2.544042968750006],[133.75332031250002,-2.45068359375],[133.83466796875,-2.421679687500003],[133.87763671875,-2.4150390625],[133.90488281250003,-2.390917968750003],[133.89892578125,-2.304492187500003],[133.791015625,-2.293652343750011],[133.84970703125003,-2.219628906250009],[133.90244140625003,-2.18359375],[133.92050781250003,-2.1474609375],[133.92158203125,-2.10205078125],[133.71035156250002,-2.189160156250011],[133.48779296875,-2.2255859375],[133.35625,-2.215722656250009],[133.22490234375005,-2.214453125],[132.96279296875002,-2.272558593750006],[132.86328125,-2.270214843750011],[132.6310546875,-2.246679687500006],[132.50263671875,-2.218457031250011],[132.4033203125,-2.240429687500011],[132.3076171875,-2.242285156250006],[132.20742187500002,-2.17578125],[132.12216796875003,-2.092382812500006],[132.07988281250005,-2.033203125],[132.0234375,-1.990332031250006],[131.99843750000002,-1.932519531250009],[131.93613281250003,-1.714941406250006],[131.93037109375,-1.559667968750006],[131.82978515625,-1.556542968750009],[131.7314453125,-1.541210937500011],[131.29375,-1.393457031250009],[131.24082031250003,-1.4296875],[131.17919921875,-1.448339843750006],[131.11777343750003,-1.455273437500011],[131.05673828125003,-1.44765625],[130.99589843750005,-1.424707031250009],[131.0009765625,-1.383984375000011],[131.04619140625005,-1.284082031250009],[131.09052734375,-1.247265625000011],[131.15185546875,-1.218847656250006],[131.19082031250002,-1.165820312500003],[131.2541015625,-1.006933593750006],[131.258984375,-0.95263671875],[131.25205078125003,-0.897167968750011],[131.25722656250002,-0.85546875],[131.29638671875,-0.83359375],[131.46152343750003,-0.781835937500006],[131.80429687500003,-0.703808593750011],[131.89091796875005,-0.657128906250009],[131.96240234375,-0.582421875],[132.04599609375003,-0.537011718750009],[132.08447265625,-0.491113281250009],[132.12841796875,-0.4541015625],[132.39375,-0.35546875],[132.5080078125,-0.347460937500003],[132.62509765625003,-0.35888671875],[132.8564453125,-0.417382812500009],[133.0771484375,-0.511816406250006],[133.26845703125002,-0.6357421875],[133.47265625,-0.726171875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[124.88886718750001,0.9953125],[124.69814453125002,0.825585937499994],[124.63984375000001,0.743554687499994],[124.58906250000001,0.6552734375],[124.51406250000002,0.55712890625],[124.42753906249999,0.470605468749994],[124.384375,0.444970703124994],[124.27802734375001,0.3984375],[124.216796875,0.38037109375],[124.10136718749999,0.374560546874989],[123.75380859375002,0.305517578124991],[123.6396484375,0.297460937499991],[123.52597656250003,0.300341796874989],[123.31044921875002,0.317578125],[123.26542968749999,0.326611328124997],[123.17949218749999,0.41552734375],[123.08251953125,0.48583984375],[122.99687,0.493505859374991],[122.90957031250002,0.485986328124994],[122.28076171875,0.481054687499991],[122.06093750000002,0.468017578125],[121.84199218750001,0.436572265624989],[121.72275390625003,0.450878906249997],[121.60458984375003,0.486132812499989],[121.51572265625003,0.4984375],[121.42578125,0.494824218749997],[121.01298828124999,0.441699218749989],[120.9091796875,0.44677734375],[120.70039062500001,0.514697265624989],[120.57900390625002,0.5283203125],[120.4599609375,0.510302734374989],[120.34902343750002,0.44921875],[120.30703125000002,0.408251953124989],[120.19228515625002,0.268505859374997],[120.12734375000002,0.166552734374989],[120.07832031250001,0.039746093749997],[120.03603515625002,-0.089941406250006],[120.01328125000003,-0.196191406250009],[120.01210937500002,-0.30712890625],[120.03173828125,-0.43203125],[120.06289062500002,-0.555566406250009],[120.09746093749999,-0.64990234375],[120.240625,-0.868261718750006],[120.26982421874999,-0.89921875],[120.42539062500003,-0.960644531250011],[120.517578125,-1.039453125],[120.60507812500003,-1.258496093750011],[120.66738281250002,-1.3701171875],[120.72861328125003,-1.371484375],[120.79697265625003,-1.363671875],[120.91582031249999,-1.377832031250009],[121.03369140625,-1.406542968750003],[121.14853515625003,-1.339453125],[121.21259765625001,-1.2125],[121.27685546875,-1.1181640625],[121.43134765625001,-0.938574218750006],[121.51933593749999,-0.855566406250006],[121.57558593750002,-0.828515625],[121.63271484375002,-0.84033203125],[121.68115234375,-0.887890625000011],[121.73769531250002,-0.925683593750009],[121.853125,-0.945996093750011],[121.96962890625002,-0.933300781250011],[122.09365234375002,-0.875],[122.13808593750002,-0.839257812500009],[122.17490234375003,-0.79375],[122.27998046875001,-0.757031250000011],[122.52968750000002,-0.756640625],[122.65878906250003,-0.769824218750003],[122.88876953125003,-0.755175781250003],[122.88554687499999,-0.722070312500009],[122.84111328124999,-0.68701171875],[122.82949218750002,-0.658886718750011],[122.87226562500001,-0.640722656250006],[123.02041015625002,-0.599804687500011],[123.17148437500003,-0.570703125],[123.28144531250001,-0.591503906250011],[123.37968749999999,-0.648535156250006],[123.41738281250002,-0.707421875],[123.43417968750003,-0.778222656250009],[123.39628906249999,-0.961621093750011],[123.3779296875,-1.004101562500011],[123.29960937499999,-1.026074218750011],[123.22578125000001,-1.001757812500003],[123.15273437500002,-0.90703125],[123.04941406250003,-0.872363281250003],[122.90283203125,-0.900976562500006],[122.8525390625,-0.928125],[122.80742187499999,-0.966015625000011],[122.724609375,-1.064257812500003],[122.65566406250002,-1.175195312500009],[122.50664062499999,-1.347851562500011],[122.33417968750001,-1.497851562500003],[122.25068359375001,-1.555273437500006],[122.15761718750002,-1.593945312500011],[121.85859375000001,-1.693261718750009],[121.77988281250003,-1.766992187500009],[121.71875,-1.86279296875],[121.65097656250003,-1.895410156250009],[121.57265625000002,-1.90576171875],[121.51386718750001,-1.887792968750006],[121.39472656250001,-1.833789062500003],[121.35546875,-1.878222656250003],[121.34882812500001,-1.945996093750011],[121.40751953124999,-1.970117187500009],[121.501953125,-2.045019531250006],[121.575,-2.15087890625],[121.62187,-2.173632812500003],[121.72597656250002,-2.2080078125],[121.76972656250001,-2.240917968750011],[121.84824218750003,-2.33154296875],[121.971875,-2.542382812500009],[122.01396484374999,-2.656445312500011],[122.08261718750003,-2.74951171875],[122.29169921875001,-2.907617187500009],[122.30332031250003,-2.952246093750006],[122.29042968750002,-3.004199218750003],[122.30654296875002,-3.0515625],[122.38125,-3.142382812500003],[122.39902343750003,-3.200878906250011],[122.31728515625002,-3.275097656250011],[122.31279296874999,-3.382714843750009],[122.2626953125,-3.527441406250006],[122.25136718750002,-3.576269531250006],[122.2529296875,-3.620410156250003],[122.2880859375,-3.66162109375],[122.3291015625,-3.694238281250009],[122.38535156250003,-3.71142578125],[122.4345703125,-3.73984375],[122.52919921875002,-3.852636718750006],[122.57861328125,-3.88232421875],[122.60996093750003,-3.9234375],[122.60673828124999,-3.984667968750003],[122.64990234375,-4.0205078125],[122.68964843750001,-4.08447265625],[122.75039062500002,-4.1],[122.77880859375,-4.081640625],[122.79824218750002,-4.05419921875],[122.84794921874999,-4.064550781250006],[122.87734375000002,-4.109082031250011],[122.89433593749999,-4.166308593750003],[122.89980468750002,-4.229394531250009],[122.89736328125002,-4.34912109375],[122.87226562500001,-4.391992187500009],[122.81757812500001,-4.389941406250003],[122.7197265625,-4.340722656250009],[122.71503906250001,-4.376269531250003],[122.7216796875,-4.410742187500006],[122.671875,-4.422167968750003],[122.61474609375,-4.417382812500009],[122.47138671875001,-4.422070312500011],[122.20712890625003,-4.496386718750003],[122.1142578125,-4.540234375000011],[122.05419921875,-4.6201171875],[122.05,-4.67529296875],[122.0732421875,-4.791699218750011],[122.0380859375,-4.832421875],[121.9169921875,-4.847949218750003],[121.748046875,-4.816699218750003],[121.64570312500001,-4.78564453125],[121.58867187499999,-4.759570312500003],[121.51435546875001,-4.68125],[121.48652343750001,-4.5810546875],[121.54121093750001,-4.282910156250011],[121.55673828125003,-4.24462890625],[121.58339843750002,-4.210546875],[121.61152343750001,-4.156347656250006],[121.61806640625002,-4.092675781250009],[121.53740234374999,-4.014843750000011],[121.41582031249999,-3.984277343750009],[121.31269531250001,-3.91943359375],[120.91425781250001,-3.555761718750006],[120.89179687500001,-3.520605468750006],[120.89091796874999,-3.460351562500009],[120.90693359375001,-3.404003906250011],[121.03789062499999,-3.205175781250006],[121.05429687500003,-3.167089843750006],[121.0703125,-3.01015625],[121.06679687500002,-2.880957031250006],[121.05214843750002,-2.751660156250011],[120.99013671875002,-2.6703125],[120.87939453125,-2.645605468750006],[120.76503906250002,-2.6416015625],[120.65361328124999,-2.667578125],[120.5439453125,-2.732617187500011],[120.34140625000003,-2.86962890625],[120.26103515624999,-2.949316406250006],[120.25410156250001,-3.052832031250006],[120.30048828125001,-3.154296875],[120.36044921875003,-3.246875],[120.39238281249999,-3.34814453125],[120.43662109375003,-3.707324218750003],[120.43515625000003,-3.747851562500003],[120.38300781250001,-3.85234375],[120.3625,-4.085742187500003],[120.38457031249999,-4.415136718750006],[120.42011718750001,-4.617382812500011],[120.40498046875001,-4.727246093750011],[120.31015625000003,-4.963183593750003],[120.28144531250001,-5.092675781250009],[120.279296875,-5.14609375],[120.39091796874999,-5.392578125],[120.41660156250003,-5.490039062500003],[120.43037109375001,-5.591015625000011],[120.31162109375003,-5.541601562500006],[120.25644531250003,-5.544140625000011],[120.20078125000003,-5.559375],[120.07705078125002,-5.575488281250003],[119.95156250000002,-5.57763671875],[119.90761718750002,-5.596289062500006],[119.81845703125003,-5.661816406250011],[119.76445312499999,-5.68828125],[119.71728515625,-5.693359375],[119.55742187499999,-5.611035156250011],[119.46308593750001,-5.521679687500011],[119.37617187500001,-5.4248046875],[119.3603515625,-5.314160156250011],[119.390625,-5.200585937500009],[119.43359375,-5.079199218750006],[119.51953125,-4.87734375],[119.51552734375002,-4.741894531250011],[119.544921875,-4.630859375],[119.59404296874999,-4.523144531250011],[119.61171875000002,-4.423535156250011],[119.62363281250003,-4.034375],[119.61142578125003,-3.999804687500003],[119.49365234375,-3.7685546875],[119.48007812500003,-3.729785156250003],[119.47929687499999,-3.667382812500009],[119.49199218749999,-3.6078125],[119.49453125000002,-3.554101562500009],[119.46748046875001,-3.512988281250003],[119.41982421875002,-3.475390625],[119.36210937499999,-3.458984375],[119.24003906249999,-3.475292968750011],[118.99462890625,-3.53759765625],[118.92216796874999,-3.482714843750003],[118.86767578125,-3.398046875],[118.83281249999999,-3.280175781250009],[118.8125,-3.156640625],[118.821875,-3.040625],[118.85810546875001,-2.928515625],[118.82890624999999,-2.85009765625],[118.78369140625,-2.764746093750006],[118.78330078125003,-2.720800781250006],[118.80898437500002,-2.682324218750011],[118.85332031249999,-2.650195312500003],[118.90751953124999,-2.631445312500006],[118.95820312500001,-2.597460937500003],[119.09218750000002,-2.48291015625],[119.13535156250003,-2.38232421875],[119.13818359375,-2.258496093750011],[119.17226562500002,-2.140039062500009],[119.24082031250003,-2.030957031250011],[119.321875,-1.9296875],[119.34824218750003,-1.825292968750006],[119.30830078125001,-1.65966796875],[119.32412109375002,-1.584277343750003],[119.31035156249999,-1.495703125],[119.30898437500002,-1.408203125],[119.35917968749999,-1.243457031250003],[119.50820312500002,-0.90673828125],[119.65351562500001,-0.727929687500009],[119.71132812500002,-0.680761718750006],[119.78671875000003,-0.763964843750003],[119.84433593750003,-0.861914062500006],[119.84521484375,-0.773242187500003],[119.82988281249999,-0.686328125],[119.77167968750001,-0.483593750000011],[119.721875,-0.088476562500006],[119.73583984375,-0.051025390625],[119.78652343750002,-0.056982421875006],[119.83828125000002,-0.022119140625009],[119.865625,0.040087890624989],[119.81171875000001,0.186914062499994],[119.80927734375001,0.238671875],[119.91328125000001,0.445068359375],[119.998046875,0.520214843749997],[120.03515625,0.566601562499997],[120.05644531249999,0.692529296874994],[120.1005859375,0.740136718749994],[120.15654296874999,0.774169921875],[120.22978515624999,0.861230468749994],[120.26953125,0.970800781249991],[120.29384765625002,0.979150390624994],[120.32246093750001,0.983154296875],[120.36650390624999,0.887548828124991],[120.416015625,0.848681640624989],[120.5166015625,0.817529296874994],[120.6025390625,0.854394531249994],[120.62646484375,0.902392578124989],[120.65888671875001,0.943652343749989],[120.71103515625003,0.986669921874991],[120.7548828125,1.03564453125],[120.80361328125002,1.149267578124991],[120.86796874999999,1.252832031249994],[120.912109375,1.288964843749994],[120.96542968750003,1.311816406249989],[121.02460937500001,1.32578125],[121.08173828125001,1.32763671875],[121.20839843750002,1.2625],[121.28173828125,1.249804687499989],[121.35673828124999,1.254541015624994],[121.40410156249999,1.243603515624997],[121.44003906250003,1.214404296874989],[121.47275390625003,1.155517578125],[121.51328125000003,1.104736328125],[121.55068359375002,1.0796875],[121.591796875,1.06796875],[121.86738281250001,1.088525390624994],[122.10820312499999,1.031152343749994],[122.43662109375003,1.01806640625],[122.54931640625,0.984472656249991],[122.65742187500001,0.940576171874994],[122.78984374999999,0.862890625],[122.83828125000002,0.845703125],[122.89248046875002,0.85],[122.96005859375003,0.922998046874994],[123.01279296875003,0.93896484375],[123.06650390625003,0.941796875],[123.27812,0.928076171874991],[123.8466796875,0.838183593749989],[123.93076171875003,0.850439453124991],[124.27363281250001,1.022265624999989],[124.41083984375001,1.185107421874989],[124.53369140625,1.23046875],[124.57539062500001,1.304052734374991],[124.60019531250003,1.392431640624991],[124.64375,1.416162109374994],[124.74667968750003,1.44140625],[124.78769531250003,1.467578124999989],[124.86064453124999,1.576025390624991],[124.94707031249999,1.672167968749989],[124.9892578125,1.701025390624991],[125.11093750000003,1.685693359374994],[125.16484374999999,1.643652343749991],[125.23378906250002,1.502294921874991],[125.2216796875,1.478710937499997],[125.14091796874999,1.408398437499997],[125.11748046874999,1.37890625],[125.02802734375001,1.180224609374989],[124.966796875,1.082617187499991],[124.88886718750001,0.9953125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[107.37392578125002,-6.007617187500003],[107.47470703125003,-6.121777343750011],[107.56298828125,-6.182714843750006],[107.66679687499999,-6.2158203125],[107.77607421875001,-6.218945312500011],[107.8837890625,-6.233300781250009],[108.0087890625,-6.276953125],[108.13759765625002,-6.296679687500003],[108.19746093750001,-6.2890625],[108.25449218750003,-6.2666015625],[108.29501953125003,-6.265039062500009],[108.33017578125003,-6.286035156250009],[108.41914062500001,-6.3828125],[108.51591796874999,-6.47119140625],[108.53798828125002,-6.516210937500006],[108.60361328125003,-6.729199218750011],[108.67783203125003,-6.79052734375],[108.77968750000002,-6.808300781250011],[108.8994140625,-6.808398437500003],[109.01835937499999,-6.817285156250009],[109.29423828124999,-6.866992187500003],[109.40371093750002,-6.86015625],[109.50058593750003,-6.81015625],[109.5869140625,-6.842578125],[109.82099609375001,-6.902441406250006],[109.93623046875001,-6.915820312500003],[110.06708984375001,-6.898730468750003],[110.19843750000001,-6.895117187500006],[110.26093750000001,-6.912402343750003],[110.32109374999999,-6.938378906250009],[110.37275390625001,-6.94775390625],[110.42626953125,-6.947265625],[110.52089843750002,-6.897265625],[110.58359375000003,-6.8056640625],[110.63427734375,-6.690136718750011],[110.67402343750001,-6.56982421875],[110.70078125000003,-6.51806640625],[110.73691406250003,-6.472363281250011],[110.7841796875,-6.442675781250003],[110.83476562499999,-6.42421875],[110.97226562500003,-6.435644531250006],[111.00068359375001,-6.464746093750009],[111.15439453125003,-6.669042968750006],[111.18154296875002,-6.686718750000011],[111.34208984374999,-6.699511718750003],[111.38652343749999,-6.69287109375],[111.48447265625003,-6.65185546875],[111.54033203124999,-6.648242187500003],[111.6435546875,-6.69873046875],[111.68808593750003,-6.74169921875],[111.73759765624999,-6.7734375],[111.98984375000003,-6.805957031250003],[112.08730468750002,-6.893359375],[112.13671875,-6.905078125],[112.31230468749999,-6.894433593750009],[112.43359375,-6.903027343750011],[112.53925781250001,-6.926464843750011],[112.5869140625,-7.050585937500003],[112.6259765625,-7.178027343750003],[112.64873046874999,-7.221289062500006],[112.751953125,-7.265039062500009],[112.79433593750002,-7.304492187500003],[112.78291015625001,-7.431640625],[112.79453125000003,-7.552441406250011],[113.01357421875002,-7.65771484375],[113.24843750000002,-7.718164062500009],[113.49765625000003,-7.723828125000011],[113.74746093750002,-7.703027343750009],[113.87626953124999,-7.67724609375],[114.03730468750001,-7.632128906250003],[114.07070312500002,-7.633007812500011],[114.38271484375002,-7.77109375],[114.40927734375003,-7.79248046875],[114.44423828125002,-7.895605468750006],[114.44326171875002,-8.004589843750011],[114.38496093750001,-8.26328125],[114.38134765625,-8.334277343750003],[114.38691406250001,-8.405175781250009],[114.44882812500003,-8.559277343750011],[114.48173828124999,-8.603808593750003],[114.59501953124999,-8.684765625000011],[114.59921875000003,-8.727246093750011],[114.58378906249999,-8.769628906250006],[114.45917968750001,-8.740527343750003],[114.38320312500002,-8.705371093750003],[114.33925781250002,-8.647363281250009],[114.27695312500003,-8.614648437500009],[114.15966796875,-8.62646484375],[113.94033203125002,-8.568359375],[113.69257812500001,-8.47802734375],[113.25332031250002,-8.28671875],[113.13369140625002,-8.288281250000011],[113.01894531250002,-8.312695312500011],[112.89775390624999,-8.361425781250006],[112.77167968750001,-8.39609375],[112.67880859375003,-8.4091796875],[112.58603515625003,-8.399609375000011],[112.3515625,-8.353613281250006],[112.11513671875002,-8.323925781250011],[111.50996093750001,-8.305078125],[111.33857421875001,-8.26171875],[111.05537109375001,-8.239550781250003],[110.83017578125003,-8.201953125],[110.60722656249999,-8.1494140625],[110.03867187500003,-7.890527343750009],[109.85263671875003,-7.828417968750003],[109.28164062500002,-7.704882812500003],[109.19355468750001,-7.694921875],[108.98671875000002,-7.7041015625],[108.85625,-7.667871093750009],[108.7412109375,-7.667089843750006],[108.57050781250001,-7.707226562500011],[108.51796875000002,-7.736035156250011],[108.45175781250003,-7.796972656250006],[108.33554687500003,-7.794042968750006],[108.22050781249999,-7.782324218750006],[107.91748046875,-7.72412109375],[107.80439453125001,-7.688378906250009],[107.69580078125,-7.635546875],[107.59785156250001,-7.566699218750003],[107.546875,-7.541894531250009],[107.28496093749999,-7.4716796875],[107.07119140625002,-7.447460937500011],[106.63144531250003,-7.41552734375],[106.53535156250001,-7.394238281250011],[106.45527343750001,-7.36865234375],[106.41132812500001,-7.311718750000011],[106.41689453125002,-7.239355468750006],[106.44843750000001,-7.1767578125],[106.49150390624999,-7.113867187500006],[106.51972656250001,-7.0537109375],[106.1982421875,-6.927832031250006],[105.9443359375,-6.858984375],[105.83476562499999,-6.845800781250006],[105.72480468750001,-6.84609375],[105.60097656250002,-6.8603515625],[105.47841796875002,-6.853710937500011],[105.42080078125002,-6.833203125000011],[105.36191406250003,-6.826171875],[105.30292968750001,-6.841015625000011],[105.25546875000003,-6.835253906250003],[105.2431640625,-6.778027343750011],[105.2734375,-6.729394531250009],[105.33564453125001,-6.674121093750003],[105.37089843749999,-6.664355468750003],[105.38701171874999,-6.75078125],[105.40468750000002,-6.76796875],[105.45976562499999,-6.786914062500003],[105.48369140624999,-6.781542968750003],[105.58085937499999,-6.670996093750006],[105.60800781250003,-6.61669921875],[105.65507812499999,-6.46953125],[105.7060546875,-6.497949218750009],[105.75742187500003,-6.480371093750009],[105.78691406249999,-6.456933593750009],[105.86826171875003,-6.116406250000011],[105.93613281250003,-6.016992187500009],[106.02880859375,-5.934277343750011],[106.075,-5.914160156250006],[106.16582031249999,-5.964746093750009],[106.34970703125003,-5.984082031250011],[106.45908203125003,-6.017578125],[106.56875,-6.021875],[106.67587890625003,-6.038378906250003],[106.8251953125,-6.098242187500006],[106.8779296875,-6.091992187500011],[106.931640625,-6.073437500000011],[107.01162109375002,-6.008496093750011],[107.04628906250002,-5.904199218750009],[107.162109375,-5.957128906250006],[107.33183593749999,-5.978125],[107.37392578125002,-6.007617187500003]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[96.49257812500002,5.229345703124991],[96.615234375,5.22021484375],[96.84267578125002,5.274462890624989],[96.9677734375,5.269140625],[97.08574218749999,5.229931640624997],[97.1904296875,5.207324218749989],[97.451171875,5.236035156249997],[97.50019531250001,5.228320312499989],[97.54716796874999,5.205859374999989],[97.5875,5.170361328124997],[97.70673828125001,5.040136718749991],[97.90839843750001,4.879980468749991],[97.96660156249999,4.777490234374994],[97.99980468749999,4.662255859374994],[98.02070312500001,4.635205078124997],[98.24843750000002,4.41455078125],[98.27333984375002,4.322314453124989],[98.2412109375,4.19453125],[98.30732421875001,4.092871093749991],[98.5283203125,3.99755859375],[98.65869140625,3.928125],[98.6865234375,3.885546874999989],[98.70576171875001,3.834765624999989],[98.77792968750003,3.759423828124994],[98.86865234375,3.710351562499994],[99.15117187499999,3.58125],[99.521484375,3.311181640624994],[99.73232421875002,3.183056640624997],[99.90664062500002,2.988183593749994],[99.96943359375001,2.894921875],[100.02128906249999,2.794238281249989],[100.12724609374999,2.647607421874994],[100.30722656250003,2.466601562499989],[100.35273437500001,2.411474609374991],[100.40117187499999,2.331640625],[100.45703125,2.257421875],[100.52382812500002,2.189160156249997],[100.60361328125003,2.136962890625],[100.68525390625001,2.120068359374997],[100.81679687500002,1.9892578125],[100.88789062500001,1.9482421875],[100.87666015625001,2.050585937499989],[100.81689453125,2.140185546874989],[100.81777343750002,2.194238281249994],[100.82822265625003,2.242578125],[100.87705078125003,2.283300781249991],[100.93593750000002,2.294726562499989],[101.04619140624999,2.257470703124994],[101.22519531250003,2.102246093749997],[101.30078125,2.011816406249991],[101.35761718750001,1.887011718749989],[101.40507812499999,1.757421875],[101.47666015625003,1.693066406249997],[101.575,1.670556640624994],[101.68427734375001,1.661230468749991],[101.78476562500003,1.621386718749989],[102.01992187500002,1.442138671875],[102.09804687500002,1.35791015625],[102.1572265625,1.258886718749991],[102.19794921875001,1.141699218749991],[102.22333984375001,1.018701171874994],[102.23906249999999,0.990332031249991],[102.38994140624999,0.841992187499997],[102.46923828125,0.779296875],[102.56640625,0.748828124999989],[102.84941406249999,0.715478515624994],[102.94931640625003,0.664208984374994],[103.03183593750003,0.578906249999989],[103.06650390625003,0.491992187499989],[103.00751953125001,0.415332031249989],[102.78632812500001,0.297753906249994],[102.55,0.216455078124994],[102.77958984374999,0.244482421874991],[102.89589843750002,0.278613281249989],[103.00283203125002,0.331982421874997],[103.10869140624999,0.399804687499994],[103.27656250000001,0.49453125],[103.33896484375003,0.513720703124989],[103.41230468750001,0.506933593749991],[103.47890625000002,0.480175781249997],[103.57871093750003,0.387060546874991],[103.67265624999999,0.288916015624991],[103.74277343750003,0.174414062499991],[103.78671875000003,0.046972656249991],[103.70644531250002,-0.019580078125003],[103.58945312500003,-0.06875],[103.42851562499999,-0.191796875],[103.41162109375,-0.240429687500011],[103.44443359375003,-0.271679687500011],[103.40517578125002,-0.362207031250009],[103.49541015624999,-0.418066406250006],[103.50917968750002,-0.465527343750011],[103.43115234375,-0.53359375],[103.43857421875003,-0.575585937500009],[103.53271484375,-0.7546875],[103.57753906250002,-0.795703125],[103.72109375000002,-0.88671875],[103.94003906250003,-0.979101562500006],[104.06113281250003,-1.021386718750009],[104.19853515624999,-1.054296875],[104.25751953125001,-1.053417968750011],[104.36054687500001,-1.038378906250003],[104.38125,-1.07421875],[104.42568359375002,-1.250683593750011],[104.446875,-1.362402343750006],[104.47832031249999,-1.60009765625],[104.5185546875,-1.69873046875],[104.51591796874999,-1.819433593750006],[104.56875,-1.921777343750009],[104.67636718750003,-1.987207031250009],[104.791015625,-2.040820312500003],[104.84521484375,-2.092968750000011],[104.84453124999999,-2.171777343750009],[104.82607421875002,-2.234179687500003],[104.78730468750001,-2.28271484375],[104.66845703125,-2.385546875],[104.64726562499999,-2.429882812500011],[104.63056640625001,-2.543359375],[104.65078125000002,-2.59521484375],[104.69833984375003,-2.59814453125],[104.73574218750002,-2.570898437500006],[104.87841796875,-2.418847656250009],[104.9169921875,-2.3921875],[104.97080078125003,-2.370898437500003],[105.02587890625,-2.357519531250006],[105.28652343750002,-2.35625],[105.39697265625,-2.380175781250003],[105.49531250000001,-2.4296875],[105.58203125,-2.491992187500003],[105.89912109375001,-2.887792968750006],[106.04433593750002,-3.10625],[106.05576171875003,-3.16064453125],[106.05839843749999,-3.2171875],[106.03369140625,-3.260937500000011],[105.90146484375003,-3.410058593750009],[105.88505859374999,-3.451269531250006],[105.84375,-3.613671875],[105.8515625,-3.730566406250006],[105.8955078125,-3.7796875],[105.93046874999999,-3.8330078125],[105.927734375,-3.88134765625],[105.84062,-4.121777343750011],[105.83144531250002,-4.162890625],[105.88652343749999,-4.553906250000011],[105.89052734375002,-4.659765625],[105.87929687500002,-4.793652343750011],[105.88720703125,-5.009570312500003],[105.81611328125001,-5.6765625],[105.802734375,-5.71640625],[105.74833984374999,-5.818261718750009],[105.67656249999999,-5.817578125000011],[105.61855468750002,-5.799609375],[105.57792968749999,-5.760644531250009],[105.55556640625002,-5.712304687500009],[105.52265625000001,-5.672753906250009],[105.34941406249999,-5.549511718750011],[105.30400390624999,-5.570019531250011],[105.128125,-5.722851562500011],[105.08134765624999,-5.745507812500009],[105.02265625000001,-5.726855468750003],[104.93027343750003,-5.68115234375],[104.63955078125002,-5.520410156250009],[104.62167968750003,-5.57177734375],[104.6181640625,-5.641503906250009],[104.67597656250001,-5.816210937500003],[104.68398437500002,-5.892675781250006],[104.63105468750001,-5.907910156250011],[104.6015625,-5.904589843750003],[104.48085937500002,-5.803125],[104.36953125000002,-5.690722656250003],[104.24296874999999,-5.538867187500003],[104.15048828125003,-5.466601562500003],[104.06679687500002,-5.385937500000011],[103.83144531250002,-5.07958984375],[103.77031249999999,-5.0328125],[103.40566406250002,-4.81640625],[103.33212890625003,-4.765234375],[103.23886718750003,-4.675683593750009],[103.138671875,-4.59619140625],[102.9189453125,-4.470703125],[102.53769531250003,-4.152148437500003],[102.37197265625002,-3.96923828125],[102.18769531250001,-3.674511718750011],[102.12753906250003,-3.59921875],[101.81787109375,-3.378027343750006],[101.64902343750003,-3.244042968750009],[101.57861328125,-3.1669921875],[101.41425781250001,-2.898828125],[101.3662109375,-2.808496093750009],[101.3056640625,-2.728710937500011],[101.20625,-2.663964843750009],[101.11855468750002,-2.587792968750009],[100.94443359375003,-2.34521484375],[100.88955078125002,-2.24853515625],[100.84804687500002,-2.143945312500009],[100.85527343749999,-1.934179687500006],[100.48652343750001,-1.299121093750003],[100.39394531250002,-1.101269531250011],[100.30820312500003,-0.82666015625],[100.2890625,-0.798828125],[100.087890625,-0.552929687500011],[100.01669921875003,-0.47421875],[99.9306640625,-0.400195312500003],[99.86005859375001,-0.313769531250003],[99.72128906250003,-0.032958984375],[99.66982421875002,0.045068359374994],[99.59765625,0.102441406249994],[99.33457031250003,0.20859375],[99.23642578125003,0.267773437499997],[99.1591796875,0.351757812499997],[99.11171875000002,0.458935546874997],[99.0595703125,0.686376953124991],[98.935546875,1.031933593749997],[98.79638671875,1.49462890625],[98.70253906250002,1.701953124999989],[98.59531250000003,1.864599609374991],[98.56425781249999,1.902148437499989],[98.08652343750003,2.195068359375],[98.00507812500001,2.238183593749994],[97.91855468750003,2.264208984374989],[97.79501953125003,2.282861328124994],[97.70078125000003,2.358544921874994],[97.66201171875002,2.494287109374994],[97.640625,2.676416015624994],[97.61679687500003,2.785107421874997],[97.5908203125,2.846582031249994],[97.39130859375001,2.975292968749997],[97.31318359375001,3.077050781249994],[97.24794921875002,3.189013671874989],[97.18837890625002,3.275732421874991],[96.96894531250001,3.575146484374997],[96.89394531250002,3.653710937499994],[96.80097656250001,3.708544921874989],[96.525390625,3.7666015625],[96.44472656250002,3.816308593749994],[96.31083984374999,3.986328125],[96.23007812500003,4.07275390625],[95.98798828125001,4.26328125],[95.57861328125,4.661962890624991],[95.49472656250003,4.761376953124994],[95.43193359374999,4.865039062499989],[95.38125,4.976171875],[95.20664062500003,5.284033203124991],[95.220703125,5.346240234374989],[95.2470703125,5.410791015624994],[95.24296874999999,5.464306640624997],[95.22382812500001,5.51708984375],[95.22783203124999,5.564794921874991],[95.27958984374999,5.592871093749991],[95.39609375000003,5.628808593749994],[95.51699218750002,5.624609375],[95.62890625,5.609082031249997],[95.7373046875,5.579296875],[95.84130859375,5.514501953124991],[96.02734375,5.351171875],[96.13330078125,5.294287109374991],[96.25087890625002,5.266992187499994],[96.49257812500002,5.229345703124991]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[116.80771484375003,6.691064453124994],[116.7880859375,6.606103515624994],[116.81240234375002,6.60791015625],[116.91328125000001,6.65966796875],[117.0185546875,6.79736328125],[117.07792968749999,6.916845703124991],[117.12851562500003,6.968896484374994],[117.22988281250002,6.939990234374989],[117.25244140625,6.919238281249989],[117.24531250000001,6.833398437499994],[117.25498046875003,6.783447265625],[117.29404296875003,6.676904296874994],[117.38037109375,6.612255859374997],[117.49921875000001,6.571484375],[117.60966796874999,6.512646484374997],[117.64570312500001,6.473681640624989],[117.66962890625001,6.4267578125],[117.69375,6.35],[117.69560546874999,6.272314453124991],[117.61591796875001,6.196533203125],[117.64980468750002,6.073583984374991],[117.64453125,6.001855468749994],[117.6171875,5.940722656249989],[117.50117187500001,5.884667968749994],[117.81767578124999,5.9404296875],[117.89580078124999,5.972265625],[118.00380859375002,6.053320312499991],[118.06171875000001,5.983447265624989],[118.11582031250003,5.8625],[118.072265625,5.832080078124989],[117.93476562500001,5.7875],[117.92802734374999,5.769189453124994],[117.9736328125,5.70625],[118.03115234375002,5.712109375],[118.14462890625003,5.754199218749989],[118.24912109375003,5.820556640625],[118.2998046875,5.819726562499994],[118.353125,5.806054687499994],[118.45634765624999,5.763427734375],[118.51416015625,5.72890625],[118.56308593750003,5.684521484374997],[118.59482421875003,5.592089843749989],[118.71367187499999,5.558544921874997],[118.95732421874999,5.429003906249989],[119.00253906250003,5.417822265624991],[119.05,5.415234375],[119.17841796875001,5.430908203125],[119.22343749999999,5.412646484374989],[119.25556640625001,5.365917968749997],[119.26630859375001,5.30810546875],[119.26279296875003,5.245898437499989],[119.24970703125001,5.19873046875],[119.21962890625002,5.159814453124994],[119.13222656250002,5.100488281249994],[118.9125,5.022900390624997],[118.67207031250001,4.9640625],[118.55136718750003,4.968115234374991],[118.3818359375,5.018505859374997],[118.32001953125001,5.012011718749989],[118.26054687499999,4.988867187499991],[118.18535156249999,4.828515625],[118.32421875,4.668701171875],[118.5625,4.502148437499997],[118.59511718750002,4.460644531249997],[118.58632812500002,4.40966796875],[118.54833984375,4.379248046874991],[118.498046875,4.362353515624989],[118.36406249999999,4.335742187499989],[118.22871093750001,4.316015625],[118.11728515625003,4.28759765625],[118.00820312500002,4.250244140625],[117.89560546875003,4.262939453125],[117.74101562499999,4.337548828124994],[117.69648437500001,4.342822265624989],[117.64980468750002,4.304492187499989],[117.60380859374999,4.2],[117.56621093749999,4.162304687499997],[117.49746093750002,4.133398437499991],[117.46533203125,4.076074218749994],[117.55937,3.988330078124989],[117.56601562500003,3.929931640625],[117.63906250000002,3.877978515624989],[117.72822265625001,3.796728515624991],[117.73173828124999,3.770263671875],[117.76201171874999,3.73388671875],[117.77724609375002,3.689257812499989],[117.71445312500003,3.644824218749989],[117.6298828125,3.636328125],[117.5673828125,3.678271484374989],[117.50966796875002,3.730371093749994],[117.49492187499999,3.665576171874989],[117.45039062500001,3.628515625],[117.28789062499999,3.639306640624994],[117.17158203125001,3.638964843749989],[117.05595703124999,3.62265625],[117.11386718750003,3.612646484374991],[117.16640625000002,3.591992187499997],[117.34628906250003,3.426611328124991],[117.38466796875002,3.365380859374994],[117.321875,3.243554687499994],[117.35244140625002,3.19375],[117.42207031250001,3.165185546874994],[117.5068359375,3.104589843749991],[117.56718749999999,3.098486328124991],[117.61064453124999,3.064355468749994],[117.61240234375003,3.0048828125],[117.63789062500001,2.950830078124994],[117.56914062499999,2.929296875],[117.63720703125,2.914941406249994],[117.69765625000002,2.887304687499991],[117.66455078125,2.859277343749994],[117.63886718750001,2.825292968749991],[117.66679687499999,2.806933593749989],[117.74970703125001,2.775585937499997],[117.78593749999999,2.746777343749997],[117.80488281250001,2.6689453125],[117.8857421875,2.541748046875],[118.0341796875,2.377636718749997],[118.06660156250001,2.317822265624997],[118.06630859375002,2.262744140624989],[118.04160156250003,2.215429687499991],[117.95703125,2.159960937499989],[117.88925781250003,2.087011718749991],[117.88105468750001,2.060644531249991],[117.78925781250001,2.02685546875],[117.83125,2.002001953124989],[117.86464843750002,1.968408203124994],[117.92841796875001,1.866796875],[118.08037109374999,1.701855468749997],[118.15683593750003,1.640332031249997],[118.4716796875,1.416455078124997],[118.63896484374999,1.318994140624994],[118.8525390625,1.095849609374994],[118.96347656250003,1.044287109374991],[118.98496093750003,0.982128906249997],[118.89238281249999,0.886865234374994],[118.75742187500003,0.839208984374991],[118.53476562500003,0.813525390624989],[118.3115234375,0.847070312499994],[118.19609374999999,0.874365234374991],[118.09550781249999,0.929150390624997],[118.01630859375001,1.039160156249991],[117.91162109375,1.098681640624989],[117.95195312499999,1.031982421875],[117.97734374999999,0.963818359374997],[117.96425781250002,0.889550781249994],[117.92304687500001,0.831347656249989],[117.8525390625,0.788671875],[117.77695312500003,0.754003906249991],[117.7451171875,0.729638671874994],[117.55332031250003,0.341015625],[117.52216796875001,0.235888671874989],[117.46376953125002,-0.200488281250003],[117.462890625,-0.32373046875],[117.54892578125003,-0.554394531250011],[117.55683593750001,-0.67529296875],[117.57382812500003,-0.7275390625],[117.5625,-0.770898437500009],[117.52177734374999,-0.796679687500003],[117.35712890625001,-0.8671875],[117.24072265625,-0.925683593750009],[117.146484375,-1.008984375000011],[117.07021484375002,-1.112695312500009],[117.00322265624999,-1.187695312500011],[116.91396484375002,-1.2236328125],[116.84941406249999,-1.21826171875],[116.79707031250001,-1.183789062500011],[116.76054687499999,-1.1171875],[116.73984375000003,-1.044238281250003],[116.72617187500003,-1.09814453125],[116.72871093750001,-1.15078125],[116.75927734375,-1.207128906250006],[116.77099609375,-1.2666015625],[116.75341796875,-1.327343750000011],[116.71523437500002,-1.37578125],[116.61162109374999,-1.428613281250009],[116.55449218749999,-1.473925781250003],[116.54511718750001,-1.553125],[116.517578125,-1.598046875],[116.47792968750002,-1.6328125],[116.33212890625003,-1.7125],[116.29960937499999,-1.744335937500011],[116.27548828125003,-1.784863281250011],[116.35322265625001,-1.778613281250003],[116.42431640625,-1.784863281250011],[116.42958984375002,-1.864160156250009],[116.45195312499999,-1.923144531250003],[116.42353515625001,-2.052539062500003],[116.31396484375,-2.139843750000011],[116.36865234375,-2.158203125],[116.41816406250001,-2.186718750000011],[116.52812,-2.207910156250009],[116.5654296875,-2.299707031250009],[116.54921875000002,-2.410839843750011],[116.529296875,-2.510546875],[116.45039062500001,-2.538281250000011],[116.40126953125002,-2.519824218750003],[116.3525390625,-2.521582031250006],[116.31679687500002,-2.551855468750006],[116.30722656250003,-2.603320312500003],[116.37548828125,-2.578027343750009],[116.37167968750003,-2.706835937500003],[116.35322265625001,-2.832714843750011],[116.33066406250003,-2.902148437500003],[116.28886718749999,-2.958789062500003],[116.22578125000001,-2.976953125],[116.16630859374999,-2.9345703125],[116.15410156249999,-2.983789062500009],[116.17226562500002,-3.025292968750009],[116.25722656250002,-3.126367187500009],[116.205078125,-3.148535156250006],[116.16708984375003,-3.183007812500009],[116.15,-3.233203125],[116.05751953125002,-3.348242187500006],[116.01669921875003,-3.432812500000011],[115.99941406250002,-3.523339843750009],[115.95615234375003,-3.595019531250003],[115.25820312500002,-3.906835937500006],[114.69355468750001,-4.169726562500003],[114.65253906250001,-4.15185546875],[114.62529296874999,-4.11171875],[114.60595703125,-3.703320312500011],[114.5361328125,-3.494433593750003],[114.52558593750001,-3.376660156250011],[114.44599609375001,-3.481835937500009],[114.39716796875001,-3.47119140625],[114.34433593750003,-3.444433593750006],[114.30458984375002,-3.410058593750009],[114.30166015625002,-3.36474609375],[114.34433593750003,-3.23515625],[114.29267578125001,-3.30625],[114.236328125,-3.361132812500003],[114.17792968750001,-3.354394531250009],[114.12763671875001,-3.327246093750006],[114.10898437500003,-3.28515625],[114.08222656250001,-3.27890625],[113.95878906249999,-3.394335937500003],[113.79580078125002,-3.45625],[113.705078125,-3.455273437500011],[113.63359374999999,-3.419921875],[113.63730468750003,-3.33203125],[113.63007812500001,-3.24609375],[113.61005859375001,-3.195703125],[113.56630859375002,-3.177734375],[113.52597656250003,-3.18408203125],[113.40898437499999,-3.22890625],[113.3671875,-3.2236328125],[113.34316406250002,-3.246484375],[113.03398437499999,-2.933496093750009],[112.97148437499999,-3.187109375],[112.75800781250001,-3.322167968750009],[112.60029296875001,-3.400488281250006],[112.44394531250003,-3.37109375],[112.28496093749999,-3.320996093750011],[112.12666015625001,-3.381445312500006],[111.95488281249999,-3.5296875],[111.90742187500001,-3.552539062500003],[111.85810546875001,-3.551855468750006],[111.82207031249999,-3.532519531250003],[111.834375,-3.420117187500011],[111.8359375,-3.307714843750006],[111.82304687499999,-3.057226562500006],[111.80937,-3.008007812500011],[111.76015625000002,-2.939160156250011],[111.69472656250002,-2.889453125],[111.65830078125003,-2.92578125],[111.62548828125,-2.975488281250009],[111.49492187499999,-2.973339843750011],[111.36757812500002,-2.933691406250006],[111.25917968750002,-2.956445312500009],[111.04433593750002,-3.055761718750006],[110.93007812500002,-3.07109375],[110.86875,-3.048730468750009],[110.82968750000003,-2.9951171875],[110.85205078125,-2.946191406250009],[110.89931640625002,-2.90859375],[110.81113281250003,-2.9384765625],[110.73583984375,-2.988671875],[110.703125,-3.020898437500009],[110.66816406250001,-3.004785156250009],[110.57402343749999,-2.89140625],[110.37753906250003,-2.933789062500011],[110.35097656250002,-2.94677734375],[110.30253906249999,-2.9853515625],[110.25605468750001,-2.966113281250003],[110.23261718750001,-2.925097656250003],[110.22431640625001,-2.688671875000011],[110.12441406250002,-2.23388671875],[110.09658203125002,-2.001367187500009],[110.075,-1.946386718750006],[109.95986328125002,-1.86279296875],[109.96376953125002,-1.742871093750011],[110.0234375,-1.642578125],[110.0361328125,-1.525683593750003],[110.01923828125001,-1.398828125],[109.98330078125002,-1.274804687500009],[109.93808593750003,-1.18115234375],[109.87343750000002,-1.10107421875],[109.78740234374999,-1.011328125],[109.68173828125003,-0.944238281250009],[109.45380859375001,-0.86875],[109.33349609375,-0.875390625],[109.28886718749999,-0.845800781250006],[109.2587890625,-0.807421875],[109.27099609375,-0.73203125],[109.31171875000001,-0.68017578125],[109.36630859375003,-0.667382812500009],[109.37275390625001,-0.63818359375],[109.25703125000001,-0.577441406250003],[109.16054687500002,-0.494921875],[109.13027343750002,-0.445410156250006],[109.12109375,-0.390917968750003],[109.12177734375001,-0.265039062500009],[109.14960937500001,-0.185546875],[109.16474609375001,-0.142480468750009],[109.19462890624999,-0.009423828125009],[109.25751953125001,0.031152343749994],[109.24726562500001,0.055761718749991],[109.22021484375,0.073828125],[109.18076171875003,0.117480468749989],[109.14853515625003,0.167675781249997],[109.07480468750003,0.252832031249994],[108.94453125000001,0.355664062499997],[108.92275390625002,0.5328125],[108.90585937500003,0.7939453125],[108.91679687499999,0.912646484374989],[108.95859375000003,1.134619140624991],[109.03085937500003,1.204492187499994],[109.08847656250003,1.223925781249989],[109.13154296875001,1.253857421874997],[109.09609375000002,1.258154296874991],[109.0654296875,1.247167968749991],[109.01025390625,1.239648437499994],[109.05546874999999,1.4384765625],[109.07587890625001,1.495898437499989],[109.16669921875001,1.607080078124994],[109.27314453125001,1.70546875],[109.31816406249999,1.821093749999989],[109.37851562500003,1.922705078124991],[109.62890625,2.027539062499997],[109.6943359375,1.888769531249991],[109.71962890625002,1.8578125],[109.86484375000003,1.764453124999989],[109.98457031250001,1.717626953124991],[110.11406249999999,1.698583984374991],[110.24589843749999,1.694726562499994],[110.29833984375,1.701171875],[110.34921875000003,1.7197265625],[110.39951171875003,1.699853515624994],[110.67519531250002,1.548046875],[110.78203124999999,1.520849609374991],[110.89492187500002,1.532470703125],[110.93994140625,1.517333984375],[111.09843749999999,1.40087890625],[111.14521484375001,1.386962890625],[111.22324218750003,1.395849609374991],[111.12343750000002,1.449023437499989],[111.05800781250002,1.486669921874991],[111.02871093750002,1.5578125],[111.04658203125001,1.633642578124991],[111.11015624999999,1.68408203125],[111.15419921875002,1.73876953125],[111.17001953125003,1.902294921874997],[111.19804687499999,1.985107421875],[111.25087890625002,2.063867187499994],[111.26816406250003,2.139746093749991],[111.20888671875002,2.19765625],[111.19550781250001,2.297167968749989],[111.20859375000003,2.379638671875],[111.2421875,2.435742187499997],[111.2958984375,2.398779296874991],[111.35136718749999,2.364453125],[111.40615234375002,2.367871093749997],[111.44384765625,2.381542968749997],[111.45078125000003,2.424072265625],[111.4404296875,2.498095703124989],[111.44326171875002,2.634326171874989],[111.5125,2.743017578124991],[111.62324218750001,2.81796875],[111.72773437500001,2.853808593749989],[112.11884765625001,2.914697265624994],[112.7373046875,3.070458984374994],[112.92050781250003,3.130712890624991],[112.98789062500003,3.161914062499989],[113.04472656249999,3.205224609374994],[113.14023437500003,3.343505859375],[113.32011718749999,3.561474609374997],[113.44609374999999,3.740576171874991],[113.71210937500001,4.001416015624997],[113.92392578125003,4.243212890624989],[113.95253906250002,4.288720703124994],[113.98779296875,4.420703124999989],[113.99042968750001,4.4828125],[113.98427734375002,4.545800781249994],[114.0125,4.575244140624989],[114.05361328125002,4.592871093749991],[114.17792968750001,4.590966796874994],[114.29941406250003,4.607177734375],[114.42441406250003,4.660400390625],[114.54472656249999,4.724560546874997],[114.64589843750002,4.798144531249989],[114.74082031250003,4.881005859374994],[114.84062,4.946386718749991],[114.99541015624999,5.022363281249994],[115.04765624999999,5.016357421875],[115.04707031250001,4.962451171874989],[115.02675781250002,4.899707031249989],[115.14003906250002,4.899755859374991],[115.37490234375002,4.932763671874994],[115.42763671875002,4.969189453124997],[115.51982421874999,5.048925781249991],[115.55449218749999,5.093554687499989],[115.58203125,5.194140624999989],[115.46689453125003,5.254101562499997],[115.42167968749999,5.330517578124997],[115.41904296875003,5.413183593749991],[115.55644531249999,5.566699218749989],[115.60390625000002,5.603417968749994],[115.62451171875,5.548876953124989],[115.68505859375,5.535107421874997],[115.74082031250003,5.533007812499989],[115.796875,5.5361328125],[115.87714843750001,5.613525390625],[115.91845703125,5.724951171874991],[116.05976562500001,5.882373046874989],[116.11005859375001,6.003271484374991],[116.13837890625001,6.129541015624994],[116.49472656250003,6.521679687499997],[116.53828125000001,6.582714843749997],[116.74980468749999,6.977099609374989],[116.77617187499999,6.990234375],[116.8330078125,6.952050781249994],[116.84980468750001,6.826708984374989],[116.84199218750001,6.772070312499991],[116.80771484375003,6.691064453124994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[67.76533203125001,76.23759765625],[67.365234375,76.161279296875],[67.126953125,76.108154296875],[66.8931640625,76.072265625],[66.65742187500001,76.047021484375],[66.28242187500001,75.98369140625],[65.619140625,75.904638671875],[65.20156250000002,75.839453125],[64.74453125000002,75.788232421875],[64.26259765625002,75.719677734375],[63.779296875,75.672607421875],[63.65947265625002,75.66875],[63.31669921875002,75.603076171875],[63.045996093750006,75.575732421875],[62.06611328125001,75.427734375],[61.6162109375,75.31962890625],[61.48652343750001,75.31083984375],[61.35595703125,75.31484375],[61.24882812500002,75.281005859375],[61.14726562500002,75.22255859375],[60.935644531250006,75.163671875],[60.829199218750006,75.11083984375],[60.71923828125,75.068603515625],[60.655371093750006,75.055029296875],[60.533789062500006,75.05927734375],[60.4755859375,75.054736328125],[60.27685546875,75.007568359375],[60.24111328125002,74.970751953125],[60.45488281250002,74.946142578125],[60.50136718750002,74.904638671875],[60.43916015625001,74.875341796875],[60.30078125,74.83701171875],[60.22246093750002,74.79658203125],[60.080078125,74.755859375],[59.98232421875002,74.74462890625],[59.74726562500001,74.7458984375],[59.73466796875002,74.695458984375],[59.771484375,74.664453125],[59.75273437500002,74.63701171875],[59.67402343750001,74.61015625],[59.59599609375002,74.613720703125],[59.24013671875002,74.69296875],[59.18203125000002,74.665771484375],[59.15703125000002,74.61083984375],[59.14609375,74.551904296875],[59.10097656250002,74.50751953125],[59.04042968750002,74.485546875],[58.92822265625,74.4626953125],[58.53466796875,74.49892578125],[58.50214843750001,74.464208984375],[58.56201171875,74.421826171875],[58.64570312500001,74.32802734375],[58.6650390625,74.2892578125],[58.61787109375001,74.227392578125],[58.44140625,74.128857421875],[57.76738281250002,74.013818359375],[57.778417968750006,73.97392578125],[57.85341796875002,73.8978515625],[57.87226562500001,73.850439453125],[57.84492187500001,73.805078125],[57.755957031250006,73.769189453125],[57.65742187500001,73.7681640625],[57.60371093750001,73.77548828125],[57.44853515625002,73.825634765625],[57.313085937500006,73.838037109375],[57.29091796875002,73.81455078125],[57.46425781250002,73.746044921875],[57.542578125,73.658203125],[57.45976562500002,73.610302734375],[57.134375,73.50439453125],[56.9638671875,73.366552734375],[56.63417968750002,73.304296875],[56.43037109375001,73.297216796875],[56.22832031250002,73.314111328125],[56.03457031250002,73.3458984375],[55.54921875000002,73.3568359375],[55.28017578125002,73.392041015625],[55.0068359375,73.453857421875],[54.768652343750006,73.4494140625],[54.56582031250002,73.418505859375],[54.299902343750006,73.3509765625],[54.13154296875001,73.481005859375],[54.20458984375,73.542041015625],[53.83867187500002,73.697119140625],[53.76289062500001,73.766162109375],[53.85136718750002,73.800537109375],[53.963476562500006,73.822314453125],[54.17402343750001,73.8857421875],[54.386328125,73.93564453125],[54.60566406250001,73.951318359375],[54.642675781250006,73.9595703125],[54.7333984375,74.033984375],[54.83125,74.095751953125],[54.92031250000002,74.1291015625],[55.02285156250002,74.18662109375],[55.340917968750006,74.41962890625],[55.41640625000002,74.4361328125],[56.07832031250001,74.481298828125],[56.13710937500002,74.49609375],[55.94746093750001,74.5421875],[55.75175781250002,74.5412109375],[55.66152343750002,74.556103515625],[55.6103515625,74.59052734375],[55.58222656250001,74.627685546875],[55.65966796875,74.656298828125],[55.913671875,74.79609375],[56.217871093750006,74.897509765625],[56.49873046875001,74.957080078125],[56.42851562500002,74.97294921875],[56.34003906250001,75.0134765625],[55.998046875,75.003369140625],[55.86318359375002,75.058740234375],[55.82119140625002,75.090625],[55.81005859375,75.12490234375],[55.92070312500002,75.168359375],[56.03554687500002,75.19423828125],[56.162207031250006,75.186572265625],[56.288671875,75.164306640625],[56.38906250000002,75.13818359375],[56.48525390625002,75.09609375],[56.5703125,75.09775390625],[56.87626953125002,75.244384765625],[56.82929687500001,75.277734375],[56.80947265625002,75.32841796875],[56.84443359375001,75.351416015625],[56.98945312500001,75.37509765625],[57.0875,75.383837890625],[57.3017578125,75.3732421875],[57.60683593750002,75.341259765625],[57.63154296875001,75.3564453125],[57.70820312500001,75.4544921875],[57.78339843750001,75.506689453125],[58.09365234375002,75.592529296875],[58.07255859375002,75.618994140625],[58.05830078125001,75.6630859375],[58.41835937500002,75.719775390625],[58.65273437500002,75.776806640625],[58.88125,75.85478515625],[58.994726562500006,75.871728515625],[59.110449218750006,75.87373046875],[59.34658203125002,75.90703125],[59.78193359375001,75.945849609375],[60.0361328125,75.983837890625],[60.1181640625,76.066552734375],[60.279296875,76.096240234375],[60.60615234375001,76.108642578125],[60.730566406250006,76.104052734375],[60.80117187500002,76.068798828125],[60.94218750000002,76.0712890625],[60.99775390625001,76.0892578125],[61.05390625000001,76.119873046875],[61.03691406250002,76.16904296875],[61.034375,76.232958984375],[61.15693359375001,76.27353515625],[61.20166015625,76.28203125],[61.569433593750006,76.298486328125],[61.787109375,76.291015625],[62.2373046875,76.2416015625],[62.47109375000002,76.23046875],[62.78203125000002,76.24521484375],[62.97148437500002,76.236669921875],[63.52617187500002,76.309521484375],[64.4634765625,76.378173828125],[64.7076171875,76.426025390625],[64.95,76.484326171875],[65.0728515625,76.496728515625],[65.19716796875002,76.499658203125],[65.30976562500001,76.517919921875],[65.52841796875,76.567822265625],[65.63691406250001,76.578662109375],[65.75517578125002,76.579296875],[65.862890625,76.613330078125],[65.95888671875002,76.687939453125],[66.06298828125,76.74609375],[66.34521484375,76.821044921875],[66.82880859375001,76.923828125],[67.263671875,76.96376953125],[67.53496093750002,77.007763671875],[67.65185546875,77.011572265625],[68.01728515625001,76.990625],[68.48574218750002,76.93369140625],[68.69912109375002,76.870654296875],[68.87333984375002,76.789599609375],[68.91171875,76.760546875],[68.94169921875002,76.707666015625],[68.89052734375002,76.659716796875],[68.8580078125,76.610498046875],[68.89980468750002,76.57294921875],[68.55859375,76.4494140625],[68.22236328125001,76.3134765625],[68.16542968750002,76.28486328125],[67.76533203125001,76.23759765625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[55.31982421875,73.30830078125],[55.78730468750001,73.268603515625],[56.1376953125,73.25615234375],[56.35048828125002,73.225537109375],[56.42958984375002,73.201171875],[56.3974609375,73.13916015625],[56.33466796875001,73.113671875],[56.18896484375,73.0330078125],[56.1669921875,72.983203125],[56.19287109375,72.90498046875],[56.170507812500006,72.848095703125],[56.121679687500006,72.806591796875],[56.08378906250002,72.789404296875],[55.81972656250002,72.789501953125],[55.72343750000002,72.76640625],[55.71845703125001,72.721533203125],[55.70097656250002,72.671728515625],[55.61640625000001,72.599072265625],[55.44130859375002,72.575390625],[55.4033203125,72.549072265625],[55.41689453125002,72.501318359375],[55.35595703125,72.465087890625],[55.35957031250001,72.40869140625],[55.39042968750002,72.37783203125],[55.39912109375001,72.313623046875],[55.51806640625,72.220654296875],[55.49492187500002,72.18232421875],[55.4033203125,72.106884765625],[55.375,72.014892578125],[55.2978515625,71.9353515625],[55.47109375000002,71.86923828125],[55.54667968750002,71.783349609375],[55.61367187500002,71.689892578125],[55.8193359375,71.507568359375],[56.04316406250001,71.34560546875],[56.45439453125002,71.107373046875],[56.89482421875002,70.927001953125],[57.065625,70.876025390625],[57.48359375000001,70.79228515625],[57.55644531250002,70.7658203125],[57.62539062500002,70.72880859375],[57.44716796875002,70.66103515625],[57.263671875,70.63603515625],[57.24697265625002,70.605126953125],[57.14589843750002,70.589111328125],[56.64882812500002,70.646533203125],[56.621679687500006,70.65537109375],[56.56865234375002,70.6974609375],[56.51005859375002,70.72880859375],[56.3857421875,70.734130859375],[56.26005859375002,70.71474609375],[56.33476562500002,70.676708984375],[56.41718750000001,70.66494140625],[56.56132812500002,70.5935546875],[56.49970703125001,70.56640625],[56.4345703125,70.56298828125],[56.14248046875002,70.657861328125],[56.11474609375,70.646142578125],[56.08710937500001,70.618359375],[55.94160156250001,70.649267578125],[55.9072265625,70.626318359375],[55.796875,70.615576171875],[55.70673828125001,70.64189453125],[55.70644531250002,70.675244140625],[55.68730468750002,70.6921875],[55.236914062500006,70.666015625],[55.05166015625002,70.666748046875],[54.86708984375002,70.678125],[54.645117187500006,70.741845703125],[54.60820312500002,70.713232421875],[54.601171875,70.680078125],[54.51738281250002,70.693310546875],[54.332617187500006,70.744677734375],[54.19941406250001,70.764892578125],[53.72236328125001,70.814453125],[53.38359375000002,70.87353515625],[53.4677734375,70.9005859375],[53.61357421875002,70.9146484375],[53.615625,70.950830078125],[53.59257812500002,71.00068359375],[53.58779296875002,71.052294921875],[53.670507812500006,71.0869140625],[53.85703125,71.07041015625],[53.83427734375002,71.126708984375],[53.92226562500002,71.13759765625],[54.09394531250001,71.105224609375],[54.15566406250002,71.12548828125],[53.88613281250002,71.1962890625],[53.5908203125,71.2966796875],[53.622167968750006,71.332763671875],[53.515234375,71.342529296875],[53.40996093750002,71.34013671875],[53.31904296875001,71.399169921875],[53.33251953125,71.47724609375],[53.41162109375,71.530126953125],[53.363867187500006,71.541650390625],[52.90898437500002,71.49501953125],[52.6787109375,71.5056640625],[52.41884765625002,71.536865234375],[52.17998046875002,71.490234375],[51.93789062500002,71.47470703125],[51.812597656250006,71.49130859375],[51.69160156250001,71.525146484375],[51.590429687500006,71.571142578125],[51.511328125,71.648095703125],[51.43867187500001,71.776806640625],[51.42861328125002,71.825537109375],[51.44355468750001,71.934375],[51.48222656250002,71.97978515625],[51.58251953125,72.07119140625],[51.653125,72.099365234375],[51.80546875000002,72.142138671875],[51.88544921875001,72.15322265625],[52.06865234375002,72.13115234375],[52.252050781250006,72.129736328125],[52.33232421875002,72.153955078125],[52.40673828125,72.196728515625],[52.4619140625,72.25234375],[52.58613281250001,72.284033203125],[52.6220703125,72.3009765625],[52.66191406250002,72.336865234375],[52.70576171875001,72.390966796875],[52.7138671875,72.436962890625],[52.74873046875001,72.482958984375],[52.86367187500002,72.549853515625],[52.8232421875,72.591259765625],[52.83906250000001,72.619287109375],[52.916601562500006,72.668896484375],[52.68310546875,72.68232421875],[52.60498046875,72.704052734375],[52.52851562500001,72.737353515625],[52.55058593750002,72.7685546875],[52.57929687500001,72.791357421875],[52.81220703125001,72.875244140625],[52.913183593750006,72.899951171875],[53.02421875000002,72.91357421875],[53.13496093750001,72.913232421875],[53.253515625,72.903759765625],[53.36982421875001,72.916748046875],[53.24726562500001,72.97314453125],[53.23710937500002,73.011181640625],[53.18896484375,73.10400390625],[53.19794921875001,73.14755859375],[53.25117187500001,73.182958984375],[53.35761718750001,73.224560546875],[53.51220703125,73.23837890625],[53.63369140625002,73.26025390625],[53.75322265625002,73.29326171875],[53.865625,73.298974609375],[54.09101562500001,73.27646484375],[54.20234375000001,73.28134765625],[54.32763671875,73.299462890625],[54.67607421875002,73.37001953125],[54.80390625000001,73.387646484375],[54.940625,73.383251953125],[55.12138671875002,73.3568359375],[55.31982421875,73.30830078125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[142.76103515625005,54.3939453125],[142.97617187500003,54.140966796875],[142.98593750000003,54.085693359375],[142.96708984375005,54.02880859375],[142.92656250000005,53.955615234374996],[142.91142578125005,53.878369140625],[142.93642578125002,53.8109375],[142.91796875,53.794238281249996],[143.09550781250005,53.488671875],[143.2236328125,53.296044921875],[143.2599609375,53.21728515625],[143.28789062500005,53.134375],[143.32470703125,52.9630859375],[143.33261718750003,52.700048828125],[143.32363281250002,52.613574218749996],[143.2951171875,52.529150390625],[143.26425781250003,52.478662109375],[143.20097656250005,52.442919921874996],[143.17226562500002,52.349365234375],[143.15556640625005,52.083740234375],[143.190625,51.944482421875],[143.25058593750003,51.847900390625],[143.29472656250005,51.7443359375],[143.29951171875,51.632373046874996],[143.3205078125,51.583251953125],[143.41777343750005,51.52060546875],[143.45546875000002,51.471484375],[143.46738281250003,51.401904296874996],[143.47294921875005,51.29921875],[143.48876953125,51.27705078125],[143.5341796875,51.2462890625],[143.73603515625,50.506738281249994],[143.81601562500003,50.282617187499994],[144.04794921875003,49.895751953125],[144.14130859375,49.661474609375],[144.19960937500002,49.549755859375],[144.23994140625,49.43203125],[144.27207031250003,49.311328125],[144.34121093750002,49.180517578125],[144.43173828125003,49.051074218749996],[144.60683593750002,48.935839843749996],[144.685546875,48.871240234374994],[144.70664062500003,48.81953125],[144.71376953125002,48.640283203124994],[144.67265625000005,48.678564453125],[144.62099609375002,48.81484375],[144.536328125,48.8935546875],[144.41181640625,48.986376953124996],[144.28378906250003,49.069775390625],[144.12548828125,49.208544921874996],[144.04873046875002,49.249169921874994],[143.9677734375,49.276318359375],[143.81914062500005,49.30859375],[143.73232421875002,49.31201171875],[143.38222656250002,49.290673828124994],[143.236328125,49.262841796874994],[143.10498046875,49.198828125],[143.02685546875,49.105419921875],[142.9716796875,48.917773437499996],[142.65097656250003,48.246875],[142.57421875,48.072167968749994],[142.5458984375,47.884912109374994],[142.55693359375005,47.737890625],[142.57900390625002,47.683984375],[142.6701171875,47.536914062499996],[142.74541015625005,47.452392578125],[142.80078125,47.416162109374994],[142.86396484375,47.391796875],[142.90546875,47.361865234374996],[142.94033203125002,47.32275390625],[143.00556640625,47.222705078124996],[143.08925781250002,47.00078125],[143.1779296875,46.844042968749996],[143.21767578125002,46.794873046875],[143.31865234375005,46.807373046875],[143.384375,46.8056640625],[143.447265625,46.7919921875],[143.48564453125005,46.75205078125],[143.54033203125005,46.575097656249994],[143.57871093750003,46.406054687499996],[143.58066406250003,46.360693359375],[143.50859375000005,46.23017578125],[143.490625,46.174609375],[143.48232421875002,46.1158203125],[143.46347656250003,46.069482421874994],[143.431640625,46.028662109375],[143.41865234375,46.222021484375],[143.3703125,46.35849609375],[143.35214843750003,46.476220703124994],[143.28232421875003,46.558984375],[143.0478515625,46.592626953125],[142.829296875,46.605273437499996],[142.79550781250003,46.62021484375],[142.74736328125005,46.670654296875],[142.69189453125,46.710839843749994],[142.6357421875,46.716210937499994],[142.57802734375002,46.70078125],[142.47880859375005,46.64423828125],[142.4064453125,46.5546875],[142.35,46.45869140625],[142.30400390625005,46.357568359374994],[142.20859375000003,46.0888671875],[142.14970703125005,45.999267578125],[142.0771484375,45.917041015624996],[142.015625,45.96162109375],[141.96162109375,46.013476562499996],[141.92998046875005,46.08828125],[141.91630859375005,46.170751953125],[141.83037109375005,46.451074218749994],[141.86650390625005,46.694189453125],[142.01103515625005,47.030322265624996],[142.03867187500003,47.140283203124994],[142.01689453125005,47.244677734374996],[141.98417968750005,47.347705078124996],[141.9625,47.543798828125],[141.9640625,47.587451171874996],[142.015625,47.700634765625],[142.07597656250005,47.808349609375],[142.14921875000005,47.902148437499996],[142.18173828125003,48.01337890625],[142.13535156250003,48.290087890624996],[142.02871093750002,48.477099609374996],[141.89726562500005,48.6546875],[141.873046875,48.701953125],[141.86630859375003,48.75009765625],[141.97958984375003,48.97216796875],[142.02011718750003,49.078466796875],[142.06650390625003,49.312060546874996],[142.10869140625005,49.4396484375],[142.14228515625,49.569140625],[142.153125,50.216748046875],[142.14306640625,50.312109375],[142.07109375000005,50.514990234375],[142.06601562500003,50.63046875],[142.10048828125002,50.77646484375],[142.14726562500005,50.890185546874996],[142.20791015625002,50.998486328125],[142.20673828125,51.222558593749994],[142.09072265625002,51.42939453125],[142.00595703125003,51.5205078125],[141.87294921875002,51.630029296875],[141.771875,51.690185546875],[141.72236328125,51.736328125],[141.771875,51.751806640625],[141.80810546875,51.789208984375],[141.72099609375005,51.84677734375],[141.66845703125,51.933349609375],[141.66083984375,52.27294921875],[141.68242187500005,52.359130859375],[141.74755859375,52.454833984375],[141.80332031250003,52.555615234375],[141.85556640625003,52.793505859374996],[141.87363281250003,53.038916015625],[141.8388671875,53.138476562499996],[141.82353515625005,53.339501953125],[141.85244140625002,53.389453125],[141.96445312500003,53.456396484375],[142.14199218750002,53.49560546875],[142.1798828125,53.484033203125],[142.31894531250003,53.40546875],[142.37050781250002,53.4025390625],[142.4240234375,53.4107421875],[142.52617187500005,53.4474609375],[142.58349609375,53.536767578125],[142.50917968750002,53.58759765625],[142.55253906250005,53.652636718749996],[142.67958984375002,53.674365234374996],[142.68886718750002,53.73017578125],[142.64287109375005,53.736767578125],[142.68300781250002,53.816015625],[142.70595703125002,53.895703125],[142.67021484375005,53.968408203125],[142.46660156250005,54.14853515625],[142.3349609375,54.280712890625],[142.55166015625002,54.278955078125],[142.615625,54.30361328125],[142.6662109375,54.358203125],[142.69277343750002,54.41611328125],[142.76103515625005,54.3939453125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[143.82431640625003,44.116992187499996],[143.94951171875005,44.1119140625],[144.00546875000003,44.116650390625],[144.10136718750005,44.1015625],[144.48183593750002,43.949560546875],[144.5966796875,43.930224609374996],[144.71523437500002,43.927978515625],[144.79853515625,43.940234375],[144.871875,43.98193359375],[145.1015625,44.166162109374994],[145.3427734375,44.333886718749994],[145.36953125000002,44.327392578125],[145.36962890625,44.281298828124996],[145.35195312500002,44.229785156249996],[145.24521484375003,44.076171875],[145.12636718750002,43.869384765625],[145.10107421875,43.764550781249994],[145.1396484375,43.6625],[145.2140625,43.57822265625],[145.27294921875,43.462890625],[145.3408203125,43.302539062499996],[145.43613281250003,43.2822265625],[145.48789062500003,43.279736328125],[145.58330078125005,43.327783203124994],[145.67363281250005,43.3888671875],[145.75126953125005,43.396289062499996],[145.8330078125,43.3859375],[145.7255859375,43.34345703125],[145.62421875,43.291308593749996],[145.53740234375005,43.192675781249996],[145.505078125,43.17421875],[145.40478515625,43.1802734375],[145.34746093750005,43.176708984375],[145.23007812500003,43.135498046875],[145.1271484375,43.0888671875],[145.02880859375,43.031640625],[144.92138671875,43.000927734375],[144.80712890625,42.993701171874996],[144.63076171875002,42.946923828124994],[144.51621093750003,42.943603515625],[144.30156250000005,42.984423828124996],[144.197265625,42.9736328125],[143.96933593750003,42.881396484374996],[143.76210937500002,42.74814453125],[143.58095703125002,42.59873046875],[143.42949218750005,42.418896484375],[143.36865234375,42.325146484375],[143.33212890625003,42.220361328124994],[143.3271484375,42.151025390624994],[143.313671875,42.084326171875],[143.27871093750002,42.037841796875],[143.2365234375,42.0001953125],[143.11171875000002,42.022216796875],[142.90634765625003,42.118359375],[142.50820312500002,42.257958984374994],[142.087890625,42.471728515624996],[141.85136718750005,42.579052734375],[141.40664062500002,42.546923828124996],[140.98613281250005,42.342138671875],[140.9484375,42.3595703125],[140.78759765625,42.5],[140.70976562500005,42.555615234375],[140.61679687500003,42.571337890624996],[140.54765625000005,42.56953125],[140.48046875,42.559375],[140.38544921875,42.487158203125],[140.3505859375,42.435107421874996],[140.32353515625005,42.37607421875],[140.31523437500005,42.334277343749996],[140.32666015625,42.293359375],[140.41660156250003,42.200732421874996],[140.5275390625,42.131787109375],[140.57773437500003,42.11865234375],[140.68427734375,42.123486328125],[140.73378906250002,42.116357421874994],[140.9123046875,41.977783203125],[141.10771484375005,41.848046875],[141.15097656250003,41.805078125],[141.07871093750003,41.759814453124996],[140.99951171875,41.73740234375],[140.90751953125005,41.74326171875],[140.81640625,41.760400390624994],[140.65986328125,41.815576171874994],[140.59296875,41.7685546875],[140.48916015625002,41.672167968749996],[140.431640625,41.5673828125],[140.3849609375,41.519287109375],[140.27011718750003,41.456005859375],[140.1486328125,41.423242187499994],[140.08515625,41.43408203125],[140.03662109375,41.473779296874994],[140.00917968750002,41.521337890625],[139.9953125,41.576416015625],[140.02128906250005,41.695751953125],[140.0841796875,41.80322265625],[140.1083984375,41.912939453125],[140.0568359375,42.067333984375],[140.02412109375,42.099560546875],[139.89511718750003,42.1900390625],[139.83544921875,42.278076171875],[139.82089843750003,42.387597656249994],[139.82851562500002,42.448144531249994],[139.86015625000005,42.58173828125],[139.89111328125,42.64921875],[139.95058593750002,42.671435546874996],[140.01503906250002,42.684765625],[140.11464843750002,42.732958984374996],[140.22412109375,42.7955078125],[140.32861328125,42.866845703124994],[140.43222656250003,42.9541015625],[140.48642578125003,43.04990234375],[140.3974609375,43.167333984375],[140.37929687500002,43.237109375],[140.39238281250005,43.303125],[140.48691406250003,43.338183593749996],[140.58457031250003,43.31171875],[140.78066406250002,43.214990234374994],[140.81914062500005,43.20546875],[140.95380859375,43.200976562499996],[141.13818359375,43.179931640625],[141.24501953125002,43.18505859375],[141.29628906250002,43.199658203125],[141.37412109375003,43.279638671875],[141.4123046875,43.381494140624994],[141.39833984375002,43.5125],[141.39765625,43.642626953124996],[141.44677734375,43.7486328125],[141.60068359375003,43.918994140624996],[141.6447265625,44.019433593749994],[141.66083984375,44.263623046875],[141.71630859375,44.37119140625],[141.7609375,44.48251953125],[141.7822265625,44.716357421874996],[141.71904296875005,44.941064453124994],[141.65576171875,45.051220703125],[141.5830078125,45.15595703125],[141.59375,45.25595703125],[141.6525390625,45.3486328125],[141.65400390625,45.3765625],[141.66796875,45.401269531249994],[141.778125,45.418896484375],[141.82949218750002,45.438769531249996],[141.87871093750005,45.483300781249994],[141.9376953125,45.509521484375],[141.98085937500002,45.48349609375],[142.01640625000005,45.437939453125],[142.17158203125,45.325634765625],[142.416015625,45.125],[142.7041015625,44.819189453125],[142.884765625,44.6701171875],[143.07509765625002,44.534912109375],[143.28857421875,44.396630859374994],[143.5119140625,44.2775390625],[143.65458984375005,44.221337890624994],[143.75908203125005,44.131640625],[143.82431640625003,44.116992187499996]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[141.22929687500005,41.37265625],[141.26875,41.353808593749996],[141.45546875000002,41.404736328125],[141.419921875,41.251171875],[141.4,41.096337890624994],[141.41367187500003,40.83935546875],[141.43046875000005,40.72333984375],[141.46279296875002,40.611132812499996],[141.54228515625005,40.530712890625],[141.64628906250005,40.4736328125],[141.7970703125,40.291162109374994],[141.8779296875,40.067236328125],[141.93505859375,39.95849609375],[141.97783203125005,39.84443359375],[141.99082031250003,39.792236328125],[141.99189453125,39.739892578124994],[141.97910156250003,39.668359375],[141.9931640625,39.610546875],[141.97695312500002,39.42880859375],[141.90947265625005,39.218701171875],[141.90078125000002,39.111328125],[141.84208984375005,39.0900390625],[141.80654296875002,39.040429687499994],[141.77617187500005,39.017431640625],[141.74248046875005,38.999609375],[141.6935546875,38.995166015624996],[141.65859375000002,38.974853515625],[141.6447265625,38.917919921875],[141.622265625,38.865136718749994],[141.57968750000003,38.81650390625],[141.54628906250002,38.762841796874994],[141.51875,38.63203125],[141.5087890625,38.497851562499996],[141.46748046875,38.404150390625],[141.3681640625,38.379736328125],[141.25429687500002,38.381396484374996],[141.1083984375,38.337939453124996],[141.07734375,38.312548828124996],[140.962109375,38.148876953125],[140.92900390625005,38.052880859374994],[140.9279296875,37.949609375],[140.9599609375,37.822607421875],[141.00341796875,37.6984375],[141.036328125,37.467236328125],[141.00166015625,37.114648437499994],[140.96835937500003,37.00205078125],[140.89511718750003,36.925732421875],[140.83964843750005,36.89033203125],[140.79179687500005,36.846875],[140.72988281250002,36.731884765625],[140.62734375000002,36.502783203125],[140.61884765625,36.4453125],[140.61923828125003,36.385595703125],[140.59160156250005,36.3078125],[140.57353515625005,36.231347656249994],[140.59042968750003,36.142431640625],[140.62197265625002,36.059228515624994],[140.75957031250005,35.845703125],[140.8134765625,35.782519531249996],[140.8740234375,35.724951171875],[140.63925781250003,35.661279296874994],[140.596875,35.63203125],[140.45742187500002,35.51025390625],[140.41289062500005,35.394775390625],[140.41650390625,35.266992187499994],[140.39296875000002,35.221142578125],[140.3546875,35.181445312499996],[140.31474609375005,35.155029296875],[140.15888671875,35.096484375],[140.05917968750003,35.03828125],[139.95976562500005,34.947314453124996],[139.92041015625,34.899609375],[139.8439453125,34.914892578125],[139.79921875000002,34.956933593749994],[139.84326171875,35.00986328125],[139.82968750000003,35.072167968749994],[139.85146484375002,35.232324218749994],[139.82646484375005,35.296679687499996],[139.90615234375002,35.345263671874996],[139.94414062500005,35.422998046874994],[140.02714843750005,35.485205078125],[140.08632812500002,35.540429687499994],[140.096875,35.58515625],[140.04365234375,35.633349609374996],[139.9875,35.668212890625],[139.90976562500003,35.668359375],[139.83476562500005,35.658056640625],[139.786328125,35.612109375],[139.77011718750003,35.549560546875],[139.77392578125,35.520361328125],[139.7677734375,35.49482421875],[139.65,35.409130859375],[139.66552734375,35.319482421874994],[139.7,35.273974609374996],[139.74404296875002,35.252392578125],[139.73085937500002,35.221533203125],[139.675,35.149267578125],[139.6359375,35.142138671874996],[139.56406250000003,35.24326171875],[139.47441406250005,35.29853515625],[139.3634765625,35.298095703125],[139.24941406250002,35.27802734375],[139.16269531250003,35.210742187499996],[139.13408203125005,35.1548828125],[139.11582031250003,35.097119140625],[139.12197265625002,34.956494140625],[139.08603515625003,34.839160156249996],[139.015625,34.73603515625],[138.9826171875,34.698388671874994],[138.8966796875,34.62841796875],[138.8375,34.61923828125],[138.7951171875,34.651025390624994],[138.76103515625005,34.69921875],[138.80449218750005,34.875732421875],[138.802734375,34.9748046875],[138.90361328125005,35.025244140625],[138.82089843750003,35.095703125],[138.71962890625002,35.124072265624996],[138.5771484375,35.086474609374996],[138.53701171875002,35.044140625],[138.50957031250005,34.987158203125],[138.43310546875,34.915185546874994],[138.3486328125,34.847705078124996],[138.25322265625005,34.732666015625],[138.18906250000003,34.596337890624994],[137.97900390625,34.640917968749996],[137.8642578125,34.65087890625],[137.74853515625,34.647412109375],[137.54335937500002,34.664208984374994],[137.31806640625,34.636376953124994],[137.06171875,34.5828125],[137.07705078125002,34.621435546875],[137.28779296875,34.703515625],[137.29541015625,34.727587890624996],[137.27519531250005,34.772509765624996],[137.22265625,34.774707031249996],[137.09658203125002,34.759033203125],[137.0322265625,34.765917968749996],[137.00595703125003,34.814111328124994],[136.96328125000002,34.834912109375],[136.934765625,34.815185546875],[136.94414062500005,34.721533203125],[136.91289062500005,34.709033203124996],[136.8712890625,34.73310546875],[136.88457031250005,34.805859375],[136.85615234375,34.9125],[136.85292968750002,34.9787109375],[136.89707031250003,35.035546875],[136.85185546875005,35.059521484375],[136.80419921875,35.05029296875],[136.74355468750002,35.022998046874996],[136.69003906250003,34.984130859375],[136.57695312500005,34.78955078125],[136.53300781250005,34.678369140624994],[136.61582031250003,34.5890625],[136.84160156250005,34.464208984375],[136.88027343750002,34.43359375],[136.88115234375005,34.38046875],[136.8537109375,34.324072265625],[136.7921875,34.299267578125],[136.54443359375,34.257714843749994],[136.32988281250005,34.17685546875],[136.26787109375005,34.094873046874994],[136.07255859375005,33.778222656249994],[135.9162109375,33.56171875],[135.6953125,33.486962890624994],[135.45283203125,33.553369140624994],[135.39423828125,33.628759765625],[135.34677734375003,33.721972656249996],[135.25664062500005,33.80625],[135.17539062500003,33.898046875],[135.1279296875,34.006982421874994],[135.13535156250003,34.1826171875],[135.10009765625,34.288378906249996],[135.13193359375003,34.316552734374994],[135.265625,34.380810546875],[135.30927734375,34.416796875],[135.384765625,34.500439453125],[135.41181640625,34.54697265625],[135.41591796875002,34.617480468749996],[135.35517578125,34.654296875],[135.1982421875,34.6529296875],[135.04169921875,34.631005859374994],[134.9298828125,34.66181640625],[134.78496093750005,34.7470703125],[134.74003906250005,34.765234375],[134.58378906250005,34.77060546875],[134.47226562500003,34.754785156249994],[134.36269531250002,34.723681640624996],[134.246875,34.7138671875],[134.20830078125005,34.69765625],[134.07451171875005,34.593115234375],[133.96826171875,34.527294921875],[133.87636718750002,34.49462890625],[133.6779296875,34.485888671874996],[133.57861328125,34.464697265625],[133.47441406250005,34.430126953125],[133.4453125,34.433154296874996],[133.33564453125,34.3853515625],[133.20976562500005,34.343994140625],[133.14238281250005,34.30244140625],[133.01894531250002,34.32958984375],[132.774609375,34.255224609375],[132.65654296875005,34.24609375],[132.53447265625005,34.287060546875],[132.42128906250002,34.353369140625],[132.31259765625003,34.324951171875],[132.23808593750005,34.227001953125],[132.20195312500005,34.03203125],[132.159375,33.944238281249994],[132.146484375,33.838769531249994],[132.09023437500002,33.85546875],[131.76318359375,34.045263671875],[131.74052734375005,34.052050781249996],[131.47617187500003,34.019384765625],[131.40791015625,34.00361328125],[131.32275390625,33.965185546875],[131.2326171875,33.947998046875],[131.150390625,33.975634765624996],[131.071875,34.020654296874994],[130.99638671875005,34.007275390625],[130.91884765625002,33.975732421874994],[130.88925781250003,34.26181640625],[130.904296875,34.299560546875],[130.95185546875,34.34970703125],[131.00419921875005,34.392578125],[131.13222656250002,34.407373046874994],[131.26181640625003,34.393457031249994],[131.35439453125002,34.41318359375],[131.43251953125002,34.46982421875],[131.51503906250002,34.550146484375],[131.60800781250003,34.615478515625],[131.73408203125,34.66708984375],[131.85605468750003,34.726318359375],[131.9630859375,34.809375],[132.06474609375005,34.9],[132.158203125,34.96650390625],[132.25957031250005,35.022314453125],[132.4140625,35.156298828124996],[132.61904296875002,35.3068359375],[132.69765625000002,35.418310546875],[132.74658203125,35.449023437499996],[132.92294921875003,35.511279296874996],[133.15693359375,35.558837890625],[133.26718750000003,35.556542968749994],[133.37646484375,35.458837890625],[133.43535156250005,35.472216796874996],[133.49492187500005,35.497460937499994],[133.6154296875,35.51142578125],[133.73935546875003,35.495263671874994],[133.86025390625002,35.494873046875],[133.98125,35.507226562499994],[134.2140625,35.5392578125],[134.33652343750003,35.577929687499996],[134.4560546875,35.6279296875],[134.88222656250002,35.663232421874994],[135.17431640625,35.7470703125],[135.22050781250005,35.741113281249994],[135.26542968750005,35.72177734375],[135.26875,35.65966796875],[135.23203125000003,35.59189453125],[135.2677734375,35.55087890625],[135.32695312500005,35.525537109374994],[135.60185546875005,35.517724609374994],[135.68027343750003,35.503125],[135.79501953125003,35.54951171875],[135.903125,35.606884765625],[136.01621093750003,35.682519531249994],[136.09531250000003,35.767626953124996],[136.02226562500005,35.87412109375],[136.00625,35.990576171875],[136.06748046875003,36.116845703124994],[136.15625,36.22333984375],[136.26181640625003,36.2876953125],[136.35898437500003,36.361767578125],[136.555859375,36.57197265625],[136.69814453125002,36.742041015625],[136.74931640625005,36.951025390625],[136.71923828125,37.198388671874994],[136.84345703125,37.382128906249996],[136.96230468750002,37.413671875],[137.19863281250002,37.497460937499994],[137.32265625000002,37.5220703125],[137.34121093750002,37.48544921875],[137.3375,37.437451171875],[137.15205078125,37.283154296875],[137.04580078125002,37.2197265625],[136.98222656250005,37.200048828125],[136.9240234375,37.17197265625],[136.89990234375,37.11767578125],[136.99443359375005,37.026757812499994],[137.0185546875,36.959619140624994],[137.0126953125,36.8951171875],[137.01669921875003,36.837207031249996],[137.12373046875,36.774072265624994],[137.2462890625,36.753173828125],[137.29765625000005,36.753759765625],[137.34257812500005,36.770361328125],[137.4826171875,36.924755859375],[137.51406250000002,36.9515625],[137.91318359375003,37.064599609374994],[138.1095703125,37.15107421875],[138.21806640625005,37.173388671874996],[138.31992187500003,37.218408203124994],[138.54833984375,37.392138671874996],[138.6328125,37.47216796875],[138.709375,37.56064453125],[138.77060546875003,37.663427734375],[138.81884765625,37.774707031249996],[138.88505859375005,37.8439453125],[139.24716796875003,38.009082031249996],[139.36386718750003,38.099023437499994],[139.40097656250003,38.142578125],[139.44580078125,38.26875],[139.4767578125,38.399804687499994],[139.52080078125005,38.5025390625],[139.58017578125003,38.598876953125],[139.65976562500003,38.697021484375],[139.74912109375003,38.788134765624996],[139.801953125,38.881591796875],[139.87861328125,39.104931640625],[139.9123046875,39.228564453124996],[139.93857421875003,39.27314453125],[139.97714843750003,39.31064453125],[140.01083984375003,39.358056640624994],[140.03652343750002,39.4111328125],[140.04814453125005,39.463720703125],[140.06474609375005,39.624414062499994],[140.0546875,39.749267578125],[139.99472656250003,39.855078125],[139.94521484375002,39.885107421875],[139.89121093750003,39.886865234374994],[139.81035156250005,39.877734375],[139.74150390625005,39.920849609375],[139.75546875000003,39.958935546875],[139.82568359375,39.966015625],[139.87363281250003,39.985693359375],[139.90800781250005,40.021728515625],[139.97246093750005,40.136962890625],[140.01113281250002,40.2603515625],[140.01445312500005,40.314892578125],[139.9640625,40.414306640625],[139.92392578125003,40.53388671875],[139.9228515625,40.5984375],[139.96669921875002,40.672753906249994],[140.029296875,40.733154296875],[140.08535156250002,40.747363281249996],[140.14609375000003,40.7515625],[140.20126953125003,40.77490234375],[140.25234375000002,40.8087890625],[140.28125,40.84609375],[140.32626953125003,40.94765625],[140.34355468750005,41.005664062499996],[140.31523437500005,41.160888671875],[140.34443359375,41.2033203125],[140.3859375,41.229785156249996],[140.44130859375002,41.20966796875],[140.498046875,41.2056640625],[140.56416015625,41.211816406249994],[140.62763671875,41.19541015625],[140.6396484375,41.155615234375],[140.67939453125,40.89326171875],[140.70244140625005,40.8578125],[140.74863281250003,40.830322265625],[140.80078125,40.834326171875],[140.84580078125003,40.875146484374994],[140.876171875,40.929541015625],[140.93603515625,40.940771484375],[141.11855468750002,40.882275390625],[141.18320312500003,40.9240234375],[141.22539062500005,40.9884765625],[141.26210937500002,41.102685546874994],[141.24423828125003,41.205615234374996],[141.200390625,41.243603515625],[141.15507812500005,41.23671875],[141.11503906250005,41.20849609375],[141.07041015625003,41.19306640625],[140.80058593750005,41.138818359374994],[140.80185546875003,41.253662109375],[140.8595703125,41.425439453124994],[140.89150390625002,41.479785156249996],[140.93691406250002,41.50556640625],[141.05019531250002,41.475732421874994],[141.10585937500002,41.455859375],[141.22929687500005,41.37265625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[134.357421875,34.25634765625],[134.49570312500003,34.214746093749994],[134.6375,34.226611328124996],[134.63525390625,34.0439453125],[134.65537109375003,33.9826171875],[134.6953125,33.927734375],[134.6748046875,33.847802734374994],[134.73886718750003,33.8205078125],[134.54873046875002,33.729296875],[134.37705078125003,33.6083984375],[134.30654296875002,33.526806640625],[134.24267578125,33.439453125],[134.20566406250003,33.346972656249996],[134.181640625,33.247216796874994],[134.12412109375003,33.286767578124994],[133.95869140625,33.44833984375],[133.85400390625,33.49267578125],[133.68564453125003,33.51630859375],[133.63203125,33.510986328125],[133.28593750000005,33.3599609375],[133.23994140625,33.249609375],[133.14560546875003,33.083154296874994],[133.10087890625005,33.028222656249994],[133.05117187500002,33.012451171875],[133.01601562500002,32.98388671875],[132.97724609375,32.8419921875],[132.86992187500005,32.75458984375],[132.80429687500003,32.752001953124996],[132.69218750000005,32.775927734374996],[132.641796875,32.762451171875],[132.708984375,32.902490234374994],[132.60195312500002,32.91953125],[132.4951171875,32.9166015625],[132.49257812500002,33.007666015625],[132.42783203125003,33.059375],[132.47578125,33.12646484375],[132.47714843750003,33.18115234375],[132.50527343750002,33.211279296875],[132.51503906250002,33.25537109375],[132.51142578125,33.29306640625],[132.44541015625003,33.304589843749994],[132.40517578125002,33.33125],[132.41279296875,33.43046875],[132.37490234375002,33.43408203125],[132.28105468750005,33.416796875],[132.08583984375002,33.340136718749996],[132.03261718750002,33.339990234374994],[132.114453125,33.394580078124996],[132.28789062500005,33.46953125],[132.36591796875,33.512451171875],[132.53603515625002,33.63291015625],[132.64306640625,33.68994140625],[132.69892578125,33.790917968749994],[132.71621093750002,33.85224609375],[132.75234375000002,33.906152343749994],[132.78427734375003,33.992431640625],[132.83945312500003,34.021240234375],[132.93515625000003,34.0953125],[132.99013671875002,34.088134765625],[133.05126953125,33.997119140624996],[133.13369140625002,33.927294921874996],[133.19306640625,33.933203125],[133.298828125,33.968994140625],[133.3498046875,33.97705078125],[133.47207031250002,33.972802734374994],[133.58203125,34.017138671874996],[133.62675781250005,34.069384765624996],[133.64345703125002,34.134667968749994],[133.60263671875003,34.24384765625],[133.65556640625005,34.232861328125],[133.70625,34.237353515624996],[133.82558593750002,34.3068359375],[133.94833984375003,34.348046875],[134.07587890625,34.3583984375],[134.21923828125,34.31904296875],[134.357421875,34.25634765625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[131.17460937500005,33.602587890624996],[131.30917968750003,33.57275390625],[131.36601562500005,33.5708984375],[131.41875,33.584423828125],[131.49882812500005,33.623583984374996],[131.5830078125,33.652392578124996],[131.64306640625,33.63779296875],[131.6962890625,33.602832031249996],[131.72421875000003,33.55380859375],[131.71064453125,33.50234375],[131.61552734375005,33.391845703125],[131.53740234375005,33.274072265624994],[131.71708984375005,33.252099609374994],[131.89658203125003,33.25458984375],[131.8546875,33.181640625],[131.8478515625,33.118066406249994],[131.90273437500002,33.087792968749994],[131.94931640625003,33.0470703125],[131.93720703125,33.01015625],[131.91044921875005,32.973681640624996],[132.00859375000005,32.91904296875],[132.0021484375,32.882373046874996],[131.97666015625003,32.8439453125],[131.73212890625,32.592822265624996],[131.6603515625,32.465625],[131.6103515625,32.325488281249996],[131.5646484375,32.223046875],[131.53115234375002,32.116748046874996],[131.50566406250005,32.001953125],[131.46025390625005,31.883496093749997],[131.47529296875,31.77841796875],[131.4599609375,31.670800781249994],[131.33720703125005,31.4046875],[131.24970703125,31.409619140624997],[131.13974609375003,31.441845703124997],[131.07080078125,31.436865234375],[131.03515625,31.377685546875],[131.09843750000005,31.256152343749996],[130.90224609375002,31.112060546875],[130.6857421875,31.01513671875],[130.68417968750003,31.059277343749997],[130.70449218750002,31.094091796875],[130.73574218750002,31.1220703125],[130.75839843750003,31.155810546874996],[130.78974609375,31.269091796874996],[130.77421875000005,31.383203125],[130.708984375,31.526074218749997],[130.70419921875003,31.577441406249996],[130.74941406250002,31.598193359374996],[130.77978515625,31.6041015625],[130.79628906250002,31.624072265624996],[130.796875,31.671289062499994],[130.77626953125002,31.706298828125],[130.71455078125,31.717675781249994],[130.65507812500005,31.718408203124994],[130.6134765625,31.665429687499994],[130.55605468750002,31.5630859375],[130.528125,31.459667968749997],[130.54042968750002,31.403076171875],[130.56591796875,31.352392578125],[130.64453125,31.267480468749994],[130.62148437500002,31.217529296875],[130.58876953125002,31.178515625],[130.31064453125003,31.266894531249996],[130.25058593750003,31.273193359375],[130.20068359375,31.291894531249994],[130.14726562500005,31.408496093749996],[130.26054687500005,31.436572265624996],[130.294140625,31.45068359375],[130.306640625,31.48779296875],[130.32197265625,31.601464843749994],[130.26894531250002,31.696337890624996],[130.22421875000003,31.730078125],[130.18789062500002,31.768847656249996],[130.2109375,31.848974609375],[130.19580078125,31.949853515624994],[130.19443359375003,32.090771484375],[130.2140625,32.115039062499996],[130.31914062500005,32.143505859375],[130.39492187500002,32.218994140625],[130.46201171875003,32.304931640625],[130.56035156250005,32.4560546875],[130.64052734375002,32.61923828125],[130.56328125000005,32.626367187499994],[130.49785156250005,32.65693359375],[130.56943359375003,32.734130859375],[130.54726562500002,32.831591796874996],[130.4404296875,32.9513671875],[130.38173828125002,33.092578125],[130.2873046875,33.15478515625],[130.2375,33.177636718749994],[130.17685546875003,33.14453125],[130.12685546875002,33.104833984375],[130.17314453125005,33.012988281249996],[130.16777343750005,32.931787109374994],[130.175,32.851318359375],[130.22216796875,32.846826171874994],[130.28007812500005,32.866845703124994],[130.32646484375005,32.85263671875],[130.353515625,32.810351562499996],[130.36083984375,32.755859375],[130.34042968750003,32.70185546875],[130.29765625000005,32.675],[130.24550781250002,32.677148437499994],[130.19296875000003,32.706298828125],[130.15205078125,32.747851562499996],[130.05410156250002,32.770800781249996],[129.95078125000003,32.721728515624996],[129.8525390625,32.621728515624994],[129.7685546875,32.57099609375],[129.80810546875,32.645263671875],[129.82675781250003,32.725341796875],[129.78593750000005,32.781640625],[129.69003906250003,32.875244140625],[129.66777343750005,32.92939453125],[129.6623046875,32.994921875],[129.67910156250002,33.059960937499994],[129.77773437500002,32.985546875],[129.8283203125,32.89267578125],[129.90078125000002,32.851904296875],[129.99169921875,32.8515625],[129.921875,32.98798828125],[129.89677734375005,33.022363281249994],[129.79873046875002,33.08359375],[129.6650390625,33.18662109375],[129.580078125,33.236279296875],[129.61015625000005,33.343652343749994],[129.65996093750005,33.364990234375],[129.7021484375,33.359814453125],[129.84414062500002,33.32177734375],[129.85751953125003,33.375244140625],[129.83662109375,33.40380859375],[129.82568359375,33.43701171875],[129.919140625,33.48349609375],[130.07207031250005,33.521777343749996],[130.10341796875002,33.539697265624994],[130.13056640625,33.578173828124996],[130.16796875,33.598291015624994],[130.27509765625,33.597705078124996],[130.36503906250005,33.63447265625],[130.439453125,33.734228515625],[130.4572265625,33.788964843749994],[130.48378906250002,33.834619140624994],[130.66953125000003,33.915478515625],[130.715625,33.927783203124996],[130.83964843750005,33.917773437499996],[130.953125,33.872021484375],[131.00908203125005,33.775830078125],[131.05810546875,33.6728515625],[131.17460937500005,33.602587890624996]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[121.0087890625,22.620361328125],[120.946875,22.503076171874994],[120.89736328125002,22.379150390625],[120.87734375000002,22.26220703125],[120.87841796875,22.141552734374997],[120.8642578125,22.032666015624997],[120.83984375,21.925],[120.74277343750003,21.956005859374997],[120.69013671875001,22.033105468749994],[120.67802734374999,22.15966796875],[120.60761718750001,22.312548828125003],[120.58125,22.356396484374997],[120.47978515624999,22.44189453125],[120.38759765625002,22.484521484374994],[120.31621093749999,22.547607421875],[120.32558593750002,22.542431640624997],[120.27285156250002,22.62744140625],[120.23281250000002,22.717919921874994],[120.15009765625001,22.974902343750003],[120.12158203125,23.037011718749994],[120.08339843750002,23.093701171874997],[120.07246093750001,23.14975585937499],[120.08554687500003,23.212060546874994],[120.12119140625003,23.30517578125],[120.14296875000002,23.399072265624994],[120.12539062500002,23.526611328125],[120.13212890624999,23.65292968749999],[120.15898437499999,23.709033203125003],[120.62968749999999,24.478515625],[120.75742187500003,24.642285156249997],[120.8359375,24.72265625],[120.90156250000001,24.81328125],[120.96406250000001,24.927978515625],[121.040625,25.0328125],[121.09541015625001,25.065087890624994],[121.36542968750001,25.1591796875],[121.44960937500002,25.2490234375],[121.51708984375,25.276904296875003],[121.59365234375002,25.275341796874997],[121.64306640625,25.232421875],[121.68710937500003,25.181591796874997],[121.73330078125002,25.154101562500003],[121.85283203124999,25.104443359374997],[121.90517578125002,25.056445312500003],[121.92900390624999,24.97373046874999],[121.85625,24.895263671875],[121.82011718749999,24.824511718750003],[121.81337890625002,24.746337890625],[121.82636718750001,24.640527343749994],[121.82802734375002,24.534375],[121.73701171875001,24.28525390624999],[121.63935546875001,24.130078125],[121.61308593749999,24.052734375],[121.58339843750002,23.860888671875003],[121.52607421875001,23.668261718750003],[121.47714843750003,23.424072265625],[121.3974609375,23.172509765624994],[121.35224609375001,23.067285156249994],[121.2958984375,22.966601562500003],[121.16123046875003,22.7763671875],[121.0087890625,22.620361328125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[110.88876953125003,19.991943359375],[110.93828124999999,19.947558593750003],[110.970703125,19.88330078125],[110.99765625000003,19.764697265625003],[111.013671875,19.65546875],[110.91269531250003,19.586083984374994],[110.822265625,19.557910156250003],[110.64091796874999,19.291210937499997],[110.603125,19.20703125],[110.57216796875002,19.171875],[110.5625,19.13515625],[110.56601562500003,19.098535156249994],[110.51933593749999,18.97021484375],[110.47763671875003,18.81259765624999],[110.45126953125003,18.747949218749994],[110.39951171875003,18.69833984374999],[110.33369140625001,18.673291015624997],[110.29082031249999,18.66953125],[110.25175781249999,18.65576171875],[110.15625,18.56982421875],[110.04853515625001,18.50522460937499],[110.06640625,18.475634765625003],[110.0673828125,18.447558593750003],[110.02021484375001,18.416259765625],[109.96767578125002,18.422070312499997],[109.815625,18.396679687499997],[109.759765625,18.348291015624994],[109.70273437500003,18.25913085937499],[109.68105468750002,18.247119140625003],[109.58955078125001,18.226318359375],[109.51933593749999,18.21826171875],[109.40009765625001,18.28110351562499],[109.34091796875003,18.299609375],[109.18320312500003,18.325146484374997],[109.02988281250003,18.36777343749999],[108.92226562500002,18.41611328124999],[108.70156250000002,18.53525390624999],[108.67607421874999,18.750244140625],[108.63808593750002,18.86630859374999],[108.63564453125002,18.90771484375],[108.65,19.265039062499994],[108.66552734375,19.304101562499994],[108.69355468750001,19.33828125],[108.791015625,19.418164062499997],[108.90283203125,19.481347656249994],[109.06289062500002,19.613574218750003],[109.17910156250002,19.674121093750003],[109.27666015624999,19.761132812499994],[109.21953124999999,19.757470703124994],[109.17744140625001,19.768457031249994],[109.21894531250001,19.842822265625003],[109.26347656249999,19.88266601562499],[109.31484375000002,19.90439453124999],[109.41816406250001,19.888818359374994],[109.513671875,19.904248046874997],[109.58427734374999,19.9703125],[109.6513671875,19.984375],[109.90625,19.96274414062499],[110.0830078125,19.992919921875],[110.17158203125001,20.0537109375],[110.21337890625,20.056054687499994],[110.34394531250001,20.038818359375],[110.39228515625001,19.9755859375],[110.38798828124999,20.018017578124997],[110.3935546875,20.059228515624994],[110.41757812500003,20.054736328125003],[110.58818359374999,19.976367187500003],[110.58876953125002,20.072460937499997],[110.59833984375001,20.097607421874997],[110.65175781250002,20.137744140625003],[110.67851562499999,20.13706054687499],[110.74453125000002,20.059472656249994],[110.80908203125,20.014404296875],[110.88876953125003,19.991943359375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[79.98232421875002,9.812695312499997],[80.07841796874999,9.807470703124991],[80.18095703124999,9.810009765624997],[80.25283203125002,9.796337890624997],[80.3759765625,9.642333984375],[80.71113281250001,9.366357421874994],[80.89345703125002,9.085888671874997],[80.91005859375002,9.024511718749991],[80.93544921875002,8.971484374999989],[80.97919921875001,8.956933593749994],[81.01601562500002,8.9326171875],[81.1982421875,8.661962890624991],[81.21923828125,8.6083984375],[81.21621093750002,8.549414062499991],[81.22695312500002,8.505517578124994],[81.27460937500001,8.48359375],[81.333984375,8.472070312499994],[81.37285156249999,8.431445312499989],[81.42216796874999,8.215234375],[81.42216796874999,8.147851562499994],[81.43593750000002,8.118896484375],[81.66542968750002,7.782470703125],[81.6787109375,7.741552734374991],[81.67626953125,7.7109375],[81.68291015624999,7.684472656249994],[81.72734374999999,7.625],[81.79667968749999,7.464794921874997],[81.83203125,7.428417968749997],[81.87412109375003,7.288330078125],[81.876953125,7.020458984374997],[81.86142578125003,6.901269531249994],[81.81855468750001,6.756201171874991],[81.76777343750001,6.614306640624989],[81.71269531249999,6.511865234374994],[81.63740234375001,6.425146484374991],[81.37998046875003,6.240917968749997],[81.30625,6.203857421875],[80.97109375000002,6.08837890625],[80.72412109375,5.979052734374989],[80.49580078125001,5.949365234374994],[80.26738281249999,6.009765625],[80.09531250000003,6.153173828124991],[80.00722656250002,6.364404296874994],[79.94697265625001,6.584521484374989],[79.859375,6.829296875],[79.79208984375003,7.585205078125],[79.75996093750001,7.796484375],[79.70781249999999,8.065673828125],[79.71298828125003,8.182324218749997],[79.74980468749999,8.294238281249989],[79.74970703125001,8.048876953124989],[79.78349609374999,8.018457031249994],[79.80888671874999,8.05],[79.83193359375002,8.304052734374991],[79.85087890624999,8.411572265624997],[79.94179687500002,8.691503906249991],[79.94365234374999,8.741162109374997],[79.92792968750001,8.846435546875],[79.92890625000001,8.899218749999989],[80.06484375000002,9.095654296874997],[80.099609375,9.2099609375],[80.11835937500001,9.326855468749997],[80.11093750000003,9.453271484374994],[80.08632812500002,9.577832031249997],[80.19609374999999,9.538134765624989],[80.25644531250003,9.494775390624994],[80.31796875000003,9.465429687499991],[80.36796874999999,9.48046875],[80.42832031250003,9.48095703125],[80.38535156250003,9.548779296874997],[80.25761718749999,9.611279296874997],[80.04580078125002,9.64990234375],[79.9794921875,9.699365234374994],[79.95400390625002,9.742333984374994],[79.96699218750001,9.792626953124994],[79.98232421875002,9.812695312499997]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[49.53828125000001,-12.43212890625],[49.58417968750001,-12.53671875],[49.637792968750006,-12.637109375],[49.80498046875002,-12.8796875],[49.87646484375,-12.973046875],[49.9375,-13.072265625],[49.96718750000002,-13.270214843750011],[50.07343750000001,-13.577929687500003],[50.173828125,-14.040234375000011],[50.20458984375,-14.514453125],[50.2353515625,-14.73203125],[50.3134765625,-14.936816406250003],[50.44130859375002,-15.149316406250009],[50.48271484375002,-15.385644531250009],[50.40458984375002,-15.629101562500011],[50.29150390625,-15.858496093750006],[50.262304687500006,-15.901562500000011],[50.208984375,-15.96044921875],[50.18496093750002,-15.9578125],[50.09443359375001,-15.898632812500011],[50.02041015625002,-15.8017578125],[49.92656250000002,-15.573535156250003],[49.892578125,-15.457714843750011],[49.85332031250002,-15.439453125],[49.74375,-15.449511718750003],[49.66435546875002,-15.521582031250006],[49.64990234375,-15.566992187500006],[49.6669921875,-15.695703125],[49.69707031250002,-15.811425781250009],[49.71044921875,-15.928906250000011],[49.71279296875002,-16.076757812500006],[49.742285156250006,-16.121484375],[49.78593750000002,-16.15908203125001],[49.8310546875,-16.255859375],[49.83906250000001,-16.48652343750001],[49.81132812500002,-16.60302734375],[49.733984375,-16.70302734375001],[49.73857421875002,-16.758398437500006],[49.7671875,-16.81513671875001],[49.73974609375,-16.849414062500003],[49.63691406250001,-16.892871093750003],[49.59521484375,-16.93115234375],[49.53955078125,-17.03291015625001],[49.449316406250006,-17.240625],[49.437109375,-17.3466796875],[49.49365234375,-17.66953125],[49.47783203125002,-17.898535156250006],[49.362890625,-18.336328125],[49.296875,-18.544042968750006],[49.20332031250001,-18.792285156250003],[49.06005859375,-19.11962890625],[48.918066406250006,-19.53046875000001],[48.797460937500006,-19.953222656250006],[48.70830078125002,-20.207324218750003],[48.60703125,-20.45751953125],[48.46855468750002,-20.9],[48.35078125000001,-21.34902343750001],[48.175878906250006,-21.843066406250003],[47.93447265625002,-22.39394531250001],[47.90839843750001,-22.4658203125],[47.85830078125002,-22.74726562500001],[47.80410156250002,-22.991503906250003],[47.73945312500001,-23.2333984375],[47.604101562500006,-23.633105468750003],[47.58867187500002,-23.75634765625],[47.55800781250002,-23.874609375],[47.42763671875002,-24.12519531250001],[47.37255859375,-24.21845703125001],[47.33359375,-24.31757812500001],[47.31171875000001,-24.443164062500003],[47.27285156250002,-24.56435546875001],[47.17734375,-24.787207031250006],[47.03496093750002,-24.97900390625],[46.93818359375001,-25.04873046875001],[46.728515625,-25.14990234375],[46.62226562500001,-25.17041015625],[46.38671875,-25.17275390625001],[46.15869140625,-25.23037109375001],[45.9208984375,-25.34130859375],[45.69218750000002,-25.46845703125001],[45.604589843750006,-25.52871093750001],[45.50800781250001,-25.56318359375001],[45.20576171875001,-25.57050781250001],[45.115234375,-25.543066406250006],[44.81289062500002,-25.33417968750001],[44.69580078125,-25.29970703125001],[44.47382812500001,-25.27109375],[44.40673828125,-25.25332031250001],[44.34589843750001,-25.22607421875],[44.25615234375002,-25.11689453125001],[44.078125,-25.02460937500001],[44.03535156250001,-24.995703125],[44.00830078125,-24.93203125],[43.98984375,-24.86347656250001],[43.94375,-24.78671875],[43.90957031250002,-24.640625],[43.8515625,-24.538378906250003],[43.6875,-24.35791015625],[43.670019531250006,-24.30029296875],[43.656835937500006,-24.10878906250001],[43.662109375,-23.97919921875001],[43.64609375,-23.74189453125001],[43.66474609375001,-23.63027343750001],[43.722265625,-23.5296875],[43.69873046875,-23.4208984375],[43.63759765625002,-23.30654296875001],[43.61464843750002,-23.18818359375001],[43.56953125000001,-23.08046875],[43.39785156250002,-22.886328125],[43.357519531250006,-22.790820312500003],[43.32958984375,-22.69189453125],[43.26484375000001,-22.38359375],[43.25712890625002,-22.2763671875],[43.2666015625,-22.04931640625],[43.29052734375,-21.93251953125001],[43.33222656250001,-21.851171875],[43.34267578125002,-21.79042968750001],[43.369726562500006,-21.73828125],[43.41054687500002,-21.69648437500001],[43.43779296875002,-21.64667968750001],[43.50185546875002,-21.3564453125],[43.583105468750006,-21.2919921875],[43.70361328125,-21.254980468750006],[43.80019531250002,-21.17919921875],[43.85566406250001,-21.07685546875001],[43.9111328125,-20.865820312500006],[44.063085937500006,-20.65625],[44.1171875,-20.54609375000001],[44.23964843750002,-20.3796875],[44.34814453125,-20.1455078125],[44.38105468750001,-20.03515625],[44.40468750000002,-19.92207031250001],[44.432226562500006,-19.67421875],[44.45292968750002,-19.550878906250006],[44.448828125,-19.4287109375],[44.38652343750002,-19.303125],[44.23876953125,-19.0751953125],[44.233984375,-19.03261718750001],[44.245703125,-18.86318359375001],[44.23310546875001,-18.740625],[44.1787109375,-18.61855468750001],[44.10878906250002,-18.503515625],[44.0400390625,-18.28847656250001],[44.00664062500002,-17.93300781250001],[44.013671875,-17.804492187500003],[43.99355468750002,-17.69033203125001],[43.94355468750001,-17.58144531250001],[43.97939453125002,-17.3916015625],[44.42138671875,-16.70263671875],[44.43574218750001,-16.621484375],[44.41796875,-16.41132812500001],[44.42705078125002,-16.2890625],[44.442480468750006,-16.24375],[44.476171875,-16.21728515625],[44.551855468750006,-16.20449218750001],[44.9091796875,-16.17451171875001],[44.955078125,-16.1533203125],[45.04423828125002,-16.09511718750001],[45.16679687500002,-15.9828125],[45.22285156250001,-15.950488281250003],[45.27128906250002,-15.962304687500009],[45.30234375,-16.01044921875001],[45.34218750000002,-16.03671875],[45.486328125,-15.98583984375],[45.54179687500002,-15.984277343750009],[45.598242187500006,-15.992578125],[45.62470703125001,-15.94580078125],[45.64052734375002,-15.883105468750003],[45.66152343750002,-15.8388671875],[45.7001953125,-15.813769531250003],[45.88593750000001,-15.800097656250003],[46.00429687500002,-15.782128906250009],[46.15751953125002,-15.73828125],[46.190527343750006,-15.746875],[46.3140625,-15.904589843750003],[46.3515625,-15.918164062500011],[46.39960937500001,-15.924609375],[46.44160156250001,-15.895898437500009],[46.34130859375,-15.813378906250009],[46.326171875,-15.766699218750006],[46.33144531250002,-15.713671875],[46.38515625000002,-15.60009765625],[46.47509765625,-15.513476562500003],[46.67470703125002,-15.3818359375],[46.88203125000001,-15.229589843750006],[46.94228515625002,-15.219042968750003],[46.993261718750006,-15.2431640625],[47.032324218750006,-15.42265625],[47.027441406250006,-15.452246093750006],[47.060546875,-15.456347656250003],[47.09921875,-15.434179687500006],[47.133398437500006,-15.36171875],[47.13515625000002,-15.3015625],[47.10732421875002,-15.243847656250011],[47.09375,-15.195019531250011],[47.09257812500002,-15.150097656250011],[47.19765625000002,-15.044042968750006],[47.28046875000001,-14.942675781250003],[47.31875,-14.82177734375],[47.35195312500002,-14.76611328125],[47.4390625,-14.703320312500011],[47.46474609375002,-14.71328125],[47.48505859375001,-14.764355468750011],[47.49638671875002,-14.818359375],[47.47402343750002,-14.871972656250009],[47.44208984375001,-14.925],[47.42919921875,-14.995703125],[47.47832031250002,-15.009375],[47.52470703125002,-14.9921875],[47.59257812500002,-14.8642578125],[47.670019531250006,-14.743261718750006],[47.71601562500001,-14.680371093750011],[47.774023437500006,-14.63671875],[47.87041015625002,-14.6455078125],[47.96416015625002,-14.672558593750011],[47.8115234375,-14.544824218750009],[47.77333984375002,-14.369921875],[47.955175781250006,-14.067285156250009],[47.95693359375002,-14.004296875],[47.98320312500002,-13.98486328125],[47.99550781250002,-13.96044921875],[47.9013671875,-13.858203125],[47.88359375000002,-13.807519531250009],[47.89599609375,-13.730664062500011],[47.941015625,-13.662402343750003],[47.98183593750002,-13.614648437500009],[48.03984375000002,-13.596289062500006],[48.0859375,-13.62255859375],[48.187109375,-13.70654296875],[48.25527343750002,-13.719335937500006],[48.33769531250002,-13.638671875],[48.40507812500002,-13.537988281250009],[48.506445312500006,-13.46875],[48.62138671875002,-13.425976562500011],[48.796484375,-13.267480468750009],[48.91035156250001,-12.935839843750003],[48.91943359375,-12.839062500000011],[48.89423828125001,-12.7216796875],[48.85380859375002,-12.61015625],[48.78632812500001,-12.470898437500011],[48.80390625000001,-12.440039062500006],[48.89960937500001,-12.45849609375],[48.931738281250006,-12.4390625],[49.035742187500006,-12.315820312500009],[49.20703125,-12.07958984375],[49.26347656250002,-12.080175781250006],[49.312109375,-12.123925781250009],[49.330175781250006,-12.188671875000011],[49.36396484375001,-12.236328125],[49.47978515625002,-12.3484375],[49.53828125000001,-12.43212890625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[53.10957031250001,38.803076171875],[53.100195312500006,38.756152343749996],[53.0458984375,38.897216796875],[53.0185546875,39.052734375],[53.053320312500006,39.096582031249994],[53.09218750000002,39.094091796875],[53.05517578125,39.037939453125],[53.10957031250001,38.803076171875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[50.18447265625002,44.854638671874994],[50.14873046875002,44.826464843749996],[50.0953125,44.830615234374996],[49.9951171875,44.936962890625],[50.023046875,45.044726562499996],[50.059375,45.066796875],[50.10986328125,45.081933593749994],[50.11660156250002,45.058251953124994],[50.04531250000002,45.010009765625],[50.03886718750002,44.949121093749994],[50.09814453125,44.88154296875],[50.18447265625002,44.854638671874994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[50.31171875000001,44.972070312499994],[50.27724609375002,44.95859375],[50.25615234375002,45.022412109375],[50.294921875,45.075927734375],[50.349707031250006,45.0830078125],[50.33085937500002,44.9984375],[50.31171875000001,44.972070312499994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-159.0529296875,-79.80742187500002],[-160.302099609375,-79.84453125000002],[-160.806689453125,-79.81201171875],[-161.86552734375,-79.70351562500002],[-163.317236328125,-79.50478515625002],[-163.71240234375,-79.4419921875],[-163.9708984375,-79.38876953125],[-164.22578125,-79.32080078125],[-164.281640625,-79.24550781250002],[-164.244873046875,-79.1376953125],[-164.19951171875,-79.05078125],[-164.125537109375,-78.99531250000001],[-163.8146484375,-78.92880859375],[-163.66025390625,-78.85576171875002],[-163.3453125,-78.7798828125],[-163.256103515625,-78.72207031250002],[-163.12412109375,-78.71914062500002],[-162.87275390625,-78.7251953125],[-162.62158203125,-78.741796875],[-162.3900390625,-78.76015625000002],[-162.160693359375,-78.79345703125],[-161.64296875,-78.9009765625],[-161.283447265625,-79.00703125000001],[-160.764404296875,-79.13164062500002],[-160.249609375,-79.271484375],[-159.963525390625,-79.32431640625],[-159.68408203125,-79.40244140625],[-159.418798828125,-79.50810546875002],[-159.36640625,-79.54521484375002],[-159.256103515625,-79.59101562500001],[-159.189697265625,-79.6373046875],[-159.11875,-79.67451171875001],[-159.0513671875,-79.69453125000001],[-158.99658203125,-79.73515625000002],[-159.0095703125,-79.78046875000001],[-159.0529296875,-79.80742187500002]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-70.33408203124999,-79.67988281250001],[-70.55253906249999,-79.68300781250002],[-70.98374023437499,-79.6744140625],[-71.414013671875,-79.640234375],[-71.52578125,-79.6236328125],[-71.686669921875,-79.56806640625001],[-71.73520507812499,-79.53857421875],[-71.777734375,-79.5005859375],[-71.78354492187499,-79.4443359375],[-71.66748046875,-79.245703125],[-71.45400390625,-79.12890625],[-71.25449218749999,-79.05966796875],[-70.62587890625,-78.90156250000001],[-70.54399414062499,-78.88369140625002],[-69.971875,-78.809375],[-69.74765625,-78.769140625],[-69.39824218749999,-78.6861328125],[-67.478515625,-78.3625],[-67.03813476562499,-78.31572265625002],[-66.840234375,-78.34970703125],[-66.72807617187499,-78.38369140625002],[-66.78701171875,-78.42167968750002],[-67.046142578125,-78.51416015625],[-67.16640625,-78.56953125000001],[-67.48095703125,-78.68242187500002],[-68.15703124999999,-78.87089843750002],[-68.637939453125,-79.01318359375],[-69.25087890625,-79.21035156250002],[-69.39443359375,-79.27978515625],[-69.686474609375,-79.443359375],[-69.63447265625,-79.517578125],[-69.73173828124999,-79.61835937500001],[-70.11630859374999,-79.666015625],[-70.33408203124999,-79.67988281250001]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-45.22265625,-78.81074218750001],[-45.09160156249999,-78.81425781250002],[-44.566308593749994,-78.804296875],[-44.041162109374994,-78.806640625],[-43.722070312499994,-78.81845703125],[-43.62734375,-78.84609375000002],[-43.544335937499994,-78.901953125],[-43.45063476562498,-78.98964843750002],[-43.363671875,-79.08476562500002],[-43.267236328124994,-79.1630859375],[-43.210546875,-79.3],[-43.11870117187499,-79.35],[-42.96538085937499,-79.47705078125],[-42.944677734375006,-79.5791015625],[-42.989990234375,-79.80126953125],[-43.06591796875,-79.89140625000002],[-43.26728515624998,-79.97861328125],[-43.49580078124998,-79.9693359375],[-43.60029296874998,-79.97392578125002],[-43.70366210937499,-79.99013671875002],[-43.7421875,-80.0029296875],[-43.758203125,-80.0205078125],[-43.489990234375,-80.09550781250002],[-43.458837890625006,-80.123046875],[-43.453759765624994,-80.15507812500002],[-43.489355468750006,-80.17802734375002],[-43.527929687500006,-80.19140625],[-49.1875,-80.64277343750001],[-49.41044921874999,-80.66689453125002],[-49.62968749999999,-80.71230468750002],[-49.701318359374994,-80.75322265625002],[-49.773046875,-80.7841796875],[-54.1625,-80.8701171875],[-54.202099609375,-80.8638671875],[-54.24130859374999,-80.84697265625002],[-54.35078125,-80.7603515625],[-54.37158203125,-80.6236328125],[-54.34716796875,-80.56943359375],[-54.12958984375,-80.51650390625002],[-54.044921875,-80.4875],[-53.67607421874999,-80.28369140625],[-53.482324218749994,-80.18896484375],[-53.39389648437499,-80.10878906250002],[-53.34648437499999,-80.11445312500001],[-53.176416015624994,-80.16093750000002],[-53.053466796875,-80.175],[-52.80722656249999,-80.15595703125001],[-52.566796875,-80.09902343750002],[-52.46098632812499,-80.06660156250001],[-52.35712890625,-80.07783203125001],[-52.3380859375,-80.12607421875],[-52.29716796874999,-80.1412109375],[-51.711328125,-79.98984375],[-51.183837890625,-79.81972656250002],[-50.66435546874999,-79.62675781250002],[-50.40156249999998,-79.51171875],[-50.339257812499994,-79.4794921875],[-50.294921875,-79.4296875],[-50.33134765624999,-79.3814453125],[-50.378662109375,-79.33818359375002],[-50.41953125,-79.3212890625],[-50.4638671875,-79.31328125000002],[-50.733056640624994,-79.28271484375],[-50.649023437500006,-79.23281250000002],[-50.57329101562499,-79.17226562500002],[-50.52031249999999,-79.10439453125002],[-50.50239257812498,-79.02177734375002],[-50.51372070312499,-78.97988281250002],[-50.50249023437499,-78.94990234375001],[-50.379785156249994,-78.9228515625],[-50.297753906249994,-78.88222656250002],[-50.241943359375,-78.83330078125002],[-50.33544921875,-78.81826171875002],[-50.37739257812498,-78.78046875000001],[-50.294189453125,-78.69599609375001],[-50.219628906249994,-78.60527343750002],[-50.14165039062499,-78.55673828125],[-49.93974609374999,-78.46220703125002],[-49.354150390624994,-78.22246093750002],[-49.143652343750006,-78.09384765625],[-49.08125,-78.0474609375],[-47.69208984374998,-77.84013671875002],[-47.463476562500006,-77.81904296875001],[-47.029931640624994,-77.79052734375],[-46.82568359375,-77.78525390625],[-46.25786132812499,-77.80488281250001],[-45.9931640625,-77.82685546875001],[-45.5302734375,-77.8814453125],[-44.851953125,-77.98837890625],[-44.594482421875,-78.03515625],[-44.33984375,-78.09287109375],[-44.093994140625,-78.16728515625002],[-43.8544921875,-78.25849609375001],[-43.80859375,-78.28652343750002],[-43.784570312499994,-78.33632812500002],[-43.776708984375006,-78.38505859375002],[-43.78828124999998,-78.4326171875],[-43.852294921875,-78.5298828125],[-43.94721679687498,-78.59755859375002],[-45.06782226562498,-78.66142578125002],[-45.21308593749998,-78.68701171875],[-45.294775390625006,-78.73984375],[-45.35234374999999,-78.79121093750001],[-45.22265625,-78.81074218750001]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-59.73393554687499,-80.34414062500002],[-59.77373046874999,-80.55810546875],[-59.77133789062499,-80.65654296875002],[-59.82548828124999,-80.73330078125002],[-59.92636718749999,-80.77431640625002],[-60.124658203124994,-80.84072265625002],[-60.268212890624994,-80.88134765625],[-60.58281249999999,-80.94814453125002],[-62.023339843749994,-80.88906250000002],[-62.67050781249999,-80.83427734375002],[-62.940380859375,-80.76582031250001],[-62.986083984375,-80.73457031250001],[-63.067529296874994,-80.62744140625],[-63.143994140625,-80.59482421875],[-63.71494140624999,-80.61699218750002],[-64.06503906249999,-80.650390625],[-64.12646484375,-80.66787109375002],[-64.219921875,-80.733984375],[-64.26826171875,-80.74853515625],[-65.20283203125,-80.607421875],[-66.183740234375,-80.4419921875],[-66.59140625,-80.35761718750001],[-66.73359375,-80.31855468750001],[-66.771142578125,-80.29384765625002],[-66.681103515625,-80.26044921875001],[-66.58842773437499,-80.23857421875002],[-66.482666015625,-80.22441406250002],[-66.376953125,-80.222265625],[-66.29580078125,-80.23476562500002],[-66.21738281249999,-80.25820312500002],[-66.167626953125,-80.34619140625],[-66.115478515625,-80.36123046875002],[-65.980078125,-80.38447265625001],[-62.518798828125,-80.37333984375002],[-62.231835937499994,-80.36865234375],[-61.63330078125,-80.34414062500002],[-61.31284179687499,-80.30654296875002],[-61.193994140624994,-80.25664062500002],[-61.484765625,-80.24384765625001],[-61.59746093749999,-80.20585937500002],[-61.6943359375,-80.134375],[-61.71684570312499,-80.0693359375],[-61.68417968749999,-80.01972656250001],[-61.30234375,-79.99580078125001],[-61.246240234374994,-79.97832031250002],[-61.34624023437499,-79.95058593750002],[-61.34311523437499,-79.88681640625],[-61.114990234375,-79.86220703125002],[-61.026318359375,-79.80888671875002],[-60.57880859375,-79.74101562500002],[-59.87333984374999,-79.776953125],[-59.70634765624999,-79.87529296875002],[-59.75244140625,-79.93798828125],[-59.78564453125,-80.00107421875],[-59.78779296875,-80.10097656250002],[-59.49814453124999,-80.11503906250002],[-59.4078125,-80.15087890625],[-59.321679687499994,-80.19619140625002],[-59.42661132812499,-80.19765625000002],[-59.53007812499999,-80.2080078125],[-59.61240234374999,-80.25546875],[-59.68330078125,-80.31533203125002],[-59.73393554687499,-80.34414062500002]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-70.05112304687499,-69.1890625],[-70.079345703125,-69.31093750000002],[-69.91328125,-69.26728515625001],[-69.85498046875,-69.27656250000001],[-69.70756835937499,-69.3208984375],[-69.416943359375,-69.58320312500001],[-69.352978515625,-69.66630859375002],[-69.2337890625,-69.90908203125002],[-69.091259765625,-70.09033203125],[-68.73056640624999,-70.40810546875002],[-68.55351562499999,-70.58144531250002],[-68.45947265625,-70.68291015625002],[-68.45078125,-70.81787109375],[-68.33598632812499,-70.8560546875],[-68.31401367187499,-70.91171875],[-68.27792968749999,-71.09707031250002],[-68.25244140625,-71.3134765625],[-68.22783203124999,-71.7251953125],[-68.24101562499999,-71.82216796875002],[-68.39389648437499,-71.9751953125],[-68.46074218749999,-72.08535156250002],[-68.542578125,-72.15761718750002],[-68.6400390625,-72.20976562500002],[-69.14926757812499,-72.42656250000002],[-69.20932617187499,-72.5341796875],[-70.06308593749999,-72.62617187500001],[-70.54345703125,-72.66445312500002],[-70.73134765625,-72.62294921875002],[-70.92294921874999,-72.61308593750002],[-71.15859375,-72.626953125],[-71.846142578125,-72.63935546875001],[-72.36748046874999,-72.66972656250002],[-72.43330078125,-72.65830078125],[-72.4798828125,-72.61728515625],[-72.53081054687499,-72.58955078125001],[-72.67021484374999,-72.59589843750001],[-72.78037109374999,-72.58056640625],[-72.887646484375,-72.54667968750002],[-73.00703125,-72.48408203125001],[-73.05742187499999,-72.44755859375002],[-73.086376953125,-72.4078125],[-72.85483398437499,-72.30419921875],[-72.7375,-72.28056640625002],[-72.61821289062499,-72.27509765625001],[-72.37607421874999,-72.29628906250002],[-72.1349609375,-72.33134765625002],[-71.60532226562499,-72.358984375],[-70.87260742187499,-72.36640625000001],[-70.671142578125,-72.35634765625002],[-70.427685546875,-72.32255859375002],[-70.206005859375,-72.22773437500001],[-70.314208984375,-72.191015625],[-70.42416992187499,-72.16777343750002],[-70.533203125,-72.16337890625002],[-70.64140624999999,-72.16962890625001],[-70.94516601562499,-72.2291015625],[-71.177734375,-72.26406250000002],[-71.412548828125,-72.28447265625002],[-71.66147460937499,-72.24980468750002],[-71.8921875,-72.15283203125],[-71.89755859374999,-72.12080078125001],[-71.106640625,-72.04707031250001],[-71.034375,-72.03457031250002],[-70.89111328125,-71.98740234375],[-70.84462890625,-71.94580078125],[-70.82099609375,-71.90654296875002],[-71.35498046875,-71.83642578125],[-71.46464843749999,-71.837890625],[-71.5744140625,-71.8505859375],[-71.816162109375,-71.821875],[-72.04594726562499,-71.73964843750002],[-72.25908203124999,-71.6412109375],[-72.33662109375,-71.63222656250002],[-72.41220703124999,-71.66230468750001],[-72.92763671875,-71.92167968750002],[-72.9720703125,-71.92363281250002],[-73.16669921875,-71.90458984375002],[-73.40996093749999,-71.853125],[-73.63291015624999,-71.8349609375],[-73.77597656249999,-71.84892578125002],[-73.82988281249999,-71.87021484375],[-73.690576171875,-71.92939453125001],[-73.57231445312499,-71.98095703125],[-73.537109375,-72.02236328125002],[-73.89926757812499,-72.15234375],[-73.99560546875,-72.16982421875002],[-74.152978515625,-72.1587890625],[-74.208935546875,-72.14228515625001],[-74.32177734375,-72.07265625000002],[-74.429296875,-72.05556640625002],[-74.663232421875,-72.069921875],[-74.78583984375,-72.06357421875],[-74.90825195312499,-72.03330078125],[-75.02412109375,-71.98847656250001],[-75.12973632812499,-71.96396484375],[-75.25888671874999,-71.91396484375002],[-75.35307617187499,-71.87841796875],[-75.38271484375,-71.82792968750002],[-75.3732421875,-71.7802734375],[-75.330810546875,-71.75234375000002],[-75.32490234375,-71.7255859375],[-75.353125,-71.6796875],[-75.33544921875,-71.64521484375001],[-75.292578125,-71.61494140625001],[-75.09965820312499,-71.55537109375001],[-74.86313476562499,-71.54335937500002],[-74.636376953125,-71.61748046875002],[-74.487451171875,-71.64150390625002],[-74.41865234375,-71.64326171875001],[-74.391796875,-71.63818359375],[-74.37333984374999,-71.61796875000002],[-74.380078125,-71.57939453125002],[-74.4203125,-71.50722656250002],[-74.425390625,-71.45693359375002],[-74.375,-71.41494140625002],[-74.30791015624999,-71.39990234375],[-74.236083984375,-71.38837890625001],[-74.18720703125,-71.38300781250001],[-74.040966796875,-71.41044921875002],[-73.937109375,-71.43818359375001],[-73.724267578125,-71.51699218750002],[-73.545361328125,-71.57304687500002],[-73.47900390625,-71.5787109375],[-73.4271484375,-71.55888671875002],[-73.38017578124999,-71.5279296875],[-73.5921875,-71.44804687500002],[-73.61708984375,-71.39658203125],[-73.6044921875,-71.35078125000001],[-73.47397460937499,-71.32490234375001],[-73.397412109375,-71.32119140625002],[-73.0197265625,-71.36865234375],[-72.821044921875,-71.38359375000002],[-72.62158203125,-71.38837890625001],[-72.211669921875,-71.33505859375],[-72.430078125,-71.275],[-72.90546875,-71.22314453125],[-72.99453125,-71.1865234375],[-73.06040039062499,-71.126953125],[-72.71044921875,-71.07294921875001],[-72.35634765625,-71.0748046875],[-71.718505859375,-71.1451171875],[-71.50449218749999,-71.11152343750001],[-71.30751953125,-71.01083984375],[-71.19404296875,-70.98476562500002],[-70.74111328125,-70.99257812500002],[-70.38066406249999,-70.94638671875],[-70.322900390625,-70.951171875],[-70.26767578124999,-70.96474609375002],[-69.916455078125,-71.1337890625],[-69.869775390625,-71.12568359375001],[-69.835107421875,-71.09257812500002],[-69.82285156249999,-71.03369140625],[-69.822509765625,-70.97343750000002],[-69.83041992187499,-70.913671875],[-69.87578124999999,-70.8759765625],[-69.933203125,-70.88037109375],[-69.99301757812499,-70.8970703125],[-70.093994140625,-70.88261718750002],[-70.196240234375,-70.8505859375],[-70.29868164062499,-70.83613281250001],[-70.66064453125,-70.81787109375],[-70.916943359375,-70.78583984375001],[-71.04941406249999,-70.76210937500002],[-71.17265624999999,-70.71298828125],[-71.19003906249999,-70.65957031250002],[-71.06108398437499,-70.537109375],[-70.562109375,-70.40410156250002],[-70.328076171875,-70.36123046875002],[-70.09042968749999,-70.35068359375],[-69.97529296875,-70.36015625000002],[-69.70205078125,-70.41474609375001],[-69.65986328125,-70.41230468750001],[-69.618359375,-70.398046875],[-69.8830078125,-70.30517578125],[-70.11787109375,-70.23417968750002],[-70.23408203125,-70.18046875000002],[-70.32763671875,-70.15966796875],[-70.71953124999999,-70.13945312500002],[-70.926220703125,-70.1923828125],[-71.02373046874999,-70.20136718750001],[-71.1205078125,-70.19648437500001],[-71.69609374999999,-70.06777343750002],[-71.728515625,-70.0537109375],[-71.8099609375,-70.00517578125002],[-71.85361328124999,-69.9693359375],[-71.87924804687499,-69.90898437500002],[-71.86767578125,-69.84716796875],[-71.852001953125,-69.80703125000002],[-71.76650390625,-69.6494140625],[-71.718212890625,-69.5240234375],[-71.742919921875,-69.42275390625002],[-71.83359375,-69.366796875],[-71.96323242187499,-69.3287109375],[-72.08066406249999,-69.2671875],[-72.11435546874999,-69.22539062500002],[-72.13515625,-69.17656250000002],[-72.137890625,-69.11455078125002],[-72.108642578125,-69.06005859375],[-72.057861328125,-69.0009765625],[-71.99013671875,-68.97080078125],[-71.86899414062499,-68.941015625],[-71.391552734375,-68.87353515625],[-70.4169921875,-68.78896484375002],[-70.3119140625,-68.83222656250001],[-70.154296875,-68.92294921875],[-70.10546875,-68.959375],[-70.052734375,-69.13955078125002],[-70.05112304687499,-69.1890625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-69.16704101562499,-52.667578125],[-69.07993164062499,-52.67431640625],[-68.789794921875,-52.576757812500006],[-68.75751953125,-52.58203125],[-68.65922851562499,-52.63154296875001],[-68.62993164062499,-52.65263671875002],[-68.57119140625,-52.694921875],[-68.33876953125,-52.90009765625001],[-68.27822265625,-52.983984375],[-68.24013671875,-53.08183593750002],[-68.3330078125,-53.019628906250006],[-68.43115234375,-53.055273437500006],[-68.4794921875,-53.11376953125],[-68.52080078124999,-53.17724609375],[-68.5205078125,-53.221875],[-68.488525390625,-53.26093750000001],[-68.39311523437499,-53.294921875],[-68.1611328125,-53.30644531250002],[-68.14409179687499,-53.31904296875001],[-68.00849609375,-53.5640625],[-67.94028320312499,-53.61875],[-67.861083984375,-53.662207031250006],[-67.678125,-53.787109375],[-67.502587890625,-53.921972656250006],[-67.29423828124999,-54.0498046875],[-67.069482421875,-54.148046875],[-66.86513671875,-54.222558593749994],[-66.670068359375,-54.313574218750006],[-66.46201171874999,-54.441015625],[-66.23564453124999,-54.53349609375002],[-65.992578125,-54.59892578125002],[-65.7470703125,-54.653417968750006],[-65.369287109375,-54.63212890625002],[-65.251953125,-54.638085937499994],[-65.17900390624999,-54.678125],[-65.25234375,-54.78886718750002],[-65.34599609374999,-54.8779296875],[-65.471142578125,-54.914648437500006],[-65.60332031249999,-54.928125],[-65.72275390624999,-54.926367187500006],[-65.8419921875,-54.90996093750002],[-65.953759765625,-54.919335937499994],[-66.06064453124999,-54.95673828125001],[-66.172021484375,-54.97529296875001],[-66.286767578125,-54.97773437500001],[-66.398681640625,-55.009375],[-66.5111328125,-55.032128906249994],[-66.627685546875,-55.01328125],[-66.93046874999999,-54.924902343750006],[-67.127099609375,-54.90380859375],[-67.79326171874999,-54.86865234375],[-68.00712890624999,-54.84843750000002],[-68.2201171875,-54.81757812500001],[-68.331689453125,-54.816308593749994],[-68.49101562499999,-54.83623046875002],[-68.61865234375,-54.83378906250002],[-68.65322265625,-54.853613281250006],[-68.803857421875,-54.853613281250006],[-68.84355468749999,-54.87675781250002],[-69.081640625,-54.90986328125001],[-69.486279296875,-54.85888671875],[-69.587548828125,-54.81279296875002],[-69.72343749999999,-54.71210937500001],[-69.77182617187499,-54.739160156249994],[-69.89946289062499,-54.781835937500006],[-70.030517578125,-54.815527343750006],[-70.1380859375,-54.819238281249994],[-70.23779296875,-54.77753906250001],[-70.25908203124999,-54.75634765625],[-70.28173828125,-54.75175781250002],[-70.49716796874999,-54.8095703125],[-70.73515624999999,-54.750585937500006],[-70.92470703125,-54.71435546875],[-71.229248046875,-54.69414062500002],[-71.44091796875,-54.61962890625],[-71.83154296875,-54.62617187500001],[-71.9015625,-54.6015625],[-71.927734375,-54.528710937499994],[-71.906982421875,-54.49482421875001],[-71.8234375,-54.47441406250002],[-71.80014648437499,-54.433984375],[-71.7158203125,-54.44365234375002],[-71.60629882812499,-54.497167968750006],[-71.57275390625,-54.49531250000001],[-71.500390625,-54.444921875],[-71.39340820312499,-54.40019531250002],[-71.355224609375,-54.395410156249994],[-71.158837890625,-54.450585937499994],[-71.07993164062499,-54.444238281249994],[-70.966455078125,-54.41953125],[-70.94619140625,-54.398046875],[-70.928173828125,-54.36005859375001],[-70.89824218749999,-54.337890625],[-70.797265625,-54.327246093750006],[-70.698828125,-54.34882812500001],[-70.68754882812499,-54.41474609375001],[-70.701123046875,-54.485449218750006],[-70.572998046875,-54.50439453125],[-70.417919921875,-54.50224609375002],[-70.310986328125,-54.52851562500001],[-70.29765624999999,-54.48554687500001],[-70.46831054687499,-54.37324218750001],[-70.539990234375,-54.30341796875001],[-70.6361328125,-54.262304687500006],[-70.75986328124999,-54.241308593750006],[-70.86308593749999,-54.110449218750006],[-70.85673828124999,-53.99580078125001],[-70.86772460937499,-53.884179687499994],[-70.644482421875,-53.822851562500006],[-70.69560546874999,-53.727441406249994],[-70.61875,-53.65507812500002],[-70.53129882812499,-53.62734375],[-70.44316406249999,-53.893457031249994],[-70.37973632812499,-53.98671875],[-70.460546875,-54.00566406250002],[-70.629833984375,-54.00556640625001],[-70.535302734375,-54.136132812499994],[-70.37998046874999,-54.1806640625],[-70.24609375,-54.277441406250006],[-70.243359375,-54.34765625],[-70.16899414062499,-54.379296875],[-69.99013671875,-54.38134765625],[-69.86699218749999,-54.36748046875002],[-69.80908203125,-54.32080078125],[-69.741845703125,-54.30585937500001],[-69.62167968749999,-54.36406250000002],[-69.41928710937499,-54.407128906249994],[-69.36479492187499,-54.437597656250006],[-69.32509765625,-54.488183593749994],[-69.3224609375,-54.54267578125001],[-69.31206054687499,-54.57148437500001],[-69.253173828125,-54.55742187500002],[-69.169189453125,-54.483300781249994],[-69.127880859375,-54.457617187500006],[-69.07724609374999,-54.44501953125001],[-69.04521484374999,-54.42841796875001],[-69.0443359375,-54.40673828125],[-69.19565429687499,-54.354394531249994],[-69.98813476562499,-54.10908203125001],[-70.085595703125,-54.011132812499994],[-70.151123046875,-53.888085937499994],[-70.148828125,-53.761132812499994],[-70.09111328124999,-53.721777343750006],[-69.94970703125,-53.67158203125001],[-69.68974609374999,-53.60087890625002],[-69.38994140624999,-53.499414062499994],[-69.35244140625,-53.47998046875],[-69.35595703125,-53.41630859375002],[-69.3935546875,-53.3734375],[-69.51254882812499,-53.34199218750001],[-69.63701171874999,-53.334082031250006],[-69.755615234375,-53.33720703125002],[-69.87412109374999,-53.350488281249994],[-70.09038085937499,-53.41816406250001],[-70.212841796875,-53.413964843749994],[-70.329296875,-53.37763671875001],[-70.415673828125,-53.304785156250006],[-70.46025390624999,-53.20625],[-70.4599609375,-53.14335937500002],[-70.443359375,-53.085546875],[-70.39067382812499,-53.026464843750006],[-70.32001953125,-53.00068359375001],[-70.25634765625,-53.00410156250001],[-70.196484375,-52.990234375],[-70.160888671875,-52.96992187500001],[-70.130615234375,-52.942773437499994],[-70.13955078125,-52.919335937499994],[-70.162744140625,-52.899023437500006],[-70.2591796875,-52.85722656250002],[-70.29736328125,-52.816992187500006],[-70.380126953125,-52.751953125],[-70.334912109375,-52.733789062499994],[-70.1896484375,-52.7236328125],[-70.08823242187499,-52.7685546875],[-69.9935546875,-52.8212890625],[-69.93544921875,-52.82109375000002],[-69.883203125,-52.79902343750001],[-69.76357421875,-52.731347656249994],[-69.66328125,-52.64628906250002],[-69.571875,-52.54931640625],[-69.49838867187499,-52.49140625000001],[-69.4140625,-52.486230468749994],[-69.16704101562499,-52.667578125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-81.83745117187499,23.163037109374997],[-81.575439453125,23.116503906250003],[-81.36362304687499,23.1296875],[-81.262353515625,23.15683593749999],[-81.271630859375,23.128613281249997],[-81.17861328125,23.05966796874999],[-81.14462890624999,23.054931640625],[-81.00766601562499,23.08984375],[-80.650146484375,23.103076171875003],[-80.613427734375,23.083740234375],[-80.55048828125,23.0166015625],[-80.459228515625,22.975],[-80.364892578125,22.943408203125003],[-80.26616210937499,22.934960937499994],[-80.167626953125,22.949365234374994],[-80.07524414062499,22.942333984374997],[-79.959912109375,22.876904296874997],[-79.92353515625,22.869140625],[-79.820263671875,22.887011718750003],[-79.850732421875,22.827197265625003],[-79.67666015625,22.743066406249994],[-79.54921875,22.577783203124994],[-79.456494140625,22.50986328124999],[-79.35830078125,22.448925781249997],[-79.27568359374999,22.407617187499994],[-79.1830078125,22.387890625],[-78.90190429687499,22.39599609375],[-78.83544921875,22.390917968750003],[-78.77597656249999,22.367333984374994],[-78.71923828125,22.358056640624994],[-78.686474609375,22.366845703124994],[-78.14311523437499,22.109423828125003],[-77.97050781249999,21.971972656250003],[-77.86503906249999,21.900585937499997],[-77.63681640624999,21.79736328125],[-77.5451171875,21.774609375],[-77.49711914062499,21.788330078125],[-77.50654296875,21.81103515625],[-77.57333984374999,21.868310546874994],[-77.583154296875,21.88925781249999],[-77.497265625,21.871630859375003],[-77.34213867187499,21.755273437499994],[-77.29951171875,21.71225585937499],[-77.2220703125,21.672412109375003],[-77.144140625,21.643603515625003],[-77.18125,21.59765625],[-77.24453125,21.59375],[-77.366162109375,21.61264648437499],[-77.26958007812499,21.537890625],[-77.252880859375,21.48349609374999],[-77.20791015625,21.47885742187499],[-77.14096679687499,21.538623046875003],[-77.0986328125,21.589013671874994],[-76.92807617187499,21.458984375],[-76.836328125,21.39951171874999],[-76.859814453125,21.364794921875003],[-76.867431640625,21.33041992187499],[-76.76499023437499,21.36240234374999],[-76.72607421875,21.35888671875],[-76.68852539062499,21.34042968749999],[-76.647412109375,21.28452148437499],[-76.551708984375,21.272119140624994],[-76.45517578124999,21.273632812499997],[-76.259228515625,21.22739257812499],[-76.0736328125,21.133447265624994],[-75.89902343749999,21.1142578125],[-75.72294921874999,21.111035156249997],[-75.633740234375,21.061328125],[-75.59580078124999,20.994677734375003],[-75.63852539062499,20.947460937499997],[-75.66293945312499,20.898144531249997],[-75.597265625,20.837646484375],[-75.740234375,20.811962890624997],[-75.760400390625,20.775537109374994],[-75.75297851562499,20.73618164062499],[-75.724560546875,20.714550781249997],[-75.6427734375,20.73349609374999],[-75.524609375,20.71665039062499],[-75.338134765625,20.701611328124997],[-75.21328125,20.7138671875],[-74.959716796875,20.67265625],[-74.882568359375,20.650634765625],[-74.732080078125,20.573193359374997],[-74.66245117187499,20.522119140624994],[-74.513134765625,20.384570312500003],[-74.384375,20.33046875],[-74.27280273437499,20.3173828125],[-74.23388671875,20.326416015625],[-74.198486328125,20.311474609374997],[-74.16748046875,20.2921875],[-74.13681640624999,20.23193359375],[-74.1537109375,20.16855468749999],[-74.217431640625,20.117138671874997],[-74.25283203125,20.0796875],[-74.41215820312499,20.075341796874994],[-74.634765625,20.058154296875003],[-74.850048828125,20.00229492187499],[-74.95512695312499,19.957910156249994],[-75.003173828125,19.92856445312499],[-75.11640625,19.901416015625003],[-75.12412109374999,19.92465820312499],[-75.12197265625,19.95390625],[-75.151611328125,20.008349609375003],[-75.17729492187499,19.959375],[-75.21943359375,19.923632812500003],[-75.290478515625,19.893115234375003],[-75.551953125,19.89111328125],[-75.6572265625,19.93222656249999],[-75.76513671875,19.960400390624997],[-76.158447265625,19.98974609375],[-76.25283203125,19.98715820312499],[-76.515625,19.956689453124994],[-76.779736328125,19.940185546875],[-76.890234375,19.921337890624997],[-76.999462890625,19.892822265625],[-77.21196289062499,19.89375],[-77.46318359374999,19.861376953125003],[-77.715087890625,19.85546875],[-77.55375976562499,20.08212890624999],[-77.21337890625,20.300390625],[-77.1494140625,20.347265625],[-77.10380859374999,20.407519531250003],[-77.093017578125,20.452929687500003],[-77.10791015625,20.491650390624997],[-77.18896484375,20.559960937499994],[-77.20546875,20.61083984375],[-77.22958984374999,20.64375],[-77.34755859375,20.67236328125],[-77.467041015625,20.689501953125003],[-77.592724609375,20.690087890624994],[-77.856884765625,20.713623046875],[-77.997314453125,20.715380859375003],[-78.116357421875,20.761865234374994],[-78.3138671875,20.927490234375],[-78.40634765624999,20.973876953125],[-78.453857421875,21.010986328125],[-78.49077148437499,21.0537109375],[-78.537255859375,21.296826171874997],[-78.5765625,21.413818359375],[-78.636474609375,21.515527343749994],[-78.727685546875,21.592724609374997],[-78.82294921875,21.618945312500003],[-79.189208984375,21.55283203124999],[-79.2744140625,21.562646484374994],[-79.357421875,21.58515625],[-79.910302734375,21.742578125],[-80.138330078125,21.829248046874994],[-80.23134765625,21.87216796874999],[-80.310693359375,21.933398437500003],[-80.39291992187499,22.033740234375003],[-80.48544921874999,22.1234375],[-80.484814453125,22.087158203125],[-80.49907226562499,22.063525390625003],[-80.9619140625,22.052880859374994],[-81.03564453125,22.07358398437499],[-81.08310546874999,22.097949218750003],[-81.116650390625,22.134228515624997],[-81.14140624999999,22.206933593749994],[-81.185498046875,22.26796875],[-81.19956054687499,22.202929687500003],[-81.222412109375,22.14291992187499],[-81.284375,22.109423828125003],[-81.35527343749999,22.10410156249999],[-81.44111328125,22.183789062499997],[-81.81621093749999,22.2001953125],[-81.84941406249999,22.213671875],[-81.972607421875,22.29086914062499],[-82.077734375,22.3876953125],[-81.973046875,22.421826171874997],[-81.757080078125,22.466748046874997],[-81.7103515625,22.49667968749999],[-81.683251953125,22.534814453124994],[-81.702734375,22.59189453124999],[-81.74565429687499,22.63291015624999],[-81.78989257812499,22.65703125],[-81.838818359375,22.67246093749999],[-81.90341796874999,22.679003906250003],[-82.738037109375,22.689257812500003],[-82.786376953125,22.658349609374994],[-82.86123046875,22.595117187499994],[-83.009423828125,22.51401367187499],[-83.10712890625,22.429882812499997],[-83.14375,22.386474609375],[-83.189404296875,22.355419921874997],[-83.292138671875,22.30322265625],[-83.379638671875,22.22299804687499],[-83.4859375,22.187109375],[-83.54404296874999,22.208935546874997],[-83.601513671875,22.208740234375],[-83.64306640625,22.18896484375],[-83.68662109374999,22.179931640625],[-83.90073242187499,22.170117187499997],[-83.93271484374999,22.149658203125],[-83.963330078125,22.092089843750003],[-83.998046875,21.980126953124994],[-84.03095703125,21.943115234375],[-84.138330078125,21.929003906250003],[-84.240673828125,21.898339843749994],[-84.448828125,21.791650390624994],[-84.502587890625,21.776171875],[-84.49091796875,21.854296875],[-84.5013671875,21.93027343749999],[-84.560009765625,21.933007812499994],[-84.626904296875,21.920361328124997],[-84.68266601562499,21.899072265624994],[-84.78583984375,21.84228515625],[-84.83823242187499,21.827929687500003],[-84.88720703125,21.856982421875003],[-84.87724609374999,21.894140625],[-84.53276367187499,22.031152343749994],[-84.49423828124999,22.04160156249999],[-84.433056640625,22.031298828125003],[-84.37314453124999,22.0359375],[-84.3263671875,22.07431640624999],[-84.3830078125,22.255566406249997],[-84.361279296875,22.37890625],[-84.28134765624999,22.47421875],[-84.12177734375,22.618554687499994],[-84.044921875,22.666015625],[-83.2578125,22.967578125],[-83.17724609375,22.98300781249999],[-82.66582031249999,23.04355468749999],[-82.58779296875,23.06455078124999],[-82.350537109375,23.153955078124994],[-82.10136718749999,23.1904296875],[-81.83745117187499,23.163037109374997]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[20.897851562500023,80.249951171875],[20.998437500000023,80.238818359375],[21.549218750000023,80.242919921875],[21.654882812500006,80.21845703125],[21.696679687500023,80.1591796875],[21.780664062500023,80.13876953125],[21.897753906250017,80.132470703125],[22.190234375000017,80.059716796875],[22.28974609375001,80.04921875],[22.376367187500023,80.0896484375],[22.442675781250017,80.190283203125],[22.446191406250023,80.308349609375],[22.417871093750023,80.36552734375],[22.45078125,80.40224609375],[22.548828125,80.416455078125],[22.67207031250001,80.412646484375],[22.792578125,80.4330078125],[22.896875,80.468994140625],[23.00800781250001,80.473974609375],[23.251367187500023,80.4466796875],[23.3154296875,80.425244140625],[23.250097656250006,80.380859375],[23.224609375,80.317626953125],[23.114550781250017,80.186962890625],[23.353320312500017,80.178857421875],[23.68798828125,80.20654296875],[23.77294921875,80.244384765625],[23.952929687500017,80.30458984375],[24.142968750000023,80.295166015625],[24.23408203125001,80.303125],[24.280175781250023,80.329296875],[24.29755859375001,80.360400390625],[24.402636718750017,80.35517578125],[24.546679687500017,80.295166015625],[24.613671875000023,80.28583984375],[24.736328125,80.301318359375],[24.785937500000017,80.30068359375],[24.907031250000017,80.27666015625],[25.471289062500006,80.23310546875],[25.666894531250023,80.209765625],[25.75117187500001,80.188037109375],[25.836328125000023,80.175146484375],[26.43671875000001,80.17548828125],[26.86083984375,80.160009765625],[27.0171875,80.12548828125],[27.148339843750023,80.059228515625],[27.198632812500023,79.906591796875],[27.079882812500017,79.865380859375],[26.221093750000023,79.67744140625],[26.005859375,79.617041015625],[25.90205078125001,79.561376953125],[25.726367187500017,79.43974609375],[25.641210937500006,79.40302734375],[25.239062500000017,79.345068359375],[25.145117187500006,79.3388671875],[24.842871093750006,79.367236328125],[24.750585937500006,79.364599609375],[24.383398437500006,79.301611328125],[24.2568359375,79.2634765625],[24.132910156250006,79.215478515625],[23.94775390625,79.194287109375],[23.7587890625,79.205615234375],[22.903710937500023,79.2306640625],[22.789160156250006,79.26435546875],[22.695703125000023,79.329052734375],[22.865527343750017,79.411865234375],[21.911425781250017,79.3810546875],[20.861132812500017,79.3978515625],[20.805566406250023,79.409521484375],[20.760839843750006,79.44150390625],[20.399511718750006,79.46337890625],[20.128222656250017,79.489599609375],[19.900195312500017,79.5337890625],[19.674609375000017,79.591162109375],[19.746679687500006,79.61796875],[19.821093750000017,79.633642578125],[20.01484375000001,79.640234375],[20.187109375,79.632275390625],[20.493457031250017,79.632763671875],[20.564843750000023,79.69052734375],[20.686816406250017,79.707177734375],[20.784082031250023,79.748583984375],[20.460742187500017,79.774658203125],[20.123437500000023,79.778564453125],[19.89863281250001,79.744189453125],[19.638085937500023,79.72861328125],[19.4,79.7265625],[18.94208984375001,79.736328125],[18.725,79.7607421875],[18.428027343750017,79.82451171875],[18.32470703125,79.859716796875],[18.284765625,79.887353515625],[18.25537109375,79.92919921875],[18.594628906250023,79.96669921875],[18.726464843750023,79.996240234375],[18.85595703125,80.03662109375],[18.343847656250006,80.0595703125],[18.129492187500006,80.093408203125],[17.916894531250023,80.143115234375],[18.089453125,80.171142578125],[18.779296875,80.193505859375],[18.9619140625,80.1748046875],[19.142968750000023,80.138671875],[19.343359375,80.11640625],[19.537109375,80.163232421875],[19.35468750000001,80.185400390625],[19.19140625,80.263232421875],[19.15693359375001,80.30185546875],[19.178320312500006,80.33154296875],[19.263769531250006,80.335986328125],[19.327441406250017,80.323095703125],[19.568457031250006,80.25],[19.751074218750006,80.227197265625],[19.80224609375,80.2947265625],[19.810351562500017,80.326806640625],[19.777148437500017,80.353369140625],[19.691308593750023,80.40234375],[19.614355468750006,80.462548828125],[19.733300781250023,80.47783203125],[19.851171875,80.47119140625],[20.104296875000017,80.42998046875],[20.359375,80.400927734375],[20.475878906250017,80.371630859375],[20.693457031250006,80.298681640625],[20.897851562500023,80.249951171875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[16.78671875,79.90673828125],[16.838476562500006,79.90478515625],[16.888964843750017,79.9154296875],[16.925585937500017,79.94345703125],[16.96640625,79.958935546875],[17.21943359375001,79.940771484375],[17.578222656250006,79.88466796875],[17.68476562500001,79.85703125],[17.834570312500006,79.800048828125],[17.956152343750006,79.704248046875],[17.859765625000023,79.635009765625],[17.73261718750001,79.56953125],[17.6875,79.533349609375],[17.733984375,79.48134765625],[17.71503906250001,79.43076171875],[17.66875,79.3859375],[17.86103515625001,79.437060546875],[18.272070312500006,79.6005859375],[18.333300781250017,79.610693359375],[18.397363281250023,79.60517578125],[18.581445312500023,79.57158203125],[18.748437500000023,79.48818359375],[18.785253906250006,79.460595703125],[18.815234375000017,79.42666015625],[18.832421875000023,79.384765625],[18.82294921875001,79.336669921875],[18.807421875000017,79.303173828125],[18.720019531250017,79.281494140625],[18.677832031250006,79.26171875],[18.772265625000017,79.26025390625],[18.88007812500001,79.23427734375],[18.97900390625,79.179150390625],[19.089453125,79.15703125],[19.490234375,79.17568359375],[19.750878906250023,79.146826171875],[19.8935546875,79.056201171875],[20.11376953125,79.076708984375],[20.11445312500001,79.125],[20.162695312500006,79.145654296875],[20.45820312500001,79.129248046875],[20.61103515625001,79.106640625],[20.7671875,79.059130859375],[20.50068359375001,78.981396484375],[20.7203125,78.906689453125],[21.089648437500017,78.85263671875],[21.31220703125001,78.795849609375],[21.3525390625,78.772021484375],[21.388769531250006,78.7404296875],[21.243945312500017,78.6994140625],[21.096289062500006,78.67626953125],[20.72480468750001,78.672314453125],[20.387011718750017,78.64326171875],[19.76875,78.622705078125],[19.6767578125,78.6095703125],[19.65498046875001,78.5978515625],[19.618554687500023,78.562158203125],[19.380664062500017,78.47978515625],[19.150488281250006,78.37939453125],[19.0556640625,78.3189453125],[18.983789062500023,78.234228515625],[18.957617187500006,78.182470703125],[19.008691406250023,78.132275390625],[18.9951171875,78.081494140625],[18.822070312500017,78.04169921875],[18.712304687500023,78.040087890625],[18.574609375000023,78.047998046875],[18.439257812500017,78.025048828125],[18.4306640625,77.990576171875],[18.43867187500001,77.942041015625],[18.40400390625001,77.7939453125],[18.361914062500006,77.682275390625],[18.298730468750023,77.578564453125],[18.227929687500023,77.522607421875],[18.13740234375001,77.50703125],[17.847070312500023,77.49677734375],[17.623339843750017,77.399365234375],[17.442480468750006,77.225244140625],[17.3486328125,77.156884765625],[17.15253906250001,77.04892578125],[17.187890625000023,77.01064453125],[17.2490234375,76.969189453125],[17.141992187500023,76.894921875],[16.976660156250006,76.81162109375],[16.979882812500023,76.77939453125],[17.035546875000023,76.720361328125],[17.06269531250001,76.658984375],[16.93515625,76.60615234375],[16.700488281250017,76.579296875],[16.4619140625,76.609326171875],[16.345800781250006,76.644775390625],[16.238085937500017,76.701513671875],[16.123828125000017,76.738525390625],[16.004492187500006,76.7607421875],[15.546777343750023,76.88642578125],[15.124218750000011,77.085107421875],[14.738476562500011,77.162353515625],[14.486914062500006,77.1990234375],[14.365820312500006,77.23447265625],[14.24755859375,77.28212890625],[14.145312500000017,77.335595703125],[14.050390625,77.40322265625],[14.004199218750017,77.44521484375],[13.995703125,77.508203125],[14.026074218750011,77.545166015625],[14.0712890625,77.564111328125],[14.377636718750011,77.579638671875],[14.48779296875,77.570849609375],[14.596289062500006,77.537939453125],[14.695019531250011,77.525048828125],[14.920800781250023,77.688818359375],[16.205957031250023,77.782470703125],[16.619140625,77.798681640625],[17.033300781250006,77.797705078125],[16.96875,77.841943359375],[16.9140625,77.897998046875],[16.852929687500023,77.911572265625],[16.539648437500006,77.880224609375],[16.06005859375,77.847119140625],[15.826367187500011,77.8470703125],[15.585351562500023,77.869140625],[15.344824218750006,77.856982421875],[15.096875,77.809033203125],[14.846875,77.778662109375],[14.603906250000023,77.766455078125],[14.089941406250006,77.77138671875],[13.9625,77.796240234375],[13.791113281250006,77.85380859375],[13.749609375,77.88330078125],[13.714160156250017,77.91943359375],[13.680566406250023,78.028125],[13.717675781250023,78.0576171875],[13.770117187500006,78.074609375],[13.824023437500017,78.085009765625],[13.936914062500023,78.085546875],[14.047753906250023,78.066845703125],[14.307226562500006,78.005078125],[14.248144531250006,78.07138671875],[14.994726562500006,78.151220703125],[15.34140625,78.220947265625],[15.519433593750023,78.23271484375],[15.698046875000017,78.227587890625],[15.65869140625,78.264697265625],[15.657128906250023,78.2990234375],[15.783886718750011,78.32705078125],[15.875390625000023,78.339111328125],[16.150292968750023,78.352880859375],[16.776953125,78.350439453125],[17.0029296875,78.369384765625],[17.171972656250006,78.417138671875],[16.991796875,78.40048828125],[16.81123046875001,78.397265625],[16.7265625,78.407177734375],[16.53535156250001,78.448876953125],[16.448632812500023,78.503564453125],[16.696582031250017,78.612890625],[16.782617187500023,78.663623046875],[16.53046875000001,78.656298828125],[16.4462890625,78.638525390625],[16.157519531250017,78.538134765625],[15.944042968750011,78.493017578125],[15.6806640625,78.471337890625],[15.417382812500023,78.4732421875],[15.359960937500006,78.487548828125],[15.279394531250006,78.5541015625],[15.254199218750017,78.5890625],[15.264941406250017,78.60830078125],[15.348339843750011,78.663134765625],[15.3916015625,78.72119140625],[15.384179687500023,78.77119140625],[15.32275390625,78.781201171875],[15.225292968750011,78.73232421875],[15.137304687500006,78.6642578125],[15.016308593750011,78.630126953125],[14.891796875000011,78.639453125],[14.838671875000017,78.665576171875],[14.792382812500023,78.70556640625],[14.743554687500023,78.720947265625],[14.689257812500017,78.720947265625],[14.57763671875,78.70498046875],[14.467187500000023,78.675390625],[14.505273437500023,78.630517578125],[14.515429687500017,78.58056640625],[14.4677734375,78.54091796875],[14.431835937500011,78.49248046875],[14.545605468750011,78.461962890625],[14.63828125,78.414599609375],[14.49951171875,78.3923828125],[14.36328125,78.359912109375],[14.23828125,78.30986328125],[14.110449218750006,78.2708984375],[13.907617187500023,78.266748046875],[13.654980468750011,78.245166015625],[13.150195312500017,78.2375],[12.912792968750011,78.30107421875],[12.869531250000023,78.33125],[12.822167968750023,78.35146484375],[12.664648437500006,78.384765625],[12.434765625000011,78.482958984375],[12.257910156250006,78.594677734375],[12.13828125,78.605517578125],[11.961718750000017,78.6423828125],[11.865527343750017,78.67421875],[11.773828125000023,78.71640625],[11.746289062500011,78.766259765625],[11.755175781250017,78.811669921875],[11.861035156250011,78.831884765625],[11.611035156250011,78.882958984375],[11.365429687500011,78.950390625],[11.456152343750006,78.972998046875],[11.547558593750011,78.982958984375],[12.27490234375,78.9044921875],[12.323437500000011,78.9142578125],[12.4033203125,78.95322265625],[12.375,78.966357421875],[12.253125,78.975341796875],[12.087304687500023,78.97509765625],[12.045800781250023,78.983154296875],[11.981835937500023,79.02529296875],[11.925683593750023,79.07724609375],[11.901953125,79.111865234375],[11.892773437500011,79.15234375],[12.01611328125,79.2130859375],[12.083984375,79.267529296875],[11.978320312500017,79.29267578125],[11.679296875,79.291162109375],[11.579785156250011,79.28349609375],[11.616406250000011,79.2052734375],[11.521191406250011,79.15126953125],[11.3388671875,79.109130859375],[11.208105468750006,79.129638671875],[11.107226562500017,79.232958984375],[10.975390625000017,79.3048828125],[10.92578125,79.3501953125],[10.888085937500023,79.4154296875],[10.834375,79.462841796875],[10.737597656250017,79.520166015625],[10.725,79.555517578125],[10.737011718750011,79.581640625],[10.810742187500011,79.64091796875],[10.754589843750011,79.69033203125],[10.686230468750011,79.73359375],[10.68212890625,79.758251953125],[10.746386718750017,79.788671875],[10.804003906250017,79.798779296875],[10.865917968750011,79.79658203125],[11.049609375000017,79.760302734375],[11.150390625,79.7169921875],[11.185253906250011,79.720458984375],[11.250585937500006,79.78486328125],[11.343652343750023,79.7994140625],[11.702343750000011,79.82060546875],[12.101757812500011,79.737548828125],[12.205175781250006,79.719091796875],[12.287792968750011,79.713134765625],[12.245214843750006,79.75],[12.219140625000023,79.797900390625],[12.279980468750011,79.815966796875],[12.602441406250023,79.7732421875],[12.753515625,79.77578125],[13.107519531250006,79.83173828125],[13.69287109375,79.860986328125],[13.914160156250006,79.816943359375],[13.925683593750023,79.793408203125],[13.921093750000011,79.76171875],[13.907031250000017,79.752197265625],[13.777539062500011,79.715283203125],[13.039257812500011,79.68515625],[12.555371093750011,79.569482421875],[13.215136718750017,79.5880859375],[13.333789062500017,79.5748046875],[13.383593750000017,79.48076171875],[13.431640625,79.4708984375],[13.601269531250011,79.4572265625],[13.716210937500023,79.429150390625],[13.833691406250011,79.37568359375],[13.957226562500011,79.3396484375],[14.029589843750017,79.344140625],[14.055859375000011,79.38310546875],[14.0263671875,79.429296875],[14.011132812500023,79.48193359375],[14.019824218750017,79.538671875],[14.039843750000017,79.58564453125],[14.178417968750011,79.618701171875],[14.379785156250023,79.7259765625],[14.593652343750023,79.79873046875],[14.831835937500017,79.76640625],[15.05234375,79.675341796875],[15.251269531250017,79.545458984375],[15.443945312500006,79.406787109375],[15.66015625,79.23486328125],[15.764062500000023,79.174267578125],[15.858496093750006,79.159912109375],[16.29453125,78.9810546875],[16.34375,78.976123046875],[16.253515625,79.112109375],[16.02753906250001,79.3423828125],[15.875097656250006,79.51923828125],[15.840722656250023,79.586865234375],[15.816113281250011,79.6818359375],[15.82578125,79.709033203125],[15.845117187500023,79.73359375],[15.955761718750011,79.835107421875],[16.100195312500006,79.884423828125],[16.056640625,79.953955078125],[16.093847656250006,80.00732421875],[16.245703125,80.049462890625],[16.386621093750023,80.052587890625],[16.524023437500006,80.0205078125],[16.78671875,79.90673828125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[9.632031250000011,40.88203125],[9.682031250000023,40.818115234375],[9.794335937500023,40.556201171874996],[9.805273437500006,40.499560546874996],[9.7828125,40.44150390625],[9.754199218750017,40.400292968749994],[9.642968750000023,40.268408203125],[9.659472656250017,40.159228515624996],[9.70078125,40.091796875],[9.706738281250011,40.017041015625],[9.68603515625,39.924365234374996],[9.616992187500017,39.354394531249994],[9.58359375,39.253564453124994],[9.5625,39.166015625],[9.486328125,39.139550781249994],[9.388085937500023,39.167529296874996],[9.26416015625,39.216796875],[9.206933593750023,39.213818359375],[9.149316406250023,39.19697265625],[9.101757812500011,39.211279296875],[9.056347656250011,39.239160156249994],[9.022656250000011,39.043261718749996],[8.966601562500017,38.963720703125],[8.88134765625,38.912890625],[8.801171875000023,38.90966796875],[8.718554687500017,38.926708984375],[8.648535156250006,38.9265625],[8.595410156250011,38.964306640625],[8.553320312500006,39.030322265624996],[8.486230468750023,39.110498046874994],[8.418164062500011,39.205712890624994],[8.410742187500006,39.291796875],[8.399121093750011,39.481591796874994],[8.418652343750011,39.523046875],[8.447070312500017,39.562792968749996],[8.461035156250006,39.647705078125],[8.451171875,39.7216796875],[8.471093750000023,39.748095703124996],[8.5107421875,39.7216796875],[8.54052734375,39.731591796874994],[8.538671875,39.769677734374994],[8.547753906250023,39.839208984375],[8.495898437500017,39.8974609375],[8.4078125,39.917236328125],[8.399316406250023,39.978173828124994],[8.408593750000023,40.037646484374996],[8.455078125,40.077587890625],[8.470800781250006,40.130712890625],[8.471289062500006,40.29267578125],[8.4091796875,40.35234375],[8.385351562500006,40.442675781249996],[8.353222656250011,40.500537109374996],[8.295507812500006,40.558642578124996],[8.230273437500017,40.60595703125],[8.18994140625,40.651611328125],[8.180859375000011,40.771044921874996],[8.203808593750011,40.870703125],[8.22421875,40.913330078125],[8.245214843750006,40.90703125],[8.31015625,40.85751953125],[8.36328125,40.846337890624994],[8.468457031250011,40.834326171875],[8.571875,40.8501953125],[8.698925781250011,40.895263671875],[8.821191406250023,40.94990234375],[8.998144531250006,41.1103515625],[9.107226562500017,41.142919921875],[9.1630859375,41.18515625],[9.18212890625,41.2421875],[9.228417968750023,41.257080078125],[9.283007812500017,41.20166015625],[9.350781250000011,41.1958984375],[9.455175781250006,41.150146484375],[9.500195312500011,41.106347656249994],[9.538769531250011,41.053662109375],[9.57568359375,41.030517578125],[9.615332031250006,41.01728515625],[9.621191406250006,41.0048828125],[9.589746093750023,40.992480468749996],[9.5537109375,40.93212890625],[9.574023437500017,40.91474609375],[9.632031250000011,40.88203125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[9.480371093750023,42.805419921875],[9.454199218750006,42.65859375],[9.473242187500006,42.615576171875],[9.509375,42.585595703124994],[9.526171875000017,42.552636718749994],[9.556445312500017,42.1609375],[9.550683593750023,42.129736328125],[9.428417968750011,41.972412109375],[9.40087890625,41.926220703125],[9.394824218750017,41.731201171875],[9.374218750000011,41.67880859375],[9.330859375000017,41.6271484375],[9.25341796875,41.46005859375],[9.186132812500006,41.384912109374994],[9.003027343750006,41.4765625],[8.89501953125,41.516162109374996],[8.842089843750017,41.558886718749996],[8.807519531250023,41.58837890625],[8.829785156250011,41.627685546875],[8.879003906250006,41.6685546875],[8.886816406250006,41.70068359375],[8.77099609375,41.737109375],[8.717968750000011,41.76142578125],[8.718652343750023,41.804003906249996],[8.758691406250023,41.870410156249996],[8.740429687500011,41.925146484375],[8.673632812500017,41.92236328125],[8.621875,41.930712890624996],[8.615136718750023,41.959130859374994],[8.653417968750006,41.995556640625],[8.702539062500023,42.043115234374994],[8.700976562500017,42.095605468749994],[8.6416015625,42.118212890624996],[8.587792968750023,42.16083984375],[8.566210937500017,42.218798828124996],[8.60791015625,42.258447265624994],[8.675488281250011,42.284033203125],[8.625878906250023,42.343408203124994],[8.592382812500006,42.3447265625],[8.565625,42.357714843749996],[8.5875,42.385302734374996],[8.640039062500023,42.4265625],[8.713085937500011,42.549755859375],[8.814843750000023,42.60791015625],[8.994921875000017,42.6453125],[9.043652343750011,42.661669921874996],[9.08837890625,42.704980468749994],[9.137890625000011,42.73291015625],[9.198046875000017,42.72919921875],[9.253515625,42.712451171874996],[9.287695312500006,42.694628906249996],[9.313378906250023,42.713183593749996],[9.33837890625,42.766894531249996],[9.323046875000017,42.8140625],[9.330957031250023,42.943798828125],[9.363183593750023,43.017382812499996],[9.415234375000011,43.021484375],[9.463281250000023,42.981005859374996],[9.460839843750023,42.945214843749994],[9.478613281250006,42.860498046874994],[9.480371093750023,42.805419921875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[15.576562500000023,38.2203125],[15.508886718750006,38.106640625],[15.475683593750006,38.062939453125],[15.234472656250006,37.784814453124994],[15.206835937500017,37.720556640625],[15.189843750000023,37.650732421875],[15.164843750000017,37.58955078125],[15.131054687500011,37.531884765624994],[15.099511718750023,37.45859375],[15.105664062500011,37.37548828125],[15.116992187500017,37.334716796875],[15.14599609375,37.308007812499994],[15.193652343750017,37.282861328124994],[15.230273437500017,37.2443359375],[15.174121093750017,37.2091796875],[15.236035156250011,37.138720703124996],[15.288671875,37.096923828125],[15.295703125000017,37.05517578125],[15.29453125,37.01328125],[15.18515625,36.934814453125],[15.142382812500017,36.8916015625],[15.115820312500006,36.839257812499994],[15.104296875000017,36.78525390625],[15.116308593750006,36.736474609374994],[15.112597656250017,36.687841796875],[15.00244140625,36.693896484374996],[14.8896484375,36.723535156249994],[14.775976562500006,36.710400390625],[14.614355468750006,36.7666015625],[14.555468750000017,36.776757812499994],[14.501855468750023,36.798681640625],[14.367285156250006,36.9728515625],[14.259082031250017,37.046435546874996],[14.142968750000023,37.103662109374994],[14.024316406250023,37.10712890625],[13.905468750000011,37.100634765624996],[13.800585937500017,37.135888671874994],[13.587109375000011,37.254150390625],[13.3609375,37.34873046875],[13.264941406250017,37.4103515625],[13.221093750000023,37.451806640624994],[13.169921875,37.479296875],[13.040332031250017,37.50654296875],[12.924121093750017,37.5705078125],[12.871191406250006,37.5751953125],[12.75732421875,37.5673828125],[12.699023437500017,37.571826171874996],[12.640234375,37.5943359375],[12.526757812500023,37.66953125],[12.454394531250017,37.773779296875],[12.435546875,37.819775390625],[12.48681640625,37.938720703125],[12.547656250000017,38.0529296875],[12.601660156250006,38.0849609375],[12.664355468750017,38.10791015625],[12.702343750000011,38.14169921875],[12.734375,38.183056640625],[12.850683593750006,38.063720703125],[12.902734375000023,38.03486328125],[12.955468750000023,38.041308593749996],[13.049023437500011,38.08408203125],[13.056835937500011,38.130908203124996],[13.159960937500017,38.190332031249994],[13.291113281250006,38.191455078124996],[13.351660156250006,38.180517578125],[13.383496093750011,38.126806640625],[13.433496093750023,38.110253906249994],[13.491308593750006,38.103125],[13.681542968750023,38.000732421875],[13.73486328125,37.984033203124994],[13.788867187500017,37.981201171875],[13.936621093750006,38.024169921875],[14.05,38.04052734375],[14.287695312500006,38.016845703125],[14.416210937500011,38.042578125],[14.505957031250006,38.0455078125],[14.63671875,38.08505859375],[14.737207031250023,38.15078125],[14.789648437500006,38.1669921875],[14.845898437500011,38.171679687499996],[14.98193359375,38.167578125],[15.11875,38.152734375],[15.176074218750017,38.16806640625],[15.224023437500023,38.21103515625],[15.279589843750017,38.230371093749994],[15.340722656250023,38.217333984374996],[15.498730468750011,38.290869140625],[15.568359375,38.2958984375],[15.634667968750023,38.267578125],[15.576562500000023,38.2203125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-52.73115234375,69.9447265625],[-52.39824218749999,69.863427734375],[-52.0453125,69.8072265625],[-52.01079101562499,69.78154296875],[-51.9833984375,69.74267578125],[-51.97705078125,69.722412109375],[-51.985107421875,69.70361328125],[-52.007470703124994,69.686279296875],[-51.981689453125,69.66396484375],[-51.90776367187499,69.636669921875],[-51.90019531249999,69.60478515625],[-51.988427734374994,69.55],[-52.11259765624999,69.489111328125],[-52.770458984375,69.363916015625],[-53.003125,69.342626953125],[-53.57841796874999,69.256640625],[-53.754345703125,69.26015625],[-53.7931640625,69.264208984375],[-53.90205078125,69.302001953125],[-54.051171875,69.337158203125],[-54.121044921875,69.364404296875],[-54.18271484374999,69.403515625],[-54.158154296875,69.427783203125],[-54.04736328125,69.4373046875],[-53.889599609375,69.436669921875],[-53.65830078124999,69.46513671875],[-53.722265625,69.49072265625],[-53.78305664062499,69.506298828125],[-53.825,69.54033203125],[-53.921484375,69.53369140625],[-53.99375,69.553173828125],[-54.133203125,69.5654296875],[-54.496972656249994,69.577197265625],[-54.734130859375,69.610546875],[-54.804101562499994,69.630517578125],[-54.86577148437499,69.6650390625],[-54.919140625,69.713623046875],[-54.841259765625,69.901904296875],[-54.78789062499999,69.949853515625],[-54.66459960937499,69.965673828125],[-54.36308593749999,69.923828125],[-54.32260742187499,69.94189453125],[-54.65244140624999,70.011181640625],[-54.7736328125,70.0525390625],[-54.809326171875,70.085107421875],[-54.83076171875,70.132958984375],[-54.83046875,70.161083984375],[-54.815576171874994,70.189404296875],[-54.78623046874999,70.2177734375],[-54.705957031249994,70.25615234375],[-54.37163085937499,70.31728515625],[-54.007226562499994,70.296435546875],[-53.375146484374994,70.2212890625],[-53.29672851562499,70.20537109375],[-53.102929687499994,70.140869140625],[-52.73115234375,69.9447265625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-127.19731445312499,50.640380859375],[-126.700927734375,50.515527343749994],[-126.203857421875,50.453857421875],[-125.83916015624999,50.380810546875],[-125.615234375,50.358544921874994],[-125.534326171875,50.34248046875],[-125.482080078125,50.316796875],[-125.42045898437499,50.254638671875],[-125.31396484375,50.106689453125],[-125.23320312499999,50.01220703125],[-125.06640625,49.848193359374996],[-124.93466796875,49.731640625],[-124.904638671875,49.685351562499996],[-124.93242187499999,49.670458984374996],[-124.9306640625,49.6431640625],[-124.83061523437499,49.530078125],[-124.64287109374999,49.428662109375],[-124.495947265625,49.380273437499994],[-124.185888671875,49.300585937499996],[-123.99580078125,49.224023437499994],[-123.937158203125,49.170800781249994],[-123.8544921875,49.119189453124996],[-123.82001953125,49.08349609375],[-123.752294921875,48.951220703124996],[-123.6265625,48.824023437499996],[-123.497021484375,48.582080078124996],[-123.4728515625,48.602294921875],[-123.457958984375,48.6744140625],[-123.44306640625,48.690478515624996],[-123.415478515625,48.698193359375],[-123.389892578125,48.670214843749996],[-123.36630859375,48.6064453125],[-123.2837890625,48.45517578125],[-123.31064453125,48.411035156249994],[-123.33452148437499,48.406494140625],[-123.4458984375,48.42724609375],[-123.4845703125,48.40009765625],[-123.536474609375,48.344970703125],[-123.57314453125,48.322802734374996],[-123.59462890625,48.333544921874996],[-123.916943359375,48.386572265625],[-124.115234375,48.436425781249994],[-124.376220703125,48.515234375],[-124.689404296875,48.597314453124994],[-124.86826171875,48.653613281249996],[-125.017236328125,48.711474609374996],[-125.120703125,48.760791015624996],[-125.140283203125,48.802636718749994],[-125.135693359375,48.822412109374994],[-124.934765625,48.956347656249996],[-124.84965820312499,49.028271484375],[-124.817041015625,49.083300781249996],[-124.800244140625,49.141552734375],[-124.812646484375,49.212646484375],[-124.820751953125,49.20712890625],[-124.838720703125,49.1390625],[-124.868310546875,49.078515625],[-124.904443359375,49.031005859375],[-124.92734375,49.014208984374996],[-125.168212890625,48.991015625],[-125.362744140625,48.9982421875],[-125.460302734375,48.941064453124994],[-125.489453125,48.9337890625],[-125.543115234375,48.95283203125],[-125.660498046875,49.029150390625],[-125.828515625,49.091845703124996],[-125.811962890625,49.107226562499996],[-125.702294921875,49.139208984374996],[-125.64423828125,49.185791015625],[-125.654638671875,49.193212890625],[-125.693701171875,49.190380859375],[-125.72802734375,49.199853515624994],[-125.79638671875,49.260205078125],[-125.83544921875,49.276660156249996],[-125.918359375,49.24951171875],[-125.95166015625,49.248046875],[-125.983837890625,49.287890625],[-125.9376953125,49.379785156249994],[-125.935400390625,49.40146484375],[-126.02031249999999,49.368017578125],[-126.04833984375,49.37900390625],[-126.07490234375,49.4087890625],[-126.099853515625,49.421289062499994],[-126.16884765625,49.415185546874994],[-126.243603515625,49.442675781249996],[-126.2697265625,49.431884765625],[-126.279638671875,49.3921875],[-126.30449218749999,49.38203125],[-126.418603515625,49.449023437499996],[-126.44453125,49.451123046875],[-126.499853515625,49.399951171874996],[-126.519140625,49.396777343749996],[-126.54853515625,49.4189453125],[-126.563720703125,49.543261718749996],[-126.557470703125,49.57861328125],[-126.54189453125,49.590478515624994],[-126.4427734375,49.619287109374994],[-126.1578125,49.650146484375],[-126.13408203124999,49.672314453125],[-126.34755859375,49.66083984375],[-126.403173828125,49.677734375],[-126.46279296875,49.72021484375],[-126.525244140625,49.719580078125],[-126.558251953125,49.7333984375],[-126.59287109375,49.764111328125],[-126.68310546875,49.87646484375],[-126.74462890625,49.904931640624994],[-126.849365234375,49.922802734375],[-126.9033203125,49.944140625],[-126.92607421874999,49.934716796874994],[-126.94794921875,49.902685546875],[-126.97709960937499,49.8828125],[-127.04873046875,49.871533203125],[-127.11430664062499,49.879736328125],[-127.16552734375,49.910449218749996],[-127.1958984375,49.949169921875],[-127.20751953125,49.992431640625],[-127.1791015625,50.05029296875],[-127.179638671875,50.073144531249994],[-127.192333984375,50.099902343749996],[-127.215673828125,50.121484375],[-127.24980468749999,50.137988281249996],[-127.268408203125,50.129345703125],[-127.27153320312499,50.095556640625],[-127.2900390625,50.070849609374996],[-127.34941406249999,50.051953125],[-127.397900390625,50.085009765624996],[-127.42978515625,50.130859375],[-127.467138671875,50.163427734375],[-127.67485351562499,50.163330078125],[-127.770458984375,50.121142578124996],[-127.81630859375,50.117724609374996],[-127.863916015625,50.127734375],[-127.872998046875,50.15009765625],[-127.82817382812499,50.21142578125],[-127.83916015624999,50.293212890625],[-127.850830078125,50.313720703125],[-127.9466796875,50.326220703124996],[-127.96293945312499,50.345996093749996],[-127.905859375,50.445214843749994],[-127.8740234375,50.46396484375],[-127.83154296875,50.471044921875],[-127.64140624999999,50.4791015625],[-127.578125,50.46494140625],[-127.4865234375,50.404638671875],[-127.48935546875,50.42734375],[-127.5240234375,50.495751953124994],[-127.52900390625,50.536767578124994],[-127.46591796875,50.58310546875],[-127.526220703125,50.5966796875],[-127.75146484375,50.607373046875],[-127.74970703125,50.577734375],[-127.73115234375,50.5357421875],[-127.864697265625,50.498876953125],[-127.96367187499999,50.492626953125],[-128.058349609375,50.498486328125],[-128.13564453125,50.520556640624996],[-128.267431640625,50.609277343749994],[-128.34990234375,50.696582031249996],[-128.346044921875,50.74423828125],[-128.300830078125,50.794140625],[-128.241552734375,50.828173828124996],[-128.101318359375,50.857763671875],[-127.91806640625,50.860546875],[-127.713037109375,50.820751953125],[-127.19731445312499,50.640380859375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-71.954296875,19.7216796875],[-71.834716796875,19.696728515624997],[-71.779248046875,19.718164062499994],[-71.735107421875,19.735107421875],[-71.7060546875,19.795166015625],[-71.6673828125,19.8486328125],[-71.615966796875,19.87744140625],[-71.557763671875,19.89536132812499],[-71.44169921874999,19.893994140624997],[-71.28134765624999,19.847363281249997],[-71.2359375,19.84814453125],[-71.08193359375,19.89047851562499],[-70.95415039062499,19.913964843749994],[-70.83388671875,19.887255859375003],[-70.78525390624999,19.850878906250003],[-70.6859375,19.793261718750003],[-70.636181640625,19.775634765625],[-70.47934570312499,19.776953125],[-70.43642578125,19.771240234375],[-70.30473632812499,19.676074218750003],[-70.19384765625,19.63803710937499],[-70.12944335937499,19.636132812499994],[-70.0140625,19.67294921874999],[-69.95683593749999,19.671875],[-69.89121093749999,19.589746093749994],[-69.8783203125,19.473291015624994],[-69.8234375,19.367138671874997],[-69.739404296875,19.29921875],[-69.324951171875,19.327734375],[-69.23247070312499,19.27182617187499],[-69.26425781249999,19.22568359374999],[-69.32275390625,19.201074218749994],[-69.5197265625,19.21201171874999],[-69.60595703125,19.206494140624997],[-69.6232421875,19.16049804687499],[-69.62363281249999,19.117822265624994],[-69.50834960937499,19.107617187499997],[-69.395263671875,19.086083984374994],[-69.280224609375,19.051904296874994],[-69.163037109375,19.028466796874994],[-69.03129882812499,19.01318359375],[-68.9013671875,18.988476562499997],[-68.684765625,18.90478515625],[-68.44541015624999,18.714453125],[-68.38139648437499,18.671142578125],[-68.33916015624999,18.611523437499997],[-68.35927734375,18.5380859375],[-68.44482421875,18.417724609375],[-68.49321289062499,18.37900390624999],[-68.56376953124999,18.35546875],[-68.61220703125,18.30625],[-68.658837890625,18.22202148437499],[-68.68740234375,18.21494140624999],[-68.72099609374999,18.218408203124994],[-68.778466796875,18.26611328125],[-68.81953125,18.339306640624997],[-68.9349609375,18.408007812500003],[-69.072265625,18.39921875],[-69.27451171874999,18.43984375],[-69.39697265625,18.420117187499997],[-69.51943359375,18.415673828124994],[-69.6447265625,18.43637695312499],[-69.770654296875,18.443554687499997],[-69.89638671875,18.417724609375],[-70.018310546875,18.37363281249999],[-70.06333007812499,18.345654296874997],[-70.1416015625,18.277099609375],[-70.18310546875,18.251757812500003],[-70.479931640625,18.21728515625],[-70.5654296875,18.267578125],[-70.644677734375,18.336230468750003],[-70.75883789062499,18.345605468749994],[-70.92431640625,18.29248046875],[-71.02783203125,18.273193359375],[-71.069970703125,18.25034179687499],[-71.0822265625,18.224365234375],[-71.08261718749999,18.128369140624997],[-71.10600585937499,18.070019531249997],[-71.26728515625,17.849609375],[-71.35830078125,17.694140625],[-71.395703125,17.64609375],[-71.43896484375,17.63559570312499],[-71.51835937499999,17.725],[-71.56904296875,17.757373046875003],[-71.63173828125,17.773632812499997],[-71.65830078124999,17.82114257812499],[-71.6572265625,17.888671875],[-71.67373046875,17.9541015625],[-71.71245117187499,18.00546875],[-71.768310546875,18.03916015624999],[-71.8529296875,18.119140625],[-71.94609374999999,18.186083984375003],[-72.00205078124999,18.21201171874999],[-72.05986328124999,18.228564453125003],[-72.503564453125,18.219921875],[-72.55322265625,18.208398437499994],[-72.59189453124999,18.186914062499994],[-72.63330078125,18.176220703124997],[-72.7552734375,18.156152343749994],[-72.87666015625,18.151757812499994],[-73.16005859375,18.205615234375003],[-73.27226562499999,18.233544921874994],[-73.38515625,18.251171875],[-73.51484375,18.245361328125],[-73.64404296875,18.229052734375003],[-73.747314453125,18.190234375],[-73.82470703125,18.121777343749997],[-73.83916015624999,18.058203125],[-73.8849609375,18.041894531249994],[-73.989453125,18.14316406249999],[-74.085400390625,18.215136718750003],[-74.19462890624999,18.269189453124994],[-74.41904296874999,18.34619140625],[-74.4599609375,18.39306640625],[-74.478125,18.45],[-74.3875,18.624707031249997],[-74.28447265624999,18.656689453124997],[-74.227734375,18.66269531249999],[-74.100341796875,18.64111328125],[-73.9759765625,18.60141601562499],[-73.8625,18.575439453125],[-73.68701171875,18.565332031249994],[-73.59160156249999,18.522363281249994],[-72.91728515624999,18.455712890624994],[-72.78935546874999,18.434814453125],[-72.739453125,18.442138671875],[-72.69599609375,18.468212890624997],[-72.659765625,18.515332031249997],[-72.61806640625,18.55078125],[-72.418115234375,18.55869140624999],[-72.37607421874999,18.574462890625],[-72.34672851562499,18.623730468749997],[-72.34765625,18.674951171874994],[-72.465234375,18.743554687499994],[-72.64912109375,18.894140625],[-72.81108398437499,19.071582031250003],[-72.7412109375,19.13134765625],[-72.76796875,19.240625],[-72.741796875,19.341845703125003],[-72.70322265624999,19.441064453124994],[-72.863427734375,19.526074218749997],[-73.052734375,19.610742187499994],[-73.31552734374999,19.63730468749999],[-73.39633789062499,19.65869140625],[-73.43837890625,19.722119140624997],[-73.400537109375,19.807421875],[-73.31533203125,19.85458984374999],[-73.2177734375,19.883691406249994],[-73.11777343749999,19.90380859375],[-72.87651367187499,19.92807617187499],[-72.63701171874999,19.90087890625],[-72.429931640625,19.81328125],[-72.21982421874999,19.74462890625],[-71.954296875,19.7216796875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-49.628662109375,-0.229199218750011],[-49.53520507812499,-0.233593750000011],[-49.40288085937499,-0.214648437500003],[-49.31425781249999,-0.167871093750009],[-49.215087890625,-0.15869140625],[-49.11699218749999,-0.16357421875],[-48.78657226562498,-0.215527343750011],[-48.588037109374994,-0.231640625000011],[-48.51542968749999,-0.248242187500011],[-48.444482421874994,-0.271875],[-48.392675781250006,-0.29736328125],[-48.37968749999999,-0.352832031250003],[-48.42802734374999,-0.441503906250006],[-48.463964843750006,-0.534765625],[-48.497460937499994,-0.664941406250009],[-48.523339843749994,-0.69140625],[-48.566650390625,-0.684472656250009],[-48.539697265624994,-0.800976562500011],[-48.54951171874998,-0.847558593750009],[-48.570947265624994,-0.892871093750003],[-48.62407226562499,-0.986914062500006],[-48.70458984375,-1.106640625000011],[-48.728515625,-1.131738281250009],[-48.78984374999999,-1.17333984375],[-48.839697265625006,-1.2265625],[-48.829003906249994,-1.276562500000011],[-48.804052734375006,-1.326953125],[-48.83359375,-1.390039062500009],[-48.92890624999998,-1.482324218750009],[-48.9859375,-1.5046875],[-49.038476562499994,-1.5140625],[-49.08686523437498,-1.505078125000011],[-49.172705078125006,-1.41259765625],[-49.18168945312499,-1.484960937500006],[-49.20478515624998,-1.558984375],[-49.233984375,-1.599511718750009],[-49.344824218750006,-1.59521484375],[-49.406591796875006,-1.555566406250009],[-49.50664062499999,-1.511621093750009],[-49.52568359374999,-1.63046875],[-49.587890625,-1.71240234375],[-49.65058593749998,-1.738085937500003],[-49.748779296875,-1.75537109375],[-49.80512695312498,-1.790234375000011],[-49.91132812499998,-1.762988281250003],[-50.00996093749998,-1.70849609375],[-50.06572265624999,-1.703808593750011],[-50.109277343749994,-1.747851562500003],[-50.33842773437499,-1.755957031250006],[-50.443457031250006,-1.800683593750009],[-50.50761718749999,-1.787988281250009],[-50.60205078125,-1.69775390625],[-50.6171875,-1.6376953125],[-50.67338867187499,-1.516015625],[-50.72382812499998,-1.371484375],[-50.759765625,-1.240234375],[-50.7294921875,-1.126757812500003],[-50.668310546875006,-1.130566406250011],[-50.59589843749998,-1.1474609375],[-50.58051757812498,-1.139453125],[-50.57695312499999,-1.103125],[-50.592919921874994,-1.072949218750011],[-50.709619140624994,-1.077734375],[-50.783300781250006,-1.010351562500006],[-50.79609374999998,-0.90625],[-50.78095703124998,-0.68984375],[-50.771386718749994,-0.645410156250009],[-50.71992187499998,-0.583398437500009],[-50.70307617187498,-0.528515625000011],[-50.7158203125,-0.47021484375],[-50.693701171875006,-0.364453125000011],[-50.6455078125,-0.272851562500009],[-50.461572265624994,-0.157421875000011],[-50.24824218749998,-0.116406250000011],[-49.628662109375,-0.229199218750011]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-3.109667968749989,58.515478515625],[-3.101123046874989,58.43369140625],[-3.112890624999977,58.40888671875],[-3.136767578124989,58.378320312499994],[-3.212353515624983,58.321240234375],[-3.410986328124977,58.239648437499994],[-3.775,58.052099609375],[-3.990039062499989,57.959033203124996],[-4.019628906249977,57.9142578125],[-4.035595703124983,57.852001953125],[-3.906835937499977,57.839648437499996],[-3.857128906249983,57.8185546875],[-3.887939453125,57.786914062499996],[-4.078417968749989,57.677050781249996],[-4.134521484375,57.577734375],[-3.988476562499983,57.58125],[-3.8681640625,57.600341796875],[-3.628222656249989,57.662255859375],[-3.402783203124983,57.708251953125],[-3.294531249999977,57.71015625],[-3.083935546874983,57.673486328125],[-3.036035156249994,57.672314453125],[-2.946679687499994,57.689257812499996],[-2.856298828124977,57.69228515625],[-2.244140625,57.680859375],[-2.074072265624977,57.702392578125],[-1.961523437499977,57.67666015625],[-1.867382812499983,57.612353515624996],[-1.777929687499977,57.49375],[-1.780664062499994,57.4740234375],[-1.834716796875,57.419970703124996],[-1.934472656249994,57.352197265625],[-2.020312499999989,57.25888671875],[-2.045507812499977,57.208544921874996],[-2.062353515624977,57.153466796875],[-2.089550781249983,57.1025390625],[-2.26025390625,56.863330078124996],[-2.426660156249994,56.730712890625],[-2.5009765625,56.636572265625],[-2.592675781249994,56.561572265624996],[-2.680957031249989,56.514404296875],[-2.775195312499989,56.482958984374996],[-3.047412109374989,56.449365234375],[-3.123583984374989,56.42529296875],[-3.214453124999977,56.383935546875],[-3.309960937499994,56.3634765625],[-3.197998046875,56.366064453125],[-3.087011718749977,56.3890625],[-2.88515625,56.397509765624996],[-2.652734375,56.31826171875],[-2.674267578124983,56.25341796875],[-2.767578125,56.2021484375],[-2.979785156249989,56.194091796875],[-3.17822265625,56.080126953124996],[-3.267773437499983,56.045068359375],[-3.362255859374983,56.027636718749996],[-3.480419921874983,56.0328125],[-3.695117187499989,56.063330078125],[-3.7890625,56.09521484375],[-3.704150390624989,56.0431640625],[-3.6078125,56.016015625],[-3.048730468749994,55.951953125],[-3.015087890624983,55.95859375],[-2.836865234374983,56.02626953125],[-2.599316406249983,56.027294921875],[-2.147070312499977,55.902978515625],[-2.016845703125,55.807958984375],[-1.830273437499983,55.671728515625],[-1.728759765625,55.6185546875],[-1.655371093749977,55.570361328124996],[-1.610156249999989,55.498095703124996],[-1.522558593749977,55.259521484375],[-1.422656249999989,55.026416015624996],[-1.291748046875,54.773876953125],[-1.232421875,54.7037109375],[-1.154394531249977,54.6544921875],[-0.759326171874989,54.54140625],[-0.67138671875,54.50390625],[-0.518115234374989,54.3951171875],[-0.370361328125,54.27919921875],[-0.232861328124983,54.19013671875],[-0.084375,54.11806640625],[-0.156298828124989,54.080615234374996],[-0.20556640625,54.021728515625],[-0.16875,53.941650390625],[-0.108251953124977,53.865185546875],[0.010546875000017,53.742822265625],[0.115332031250006,53.60927734375],[0.076708984375017,53.629443359374996],[0.036083984375011,53.64052734375],[-0.019433593749994,53.63720703125],[-0.07373046875,53.64365234375],[-0.173828125,53.68544921875],[-0.27001953125,53.736767578125],[-0.461376953124983,53.716162109375],[-0.567675781249989,53.725390625],[-0.659912109375,53.7240234375],[-0.485058593749983,53.694384765624996],[-0.293701171875,53.692333984375],[0.128320312500023,53.46826171875],[0.27099609375,53.335498046874996],[0.355761718750017,53.159960937499996],[0.298046875000011,53.081103515624996],[0.208203125000011,53.030029296875],[0.124414062500023,52.97158203125],[0.0458984375,52.905615234375],[0.27978515625,52.80869140625],[0.330175781250006,52.81162109375],[0.381933593750006,52.8251953125],[0.431640625,52.858154296875],[0.515527343750023,52.93837890625],[0.558789062500011,52.966943359375],[0.704492187500023,52.97724609375],[0.826757812500006,52.97109375],[0.948535156250017,52.953369140625],[1.055566406250023,52.958984375],[1.271289062500017,52.924560546875],[1.382128906250017,52.893505859375],[1.65673828125,52.753710937499996],[1.716113281250017,52.67724609375],[1.743359375000011,52.578515625],[1.74658203125,52.468994140625],[1.700390625000011,52.368896484375],[1.647363281250023,52.278515625],[1.614648437500023,52.16181640625],[1.59140625,52.119775390625],[1.558984375000023,52.086865234375],[1.413476562500023,51.994775390625],[1.316796875000023,51.95693359375],[1.275976562500006,51.97353515625],[1.232421875,51.971240234374996],[1.227832031250017,51.94912109375],[1.273828125000023,51.902099609375],[1.2744140625,51.845361328125],[1.1884765625,51.803369140625],[1.101171875,51.785449218749996],[0.955078125,51.8078125],[0.752246093750017,51.72958984375],[0.898046875,51.689404296875],[0.927441406250011,51.646630859375],[0.890917968750017,51.571435546874994],[0.799218750000023,51.537890625],[0.697558593750017,51.523046875],[0.593457031250011,51.519482421875],[0.507226562500023,51.50107421875],[0.424511718750011,51.465625],[0.5283203125,51.48447265625],[0.600292968750011,51.46796875],[0.6455078125,51.4046875],[0.6865234375,51.386572265625],[0.889355468750011,51.359521484374994],[1.014941406250017,51.359716796875],[1.257128906250017,51.37509765625],[1.373437500000023,51.37470703125],[1.414941406250023,51.36328125],[1.415625,51.310839843749996],[1.397558593750006,51.18203125],[1.365527343750017,51.15546875],[1.04443359375,51.047265625],[0.978613281250006,50.9716796875],[0.960156250000011,50.92587890625],[0.772363281250023,50.933984375],[0.684375,50.885546875],[0.532324218750006,50.853417968749994],[0.414746093750011,50.819189453125],[0.299707031250023,50.7759765625],[0.205078125,50.763037109375],[-0.203906249999989,50.814355468749994],[-0.450781249999977,50.81015625],[-0.785253906249977,50.765429687499996],[-0.871386718749989,50.772802734375],[-1.000585937499977,50.815625],[-1.132861328124989,50.844580078125],[-1.285058593749994,50.857324218749994],[-1.416455078124983,50.896875],[-1.33447265625,50.82080078125],[-1.516748046874994,50.747460937499994],[-1.600830078125,50.732861328125],[-1.687890625,50.73515625],[-1.866015624999989,50.715234375],[-2.031054687499989,50.725390625],[-2.00625,50.673242187499994],[-1.962060546874994,50.627783203125],[-1.997900390624977,50.6080078125],[-2.035839843749983,50.603076171874996],[-2.350146484374989,50.63740234375],[-2.394677734374994,50.630908203124996],[-2.433447265624977,50.59921875],[-2.547753906249994,50.61630859375],[-2.658837890624994,50.669726562499996],[-2.776953124999977,50.70556640625],[-2.90087890625,50.722412109375],[-2.999414062499994,50.716601562499996],[-3.404589843749989,50.632421875],[-3.485449218749977,50.54794921875],[-3.52587890625,50.428173828125],[-3.584375,50.321826171874996],[-3.679785156249977,50.23994140625],[-3.793359375,50.229248046875],[-3.900195312499989,50.2859375],[-4.103417968749994,50.348535156249994],[-4.172558593749983,50.3908203125],[-4.194580078125,50.393310546875],[-4.21728515625,50.378173828125],[-4.296972656249977,50.35908203125],[-4.379492187499977,50.358203125],[-4.506689453124977,50.341357421874996],[-4.727978515624983,50.290478515625],[-4.8173828125,50.25595703125],[-5.009521484375,50.1607421875],[-5.048632812499989,50.134375],[-5.118505859374977,50.038330078125],[-5.225244140624994,50.021386718749994],[-5.322851562499977,50.082958984375],[-5.433984375,50.104443359375],[-5.551220703124983,50.083398437499994],[-5.622119140624989,50.050683593749994],[-5.655175781249994,50.07724609375],[-5.65625,50.131884765624996],[-5.570654296874977,50.19697265625],[-5.34228515625,50.246142578124996],[-5.141796874999983,50.37373046875],[-5.04345703125,50.451513671875],[-5.004443359374989,50.495263671874994],[-4.956396484374977,50.52314453125],[-4.8935546875,50.53369140625],[-4.861279296874983,50.58203125],[-4.582910156249994,50.7763671875],[-4.559960937499994,50.820947265624994],[-4.546093749999983,50.900683593749996],[-4.523095703124994,50.977441406249994],[-4.296484374999977,51.027148437499996],[-4.188183593749983,51.188525390624996],[-4.158398437499983,51.201318359374994],[-3.842333984374989,51.230908203125],[-3.60791015625,51.228564453124996],[-3.375097656249977,51.19697265625],[-3.255761718749994,51.194140625],[-3.135986328125,51.205029296875],[-3.042041015624989,51.248583984374996],[-2.88125,51.405664062499994],[-2.790820312499989,51.4748046875],[-2.687207031249983,51.537255859374994],[-2.590283203124983,51.60859375],[-2.433056640624983,51.74072265625],[-2.539355468749989,51.69521484375],[-2.667675781249983,51.622998046875],[-2.742138671874983,51.581103515624996],[-2.978515625,51.538867187499996],[-3.080371093749989,51.49580078125],[-3.2587890625,51.398486328124996],[-3.293115234374994,51.390429687499996],[-3.562353515624977,51.413818359375],[-3.7626953125,51.539941406249994],[-3.890771484374994,51.591650390625],[-3.943652343749989,51.597509765625],[-3.998339843749989,51.58212890625],[-4.115283203124989,51.56640625],[-4.234570312499983,51.569091796875],[-4.173681640624977,51.62734375],[-4.091015624999983,51.659912109375],[-4.276171874999989,51.68251953125],[-4.32763671875,51.700244140624996],[-4.386279296874989,51.741064453125],[-4.531494140625,51.748046875],[-4.600781249999983,51.737646484375],[-4.717626953124977,51.68369140625],[-4.902294921874983,51.626269531249996],[-5.124755859375,51.705859375],[-5.168359375,51.74072265625],[-5.167236328125,51.808056640625],[-5.200585937499994,51.861376953124996],[-5.262304687499977,51.880175781249996],[-5.183349609375,51.949658203125],[-5.088085937499983,51.995898437499996],[-4.878515624999977,52.041845703125],[-4.561132812499977,52.15087890625],[-4.383154296874977,52.197314453124996],[-4.217724609374983,52.27744140625],[-4.149365234374983,52.32626953125],[-4.099755859374994,52.393115234374996],[-4.050537109375,52.475146484374996],[-3.980322265624977,52.541748046875],[-4.048437499999977,52.5576171875],[-4.078906249999989,52.607861328125],[-4.070703125,52.658837890625],[-4.039257812499983,52.704052734375],[-4.067431640624989,52.7607421875],[-4.117529296874977,52.82001953125],[-4.11474609375,52.866162109375],[-4.101464843749994,52.915478515625],[-4.229150390624994,52.912841796875],[-4.3564453125,52.897412109375],[-4.471826171874994,52.862451171875],[-4.583691406249983,52.81494140625],[-4.683056640624983,52.80615234375],[-4.681445312499989,52.844140625],[-4.638330078124994,52.89111328125],[-4.525683593749989,52.958203125],[-4.405078124999989,53.013818359375],[-4.362207031249994,53.0560546875],[-4.328417968749989,53.105126953125],[-4.2685546875,53.14453125],[-4.111035156249983,53.2189453125],[-3.809277343749983,53.302685546875],[-3.764208984374989,53.3076171875],[-3.645898437499994,53.297900390624996],[-3.529589843749989,53.310546875],[-3.427734375,53.340673828125],[-3.326171875,53.34716796875],[-3.097558593749994,53.260302734374996],[-3.165576171874989,53.394677734375],[-3.064746093749989,53.42685546875],[-2.918554687499977,53.30537109375],[-2.864160156249994,53.292578125],[-2.74951171875,53.310205078125],[-2.79375,53.330712890625],[-2.845410156249983,53.33193359375],[-2.9130859375,53.350244140625],[-2.969970703125,53.389208984374996],[-3.064599609374994,53.512841796875],[-3.059472656249994,53.586230468749996],[-2.995703124999977,53.662548828125],[-2.925097656249989,53.732763671875],[-2.984326171874983,53.746728515625],[-3.031787109374989,53.773583984375],[-3.045361328124983,53.84384765625],[-3.026757812499994,53.905908203125],[-2.899853515624983,53.960693359375],[-2.862402343749977,54.04384765625],[-2.846484374999989,54.135302734374996],[-2.867578125,54.17724609375],[-2.993505859374977,54.1705078125],[-3.054736328124989,54.15341796875],[-3.109667968749989,54.126318359375],[-3.165966796874983,54.1279296875],[-3.321533203125,54.2291015625],[-3.410253906249977,54.305615234375],[-3.569384765624989,54.467578125],[-3.592041015625,54.56435546875],[-3.464599609375,54.773095703125],[-3.267919921874977,54.906591796875],[-3.036230468749977,54.953076171875],[-3.0810546875,54.961962890624996],[-3.43408203125,54.96376953125],[-3.550439453124994,54.947412109375],[-3.658300781249977,54.892871093749996],[-3.71923828125,54.876123046875],[-3.783251953124989,54.869921875],[-3.841601562499989,54.8427734375],[-3.898583984374994,54.805078125],[-3.957910156249994,54.78095703125],[-4.075781249999977,54.78720703125],[-4.132958984374994,54.779248046875],[-4.174023437499983,54.801074218749996],[-4.208398437499994,54.837158203125],[-4.25341796875,54.84677734375],[-4.303662109374983,54.835693359375],[-4.409912109375,54.787060546875],[-4.517480468749994,54.758349609374996],[-4.647558593749977,54.789013671875],[-4.818066406249983,54.846142578125],[-4.851708984374994,54.82529296875],[-4.889501953124977,54.772265625],[-4.911230468749977,54.689453125],[-5.032324218749977,54.761376953125],[-5.135498046875,54.85751953125],[-5.170117187499983,54.917919921875],[-5.172705078124977,54.985888671874996],[-5.11669921875,55.012255859374996],[-5.055859374999983,54.988134765625],[-4.965185546874977,55.149462890624996],[-4.784814453124994,55.359423828124996],[-4.721142578124983,55.42099609375],[-4.6767578125,55.501318359375],[-4.68437,55.55390625],[-4.724169921874989,55.598291015625],[-4.891845703125,55.69912109375],[-4.8896484375,55.781201171875],[-4.871679687499977,55.87392578125],[-4.826074218749994,55.929541015625],[-4.806835937499983,55.94013671875],[-4.584082031249977,55.938671875],[-4.670947265624989,55.9673828125],[-4.844091796874977,56.051171875],[-4.841015624999983,56.080859375],[-4.80029296875,56.158349609375],[-4.819140624999989,56.15048828125],[-4.85625,56.114697265625],[-4.927099609374977,56.028076171875],[-4.970361328124994,56.007861328124996],[-5.092822265624989,55.9873046875],[-5.114990234375,55.944628906249996],[-5.134667968749994,55.93349609375],[-5.195849609374989,55.928662109375],[-5.214599609375,55.8888671875],[-5.228222656249983,55.886328125],[-5.24560546875,55.929248046874996],[-5.247314453125,56.000390625],[-5.222949218749989,56.0658203125],[-5.176416015624994,56.116992187499996],[-4.996972656249994,56.233349609375],[-5.084326171874977,56.1974609375],[-5.282324218749977,56.08994140625],[-5.383447265624994,56.01923828125],[-5.410449218749989,55.995361328125],[-5.418896484374983,55.975244140625],[-5.418310546874977,55.95205078125],[-5.372900390624977,55.827685546874996],[-5.385839843749977,55.7701171875],[-5.556445312499989,55.389599609375],[-5.588769531249994,55.351416015625],[-5.618457031249989,55.3314453125],[-5.646533203124989,55.32685546875],[-5.730664062499983,55.334130859375],[-5.768212890624994,55.362646484375],[-5.767871093749989,55.394970703125],[-5.752099609374994,55.44345703125],[-5.681347656249983,55.623974609375],[-5.650634765625,55.674121093749996],[-5.605029296874989,55.720751953124996],[-5.504492187499977,55.802392578125],[-5.506933593749977,55.80771484375],[-5.573876953124994,55.79169921875],[-5.602392578124977,55.79697265625],[-5.622851562499989,55.813134765625],[-5.609570312499983,56.0552734375],[-5.555273437499977,56.1349609375],[-5.534960937499989,56.250830078125],[-5.487890624999977,56.350048828125],[-5.433398437499989,56.422314453125],[-5.391943359374977,56.514794921875],[-5.329443359374977,56.555908203125],[-5.312695312499983,56.618798828125],[-5.242578125,56.686865234375],[-5.188378906249994,56.758056640625],[-5.217578124999989,56.751025390624996],[-5.564208984375,56.565722656249996],[-5.652441406249977,56.531982421875],[-5.772802734374977,56.541015625],[-5.864843749999977,56.561865234375],[-5.936767578125,56.605712890625],[-5.968896484374994,56.689892578125],[-6.057714843749977,56.692138671875],[-6.133691406249994,56.706689453125],[-6.132763671874983,56.718017578125],[-6.034716796874989,56.763916015625],[-5.877636718749983,56.779638671875],[-5.730615234374994,56.853076171874996],[-5.861425781249977,56.902685546875],[-5.850390624999989,56.918408203125],[-5.736279296874983,56.96064453125],[-5.59130859375,57.10234375],[-5.561914062499994,57.232714843749996],[-5.63125,57.2939453125],[-5.656347656249977,57.33408203125],[-5.794921875,57.37880859375],[-5.818066406249983,57.436083984374996],[-5.801953124999983,57.468017578125],[-5.756738281249994,57.49921875],[-5.688623046874994,57.52353515625],[-5.581787109375,57.54677734375],[-5.678759765624989,57.5716796875],[-5.714941406249977,57.60107421875],[-5.742382812499983,57.64365234375],[-5.744921874999989,57.668310546875],[-5.694726562499994,57.77822265625],[-5.665478515624983,57.823535156249996],[-5.608349609374983,57.88134765625],[-5.349023437499994,57.878076171875],[-5.319189453124977,57.903613281249996],[-5.289794921875,57.904589843749996],[-5.1572265625,57.88134765625],[-5.176904296874994,57.906396484375],[-5.39375,58.043603515624994],[-5.413183593749977,58.069726562499994],[-5.351367187499989,58.143701171874994],[-5.34687,58.176660156249994],[-5.35595703125,58.2119140625],[-5.33828125,58.238720703125],[-5.26953125,58.251416015625],[-5.059960937499994,58.250146484374994],[-5.00830078125,58.262646484375],[-5.031835937499977,58.298291015625],[-5.080615234374989,58.345166015625],[-5.090136718749989,58.384521484375],[-5.078710937499977,58.419287109375],[-5.076025390624977,58.4892578125],[-5.066503906249977,58.52021484375],[-5.016748046874994,58.566552734374994],[-4.975634765624989,58.580322265625],[-4.924658203124977,58.58837890625],[-4.809619140624989,58.572900390624994],[-4.765771484374994,58.55419921875],[-4.715429687499977,58.510009765625],[-4.67822265625,58.513574218749994],[-4.534960937499989,58.561572265625],[-4.491894531249983,58.56845703125],[-4.433251953124994,58.512841796874994],[-4.188623046874994,58.5572265625],[-3.859521484374994,58.577099609375],[-3.661816406249983,58.606298828125],[-3.453564453124983,58.61689453125],[-3.259130859374977,58.65],[-3.053076171874977,58.634814453125],[-3.046191406249989,58.61552734375],[-3.056982421874977,58.588769531249994],[-3.109667968749989,58.515478515625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-7.178613281249994,55.056884765625],[-7.100634765624989,55.048291015625],[-7.03076171875,55.080615234374996],[-6.947167968749994,55.18251953125],[-6.888964843749989,55.188916015625],[-6.824853515624994,55.1806640625],[-6.698828124999977,55.19345703125],[-6.475048828124983,55.241015625],[-6.375292968749989,55.241796875],[-6.234228515624977,55.216845703124996],[-6.129150390625,55.2173828125],[-6.035791015624994,55.14453125],[-5.985742187499994,55.0296875],[-5.869189453124989,54.9162109375],[-5.716845703124989,54.81748046875],[-5.710742187499989,54.757080078125],[-5.765185546874989,54.724658203124996],[-5.879101562499983,54.684375],[-5.878613281249983,54.64130859375],[-5.803466796875,54.663037109375],[-5.738623046874977,54.673046875],[-5.58251953125,54.663427734375],[-5.527929687499977,54.61962890625],[-5.490185546874983,54.554052734375],[-5.470410156249983,54.5001953125],[-5.48388671875,54.441650390625],[-5.52587890625,54.460205078125],[-5.568554687499983,54.51259765625],[-5.615966796875,54.53671875],[-5.671093749999983,54.549755859375],[-5.646093749999977,54.477880859375],[-5.655957031249983,54.38173828125],[-5.631884765624989,54.37265625],[-5.557812499999983,54.37099609375],[-5.606787109374977,54.27255859375],[-5.708056640624989,54.245849609375],[-5.826171875,54.23583984375],[-5.854638671874994,54.200976562499996],[-5.876074218749977,54.156054687499996],[-5.937744140625,54.0890625],[-6.01904296875,54.05126953125],[-6.11953125,54.058886718749996],[-6.218017578125,54.088720703125],[-6.175732421874983,54.053515625],[-6.156933593749983,54.017236328125],[-6.230664062499983,54.00361328125],[-6.3076171875,54.011035156249996],[-6.345166015624983,53.98720703125],[-6.347607421874983,53.94130859375],[-6.321582031249989,53.882177734375],[-6.270117187499977,53.840234375],[-6.22900390625,53.745703125],[-6.194873046874989,53.640869140625],[-6.141845703125,53.5775390625],[-6.130957031249977,53.49892578125],[-6.138769531249977,53.460302734375],[-6.129101562499983,53.390869140625],[-6.151660156249989,53.36640625],[-6.134716796874983,53.301220703125],[-6.072265625,53.166308593749996],[-6.045019531249977,53.091162109375],[-6.027392578124989,52.927099609375],[-6.071484374999983,52.865625],[-6.130664062499989,52.807275390625],[-6.169335937499994,52.738134765625],[-6.19921875,52.6634765625],[-6.217236328124983,52.543115234375],[-6.345410156249983,52.402001953125],[-6.399951171874989,52.366943359375],[-6.463183593749989,52.345361328125],[-6.325,52.2466796875],[-6.437939453124983,52.202685546874996],[-6.561083984374989,52.188818359375],[-6.697314453124989,52.213525390625],[-6.7822265625,52.210498046874996],[-6.859716796874977,52.178564453125],[-6.890234374999977,52.159228515624996],[-6.914648437499977,52.1685546875],[-6.965771484374983,52.24951171875],[-7.003271484374977,52.16591796875],[-7.081787109375,52.139306640625],[-7.216210937499994,52.144970703125],[-7.440869140624983,52.122705078125],[-7.527294921874983,52.098876953125],[-7.563183593749983,52.06162109375],[-7.58984375,52.0185546875],[-7.624902343749994,51.993115234375],[-7.66455078125,51.979736328125],[-7.837988281249977,51.947998046875],[-7.872167968749977,51.935302734375],[-7.952490234374977,51.865771484374996],[-8.057812499999983,51.8255859375],[-8.14501953125,51.813525390624996],[-8.222460937499989,51.85400390625],[-8.254296875,51.8783203125],[-8.290234374999983,51.890673828124996],[-8.4091796875,51.88876953125],[-8.371630859374989,51.876269531249996],[-8.347363281249983,51.847705078124996],[-8.335595703124994,51.79296875],[-8.34912109375,51.739306640624996],[-8.407812499999977,51.712060546875],[-8.477832031249989,51.70703125],[-8.58828125,51.6513671875],[-8.734472656249977,51.636181640625],[-8.813427734374983,51.584912109375],[-9.296484374999977,51.4982421875],[-9.323876953124994,51.497216796874994],[-9.390576171874983,51.519287109375],[-9.462890625,51.529052734375],[-9.534863281249983,51.52216796875],[-9.7373046875,51.47373046875],[-9.835351562499994,51.483349609375],[-9.710351562499994,51.6037109375],[-9.542382812499994,51.664453125],[-9.52490234375,51.681103515625],[-9.579833984375,51.689257812499996],[-9.899023437499977,51.6470703125],[-10.009912109374994,51.611132812499996],[-10.120751953124994,51.60068359375],[-10.069433593749977,51.655566406249996],[-9.926416015624994,51.730712890625],[-9.849707031249977,51.76611328125],[-9.802880859374994,51.780126953125],[-9.74951171875,51.824267578124996],[-9.598828124999983,51.8744140625],[-10.084228515625,51.77099609375],[-10.211718749999989,51.78359375],[-10.241748046874989,51.812451171875],[-10.341064453125,51.79892578125],[-10.378710937499989,51.86875],[-10.231591796874994,51.97451171875],[-10.145849609374977,52.02001953125],[-10.044042968749977,52.044580078125],[-9.946044921875,52.079833984375],[-9.90966796875,52.12294921875],[-9.955810546875,52.136669921875],[-10.24951171875,52.125732421875],[-10.390234374999977,52.134912109375],[-10.382617187499989,52.169091796875],[-10.356689453125,52.20693359375],[-10.2109375,52.2716796875],[-10.132080078125,52.282080078125],[-10.061767578125,52.275927734374996],[-9.993115234374983,52.259326171874996],[-9.937304687499989,52.237646484375],[-9.772119140624994,52.25009765625],[-9.841064453125,52.291455078125],[-9.853222656249983,52.37548828125],[-9.906054687499989,52.4037109375],[-9.838476562499977,52.442675781249996],[-9.761132812499994,52.466357421874996],[-9.632226562499994,52.546923828124996],[-9.586328125,52.5591796875],[-9.33125,52.578759765625],[-9.05615234375,52.621142578124996],[-8.783447265625,52.679638671875],[-8.923291015624983,52.7123046875],[-8.990283203124989,52.755419921874996],[-9.097900390625,52.668261718749996],[-9.175390624999977,52.634912109375],[-9.394238281249983,52.61708984375],[-9.463476562499977,52.626904296875],[-9.56103515625,52.653955078125],[-9.591357421874989,52.64365234375],[-9.61953125,52.62275390625],[-9.764355468749983,52.57998046875],[-9.916601562499977,52.5697265625],[-9.739599609374977,52.648193359375],[-9.514990234374977,52.78115234375],[-9.464892578124989,52.823193359375],[-9.393652343749977,52.896240234375],[-9.415722656249983,52.928759765624996],[-9.461962890624989,52.947265625],[-9.29921875,53.09755859375],[-9.241894531249983,53.124853515625],[-9.137597656249994,53.129248046875],[-9.061132812499977,53.153076171875],[-9.027441406249977,53.153173828125],[-8.997167968749977,53.162060546875],[-8.930126953124983,53.207080078124996],[-9.033544921874977,53.2357421875],[-9.140332031249983,53.25048828125],[-9.470751953124989,53.23486328125],[-9.514208984374989,53.238232421875],[-9.55517578125,53.25205078125],[-9.581738281249983,53.27197265625],[-9.601757812499983,53.323046875],[-9.6259765625,53.33447265625],[-9.700585937499994,53.33447265625],[-9.774072265624994,53.31884765625],[-9.825390624999983,53.320361328124996],[-9.875781249999989,53.342724609375],[-9.79541015625,53.394970703125],[-9.899023437499977,53.407275390624996],[-10.00390625,53.397021484374996],[-10.091259765624983,53.412841796875],[-10.093994140625,53.445605468749996],[-10.054394531249983,53.478320312499996],[-10.10625,53.509326171874996],[-10.116992187499989,53.54853515625],[-10.061718749999983,53.567822265625],[-10.001367187499994,53.56142578125],[-9.878271484374977,53.5904296875],[-9.720654296874983,53.6044921875],[-9.855859375,53.633105468749996],[-9.909716796874989,53.6576171875],[-9.912304687499983,53.695117187499996],[-9.901611328125,53.727197265625],[-9.745068359374983,53.781494140625],[-9.578222656249977,53.805419921875],[-9.590527343749983,53.841162109375],[-9.578857421875,53.879833984375],[-9.747509765624983,53.891015625],[-9.9140625,53.863720703125],[-9.896240234375,53.93759765625],[-9.856347656249994,54.004296875],[-9.848486328124977,54.048291015625],[-9.8564453125,54.095361328125],[-9.934472656249994,54.075244140624996],[-9.943603515625,54.1416015625],[-9.977099609374989,54.187109375],[-10.092675781249994,54.15576171875],[-10.089697265624977,54.2158203125],[-10.056396484375,54.2578125],[-9.995947265624977,54.276025390625],[-9.9359375,54.268115234374996],[-9.824560546874977,54.268896484375],[-9.717138671874977,54.300439453125],[-9.562304687499989,54.308544921875],[-9.315527343749977,54.298632812499996],[-9.145898437499994,54.209619140625],[-9.102099609374989,54.225537109375],[-9.034277343749977,54.281787109374996],[-9.00244140625,54.28798828125],[-8.746777343749983,54.263476562499996],[-8.588037109374994,54.231103515625],[-8.545556640624994,54.2412109375],[-8.568457031249977,54.30361328125],[-8.623144531249977,54.346875],[-8.554443359375,54.403564453125],[-8.470996093749989,54.441943359374996],[-8.415234374999983,54.461083984375],[-8.286523437499994,54.48486328125],[-8.230371093749994,54.507275390625],[-8.192968749999977,54.580126953124996],[-8.133447265624994,54.6408203125],[-8.45654296875,54.60927734375],[-8.763916015625,54.681201171874996],[-8.715185546874977,54.73203125],[-8.650292968749994,54.760888671875],[-8.538281249999983,54.782958984375],[-8.527685546874977,54.80947265625],[-8.470996093749989,54.83154296875],[-8.377294921874977,54.889453125],[-8.411718749999977,54.965087890625],[-8.393261718749983,55.02041015625],[-8.325781249999977,55.056445312499996],[-8.3046875,55.108203125],[-8.274609374999983,55.146289062499996],[-8.1376953125,55.159912109375],[-8.006103515625,55.1953125],[-7.958593749999977,55.19189453125],[-7.803173828124983,55.200048828125],[-7.750537109374989,55.185791015625],[-7.762548828124977,55.248339843749996],[-7.667089843749977,55.256494140625],[-7.629785156249994,55.243994140625],[-7.613378906249977,55.199658203125],[-7.570019531249983,55.17138671875],[-7.556640625,55.122216796875],[-7.585693359375,55.084228515625],[-7.63427734375,55.054980468749996],[-7.58984375,55.025048828125],[-7.658740234374989,54.970947265625],[-7.584375,54.993994140625],[-7.478417968749994,55.04697265625],[-7.483935546874989,55.090283203125],[-7.501953125,55.1447265625],[-7.531445312499983,55.19384765625],[-7.517871093749989,55.24794921875],[-7.458300781249989,55.281787109374996],[-7.3017578125,55.298779296875],[-7.365966796875,55.360205078125],[-7.308789062499983,55.3658203125],[-7.246679687499977,55.35302734375],[-7.155322265624989,55.30517578125],[-7.060253906249983,55.267626953124996],[-6.961669921875,55.237890625],[-7.056396484375,55.1783203125],[-7.1728515625,55.137011718749996],[-7.218652343749994,55.0919921875],[-7.178613281249994,55.056884765625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-179.79853515625,68.9404296875],[-179.59541015625,68.906494140625],[-179.514501953125,68.917138671875],[-179.470849609375,68.91240234375],[-179.35595703125,68.852978515625],[-179.279296875,68.8251953125],[-178.873876953125,68.7541015625],[-178.689306640625,68.675146484375],[-178.538525390625,68.58564453125],[-178.613671875,68.603076171875],[-178.75146484375,68.66044921875],[-178.7365234375,68.593017578125],[-178.692626953125,68.54599609375],[-178.47392578125,68.5017578125],[-178.244482421875,68.466650390625],[-178.0974609375,68.4248046875],[-178.048681640625,68.388427734375],[-178.018701171875,68.32275390625],[-178.055810546875,68.264892578125],[-177.922412109375,68.2865234375],[-177.79677734375,68.33798828125],[-177.86181640625,68.37822265625],[-178.284521484375,68.5185546875],[-178.373046875,68.565673828125],[-178.249853515625,68.54140625],[-177.683203125,68.36279296875],[-177.52724609375,68.294384765625],[-177.593212890625,68.28115234375],[-177.63935546875,68.2412109375],[-177.589208984375,68.22421875],[-177.5208984375,68.236865234375],[-177.40751953125,68.245166015625],[-177.297412109375,68.222509765625],[-177.171826171875,68.174658203125],[-176.907275390625,68.119140625],[-175.34521484375,67.678076171875],[-175.30986328125,67.60205078125],[-175.26591796875,67.56650390625],[-175.23955078125,67.52109375],[-175.23251953125,67.4466796875],[-175.37470703125,67.357373046875],[-175.155078125,67.365380859375],[-175.122802734375,67.376953125],[-175.065625,67.413427734375],[-175.002685546875,67.4375],[-174.91806640625,67.407568359375],[-174.849853515625,67.348876953125],[-174.869921875,67.268505859375],[-174.930419921875,67.203466796875],[-174.938134765625,67.093017578125],[-174.88505859375,67.000244140625],[-174.8287109375,66.961376953125],[-174.783642578125,66.916796875],[-174.77119140625,66.784326171875],[-174.8701171875,66.72490234375],[-174.92490234375,66.62314453125],[-174.8642578125,66.613134765625],[-174.674658203125,66.60341796875],[-174.612451171875,66.585400390625],[-174.503759765625,66.537939453125],[-174.477734375,66.4921875],[-174.453759765625,66.4298828125],[-174.418701171875,66.37197265625],[-174.394091796875,66.34423828125],[-174.366064453125,66.34833984375],[-174.256982421875,66.428466796875],[-174.206005859375,66.45234375],[-174.084765625,66.473095703125],[-174.017724609375,66.38251953125],[-174.0650390625,66.22958984375],[-174.025439453125,66.2296875],[-173.994482421875,66.24580078125],[-173.95546875,66.286767578125],[-173.899951171875,66.310498046875],[-173.83203125,66.366064453125],[-173.773974609375,66.43466796875],[-173.842529296875,66.48828125],[-173.920947265625,66.52177734375],[-174.10185546875,66.540625],[-174.196337890625,66.580712890625],[-174.231591796875,66.631884765625],[-174.139599609375,66.65263671875],[-174.060595703125,66.689794921875],[-174.005517578125,66.77861328125],[-174.01884765625,66.827392578125],[-174.041015625,66.87548828125],[-174.08642578125,66.94287109375],[-174.154345703125,66.98203125],[-174.283544921875,67.0015625],[-174.341845703125,67.03974609375],[-174.430908203125,67.037646484375],[-174.5189453125,67.049072265625],[-174.5544921875,67.063037109375],[-174.55009765625,67.090625],[-174.447607421875,67.103125],[-173.884033203125,67.1064453125],[-173.6796875,67.144775390625],[-173.586572265625,67.132763671875],[-173.493994140625,67.10517578125],[-173.1578125,67.069091796875],[-173.167626953125,67.05224609375],[-173.224169921875,67.035107421875],[-173.32353515625,66.954833984375],[-173.34306640625,66.909228515625],[-173.34736328125,66.8513671875],[-173.258935546875,66.840087890625],[-173.175390625,66.864599609375],[-173.216162109375,66.91123046875],[-173.228271484375,66.9685546875],[-173.193017578125,66.993603515625],[-173.146826171875,66.998974609375],[-173.05849609375,66.955859375],[-172.96259765625,66.942138671875],[-172.640576171875,66.925],[-172.549365234375,66.930517578125],[-172.5201171875,66.952490234375],[-172.582958984375,66.97783203125],[-173.001904296875,67.033984375],[-173.00751953125,67.064892578125],[-172.621044921875,67.026806640625],[-172.447314453125,66.991748046875],[-172.27392578125,66.965576171875],[-172.031494140625,66.973291015625],[-171.795556640625,66.93173828125],[-171.569580078125,66.818701171875],[-171.360498046875,66.6767578125],[-171.149267578125,66.592724609375],[-170.92666015625,66.529736328125],[-170.5556640625,66.3572265625],[-170.509521484375,66.34365234375],[-170.473095703125,66.320263671875],[-170.542822265625,66.291064453125],[-170.604443359375,66.24892578125],[-170.48330078125,66.278076171875],[-170.3611328125,66.297900390625],[-170.301220703125,66.29404296875],[-170.24697265625,66.271875],[-170.21162109375,66.23642578125],[-170.191943359375,66.20126953125],[-170.2439453125,66.169287109375],[-169.888818359375,66.1634765625],[-169.777880859375,66.143115234375],[-169.729150390625,66.05810546875],[-169.831689453125,65.99892578125],[-169.89169921875,66.006103515625],[-169.94931640625,66.031005859375],[-170.00380859375,66.03349609375],[-170.159423828125,66.008056640625],[-170.401025390625,65.928515625],[-170.540673828125,65.8654296875],[-170.563037109375,65.823583984375],[-170.54140625,65.71025390625],[-170.560986328125,65.65625],[-170.66630859375,65.621533203125],[-170.896875,65.642626953125],[-171.00146484375,65.664892578125],[-171.118994140625,65.69501953125],[-171.23203125,65.736865234375],[-171.37685546875,65.803955078125],[-171.421533203125,65.8103515625],[-171.451171875,65.79423828125],[-171.401708984375,65.7517578125],[-171.30322265625,65.698486328125],[-171.134423828125,65.628076171875],[-171.054248046875,65.549951171875],[-171.105859375,65.51103515625],[-171.169970703125,65.502099609375],[-171.216015625,65.502783203125],[-171.36376953125,65.527197265625],[-171.466259765625,65.53310546875],[-171.790380859375,65.51044921875],[-171.90712890625,65.495947265625],[-171.94716796875,65.507958984375],[-171.957177734375,65.54208984375],[-172.131494140625,65.566943359375],[-172.23388671875,65.570458984375],[-172.282275390625,65.58232421875],[-172.322265625,65.617529296875],[-172.435693359375,65.66962890625],[-172.60771484375,65.6900390625],[-172.719189453125,65.692431640625],[-172.78330078125,65.6810546875],[-172.55654296875,65.61201171875],[-172.353955078125,65.49599609375],[-172.3919921875,65.474560546875],[-172.4177734375,65.449560546875],[-172.305712890625,65.447802734375],[-172.2328125,65.455712890625],[-172.211572265625,65.4251953125],[-172.269873046875,65.302734375],[-172.30927734375,65.275634765625],[-172.6619140625,65.24853515625],[-172.57314453125,65.22822265625],[-172.482080078125,65.221875],[-172.3787109375,65.226708984375],[-172.28603515625,65.205712890625],[-172.223681640625,65.1287109375],[-172.21318359375,65.04814453125],[-172.304345703125,65.0021484375],[-172.39873046875,64.96474609375],[-172.592822265625,64.907958984375],[-172.79248046875,64.88291015625],[-172.89736328125,64.889208984375],[-172.99912109375,64.876611328125],[-173.0662109375,64.84716796875],[-173.085791015625,64.817333984375],[-172.998046875,64.837109375],[-172.896875,64.82607421875],[-172.80107421875,64.79052734375],[-172.811572265625,64.761181640625],[-172.902587890625,64.72919921875],[-172.9240234375,64.704931640625],[-172.8890625,64.664013671875],[-172.90087890625,64.628857421875],[-172.854150390625,64.609912109375],[-172.74687,64.603271484375],[-172.61611328125,64.577880859375],[-172.48740234375,64.544189453125],[-172.43662109375,64.51533203125],[-172.39384765625,64.474658203125],[-172.378759765625,64.43154296875],[-172.40146484375,64.413916015625],[-172.694677734375,64.407080078125],[-172.73916015625,64.412255859375],[-172.75595703125,64.4599609375],[-172.79150390625,64.49892578125],[-172.903173828125,64.52607421875],[-172.9490234375,64.507373046875],[-172.915869140625,64.36943359375],[-172.96005859375,64.327685546875],[-173.009130859375,64.2974609375],[-173.157421875,64.279736328125],[-173.27548828125,64.2896484375],[-173.37568359375,64.3548828125],[-173.375537109375,64.410400390625],[-173.309228515625,64.44267578125],[-173.309326171875,64.487451171875],[-173.327490234375,64.53955078125],[-173.395654296875,64.47900390625],[-173.474951171875,64.42861328125],[-173.60361328125,64.365478515625],[-173.665966796875,64.35732421875],[-173.729736328125,64.364501953125],[-173.8978515625,64.409716796875],[-174.0013671875,64.448974609375],[-174.204833984375,64.577783203125],[-174.318017578125,64.637646484375],[-174.570556640625,64.7177734375],[-174.83046875,64.7759765625],[-175.03603515625,64.813671875],[-175.145849609375,64.80927734375],[-175.255908203125,64.793994140625],[-175.3951171875,64.802392578125],[-175.442138671875,64.81669921875],[-175.483203125,64.848583984375],[-175.520654296875,64.86708984375],[-175.715869140625,64.94609375],[-175.853857421875,65.01083984375],[-175.85947265625,65.05419921875],[-175.830224609375,65.105517578125],[-175.85615234375,65.2328125],[-175.92294921875,65.352490234375],[-176.09326171875,65.471044921875],[-176.5474609375,65.54755859375],[-176.922119140625,65.6013671875],[-177.05625,65.613623046875],[-177.175244140625,65.60166015625],[-177.48876953125,65.5037109375],[-177.6986328125,65.489697265625],[-178.310205078125,65.48486328125],[-178.4125,65.495556640625],[-178.504638671875,65.53720703125],[-178.525927734375,65.593017578125],[-178.49931640625,65.696630859375],[-178.50234375,65.7404296875],[-178.526220703125,65.755224609375],[-178.558544921875,65.75400390625],[-178.679150390625,65.795361328125],[-178.791064453125,65.86474609375],[-178.879345703125,65.936474609375],[-178.9390625,66.032763671875],[-178.858251953125,66.037548828125],[-178.746728515625,66.013671875],[-178.73056640625,66.037255859375],[-178.693798828125,66.12421875],[-178.616259765625,66.166015625],[-178.5865234375,66.1984375],[-178.534130859375,66.316552734375],[-178.5265625,66.4015625],[-178.615771484375,66.35517578125],[-178.752783203125,66.237255859375],[-178.820849609375,66.202685546875],[-178.868115234375,66.187060546875],[-178.91552734375,66.179931640625],[-179.026123046875,66.203515625],[-179.105078125,66.23193359375],[-179.106884765625,66.34609375],[-179.143408203125,66.375048828125],[-179.178369140625,66.3533203125],[-179.19267578125,66.312548828125],[-179.2931640625,66.305078125],[-179.34013671875,66.2875],[-179.3162109375,66.21982421875],[-179.327197265625,66.16259765625],[-179.42265625,66.141064453125],[-179.616162109375,66.127880859375],[-179.68330078125,66.184130859375],[-179.740869140625,66.10576171875],[-179.783642578125,66.01796875],[-179.789697265625,65.90087890625],[-179.7283203125,65.80380859375],[-179.640625,65.757568359375],[-179.449072265625,65.687841796875],[-179.365966796875,65.638623046875],[-179.344384765625,65.575244140625],[-179.352099609375,65.516748046875],[-179.45166015625,65.4453125],[-179.5193359375,65.386279296875],[-179.63515625,65.244140625],[-179.70458984375,65.18720703125],[-180,65.067236328125],[-180,65.26171875],[-180,65.311962890625],[-180,65.556787109375],[-180,65.8015625],[-180,66.0462890625],[-180,66.291064453125],[-180,66.53583984375],[-180,66.78056640625],[-180,67.025341796875],[-180,67.2701171875],[-180,67.51484375],[-180,67.759619140625],[-180,68.00439453125],[-180,68.24912109375],[-180,68.493896484375],[-180,68.738671875],[-179.999951171875,68.983447265625],[-179.79853515625,68.9404296875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-15.543115234374994,66.228515625],[-15.428466796875,66.2248046875],[-15.240917968749983,66.259130859375],[-15.162402343749989,66.281689453125],[-14.969970703125,66.359716796875],[-14.856103515624994,66.3814453125],[-14.6806640625,66.376123046875],[-14.595849609374994,66.38154296875],[-14.593896484374994,66.373974609375],[-14.70166015625,66.34228515625],[-14.788232421874994,66.3314453125],[-14.912207031249977,66.28427734375],[-15.029980468749983,66.177880859375],[-15.117382812499983,66.125634765625],[-15.116406249999983,66.10244140625],[-15.010302734374989,66.061279296875],[-14.89404296875,66.037890625],[-14.787158203124989,66.05908203125],[-14.740429687499983,66.050830078125],[-14.698193359374983,66.02021484375],[-14.674365234374989,65.989892578125],[-14.668994140624989,65.95986328125],[-14.688232421875,65.89697265625],[-14.752539062499977,65.8337890625],[-14.839306640624983,65.780908203125],[-14.827099609374983,65.7642578125],[-14.757519531249983,65.7556640625],[-14.426220703124983,65.78994140625],[-14.391845703125,65.78740234375],[-14.372802734375,65.770361328125],[-14.369091796874983,65.738720703125],[-14.350878906249989,65.710107421875],[-14.318164062499989,65.68447265625],[-14.328369140625,65.658251953125],[-14.473388671875,65.575341796875],[-14.302294921874989,65.6275390625],[-14.166943359374983,65.64228515625],[-13.935449218749994,65.616064453125],[-13.840722656249994,65.5859375],[-13.785253906249977,65.5330078125],[-13.705126953124989,65.550537109375],[-13.6703125,65.54951171875],[-13.617871093749983,65.5193359375],[-13.616015624999989,65.487158203125],[-13.654443359374994,65.44130859375],[-13.667773437499989,65.398974609375],[-13.7080078125,65.381591796875],[-13.783251953124989,65.368994140625],[-13.804785156249977,65.35478515625],[-13.771630859374994,65.322509765625],[-13.722851562499983,65.290966796875],[-13.653466796874994,65.289501953125],[-13.64111328125,65.275],[-13.639550781249994,65.257470703125],[-13.64892578125,65.236962890625],[-13.671582031249983,65.2228515625],[-13.707421875,65.21513671875],[-13.7548828125,65.192529296875],[-13.580810546875,65.143017578125],[-13.55859375,65.124658203125],[-13.556103515624983,65.09765625],[-13.569677734374977,65.068115234375],[-13.599316406249983,65.0359375],[-13.65185546875,65.016845703125],[-13.777246093749994,65.013720703125],[-13.85400390625,64.99287109375],[-13.827832031249983,64.9580078125],[-13.829833984375,64.914013671875],[-13.852929687499994,64.862158203125],[-13.95166015625,64.783642578125],[-14.04443359375,64.74189453125],[-14.13515625,64.714794921875],[-14.296972656249977,64.724365234375],[-14.385107421874977,64.74521484375],[-14.375292968749989,64.67744140625],[-14.465380859374989,64.635693359375],[-14.448339843749977,64.600830078125],[-14.4169921875,64.58310546875],[-14.432568359374983,64.538330078125],[-14.475390624999989,64.493994140625],[-14.547070312499983,64.445947265625],[-14.628222656249989,64.415966796875],[-14.78955078125,64.379833984375],[-14.927392578124994,64.319677734375],[-15.021582031249977,64.2958984375],[-15.255859375,64.296923828125],[-15.494970703124977,64.258203125],[-15.832910156249994,64.17666015625],[-16.060449218749994,64.11123046875],[-16.236035156249983,64.03720703125],[-16.46806640624999,63.916357421875],[-16.640332031249983,63.865478515625],[-16.739697265624983,63.8517578125],[-16.933056640624983,63.84091796875],[-17.095117187499994,63.80810546875],[-17.633447265624994,63.74658203125],[-17.81572265624999,63.71298828125],[-17.839257812499994,63.682373046875],[-17.91484374999999,63.636376953124994],[-17.919580078124994,63.6197265625],[-17.886376953124994,63.606884765625],[-17.880273437499994,63.590185546875],[-17.946923828124994,63.5357421875],[-18.080029296874983,63.496337890625],[-18.142919921874977,63.496972656249994],[-18.21904296874999,63.530859375],[-18.252197265625,63.5296875],[-18.265234374999977,63.52451171875],[-18.266015625,63.5138671875],[-18.222265624999977,63.473193359375],[-18.302832031249977,63.454248046874994],[-18.65361328124999,63.406689453125],[-19.250195312499983,63.4419921875],[-19.486572265625,63.478515625],[-19.778271484374983,63.536572265625],[-19.95195312499999,63.55205078125],[-20.198144531249994,63.555810546874994],[-20.40043945312499,63.637109375],[-20.494042968749994,63.687353515625],[-20.501562499999977,63.708203125],[-20.49101562499999,63.731982421875],[-20.469970703125,63.748193359374994],[-20.4384765625,63.756982421874994],[-20.371728515624994,63.757861328125],[-20.363037109375,63.76494140625],[-20.413964843749994,63.80517578125],[-20.46269531249999,63.792138671874994],[-20.592968749999983,63.7353515625],[-20.65092773437499,63.73740234375],[-20.72705078125,63.765771484374994],[-20.729931640624983,63.793359375],[-20.878759765624977,63.80390625],[-21.00810546874999,63.83837890625],[-21.136572265624977,63.887939453125],[-21.15576171875,63.9068359375],[-21.09404296874999,63.934423828125],[-21.10595703125,63.93984375],[-21.15239257812499,63.94453125],[-21.246240234374994,63.935449218749994],[-21.387597656249994,63.872802734375],[-21.448632812499994,63.8583984375],[-22.37255859375,63.84375],[-22.606884765624983,63.837255859375],[-22.652197265624977,63.827734375],[-22.693017578124994,63.868505859375],[-22.729394531249994,63.95947265625],[-22.74296874999999,64.019384765625],[-22.733642578125,64.048388671875],[-22.701171875,64.083203125],[-22.65092773437499,64.077294921875],[-22.60307617187499,64.049609375],[-22.559814453125,64.0103515625],[-22.51005859374999,63.991455078125],[-22.187597656249977,64.039208984375],[-22.056640625,64.071337890625],[-22.0009765625,64.10185546875],[-21.935449218749994,64.153759765625],[-21.865917968749983,64.180322265625],[-21.832763671875,64.205419921875],[-21.767578125,64.28486328125],[-21.722558593749994,64.32177734375],[-21.668652343749983,64.3490234375],[-21.60600585937499,64.3666015625],[-21.463330078124983,64.379150390625],[-21.55717773437499,64.3978515625],[-21.646679687499983,64.3978515625],[-21.95122070312499,64.313916015625],[-22.053369140624994,64.313916015625],[-22.049072265625,64.327001953125],[-22.006005859374994,64.35068359375],[-21.901269531249994,64.3916015625],[-21.97319335937499,64.394677734375],[-22.000683593749983,64.41318359375],[-22.003808593749994,64.452197265625],[-21.950341796874994,64.514990234375],[-21.702392578125,64.597802734375],[-21.616650390624983,64.610009765625],[-21.59062,64.6263671875],[-21.623144531249977,64.63974609375],[-21.674951171874994,64.647705078125],[-21.924414062499977,64.562548828125],[-22.10600585937499,64.533056640625],[-22.15996093749999,64.538818359375],[-22.25390625,64.571875],[-22.2841796875,64.586572265625],[-22.32470703125,64.6244140625],[-22.32011718749999,64.647216796875],[-22.233593749999983,64.71396484375],[-22.24755859375,64.726904296875],[-22.30703125,64.73349609375],[-22.467041015625,64.794970703125],[-22.720312499999977,64.788818359375],[-23.34697265624999,64.824365234375],[-23.476464843749994,64.80927734375],[-23.68994140625,64.75654296875],[-23.818994140624994,64.73916015625],[-23.878564453124994,64.750634765625],[-23.932763671874994,64.778515625],[-23.98198242187499,64.81611328125],[-24.02617187499999,64.863427734375],[-24.007031249999983,64.896435546875],[-23.924414062499977,64.915234375],[-23.86381835937499,64.924169921875],[-23.693212890624977,64.912744140625],[-23.485302734374983,64.945849609375],[-23.352685546874994,64.952783203125],[-23.314599609374994,64.9580078125],[-23.236523437499983,64.99326171875],[-23.197998046875,65.0021484375],[-23.137890624999983,64.989794921875],[-23.108837890624983,64.965869140625],[-22.899511718749977,65.00302734375],[-22.82768554687499,65.0216796875],[-22.819580078125,65.03310546875],[-22.7880859375,65.046484375],[-22.683984375,65.0263671875],[-22.599707031249977,65.025732421875],[-22.494482421874977,65.03955078125],[-22.308447265624977,65.045654296875],[-21.89213867187499,65.048779296875],[-21.829785156249983,65.0791015625],[-21.800439453124994,65.105908203125],[-21.76372070312499,65.17373046875],[-21.779980468749983,65.1876953125],[-22.039990234374983,65.125244140625],[-22.099316406249983,65.126220703125],[-22.400292968749994,65.159326171875],[-22.50908203124999,65.19677734375],[-22.47343749999999,65.22685546875],[-22.31396484375,65.2916015625],[-22.149316406249994,65.3435546875],[-21.906982421875,65.39970703125],[-21.850244140624994,65.421533203125],[-21.844384765624994,65.44736328125],[-22.005761718749994,65.49345703125],[-22.311474609374983,65.480712890625],[-22.38969726562499,65.535400390625],[-22.64360351562499,65.5677734375],[-22.812646484374994,65.547412109375],[-22.902490234374994,65.58046875],[-23.1220703125,65.534765625],[-23.60454101562499,65.468603515625],[-23.796484374999977,65.42275390625],[-23.89990234375,65.407568359375],[-24.018994140624983,65.44501953125],[-24.223974609374977,65.48720703125],[-24.454785156249983,65.500341796875],[-24.475683593749977,65.5251953125],[-24.341064453125,65.601220703125],[-24.248925781249994,65.614990234375],[-24.156103515624977,65.6080078125],[-23.97900390625,65.55498046875],[-23.85673828124999,65.53837890625],[-24.010009765625,65.6162109375],[-24.006005859374994,65.646142578125],[-24.017578125,65.69091796875],[-24.065039062499977,65.71015625],[-24.111914062499977,65.759716796875],[-24.092626953124977,65.77646484375],[-24.032421874999983,65.78232421875],[-23.909082031249994,65.765576171875],[-23.615917968749983,65.67958984375],[-23.47197265624999,65.69482421875],[-23.39296875,65.726513671875],[-23.285351562499983,65.75],[-23.31591796875,65.762255859375],[-23.569287109374983,65.763720703125],[-23.704736328124994,65.781201171875],[-23.77324218749999,65.80634765625],[-23.832617187499977,65.84921875],[-23.811718749999983,65.868896484375],[-23.741308593749977,65.8845703125],[-23.52495117187499,65.880029296875],[-23.66748046875,65.954296875],[-23.766552734374983,65.99697265625],[-23.77734375,66.017578125],[-23.77055664062499,66.04345703125],[-23.75712890624999,66.060791015625],[-23.737158203124977,66.06943359375],[-23.488867187499977,66.02607421875],[-23.434472656249994,66.02421875],[-23.48466796874999,66.05224609375],[-23.59355468749999,66.093408203125],[-23.598535156249994,66.108837890625],[-23.552636718749994,66.12158203125],[-23.529980468749983,66.14501953125],[-23.527929687499977,66.164404296875],[-23.452539062499994,66.181005859375],[-23.376562499999977,66.18173828125],[-23.3,66.1666015625],[-23.06254882812499,66.08623046875],[-23.028515624999983,66.063671875],[-23.017285156249983,66.033935546875],[-23.028906249999977,65.9970703125],[-23.018994140624983,65.98212890625],[-22.926220703124983,65.99482421875],[-22.852246093749983,65.979296875],[-22.815332031249994,65.98349609375],[-22.723339843749983,66.039013671875],[-22.659863281249983,66.025927734375],[-22.62158203125,65.999951171875],[-22.609716796874977,65.97646484375],[-22.60405273437499,65.944189453125],[-22.620214843749977,65.876953125],[-22.61601562499999,65.86748046875],[-22.55156249999999,65.905419921875],[-22.44169921874999,65.90830078125],[-22.42753906249999,65.927392578125],[-22.42421875,65.998095703125],[-22.43315429687499,66.057666015625],[-22.4453125,66.07001953125],[-22.80644531249999,66.152587890625],[-22.869238281249977,66.1720703125],[-22.947900390624994,66.212744140625],[-22.931982421874977,66.233203125],[-22.86162109374999,66.25146484375],[-22.755517578124994,66.258740234375],[-22.50937,66.257763671875],[-22.48442382812499,66.26630859375],[-22.532128906249994,66.287744140625],[-22.646093749999977,66.3015625],[-22.672753906249994,66.313916015625],[-22.686230468749983,66.3376953125],[-22.82133789062499,66.32470703125],[-22.972021484374977,66.324169921875],[-23.116943359375,66.338720703125],[-23.11992187499999,66.3572265625],[-23.062695312499983,66.384375],[-22.9443359375,66.429443359375],[-22.88920898437499,66.440625],[-22.723730468749977,66.432763671875],[-22.559326171875,66.44541015625],[-22.426123046874977,66.430126953125],[-22.320458984374994,66.385498046875],[-22.17021484374999,66.30712890625],[-21.966992187499983,66.256982421875],[-21.948388671874994,66.241259765625],[-21.840234375,66.2001953125],[-21.62529296874999,66.089697265625],[-21.406884765624994,66.0255859375],[-21.39677734374999,66.00927734375],[-21.432714843749977,65.990087890625],[-21.51665039062499,65.967578125],[-21.497460937499994,65.955078125],[-21.387792968749977,65.93876953125],[-21.308789062499983,65.8953125],[-21.303466796875,65.87646484375],[-21.374902343749994,65.74189453125],[-21.412841796875,65.713330078125],[-21.456640624999977,65.6982421875],[-21.658447265625,65.723583984375],[-21.6103515625,65.68076171875],[-21.466259765624983,65.63515625],[-21.43364257812499,65.60966796875],[-21.45512695312499,65.58466796875],[-21.439404296874983,65.57890625],[-21.386621093749994,65.592431640625],[-21.36474609375,65.57822265625],[-21.373876953124977,65.536376953125],[-21.396337890624977,65.50166015625],[-21.43217773437499,65.474072265625],[-21.421875,65.462158203125],[-21.365478515625,65.4658203125],[-21.31254882812499,65.45869140625],[-21.22998046875,65.42060546875],[-21.162988281249994,65.304248046875],[-21.12968749999999,65.2666015625],[-21.105712890625,65.3],[-21.075585937499994,65.3849609375],[-21.047314453124983,65.428369140625],[-21.020849609374977,65.4302734375],[-20.997998046874983,65.44453125],[-20.978857421874977,65.47119140625],[-20.93974609374999,65.565185546875],[-20.804345703124994,65.63642578125],[-20.739697265624983,65.658251953125],[-20.678955078125,65.6630859375],[-20.6494140625,65.65419921875],[-20.54814453124999,65.5794921875],[-20.486523437499983,65.566943359375],[-20.454833984375,65.571044921875],[-20.411523437499994,65.621728515625],[-20.356640624999983,65.71904296875],[-20.344091796874977,65.827734375],[-20.373925781249994,65.947705078125],[-20.356591796874994,66.033251953125],[-20.292138671874994,66.084375],[-20.20751953125,66.10009765625],[-20.102685546874994,66.08046875],[-20.026074218749983,66.049267578125],[-19.874755859375,65.930126953125],[-19.752636718749983,65.8677734375],[-19.647851562499994,65.80078125],[-19.59355468749999,65.779052734375],[-19.489697265624983,65.76806640625],[-19.461816406249994,65.77236328125],[-19.443261718749994,65.787841796875],[-19.43388671874999,65.814453125],[-19.45625,65.984912109375],[-19.42705078124999,66.03798828125],[-19.382958984374994,66.07568359375],[-19.1953125,66.097900390625],[-19.093212890624983,66.121533203125],[-18.99375,66.1603515625],[-18.911328124999983,66.18115234375],[-18.845898437499983,66.183935546875],[-18.777539062499983,66.168798828125],[-18.706201171874994,66.1357421875],[-18.594921874999983,66.071337890625],[-18.454931640624977,65.96455078125],[-18.276953124999977,65.884716796875],[-18.18364257812499,65.7580078125],[-18.163720703124994,65.736572265625],[-18.141943359374977,65.73408203125],[-18.118408203125,65.750537109375],[-18.10332031249999,65.77392578125],[-18.099023437499994,65.8302734375],[-18.148876953124983,65.905029296875],[-18.315332031249994,66.0931640625],[-18.318212890624977,66.12880859375],[-18.29716796874999,66.157421875],[-18.179882812499983,66.160546875],[-17.906982421875,66.143310546875],[-17.81982421875,66.114111328125],[-17.63432617187499,65.999169921875],[-17.582226562499983,65.97138671875],[-17.550439453124994,65.964404296875],[-17.539013671874983,65.9783203125],[-17.467041015625,65.999658203125],[-17.417236328125,66.025537109375],[-17.33427734374999,66.0888671875],[-17.153027343749983,66.20283203125],[-17.115380859374994,66.206201171875],[-17.062451171874983,66.197216796875],[-16.96953124999999,66.1673828125],[-16.925439453124994,66.14345703125],[-16.838037109374994,66.125244140625],[-16.7484375,66.131640625],[-16.624755859375,66.17158203125],[-16.485009765624994,66.195947265625],[-16.437109374999977,66.2525390625],[-16.428076171874977,66.278369140625],[-16.540673828124994,66.446728515625],[-16.493359374999983,66.48115234375],[-16.24931640624999,66.522900390625],[-16.035888671875,66.52607421875],[-15.985400390624989,66.5146484375],[-15.850927734374977,66.432861328125],[-15.759765625,66.39169921875],[-15.713769531249994,66.35859375],[-15.702783203124994,66.2857421875],[-15.647363281249994,66.2587890625],[-15.543115234374994,66.228515625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-64.84501953124999,18.330078125],[-64.91997070312499,18.3212890625],[-65.0236328125,18.367578125],[-64.942041015625,18.385205078124997],[-64.889111328125,18.37421875],[-64.84501953124999,18.330078125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[178.57548828125005,51.916259765625],[178.51181640625003,51.89912109375],[178.477734375,51.942529296875],[178.475,51.967724609375],[178.509375,51.994677734374996],[178.57060546875005,51.9775390625],[178.60732421875002,51.95302734375],[178.57548828125005,51.916259765625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[14.3134765625,36.027587890625],[14.253613281250011,36.012158203125],[14.194238281250023,36.042236328125],[14.180371093750011,36.060400390625],[14.26328125,36.07578125],[14.3037109375,36.062304687499996],[14.320898437500006,36.03623046875],[14.3134765625,36.027587890625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[13.938281250000017,40.705615234374996],[13.893652343750006,40.69697265625],[13.86767578125,40.708740234375],[13.853515625,40.724072265625],[13.871191406250006,40.76181640625],[13.962109375000011,40.739404296874994],[13.960839843750023,40.718164062499994],[13.938281250000017,40.705615234374996]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[12.05126953125,36.75703125],[12.003320312500023,36.745996093749994],[11.940625,36.78037109375],[11.936425781250023,36.82861328125],[11.948046875000017,36.843066406249996],[12.024218750000017,36.820947265624994],[12.048046875000011,36.7763671875],[12.05126953125,36.75703125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[6.333398437500023,53.5107421875],[6.193261718750023,53.476806640625],[6.159277343750006,53.483935546874996],[6.167675781250011,53.49375],[6.290917968750023,53.514990234375],[6.333398437500023,53.5107421875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[5.929296875,53.458837890625],[5.73203125,53.442626953125],[5.665332031250017,53.454882812499996],[5.654296875,53.46650390625],[5.708105468750006,53.473388671875],[5.876269531250017,53.47509765625],[5.92822265625,53.464990234375],[5.929296875,53.458837890625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[5.108593750000011,53.3080078125],[4.923730468750023,53.2345703125],[4.907910156250011,53.246240234375],[5.027050781250011,53.310205078125],[5.108593750000011,53.3080078125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[5.32578125,53.3857421875],[5.232617187500011,53.377783203125],[5.190234375000017,53.391796875],[5.415136718750006,53.431445312499996],[5.557421875000017,53.4435546875],[5.582617187500006,53.4380859375],[5.32578125,53.3857421875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-178.9880859375,-17.976660156250006],[-179.018408203125,-17.991796875],[-179.039208984375,-17.988378906250006],[-179.063818359375,-17.97236328125001],[-179.07900390625,-17.944140625],[-179.047607421875,-17.92041015625],[-178.99912109375,-17.947363281250006],[-178.9880859375,-17.976660156250006]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-178.7619140625,-18.23388671875],[-178.7736328125,-18.25244140625],[-178.82734375,-18.22216796875],[-178.847900390625,-18.20205078125001],[-178.790869140625,-18.186328125],[-178.7630859375,-18.19140625],[-178.7619140625,-18.23388671875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-178.251123046875,-17.952734375],[-178.3068359375,-17.96328125],[-178.3572265625,-17.9208984375],[-178.325390625,-17.87578125],[-178.280322265625,-17.88642578125001],[-178.25458984375,-17.929980468750003],[-178.251123046875,-17.952734375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-151.4666015625,-16.657519531250003],[-151.484912109375,-16.665136718750006],[-151.504150390625,-16.64697265625],[-151.51240234375,-16.61904296875001],[-151.50576171875,-16.574023437500003],[-151.457421875,-16.60371093750001],[-151.4380859375,-16.6234375],[-151.4666015625,-16.657519531250003]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-149.813671875,-17.545019531250006],[-149.844921875,-17.57109375],[-149.886572265625,-17.552832031250006],[-149.905126953125,-17.527734375],[-149.91181640625,-17.50117187500001],[-149.9021484375,-17.46953125],[-149.8087890625,-17.473925781250003],[-149.782421875,-17.48779296875],[-149.813671875,-17.545019531250006]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-120.306591796875,34.024853515625],[-120.359716796875,34.022265625],[-120.441552734375,34.03291015625],[-120.412939453125,34.056298828124994],[-120.36772460937499,34.073291015624996],[-120.35332031249999,34.060595703124996],[-120.306591796875,34.024853515625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-119.43803710937499,33.2171875],[-119.48251953125,33.21533203125],[-119.54365234375,33.224609375],[-119.5751953125,33.2783203125],[-119.525146484375,33.28203125],[-119.47880859374999,33.274609375],[-119.442041015625,33.232421875],[-119.43803710937499,33.2171875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-67.5751953125,-55.8896484375],[-67.61142578124999,-55.891699218750006],[-67.69951171874999,-55.873144531250006],[-67.83154296875,-55.86484375],[-67.846435546875,-55.85722656250002],[-67.84970703124999,-55.84257812500002],[-67.83408203124999,-55.827539062499994],[-67.76206054687499,-55.81611328125001],[-67.54482421875,-55.82597656250002],[-67.51728515625,-55.83281250000002],[-67.50981445312499,-55.844335937500006],[-67.54526367187499,-55.87744140625],[-67.5751953125,-55.8896484375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-69.89912109375,12.452001953124991],[-69.895703125,12.422998046874994],[-69.94218749999999,12.438525390624989],[-70.004150390625,12.50048828125],[-70.06611328125,12.546972656249991],[-70.05087890624999,12.597070312499994],[-70.035107421875,12.614111328124991],[-69.97314453125,12.567626953125],[-69.91181640625,12.48046875],[-69.89912109375,12.452001953124991]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-65.2125,10.906445312499997],[-65.26640624999999,10.883984375],[-65.365234375,10.906445312499997],[-65.41464843749999,10.937890625],[-65.383203125,10.973828125],[-65.30234375,10.973828125],[-65.2265625,10.930224609374989],[-65.2125,10.906445312499997]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-72.80458984375,18.77768554687499],[-72.822216796875,18.70712890624999],[-73.07797851562499,18.790917968749994],[-73.28525390624999,18.896728515625],[-73.27641601562499,18.954052734374997],[-73.17060546875,18.96728515625],[-73.06914062499999,18.93203125],[-72.91923828124999,18.861474609374994],[-72.80458984375,18.77768554687499]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-25.02734375,36.9599609375],[-25.03154296874999,36.941552734374994],[-25.08837890625,36.948876953124994],[-25.159912109375,36.943359375],[-25.198388671874994,36.996533203125],[-25.163525390624983,37.0185546875],[-25.082910156249994,37.0240234375],[-25.044335937499994,37.0001953125],[-25.02734375,36.9599609375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[16.650683593750017,42.99658203125],[16.835546875,42.968652343749994],[16.971093750000023,42.981494140624996],[17.093652343750023,42.96435546875],[17.169824218750023,42.9326171875],[17.188281250000017,42.917041015624996],[17.08935546875,42.914892578125],[16.9775390625,42.927783203124996],[16.850683593750006,42.8955078125],[16.738867187500006,42.912744140624994],[16.696386718750006,42.93369140625],[16.666308593750017,42.959912109375],[16.650683593750017,42.99658203125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[17.19404296875001,43.12578125],[17.124121093750006,43.1154296875],[16.67919921875,43.12314453125],[16.5498046875,43.143896484375],[16.405859375,43.19736328125],[16.37646484375,43.213769531249994],[16.521386718750023,43.229248046875],[16.65595703125001,43.213769531249994],[16.697265625,43.174951171874994],[17.061132812500006,43.143896484375],[17.19404296875001,43.12578125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[16.785253906250006,43.270654296874994],[16.62744140625,43.26806640625],[16.490332031250006,43.286181640624996],[16.423144531250017,43.317236328125],[16.428125,43.343408203124994],[16.44892578125001,43.387060546875],[16.6015625,43.381884765624996],[16.834375,43.350830078125],[16.89130859375001,43.3146484375],[16.873632812500006,43.29794921875],[16.785253906250006,43.270654296874994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-2.512304687499977,49.49453125],[-2.54736328125,49.4287109375],[-2.639013671874977,49.450927734375],[-2.646142578124994,49.468212890625],[-2.542187499999983,49.506591796875],[-2.520898437499994,49.506298828125],[-2.512304687499977,49.49453125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-2.018652343749977,49.23125],[-2.009912109374994,49.180810546874994],[-2.053759765624989,49.169824218749994],[-2.091015624999983,49.187402343749994],[-2.165673828124994,49.187402343749994],[-2.23583984375,49.1763671875],[-2.220507812499989,49.266357421875],[-2.082226562499983,49.25537109375],[-2.018652343749977,49.23125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[145.70839843750002,18.7625],[145.678125,18.725244140624994],[145.6525390625,18.752636718749997],[145.6455078125,18.806787109374994],[145.69013671875,18.80161132812499],[145.70664062500003,18.790478515624997],[145.70839843750002,18.7625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[145.712109375,16.339111328125],[145.69023437500005,16.33212890624999],[145.65830078125003,16.33579101562499],[145.63603515625005,16.351513671874997],[145.6310546875,16.377978515625003],[145.6955078125,16.379638671875],[145.71953125000005,16.359765625],[145.712109375,16.339111328125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[145.26484375,14.158105468749994],[145.21533203125,14.111328125],[145.17958984375002,14.120996093749994],[145.157421875,14.136914062499997],[145.15214843750005,14.163623046875003],[145.232421875,14.189453125],[145.26542968750005,14.180224609375003],[145.26484375,14.158105468749994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-59.78759765625,43.939599609374994],[-59.922265625,43.90390625],[-60.037744140624994,43.906640625],[-60.1142578125,43.939111328124994],[-60.11748046874999,43.953369140625],[-59.93603515625,43.939599609374994],[-59.866357421874994,43.947167968749994],[-59.72714843749999,44.002832031249994],[-59.78759765625,43.939599609374994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-97.01435546875,27.901611328125],[-97.03603515625,27.899169921875],[-96.98764648437499,27.9810546875],[-96.978662109375,28.013867187499997],[-96.89931640625,28.117480468749996],[-96.857421875,28.13291015625],[-96.83974609375,28.088818359374997],[-96.921337890625,28.016015625],[-97.01435546875,27.901611328125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-88.889306640625,29.712597656249997],[-88.943603515625,29.66025390625],[-88.94111328125,29.680224609374996],[-88.90117187499999,29.732617187499997],[-88.87265625,29.752978515624996],[-88.889306640625,29.712597656249997]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-88.55810546875,30.21591796875],[-88.57065429687499,30.204785156249997],[-88.65922851562499,30.2255859375],[-88.7130859375,30.244921875],[-88.7228515625,30.2642578125],[-88.573974609375,30.229150390624994],[-88.55810546875,30.21591796875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-88.07133789062499,30.25234375],[-88.159326171875,30.230908203124997],[-88.28974609375,30.23291015625],[-88.31625976562499,30.240429687499997],[-88.263916015625,30.254736328125],[-88.109375,30.273730468749996],[-88.07133789062499,30.25234375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-63.01230468749999,18.04541015625],[-63.023046875,18.019189453124994],[-63.09042968749999,18.04140625],[-63.12470703125,18.06430664062499],[-63.114990234375,18.090722656249994],[-63.06308593749999,18.11533203124999],[-63.024804687499994,18.113085937500003],[-63.009423828124994,18.104296875],[-63.01230468749999,18.04541015625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-65.42558593749999,18.105615234374994],[-65.50400390624999,18.099511718749994],[-65.555078125,18.107666015625],[-65.572216796875,18.13730468749999],[-65.47714843749999,18.1650390625],[-65.3662109375,18.161083984374997],[-65.302685546875,18.14438476562499],[-65.294873046875,18.133349609375003],[-65.42558593749999,18.105615234374994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-62.5322265625,17.121875],[-62.582421875,17.1005859375],[-62.624902343749994,17.129589843749997],[-62.61528320312499,17.199121093749994],[-62.57470703125,17.20102539062499],[-62.5341796875,17.170117187499997],[-62.5322265625,17.121875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-64.39521484375,18.464599609375],[-64.421142578125,18.457421875],[-64.43803710937499,18.458984375],[-64.44375,18.473388671875],[-64.42607421874999,18.513085937499994],[-64.324658203125,18.517480468749994],[-64.39521484375,18.464599609375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-64.659814453125,18.35434570312499],[-64.7259765625,18.327880859375],[-64.77060546874999,18.331591796875003],[-64.78769531249999,18.341113281250003],[-64.75244140625,18.371972656249994],[-64.659814453125,18.35434570312499]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-64.59365234375,18.40283203125],[-64.671826171875,18.399121093749997],[-64.69511718749999,18.411669921875003],[-64.65097656249999,18.442529296874994],[-64.56914062499999,18.4462890625],[-64.545166015625,18.438134765624994],[-64.59365234375,18.40283203125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-64.765625,17.794335937499994],[-64.6818359375,17.750195312499997],[-64.58046875,17.750195312499997],[-64.686279296875,17.706103515625003],[-64.889111328125,17.701708984375003],[-64.884716796875,17.772265625],[-64.765625,17.794335937499994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-77.34755859375,25.013867187499997],[-77.46049804687499,24.993115234374997],[-77.5412109375,25.013574218749994],[-77.5619140625,25.030029296875],[-77.52734375,25.057666015625003],[-77.45126953124999,25.080712890624994],[-77.3291015625,25.0830078125],[-77.2755859375,25.05576171874999],[-77.269140625,25.043847656249994],[-77.34755859375,25.013867187499997]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-81.044189453125,24.716796875],[-81.089990234375,24.693115234375],[-81.137353515625,24.710498046875003],[-81.08525390624999,24.734179687500003],[-80.93046874999999,24.759472656249997],[-80.988916015625,24.72788085937499],[-81.044189453125,24.716796875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[114.23203125000003,22.210546875],[114.20722656250001,22.19516601562499],[114.13876953125003,22.268359375],[114.13447265625001,22.292236328125],[114.18740234375002,22.296630859375],[114.24687,22.263574218749994],[114.24355468750002,22.233544921874994],[114.23203125000003,22.210546875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-76.54624023437499,34.6548828125],[-76.568505859375,34.6525390625],[-76.6078125,34.66357421875],[-76.66196289062499,34.68466796875],[-76.67392578124999,34.700146484375],[-76.622265625,34.69453125],[-76.54624023437499,34.6548828125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-175.1619140625,-21.16933593750001],[-175.14765625,-21.16943359375],[-175.13193359375,-21.139746093750006],[-175.078173828125,-21.129003906250006],[-175.08408203125,-21.160742187500006],[-175.156591796875,-21.263671875],[-175.20234375,-21.2234375],[-175.33544921875,-21.15771484375],[-175.362353515625,-21.10683593750001],[-175.31806640625,-21.06826171875001],[-175.322607421875,-21.09931640625001],[-175.300439453125,-21.113378906250006],[-175.225390625,-21.11875],[-175.1580078125,-21.146484375],[-175.199755859375,-21.15566406250001],[-175.1619140625,-21.16933593750001]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[52.68242187500002,45.41181640625],[52.66484375000002,45.401318359375],[52.59833984375001,45.428173828125],[52.554296875,45.473974609375],[52.60888671875,45.52802734375],[52.65957031250002,45.51806640625],[52.69296875,45.460742187499996],[52.68242187500002,45.41181640625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[47.983007812500006,45.488232421875],[47.96767578125002,45.469970703125],[47.92031250000002,45.562060546874996],[47.917578125,45.6181640625],[47.94716796875002,45.6470703125],[47.98710937500002,45.554052734375],[47.983007812500006,45.488232421875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-58.43881835937499,-52.01103515625002],[-58.43271484374999,-52.099023437499994],[-58.512841796874994,-52.07109375000002],[-58.54140625,-52.028417968750006],[-58.4970703125,-51.999414062499994],[-58.460546875,-52.0015625],[-58.43881835937499,-52.01103515625002]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[42.59023437500002,15.303417968749997],[42.558691406250006,15.281201171874997],[42.54902343750001,15.320068359375],[42.56972656250002,15.407324218749991],[42.60234375000002,15.432519531249994],[42.62451171875,15.36796875],[42.610449218750006,15.332275390625],[42.59023437500002,15.303417968749997]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[40.07646484375002,16.082421875],[40.11005859375001,15.985742187499994],[40.01240234375001,16.02265625],[39.99609375,16.042675781249997],[40.0390625,16.080957031249994],[40.04814453125002,16.1044921875],[40.07646484375002,16.082421875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[36.90166015625002,25.383056640625],[36.87519531250001,25.383056640625],[36.80507812500002,25.450732421875003],[36.76386718750001,25.50058593749999],[36.72207031250002,25.53403320312499],[36.5302734375,25.6015625],[36.50429687500002,25.64511718749999],[36.53359375000002,25.688720703125],[36.55410156250002,25.64536132812499],[36.58876953125002,25.619824218749997],[36.74755859375,25.558740234374994],[36.924414062500006,25.425537109375],[36.95478515625001,25.41464843749999],[36.90166015625002,25.383056640625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[36.59550781250002,25.712792968749994],[36.58613281250001,25.69921875],[36.5439453125,25.734277343749994],[36.546484375,25.81162109374999],[36.58271484375001,25.855517578125003],[36.57988281250002,25.79541015625],[36.59560546875002,25.73486328125],[36.59550781250002,25.712792968749994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[101.31855468750001,2.988476562499997],[101.26806640625,2.970410156249997],[101.26542968749999,2.996484375],[101.27421874999999,3.0328125],[101.31123046875001,3.0673828125],[101.32841796874999,3.047607421875],[101.31855468750001,2.988476562499997]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[134.71611328125005,-6.549414062500006],[134.66083984375,-6.558886718750003],[134.63369140625002,-6.477246093750011],[134.67910156250002,-6.4560546875],[134.728515625,-6.505859375],[134.71611328125005,-6.549414062500006]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[123.59755859375002,-1.704296875000011],[123.52861328124999,-1.710839843750009],[123.48251953125003,-1.681445312500003],[123.48662109374999,-1.534863281250011],[123.52851562500001,-1.502832031250009],[123.54853515625001,-1.508203125],[123.56132812499999,-1.551855468750006],[123.58203125,-1.590917968750006],[123.61640625000001,-1.62744140625],[123.59755859375002,-1.704296875000011]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[126.75302734375003,34.343994140625],[126.76992187500002,34.296435546874996],[126.68906250000003,34.305419921875],[126.64609375000003,34.351123046874996],[126.65185546875,34.39033203125],[126.7,34.395898437499994],[126.75302734375003,34.343994140625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[152.8859375,76.121728515625],[152.786328125,76.085791015625],[152.55859375,76.143603515625],[152.6427734375,76.1748046875],[152.79941406250003,76.19482421875],[152.83505859375003,76.18515625],[152.86376953125,76.163427734375],[152.8859375,76.121728515625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[67.34492187500001,69.529833984375],[67.26396484375002,69.442529296875],[67.09785156250001,69.44716796875],[67.04726562500002,69.467041015625],[67.02587890625,69.483203125],[67.21611328125002,69.575390625],[67.32890625000002,69.572119140625],[67.34492187500001,69.529833984375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[66.56093750000002,70.541748046875],[66.56855468750001,70.50146484375],[66.51582031250001,70.514892578125],[66.44863281250002,70.56103515625],[66.40761718750002,70.615771484375],[66.39482421875002,70.727294921875],[66.41816406250001,70.75712890625],[66.44023437500002,70.77265625],[66.462890625,70.7693359375],[66.45771484375001,70.698779296875],[66.56093750000002,70.541748046875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[55.47968750000001,80.273828125],[55.19511718750002,80.226806640625],[55.0484375,80.228369140625],[54.97968750000001,80.2564453125],[55.09160156250002,80.295556640625],[55.24003906250002,80.325390625],[55.35322265625001,80.31767578125],[55.43476562500001,80.30224609375],[55.47968750000001,80.273828125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[18.41621093750001,59.0291015625],[18.371875,59.019580078125],[18.349902343750017,59.022607421874994],[18.377246093750017,59.06904296875],[18.397558593750006,59.089111328125],[18.464941406250006,59.107861328125],[18.48554687500001,59.10458984375],[18.41621093750001,59.0291015625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[18.59541015625001,59.470361328124994],[18.5703125,59.437255859375],[18.54511718750001,59.47783203125],[18.55517578125,59.485791015625],[18.572363281250006,59.525830078125],[18.620898437500017,59.547802734375],[18.69843750000001,59.534619140625],[18.69794921875001,59.524609375],[18.623828125000017,59.4921875],[18.59541015625001,59.470361328124994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-122.85307617187499,47.204736328124994],[-122.86259765624999,47.18505859375],[-122.87675781249999,47.1861328125],[-122.907958984375,47.226123046874996],[-122.91191406249999,47.254345703125],[-122.885107421875,47.274707031249996],[-122.84916992187499,47.21630859375],[-122.85307617187499,47.204736328124994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[105.72539062499999,-10.49296875],[105.696875,-10.564160156250011],[105.64433593749999,-10.525],[105.58408203125003,-10.5125],[105.595703125,-10.459667968750011],[105.6455078125,-10.452246093750006],[105.66982421875002,-10.449414062500011],[105.70546875000002,-10.4306640625],[105.72539062499999,-10.49296875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-86.419921875,16.378369140624997],[-86.5802734375,16.300244140624997],[-86.63041992187499,16.3017578125],[-86.55693359374999,16.362109375],[-86.43828124999999,16.413867187500003],[-86.337841796875,16.439208984375],[-86.255517578125,16.42822265625],[-86.419921875,16.378369140624997]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[163.97597656250002,-74.83271484375001],[163.84462890625002,-74.83271484375001],[163.76337890625,-74.80283203125],[163.73720703125002,-74.73378906250002],[163.74169921875,-74.7115234375],[164.00234375000002,-74.62890625],[164.20849609375,-74.60771484375002],[164.09824218750003,-74.73193359375],[164.05917968750003,-74.75273437500002],[163.97597656250002,-74.83271484375001]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[164.83359375000003,-67.54042968750002],[164.7462890625,-67.56884765625],[164.69208984375,-67.56005859375],[164.63896484375005,-67.50009765625],[164.6962890625,-67.4078125],[164.67519531250002,-67.28886718750002],[164.68398437500002,-67.259375],[164.825,-67.32607421875002],[164.85009765625,-67.36367187500002],[164.9072265625,-67.4185546875],[164.91865234375,-67.44746093750001],[164.86044921875003,-67.50390625],[164.83359375000003,-67.54042968750002]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[167.6427734375,-78.14140625000002],[167.51748046875002,-78.21601562500001],[167.376953125,-78.2490234375],[166.93623046875,-78.22246093750002],[166.6259765625,-78.28427734375],[166.28486328125,-78.30644531250002],[166.121875,-78.27460937500001],[166.05058593750005,-78.21337890625],[166.0125,-78.13125],[166.012890625,-78.10195312500002],[166.11113281250005,-78.08964843750002],[166.56708984375,-78.148046875],[166.75986328125003,-78.19794921875001],[166.86367187500002,-78.19638671875],[167.137890625,-78.12998046875],[167.36406250000005,-78.04580078125002],[167.42236328125,-78.0064453125],[167.49785156250005,-77.99238281250001],[167.59384765625003,-78.02226562500002],[167.63984375,-78.11171875000002],[167.6427734375,-78.14140625000002]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[163.301953125,-66.82119140625002],[163.28359375000002,-66.88193359375],[163.2345703125,-66.86796875000002],[163.16386718750005,-66.81914062500002],[163.08964843750005,-66.70058593750002],[163.15615234375002,-66.6884765625],[163.23789062500003,-66.70878906250002],[163.27109375000003,-66.767578125],[163.29912109375005,-66.7984375],[163.301953125,-66.82119140625002]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[167.08408203125003,-77.32167968750002],[167.4609375,-77.39433593750002],[168.45078125000003,-77.38613281250002],[169.2755859375,-77.4546875],[169.352734375,-77.52470703125002],[169.11728515625003,-77.560546875],[168.75458984375,-77.6533203125],[168.51884765625005,-77.68125],[168.32255859375005,-77.68251953125002],[167.91757812500003,-77.644140625],[167.39228515625,-77.64863281250001],[167.2794921875,-77.70263671875],[167.02509765625,-77.7564453125],[166.72900390625,-77.85097656250002],[166.650390625,-77.7740234375],[166.53251953125005,-77.70039062500001],[166.23681640625,-77.5474609375],[166.216796875,-77.52460937500001],[166.37841796875,-77.49404296875002],[166.4580078125,-77.44375],[166.62636718750002,-77.37675781250002],[166.60712890625,-77.335546875],[166.46904296875005,-77.28886718750002],[166.4130859375,-77.251953125],[166.50634765625,-77.18935546875002],[166.71640625000003,-77.16171875],[166.9873046875,-77.1865234375],[167.10683593750002,-77.27060546875],[167.0849609375,-77.30742187500002],[167.08408203125003,-77.32167968750002]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[169.84365234375002,-73.60498046875],[169.7091796875,-73.62529296875002],[169.52236328125002,-73.5615234375],[169.4794921875,-73.53945312500002],[169.659375,-73.41806640625],[169.64541015625002,-73.37910156250001],[169.671875,-73.34609375000002],[169.74003906250005,-73.32041015625],[169.783203125,-73.32421875],[169.88652343750005,-73.45869140625001],[169.96035156250002,-73.51435546875001],[169.85878906250002,-73.56806640625001],[169.84365234375002,-73.60498046875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[162.96806640625005,-75.56708984375001],[162.78828125,-75.69619140625002],[162.66191406250005,-75.69189453125],[162.59121093750002,-75.6685546875],[162.72001953125005,-75.5966796875],[162.84238281250003,-75.56621093750002],[162.9169921875,-75.55732421875001],[162.96806640625005,-75.56708984375001]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[100.9814453125,-65.67753906250002],[100.546875,-65.70126953125],[100.51230468750003,-65.675390625],[100.3505859375,-65.67294921875],[100.29257812500003,-65.65126953125002],[100.27031249999999,-65.60332031250002],[100.32412109375002,-65.52070312500001],[100.409375,-65.465625],[100.54511718750001,-65.40898437500002],[100.60693359375,-65.39638671875002],[100.88339843750003,-65.378125],[101.07871093750003,-65.40253906250001],[101.22060546875002,-65.472265625],[101.25898437500001,-65.52763671875002],[101.23837890625003,-65.56455078125],[100.9814453125,-65.67753906250002]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[85.82236328125003,-66.95332031250001],[85.65009765625001,-66.97968750000001],[85.62226562500001,-66.96533203125],[85.61738281250001,-66.95087890625001],[85.35878906250002,-66.85429687500002],[85.314453125,-66.7759765625],[85.34033203125,-66.72333984375001],[85.55283203125003,-66.728515625],[85.80625,-66.77460937500001],[85.93769531250001,-66.894140625],[85.82236328125003,-66.95332031250001]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[92.60136718749999,-65.80830078125001],[92.47050781249999,-65.82167968750002],[92.3330078125,-65.8072265625],[92.26279296875003,-65.76005859375002],[92.24814453125003,-65.73994140625001],[92.30146484375001,-65.70673828125001],[92.49638671874999,-65.7021484375],[92.6337890625,-65.73066406250001],[92.66455078125,-65.76044921875001],[92.66962890625001,-65.77480468750002],[92.60136718749999,-65.80830078125001]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[86.54179687499999,-66.76748046875002],[86.42666015625002,-66.7919921875],[86.33701171875003,-66.78759765625],[86.23222656249999,-66.73291015625],[86.27773437500002,-66.69667968750002],[86.38330078125,-66.6748046875],[86.52060546875003,-66.68691406250002],[86.55673828125003,-66.70576171875001],[86.65195312500003,-66.71816406250002],[86.54179687499999,-66.76748046875002]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[85.32851562500002,-66.6119140625],[85.22246093749999,-66.64345703125002],[85.13613281250002,-66.63710937500002],[85.07958984375,-66.60429687500002],[85.06875,-66.58378906250002],[85.12109375,-66.5185546875],[85.16474609375001,-66.52158203125],[85.19394531250003,-66.55605468750002],[85.32851562500002,-66.6119140625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[69.91835937500002,-71.91777343750002],[69.7919921875,-72.04667968750002],[69.74355468750002,-72.04414062500001],[69.69257812500001,-71.96826171875],[69.73710937500002,-71.92197265625],[69.79609375000001,-71.89394531250002],[69.89521484375001,-71.9078125],[69.91835937500002,-71.91777343750002]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[68.46171875000002,-72.30009765625002],[68.40888671875001,-72.30019531250002],[68.4361328125,-72.26044921875001],[68.56630859375002,-72.19013671875001],[68.66708984375,-72.103125],[68.72929687500002,-72.08916015625002],[68.8404296875,-72.16542968750002],[68.81718750000002,-72.22871093750001],[68.66953125,-72.2759765625],[68.46171875000002,-72.30009765625002]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[96.61269531250002,-66.03583984375001],[96.72734374999999,-66.06083984375002],[96.931640625,-66.05839843750002],[97.00556640625001,-66.09677734375],[97.01884765624999,-66.13945312500002],[97.015625,-66.16396484375002],[96.93398437500002,-66.20078125],[96.39453125,-66.225],[96.30703125000002,-66.18583984375002],[96.39882812500002,-66.08017578125],[96.49980468749999,-66.0458984375],[96.61269531250002,-66.03583984375001]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[72.00224609375002,-70.63261718750002],[71.92900390625002,-70.63300781250001],[71.84121093750002,-70.62197265625002],[71.72578125000001,-70.54912109375002],[71.659375,-70.49746093750002],[71.63710937500002,-70.44355468750001],[71.64658203125,-70.33632812500002],[71.705078125,-70.284375],[71.79658203125001,-70.2642578125],[71.83798828125,-70.31220703125001],[71.851171875,-70.36767578125],[71.87998046875,-70.40556640625002],[72,-70.45683593750002],[72.0556640625,-70.5009765625],[72.07343750000001,-70.52451171875],[72.09736328125001,-70.57460937500002],[72.078125,-70.60908203125001],[72.00224609375002,-70.63261718750002]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[162.61142578125003,-66.47734375000002],[162.55712890625,-66.52509765625001],[162.51132812500003,-66.5201171875],[162.302734375,-66.39970703125002],[162.32626953125003,-66.34746093750002],[162.29726562500002,-66.3037109375],[162.30205078125005,-66.2646484375],[162.310546875,-66.25126953125002],[162.56328125000005,-66.4326171875],[162.61142578125003,-66.47734375000002]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[100.26474609375003,-66.21660156250002],[100.13320312500002,-66.2294921875],[100.08203125,-66.202734375],[100.07626953125003,-66.1880859375],[100.17441406250003,-66.13105468750001],[100.29052734375,-66.11240234375],[100.28154296874999,-66.17998046875002],[100.26474609375003,-66.21660156250002]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[98.84609375000002,-66.46982421875],[98.75175781249999,-66.48164062500001],[98.65507812499999,-66.45332031250001],[98.60517578125001,-66.39990234375],[98.59648437499999,-66.38261718750002],[98.74863281250003,-66.36923828125],[98.94980468750003,-66.4205078125],[98.84609375000002,-66.46982421875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[103.39726562499999,-65.4453125],[103.33720703124999,-65.46855468750002],[103.17597656250001,-65.4546875],[103.13847656249999,-65.43505859375],[103.12421875000001,-65.33837890625],[103.11279296875,-65.31201171875],[103.05439453125001,-65.28535156250001],[102.78876953125001,-65.2359375],[102.75957031249999,-65.16787109375002],[102.79609375000001,-65.136328125],[102.89287109374999,-65.12968750000002],[103.13681640625003,-65.190625],[103.19082031250002,-65.23710937500002],[103.18173828125003,-65.30771484375],[103.18613281250003,-65.33056640625],[103.26103515624999,-65.37734375000002],[103.37890625,-65.42646484375001],[103.39726562499999,-65.4453125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-147.58828125,-76.64980468750002],[-147.578857421875,-76.66279296875001],[-147.729638671875,-76.65341796875],[-147.954296875,-76.59716796875],[-148.00107421875,-76.5771484375],[-147.89970703125,-76.55800781250002],[-147.769677734375,-76.57685546875001],[-147.64912109375,-76.61083984375],[-147.58828125,-76.64980468750002]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-145.2380859375,-75.71123046875002],[-145.348388671875,-75.71611328125002],[-145.541162109375,-75.69267578125002],[-146.0427734375,-75.6119140625],[-146.150830078125,-75.57353515625002],[-146.075732421875,-75.53339843750001],[-145.8955078125,-75.50478515625002],[-145.760791015625,-75.51386718750001],[-145.4173828125,-75.58798828125],[-145.3154296875,-75.64140625000002],[-145.25224609375,-75.68281250000001],[-145.2380859375,-75.71123046875002]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-146.60673828125,-76.96132812500002],[-146.9814453125,-77.00566406250002],[-147.07890625,-76.9927734375],[-147.044140625,-76.9296875],[-147.10146484375,-76.88652343750002],[-147.115625,-76.8662109375],[-147.086669921875,-76.83730468750002],[-146.86650390625,-76.83710937500001],[-146.244384765625,-76.88310546875002],[-146.16396484375,-76.94853515625002],[-146.60673828125,-76.96132812500002]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-132.391259765625,-74.44189453125],[-132.5462890625,-74.49843750000002],[-132.857177734375,-74.46171875000002],[-132.831689453125,-74.42158203125001],[-132.552490234375,-74.38662109375002],[-132.3623046875,-74.40996093750002],[-132.391259765625,-74.44189453125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-148.595849609375,-77.0068359375],[-149.0146484375,-77.019140625],[-149.24482421875,-76.99306640625002],[-149.3025390625,-76.91582031250002],[-149.2380859375,-76.90019531250002],[-148.7041015625,-76.93564453125],[-148.508935546875,-76.95458984375],[-148.43974609375,-76.9771484375],[-148.47431640625,-76.99775390625001],[-148.595849609375,-77.0068359375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-149.333251953125,-76.7173828125],[-148.9279296875,-76.730078125],[-148.66259765625,-76.72050781250002],[-148.3841796875,-76.74443359375002],[-148.32080078125,-76.77167968750001],[-148.370947265625,-76.794921875],[-148.66953125,-76.80205078125002],[-148.814599609375,-76.84072265625002],[-148.98388671875,-76.8453125],[-149.2384765625,-76.81777343750002],[-149.4689453125,-76.75712890625002],[-149.333251953125,-76.7173828125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-131.06669921875,-74.58378906250002],[-131.17890625,-74.60478515625002],[-131.59794921875,-74.5537109375],[-131.840869140625,-74.542578125],[-131.952490234375,-74.51435546875001],[-132.02509765625,-74.48867187500002],[-132.04931640625,-74.4638671875],[-132.162646484375,-74.42578125],[-131.93779296875,-74.34912109375],[-131.7626953125,-74.323828125],[-131.594091796875,-74.3296875],[-131.559619140625,-74.36728515625],[-131.23388671875,-74.41357421875],[-130.981103515625,-74.4140625],[-130.956787109375,-74.45625],[-130.96728515625,-74.51503906250002],[-131.06669921875,-74.58378906250002]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-119.54892578125,-74.11025390625002],[-119.75834960937499,-74.1220703125],[-119.82099609375,-74.11962890625],[-119.88720703125,-74.097265625],[-119.905126953125,-74.08154296875],[-119.79667968749999,-74.02919921875002],[-119.69375,-74.00615234375002],[-119.661572265625,-73.98935546875],[-119.802587890625,-73.81464843750001],[-119.66904296875,-73.80927734375001],[-119.516357421875,-73.77490234375],[-119.2162109375,-73.77763671875002],[-118.95927734374999,-73.80947265625002],[-118.909814453125,-73.83427734375002],[-118.87734375,-73.87802734375],[-118.98979492187499,-73.96699218750001],[-119.05859375,-73.99765625],[-119.44853515624999,-74.076171875],[-119.54892578125,-74.11025390625002]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-116.738623046875,-74.1650390625],[-117.230322265625,-74.19277343750002],[-117.36298828125,-74.16093750000002],[-117.398291015625,-74.12246093750002],[-117.37646484375,-74.08281250000002],[-116.381298828125,-73.86552734375002],[-116.20268554687499,-73.89560546875],[-116.15498046875,-73.91044921875002],[-116.451416015625,-74.01767578125],[-116.5845703125,-74.05556640625002],[-116.608642578125,-74.06855468750001],[-116.5341796875,-74.08330078125002],[-116.514111328125,-74.09550781250002],[-116.5708984375,-74.12568359375001],[-116.738623046875,-74.1650390625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-127.3658203125,-74.62265625],[-127.517724609375,-74.64052734375002],[-127.81708984375,-74.57460937500002],[-127.915234375,-74.542578125],[-128.000048828125,-74.48945312500001],[-128.070458984375,-74.47822265625001],[-128.096240234375,-74.46621093750002],[-128.133447265625,-74.32744140625002],[-128.04287109375,-74.31220703125001],[-127.852978515625,-74.33183593750002],[-127.48642578125,-74.4052734375],[-127.229736328125,-74.42519531250002],[-127.145166015625,-74.48017578125001],[-127.23193359375,-74.57841796875002],[-127.3658203125,-74.62265625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-149.218115234375,-77.33632812500002],[-148.928857421875,-77.38681640625],[-149.438671875,-77.37060546875],[-149.662353515625,-77.30097656250001],[-149.51865234375,-77.27470703125002],[-149.375439453125,-77.27998046875001],[-149.24912109375,-77.3150390625],[-149.218115234375,-77.33632812500002]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-161.993798828125,-83.11875],[-162.304931640625,-83.14179687500001],[-163.046533203125,-83.09677734375],[-163.242138671875,-83.05966796875],[-163.348388671875,-83.02158203125],[-163.552099609375,-82.98769531250002],[-163.6017578125,-82.96855468750002],[-163.602197265625,-82.92734375],[-163.634326171875,-82.90224609375002],[-163.70390625,-82.87929687500002],[-163.735302734375,-82.85683593750002],[-163.795947265625,-82.84267578125002],[-162.798486328125,-82.86484375],[-162.410595703125,-82.89921875000002],[-162.339794921875,-82.92275390625002],[-161.63515625,-83.026953125],[-161.82822265625,-83.042578125],[-161.993798828125,-83.11875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-150.23251953125,-76.77646484375],[-150.65517578125,-76.78896484375002],[-150.83046875,-76.76152343750002],[-150.87353515625,-76.73671875000002],[-150.837646484375,-76.71416015625002],[-150.177392578125,-76.69130859375002],[-150.103564453125,-76.71884765625],[-150.084765625,-76.73515625000002],[-150.23251953125,-76.77646484375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-146.69013671875,-76.24638671875002],[-146.894482421875,-76.26093750000001],[-147.150927734375,-76.19746093750001],[-147.34541015625,-76.14667968750001],[-147.407763671875,-76.10458984375],[-147.4208984375,-76.09023437500002],[-147.41806640625,-76.07343750000001],[-147.36064453125,-76.06279296875002],[-146.9490234375,-76.09814453125],[-146.69013671875,-76.24638671875002]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-146.7900390625,-76.63310546875002],[-146.9078125,-76.71406250000001],[-147.221337890625,-76.6708984375],[-147.355322265625,-76.61884765625001],[-147.27861328125,-76.55253906250002],[-147.135302734375,-76.53154296875002],[-146.9474609375,-76.55498046875002],[-146.877880859375,-76.56328125000002],[-146.7900390625,-76.63310546875002]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-160.467138671875,-81.589453125],[-160.57099609375,-81.59785156250001],[-163.253076171875,-81.482421875],[-163.766064453125,-81.44482421875],[-163.89013671875,-81.42363281250002],[-163.9392578125,-81.40410156250002],[-163.951220703125,-81.39091796875002],[-163.930029296875,-81.3521484375],[-163.868994140625,-81.32402343750002],[-163.200634765625,-81.28144531250001],[-162.456494140625,-81.31328125000002],[-161.55859375,-81.39667968750001],[-160.937890625,-81.4634765625],[-160.61689453125,-81.5220703125],[-160.48544921875,-81.5669921875],[-160.467138671875,-81.589453125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-150.3970703125,-77.369140625],[-150.474853515625,-77.37373046875001],[-151.344482421875,-77.29628906250002],[-151.51162109375,-77.27333984375002],[-151.218017578125,-77.22646484375002],[-151.021533203125,-77.22001953125002],[-150.49912109375,-77.33505859375],[-150.35625,-77.34902343750002],[-150.3970703125,-77.369140625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-153.93046875,-80.03330078125],[-154.1140625,-80.03603515625002],[-154.348828125,-80.02607421875001],[-154.529443359375,-80.00048828125],[-154.941650390625,-79.96630859375],[-155.044775390625,-79.89980468750002],[-155.525341796875,-79.84648437500002],[-155.751171875,-79.82958984375],[-155.674267578125,-79.76552734375002],[-155.16220703125,-79.85068359375],[-154.535107421875,-79.935546875],[-154.025390625,-79.98769531250002],[-153.93046875,-80.03330078125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-149.2306640625,-77.12050781250002],[-149.29345703125,-77.13662109375002],[-149.72861328125,-77.128515625],[-149.81689453125,-77.11416015625002],[-149.85634765625,-77.09941406250002],[-150.46181640625,-77.07568359375],[-150.735791015625,-77.00429687500002],[-150.788525390625,-76.98164062500001],[-150.680224609375,-76.94843750000001],[-150.47578125,-76.92607421875002],[-150.393310546875,-76.89873046875002],[-149.87060546875,-76.875],[-149.78984375,-76.8892578125],[-149.742578125,-76.92705078125002],[-149.50576171875,-77.00166015625001],[-149.441748046875,-77.04921875000002],[-149.41640625,-77.07890625000002],[-149.288330078125,-77.09316406250002],[-149.2306640625,-77.12050781250002]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-157.9875,-82.10498046875],[-158.076220703125,-82.11201171875001],[-158.1541015625,-82.05849609375002],[-158.5453125,-81.948828125],[-158.773193359375,-81.87548828125],[-158.926318359375,-81.81865234375002],[-158.988720703125,-81.779296875],[-158.913720703125,-81.77978515625],[-158.346728515625,-81.90048828125],[-158.26083984375,-81.947265625],[-157.8345703125,-82.03076171875],[-157.9875,-82.10498046875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-5.894091796874989,-70.55224609375],[-6.156103515624977,-70.61152343750001],[-6.180859374999983,-70.585546875],[-6.26611328125,-70.55019531250002],[-6.43798828125,-70.45263671875],[-6.24365234375,-70.44570312500002],[-6.068261718749994,-70.40468750000002],[-5.971630859374983,-70.421484375],[-5.949511718749989,-70.4322265625],[-5.894091796874989,-70.55224609375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[3.036914062500017,-70.59736328125001],[2.69775390625,-70.62353515625],[2.622753906250011,-70.593359375],[2.584667968750011,-70.53457031250002],[2.631445312500006,-70.50039062500002],[3.072167968750023,-70.38164062500002],[3.192773437500023,-70.39267578125],[3.230566406250006,-70.40263671875002],[3.259863281250006,-70.448828125],[3.221289062500006,-70.519140625],[3.171093750000011,-70.55390625000001],[3.036914062500017,-70.59736328125001]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-2.954980468749994,-71.21376953125002],[-3.060595703124989,-71.23662109375002],[-3.201464843749989,-71.23027343750002],[-3.30937,-71.20087890625001],[-3.385644531249994,-71.14296875000002],[-3.403857421874989,-71.11982421875001],[-3.391699218749977,-71.08115234375],[-3.398974609374989,-71.062109375],[-3.263037109374977,-71.0517578125],[-3.212792968749994,-71.07597656250002],[-3.191357421874983,-71.09482421875],[-2.954980468749994,-71.21376953125002]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[1.29931640625,-70.25517578125002],[1.211523437500006,-70.38134765625],[1.156347656250006,-70.378125],[1.104589843750006,-70.30419921875],[0.990332031250006,-70.22431640625001],[0.952539062500023,-70.1689453125],[0.949609375000023,-70.09404296875002],[1.026757812500023,-70.0498046875],[1.314843750000023,-70.02275390625002],[1.412207031250006,-70.04072265625001],[1.4609375,-70.13564453125002],[1.29931640625,-70.25517578125002]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-2.532812499999977,-70.76777343750001],[-2.423437499999977,-70.800390625],[-2.255566406249983,-70.79609375000001],[-2.09228515625,-70.8208984375],[-2.119042968749994,-70.85537109375002],[-2.212695312499989,-70.90156250000001],[-2.293164062499983,-70.99794921875002],[-2.368945312499989,-71.04443359375],[-2.606738281249989,-71.14111328125],[-2.783496093749989,-71.16748046875],[-2.825146484374983,-71.11269531250002],[-2.82187,-71.05673828125],[-2.80517578125,-71.01474609375],[-2.800537109375,-70.98222656250002],[-2.963134765625,-70.94033203125002],[-2.975,-70.88330078125],[-3.006982421874994,-70.85146484375002],[-3.488964843749983,-70.7359375],[-3.574658203124983,-70.703125],[-3.537060546874983,-70.68330078125001],[-3.0400390625,-70.6744140625],[-2.749804687499989,-70.69414062500002],[-2.532812499999977,-70.76777343750001]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[4.52587890625,-70.47871093750001],[4.365234375,-70.50263671875001],[4.1796875,-70.45126953125],[4.129589843750011,-70.4169921875],[4.076171875,-70.32529296875],[4.069726562500023,-70.29023437500001],[4.111718750000023,-70.26679687500001],[4.256054687500011,-70.2408203125],[4.495019531250023,-70.25136718750002],[4.586230468750017,-70.29423828125002],[4.617578125000023,-70.36865234375],[4.589941406250006,-70.43251953125002],[4.52587890625,-70.47871093750001]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[48.545996093750006,-66.7841796875],[48.3779296875,-66.80732421875001],[48.30449218750002,-66.7978515625],[48.295996093750006,-66.77382812500002],[48.2939453125,-66.75009765625],[48.30078125,-66.72421875],[48.35771484375002,-66.70380859375001],[48.637792968750006,-66.70097656250002],[48.751074218750006,-66.71962890625002],[48.78242187500001,-66.73115234375001],[48.78554687500002,-66.767578125],[48.77470703125002,-66.7783203125],[48.545996093750006,-66.7841796875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[16.22265625,-70.00761718750002],[16.159277343750006,-70.07197265625001],[15.844921875000011,-69.98203125],[15.663476562500023,-69.955078125],[15.613867187500006,-69.9390625],[15.570996093750011,-69.884765625],[15.562597656250006,-69.86279296875],[15.596875,-69.82802734375002],[15.699023437500017,-69.77324218750002],[15.909570312500023,-69.72841796875002],[16.246875,-69.70498046875002],[16.57343750000001,-69.7232421875],[16.62548828125,-69.75029296875002],[16.3154296875,-69.84443359375001],[16.22265625,-70.00761718750002]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[26.857226562500017,-70.38115234375002],[26.79296875,-70.41933593750002],[26.608789062500023,-70.41240234375002],[26.47021484375,-70.44794921875001],[26.35761718750001,-70.43427734375001],[26.00537109375,-70.37294921875002],[25.964257812500023,-70.29453125],[25.9541015625,-70.26142578125001],[25.982519531250006,-70.19990234375001],[26.301074218750017,-70.07246093750001],[26.425585937500017,-70.060546875],[26.604785156250017,-70.07822265625],[26.68623046875001,-70.11445312500001],[26.737402343750006,-70.18603515625],[26.874804687500017,-70.32998046875002],[26.857226562500017,-70.38115234375002]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-31.118847656249983,-79.7984375],[-30.985058593749983,-79.81845703125],[-30.8408203125,-79.77128906250002],[-30.861474609374994,-79.72587890625002],[-30.779931640624994,-79.64736328125002],[-30.66015625,-79.73310546875001],[-29.87089843749999,-79.8232421875],[-29.614453124999983,-79.90957031250002],[-29.72075195312499,-79.92988281250001],[-29.80009765624999,-79.92597656250001],[-30.029003906249983,-79.9361328125],[-30.422119140625,-80.01083984375],[-30.844433593749983,-79.9384765625],[-31.59423828125,-79.8876953125],[-31.824121093749994,-79.84951171875002],[-32.00029296874999,-79.732421875],[-31.680419921875,-79.63427734375],[-31.604882812499994,-79.64472656250001],[-31.118847656249983,-79.7984375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-33.934179687500006,-79.32041015625],[-34.049951171874994,-79.35712890625001],[-36.481298828125006,-79.29404296875],[-36.60078124999998,-79.28271484375],[-36.56596679687499,-79.20878906250002],[-36.23779296875,-79.19570312500002],[-36.047998046874994,-79.18115234375],[-35.79023437499998,-79.14892578125],[-35.597314453124994,-79.09189453125],[-35.53466796875,-79.09003906250001],[-34.391503906249994,-79.22294921875002],[-33.994726562500006,-79.27851562500001],[-33.947167968749994,-79.30537109375001],[-33.934179687500006,-79.32041015625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-3.280224609374983,-70.5337890625],[-3.44189453125,-70.53544921875002],[-3.490234375,-70.50800781250001],[-3.496826171875,-70.48837890625],[-3.287451171874977,-70.34404296875002],[-3.173242187499994,-70.30732421875001],[-2.949902343749983,-70.27968750000002],[-2.805126953124983,-70.28847656250002],[-2.713525390624994,-70.32021484375002],[-2.68437,-70.37617187500001],[-2.682714843749977,-70.46220703125002],[-2.738037109375,-70.50703125000001],[-3.280224609374983,-70.5337890625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-20.607421875,-73.88662109375002],[-20.654248046874983,-74.10498046875],[-20.641259765624994,-74.15058593750001],[-20.600341796875,-74.196875],[-20.42333984375,-74.3173828125],[-20.41142578124999,-74.40849609375002],[-20.416650390624994,-74.443359375],[-20.489013671875,-74.49267578125],[-20.737011718749983,-74.48095703125],[-20.81767578124999,-74.45478515625001],[-20.845654296874983,-74.43779296875002],[-20.976757812499983,-74.22509765625],[-21.051220703124983,-74.17607421875002],[-21.16655273437499,-74.13261718750002],[-21.60986328125,-74.091796875],[-22.035351562499983,-74.10654296875],[-21.930371093749983,-74.056640625],[-21.288281249999983,-73.98935546875],[-21.126367187499994,-73.93984375000002],[-21.024511718749977,-73.88007812500001],[-20.979199218749983,-73.79042968750002],[-20.867041015624977,-73.67666015625002],[-20.690136718749983,-73.62519531250001],[-20.580224609374994,-73.61923828125],[-20.520703124999983,-73.71181640625002],[-20.520703124999983,-73.7978515625],[-20.607421875,-73.88662109375002]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-16.1044921875,-72.67910156250002],[-16.1748046875,-72.70283203125001],[-16.317578124999983,-72.7021484375],[-16.453027343749994,-72.65234375],[-16.509765625,-72.58222656250001],[-16.516552734374983,-72.530859375],[-16.45537109374999,-72.47353515625002],[-16.355859375,-72.45859375],[-16.302880859374994,-72.47802734375],[-16.172509765624994,-72.6],[-16.1044921875,-72.67910156250002]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-12.508886718749977,-72.17333984375],[-12.588427734374989,-72.19609375000002],[-12.720166015624983,-72.18769531250001],[-12.888427734375,-72.13710937500002],[-12.943701171874977,-72.09892578125002],[-12.96328125,-72.064453125],[-12.914794921875,-72.0146484375],[-12.87548828125,-72.00068359375001],[-12.788867187499989,-72.00654296875001],[-12.636621093749994,-72.0712890625],[-12.534765624999977,-72.14003906250002],[-12.508886718749977,-72.17333984375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-32.342529296875,-79.67363281250002],[-32.514892578125,-79.68281250000001],[-32.583251953125,-79.65830078125],[-32.500830078125006,-79.59228515625],[-32.376611328124994,-79.53466796875],[-32.15,-79.5298828125],[-31.933447265625006,-79.56787109375],[-31.956738281249983,-79.60380859375002],[-32.00117187499998,-79.60703125],[-32.342529296875,-79.67363281250002]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-45.7177734375,-60.520898437499994],[-45.49970703124998,-60.546484375],[-45.38627929687499,-60.58271484375001],[-45.357421875,-60.62382812500002],[-45.228125,-60.639746093750006],[-45.21098632812499,-60.64814453125001],[-45.186376953125006,-60.671875],[-45.1728515625,-60.69873046875],[-45.173681640625006,-60.733007812500006],[-45.398046875,-60.64970703125002],[-45.70917968749998,-60.645410156249994],[-45.780029296875,-60.586035156250006],[-45.93730468749999,-60.61992187500002],[-45.95478515624998,-60.59746093750002],[-45.956298828125,-60.568359375],[-45.934814453125,-60.52656250000001],[-45.83417968749998,-60.54345703125],[-45.7177734375,-60.520898437499994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-54.070703125,-61.29912109375002],[-54.1154296875,-61.308496093749994],[-54.18388671874999,-61.26972656250001],[-54.19223632812499,-61.24658203125],[-54.121972656249994,-61.201757812500006],[-54.04990234374999,-61.14208984375],[-54.024316406249994,-61.13525390625],[-54.04130859374999,-61.25537109375],[-54.070703125,-61.29912109375002]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-67.2619140625,-79.45263671875],[-67.434326171875,-79.50117187500001],[-68.16147460937499,-79.478515625],[-68.40810546875,-79.46396484375],[-68.54892578124999,-79.43740234375002],[-68.422265625,-79.33320312500001],[-68.324365234375,-79.29824218750002],[-68.23300781249999,-79.28496093750002],[-68.03256835937499,-79.2271484375],[-67.71416015624999,-79.21406250000001],[-67.47451171875,-79.22294921875002],[-67.06865234374999,-79.26845703125002],[-67.17294921874999,-79.3115234375],[-67.239501953125,-79.32763671875],[-67.3048828125,-79.39404296875],[-67.2619140625,-79.45263671875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-55.165429687499994,-61.22041015625001],[-55.297021484374994,-61.24853515625],[-55.346923828125,-61.21162109375001],[-55.369140625,-61.146386718749994],[-55.44023437499999,-61.10615234375001],[-55.38701171874999,-61.07265625],[-54.67099609374999,-61.11699218750002],[-54.7099609375,-61.139746093750006],[-55.0576171875,-61.16865234375001],[-55.165429687499994,-61.22041015625001]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-55.52802734375,-63.17353515625001],[-55.466259765625,-63.199609375],[-55.21552734375,-63.198632812499994],[-55.15625,-63.20478515625001],[-55.1064453125,-63.24931640625002],[-55.0751953125,-63.324316406250006],[-55.15678710937499,-63.353125],[-55.593652343749994,-63.335839843749994],[-55.7501953125,-63.29667968750002],[-55.83046875,-63.2984375],[-56.00913085937499,-63.34150390625001],[-56.0830078125,-63.38261718750002],[-56.378515625,-63.43730468750002],[-56.462841796875,-63.418066406250006],[-56.4990234375,-63.35761718750001],[-56.505322265625,-63.33427734375002],[-56.475341796875,-63.318261718749994],[-56.460546875,-63.30195312500001],[-56.465966796874994,-63.28349609375002],[-56.38510742187499,-63.23408203125001],[-56.0421875,-63.157128906249994],[-55.58964843749999,-63.128320312499994],[-55.528710937499994,-63.156835937500006],[-55.52802734375,-63.17353515625001]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-55.87255859375,-63.53564453125],[-55.95673828125,-63.579980468749994],[-56.178369140624994,-63.51328125],[-56.23520507812499,-63.468847656250006],[-56.209863281249994,-63.436914062499994],[-55.85791015625,-63.407324218750006],[-55.76181640624999,-63.42207031250001],[-55.719189453125,-63.492089843749994],[-55.87255859375,-63.53564453125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-57.240478515625,-64.56679687500002],[-57.32626953124999,-64.57070312500002],[-57.43339843749999,-64.54023437500001],[-57.447900390624994,-64.48847656250001],[-57.44589843749999,-64.45986328125002],[-57.365625,-64.43876953125002],[-57.31455078124999,-64.43535156250002],[-57.02255859374999,-64.35234375000002],[-56.8947265625,-64.3330078125],[-56.95170898437499,-64.38173828125002],[-56.945263671875,-64.42724609375],[-56.99101562499999,-64.46796875000001],[-57.240478515625,-64.56679687500002]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-58.83793945312499,-62.30253906250002],[-59.05942382812499,-62.347753906250006],[-59.174560546875,-62.3017578125],[-59.20244140624999,-62.283105468749994],[-59.06381835937499,-62.23906250000002],[-58.990625,-62.24921875000001],[-58.962109375,-62.26386718750001],[-58.878662109375,-62.26787109375002],[-58.83793945312499,-62.30253906250002]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-57.978417968749994,-61.91191406250002],[-57.84931640625,-61.93994140625],[-57.73798828125,-61.92119140625002],[-57.67656249999999,-61.94208984375001],[-57.63652343749999,-61.99824218750001],[-57.639550781249994,-62.020410156249994],[-57.80668945312499,-62.01191406250001],[-57.96274414062499,-62.077539062499994],[-58.14755859374999,-62.0634765625],[-58.17221679687499,-62.117773437500006],[-58.13310546874999,-62.14580078125002],[-58.183007812499994,-62.170019531250006],[-58.341455078124994,-62.11943359375002],[-58.46665039062499,-62.13720703125],[-58.50732421875,-62.225683593750006],[-58.561962890625,-62.24394531250002],[-58.59404296874999,-62.24775390625001],[-58.643994140625,-62.225195312500006],[-58.745703125,-62.217871093750006],[-58.755322265625,-62.2060546875],[-58.81904296875,-62.171289062499994],[-59.00371093749999,-62.20976562500002],[-58.955224609374994,-62.16425781250001],[-58.70952148437499,-62.04472656250002],[-58.68359375,-62.008203125],[-58.39946289062499,-61.93828125000002],[-58.26518554687499,-61.95332031250001],[-57.978417968749994,-61.91191406250002]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-61.95244140624999,-64.0771484375],[-62.043896484375,-64.08037109375002],[-62.020751953125,-64.02734375],[-61.936279296875,-63.990234375],[-61.798242187499994,-63.96660156250002],[-61.88623046875,-64.026953125],[-61.9111328125,-64.05449218750002],[-61.95244140624999,-64.0771484375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-61.99760742187499,-69.721875],[-62.08515625,-69.7294921875],[-62.17192382812499,-69.63662109375002],[-62.216015625,-69.49492187500002],[-62.496240234374994,-69.28818359375],[-62.56767578124999,-69.18046875000002],[-62.515869140625,-69.15458984375002],[-62.442138671875,-69.14599609375],[-62.23896484375,-69.17578125],[-62.117919921875,-69.21474609375002],[-61.97836914062499,-69.300390625],[-61.81596679687499,-69.37617187500001],[-61.78369140625,-69.44189453125],[-61.80717773437499,-69.5146484375],[-61.911328125,-69.53339843750001],[-61.9078125,-69.58759765625001],[-61.970117187499994,-69.69140625],[-61.99760742187499,-69.721875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-63.31621093749999,-64.86113281250002],[-63.47441406249999,-64.90654296875002],[-63.558349609375,-64.90595703125001],[-63.45927734374999,-64.79628906250002],[-63.36689453125,-64.79208984375],[-63.219384765624994,-64.72978515625002],[-63.17724609375,-64.73876953125],[-63.25693359374999,-64.79082031250002],[-63.31621093749999,-64.86113281250002]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-62.32578125,-64.4244140625],[-62.395898437499994,-64.46464843750002],[-62.45517578124999,-64.4716796875],[-62.50810546874999,-64.4541015625],[-62.5796875,-64.5142578125],[-62.727001953125,-64.49599609375002],[-62.78178710937499,-64.47900390625],[-62.746826171875,-64.4716796875],[-62.7208984375,-64.44453125000001],[-62.643017578125,-64.3916015625],[-62.50400390624999,-64.25341796875],[-62.479736328125,-64.21064453125001],[-62.590283203125,-64.1396484375],[-62.610742187499994,-64.11630859375],[-62.585693359375,-64.07558593750002],[-62.54497070312499,-64.04570312500002],[-62.451416015625,-64.01240234375001],[-62.328759765624994,-64.01347656250002],[-62.26762695312499,-64.03994140625002],[-62.26875,-64.09003906250001],[-62.058496093749994,-64.13808593750002],[-62.09384765624999,-64.23457031250001],[-62.174267578125,-64.29599609375],[-62.185693359374994,-64.36884765625001],[-62.3037109375,-64.4013671875],[-62.32578125,-64.4244140625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-62.61508789062499,-63.0693359375],[-62.6552734375,-63.073828125],[-62.6388671875,-63.03193359375001],[-62.52705078125,-62.923828125],[-62.31743164062499,-62.874121093750006],[-62.34404296874999,-62.91777343750002],[-62.41147460937499,-62.971582031249994],[-62.61508789062499,-63.0693359375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-59.38901367187499,-62.4443359375],[-59.52524414062499,-62.45146484375002],[-59.61943359374999,-62.39501953125],[-59.66069335937499,-62.35429687500002],[-59.478515625,-62.352148437500006],[-59.39584960937499,-62.367285156250006],[-59.35336914062499,-62.41289062500002],[-59.38901367187499,-62.4443359375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-56.059960937499994,-63.078515625],[-56.258984375,-63.17314453125002],[-56.35410156249999,-63.168847656249994],[-56.545849609375,-63.09833984375001],[-56.600537109375,-63.061621093750006],[-56.614160156249994,-63.04511718750001],[-56.48857421874999,-62.98222656250002],[-56.140380859375,-63.005273437499994],[-56.061767578125,-63.0126953125],[-56.05844726562499,-63.0185546875],[-56.051025390625,-63.0546875],[-56.059960937499994,-63.078515625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-60.625,-62.56005859375],[-60.576318359374994,-62.57265625],[-60.139892578125,-62.548730468749994],[-60.00273437499999,-62.61845703125002],[-59.849560546875,-62.61494140625001],[-60.220947265625,-62.74541015625002],[-60.32158203124999,-62.70751953125],[-60.35380859374999,-62.67919921875],[-60.37802734374999,-62.61650390625002],[-60.61962890625,-62.633398437500006],[-60.696923828124994,-62.620703125],[-60.7958984375,-62.66230468750001],[-60.995068359375,-62.679101562499994],[-61.06333007812499,-62.67890625000001],[-61.149804687499994,-62.634179687499994],[-61.15239257812499,-62.58906250000001],[-60.97470703124999,-62.591699218749994],[-60.83774414062499,-62.53369140625],[-60.799267578125,-62.475195312500006],[-60.731835937499994,-62.49101562500002],[-60.625,-62.56005859375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-57.374169921874994,-63.807226562500006],[-57.36020507812499,-63.824804687500006],[-57.16083984375,-63.81572265625002],[-57.10400390625,-63.84121093750002],[-57.218017578125,-63.875585937500006],[-57.24775390625,-63.86835937500001],[-57.34375,-63.878515625],[-57.616357421874994,-63.853613281250006],[-57.683251953124994,-63.81269531250001],[-57.439355468749994,-63.79140625000002],[-57.374169921874994,-63.807226562500006]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-61.158447265625,-69.97578125000001],[-61.30864257812499,-69.97792968750002],[-61.37846679687499,-69.9498046875],[-61.40434570312499,-69.93251953125002],[-61.386474609375,-69.89326171875001],[-61.3271484375,-69.85634765625002],[-61.15185546875,-69.88310546875002],[-61.10791015625,-69.95527343750001],[-61.158447265625,-69.97578125000001]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-60.655908203124994,-68.767578125],[-60.693359375,-68.79501953125],[-60.820068359375,-68.77841796875],[-60.89404296875,-68.75888671875],[-61.01494140624999,-68.70976562500002],[-60.947167968749994,-68.6806640625],[-60.81357421874999,-68.68769531250001],[-60.704833984375,-68.72207031250002],[-60.655908203124994,-68.767578125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-60.740625,-70.710546875],[-60.826074218749994,-70.710546875],[-60.896484375,-70.68964843750001],[-60.9580078125,-70.62900390625],[-60.975537109375,-70.59912109375],[-60.941796875,-70.53251953125002],[-60.88388671874999,-70.517578125],[-60.553662109375,-70.5087890625],[-60.45249023437499,-70.54423828125002],[-60.448974609375,-70.60332031250002],[-60.487695312499994,-70.64667968750001],[-60.740625,-70.710546875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-60.55224609375,-71.05292968750001],[-60.65214843749999,-71.05869140625],[-60.78974609375,-71.04111328125],[-60.90634765624999,-71.007421875],[-60.946484375,-70.9673828125],[-60.8890625,-70.934375],[-60.7828125,-70.9140625],[-60.61313476562499,-70.92011718750001],[-60.53330078124999,-70.9625],[-60.51630859375,-70.99951171875],[-60.53593749999999,-71.04091796875002],[-60.55224609375,-71.05292968750001]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-60.5048828125,-62.967382812500006],[-60.5546875,-62.9775390625],[-60.61972656249999,-62.96904296875002],[-60.61772460937499,-62.98662109375002],[-60.563671875,-63.00898437500001],[-60.62167968749999,-63.01796875],[-60.69291992187499,-62.995703125],[-60.7404296875,-62.948632812499994],[-60.70585937499999,-62.90556640625002],[-60.63740234375,-62.89521484375001],[-60.5048828125,-62.967382812500006]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-60.65312,-63.86660156250002],[-60.77768554687499,-63.90214843750002],[-60.852441406249994,-63.89101562500002],[-60.97216796875,-63.84902343750002],[-60.81005859375,-63.83662109375001],[-60.79667968749999,-63.71669921875002],[-60.71484375,-63.66884765625002],[-60.56235351562499,-63.695898437500006],[-60.655908203124994,-63.75898437500001],[-60.688867187499994,-63.80791015625002],[-60.65498046875,-63.85009765625],[-60.65312,-63.86660156250002]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-93.79560546875,-72.91972656250002],[-93.96552734375,-72.92021484375002],[-94.078125,-72.88388671875],[-94.11318359375,-72.86005859375001],[-94.04697265624999,-72.82304687500002],[-94.00424804687499,-72.81972656250002],[-93.799560546875,-72.88203125000001],[-93.755810546875,-72.90761718750002],[-93.79560546875,-72.91972656250002]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-91.16069335937499,-73.1822265625],[-91.344189453125,-73.20712890625],[-91.51083984374999,-73.19550781250001],[-91.450390625,-72.96787109375],[-91.356884765625,-72.90947265625002],[-91.38212890624999,-72.86787109375001],[-91.55146484375,-72.75361328125001],[-91.67001953124999,-72.62373046875001],[-91.61240234374999,-72.59384765625],[-91.30351562499999,-72.54736328125],[-90.947412109375,-72.55634765625001],[-90.80712890625,-72.61064453125002],[-90.763330078125,-72.68105468750002],[-90.78017578125,-72.73173828125002],[-90.89536132812499,-72.82363281250002],[-90.77622070312499,-72.85400390625],[-90.7509765625,-72.9166015625],[-90.7755859375,-72.99296875000002],[-90.89306640625,-73.083984375],[-90.9984375,-73.13652343750002],[-91.16069335937499,-73.1822265625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-104.53793945312499,-73.16630859375002],[-104.6595703125,-73.21210937500001],[-104.88095703124999,-73.20058593750002],[-105.0529296875,-73.1259765625],[-105.1234375,-73.0263671875],[-105.131787109375,-72.99150390625002],[-105.08457031249999,-72.96591796875],[-104.972412109375,-72.941015625],[-104.53793945312499,-73.16630859375002]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-95.02705078125,-72.6650390625],[-95.21943359375,-72.66982421875002],[-95.27294921875,-72.646875],[-95.21562,-72.59941406250002],[-94.75302734374999,-72.5171875],[-94.56611328125,-72.46806640625002],[-94.53837890624999,-72.47578125000001],[-94.5138671875,-72.49169921875],[-94.43393554687499,-72.58916015625002],[-94.426025390625,-72.61259765625002],[-95.02705078125,-72.6650390625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-71.69501953125,-70.26513671875],[-71.64775390624999,-70.29541015625],[-71.431591796875,-70.26728515625001],[-71.3548828125,-70.2978515625],[-71.340283203125,-70.31748046875],[-71.437744140625,-70.39150390625002],[-71.551220703125,-70.43886718750002],[-71.68466796874999,-70.44228515625002],[-71.781982421875,-70.31884765625],[-71.79526367187499,-70.28837890625002],[-71.69501953125,-70.26513671875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-71.9853515625,-69.69843750000001],[-72.20205078125,-69.74013671875002],[-72.34458007812499,-69.70703125],[-72.7767578125,-69.64501953125],[-72.95732421874999,-69.52910156250002],[-72.936767578125,-69.46884765625],[-72.85732421875,-69.43310546875],[-72.726171875,-69.4130859375],[-72.464306640625,-69.45185546875001],[-72.33115234374999,-69.491796875],[-71.9853515625,-69.69843750000001]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-73.87841796875,-73.35683593750002],[-73.9748046875,-73.37607421875],[-74.03828125,-73.36552734375002],[-74.146630859375,-73.3154296875],[-74.134423828125,-73.27666015625002],[-74.08447265625,-73.24931640625002],[-74.04873046875,-73.22021484375],[-73.83212890624999,-73.11328125],[-73.67421875,-73.10039062500002],[-73.542431640625,-73.12382812500002],[-73.682275390625,-73.225],[-73.72138671875,-73.29628906250002],[-73.87841796875,-73.35683593750002]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-65.84526367187499,-65.84248046875001],[-66.063916015625,-65.880859375],[-66.17529296875,-65.86650390625002],[-66.18144531249999,-65.82636718750001],[-66.153466796875,-65.77373046875002],[-66.04960937499999,-65.7447265625],[-66.06694335937499,-65.66611328125],[-65.99970703125,-65.6328125],[-65.96831054687499,-65.57099609375001],[-65.83359375,-65.52724609375002],[-65.6369140625,-65.54775390625002],[-65.66796875,-65.62617187500001],[-65.669677734375,-65.6529296875],[-65.78374023437499,-65.67431640625],[-65.8138671875,-65.68662109375],[-65.8408203125,-65.73847656250001],[-65.83574218749999,-65.81376953125002],[-65.84526367187499,-65.84248046875001]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-66.5953125,-66.20068359375],[-66.81865234374999,-66.31269531250001],[-66.85,-66.30546875000002],[-66.86752929687499,-66.29384765625002],[-66.86699218749999,-66.27480468750002],[-66.79150390625,-66.23359375000001],[-66.77900390625,-66.11083984375],[-66.63134765625,-66.06679687500002],[-66.5751953125,-66.08242187500002],[-66.62285156249999,-66.13388671875],[-66.59262695312499,-66.17861328125002],[-66.5953125,-66.20068359375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-67.34892578124999,-67.7662109375],[-67.54453125,-67.78525390625],[-67.693359375,-67.76347656250002],[-67.689697265625,-67.68769531250001],[-67.7306640625,-67.67949218750002],[-67.74326171874999,-67.66123046875],[-67.55673828124999,-67.6044921875],[-67.41767578125,-67.590625],[-67.246728515625,-67.59873046875],[-67.17490234374999,-67.62451171875],[-67.1494140625,-67.65019531250002],[-67.2796875,-67.7119140625],[-67.29970703125,-67.73720703125002],[-67.34892578124999,-67.7662109375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-67.36240234374999,-66.89453125],[-67.40922851562499,-66.901953125],[-67.52080078124999,-66.89726562500002],[-67.59326171875,-66.8755859375],[-67.49951171875,-66.80361328125002],[-67.51083984374999,-66.75625],[-67.4259765625,-66.7369140625],[-67.331689453125,-66.753515625],[-67.26875,-66.81523437500002],[-67.256982421875,-66.84091796875],[-67.36240234374999,-66.89453125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-179.97490234375,-16.9248046875],[-180,-16.962988281250006],[-180,-16.9078125],[-179.999951171875,-16.85878906250001],[-179.999951171875,-16.785546875],[-179.893603515625,-16.70039062500001],[-179.860986328125,-16.68828125],[-179.822314453125,-16.76533203125001],[-179.8677734375,-16.85029296875001],[-179.97490234375,-16.9248046875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-179.929443359375,-16.50283203125001],[-180,-16.5400390625],[-180,-16.51289062500001],[-179.999951171875,-16.488867187500006],[-179.94365234375,-16.44140625],[-179.900927734375,-16.43154296875001],[-179.92734375,-16.479101562500006],[-179.929443359375,-16.50283203125001]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[180,-16.96308593750001],[179.92587890625003,-17.000292968750003],[179.89697265625,-16.96406250000001],[179.93095703125005,-16.8759765625],[180,-16.785742187500006],[179.99921875,-16.85878906250001],[180,-16.96308593750001]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-78.89833984375,8.274267578124991],[-78.918115234375,8.23193359375],[-78.96494140624999,8.326269531249991],[-78.957421875,8.3505859375],[-78.960595703125,8.435839843749989],[-78.916015625,8.458251953125],[-78.883251953125,8.460253906249989],[-78.85615234375,8.4482421875],[-78.83916015624999,8.347900390625],[-78.85322265625,8.302441406249997],[-78.89833984375,8.274267578124991]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[154.81044921875002,49.31201171875],[154.71484375,49.26767578125],[154.61093750000003,49.29404296875],[154.61298828125,49.380615234375],[154.82490234375,49.646923828125],[154.899609375,49.63037109375],[154.88330078125,49.56640625],[154.80234375000003,49.46826171875],[154.82988281250005,49.347900390625],[154.81044921875002,49.31201171875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[59.313085937500006,81.305224609375],[59.09697265625002,81.29228515625],[58.71904296875002,81.313525390625],[58.61015625000002,81.337255859375],[58.63447265625001,81.3603515625],[58.88056640625001,81.391845703125],[59.075,81.397705078125],[59.280859375,81.36611328125],[59.374609375,81.325048828125],[59.313085937500006,81.305224609375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[54.41533203125002,80.472802734375],[54.27587890625,80.421337890625],[53.81191406250002,80.476220703125],[53.85,80.503857421875],[53.90019531250002,80.5154296875],[53.90156250000001,80.54248046875],[53.85888671875,80.563037109375],[53.87724609375002,80.6052734375],[54.1767578125,80.574365234375],[54.20537109375002,80.561767578125],[54.40712890625002,80.54013671875],[54.43730468750002,80.498681640625],[54.41533203125002,80.472802734375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[61.14082031250001,80.950341796875],[60.826757812500006,80.9296875],[60.32109375000002,80.955517578125],[60.058203125,80.984619140625],[60.07832031250001,80.999169921875],[60.147558593750006,81.016650390625],[60.58662109375001,81.0876953125],[61.45742187500002,81.103955078125],[61.5673828125,81.05029296875],[61.47197265625002,81.01103515625],[61.14082031250001,80.950341796875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[53.52138671875002,80.185205078125],[52.85634765625002,80.1732421875],[52.63593750000001,80.178857421875],[52.60703125,80.191162109375],[52.55048828125001,80.20185546875],[52.34355468750002,80.213232421875],[52.21337890625,80.263720703125],[52.27021484375001,80.276318359375],[52.57666015625,80.296923828125],[52.68056640625002,80.318505859375],[52.71601562500001,80.34755859375],[52.85390625000002,80.402392578125],[53.185644531250006,80.412646484375],[53.329199218750006,80.402392578125],[53.34589843750001,80.36630859375],[53.48613281250002,80.323388671875],[53.851660156250006,80.268359375],[53.777929687500006,80.2283203125],[53.652929687500006,80.22255859375],[53.52138671875002,80.185205078125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[57.078710937500006,80.350927734375],[57.12265625,80.3169921875],[57.11894531250002,80.1939453125],[57.07275390625,80.139404296875],[57.080175781250006,80.094677734375],[56.986914062500006,80.071484375],[56.20058593750002,80.07646484375],[55.811621093750006,80.087158203125],[55.72402343750002,80.104736328125],[55.94228515625002,80.16328125],[56.01220703125,80.20390625],[55.98984375,80.320068359375],[56.0244140625,80.34130859375],[56.65507812500002,80.330322265625],[56.70722656250001,80.36328125],[56.94453125000001,80.366162109375],[57.078710937500006,80.350927734375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[59.68886718750002,79.955810546875],[59.330664062500006,79.923046875],[59.20263671875,79.932958984375],[59.16923828125002,79.948291015625],[59.10039062500002,79.96416015625],[58.91923828125002,79.984619140625],[58.94609375000002,80.042333984375],[59.00146484375,80.05390625],[59.54453125,80.11884765625],[59.80166015625002,80.082666015625],[59.91103515625002,79.994287109375],[59.68886718750002,79.955810546875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-66.472119140625,-55.229101562500006],[-66.551708984375,-55.272851562499994],[-66.61113281249999,-55.269921875],[-66.63017578124999,-55.25410156250001],[-66.63662109375,-55.234375],[-66.624755859375,-55.21308593750001],[-66.59970703124999,-55.19365234375002],[-66.54155273437499,-55.16943359375],[-66.52314453125,-55.16552734375],[-66.435791015625,-55.18974609375002],[-66.472119140625,-55.229101562500006]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-75.04248046875,-44.89013671875],[-75.06748046874999,-44.90654296875002],[-75.09873046874999,-44.901757812499994],[-75.12421875,-44.86992187500002],[-75.14213867187499,-44.815625],[-75.107421875,-44.79511718750001],[-75.0794921875,-44.79511718750001],[-75.0484375,-44.82392578125001],[-75.0322265625,-44.870507812499994],[-75.04248046875,-44.89013671875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-75.51025390625,-48.76347656250002],[-75.62285156249999,-48.7646484375],[-75.65092773437499,-48.586328125],[-75.51845703125,-48.32880859375001],[-75.509033203125,-48.23066406250001],[-75.55351562499999,-48.15673828125],[-75.571484375,-48.09589843750001],[-75.560693359375,-48.070898437500006],[-75.39140624999999,-48.01972656250001],[-75.33837890625,-48.07402343750002],[-75.27548828124999,-48.21845703125001],[-75.155517578125,-48.425195312499994],[-75.15849609374999,-48.62265625],[-75.22509765625,-48.67138671875],[-75.433984375,-48.72119140625],[-75.51025390625,-48.76347656250002]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-75.302001953125,-50.67998046875002],[-75.33046875,-50.772363281249994],[-75.411376953125,-50.76435546875001],[-75.43852539062499,-50.741113281249994],[-75.45263671875,-50.682519531249994],[-75.47739257812499,-50.654199218749994],[-75.44267578124999,-50.59550781250002],[-75.41977539062499,-50.530371093750006],[-75.42763671875,-50.480566406250006],[-75.3037109375,-50.483984375],[-75.15615234375,-50.49677734375001],[-75.11533203124999,-50.51044921875001],[-75.16044921874999,-50.55439453125001],[-75.20341796874999,-50.580664062500006],[-75.29233398437499,-50.596875],[-75.302001953125,-50.67998046875002]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-74.3857421875,-52.92236328125],[-74.3693359375,-52.93144531250002],[-74.32998046875,-52.929296875],[-74.274609375,-52.94550781250001],[-74.06596679687499,-52.96533203125],[-73.87919921874999,-53.01220703125],[-73.78178710937499,-53.056054687499994],[-73.65400390625,-53.06982421875],[-73.549267578125,-53.12568359375001],[-73.504541015625,-53.140039062499994],[-73.4505859375,-53.14433593750002],[-73.31035156249999,-53.24765625],[-73.302490234375,-53.25947265625001],[-73.14335937499999,-53.340917968750006],[-73.135205078125,-53.35390625],[-73.225732421875,-53.3583984375],[-73.409375,-53.32050781250001],[-73.50102539062499,-53.318457031250006],[-73.56728515625,-53.30683593750001],[-73.58281249999999,-53.300195312499994],[-73.595947265625,-53.2529296875],[-73.61708984375,-53.22968750000001],[-73.79350585937499,-53.120703125],[-73.866943359375,-53.096875],[-73.99399414062499,-53.07578125],[-74.13857421875,-53.09052734375001],[-74.23637695312499,-53.07646484375002],[-74.27021484375,-53.08154296875],[-74.41440429687499,-52.99492187500002],[-74.55830078125,-52.921875],[-74.61992187499999,-52.83476562500002],[-74.71152343749999,-52.768164062500006],[-74.71201171874999,-52.74873046875001],[-74.66997070312499,-52.73388671875],[-74.571533203125,-52.77128906250002],[-74.474560546875,-52.83564453125001],[-74.422265625,-52.86005859375001],[-74.3857421875,-52.92236328125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-69.70297851562499,-54.919042968750006],[-68.90078125,-55.01777343750001],[-68.653515625,-54.957910156249994],[-68.4580078125,-54.95966796875001],[-68.3998046875,-55.0419921875],[-68.598095703125,-55.128320312499994],[-68.61328125,-55.15556640625002],[-68.585546875,-55.177734375],[-68.38173828125,-55.19160156250001],[-68.330078125,-55.21943359375001],[-68.282666015625,-55.25517578125002],[-68.32275390625,-55.308203125],[-68.3265625,-55.33271484375001],[-68.305419921875,-55.35664062500001],[-68.152587890625,-55.436914062499994],[-68.08989257812499,-55.47832031250002],[-68.05830078125,-55.51796875],[-68.045556640625,-55.5875],[-68.04833984375,-55.643164062500006],[-68.082666015625,-55.65058593750001],[-68.15708007812499,-55.633691406249994],[-68.229638671875,-55.6015625],[-68.293359375,-55.521386718749994],[-68.338037109375,-55.505273437499994],[-68.46669921875,-55.48906250000002],[-68.594189453125,-55.45],[-68.6935546875,-55.452246093750006],[-68.78500976562499,-55.435644531250006],[-68.86704101562499,-55.4501953125],[-68.896142578125,-55.423828125],[-68.931298828125,-55.37060546875],[-68.932080078125,-55.34736328125001],[-68.88896484374999,-55.26328125],[-68.890087890625,-55.2412109375],[-68.91264648437499,-55.23857421875002],[-69.008203125,-55.255761718749994],[-69.046826171875,-55.24433593750001],[-69.15078125,-55.18339843750002],[-69.192626953125,-55.171875],[-69.2970703125,-55.16582031250002],[-69.35615234375,-55.27392578125],[-69.35922851562499,-55.300683593749994],[-69.2990234375,-55.36933593750001],[-69.180859375,-55.47480468750001],[-69.24082031249999,-55.47675781250001],[-69.41181640625,-55.444238281249994],[-69.455712890625,-55.42402343750001],[-69.50869140625,-55.37089843750002],[-69.61025390625,-55.339941406250006],[-69.6458984375,-55.320898437500006],[-69.65629882812499,-55.2984375],[-69.657373046875,-55.22900390625],[-69.679833984375,-55.21894531250001],[-69.82402343749999,-55.23652343750001],[-69.8537109375,-55.219824218750006],[-69.86577148437499,-55.190625],[-69.88676757812499,-55.17412109375002],[-69.97978515624999,-55.1474609375],[-69.98798828125,-55.130761718749994],[-69.946533203125,-55.11103515625001],[-69.920849609375,-55.061132812500006],[-69.884423828125,-54.88203125000001],[-69.70297851562499,-54.919042968750006]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-75.106689453125,-48.836523437500006],[-75.11508789062499,-48.916015625],[-75.2626953125,-49.068945312500006],[-75.38994140624999,-49.1591796875],[-75.506103515625,-49.23066406250001],[-75.58037109374999,-49.22998046875],[-75.64116210937499,-49.195410156250006],[-75.57285156249999,-49.13886718750001],[-75.48764648437499,-49.082421875],[-75.51455078125,-49.00957031250002],[-75.54013671874999,-48.98847656250001],[-75.576171875,-48.98076171875002],[-75.637841796875,-48.94257812500001],[-75.619140625,-48.88593750000001],[-75.58310546874999,-48.85888671875],[-75.53525390624999,-48.83818359375002],[-75.490478515625,-48.850488281249994],[-75.297265625,-48.810644531250006],[-75.23618164062499,-48.77861328125002],[-75.118603515625,-48.77294921875],[-75.106689453125,-48.836523437500006]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-60.11171875,-51.395898437499994],[-60.24882812499999,-51.39599609375],[-60.27587890625,-51.363183593749994],[-60.275341796875,-51.28056640625002],[-60.17138671875,-51.2734375],[-60.06982421875,-51.30791015625002],[-60.07646484374999,-51.34257812500002],[-60.11171875,-51.395898437499994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-26.264111328124983,-58.43515625],[-26.259863281249977,-58.492285156250006],[-26.41533203124999,-58.43984375],[-26.451025390625006,-58.41533203125002],[-26.401220703125006,-58.383203125],[-26.303466796875,-58.382226562499994],[-26.279394531249977,-58.401757812499994],[-26.264111328124983,-58.43515625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[53.76318359375,12.636816406249991],[53.824804687500006,12.624804687499989],[53.918554687500006,12.659423828125],[54.18740234375002,12.664013671874997],[54.51113281250002,12.552783203124989],[54.45,12.5234375],[54.41376953125001,12.483300781249994],[54.27128906250002,12.446630859374991],[54.129492187500006,12.360644531249989],[53.718847656250006,12.318994140624994],[53.59833984375001,12.34228515625],[53.49941406250002,12.425341796874989],[53.31582031250002,12.533154296874997],[53.38847656250002,12.601855468749989],[53.40390625,12.633349609374989],[53.43095703125002,12.66357421875],[53.53496093750002,12.715771484374997],[53.63847656250002,12.707373046874991],[53.76318359375,12.636816406249991]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[53.33222656250001,24.25859375],[53.25830078125,24.2529296875],[53.19091796875,24.290917968749994],[53.33251953125,24.341601562500003],[53.37089843750002,24.364453125],[53.41240234375002,24.411035156249994],[53.4453125,24.37119140624999],[53.40898437500002,24.307910156250003],[53.38261718750002,24.280859375],[53.33222656250001,24.25859375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[58.72207031250002,20.21875],[58.65908203125002,20.20361328125],[58.64091796875002,20.210693359375],[58.641210937500006,20.337353515624997],[58.78798828125002,20.49658203125],[58.884375,20.680566406249994],[58.95078125,20.516162109375003],[58.83515625000001,20.42392578124999],[58.77226562500002,20.266845703125],[58.72207031250002,20.21875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[52.61689453125001,24.28857421875],[52.6,24.281298828125003],[52.58222656250001,24.335253906250003],[52.58359375,24.35234375],[52.62939453125,24.376757812500003],[52.65761718750002,24.33261718749999],[52.61689453125001,24.28857421875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[56.18798828125,26.921142578125],[56.09492187500001,26.801171875],[55.95429687500001,26.701123046874997],[55.894140625,26.732275390625],[55.84765625,26.730810546875],[55.74726562500001,26.69248046875],[55.67460937500002,26.685839843749996],[55.54316406250001,26.617529296875],[55.42373046875002,26.58310546875],[55.340429687500006,26.585742187499996],[55.3115234375,26.592626953125],[55.295019531250006,26.639208984374996],[55.296484375,26.657568359375],[55.34697265625002,26.64794921875],[55.53173828125,26.710009765624996],[55.76259765625002,26.811962890624997],[55.78457031250002,26.857177734375],[55.74746093750002,26.930957031249996],[55.75761718750002,26.94765625],[55.90712890625002,26.909814453124994],[56.07412109375002,26.983349609374997],[56.213964843750006,27.003271484375],[56.279394531250006,26.952099609374997],[56.18798828125,26.921142578125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[53.927832031250006,24.177197265624997],[53.928125,24.143359375],[53.82636718750001,24.153125],[53.79912109375002,24.135546875],[53.7158203125,24.1453125],[53.63447265625001,24.16977539062499],[53.68964843750001,24.21079101562499],[53.83378906250002,24.258935546874994],[53.89375,24.215136718750003],[53.927832031250006,24.177197265624997]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[41.98769531250002,16.715625],[42.065039062500006,16.71005859374999],[42.033203125,16.741943359375],[42.0263671875,16.75766601562499],[42.05996093750002,16.803515625],[42.17041015625,16.708642578124994],[42.16718750000001,16.596386718749997],[42.1578125,16.570703125],[42.12773437500002,16.59482421874999],[42.1083984375,16.618457031250003],[42.10234375000002,16.643945312499994],[42.07177734375,16.671484375],[41.96416015625002,16.653466796874994],[41.89726562500002,16.684277343749997],[41.80156250000002,16.778759765624997],[41.77607421875001,16.846875],[41.81611328125001,16.86015625],[41.85820312500002,16.89291992187499],[41.88496093750001,16.946826171875003],[41.860449218750006,17.00253906249999],[41.91728515625002,16.99365234375],[41.94794921875001,16.936425781249994],[41.95390625000002,16.80625],[41.9625,16.77866210937499],[41.94667968750002,16.748925781249994],[41.98769531250002,16.715625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[40.141210937500006,15.696142578124991],[40.18251953125002,15.642919921874991],[40.21142578125,15.648144531249997],[40.23408203125001,15.665869140624991],[40.250097656250006,15.703466796874991],[40.408203125,15.629199218750003],[40.399023437500006,15.579882812500003],[40.3046875,15.57734375],[40.19580078125,15.59814453125],[40.09511718750002,15.590917968749991],[39.975195312500006,15.612451171874994],[39.94746093750001,15.696142578124991],[40.02392578125,15.655615234374991],[40.0634765625,15.665869140624991],[40.07050781250001,15.676611328124991],[40.01630859375001,15.733251953124991],[39.93994140625,15.74453125],[39.94521484375002,15.7890625],[39.97939453125002,15.806591796874997],[40.00048828125,15.828271484374994],[39.95673828125001,15.889404296875],[40.042578125,15.87548828125],[40.096777343750006,15.838476562499991],[40.132421875,15.795263671874991],[40.141210937500006,15.696142578124991]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[42.755859375,13.704296875],[42.68974609375002,13.673632812500003],[42.734960937500006,13.752978515625003],[42.78125,13.769287109375],[42.79414062500001,13.76611328125],[42.755859375,13.704296875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[50.60722656250002,25.883105468750003],[50.57490234375001,25.806787109374994],[50.544042968750006,25.83349609375],[50.465917968750006,25.965527343749997],[50.48945312500001,26.058447265625],[50.45244140625002,26.190820312499994],[50.46992187500001,26.228955078124997],[50.5640625,26.246435546875],[50.5859375,26.24072265625],[50.55781250000001,26.198291015624996],[50.60976562500002,26.124462890624997],[50.61748046875002,26.00234375],[50.60722656250002,25.883105468750003]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[42.78740234375002,13.971484375],[42.77421875000002,13.950244140625003],[42.75605468750001,13.954882812500003],[42.69404296875001,14.007910156249991],[42.76210937500002,14.067480468749991],[42.79833984375,14.012255859375003],[42.78740234375002,13.971484375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[48.275390625,29.624316406249996],[48.21826171875,29.601953125],[48.1796875,29.61142578125],[48.142578125,29.665283203125],[48.08144531250002,29.79892578125],[48.11474609375,29.848779296874994],[48.11347656250001,29.87021484375],[48.1201171875,29.886328125],[48.13886718750001,29.89658203125],[48.15859375000002,29.9595703125],[48.18476562500001,29.978857421875],[48.22773437500001,29.936328125],[48.348242187500006,29.782666015624997],[48.34736328125001,29.719970703125],[48.34023437500002,29.694726562499994],[48.275390625,29.624316406249996]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[179.42236328125,-17.366796875],[179.38896484375005,-17.393847656250003],[179.37314453125003,-17.256152343750003],[179.40761718750002,-17.25732421875],[179.4328125,-17.271582031250006],[179.44716796875002,-17.30625],[179.42236328125,-17.366796875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[179.34931640625,-18.10234375],[179.34042968750003,-18.110449218750006],[179.25351562500003,-18.030566406250003],[179.25644531250003,-17.9990234375],[179.27177734375005,-17.970703125],[179.30644531250005,-17.94404296875001],[179.337890625,-17.989550781250003],[179.36240234375003,-18.065234375],[179.34931640625,-18.10234375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[178.82753906250002,-17.72900390625],[178.77607421875,-17.74677734375001],[178.74765625000003,-17.68574218750001],[178.787109375,-17.62441406250001],[178.8310546875,-17.61884765625001],[178.8525390625,-17.68125],[178.82753906250002,-17.72900390625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[168.44677734375,-16.77880859375],[168.4765625,-16.79365234375001],[168.46015625,-16.835058593750006],[168.32275390625,-16.78779296875001],[168.21230468750002,-16.80615234375],[168.18144531250005,-16.804003906250003],[168.14853515625003,-16.765722656250006],[168.12431640625005,-16.690039062500006],[168.13535156250003,-16.63691406250001],[168.1818359375,-16.599902343750003],[168.19921875,-16.593847656250006],[168.23378906250002,-16.6396484375],[168.26542968750005,-16.67080078125001],[168.29609375,-16.684179687500006],[168.36601562500005,-16.7587890625],[168.44677734375,-16.77880859375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[168.29667968750005,-16.336523437500006],[168.18242187500005,-16.346777343750006],[168.0216796875,-16.315625],[167.95703125,-16.272265625],[167.92900390625005,-16.22871093750001],[167.9845703125,-16.19648437500001],[168.06425781250005,-16.18125],[168.16386718750005,-16.081640625],[168.19833984375003,-16.11982421875001],[168.23544921875003,-16.23134765625001],[168.27568359375005,-16.264941406250003],[168.29794921875003,-16.29873046875001],[168.29667968750005,-16.336523437500006]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[168.44580078125,-17.54218750000001],[168.54541015625,-17.684667968750006],[168.5849609375,-17.695898437500006],[168.524609375,-17.79804687500001],[168.3994140625,-17.807226562500006],[168.25166015625,-17.78076171875],[168.305859375,-17.745703125],[168.27783203125,-17.7060546875],[168.23320312500005,-17.698046875],[168.18203125000002,-17.71699218750001],[168.158203125,-17.710546875],[168.19091796875,-17.644824218750003],[168.27314453125,-17.55224609375],[168.29746093750003,-17.544921875],[168.31953125,-17.5439453125],[168.341015625,-17.552050781250003],[168.44580078125,-17.54218750000001]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[167.911328125,-15.4359375],[167.84423828125,-15.481835937500009],[167.72021484375,-15.477441406250009],[167.67421875000002,-15.4515625],[167.82626953125003,-15.31201171875],[168.00253906250003,-15.283203125],[167.911328125,-15.4359375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[166.74580078125,-14.826855468750011],[166.81015625000003,-15.157421875000011],[166.88515625000002,-15.15673828125],[166.92343750000003,-15.13916015625],[166.96757812500005,-15.061718750000011],[166.9873046875,-14.940039062500006],[167.0265625,-14.92265625],[167.07558593750002,-14.935644531250006],[167.05429687500003,-14.974414062500003],[167.0685546875,-15.07177734375],[167.1064453125,-15.125585937500006],[167.13164062500005,-15.135351562500006],[167.18203125000002,-15.389746093750006],[167.20078125000003,-15.443066406250011],[167.19960937500002,-15.485742187500009],[167.0939453125,-15.580859375],[166.93662109375003,-15.578027343750009],[166.82578125000003,-15.634863281250006],[166.75830078125,-15.631152343750003],[166.758984375,-15.566796875],[166.69892578125,-15.515625],[166.6310546875,-15.406054687500003],[166.64785156250002,-15.211523437500006],[166.52724609375002,-14.85009765625],[166.52607421875,-14.759765625],[166.5673828125,-14.641796875000011],[166.60781250000002,-14.636523437500003],[166.66259765625,-14.735058593750011],[166.74580078125,-14.826855468750011]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[168.212890625,-15.970410156250011],[168.19619140625002,-15.9716796875],[168.17929687500003,-15.925683593750009],[168.12285156250005,-15.680859375000011],[168.15996093750005,-15.461816406250009],[168.18349609375002,-15.508203125],[168.2677734375,-15.892285156250011],[168.25634765625,-15.955175781250006],[168.212890625,-15.970410156250011]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[168.18916015625,-15.328710937500006],[168.171875,-15.390625],[168.13046875000003,-15.318945312500006],[168.10419921875,-15.0166015625],[168.11494140625,-14.988574218750003],[168.13642578125,-14.986425781250006],[168.18691406250002,-15.196875],[168.18916015625,-15.328710937500006]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[167.4125,-16.09589843750001],[167.45859375000003,-16.117578125],[167.48369140625005,-16.117578125],[167.49873046875,-16.16621093750001],[167.64199218750002,-16.26328125],[167.68134765625,-16.260546875],[167.71445312500003,-16.31367187500001],[167.77597656250003,-16.34052734375001],[167.79257812500003,-16.394628906250006],[167.83662109375,-16.44970703125],[167.759765625,-16.51640625],[167.61142578125003,-16.498632812500006],[167.5263671875,-16.574316406250006],[167.44931640625003,-16.554980468750003],[167.43613281250003,-16.515234375],[167.446875,-16.501953125],[167.40097656250003,-16.40058593750001],[167.38027343750002,-16.245703125],[167.34921875000003,-16.15449218750001],[167.315625,-16.115527343750003],[167.24609375,-16.14960937500001],[167.21806640625005,-16.1552734375],[167.15146484375003,-16.08046875],[167.18300781250002,-15.928515625],[167.19951171875005,-15.885058593750003],[167.25371093750005,-15.876757812500003],[167.33574218750005,-15.916699218750011],[167.4125,-16.09589843750001]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[167.2189453125,-15.72412109375],[167.20078125000003,-15.750097656250006],[167.0947265625,-15.685253906250011],[167.11904296875002,-15.62255859375],[167.234375,-15.64501953125],[167.2189453125,-15.72412109375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[159.8791015625,-8.534277343750006],[159.880859375,-8.557421875],[159.74648437500002,-8.473828125000011],[159.64453125,-8.371679687500006],[159.35410156250003,-8.260449218750011],[159.29169921875,-8.203417968750003],[159.2392578125,-8.1962890625],[159.09023437500002,-8.103320312500003],[158.94404296875,-8.040722656250011],[158.85458984375003,-7.959765625],[158.83183593750005,-7.926660156250009],[158.77802734375,-7.906933593750011],[158.68623046875,-7.818066406250011],[158.59697265625005,-7.759082031250003],[158.5654296875,-7.6513671875],[158.47880859375005,-7.5771484375],[158.45742187500002,-7.544726562500003],[158.734375,-7.604296875],[158.86279296875,-7.722363281250011],[158.97246093750005,-7.789160156250006],[159.01054687500005,-7.83740234375],[159.109375,-7.903515625000011],[159.19804687500005,-7.909570312500009],[159.28681640625,-7.976171875],[159.36767578125,-7.994140625],[159.43144531250005,-8.029003906250011],[159.84306640625005,-8.326953125],[159.7939453125,-8.406054687500003],[159.8486328125,-8.463476562500006],[159.8791015625,-8.534277343750006]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[157.48671875000002,-7.330371093750003],[157.51865234375003,-7.365625],[157.44130859375002,-7.425683593750009],[157.33925781250002,-7.39306640625],[157.31728515625002,-7.359375],[157.3146484375,-7.341503906250011],[157.24345703125005,-7.35302734375],[157.1015625,-7.323632812500009],[156.904296875,-7.18046875],[156.69580078125,-6.9109375],[156.49492187500005,-6.761621093750009],[156.45742187500002,-6.715234375],[156.45253906250002,-6.63828125],[156.47939453125002,-6.60888671875],[156.60419921875,-6.641015625],[156.76542968750005,-6.7640625],[157.0302734375,-6.891992187500009],[157.1025390625,-6.957226562500011],[157.1484375,-7.11376953125],[157.193359375,-7.160351562500011],[157.3361328125,-7.280468750000011],[157.41162109375,-7.30859375],[157.45156250000002,-7.313671875000011],[157.48671875000002,-7.330371093750003]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[153.65927734375003,-4.099316406250011],[153.65009765625,-4.123046875],[153.59150390625,-4.095996093750003],[153.63974609375003,-4.044726562500003],[153.66298828125002,-4.041210937500011],[153.65927734375003,-4.099316406250011]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[121.159375,6.075634765624997],[121.2138671875,6.003515625],[121.28251953124999,6.022265624999989],[121.39150390625002,6.002099609374994],[121.41464843750003,5.964501953124994],[121.41103515625002,5.93984375],[121.29443359375,5.869970703124991],[121.21816406250002,5.942724609374991],[121.0830078125,5.893017578124997],[121.0185546875,5.922949218749991],[120.9306640625,5.896191406249997],[120.87636718750002,5.95263671875],[120.89824218749999,6.006933593749991],[121.03769531250003,6.095996093749989],[121.159375,6.075634765624997]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[114.41259765625,-7.133496093750011],[114.39765625000001,-7.173144531250003],[114.346875,-7.163281250000011],[114.298828125,-7.097558593750009],[114.32216796875002,-7.080371093750003],[114.34892578124999,-7.073437500000011],[114.38359374999999,-7.080664062500006],[114.41259765625,-7.133496093750011]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[134.35185546875005,34.483642578125],[134.333203125,34.463769531249994],[134.31533203125002,34.4689453125],[134.25185546875002,34.423046875],[134.23808593750005,34.467041015625],[134.18828125000005,34.496337890625],[134.18212890625,34.51923828125],[134.32597656250005,34.534375],[134.372265625,34.522363281249994],[134.35185546875005,34.483642578125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-75.11220703125,-47.83769531250002],[-75.18583984374999,-47.850683593750006],[-75.1943359375,-47.81806640625001],[-75.26103515624999,-47.76386718750001],[-75.203125,-47.72802734375],[-75.08984375,-47.690625],[-75.00395507812499,-47.694726562499994],[-74.92646484375,-47.72314453125],[-74.916015625,-47.75664062500002],[-75.05126953125,-47.80048828125001],[-75.08447265625,-47.82451171875002],[-75.11220703125,-47.83769531250002]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-74.66875,-43.6078125],[-74.81044921875,-43.625390625],[-74.84267578125,-43.59550781250002],[-74.8419921875,-43.5703125],[-74.81767578124999,-43.549414062500006],[-74.74501953125,-43.53593750000002],[-74.6974609375,-43.55302734375002],[-74.67265624999999,-43.57744140625002],[-74.664794921875,-43.599609375],[-74.66875,-43.6078125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-73.63217773437499,-44.82148437500001],[-73.66484374999999,-44.832910156249994],[-73.694580078125,-44.831152343750006],[-73.724755859375,-44.796875],[-73.73486328125,-44.75166015625001],[-73.80014648437499,-44.68408203125],[-73.81845703124999,-44.65214843750002],[-73.81699218749999,-44.61396484375001],[-73.7794921875,-44.559179687500006],[-73.72392578124999,-44.54423828125002],[-73.686474609375,-44.546289062499994],[-73.64121093749999,-44.61083984375],[-73.62822265624999,-44.680761718750006],[-73.6166015625,-44.7529296875],[-73.63217773437499,-44.82148437500001]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-74.56728515625,-48.59199218750001],[-74.58627929687499,-48.61572265625],[-74.70957031249999,-48.601171875],[-74.923046875,-48.62646484375],[-75.012841796875,-48.535742187500006],[-75.0521484375,-48.39140625000002],[-75.07890624999999,-48.36152343750001],[-75.13193359374999,-48.279296875],[-75.15849609374999,-48.22529296875001],[-75.212890625,-48.141699218750006],[-75.23388671875,-48.05341796875001],[-75.247265625,-48.026757812499994],[-75.19829101562499,-47.974609375],[-74.97509765625,-47.9228515625],[-74.895654296875,-47.83935546875],[-74.82744140624999,-47.85039062500002],[-74.84619140625,-48.02080078125002],[-74.80522460937499,-48.078222656250006],[-74.72929687499999,-48.125878906249994],[-74.715234375,-48.1455078125],[-74.702392578125,-48.20585937500002],[-74.66435546874999,-48.29931640625],[-74.61513671875,-48.34306640625002],[-74.60244140625,-48.37031250000001],[-74.60014648437499,-48.39306640625],[-74.61821289062499,-48.425195312499994],[-74.56728515625,-48.59199218750001]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-64.54916992187499,-54.716210937499994],[-64.43881835937499,-54.739355468750006],[-64.22050781249999,-54.72197265625002],[-64.10532226562499,-54.7216796875],[-64.054931640625,-54.729882812499994],[-64.032421875,-54.74238281250001],[-63.88193359374999,-54.72294921875002],[-63.8154296875,-54.72509765625],[-63.83256835937499,-54.76796875],[-63.97124023437499,-54.810644531250006],[-64.0283203125,-54.792578125],[-64.322900390625,-54.796484375],[-64.453271484375,-54.84033203125],[-64.50869140625,-54.839941406250006],[-64.637353515625,-54.90253906250001],[-64.7314453125,-54.86298828125001],[-64.75732421875,-54.8265625],[-64.689208984375,-54.77470703125002],[-64.62509765624999,-54.77363281250001],[-64.58134765624999,-54.75273437500002],[-64.54916992187499,-54.716210937499994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-61.87578124999999,-39.171875],[-61.865966796875,-39.23486328125],[-61.91801757812499,-39.227441406249994],[-62.04160156249999,-39.166894531249994],[-62.08330078124999,-39.11015625000002],[-62.093017578125,-39.08623046875002],[-61.96665039062499,-39.112207031249994],[-61.907128906249994,-39.135644531249994],[-61.87578124999999,-39.171875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-59.68266601562499,-52.23164062500001],[-59.74658203125,-52.250878906249994],[-59.76445312499999,-52.2421875],[-59.78486328125,-52.2046875],[-59.78593749999999,-52.156152343749994],[-59.79331054687499,-52.134179687499994],[-59.75322265624999,-52.14140625000002],[-59.68100585937499,-52.180078125],[-59.68266601562499,-52.23164062500001]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-61.01875,-51.785742187500006],[-60.947265625,-51.79951171875001],[-60.8759765625,-51.79423828125002],[-60.916162109374994,-51.89697265625],[-60.94755859374999,-51.9462890625],[-61.031982421875,-51.942480468750006],[-61.11577148437499,-51.87529296875002],[-61.14501953125,-51.839453125],[-61.051660156249994,-51.81396484375],[-61.01875,-51.785742187500006]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-72.9232421875,-53.48164062500001],[-72.89628906249999,-53.56279296875002],[-72.8822265625,-53.57832031250001],[-72.80937,-53.565332031249994],[-72.685498046875,-53.55791015625002],[-72.48227539062499,-53.58808593750001],[-72.459228515625,-53.59882812500001],[-72.37290039062499,-53.6875],[-72.30668945312499,-53.72539062500002],[-72.20541992187499,-53.80742187500002],[-72.30625,-53.86210937500002],[-72.365966796875,-53.940820312499994],[-72.369140625,-53.98076171875002],[-72.40854492187499,-54.003808593749994],[-72.47050781249999,-54.027734375],[-72.562890625,-54.07373046875],[-72.67656249999999,-54.07890625000002],[-72.78862304687499,-54.103125],[-72.84038085937499,-54.125097656250006],[-72.87099609375,-54.1265625],[-72.90727539062499,-54.114648437499994],[-72.94609374999999,-54.09208984375002],[-72.95859375,-54.06591796875],[-72.88173828125,-54.041601562500006],[-72.781689453125,-53.95478515625001],[-72.76376953124999,-53.86484375],[-72.871728515625,-53.848535156249994],[-72.93613281249999,-53.86083984375],[-72.98422851562499,-53.86054687500001],[-73.039453125,-53.83281250000002],[-73.07304687499999,-53.87529296875002],[-73.085546875,-53.915917968749994],[-73.07084960937499,-53.97802734375],[-73.08076171875,-53.998046875],[-73.11997070312499,-54.009375],[-73.21064453125,-53.98583984375],[-73.30473632812499,-53.943945312500006],[-73.312158203125,-53.91962890625001],[-73.29287109375,-53.835839843749994],[-73.294921875,-53.792089843750006],[-73.31435546875,-53.72919921875001],[-73.32480468749999,-53.72265625],[-73.360107421875,-53.724023437499994],[-73.470947265625,-53.73613281250002],[-73.581640625,-53.65546875000001],[-73.64150390625,-53.5703125],[-73.845458984375,-53.545800781249994],[-73.6865234375,-53.426855468750006],[-73.44707031249999,-53.410058593749994],[-73.365869140625,-53.47021484375],[-73.099365234375,-53.51191406250001],[-73.11533203124999,-53.44804687500002],[-73.11088867187499,-53.425195312499994],[-73.07431640624999,-53.39677734375002],[-73.05361328125,-53.394433593749994],[-73.02207031249999,-53.41455078125],[-72.970947265625,-53.42304687500001],[-72.947265625,-53.442480468750006],[-72.9232421875,-53.48164062500001]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-67.07993164062499,-55.15380859375],[-67.10947265624999,-55.19208984375001],[-67.17255859375,-55.242578125],[-67.257421875,-55.281835937500006],[-67.33969726562499,-55.292578125],[-67.39926757812499,-55.27226562500002],[-67.42939453125,-55.23652343750001],[-67.44326171875,-55.201171875],[-67.46347656249999,-55.181738281250006],[-67.49472656249999,-55.17744140625001],[-67.53525390624999,-55.17851562500002],[-67.585205078125,-55.191992187500006],[-67.69145507812499,-55.24296875000002],[-67.736962890625,-55.256445312500006],[-67.7677734375,-55.25957031250002],[-68.07001953125,-55.22109375],[-68.09951171875,-55.20683593750002],[-68.13510742187499,-55.17265625000002],[-68.17431640625,-55.0712890625],[-68.30136718749999,-54.98066406250001],[-68.10693359375,-54.92939453125001],[-67.87412109374999,-54.9296875],[-67.424560546875,-54.96894531250001],[-67.245263671875,-54.977636718750006],[-67.10732421875,-55.063574218750006],[-67.08549804687499,-55.115234375],[-67.07993164062499,-55.15380859375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-70.9916015625,-54.86796875000002],[-70.94511718749999,-54.93134765625001],[-70.9279296875,-54.94296875],[-70.804833984375,-54.967675781249994],[-70.74931640624999,-54.952734375],[-70.61528320312499,-54.94560546875002],[-70.534765625,-54.921289062499994],[-70.41752929687499,-54.90888671875001],[-70.28305664062499,-55.06591796875],[-70.2978515625,-55.11376953125],[-70.40415039062499,-55.165625],[-70.4755859375,-55.17705078125002],[-70.54345703125,-55.16132812500001],[-70.538720703125,-55.13496093750001],[-70.55107421874999,-55.111914062500006],[-70.59746093749999,-55.08203125],[-70.64091796874999,-55.084863281249994],[-70.71098632812499,-55.10693359375],[-70.74443359374999,-55.10419921875001],[-70.81547851562499,-55.07988281250002],[-70.93984375,-55.061914062499994],[-70.964501953125,-55.039648437500006],[-70.96728515625,-55.0068359375],[-70.99072265625,-54.99042968750001],[-71.120361328125,-54.93779296875002],[-71.2033203125,-54.89296875],[-71.2736328125,-54.88691406250001],[-71.29931640625,-54.89228515625001],[-71.325341796875,-54.91376953125001],[-71.38857421875,-54.93427734375001],[-71.406640625,-54.93085937500001],[-71.426904296875,-54.91376953125001],[-71.43720703125,-54.889257812500006],[-71.410546875,-54.83935546875],[-71.374267578125,-54.834570312500006],[-71.19707031249999,-54.84443359375001],[-71.088623046875,-54.86748046875002],[-70.9916015625,-54.86796875000002]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-67.28886718749999,-55.77685546875],[-67.32529296874999,-55.784765625],[-67.35224609375,-55.766015625],[-67.39335937499999,-55.75273437500002],[-67.5599609375,-55.72480468750001],[-67.5634765625,-55.70781250000002],[-67.546142578125,-55.683691406250006],[-67.51279296874999,-55.662011718749994],[-67.448828125,-55.640625],[-67.39736328125,-55.58515625000001],[-67.37407226562499,-55.58935546875],[-67.3505859375,-55.61210937500002],[-67.31044921875,-55.68867187500001],[-67.262451171875,-55.74375],[-67.26728515625,-55.762792968750006],[-67.28886718749999,-55.77685546875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-74.55864257812499,-51.27705078125001],[-74.56088867187499,-51.36083984375],[-74.59257812499999,-51.3875],[-74.620361328125,-51.39570312500001],[-74.69072265624999,-51.370214843750006],[-74.730908203125,-51.36738281250001],[-74.79736328125,-51.41171875],[-74.85332031249999,-51.434179687500006],[-74.936669921875,-51.428320312500006],[-75.04736328125,-51.398339843749994],[-75.14628906249999,-51.524316406249994],[-75.19243164062499,-51.56669921875002],[-75.28911132812499,-51.625390625],[-75.300048828125,-51.55644531250002],[-75.2384765625,-51.453515625],[-75.21000976562499,-51.38330078125],[-75.15366210937499,-51.27880859375],[-75.04033203124999,-51.31816406250002],[-74.88144531249999,-51.27949218750001],[-74.73666992187499,-51.207617187500006],[-74.611572265625,-51.207128906250006],[-74.5705078125,-51.24541015625002],[-74.55864257812499,-51.27705078125001]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-75.05478515624999,-50.29609375000001],[-75.250390625,-50.37626953125002],[-75.307861328125,-50.34306640625002],[-75.44912109375,-50.343359375],[-75.412109375,-50.25664062500002],[-75.3978515625,-50.19267578125002],[-75.376708984375,-50.16796875],[-75.36884765625,-50.112695312499994],[-75.32666015625,-50.011816406250006],[-75.20966796875,-50.04541015625],[-75.12255859375,-50.055273437500006],[-75.00424804687499,-50.08867187500002],[-74.8759765625,-50.109960937500006],[-74.83857421875,-50.197265625],[-74.96337890625,-50.2373046875],[-75.05478515624999,-50.29609375000001]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-74.82294921875,-51.63017578125002],[-74.78012695312499,-51.82470703125],[-74.74951171875,-51.85185546875002],[-74.6474609375,-51.8662109375],[-74.53681640625,-51.96513671875002],[-74.53183593749999,-51.99199218750002],[-74.665966796875,-52.160058593749994],[-74.694482421875,-52.279199218749994],[-74.851806640625,-52.27070312500001],[-74.917724609375,-52.152246093749994],[-75.01713867187499,-52.03789062500002],[-75.05068359375,-51.90390625],[-75.10537109375,-51.78886718750002],[-75.00810546874999,-51.723730468750006],[-74.915185546875,-51.73828125],[-74.90966796875,-51.65],[-74.82294921875,-51.63017578125002]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-73.81064453124999,-43.827246093750006],[-73.78964843749999,-43.87646484375],[-73.833642578125,-43.883203125],[-73.90415039062499,-43.875390625],[-73.93828124999999,-43.91425781250001],[-73.95566406249999,-43.921972656250006],[-74.11777343749999,-43.8875],[-74.14296875,-43.872167968750006],[-74.13994140624999,-43.82099609375001],[-73.9671875,-43.816503906250006],[-73.85693359375,-43.783789062500006],[-73.84140625,-43.788964843749994],[-73.81064453124999,-43.827246093750006]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-71.39047851562499,-54.0328125],[-71.16875,-54.11259765625002],[-71.021923828125,-54.11181640625],[-71.0228515625,-54.16171875],[-71.0048828125,-54.246679687500006],[-71.02802734375,-54.281152343749994],[-71.082958984375,-54.316308593749994],[-71.11752929687499,-54.366308593750006],[-71.14326171875,-54.3740234375],[-71.304638671875,-54.313574218750006],[-71.473291015625,-54.23115234375001],[-71.55810546875,-54.24560546875],[-71.67060546875,-54.22539062500002],[-71.76123046875,-54.22978515625002],[-71.817578125,-54.276464843750006],[-71.94853515624999,-54.300878906250006],[-71.97236328125,-54.20722656250001],[-72.091552734375,-54.11875],[-72.21044921875,-54.047753906249994],[-72.14604492187499,-53.938867187499994],[-72.06894531249999,-53.921289062499994],[-71.996484375,-53.884863281250006],[-71.70512695312499,-53.92333984375],[-71.554150390625,-53.9560546875],[-71.39047851562499,-54.0328125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-74.1421875,-51.931054687499994],[-74.1720703125,-51.94208984375001],[-74.28310546875,-51.91875],[-74.33867187499999,-51.89794921875],[-74.42363281249999,-51.845117187499994],[-74.437109375,-51.790625],[-74.47539062499999,-51.725683593750006],[-74.45078125,-51.72490234375002],[-74.36210937499999,-51.75068359375001],[-74.32568359375,-51.77021484375001],[-74.27705078125,-51.811621093750006],[-74.13339843749999,-51.87089843750002],[-74.1154296875,-51.88847656250002],[-74.118896484375,-51.9111328125],[-74.1421875,-51.931054687499994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-73.7353515625,-44.39453125],[-73.7845703125,-44.4375],[-73.8623046875,-44.44511718750002],[-73.98330078125,-44.49482421875001],[-73.996044921875,-44.537988281249994],[-74.00205078124999,-44.590917968750006],[-73.91855468749999,-44.6546875],[-73.877392578125,-44.72880859375002],[-73.827880859375,-44.83984375],[-73.792138671875,-44.94580078125],[-73.795361328125,-44.978613281250006],[-73.78647460937499,-45.03359375],[-73.72714843749999,-45.119042968749994],[-73.7216796875,-45.157617187499994],[-73.728173828125,-45.195898437500006],[-73.752099609375,-45.26679687500001],[-73.77099609375,-45.27656250000001],[-73.82988281249999,-45.28349609375002],[-73.83447265625,-45.3265625],[-73.84897460937499,-45.340625],[-74.016259765625,-45.34492187500001],[-74.099072265625,-45.32539062500001],[-74.0892578125,-45.195703125],[-74.19521484375,-45.14482421875002],[-74.26796875,-45.058984375],[-74.34990234374999,-44.91083984375001],[-74.41875,-44.865234375],[-74.49882812499999,-44.748144531250006],[-74.61777343749999,-44.64794921875],[-74.48051757812499,-44.584570312500006],[-74.50180664062499,-44.473535156249994],[-74.42167968749999,-44.435449218749994],[-74.301220703125,-44.39570312500001],[-74.2125,-44.42695312500001],[-74.1328125,-44.415917968749994],[-74.09721679687499,-44.38935546875001],[-74.10810546875,-44.27587890625],[-74.08281249999999,-44.186425781249994],[-73.99492187499999,-44.140234375],[-73.90019531249999,-44.134863281250006],[-73.86455078124999,-44.18535156250002],[-73.8177734375,-44.234960937500006],[-73.70322265624999,-44.27412109375001],[-73.70371093749999,-44.32539062500001],[-73.7353515625,-44.39453125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-74.312890625,-45.691503906250006],[-74.36845703124999,-45.73583984375],[-74.46552734375,-45.757226562499994],[-74.56162109374999,-45.72246093750002],[-74.677734375,-45.73857421875002],[-74.68984375,-45.66259765625],[-74.646435546875,-45.6],[-74.55839843749999,-45.52558593750001],[-74.49467773437499,-45.425878906250006],[-74.50234375,-45.28515625],[-74.45,-45.2529296875],[-74.421875,-45.203222656250006],[-74.310546875,-45.17265625000002],[-74.285400390625,-45.277246093749994],[-74.3154296875,-45.46406250000001],[-74.24003906249999,-45.57451171875002],[-74.22919921875,-45.611328125],[-74.243896484375,-45.65361328125002],[-74.312890625,-45.691503906250006]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-73.56650390624999,45.469091796875],[-73.6435546875,45.449121093749994],[-73.775341796875,45.467626953125],[-73.92021484374999,45.441943359374996],[-73.960546875,45.44140625],[-73.8529296875,45.51572265625],[-73.687451171875,45.561425781249994],[-73.5224609375,45.701171875],[-73.47607421875,45.704736328124994],[-73.53886718749999,45.546435546874996],[-73.55166015625,45.48984375],[-73.56650390624999,45.469091796875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-73.6953125,45.585498046874996],[-73.81591796875,45.564892578125],[-73.85771484374999,45.573583984375],[-73.72465820312499,45.671826171875],[-73.57236328124999,45.694482421874994],[-73.6953125,45.585498046874996]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-60.961572265624994,45.48994140625],[-61.002880859375,45.481738281249996],[-61.0125,45.496044921875],[-61.076171875,45.5373046875],[-61.08173828125,45.5578125],[-61.02597656249999,45.57734375],[-60.91245117187499,45.567285156249994],[-60.953027343749994,45.515527343749994],[-60.961572265624994,45.48994140625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-61.91411132812499,47.284521484375],[-61.87871093749999,47.265527343749994],[-61.81547851562499,47.267578125],[-61.77255859374999,47.259814453124996],[-61.833740234375,47.222607421875],[-61.950830078124994,47.218994140625],[-62.00830078125,47.234277343749994],[-61.924707031249994,47.425146484375],[-61.827294921874994,47.469091796875],[-61.627832031249994,47.59384765625],[-61.548046875,47.631787109375],[-61.474072265625,47.646777343749996],[-61.3955078125,47.637646484375],[-61.475537109375,47.56396484375],[-61.5822265625,47.560009765625],[-61.68408203125,47.49873046875],[-61.750878906249994,47.430810546874994],[-61.83125,47.392041015625],[-61.886621093749994,47.344628906249994],[-61.91411132812499,47.284521484375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-64.50859374999999,47.88671875],[-64.53388671875,47.813769531249996],[-64.6212890625,47.751904296875],[-64.66464843749999,47.747607421874996],[-64.6845703125,47.75361328125],[-64.66049804687499,47.7935546875],[-64.66328125,47.863037109375],[-64.59111328124999,47.872460937499994],[-64.56484375,47.866259765624996],[-64.50859374999999,47.88671875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-64.47607421875,47.958886718749994],[-64.59130859375,47.9072265625],[-64.54072265625,47.9849609375],[-64.51958007812499,48.005078125],[-64.5001953125,48.01376953125],[-64.48125,48.00693359375],[-64.47607421875,47.958886718749994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-71.02573242187499,46.872949218749994],[-71.116650390625,46.86484375],[-71.094970703125,46.899560546874994],[-70.970849609375,46.96142578125],[-70.879638671875,46.99609375],[-70.82578125,46.995361328125],[-70.9134765625,46.91953125],[-71.02573242187499,46.872949218749994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-66.27377929687499,44.292285156249996],[-66.32412109375,44.25732421875],[-66.3119140625,44.2916015625],[-66.25048828125,44.37900390625],[-66.2103515625,44.392041015625],[-66.27377929687499,44.292285156249996]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-68.623193359375,44.196044921875],[-68.66118164062499,44.17626953125],[-68.70170898437499,44.182666015624996],[-68.70302734375,44.231982421874996],[-68.69077148437499,44.24873046875],[-68.6767578125,44.256201171875],[-68.65595703125,44.242333984374994],[-68.623193359375,44.196044921875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-66.7625,44.681787109374994],[-66.89707031249999,44.62890625],[-66.8447265625,44.763916015625],[-66.8021484375,44.80537109375],[-66.74541015624999,44.79140625],[-66.753369140625,44.709814453125],[-66.7625,44.681787109374994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-68.187255859375,44.332470703125],[-68.24545898437499,44.31298828125],[-68.30927734375,44.321484375],[-68.30795898437499,44.268701171874994],[-68.315087890625,44.24970703125],[-68.38579101562499,44.27685546875],[-68.41171875,44.294335937499994],[-68.40947265624999,44.3642578125],[-68.34702148437499,44.43037109375],[-68.29941406249999,44.456494140625],[-68.238037109375,44.438378906249994],[-68.19091796875,44.36435546875],[-68.187255859375,44.332470703125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[113.84453124999999,-7.105371093750009],[113.82558593750002,-7.119921875],[113.65585937500003,-7.11171875],[113.54638671875,-7.193359375],[113.470703125,-7.218457031250011],[113.19843750000001,-7.218359375],[113.166015625,-7.207324218750003],[113.14189453124999,-7.207617187500006],[113.126953125,-7.22412109375],[113.04042968750002,-7.211816406250009],[112.76376953125003,-7.1396484375],[112.72587890624999,-7.07275390625],[112.76875,-7.001269531250003],[112.86806640625002,-6.89990234375],[113.0673828125,-6.879980468750006],[113.97470703125003,-6.873046875],[114.07363281250002,-6.960156250000011],[114.0830078125,-6.989355468750006],[113.88535156250003,-7.049023437500011],[113.84453124999999,-7.105371093750009]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[158.87880859375002,-54.70976562500002],[158.84521484375,-54.74921875000001],[158.8359375,-54.704003906249994],[158.89697265625,-54.50605468750001],[158.95888671875002,-54.47236328125001],[158.94560546875005,-54.575],[158.87880859375002,-54.70976562500002]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-173.953515625,-18.63935546875001],[-173.99130859375,-18.69863281250001],[-174.009326171875,-18.69775390625],[-174.053125,-18.663378906250003],[-174.069140625,-18.640234375],[-174.00244140625,-18.570703125],[-173.96806640625,-18.56533203125001],[-173.921875,-18.58857421875001],[-173.923974609375,-18.608496093750006],[-173.953515625,-18.63935546875001]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-151.409814453125,-16.877734375],[-151.449462890625,-16.879296875],[-151.485498046875,-16.863671875],[-151.476416015625,-16.7607421875],[-151.466748046875,-16.73964843750001],[-151.411181640625,-16.7744140625],[-151.364501953125,-16.8642578125],[-151.409814453125,-16.877734375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-157.342138671875,1.855566406249991],[-157.17578125,1.73984375],[-157.246142578125,1.731738281249989],[-157.4201171875,1.787548828124997],[-157.578955078125,1.902050781249997],[-157.531494140625,1.926855468749991],[-157.508203125,1.885693359374997],[-157.43583984375,1.847265625],[-157.393212890625,1.927685546874997],[-157.365185546875,1.946093749999989],[-157.4921875,2.029296875],[-157.44189453125,2.025048828124994],[-157.321875,1.968554687499989],[-157.342138671875,1.855566406249991]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-139.02431640625,-9.695214843750009],[-138.874462890625,-9.747167968750006],[-138.82734375,-9.741601562500009],[-138.874951171875,-9.792871093750009],[-139.024267578125,-9.820703125],[-139.073681640625,-9.845703125],[-139.13408203125,-9.829492187500009],[-139.166455078125,-9.770214843750011],[-139.02431640625,-9.695214843750009]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-139.059716796875,-9.931347656250011],[-139.133984375,-10.009570312500003],[-139.134228515625,-9.92626953125],[-139.107470703125,-9.915429687500009],[-139.083154296875,-9.915429687500009],[-139.059716796875,-9.931347656250011]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-138.651123046875,-10.515332031250011],[-138.687744140625,-10.532421875000011],[-138.690380859375,-10.425585937500003],[-138.642919921875,-10.445898437500006],[-138.624462890625,-10.462988281250006],[-138.632373046875,-10.4921875],[-138.651123046875,-10.515332031250011]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-149.321533203125,-17.690039062500006],[-149.177685546875,-17.736621093750003],[-149.15087890625,-17.812109375],[-149.181787109375,-17.8623046875],[-149.2544921875,-17.849902343750003],[-149.290478515625,-17.82246093750001],[-149.34111328125,-17.732421875],[-149.481689453125,-17.752734375],[-149.57890625,-17.734960937500006],[-149.6328125,-17.617578125],[-149.635009765625,-17.564257812500003],[-149.61142578125,-17.531640625],[-149.50810546875,-17.496386718750003],[-149.37919921875,-17.52236328125001],[-149.330078125,-17.588964843750006],[-149.321533203125,-17.690039062500006]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-140.072607421875,-8.910449218750003],[-140.170556640625,-8.933984375],[-140.217431640625,-8.9296875],[-140.252685546875,-8.848046875],[-140.2400390625,-8.797558593750011],[-140.2244140625,-8.781542968750003],[-140.057666015625,-8.801464843750011],[-140.043701171875,-8.838476562500006],[-140.046142578125,-8.873632812500006],[-140.072607421875,-8.910449218750003]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-140.075634765625,-9.425976562500011],[-140.09736328125,-9.444140625],[-140.138037109375,-9.384375],[-140.144384765625,-9.359375],[-140.070947265625,-9.328125],[-140.031103515625,-9.3447265625],[-140.075634765625,-9.425976562500011]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-172.33349609375,-13.465234375],[-172.221533203125,-13.5595703125],[-172.17685546875,-13.684667968750006],[-172.224951171875,-13.804296875],[-172.330859375,-13.774707031250003],[-172.484521484375,-13.800195312500009],[-172.535693359375,-13.791699218750011],[-172.6587890625,-13.644824218750003],[-172.744091796875,-13.578710937500006],[-172.778515625,-13.516796875000011],[-172.66962890625,-13.523828125],[-172.510888671875,-13.4828125],[-172.33349609375,-13.465234375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-178.956494140625,-17.27285156250001],[-178.9818359375,-17.30703125],[-179.00390625,-17.294921875],[-178.975537109375,-17.2375],[-178.971484375,-17.212695312500003],[-179.01494140625,-17.182421875],[-179.01767578125,-17.16132812500001],[-179.005029296875,-17.14833984375001],[-178.95283203125,-17.18203125],[-178.921142578125,-17.20839843750001],[-178.91484375,-17.223046875],[-178.924560546875,-17.248632812500006],[-178.956494140625,-17.27285156250001]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-159.3390625,3.923535156249997],[-159.259326171875,3.839208984374991],[-159.274755859375,3.796582031249997],[-159.332275390625,3.800488281249997],[-159.358740234375,3.815332031249994],[-159.313671875,3.82265625],[-159.30625,3.83837890625],[-159.326806640625,3.863183593749994],[-159.35419921875,3.880517578124994],[-159.373193359375,3.880517578124994],[-159.377783203125,3.846630859374997],[-159.409033203125,3.873242187499997],[-159.390966796875,3.899560546874994],[-159.36904296875,3.9169921875],[-159.3390625,3.923535156249997]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-171.4541015625,-14.046484375],[-171.72822265625,-14.047265625],[-171.86376953125,-14.002050781250006],[-171.9119140625,-14.001660156250011],[-172.028076171875,-13.906835937500006],[-172.0458984375,-13.857128906250011],[-171.98486328125,-13.824414062500011],[-171.858154296875,-13.80712890625],[-171.60390625,-13.879199218750003],[-171.5654296875,-13.943066406250011],[-171.506884765625,-13.949902343750011],[-171.461376953125,-13.977636718750006],[-171.449560546875,-14.0224609375],[-171.4541015625,-14.046484375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-170.72626953125,-14.351171875],[-170.76923828125,-14.359765625],[-170.8205078125,-14.312109375],[-170.720849609375,-14.275976562500006],[-170.68916015625,-14.257421875],[-170.568115234375,-14.266796875000011],[-170.640478515625,-14.2822265625],[-170.72626953125,-14.351171875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-169.80341796875,-19.0830078125],[-169.90380859375,-19.13789062500001],[-169.94833984375,-19.072851562500006],[-169.908740234375,-18.990234375],[-169.861572265625,-18.96865234375001],[-169.834033203125,-18.96601562500001],[-169.793408203125,-19.042578125],[-169.80341796875,-19.0830078125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-176.160595703125,-13.3328125],[-176.176904296875,-13.340917968750006],[-176.195361328125,-13.301660156250009],[-176.17119140625,-13.242578125],[-176.14794921875,-13.2216796875],[-176.128076171875,-13.268164062500006],[-176.160595703125,-13.3328125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-174.913134765625,-21.30048828125001],[-174.91865234375,-21.45058593750001],[-174.967529296875,-21.38173828125001],[-174.97294921875,-21.34980468750001],[-174.923486328125,-21.30341796875001],[-174.913134765625,-21.30048828125001]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[134.59541015625,7.38203125],[134.53466796875,7.360644531249989],[134.50625,7.437109375],[134.51572265625003,7.52578125],[134.55595703125005,7.593945312499997],[134.59970703125003,7.615771484374989],[134.60869140625005,7.623583984374989],[134.65117187500005,7.712109375],[134.65957031250002,7.66328125],[134.63271484375002,7.501318359374991],[134.59824218750003,7.438281249999989],[134.59541015625,7.38203125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[145.7775390625,18.07895507812499],[145.72910156250003,18.056933593750003],[145.7892578125,18.155419921874994],[145.80742187500005,18.17265625],[145.83544921875,18.136767578125003],[145.7775390625,18.07895507812499]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[145.751953125,15.133154296874991],[145.74921875,15.107226562500003],[145.6982421875,15.113525390625],[145.68427734375,15.125097656249991],[145.71318359375005,15.215283203124997],[145.786328125,15.256884765625003],[145.821875,15.265380859375],[145.78857421875,15.22265625],[145.78232421875003,15.174609375],[145.751953125,15.133154296874991]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[144.74179687500003,13.25927734375],[144.69951171875005,13.257519531249997],[144.66279296875,13.291064453125003],[144.65,13.3134765625],[144.64931640625002,13.4287109375],[144.79033203125005,13.52685546875],[144.83671875000005,13.622363281250003],[144.87539062500002,13.614648437499994],[144.90966796875,13.599023437499994],[144.94082031250002,13.5703125],[144.77988281250003,13.4111328125],[144.74179687500003,13.25927734375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[145.6623046875,14.970507812500003],[145.62099609375002,14.91953125],[145.59160156250005,14.998828125],[145.58671875000005,15.030810546875003],[145.62480468750005,15.06015625],[145.64736328125002,15.059472656249994],[145.6623046875,14.970507812500003]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[138.14267578125003,9.500683593749997],[138.06708984375,9.419042968749991],[138.06191406250002,9.445751953124997],[138.08505859375003,9.494580078124997],[138.11689453125,9.550195312499994],[138.14697265625,9.58359375],[138.18583984375005,9.593310546874989],[138.21357421875,9.547216796874991],[138.18251953125002,9.507373046874989],[138.14267578125003,9.500683593749997]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[178.48789062500003,-18.97412109375],[178.48769531250002,-19.01708984375],[178.35898437500003,-19.04560546875001],[178.315625,-19.01015625],[178.28798828125002,-19.003710937500003],[178.21132812500002,-19.066503906250006],[178.18916015625,-19.09228515625],[178.1818359375,-19.11171875],[178.162109375,-19.121484375],[178.02080078125005,-19.151660156250003],[177.95869140625,-19.12158203125],[178.00078125000005,-19.10107421875],[178.051953125,-19.06015625],[178.10410156250003,-19.066210937500003],[178.15664062500002,-19.027929687500006],[178.20839843750002,-18.96962890625001],[178.2822265625,-18.95703125],[178.33427734375005,-18.93447265625001],[178.42031250000002,-18.95078125],[178.48789062500003,-18.97412109375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[167.58486328125002,-14.260937500000011],[167.54326171875005,-14.311621093750006],[167.43027343750003,-14.294921875],[167.403515625,-14.281542968750003],[167.41074218750003,-14.197460937500011],[167.43906250000003,-14.16845703125],[167.50644531250003,-14.1421875],[167.59892578125005,-14.183789062500011],[167.58486328125002,-14.260937500000011]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[167.48886718750003,-13.9072265625],[167.47421875000003,-13.917089843750006],[167.45107421875002,-13.909375],[167.391796875,-13.788378906250003],[167.40683593750003,-13.748046875],[167.48105468750003,-13.70947265625],[167.54726562500002,-13.776660156250003],[167.55351562500005,-13.81396484375],[167.55302734375005,-13.845703125],[167.54287109375002,-13.873144531250006],[167.49863281250003,-13.884570312500003],[167.48886718750003,-13.9072265625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[169.89628906250005,-20.186621093750006],[169.86113281250005,-20.241796875],[169.80703125000002,-20.24111328125001],[169.7375,-20.2021484375],[169.75068359375,-20.1533203125],[169.82949218750002,-20.14472656250001],[169.85234375000005,-20.14794921875],[169.89628906250005,-20.186621093750006]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[169.49130859375003,-19.540136718750006],[169.4384765625,-19.648828125],[169.34726562500003,-19.62353515625],[169.2619140625,-19.545019531250006],[169.21748046875,-19.476367187500003],[169.24746093750002,-19.3447265625],[169.29111328125003,-19.32177734375],[169.33671875000005,-19.32929687500001],[169.35996093750003,-19.4578125],[169.49130859375003,-19.540136718750006]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[169.334375,-18.940234375],[169.28828125,-18.988574218750003],[169.248046875,-18.98330078125001],[168.98691406250003,-18.87128906250001],[168.99785156250005,-18.8251953125],[168.98710937500005,-18.707617187500006],[169.0158203125,-18.64375],[169.087890625,-18.617480468750003],[169.14384765625005,-18.63105468750001],[169.17802734375005,-18.72509765625],[169.25576171875002,-18.76337890625001],[169.201171875,-18.795703125],[169.29619140625005,-18.866796875],[169.334375,-18.940234375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[168.0109375,-21.429980468750003],[168.05791015625005,-21.44843750000001],[168.13906250000002,-21.44521484375001],[168.12070312500003,-21.615820312500006],[168.00644531250003,-21.643164062500006],[167.966796875,-21.6416015625],[167.94130859375002,-21.605761718750003],[167.87587890625002,-21.582128906250006],[167.8791015625,-21.52363281250001],[167.8154296875,-21.392675781250006],[167.9259765625,-21.372851562500003],[167.9884765625,-21.337890625],[167.98496093750003,-21.369726562500006],[167.99462890625,-21.40693359375001],[168.0109375,-21.429980468750003]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[166.54677734375002,-20.69873046875],[166.49355468750002,-20.70859375],[166.5578125,-20.61708984375001],[166.55966796875003,-20.561132812500006],[166.58544921875,-20.450488281250003],[166.58251953125,-20.413378906250003],[166.62470703125,-20.418261718750003],[166.67080078125002,-20.4501953125],[166.61787109375,-20.4775390625],[166.60029296875,-20.525390625],[166.60214843750003,-20.58535156250001],[166.62255859375,-20.596289062500006],[166.5888671875,-20.661914062500003],[166.54677734375002,-20.69873046875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[167.40087890625,-21.16064453125],[167.34619140625,-21.16875],[167.27324218750005,-21.096777343750006],[167.13388671875003,-21.060644531250006],[167.07265625000002,-20.99726562500001],[167.03271484375,-20.92255859375001],[167.11171875000002,-20.904101562500003],[167.189453125,-20.803515625],[167.13642578125,-20.76611328125],[167.04501953125003,-20.75947265625001],[167.05576171875003,-20.72021484375],[167.20400390625002,-20.67353515625001],[167.26894531250002,-20.70058593750001],[167.29794921875003,-20.732519531250006],[167.29345703125,-20.89150390625001],[167.36083984375,-20.94208984375001],[167.43056640625002,-21.055273437500006],[167.43027343750003,-21.087011718750006],[167.40087890625,-21.16064453125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[167.54443359375,-22.62324218750001],[167.5126953125,-22.6611328125],[167.47343750000005,-22.6533203125],[167.44375,-22.63916015625],[167.4220703125,-22.61855468750001],[167.44345703125003,-22.54140625],[167.5294921875,-22.579199218750006],[167.54443359375,-22.62324218750001]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[159.95175781250003,-19.31171875000001],[159.93642578125002,-19.333105468750006],[159.92822265625,-19.17431640625],[159.95986328125002,-19.11464843750001],[159.97509765625,-19.23828125],[159.95175781250003,-19.31171875000001]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[166.92919921875,-11.665136718750006],[166.8408203125,-11.681347656250011],[166.80595703125005,-11.67734375],[166.74746093750002,-11.5908203125],[166.79091796875002,-11.5712890625],[166.85546875,-11.578808593750011],[166.87509765625003,-11.6296875],[166.92919921875,-11.665136718750006]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[166.13320312500002,-10.7578125],[166.05332031250003,-10.775097656250011],[166.02792968750003,-10.770214843750011],[165.96816406250002,-10.779492187500011],[165.90400390625,-10.851464843750009],[165.85654296875003,-10.84140625],[165.8193359375,-10.844042968750003],[165.791015625,-10.784765625],[165.79042968750002,-10.756054687500011],[165.8359375,-10.760644531250009],[165.85986328125,-10.703027343750009],[165.9091796875,-10.67431640625],[166.02382812500002,-10.6611328125],[166.12568359375,-10.679882812500011],[166.162109375,-10.693066406250011],[166.1298828125,-10.745214843750006],[166.13320312500002,-10.7578125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[160.57626953125003,-11.7978515625],[160.50654296875,-11.832226562500011],[160.44306640625,-11.81494140625],[160.39453125,-11.788867187500003],[160.35507812500003,-11.7119140625],[160.27021484375,-11.663964843750009],[160.14951171875003,-11.643945312500009],[160.1,-11.610742187500009],[160.087109375,-11.594335937500006],[160.00351562500003,-11.57958984375],[159.97929687500005,-11.537988281250009],[159.986328125,-11.494726562500006],[160,-11.471972656250003],[160.07734375,-11.492871093750011],[160.44873046875,-11.695898437500006],[160.537109375,-11.7587890625],[160.57626953125003,-11.7978515625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[160.74941406250002,-8.31396484375],[160.99765625000003,-8.612011718750011],[160.98779296875,-8.66484375],[160.9541015625,-8.698925781250011],[160.9443359375,-8.799023437500011],[160.9755859375,-8.8375],[161.04345703125,-8.855078125],[161.15869140625,-8.961816406250009],[161.20468750000003,-9.092480468750011],[161.20878906250005,-9.132617187500003],[161.25664062500005,-9.191992187500006],[161.25849609375,-9.31689453125],[161.36796875000005,-9.490332031250006],[161.37753906250003,-9.57373046875],[161.3673828125,-9.611230468750009],[161.321875,-9.589550781250011],[161.19101562500003,-9.392871093750003],[161.04150390625,-9.308007812500009],[161.0244140625,-9.271484375],[160.87343750000002,-9.156835937500006],[160.77207031250003,-8.9638671875],[160.66259765625,-8.62060546875],[160.7140625,-8.539257812500011],[160.59042968750003,-8.372753906250011],[160.59628906250003,-8.328222656250006],[160.64853515625003,-8.33837890625],[160.684765625,-8.336328125],[160.7021484375,-8.316503906250006],[160.74941406250002,-8.31396484375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[161.71533203125,-10.387304687500006],[161.84111328125005,-10.44609375],[161.91435546875005,-10.436425781250009],[162.02285156250002,-10.476855468750003],[162.10537109375002,-10.453808593750011],[162.15683593750003,-10.506054687500011],[162.28720703125003,-10.7099609375],[162.28798828125002,-10.776171875],[162.37333984375005,-10.8232421875],[162.30126953125,-10.832128906250006],[162.20126953125003,-10.807812500000011],[162.12363281250003,-10.824414062500011],[162.04267578125,-10.784863281250011],[161.90585937500003,-10.764355468750011],[161.78681640625,-10.716894531250006],[161.53789062500005,-10.56640625],[161.5392578125,-10.491308593750006],[161.49912109375003,-10.45458984375],[161.48701171875,-10.361425781250006],[161.39794921875,-10.331933593750009],[161.2939453125,-10.326464843750003],[161.28554687500002,-10.282421875000011],[161.30478515625003,-10.204394531250003],[161.38232421875,-10.20556640625],[161.47568359375003,-10.237988281250011],[161.65380859375,-10.351855468750003],[161.69794921875,-10.371289062500011],[161.71533203125,-10.387304687500006]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[161.5478515625,-9.625683593750011],[161.55888671875005,-9.732714843750003],[161.55380859375003,-9.769726562500011],[161.47792968750002,-9.691113281250011],[161.44248046875003,-9.718945312500011],[161.40976562500003,-9.681640625],[161.41201171875002,-9.600390625],[161.4169921875,-9.513769531250006],[161.40224609375002,-9.448144531250009],[161.36416015625002,-9.353417968750009],[161.40683593750003,-9.368457031250003],[161.5478515625,-9.625683593750011]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[159.18857421875003,-9.12353515625],[159.17509765625005,-9.1259765625],[159.128125,-9.11376953125],[159.07109375000005,-9.109667968750003],[159.036328125,-9.075],[159.07763671875,-9.025390625],[159.12978515625002,-8.993066406250009],[159.15371093750002,-9.001367187500009],[159.17607421875005,-9.022070312500006],[159.22841796875002,-9.029980468750011],[159.23398437500003,-9.09375],[159.18857421875003,-9.12353515625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[160.1681640625,-8.995507812500009],[160.22568359375003,-9.009570312500003],[160.25351562500003,-9.00732421875],[160.3193359375,-9.061132812500006],[160.40751953125005,-9.140332031250011],[160.37148437500002,-9.18125],[160.3,-9.160351562500011],[160.27597656250003,-9.168652343750011],[160.26816406250003,-9.163183593750006],[160.253125,-9.1234375],[160.17519531250002,-9.084082031250006],[160.10537109375002,-9.080761718750011],[160.09628906250003,-9.033984375],[160.1681640625,-8.995507812500009]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[159.6876953125,-8.507910156250006],[159.64003906250002,-8.521484375],[159.56923828125002,-8.484765625],[159.53847656250002,-8.451367187500011],[159.55322265625,-8.39921875],[159.59462890625002,-8.379492187500006],[159.6416015625,-8.414453125],[159.64628906250005,-8.450390625000011],[159.6876953125,-8.507910156250006]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[157.76347656250005,-8.2421875],[157.82626953125003,-8.324023437500003],[157.8984375,-8.50634765625],[157.88544921875,-8.569140625],[157.83369140625,-8.57265625],[157.8193359375,-8.612011718750011],[157.74921875,-8.523632812500011],[157.65595703125,-8.499707031250011],[157.587890625,-8.445410156250006],[157.56455078125003,-8.337792968750009],[157.55800781250002,-8.269921875],[157.50419921875005,-8.25830078125],[157.35136718750005,-8.275292968750009],[157.30244140625,-8.333300781250003],[157.232421875,-8.31484375],[157.21757812500005,-8.262792968750006],[157.228515625,-8.211621093750011],[157.32158203125005,-8.161230468750006],[157.340625,-8.096386718750011],[157.43339843750005,-7.984667968750003],[157.490625,-7.965722656250009],[157.598828125,-8.005957031250006],[157.6123046875,-8.16484375],[157.65126953125002,-8.216796875],[157.76347656250005,-8.2421875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[158.20078125000003,-8.821972656250011],[158.17880859375003,-8.82578125],[158.15537109375003,-8.7859375],[158.2099609375,-8.678125],[158.236328125,-8.764843750000011],[158.25341796875,-8.79736328125],[158.20078125000003,-8.821972656250011]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[158.10791015625,-8.684179687500006],[158.00947265625,-8.763085937500009],[157.93759765625003,-8.736425781250006],[157.87929687500002,-8.66875],[157.8984375,-8.587207031250003],[157.90927734375003,-8.565625],[157.93828125000005,-8.5609375],[157.9669921875,-8.544238281250003],[157.99843750000002,-8.508203125],[158.10546875,-8.536816406250011],[158.13222656250002,-8.556640625],[158.068359375,-8.606640625000011],[158.08964843750005,-8.62265625],[158.103515625,-8.646484375],[158.10791015625,-8.684179687500006]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[157.38896484375005,-8.713476562500006],[157.38906250000002,-8.728125],[157.33388671875002,-8.7],[157.21230468750002,-8.565039062500006],[157.23378906250002,-8.519921875],[157.34511718750002,-8.432421875],[157.37949218750003,-8.4208984375],[157.41093750000005,-8.47509765625],[157.38349609375,-8.555078125],[157.34707031250002,-8.575488281250003],[157.3322265625,-8.650683593750003],[157.38896484375005,-8.713476562500006]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[156.68789062500002,-7.923046875000011],[156.66875,-7.936816406250003],[156.63535156250003,-7.8828125],[156.61103515625,-7.865917968750011],[156.61171875000002,-7.805761718750006],[156.5109375,-7.7078125],[156.50244140625,-7.640234375],[156.56093750000002,-7.574023437500003],[156.6396484375,-7.612597656250003],[156.71767578125002,-7.695703125],[156.80908203125,-7.722851562500011],[156.790234375,-7.777929687500006],[156.7080078125,-7.876953125],[156.68789062500002,-7.923046875000011]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[156.60390625000002,-8.171582031250011],[156.59169921875002,-8.1962890625],[156.53964843750003,-8.072949218750011],[156.54228515625005,-8.010839843750006],[156.55126953125,-7.970996093750003],[156.5703125,-7.958789062500003],[156.61240234375003,-8.09619140625],[156.60390625000002,-8.171582031250011]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[157.171875,-8.108105468750011],[157.15,-8.123242187500011],[157.0412109375,-8.117480468750003],[156.95830078125005,-8.014355468750011],[156.958984375,-7.93798828125],[157.02412109375,-7.867871093750011],[157.102734375,-7.85546875],[157.14580078125005,-7.882617187500003],[157.18613281250003,-7.941210937500003],[157.20058593750002,-8.015917968750003],[157.19150390625003,-8.081835937500003],[157.171875,-8.108105468750011]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[155.83984375,-7.09716796875],[155.73935546875003,-7.12109375],[155.67753906250005,-7.088964843750006],[155.70498046875002,-7.0126953125],[155.73896484375,-6.972949218750003],[155.86464843750002,-7.043261718750003],[155.83984375,-7.09716796875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[162.98320312500005,5.325732421874989],[162.99345703125005,5.277246093749994],[162.9298828125,5.30078125],[162.92109375,5.317919921874989],[162.958203125,5.335009765624989],[162.98320312500005,5.325732421874989]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[158.31484375000002,6.813671875],[158.25654296875,6.791015625],[158.18339843750005,6.80126953125],[158.16083984375,6.8828125],[158.12763671875,6.904638671874991],[158.134765625,6.94482421875],[158.18613281250003,6.977734375],[158.29462890625,6.951074218749994],[158.3349609375,6.893164062499991],[158.309375,6.854638671874994],[158.31484375000002,6.813671875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[175.5431640625,-36.279296875],[175.55117187500002,-36.33388671875001],[175.474609375,-36.314453125],[175.44462890625005,-36.2732421875],[175.35878906250002,-36.23066406250001],[175.34619140625,-36.2177734375],[175.33662109375,-36.134765625],[175.38164062500005,-36.094824218750006],[175.38955078125002,-36.077734375],[175.409375,-36.070898437500006],[175.4443359375,-36.11464843750001],[175.51259765625002,-36.17695312500001],[175.5431640625,-36.279296875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[173.91464843750003,-40.863671875],[173.78085937500003,-40.921777343749994],[173.78623046875003,-40.881445312500006],[173.81240234375002,-40.79365234375001],[173.87333984375005,-40.74931640625002],[173.9033203125,-40.74628906250001],[173.96445312500003,-40.712988281250006],[173.9580078125,-40.78681640625001],[173.91464843750003,-40.863671875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[166.7462890625,-45.655859375],[166.74101562500005,-45.704980468749994],[166.72919921875,-45.72968750000001],[166.69453125,-45.729882812499994],[166.64248046875002,-45.72441406250002],[166.59169921875002,-45.701757812500006],[166.55917968750003,-45.70820312500001],[166.53203125000005,-45.699804687500006],[166.56708984375,-45.644433593749994],[166.68564453125003,-45.61503906250002],[166.7314453125,-45.638671875],[166.7462890625,-45.655859375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-176.17763671875,-43.740332031250006],[-176.213525390625,-43.76630859375001],[-176.274853515625,-43.76484375000001],[-176.38173828125,-43.866796875],[-176.375244140625,-43.790625],[-176.407373046875,-43.76093750000001],[-176.49912109375,-43.76806640625],[-176.516552734375,-43.784765625],[-176.454931640625,-43.80488281250001],[-176.441259765625,-43.81611328125001],[-176.500146484375,-43.86015625000002],[-176.439111328125,-43.9546875],[-176.38544921875,-43.95146484375002],[-176.33359375,-44.025292968749994],[-176.333837890625,-44.0484375],[-176.452783203125,-44.07685546875001],[-176.51552734375,-44.116601562499994],[-176.571533203125,-44.11494140625001],[-176.597998046875,-44.10722656250002],[-176.629345703125,-44.0361328125],[-176.63154296875,-44.00625],[-176.562744140625,-43.9541015625],[-176.523779296875,-43.900976562500006],[-176.555126953125,-43.851953125],[-176.6345703125,-43.820214843749994],[-176.807958984375,-43.834570312500006],[-176.84765625,-43.82392578125001],[-176.761083984375,-43.757910156250006],[-176.667236328125,-43.76513671875],[-176.56611328125,-43.71757812500002],[-176.17763671875,-43.740332031250006]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-176.17646484375,-44.321679687499994],[-176.22080078125,-44.33056640625],[-176.214599609375,-44.273535156250006],[-176.229296875,-44.23671875],[-176.1546875,-44.224511718749994],[-176.12255859375,-44.268457031249994],[-176.17646484375,-44.321679687499994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[169.17822265625,-52.49726562500001],[169.23349609375003,-52.548242187499994],[169.12753906250003,-52.5703125],[169.07597656250005,-52.551855468750006],[169.03984375000005,-52.52851562500001],[169.02177734375005,-52.49541015625002],[169.0791015625,-52.49882812500002],[169.12861328125,-52.48515625000002],[169.17822265625,-52.49726562500001]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[166.22109375000002,-50.76152343750002],[166.24287109375,-50.845703125],[166.18789062500002,-50.84609375],[166.0732421875,-50.82265625],[166.03769531250003,-50.78671875],[166.01328125000003,-50.777929687500006],[165.97138671875,-50.81953125000001],[165.90410156250005,-50.82148437500001],[165.88916015625,-50.807714843750006],[165.915625,-50.763085937499994],[166.07382812500003,-50.67900390625002],[166.103125,-50.57304687500002],[166.10136718750005,-50.538964843749994],[166.22509765625,-50.53095703125001],[166.25429687500002,-50.5439453125],[166.26748046875002,-50.55859375],[166.259375,-50.577246093750006],[166.20957031250003,-50.61201171875001],[166.20761718750003,-50.652441406250006],[166.22041015625,-50.6943359375],[166.17949218750005,-50.71464843750002],[166.20078125000003,-50.750878906249994],[166.22109375000002,-50.76152343750002]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[168.14492187500002,-46.862207031249994],[168.14531250000005,-46.90214843750002],[168.041015625,-46.887792968750006],[168.0431640625,-46.9326171875],[168.12548828125,-46.956152343750006],[168.15595703125,-46.98828125],[168.24140625,-46.97900390625],[168.26064453125002,-47.02705078125001],[168.24091796875,-47.07001953125001],[168.18388671875005,-47.1015625],[168.01503906250002,-47.11748046875002],[167.90556640625005,-47.17988281250001],[167.8107421875,-47.17041015625],[167.78496093750005,-47.17607421875002],[167.67636718750003,-47.24296875000002],[167.5548828125,-47.263671875],[167.52197265625,-47.258691406249994],[167.53876953125,-47.19902343750002],[167.62900390625003,-47.14228515625001],[167.63095703125003,-47.087792968749994],[167.65410156250005,-47.04423828125002],[167.74091796875,-47.013574218749994],[167.74199218750005,-46.95683593750002],[167.80078125,-46.90654296875002],[167.76523437500003,-46.79765625000002],[167.78398437500005,-46.699804687500006],[167.95576171875,-46.694433593750006],[168.14492187500002,-46.862207031249994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[137.09365234375002,-15.778125],[137.05087890625003,-15.824414062500011],[136.99648437500002,-15.77578125],[136.98505859375,-15.725976562500009],[136.94267578125005,-15.71171875],[136.96337890625,-15.665722656250011],[136.98574218750002,-15.652441406250006],[137.00957031250005,-15.594824218750006],[137.06455078125003,-15.662890625],[137.07109375000005,-15.738085937500003],[137.09365234375002,-15.778125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[136.86269531250002,-15.619921875],[136.84677734375003,-15.62734375],[136.84560546875002,-15.544042968750006],[136.87685546875002,-15.502539062500006],[136.89023437500003,-15.5888671875],[136.86269531250002,-15.619921875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[136.591015625,-15.628222656250003],[136.53115234375002,-15.632421875],[136.51425781250003,-15.62734375],[136.50273437500005,-15.583105468750006],[136.52255859375003,-15.543164062500011],[136.58603515625003,-15.53369140625],[136.6123046875,-15.544140625000011],[136.591015625,-15.628222656250003]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[132.59335937500003,-11.302832031250006],[132.57363281250002,-11.318359375],[132.49375,-11.163671875],[132.51630859375,-11.116015625],[132.48378906250002,-11.037304687500011],[132.53779296875,-11.028417968750006],[132.57880859375,-10.968847656250006],[132.59326171875,-10.99765625],[132.596875,-11.1064453125],[132.6291015625,-11.169140625000011],[132.59335937500003,-11.302832031250006]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[149.04375,-20.29150390625],[149.01992187500002,-20.302539062500003],[148.98740234375003,-20.3017578125],[148.93886718750002,-20.28369140625],[148.98105468750003,-20.15351562500001],[149.00439453125,-20.221484375],[149.04531250000002,-20.27753906250001],[149.04375,-20.29150390625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[148.935546875,-20.14990234375],[148.91347656250002,-20.154296875],[148.8869140625,-20.1435546875],[148.9064453125,-20.101953125],[148.931640625,-20.068945312500006],[148.96787109375003,-20.04433593750001],[148.95625,-20.13466796875001],[148.935546875,-20.14990234375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[146.2783203125,-18.23125],[146.298828125,-18.32607421875001],[146.3419921875,-18.40009765625001],[146.32705078125002,-18.44863281250001],[146.298828125,-18.484765625],[146.23564453125005,-18.45078125],[146.19130859375002,-18.362890625],[146.1162109375,-18.29238281250001],[146.098828125,-18.251757812500003],[146.18671875,-18.255175781250003],[146.23085937500002,-18.24140625000001],[146.24912109375003,-18.225878906250003],[146.2783203125,-18.23125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[142.27480468750002,-10.704785156250011],[142.19140625,-10.762011718750003],[142.13720703125,-10.73193359375],[142.12548828125,-10.66845703125],[142.1310546875,-10.640625],[142.19794921875,-10.591992187500011],[142.27480468750002,-10.704785156250011]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[142.33896484375003,-10.1921875],[142.27939453125003,-10.254199218750003],[142.21621093750002,-10.235644531250003],[142.19511718750005,-10.199316406250006],[142.21875,-10.1494140625],[142.29873046875002,-10.140429687500003],[142.33896484375003,-10.1921875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[142.16757812500003,-10.154101562500003],[142.14199218750002,-10.18125],[142.09765625,-10.121777343750011],[142.14882812500002,-10.0517578125],[142.19199218750003,-10.085253906250003],[142.16757812500003,-10.154101562500003]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[139.5078125,-16.573046875],[139.43056640625002,-16.66103515625001],[139.39150390625002,-16.64863281250001],[139.35429687500005,-16.696582031250003],[139.28300781250005,-16.71943359375001],[139.23906250000005,-16.71865234375001],[139.15957031250002,-16.74169921875],[139.14765625,-16.7138671875],[139.16269531250003,-16.62587890625001],[139.2287109375,-16.52753906250001],[139.29296875,-16.46728515625],[139.45888671875002,-16.4384765625],[139.587890625,-16.39521484375001],[139.6044921875,-16.40322265625001],[139.69775390625,-16.514941406250003],[139.55966796875003,-16.52949218750001],[139.5078125,-16.573046875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[139.4591796875,-17.114550781250003],[139.42167968750005,-17.131640625],[139.408203125,-17.090625],[139.4591796875,-17.049121093750003],[139.49277343750003,-16.99042968750001],[139.56005859375,-17.0419921875],[139.57089843750003,-17.09443359375001],[139.4591796875,-17.114550781250003]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[136.71464843750005,-13.803906250000011],[136.7580078125,-13.845410156250011],[136.80449218750005,-13.842480468750011],[136.84531250000003,-13.7509765625],[136.87070312500003,-13.763671875],[136.8908203125,-13.78662109375],[136.90556640625005,-13.826953125],[136.84296875,-13.896582031250006],[136.81494140625,-13.907324218750006],[136.78818359375003,-13.94580078125],[136.7453125,-14.07265625],[136.74990234375002,-14.115234375],[136.78701171875002,-14.1578125],[136.88544921875,-14.197265625],[136.93388671875005,-14.179003906250003],[136.95078125000003,-14.184277343750011],[136.93134765625,-14.245996093750009],[136.89433593750005,-14.293066406250006],[136.76318359375,-14.2734375],[136.64970703125005,-14.280468750000011],[136.46054687500003,-14.234570312500011],[136.36328125,-14.22890625],[136.33544921875,-14.211816406250009],[136.39218750000003,-14.175488281250011],[136.427734375,-14.12646484375],[136.4111328125,-14.011132812500009],[136.42470703125002,-13.86484375],[136.53378906250003,-13.79375],[136.58281250000005,-13.72109375],[136.65566406250002,-13.675878906250006],[136.70195312500005,-13.681640625],[136.69599609375,-13.726171875],[136.71464843750005,-13.803906250000011]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[136.23740234375003,-13.824511718750003],[136.21367187500005,-13.8359375],[136.12265625000003,-13.816601562500011],[136.122265625,-13.780566406250003],[136.134375,-13.753125],[136.15957031250002,-13.73671875],[136.21542968750003,-13.664746093750011],[136.25742187500003,-13.706640625],[136.275390625,-13.791113281250006],[136.23740234375003,-13.824511718750003]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[136.59853515625002,-11.37890625],[136.5265625,-11.438867187500009],[136.5216796875,-11.393847656250003],[136.559765625,-11.35791015625],[136.64902343750003,-11.211621093750011],[136.68798828125,-11.177636718750009],[136.71054687500003,-11.158398437500011],[136.72734375000005,-11.104785156250003],[136.73173828125005,-11.024609375000011],[136.7802734375,-11.0125],[136.74140625,-11.194628906250003],[136.59853515625002,-11.37890625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[136.33867187500005,-11.60234375],[136.18027343750003,-11.6767578125],[136.26738281250005,-11.576464843750003],[136.44921875,-11.487109375],[136.47929687500005,-11.465917968750006],[136.47050781250005,-11.50927734375],[136.37939453125,-11.583203125000011],[136.33867187500005,-11.60234375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[130.45927734375005,-11.679296875],[130.54179687500005,-11.703125],[130.57988281250005,-11.737109375],[130.602734375,-11.773242187500003],[130.60625,-11.816601562500011],[130.50253906250003,-11.835644531250011],[130.31748046875003,-11.771777343750003],[130.13125,-11.824511718750003],[130.07656250000002,-11.825488281250003],[130.04326171875005,-11.787304687500011],[130.07207031250005,-11.680761718750006],[130.13906250000002,-11.697070312500003],[130.19755859375005,-11.658203125],[130.18710937500003,-11.541210937500011],[130.15283203125,-11.4775390625],[130.251171875,-11.360546875000011],[130.294921875,-11.336816406250009],[130.33925781250002,-11.337011718750006],[130.37675781250005,-11.420117187500011],[130.38564453125002,-11.509863281250006],[130.4328125,-11.5921875],[130.45927734375005,-11.679296875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[130.61884765625,-11.376074218750006],[130.75224609375005,-11.384375],[130.91279296875,-11.309277343750011],[130.98740234375003,-11.33984375],[131.02304687500003,-11.334375],[131.140625,-11.263085937500009],[131.21718750000002,-11.242578125],[131.26826171875,-11.18984375],[131.3205078125,-11.246875],[131.43691406250002,-11.313183593750011],[131.47333984375,-11.382519531250011],[131.52226562500005,-11.415234375000011],[131.53857421875,-11.436914062500009],[131.46787109375003,-11.509570312500003],[131.45859375000003,-11.587890625],[131.3828125,-11.58251953125],[131.29208984375003,-11.7109375],[130.95097656250005,-11.926464843750011],[130.64492187500002,-11.742382812500011],[130.5119140625,-11.617871093750011],[130.42275390625002,-11.44580078125],[130.40478515625,-11.304980468750003],[130.36855468750002,-11.214941406250006],[130.38457031250005,-11.1921875],[130.40292968750003,-11.18046875],[130.42666015625002,-11.18310546875],[130.51914062500003,-11.279492187500011],[130.559765625,-11.305957031250003],[130.61884765625,-11.376074218750006]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[125.19882812500003,-14.579492187500009],[125.134765625,-14.641699218750006],[125.09121093750002,-14.591699218750009],[125.11738281250001,-14.491992187500003],[125.15996093749999,-14.4560546875],[125.19814453125002,-14.474804687500011],[125.19355468750001,-14.552636718750009],[125.19882812500003,-14.579492187500009]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[124.59726562500003,-15.401953125],[124.5595703125,-15.43017578125],[124.52421874999999,-15.421484375],[124.52373046874999,-15.382421875],[124.48281250000002,-15.34033203125],[124.50410156250001,-15.29248046875],[124.51933593749999,-15.267480468750009],[124.55087890625003,-15.2703125],[124.56455078125003,-15.310839843750003],[124.60507812500003,-15.356542968750006],[124.59726562500003,-15.401953125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[115.44619140625002,-20.78779296875001],[115.38808593750002,-20.866015625],[115.31806640625001,-20.8505859375],[115.30859375,-20.811132812500006],[115.35429687499999,-20.74628906250001],[115.4345703125,-20.66796875],[115.45761718750003,-20.71630859375],[115.44619140625002,-20.78779296875001]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[113.18300781250002,-26.053125],[113.15644531250001,-26.09453125],[112.96425781250002,-25.78310546875001],[112.908203125,-25.56982421875],[112.94707031249999,-25.531542968750003],[112.982421875,-25.52021484375001],[113.09628906250003,-25.815039062500006],[113.13154296875001,-25.882617187500003],[113.1318359375,-25.951953125],[113.14833984375002,-25.97382812500001],[113.18300781250002,-26.053125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[147.35605468750003,-43.39697265625],[147.30888671875005,-43.50078125000002],[147.2314453125,-43.48310546875001],[147.15380859375,-43.50019531250001],[147.10498046875,-43.43115234375],[147.1046875,-43.41289062500002],[147.1630859375,-43.430273437500006],[147.18466796875003,-43.4078125],[147.1984375,-43.37919921875002],[147.2197265625,-43.37138671875002],[147.23398437500003,-43.33046875],[147.28388671875,-43.27890625],[147.3125,-43.2802734375],[147.34248046875,-43.346289062500006],[147.35605468750003,-43.39697265625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[148.10429687500005,-42.71044921875],[148.04814453125005,-42.71923828125],[148.02968750000002,-42.71484375],[148.03085937500003,-42.66337890625002],[148.02275390625005,-42.64042968750002],[148.07255859375005,-42.593164062499994],[148.1427734375,-42.61591796875001],[148.16953125000003,-42.651757812499994],[148.1005859375,-42.680566406249994],[148.10429687500005,-42.71044921875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[147.4345703125,-43.24072265625],[147.371875,-43.240820312500006],[147.348828125,-43.232421875],[147.33759765625,-43.18330078125001],[147.29609375,-43.16171875],[147.31914062500005,-43.14531250000002],[147.32734375,-43.114648437499994],[147.3525390625,-43.08027343750001],[147.39726562500005,-43.118261718750006],[147.4345703125,-43.24072265625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[144.784375,-40.506738281249994],[144.748046875,-40.589453125],[144.71015625,-40.485253906249994],[144.751171875,-40.47021484375],[144.7833984375,-40.43486328125002],[144.79082031250005,-40.440332031249994],[144.784375,-40.506738281249994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[143.9279296875,-40.116113281249994],[143.89873046875005,-40.120214843750006],[143.87578125000005,-40.06396484375],[143.88759765625002,-39.98359375000001],[143.83857421875,-39.90410156250002],[143.865234375,-39.82421875],[143.86181640625,-39.73798828125001],[143.87939453125,-39.7],[143.93935546875002,-39.658105468749994],[143.94882812500003,-39.58369140625001],[144.00078125000005,-39.580175781250006],[144.09130859375,-39.638085937499994],[144.12089843750005,-39.785253906250006],[144.10605468750003,-39.8740234375],[144.14101562500002,-39.95380859375001],[144.11191406250003,-40.022070312500006],[144.03505859375002,-40.078222656250006],[143.9279296875,-40.116113281249994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[148.32626953125003,-40.30693359375002],[148.42070312500005,-40.3671875],[148.47421875000003,-40.43242187500002],[148.40400390625,-40.48652343750001],[148.352734375,-40.49726562500001],[148.31943359375003,-40.4345703125],[148.2140625,-40.45751953125],[148.1025390625,-40.45166015625],[148.02011718750003,-40.404199218749994],[148.01044921875,-40.38056640625001],[148.0587890625,-40.356835937499994],[148.19814453125002,-40.35791015625],[148.32626953125003,-40.30693359375002]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[148.00039062500002,-39.75761718750002],[148.1779296875,-39.9384765625],[148.27001953125,-39.966699218749994],[148.29736328125,-39.985742187499994],[148.28984375000005,-40.0654296875],[148.25078125000005,-40.099511718749994],[148.3232421875,-40.144433593749994],[148.31357421875003,-40.17353515625001],[148.29941406250003,-40.172460937500006],[148.21035156250002,-40.23369140625002],[148.1056640625,-40.262109375],[148.07363281250002,-40.240820312500006],[148.046875,-40.212792968749994],[148.02480468750002,-40.171972656250006],[147.89052734375002,-40.014550781249994],[147.90595703125,-39.97138671875001],[147.87626953125005,-39.90546875000001],[147.81230468750005,-39.91044921875002],[147.76718750000003,-39.87031250000001],[147.83916015625005,-39.83154296875],[147.93300781250002,-39.725976562499994],[148.00039062500002,-39.75761718750002]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[148.23691406250003,-40.51513671875],[148.18779296875005,-40.59257812500002],[148.126953125,-40.5439453125],[148.11728515625003,-40.521484375],[148.19316406250005,-40.503125],[148.21835937500003,-40.50507812500001],[148.23691406250003,-40.51513671875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[137.59648437500005,-35.738671875],[137.8359375,-35.762109375],[137.92890625,-35.72607421875],[138.04658203125,-35.75517578125],[138.12343750000002,-35.85234375],[138.06650390625003,-35.90058593750001],[138.0119140625,-35.90761718750001],[137.83554687500003,-35.867773437500006],[137.6708984375,-35.89794921875],[137.622265625,-35.938085937500006],[137.59023437500002,-36.0271484375],[137.4484375,-36.074804687500006],[137.38222656250002,-36.02089843750001],[137.20957031250003,-35.982421875],[137.14775390625005,-36.0390625],[137.02587890625,-36.02392578125],[136.91269531250003,-36.0466796875],[136.755078125,-36.03310546875001],[136.58925781250002,-35.9353515625],[136.540625,-35.89013671875],[136.5791015625,-35.808691406250006],[136.638671875,-35.748828125],[137.091796875,-35.6638671875],[137.33408203125003,-35.59248046875001],[137.53046875,-35.605078125],[137.5849609375,-35.620214843750006],[137.63544921875,-35.65644531250001],[137.59814453125,-35.722265625],[137.59648437500005,-35.738671875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[145.4865234375,-38.354882812499994],[145.33583984375002,-38.420996093750006],[145.2802734375,-38.390625],[145.28583984375,-38.34101562500001],[145.29531250000002,-38.318945312500006],[145.42656250000005,-38.31416015625001],[145.4865234375,-38.354882812499994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[145.314453125,-38.490820312500006],[145.34921875000003,-38.538183593750006],[145.35507812500003,-38.55703125],[145.27089843750002,-38.51972656250001],[145.12841796875,-38.52763671875002],[145.2177734375,-38.45859375],[145.28789062500005,-38.47216796875],[145.314453125,-38.490820312500006]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[153.53876953125,-27.43642578125001],[153.45273437500003,-27.71171875],[153.42656250000005,-27.70644531250001],[153.39580078125005,-27.6650390625],[153.40087890625,-27.505664062500003],[153.43544921875002,-27.405371093750006],[153.521875,-27.422460937500006],[153.53876953125,-27.43642578125001]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[153.44248046875003,-27.316015625],[153.4208984375,-27.33095703125001],[153.37656250000003,-27.2353515625],[153.36503906250005,-27.13886718750001],[153.3798828125,-27.049414062500006],[153.43232421875,-27.029882812500006],[153.466796875,-27.0380859375],[153.42636718750003,-27.201464843750003],[153.44248046875003,-27.316015625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[153.07744140625005,-25.75078125],[153.051953125,-25.7783203125],[153.00693359375003,-25.72890625],[152.97666015625003,-25.551367187500006],[152.9990234375,-25.44843750000001],[153.05156250000005,-25.354296875],[153.0607421875,-25.30224609375],[153.0380859375,-25.193164062500003],[153.18925781250005,-25.07050781250001],[153.2275390625,-25.00576171875001],[153.24199218750005,-24.92255859375001],[153.18632812500005,-24.832617187500006],[153.14375,-24.81484375],[153.18095703125005,-24.76484375000001],[153.22314453125,-24.739550781250003],[153.25693359375003,-24.72890625],[153.28212890625002,-24.73828125],[153.29794921875003,-24.91523437500001],[153.35927734375002,-24.97773437500001],[153.35019531250003,-25.063085937500006],[153.14140625000005,-25.512792968750006],[153.08378906250005,-25.68251953125001],[153.07744140625005,-25.75078125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[151.14658203125003,-23.490820312500006],[151.18076171875003,-23.516210937500006],[151.21201171875003,-23.51308593750001],[151.24013671875002,-23.5296875],[151.22880859375005,-23.59492187500001],[151.27431640625002,-23.66845703125],[151.29580078125002,-23.7203125],[151.26152343750005,-23.762304687500006],[151.23828125,-23.77578125],[151.18417968750003,-23.74072265625],[151.03330078125003,-23.53017578125001],[151.05996093750002,-23.460546875],[151.14658203125003,-23.490820312500006]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[150.51669921875003,-22.322558593750003],[150.4884765625,-22.32470703125],[150.46240234375,-22.307714843750006],[150.48466796875005,-22.267871093750003],[150.4884765625,-22.210742187500003],[150.521484375,-22.228320312500003],[150.548828125,-22.306933593750003],[150.51669921875003,-22.322558593750003]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[149.92832031250003,-22.19306640625001],[149.89365234375003,-22.223242187500006],[149.86953125000002,-22.150390625],[149.87539062500002,-22.074023437500003],[149.9123046875,-22.04873046875001],[149.9279296875,-22.14931640625001],[149.92832031250003,-22.19306640625001]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[117.35527343749999,8.214648437499989],[117.28701171875002,8.191015625],[117.27226562499999,8.253515625],[117.28085937500003,8.314990234374989],[117.32958984375,8.308496093749994],[117.35371093750001,8.289257812499997],[117.35527343749999,8.214648437499989]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[117.07988281249999,7.883398437499991],[117.0283203125,7.807519531249994],[116.96953124999999,7.894921875],[116.97578125000001,8.016650390624989],[116.99355468750002,8.050537109375],[117.07705078125002,8.069140624999989],[117.07988281249999,7.883398437499991]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[119.91621093750001,10.485986328124994],[119.79316406250001,10.455273437499997],[119.76445312499999,10.551611328124991],[119.85205078125,10.64013671875],[119.9501953125,10.604785156249989],[120.00839843750003,10.570117187499989],[119.98115234375001,10.538720703124994],[119.91621093750001,10.485986328124994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[119.86142578125003,11.525341796874997],[119.88291015625003,11.472412109375],[119.85488281250002,11.39306640625],[119.83066406250003,11.375683593749997],[119.79863281249999,11.408740234374989],[119.72998046875,11.431933593749989],[119.7255859375,11.474658203124989],[119.76142578125001,11.4736328125],[119.82675781250003,11.515429687499989],[119.86142578125003,11.525341796874997]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[120.1,12.167675781249997],[120.15468750000002,12.152392578124989],[120.19375,12.167041015624989],[120.22822265625001,12.219824218749991],[120.26054687499999,12.141748046874994],[120.34140625000003,12.077441406249989],[120.31455078125003,12.012402343749997],[120.24345703124999,12.004785156249994],[120.17363281249999,12.019628906249991],[120.10009765625,11.99375],[120.01054687499999,12.008251953124997],[119.95703125,12.069238281249994],[119.89609375000003,12.178759765624989],[119.86591796875001,12.199023437499989],[119.86962890625,12.243994140624991],[119.89179687500001,12.272509765624989],[119.88007812500001,12.279882812499991],[119.8857421875,12.299853515624989],[119.89667968750001,12.313427734374997],[119.91640625000002,12.319091796875],[119.9638671875,12.270410156249994],[120.07753906250002,12.19775390625],[120.1,12.167675781249997]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[120.03876953125001,11.703320312499997],[119.9638671875,11.669384765624997],[119.94492187500003,11.690722656249989],[119.93173828125003,11.740332031249991],[119.93281250000001,11.774462890624989],[119.86093750000003,11.953955078124991],[119.916015625,11.981347656249994],[119.95654296875,11.960253906249989],[119.99785156249999,11.93212890625],[120.03593749999999,11.917236328125],[120.07070312500002,11.860546875],[120.06240234375002,11.821337890624989],[120.07314453125002,11.783496093749989],[120.03876953125001,11.703320312499997]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[122.64951171875003,10.472705078124989],[122.62187,10.459033203124989],[122.59716796875,10.461035156249991],[122.53837890624999,10.424951171874994],[122.51669921875003,10.492529296874991],[122.5375,10.607568359374994],[122.62578124999999,10.695019531249997],[122.6484375,10.722509765624991],[122.67255859375001,10.738818359374989],[122.70126953125003,10.740625],[122.72919921875001,10.706396484374991],[122.73720703125002,10.654589843749989],[122.68125,10.498242187499997],[122.64951171875003,10.472705078124989]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[123.37031250000001,9.449609375],[123.33173828125001,9.422949218749991],[123.31601562500003,9.488964843749997],[123.32705078125002,9.578076171874997],[123.40371093750002,9.889257812499991],[123.38623046875,9.967089843749989],[123.51435546875001,10.140332031249997],[123.59287109375003,10.302929687499997],[123.71142578125,10.473681640624989],[123.72646484375002,10.562207031249997],[123.83154296875,10.731005859374989],[123.92988281250001,10.963818359374997],[123.92460937499999,11.040917968749994],[123.95009765625002,11.079150390624989],[123.96406250000001,11.137451171875],[123.96718750000002,11.186914062499994],[124.03886718749999,11.273535156249991],[124.05791015624999,11.217236328124997],[124.03652343750002,11.106689453125],[124.03984374999999,11.053613281249994],[124.05253906249999,11.028759765624997],[124.05332031250003,10.92578125],[124.02753906250001,10.767871093749989],[124.05126953125,10.585595703124994],[124.00498046875003,10.400097656249997],[123.9521484375,10.316601562499997],[123.87392578125002,10.257714843749994],[123.78867187500003,10.220800781249991],[123.70048828124999,10.128320312499994],[123.64335937499999,10.020214843749997],[123.63398437500001,9.921728515624991],[123.49355468750002,9.589306640624997],[123.37031250000001,9.449609375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[123.75703125000001,11.283300781249991],[123.815625,11.150732421874991],[123.73671875000002,11.151464843749991],[123.70761718750003,11.247998046874997],[123.74140625000001,11.279150390624991],[123.75703125000001,11.283300781249991]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[124.59384765625003,9.787207031249991],[124.58427734374999,9.75048828125],[124.50566406249999,9.753515625],[124.4775390625,9.747900390624991],[124.40341796875003,9.654101562499989],[124.35986328125,9.630224609374991],[124.12246093750002,9.599316406249997],[123.93564453125003,9.623974609374997],[123.87167968750003,9.675732421874997],[123.82998046875002,9.761132812499994],[123.81718749999999,9.8173828125],[123.86386718750003,9.878808593749994],[123.90888671875001,9.919628906249997],[124.05976562500001,10.000195312499997],[124.09384765625003,10.061328124999989],[124.1728515625,10.135205078124997],[124.33574218749999,10.159912109375],[124.3515625,10.141357421875],[124.37324218750001,10.129589843749997],[124.40585937500003,10.126416015624997],[124.486328125,10.065478515624989],[124.5771484375,10.026708984374991],[124.55507812500002,9.879199218749989],[124.58222656250001,9.82958984375],[124.59384765625003,9.787207031249991]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[124.806640625,9.142626953124989],[124.77792968750003,9.083105468749991],[124.66582031249999,9.13232421875],[124.63906250000002,9.175097656249989],[124.6533203125,9.225830078125],[124.70810546875003,9.243017578124991],[124.73681640625,9.2431640625],[124.79023437500001,9.190087890624994],[124.806640625,9.142626953124989]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[123.69765625000002,9.2373046875],[123.70625,9.133544921875],[123.61445312500001,9.103320312499989],[123.54072265625001,9.129736328124991],[123.49345703124999,9.192089843749997],[123.49355468750002,9.215527343749997],[123.53515625,9.213574218749997],[123.62607421875003,9.268261718749997],[123.65488281250003,9.278759765624997],[123.69765625000002,9.2373046875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[120.25039062500002,5.256591796875],[120.22324218750003,5.196240234374997],[120.19160156250001,5.168310546874991],[120.15,5.18408203125],[120.11835937500001,5.215380859374989],[120.1005859375,5.168994140624989],[120.01328125000003,5.151123046875],[119.95810546875003,5.079541015624997],[119.87753906250003,5.060205078124994],[119.82148437500001,5.06953125],[119.82734375000001,5.133154296874991],[119.98271484374999,5.228417968749994],[120.07968750000003,5.263623046874997],[120.16523437500001,5.332421875],[120.2080078125,5.340087890625],[120.22939453125002,5.284082031249994],[120.25039062500002,5.256591796875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[122.09287109375003,6.428320312499991],[121.99140625000001,6.41455078125],[121.95917968750001,6.415820312499989],[121.8798828125,6.517578125],[121.87246093750002,6.562744140625],[121.80869140625003,6.613720703124997],[121.83203125,6.6640625],[121.91494140625002,6.676220703124997],[122.05830078125001,6.74072265625],[122.2880859375,6.638916015625],[122.32353515624999,6.602246093749997],[122.25175781249999,6.579785156249997],[122.20097656249999,6.48291015625],[122.09287109375003,6.428320312499991]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[126.05937,9.766210937499991],[126.04677734375002,9.760791015624989],[125.9912109375,9.838525390624994],[125.99863281250003,9.927050781249989],[126.07382812500003,10.059228515624994],[126.12949218750003,9.943554687499997],[126.12890625,9.89111328125],[126.12080078125001,9.865185546874997],[126.17255859375001,9.799951171874994],[126.13691406250001,9.767773437499997],[126.05937,9.766210937499991]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[125.69023437499999,9.914453125],[125.67255859375001,9.886474609375],[125.64863281250001,9.944091796875],[125.59052734375001,9.998193359374994],[125.53447265624999,10.090087890625],[125.49482421875001,10.118701171874989],[125.52197265625,10.191503906249991],[125.52460937500001,10.309716796874994],[125.58017578125003,10.363671875],[125.60585937500002,10.379589843749997],[125.64794921875,10.436816406249989],[125.66679687499999,10.440136718749997],[125.6845703125,10.392041015624997],[125.64667968750001,10.245410156249989],[125.70332031250001,10.07177734375],[125.68437,9.963183593749989],[125.69248046875003,9.939013671874989],[125.69023437499999,9.914453125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[120.27128906249999,13.750683593749997],[120.27285156250002,13.682958984374991],[120.10419921875001,13.782373046874994],[120.09941406249999,13.816943359375003],[120.10341796875002,13.842529296875],[120.12070312500003,13.858056640624994],[120.21142578125,13.820654296874991],[120.27128906249999,13.750683593749997]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[121.91484374999999,13.540332031250003],[121.9765625,13.537402343750003],[121.99570312500003,13.546777343749994],[122.11455078124999,13.463183593750003],[122.10732421875002,13.420849609374997],[122.12236328124999,13.365136718749994],[122.0546875,13.268652343749991],[122.04238281250002,13.236181640624991],[122.0048828125,13.204980468749994],[121.87587890625002,13.28173828125],[121.82919921875003,13.32861328125],[121.81503906250003,13.424462890624994],[121.8662109375,13.566162109375],[121.91484374999999,13.540332031250003]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[122.09404296874999,12.354882812499994],[122.01396484374999,12.105615234374994],[121.96015625000001,12.19140625],[121.98193359375,12.2453125],[121.93564453125003,12.290380859374991],[121.92324218750002,12.331298828125],[121.94101562500003,12.385400390624994],[121.98945312500001,12.435302734375],[122.00156250000003,12.598535156249994],[122.10380859374999,12.650634765625],[122.14501953125,12.652636718749989],[122.13027343750002,12.612597656249989],[122.13164062499999,12.537548828124997],[122.09404296874999,12.354882812499994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[122.31083984374999,12.52880859375],[122.27978515625,12.498291015625],[122.26093750000001,12.503076171874994],[122.24785156249999,12.556933593749989],[122.27802734375001,12.592919921874994],[122.2875,12.589257812499994],[122.31083984374999,12.52880859375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[122.65449218750001,12.309033203124997],[122.60332031249999,12.285595703124997],[122.49931640624999,12.383691406249994],[122.43886718750002,12.429492187499989],[122.42294921875003,12.455078125],[122.471875,12.491943359375],[122.60361328125003,12.491601562499994],[122.67363281249999,12.424267578124997],[122.68330078125001,12.38232421875],[122.65449218750001,12.309033203124997]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[123.28183593750003,12.853417968749994],[123.3671875,12.700830078124994],[123.27421874999999,12.805078125],[123.16640625000002,12.875878906249994],[123.05419921875,12.993457031249989],[122.97343749999999,13.034716796874989],[122.94902343749999,13.058691406249991],[122.95751953125,13.107177734375],[123.01708984375,13.116162109374997],[123.04355468750003,13.113378906249991],[123.20625,12.905419921874994],[123.28183593750003,12.853417968749994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[123.775390625,12.453906249999989],[123.77910156249999,12.366259765624989],[123.74150390624999,12.398535156249991],[123.62060546875,12.570507812499997],[123.58720703124999,12.63330078125],[123.62148437500002,12.674902343749991],[123.70869140625001,12.610791015624997],[123.775390625,12.453906249999989]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[123.71660156249999,12.287353515625],[123.90830078125003,12.169091796874994],[124.04033203124999,11.966796875],[124.0556640625,11.811572265624989],[124.04550781250003,11.75244140625],[123.98271484374999,11.818896484374989],[123.84775390625003,11.91357421875],[123.75400390625003,11.934472656249994],[123.72519531250003,11.9515625],[123.73603515625001,12.002636718749997],[123.6748046875,12.05],[123.66757812500003,12.0693359375],[123.61201171875001,12.090234375],[123.53105468749999,12.196630859374991],[123.47373046875003,12.216650390624991],[123.41884765625002,12.194238281249994],[123.29267578125001,12.036376953125],[123.15781250000003,11.925634765624991],[123.15585937500003,11.96796875],[123.21054687500003,12.106591796874994],[123.24531250000001,12.328027343749994],[123.26718750000003,12.395458984374997],[123.23984375000003,12.494677734374989],[123.23642578125003,12.58349609375],[123.33701171875003,12.542382812499994],[123.46298828125003,12.501220703125],[123.55898437500002,12.44482421875],[123.57480468750003,12.406933593749997],[123.71660156249999,12.287353515625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[124.35361328125003,13.632226562499994],[124.32705078125002,13.5673828125],[124.29453125000003,13.59033203125],[124.24824218750001,13.586669921875],[124.17539062500003,13.531542968750003],[124.05703125000002,13.605566406249991],[124.03886718749999,13.663134765625003],[124.12373046875001,13.790478515624997],[124.12285156249999,13.9796875],[124.15371093750002,14.026171875],[124.18623046875001,14.059521484374997],[124.22490234374999,14.077587890624997],[124.30830078125001,13.946972656249997],[124.33671874999999,13.931103515624997],[124.41718750000001,13.871044921874997],[124.39628906249999,13.750097656249991],[124.40400390625001,13.679443359375],[124.35361328125003,13.632226562499994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[122.17539062500003,14.048828125],[122.17226562500002,14.008007812499997],[121.95625,14.156054687500003],[121.94638671875003,14.181494140624991],[121.94599609375001,14.205126953125003],[121.95917968750001,14.228759765625],[122.17539062500003,14.048828125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[122.03349609374999,15.005029296874994],[122.05156249999999,14.969873046874994],[122.03173828125,14.971630859374997],[122.01728515625001,14.965283203124997],[121.97031250000003,14.89296875],[122.02167968750001,14.759423828124994],[121.98964843750002,14.662158203125003],[121.93300781250002,14.656054687500003],[121.91064453125,14.66650390625],[121.92216796874999,14.714550781249997],[121.9345703125,14.736621093750003],[121.92304687500001,14.8],[121.88925781250003,14.83984375],[121.8623046875,14.9171875],[121.8203125,14.963574218749997],[121.83984375,15.038134765625003],[121.9716796875,15.04638671875],[122.03349609374999,15.005029296874994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[121.92167968749999,18.894726562499997],[121.85820312499999,18.822900390624994],[121.8251953125,18.842724609374997],[121.86074218750002,18.912548828124997],[121.85976562500002,18.936767578125],[121.88886718750001,18.99155273437499],[121.943359375,19.010449218749997],[121.98789062500003,18.956640625],[121.92167968749999,18.894726562499997]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[121.25224609374999,19.082421875],[121.24667968750003,19.015185546875003],[121.19609374999999,19.050683593749994],[121.18486328124999,19.10141601562499],[121.18994140625,19.138916015625],[121.21318359374999,19.18359375],[121.24472656250003,19.143017578124997],[121.25224609374999,19.082421875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[121.52089843750002,19.361962890624994],[121.53125,19.27133789062499],[121.47207031250002,19.273339843749994],[121.38291015625003,19.32846679687499],[121.37460937500003,19.35629882812499],[121.3759765625,19.3796875],[121.3916015625,19.399365234374997],[121.52089843750002,19.361962890624994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[121.96005859375003,20.365869140624994],[121.94130859375002,20.353710937499997],[121.9140625,20.359423828125003],[121.94121093749999,20.45371093749999],[121.9912109375,20.47958984374999],[122.03115234375002,20.469384765624994],[121.96005859375003,20.365869140624994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[121.878125,20.781884765624994],[121.82958984375,20.70029296874999],[121.790625,20.701171875],[121.79648437500003,20.746630859375003],[121.84785156250001,20.841259765624997],[121.86699218749999,20.83920898437499],[121.878125,20.781884765624994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[148.02578125000002,-5.826367187500011],[147.98544921875003,-5.833984375],[147.96796875,-5.78857421875],[147.87451171875,-5.749218750000011],[147.78105468750005,-5.627246093750003],[147.78251953125005,-5.5224609375],[147.79462890625,-5.492382812500011],[147.84648437500005,-5.490820312500006],[148.05478515625003,-5.611523437500011],[148.07607421875002,-5.650195312500003],[148.06044921875002,-5.7646484375],[148.02578125000002,-5.826367187500011]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[147.17626953125,-5.431933593750003],[147.12021484375003,-5.437402343750009],[147.02900390625,-5.342382812500006],[147.005859375,-5.30703125],[147.01474609375003,-5.257421875],[147.1310546875,-5.190820312500009],[147.20634765625005,-5.2515625],[147.221875,-5.381542968750011],[147.17626953125,-5.431933593750003]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[146.01933593750005,-4.726171875],[145.95234375,-4.755761718750009],[145.90400390625,-4.733007812500006],[145.88359375000005,-4.66748046875],[145.90019531250005,-4.604199218750011],[145.95878906250005,-4.554296875],[145.99580078125,-4.539257812500011],[146.03740234375005,-4.573144531250009],[146.05341796875,-4.64013671875],[146.01933593750005,-4.726171875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[147.876953125,-2.283105468750009],[147.84453125000005,-2.335742187500003],[147.76894531250002,-2.33125],[147.735546875,-2.315527343750006],[147.790234375,-2.305566406250009],[147.81220703125,-2.262109375],[147.83583984375002,-2.246777343750011],[147.876953125,-2.283105468750009]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[147.067578125,-1.960156250000011],[147.4005859375,-2.025097656250011],[147.42255859375,-2.024316406250009],[147.41875,-2.001074218750006],[147.42441406250003,-1.99453125],[147.44414062500005,-2.011523437500003],[147.43808593750003,-2.058984375],[147.38544921875,-2.070605468750003],[147.33652343750003,-2.066015625],[147.30136718750003,-2.090429687500006],[147.20634765625005,-2.181933593750003],[147.14218750000003,-2.166601562500006],[147.06386718750002,-2.187109375],[146.92636718750003,-2.1890625],[146.74785156250005,-2.148828125],[146.69912109375002,-2.182714843750006],[146.63544921875,-2.17333984375],[146.5724609375,-2.21044921875],[146.54648437500003,-2.20859375],[146.53134765625003,-2.154101562500003],[146.532421875,-2.126171875000011],[146.60703125000003,-2.1025390625],[146.5958984375,-2.016894531250003],[146.65625,-1.974023437500009],[146.76005859375005,-1.977734375000011],[146.85712890625,-1.948535156250003],[147.067578125,-1.960156250000011]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[154.64726562500005,-5.432714843750006],[154.62734375000002,-5.440625],[154.58388671875002,-5.314453125],[154.576171875,-5.220898437500011],[154.56279296875005,-5.151953125],[154.5400390625,-5.11083984375],[154.60556640625003,-5.034960937500003],[154.63261718750005,-5.013867187500011],[154.68203125000002,-5.054003906250003],[154.68916015625,-5.142675781250006],[154.72714843750003,-5.218066406250003],[154.6984375,-5.3828125],[154.64726562500005,-5.432714843750006]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[152.67060546875,-3.133398437500006],[152.64619140625,-3.22119140625],[152.58505859375003,-3.169824218750009],[152.54326171875005,-3.095605468750009],[152.56992187500003,-3.0625],[152.63876953125003,-3.042773437500003],[152.67060546875,-3.133398437500006]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[152.09921875000003,-2.947363281250006],[152.08847656250003,-2.997851562500003],[152.05732421875,-2.994921875],[151.97109375000002,-2.89609375],[151.95458984375,-2.870507812500009],[151.97470703125003,-2.845605468750009],[152.07460937500002,-2.91845703125],[152.09921875000003,-2.947363281250006]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[151.9572265625,-2.830175781250006],[151.93339843750005,-2.830371093750003],[151.92978515625003,-2.750585937500006],[151.94638671875003,-2.70859375],[152.001953125,-2.73779296875],[152.01132812500003,-2.809179687500006],[151.9572265625,-2.830175781250006]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[149.76542968750005,-1.553027343750003],[149.76318359375,-1.589160156250003],[149.69091796875,-1.570898437500006],[149.67109375,-1.576269531250006],[149.5458984375,-1.4716796875],[149.5478515625,-1.40771484375],[149.58095703125002,-1.353222656250011],[149.6330078125,-1.362011718750011],[149.72529296875,-1.4306640625],[149.76542968750005,-1.553027343750003]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[150.43662109375003,-2.661816406250011],[150.2375,-2.675488281250011],[150.16572265625,-2.660253906250006],[150.1015625,-2.6025390625],[150.04345703125,-2.5125],[149.98515625000005,-2.491503906250003],[149.96162109375,-2.473828125000011],[150.1025390625,-2.404980468750011],[150.22714843750003,-2.384179687500009],[150.42949218750005,-2.470410156250011],[150.45,-2.51328125],[150.45156250000002,-2.541113281250006],[150.44609375000005,-2.63232421875],[150.43662109375003,-2.661816406250011]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[151.08095703125002,-10.020117187500006],[151.12343750000002,-10.020214843750011],[151.1943359375,-9.945507812500011],[151.25566406250005,-9.92265625],[151.29648437500003,-9.956738281250011],[151.23085937500002,-10.194726562500009],[151.17548828125,-10.158886718750011],[150.9591796875,-10.092578125],[150.95244140625005,-9.9984375],[150.89609375000003,-9.968066406250003],[150.861328125,-9.876171875000011],[150.78964843750003,-9.774316406250009],[150.77607421875,-9.709082031250006],[150.81669921875005,-9.7359375],[150.8623046875,-9.802441406250011],[151.05146484375,-9.93896484375],[151.044140625,-9.983105468750011],[151.08095703125002,-10.020117187500006]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[150.34541015625,-9.493847656250011],[150.33134765625005,-9.5185546875],[150.27285156250002,-9.500390625],[150.10976562500002,-9.361914062500006],[150.1349609375,-9.259570312500003],[150.20830078125005,-9.206347656250003],[150.32011718750005,-9.26416015625],[150.35703125000003,-9.349023437500009],[150.3681640625,-9.396484375],[150.34541015625,-9.493847656250011]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[150.52841796875003,-9.346582031250009],[150.66904296875003,-9.428515625],[150.74648437500002,-9.404492187500011],[150.78867187500003,-9.41796875],[150.8791015625,-9.5126953125],[150.88408203125005,-9.581933593750009],[150.8986328125,-9.64140625],[150.89404296875,-9.66748046875],[150.84404296875005,-9.702832031250011],[150.84824218750003,-9.66259765625],[150.80996093750002,-9.65478515625],[150.67832031250003,-9.656542968750003],[150.57626953125003,-9.631152343750003],[150.43623046875,-9.624609375],[150.4953125,-9.561718750000011],[150.50849609375,-9.5361328125],[150.43466796875003,-9.434960937500009],[150.43144531250005,-9.386621093750009],[150.43730468750005,-9.359960937500006],[150.49892578125002,-9.345605468750009],[150.52841796875003,-9.346582031250009]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[151.10683593750002,-8.733496093750006],[151.12412109375003,-8.804882812500011],[151.04619140625005,-8.728320312500003],[151.08076171875,-8.641796875000011],[151.08681640625002,-8.595019531250003],[151.08281250000005,-8.568652343750003],[151.00498046875003,-8.523828125],[151.04628906250002,-8.450585937500009],[151.09013671875005,-8.425976562500011],[151.11757812500002,-8.418847656250009],[151.11640625,-8.521875],[151.13857421875002,-8.568066406250011],[151.10683593750002,-8.733496093750006]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[152.63095703125003,-8.959375],[152.68925781250005,-8.974609375],[152.81005859375,-8.9671875],[152.8498046875,-9.024511718750006],[152.90507812500005,-9.044238281250003],[152.95292968750005,-9.070117187500003],[152.9953125,-9.1078125],[152.99501953125002,-9.130761718750009],[152.98496093750003,-9.15078125],[152.95927734375005,-9.168652343750011],[152.96689453125003,-9.208984375],[152.92275390625002,-9.203027343750009],[152.86748046875005,-9.224316406250011],[152.75947265625,-9.177148437500009],[152.72011718750002,-9.16650390625],[152.708203125,-9.126074218750006],[152.63808593750002,-9.058398437500003],[152.51513671875,-9.009863281250006],[152.57705078125002,-8.970019531250003],[152.63095703125003,-8.959375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[150.89873046875005,-10.565332031250009],[150.88466796875002,-10.643457031250009],[150.80234375000003,-10.620214843750006],[150.78574218750003,-10.603417968750009],[150.79931640625,-10.554101562500009],[150.8720703125,-10.551855468750006],[150.89873046875005,-10.565332031250009]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[154.28076171875,-11.361425781250006],[154.26601562500002,-11.415917968750009],[154.22958984375003,-11.3974609375],[154.12119140625003,-11.425683593750009],[154.06406250000003,-11.419335937500009],[154.03115234375002,-11.370507812500009],[154.0234375,-11.347949218750003],[154.11767578125,-11.365527343750003],[154.1017578125,-11.311425781250009],[154.23789062500003,-11.3388671875],[154.28076171875,-11.361425781250006]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[153.5361328125,-11.476171875],[153.70322265625003,-11.528515625000011],[153.75986328125003,-11.586328125],[153.69951171875005,-11.612597656250003],[153.5537109375,-11.630566406250011],[153.51923828125,-11.59521484375],[153.37900390625003,-11.5595703125],[153.35703125000003,-11.495019531250009],[153.28681640625,-11.516992187500009],[153.32236328125003,-11.471484375],[153.23447265625003,-11.4203125],[153.20703125,-11.351855468750003],[153.20361328125,-11.324121093750009],[153.30673828125003,-11.356347656250009],[153.5361328125,-11.476171875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[143.58681640625002,-8.481738281250003],[143.5431640625,-8.484765625],[143.36689453125,-8.416894531250009],[143.321875,-8.367578125],[143.52822265625002,-8.378515625],[143.58144531250002,-8.390917968750003],[143.59257812500005,-8.4599609375],[143.58681640625002,-8.481738281250003]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[143.59033203125,-8.633398437500006],[143.60820312500005,-8.677148437500009],[143.46279296875002,-8.617089843750009],[143.32412109375002,-8.516796875000011],[143.25380859375002,-8.489550781250003],[143.20683593750005,-8.4234375],[143.29306640625003,-8.472753906250006],[143.443359375,-8.518945312500009],[143.59033203125,-8.633398437500006]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[135.3830078125,-0.6513671875],[135.595703125,-0.6904296875],[135.67324218750002,-0.68828125],[135.7490234375,-0.732519531250006],[135.84121093750002,-0.711621093750011],[135.8935546875,-0.725781250000011],[136.06875,-0.877734375],[136.15468750000002,-0.978320312500003],[136.28261718750002,-1.064648437500011],[136.37529296875005,-1.094042968750003],[136.30537109375,-1.173144531250003],[136.16474609375,-1.214746093750009],[136.1103515625,-1.216796875],[136.00253906250003,-1.169726562500003],[135.9150390625,-1.178417968750011],[135.83876953125002,-1.119433593750003],[135.82558593750002,-1.0283203125],[135.7470703125,-0.823046875],[135.645703125,-0.881933593750006],[135.52382812500002,-0.787304687500011],[135.49111328125002,-0.785058593750009],[135.4833984375,-0.801074218750003],[135.431640625,-0.768847656250003],[135.3876953125,-0.704882812500003],[135.3830078125,-0.6513671875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[135.47421875000003,-1.591796875],[135.869140625,-1.641992187500009],[135.97617187500003,-1.635546875],[136.20156250000002,-1.654980468750011],[136.3896484375,-1.721582031250009],[136.71855468750005,-1.733984375],[136.81669921875005,-1.753808593750009],[136.892578125,-1.799707031250009],[136.70859375000003,-1.837695312500003],[136.621875,-1.873046875],[136.46083984375002,-1.890429687500003],[136.32607421875002,-1.872460937500009],[136.228125,-1.893652343750006],[136.192578125,-1.859179687500003],[136.04921875000002,-1.824121093750009],[135.86572265625,-1.752148437500011],[135.48759765625005,-1.668359375],[135.4697265625,-1.6162109375],[135.47421875000003,-1.591796875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[134.96533203125,-1.116015625],[134.91738281250002,-1.13427734375],[134.86171875000002,-1.114160156250009],[134.80888671875005,-1.03759765625],[134.82792968750005,-0.978808593750003],[134.88925781250003,-0.9384765625],[134.94082031250002,-0.97890625],[134.95673828125,-1.030566406250003],[134.9962890625,-1.034082031250009],[134.96533203125,-1.116015625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[134.37421875,-2.12353515625],[134.34521484375,-2.138769531250006],[134.33505859375003,-2.09521484375],[134.35078125,-2.036914062500003],[134.36953125000002,-2.027636718750003],[134.39101562500002,-2.03076171875],[134.41904296875003,-2.0517578125],[134.37421875,-2.12353515625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[138.89511718750003,-8.388671875],[138.84550781250005,-8.401757812500009],[138.59423828125,-8.371484375],[138.56718750000005,-8.330273437500011],[138.56337890625002,-8.30908203125],[138.62099609375002,-8.268457031250009],[138.67666015625002,-8.19921875],[138.7626953125,-8.1734375],[138.79619140625005,-8.173632812500003],[138.89765625,-8.3375],[138.89511718750003,-8.388671875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[133.57080078125,-4.245898437500003],[133.621875,-4.29931640625],[133.5029296875,-4.257421875],[133.3330078125,-4.169628906250011],[133.32089843750003,-4.111035156250011],[133.46435546875,-4.199804687500006],[133.57080078125,-4.245898437500003]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[130.35332031250005,-1.690527343750006],[130.3654296875,-1.749804687500003],[130.425,-1.804589843750009],[130.404296875,-1.889843750000011],[130.38056640625,-1.902636718750003],[130.39335937500005,-1.941601562500011],[130.41884765625002,-1.971289062500006],[130.37265625000003,-1.991894531250011],[130.33896484375003,-1.981835937500009],[130.2841796875,-2.009375],[130.248046875,-2.047753906250009],[130.13349609375,-2.063867187500009],[130.09335937500003,-2.0283203125],[129.88652343750005,-1.986425781250006],[129.75439453125,-1.894433593750009],[129.73769531250002,-1.866894531250011],[129.99365234375,-1.758886718750006],[130.10576171875005,-1.73046875],[130.19960937500002,-1.732226562500003],[130.31796875000003,-1.691992187500006],[130.35332031250005,-1.690527343750006]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[131.00185546875002,-1.315527343750006],[130.96660156250005,-1.343457031250011],[130.84511718750002,-1.317285156250009],[130.78232421875003,-1.25546875],[130.73935546875003,-1.172558593750011],[130.712109375,-1.104394531250009],[130.70439453125005,-1.050195312500009],[130.66796875,-0.983984375],[130.67294921875003,-0.959765625],[130.89716796875,-0.890039062500009],[130.939453125,-0.915332031250003],[131.03300781250005,-0.917578125],[131.07392578125,-0.96826171875],[131.04619140625005,-1.188183593750011],[131.00185546875002,-1.315527343750006]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[130.9052734375,-0.777441406250006],[130.87978515625002,-0.828417968750003],[130.83242187500002,-0.862890625],[130.40244140625003,-0.923925781250006],[130.43906250000003,-0.887402343750011],[130.45732421875005,-0.851171875],[130.48427734375002,-0.83251953125],[130.52695312500003,-0.837304687500009],[130.54814453125005,-0.826269531250006],[130.56953125,-0.821875],[130.59375,-0.82666015625],[130.63544921875,-0.811621093750006],[130.72324218750003,-0.822460937500011],[130.8134765625,-0.813867187500009],[130.80703125000002,-0.765039062500009],[130.9052734375,-0.777441406250006]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[130.62666015625,-0.528710937500009],[130.56914062500005,-0.529980468750011],[130.46542968750003,-0.486523437500011],[130.52587890625,-0.44873046875],[130.56416015625,-0.44091796875],[130.59746093750005,-0.418261718750003],[130.61591796875,-0.417285156250003],[130.65693359375,-0.4365234375],[130.68427734375,-0.469140625],[130.62666015625,-0.528710937500009]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[130.81328125000005,-0.004101562500011],[130.9865234375,-0.046582031250011],[131.02578125000002,-0.039941406250009],[131.27685546875,-0.149804687500009],[131.31689453125,-0.204296875000011],[131.302734375,-0.241113281250009],[131.33974609375002,-0.290332031250003],[131.25751953125,-0.36572265625],[131.21787109375003,-0.374121093750006],[131.177734375,-0.345996093750003],[131.09775390625003,-0.330078125],[131.00537109375,-0.360742187500009],[130.946484375,-0.337597656250011],[130.8966796875,-0.268457031250009],[130.80839843750005,-0.226464843750009],[130.68349609375002,-0.080664062500006],[130.62216796875003,-0.0859375],[130.63828125000003,-0.14296875],[130.69130859375002,-0.180566406250009],[130.76132812500003,-0.29140625],[130.80156250000005,-0.302148437500009],[130.84316406250002,-0.29833984375],[130.89921875000005,-0.344433593750011],[130.89628906250005,-0.416015625],[130.7501953125,-0.44384765625],[130.69980468750003,-0.3916015625],[130.688671875,-0.296582031250011],[130.60654296875003,-0.32861328125],[130.57490234375,-0.36181640625],[130.55078125,-0.366406250000011],[130.4962890625,-0.267382812500003],[130.34052734375,-0.262304687500006],[130.23662109375005,-0.209667968750011],[130.28769531250003,-0.1546875],[130.294921875,-0.101464843750009],[130.3625,-0.072851562500006],[130.43095703125005,-0.098486328125006],[130.49960937500003,-0.060107421875003],[130.54833984375,-0.069921875],[130.58427734375005,-0.04541015625],[130.72236328125,-0.029833984375003],[130.81328125000005,-0.004101562500011]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[129.54892578125003,-0.18701171875],[129.50566406250005,-0.18984375],[129.46923828125,-0.131445312500006],[129.3701171875,-0.06640625],[129.3087890625,0.04541015625],[129.5419921875,-0.139257812500006],[129.54892578125003,-0.18701171875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[128.45390625000005,2.0517578125],[128.2958984375,2.034716796874989],[128.2599609375,2.08251953125],[128.21796875,2.297460937499991],[128.33037109375005,2.469335937499991],[128.47207031250002,2.570507812499997],[128.56865234375005,2.59609375],[128.60214843750003,2.597607421874997],[128.6884765625,2.473681640624989],[128.6232421875,2.224414062499989],[128.54755859375,2.097070312499994],[128.45390625000005,2.0517578125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[127.45341796875005,-0.005859375],[127.44863281250002,-0.03662109375],[127.41787109375002,0.00634765625],[127.39677734375005,0.0166015625],[127.41953125000003,0.124414062499994],[127.43134765625001,0.142578125],[127.44941406250001,0.068994140624994],[127.45341796875005,-0.005859375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[127.41972656250005,0.64208984375],[127.38398437500001,0.631005859374994],[127.37363281250003,0.634863281249991],[127.36289062500003,0.675146484374991],[127.38261718750005,0.743554687499994],[127.4248046875,0.744384765625],[127.44257812500001,0.733447265624989],[127.44589843750003,0.683300781249997],[127.41972656250005,0.64208984375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[127.24990234375002,-0.495312500000011],[127.18730468749999,-0.521191406250011],[127.119140625,-0.5205078125],[127.10439453125002,-0.413867187500003],[127.12646484375,-0.278613281250003],[127.18964843750001,-0.255761718750009],[127.2900390625,-0.284375],[127.25302734375003,-0.318652343750003],[127.28056640625005,-0.391015625],[127.24990234375002,-0.495312500000011]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[127.30039062500003,-0.780957031250011],[127.2890625,-0.8015625],[127.1845703125,-0.775292968750009],[127.15644531250001,-0.760937500000011],[127.20908203125003,-0.619335937500011],[127.25820312500002,-0.6234375],[127.30126953125,-0.758398437500006],[127.30039062500003,-0.780957031250011]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[127.56699218750003,-0.318945312500006],[127.68242187500005,-0.468359375],[127.60498046875,-0.61015625],[127.65859375000002,-0.689453125],[127.80429687500003,-0.694433593750006],[127.837890625,-0.72412109375],[127.86328125,-0.759863281250006],[127.88017578125005,-0.808691406250006],[127.84228515625,-0.847753906250006],[127.76113281250002,-0.883691406250009],[127.66757812500003,-0.83203125],[127.64287109375005,-0.783984375],[127.62382812500005,-0.766015625],[127.49785156250005,-0.802441406250011],[127.46269531250005,-0.805957031250003],[127.43828125000005,-0.7390625],[127.46865234375002,-0.64296875],[127.38056640625001,-0.599609375],[127.3,-0.500292968750003],[127.29707031250001,-0.460253906250003],[127.32949218750002,-0.390917968750003],[127.32509765625002,-0.335839843750009],[127.37119140625003,-0.331640625],[127.45517578125003,-0.406347656250006],[127.49169921875,-0.3359375],[127.52734375,-0.306640625],[127.56699218750003,-0.318945312500006]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[128.15302734375,-1.660546875],[128.091796875,-1.701171875],[128.06123046875,-1.71240234375],[127.91376953125001,-1.68515625],[127.74101562500005,-1.690820312500009],[127.56162109375003,-1.728515625],[127.45761718750003,-1.696679687500009],[127.39218750000003,-1.644824218750003],[127.39501953125,-1.58984375],[127.45673828125001,-1.453710937500006],[127.591796875,-1.350781250000011],[127.64667968750001,-1.332421875],[127.74296875000005,-1.360253906250009],[127.90507812500005,-1.4390625],[128.03281250000003,-1.531640625],[128.14873046875005,-1.603710937500011],[128.15302734375,-1.660546875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[134.74697265625002,-5.70703125],[134.73906250000005,-5.74560546875],[134.73837890625003,-5.816796875],[134.75498046875003,-5.882714843750009],[134.71220703125005,-5.94970703125],[134.7521484375,-6.050097656250003],[134.75810546875005,-6.1],[134.755859375,-6.170605468750011],[134.74443359375005,-6.202343750000011],[134.71416015625005,-6.295117187500011],[134.68388671875005,-6.328125],[134.6611328125,-6.337304687500009],[134.63759765625002,-6.365332031250006],[134.44111328125,-6.334863281250009],[134.35615234375,-6.2705078125],[134.28046875,-6.20078125],[134.26445312500005,-6.171679687500003],[134.17539062500003,-6.09033203125],[134.15488281250003,-6.062890625],[134.153125,-6.01953125],[134.22509765625,-6.008496093750011],[134.301953125,-6.009765625],[134.29863281250005,-5.970703125],[134.34306640625005,-5.8330078125],[134.22617187500003,-5.744433593750003],[134.20537109375005,-5.707226562500011],[134.247265625,-5.681933593750003],[134.34130859375,-5.712890625],[134.45634765625005,-5.557519531250009],[134.49033203125003,-5.525097656250011],[134.50644531250003,-5.4384765625],[134.57080078125,-5.42734375],[134.61650390625005,-5.438574218750006],[134.64609375000003,-5.492382812500011],[134.65781250000003,-5.539257812500011],[134.6455078125,-5.581347656250003],[134.70078125000003,-5.60302734375],[134.74697265625002,-5.70703125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[134.53681640625,-6.442285156250009],[134.52041015625002,-6.5126953125],[134.50429687500002,-6.59140625],[134.4125,-6.6796875],[134.35595703125,-6.81484375],[134.32275390625,-6.848730468750006],[134.2,-6.908789062500006],[134.0908203125,-6.833789062500003],[134.05917968750003,-6.769335937500003],[134.10703125000003,-6.471582031250009],[134.15419921875002,-6.4814453125],[134.184765625,-6.479296875],[134.19462890625005,-6.459765625],[134.12460937500003,-6.426464843750011],[134.11123046875002,-6.25537109375],[134.11464843750002,-6.190820312500009],[134.16806640625003,-6.17626953125],[134.23417968750005,-6.226367187500003],[134.31777343750002,-6.316113281250011],[134.4150390625,-6.38671875],[134.53681640625,-6.442285156250009]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[132.92626953125,-5.902050781250011],[132.84501953125005,-5.987988281250011],[132.92167968750005,-5.785253906250006],[132.9376953125,-5.6826171875],[133.0087890625,-5.621386718750003],[133.11464843750002,-5.310644531250006],[133.13847656250005,-5.31787109375],[133.1728515625,-5.34814453125],[133.11962890625,-5.575976562500003],[132.97109375000002,-5.73583984375],[132.92626953125,-5.902050781250011]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[132.80712890625,-5.850781250000011],[132.7462890625,-5.947070312500003],[132.70488281250005,-5.9130859375],[132.68144531250005,-5.91259765625],[132.66728515625005,-5.856054687500006],[132.68134765625,-5.738867187500006],[132.63017578125005,-5.60703125],[132.69785156250003,-5.608984375],[132.71650390625,-5.648339843750009],[132.73779296875,-5.66171875],[132.80429687500003,-5.788867187500003],[132.80712890625,-5.850781250000011]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[128.72246093750005,-3.546875],[128.72011718750002,-3.589160156250003],[128.71328125000002,-3.6025390625],[128.65878906250003,-3.587792968750009],[128.61953125000002,-3.588574218750011],[128.58515625,-3.51220703125],[128.594921875,-3.494824218750011],[128.66650390625,-3.516699218750006],[128.6935546875,-3.524511718750006],[128.72246093750005,-3.546875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[128.56259765625003,-3.58544921875],[128.3916015625,-3.637890625000011],[128.42832031250003,-3.540429687500009],[128.45156250000002,-3.514746093750006],[128.536328125,-3.541308593750003],[128.56259765625003,-3.58544921875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[128.2755859375,-3.674609375],[128.24990234375002,-3.711132812500011],[128.19179687500002,-3.735253906250009],[128.14316406250003,-3.732714843750003],[128.15898437500005,-3.69765625],[128.146875,-3.677148437500009],[128.11083984375,-3.686425781250009],[128.05224609375,-3.714550781250011],[127.97802734375,-3.77099609375],[127.934375,-3.743066406250009],[127.925,-3.699316406250006],[127.92753906250005,-3.679394531250011],[128.01621093750003,-3.600878906250003],[128.119140625,-3.5875],[128.26435546875,-3.512304687500006],[128.3291015625,-3.515917968750003],[128.313671875,-3.563671875000011],[128.291015625,-3.59765625],[128.27744140625003,-3.633203125],[128.2755859375,-3.674609375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[123.17978515625003,-4.551171875],[123.20302734375002,-4.766210937500006],[123.19570312500002,-4.82265625],[123.13945312499999,-4.739941406250011],[123.11923828125003,-4.7234375],[123.10380859374999,-4.739941406250011],[123.08388671875002,-4.7490234375],[123.05517578125,-4.748242187500011],[123.01796875000002,-4.831738281250011],[123.0146484375,-4.910253906250006],[122.98652343750001,-4.963085937500011],[122.9716796875,-5.138476562500003],[122.98105468750003,-5.185742187500011],[123.02460937500001,-5.162402343750003],[123.05146484375001,-5.156445312500011],[123.14990234375,-5.224023437500009],[123.20195312499999,-5.273339843750009],[123.18730468749999,-5.3330078125],[123.12070312500003,-5.393164062500006],[123.04335937500002,-5.419335937500009],[122.98574218750002,-5.3935546875],[122.96875,-5.40576171875],[122.93466796875003,-5.436718750000011],[122.90878906250003,-5.477441406250009],[122.91621093750001,-5.519335937500003],[122.85019531250003,-5.637988281250003],[122.81210937500003,-5.671289062500009],[122.73310546875001,-5.634960937500011],[122.68437,-5.666210937500011],[122.64501953125,-5.663378906250003],[122.5849609375,-5.544628906250011],[122.58642578125,-5.488867187500006],[122.64218750000003,-5.42626953125],[122.642578125,-5.381152343750003],[122.67011718750001,-5.330859375],[122.7314453125,-5.261914062500011],[122.76650390625002,-5.210156250000011],[122.767578125,-5.17724609375],[122.79365234375001,-5.052441406250011],[122.80380859375003,-5.000097656250006],[122.82148437500001,-4.944433593750006],[122.84941406249999,-4.83125],[122.85332031249999,-4.618359375000011],[122.946875,-4.442675781250003],[123.03828125000001,-4.394726562500011],[123.07460937500002,-4.386914062500011],[123.06894531250003,-4.43359375],[123.17978515625003,-4.551171875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[122.64511718750003,-5.269433593750009],[122.61933593750001,-5.335839843750009],[122.56386718750002,-5.3875],[122.51972656250001,-5.391210937500006],[122.4736328125,-5.380664062500003],[122.39199218750002,-5.33544921875],[122.37128906250001,-5.383105468750003],[122.30703125000002,-5.380957031250006],[122.28310546875002,-5.319531250000011],[122.32900390625002,-5.1376953125],[122.39628906249999,-5.06982421875],[122.39003906250002,-4.99853515625],[122.33447265625,-4.846582031250009],[122.36894531249999,-4.7671875],[122.5244140625,-4.707128906250006],[122.65996093749999,-4.633886718750006],[122.70195312499999,-4.61865234375],[122.73974609375,-4.675],[122.75986328125003,-4.933886718750003],[122.61406249999999,-5.138671875],[122.64511718750003,-5.269433593750009]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[122.04296875,-5.43798828125],[121.97958984375003,-5.464746093750009],[121.859375,-5.350292968750011],[121.80849609375002,-5.256152343750003],[121.82070312500002,-5.202929687500003],[121.85664062500001,-5.15625],[121.87373046875001,-5.144628906250006],[121.86630859375003,-5.095996093750003],[121.91367187500003,-5.072265625],[121.96572265625002,-5.075585937500009],[121.99990234375002,-5.140820312500011],[122.041015625,-5.158789062500006],[122.06181640624999,-5.221289062500006],[122.04296875,-5.43798828125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[123.24238281250001,-4.112988281250011],[123.14453125,-4.233300781250009],[123.076171875,-4.227148437500006],[122.99472656250003,-4.148046875],[122.97089843750001,-4.061328125],[122.96904296874999,-4.029980468750011],[123.02490234375,-3.98095703125],[123.2119140625,-3.99755859375],[123.24697265625002,-4.040917968750009],[123.24238281250001,-4.112988281250011]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[126.05507812500002,-2.451269531250006],[126.03789062499999,-2.469433593750011],[125.97792968750002,-2.415429687500009],[125.93759765625003,-2.262792968750006],[125.90322265625002,-2.22216796875],[125.86289062500003,-2.0771484375],[125.87324218750001,-2.0359375],[125.92275390625002,-1.974804687500011],[125.96279296875002,-1.975781250000011],[125.99267578125,-2.011816406250006],[125.97597656250002,-2.168066406250006],[126.06572265624999,-2.365820312500006],[126.05507812500002,-2.451269531250006]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[126.02421874999999,-1.789746093750011],[126.33173828125001,-1.822851562500006],[126.2880859375,-1.85888671875],[125.95644531250002,-1.916601562500006],[125.8388671875,-1.906152343750009],[125.47919921875001,-1.940039062500006],[125.4326171875,-1.938085937500006],[125.42597656250001,-1.882226562500009],[125.38720703125,-1.843066406250003],[125.44472656250002,-1.808984375],[125.52089843750002,-1.800878906250006],[125.72031250000003,-1.813769531250003],[126.02421874999999,-1.789746093750011]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[124.96953124999999,-1.70546875],[125.06298828125,-1.741015625],[125.09589843750001,-1.740820312500006],[125.12675781249999,-1.699316406250006],[125.14580078124999,-1.692578125000011],[125.18789062500002,-1.712890625],[125.19765625000002,-1.7802734375],[125.25820312500002,-1.770898437500009],[125.30537109375001,-1.7939453125],[125.32021484375002,-1.81005859375],[125.31406250000003,-1.877148437500011],[125.134765625,-1.888964843750003],[125.00673828125002,-1.943066406250011],[124.83447265625,-1.894433593750009],[124.63916015625,-1.978222656250011],[124.52060546875003,-2.006933593750006],[124.41777343749999,-2.005175781250003],[124.32968750000003,-1.85888671875],[124.380859375,-1.6875],[124.41757812500003,-1.659277343750006],[124.48300781250003,-1.644335937500003],[124.66396484375002,-1.635937500000011],[124.96953124999999,-1.70546875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[123.84824218750003,-1.95546875],[123.86601562499999,-1.995703125],[123.80351562499999,-1.994335937500011],[123.77724609375002,-1.918652343750011],[123.78349609374999,-1.878320312500009],[123.84824218750003,-1.95546875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[123.21230468750002,-1.171289062500009],[123.23427734375002,-1.233691406250003],[123.19804687499999,-1.287695312500006],[123.23779296875,-1.389355468750011],[123.33857421875001,-1.254003906250006],[123.43476562500001,-1.23681640625],[123.48935546875003,-1.25927734375],[123.52685546875,-1.286035156250009],[123.54726562500002,-1.33740234375],[123.51191406250001,-1.447363281250006],[123.44873046875,-1.498828125],[123.36699218749999,-1.507128906250003],[123.32861328125,-1.443066406250011],[123.27490234375,-1.437207031250011],[123.23740234375003,-1.576953125],[123.22050781249999,-1.598339843750011],[123.17294921875003,-1.616015625],[123.13037109375,-1.577441406250003],[123.12294921875002,-1.556054687500009],[123.18291015624999,-1.492773437500006],[123.150390625,-1.304492187500003],[123.10517578125001,-1.33984375],[122.984375,-1.510644531250009],[122.89042968749999,-1.587207031250003],[122.85849609375003,-1.548242187500009],[122.81083984374999,-1.43212890625],[122.83222656250001,-1.283007812500003],[122.90800781249999,-1.182226562500006],[122.97246093749999,-1.189160156250011],[123.15830078125003,-1.157519531250003],[123.21230468750002,-1.171289062500009]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[123.15253906250001,-1.816503906250006],[123.07880859375001,-1.89892578125],[123.07089843750003,-1.854882812500009],[123.08583984375002,-1.81484375],[123.1064453125,-1.78671875],[123.1375,-1.772656250000011],[123.15253906250001,-1.816503906250006]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[121.86435546875003,-0.406835937500006],[121.90683593750003,-0.451269531250006],[121.88125,-0.502636718750011],[121.846875,-0.48984375],[121.75605468750001,-0.490820312500006],[121.72177734375003,-0.494726562500006],[121.68095703124999,-0.525],[121.6552734375,-0.526171875],[121.67236328125,-0.478808593750003],[121.74931640624999,-0.40703125],[121.79736328125,-0.417675781250011],[121.86435546875003,-0.406835937500006]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[126.81660156250001,4.033496093749989],[126.77626953125002,4.012597656249994],[126.71123046874999,4.020263671875],[126.70449218750002,4.070996093749997],[126.77011718750003,4.162207031249991],[126.81357421875003,4.258496093749997],[126.76728515625001,4.282568359374991],[126.72207031250002,4.344189453124997],[126.72050781249999,4.415820312499989],[126.75732421875,4.547900390624989],[126.8125,4.537207031249991],[126.86513671875002,4.479833984374991],[126.88671875,4.372509765624997],[126.92109375000001,4.291015625],[126.84765625,4.179980468749989],[126.81660156250001,4.033496093749989]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[126.71933593750003,3.874658203124994],[126.72177734375003,3.83251953125],[126.66123046875003,3.928417968749997],[126.6375,4.041943359374997],[126.685546875,4.001416015624997],[126.73964843750002,3.917724609375],[126.71933593750003,3.874658203124994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[126.85185546874999,3.768457031249994],[126.83554687500003,3.756933593749991],[126.79960937499999,3.783886718749997],[126.77753906250001,3.813427734374997],[126.77890625000003,3.843164062499994],[126.80449218749999,3.85791015625],[126.85703125000003,3.812402343749994],[126.85781250000002,3.787207031249991],[126.85185546874999,3.768457031249994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[125.65810546875002,3.43603515625],[125.63320312500002,3.405419921874994],[125.51152343749999,3.461132812499997],[125.517578125,3.549609374999989],[125.50117187500001,3.593212890624997],[125.46855468749999,3.639111328124997],[125.45527343750001,3.684179687499991],[125.46884765625003,3.733251953124991],[125.54345703125,3.67041015625],[125.58564453125001,3.571093749999989],[125.6435546875,3.476513671874997],[125.65810546875002,3.43603515625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[125.40742187500001,2.651611328125],[125.39726562499999,2.629541015624994],[125.36005859375001,2.746826171875],[125.39082031250001,2.805371093749997],[125.43525390625001,2.783886718749997],[125.44648437500001,2.762988281249989],[125.40390625000003,2.70703125],[125.40742187500001,2.651611328125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[120.5283203125,-6.2984375],[120.4873046875,-6.46484375],[120.46796875000001,-6.406152343750009],[120.46074218749999,-6.254003906250006],[120.435546875,-6.18017578125],[120.45156250000002,-6.094921875000011],[120.44648437500001,-5.876269531250003],[120.47734374999999,-5.775292968750009],[120.5341796875,-5.90380859375],[120.54921875000002,-5.96923828125],[120.5283203125,-6.2984375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[131.98203125000003,-7.202050781250009],[131.96953125000005,-7.251367187500009],[131.92685546875003,-7.225],[131.88447265625,-7.16748046875],[131.82285156250003,-7.1591796875],[131.7775390625,-7.143945312500009],[131.75078125000005,-7.116796875],[131.92226562500002,-7.1044921875],[131.98203125000003,-7.202050781250009]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[130.86220703125002,-8.31875],[130.77519531250005,-8.349902343750003],[130.83339843750002,-8.270800781250003],[131.02011718750003,-8.09130859375],[131.08740234375,-8.12451171875],[131.17636718750003,-8.130761718750009],[131.04375,-8.212011718750006],[130.90810546875002,-8.245703125],[130.86220703125002,-8.31875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[131.32558593750002,-7.99951171875],[131.30917968750003,-8.010839843750006],[131.18496093750002,-7.997851562500003],[131.11376953125,-7.997363281250003],[131.12343750000002,-7.921875],[131.08681640625002,-7.865039062500003],[131.13681640625003,-7.78173828125],[131.13779296875003,-7.684863281250003],[131.19003906250003,-7.671875],[131.19736328125003,-7.61669921875],[131.26005859375005,-7.470507812500003],[131.296875,-7.438085937500006],[131.34921875000003,-7.425390625],[131.41103515625002,-7.340136718750003],[131.44619140625002,-7.315332031250009],[131.4826171875,-7.250683593750011],[131.53525390625003,-7.220605468750009],[131.53085937500003,-7.165136718750006],[131.5607421875,-7.1357421875],[131.64345703125002,-7.11279296875],[131.70078125000003,-7.140234375],[131.73613281250005,-7.197070312500003],[131.64384765625005,-7.266894531250003],[131.69111328125,-7.438867187500009],[131.62441406250002,-7.626171875000011],[131.5802734375,-7.682226562500006],[131.49843750000002,-7.730664062500011],[131.47353515625002,-7.776660156250003],[131.37705078125003,-7.869140625],[131.34775390625003,-7.948046875],[131.34345703125,-7.9814453125],[131.32558593750002,-7.99951171875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[129.8388671875,-7.95458984375],[129.77978515625,-8.046484375],[129.71347656250003,-8.040722656250011],[129.59189453125003,-7.917382812500009],[129.59873046875003,-7.831347656250003],[129.60898437500003,-7.803417968750011],[129.65546875,-7.794824218750009],[129.81298828125,-7.819726562500009],[129.84355468750005,-7.889355468750011],[129.8388671875,-7.95458984375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[128.6701171875,-7.183300781250011],[128.625,-7.20859375],[128.55019531250002,-7.156347656250006],[128.52978515625,-7.134570312500003],[128.57734375,-7.083203125000011],[128.62773437500005,-7.06875],[128.65830078125003,-7.091113281250003],[128.67324218750002,-7.113378906250006],[128.66689453125002,-7.137988281250003],[128.6701171875,-7.183300781250011]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[127.82343750000001,-8.098828125000011],[127.99843750000002,-8.1390625],[128.098828125,-8.134863281250006],[128.11923828125003,-8.170703125],[128.02353515625003,-8.25537109375],[127.82089843750003,-8.190234375],[127.78623046875003,-8.120312500000011],[127.82343750000001,-8.098828125000011]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[127.41943359375,-7.623046875],[127.35527343750005,-7.646484375],[127.375,-7.572460937500011],[127.37070312500003,-7.512792968750006],[127.47519531250003,-7.531054687500003],[127.47402343750002,-7.578515625],[127.46396484375003,-7.596875],[127.41943359375,-7.623046875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[126.80097656250001,-7.667871093750009],[126.814453125,-7.716503906250011],[126.81269531250001,-7.737890625],[126.69287109375,-7.753515625],[126.57734375000001,-7.8076171875],[126.51816406250003,-7.869921875],[126.47207031250002,-7.950390625000011],[126.31289062500002,-7.917675781250011],[126.17109375000001,-7.912304687500011],[126.1083984375,-7.883984375000011],[126.0400390625,-7.885839843750006],[125.95156250000002,-7.9109375],[125.826171875,-7.979296875],[125.79824218750002,-7.984570312500011],[125.80839843749999,-7.880664062500003],[125.84316406250002,-7.816699218750003],[125.97529296875001,-7.663378906250003],[126.08535156250002,-7.697363281250006],[126.21367187499999,-7.706738281250011],[126.359375,-7.6767578125],[126.462890625,-7.6078125],[126.60957031250001,-7.57177734375],[126.72636718749999,-7.662207031250006],[126.80097656250001,-7.667871093750009]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[125.64609375000003,-8.139941406250003],[125.57949218750002,-8.311816406250003],[125.50712890624999,-8.275097656250011],[125.58408203125003,-8.178613281250009],[125.62109375,-8.15],[125.64609375000003,-8.139941406250003]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[123.41621093750001,-10.302636718750009],[123.32597656249999,-10.3375],[123.32558593750002,-10.26416015625],[123.39531249999999,-10.17138671875],[123.45878906249999,-10.139941406250003],[123.49394531249999,-10.176953125000011],[123.49677734375001,-10.193945312500006],[123.40507812499999,-10.227148437500006],[123.41621093750001,-10.302636718750009]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[122.94892578125001,-10.909277343750006],[122.85585937500002,-10.90966796875],[122.826171875,-10.899121093750011],[122.81845703125003,-10.81103515625],[122.845703125,-10.761816406250006],[123.06142578125002,-10.698437500000011],[123.14580078124999,-10.639941406250003],[123.26542968749999,-10.518164062500006],[123.33964843749999,-10.486230468750009],[123.35849609375003,-10.472460937500003],[123.37109375,-10.474902343750003],[123.38310546874999,-10.567578125000011],[123.41289062499999,-10.62265625],[123.41816406250001,-10.651269531250009],[123.31074218750001,-10.698437500000011],[123.21484375,-10.80615234375],[123.00527343750002,-10.876367187500009],[122.94892578125001,-10.909277343750006]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[121.88300781250001,-10.59033203125],[121.83310546875003,-10.602148437500006],[121.72617187500003,-10.573144531250009],[121.70468750000003,-10.5556640625],[121.79628906250002,-10.507421875],[121.86699218749999,-10.438867187500009],[121.94951171874999,-10.433007812500009],[121.99833984374999,-10.446972656250011],[121.98134765625002,-10.528417968750006],[121.88300781250001,-10.59033203125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[124.57558593750002,-8.140820312500011],[124.599609375,-8.201757812500006],[124.67685546875003,-8.168066406250006],[124.75224609374999,-8.159570312500009],[124.92412109374999,-8.166015625],[125.05029296875,-8.179589843750009],[125.12460937500003,-8.204785156250011],[125.13173828125002,-8.326464843750003],[125.09677734375003,-8.352832031250003],[124.44423828125002,-8.444628906250003],[124.38066406249999,-8.415136718750006],[124.35556640625003,-8.385937500000011],[124.42597656250001,-8.295800781250009],[124.3935546875,-8.253027343750006],[124.4306640625,-8.183203125],[124.50859374999999,-8.135449218750011],[124.57558593750002,-8.140820312500011]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[124.28662109375,-8.329492187500009],[124.22578125000001,-8.391308593750011],[124.18437,-8.498730468750011],[124.14667968750001,-8.531445312500011],[124.06572265624999,-8.551660156250009],[124.01728515625001,-8.44384765625],[123.927734375,-8.448925781250011],[123.97148437499999,-8.354101562500006],[124.01376953125003,-8.318652343750003],[124.06875,-8.317773437500009],[124.09580078125003,-8.356152343750011],[124.11054687500001,-8.3642578125],[124.23955078124999,-8.203417968750003],[124.265625,-8.201757812500006],[124.287109375,-8.208691406250011],[124.30449218749999,-8.228808593750003],[124.28662109375,-8.329492187500009]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[123.9248046875,-8.2724609375],[123.78388671875001,-8.299609375],[123.69785156250003,-8.424414062500006],[123.62919921874999,-8.422460937500006],[123.59160156249999,-8.477929687500009],[123.58261718750003,-8.501660156250011],[123.587890625,-8.523828125],[123.58017578125003,-8.544921875],[123.55302734374999,-8.566796875],[123.48867187500002,-8.532324218750006],[123.43378906250001,-8.576074218750009],[123.41074218750003,-8.586621093750011],[123.32998046875002,-8.53564453125],[123.25332031250002,-8.53857421875],[123.23007812500003,-8.530664062500009],[123.325,-8.4390625],[123.45458984375,-8.353710937500011],[123.47587890624999,-8.322265625],[123.42519531250002,-8.313378906250009],[123.39492187500002,-8.300585937500003],[123.39121093750003,-8.280468750000011],[123.47324218750003,-8.26708984375],[123.52998046875001,-8.265234375],[123.57314453125002,-8.29150390625],[123.6005859375,-8.291308593750003],[123.77597656250003,-8.1904296875],[123.84550781249999,-8.21337890625],[123.89609375000003,-8.2392578125],[123.9248046875,-8.2724609375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[123.31748046875003,-8.354785156250003],[123.29726562500002,-8.398632812500011],[123.025,-8.3955078125],[123.03261718750002,-8.337792968750009],[123.10830078125002,-8.274804687500009],[123.13349609375001,-8.253808593750009],[123.21708984374999,-8.235449218750006],[123.33603515625003,-8.26904296875],[123.31748046875003,-8.354785156250003]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[119.46406250000001,-8.741015625],[119.42490234375003,-8.75048828125],[119.38554687499999,-8.736035156250011],[119.40166015624999,-8.647070312500006],[119.37890625,-8.586523437500006],[119.419921875,-8.5390625],[119.43017578125,-8.454980468750009],[119.44648437500001,-8.42919921875],[119.47050781249999,-8.455664062500006],[119.48173828124999,-8.472949218750003],[119.50214843750001,-8.481054687500006],[119.54697265625003,-8.482617187500011],[119.55722656250003,-8.518847656250003],[119.55546874999999,-8.553417968750011],[119.53632812500001,-8.58935546875],[119.48281250000002,-8.628222656250003],[119.44404296875001,-8.671777343750009],[119.46406250000001,-8.741015625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[119.07382812500003,-8.238867187500006],[119.02998046875001,-8.240039062500003],[119.02089843750002,-8.199902343750011],[119.03662109375,-8.1578125],[119.07871093750003,-8.140234375],[119.09775390625003,-8.13916015625],[119.12832031250002,-8.177148437500009],[119.13486328125003,-8.197070312500003],[119.10673828124999,-8.2234375],[119.07382812500003,-8.238867187500006]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[115.60996093750003,-8.769824218750003],[115.58193359375002,-8.80419921875],[115.50087890625002,-8.742871093750011],[115.48046875,-8.715429687500006],[115.540625,-8.675390625],[115.56142578125002,-8.669921875],[115.61328125,-8.713183593750003],[115.60996093750003,-8.769824218750003]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[115.37705078125003,-6.970800781250006],[115.29580078125002,-6.98779296875],[115.22031250000003,-6.952539062500009],[115.22216796875,-6.905175781250009],[115.24052734374999,-6.861230468750009],[115.35371093750001,-6.838476562500006],[115.41445312500002,-6.839746093750009],[115.47919921875001,-6.870214843750006],[115.52421874999999,-6.90185546875],[115.54609375000001,-6.938671875000011],[115.42412109374999,-6.940625],[115.37705078125003,-6.970800781250006]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[112.71943359375001,-5.81103515625],[112.69794921875001,-5.846484375],[112.60214843750003,-5.843652343750009],[112.58603515625003,-5.803613281250009],[112.64853515625003,-5.730859375],[112.69003906250003,-5.726171875],[112.72734374999999,-5.752734375],[112.71943359375001,-5.81103515625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[117.9228515625,4.054296875],[117.73681640625,4.004003906249991],[117.62509765625003,4.121484375],[117.66679687499999,4.204003906249994],[117.662109375,4.250195312499997],[117.7080078125,4.262402343749997],[117.76142578125001,4.25234375],[117.884765625,4.186132812499991],[117.91787109375002,4.090527343749997],[117.9228515625,4.054296875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[117.65839843750001,3.280517578125],[117.64580078124999,3.247753906249997],[117.56035156249999,3.328222656249991],[117.5375,3.386376953124994],[117.5478515625,3.431982421874991],[117.63671875,3.436083984374989],[117.68085937500001,3.407519531249989],[117.65839843750001,3.280517578125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[116.42412109374999,-3.464453125],[116.38779296875003,-3.63671875],[116.32656250000002,-3.5390625],[116.39531249999999,-3.42333984375],[116.42695312500001,-3.39990234375],[116.42412109374999,-3.464453125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[116.30332031250003,-3.8681640625],[116.09335937500003,-4.054101562500009],[116.05878906250001,-4.006933593750006],[116.07695312499999,-3.817480468750006],[116.01835937499999,-3.699902343750011],[116.0224609375,-3.612402343750006],[116.06357421875003,-3.457910156250009],[116.11738281250001,-3.339550781250011],[116.23935546875003,-3.260351562500006],[116.26972656250001,-3.251074218750006],[116.26210937500002,-3.394824218750003],[116.28652343750002,-3.448828125],[116.29511718750001,-3.495019531250009],[116.28203124999999,-3.534765625],[116.30517578125,-3.718554687500003],[116.31865234374999,-3.762988281250003],[116.28925781250001,-3.820898437500006],[116.30332031250003,-3.8681640625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[108.953125,-1.61962890625],[108.837890625,-1.66162109375],[108.8037109375,-1.567773437500009],[108.87724609374999,-1.53984375],[108.95683593749999,-1.5640625],[108.953125,-1.61962890625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[109.71025390624999,-1.1806640625],[109.51083984375003,-1.2828125],[109.46367187499999,-1.277539062500011],[109.428125,-1.2412109375],[109.45029296875003,-1.044140625000011],[109.47597656250002,-0.9853515625],[109.61464843750002,-0.979101562500006],[109.69951171874999,-1.00732421875],[109.74335937500001,-1.039355468750003],[109.76054687499999,-1.105175781250011],[109.75078124999999,-1.14501953125],[109.71025390624999,-1.1806640625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[108.8875,2.905419921874994],[108.8388671875,2.85302734375],[108.78652343750002,2.885644531249994],[108.86708984375002,2.991894531249997],[108.8857421875,2.998974609374997],[108.8875,2.905419921874994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[108.31601562500003,3.689648437499997],[108.17958984375002,3.653076171875],[108.10039062499999,3.704541015624997],[108.18613281250003,3.76796875],[108.21640625000003,3.772167968749997],[108.23613281249999,3.784570312499994],[108.24326171875003,3.810351562499989],[108.08847656250003,3.852099609374989],[108.04453125000003,3.888964843749989],[108.00234375000002,3.982861328124997],[108.00351562500003,4.042578125],[108.20195312499999,4.200488281249989],[108.24833984374999,4.217138671874991],[108.25556640625001,4.151757812499994],[108.39287109374999,3.986181640624991],[108.39882812500002,3.8759765625],[108.3935546875,3.836181640625],[108.31601562500003,3.689648437499997]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[106.28525390625003,3.157128906249994],[106.28369140625,3.088232421874991],[106.21455078125001,3.128564453124994],[106.20097656249999,3.204882812499989],[106.22373046875003,3.229589843749991],[106.27119140625001,3.21630859375],[106.28525390625003,3.157128906249994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[105.76035156250003,2.863037109375],[105.71855468749999,2.859179687499989],[105.70615234375003,2.888867187499997],[105.70791015625002,2.940087890624994],[105.70419921875003,2.980908203124997],[105.69218749999999,3.011328125],[105.69218749999999,3.0625],[105.73066406250001,3.036962890624991],[105.76035156250003,3.013037109374991],[105.79453125000003,2.995947265624991],[105.82216796875002,2.984375],[105.83671874999999,2.976513671874997],[105.80937,2.903955078124994],[105.76035156250003,2.863037109375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[101.70810546875003,2.078417968749989],[101.76230468750003,1.996533203124997],[101.77353515625003,1.943457031249991],[101.73408203125001,1.882568359375],[101.71943359375001,1.789160156249991],[101.60273437500001,1.715722656249994],[101.50078124999999,1.733203124999989],[101.4677734375,1.759375],[101.40341796875003,1.901318359374997],[101.40966796875,2.021679687499997],[101.45029296875003,2.067822265624997],[101.54472656249999,2.060742187499997],[101.64072265625003,2.126708984375],[101.70810546875003,2.078417968749989]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[102.42714843750002,0.990136718749994],[102.380859375,0.959765624999989],[102.32529296875003,1.00703125],[102.27958984374999,1.07568359375],[102.25546875000003,1.147167968749997],[102.23417968749999,1.263964843749989],[102.22861328125003,1.347851562499997],[102.25634765625,1.397070312499991],[102.27646484375003,1.395263671875],[102.35859375000001,1.345654296874997],[102.41289062499999,1.260791015624989],[102.44287109375,1.234228515624991],[102.44882812500003,1.15625],[102.42890625000001,1.067285156249994],[102.42714843750002,0.990136718749994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[102.49189453125001,1.459179687499997],[102.49941406250002,1.330908203124991],[102.42519531250002,1.364453125],[102.36689453125001,1.415478515624997],[102.27421874999999,1.453125],[102.16132812500001,1.465429687499991],[102.07871093750003,1.498583984374989],[102.02089843750002,1.558203125],[102.01835937499999,1.585644531249997],[102.02402343750003,1.607958984374989],[102.04218750000001,1.625390625],[102.46953124999999,1.510058593749989],[102.49189453125001,1.459179687499997]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[103.02753906250001,0.746630859374989],[103.0087890625,0.708105468749991],[102.97148437499999,0.736523437499997],[102.77626953125002,0.779589843749989],[102.71054687500003,0.784375],[102.54160156250003,0.831591796874989],[102.49042968750001,0.856640625],[102.45390624999999,0.889501953124991],[102.46640625000003,0.950341796874994],[102.49140625000001,0.986865234374989],[102.50664062499999,1.088769531249994],[102.54921875000002,1.130224609374991],[102.63320312500002,1.054394531249997],[102.72617187500003,0.989208984374997],[102.78007812499999,0.959375],[102.94414062499999,0.892724609374994],[103.00244140625,0.859277343749994],[103.02753906250001,0.746630859374989]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[103.16640625000002,0.870166015624989],[103.13720703125,0.841650390624991],[103.08671874999999,0.84814453125],[103.03339843750001,0.88203125],[102.96396484375003,0.942675781249989],[102.88632812500003,0.996777343749997],[102.78798828125002,1.030957031249997],[102.72646484375002,1.041259765625],[102.70185546875001,1.0537109375],[102.7255859375,1.158837890624994],[102.79013671875003,1.165478515624997],[102.99941406250002,1.067773437499994],[103.06757812500001,1.014746093749991],[103.16640625000002,0.870166015624989]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[103.28447265624999,0.541943359374997],[103.17216796874999,0.536181640624989],[103.13955078125002,0.549072265625],[103.1533203125,0.643115234374989],[103.18740234375002,0.699755859374989],[103.23818359375002,0.698632812499994],[103.29511718750001,0.613964843749997],[103.28447265624999,0.541943359374997]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[103.42392578125003,1.04833984375],[103.4296875,0.993359375],[103.36328125,1.0068359375],[103.3154296875,1.0712890625],[103.35498046875,1.117236328124989],[103.37998046875003,1.133642578124991],[103.40488281250003,1.072558593749989],[103.42392578125003,1.04833984375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[103.4501953125,0.664453125],[103.4296875,0.65087890625],[103.34443359375001,0.777880859374989],[103.36572265625,0.851123046874989],[103.38613281250002,0.869580078124997],[103.43310546875,0.825],[103.47031250000003,0.77812],[103.49746093750002,0.722705078124989],[103.4501953125,0.664453125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[103.82861328125,0.801025390625],[103.833984375,0.772216796875],[103.74238281250001,0.829980468749994],[103.74003906249999,0.871826171875],[103.751953125,0.891357421875],[103.806640625,0.846337890624994],[103.82861328125,0.801025390625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[104.02480468750002,1.180566406249994],[104.08808593750001,1.137011718749989],[104.13984375000001,1.165576171874989],[104.13779296875003,1.128222656249989],[104.12734375000002,1.092382812499991],[104.06611328125001,0.989550781249989],[103.96357421875001,1.013232421874989],[103.93984375000002,1.046484375],[103.93222656250003,1.071386718749991],[103.94697265625001,1.087011718749991],[103.95537109374999,1.137451171875],[103.99980468749999,1.137255859374989],[104.02480468750002,1.180566406249994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[104.58535156250002,1.216113281249989],[104.59101562500001,1.141064453124997],[104.64814453125001,1.104589843749991],[104.66289062499999,1.049511718749997],[104.65283203125,0.961035156249991],[104.59912109375,0.858984375],[104.5751953125,0.831933593749994],[104.50429687500002,0.852636718749991],[104.48066406250001,0.886767578124989],[104.47119140625,0.913476562499994],[104.48105468750003,0.932519531249994],[104.42861328125002,0.956494140624997],[104.46240234375,0.995556640624997],[104.43925781249999,1.050439453124994],[104.2939453125,1.01611328125],[104.251953125,1.014892578125],[104.24423828125003,1.077392578125],[104.25019531250001,1.102636718749991],[104.36181640625,1.181494140624991],[104.42841796875001,1.196044921875],[104.50009765625003,1.180224609374989],[104.58535156250002,1.216113281249989]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[104.23935546875003,0.833984375],[104.1767578125,0.804882812499997],[104.09814453125,0.896240234375],[104.10107421875,0.91748046875],[104.10830078125002,0.933544921874997],[104.12275390625001,0.943994140624994],[104.17050781250003,0.896728515625],[104.22705078125,0.8798828125],[104.23935546875003,0.833984375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[104.68925781249999,0.059521484374997],[104.69814453125002,0.03466796875],[104.65087890625,0.062695312499997],[104.62236328124999,0.079638671874989],[104.603515625,0.09521484375],[104.49921875000001,0.232080078124994],[104.54384765625002,0.223291015624994],[104.65986328125001,0.103076171874989],[104.68925781249999,0.059521484374997]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[104.77861328124999,-0.175976562500011],[104.80751953125002,-0.192480468750006],[104.84316406250002,-0.140625],[104.90898437499999,-0.21171875],[104.94970703125,-0.247265625000011],[105.00537109375,-0.2828125],[104.95058593750002,-0.284472656250003],[104.92851562499999,-0.316992187500006],[104.91425781250001,-0.323339843750006],[104.70224609375003,-0.208691406250011],[104.56660156250001,-0.24560546875],[104.47353515625002,-0.212109375000011],[104.44707031249999,-0.189160156250011],[104.4970703125,-0.126367187500009],[104.54267578125001,0.017724609374994],[104.63564453125002,-0.018457031250009],[104.65839843750001,-0.062841796875006],[104.65273437500002,-0.076025390625006],[104.71347656250003,-0.10302734375],[104.77861328124999,-0.175976562500011]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[104.47421875000003,-0.334667968750011],[104.56777343750002,-0.431835937500011],[104.59013671874999,-0.466601562500003],[104.5439453125,-0.5205078125],[104.50654296875001,-0.5966796875],[104.4853515625,-0.612890625],[104.41386718749999,-0.583691406250011],[104.36318359375002,-0.65859375],[104.32978515625001,-0.5390625],[104.25712890624999,-0.46328125],[104.30234375000003,-0.3857421875],[104.31875,-0.380175781250003],[104.34072265625002,-0.382617187500003],[104.36357421874999,-0.40283203125],[104.47421875000003,-0.334667968750011]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[103.73652343750001,-0.347949218750003],[103.60634765625002,-0.382910156250006],[103.46132812500002,-0.357617187500011],[103.47900390625,-0.297460937500006],[103.54892578125003,-0.2275390625],[103.61093750000003,-0.230566406250006],[103.72392578124999,-0.276660156250003],[103.76425781250003,-0.317773437500009],[103.73652343750001,-0.347949218750003]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[108.20722656250001,-2.99765625],[108.19179687500002,-3.10302734375],[108.16728515624999,-3.142773437500011],[108.08359375000003,-3.194921875],[108.05527343750003,-3.226855468750003],[107.97714843750003,-3.221777343750006],[107.96728515625,-3.166601562500006],[107.94111328125001,-3.129296875],[107.85820312499999,-3.086328125],[107.83662109375001,-3.0966796875],[107.82177734375,-3.160742187500006],[107.65957031250002,-3.20556640625],[107.61445312500001,-3.209375],[107.63671875,-3.124804687500003],[107.59492187500001,-3.058398437500003],[107.59160156249999,-2.9765625],[107.58388671875002,-2.940722656250003],[107.5634765625,-2.920117187500011],[107.60488281250002,-2.863085937500003],[107.59814453125,-2.799707031250009],[107.6416015625,-2.731542968750006],[107.66630859374999,-2.566308593750009],[107.83779296875002,-2.5302734375],[107.87470703125001,-2.559667968750006],[108.07441406250001,-2.596972656250003],[108.21513671874999,-2.696972656250011],[108.290625,-2.829980468750009],[108.20722656250001,-2.99765625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[107.47333984375001,-2.899511718750006],[107.43281250000001,-2.92529296875],[107.40927734375003,-2.900585937500011],[107.40244140625003,-2.872949218750009],[107.41933593750002,-2.838085937500011],[107.47441406249999,-2.834667968750011],[107.49970703125001,-2.845019531250003],[107.47333984375001,-2.899511718750006]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[106.88642578125001,-3.005273437500009],[106.86972656250003,-3.025292968750009],[106.81425781249999,-3.014453125],[106.77431640625002,-2.98681640625],[106.74921875000001,-2.96044921875],[106.74287109375001,-2.932812500000011],[106.796875,-2.89892578125],[106.91064453125,-2.933984375],[106.88642578125001,-3.005273437500009]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[105.25283203125002,-6.640429687500003],[105.1904296875,-6.6625],[105.14277343750001,-6.64306640625],[105.12138671874999,-6.614941406250011],[105.19228515625002,-6.545605468750011],[105.22568359375003,-6.529101562500003],[105.26054687499999,-6.52392578125],[105.27744140625003,-6.561425781250009],[105.25283203125002,-6.640429687500003]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[97.48154296875003,1.465087890625],[97.69833984375003,1.183740234374994],[97.78642578124999,1.145898437499994],[97.90322265625002,1.018261718749997],[97.93193359374999,0.973925781249989],[97.90205078125001,0.884228515624997],[97.87646484375,0.628320312499994],[97.82041015625003,0.564453125],[97.68398437500002,0.59609375],[97.68251953125002,0.641064453124997],[97.60390625000002,0.833886718749994],[97.46123046874999,0.94140625],[97.40537109375003,0.946972656249997],[97.36884765625001,1.056933593749989],[97.296875,1.187353515624991],[97.07919921875003,1.425488281249997],[97.24423828125003,1.423632812499989],[97.32441406250001,1.481640625],[97.3427734375,1.527929687499991],[97.35595703125,1.539746093749997],[97.48154296875003,1.465087890625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[102.3671875,-5.478710937500011],[102.28593749999999,-5.483496093750006],[102.13554687499999,-5.360546875000011],[102.11074218750002,-5.322558593750003],[102.15351562500001,-5.286230468750006],[102.19843750000001,-5.288867187500003],[102.37177734375001,-5.366406250000011],[102.40546875000001,-5.40478515625],[102.3671875,-5.478710937500011]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[100.42509765624999,-3.182910156250003],[100.46513671874999,-3.328515625],[100.34609375000002,-3.229199218750011],[100.34843749999999,-3.158789062500006],[100.33203125,-3.113085937500003],[100.25996093750001,-3.056933593750003],[100.20429687500001,-2.98681640625],[100.17929687500003,-2.820214843750009],[100.19853515624999,-2.785546875],[100.24560546875,-2.783203125],[100.45458984375,-3.001953125],[100.46884765625003,-3.038964843750009],[100.46425781250002,-3.116894531250011],[100.43388671874999,-3.141308593750011],[100.42509765624999,-3.182910156250003]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[100.2041015625,-2.741015625],[100.13271484375002,-2.821386718750006],[100.01494140624999,-2.819726562500009],[99.99189453125001,-2.769824218750003],[99.99687,-2.649316406250009],[99.96816406250002,-2.609765625],[99.96933593750003,-2.594140625],[99.98789062500003,-2.525390625],[100.01191406250001,-2.51025390625],[100.20195312499999,-2.6796875],[100.2041015625,-2.741015625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[99.84306640624999,-2.343066406250003],[99.84785156250001,-2.369726562500006],[99.68515625000003,-2.28173828125],[99.60703125000003,-2.257519531250011],[99.53740234374999,-2.161523437500009],[99.55888671874999,-2.115429687500011],[99.56181640624999,-2.051171875],[99.57216796875002,-2.02578125],[99.6220703125,-2.0166015625],[99.68642578125002,-2.063378906250009],[99.73476562500002,-2.177734375],[99.81572265624999,-2.284375],[99.84306640624999,-2.343066406250003]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[99.16386718749999,-1.777929687500006],[99.07177734375,-1.783496093750003],[98.87431640624999,-1.663671875],[98.82773437500003,-1.609960937500006],[98.81630859375002,-1.538281250000011],[98.626953125,-1.261328125],[98.60175781250001,-1.197851562500006],[98.67607421874999,-0.970507812500003],[98.86904296875002,-0.915625],[98.9326171875,-0.954003906250009],[98.95478515625001,-1.05625],[99.06503906250003,-1.24072265625],[99.10146484375002,-1.340136718750003],[99.12890625,-1.384179687500009],[99.14042968749999,-1.41845703125],[99.13066406249999,-1.4423828125],[99.21035156250002,-1.559277343750011],[99.26728515625001,-1.627734375],[99.271484375,-1.738476562500011],[99.16386718749999,-1.777929687500006]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[98.45927734374999,-0.530468750000011],[98.39970703124999,-0.576855468750011],[98.30966796875003,-0.531835937500006],[98.33994140625003,-0.467871093750006],[98.35478515624999,-0.379296875],[98.40878906250003,-0.308984375],[98.42714843750002,-0.226464843750009],[98.32294921875001,-0.00078125],[98.37451171875,0.007080078125],[98.41542968750002,-0.017529296875011],[98.484375,-0.167675781250011],[98.54414062500001,-0.257617187500003],[98.52011718750003,-0.3796875],[98.45927734374999,-0.530468750000011]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[97.33417968750001,2.075634765624997],[97.32832031250001,2.053271484374989],[97.22509765625,2.158496093749989],[97.10830078125002,2.216894531249991],[97.15664062500002,2.232226562499989],[97.25283203125002,2.216015625],[97.29140625000002,2.200830078124994],[97.32871093750003,2.148535156249991],[97.33417968750001,2.075634765624997]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[96.46367187499999,2.360009765624994],[96.40097656250003,2.350683593749991],[96.34062,2.3720703125],[96.29042968750002,2.429589843749994],[96.02197265625,2.595751953124989],[95.9384765625,2.598437499999989],[95.87978515625002,2.640917968749989],[95.80859375,2.655615234374991],[95.73300781250003,2.766503906249994],[95.71718750000002,2.825976562499989],[95.77216796875001,2.85498046875],[95.80625,2.916015625],[95.89580078124999,2.8890625],[95.99785156249999,2.781396484374994],[96.1015625,2.7412109375],[96.12978515625002,2.720898437499997],[96.17998046874999,2.661328125],[96.41728515624999,2.515185546874989],[96.44306640625001,2.46562],[96.459375,2.415820312499989],[96.46367187499999,2.360009765624994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[95.36210937499999,5.812402343749994],[95.34257812499999,5.784130859374997],[95.283203125,5.798535156249997],[95.21767578125002,5.889501953124991],[95.24199218749999,5.907031249999989],[95.28251953124999,5.897753906249989],[95.35917968749999,5.876757812499989],[95.36601562499999,5.842675781249994],[95.36210937499999,5.812402343749994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[111.38925781250003,2.415332031249989],[111.35869140624999,2.402197265624991],[111.3115234375,2.437597656249991],[111.30039062500003,2.741162109374997],[111.33349609375,2.768310546875],[111.35507812500003,2.764453124999989],[111.37832031250002,2.709326171874991],[111.37626953124999,2.576318359374994],[111.38046875000003,2.458935546874997],[111.38925781250003,2.415332031249989]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[117.1416015625,7.168212890625],[117.08066406250003,7.115283203124989],[117.06015625000003,7.178857421874994],[117.06425781249999,7.260693359374997],[117.146875,7.337011718749991],[117.26406250000002,7.351660156249991],[117.28076171875,7.290625],[117.26679687500001,7.220800781249991],[117.23935546875003,7.184765625],[117.1416015625,7.168212890625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[32.01220703125,46.20390625],[32.15009765625001,46.1546875],[32.009375,46.167822265625],[31.7001953125,46.2140625],[31.563867187500023,46.257763671875],[31.528710937500023,46.306591796875],[31.5087890625,46.37314453125],[31.584863281250023,46.303173828125],[31.638476562500017,46.27255859375],[32.01220703125,46.20390625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[22.923730468750023,58.826904296875],[22.841699218750023,58.77744140625],[22.792871093750023,58.797216796875],[22.76728515625001,58.8208984375],[22.661425781250017,58.7091796875],[22.54218750000001,58.689990234375],[22.47265625,58.712060546874994],[22.478906250000023,58.753808593749994],[22.411035156250023,58.86337890625],[22.307421875000017,58.895458984375],[22.161914062500017,58.898486328125],[22.05625,58.943603515625],[22.46259765625001,58.97431640625],[22.50458984375001,59.02646484375],[22.587207031250017,59.081201171874994],[22.6494140625,59.087109375],[22.702246093750006,59.0744140625],[22.712207031250017,59.031982421875],[22.725488281250023,59.015087890625],[22.90986328125001,58.9912109375],[22.98164062500001,58.919824218749994],[23.008691406250023,58.833935546875],[22.923730468750023,58.826904296875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[23.343554687500017,58.550341796875],[23.260351562500006,58.539990234375],[23.0634765625,58.611083984375],[23.10908203125001,58.659228515625],[23.165429687500023,58.678125],[23.332812500000017,58.648583984374994],[23.3564453125,58.575537109375],[23.343554687500017,58.550341796875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[35.81611328125001,65.182080078125],[35.84843750000002,65.14267578125],[35.8583984375,65.0779296875],[35.82734375000001,65.036474609375],[35.84228515625,65.00146484375],[35.77871093750002,64.97666015625],[35.68007812500002,65.0576171875],[35.62138671875002,65.0587890625],[35.55859375,65.093603515625],[35.52890625,65.15107421875],[35.58574218750002,65.16708984375],[35.60869140625002,65.15712890625],[35.729101562500006,65.19755859375],[35.81611328125001,65.182080078125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[42.71367187500002,66.701708984375],[42.67558593750002,66.6880859375],[42.47734375000002,66.73505859375],[42.460058593750006,66.770361328125],[42.46855468750002,66.785546875],[42.547460937500006,66.7955078125],[42.631445312500006,66.7822265625],[42.69072265625002,66.735302734375],[42.71367187500002,66.701708984375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[26.8759765625,78.64892578125],[26.7294921875,78.646484375],[26.459570312500006,78.720263671875],[26.40771484375,78.784326171875],[26.45576171875001,78.810498046875],[26.5859375,78.811474609375],[26.78876953125001,78.723974609375],[27.007617187500017,78.697509765625],[26.8759765625,78.64892578125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[29.04707031250001,78.912060546875],[29.34541015625001,78.90576171875],[29.645117187500006,78.921630859375],[29.696679687500023,78.904736328125],[29.310546875,78.852099609375],[28.881152343750017,78.880078125],[28.494531250000023,78.88720703125],[28.037890625000017,78.8287109375],[27.889062500000023,78.8521484375],[28.120996093750023,78.908447265625],[28.3740234375,78.92705078125],[28.41474609375001,78.96142578125],[28.511132812500023,78.967333984375],[28.84521484375,78.970849609375],[29.04707031250001,78.912060546875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[50.0517578125,80.07431640625],[49.97089843750001,80.0607421875],[49.58828125000002,80.1361328125],[49.55605468750002,80.158935546875],[49.88369140625002,80.230224609375],[50.2509765625,80.219482421875],[50.30996093750002,80.18564453125],[50.31914062500002,80.17236328125],[50.072265625,80.10947265625],[50.0517578125,80.07431640625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[51.409277343750006,79.94423828125],[51.43515625,79.93193359375],[51.43125,79.9205078125],[51.076269531250006,79.931982421875],[50.4541015625,79.9244140625],[50.09140625,79.98056640625],[50.47265625,80.03544921875],[50.67578125,80.04853515625],[50.93632812500002,80.09423828125],[51.25439453125,80.0486328125],[51.237890625,80.0103515625],[51.242773437500006,79.991259765625],[51.32695312500002,79.972314453125],[51.409277343750006,79.94423828125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[32.525976562500006,80.119140625],[31.57763671875,80.0814453125],[31.48193359375,80.10791015625],[33.019140625,80.21796875],[33.0986328125,80.2287109375],[33.38398437500001,80.242333984375],[33.62929687500002,80.217431640625],[33.556640625,80.19814453125],[32.525976562500006,80.119140625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[57.81025390625001,81.546044921875],[57.86269531250002,81.5064453125],[58.0166015625,81.4837890625],[58.43603515625,81.46416015625],[58.56386718750002,81.418408203125],[58.371875,81.386962890625],[57.85869140625002,81.36806640625],[57.91191406250002,81.303271484375],[58.01533203125001,81.254833984375],[57.91289062500002,81.197509765625],[57.76972656250001,81.1697265625],[57.45097656250002,81.135546875],[57.15947265625002,81.178466796875],[56.821875,81.237939453125],[56.66923828125002,81.198291015625],[56.5125,81.175244140625],[56.36396484375001,81.17861328125],[56.191992187500006,81.223974609375],[55.71669921875002,81.1884765625],[55.57265625000002,81.228076171875],[55.46601562500001,81.311181640625],[55.78193359375001,81.329443359375],[56.156835937500006,81.303076171875],[56.40468750000002,81.38701171875],[56.71875,81.423388671875],[56.97304687500002,81.510546875],[57.09150390625001,81.5412109375],[57.36503906250002,81.53525390625],[57.45644531250002,81.54287109375],[57.71660156250002,81.5646484375],[57.81025390625001,81.546044921875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[54.71894531250001,81.115966796875],[55.470703125,81.019873046875],[56.17011718750001,81.029150390625],[56.472265625,80.9982421875],[56.90966796875,80.912890625],[57.56777343750002,80.8197265625],[57.69414062500002,80.79228515625],[57.58037109375002,80.75546875],[56.81474609375002,80.663623046875],[56.315527343750006,80.632861328125],[55.883398437500006,80.62841796875],[55.7125,80.6373046875],[55.540625,80.7033203125],[55.1171875,80.751904296875],[54.66816406250001,80.738671875],[54.62333984375002,80.765234375],[54.5328125,80.7830078125],[54.376074218750006,80.786962890625],[54.06660156250001,80.813623046875],[54.04541015625,80.87197265625],[54.24052734375002,80.90185546875],[54.367285156250006,80.90380859375],[54.41679687500002,80.9865234375],[54.63398437500001,81.11318359375],[54.71894531250001,81.115966796875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[50.75371093750002,81.047412109375],[50.61601562500002,81.041259765625],[50.518164062500006,81.045556640625],[50.41191406250002,81.084375],[50.37744140625,81.102734375],[50.36845703125002,81.122509765625],[50.464941406250006,81.126220703125],[50.505957031250006,81.14423828125],[50.521582031250006,81.158203125],[50.591796875,81.16943359375],[50.715917968750006,81.170654296875],[50.87861328125001,81.15087890625],[50.94619140625002,81.108154296875],[50.78876953125001,81.071826171875],[50.75371093750002,81.047412109375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[58.62236328125002,81.041650390625],[58.76152343750002,80.990966796875],[58.81533203125002,80.93359375],[58.90253906250001,80.89765625],[58.93056640625002,80.831689453125],[58.859960937500006,80.77939453125],[58.64189453125002,80.76796875],[58.28564453125,80.764892578125],[57.93789062500002,80.793359375],[57.74980468750002,80.8890625],[57.40517578125002,80.91513671875],[57.2109375,81.01708984375],[57.410253906250006,81.04677734375],[57.65625,81.03154296875],[58.04951171875001,81.11845703125],[58.10234375000002,81.1142578125],[58.18994140625,81.094580078125],[58.50761718750002,81.061767578125],[58.62236328125002,81.041650390625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[63.650976562500006,81.609326171875],[63.52851562500001,81.59658203125],[62.88496093750001,81.60888671875],[62.57304687500002,81.633056640625],[62.53125,81.647021484375],[62.515234375,81.659130859375],[62.1064453125,81.679345703125],[62.28398437500002,81.70654296875],[62.794921875,81.7189453125],[63.709570312500006,81.6873046875],[63.76738281250002,81.66416015625],[63.78242187500001,81.6498046875],[63.650976562500006,81.609326171875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[58.29541015625,81.715185546875],[57.96484375,81.695654296875],[57.92060546875001,81.710498046875],[57.909277343750006,81.721923828125],[57.94511718750002,81.7478515625],[57.984960937500006,81.797021484375],[58.13457031250002,81.827978515625],[59.261816406250006,81.85419921875],[59.40849609375002,81.825439453125],[59.35683593750002,81.78095703125],[59.3564453125,81.758984375],[58.29541015625,81.715185546875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[18.741601562500023,80.300927734375],[18.525,80.24560546875],[18.162207031250006,80.28818359375],[18.20556640625,80.331787109375],[18.29169921875001,80.358349609375],[18.519335937500017,80.34833984375],[18.741601562500023,80.300927734375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[11.250292968750017,78.610693359375],[11.26171875,78.54169921875],[11.424218750000023,78.548583984375],[11.616308593750006,78.47509765625],[11.82568359375,78.436083984375],[11.884863281250006,78.409326171875],[11.929394531250011,78.37490234375],[12.05615234375,78.305615234375],[12.116406250000011,78.232568359375],[11.965039062500011,78.224853515625],[11.756542968750011,78.32900390625],[11.586523437500006,78.388232421875],[11.372460937500023,78.43876953125],[11.19921875,78.441259765625],[11.121289062500011,78.46328125],[10.840625,78.6447265625],[10.788867187500017,78.6865234375],[10.62841796875,78.753857421875],[10.5576171875,78.8375],[10.558203125,78.9029296875],[10.772851562500023,78.8875],[10.960839843750023,78.84638671875],[11.123925781250023,78.753369140625],[11.152929687500006,78.724462890625],[11.078222656250006,78.68603515625],[11.154980468750011,78.640576171875],[11.250292968750017,78.610693359375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[19.219335937500006,74.391015625],[19.098535156250023,74.3521484375],[18.917578125,74.41064453125],[18.797460937500006,74.485693359375],[18.861230468750023,74.51416015625],[19.182910156250017,74.517919921875],[19.261523437500017,74.478955078125],[19.274707031250017,74.45673828125],[19.219335937500006,74.391015625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"MultiPolygon","coordinates":[[[[53.14140625000002,71.24189453125],[53.19257812500001,71.215283203125],[53.205175781250006,71.159716796875],[53.07148437500001,71.0650390625],[53.04814453125002,71.03095703125],[53.10576171875002,70.999267578125],[53.12099609375002,70.98203125],[53.02265625000001,70.968701171875],[53.004492187500006,71.01162109375],[52.94960937500002,71.05361328125],[52.83535156250002,71.08583984375],[52.78896484375002,71.11494140625],[52.738378906250006,71.1806640625],[52.54658203125001,71.250439453125],[52.42548828125001,71.2392578125],[52.28945312500002,71.270361328125],[52.249609375,71.284912109375],[52.23984375,71.325048828125],[52.29658203125001,71.3568359375],[52.51259765625002,71.38505859375],[52.61738281250001,71.383349609375],[52.72968750000001,71.355126953125],[52.7203125,71.389794921875],[52.73222656250002,71.4037109375],[52.77675781250002,71.3998046875],[52.9033203125,71.364990234375],[52.994140625,71.291259765625],[53.07402343750002,71.237939453125],[53.14140625000002,71.24189453125]]],[[[53.14140625000002,71.24189453125],[53.13847656250002,71.243408203125],[53.14570312500001,71.2421875],[53.14140625000002,71.24189453125]]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[74.66054687500002,72.8734375],[74.63837890625001,72.86376953125],[74.58808593750001,72.88115234375],[74.43476562500001,72.907666015625],[74.1806640625,72.975341796875],[74.1001953125,73.021533203125],[74.14238281250002,73.074365234375],[74.19853515625002,73.10908203125],[74.4087890625,73.13046875],[74.59990234375002,73.12177734375],[74.72529296875001,73.108154296875],[74.9615234375,73.0625],[74.74257812500002,73.03271484375],[74.64726562500002,72.96904296875],[74.66015625,72.929296875],[74.69716796875002,72.90771484375],[74.66054687500002,72.8734375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[75.50371093750002,73.456640625],[75.3443359375,73.432275390625],[75.375,73.477392578125],[75.56972656250002,73.540625],[75.93017578125,73.5736328125],[76.03945312500002,73.559912109375],[76.05156249999999,73.549267578125],[75.9009765625,73.481494140625],[75.8271484375,73.459130859375],[75.50371093750002,73.456640625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[76.75605468750001,73.44580078125],[76.659375,73.439501953125],[76.23447265625003,73.476220703125],[76.08310546875003,73.523486328125],[76.13955078125002,73.554296875],[76.25068359375001,73.5552734375],[76.75605468750001,73.44580078125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[77.63251953125001,72.291259765625],[77.14560546875003,72.281884765625],[76.90595703125001,72.29765625],[76.87109375,72.317041015625],[76.90312,72.365576171875],[77.14951171875003,72.439208984375],[77.26044921875001,72.4861328125],[77.37783203125002,72.565283203125],[77.57871093750003,72.630859375],[77.74853515625,72.631201171875],[78.27910156249999,72.55322265625],[78.35292968750002,72.504296875],[78.36513671875002,72.482421875],[78.15449218750001,72.4169921875],[78.00722656250002,72.39248046875],[77.78085937500003,72.308544921875],[77.63251953125001,72.291259765625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[79.50146484375,72.721923828125],[79.4306640625,72.710693359375],[78.88056640625001,72.751611328125],[78.69023437499999,72.80341796875],[78.63320312500002,72.850732421875],[78.65683593750003,72.89228515625],[79.16425781250001,73.0943359375],[79.35654296875003,73.038623046875],[79.4125,72.98310546875],[79.54130859374999,72.91865234375],[79.53789062499999,72.7693359375],[79.50146484375,72.721923828125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[82.7099609375,74.090869140625],[82.61279296875,74.0564453125],[82.478125,74.07578125],[82.38154296875001,74.09921875],[82.32939453124999,74.131103515625],[82.38242187500003,74.149267578125],[82.52558593750001,74.16142578125],[82.61103515625001,74.14853515625],[82.68896484375,74.11123046875],[82.7099609375,74.090869140625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[83.54902343750001,74.07177734375],[83.49580078125001,74.0484375],[83.45,74.05166015625],[83.41064453125,74.03955078125],[83.15898437499999,74.075341796875],[82.81777343750002,74.0916015625],[82.90292968750003,74.12890625],[83.14980468750002,74.151611328125],[83.51347656249999,74.12236328125],[83.61835937500001,74.089453125],[83.54902343750001,74.07177734375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[84.75898437500001,74.459423828125],[84.71044921875,74.3998046875],[84.42890625000001,74.430322265625],[84.38945312499999,74.454443359375],[84.54033203124999,74.4904296875],[84.67988281250001,74.512353515625],[84.87285156249999,74.51552734375],[84.75898437500001,74.459423828125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[86.65312,74.981298828125],[86.73710937499999,74.96298828125],[87.00058593750003,74.991943359375],[87.05214843750002,74.982568359375],[87.12431640624999,74.939892578125],[87.01171875,74.8619140625],[86.92714843750002,74.83076171875],[86.69199218750003,74.848291015625],[86.39052734375002,74.85087890625],[86.25859374999999,74.893505859375],[86.33066406250003,74.93896484375],[86.50449218750003,74.965966796875],[86.60546875,74.992822265625],[86.65312,74.981298828125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[82.17236328125,75.419384765625],[82.20878906249999,75.386962890625],[82.22158203125002,75.350537109375],[82.17929687500003,75.33896484375],[82.05009765624999,75.340966796875],[81.978515625,75.247119140625],[81.90507812499999,75.26279296875],[81.86054687500001,75.31650390625],[81.69765625000002,75.280517578125],[81.65478515625,75.288916015625],[81.57929687500001,75.33095703125],[81.53212890625002,75.33955078125],[81.50058593750003,75.367919921875],[81.71210937500001,75.451416015625],[81.84218750000002,75.40703125],[81.92656249999999,75.4099609375],[81.90976562500003,75.460009765625],[81.91279296875001,75.497705078125],[82.021875,75.5134765625],[82.165625,75.515625],[82.17236328125,75.419384765625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[96.53242187500001,76.278125],[96.61396484375001,76.263818359375],[96.58964843749999,76.221240234375],[96.48671875000002,76.233740234375],[96.35078125000001,76.212158203125],[96.35341796875002,76.177490234375],[96.30058593749999,76.121728515625],[96.10878906250002,76.15546875],[95.84453124999999,76.16025390625],[95.67861328125002,76.19365234375],[95.31113281250003,76.21474609375],[95.32207031249999,76.26162109375],[95.3798828125,76.2890625],[95.59443359375001,76.249609375],[95.78623046875003,76.293896484375],[96.15097656250003,76.271875],[96.27070312500001,76.30537109375],[96.53242187500001,76.278125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[97.58837890625,76.599365234375],[97.53525390625003,76.584423828125],[97.43037109375001,76.59072265625],[97.34169921875002,76.628857421875],[97.31035156249999,76.689599609375],[97.38164062499999,76.706689453125],[97.58837890625,76.599365234375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[96.28544921874999,77.02666015625],[96.25351562500003,77.007275390625],[96.20986328125002,76.992138671875],[96.09140625000003,77.0025390625],[95.85468750000001,76.974951171875],[95.76582031250001,76.990625],[95.68085937500001,77.021337890625],[95.36406249999999,77.0115234375],[95.27031249999999,77.01884765625],[95.42070312499999,77.056494140625],[95.85410156250003,77.09755859375],[96.52841796875003,77.205517578125],[96.56191406250002,77.154052734375],[96.56132812499999,77.12958984375],[96.42431640625,77.07119140625],[96.28544921874999,77.02666015625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[89.51425781250003,77.188818359375],[89.29951171875001,77.183984375],[89.17929687500003,77.209912109375],[89.14169921875003,77.226806640625],[89.20048828124999,77.27197265625],[89.28154296874999,77.30146484375],[89.6162109375,77.31103515625],[89.67958984375002,77.280322265625],[89.66582031249999,77.2544921875],[89.51425781250003,77.188818359375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[76.24892578125002,79.65107421875],[76.37255859375,79.615234375],[76.46738281250003,79.6431640625],[77.36015624999999,79.5568359375],[77.54931640625,79.5244140625],[77.58896484375003,79.501904296875],[76.81015625000003,79.489501953125],[76.64951171875003,79.493408203125],[76.63652343749999,79.54443359375],[76.45761718750003,79.545458984375],[76.15371093750002,79.578759765625],[76.071875,79.625634765625],[76.05156249999999,79.6447265625],[76.1484375,79.664453125],[76.24892578125002,79.65107421875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[80.02666015624999,80.84814453125],[79.09853515625002,80.812060546875],[79.0068359375,80.834814453125],[78.97763671875003,80.8482421875],[79.10986328125,80.923583984375],[79.21738281250003,80.9603515625],[79.806640625,80.975390625],[80.27958984374999,80.9498046875],[80.42792968750001,80.927685546875],[80.37333984374999,80.8826171875],[80.34482421875003,80.867919921875],[80.02666015624999,80.84814453125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[91.56718749999999,81.1412109375],[91.22285156250001,81.063818359375],[89.97578125000001,81.113134765625],[89.91943359375,81.14873046875],[89.90117187499999,81.170703125],[90.06992187500003,81.213720703125],[91.10898437500003,81.19912109375],[91.47783203124999,81.183935546875],[91.56718749999999,81.1412109375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[107.69550781250001,78.130908203125],[107.60625,78.082568359375],[107.48164062500001,78.057763671875],[107.34384765625003,78.098583984375],[107.00166015625001,78.095654296875],[106.41552734375,78.13984375],[106.58330078124999,78.167578125],[107.50830078125,78.189404296875],[107.5732421875,78.185546875],[107.69550781250001,78.130908203125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[106.27041015625002,78.206201171875],[106.15107421875001,78.1986328125],[106.02363281250001,78.2201171875],[106.05839843749999,78.2646484375],[106.3505859375,78.272607421875],[106.45683593749999,78.3400390625],[106.64042968749999,78.33623046875],[106.69121093749999,78.316650390625],[106.71962890625002,78.294189453125],[106.71894531250001,78.264990234375],[106.67910156250002,78.264990234375],[106.50468749999999,78.261669921875],[106.47246093749999,78.24501953125],[106.27041015625002,78.206201171875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[107.41474609375001,77.24267578125],[107.30224609375,77.24150390625],[107.26953125,77.289013671875],[107.36640625000001,77.346630859375],[107.48642578125003,77.347119140625],[107.59365234375002,77.330029296875],[107.62929687500002,77.319677734375],[107.66455078125,77.2998046875],[107.67949218749999,77.26826171875],[107.41474609375001,77.24267578125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[112.47802734375,76.6208984375],[112.63251953125001,76.552978515625],[112.66083984375001,76.5095703125],[112.61416015625002,76.499267578125],[112.58652343750003,76.482958984375],[112.57480468750003,76.452392578125],[112.53164062500002,76.450048828125],[112.39482421874999,76.4837890625],[112.296875,76.53798828125],[112.15380859375,76.54931640625],[112.00273437499999,76.602978515625],[111.96894531250001,76.626171875],[112.01113281250002,76.632861328125],[112.28144531250001,76.618359375],[112.39414062500003,76.643798828125],[112.47802734375,76.6208984375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[120.26132812500003,73.08984375],[120.00791015625003,73.044873046875],[119.79208984375003,73.04541015625],[119.64042968749999,73.12431640625],[119.76191406250001,73.15546875],[119.96445312500003,73.16767578125],[120.07851562500002,73.15673828125],[120.23681640625,73.107275390625],[120.26132812500003,73.08984375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[124.54296875,73.85009765625],[124.48173828124999,73.847900390625],[124.36640625000001,73.874609375],[124.33574218749999,73.910302734375],[124.33652343750003,73.928369140625],[124.4296875,73.943017578125],[124.54765624999999,73.933837890625],[124.63691406250001,73.900390625],[124.65292968750003,73.888037109375],[124.54296875,73.85009765625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[135.94863281250002,75.4095703125],[135.74589843750005,75.381982421875],[135.45195312500005,75.38955078125],[135.47304687500002,75.463232421875],[135.5234375,75.495849609375],[135.59267578125002,75.57646484375],[135.56123046875,75.636474609375],[135.57841796875005,75.7099609375],[135.61386718750003,75.76630859375],[135.69863281250002,75.845263671875],[135.78828125,75.798486328125],[135.84921875000003,75.729248046875],[135.90478515625,75.694384765625],[136.12734375000002,75.6255859375],[136.1689453125,75.60556640625],[135.9833984375,75.521923828125],[135.96513671875005,75.4861328125],[136.0205078125,75.43837890625],[135.94863281250002,75.4095703125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[149.15019531250005,76.659912109375],[148.3986328125,76.6482421875],[148.44814453125002,76.676953125],[148.71962890625002,76.74658203125],[149.4064453125,76.782080078125],[149.26835937500005,76.747216796875],[149.20478515625,76.677001953125],[149.15019531250005,76.659912109375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[136.1974609375,73.913623046875],[136.12167968750003,73.885009765625],[136.05146484375,73.9291015625],[135.71455078125,74.059521484375],[135.63339843750003,74.121435546875],[135.44863281250002,74.1796875],[135.40244140625003,74.201708984375],[135.38701171875005,74.253369140625],[135.62832031250002,74.219921875],[136.03681640625,74.09033203125],[136.25917968750002,73.9849609375],[136.1974609375,73.913623046875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[137.95986328125002,71.507666015625],[137.71181640625002,71.4232421875],[137.61289062500003,71.433935546875],[137.51181640625003,71.474609375],[137.45781250000005,71.48349609375],[137.40322265625002,71.477294921875],[137.34423828125,71.460546875],[137.26552734375002,71.455908203125],[137.07871093750003,71.502197265625],[137.06406250000003,71.5298828125],[137.08183593750005,71.542724609375],[137.12949218750003,71.55615234375],[137.1681640625,71.55712890625],[137.28183593750003,71.579931640625],[137.81679687500002,71.587890625],[137.8576171875,71.583056640625],[137.9337890625,71.5427734375],[137.95986328125002,71.507666015625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[160.7189453125,70.822705078125],[160.6513671875,70.805859375],[160.50478515625002,70.8197265625],[160.43691406250002,70.851025390625],[160.4404296875,70.92265625],[160.44853515625005,70.934033203125],[160.56582031250002,70.923779296875],[160.64492187500002,70.883544921875],[160.7189453125,70.822705078125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[169.20078125000003,69.58046875],[168.91572265625,69.571435546875],[168.34804687500002,69.66435546875],[168.14433593750005,69.713330078125],[167.99267578125,69.775830078125],[167.8212890625,69.81962890625],[167.78886718750005,69.836865234375],[167.81396484375,69.873046875],[167.86474609375,69.90107421875],[168.0595703125,69.97490234375],[168.1962890625,70.0083984375],[168.35791015625,70.015673828125],[169.37480468750005,69.8826171875],[169.42070312500005,69.8560546875],[169.43359375,69.832177734375],[169.4181640625,69.77919921875],[169.33242187500002,69.769580078125],[169.29912109375005,69.734765625],[169.26337890625,69.6287109375],[169.24580078125,69.601123046875],[169.20078125000003,69.58046875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[163.63515625000002,58.603369140625],[163.47138671875,58.509375],[163.447265625,58.524658203125],[163.4318359375,58.546142578125],[163.42724609375,58.578955078125],[163.57675781250003,58.640869140625],[163.7265625,58.79853515625],[163.78447265625005,58.929736328125],[163.7666015625,58.97236328125],[163.7609375,59.015039062499994],[164.2021484375,59.09619140625],[164.51738281250005,59.2267578125],[164.57265625000002,59.221142578125],[164.62929687500002,59.112207031249994],[164.66162109375,58.970751953125],[164.61572265625,58.885595703125],[164.27880859375,58.8380859375],[163.96005859375003,58.74375],[163.63515625000002,58.603369140625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[168.0390625,54.564990234374996],[168.08134765625005,54.512744140624996],[167.67734375000003,54.69765625],[167.48808593750005,54.794970703124996],[167.44150390625003,54.855859375],[167.51171875,54.85693359375],[167.59248046875,54.79775390625],[167.71064453125,54.770166015625],[167.88261718750005,54.690478515624996],[168.0390625,54.564990234374996]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[166.65029296875002,54.8390625],[166.64511718750003,54.694091796875],[166.52128906250005,54.767626953124996],[166.46367187500005,54.82685546875],[166.38173828125002,54.8380859375],[166.32480468750003,54.864550781249996],[166.22988281250002,54.9365234375],[166.11972656250003,55.03037109375],[166.08232421875005,55.0765625],[166.06630859375002,55.135693359375],[165.99189453125,55.190478515624996],[165.75107421875003,55.29453125],[165.83046875000002,55.306933593749996],[165.93125,55.35146484375],[166.2119140625,55.323974609375],[166.27578125000002,55.311962890625],[166.22998046875,55.242333984375],[166.248046875,55.1654296875],[166.404296875,55.005615234375],[166.4794921875,54.94990234375],[166.57734375,54.90771484375],[166.65029296875002,54.8390625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[156.40507812500005,50.657617187499994],[156.3654296875,50.6337890625],[156.32578125000003,50.6390625],[156.1962890625,50.7021484375],[156.16796875,50.731884765625],[156.2130859375,50.784716796874996],[156.37646484375,50.862109375],[156.45585937500005,50.8595703125],[156.4875,50.84296875],[156.48310546875,50.751220703125],[156.40507812500005,50.657617187499994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[155.92109375,50.302197265625],[155.79238281250002,50.202050781249994],[155.60751953125003,50.17724609375],[155.51640625000005,50.14560546875],[155.44892578125,50.077783203124994],[155.39716796875,50.041259765625],[155.28867187500003,50.061181640624994],[155.24306640625002,50.094628906249994],[155.24306640625002,50.212792968749994],[155.19511718750005,50.264550781249994],[155.21835937500003,50.2978515625],[155.32675781250003,50.293261718749996],[155.43388671875005,50.368945312499996],[155.68017578125,50.400732421875],[155.77275390625005,50.482421875],[155.884765625,50.684130859374996],[156.00166015625,50.75693359375],[156.096875,50.771875],[156.12285156250005,50.671289062499994],[156.1005859375,50.55927734375],[156.04443359375,50.4517578125],[155.92109375,50.302197265625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[154.08125,48.790283203125],[154.04296875,48.73876953125],[154.00068359375,48.755712890625],[153.99228515625003,48.772509765624996],[154.09169921875002,48.83212890625],[154.12636718750002,48.904443359374994],[154.19902343750005,48.904931640624994],[154.22841796875002,48.89208984375],[154.20468750000003,48.857177734375],[154.08125,48.790283203125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[155.64482421875005,50.821923828124994],[155.55351562500005,50.810595703124996],[155.51279296875003,50.837304687499994],[155.48349609375003,50.86962890625],[155.46738281250003,50.91357421875],[155.5685546875,50.934472656249994],[155.6396484375,50.910498046875],[155.65361328125005,50.845361328124994],[155.64482421875005,50.821923828124994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[153.10107421875,47.762939453125],[153.05380859375003,47.706103515624996],[153.0041015625,47.7134765625],[152.98427734375002,47.727929687499994],[153.04912109375005,47.797021484374994],[153.07919921875003,47.808740234374994],[153.10107421875,47.762939453125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[152.00205078125003,46.89716796875],[151.815625,46.787109375],[151.7541015625,46.788330078125],[151.72343750000005,46.82880859375],[151.71533203125,46.852685546874994],[151.86435546875003,46.868994140625],[152.03984375000005,47.014990234375],[152.16582031250005,47.11044921875],[152.23466796875005,47.143408203125],[152.28886718750005,47.1421875],[152.00205078125003,46.89716796875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[149.6876953125,45.642041015625],[149.53886718750005,45.591357421874996],[149.44707031250005,45.593359375],[149.66591796875002,45.839794921875],[149.79628906250002,45.87607421875],[149.96230468750002,46.021923828125],[150.3087890625,46.200341796874994],[150.3486328125,46.213427734374996],[150.553125,46.208544921874996],[150.2345703125,46.0123046875],[150.19501953125,45.933203125],[150.056640625,45.849365234375],[149.9541015625,45.8224609375],[149.88339843750003,45.783154296875],[149.6876953125,45.642041015625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[148.59951171875002,45.317626953125],[148.41464843750003,45.24716796875],[148.26230468750003,45.216845703124996],[148.00527343750002,45.070166015625],[147.91376953125,44.990380859374994],[147.78408203125002,44.95859375],[147.65781250000003,44.9771484375],[147.621875,44.944726562499994],[147.6095703125,44.886572265625],[147.56308593750003,44.835546875],[147.31015625000003,44.677636718749994],[147.20742187500002,44.553564453125],[147.09843750000005,44.53125],[146.8974609375,44.404296875],[146.93349609375002,44.513085937499994],[146.97421875000003,44.565722656249996],[147.14091796875005,44.663330078125],[147.15478515625,44.7662109375],[147.24658203125,44.8560546875],[147.43046875000005,44.945214843749994],[147.5578125,45.062451171875],[147.65791015625,45.093017578125],[147.76943359375002,45.190722656249996],[147.88554687500005,45.225634765624996],[147.87265625000003,45.30029296875],[147.9240234375,45.38330078125],[147.96455078125,45.377734375],[148.05605468750002,45.262109375],[148.130078125,45.258203125],[148.32421875,45.282421875],[148.6123046875,45.484667968749996],[148.70664062500003,45.520654296874994],[148.77265625,45.52646484375],[148.81220703125,45.510009765625],[148.826171875,45.486083984375],[148.825390625,45.455908203125],[148.80302734375005,45.413525390625],[148.837109375,45.362695312499994],[148.79072265625,45.323974609375],[148.59951171875002,45.317626953125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[150.58994140625003,59.01875],[150.51113281250002,59.007421875],[150.47177734375003,59.034765625],[150.47021484375,59.054052734375],[150.59248046875,59.097216796875],[150.6662109375,59.16015625],[150.71269531250005,59.122460937499994],[150.727734375,59.09521484375],[150.58994140625003,59.01875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[137.94052734375003,55.092626953125],[138.03125,55.0533203125],[138.1720703125,55.06005859375],[138.20615234375003,55.033544921875],[138.09648437500005,54.99091796875],[138.0166015625,54.90087890625],[137.9912109375,54.820703125],[137.95947265625,54.789013671875],[137.8701171875,54.749560546874996],[137.790234375,54.696923828125],[137.72148437500005,54.663232421875],[137.6611328125,54.653271484375],[137.5255859375,54.825830078125],[137.46269531250005,54.873388671875],[137.27607421875,54.7923828125],[137.23291015625,54.790576171874996],[137.27519531250005,54.891015625],[137.384375,55.00068359375],[137.435546875,55.016015625],[137.54365234375,55.1630859375],[137.57734375,55.197021484375],[137.91044921875005,55.11005859375],[137.94052734375003,55.092626953125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[137.17861328125002,55.100439453125],[137.05527343750003,54.9267578125],[136.96943359375,54.923974609375],[136.90273437500002,54.96064453125],[136.76513671875,54.946044921875],[136.71464843750005,54.95615234375],[136.79531250000002,55.009375],[136.99570312500003,55.092724609375],[137.07753906250002,55.091748046875],[137.15605468750005,55.1078125],[137.17861328125002,55.100439453125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[146.71396484375003,43.743798828124994],[146.68300781250002,43.716357421874996],[146.60859375,43.740478515625],[146.6134765625,43.797021484374994],[146.62197265625002,43.81298828125],[146.82460937500002,43.860498046874994],[146.88408203125005,43.829150390624996],[146.89902343750003,43.804150390625],[146.71396484375003,43.743798828124994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[146.20761718750003,44.49765625],[146.35595703125,44.424609375],[146.56777343750002,44.4404296875],[146.51621093750003,44.374658203124994],[146.4365234375,44.37568359375],[146.29619140625005,44.28095703125],[146.17294921875003,44.26865234375],[146.1123046875,44.245947265625],[145.9140625,44.1037109375],[145.88730468750003,44.047753906249994],[145.76699218750002,43.940722656249996],[145.58681640625002,43.845117187499994],[145.555859375,43.664599609374996],[145.43925781250005,43.737060546875],[145.42617187500002,43.810351562499996],[145.46171875000005,43.870898437499996],[145.66630859375005,43.999072265624996],[145.74833984375005,44.071533203125],[145.77333984375002,44.12900390625],[145.85195312500002,44.193017578124994],[145.89023437500003,44.248583984374996],[145.9404296875,44.27265625],[146.11210937500005,44.500146484374994],[146.20761718750003,44.49765625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[124.29316406250001,24.515917968750003],[124.23427734375002,24.358056640624994],[124.18564453125003,24.33505859374999],[124.1357421875,24.347607421874997],[124.08476562499999,24.435839843750003],[124.12041015624999,24.469628906249994],[124.17021484374999,24.451855468749997],[124.21054687500003,24.458642578124994],[124.30195312500001,24.587109375],[124.32402343749999,24.566357421874997],[124.29316406250001,24.515917968750003]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[123.888671875,24.28012695312499],[123.82558593750002,24.266064453124997],[123.74980468749999,24.28330078124999],[123.6806640625,24.288037109374997],[123.67978515625003,24.317773437499994],[123.75234375000002,24.34848632812499],[123.75371093749999,24.391308593749997],[123.771484375,24.414453125],[123.93486328124999,24.362011718749997],[123.928125,24.323632812499994],[123.888671875,24.28012695312499]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[125.44414062499999,24.7431640625],[125.359375,24.717089843750003],[125.26894531250002,24.73251953124999],[125.28359375000002,24.87192382812499],[125.31494140625,24.85239257812499],[125.33457031250003,24.8046875],[125.40185546875,24.77685546875],[125.44414062499999,24.7431640625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[128.2587890625,26.652783203124997],[128.1625,26.60693359375],[128.126953125,26.55224609375],[128.03789062500005,26.53359375],[127.95126953125003,26.456494140624997],[127.86708984375002,26.44248046875],[127.86923828125003,26.380566406249997],[127.90478515625,26.328125],[127.84873046875003,26.3189453125],[127.79013671875003,26.255078125],[127.78554687500002,26.208691406249997],[127.80644531250005,26.171240234375],[127.80361328125002,26.152539062499997],[127.72939453125002,26.09716796875],[127.653125,26.0947265625],[127.64970703125005,26.154492187499997],[127.65488281250003,26.199169921874997],[127.72705078125,26.307910156249996],[127.72890625000002,26.433935546875],[127.7958984375,26.448535156249996],[127.82041015625003,26.466064453125],[127.92597656250001,26.555712890624996],[127.94550781250001,26.593945312499997],[127.89082031250001,26.631054687499997],[127.89482421875005,26.674951171874994],[127.9072265625,26.693603515625],[127.99433593750001,26.679443359375],[128.02968750000002,26.646875],[128.04677734375002,26.643310546875],[128.09765625,26.667773437499996],[128.12158203125,26.71142578125],[128.21650390625,26.796875],[128.2548828125,26.881884765624996],[128.33164062500003,26.812109375],[128.31093750000002,26.720703125],[128.2587890625,26.652783203124997]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[128.99814453125003,27.72080078125],[128.95625,27.702490234375],[128.9,27.727783203125],[128.8828125,27.842431640624994],[128.90761718750002,27.897998046874996],[128.95166015625,27.91025390625],[128.98974609375,27.8111328125],[129.01640625000005,27.770214843749997],[128.99814453125003,27.72080078125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[129.45253906250002,28.208984375],[129.36640625,28.127734375],[129.27490234375,28.200878906249997],[129.16464843750003,28.249755859375],[129.21708984375005,28.262939453125],[129.24785156250005,28.282519531249996],[129.25087890625002,28.31357421875],[129.3224609375,28.359619140625],[129.46455078125,28.395263671875],[129.50966796875002,28.397509765624996],[129.560546875,28.431054687499994],[129.5771484375,28.461279296875],[129.59804687500002,28.475878906249996],[129.68955078125003,28.517480468749994],[129.71464843750005,28.469628906249994],[129.71044921875,28.43212890625],[129.64169921875003,28.411279296874994],[129.57460937500002,28.361181640625],[129.5126953125,28.298730468749994],[129.45673828125,28.272314453125],[129.43906250000003,28.254785156249994],[129.45253906250002,28.208984375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[129.32402343750005,28.104931640624997],[129.33056640625,28.081591796874996],[129.232421875,28.101123046874996],[129.19248046875003,28.19248046875],[129.25742187500003,28.176171875],[129.27734375,28.144726562499997],[129.32402343750005,28.104931640624997]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[130.62275390625,30.262988281249996],[130.50820312500002,30.24140625],[130.44560546875005,30.264697265624996],[130.38808593750002,30.38818359375],[130.49716796875003,30.465527343749997],[130.6435546875,30.388964843749996],[130.67324218750002,30.366894531249997],[130.62275390625,30.262988281249996]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[130.95976562500005,30.396923828124997],[130.87216796875003,30.386328125],[130.8703125,30.444238281249994],[130.93994140625,30.575097656249994],[130.94736328125003,30.671191406249996],[131.01220703125,30.792285156249996],[131.03984375000005,30.818896484374996],[131.06035156250005,30.828466796875],[131.08261718750003,30.790869140625],[131.05742187500005,30.642480468749994],[130.99257812500002,30.529980468749997],[130.95976562500005,30.396923828124997]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[128.66533203125005,32.78388671875],[128.7041015625,32.756884765624996],[128.76103515625005,32.772363281249994],[128.80605468750002,32.7759765625],[128.83857421875,32.762890625],[128.87939453125,32.693310546875],[128.89453125,32.652148437499996],[128.8212890625,32.646337890625],[128.79042968750002,32.63671875],[128.75048828125,32.5861328125],[128.69296875000003,32.604736328125],[128.65732421875003,32.62841796875],[128.64912109375,32.662011718749994],[128.66533203125005,32.78388671875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[130.08251953125,32.2296875],[130.00351562500003,32.193994140624994],[129.993359375,32.228173828124994],[129.96015625,32.24375],[130.01728515625,32.291845703125],[130.01533203125,32.313671875],[129.97929687500005,32.34619140625],[130.02128906250005,32.46884765625],[130.009765625,32.521630859374994],[130.16777343750005,32.5412109375],[130.19667968750002,32.491601562499994],[130.19951171875005,32.340576171875],[130.08251953125,32.2296875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[130.3810546875,32.423730468749994],[130.29257812500003,32.419335937499994],[130.2560546875,32.431005859375],[130.24169921875,32.462792968749994],[130.3654296875,32.527197265625],[130.46142578125,32.51572265625],[130.41855468750003,32.45771484375],[130.3810546875,32.423730468749994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[133.37050781250002,36.203857421875],[133.32470703125,36.16650390625],[133.2392578125,36.178759765624996],[133.18994140625,36.2326171875],[133.20615234375003,36.293408203125],[133.29570312500005,36.340136718749996],[133.38125,36.246386718749996],[133.37050781250002,36.203857421875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[138.34404296875005,37.822119140625],[138.2490234375,37.819580078125],[138.22519531250003,37.829394531249996],[138.28281250000003,37.85419921875],[138.28789062500005,37.895800781249996],[138.322265625,37.96953125],[138.32167968750002,37.9908203125],[138.24619140625003,37.994580078125],[138.25,38.078466796875],[138.30634765625,38.1611328125],[138.46132812500002,38.291455078125],[138.50361328125,38.31591796875],[138.51005859375005,38.258984375],[138.46279296875002,38.124316406249996],[138.45361328125,38.07568359375],[138.5751953125,38.06552734375],[138.49697265625002,37.90390625],[138.34404296875005,37.822119140625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[139.48125,42.081005859375],[139.45839843750002,42.075634765625],[139.4345703125,42.08408203125],[139.41152343750002,42.15966796875],[139.43134765625,42.199560546875],[139.49580078125,42.227441406249994],[139.55839843750005,42.235205078125],[139.505078125,42.09638671875],[139.48125,42.081005859375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[141.07275390625,45.332861328125],[141.03398437500005,45.269335937499996],[140.98212890625,45.36376953125],[140.9716796875,45.465478515624994],[141.00166015625,45.46484375],[141.05673828125003,45.449560546875],[141.06992187500003,45.4],[141.07275390625,45.332861328125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[141.29541015625,45.1193359375],[141.22597656250002,45.112207031249994],[141.14531250000005,45.15390625],[141.13535156250003,45.206201171874994],[141.19375,45.247851562499996],[141.25185546875002,45.232470703124996],[141.31005859375,45.178564453125],[141.32919921875003,45.15048828125],[141.29541015625,45.1193359375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[139.84111328125005,33.056054687499994],[139.82382812500003,33.045458984374996],[139.77568359375005,33.07822265625],[139.76894531250002,33.107177734375],[139.77744140625003,33.125146484374994],[139.80888671875005,33.129248046875],[139.87363281250003,33.093505859375],[139.84111328125005,33.056054687499994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[139.45644531250002,34.726513671875],[139.44570312500002,34.679541015625],[139.39238281250005,34.689892578125],[139.36689453125,34.720507812499996],[139.37001953125002,34.775439453124996],[139.42617187500002,34.77587890625],[139.45644531250002,34.726513671875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[134.9328125,34.288134765624996],[134.8244140625,34.202929687499996],[134.7306640625,34.208886718749994],[134.68349609375002,34.246972656249994],[134.66787109375002,34.294140625],[134.75722656250002,34.3681640625],[134.83427734375005,34.47265625],[134.90410156250005,34.519091796874996],[134.96074218750005,34.544921875],[135.00468750000005,34.54404296875],[134.90546875,34.398291015625],[134.9328125,34.288134765624996]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[129.07695312500005,32.840283203125],[129.051953125,32.829492187499994],[129.01962890625003,32.91962890625],[128.997265625,32.95185546875],[129.03496093750005,32.969091796875],[129.10976562500002,33.132568359375],[129.12363281250003,33.067675781249996],[129.15273437500002,33.003320312499994],[129.18193359375005,32.993115234375],[129.153515625,32.946191406249994],[129.11162109375005,32.928857421874994],[129.07695312500005,32.840283203125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[129.49179687500003,33.223046875],[129.42138671875,33.175830078124996],[129.37041015625005,33.176025390625],[129.4169921875,33.231103515624994],[129.42314453125005,33.257373046874996],[129.4619140625,33.33125],[129.53798828125002,33.357763671875],[129.56992187500003,33.36103515625],[129.50810546875005,33.284326171874994],[129.49179687500003,33.223046875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[129.79570312500005,33.748828125],[129.7265625,33.707324218749996],[129.6748046875,33.739697265625],[129.7,33.82890625],[129.71728515625,33.8583984375],[129.7763671875,33.82919921875],[129.79570312500005,33.748828125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[129.2794921875,34.123388671875],[129.21445312500003,34.0828125],[129.18642578125002,34.14501953125],[129.21484375,34.320654296875],[129.337109375,34.284765625],[129.33505859375003,34.230810546875],[129.2794921875,34.123388671875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[129.38564453125002,34.353662109374994],[129.36533203125003,34.305517578125],[129.29746093750003,34.339599609375],[129.26669921875003,34.370458984375],[129.32939453125005,34.521875],[129.32207031250005,34.579296875],[129.32587890625,34.607275390625],[129.45107421875002,34.686572265624996],[129.47246093750005,34.671337890625],[129.48017578125,34.649462890624996],[129.46914062500002,34.615527343749996],[129.47539062500005,34.540429687499994],[129.38144531250003,34.416455078125],[129.38564453125002,34.353662109374994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[132.57841796875005,34.115185546875],[132.54941406250003,34.075097656249994],[132.4609375,34.087255859375],[132.4962890625,34.121972656249994],[132.52353515625003,34.1640625],[132.54345703125,34.17265625],[132.56015625000003,34.126904296875],[132.57841796875005,34.115185546875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[132.26601562500002,33.945166015625],[132.31455078125003,33.90859375],[132.43046875000005,33.92353515625],[132.44492187500003,33.91318359375],[132.41103515625002,33.879931640624996],[132.35996093750003,33.847021484375],[132.26728515625,33.871484375],[132.20878906250005,33.872851562499996],[132.20058593750002,33.927783203124996],[132.2080078125,33.947802734374996],[132.26601562500002,33.945166015625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[118.40742187500001,24.522119140624994],[118.451171875,24.45556640625],[118.43271484375003,24.414355468750003],[118.29511718750001,24.436328125],[118.28730468750001,24.476611328125003],[118.33935546875,24.469140625],[118.40742187500001,24.522119140624994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[118.18300781250002,24.496289062499997],[118.14951171875003,24.43613281249999],[118.09052734375001,24.44614257812499],[118.08876953125002,24.48886718749999],[118.07675781250003,24.501416015624997],[118.09296875000001,24.541210937499997],[118.10380859374999,24.55234375],[118.17070312499999,24.518505859374997],[118.18300781250002,24.496289062499997]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[128.74101562500005,34.79853515625],[128.6466796875,34.736865234374996],[128.51953125,34.819580078125],[128.4892578125,34.865283203124996],[128.5859375,34.932275390624994],[128.66796875,35.0087890625],[128.721875,35.013574218749994],[128.74101562500005,34.79853515625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[128.06582031250002,34.805859375],[128.0546875,34.708056640624996],[127.98398437500003,34.70322265625],[127.94179687500002,34.766259765624994],[127.896875,34.735498046874994],[127.87343750000002,34.7349609375],[127.83828125000002,34.813330078125],[127.83222656250001,34.87451171875],[127.91542968750002,34.92099609375],[127.965625,34.893017578125],[128.03798828125002,34.87861328125],[128.06582031250002,34.805859375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[127.79902343750001,34.615039062499996],[127.78779296875001,34.58408203125],[127.7373046875,34.630908203124996],[127.787109375,34.68212890625],[127.79902343750001,34.615039062499996]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[126.32695312499999,33.2236328125],[126.28203124999999,33.201513671875],[126.240234375,33.21484375],[126.22900390625,33.225244140624994],[126.1787109375,33.282568359375],[126.165625,33.31201171875],[126.19941406250001,33.368066406249994],[126.33769531249999,33.460400390625],[126.69550781250001,33.54931640625],[126.75986328125003,33.55322265625],[126.90117187499999,33.51513671875],[126.93125,33.44384765625],[126.90537109375003,33.382373046874996],[126.87285156249999,33.341162109375],[126.70917968750001,33.2716796875],[126.58173828125001,33.238330078124996],[126.32695312499999,33.2236328125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[126.23369140624999,34.370507812499994],[126.16972656249999,34.35517578125],[126.1337890625,34.389599609375],[126.10859375000001,34.398730468749996],[126.12285156249999,34.4439453125],[126.22705078125,34.53271484375],[126.24746093750002,34.563330078125],[126.34384765625003,34.544921875],[126.3798828125,34.497949218749994],[126.33544921875,34.426416015624994],[126.23369140624999,34.370507812499994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[126.52070312500001,37.73681640625],[126.51601562500002,37.6046875],[126.46083984375002,37.6103515625],[126.42333984375,37.6236328125],[126.4072265625,37.6494140625],[126.36933593750001,37.772021484374996],[126.41162109375,37.82265625],[126.49355468750002,37.782568359375],[126.52070312500001,37.73681640625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[121.86269531250002,31.49228515625],[121.78046875000001,31.463769531249994],[121.51992187500002,31.549609375],[121.33642578125,31.64375],[121.22685546874999,31.758105468749996],[121.21113281250001,31.805371093749997],[121.33896484375003,31.79736328125],[121.46416015624999,31.7564453125],[121.49179687500003,31.693652343749996],[121.54228515624999,31.67392578125],[121.57656250000002,31.6373046875],[121.80830078125001,31.552148437499994],[121.84365234375002,31.5263671875],[121.86269531250002,31.49228515625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[122.2958984375,29.963427734374996],[122.28154296874999,29.94384765625],[122.15781250000003,30.001269531249996],[122.02402343750003,30.013330078124994],[121.97783203124999,30.063818359375],[121.96943359375001,30.143115234374996],[122.11054687500001,30.13974609375],[122.28447265624999,30.068017578124994],[122.322265625,30.031396484374994],[122.2958984375,29.963427734374996]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[122.17255859375001,29.679003906249996],[122.16904296875003,29.66025390625],[122.08378906249999,29.725341796875],[122.04267578125001,29.7359375],[122.06230468749999,29.772753906249996],[122.11962890625,29.7822265625],[122.1650390625,29.70078125],[122.17255859375001,29.679003906249996]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[122.40390625000003,29.892382812499996],[122.39404296875,29.84609375],[122.36757812500002,29.852685546874994],[122.33183593749999,29.934960937499994],[122.35097656250002,29.955224609374994],[122.40156250000001,29.950244140624996],[122.40390625000003,29.892382812499996]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[119.82089843750003,25.456982421874997],[119.74667968750003,25.410693359375003],[119.70029296875003,25.43271484374999],[119.69941406250001,25.49472656249999],[119.72304687500002,25.550585937500003],[119.69599609375001,25.590869140625003],[119.72255859375002,25.638818359374994],[119.77792968750003,25.65317382812499],[119.79746093750003,25.623242187499997],[119.82871093750003,25.607373046874997],[119.83837890625,25.591064453125],[119.83867187499999,25.55966796874999],[119.80908203125,25.5078125],[119.83242187500002,25.47958984374999],[119.82089843750003,25.456982421874997]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[110.38515625000002,21.093164062499994],[110.42236328125,21.05859375],[110.52158203125003,21.08310546874999],[110.53955078125,21.039013671874997],[110.53886718749999,21.018457031249994],[110.50390625,20.967724609374997],[110.421875,21.006884765625003],[110.33994140625003,20.997753906249997],[110.28095703125001,21.001171875],[110.2646484375,21.025195312500003],[110.30986328124999,21.074755859375003],[110.38515625000002,21.093164062499994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[107.60273437500001,21.216796875],[107.45869140625001,21.09165039062499],[107.40351562500001,21.093652343749994],[107.45253906250002,21.235302734374997],[107.47626953125001,21.268945312499994],[107.56269531250001,21.220410156249997],[107.60273437500001,21.216796875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[107.52128906249999,20.92661132812499],[107.46552734375001,20.900537109374994],[107.39921874999999,20.903466796874994],[107.47861328125003,20.95234375],[107.51894531250002,21.012841796874994],[107.55126953125,21.03403320312499],[107.55107421874999,20.981201171875],[107.52128906249999,20.92661132812499]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[107.03134765625003,20.747021484374997],[106.99003906249999,20.743066406249994],[106.91064453125,20.82421875],[106.95341796874999,20.86704101562499],[107.04375,20.836816406249994],[107.064453125,20.817285156249994],[107.06396484375,20.799755859374997],[107.04228515624999,20.761035156250003],[107.03134765625003,20.747021484374997]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[106.865625,20.815722656250003],[106.85410156250003,20.79638671875],[106.803125,20.84375],[106.76943359375002,20.864208984374997],[106.79531250000002,20.927929687499997],[106.85507812500003,20.85825195312499],[106.865625,20.815722656250003]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[106.61748046874999,8.6828125],[106.58925781250002,8.680517578124991],[106.56796875000003,8.700927734375],[106.65859375000002,8.766357421875],[106.64951171875003,8.722998046874991],[106.65253906250001,8.701123046874997],[106.61748046874999,8.6828125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[104.06396484375,10.390820312499997],[104.0830078125,10.341113281249989],[104.07578125000003,10.224853515625],[104.03681640625001,10.110742187499994],[104.04833984375,10.06103515625],[104.01845703125002,10.029199218749994],[103.9521484375,10.242919921875],[103.86796874999999,10.335400390624997],[103.84951171875002,10.37109375],[103.8984375,10.368505859374991],[103.98583984375,10.426953125],[104.02773437500002,10.428369140624994],[104.06396484375,10.390820312499997]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[103.04511718750001,11.285058593749994],[103.02734375,11.275488281249991],[103.01054687499999,11.27578125],[102.99335937500001,11.290429687499994],[102.99501953125002,11.348095703124997],[103.00751953125001,11.38330078125],[103.03681640625001,11.389941406249989],[103.04511718750001,11.285058593749994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[102.6064453125,11.676513671875],[102.58994140625003,11.572167968749994],[102.53281250000003,11.614941406249997],[102.54648437500003,11.667773437499989],[102.56894531250003,11.691699218749989],[102.6064453125,11.676513671875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[102.4267578125,11.988720703124997],[102.42998046874999,11.964746093749994],[102.378125,11.982958984374989],[102.35996093750003,11.974414062499989],[102.30195312500001,11.980810546874991],[102.27333984375002,12.119335937499997],[102.27744140625003,12.15185546875],[102.31884765625,12.141650390624989],[102.378125,12.072851562499991],[102.40839843750001,12.025097656249997],[102.4267578125,11.988720703124997]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[103.9697265625,1.331445312499994],[103.81992187500003,1.265380859375],[103.65019531249999,1.325537109374991],[103.70527343750001,1.4234375],[103.81796875000003,1.447070312499989],[103.90898437499999,1.415966796874997],[103.96083984375002,1.392236328124994],[103.99638671874999,1.365234375],[103.9697265625,1.331445312499994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[104.22158203125002,2.731738281249989],[104.17333984375,2.721337890624994],[104.146875,2.728222656249997],[104.12910156250001,2.767236328124994],[104.16982421875002,2.856835937499994],[104.18476562500001,2.871728515624994],[104.22324218750003,2.774218749999989],[104.22158203125002,2.731738281249989]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[100.28896484375002,5.294726562499989],[100.26376953125003,5.266992187499994],[100.19101562500003,5.282861328124994],[100.20390624999999,5.446875],[100.24550781250002,5.4677734375],[100.31015625000003,5.437939453124997],[100.3388671875,5.410058593749994],[100.28896484375002,5.294726562499989]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[99.84804687500002,6.465722656249994],[99.91865234375001,6.35859375],[99.88339843750003,6.310839843749989],[99.86582031250003,6.297070312499997],[99.8232421875,6.312744140625],[99.78261718750002,6.271582031249991],[99.74375,6.26328125],[99.70468750000003,6.337548828124994],[99.65664062500002,6.367138671874997],[99.64628906249999,6.418359375],[99.71054687500003,6.42734375],[99.74921875000001,6.409619140624997],[99.82167968750002,6.445019531249997],[99.84804687500002,6.465722656249994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[99.6630859375,6.521923828124997],[99.64404296875,6.51611328125],[99.60664062500001,6.596826171874994],[99.65400390625001,6.714111328125],[99.70136718750001,6.570556640625],[99.6630859375,6.521923828124997]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[100.07412109375002,9.696679687499994],[100.064453125,9.679980468749989],[100.02568359374999,9.711718749999989],[99.998046875,9.747607421874989],[99.9833984375,9.793554687499991],[100.04345703125,9.791650390624994],[100.07304687499999,9.749121093749991],[100.07412109375002,9.696679687499994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[100.07070312500002,9.586035156249991],[100.07529296875003,9.529443359374994],[100.0537109375,9.46142578125],[99.96240234375,9.421630859375],[99.93125,9.47607421875],[99.93955078125003,9.559960937499994],[99.95361328125,9.581005859374997],[100.04296875,9.576855468749997],[100.07070312500002,9.586035156249991]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[98.59199218750001,7.933935546874991],[98.57998046875002,7.917041015624989],[98.52939453125003,8.108544921874994],[98.60429687499999,8.057324218749997],[98.59199218750001,7.933935546874991]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[98.40908203125002,7.902050781249997],[98.3984375,7.828417968749989],[98.357421875,7.829443359374991],[98.315625,7.782324218749991],[98.29628906250002,7.776074218749997],[98.26230468750003,7.926074218749989],[98.30136718750003,8.13623046875],[98.32207031249999,8.166308593749989],[98.35097656250002,8.110644531249989],[98.43496093750002,8.085644531249997],[98.39882812500002,7.964550781249997],[98.40908203125002,7.902050781249997]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[98.30751953125002,9.051464843749997],[98.25078124999999,9.040820312499989],[98.25839843750003,9.095410156249997],[98.27363281250001,9.1298828125],[98.30117187500002,9.139111328124997],[98.3125,9.080371093749989],[98.30751953125002,9.051464843749997]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[93.89003906250002,6.8310546875],[93.82880859375001,6.748681640624994],[93.70927734374999,7.000683593749997],[93.65800781249999,7.016064453124997],[93.65634765625003,7.13623046875],[93.68417968750003,7.18359375],[93.82246093750001,7.236621093749989],[93.85898437500003,7.206835937499989],[93.92958984375002,6.973486328124991],[93.89003906250002,6.8310546875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[93.73359375000001,7.356494140624989],[93.63847656249999,7.261865234374994],[93.59726562500003,7.31875],[93.6142578125,7.358105468749997],[93.65468750000002,7.379931640624989],[93.69248046875003,7.410595703124997],[93.73359375000001,7.356494140624989]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[93.14072265625003,8.24951171875],[93.17060546875001,8.212060546874994],[93.115234375,8.218505859375],[93.06425781249999,8.274951171874989],[93.07753906250002,8.327880859375],[93.09697265624999,8.349365234375],[93.14072265625003,8.24951171875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[93.44257812500001,7.877832031249994],[93.36503906249999,7.8765625],[93.34199218750001,7.919335937499994],[93.30937,7.964013671874994],[93.33447265625,8.006933593749991],[93.37548828125,8.017919921874991],[93.43369140625003,7.948388671874994],[93.44736328125003,7.899121093749997],[93.44257812500001,7.877832031249994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[93.53691406249999,8.056640625],[93.49003906249999,8.019433593749994],[93.47822265625001,8.024462890624989],[93.47177734375003,8.052685546874997],[93.4697265625,8.07265625],[93.46123046874999,8.10859375],[93.45644531250002,8.171875],[93.49404296875002,8.224658203124989],[93.53164062500002,8.213769531249994],[93.51162109375002,8.159765625],[93.53691406249999,8.056640625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[92.7875,9.136669921874997],[92.74355468750002,9.130957031249991],[92.71660156249999,9.165087890624989],[92.71328125000002,9.204882812499989],[92.73857421874999,9.230664062499997],[92.76210937500002,9.243896484375],[92.78574218750003,9.240527343749989],[92.80927734375001,9.173388671874989],[92.7875,9.136669921874997]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[92.50283203125002,10.554882812499997],[92.47265625,10.520751953125],[92.36953125000002,10.547412109374989],[92.37714843750001,10.650585937499997],[92.35283203124999,10.751123046874994],[92.37070312500003,10.793505859374989],[92.44785156250003,10.865527343749989],[92.51035156250003,10.8974609375],[92.55400390624999,10.7998046875],[92.57431640625003,10.704248046874994],[92.50283203125002,10.554882812499997]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[92.69316406249999,11.381152343749989],[92.64453125,11.361328125],[92.595703125,11.386425781249997],[92.63388671875003,11.4267578125],[92.64023437500003,11.509130859374991],[92.69003906250003,11.463427734374989],[92.68720703125001,11.411230468749991],[92.69316406249999,11.381152343749989]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[93.01738281249999,12.036816406249997],[93.06210937500003,11.8994140625],[92.98173828124999,11.95947265625],[92.95537109374999,12.00244140625],[92.99580078125001,12.031787109374989],[93.01738281249999,12.036816406249997]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[92.71757812499999,12.864892578124994],[92.68574218750001,12.799951171874994],[92.6796875,12.939257812499989],[92.69443359375003,12.956787109375],[92.71064453125001,12.961572265624994],[92.73085937500002,12.948535156249989],[92.71757812499999,12.864892578124994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[92.72275390625003,11.536083984374997],[92.70078125000003,11.512548828124991],[92.66835937500002,11.538720703124994],[92.57558593750002,11.718212890624997],[92.55966796875003,11.833447265624997],[92.53388671875001,11.873388671874991],[92.56650390625003,11.930517578124991],[92.60751953125003,11.949511718749989],[92.6318359375,12.013867187499997],[92.640625,12.112207031249994],[92.67646484375001,12.1923828125],[92.69472656250002,12.214697265624991],[92.76923828125001,12.215576171875],[92.78828125000001,12.22578125],[92.77763671874999,12.302539062499989],[92.73408203125001,12.3359375],[92.71894531250001,12.357324218749994],[92.720703125,12.541259765625],[92.73203125000003,12.615625],[92.75917968750002,12.669091796874994],[92.74003906249999,12.779638671874991],[92.753125,12.820898437499991],[92.80703125000002,12.87890625],[92.83085937499999,13.002636718749997],[92.80898437500002,13.039599609374989],[92.86015624999999,13.230566406249991],[92.85732421875002,13.358105468749997],[92.92460937499999,13.48583984375],[93.02939453125003,13.543847656249994],[93.06230468749999,13.545458984375003],[93.06669921874999,13.436474609374997],[93.07666015625,13.400683593750003],[93.01601562500002,13.336181640625],[93.07382812500003,13.252099609374994],[93.06611328125001,13.221582031249994],[93.04296875,13.154882812499991],[93.00468749999999,13.08935546875],[92.95136718750001,13.0625],[92.90996093749999,12.975195312499991],[92.88623046875,12.942285156249994],[92.96503906250001,12.850488281249994],[92.990234375,12.538525390624997],[92.9326171875,12.453076171874997],[92.86367187500002,12.43603515625],[92.87949218750003,12.227929687499994],[92.8671875,12.181445312499989],[92.798828125,12.079248046874994],[92.78623046875003,12.03466796875],[92.74765625000003,11.992773437499991],[92.76396484374999,11.9404296875],[92.79677734375002,11.917529296874989],[92.79755859375001,11.874658203124994],[92.76699218750002,11.7646484375],[92.7646484375,11.63916015625],[92.72275390625003,11.536083984374997]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[98.54169921875001,10.961523437499991],[98.51894531250002,10.959375],[98.498046875,10.964257812499994],[98.47744140625002,10.979736328125],[98.52656250000001,11.086962890624989],[98.54169921875001,10.961523437499991]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[98.20976562499999,10.952734375],[98.29345703125,10.7796875],[98.284375,10.753125],[98.271484375,10.739892578124994],[98.25175781249999,10.744433593749989],[98.21816406250002,10.837744140624991],[98.15537109375003,10.89794921875],[98.08046875000002,10.886621093749994],[98.142578125,10.963134765625],[98.16728515624999,10.980322265624991],[98.20976562499999,10.952734375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[98.1826171875,9.933447265624991],[98.134375,9.875390625],[98.11806640625002,9.877880859374997],[98.14023437500003,9.974658203124989],[98.220703125,10.045214843749989],[98.29169921875001,10.051318359374989],[98.28339843750001,10.007617187499989],[98.23125,9.953955078124991],[98.1826171875,9.933447265624991]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[98.2216796875,11.478222656249997],[98.21621093750002,11.455761718749997],[98.209375,11.45654296875],[98.18730468749999,11.472412109375],[98.20107421875002,11.567187499999989],[98.23906249999999,11.644726562499997],[98.27812,11.758398437499991],[98.29960937499999,11.783007812499989],[98.30751953125002,11.722900390625],[98.28378906250003,11.594091796874991],[98.26328125000003,11.523632812499997],[98.2216796875,11.478222656249997]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[98.51601562500002,11.905029296875],[98.47431640625001,11.8994140625],[98.45449218750002,12.061279296875],[98.46621093750002,12.084277343749989],[98.52529296875002,12.005175781249989],[98.60957031250001,11.956640625],[98.57646484374999,11.925097656249989],[98.51601562500002,11.905029296875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[98.07548828124999,11.6923828125],[98.08359375000003,11.636816406249991],[98.02109375000003,11.695898437499991],[98.01035156250003,11.860253906249994],[98.0595703125,11.756689453124991],[98.08076171875001,11.733203124999989],[98.07548828124999,11.6923828125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[98.55380859375003,11.744873046875],[98.52841796875003,11.538671875],[98.46484375,11.567187499999989],[98.43476562500001,11.567089843749997],[98.396875,11.683544921874997],[98.39951171875003,11.71484375],[98.37646484375,11.79150390625],[98.52353515625003,11.804931640625],[98.55380859375003,11.744873046875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[98.13671875,12.150439453124989],[98.12509765625003,12.144873046874991],[98.10849609375003,12.148095703124994],[98.07539062500001,12.164453125],[98.03730468750001,12.232470703124989],[98.05732421875001,12.280078124999989],[98.07138671875003,12.291796874999989],[98.10488281250002,12.287792968749997],[98.12246093750002,12.278710937499994],[98.12841796875,12.26123046875],[98.11845703124999,12.223388671875],[98.1201171875,12.191308593749994],[98.13671875,12.150439453124989]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[98.06611328125001,12.389794921874994],[98.06035156249999,12.353515625],[98.00234375000002,12.279003906249997],[97.95175781250003,12.322314453124989],[97.93867187500001,12.34609375],[97.990234375,12.393798828125],[98.04511718750001,12.387011718749989],[98.05986328124999,12.397851562499994],[98.06611328125001,12.389794921874994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[98.41396484375002,12.597949218749989],[98.43642578125002,12.570507812499997],[98.46826171875,12.571337890624989],[98.45947265625,12.473730468749991],[98.380859375,12.353662109374994],[98.33447265625,12.336181640625],[98.31386718750002,12.335986328124989],[98.33144531250002,12.511425781249997],[98.30253906249999,12.611572265625],[98.31210937500003,12.678173828124997],[98.396484375,12.647119140624994],[98.41396484375002,12.597949218749989]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[98.3154296875,13.099072265624997],[98.30917968750003,12.934716796874994],[98.25927734375,13.014013671874991],[98.25078124999999,13.104394531249994],[98.25458984375001,13.188574218749991],[98.26533203125001,13.202246093749991],[98.2685546875,13.189355468749994],[98.29863281249999,13.151660156249989],[98.3154296875,13.099072265624997]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[97.575,16.253222656250003],[97.53720703125003,16.240136718749994],[97.48037109375002,16.305712890625003],[97.46914062500002,16.46103515624999],[97.51640624999999,16.496875],[97.5419921875,16.505078125],[97.57900390625002,16.486035156249997],[97.59326171875,16.46079101562499],[97.599609375,16.42954101562499],[97.58935546875,16.397363281249994],[97.575,16.253222656250003]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[99.07841796874999,7.591845703124989],[99.10439453125002,7.471289062499991],[99.06787109375,7.495898437499989],[99.03769531250003,7.548486328124994],[99.0380859375,7.625732421875],[99.04511718750001,7.636523437499989],[99.07841796874999,7.591845703124989]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[94.80488281250001,15.8193359375],[94.784375,15.793847656249994],[94.74335937500001,15.812109375],[94.73349609375003,15.823046875],[94.82802734375002,15.933007812499994],[94.83818359374999,15.89208984375],[94.80488281250001,15.8193359375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[94.47675781250001,15.945947265624994],[94.41191406249999,15.848388671875],[94.38789062500001,15.994140625],[94.49375,16.075341796874994],[94.54599609375003,16.15283203125],[94.60126953125001,16.205517578124997],[94.61865234375,16.141308593749997],[94.56611328125001,16.019287109375],[94.47675781250001,15.945947265624994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[93.69082031250002,18.684277343749997],[93.67402343750001,18.675683593749994],[93.56992187500003,18.759570312500003],[93.4875,18.86752929687499],[93.61826171875003,18.888818359374994],[93.74472656250003,18.865527343750003],[93.74550781250002,18.808056640624997],[93.71835937500003,18.715722656249994],[93.69082031250002,18.684277343749997]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[93.49179687500003,19.892578125],[93.51328125000003,19.754785156249994],[93.44462890624999,19.806445312500003],[93.41953125000003,19.877587890624994],[93.41289062499999,19.950341796874994],[93.49179687500003,19.892578125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[93.01015625000002,19.92392578124999],[93.02324218749999,19.828857421875],[92.97519531250003,19.86801757812499],[92.91269531250003,19.999804687500003],[92.91464843750003,20.086474609375003],[92.95957031250003,20.046191406250003],[93.01015625000002,19.92392578124999]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[93.71484375,19.558251953124994],[93.82949218750002,19.475292968749997],[93.87470703125001,19.48105468749999],[93.94570312500002,19.428613281249994],[93.94746093750001,19.408154296874997],[93.93398437500002,19.365429687499997],[93.90195312500003,19.33203125],[93.81523437499999,19.29868164062499],[93.755859375,19.32568359375],[93.73232421875002,19.416308593750003],[93.66220703125003,19.458935546874997],[93.64404296875,19.495068359374997],[93.68837890625002,19.54443359375],[93.71484375,19.558251953124994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[91.87382812499999,21.83212890624999],[91.83759765625001,21.750244140625],[91.81972656250002,21.809814453125],[91.83515625000001,21.88535156249999],[91.85068359375003,21.927050781250003],[91.861328125,21.926660156249994],[91.88251953125001,21.88364257812499],[91.87382812499999,21.83212890624999]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[91.94921875,21.508056640625],[91.88886718750001,21.503320312499994],[91.85947265625003,21.532958984375],[91.87324218750001,21.574414062499997],[91.85703125000003,21.708789062500003],[91.90771484375,21.722949218750003],[91.93398437500002,21.72216796875],[91.94863281250002,21.682568359374997],[91.9619140625,21.609765625],[91.94921875,21.508056640625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[91.15078125000002,22.175195312499994],[91.04472656249999,22.105175781249997],[91.07949218750002,22.519726562499997],[91.15830078125003,22.365429687499997],[91.17822265625,22.283007812500003],[91.15078125000002,22.175195312499994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[91.55673828125003,22.382226562499994],[91.51044921875001,22.352783203125],[91.46689453125003,22.37841796875],[91.41132812500001,22.47568359374999],[91.43886718750002,22.598828125],[91.4560546875,22.616503906250003],[91.48398437500003,22.5765625],[91.52304687500003,22.49072265625],[91.54833984375,22.425390625],[91.55673828125003,22.382226562499994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[90.64179687500001,22.96298828124999],[90.65957031250002,22.92001953124999],[90.60390625000002,22.945556640625],[90.56230468749999,22.97543945312499],[90.53632812500001,23.014892578125],[90.57988281249999,23.035449218750003],[90.64179687500001,22.96298828124999]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[90.77763671874999,22.089306640624997],[90.60361328125003,22.05419921875],[90.51503906250002,22.065136718749997],[90.68046874999999,22.32749023437499],[90.67490234375003,22.444970703124994],[90.64921874999999,22.540673828124994],[90.56494140625,22.617626953124997],[90.56035156249999,22.672558593749997],[90.52255859375003,22.747509765624997],[90.5029296875,22.835351562499994],[90.59648437499999,22.863525390625],[90.67226562500002,22.813183593749997],[90.68300781250002,22.785302734374994],[90.69921875,22.713525390624994],[90.73691406250003,22.638720703125003],[90.8681640625,22.48486328125],[90.86582031250003,22.390576171874997],[90.82988281249999,22.159960937500003],[90.77763671874999,22.089306640624997]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[79.96953124999999,9.630664062499989],[79.90683593750003,9.619824218749997],[79.857421875,9.686376953124991],[79.845703125,9.714648437499989],[79.85859375000001,9.734375],[79.87226562500001,9.744335937499997],[79.88847656249999,9.741162109374997],[79.91191406249999,9.679150390624997],[79.96953124999999,9.630664062499989]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[79.87480468749999,9.050732421874997],[79.90371093750002,8.975],[79.82109374999999,9.02685546875],[79.76679687500001,9.069775390624997],[79.74765625000003,9.104589843749991],[79.85996093750003,9.065722656249989],[79.87480468749999,9.050732421874997]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-8.953564453124983,70.83916015625],[-9.045800781249994,70.832666015625],[-9.098876953125,70.8548828125],[-8.964648437499989,70.91591796875],[-8.520800781249989,71.0306640625],[-8.343701171874983,71.14013671875],[-8.001367187499994,71.177685546875],[-7.978808593749989,71.11689453125],[-8.002099609374994,71.041259765625],[-8.302343749999977,70.98115234375],[-8.635351562499977,70.9404296875],[-8.953564453124983,70.83916015625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-155.58134765625,19.012011718750003],[-155.625634765625,18.963916015625003],[-155.68076171875,18.967675781249994],[-155.881298828125,19.070507812499997],[-155.905615234375,19.12583007812499],[-155.89072265625,19.382519531249997],[-155.9658203125,19.5908203125],[-156.048681640625,19.749951171874997],[-155.988427734375,19.831591796875003],[-155.90888671875,19.894726562499997],[-155.8203125,20.01416015625],[-155.8927734375,20.167382812499994],[-155.874267578125,20.259814453125003],[-155.831640625,20.275830078124997],[-155.6220703125,20.16342773437499],[-155.198779296875,19.994384765625],[-155.086083984375,19.875634765624994],[-155.06591796875,19.748193359374994],[-154.989013671875,19.731982421875003],[-154.952587890625,19.64462890624999],[-154.841357421875,19.568164062500003],[-154.80419921875,19.524462890625003],[-154.85029296875,19.4541015625],[-155.053466796875,19.31918945312499],[-155.309619140625,19.26015625],[-155.53525390625,19.109082031249997],[-155.58134765625,19.012011718750003]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-157.213623046875,21.215380859375003],[-157.002294921875,21.187939453124997],[-156.95234375,21.19970703125],[-156.9171875,21.177294921875003],[-156.7421875,21.163525390624997],[-156.712158203125,21.155078125],[-156.747900390625,21.103564453125003],[-156.85986328125,21.056347656249997],[-157.0208984375,21.097802734374994],[-157.29033203125,21.112597656250003],[-157.2794921875,21.15234375],[-157.25380859375,21.180566406249994],[-157.249951171875,21.229785156250003],[-157.213623046875,21.215380859375003]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-156.48681640625,20.932568359374997],[-156.46083984375,20.914746093749997],[-156.35439453125,20.941455078125003],[-156.2775390625,20.95126953124999],[-156.14833984375,20.885498046875],[-156.103515625,20.84033203125],[-156.01865234375,20.79208984374999],[-155.98984375,20.757128906250003],[-156.01357421875,20.714794921874997],[-156.10712890625,20.644775390625],[-156.234765625,20.628613281249997],[-156.3099609375,20.598779296874994],[-156.4087890625,20.605175781249997],[-156.438232421875,20.617871093749997],[-156.448876953125,20.70625],[-156.480078125,20.801220703124997],[-156.54384765625,20.789990234374997],[-156.6154296875,20.821826171875003],[-156.689697265625,20.901416015625003],[-156.69775390625,20.94907226562499],[-156.656884765625,21.02451171874999],[-156.585400390625,21.034326171874994],[-156.53232421875,20.99267578125],[-156.48681640625,20.932568359374997]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-160.180029296875,21.841064453125],[-160.200244140625,21.796875],[-160.234716796875,21.803662109374997],[-160.24345703125,21.843066406250003],[-160.2208984375,21.897265625],[-160.1638671875,21.944042968749997],[-160.100634765625,22.015234375],[-160.04873046875,22.004638671875],[-160.076708984375,21.95810546874999],[-160.080029296875,21.907421875],[-160.15341796875,21.87875976562499],[-160.180029296875,21.841064453125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-157.799365234375,21.456640625],[-157.764990234375,21.450927734375],[-157.7208984375,21.457714843749997],[-157.705517578125,21.378076171874994],[-157.654150390625,21.333935546874997],[-157.635400390625,21.3076171875],[-157.690869140625,21.279736328124997],[-157.798779296875,21.268603515625003],[-157.84931640625,21.290820312500003],[-157.9017578125,21.340576171875],[-157.958447265625,21.326904296875],[-157.968310546875,21.366894531249997],[-157.97841796875,21.378515625],[-158.01728515625,21.367724609375003],[-157.98095703125,21.316113281249997],[-158.079150390625,21.312255859375],[-158.1103515625,21.318603515625],[-158.137841796875,21.377148437499997],[-158.239111328125,21.48935546874999],[-158.238671875,21.53305664062499],[-158.27314453125,21.585253906250003],[-158.123095703125,21.600244140624994],[-158.020361328125,21.691796875],[-157.9625,21.701367187499997],[-157.851513671875,21.553369140624994],[-157.854345703125,21.511914062499997],[-157.82958984375,21.471435546875],[-157.799365234375,21.456640625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-159.37275390625,21.932373046875],[-159.460693359375,21.876123046874994],[-159.511865234375,21.900390625],[-159.608837890625,21.90952148437499],[-159.64638671875,21.95175781249999],[-159.747998046875,21.98984375],[-159.78916015625,22.041796875],[-159.726611328125,22.140185546875003],[-159.57919921875,22.22314453125],[-159.35205078125,22.21958007812499],[-159.30478515625,22.154052734375],[-159.30068359375,22.105273437500003],[-159.33017578125,22.050683593749994],[-159.34375,21.9736328125],[-159.37275390625,21.932373046875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-156.849609375,20.77265625],[-156.90888671875,20.74448242187499],[-156.973388671875,20.757519531249997],[-156.988427734375,20.82568359375],[-157.0505859375,20.91245117187499],[-156.941796875,20.93002929687499],[-156.88056640625,20.904833984375003],[-156.848291015625,20.87778320312499],[-156.80937,20.83115234374999],[-156.849609375,20.77265625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[179.45156250000002,51.372607421874996],[179.278125,51.372216796874994],[178.92587890625003,51.535058593749994],[178.7470703125,51.58671875],[178.64794921875,51.643896484375],[178.69218750000005,51.65595703125],[178.90800781250005,51.615576171875],[179.08427734375005,51.527685546875],[179.18173828125003,51.469921875],[179.29433593750002,51.420849609375],[179.41552734375,51.40087890625],[179.45156250000002,51.372607421874996]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[179.727734375,51.905419921875],[179.64521484375,51.880224609375],[179.54960937500005,51.89404296875],[179.49765625000003,51.9328125],[179.50390625,51.97958984375],[179.6271484375,52.030419921875],[179.77998046875,51.966845703124996],[179.727734375,51.905419921875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[177.41542968750002,51.8828125],[177.32851562500002,51.841064453125],[177.26064453125002,51.88369140625],[177.25029296875005,51.9029296875],[177.38066406250005,51.97578125],[177.47841796875002,51.9916015625],[177.5205078125,52.018212890625],[177.56376953125005,52.110498046875],[177.63652343750005,52.113818359374996],[177.66962890625,52.10302734375],[177.65302734375,52.059765625],[177.59599609375005,51.99384765625],[177.59414062500002,51.947558593749996],[177.41542968750002,51.8828125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[173.72275390625003,52.3595703125],[173.65781250000003,52.356640625],[173.6162109375,52.391259765625],[173.40234375,52.40478515625],[173.42451171875,52.437646484375],[173.51650390625002,52.451416015625],[173.65761718750002,52.5041015625],[173.77607421875,52.4951171875],[173.74472656250003,52.446630859375],[173.72275390625003,52.3595703125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[172.81181640625005,53.012988281249996],[172.98398437500003,52.980273437499996],[173.10214843750003,52.99560546875],[173.25166015625,52.942675781249996],[173.43603515625,52.85205078125],[173.3947265625,52.834765625],[173.34824218750003,52.824853515625],[173.30253906250005,52.825927734375],[173.15869140625,52.810791015625],[173.0802734375,52.814453125],[172.93515625000003,52.752099609375],[172.7755859375,52.796923828124996],[172.72177734375003,52.885546875],[172.59511718750002,52.907421875],[172.49482421875,52.937890625],[172.6779296875,53.007568359375],[172.81181640625005,53.012988281249996]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-172.742236328125,60.457373046875],[-172.52607421875,60.391748046874994],[-172.3875,60.398486328125],[-172.2775390625,60.343652343749994],[-172.232080078125,60.29912109375],[-172.39716796875,60.331103515625],[-172.6357421875,60.328857421875],[-172.9583984375,60.462792968749994],[-173.0740234375,60.493212890625],[-173.04765625,60.568310546875],[-172.923876953125,60.606835937499994],[-172.860205078125,60.5056640625],[-172.742236328125,60.457373046875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-170.160546875,57.183935546875],[-170.264013671875,57.136767578124996],[-170.3580078125,57.15419921875],[-170.385888671875,57.18857421875],[-170.38662109375,57.20302734375],[-170.116162109375,57.241796875],[-170.160546875,57.183935546875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-160.329296875,55.337695312499996],[-160.343310546875,55.2587890625],[-160.48076171875,55.308984375],[-160.51748046875,55.333837890625],[-160.492919921875,55.35234375],[-160.3623046875,55.356982421874996],[-160.329296875,55.337695312499996]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-160.684912109375,55.314794921875],[-160.6697265625,55.314257812499996],[-160.638818359375,55.321923828125],[-160.573974609375,55.378271484375],[-160.552783203125,55.38076171875],[-160.552490234375,55.36337890625],[-160.583154296875,55.3076171875],[-160.531201171875,55.233203125],[-160.482666015625,55.197412109375],[-160.487548828125,55.184863281249996],[-160.60908203125,55.159033203125],[-160.701806640625,55.17763671875],[-160.750634765625,55.171191406249996],[-160.795068359375,55.14521484375],[-160.82548828125,55.173974609375],[-160.846533203125,55.311328125],[-160.8396484375,55.335400390625],[-160.789208984375,55.383105468749996],[-160.72392578125,55.404638671875],[-160.695654296875,55.39833984375],[-160.67216796875,55.37939453125],[-160.666357421875,55.359423828124996],[-160.684912109375,55.314794921875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-162.29814453125,54.847021484375],[-162.321923828125,54.8423828125],[-162.390771484375,54.872998046875],[-162.415771484375,54.8958984375],[-162.43388671875,54.93154296875],[-162.29365234375,54.982861328125],[-162.264599609375,54.98349609375],[-162.23837890625,54.954736328125],[-162.233740234375,54.93203125],[-162.27255859375,54.8671875],[-162.29814453125,54.847021484375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-162.55439453125,54.4013671875],[-162.64111328125,54.379541015625],[-162.73310546875,54.402294921875],[-162.81171875,54.444384765624996],[-162.820556640625,54.49453125],[-162.64541015625,54.462060546875],[-162.607958984375,54.446630859375],[-162.55439453125,54.4013671875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-159.36201171875,54.972412109375],[-159.394482421875,54.967333984374996],[-159.421337890625,54.978125],[-159.45849609375,55.034960937499996],[-159.4619140625,55.0587890625],[-159.3904296875,55.040869140625],[-159.36318359375,54.99951171875],[-159.36201171875,54.972412109375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-159.872998046875,55.128759765625],[-159.933935546875,55.1068359375],[-159.953076171875,55.078955078125],[-159.9994140625,55.0671875],[-160.038427734375,55.044482421874996],[-160.169580078125,54.941699218749996],[-160.22705078125,54.922705078125],[-160.16357421875,55.01044921875],[-160.15361328125,55.038330078125],[-160.152392578125,55.056884765625],[-160.1720703125,55.123046875],[-160.133740234375,55.120166015624996],[-160.102197265625,55.13388671875],[-160.03876953125,55.192529296875],[-159.981640625,55.19775390625],[-159.920458984375,55.267529296875],[-159.887353515625,55.272998046874996],[-159.871044921875,55.26357421875],[-159.8982421875,55.2212890625],[-159.839404296875,55.182373046875],[-159.8541015625,55.144677734375],[-159.872998046875,55.128759765625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-159.51513671875,55.15185546875],[-159.52041015625,55.07216796875],[-159.5349609375,55.059619140624996],[-159.561474609375,55.080908203125],[-159.617724609375,55.05732421875],[-159.648486328125,55.074560546875],[-159.635400390625,55.10234375],[-159.6396484375,55.123974609375],[-159.59794921875,55.12568359375],[-159.588037109375,55.165332031249996],[-159.595263671875,55.18203125],[-159.574755859375,55.217724609375],[-159.545068359375,55.2259765625],[-159.51513671875,55.15185546875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-169.691943359375,52.84736328125],[-169.70810546875,52.80712890625],[-169.72275390625,52.792333984375],[-169.87734375,52.813769531249996],[-169.98056640625,52.806005859375],[-169.991845703125,52.829833984375],[-169.982568359375,52.851025390625],[-169.820654296875,52.8833984375],[-169.7548828125,52.883642578125],[-169.710986328125,52.866748046874996],[-169.691943359375,52.84736328125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-170.7333984375,52.581494140625],[-170.79736328125,52.549755859375],[-170.816064453125,52.5615234375],[-170.82705078125,52.600732421875],[-170.791162109375,52.63125],[-170.682080078125,52.697558593749996],[-170.608056640625,52.68505859375],[-170.584619140625,52.667578125],[-170.58662109375,52.642431640625],[-170.614013671875,52.609619140625],[-170.649267578125,52.593115234375],[-170.69228515625,52.59296875],[-170.7333984375,52.581494140625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-165.841552734375,54.070654296875],[-165.87939453125,54.053027343749996],[-165.90986328125,54.049169921875],[-165.93291015625,54.0591796875],[-166.03642578125,54.047167968749996],[-166.056640625,54.054345703125],[-166.10283203125,54.11396484375],[-166.105810546875,54.144824218749996],[-166.087744140625,54.169140625],[-166.041259765625,54.191259765625],[-165.96640625,54.21103515625],[-165.89287109375,54.206982421875],[-165.764453125,54.152099609375],[-165.704248046875,54.119921875],[-165.69287109375,54.099902343749996],[-165.737890625,54.081103515624996],[-165.841552734375,54.070654296875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-165.5611328125,54.13671875],[-165.604833984375,54.129150390625],[-165.615380859375,54.13955078125],[-165.6205078125,54.183544921875],[-165.654150390625,54.2533203125],[-165.59033203125,54.278662109375],[-165.550634765625,54.284521484375],[-165.5337890625,54.273876953125],[-165.4876953125,54.221875],[-165.441748046875,54.2080078125],[-165.407861328125,54.196826171874996],[-165.467578125,54.180908203125],[-165.5611328125,54.13671875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-167.96435546875,53.3451171875],[-168.270703125,53.238037109375],[-168.3701171875,53.159765625],[-168.44599609375,53.084423828125],[-168.505615234375,53.0431640625],[-168.5490234375,53.036083984375],[-168.597412109375,53.01611328125],[-168.69853515625,52.963427734374996],[-168.741015625,52.956884765625],[-169.06591796875,52.833935546875],[-169.088916015625,52.83203125],[-169.073095703125,52.86416015625],[-168.973876953125,52.90966796875],[-168.9091796875,52.951171875],[-168.836083984375,53.0197265625],[-168.795849609375,53.044921875],[-168.7830078125,53.079345703125],[-168.777783203125,53.148779296875],[-168.759619140625,53.175048828125],[-168.68984375,53.22724609375],[-168.639013671875,53.25576171875],[-168.57216796875,53.265625],[-168.43662109375,53.256884765624996],[-168.380419921875,53.283447265625],[-168.36298828125,53.303564453125],[-168.397265625,53.321923828125],[-168.405322265625,53.353808593749996],[-168.396435546875,53.4087890625],[-168.3572265625,53.457568359374996],[-168.2876953125,53.500146484375],[-168.19306640625,53.53330078125],[-168.073291015625,53.556982421875],[-167.985693359375,53.558203125],[-167.828076171875,53.507958984375],[-167.8046875,53.4849609375],[-167.843115234375,53.4345703125],[-167.86513671875,53.3873046875],[-167.96435546875,53.3451171875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-166.61533203125,53.900927734374996],[-166.57216796875,53.853466796875],[-166.4974609375,53.883544921875],[-166.4427734375,53.9248046875],[-166.400048828125,53.978125],[-166.372314453125,53.998974609375],[-166.33564453125,53.9708984375],[-166.230859375,53.9326171875],[-166.318994140625,53.873779296875],[-166.48876953125,53.785498046875],[-166.54560546875,53.72646484375],[-166.54921875,53.700976562499996],[-166.384716796875,53.720507812499996],[-166.33876953125,53.71767578125],[-166.30947265625,53.697509765625],[-166.354541015625,53.67353515625],[-166.444189453125,53.651806640625],[-166.522021484375,53.609667968749996],[-166.702197265625,53.536669921874996],[-166.77041015625,53.476025390625],[-166.8509765625,53.452880859375],[-166.9607421875,53.44736328125],[-167.153662109375,53.407861328125],[-167.27080078125,53.37060546875],[-167.300439453125,53.35048828125],[-167.337255859375,53.340966796875],[-167.381298828125,53.3419921875],[-167.42880859375,53.32568359375],[-167.479833984375,53.2919921875],[-167.5224609375,53.276220703125],[-167.5921875,53.272705078125],[-167.62861328125,53.259423828125],[-167.66943359375,53.2599609375],[-167.780859375,53.300244140625],[-167.8087890625,53.323779296874996],[-167.710107421875,53.370898437499996],[-167.638720703125,53.386572265625],[-167.53017578125,53.393701171875],[-167.42353515625,53.437255859375],[-167.2041015625,53.494970703125],[-167.136083984375,53.52646484375],[-167.092333984375,53.6359375],[-167.042431640625,53.654589843749996],[-167.01572265625,53.698388671875],[-166.894140625,53.697119140625],[-166.838330078125,53.648046875],[-166.81875,53.641357421875],[-166.808984375,53.646142578125],[-166.803662109375,53.685400390625],[-166.741259765625,53.712939453124996],[-166.77724609375,53.733154296875],[-166.889599609375,53.75859375],[-166.97294921875,53.770556640624996],[-167.02724609375,53.769140625],[-167.071484375,53.7833984375],[-167.105615234375,53.81337890625],[-167.121142578125,53.843115234375],[-167.1181640625,53.872607421874996],[-167.090478515625,53.9056640625],[-167.0380859375,53.9421875],[-166.978076171875,53.962939453124996],[-166.848681640625,53.977880859375],[-166.734033203125,54.002197265625],[-166.673291015625,54.00595703125],[-166.627392578125,53.995654296874996],[-166.61533203125,53.900927734374996]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-166.209765625,53.723291015625],[-166.223828125,53.72041015625],[-166.2494140625,53.745166015624996],[-166.250732421875,53.7677734375],[-166.234375,53.7841796875],[-166.187744140625,53.8224609375],[-166.154541015625,53.8361328125],[-166.113720703125,53.843066406249996],[-166.102685546875,53.8328125],[-166.138623046875,53.787402343749996],[-166.183740234375,53.756884765624996],[-166.209765625,53.723291015625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-172.464794921875,52.272265625],[-172.539111328125,52.257470703125],[-172.61982421875,52.2728515625],[-172.582177734375,52.325634765625],[-172.54365234375,52.353808593749996],[-172.47041015625,52.388037109375],[-172.38310546875,52.37294921875],[-172.313623046875,52.32958984375],[-172.464794921875,52.272265625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-173.5533203125,52.136279296874996],[-173.3572265625,52.095654296875],[-173.11328125,52.100390625],[-173.02431640625,52.09052734375],[-173.022900390625,52.079150390624996],[-173.178857421875,52.0625],[-173.2322265625,52.06796875],[-173.368408203125,52.04560546875],[-173.460986328125,52.041552734374996],[-173.67255859375,52.062646484375],[-173.835791015625,52.048193359375],[-173.878955078125,52.053662109375],[-173.930224609375,52.07216796875],[-173.989599609375,52.10361328125],[-173.99248046875,52.123339843749996],[-173.938916015625,52.131298828125],[-173.794091796875,52.104296875],[-173.77900390625,52.118359375],[-173.6568359375,52.14375],[-173.5533203125,52.136279296874996]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-174.677392578125,52.035009765625],[-175.2138671875,51.993896484375],[-175.295556640625,52.02216796875],[-175.21416015625,52.038232421875],[-175.11767578125,52.047119140625],[-174.91591796875,52.094189453125],[-174.6677734375,52.1349609375],[-174.474267578125,52.184033203125],[-174.30615234375,52.216162109375],[-174.258837890625,52.26904296875],[-174.406494140625,52.29599609375],[-174.435546875,52.317236328125],[-174.3654296875,52.341943359375],[-174.306884765625,52.3779296875],[-174.168896484375,52.420166015625],[-174.04560546875,52.367236328124996],[-174.018359375,52.331787109375],[-174.030078125,52.289794921875],[-174.0548828125,52.24599609375],[-174.163232421875,52.223388671875],[-174.17939453125,52.200341796875],[-174.120654296875,52.135205078125],[-174.3435546875,52.077783203125],[-174.677392578125,52.035009765625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-176.008984375,51.812353515625],[-176.093359375,51.790478515625],[-176.204443359375,51.834814453125],[-176.19365234375,51.886279296874996],[-176.071630859375,51.843310546874996],[-176.008984375,51.812353515625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-176.28671875,51.7919921875],[-176.349658203125,51.73330078125],[-176.39609375,51.75986328125],[-176.413720703125,51.840576171875],[-176.378564453125,51.861132812499996],[-176.280224609375,51.80283203125],[-176.28671875,51.7919921875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-176.593310546875,51.86669921875],[-176.587939453125,51.833203125],[-176.473388671875,51.83740234375],[-176.437451171875,51.820117187499996],[-176.437353515625,51.754296875],[-176.45234375,51.735693359375],[-176.469775390625,51.73115234375],[-176.510986328125,51.74560546875],[-176.55751953125,51.712060546875],[-176.770947265625,51.629931640624996],[-176.837109375,51.67587890625],[-176.96162109375,51.603662109375],[-176.8744140625,51.790478515625],[-176.7736328125,51.81875],[-176.73642578125,51.83994140625],[-176.7451171875,51.894677734375],[-176.69833984375,51.98603515625],[-176.596826171875,51.981787109375],[-176.54990234375,51.94404296875],[-176.551611328125,51.919580078125],[-176.593310546875,51.86669921875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-176.021533203125,52.00244140625],[-176.045068359375,51.972998046875],[-176.14287109375,52.004296875],[-176.1775390625,52.029833984374996],[-176.184521484375,52.0560546875],[-176.1556640625,52.099414062499996],[-176.077392578125,52.099951171875],[-176.031201171875,52.082324218749996],[-175.9880859375,52.049462890625],[-175.97529296875,52.028955078125],[-176.021533203125,52.00244140625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-177.148193359375,51.716748046875],[-177.177001953125,51.7037109375],[-177.2298828125,51.6935546875],[-177.382373046875,51.704833984375],[-177.474658203125,51.70126953125],[-177.577587890625,51.694189453125],[-177.6548828125,51.6765625],[-177.67021484375,51.70107421875],[-177.667626953125,51.72119140625],[-177.334716796875,51.776220703125],[-177.257275390625,51.804931640625],[-177.209765625,51.841259765625],[-177.16640625,51.909423828125],[-177.131494140625,51.92978515625],[-177.11005859375,51.928759765624996],[-177.063037109375,51.901904296874996],[-177.079541015625,51.866552734375],[-177.12138671875,51.835791015625],[-177.135107421875,51.806933593749996],[-177.148193359375,51.716748046875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-177.879052734375,51.649707031249996],[-177.90126953125,51.61640625],[-177.925341796875,51.6173828125],[-178.05888671875,51.672607421875],[-178.078466796875,51.691259765625],[-178.000048828125,51.71748046875],[-177.97724609375,51.73779296875],[-177.986376953125,51.7642578125],[-178.0451171875,51.801074218749996],[-178.153466796875,51.8482421875],[-178.19453125,51.8822265625],[-178.16826171875,51.90302734375],[-178.1166015625,51.915869140625],[-177.95380859375,51.91845703125],[-177.865869140625,51.860400390624996],[-177.799609375,51.8400390625],[-177.644482421875,51.82626953125],[-177.724951171875,51.80166015625],[-177.770654296875,51.777880859374996],[-177.826953125,51.685888671875],[-177.879052734375,51.649707031249996]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[73.70742187500002,-53.137109375],[73.58798828125,-53.1845703125],[73.46513671875002,-53.184179687500006],[73.41328125000001,-53.14677734375002],[73.33632812500002,-53.029882812500006],[73.28544921875002,-53.021484375],[73.25390625,-52.989355468750006],[73.25117187500001,-52.97578125000001],[73.3052734375,-52.96630859375],[73.38808593750002,-52.999902343749994],[73.58574218750002,-53.02714843750002],[73.73125,-53.091210937499994],[73.83779296875002,-53.11279296875],[73.79511718750001,-53.1298828125],[73.70742187500002,-53.137109375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[69.28242187500001,-49.05888671875002],[69.22060546875002,-49.066796875],[69.20156250000002,-49.034277343750006],[69.20390625000002,-48.9912109375],[69.16953125,-48.95703125],[69.15009765625001,-48.919042968750006],[69.16718750000001,-48.882910156250006],[69.26640625000002,-48.878808593749994],[69.36875,-48.89042968750002],[69.39472656250001,-48.951171875],[69.32119140625002,-49.034277343750006],[69.28242187500001,-49.05888671875002]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[51.834570312500006,-46.43994140625],[51.76171875,-46.44873046875],[51.69658203125002,-46.428125],[51.659277343750006,-46.373632812500006],[51.74189453125001,-46.32685546875001],[51.7841796875,-46.35888671875],[51.8154296875,-46.39472656250001],[51.834570312500006,-46.43994140625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[37.85693359375,-46.944238281249994],[37.81396484375,-46.962890625],[37.61181640625,-46.94648437500001],[37.59003906250001,-46.90800781250002],[37.64970703125002,-46.84892578125002],[37.68486328125002,-46.82402343750002],[37.78955078125,-46.8375],[37.87285156250002,-46.88544921875001],[37.8876953125,-46.90166015625002],[37.85693359375,-46.944238281249994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[27.8427734375,35.929296875],[27.770605468750006,35.90830078125],[27.745703125,35.911035156249994],[27.71552734375001,35.957324218749996],[27.75732421875,36.069189453125],[27.718652343750023,36.14111328125],[27.71630859375,36.17158203125],[27.7744140625,36.213769531249994],[27.815234375000017,36.276953125],[27.914453125000023,36.3453125],[28.171484375,36.426220703125],[28.231835937500023,36.433642578124996],[28.230078125,36.370263671874994],[28.14404296875,36.209863281249994],[28.067675781250017,36.1296875],[28.087792968750023,36.065332031249994],[27.96552734375001,36.047509765624994],[27.8427734375,35.929296875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[27.176074218750017,35.465283203125],[27.13789062500001,35.409082031249994],[27.09912109375,35.456445312499994],[27.115820312500006,35.511132812499994],[27.070703125000023,35.59775390625],[27.156054687500017,35.72626953125],[27.158007812500017,35.788671875],[27.22314453125,35.820458984374994],[27.20703125,35.714453125],[27.1572265625,35.6294921875],[27.208886718750023,35.558935546875],[27.23359375000001,35.478564453124996],[27.176074218750017,35.465283203125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[27.860156250000017,36.55390625],[27.838281250000023,36.537988281249994],[27.7880859375,36.58369140625],[27.785742187500006,36.60751953125],[27.836816406250023,36.63486328125],[27.8625,36.641162109374996],[27.86982421875001,36.622509765625],[27.869042968750023,36.582666015624994],[27.860156250000017,36.55390625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[27.01972656250001,36.959033203124996],[26.919921875,36.945214843749994],[26.93769531250001,37.024609375],[26.888671875,37.087255859375],[26.966601562500017,37.052099609375],[27.016015625000023,37.009667968749994],[27.040136718750006,37.0015625],[27.034570312500023,36.975976562499994],[27.01972656250001,36.959033203124996]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[26.949609375000023,36.727099609374996],[26.918359375000023,36.725927734375],[26.95556640625,36.77421875],[27.061132812500006,36.840380859374996],[27.214941406250006,36.8986328125],[27.265625,36.905126953125],[27.352148437500006,36.868896484375],[27.193164062500017,36.809130859374996],[27.150976562500006,36.777587890625],[27.033593750000023,36.770751953125],[26.949609375000023,36.727099609374996]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[25.5458984375,36.967578125],[25.45673828125001,36.9296875],[25.395898437500023,36.984375],[25.361914062500006,37.07041015625],[25.525292968750023,37.19638671875],[25.564355468750023,37.185107421874996],[25.587890625,37.1525390625],[25.584277343750017,37.039306640625],[25.5458984375,36.967578125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[25.27890625,37.068408203124996],[25.19941406250001,36.99130859375],[25.13330078125,36.999658203124994],[25.10546875,37.034960937499996],[25.146484375,37.107421875],[25.23505859375001,37.14853515625],[25.275292968750023,37.137841796874994],[25.271484375,37.0841796875],[25.27890625,37.068408203124996]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[25.482421875,36.392626953124996],[25.435937500000023,36.340087890625],[25.370507812500023,36.358935546874996],[25.39716796875001,36.378955078124996],[25.412890625000017,36.4048828125],[25.414648437500006,36.442285156249994],[25.396875,36.46533203125],[25.408984375000017,36.47373046875],[25.467382812500006,36.43505859375],[25.482421875,36.392626953124996]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[25.381738281250023,36.6740234375],[25.364355468750006,36.658349609374994],[25.288671875,36.721533203125],[25.25996093750001,36.758447265624994],[25.2958984375,36.78916015625],[25.40693359375001,36.717333984374996],[25.381738281250023,36.6740234375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[26.82441406250001,37.811425781249994],[26.947363281250006,37.778466796874994],[26.981542968750006,37.781982421875],[27.039648437500006,37.77001953125],[27.055078125000023,37.709277343749996],[26.978125,37.700488281249996],[26.84492187500001,37.6447265625],[26.78828125000001,37.656982421875],[26.720507812500017,37.70546875],[26.612890625,37.710498046874996],[26.5810546875,37.72373046875],[26.638671875,37.780859375],[26.74335937500001,37.809765625],[26.82441406250001,37.811425781249994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[26.029296875,37.52939453125],[25.982421875,37.5255859375],[25.99677734375001,37.565576171874994],[26.086328125000023,37.634912109374994],[26.211523437500006,37.63828125],[26.325585937500023,37.673046875],[26.351367187500017,37.67431640625],[26.296875,37.619580078125],[26.204882812500017,37.568505859374994],[26.029296875,37.52939453125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[25.859375,36.790429687499994],[25.77109375,36.7822265625],[25.7431640625,36.78974609375],[25.796777343750023,36.80703125],[25.834375,36.825390625],[25.852441406250023,36.847558593749994],[25.941992187500006,36.886572265625],[26.00068359375001,36.937402343749994],[26.064453125,36.902734375],[25.984667968750017,36.8796875],[25.859375,36.790429687499994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[26.46064453125001,36.585400390625],[26.381640625000017,36.5615234375],[26.331445312500023,36.511376953124994],[26.27001953125,36.546923828124996],[26.269824218750017,36.59541015625],[26.337011718750006,36.58056640625],[26.384179687500023,36.607861328125],[26.370019531250023,36.638574218749994],[26.421289062500023,36.62421875],[26.46064453125001,36.585400390625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[24.35595703125,37.57685546875],[24.288964843750023,37.528271484375],[24.277441406250006,37.601123046874996],[24.320410156250006,37.677734375],[24.37910156250001,37.68271484375],[24.400781250000023,37.6490234375],[24.35595703125,37.57685546875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[24.43574218750001,37.34443359375],[24.37890625,37.314111328124994],[24.397753906250017,37.383447265624994],[24.369726562500006,37.41962890625],[24.394824218750017,37.450390625],[24.43125,37.4751953125],[24.448535156250017,37.449560546875],[24.4814453125,37.408007812499996],[24.43574218750001,37.34443359375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[24.535742187500006,36.76376953125],[24.5375,36.705029296875],[24.530664062500023,36.683984375],[24.325976562500017,36.655615234375],[24.34492187500001,36.722998046875],[24.357421875,36.744287109374994],[24.425195312500023,36.712939453124996],[24.4501953125,36.728955078125],[24.460351562500023,36.747460937499994],[24.535742187500006,36.76376953125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[24.94287109375,37.493505859375],[24.937890625000023,37.389697265624996],[24.911523437500023,37.390576171875],[24.89619140625001,37.406591796875],[24.895312500000017,37.446337890624996],[24.906542968750017,37.50888671875],[24.94287109375,37.493505859375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[24.99169921875,37.759619140625],[24.962207031250017,37.6923828125],[24.884082031250017,37.7705078125],[24.79853515625001,37.824023437499996],[24.766503906250023,37.870703125],[24.71435546875,37.898876953125],[24.7001953125,37.961669921875],[24.76337890625001,37.9875],[24.790429687500023,37.990136718749994],[24.855078125,37.913671875],[24.956347656250017,37.90478515625],[24.94843750000001,37.857666015625],[24.98046875,37.796923828124996],[24.99169921875,37.759619140625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[25.255859375,37.599609375],[25.21875,37.535107421875],[25.156347656250006,37.545068359374994],[25.05195312500001,37.614453125],[25.01630859375001,37.645947265625],[24.996484375000023,37.676904296874994],[25.039355468750017,37.6806640625],[25.091796875,37.647998046874996],[25.225390625000017,37.630664062499996],[25.255859375,37.599609375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[24.72089843750001,36.921435546874996],[24.70263671875,36.91708984375],[24.67646484375001,36.959277343749996],[24.670996093750006,36.998583984374996],[24.681445312500017,37.021630859374994],[24.716113281250017,37.023828125],[24.76318359375,36.94921875],[24.72089843750001,36.921435546874996]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[26.094042968750017,38.218066406249996],[25.99853515625,38.161523437499994],[25.891894531250017,38.243310546874994],[25.874316406250017,38.26962890625],[25.95263671875,38.302636718749994],[25.99140625000001,38.353515625],[25.9599609375,38.416015625],[25.85126953125001,38.5083984375],[25.846093750000023,38.574023437499996],[26.0125,38.601708984374994],[26.110449218750006,38.54462890625],[26.16035156250001,38.54072265625],[26.141210937500006,38.486181640625],[26.14960937500001,38.46845703125],[26.157031250000017,38.3029296875],[26.110742187500023,38.279638671875],[26.103125,38.234179687499996],[26.094042968750017,38.218066406249996]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[26.41015625,39.329443359375],[26.39277343750001,39.2701171875],[26.531054687500017,39.171777343749994],[26.578222656250006,39.109521484374994],[26.595605468750023,39.048828125],[26.583984375,39.0314453125],[26.531542968750017,39.064355468749994],[26.488671875000023,39.0748046875],[26.503125,39.0314453125],[26.547167968750017,38.994140625],[26.46875,38.972802734374994],[26.39013671875,38.973925781249996],[26.16083984375001,39.02587890625],[26.10791015625,39.0810546875],[26.2451171875,39.164111328124996],[26.27314453125001,39.197558593749996],[26.17597656250001,39.194287109375],[26.072363281250006,39.095605468749994],[25.90625,39.138964843749996],[25.85546875,39.178662109375],[25.844140625000023,39.200048828125],[25.909570312500023,39.287548828125],[26.026464843750006,39.284619140625],[26.08837890625,39.304296875],[26.164843750000017,39.331982421875],[26.165429687500023,39.37353515625],[26.347753906250006,39.3830078125],[26.41015625,39.329443359375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[23.77978515625,39.114404296874994],[23.735156250000017,39.08056640625],[23.666113281250006,39.095361328124994],[23.59394531250001,39.20859375],[23.77978515625,39.114404296874994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[23.887988281250017,39.15830078125],[23.841210937500023,39.14658203125],[23.888085937500023,39.226367187499996],[23.97089843750001,39.267724609374994],[23.939746093750017,39.200537109375],[23.887988281250017,39.15830078125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[24.674707031250023,38.809228515624994],[24.56904296875001,38.784814453124994],[24.541015625,38.788671875],[24.564550781250006,38.81943359375],[24.56640625,38.832373046875],[24.461035156250006,38.888623046875],[24.473437500000017,38.961669921875],[24.485644531250017,38.980273437499996],[24.5640625,38.942236328125],[24.58125,38.878857421875],[24.674707031250023,38.809228515624994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[25.68574218750001,40.4265625],[25.572656250000023,40.400439453124996],[25.448046875000017,40.4828125],[25.56855468750001,40.515869140625],[25.624316406250017,40.491992187499996],[25.66425781250001,40.4638671875],[25.68574218750001,40.4265625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[25.43769531250001,39.983300781249994],[25.39990234375,39.949560546875],[25.3720703125,39.89130859375],[25.35703125,39.80810546875],[25.298730468750023,39.806103515625],[25.26337890625001,39.82294921875],[25.251757812500017,39.854394531249994],[25.249414062500023,39.894140625],[25.22382812500001,39.892578125],[25.203222656250006,39.849414062499996],[25.18515625,39.829931640625],[25.12646484375,39.825830078124994],[25.06220703125001,39.852392578125],[25.065234375000017,39.90986328125],[25.05234375,39.976367187499996],[25.058007812500023,39.999658203124994],[25.234179687500017,40.005419921874996],[25.285742187500006,39.956298828125],[25.348046875000023,39.984765625],[25.373632812500006,40.015527343749994],[25.449121093750023,40.034814453124994],[25.43769531250001,39.983300781249994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[24.774218750000017,40.615185546875],[24.645898437500023,40.579443359375],[24.515527343750023,40.647021484374996],[24.516699218750006,40.68720703125],[24.585546875,40.76875],[24.623339843750017,40.792919921875],[24.719140625000023,40.786279296874994],[24.77363281250001,40.730273437499996],[24.78632812500001,40.703857421875],[24.768652343750006,40.65888671875],[24.774218750000017,40.615185546875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[25.970019531250017,40.136328125],[25.740234375,40.10546875],[25.6689453125,40.135888671874994],[25.74091796875001,40.1962890625],[25.874804687500017,40.233691406249996],[25.918359375000023,40.23798828125],[25.97705078125,40.17783203125],[25.970019531250017,40.136328125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-16.114501953125,11.059423828124991],[-16.194531249999983,11.044580078124994],[-16.23100585937499,11.09423828125],[-16.236425781249977,11.113427734374994],[-16.19462890624999,11.130126953125],[-16.175878906249977,11.130810546874997],[-16.14404296875,11.166845703124991],[-16.10478515624999,11.191015625],[-16.08745117187499,11.198779296874989],[-16.067333984374983,11.197216796874997],[-16.05278320312499,11.117529296874991],[-16.072216796874983,11.084082031249991],[-16.114501953125,11.059423828124991]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-16.37333984374999,19.706445312499994],[-16.43754882812499,19.609277343749994],[-16.465966796874994,19.646386718749994],[-16.477001953124983,19.710351562499994],[-16.420166015625,19.801953125],[-16.393261718749983,19.849267578124994],[-16.343652343749994,19.8662109375],[-16.37333984374999,19.706445312499994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-17.190869140624983,32.868603515625],[-17.05449218749999,32.815869140625],[-16.92919921875,32.84140625],[-16.77397460937499,32.77353515625],[-16.693261718749994,32.7580078125],[-16.765283203124994,32.709716796875],[-16.83740234375,32.648291015625],[-17.018261718749983,32.66279296875],[-17.17119140624999,32.721875],[-17.226025390624983,32.766845703125],[-17.24101562499999,32.807373046875],[-17.190869140624983,32.868603515625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-15.895898437499994,11.082470703124997],[-15.905175781249994,11.054736328124989],[-15.963964843749977,11.058984375],[-15.950634765624983,11.087109375],[-15.963476562499977,11.0953125],[-15.946484374999983,11.179736328124989],[-15.937695312499983,11.192773437499994],[-15.909130859374983,11.161328125],[-15.9052734375,11.148339843749994],[-15.895898437499994,11.082470703124997]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-16.33447265625,28.379931640624996],[-16.418212890625,28.151416015624996],[-16.496240234374994,28.061914062499994],[-16.54277343749999,28.032080078125],[-16.65800781249999,28.007177734375],[-16.79472656249999,28.149169921875],[-16.86601562499999,28.293261718749996],[-16.90532226562499,28.339599609375],[-16.84306640624999,28.376123046874994],[-16.752050781249977,28.369824218749997],[-16.556835937499983,28.40048828125],[-16.517431640624977,28.4126953125],[-16.318994140624994,28.558203125],[-16.123632812499977,28.575976562499996],[-16.119140625,28.528271484374997],[-16.33447265625,28.379931640624996]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-13.715966796874994,28.91123046875],[-13.783984374999989,28.845458984375],[-13.859912109374989,28.869091796874997],[-13.823632812499994,29.013330078124994],[-13.788183593749977,29.056103515624997],[-13.650097656249983,29.118994140625],[-13.535058593749994,29.144287109375],[-13.501416015624983,29.211230468749996],[-13.463574218749983,29.237207031249994],[-13.422949218749977,29.197509765625],[-13.453759765624994,29.1513671875],[-13.477929687499994,29.006591796875],[-13.5546875,28.960205078125],[-13.715966796874994,28.91123046875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-14.19677734375,28.169287109375],[-14.332617187499977,28.056005859375],[-14.468603515624977,28.082373046875],[-14.491796874999977,28.100927734375],[-14.355566406249977,28.1296875],[-14.231982421874989,28.2158203125],[-14.152587890625,28.406640625],[-14.028369140624989,28.617431640625],[-14.003369140624983,28.706689453124994],[-13.954150390624989,28.741455078125],[-13.886279296874989,28.744677734374996],[-13.857226562499989,28.738037109375],[-13.8271484375,28.691210937499996],[-13.827587890624983,28.58515625],[-13.862988281249983,28.409326171874994],[-13.928027343749989,28.253466796874996],[-14.19677734375,28.169287109375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-12.526074218749983,7.436328124999989],[-12.54062,7.410253906249991],[-12.607177734375,7.474511718749994],[-12.951611328124983,7.570849609374989],[-12.854394531249994,7.622021484374997],[-12.615234375,7.63720703125],[-12.544189453125,7.607373046874997],[-12.5125,7.582421875],[-12.500634765624994,7.535107421874997],[-12.526074218749983,7.436328124999989]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-15.400585937499983,28.147363281249994],[-15.406689453124983,28.070507812499997],[-15.383154296874977,27.992822265624994],[-15.38916015625,27.874707031249997],[-15.436767578125,27.810693359374994],[-15.55937,27.746972656249994],[-15.65576171875,27.7583984375],[-15.710302734374977,27.784082031249994],[-15.807324218749983,27.887548828125],[-15.809472656249994,27.994482421875],[-15.720947265625,28.064160156249997],[-15.682763671874994,28.154052734375],[-15.452783203124994,28.136914062499997],[-15.432714843749977,28.154248046874997],[-15.415478515624983,28.159326171874994],[-15.400585937499983,28.147363281249994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-15.725146484374989,11.215478515624994],[-15.725146484374989,11.174511718749997],[-15.767480468749994,11.182275390624994],[-15.77978515625,11.19453125],[-15.754687499999989,11.268701171874994],[-15.717480468749983,11.3017578125],[-15.671923828124989,11.296484375],[-15.658349609374994,11.286474609374991],[-15.667187499999983,11.257861328124989],[-15.687109374999977,11.234326171874997],[-15.725146484374989,11.215478515624994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-15.553417968749983,11.537011718749994],[-15.562792968749989,11.513769531249991],[-15.61962890625,11.533496093749989],[-15.536572265624983,11.617626953124997],[-15.482470703124989,11.63232421875],[-15.484423828124989,11.567529296874994],[-15.526220703124977,11.553857421874994],[-15.553417968749983,11.537011718749994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-25.169824218749994,16.946484375],[-25.267236328124994,16.925927734374994],[-25.308300781249983,16.935839843750003],[-25.321923828124994,17.015380859375],[-25.341552734375,17.06772460937499],[-25.337109374999983,17.091015625],[-25.113476562499983,17.193652343750003],[-25.03466796875,17.176464843749997],[-24.979687499999983,17.0947265625],[-25.01708984375,17.04931640625],[-25.169824218749994,16.946484375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-24.887060546874977,16.818115234375],[-24.969140625,16.794189453125],[-25.019970703124983,16.79721679687499],[-25.09306640624999,16.83251953125],[-25.07011718749999,16.870703125],[-24.99101562499999,16.913232421874994],[-24.936474609374983,16.922119140625],[-24.89189453124999,16.846484375],[-24.887060546874977,16.818115234375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-17.184667968749977,28.02197265625],[-17.22539062499999,28.013525390625],[-17.27392578125,28.03828125],[-17.324902343749983,28.11767578125],[-17.29033203124999,28.176318359374996],[-17.25859374999999,28.203173828124996],[-17.21435546875,28.199267578124996],[-17.129638671875,28.155957031249997],[-17.103759765625,28.111132812499996],[-17.10107421875,28.083447265624997],[-17.184667968749977,28.02197265625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-15.901806640624983,11.4658203125],[-15.94873046875,11.434423828124991],[-15.997216796874994,11.449169921874997],[-16.023193359375,11.477148437499991],[-16.01933593749999,11.527294921874997],[-15.964550781249983,11.598291015624994],[-15.915332031249989,11.589111328125],[-15.901806640624983,11.4658203125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-15.986425781249977,11.88203125],[-16.038330078125,11.759716796874997],[-16.102441406249994,11.773193359375],[-16.147363281249994,11.845996093749989],[-16.152441406249977,11.876806640624991],[-16.021875,11.886669921874997],[-15.986425781249977,11.88203125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-17.887939453125,27.8095703125],[-17.984765625,27.646386718749994],[-18.106591796874994,27.707470703124997],[-18.135937499999983,27.727929687499994],[-18.160546875,27.761474609375],[-18.043359375,27.768115234374996],[-17.924511718749983,27.850146484374996],[-17.887939453125,27.8095703125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-22.917724609375,16.237255859374997],[-22.834326171874977,16.218994140625],[-22.802636718749994,16.225537109374997],[-22.749414062499994,16.22153320312499],[-22.692626953125,16.16904296874999],[-22.681884765625,16.11328125],[-22.710107421874994,16.043359375],[-22.820507812499983,15.986035156249997],[-22.88408203124999,15.992724609375003],[-22.95927734374999,16.045117187499997],[-22.916113281249977,16.1484375],[-22.917724609375,16.237255859374997]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-24.308251953124994,14.856298828124991],[-24.386132812499994,14.818212890624991],[-24.440527343749977,14.834814453124991],[-24.4921875,14.87421875],[-24.51708984375,14.93125],[-24.49687,14.980273437500003],[-24.391992187499994,15.03828125],[-24.329492187499994,15.019482421874997],[-24.295800781249994,14.929541015624991],[-24.308251953124994,14.856298828124991]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-17.83427734374999,28.493212890624996],[-17.859375,28.485693359375],[-17.88212890624999,28.564599609374994],[-18.00078124999999,28.758251953124997],[-17.928808593749977,28.844580078125],[-17.797558593749983,28.84677734375],[-17.74453125,28.786572265624997],[-17.7265625,28.724462890625],[-17.751611328124994,28.68857421875],[-17.744384765625,28.616015625],[-17.758007812499983,28.569091796875],[-17.83427734374999,28.493212890624996]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-24.08769531249999,16.622509765624997],[-24.04638671875,16.593066406250003],[-24.03271484375,16.572021484375],[-24.094140625,16.56103515625],[-24.243066406249994,16.599414062500003],[-24.282812499999977,16.575927734375],[-24.322363281249977,16.493115234374997],[-24.398095703124994,16.618408203125],[-24.392919921874977,16.664453125],[-24.376708984375,16.677783203125003],[-24.271093749999977,16.64487304687499],[-24.08769531249999,16.622509765624997]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-22.888330078124994,16.659082031249994],[-22.920263671874977,16.60791015625],[-22.959423828124983,16.683056640624997],[-22.980615234374994,16.700878906249997],[-22.990917968749983,16.808837890625],[-22.93291015624999,16.841015625],[-22.904736328124983,16.84375],[-22.903906249999977,16.732128906249997],[-22.888330078124994,16.659082031249994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-23.18212890625,15.136767578125003],[-23.2099609375,15.133105468750003],[-23.251806640624977,15.178125],[-23.24248046874999,15.240527343750003],[-23.247167968749977,15.256982421874994],[-23.21025390624999,15.323535156250003],[-23.13774414062499,15.317724609374991],[-23.119335937499983,15.268408203124991],[-23.115869140624994,15.166650390624994],[-23.18212890625,15.136767578125003]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-23.444238281249994,15.007958984374994],[-23.50468749999999,14.916113281249991],[-23.63720703125,14.923486328124994],[-23.70537109374999,14.961328125],[-23.785009765624977,15.076904296875],[-23.78251953124999,15.166113281249991],[-23.754492187499977,15.243554687499994],[-23.75937,15.310791015625],[-23.74809570312499,15.328515625],[-23.707226562499983,15.31689453125],[-23.700634765624983,15.271630859374994],[-23.579980468749994,15.160888671875],[-23.535253906249977,15.139257812499991],[-23.444238281249994,15.007958984374994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[44.47636718750002,-12.08154296875],[44.52675781250002,-12.21953125],[44.52626953125002,-12.323535156250003],[44.504980468750006,-12.356542968750006],[44.46015625000001,-12.335156250000011],[44.37744140625,-12.252246093750003],[44.22011718750002,-12.17138671875],[44.29228515625002,-12.164746093750011],[44.33447265625,-12.173046875000011],[44.37910156250001,-12.165625],[44.40703125000002,-12.1201171875],[44.41259765625,-12.092968750000011],[44.45185546875001,-12.071386718750006],[44.47636718750002,-12.08154296875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[43.788671875,-12.30703125],[43.858984375,-12.368261718750006],[43.663671875,-12.342871093750006],[43.632910156250006,-12.287695312500006],[43.63134765625,-12.2470703125],[43.70429687500001,-12.255957031250006],[43.788671875,-12.30703125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[45.180273437500006,-12.976757812500011],[45.11757812500002,-12.984960937500006],[45.08769531250002,-12.95849609375],[45.069433593750006,-12.895605468750006],[45.08828125000002,-12.835058593750006],[45.09355468750002,-12.7861328125],[45.042578125,-12.701269531250006],[45.092382812500006,-12.653027343750011],[45.134765625,-12.709179687500011],[45.158789062500006,-12.712988281250006],[45.22314453125,-12.752148437500011],[45.20429687500001,-12.824316406250006],[45.20859375,-12.847949218750003],[45.17939453125001,-12.920214843750003],[45.180273437500006,-12.976757812500011]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[43.4658203125,-11.901269531250009],[43.44677734375,-11.91455078125],[43.35546875,-11.857519531250006],[43.303320312500006,-11.844042968750003],[43.226660156250006,-11.751855468750009],[43.25605468750001,-11.43212890625],[43.28066406250002,-11.391210937500006],[43.29902343750001,-11.37451171875],[43.34150390625001,-11.368457031250003],[43.39296875000002,-11.40859375],[43.37939453125,-11.614160156250009],[43.44765625000002,-11.752539062500006],[43.49150390625002,-11.862109375],[43.4658203125,-11.901269531250009]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[39.71132812500002,-7.977441406250009],[39.6572265625,-7.990527343750003],[39.63613281250002,-7.977832031250003],[39.60292968750002,-7.936132812500006],[39.66064453125,-7.900585937500011],[39.71660156250002,-7.83154296875],[39.84658203125002,-7.730273437500003],[39.89091796875002,-7.663476562500009],[39.90712890625002,-7.64921875],[39.89775390625002,-7.728125],[39.82441406250001,-7.900683593750003],[39.761816406250006,-7.911914062500003],[39.71132812500002,-7.977441406250009]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[40.99443359375002,-2.158398437500011],[40.95732421875002,-2.167285156250003],[40.97646484375002,-2.109765625],[41.086035156250006,-2.036523437500009],[41.13066406250002,-2.053027343750003],[41.139257812500006,-2.06982421875],[41.136816406250006,-2.085058593750006],[41.1181640625,-2.10009765625],[40.99443359375002,-2.158398437500011]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[39.49648437500002,-6.174609375],[39.57304687500002,-6.387402343750011],[39.56318359375001,-6.42724609375],[39.50917968750002,-6.45166015625],[39.48095703125,-6.453710937500006],[39.447363281250006,-6.419726562500003],[39.42363281250002,-6.347851562500011],[39.38261718750002,-6.364941406250011],[39.31269531250001,-6.279101562500003],[39.24345703125002,-6.275],[39.18232421875001,-6.172558593750011],[39.20625,-6.083203125000011],[39.1923828125,-5.931054687500009],[39.26699218750002,-5.853125],[39.30898437500002,-5.721972656250003],[39.35722656250002,-5.8115234375],[39.368261718750006,-5.951171875],[39.43330078125001,-6.115429687500011],[39.487890625,-6.166210937500011],[39.49648437500002,-6.174609375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[57.65126953125002,-20.48486328125],[57.52480468750002,-20.51318359375],[57.38330078125,-20.503710937500003],[57.32832031250001,-20.45],[57.31767578125002,-20.42763671875001],[57.36513671875002,-20.40644531250001],[57.36210937500002,-20.33759765625001],[57.3857421875,-20.228613281250006],[57.416015625,-20.18378906250001],[57.486425781250006,-20.14394531250001],[57.51503906250002,-20.055957031250003],[57.57578125,-19.997167968750006],[57.65654296875002,-19.98994140625001],[57.73720703125002,-20.0984375],[57.7919921875,-20.21259765625001],[57.78066406250002,-20.326953125],[57.725,-20.36884765625001],[57.706640625,-20.434863281250003],[57.65126953125002,-20.48486328125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[55.79736328125,-21.33935546875],[55.65615234375002,-21.36904296875001],[55.5576171875,-21.35830078125001],[55.36269531250002,-21.27363281250001],[55.31035156250002,-21.217382812500006],[55.23281250000002,-21.058398437500003],[55.25,-21.00244140625],[55.31132812500002,-20.904101562500003],[55.45048828125002,-20.86513671875001],[55.59648437500002,-20.87958984375001],[55.66191406250002,-20.90625],[55.73916015625002,-21.021484375],[55.83906250000001,-21.13857421875001],[55.82246093750001,-21.27783203125],[55.79736328125,-21.33935546875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[48.34218750000002,-13.363867187500006],[48.34355468750002,-13.400390625],[48.2119140625,-13.38525390625],[48.19121093750002,-13.259960937500011],[48.25566406250002,-13.256054687500011],[48.26972656250001,-13.20458984375],[48.30888671875002,-13.1982421875],[48.35107421875,-13.3095703125],[48.34218750000002,-13.363867187500006]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[49.93642578125002,-16.902929687500006],[49.82402343750002,-17.086523437500006],[49.85566406250001,-16.933203125],[49.9859375,-16.71240234375],[50.023046875,-16.6953125],[49.93642578125002,-16.902929687500006]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-5.692138671875,-15.997753906250011],[-5.782519531249989,-16.004003906250006],[-5.775048828124994,-15.956738281250011],[-5.707861328124977,-15.906152343750009],[-5.6625,-15.912792968750011],[-5.659716796874989,-15.970898437500011],[-5.692138671875,-15.997753906250011]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[39.86503906250002,-4.906152343750009],[39.87099609375002,-4.95654296875],[39.85566406250001,-5.004003906250006],[39.858984375,-5.155175781250009],[39.85302734375,-5.25546875],[39.7958984375,-5.394433593750009],[39.74931640625002,-5.44384765625],[39.707617187500006,-5.429492187500003],[39.6734375,-5.406640625],[39.64677734375002,-5.368554687500009],[39.70107421875002,-5.113671875],[39.6734375,-4.927050781250003],[39.78076171875,-4.944921875],[39.86503906250002,-4.906152343750009]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[55.54033203125002,-4.693066406250011],[55.54296875,-4.785546875],[55.494726562500006,-4.754589843750011],[55.48125,-4.69482421875],[55.41679687500002,-4.650292968750009],[55.383398437500006,-4.609277343750009],[55.45576171875001,-4.558789062500011],[55.54033203125002,-4.693066406250011]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[8.735742187500023,3.75830078125],[8.760449218750011,3.754345703124997],[8.910058593750023,3.758203125],[8.95068359375,3.705322265625],[8.946093750000017,3.627539062499991],[8.792187500000011,3.400390625],[8.763476562500017,3.304638671874997],[8.704003906250023,3.2236328125],[8.65234375,3.217089843749989],[8.474902343750017,3.2646484375],[8.444921875,3.293505859374989],[8.434277343750011,3.332421875],[8.451757812500006,3.422900390624989],[8.464648437500017,3.450585937499994],[8.5498046875,3.467626953124991],[8.577246093750006,3.482373046874997],[8.622753906250011,3.579980468749994],[8.6376953125,3.668847656249994],[8.675878906250006,3.7359375],[8.735742187500023,3.75830078125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[6.659960937500017,0.120654296874989],[6.556835937500011,0.04736328125],[6.519726562500011,0.066308593749994],[6.496972656250023,0.117382812499997],[6.468164062500023,0.227343749999989],[6.4775390625,0.280126953124991],[6.524316406250023,0.340283203124997],[6.625878906250023,0.400244140624991],[6.686914062500023,0.404394531249991],[6.749804687500017,0.325634765624997],[6.75,0.243457031249989],[6.659960937500017,0.120654296874989]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[7.423828125,1.567724609374991],[7.386621093750023,1.541552734374989],[7.342382812500006,1.563574218749991],[7.330664062500006,1.603369140624991],[7.387597656250023,1.68017578125],[7.414453125000023,1.699121093749994],[7.43701171875,1.683056640624997],[7.450390625000011,1.661962890624991],[7.452343750000011,1.631103515625],[7.423828125,1.567724609374991]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[7.30078125,4.418164062499997],[7.203906250000017,4.387646484374997],[7.140429687500017,4.395117187499991],[7.227343750000017,4.52734375],[7.271386718750023,4.498925781249994],[7.327929687500017,4.487207031249994],[7.30078125,4.418164062499997]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-44.129296875,-23.141894531250003],[-44.098046875,-23.16933593750001],[-44.15576171875,-23.166601562500006],[-44.22050781249999,-23.19082031250001],[-44.320068359375,-23.21230468750001],[-44.36015624999999,-23.17207031250001],[-44.27412109374998,-23.1162109375],[-44.24287109374998,-23.07412109375001],[-44.22041015624998,-23.08291015625001],[-44.19160156249998,-23.11328125],[-44.129296875,-23.141894531250003]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-48.58442382812498,-26.40156250000001],[-48.60307617187499,-26.41376953125001],[-48.665771484375,-26.289648437500006],[-48.53974609374998,-26.1703125],[-48.49760742187499,-26.21875],[-48.531103515625006,-26.31318359375001],[-48.56806640624998,-26.3796875],[-48.58442382812498,-26.40156250000001]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-48.48588867187499,-27.76699218750001],[-48.554589843749994,-27.81220703125001],[-48.54218749999998,-27.574804687500006],[-48.50517578124999,-27.49550781250001],[-48.464746093749994,-27.436328125],[-48.414892578125006,-27.39960937500001],[-48.3779296875,-27.451464843750003],[-48.409570312499994,-27.56630859375001],[-48.49677734374998,-27.70703125],[-48.48588867187499,-27.76699218750001]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-45.26025390625,-23.88916015625],[-45.260888671874994,-23.94130859375001],[-45.30253906249999,-23.91474609375001],[-45.412841796875,-23.93496093750001],[-45.451416015625,-23.895605468750006],[-45.30234375,-23.7275390625],[-45.27226562499999,-23.751953125],[-45.24907226562499,-23.78261718750001],[-45.23310546874998,-23.82539062500001],[-45.25029296874999,-23.85302734375],[-45.26025390625,-23.88916015625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[11.278027343750011,34.753808593749994],[11.123632812500006,34.681689453124996],[11.153027343750011,34.744580078125],[11.2548828125,34.8203125],[11.281054687500017,34.802197265625],[11.278027343750011,34.753808593749994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[10.957617187500006,33.722070312499994],[10.931347656250011,33.717431640624994],[10.883007812500011,33.690185546875],[10.857421875,33.687158203124994],[10.784765625,33.717675781249994],[10.757031250000011,33.71748046875],[10.722070312500023,33.738916015624994],[10.73388671875,33.855615234374994],[10.745214843750006,33.888671875],[10.921972656250006,33.893115234374996],[11.017871093750017,33.82333984375],[11.033593750000023,33.805029296875],[11.03759765625,33.785058593749994],[10.993066406250023,33.745947265625],[10.957617187500006,33.722070312499994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-4.412060546874983,54.185351562499996],[-4.6142578125,54.05869140625],[-4.696093749999989,54.0814453125],[-4.765771484374994,54.06943359375],[-4.785351562499983,54.073046875],[-4.745556640624983,54.118798828125],[-4.69873046875,54.224902343749996],[-4.614843749999977,54.266943359375],[-4.508642578124977,54.376708984375],[-4.424707031249994,54.407177734375],[-4.395556640624989,54.4029296875],[-4.377197265625,54.392578125],[-4.337988281249977,54.269091796874996],[-4.392285156249983,54.225390625],[-4.412060546874983,54.185351562499996]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-6.607617187499983,56.585009765624996],[-6.664453125,56.579443359375],[-6.668554687499977,56.593603515625],[-6.569921874999977,56.66123046875],[-6.506054687499983,56.67236328125],[-6.483691406249989,56.665771484375],[-6.530078124999989,56.626611328125],[-6.607617187499983,56.585009765624996]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-5.105419921874983,55.448828125],[-5.231494140624989,55.448095703125],[-5.277050781249983,55.45673828125],[-5.331494140624983,55.4810546875],[-5.392675781249977,55.618359375],[-5.370800781249983,55.666943359375],[-5.345703125,55.690722656249996],[-5.318115234375,55.7091796875],[-5.251611328124994,55.716943359375],[-5.185449218749994,55.690966796874996],[-5.160400390625,55.666796875],[-5.10498046875,55.573974609375],[-5.0947265625,55.4943359375],[-5.105419921874983,55.448828125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-5.777880859374989,56.3443359375],[-6.176171875,56.288720703125],[-6.313427734374983,56.29365234375],[-6.325830078124994,56.320947265625],[-6.298486328124994,56.339160156249996],[-6.184863281249989,56.356884765625],[-6.138867187499983,56.490625],[-6.310644531249977,56.5521484375],[-6.319677734374977,56.56943359375],[-6.30625,56.598779296875],[-6.286328124999983,56.611865234374996],[-6.182080078124983,56.64296875],[-6.138281249999977,56.649853515625],[-6.102734374999983,56.645654296875],[-6.029589843749989,56.609814453125],[-5.946679687499994,56.534521484375],[-5.836035156249977,56.52255859375],[-5.760839843749977,56.490673828125],[-5.777880859374989,56.3443359375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-6.12890625,55.93056640625],[-6.092822265624989,55.8021484375],[-6.0576171875,55.722509765625],[-6.055322265624994,55.6953125],[-6.08837890625,55.657519531249996],[-6.253173828125,55.607226562499996],[-6.305078125,55.60693359375],[-6.307226562499977,55.619140625],[-6.27001953125,55.6703125],[-6.302050781249989,55.728369140625],[-6.286425781249989,55.772509765624996],[-6.3017578125,55.780615234375],[-6.333886718749994,55.774365234375],[-6.451953124999989,55.704248046875],[-6.491357421874994,55.697314453124996],[-6.495654296874989,55.711572265625],[-6.466455078124994,55.768994140625],[-6.462841796874983,55.808251953125],[-6.445263671874983,55.832373046875],[-6.413183593749977,55.854638671875],[-6.374951171874983,55.871337890625],[-6.344140625,55.87373046875],[-6.311279296875,55.856494140624996],[-6.215673828124977,55.904589843749996],[-6.12890625,55.93056640625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-5.970068359374977,55.81455078125],[-5.990917968749983,55.80380859375],[-6.041552734374989,55.806787109375],[-6.060351562499989,55.822900390625],[-6.070703125,55.84765625],[-6.071972656249983,55.893115234374996],[-6.041308593749989,55.925634765625],[-5.911767578124994,55.974755859375],[-5.970312499999977,55.9921875],[-5.97265625,56.004443359374996],[-5.939062499999977,56.045263671875],[-5.799609374999989,56.1087890625],[-5.762255859374989,56.1203125],[-5.725146484374989,56.1185546875],[-5.797216796874977,56.005615234375],[-5.970068359374977,55.81455078125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-1.042529296874989,60.5138671875],[-1.06787109375,60.502294921875],[-1.16552734375,60.60390625],[-1.093310546874989,60.72021484375],[-1.005615234375,60.71650390625],[-0.991650390624983,60.68603515625],[-1.000341796874977,60.6580078125],[-1.045019531249977,60.655517578125],[-1.049023437499983,60.646923828125],[-1.035107421874983,60.592919921874994],[-1.034228515624989,60.530175781249994],[-1.042529296874989,60.5138671875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-1.30810546875,60.5375],[-1.287402343749989,60.467041015625],[-1.235742187499994,60.485302734375],[-1.157763671874989,60.417724609375],[-1.117968749999989,60.417626953124994],[-1.052441406249983,60.444482421874994],[-1.065673828125,60.381591796875],[-1.133691406249994,60.206982421875],[-1.152783203124983,60.17734375],[-1.165722656249983,60.124267578125],[-1.179248046874989,60.113916015624994],[-1.199316406249977,60.006591796875],[-1.245312499999983,59.971240234375],[-1.283789062499977,59.8869140625],[-1.299462890624994,59.878662109375],[-1.355859375,59.9111328125],[-1.299511718749983,60.03984375],[-1.276171874999989,60.114648437499994],[-1.290917968749994,60.153466796874994],[-1.322802734374989,60.188378906249994],[-1.409033203124977,60.189501953125],[-1.481494140624989,60.173388671875],[-1.49687,60.193994140624994],[-1.499121093749977,60.22177734375],[-1.5166015625,60.231005859375],[-1.613037109375,60.2291015625],[-1.641357421875,60.236767578125],[-1.660058593749994,60.262255859375],[-1.663769531249983,60.28251953125],[-1.57666015625,60.298388671875],[-1.494433593749989,60.29248046875],[-1.374609374999977,60.332910156249994],[-1.449560546874977,60.4685546875],[-1.548828125,60.481298828125],[-1.57177734375,60.49443359375],[-1.552636718749994,60.517431640625],[-1.498144531249977,60.529833984375],[-1.414208984374994,60.59873046875],[-1.363964843749983,60.6095703125],[-1.301708984374983,60.607666015625],[-1.30810546875,60.5375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-0.774267578124977,60.811962890625],[-0.774316406249994,60.80048828125],[-0.826171875,60.716162109375],[-0.825488281249989,60.683935546875],[-0.909130859374983,60.68701171875],[-0.922265625,60.697265625],[-0.938085937499977,60.745654296875],[-0.927539062499989,60.79716796875],[-0.915820312499989,60.810449218749994],[-0.891406249999989,60.81591796875],[-0.864941406249983,60.805810546874994],[-0.823437499999983,60.831884765625],[-0.801806640624989,60.83125],[-0.774267578124977,60.811962890625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-3.164941406249994,58.794189453125],[-3.222119140624983,58.78095703125],[-3.27880859375,58.78193359375],[-3.3671875,58.839746093749994],[-3.400830078124983,58.881787109375],[-3.394726562499983,58.909619140625],[-3.357421875,58.918994140625],[-3.271923828124983,58.9052734375],[-3.227636718749977,58.857177734375],[-3.222119140624983,58.82587890625],[-3.211621093749983,58.81357421875],[-3.158544921874977,58.801220703125],[-3.164941406249994,58.794189453125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-4.19677734375,53.321435546875],[-4.154882812499977,53.30283203125],[-4.049365234374989,53.30576171875],[-4.084277343749989,53.264306640625],[-4.200390624999983,53.218066406249996],[-4.278613281249989,53.172412109374996],[-4.373046875,53.1341796875],[-4.418847656249994,53.178027343749996],[-4.471972656249989,53.1763671875],[-4.55322265625,53.26044921875],[-4.56787109375,53.386474609375],[-4.461718749999989,53.419287109375],[-4.315087890624994,53.417236328125],[-4.19677734375,53.321435546875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-2.548876953124989,59.231347656249994],[-2.662060546874983,59.23017578125],[-2.603613281249977,59.289306640625],[-2.53564453125,59.304150390625],[-2.406982421875,59.29755859375],[-2.429833984374994,59.271044921875],[-2.548876953124989,59.231347656249994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-2.929394531249983,58.741601562499994],[-2.93896484375,58.738623046875],[-2.975390624999989,58.75693359375],[-3.035449218749989,58.82265625],[-2.941210937499989,58.835693359375],[-2.896435546874983,58.827587890625],[-2.9130859375,58.799609375],[-2.929394531249983,58.741601562499994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-3.057421874999989,59.029638671875],[-3.070703125,59.00498046875],[-2.994677734374989,59.00556640625],[-2.884570312499989,58.984521484374994],[-2.817919921874989,58.981884765625],[-2.762451171875,58.955810546875],[-2.793017578124989,58.90693359375],[-2.826220703124989,58.89326171875],[-2.86376953125,58.890527343749994],[-2.994824218749983,58.939355468749994],[-3.166601562499977,58.919091796874994],[-3.200781249999977,58.92529296875],[-3.223339843749983,58.93876953125],[-3.232617187499983,58.955517578125],[-3.2328125,58.989648437499994],[-3.242138671874983,58.99970703125],[-3.304345703124994,58.967431640624994],[-3.331640624999977,58.971240234375],[-3.347070312499994,58.98671875],[-3.353710937499983,59.01875],[-3.346826171874994,59.064990234375],[-3.310351562499989,59.130810546875],[-3.248583984374989,59.143945312499994],[-3.156494140625,59.136328125],[-3.051123046874977,59.099023437499994],[-3.019238281249983,59.076025390625],[-3.02001953125,59.057666015625],[-3.057421874999989,59.029638671875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-6.623193359374994,61.80595703125],[-6.642773437499983,61.768310546875],[-6.670166015625,61.76865234375],[-6.764257812499977,61.815332031249994],[-6.839160156249989,61.840771484375],[-6.863964843749983,61.862255859375],[-6.884765625,61.89912109375],[-6.841796875,61.903710937499994],[-6.790771484375,61.895361328125],[-6.662109375,61.861767578125],[-6.625830078124977,61.826708984375],[-6.623193359374994,61.80595703125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-6.699462890625,61.44462890625],[-6.6796875,61.414306640625],[-6.703027343749994,61.41767578125],[-6.7705078125,61.45224609375],[-6.888134765624983,61.534765625],[-6.929248046874989,61.602929687499994],[-6.934863281249989,61.634326171875],[-6.905908203124994,61.630810546875],[-6.881640624999989,61.602783203125],[-6.77001953125,61.584375],[-6.740625,61.5705078125],[-6.741064453124977,61.536376953125],[-6.703515625,61.495947265625],[-6.699462890625,61.44462890625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-7.186865234374977,62.139306640624994],[-7.097119140624983,62.100537109375],[-7.065185546875,62.0732421875],[-7.116796874999977,62.046826171875],[-7.179394531249983,62.0400390625],[-7.254931640624989,62.046142578125],[-7.379101562499983,62.0748046875],[-7.422607421875,62.140283203124994],[-7.336767578124977,62.138671875],[-7.235302734374983,62.151220703125],[-7.186865234374977,62.139306640624994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-6.631054687499983,62.227880859375],[-6.655810546874989,62.093603515625],[-6.696435546874994,62.0943359375],[-6.768896484374977,62.131494140624994],[-6.823437499999983,62.139111328125],[-6.840527343749983,62.119287109374994],[-6.837695312499989,62.09541015625],[-6.809472656249994,62.080419921875],[-6.722558593749994,61.990380859374994],[-6.714404296874989,61.96416015625],[-6.725195312499977,61.95146484375],[-6.809716796874994,61.977441406249994],[-7.013574218749994,62.093994140625],[-7.172167968749989,62.285595703125],[-6.958642578124994,62.316259765625],[-6.803662109374983,62.265966796875],[-6.631054687499983,62.227880859375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-2.729394531249994,59.186767578125],[-2.815234374999989,59.1619140625],[-2.851855468749989,59.182470703125],[-2.861425781249977,59.246826171875],[-2.963769531249994,59.274365234375],[-3.013476562499989,59.291455078125],[-3.052050781249989,59.323876953124994],[-3.042236328125,59.333837890625],[-2.975537109374983,59.347119140625],[-2.861621093749989,59.288330078125],[-2.815039062499977,59.2408203125],[-2.730664062499983,59.2267578125],[-2.719921874999983,59.219482421875],[-2.729394531249994,59.186767578125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-6.406054687499989,62.258642578125],[-6.453857421875,62.1865234375],[-6.524707031249989,62.1978515625],[-6.544140624999983,62.205615234375],[-6.559472656249994,62.224511718749994],[-6.552050781249989,62.278125],[-6.554589843749994,62.3556640625],[-6.473046875,62.291894531249994],[-6.406054687499989,62.258642578125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-6.198681640624983,58.36328125],[-6.325830078124994,58.188867187499994],[-6.375585937499977,58.1845703125],[-6.419287109374977,58.140966796875],[-6.554589843749994,58.09287109375],[-6.4365234375,58.09189453125],[-6.403369140624989,58.07587890625],[-6.402441406249977,58.041357421875],[-6.425195312499994,58.0212890625],[-6.578125,57.941357421875],[-6.683300781249983,57.91103515625],[-6.796582031249983,57.8275390625],[-6.853759765625,57.826513671875],[-6.910351562499983,57.773388671875],[-6.956933593749994,57.750048828124996],[-6.983105468749983,57.75],[-7.01318359375,57.761767578124996],[-7.083447265624983,57.813769531249996],[-6.955957031249994,57.864892578125],[-6.944140624999989,57.89365234375],[-6.856835937499994,57.92353515625],[-6.864160156249994,57.932861328125],[-7.002539062499977,57.974902343749996],[-7.057080078124983,58.003173828125],[-7.051904296874994,58.01796875],[-6.985302734374983,58.05048828125],[-7.016894531249989,58.05478515625],[-7.038232421874994,58.072314453125],[-7.076904296875,58.079003906249994],[-7.088476562499977,58.095361328124994],[-7.095605468749994,58.13828125],[-7.085253906249989,58.182177734375],[-7.044921875,58.2015625],[-7.028417968749977,58.222314453124994],[-7.012060546874977,58.2287109375],[-6.949560546874977,58.217675781249994],[-6.88623046875,58.182568359375],[-6.812304687499989,58.19609375],[-6.726464843749994,58.189404296875],[-6.724707031249977,58.19755859375],[-6.787744140624994,58.28388671875],[-6.776464843749977,58.301513671875],[-6.742285156249977,58.321630859375],[-6.544189453125,58.383154296875],[-6.297167968749989,58.48662109375],[-6.237451171874994,58.502832031249994],[-6.219433593749983,58.488720703125],[-6.194238281249994,58.435107421875],[-6.198681640624983,58.36328125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-6.279052734375,56.964697265625],[-6.308740234374994,56.951806640625],[-6.346240234374989,56.954296875],[-6.383398437499977,56.9708984375],[-6.4326171875,57.017919921875],[-6.322363281249977,57.050537109375],[-6.278222656249994,57.031396484375],[-6.261279296874989,57.009521484375],[-6.260546874999989,56.98525390625],[-6.279052734375,56.964697265625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-6.144726562499983,57.50498046875],[-6.146142578124994,57.460791015625],[-6.163769531249983,57.408837890625],[-6.140820312499983,57.353662109375],[-6.135546874999989,57.314257812499996],[-6.093408203124994,57.301708984375],[-6.067626953125,57.283544921875],[-5.880273437499994,57.263232421874996],[-5.706005859374983,57.2689453125],[-5.672460937499977,57.252685546875],[-5.668652343749983,57.226904296875],[-5.696191406249994,57.1984375],[-5.79541015625,57.146533203124996],[-5.913769531249983,57.062646484375],[-5.949072265624977,57.045166015625],[-5.9873046875,57.04443359375],[-6.014746093749977,57.051953125],[-6.03437,57.201220703124996],[-6.162744140624994,57.18212890625],[-6.26611328125,57.184326171875],[-6.322705078124983,57.202490234375],[-6.362402343749977,57.2375],[-6.442431640624989,57.327490234375],[-6.675439453124994,57.362890625],[-6.741308593749977,57.412451171875],[-6.761132812499994,57.4423828125],[-6.752734374999989,57.458935546875],[-6.704199218749977,57.495751953125],[-6.643457031249994,57.4826171875],[-6.605859375,57.490673828125],[-6.5830078125,57.507128906249996],[-6.58349609375,57.520654296875],[-6.615283203124989,57.552734375],[-6.616796874999977,57.5626953125],[-6.378515624999977,57.603320312499996],[-6.357666015625,57.666796875],[-6.305957031249989,57.67197265625],[-6.246923828124977,57.651220703125],[-6.166064453124989,57.585302734375],[-6.144726562499983,57.50498046875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-7.20556640625,57.682958984375],[-7.0927734375,57.62666015625],[-7.1826171875,57.53330078125],[-7.320556640625,57.533740234374996],[-7.514746093749977,57.601953125],[-7.515625,57.615869140625],[-7.499414062499994,57.636328125],[-7.470312499999977,57.6525390625],[-7.440039062499977,57.656396484375],[-7.391894531249989,57.64521484375],[-7.324853515624994,57.663134765624996],[-7.271191406249983,57.657470703125],[-7.20556640625,57.682958984375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-7.249853515624977,57.11533203125],[-7.292041015624989,57.109765625],[-7.347412109375,57.11513671875],[-7.381494140624994,57.130664062499996],[-7.415917968749994,57.192138671875],[-7.42236328125,57.229345703125],[-7.407031249999989,57.298486328125],[-7.410546875,57.381103515625],[-7.29638671875,57.38369140625],[-7.267138671874989,57.37177734375],[-7.24755859375,57.1263671875],[-7.249853515624977,57.11533203125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-9.948144531249994,53.913378906249996],[-9.952539062499994,53.884619140625],[-10.026513671874994,53.9203125],[-10.062304687499989,53.959765625],[-10.265820312499983,53.977734375],[-10.18115234375,54.0169921875],[-10.139843749999983,54.0052734375],[-9.996337890625,54.003369140625],[-9.956152343749977,53.987353515624996],[-9.948144531249994,53.913378906249996]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-7.416894531249994,56.9654296875],[-7.504785156249994,56.95166015625],[-7.537402343749989,56.959716796875],[-7.54296875,56.97236328125],[-7.52294921875,57.006787109375],[-7.45546875,57.0189453125],[-7.406689453124983,57.000292968749996],[-7.39892578125,56.983349609375],[-7.416894531249994,56.9654296875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[21.994238281250006,60.336669921875],[21.921484375,60.332275390625],[21.818652343750017,60.3818359375],[21.8056640625,60.401220703125],[21.845996093750017,60.412451171875],[21.8193359375,60.452294921874994],[21.827246093750006,60.469921875],[21.906835937500006,60.4384765625],[21.950292968750006,60.401708984375],[21.9078125,60.3931640625],[21.979785156250017,60.355224609375],[21.994238281250006,60.336669921875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[19.66230468750001,60.187158203124994],[19.66748046875,60.16474609375],[19.629199218750017,60.170361328125],[19.59980468750001,60.1626953125],[19.579882812500017,60.13505859375],[19.536523437500023,60.144970703125],[19.51904296875,60.1845703125],[19.551367187500006,60.24384765625],[19.628808593750023,60.24609375],[19.66230468750001,60.187158203124994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[19.989550781250017,60.351171875],[20.02021484375001,60.35087890625],[20.03388671875001,60.359326171875],[20.08740234375,60.353417968749994],[20.167871093750023,60.314697265625],[20.18408203125,60.29375],[20.239550781250017,60.2830078125],[20.258886718750006,60.261279296875],[20.194726562500023,60.1935546875],[20.155078125000017,60.192285156249994],[20.12548828125,60.20087890625],[20.0732421875,60.19345703125],[20.042578125,60.1806640625],[20.032324218750006,60.152490234374994],[20.033984375000017,60.0935546875],[19.7998046875,60.08173828125],[19.745996093750023,60.098974609375],[19.672265625000023,60.2330078125],[19.686914062500023,60.267626953125],[19.73652343750001,60.282373046874994],[19.77900390625001,60.285546875],[19.785253906250006,60.21337890625],[19.84765625,60.220556640625],[19.8671875,60.268115234375],[19.87158203125,60.301611328125],[19.85468750000001,60.318505859374994],[19.812304687500017,60.331591796875],[19.78779296875001,60.354052734375],[19.823046875000017,60.390185546875],[19.88828125,60.405810546875],[19.94453125000001,60.35751953125],[19.989550781250017,60.351171875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[21.2177734375,63.24130859375],[21.228515625,63.22265625],[21.287109375,63.227783203125],[21.366015625000017,63.261767578125],[21.421972656250006,63.2458984375],[21.415625,63.19736328125],[21.37763671875001,63.19921875],[21.3671875,63.2072265625],[21.318457031250006,63.1794921875],[21.30976562500001,63.1626953125],[21.25341796875,63.152001953124994],[21.149316406250023,63.199462890625],[21.083886718750023,63.2775390625],[21.236328125,63.277734375],[21.221777343750006,63.259130859375],[21.2177734375,63.24130859375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[19.156347656250006,57.922607421875],[19.13837890625001,57.86025390625],[19.086523437500006,57.864990234375],[19.03925781250001,57.91103515625],[19.134863281250006,57.98134765625],[19.281152343750023,57.9775390625],[19.331445312500023,57.962890625],[19.156347656250006,57.922607421875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[16.52851562500001,56.29052734375],[16.477148437500006,56.240185546875],[16.431640625,56.24375],[16.401269531250023,56.310888671875],[16.394140625,56.483642578125],[16.41230468750001,56.568994140625],[16.63037109375,56.87685546875],[16.72773437500001,56.902001953125],[16.864648437500023,57.090673828125],[16.90156250000001,57.174609375],[16.9609375,57.2501953125],[16.995996093750023,57.3177734375],[17.025390625,57.345068359375],[17.089257812500023,57.332275390625],[17.11767578125,57.31982421875],[17.050390625,57.28046875],[17.058203125,57.229248046875],[17.053515625000017,57.2080078125],[16.883691406250023,56.985205078125],[16.838281250000023,56.84052734375],[16.77802734375001,56.805224609374996],[16.52851562500001,56.29052734375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[15.087695312500017,55.021875],[15.05078125,55.004931640624996],[14.885546875000017,55.032958984375],[14.684179687500006,55.10224609375],[14.713671875000017,55.238037109375],[14.765332031250011,55.296728515625],[15.132617187500017,55.14453125],[15.137109375000023,55.087158203125],[15.087695312500017,55.021875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[13.709179687500011,54.38271484375],[13.734179687500017,54.3154296875],[13.707324218750017,54.28115234375],[13.594921875000011,54.338183593749996],[13.48203125,54.33740234375],[13.41455078125,54.249560546874996],[13.364355468750006,54.245849609375],[13.190039062500006,54.325634765625],[13.162109375,54.364550781249996],[13.156347656250006,54.396923828125],[13.18125,54.508984375],[13.176660156250023,54.544238281249996],[13.2314453125,54.582763671875],[13.239941406250011,54.638427734375],[13.336816406250023,54.697119140625],[13.422753906250023,54.69931640625],[13.450097656250023,54.649609375],[13.4912109375,54.615380859375],[13.636035156250017,54.577001953125],[13.657617187500023,54.5595703125],[13.670703125000017,54.535449218749996],[13.603320312500017,54.48818359375],[13.580468750000023,54.46396484375],[13.601855468750017,54.425146484375],[13.709179687500011,54.38271484375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[12.549218750000023,54.965771484375],[12.511035156250017,54.95087890625],[12.357519531250006,54.96181640625],[12.184472656250023,54.89248046875],[12.118847656250011,54.914404296875],[12.143652343750006,54.95869140625],[12.16171875,54.9748046875],[12.219921875000011,54.993603515625],[12.2587890625,55.02109375],[12.274023437500006,55.064111328125],[12.31005859375,55.04091796875],[12.417187500000011,55.031201171875],[12.469531250000017,55.01748046875],[12.51328125,54.997314453125],[12.549218750000023,54.965771484375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[12.665722656250011,55.596533203125],[12.571582031250017,55.554003906249996],[12.550878906250006,55.55625],[12.520312500000017,55.614599609375],[12.569921875,55.65009765625],[12.59921875,55.680224609374996],[12.620019531250023,55.679345703125],[12.6484375,55.646777343749996],[12.665722656250011,55.596533203125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[11.361425781250006,54.891650390624996],[11.538378906250017,54.82958984375],[11.658105468750023,54.833154296875],[11.739550781250017,54.807421875],[11.758984375000011,54.76767578125],[11.765917968750017,54.679443359375],[11.680371093750011,54.6537109375],[11.5859375,54.662451171875],[11.457421875000023,54.628857421875],[11.035546875000023,54.773095703125],[11.041699218750011,54.893359375],[11.05859375,54.940576171875],[11.258496093750011,54.951806640625],[11.361425781250006,54.891650390624996]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[10.484375,54.84755859375],[10.417285156250017,54.837158203125],[10.340527343750011,54.858935546874996],[10.215625,54.940966796874996],[10.199902343750011,54.962744140625],[10.265527343750023,54.948828125],[10.346972656250017,54.90595703125],[10.413671875,54.896826171875],[10.5048828125,54.860546875],[10.484375,54.84755859375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[10.061230468750011,54.886376953125],[9.957128906250006,54.8724609375],[9.90390625,54.896630859375],[9.80625,54.906005859375],[9.771191406250011,55.059912109375],[9.78125,55.06904296875],[9.830371093750017,55.058251953125],[9.998828125000017,54.986474609375],[10.057714843750006,54.90791015625],[10.061230468750011,54.886376953125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[10.734082031250011,54.750732421875],[10.689746093750017,54.745068359375],[10.629492187500006,54.82607421875],[10.621679687500006,54.851416015625],[10.692480468750006,54.903271484375],[10.73828125,54.96201171875],[10.856738281250017,55.052197265625],[10.925,55.157861328125],[10.951074218750023,55.156201171875],[10.920800781250023,55.062109375],[10.765234375,54.799658203125],[10.734082031250011,54.750732421875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[10.607324218750023,55.783056640625],[10.59033203125,55.765087890625],[10.526953125,55.7837890625],[10.520312500000017,55.848486328125],[10.544335937500023,55.906591796875],[10.51611328125,55.958544921874996],[10.547167968750017,55.991943359375],[10.636328125,55.91416015625],[10.66171875,55.877587890625],[10.627343750000023,55.83388671875],[10.607324218750023,55.783056640625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[11.2828125,54.41796875],[11.129296875000023,54.416015625],[11.070703125000023,54.456005859375],[11.01171875,54.466162109375],[11.04345703125,54.515478515625],[11.0849609375,54.5333984375],[11.233593750000011,54.501269531249996],[11.2802734375,54.43837890625],[11.2828125,54.41796875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[11.052148437500023,57.2525390625],[11.011425781250011,57.2291015625],[10.873828125000017,57.262255859374996],[10.9345703125,57.30859375],[11.085742187500017,57.329931640625],[11.174511718750011,57.322900390625],[11.076855468750011,57.276904296874996],[11.052148437500023,57.2525390625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[8.307714843750006,54.786962890625],[8.28466796875,54.76708984375],[8.295703125000017,54.90830078125],[8.405175781250023,55.058740234375],[8.451464843750017,55.05537109375],[8.404101562500017,55.01474609375],[8.390429687500017,54.986279296875],[8.371191406250006,54.92939453125],[8.3798828125,54.899853515625],[8.629589843750011,54.891748046875],[8.6005859375,54.865380859375],[8.347363281250011,54.847607421875],[8.307714843750006,54.786962890625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-1.178320312499977,45.904052734375],[-1.213574218749983,45.8166015625],[-1.2802734375,45.897119140624994],[-1.368701171874989,45.967675781249994],[-1.388867187499983,46.032958984375],[-1.388671875,46.050390625],[-1.285058593749994,46.002685546875],[-1.178320312499977,45.904052734375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-1.065576171874994,50.690234375],[-1.149365234374983,50.655712890625],[-1.175830078124989,50.615234375],[-1.196093749999989,50.59921875],[-1.25146484375,50.588818359375],[-1.306298828124994,50.588525390624994],[-1.515332031249983,50.669775390625],[-1.563427734374983,50.66611328125],[-1.515673828124989,50.7033203125],[-1.385839843749977,50.733544921874994],[-1.312792968749989,50.773486328124996],[-1.144238281249983,50.734716796875],[-1.065576171874994,50.690234375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[4.886132812500023,53.070703125],[4.787109375,52.999804687499996],[4.726757812500011,53.01962890625],[4.709179687500011,53.03603515625],[4.73984375,53.09130859375],[4.886425781250011,53.18330078125],[4.886132812500023,53.070703125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[10.395117187500006,42.858154296875],[10.428320312500006,42.819189453125],[10.432226562500006,42.79658203125],[10.409960937500017,42.77099609375],[10.419335937500023,42.713183593749996],[10.335644531250011,42.761132812499994],[10.208984375,42.7369140625],[10.13125,42.742041015625],[10.109765625000023,42.785058593749994],[10.127539062500006,42.810302734375],[10.248242187500011,42.815771484375],[10.285742187500006,42.828076171875],[10.358984375,42.822314453124996],[10.395117187500006,42.858154296875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[8.478906250000023,39.067529296874994],[8.421484375,38.968652343749994],[8.3609375,39.038671875],[8.358593750000011,39.098779296874994],[8.366796875,39.11591796875],[8.440625,39.090625],[8.478906250000023,39.067529296874994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[8.286035156250023,41.03984375],[8.252734375000017,40.994140625],[8.205664062500006,40.997460937499994],[8.224023437500023,41.031298828124996],[8.267382812500017,41.09912109375],[8.320214843750023,41.121875],[8.34375,41.101611328124996],[8.318945312500006,41.062744140625],[8.286035156250023,41.03984375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[4.293652343750011,39.841845703124996],[4.275292968750023,39.8302734375],[3.967675781250023,39.945849609374996],[3.8671875,39.958740234375],[3.842675781250023,39.976367187499996],[3.845410156250011,40.036474609375],[3.853417968750023,40.063037109374996],[4.059179687500006,40.075097656249994],[4.225781250000011,40.032373046874994],[4.315136718750011,39.917236328125],[4.322070312500017,39.897509765624996],[4.293652343750011,39.841845703124996]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[1.593945312500011,38.6720703125],[1.571191406250023,38.658837890624994],[1.504980468750006,38.67099609375],[1.40576171875,38.67099609375],[1.401953125,38.71142578125],[1.417187500000011,38.739648437499994],[1.436328125000017,38.768212890624994],[1.496875,38.7119140625],[1.592675781250023,38.701464843749996],[1.593945312500011,38.6720703125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[1.445214843750023,38.918701171875],[1.408984375000017,38.857275390625],[1.256933593750006,38.87900390625],[1.223339843750011,38.903857421874996],[1.25625,38.973388671875],[1.2998046875,38.981738281249996],[1.302539062500017,39.031152343749994],[1.3486328125,39.080810546875],[1.564453125,39.121044921875],[1.613183593750023,39.08740234375],[1.623632812500006,39.038818359375],[1.494531250000023,38.932519531249994],[1.445214843750023,38.918701171875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-31.137109375,39.40693359375],[-31.181347656249983,39.358935546874996],[-31.25761718749999,39.3759765625],[-31.282958984375,39.394091796874996],[-31.260839843750006,39.49677734375],[-31.199853515624994,39.520849609375],[-31.138623046874983,39.479443359375],[-31.137109375,39.40693359375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-27.07524414062499,38.643457031249994],[-27.0953125,38.634033203125],[-27.302832031250006,38.661035156249994],[-27.361914062500006,38.6978515625],[-27.385937499999983,38.7658203125],[-27.351025390624983,38.788964843749994],[-27.259667968749994,38.802685546875],[-27.12700195312499,38.78984375],[-27.041943359374983,38.7412109375],[-27.0419921875,38.67890625],[-27.07524414062499,38.643457031249994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-27.778466796874994,38.555615234375],[-27.825878906249983,38.5435546875],[-28.09233398437499,38.620556640625],[-28.187255859375,38.65537109375],[-28.310644531250006,38.743896484375],[-27.962646484375,38.636328125],[-27.778466796874994,38.555615234375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-28.641308593749983,38.525],[-28.743847656249983,38.522363281249994],[-28.842041015625,38.5984375],[-28.69775390625,38.638476562499996],[-28.655419921874994,38.6140625],[-28.624218749999983,38.586328125],[-28.605810546875006,38.550732421875],[-28.641308593749983,38.525]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-28.14726562499999,38.452685546874996],[-28.064794921875006,38.412744140624994],[-28.18974609374999,38.404150390625],[-28.231152343749983,38.384667968749994],[-28.332421875,38.412890625],[-28.454492187499994,38.408642578125],[-28.531152343749994,38.462548828124994],[-28.548828125,38.5185546875],[-28.51025390625,38.553027343749996],[-28.40214843749999,38.553369140624994],[-28.14726562499999,38.452685546874996]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-25.64897460937499,37.84091796875],[-25.58549804687499,37.834033203124996],[-25.2666015625,37.8486328125],[-25.18193359374999,37.837890625],[-25.19072265624999,37.76435546875],[-25.251123046874994,37.735009765624994],[-25.43901367187499,37.71533203125],[-25.734472656249977,37.762890625],[-25.833691406249983,37.826074218749994],[-25.847851562499983,37.872412109375],[-25.845898437499983,37.89404296875],[-25.78374023437499,37.9111328125],[-25.64897460937499,37.84091796875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[14.566210937500017,35.852734375],[14.53271484375,35.820214843749994],[14.436425781250023,35.821679687499994],[14.352343750000017,35.872265625],[14.351269531250011,35.978417968749994],[14.448339843750006,35.957421875],[14.537011718750023,35.886279296874996],[14.566210937500017,35.852734375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[15.231054687500006,44.062304687499996],[15.246679687500006,44.02705078125],[15.121875,44.093310546874996],[15.074609375000023,44.137841796874994],[15.065820312500023,44.157666015625],[15.231054687500006,44.062304687499996]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[14.810253906250011,44.97705078125],[14.68701171875,44.955615234374996],[14.628320312500023,44.993945312499996],[14.612988281250011,45.025439453124996],[14.51171875,45.035400390625],[14.450390625000011,45.07919921875],[14.437890625000023,45.0986328125],[14.524609375000011,45.146826171875],[14.571093750000017,45.224755859374994],[14.629980468750006,45.178027343749996],[14.701171875,45.0900390625],[14.739160156250023,45.065478515624996],[14.810253906250011,44.97705078125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[14.831445312500023,44.758935546874994],[14.856640625000011,44.71484375],[14.7625,44.754638671875],[14.67822265625,44.769873046875],[14.660351562500011,44.7998046875],[14.672460937500006,44.824365234374994],[14.690527343750006,44.84814453125],[14.754199218750017,44.84482421875],[14.763769531250006,44.82138671875],[14.831445312500023,44.758935546874994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[15.1884765625,44.335742187499996],[15.16259765625,44.3091796875],[15.097949218750017,44.358154296875],[15.03857421875,44.393017578125],[14.99609375,44.434326171875],[14.912792968750011,44.48583984375],[14.884667968750023,44.544726562499996],[14.760449218750011,44.66474609375],[14.741894531250011,44.69736328125],[14.803808593750006,44.648681640625],[14.855371093750023,44.61826171875],[14.898046875,44.61083984375],[15.006445312500006,44.534228515624996],[15.112988281250011,44.4357421875],[15.239941406250011,44.3501953125],[15.213574218750011,44.347558593749994],[15.1884765625,44.335742187499996]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[15.188769531250017,43.92236328125],[15.203027343750023,43.90771484375],[15.20166015625,43.897753906249996],[15.149804687500023,43.91181640625],[15.135839843750006,43.907275390624996],[14.891308593750011,44.125537109374996],[14.865039062500017,44.16796875],[14.952539062500023,44.1171875],[15.188769531250017,43.92236328125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[15.371386718750017,43.973828125],[15.437207031250011,43.89951171875],[15.374218750000011,43.914794921875],[15.30859375,43.960791015625],[15.27001953125,44.0107421875],[15.371386718750017,43.973828125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[14.488085937500017,44.660058593749994],[14.480371093750023,44.621240234374994],[14.41953125,44.6703125],[14.388867187500011,44.75830078125],[14.312402343750023,44.900390625],[14.302539062500017,44.9404296875],[14.342187500000023,44.979931640625],[14.340039062500011,45.019970703125],[14.285839843750011,45.14462890625],[14.33125,45.164990234375],[14.358203125000017,45.167431640625],[14.369140625,45.080957031249994],[14.39375,45.03125],[14.467382812500006,44.97021484375],[14.452539062500023,44.869189453124996],[14.467578125000017,44.725341796875],[14.482519531250006,44.693359375],[14.488085937500017,44.660058593749994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[17.607812500000023,42.76904296875],[17.744238281250006,42.700341796874994],[17.344140625000023,42.790380859375],[17.389550781250023,42.798632812499996],[17.431933593750017,42.800390625],[17.607812500000023,42.76904296875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[20.6123046875,38.383349609374996],[20.62470703125001,38.267871093749996],[20.695214843750023,38.24619140625],[20.788867187500017,38.14208984375],[20.78076171875,38.088818359375],[20.761328125,38.070556640625],[20.60615234375001,38.1197265625],[20.568945312500006,38.09765625],[20.523535156250006,38.106640625],[20.495507812500023,38.16416015625],[20.49873046875001,38.184375],[20.47333984375001,38.218798828124996],[20.4521484375,38.234179687499996],[20.391015625000023,38.188427734375],[20.3525390625,38.1798828125],[20.35224609375001,38.221728515624996],[20.40869140625,38.336767578125],[20.43505859375,38.356201171875],[20.4814453125,38.318212890625],[20.519628906250006,38.332324218749996],[20.54833984375,38.39453125],[20.55029296875,38.45654296875],[20.56318359375001,38.474951171875],[20.6123046875,38.383349609374996]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[20.888476562500017,37.80537109375],[20.993945312500017,37.7080078125],[20.909082031250023,37.73212890625],[20.81855468750001,37.66474609375],[20.70380859375001,37.743457031249996],[20.635058593750017,37.823144531249994],[20.619531250000023,37.855029296874996],[20.691503906250006,37.929541015625],[20.758691406250023,37.852978515625],[20.83984375,37.840722656249994],[20.888476562500017,37.80537109375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[20.68671875000001,38.608691406249996],[20.647851562500023,38.600976562499994],[20.614355468750006,38.60625],[20.583984375,38.601708984374994],[20.5546875,38.582568359374996],[20.557910156250017,38.661865234375],[20.59248046875001,38.76015625],[20.634667968750023,38.817578125],[20.694140625000017,38.84423828125],[20.719628906250023,38.799169921875],[20.71484375,38.638330078124994],[20.68671875000001,38.608691406249996]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[20.758691406250023,38.329443359375],[20.709277343750017,38.318603515625],[20.646386718750023,38.414306640625],[20.623632812500006,38.480322265625],[20.649707031250017,38.483984375],[20.6748046875,38.476318359375],[20.701269531250006,38.451416015625],[20.701074218750023,38.425927734374994],[20.71162109375001,38.3986328125],[20.739160156250023,38.365771484374996],[20.758691406250023,38.329443359375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[20.077929687500017,39.43271484375],[20.099609375,39.376611328124994],[19.975,39.411425781249996],[19.88398437500001,39.4615234375],[19.808886718750017,39.585302734375],[19.64892578125,39.726171875],[19.646484375,39.76708984375],[19.707324218750017,39.798095703125],[19.83857421875001,39.820117187499996],[19.891699218750006,39.797265625],[19.926074218750017,39.773730468749996],[19.936816406250017,39.746728515624994],[19.862207031250023,39.692626953125],[19.8466796875,39.668115234374994],[19.904101562500017,39.619482421875],[19.903125,39.6],[19.92734375,39.505908203124996],[19.95527343750001,39.47041015625],[20.027734375000023,39.44208984375],[20.077929687500017,39.43271484375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[23.55097656250001,37.92587890625],[23.51142578125001,37.901171875],[23.466796875,37.902392578124996],[23.43525390625001,37.911474609375],[23.419335937500023,37.93125],[23.4390625,37.940673828125],[23.462207031250017,37.980371093749994],[23.483691406250017,37.991113281249994],[23.515527343750023,37.98603515625],[23.53486328125001,37.97021484375],[23.55097656250001,37.92587890625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[23.053808593750006,36.189794921875],[23.04218750000001,36.146386718749994],[22.939453125,36.176220703125],[22.91083984375001,36.220996093749996],[22.905664062500023,36.3203125],[22.9326171875,36.36875],[22.950488281250017,36.383935546874994],[22.997851562500017,36.328125],[23.097070312500023,36.24658203125],[23.053808593750006,36.189794921875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[3.949121093750023,51.739453125],[4.046777343750023,51.684912109375],[4.067578125000011,51.66748046875],[4.075097656250023,51.648779296875],[3.950976562500017,51.62705078125],[3.819042968750011,51.693994140625],[3.731835937500023,51.67822265625],[3.699023437500017,51.709912109375],[3.698535156250017,51.7296875],[3.7890625,51.746435546875],[3.949121093750023,51.739453125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-51.013671875,69.552490234375],[-51.17041015625,69.517138671875],[-51.202050781249994,69.525],[-51.233984375,69.55185546875],[-51.31489257812498,69.674072265625],[-51.3388671875,69.73203125],[-51.318945312500006,69.804052734375],[-51.35029296874998,69.85478515625],[-51.208886718749994,69.913916015625],[-51.094580078125006,69.924169921875],[-50.94023437499999,69.90869140625],[-50.67900390624999,69.84853515625],[-50.697900390624994,69.829052734375],[-50.75439453125,69.79765625],[-50.91171875,69.756689453125],[-50.96723632812498,69.6642578125],[-50.977880859375006,69.617822265625],[-50.97041015624998,69.5830078125],[-51.013671875,69.552490234375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-37.03125,65.531982421875],[-37.18681640624999,65.53134765625],[-37.238427734374994,65.60986328125],[-37.222900390625,65.695458984375],[-37.047509765624994,65.722265625],[-36.95307617187498,65.663330078125],[-36.986914062500006,65.5755859375],[-37.03125,65.531982421875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-53.53520507812499,71.0408203125],[-53.628808593749994,71.03427734375],[-53.89755859374999,71.08515625],[-53.941162109375,71.104296875],[-53.95781249999999,71.127734375],[-53.9474609375,71.155517578125],[-53.86186523437499,71.2072265625],[-53.70097656249999,71.2830078125],[-53.58447265625,71.2970703125],[-53.512353515624994,71.249609375],[-53.44140625,71.18583984375],[-53.43212890625,71.15341796875],[-53.436914062499994,71.115234375],[-53.45546875,71.08291015625],[-53.48779296875,71.056298828125],[-53.53520507812499,71.0408203125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-55.01689453124999,72.79111328125],[-55.158203125,72.723291015625],[-55.273583984374994,72.684326171875],[-55.5236328125,72.568408203125],[-55.5666015625,72.56435546875],[-55.63413085937499,72.579443359375],[-55.6865234375,72.609912109375],[-55.781005859375,72.617236328125],[-55.813916015625,72.636474609375],[-55.8271484375,72.6521484375],[-55.869042968749994,72.662109375],[-55.935693359374994,72.668359375],[-56.04267578125,72.6564453125],[-56.140869140625,72.66845703125],[-56.214794921875,72.719189453125],[-56.078076171875,72.75322265625],[-55.993554687499994,72.782275390625],[-55.666455078125,72.793701171875],[-55.57421875,72.78037109375],[-55.516259765624994,72.780712890625],[-55.4279296875,72.788623046875],[-55.23466796874999,72.8248046875],[-55.205810546875,72.841650390625],[-55.03300781249999,72.8205078125],[-55.01689453124999,72.79111328125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-51.675146484375006,70.855224609375],[-51.808691406250006,70.8525390625],[-52.119384765625,70.870654296875],[-52.144189453124994,70.882275390625],[-52.148046875,70.90439453125],[-52.10673828124999,70.968017578125],[-51.969824218750006,70.97646484375],[-51.80693359374999,70.941650390625],[-51.63134765625,70.892138671875],[-51.60693359375,70.86884765625],[-51.675146484375006,70.855224609375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-46.266699218750006,60.781396484374994],[-46.38154296874998,60.660302734374994],[-46.496337890625,60.686669921874994],[-46.553125,60.740771484375],[-46.66621093749998,60.76591796875],[-46.7880859375,60.7583984375],[-46.78999023437498,60.779833984375],[-46.393896484375006,60.9087890625],[-46.205224609374994,60.943505859374994],[-46.218603515625006,60.88916015625],[-46.254492187500006,60.841552734375],[-46.266699218750006,60.781396484374994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-126.09208984374999,49.35400390625],[-126.06401367187499,49.263623046875],[-126.18681640624999,49.278125],[-126.229638671875,49.295654296875],[-126.2314453125,49.3390625],[-126.20854492187499,49.379785156249994],[-126.11528320312499,49.365039062499996],[-126.09208984374999,49.35400390625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-122.394140625,47.395263671875],[-122.39873046874999,47.372509765625],[-122.437109375,47.354785156249996],[-122.456982421875,47.359326171875],[-122.458203125,47.386132812499994],[-122.46855468749999,47.390234375],[-122.509912109375,47.3580078125],[-122.5068359375,47.421679687499996],[-122.486474609375,47.48876953125],[-122.468603515625,47.489990234375],[-122.44208984375,47.446142578125],[-122.394140625,47.395263671875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-122.497265625,47.594580078125],[-122.50263671875,47.575439453125],[-122.5578125,47.598291015624994],[-122.575927734375,47.619482421875],[-122.57373046875,47.666845703125],[-122.56010742187499,47.69775390625],[-122.549755859375,47.703955078125],[-122.517236328125,47.690576171874994],[-122.50786132812499,47.682666015624996],[-122.497265625,47.594580078125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-122.78212890625,48.672705078125],[-122.76884765624999,48.6509765625],[-122.808984375,48.629833984375],[-122.83759765625,48.6265625],[-122.88310546874999,48.66064453125],[-122.90302734375,48.664697265624994],[-122.88701171874999,48.6123046875],[-122.892529296875,48.594482421875],[-122.98564453124999,48.626708984375],[-123.00283203125,48.652197265625],[-122.97666015625,48.679150390625],[-122.91801757812499,48.706982421875],[-122.897705078125,48.710351562499994],[-122.78212890625,48.672705078125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-122.8208984375,48.43134765625],[-122.836572265625,48.421533203124994],[-122.8900390625,48.43466796875],[-122.921630859375,48.456933593749994],[-122.932275390625,48.484765625],[-122.91220703125,48.537988281249994],[-122.885498046875,48.551611328125],[-122.868896484375,48.548632812499996],[-122.8619140625,48.501855468749994],[-122.814599609375,48.45234375],[-122.8208984375,48.43134765625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-123.013134765625,48.500878906249994],[-122.986767578125,48.468017578125],[-123.09443359375,48.4890625],[-123.13994140624999,48.507958984374994],[-123.15341796875,48.526318359375],[-123.169580078125,48.58671875],[-123.16215820312499,48.606396484375],[-123.11416015625,48.61328125],[-123.024169921875,48.538476562499994],[-123.013134765625,48.500878906249994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-122.57275390625,48.156640625],[-122.523828125,48.025439453124996],[-122.50283203125,48.080078125],[-122.36674804687499,47.98544921875],[-122.3666015625,47.938818359375],[-122.383154296875,47.923193359375],[-122.41142578124999,47.917724609375],[-122.43759765625,47.93134765625],[-122.46162109375,47.964013671874994],[-122.49228515625,47.981298828125],[-122.55751953125,47.992480468749996],[-122.59135742187499,48.029638671875],[-122.603173828125,48.055029296875],[-122.606298828125,48.128564453124994],[-122.62265625,48.151416015624996],[-122.65727539062499,48.156494140625],[-122.690380859375,48.173876953124996],[-122.74150390624999,48.22529296875],[-122.74873046875,48.239013671875],[-122.72451171875,48.280908203124994],[-122.66899414062499,48.351025390625],[-122.62861328125,48.384228515625],[-122.603515625,48.380615234375],[-122.5724609375,48.3595703125],[-122.535546875,48.321191406249994],[-122.542431640625,48.293994140624996],[-122.692138671875,48.241064453125],[-122.697021484375,48.228662109374994],[-122.6244140625,48.213769531249994],[-122.597607421875,48.200439453125],[-122.57275390625,48.156640625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-124.153662109375,49.531152343749994],[-124.139794921875,49.5103515625],[-124.3623046875,49.588183593749996],[-124.4572265625,49.634228515625],[-124.49394531249999,49.66748046875],[-124.517822265625,49.686328125],[-124.63095703125,49.735693359375],[-124.649853515625,49.758349609374996],[-124.623291015625,49.77509765625],[-124.54716796874999,49.764941406249996],[-124.421484375,49.727783203125],[-124.30913085937499,49.667285156249996],[-124.153662109375,49.531152343749994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-123.37236328124999,48.886132812499994],[-123.38481445312499,48.8751953125],[-123.541015625,48.945947265624994],[-123.64560546875,49.038623046874996],[-123.68925781249999,49.095117187499994],[-123.48232421875,48.9546875],[-123.3779296875,48.908251953124996],[-123.37236328124999,48.886132812499994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-123.435400390625,48.754443359374996],[-123.47724609375,48.728759765625],[-123.499609375,48.732177734375],[-123.517529296875,48.750146484374994],[-123.58232421874999,48.92578125],[-123.5546875,48.9220703125],[-123.46787109375,48.8673828125],[-123.487548828125,48.845703125],[-123.42275390625,48.793359375],[-123.40678710937499,48.7560546875],[-123.435400390625,48.754443359374996]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-124.977734375,50.029589843749996],[-125.0015625,50.020751953125],[-125.0259765625,50.134082031249996],[-124.99565429687499,50.175195312499994],[-124.98701171875,50.195849609374996],[-124.9908203125,50.217138671875],[-124.937841796875,50.165917968749994],[-124.91640625,50.13154296875],[-124.907470703125,50.083984375],[-124.908447265625,50.0712890625],[-124.977734375,50.029589843749996]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-126.6412109375,49.605810546875],[-126.680419921875,49.601367187499996],[-126.743408203125,49.6134765625],[-126.814208984375,49.64208984375],[-126.93857421875,49.71845703125],[-126.95126953125,49.735693359375],[-126.9400390625,49.75048828125],[-126.9048828125,49.76279296875],[-126.896875,49.78291015625],[-126.92583007812499,49.837744140625],[-126.82607421875,49.872363281249996],[-126.738134765625,49.843652343749994],[-126.69814453125,49.808496093749994],[-126.64990234375,49.74580078125],[-126.628173828125,49.675146484375],[-126.62578124999999,49.626806640625],[-126.6412109375,49.605810546875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-125.18413085937499,50.097119140625],[-125.19511718749999,50.044335937499994],[-125.25957031249999,50.130029296874994],[-125.35844726562499,50.3115234375],[-125.3453125,50.353955078125],[-125.301171875,50.4140625],[-125.2609375,50.417822265625],[-125.19599609375,50.38974609375],[-125.139501953125,50.339697265625],[-125.12646484375,50.320263671875],[-125.09140625,50.2677734375],[-125.07402343749999,50.220654296875],[-125.11298828125,50.163476562499994],[-125.18413085937499,50.097119140625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-118.35039062499999,32.827587890625],[-118.40859375,32.818505859374994],[-118.47319335937499,32.838916015624996],[-118.52890625,32.935595703124996],[-118.590185546875,33.011181640625],[-118.557080078125,33.032666015625],[-118.507470703125,32.959912109375],[-118.383203125,32.849462890625],[-118.35039062499999,32.827587890625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-118.2427734375,28.941943359374996],[-118.285498046875,28.903759765624997],[-118.40009765625,29.1123046875],[-118.4013671875,29.162744140624994],[-118.367822265625,29.18759765625],[-118.31230468749999,29.182861328125],[-118.31206054687499,29.130517578124994],[-118.26552734375,29.08642578125],[-118.24736328124999,29.043359375],[-118.2427734375,28.941943359374996]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-120.0435546875,33.918847656249994],[-120.113916015625,33.9048828125],[-120.167138671875,33.91806640625],[-120.251904296875,34.0138671875],[-120.07182617187499,34.026513671874994],[-119.994384765625,33.984912109374996],[-119.98393554687499,33.97333984375],[-120.0435546875,33.918847656249994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-119.88237304687499,34.0796875],[-119.678857421875,34.028466796874994],[-119.56914062499999,34.052978515625],[-119.549267578125,34.028173828125],[-119.56220703125,34.006591796875],[-119.8095703125,33.9677734375],[-119.885498046875,33.994921875],[-119.892431640625,34.032177734375],[-119.91806640625,34.067822265625],[-119.88237304687499,34.0796875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-118.34794921874999,33.3857421875],[-118.2974609375,33.312109375],[-118.37021484375,33.321240234375],[-118.4462890625,33.31708984375],[-118.4693359375,33.35712890625],[-118.492041015625,33.41279296875],[-118.50732421875,33.427001953125],[-118.559423828125,33.431982421875],[-118.563330078125,33.437060546874996],[-118.56943359375,33.464160156249996],[-118.554833984375,33.477099609374996],[-118.39169921875,33.415087890624996],[-118.34794921874999,33.3857421875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-71.36533203124999,41.485253906249994],[-71.39306640625,41.466748046875],[-71.40341796874999,41.515039062499994],[-71.383984375,41.570556640625],[-71.36430664062499,41.571826171874996],[-71.3544921875,41.542285156249996],[-71.36533203124999,41.485253906249994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-74.133203125,39.68076171875],[-74.25048828125,39.52939453125],[-74.253173828125,39.558496093749994],[-74.10673828124999,39.746435546875],[-74.133203125,39.68076171875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-74.188134765625,40.522851562499994],[-74.23588867187499,40.518701171874994],[-74.18818359375,40.614599609375],[-74.10048828125,40.658447265625],[-74.06875,40.649316406249994],[-74.0673828125,40.6154296875],[-74.0796875,40.586474609374996],[-74.13852539062499,40.541845703125],[-74.188134765625,40.522851562499994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-64.73027343749999,32.29345703125],[-64.82011718749999,32.259619140625],[-64.84506835937499,32.2623046875],[-64.86284179687499,32.273876953125],[-64.77119140625,32.30771484375],[-64.69462890624999,32.3869140625],[-64.66831054687499,32.38193359375],[-64.73027343749999,32.29345703125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-70.509912109375,41.376318359375],[-70.785302734375,41.327441406249996],[-70.82919921874999,41.358984375],[-70.760498046875,41.373583984374996],[-70.67373046875,41.448535156249996],[-70.61601562499999,41.4572265625],[-70.525341796875,41.414794921875],[-70.509912109375,41.376318359375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-71.24140625,41.491943359375],[-71.29091796875,41.464599609375],[-71.34624023437499,41.469384765624994],[-71.31816406249999,41.506298828125],[-71.30747070312499,41.560498046875],[-71.28017578125,41.620019531249994],[-71.26445312499999,41.638232421874996],[-71.23203125,41.654296875],[-71.24140625,41.491943359375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-69.9779296875,41.265576171875],[-70.055078125,41.249462890625],[-70.233056640625,41.286328125],[-70.08662109375,41.317578125],[-70.0626953125,41.328466796875],[-70.043603515625,41.374414062499994],[-70.0412109375,41.3974609375],[-69.985595703125,41.298632812499996],[-69.9779296875,41.265576171875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-75.78193359375,35.190185546875],[-75.96367187499999,35.11884765625],[-75.98417968749999,35.123095703124996],[-75.86494140625,35.174121093749996],[-75.78193359375,35.190185546875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-75.635693359375,35.855908203125],[-75.65078125,35.835595703124994],[-75.7171875,35.946142578125],[-75.648876953125,35.910400390625],[-75.636669921875,35.880664062499996],[-75.635693359375,35.855908203125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-75.33305664062499,37.88828125],[-75.378515625,37.8720703125],[-75.2259765625,38.072314453124996],[-75.13740234375,38.240087890625],[-75.097900390625,38.298095703125],[-75.13623046875,38.180517578125],[-75.20322265624999,38.072412109374994],[-75.33305664062499,37.88828125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-75.544140625,35.240087890625],[-75.67827148437499,35.212841796875],[-75.690087890625,35.221582031249994],[-75.536376953125,35.278613281249996],[-75.487890625,35.4794921875],[-75.48125,35.572119140625],[-75.504296875,35.735400390624996],[-75.503515625,35.769140625],[-75.478515625,35.71650390625],[-75.4564453125,35.56416015625],[-75.46474609375,35.448632812499994],[-75.50932617187499,35.280322265624996],[-75.544140625,35.240087890625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-76.503662109375,34.64296875],[-76.528564453125,34.631494140624994],[-76.43701171875,34.75634765625],[-76.25620117187499,34.914697265624994],[-76.20737304687499,34.938916015625],[-76.35771484374999,34.803662109375],[-76.503662109375,34.64296875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-96.764404296875,28.152587890625],[-96.80112304687499,28.1484375],[-96.755615234375,28.202441406249996],[-96.681640625,28.2296875],[-96.51933593749999,28.333447265624997],[-96.453125,28.340576171875],[-96.41865234375,28.376318359375],[-96.403564453125,28.381591796875],[-96.413330078125,28.337792968749994],[-96.543896484375,28.275585937499997],[-96.764404296875,28.152587890625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-97.35361328124999,27.300048828125],[-97.38481445312499,27.242529296875],[-97.376220703125,27.328271484374994],[-97.29501953124999,27.523095703124994],[-97.130029296875,27.779150390625],[-97.060546875,27.822021484375],[-97.25087890625,27.541210937499997],[-97.35361328124999,27.300048828125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-95.039697265625,29.145898437499994],[-95.08964843749999,29.136328125],[-94.87167968749999,29.29013671875],[-94.82597656249999,29.34130859375],[-94.76762695312499,29.3390625],[-94.86494140625,29.252880859374997],[-95.039697265625,29.145898437499994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-97.17070312499999,26.159375],[-97.184521484375,26.112939453124994],[-97.267333984375,26.329785156249997],[-97.402099609375,26.820507812499997],[-97.407177734375,27.1001953125],[-97.385986328125,27.196484375],[-97.351220703125,26.801464843749997],[-97.20224609374999,26.2998046875],[-97.17070312499999,26.159375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-84.90791015625,29.642626953124996],[-85.008251953125,29.606640625],[-85.11674804687499,29.6328125],[-85.04931640625,29.63779296875],[-85.00053710937499,29.627197265625],[-84.87700195312499,29.678662109374997],[-84.81220703125,29.717626953125],[-84.73715820312499,29.732421875],[-84.90791015625,29.642626953124996]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-81.41899414062499,30.971435546875],[-81.46347656249999,30.727783203125],[-81.48271484374999,30.8140625],[-81.484619140625,30.897851562499994],[-81.450927734375,30.947412109374994],[-81.41899414062499,30.971435546875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-89.22397460937499,30.08408203125],[-89.220458984375,30.03759765625],[-89.26943359375,30.060742187499997],[-89.3419921875,30.062841796875],[-89.31005859375,30.0787109375],[-89.28764648437499,30.094189453124997],[-89.27646484374999,30.11083984375],[-89.18466796874999,30.168652343749997],[-89.210693359375,30.126220703125],[-89.22397460937499,30.08408203125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-91.793701171875,29.500732421875],[-91.83085937499999,29.486474609374994],[-91.996240234375,29.573095703125],[-92.00664062499999,29.610302734374997],[-91.925048828125,29.643945312499994],[-91.875244140625,29.640966796875],[-91.796484375,29.596972656249996],[-91.76767578124999,29.584716796875],[-91.754296875,29.56689453125],[-91.7619140625,29.539013671874997],[-91.793701171875,29.500732421875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-88.82744140624999,29.80771484375],[-88.8556640625,29.77587890625],[-88.82797851562499,29.928369140624994],[-88.86689453125,30.05673828125],[-88.82587890625,30.000390625],[-88.81259765624999,29.933349609375],[-88.82744140624999,29.80771484375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-77.65771484375,24.249462890624997],[-77.65615234375,24.2265625],[-77.7552734375,24.163476562499994],[-77.683251953125,24.118457031250003],[-77.615380859375,24.216357421875003],[-77.5615234375,24.13681640624999],[-77.53203124999999,23.98764648437499],[-77.53681640625,23.961669921875],[-77.531884765625,23.939404296874997],[-77.52133789062499,23.910839843749997],[-77.51875,23.869433593750003],[-77.57373046875,23.739160156249994],[-77.77128906249999,23.75253906249999],[-77.77578125,23.862353515625003],[-77.806298828125,23.883544921875],[-77.85224609375,24.04038085937499],[-77.9140625,24.09091796874999],[-77.99990234375,24.21982421874999],[-77.95004882812499,24.253076171874994],[-77.88359374999999,24.241992187500003],[-77.849560546875,24.257519531249997],[-77.757421875,24.269921875],[-77.70146484374999,24.287548828124997],[-77.65771484375,24.249462890624997]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-77.66899414062499,21.951953125],[-77.71005859374999,21.921337890624997],[-77.755029296875,21.965576171875],[-77.783642578125,21.970410156249997],[-77.823193359375,21.987939453124994],[-77.9,22.037158203125003],[-77.91855468749999,22.088085937499997],[-77.854736328125,22.091943359374994],[-77.7744140625,22.082958984374997],[-77.63369140625,22.054003906250003],[-77.64599609375,21.996484375],[-77.66899414062499,21.951953125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-78.027099609375,22.28515625],[-78.047509765625,22.268505859374997],[-78.10166015624999,22.30576171874999],[-78.18002929687499,22.321972656249997],[-78.22612304687499,22.37998046874999],[-78.27001953125,22.402246093749994],[-78.27353515624999,22.423583984375],[-78.20097656249999,22.437646484374994],[-78.1505859375,22.43149414062499],[-78.094140625,22.38720703125],[-78.061669921875,22.305908203125],[-78.027099609375,22.28515625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-78.630126953125,22.55224609375],[-78.49287109375,22.531054687500003],[-78.4453125,22.54375],[-78.399560546875,22.54746093749999],[-78.351220703125,22.538623046875003],[-78.28388671875,22.45546875],[-78.343017578125,22.445117187500003],[-78.38994140624999,22.445117187500003],[-78.424560546875,22.460107421874994],[-78.54765624999999,22.464013671874994],[-78.62900390624999,22.488183593749994],[-78.67363281249999,22.508837890625003],[-78.6955078125,22.533984375],[-78.630126953125,22.55224609375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-77.22563476562499,25.904199218749994],[-77.24643554687499,25.895458984374997],[-77.333251953125,25.99560546875],[-77.40317382812499,26.024707031249996],[-77.2939453125,26.095507812499996],[-77.24677734375,26.15634765625],[-77.24775390625,26.2890625],[-77.22109375,26.361767578124997],[-77.230126953125,26.424707031249994],[-77.2060546875,26.488964843749997],[-77.23862304687499,26.5611328125],[-77.32993164062499,26.618359375],[-77.51059570312499,26.845996093749996],[-77.79599609374999,26.901269531249994],[-77.94375,26.903564453125],[-77.862548828125,26.940087890624994],[-77.787548828125,26.93564453125],[-77.672119140625,26.913916015625],[-77.53388671875,26.90341796875],[-77.4494140625,26.83642578125],[-77.36875,26.747607421874996],[-77.2958984375,26.711669921875],[-77.26591796874999,26.688818359375],[-77.269287109375,26.663037109374997],[-77.25717773437499,26.638818359374994],[-77.162109375,26.597265625],[-77.066357421875,26.530175781249994],[-77.03828125,26.333447265624997],[-77.16728515624999,26.24033203125],[-77.191015625,25.95546875],[-77.22563476562499,25.904199218749994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-74.05751953125,22.72348632812499],[-74.034765625,22.70556640625],[-74.098583984375,22.665429687499994],[-74.24223632812499,22.715087890625],[-74.274609375,22.711669921875],[-74.303125,22.764453125],[-74.31396484375,22.80356445312499],[-74.30703125,22.839599609375],[-74.22148437499999,22.811572265625003],[-74.175390625,22.759912109374994],[-74.05751953125,22.72348632812499]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-74.429443359375,24.068066406249997],[-74.50869140625,23.959716796875],[-74.550927734375,23.968945312499997],[-74.52690429687499,24.105078125],[-74.47202148437499,24.126660156249997],[-74.45048828124999,24.12548828125],[-74.429443359375,24.068066406249997]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-73.02685546875,21.1923828125],[-73.058740234375,21.119042968749994],[-73.16455078125,20.979150390624994],[-73.40078125,20.943896484375003],[-73.66103515625,20.937402343749994],[-73.68115234375,20.9755859375],[-73.68681640624999,21.00913085937499],[-73.66782226562499,21.061572265625003],[-73.669580078125,21.082226562499997],[-73.68037109375,21.103320312500003],[-73.58505859374999,21.125927734374997],[-73.523095703125,21.190820312499994],[-73.42451171875,21.20175781249999],[-73.30156249999999,21.156152343749994],[-73.2353515625,21.154492187499997],[-73.13730468749999,21.204785156249997],[-73.05849609375,21.313378906249994],[-73.011669921875,21.299511718749997],[-73.02685546875,21.1923828125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-74.20673828125,22.213769531249994],[-74.27690429687499,22.18369140624999],[-74.261328125,22.235546875],[-74.12675781249999,22.323388671874994],[-74.05234375,22.400634765625],[-74.01005859374999,22.427978515625],[-73.99497070312499,22.44921875],[-73.935986328125,22.477734375],[-73.906396484375,22.52744140624999],[-73.91455078125,22.568017578124994],[-73.97636718749999,22.635058593750003],[-73.97548828125,22.682275390624994],[-73.95419921874999,22.715527343749997],[-73.84995117187499,22.73105468749999],[-73.87749023437499,22.68076171874999],[-73.83652343749999,22.53842773437499],[-73.974609375,22.36118164062499],[-74.092919921875,22.30625],[-74.20673828125,22.213769531249994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-76.648828125,25.48740234374999],[-76.48422851562499,25.374609375],[-76.34379882812499,25.33203125],[-76.19199218749999,25.190820312499994],[-76.126611328125,25.140527343749994],[-76.11494140625,25.0947265625],[-76.14052734375,24.885644531249994],[-76.17465820312499,24.759765625],[-76.16953125,24.6494140625],[-76.20517578124999,24.682080078124997],[-76.2412109375,24.754345703124997],[-76.30029296875,24.7958984375],[-76.319970703125,24.817675781250003],[-76.21376953125,24.822460937499997],[-76.204345703125,24.936230468749997],[-76.1525390625,25.02597656249999],[-76.160400390625,25.119335937499997],[-76.284326171875,25.222119140624997],[-76.369287109375,25.31259765624999],[-76.49990234375,25.341552734375],[-76.620703125,25.431640625],[-76.6927734375,25.44272460937499],[-76.7806640625,25.42685546874999],[-76.74892578125,25.48056640624999],[-76.726953125,25.55161132812499],[-76.71083984375,25.564892578124997],[-76.648828125,25.48740234374999]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-75.66455078125,23.450146484374997],[-75.70634765624999,23.444238281249994],[-75.781005859375,23.470654296874997],[-75.95595703125,23.59228515625],[-76.037109375,23.602783203125],[-76.01044921875,23.67138671875],[-75.9486328125,23.647412109374997],[-75.80751953125,23.542529296875003],[-75.75424804687499,23.489990234375],[-75.66455078125,23.450146484374997]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-74.840478515625,22.894335937500003],[-74.846875,22.868701171875003],[-74.97333984375,23.068554687499997],[-75.13212890624999,23.117089843749994],[-75.22333984375,23.165332031250003],[-75.20439453124999,23.19272460937499],[-75.14111328125,23.204638671875003],[-75.13056640625,23.26791992187499],[-75.15756835937499,23.336376953124997],[-75.24125976562499,23.474609375],[-75.288232421875,23.568261718749994],[-75.309814453125,23.58984375],[-75.31596679687499,23.668359375],[-75.21660156249999,23.546777343749994],[-75.17529296875,23.438671875],[-75.1087890625,23.3328125],[-75.064208984375,23.150195312500003],[-74.937109375,23.088134765625],[-74.84560546875,22.999902343749994],[-74.840478515625,22.894335937500003]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-75.30839843749999,24.2],[-75.3017578125,24.149169921875],[-75.36875,24.159472656250003],[-75.46762695312499,24.139599609374997],[-75.50322265624999,24.1390625],[-75.48105468749999,24.173876953125003],[-75.41240234374999,24.220947265625],[-75.408935546875,24.265771484374994],[-75.493896484375,24.33041992187499],[-75.5927734375,24.491259765625003],[-75.6390625,24.52939453124999],[-75.66103515625,24.58984375],[-75.74399414062499,24.6546875],[-75.72666015624999,24.689355468749994],[-75.709619140625,24.697509765625],[-75.653515625,24.680859375],[-75.52646484374999,24.449511718750003],[-75.51816406249999,24.42734375],[-75.30839843749999,24.2]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-77.87939453125,22.12753906249999],[-77.912353515625,22.124707031249997],[-78.0119140625,22.16640625],[-78.041650390625,22.20126953124999],[-78.00668945312499,22.247998046874997],[-77.99921875,22.298730468749994],[-77.98564453124999,22.30209960937499],[-77.96958007812499,22.240673828124997],[-77.89365234374999,22.214550781249997],[-77.889111328125,22.201074218749994],[-77.84248046875,22.148974609375003],[-77.87939453125,22.12753906249999]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-82.03720703124999,26.45361328125],[-82.07285156249999,26.427539062499996],[-82.144970703125,26.446679687499994],[-82.18437,26.48095703125],[-82.2013671875,26.548046875],[-82.13857421875,26.477001953124997],[-82.11606445312499,26.4609375],[-82.03720703124999,26.45361328125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-77.74384765625,24.707421875],[-77.746044921875,24.586328125],[-77.735107421875,24.495751953124994],[-77.74521484374999,24.46347656249999],[-77.85341796875,24.40292968749999],[-77.88120117187499,24.369091796874997],[-77.98320312499999,24.3349609375],[-78.044921875,24.28745117187499],[-78.075830078125,24.364648437499994],[-78.1357421875,24.412353515625],[-78.14580078124999,24.493457031250003],[-78.1916015625,24.466064453125],[-78.25761718749999,24.48276367187499],[-78.36650390624999,24.544189453125],[-78.435302734375,24.627587890624994],[-78.33891601562499,24.642041015624997],[-78.318994140625,24.590234375],[-78.24272460937499,24.65380859375],[-78.26005859374999,24.687304687500003],[-78.273828125,24.691601562499997],[-78.298828125,24.75390625],[-78.18408203125,24.91708984374999],[-78.159326171875,25.022363281249994],[-78.211376953125,25.19125976562499],[-78.16279296875,25.20234375],[-78.03330078124999,25.143115234375003],[-77.97529296875,25.08481445312499],[-77.973388671875,25.004785156249994],[-77.9189453125,24.942822265624997],[-77.84013671874999,24.794384765624997],[-77.74384765625,24.707421875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-81.56669921874999,24.599902343750003],[-81.631494140625,24.590039062499997],[-81.579248046875,24.62939453125],[-81.56230468749999,24.689160156249997],[-81.531640625,24.642480468749994],[-81.5322265625,24.614160156249994],[-81.56669921874999,24.599902343750003]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-80.186767578125,27.27841796875],[-80.17050781249999,27.204785156249997],[-80.262451171875,27.3755859375],[-80.37607421874999,27.643408203125],[-80.4369140625,27.850537109374997],[-80.395751953125,27.79453125],[-80.35551757812499,27.678613281249994],[-80.186767578125,27.27841796875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-82.561767578125,21.571679687499994],[-82.65483398437499,21.51865234374999],[-82.853173828125,21.443896484375003],[-82.959619140625,21.441308593749994],[-83.06728515625,21.469384765624994],[-83.14150390625,21.531884765624994],[-83.1837890625,21.593457031249997],[-83.18022460937499,21.623046875],[-83.112939453125,21.573681640624997],[-83.0548828125,21.54941406249999],[-83.0072265625,21.565576171874994],[-82.973583984375,21.59228515625],[-83.08251953125,21.79140625],[-83.077734375,21.83349609375],[-82.9912109375,21.94272460937499],[-82.75576171875,21.90952148437499],[-82.71455078125,21.890283203124994],[-82.6818359375,21.82114257812499],[-82.62939453125,21.766894531250003],[-82.567822265625,21.621826171875],[-82.561767578125,21.571679687499994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-82.08378906249999,26.55234375],[-82.085205078125,26.493603515624997],[-82.13559570312499,26.591992187499997],[-82.169140625,26.700732421874996],[-82.12114257812499,26.66552734375],[-82.08378906249999,26.55234375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-79.349560546875,22.66391601562499],[-79.347900390625,22.6376953125],[-79.52275390624999,22.711132812499997],[-79.5978515625,22.787646484375003],[-79.628173828125,22.805224609375003],[-79.57915039062499,22.80673828124999],[-79.38217773437499,22.681347656249997],[-79.349560546875,22.66391601562499]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-78.49287109375,26.729052734374996],[-78.371728515625,26.697949218749997],[-78.3068359375,26.702197265624996],[-78.26791992187499,26.72265625],[-78.08867187499999,26.714306640624997],[-77.94394531249999,26.74423828125],[-77.92246093749999,26.691113281249997],[-77.92612304687499,26.663378906249996],[-78.23388671875,26.637353515624994],[-78.51621093749999,26.559375],[-78.67094726562499,26.506542968749997],[-78.74365234375,26.500683593749997],[-78.79921875,26.528466796874994],[-78.98564453124999,26.689501953124996],[-78.935791015625,26.6734375],[-78.798046875,26.582421875],[-78.7125,26.599023437499994],[-78.633251953125,26.6591796875],[-78.62114257812499,26.704638671874996],[-78.632958984375,26.726171875],[-78.597119140625,26.79794921875],[-78.49287109375,26.729052734374996]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-80.3818359375,25.142285156249997],[-80.58056640625,24.954248046874994],[-80.558544921875,25.00131835937499],[-80.48105468749999,25.101953125],[-80.456005859375,25.149316406249994],[-80.40366210937499,25.179345703124994],[-80.354931640625,25.233642578125],[-80.35126953125,25.29697265624999],[-80.28046875,25.341259765624997],[-80.257080078125,25.347607421874997],[-80.3818359375,25.142285156249997]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-87.9505859375,17.924951171874994],[-87.99809570312499,17.90634765624999],[-87.95903320312499,17.964013671874994],[-87.9533203125,18.00107421874999],[-87.89833984375,18.154931640624994],[-87.85893554687499,18.154052734375],[-87.84853515625,18.140380859375],[-87.9505859375,17.924951171874994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-87.8529296875,17.4228515625],[-87.92998046874999,17.283007812500003],[-87.93486328124999,17.322949218749997],[-87.90283203125,17.426464843749997],[-87.85942382812499,17.462792968749994],[-87.83251953125,17.50107421874999],[-87.826416015625,17.546289062499994],[-87.78862304687499,17.52421875],[-87.79814453124999,17.47958984374999],[-87.8529296875,17.4228515625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-91.68369140624999,18.67734375],[-91.796142578125,18.654199218749994],[-91.81611328125,18.67587890624999],[-91.589111328125,18.778027343749997],[-91.55029296875,18.773681640625],[-91.53671875,18.760009765625],[-91.654248046875,18.711474609375003],[-91.68369140624999,18.67734375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-82.23349609374999,9.380712890624991],[-82.24443359374999,9.334082031249991],[-82.321728515625,9.418115234374994],[-82.27578125,9.431884765625],[-82.259423828125,9.430273437499991],[-82.23349609374999,9.380712890624991]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-81.36953125,19.348876953125],[-81.33725585937499,19.329492187499994],[-81.296484375,19.341357421875003],[-81.284814453125,19.362548828125],[-81.13046875,19.34677734374999],[-81.10712890625,19.30517578125],[-81.224609375,19.304101562499994],[-81.277294921875,19.277392578125003],[-81.3037109375,19.271875],[-81.40478515625,19.27841796874999],[-81.419091796875,19.374755859375],[-81.391015625,19.384912109374994],[-81.36953125,19.348876953125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-86.9396484375,20.30332031249999],[-86.99140625,20.272167968749997],[-87.01943359375,20.38232421875],[-86.977978515625,20.489794921875003],[-86.92783203124999,20.551513671875],[-86.828564453125,20.558789062499997],[-86.76328125,20.579052734374997],[-86.755029296875,20.5517578125],[-86.8087890625,20.468457031249997],[-86.9396484375,20.30332031249999]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-62.63066406249999,17.239990234375],[-62.656494140625,17.224414062500003],[-62.70200195312499,17.286035156249994],[-62.775537109374994,17.30283203124999],[-62.83891601562499,17.339257812499994],[-62.840478515624994,17.347070312499994],[-62.83940429687499,17.36533203124999],[-62.827050781249994,17.386425781249997],[-62.79462890625,17.402587890625],[-62.71372070312499,17.353271484375],[-62.67578125,17.290917968749994],[-62.640527343749994,17.26230468749999],[-62.63066406249999,17.239990234375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-60.89521484375,13.821972656249997],[-60.951416015625,13.717578125],[-61.06064453124999,13.783105468749994],[-61.073144531249994,13.865576171874991],[-61.06357421874999,13.915576171875003],[-60.99667968749999,14.0109375],[-60.944580078125,14.072851562499991],[-60.908105468749994,14.093359375],[-60.88676757812499,14.011132812499994],[-60.89521484375,13.821972656249997]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-60.82626953124999,14.494482421874991],[-60.83662109375,14.437402343749994],[-60.86210937499999,14.42626953125],[-60.8994140625,14.473779296874994],[-61.063720703125,14.467089843750003],[-61.0888671875,14.509570312500003],[-61.09033203125,14.5296875],[-61.011328125,14.601904296874991],[-61.10429687499999,14.621240234374994],[-61.14111328125,14.652392578125003],[-61.2197265625,14.804394531249997],[-61.213330078125,14.848583984374997],[-61.180810546874994,14.871923828124991],[-61.127392578125,14.875292968750003],[-61.027099609375,14.826171875],[-60.952539062499994,14.75625],[-60.927148437499994,14.755175781250003],[-60.91865234375,14.7353515625],[-60.93369140624999,14.686181640624994],[-60.88916015625,14.64453125],[-60.86997070312499,14.613720703124997],[-60.82626953124999,14.494482421874991]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-61.012109375,10.134326171874989],[-61.174267578125,10.078027343749994],[-61.5966796875,10.064648437499997],[-61.7716796875,10.085058593749991],[-61.90610351562499,10.069140624999989],[-61.66147460937499,10.191699218749989],[-61.632714843749994,10.243408203125],[-61.52885742187499,10.253125],[-61.49931640624999,10.2685546875],[-61.464746093749994,10.538964843749994],[-61.478271484375,10.603369140624991],[-61.49882812499999,10.638867187499997],[-61.540917968749994,10.664453125],[-61.63530273437499,10.699365234374994],[-61.65117187499999,10.718066406249989],[-61.59184570312499,10.747949218749994],[-61.46484375,10.764453124999989],[-61.370019531249994,10.796826171874997],[-61.173730468749994,10.803320312499991],[-61.078515625,10.831933593749994],[-60.917626953124994,10.840234375],[-60.996728515624994,10.716162109374991],[-61.03374023437499,10.669873046874997],[-61.01933593749999,10.55810546875],[-61.0375,10.482275390624991],[-61.01640624999999,10.386376953124994],[-60.96845703125,10.323388671874994],[-60.999609375,10.261474609375],[-61.0041015625,10.167822265624991],[-61.012109375,10.134326171874989]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-68.205810546875,12.144580078124989],[-68.254345703125,12.032080078124991],[-68.2822265625,12.082275390625],[-68.287255859375,12.171728515624991],[-68.30712890625,12.206738281249997],[-68.34843749999999,12.228076171874989],[-68.37109375,12.257519531249997],[-68.36923828124999,12.301953125],[-68.219482421875,12.23125],[-68.205810546875,12.144580078124989]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-60.756298828125,11.178515624999989],[-60.81064453124999,11.168603515624994],[-60.804296875,11.208398437499994],[-60.708935546875,11.277246093749994],[-60.56279296874999,11.323535156249989],[-60.52548828124999,11.325390625],[-60.546484375,11.263720703124989],[-60.756298828125,11.178515624999989]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-62.1484375,16.74033203124999],[-62.154248046875,16.681201171875003],[-62.221630859375,16.699511718750003],[-62.223046875,16.7515625],[-62.191357421875,16.804394531249997],[-62.17578125,16.8095703125],[-62.1484375,16.74033203124999]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-59.493310546874994,13.081982421874997],[-59.521875,13.062207031249997],[-59.611328125,13.102099609374989],[-59.6427734375,13.150292968749994],[-59.6466796875,13.303125],[-59.59160156249999,13.317675781250003],[-59.487890625,13.196826171874989],[-59.427636718749994,13.152783203124997],[-59.493310546874994,13.081982421874997]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-63.849365234375,11.131005859374994],[-63.817285156249994,11.000341796874991],[-63.827099609375,10.975830078125],[-63.917626953124994,10.887548828124991],[-63.993554687499994,10.881201171874991],[-64.0546875,10.884326171874989],[-64.101171875,10.901416015624989],[-64.160888671875,10.958789062499989],[-64.2189453125,10.941601562499997],[-64.3625,10.961523437499991],[-64.40234375,10.981591796874994],[-64.3486328125,11.051904296874994],[-64.249755859375,11.080322265625],[-64.21367187499999,11.086132812499997],[-64.184814453125,11.04296875],[-64.11279296875,11.005664062499989],[-64.0283203125,11.001855468749994],[-64.00732421875,11.068457031249991],[-63.89311523437499,11.167236328125],[-63.849365234375,11.131005859374994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-63.001220703125,18.22177734374999],[-63.16000976562499,18.17138671875],[-63.1533203125,18.20029296874999],[-63.026025390624994,18.269726562499997],[-62.97958984374999,18.264794921874994],[-63.001220703125,18.22177734374999]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-61.71542968749999,12.012646484374997],[-61.78208007812499,12.008203125],[-61.75595703124999,12.045703124999989],[-61.749658203124994,12.108544921874994],[-61.7150390625,12.18505859375],[-61.66044921874999,12.2373046875],[-61.60678710937499,12.223388671875],[-61.627099609374994,12.05419921875],[-61.71542968749999,12.012646484374997]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-61.74711914062499,17.574951171875],[-61.76201171874999,17.54868164062499],[-61.84379882812499,17.596142578124997],[-61.86875,17.685449218749994],[-61.866162109375,17.704296875],[-61.852441406249994,17.7140625],[-61.819921875,17.696875],[-61.776757812499994,17.690478515625003],[-61.749609375,17.661328125],[-61.74711914062499,17.574951171875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-61.23046875,15.889941406250003],[-61.28623046874999,15.886035156250003],[-61.3107421875,15.894677734374994],[-61.31840820312499,15.954882812500003],[-61.275292968749994,15.996240234374994],[-61.25,16.006298828124997],[-61.212353515625,15.959912109374997],[-61.20341796874999,15.921240234374991],[-61.23046875,15.889941406250003]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-61.716064453125,17.037011718749994],[-61.74814453124999,16.99716796874999],[-61.85966796874999,17.013330078124994],[-61.88203125,17.063134765624994],[-61.887109375,17.09814453125],[-61.817285156249994,17.1689453125],[-61.73857421874999,17.138476562500003],[-61.708203125,17.105078125],[-61.68603515625,17.0984375],[-61.686474609375,17.06982421875],[-61.694970703124994,17.04892578124999],[-61.716064453125,17.037011718749994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-61.281689453125,15.2490234375],[-61.375390625,15.227294921875],[-61.41572265625,15.399853515624997],[-61.48115234375,15.525146484375],[-61.469921875,15.603466796874997],[-61.45810546874999,15.633105468750003],[-61.32001953125,15.585058593749991],[-61.277246093749994,15.526708984374991],[-61.25107421874999,15.373144531249991],[-61.281689453125,15.2490234375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-61.3271484375,16.230419921874997],[-61.44482421875,16.219287109375003],[-61.52216796875,16.22802734375],[-61.539990234375,16.299609375],[-61.50058593749999,16.36020507812499],[-61.52890625,16.433789062499997],[-61.510644531249994,16.477685546874994],[-61.47119140625,16.506640625],[-61.4064453125,16.468310546875003],[-61.396142578124994,16.41342773437499],[-61.35546875,16.363183593749994],[-61.172607421875,16.256103515625],[-61.3271484375,16.230419921874997]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-61.58955078125,16.00693359374999],[-61.67045898437499,15.962060546874994],[-61.71025390624999,15.975927734374991],[-61.759423828124994,16.062060546875003],[-61.794091796874994,16.300976562499997],[-61.76713867187499,16.340478515624994],[-61.748046875,16.355273437500003],[-61.641503906249994,16.325976562500003],[-61.59702148437499,16.2921875],[-61.55234375,16.270898437499994],[-61.57504882812499,16.22714843749999],[-61.563867187499994,16.047753906249994],[-61.58955078125,16.00693359374999]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-61.17451171875,13.158105468749994],[-61.20390624999999,13.142285156249997],[-61.277294921875,13.209570312499991],[-61.268457031249994,13.287695312499991],[-61.224072265625,13.330664062499991],[-61.18212890625,13.35595703125],[-61.13896484374999,13.358740234374991],[-61.1240234375,13.294042968749991],[-61.134521484375,13.202880859375],[-61.17451171875,13.158105468749994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-73.041015625,22.42905273437499],[-72.978955078125,22.414599609375003],[-72.94521484375,22.415625],[-72.83076171875,22.38559570312499],[-72.76259765625,22.344384765624994],[-72.747265625,22.327392578125],[-72.78388671875,22.290625],[-72.88916015625,22.360253906249994],[-72.98105468749999,22.36923828124999],[-73.11020507812499,22.367578125],[-73.16191406249999,22.38071289062499],[-73.127392578125,22.455322265625],[-73.041015625,22.42905273437499]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-68.75107421874999,12.059765625],[-68.80332031249999,12.045458984374989],[-68.9951171875,12.141845703125],[-69.15380859375,12.2984375],[-69.15888671875,12.380273437499994],[-69.11845703124999,12.373242187499997],[-69.07675781249999,12.342041015625],[-69.013134765625,12.231347656249994],[-68.827392578125,12.158544921874991],[-68.75107421874999,12.059765625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-71.66142578124999,21.765234375],[-71.66538085937499,21.751708984375],[-71.72177734374999,21.790234375],[-71.83041992187499,21.790625],[-71.84765625,21.843457031249997],[-71.80615234375,21.852099609375003],[-71.668359375,21.833447265624997],[-71.6369140625,21.787548828124997],[-71.66142578124999,21.765234375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-72.91611328124999,21.50668945312499],[-73.04931640625,21.45761718749999],[-73.0626953125,21.515332031249997],[-72.994775390625,21.56162109374999],[-72.91611328124999,21.50668945312499]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-71.87993164062499,21.84042968749999],[-71.8974609375,21.829882812500003],[-71.95546875,21.864404296874994],[-71.96376953125,21.892041015624997],[-71.984521484375,21.89340820312499],[-72.01904296875,21.918261718750003],[-72.01064453125,21.950439453125],[-71.93154296875,21.951904296875],[-71.899609375,21.8625],[-71.87993164062499,21.84042968749999]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-72.33281249999999,21.851367187500003],[-72.21865234375,21.796289062499994],[-72.1498046875,21.804492187500003],[-72.14433593749999,21.792724609375],[-72.18154296875,21.780029296875],[-72.190673828125,21.769775390625],[-72.30087890624999,21.75522460937499],[-72.33544921875,21.758007812499997],[-72.34238281249999,21.7953125],[-72.33281249999999,21.851367187500003]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-160.918994140625,58.577099609375],[-160.9923828125,58.56103515625],[-161.070263671875,58.569140625],[-161.131494140625,58.668212890625],[-161.0845703125,58.671289062499994],[-160.98623046875,58.73642578125],[-160.768603515625,58.789208984374994],[-160.71513671875,58.79521484375],[-160.918994140625,58.577099609375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-153.007080078125,57.124853515625],[-153.134228515625,57.092578125],[-153.1568359375,57.0939453125],[-153.235400390625,57.028613281249996],[-153.29541015625,57.000439453125],[-153.374609375,57.051904296875],[-153.354345703125,57.13193359375],[-153.285205078125,57.18505859375],[-152.93544921875,57.167333984375],[-152.9083984375,57.15244140625],[-152.907763671875,57.13974609375],[-152.933447265625,57.129248046875],[-153.007080078125,57.124853515625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-152.020751953125,60.36171875],[-152.06904296875,60.358056640624994],[-152.0044921875,60.407421875],[-151.959716796875,60.503759765625],[-151.8994140625,60.490380859374994],[-151.8873046875,60.472705078125],[-151.9869140625,60.373974609375],[-152.020751953125,60.36171875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-152.486083984375,58.485009765624994],[-152.51552734375,58.47861328125],[-152.588623046875,58.509228515625],[-152.63662109375,58.54169921875],[-152.6048828125,58.56640625],[-152.46318359375,58.618505859375],[-152.3955078125,58.619384765625],[-152.367919921875,58.611083984375],[-152.3568359375,58.594970703125],[-152.362255859375,58.570849609375],[-152.392822265625,58.540869140625],[-152.486083984375,58.485009765624994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-153.240625,57.85009765625],[-153.2685546875,57.82236328125],[-153.294970703125,57.8294921875],[-153.350830078125,57.861962890625],[-153.4650390625,57.909375],[-153.51708984375,57.94189453125],[-153.520068359375,57.95576171875],[-153.4810546875,57.971044921875],[-153.34697265625,57.9328125],[-153.2900390625,57.897900390625],[-153.240625,57.85009765625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-155.566015625,55.82119140625],[-155.6048828125,55.78955078125],[-155.680615234375,55.791845703125],[-155.723193359375,55.802197265625],[-155.737353515625,55.82978515625],[-155.62060546875,55.9130859375],[-155.5939453125,55.92431640625],[-155.5732421875,55.92109375],[-155.563916015625,55.886669921875],[-155.566015625,55.82119140625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-154.6828125,56.435791015625],[-154.751220703125,56.412158203124996],[-154.77392578125,56.420263671875],[-154.7771484375,56.439892578125],[-154.7609375,56.471142578125],[-154.729345703125,56.5021484375],[-154.62373046875,56.561328125],[-154.517529296875,56.600537109375],[-154.46337890625,56.598193359374996],[-154.444873046875,56.573193359375],[-154.511181640625,56.521435546875],[-154.6828125,56.435791015625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-154.208642578125,56.514892578125],[-154.2578125,56.5126953125],[-154.33212890625,56.539013671875],[-154.322216796875,56.570605468749996],[-154.216748046875,56.608740234375],[-154.110400390625,56.6029296875],[-154.10224609375,56.581640625],[-154.107177734375,56.5578125],[-154.115966796875,56.543896484375],[-154.1498046875,56.529589843749996],[-154.208642578125,56.514892578125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-146.3939453125,60.449658203125],[-146.3716796875,60.42216796875],[-146.179541015625,60.428759765625],[-146.124267578125,60.42392578125],[-146.10224609375,60.411181640625],[-146.128271484375,60.392529296875],[-146.202392578125,60.368017578125],[-146.419189453125,60.325048828125],[-146.5953125,60.268457031249994],[-146.618310546875,60.273681640625],[-146.650439453125,60.33564453125],[-146.6830078125,60.360693359375],[-146.702880859375,60.39560546875],[-146.7025390625,60.408544921875],[-146.670263671875,60.4326171875],[-146.605908203125,60.467822265625],[-146.560302734375,60.48056640625],[-146.3939453125,60.449658203125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-145.118505859375,60.337109375],[-145.15048828125,60.312646484374994],[-145.237646484375,60.321337890625],[-145.28427734375,60.336816406249994],[-145.128125,60.401123046875],[-145.10244140625,60.388232421875],[-145.118505859375,60.337109375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-144.565625,59.818408203125],[-144.61357421875,59.812646484374994],[-144.541552734375,59.87822265625],[-144.444921875,59.95068359375],[-144.353955078125,59.99619140625],[-144.2357421875,60.015185546875],[-144.248974609375,59.98212890625],[-144.40322265625,59.92109375],[-144.565625,59.818408203125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-147.735888671875,59.813232421875],[-147.846337890625,59.798828125],[-147.8724609375,59.828369140625],[-147.81435546875,59.901953125],[-147.76806640625,59.94375],[-147.733642578125,59.95361328125],[-147.606689453125,60.03662109375],[-147.4658203125,60.097021484375],[-147.3365234375,60.1853515625],[-147.205224609375,60.311328125],[-147.180859375,60.358251953125],[-147.12001953125,60.3630859375],[-147.019873046875,60.3322265625],[-146.957861328125,60.2888671875],[-146.98671875,60.254345703125],[-147.31845703125,60.07529296875],[-147.346337890625,60.051953125],[-147.376513671875,59.991162109375],[-147.40380859375,59.969970703125],[-147.44755859375,59.96025390625],[-147.47939453125,59.93369140625],[-147.49931640625,59.890185546875],[-147.540234375,59.867529296875],[-147.60205078125,59.865576171875],[-147.644921875,59.85361328125],[-147.66875,59.83154296875],[-147.735888671875,59.813232421875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-148.02177734375,60.065332031249994],[-148.074169921875,60.034716796875],[-148.271875,60.053271484375],[-148.2306640625,60.113525390625],[-148.07958984375,60.15166015625],[-147.914208984375,60.092333984375],[-148.02177734375,60.065332031249994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-147.658251953125,60.45048828125],[-147.65869140625,60.42412109375],[-147.6900390625,60.398876953125],[-147.6599609375,60.352490234375],[-147.71201171875,60.27275390625],[-147.73212890625,60.222070312499994],[-147.759912109375,60.190234375],[-147.787841796875,60.1779296875],[-147.8158203125,60.18515625],[-147.8216796875,60.202734375],[-147.8052734375,60.2306640625],[-147.871337890625,60.22978515625],[-147.891455078125,60.2994140625],[-147.8548828125,60.321435546874994],[-147.84169921875,60.35126953125],[-147.83759765625,60.3712890625],[-147.79453125,60.459863281249994],[-147.779150390625,60.466064453125],[-147.774169921875,60.444970703124994],[-147.760205078125,60.43876953125],[-147.7373046875,60.447412109374994],[-147.702978515625,60.48681640625],[-147.68857421875,60.49140625],[-147.658251953125,60.45048828125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-147.930712890625,60.826171875],[-148.057421875,60.817919921875],[-148.1154296875,60.830615234375],[-148.123779296875,60.8443359375],[-148.09970703125,60.89482421875],[-148.10166015625,60.91611328125],[-148.037744140625,60.92412109375],[-147.964404296875,60.900146484375],[-147.943115234375,60.875390625],[-147.930712890625,60.826171875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-132.862255859375,54.89443359375],[-132.837744140625,54.88095703125],[-132.812890625,54.890429687499996],[-132.772314453125,54.926074218749996],[-132.700634765625,54.91904296875],[-132.648876953125,54.907080078125],[-132.617236328125,54.892431640625],[-132.634033203125,54.840478515625],[-132.64697265625,54.756152343749996],[-132.67666015625,54.726220703125],[-132.705810546875,54.6841796875],[-132.807275390625,54.709130859375],[-132.889599609375,54.762646484375],[-133.008935546875,54.854833984375],[-133.075390625,54.921337890625],[-133.08056640625,54.9494140625],[-133.122705078125,54.96982421875],[-133.204638671875,55.08447265625],[-133.251171875,55.175146484375],[-133.324853515625,55.185498046875],[-133.41796875,55.210693359375],[-133.45380859375,55.2603515625],[-133.429052734375,55.30380859375],[-133.29658203125,55.325732421874996],[-133.097412109375,55.213720703125],[-133.06708984375,55.1662109375],[-132.995751953125,55.110595703125],[-132.982177734375,55.033007812499996],[-132.94599609375,55.002587890625],[-132.862255859375,54.89443359375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-133.989599609375,56.844970703125],[-133.9248046875,56.775683593749996],[-133.830859375,56.781298828124996],[-133.77812,56.72890625],[-133.73837890625,56.650439453124996],[-133.76728515625,56.60009765625],[-133.809033203125,56.611328125],[-133.8552734375,56.582177734375],[-133.88359375,56.485498046875],[-133.870458984375,56.388671875],[-133.884619140625,56.292138671875],[-133.938525390625,56.193652343749996],[-133.94970703125,56.127734375],[-133.97080078125,56.10791015625],[-133.993994140625,56.101123046874996],[-134.0240234375,56.118994140625],[-134.06748046875,56.1330078125],[-134.122412109375,56.077392578125],[-134.189599609375,56.076953125],[-134.245068359375,56.203271484375],[-134.195458984375,56.413525390625],[-134.084375,56.456347656249996],[-134.15048828125,56.513476562499996],[-134.290234375,56.580029296875],[-134.278369140625,56.61708984375],[-134.384423828125,56.7240234375],[-134.390625,56.749462890625],[-134.373681640625,56.838671875],[-134.2744140625,56.9181640625],[-134.14326171875,56.93232421875],[-134.051806640625,56.898291015625],[-134.0005859375,56.869189453124996],[-133.989599609375,56.844970703125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-133.305078125,55.54375],[-133.283203125,55.515625],[-133.281689453125,55.497851562499996],[-133.42646484375,55.431445312499996],[-133.4291015625,55.417724609375],[-133.4630859375,55.37666015625],[-133.49345703125,55.361669921875],[-133.54736328125,55.317236328125],[-133.6501953125,55.269287109375],[-133.635009765625,55.413330078125],[-133.737109375,55.496923828125],[-133.634228515625,55.5392578125],[-133.56669921875,55.527197265625],[-133.45478515625,55.522314453125],[-133.345556640625,55.55908203125],[-133.305078125,55.54375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-131.33974609375,55.079833984375],[-131.237451171875,54.949511718749996],[-131.23203125,54.903759765625],[-131.329541015625,54.887744140624996],[-131.406201171875,54.894287109375],[-131.445703125,54.909326171875],[-131.456103515625,54.93056640625],[-131.43134765625,54.996484375],[-131.48173828125,55.03525390625],[-131.5400390625,55.048486328125],[-131.592236328125,55.025683593749996],[-131.5951171875,55.09072265625],[-131.556005859375,55.13740234375],[-131.57783203125,55.200830078125],[-131.578466796875,55.248779296875],[-131.5654296875,55.264111328125],[-131.512646484375,55.262744140624996],[-131.404638671875,55.213330078125],[-131.33974609375,55.079833984375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-132.74687,56.525683593749996],[-132.7576171875,56.511035156249996],[-132.884716796875,56.512451171875],[-132.930810546875,56.524462890624996],[-132.948046875,56.567236328125],[-132.93623046875,56.6068359375],[-132.90654296875,56.63740234375],[-132.870654296875,56.69638671875],[-132.842529296875,56.794775390625],[-132.655859375,56.684716796875],[-132.598681640625,56.6357421875],[-132.56796875,56.575830078125],[-132.634228515625,56.553466796875],[-132.714453125,56.542529296874996],[-132.74687,56.525683593749996]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-132.112353515625,56.109375],[-132.132958984375,55.94326171875],[-132.172607421875,55.95263671875],[-132.210302734375,55.952978515625],[-132.2873046875,55.92939453125],[-132.368603515625,55.939746093749996],[-132.406591796875,55.958203125],[-132.42060546875,55.979541015624996],[-132.4060546875,56.028857421874996],[-132.451171875,56.05634765625],[-132.602978515625,56.06640625],[-132.659912109375,56.078173828124996],[-132.691357421875,56.130078125],[-132.6990234375,56.198193359375],[-132.6751953125,56.2236328125],[-132.59873046875,56.241650390625],[-132.539013671875,56.324169921875],[-132.50595703125,56.335253906249996],[-132.379833984375,56.498779296875],[-132.31650390625,56.4875],[-132.205615234375,56.387939453125],[-132.06689453125,56.24423828125],[-132.112353515625,56.109375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-132.7798828125,56.247265625],[-132.83095703125,56.244140625],[-132.891455078125,56.259423828125],[-133.035009765625,56.34091796875],[-133.037646484375,56.36484375],[-133.01708984375,56.3919921875],[-132.935498046875,56.441796875],[-132.90205078125,56.453759765625],[-132.7060546875,56.448486328125],[-132.643359375,56.43515625],[-132.6291015625,56.411914062499996],[-132.632275390625,56.38828125],[-132.65283203125,56.36435546875],[-132.657568359375,56.339306640625],[-132.64658203125,56.31318359375],[-132.669384765625,56.2873046875],[-132.7798828125,56.247265625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-134.312744140625,58.22890625],[-134.319873046875,58.2041015625],[-134.45625,58.20654296875],[-134.593994140625,58.243115234375],[-134.661572265625,58.290917968749994],[-134.647998046875,58.312402343749994],[-134.519970703125,58.33251953125],[-134.398876953125,58.28720703125],[-134.312744140625,58.22890625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-128.936865234375,52.510009765625],[-128.968701171875,52.4642578125],[-129.10234375,52.574365234375],[-129.151025390625,52.605322265625],[-129.25048828125,52.72216796875],[-129.2677734375,52.77236328125],[-129.263525390625,52.80078125],[-129.245947265625,52.81123046875],[-129.2150390625,52.803857421875],[-129.186181640625,52.791259765625],[-128.993994140625,52.66171875],[-128.94033203125,52.600732421875],[-128.936865234375,52.510009765625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-130.9271484375,54.479052734374996],[-130.95029296875,54.477783203125],[-130.959033203125,54.498681640625],[-130.953466796875,54.541845703125],[-130.92177734375,54.614892578125],[-130.9068359375,54.631787109375],[-130.77705078125,54.618896484375],[-130.7580078125,54.61376953125],[-130.75341796875,54.59970703125],[-130.76337890625,54.576708984374996],[-130.805126953125,54.543798828125],[-130.9271484375,54.479052734374996]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-131.029296875,51.96162109375],[-131.047265625,51.959716796875],[-131.080517578125,51.980419921875],[-131.10341796875,52.0138671875],[-131.117333984375,52.101025390625],[-131.10712890625,52.136572265625],[-131.098095703125,52.150634765625],[-131.01064453125,52.095263671874996],[-131.029296875,51.96162109375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-130.236279296875,53.958544921874996],[-130.267236328125,53.922607421875],[-130.337548828125,53.866259765624996],[-130.384228515625,53.8439453125],[-130.4072265625,53.855517578124996],[-130.470263671875,53.861767578125],[-130.5375,53.91787109375],[-130.58984375,53.940283203125],[-130.624609375,53.94140625],[-130.641845703125,53.921142578125],[-130.6462890625,53.89404296875],[-130.637890625,53.860009765625],[-130.643701171875,53.84453125],[-130.66357421875,53.84755859375],[-130.683447265625,53.8634765625],[-130.703173828125,53.892236328125],[-130.707275390625,53.921484375],[-130.695703125,53.95126953125],[-130.646923828125,53.991259765624996],[-130.49462890625,54.074169921875],[-130.447998046875,54.089013671875],[-130.397314453125,54.085693359375],[-130.315869140625,54.046923828124996],[-130.298486328125,54.03564453125],[-130.236279296875,53.958544921874996]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-129.848583984375,53.167919921875],[-129.8685546875,53.164501953125],[-129.93437,53.17666015625],[-130.151416015625,53.345703125],[-130.3056640625,53.407373046875],[-130.4107421875,53.4908203125],[-130.517578125,53.544238281249996],[-130.452001953125,53.631152343749996],[-130.39482421875,53.620410156249996],[-130.19501953125,53.549658203125],[-130.035400390625,53.481103515625],[-129.9447265625,53.436376953125],[-129.754833984375,53.244775390625],[-129.7689453125,53.21728515625],[-129.848583984375,53.167919921875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-127.924658203125,51.473876953125],[-127.941259765625,51.457177734374994],[-127.98125,51.4572265625],[-128.04453125,51.474023437499994],[-128.091796875,51.511132812499994],[-128.148779296875,51.626708984375],[-128.1423828125,51.64658203125],[-128.12275390625,51.666796875],[-128.03173828125,51.7083984375],[-127.998681640625,51.70380859375],[-127.98681640625,51.673583984375],[-127.93251953125,51.60546875],[-127.916357421875,51.58544921875],[-127.91630859374999,51.506201171875],[-127.924658203125,51.473876953125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-128.36875,52.40087890625],[-128.44541015625,52.3875],[-128.419873046875,52.44111328125],[-128.4125,52.4728515625],[-128.42626953125,52.502734375],[-128.4359375,52.560351562499996],[-128.439794921875,52.69638671875],[-128.364892578125,52.781884765625],[-128.247265625,52.784375],[-128.2484375,52.7412109375],[-128.29814453125,52.5482421875],[-128.323779296875,52.458984375],[-128.3435546875,52.426074218749996],[-128.36875,52.40087890625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-129.313720703125,52.9921875],[-129.3287109375,52.984228515625],[-129.37001953125,52.997607421874996],[-129.409716796875,53.023730468749996],[-129.477783203125,53.09775390625],[-129.500146484375,53.12890625],[-129.51474609375,53.17939453125],[-129.50107421875,53.188330078125],[-129.471435546875,53.1830078125],[-129.450732421875,53.17470703125],[-129.343505859375,53.052783203124996],[-129.313720703125,52.9921875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-129.167724609375,53.11787109375],[-129.1732421875,53.1107421875],[-129.27685546875,53.1109375],[-129.305712890625,53.121142578124996],[-129.323876953125,53.142138671874996],[-129.33125,53.173974609375],[-129.31435546875,53.2123046875],[-129.253076171875,53.285498046875],[-129.251171875,53.316699218749996],[-129.23818359375,53.330078125],[-129.19521484375,53.293212890625],[-129.177001953125,53.259130859375],[-129.167724609375,53.11787109375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-139.043115234375,69.576904296875],[-139.125732421875,69.539306640625],[-139.256982421875,69.578564453125],[-139.29140625,69.5978515625],[-139.139599609375,69.649609375],[-139.07265625,69.64765625],[-138.93154296875,69.616943359375],[-138.878857421875,69.589697265625],[-139.043115234375,69.576904296875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-60.99790039062499,8.867333984374994],[-61.059960937499994,8.847021484374991],[-61.06918945312499,8.947314453124989],[-61.05048828125,8.974365234375],[-60.944775390625,9.055029296874991],[-60.91582031249999,9.0703125],[-60.89458007812499,9.053369140624994],[-60.89990234375,9.031884765624994],[-60.84916992187499,8.995703125],[-60.86142578124999,8.949609375],[-60.91640625,8.899267578124991],[-60.99790039062499,8.867333984374994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-80.131591796875,-2.97314453125],[-80.15068359374999,-3.01171875],[-80.245703125,-3.00830078125],[-80.27294921875,-2.995898437500003],[-80.27216796875,-2.951757812500006],[-80.24980468749999,-2.811914062500009],[-80.22368164062499,-2.753125],[-80.145703125,-2.6962890625],[-80.08076171875,-2.668847656250009],[-79.997265625,-2.673828125],[-79.90903320312499,-2.7255859375],[-80.01323242187499,-2.819531250000011],[-80.07119140625,-2.833789062500003],[-80.093408203125,-2.845898437500011],[-80.131591796875,-2.97314453125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-51.83251953125,-1.433789062500011],[-51.938378906249994,-1.45263671875],[-51.80205078124999,-1.202539062500009],[-51.680029296875006,-1.086132812500011],[-51.67827148437499,-0.855078125],[-51.546044921874994,-0.649609375000011],[-51.424462890624994,-0.56591796875],[-51.254003906250006,-0.54140625],[-51.160742187500006,-0.666699218750011],[-51.27631835937498,-1.021777343750003],[-51.31010742187499,-1.023828125],[-51.46513671874999,-1.211132812500011],[-51.6376953125,-1.341894531250006],[-51.83251953125,-1.433789062500011]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-79.0654296875,8.254199218749989],[-79.1103515625,8.209814453124991],[-79.12753906249999,8.251855468749994],[-79.09628906249999,8.29541015625],[-79.08530273437499,8.295800781249994],[-79.0654296875,8.254199218749989]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-78.90922851562499,1.252783203124991],[-78.96562,1.245361328125],[-78.99169921875,1.293212890625],[-78.9232421875,1.348925781249989],[-78.8998046875,1.359765625],[-78.90922851562499,1.252783203124991]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-78.113720703125,2.541748046875],[-78.1408203125,2.519677734374994],[-78.19248046874999,2.559277343749997],[-78.210107421875,2.609179687499989],[-78.17841796875,2.646337890624991],[-78.137646484375,2.634179687499994],[-78.119140625,2.603613281249991],[-78.113720703125,2.541748046875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-60.821191406249994,9.138378906249997],[-60.94140625,9.105566406249991],[-60.939453125,9.13232421875],[-60.90727539062499,9.1787109375],[-60.844873046874994,9.191796875],[-60.82138671874999,9.207666015624994],[-60.78159179687499,9.218359375],[-60.75888671874999,9.216455078124994],[-60.73583984375,9.203320312499997],[-60.79038085937499,9.177197265624997],[-60.821191406249994,9.138378906249997]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-44.49931640624999,-2.939648437500011],[-44.597753906250006,-3.03759765625],[-44.565332031249994,-2.923925781250006],[-44.581884765625006,-2.845605468750009],[-44.569091796875,-2.784960937500003],[-44.501953125,-2.726269531250011],[-44.4814453125,-2.717578125],[-44.4873046875,-2.789746093750011],[-44.482568359374994,-2.811914062500009],[-44.49931640624999,-2.939648437500011]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-38.74384765624998,-13.097070312500009],[-38.78300781249999,-13.11865234375],[-38.786962890625006,-13.055078125],[-38.68486328124999,-12.974902343750003],[-38.668115234374994,-12.880175781250003],[-38.61455078124999,-12.924023437500011],[-38.60029296874998,-12.972460937500003],[-38.601171875,-12.992578125],[-38.74384765624998,-13.097070312500009]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-38.903564453125,-13.4734375],[-38.937890625,-13.532324218750006],[-38.97758789062499,-13.523535156250006],[-38.99321289062499,-13.484082031250011],[-39.02216796874998,-13.445605468750003],[-39.006591796875,-13.41552734375],[-38.980126953124994,-13.3984375],[-38.907128906249994,-13.401074218750011],[-38.903564453125,-13.4734375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-44.88310546874999,-1.31787109375],[-44.947119140625006,-1.366015625],[-44.967871093750006,-1.390820312500011],[-45.020849609375006,-1.372363281250003],[-45.01123046875,-1.3447265625],[-44.99560546875,-1.347558593750009],[-44.978662109374994,-1.267285156250011],[-44.88828125,-1.27685546875],[-44.88310546874999,-1.31787109375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-49.73823242187498,0.268164062499991],[-49.697265625,0.215966796874994],[-49.838964843750006,0.006884765624989],[-49.917089843750006,-0.023193359375],[-50.00249023437499,-0.029296875],[-50.113134765625006,0.033007812499989],[-50.28559570312498,0.028564453125],[-50.339453125,0.043359375],[-50.345117187499994,0.134472656249997],[-50.27265624999998,0.231738281249989],[-50.12797851562499,0.226513671874997],[-49.879003906250006,0.304541015624991],[-49.73823242187498,0.268164062499991]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-50.298974609374994,1.938525390624989],[-50.398779296875006,1.892871093749989],[-50.45610351562499,1.910498046874991],[-50.50898437499998,2.029541015625],[-50.49101562499999,2.128613281249997],[-50.41875,2.161474609374991],[-50.362646484375006,2.154443359374994],[-50.34199218749998,2.141748046874994],[-50.292089843750006,1.979589843749991],[-50.298974609374994,1.938525390624989]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-50.65288085937499,-0.131640625],[-50.926367187500006,-0.327343750000011],[-51.01899414062498,-0.263085937500009],[-51.0380859375,-0.225878906250003],[-51.022363281249994,-0.188378906250009],[-51.025732421875006,-0.17236328125],[-50.99506835937498,-0.105273437500003],[-50.8421875,-0.050195312500009],[-50.765283203124994,-0.040869140625006],[-50.6669921875,-0.058007812500009],[-50.65058593749998,-0.105859375],[-50.65288085937499,-0.131640625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-49.44389648437499,-0.112402343750006],[-49.708837890625006,-0.14375],[-49.830078125,-0.093896484375009],[-49.80268554687498,-0.051855468750006],[-49.712304687499994,0.01513671875],[-49.602197265624994,0.062695312499997],[-49.50346679687499,0.083691406249997],[-49.400488281250006,0.057226562499991],[-49.372314453125,0.001074218749991],[-49.380859375,-0.05546875],[-49.44389648437499,-0.112402343750006]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-50.426123046875006,0.139257812499991],[-50.443945312500006,-0.007666015625006],[-50.623925781249994,0.054394531249997],[-50.610449218750006,0.204785156249997],[-50.526220703125006,0.246923828124991],[-50.4515625,0.326904296875],[-50.42607421874999,0.424951171874994],[-50.424560546875,0.558251953124994],[-50.396875,0.581396484374991],[-50.37275390624998,0.590869140624989],[-50.350976562499994,0.581738281249997],[-50.342529296875,0.381591796875],[-50.332275390625,0.259033203125],[-50.426123046875006,0.139257812499991]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-50.152929687500006,0.393017578124997],[-50.261328125,0.359179687499989],[-50.28154296874999,0.390820312499997],[-50.28168945312498,0.516503906249994],[-50.25117187499998,0.58544921875],[-50.11279296875,0.604736328125],[-50.0986328125,0.625],[-50.058837890625,0.638037109374991],[-50.03681640624998,0.594824218749991],[-50.0400390625,0.522802734374991],[-50.152929687500006,0.393017578124997]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-90.33486328125,-0.771582031250006],[-90.387109375,-0.773339843750009],[-90.542138671875,-0.676464843750011],[-90.531689453125,-0.581445312500009],[-90.4697265625,-0.517382812500003],[-90.26938476562499,-0.484667968750003],[-90.185302734375,-0.544824218750009],[-90.19272460937499,-0.658789062500006],[-90.26108398437499,-0.741992187500003],[-90.3154296875,-0.757226562500009],[-90.33486328125,-0.771582031250006]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-89.418896484375,-0.911035156250009],[-89.53662109375,-0.952343750000011],[-89.577294921875,-0.933789062500011],[-89.60263671874999,-0.913476562500009],[-89.60859375,-0.888574218750009],[-89.54345703125,-0.826855468750011],[-89.479931640625,-0.793359375],[-89.42314453124999,-0.722265625],[-89.31840820312499,-0.680078125],[-89.287841796875,-0.68984375],[-89.26743164062499,-0.70458984375],[-89.259375,-0.728417968750009],[-89.294873046875,-0.7859375],[-89.358349609375,-0.826074218750009],[-89.418896484375,-0.911035156250009]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-81.603271484375,7.332812499999989],[-81.65810546875,7.327539062499994],[-81.77011718749999,7.370361328125],[-81.85205078125,7.453320312499997],[-81.85859375,7.480175781249997],[-81.85693359375,7.507666015624991],[-81.812158203125,7.592382812499991],[-81.75229492187499,7.621630859374989],[-81.728759765625,7.621191406249991],[-81.67143554687499,7.5234375],[-81.71044921875,7.485546875],[-81.6947265625,7.425],[-81.613427734375,7.380175781249989],[-81.603271484375,7.332812499999989]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-91.4259765625,-0.460839843750009],[-91.5263671875,-0.478222656250011],[-91.6107421875,-0.443945312500006],[-91.64658203124999,-0.390820312500011],[-91.65415039062499,-0.3109375],[-91.6466796875,-0.284472656250003],[-91.46015625,-0.255664062500003],[-91.399365234375,-0.322460937500011],[-91.39995117187499,-0.4208984375],[-91.4259765625,-0.460839843750009]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-90.42392578124999,-1.339941406250006],[-90.46440429687499,-1.341992187500011],[-90.51953125,-1.299121093750003],[-90.477197265625,-1.220996093750003],[-90.43198242187499,-1.23984375],[-90.39873046874999,-1.262304687500006],[-90.379150390625,-1.292285156250003],[-90.42392578124999,-1.339941406250006]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-91.27216796875,0.025146484375],[-91.21005859374999,-0.039306640625],[-91.176220703125,-0.223046875],[-90.975537109375,-0.416894531250009],[-90.950634765625,-0.525195312500003],[-90.96845703125,-0.575585937500009],[-90.958935546875,-0.5953125],[-90.862548828125,-0.671777343750009],[-90.79965820312499,-0.752050781250006],[-90.905517578125,-0.940527343750006],[-91.1310546875,-1.019628906250006],[-91.371533203125,-1.016992187500009],[-91.41904296874999,-0.996679687500006],[-91.483544921875,-0.924609375],[-91.49541015624999,-0.8609375],[-91.45830078124999,-0.799511718750011],[-91.33408203124999,-0.70625],[-91.144677734375,-0.622851562500003],[-91.12094726562499,-0.55908203125],[-91.197021484375,-0.496972656250009],[-91.24951171875,-0.373632812500006],[-91.36918945312499,-0.287207031250006],[-91.428857421875,-0.023388671875011],[-91.468701171875,-0.010302734375003],[-91.55,-0.046679687500003],[-91.590087890625,-0.014794921875009],[-91.596826171875,0.002099609374994],[-91.5091796875,0.062255859375],[-91.49101562499999,0.105175781249997],[-91.36137695312499,0.125830078124991],[-91.30576171874999,0.09140625],[-91.27216796875,0.025146484375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-90.57392578125,-0.333984375],[-90.62045898437499,-0.3642578125],[-90.809033203125,-0.329394531250003],[-90.86777343749999,-0.271386718750009],[-90.82036132812499,-0.1921875],[-90.78037109374999,-0.160449218750003],[-90.66752929687499,-0.18984375],[-90.55332031249999,-0.278417968750006],[-90.57392578125,-0.333984375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-109.27998046875,-27.140429687500003],[-109.434130859375,-27.17128906250001],[-109.429150390625,-27.1162109375],[-109.39047851562499,-27.068359375],[-109.27646484374999,-27.09589843750001],[-109.2228515625,-27.10107421875],[-109.27998046875,-27.140429687500003]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-106.50224609375,21.61083984375],[-106.53134765624999,21.528515625],[-106.60703125,21.561474609374997],[-106.6341796875,21.61313476562499],[-106.63935546875,21.69785156249999],[-106.59736328125,21.712158203125],[-106.53642578125,21.67636718749999],[-106.523828125,21.65234375],[-106.50224609375,21.61083984375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-110.914453125,18.741455078125],[-110.9748046875,18.720361328124994],[-111.063671875,18.781640625],[-111.03994140625,18.830126953125003],[-110.989404296875,18.86313476562499],[-110.94208984375,18.801708984374997],[-110.914453125,18.741455078125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-110.5673828125,25.003466796875003],[-110.5388671875,24.891552734374997],[-110.59018554687499,24.90805664062499],[-110.657421875,24.96884765624999],[-110.70341796875,25.046630859375],[-110.699267578125,25.081445312499994],[-110.690234375,25.087841796874997],[-110.59521484375,25.042138671874994],[-110.5673828125,25.003466796875003]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-109.805078125,24.151074218749997],[-109.82675781249999,24.14755859374999],[-109.8779296875,24.200634765624997],[-109.90048828124999,24.33090820312499],[-109.89033203125,24.34482421874999],[-109.79379882812499,24.183398437500003],[-109.79560546875,24.16357421875],[-109.805078125,24.151074218749997]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-113.15561523437499,29.05224609375],[-113.16279296875,29.034765625],[-113.26474609374999,29.096728515624996],[-113.496337890625,29.3076171875],[-113.580615234375,29.413232421874994],[-113.594384765625,29.462695312499996],[-113.58720703125,29.573046875],[-113.507958984375,29.559912109375],[-113.41591796875,29.4859375],[-113.37583007812499,29.41748046875],[-113.373828125,29.338916015624996],[-113.2021484375,29.30185546875],[-113.1779296875,29.13193359375],[-113.15561523437499,29.05224609375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-114.694140625,31.705615234374996],[-114.72724609375,31.701367187499997],[-114.789208984375,31.747412109375],[-114.7845703125,31.789794921875],[-114.77109375,31.794091796874994],[-114.70908203124999,31.756884765624996],[-114.687939453125,31.72421875],[-114.694140625,31.705615234374996]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-115.17060546875,28.069384765624996],[-115.18427734375,28.037255859374994],[-115.3529296875,28.103955078124997],[-115.260400390625,28.220556640625],[-115.273974609375,28.3427734375],[-115.233544921875,28.368359375],[-115.19697265625,28.327880859375],[-115.14853515624999,28.172119140625],[-115.17060546875,28.069384765624996]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-111.698876953125,24.393603515625003],[-111.7123046875,24.346386718749997],[-112.01328125,24.533398437499997],[-111.940869140625,24.55112304687499],[-111.8568359375,24.537988281249994],[-111.698876953125,24.393603515625003]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-111.10029296875,26.02060546875],[-111.08774414062499,25.984521484374994],[-111.09443359375,25.974072265624997],[-111.13525390625,25.999169921874994],[-111.2044921875,25.84970703124999],[-111.224658203125,25.835888671874997],[-111.18291015625,26.040625],[-111.13925781249999,26.06982421875],[-111.090869140625,26.07568359375],[-111.10029296875,26.02060546875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-112.203076171875,29.005322265624997],[-112.27841796874999,28.769335937499996],[-112.3552734375,28.773144531249997],[-112.5140625,28.847607421874997],[-112.531005859375,28.893994140624997],[-112.46982421874999,29.167724609375],[-112.42353515625,29.203662109374996],[-112.28505859375,29.240429687499997],[-112.263427734375,29.206787109375],[-112.24873046875,29.1259765625],[-112.203076171875,29.005322265624997]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-112.057275390625,24.545703125],[-112.07734375,24.534570312499994],[-112.162890625,24.650292968749994],[-112.17548828125,24.72958984374999],[-112.210498046875,24.763134765624997],[-112.29677734375,24.78964843749999],[-112.222314453125,24.951123046874997],[-112.159423828125,25.28564453125],[-112.13168945312499,25.224365234375],[-112.198388671875,24.885449218749997],[-112.19501953125,24.841064453125],[-112.16376953125,24.79965820312499],[-112.13022460937499,24.72958984374999],[-112.12626953125,24.654003906249997],[-112.06748046874999,24.583642578124994],[-112.057275390625,24.545703125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[166.9794921875,-45.1796875],[167.02265625,-45.2998046875],[166.93115234375,-45.27685546875],[166.89267578125003,-45.24052734375002],[166.96269531250005,-45.18037109375001],[166.9794921875,-45.1796875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[124.31621093749999,10.606005859374989],[124.28847656250002,10.601464843749994],[124.33466796875001,10.706689453124994],[124.37109375,10.691357421874997],[124.38232421875,10.679833984374994],[124.38134765625,10.632568359375],[124.31621093749999,10.606005859374989]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[125.28076171875,9.982177734375],[125.28769531250003,9.932714843749991],[125.15898437499999,10.062939453124997],[125.13300781250001,10.155029296875],[125.17587890625003,10.151074218749997],[125.23095703125,10.115673828124997],[125.28076171875,9.982177734375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[122.93710937500003,7.409130859374997],[122.94804687499999,7.3857421875],[122.94365234374999,7.361035156249997],[122.83955078125001,7.314599609374994],[122.8046875,7.315966796874989],[122.79658203125001,7.393359374999989],[122.82216796875002,7.428466796875],[122.87119140625003,7.397314453124991],[122.91484374999999,7.433398437499989],[122.93710937500003,7.409130859374997]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[125.78457031250002,6.962744140624991],[125.76894531250002,6.90576171875],[125.70751953125,7.039990234374997],[125.68300781250002,7.073193359374997],[125.71445312500003,7.185546875],[125.78339843750001,7.130664062499989],[125.78457031250002,6.962744140624991]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[125.97050781249999,9.593554687499989],[125.95244140624999,9.56796875],[125.92207031250001,9.621484375],[125.94853515624999,9.739208984374997],[125.9677734375,9.759082031249989],[125.99296874999999,9.6845703125],[125.97050781249999,9.593554687499989]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[124.6083984375,11.4921875],[124.48349609375003,11.48583984375],[124.42880859375003,11.53173828125],[124.3603515625,11.665917968749994],[124.43740234375002,11.695019531249997],[124.51093750000001,11.687109375],[124.56494140625,11.639697265624989],[124.62226562500001,11.549560546875],[124.6083984375,11.4921875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[124.85439453125002,11.594775390624989],[124.8359375,11.543310546874991],[124.806640625,11.557568359374997],[124.78105468749999,11.580761718749997],[124.74365234375,11.658544921874991],[124.73085937500002,11.71533203125],[124.78837890624999,11.68310546875],[124.82148437500001,11.626611328124994],[124.85439453125002,11.594775390624989]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[134.81953125,-6.434179687500006],[134.7951171875,-6.4423828125],[134.79531250000002,-6.39306640625],[134.82294921875,-6.349609375],[134.85185546875005,-6.324609375],[134.88583984375003,-6.323535156250003],[134.81953125,-6.434179687500006]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[134.67441406250003,-6.749804687500003],[134.657421875,-6.765332031250011],[134.63144531250003,-6.73291015625],[134.6291015625,-6.712792968750009],[134.66347656250002,-6.65771484375],[134.69765625000002,-6.625683593750011],[134.73574218750002,-6.623339843750003],[134.72607421875,-6.668652343750011],[134.67441406250003,-6.749804687500003]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[127.98789062500003,-2.9365234375],[127.93769531250001,-3.02001953125],[127.849609375,-3.016308593750011],[127.83427734375005,-3.00439453125],[127.93837890625002,-2.952343750000011],[127.98789062500003,-2.9365234375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[127.60625,-3.315136718750011],[127.62929687500002,-3.359179687500003],[127.53105468750005,-3.331347656250003],[127.48769531250002,-3.288183593750006],[127.53046875000001,-3.261523437500003],[127.55449218750005,-3.254296875],[127.60625,-3.315136718750011]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[124.05126953125,-5.973730468750006],[124.04208984375003,-6.021582031250006],[124.00566406249999,-5.966699218750009],[123.97226562500003,-5.939355468750009],[123.97578125000001,-5.880175781250003],[124.02294921875,-5.902148437500003],[124.05126953125,-5.973730468750006]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[123.62675781249999,-5.271582031250006],[123.62275390625001,-5.373046875],[123.58261718750003,-5.367382812500011],[123.55009765624999,-5.331835937500003],[123.54091796875002,-5.29833984375],[123.54277343749999,-5.27109375],[123.56064453125003,-5.249804687500003],[123.62675781249999,-5.271582031250006]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[120.7744140625,-7.118945312500003],[120.67236328125,-7.124707031250011],[120.64082031250001,-7.115820312500006],[120.63339843750003,-7.018261718750011],[120.74550781250002,-7.06015625],[120.78173828125,-7.063085937500006],[120.7744140625,-7.118945312500003]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[122.97734374999999,-8.545214843750003],[122.94550781250001,-8.60400390625],[122.88779296875003,-8.587304687500009],[122.90351562500001,-8.530664062500009],[122.93281250000001,-8.4970703125],[123.01054687499999,-8.448339843750006],[123.08945312500003,-8.43984375],[123.13789062500001,-8.456933593750009],[123.15312,-8.475781250000011],[123.03007812499999,-8.494824218750011],[122.97734374999999,-8.545214843750003]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[117.55634765625001,-8.367285156250006],[117.53359375000002,-8.36796875],[117.49042968750001,-8.348730468750006],[117.50595703125003,-8.30703125],[117.48212890625001,-8.2392578125],[117.49052734374999,-8.183398437500003],[117.54609375000001,-8.151953125],[117.6650390625,-8.148242187500003],[117.66923828124999,-8.189257812500003],[117.55634765625001,-8.367285156250006]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[70.02070312500001,66.502197265625],[69.8447265625,66.48974609375],[69.6513671875,66.56533203125],[69.4693359375,66.715966796875],[69.50273437500002,66.75107421875],[69.61640625000001,66.739013671875],[69.800390625,66.736474609375],[69.917578125,66.711669921875],[70.07666015625,66.6958984375],[70.0576171875,66.627197265625],[70.0572265625,66.599462890625],[70.11005859375001,66.569091796875],[70.0591796875,66.517578125],[70.02070312500001,66.502197265625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[96.85390625000002,76.199169921875],[96.7978515625,76.188427734375],[96.75449218750003,76.195751953125],[96.73935546875003,76.20693359375],[96.740234375,76.257861328125],[96.83291015625002,76.324169921875],[96.83525390624999,76.34482421875],[96.8779296875,76.355224609375],[96.990234375,76.343408203125],[97.04531250000002,76.315380859375],[97.05302734374999,76.302587890625],[96.97421875000003,76.2365234375],[96.85390625000002,76.199169921875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[100.13593750000001,79.614208984375],[99.91542968750002,79.601611328125],[99.94228515625002,79.671435546875],[99.95576171875001,79.69033203125],[100.068359375,79.701025390625],[100.14150390625002,79.68369140625],[100.30029296875,79.670263671875],[100.13593750000001,79.614208984375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[161.46708984375005,68.9009765625],[161.42246093750003,68.899658203125],[161.45625,68.966015625],[161.4611328125,68.99560546875],[161.36406250000005,69.04443359375],[161.18251953125002,69.081591796875],[161.13652343750005,69.11025390625],[161.12548828125,69.197021484375],[161.16455078125,69.33359375],[161.08281250000005,69.4056640625],[161.11074218750002,69.46982421875],[161.32333984375003,69.54091796875],[161.40976562500003,69.595703125],[161.50517578125005,69.639453125],[161.520703125,69.634033203125],[161.61777343750003,69.592431640625],[161.60927734375002,69.500927734375],[161.54033203125005,69.4365234375],[161.37441406250002,69.413671875],[161.35087890625005,69.3693359375],[161.37265625000003,69.292822265625],[161.37753906250003,69.19443359375],[161.39423828125,69.1064453125],[161.49472656250003,69.016015625],[161.51699218750002,68.969580078125],[161.50673828125002,68.927587890625],[161.46708984375005,68.9009765625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[129.71796875,31.657128906249994],[129.68681640625005,31.6396484375],[129.70683593750005,31.71826171875],[129.7873046875,31.787109375],[129.79365234375,31.742480468749996],[129.71796875,31.657128906249994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[126.41757812500003,36.492578125],[126.40380859375,36.427880859374994],[126.3375,36.470556640625],[126.31855468750001,36.612548828125],[126.38662109375002,36.571142578125],[126.41757812500003,36.492578125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[124.9052734375,39.536279296874994],[124.84892578124999,39.507568359375],[124.84609375000002,39.558886718749996],[124.88955078125002,39.602099609374996],[124.9345703125,39.6078125],[124.9052734375,39.536279296874994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[121.25136718750002,28.08642578125],[121.16425781250001,28.0625],[121.13154296875001,28.06259765625],[121.13398437500001,28.13525390625],[121.20546875000002,28.204394531249996],[121.234375,28.181298828124994],[121.2509765625,28.145214843749997],[121.25136718750002,28.08642578125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[113.55527343750003,22.80419921875],[113.56367187500001,22.75791015624999],[113.48564453124999,22.828320312499997],[113.46337890625,22.83237304687499],[113.42607421874999,22.85859375],[113.40439453125003,22.90283203125],[113.46494140625003,22.904541015625],[113.5205078125,22.85205078125],[113.55527343750003,22.80419921875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[112.79023437500001,21.601855468750003],[112.77109375000003,21.581835937500003],[112.74199218749999,21.618066406249994],[112.73349609375003,21.669921875],[112.71269531249999,21.697949218749997],[112.76054687499999,21.73325195312499],[112.78203124999999,21.772265625],[112.83906250000001,21.76450195312499],[112.86259765624999,21.752636718749997],[112.81259765625003,21.712158203125],[112.80068359375002,21.694873046875003],[112.79023437500001,21.601855468750003]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[112.64375,21.6396484375],[112.54560546875001,21.61850585937499],[112.525,21.623046875],[112.55898437500002,21.674755859374997],[112.64765625000001,21.710253906250003],[112.64375,21.6396484375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[113.99775390625001,22.210498046875003],[113.87734375000002,22.21044921875],[113.8515625,22.220458984375],[113.8388671875,22.24169921875],[113.88154296875001,22.2802734375],[114.0439453125,22.333398437499994],[114.00332031250002,22.277539062499997],[113.99775390625001,22.210498046875003]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[107.16767578125001,10.397167968749997],[107.08378906249999,10.336572265624994],[107.07792968749999,10.3875],[107.15087890625,10.4203125],[107.17656249999999,10.446191406249994],[107.19492187500003,10.445703125],[107.16767578125001,10.397167968749997]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[103.31777343750002,10.718505859375],[103.28125,10.6796875],[103.22294921874999,10.759570312499989],[103.22343749999999,10.781982421875],[103.31777343750002,10.718505859375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[8.587890625,54.712695312499996],[8.548925781250006,54.68818359375],[8.453808593750011,54.691064453125],[8.400390625,54.714111328125],[8.417675781250011,54.738671875],[8.468164062500023,54.757421875],[8.509960937500011,54.760302734374996],[8.573437500000011,54.74873046875],[8.587890625,54.712695312499996]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[6.734765625000023,53.58251953125],[6.64208984375,53.57919921875],[6.668554687500006,53.6056640625],[6.754589843750011,53.62548828125],[6.800878906250006,53.62548828125],[6.734765625000023,53.58251953125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-86.58935546875,71.010791015625],[-86.54965820312499,70.98876953125],[-86.3212890625,71.016796875],[-86.1271484375,71.048974609375],[-85.82456054687499,71.125732421875],[-85.64384765624999,71.15244140625],[-85.094873046875,71.151953125],[-85.0015625,71.137451171875],[-85.04277343749999,71.0916015625],[-85.06577148437499,71.07861328125],[-85.04765624999999,71.05869140625],[-84.9884765625,71.03173828125],[-84.8703125,71.001806640625],[-84.82373046875,71.02861328125],[-84.78959960937499,71.09326171875],[-84.70859375,71.35869140625],[-84.67431640625,71.43876953125],[-84.65810546875,71.514599609375],[-84.65996093749999,71.5861328125],[-84.6994140625,71.6314453125],[-84.84013671874999,71.658642578125],[-85.0322265625,71.654052734375],[-85.13090820312499,71.66123046875],[-85.25048828125,71.67529296875],[-85.3390625,71.697265625],[-85.3966796875,71.72705078125],[-85.51152343749999,71.816552734375],[-85.59619140625,71.86640625],[-85.81333007812499,71.9564453125],[-85.91162109375,71.9865234375],[-85.86210937499999,72.02197265625],[-85.664794921875,72.06279296875],[-85.54580078125,72.1015625],[-85.405908203125,72.21484375],[-85.321875,72.233154296875],[-85.01875,72.2181640625],[-84.60849609374999,72.1294921875],[-84.35166015624999,72.05263671875],[-84.28374023437499,72.044482421875],[-84.28232421874999,72.058447265625],[-84.34746093749999,72.09443359375],[-84.64296875,72.18955078125],[-84.7775390625,72.2587890625],[-84.8419921875,72.308154296875],[-84.81103515625,72.329541015625],[-84.644677734375,72.351416015625],[-84.623046875,72.3765625],[-84.84941406249999,72.40625],[-84.96416015624999,72.405615234375],[-85.0568359375,72.384375],[-85.156396484375,72.38291015625],[-85.34111328124999,72.421533203125],[-85.39130859375,72.443994140625],[-85.49775390625,72.510595703125],[-85.5537109375,72.568603515625],[-85.61557617187499,72.604638671875],[-85.637890625,72.633203125],[-85.64990234375,72.72216796875],[-85.64453125,72.774462890625],[-85.61943359374999,72.819189453125],[-85.574609375,72.856396484375],[-85.45478515625,72.925146484375],[-85.38759765625,72.94501953125],[-85.262109375,72.95400390625],[-84.98955078124999,72.919873046875],[-84.25664062499999,72.796728515625],[-84.27426757812499,72.83642578125],[-85.09404296874999,73.00263671875],[-85.38388671874999,73.04541015625],[-85.454736328125,73.10546875],[-85.01840820312499,73.335498046875],[-84.61606445312499,73.38955078125],[-84.41606445312499,73.456494140625],[-84.08896484374999,73.459375],[-83.781884765625,73.41689453125],[-83.776513671875,73.428466796875],[-83.914990234375,73.5083984375],[-83.904052734375,73.5283203125],[-83.72983398437499,73.57587890625],[-83.4103515625,73.631689453125],[-83.020458984375,73.676025390625],[-82.94321289062499,73.69912109375],[-82.84331054687499,73.7154296875],[-82.659619140625,73.72958984375],[-82.202783203125,73.736474609375],[-81.94614257812499,73.729833984375],[-81.60537109375,73.69599609375],[-81.40615234375,73.634521484375],[-81.34409179687499,73.59775390625],[-81.23833007812499,73.479541015625],[-81.1517578125,73.314013671875],[-81.025146484375,73.24521484375],[-80.821728515625,73.207177734375],[-80.68115234375,73.1658203125],[-80.603466796875,73.12119140625],[-80.582763671875,73.06494140625],[-80.619140625,72.99716796875],[-80.59189453124999,72.927685546875],[-80.500927734375,72.856591796875],[-80.430810546875,72.816259765625],[-80.27724609375,72.770166015625],[-80.27470703124999,72.745556640625],[-80.32265625,72.71748046875],[-80.42431640625,72.67890625],[-80.67509765624999,72.558642578125],[-80.99873046875,72.426220703125],[-81.22934570312499,72.31171875],[-81.24057617187499,72.2779296875],[-80.76079101562499,72.457177734375],[-80.611474609375,72.450830078125],[-80.6046875,72.42578125],[-80.70244140624999,72.33828125],[-80.821484375,72.26025390625],[-80.94121093749999,72.21015625],[-80.9193359375,72.191259765625],[-80.69140625,72.103466796875],[-80.73325195312499,72.089013671875],[-80.84326171875,72.09619140625],[-80.88837890625,72.08828125],[-80.92109375,72.072314453125],[-80.94140625,72.0482421875],[-80.94267578124999,72.01435546875],[-80.925048828125,71.970703125],[-80.92680664062499,71.9380859375],[-80.947900390625,71.916552734375],[-80.92514648437499,71.907666015625],[-80.85844726562499,71.91142578125],[-80.80224609375,71.92919921875],[-80.70541992187499,71.988134765625],[-80.3861328125,72.148779296875],[-80.18193359374999,72.2087890625],[-80.11611328125,72.2140625],[-79.92832031249999,72.174951171875],[-79.884375,72.177197265625],[-80.09091796874999,72.30087890625],[-80.10893554687499,72.332177734375],[-80.06699218749999,72.3783203125],[-80.04179687499999,72.39423828125],[-79.926708984375,72.428173828125],[-79.831298828125,72.4462890625],[-79.77788085937499,72.438720703125],[-79.693310546875,72.375927734375],[-79.65385742187499,72.332177734375],[-79.58369140625,72.3146484375],[-79.42744140625,72.3373046875],[-79.32333984374999,72.3908203125],[-79.19438476562499,72.355712890625],[-79.000244140625,72.272021484375],[-79.01796875,72.188232421875],[-79.0177734375,72.104345703125],[-79.0078125,72.042919921875],[-78.77592773437499,71.93037109375],[-78.614453125,71.881005859375],[-78.585107421875,71.880615234375],[-78.5888671875,71.897509765625],[-78.62255859375,71.9349609375],[-78.7111328125,71.972412109375],[-78.79082031249999,72.0302734375],[-78.862744140625,72.100830078125],[-78.82011718749999,72.2654296875],[-78.69926757812499,72.351416015625],[-78.582470703125,72.329345703125],[-78.42880859374999,72.27978515625],[-78.30747070312499,72.275146484375],[-78.116357421875,72.280322265625],[-77.726025390625,72.17998046875],[-77.51650390625,72.177783203125],[-77.53574218749999,72.21875],[-77.694482421875,72.238427734375],[-77.926171875,72.29384765625],[-78.28720703124999,72.359814453125],[-78.453076171875,72.435205078125],[-78.48427734375,72.47060546875],[-78.4794921875,72.508740234375],[-78.45883789062499,72.542333984375],[-78.42241210937499,72.571533203125],[-78.350244140625,72.6001953125],[-78.00102539062499,72.68759765625],[-77.75322265624999,72.724755859375],[-77.566796875,72.736865234375],[-77.25537109375,72.735888671875],[-76.893505859375,72.720654296875],[-76.69794921875,72.695068359375],[-76.47324218749999,72.633349609375],[-76.18876953124999,72.572216796875],[-76.0873046875,72.561328125],[-75.96875,72.562744140625],[-75.833203125,72.576513671875],[-75.704296875,72.571533203125],[-75.29423828124999,72.480859375],[-75.185791015625,72.434228515625],[-75.120068359375,72.377734375],[-75.071484375,72.3228515625],[-75.03984374999999,72.269580078125],[-75.052685546875,72.2263671875],[-75.394140625,72.039794921875],[-75.54277343749999,72.007958984375],[-75.64096679687499,71.937158203125],[-75.78740234374999,71.803076171875],[-75.911279296875,71.731298828125],[-75.922802734375,71.717236328125],[-75.89682617187499,71.713720703125],[-75.82207031249999,71.7458984375],[-75.693359375,71.83857421875],[-75.59990234374999,71.91845703125],[-75.428369140625,71.984375],[-75.14765625,72.06298828125],[-74.90317382812499,72.10048828125],[-74.694921875,72.096923828125],[-74.519677734375,72.08564453125],[-74.37744140625,72.066552734375],[-74.29296875,72.0505859375],[-74.266357421875,72.0376953125],[-74.20932617187499,71.978662109375],[-74.21259765625,71.938671875],[-74.2482421875,71.89365234375],[-74.31572265624999,71.84267578125],[-74.621484375,71.786279296875],[-74.7890625,71.7419921875],[-74.89296875,71.725537109375],[-75.20478515625,71.709130859375],[-75.191064453125,71.6916015625],[-74.95947265625,71.66748046875],[-74.70078125,71.6755859375],[-74.70737304687499,71.646923828125],[-74.82895507812499,71.5708984375],[-74.868310546875,71.504736328125],[-74.83447265625,71.4505859375],[-74.84072265625,71.406591796875],[-74.931298828125,71.3140625],[-75.0353515625,71.230517578125],[-74.99619140624999,71.218115234375],[-74.758935546875,71.338134765625],[-74.6953125,71.46943359375],[-74.599560546875,71.58486328125],[-74.48808593749999,71.648388671875],[-74.40410156249999,71.672509765625],[-74.1390625,71.6822265625],[-73.99208984375,71.749609375],[-73.8666015625,71.771044921875],[-73.8140625,71.771435546875],[-73.7072265625,71.746337890625],[-73.71357421875,71.719873046875],[-73.868603515625,71.599365234375],[-74.197265625,71.404150390625],[-74.06333007812499,71.42646484375],[-73.97250976562499,71.4728515625],[-73.85087890624999,71.519140625],[-73.712841796875,71.58759765625],[-73.62167968749999,71.525537109375],[-73.481591796875,71.479248046875],[-73.39780273437499,71.3734375],[-73.26240234375,71.3224609375],[-73.180615234375,71.282861328125],[-73.19218749999999,71.349853515625],[-73.31044921875,71.48427734375],[-73.27822265625,71.53798828125],[-73.18681640624999,71.564892578125],[-72.901953125,71.677783203125],[-72.70302734375,71.64013671875],[-72.58061523437499,71.606787109375],[-72.519287109375,71.615625],[-72.36459960937499,71.610986328125],[-72.11650390624999,71.5927734375],[-71.8751953125,71.56123046875],[-71.64067382812499,71.516259765625],[-71.459912109375,71.463720703125],[-71.332958984375,71.403466796875],[-71.2560546875,71.36181640625],[-71.22939453125,71.33876953125],[-71.1865234375,71.2787109375],[-71.219384765625,71.238818359375],[-71.39658203124999,71.146875],[-71.49501953125,71.105126953125],[-71.59306640624999,71.086376953125],[-71.85615234375,71.10478515625],[-71.937939453125,71.094287109375],[-72.023876953125,71.06533203125],[-72.29770507812499,70.938818359375],[-72.44912109375,70.88408203125],[-72.598046875,70.84921875],[-72.63271484375,70.83076171875],[-72.31254882812499,70.83251953125],[-72.22392578124999,70.870166015625],[-72.15,70.940673828125],[-72.0091796875,71.013427734375],[-71.74252929687499,71.046875],[-71.370849609375,70.975146484375],[-71.18623046875,70.97802734375],[-71.045361328125,71.05],[-70.88803710937499,71.0990234375],[-70.82607421875,71.108740234375],[-70.79248046875,71.1033203125],[-70.67265624999999,71.052197265625],[-70.636474609375,71.006591796875],[-70.639111328125,70.90244140625],[-70.655224609375,70.8708984375],[-70.76171875,70.792236328125],[-71.02177734374999,70.67412109375],[-71.191796875,70.62978515625],[-71.38046875,70.60595703125],[-71.5859375,70.565869140625],[-71.658447265625,70.533544921875],[-71.72939453125,70.4876953125],[-71.80014648437499,70.45703125],[-71.89018554687499,70.43154296875],[-71.77236328125,70.394189453125],[-71.72724609375,70.39521484375],[-71.68369140624999,70.417578125],[-71.56499023437499,70.5056640625],[-71.47666015624999,70.54404296875],[-71.42666015625,70.552099609375],[-71.37509765624999,70.5484375],[-71.324853515625,70.53115234375],[-71.27587890625,70.50029296875],[-71.27958984374999,70.4251953125],[-71.429443359375,70.127783203125],[-71.40512695312499,70.128662109375],[-71.31308593749999,70.209326171875],[-71.04526367187499,70.51904296875],[-70.97978515624999,70.5810546875],[-70.850537109375,70.643603515625],[-70.5609375,70.73828125],[-70.33725585937499,70.787841796875],[-70.084716796875,70.829541015625],[-69.94980468749999,70.84501953125],[-69.79570312499999,70.8345703125],[-69.6955078125,70.785888671875],[-69.56010742187499,70.7771484375],[-69.39536132812499,70.7892578125],[-69.2890625,70.783447265625],[-69.168701171875,70.76416015625],[-69.06572265624999,70.728076171875],[-68.89072265624999,70.687109375],[-68.495751953125,70.61025390625],[-68.4466796875,70.594091796875],[-68.400830078125,70.564990234375],[-68.35825195312499,70.522900390625],[-68.363525390625,70.48125],[-68.416650390625,70.439990234375],[-68.482568359375,70.41484375],[-68.56132812499999,70.4056640625],[-68.642822265625,70.383203125],[-68.79365234375,70.3244140625],[-68.842919921875,70.314453125],[-69.07944335937499,70.28916015625],[-69.29873046875,70.276806640625],[-69.435693359375,70.253125],[-69.698974609375,70.189306640625],[-70.06142578125,70.070849609375],[-70.05771484374999,70.042626953125],[-69.9130859375,70.029052734375],[-69.795849609375,70.046923828125],[-69.63457031249999,70.128759765625],[-69.48300781249999,70.16005859375],[-69.24619140624999,70.185107421875],[-68.91855468749999,70.206982421875],[-68.77822265625,70.203564453125],[-68.7529296875,70.199169921875],[-68.734619140625,70.179833984375],[-68.723291015625,70.145654296875],[-68.776953125,70.101025390625],[-68.839111328125,70.079931640625],[-69.00830078125,69.978955078125],[-68.89702148437499,69.952734375],[-68.74404296875,69.94140625],[-68.65673828125,69.96845703125],[-68.57783203125,70.03046875],[-68.48935546874999,70.06484375],[-68.391259765625,70.071630859375],[-68.305078125,70.08740234375],[-68.2306640625,70.11220703125],[-68.21044921875,70.12841796875],[-68.318603515625,70.160595703125],[-68.32719726562499,70.18017578125],[-68.28310546875,70.228271484375],[-68.203515625,70.281494140625],[-68.12065429687499,70.314599609375],[-68.05908203125,70.317236328125],[-67.85532226562499,70.281787109375],[-67.716015625,70.21982421875],[-67.363671875,70.034423828125],[-67.31840820312499,69.9984375],[-67.19589843749999,69.860693359375],[-67.17265624999999,69.799462890625],[-67.1927734375,69.7568359375],[-67.221630859375,69.730712890625],[-67.25927734375,69.7212890625],[-67.33671874999999,69.72099609375],[-67.80620117187499,69.777392578125],[-68.02041015625,69.770068359375],[-68.11396484375,69.754296875],[-68.189453125,69.730615234375],[-68.24809570312499,69.70078125],[-68.289794921875,69.664697265625],[-68.3720703125,69.644384765625],[-68.669921875,69.64365234375],[-68.837109375,69.62353515625],[-69.12451171875,69.57451171875],[-69.227685546875,69.547412109375],[-69.25078124999999,69.5119140625],[-69.07490234375,69.518115234375],[-68.78525390624999,69.564208984375],[-68.51303710937499,69.577294921875],[-68.05815429687499,69.47587890625],[-67.90825195312499,69.460107421875],[-67.824853515625,69.47470703125],[-67.72451171875,69.479248046875],[-67.3609375,69.472509765625],[-67.236962890625,69.460107421875],[-67.052685546875,69.42119140625],[-66.77084960937499,69.336669921875],[-66.716748046875,69.311865234375],[-66.68525390625,69.2857421875],[-66.67626953125,69.258447265625],[-66.679296875,69.191064453125],[-66.707421875,69.168212890625],[-66.802880859375,69.152734375],[-67.2080078125,69.170654296875],[-67.331640625,69.184716796875],[-67.4837890625,69.1669921875],[-67.60722656249999,69.173193359375],[-67.7650390625,69.200244140625],[-67.9384765625,69.24814453125],[-68.198193359375,69.202685546875],[-68.40629882812499,69.2322265625],[-68.618896484375,69.206005859375],[-69.040625,69.097998046875],[-68.99345703124999,69.079345703125],[-68.41552734375,69.1720703125],[-68.303955078125,69.16640625],[-68.1212890625,69.1326171875],[-67.83261718749999,69.065966796875],[-67.751708984375,69.038671875],[-67.75102539062499,68.933837890625],[-67.7951171875,68.863330078125],[-67.883203125,68.783984375],[-68.015625,68.794677734375],[-68.32421875,68.84404296875],[-68.450390625,68.850830078125],[-68.54277343749999,68.8427734375],[-68.66669921875,68.811328125],[-68.72529296875,68.810205078125],[-69.21884765624999,68.872802734375],[-69.32978515625,68.87578125],[-69.34267578125,68.869384765625],[-69.319091796875,68.856982421875],[-68.87143554687499,68.7599609375],[-68.540625,68.749365234375],[-68.333203125,68.732568359375],[-68.210400390625,68.702978515625],[-68.152490234375,68.6810546875],[-68.14833984375,68.61611328125],[-68.03793945312499,68.550732421875],[-67.9384765625,68.524169921875],[-67.87504882812499,68.52294921875],[-67.766015625,68.547021484375],[-67.65595703125,68.550732421875],[-67.56694335937499,68.533984375],[-67.455517578125,68.497900390625],[-67.320703125,68.48779296875],[-67.20249023437499,68.465869140625],[-67.11118164062499,68.461474609375],[-66.85419921875,68.471630859375],[-66.74272460937499,68.457763671875],[-66.71391601562499,68.445703125],[-66.76240234375,68.424658203125],[-66.997265625,68.374169921875],[-67.032958984375,68.32607421875],[-66.900390625,68.263525390625],[-66.83095703125,68.215625],[-66.83432617187499,68.1798828125],[-66.90512695312499,68.098486328125],[-66.923095703125,68.06572265625],[-66.8998046875,68.0630859375],[-66.72900390625,68.12900390625],[-66.70234375,68.120556640625],[-66.6845703125,68.029248046875],[-66.66269531249999,68.034423828125],[-66.60546875,68.110009765625],[-66.63095703124999,68.21064453125],[-66.53076171875,68.250341796875],[-66.21240234375,68.280419921875],[-66.26630859375,68.122705078125],[-66.27470703124999,68.040771484375],[-66.41386718749999,67.904296875],[-66.52998046875,67.860302734375],[-66.52646484374999,67.851171875],[-66.44394531249999,67.833837890625],[-66.39238281249999,67.83193359375],[-66.34296875,67.853271484375],[-66.22519531249999,67.958740234375],[-65.98583984375,68.0685546875],[-65.9423828125,68.070947265625],[-65.943994140625,68.031201171875],[-65.97490234374999,67.957421875],[-65.86435546874999,67.9228515625],[-65.758935546875,67.957080078125],[-65.70170898437499,67.986669921875],[-65.5693359375,67.98232421875],[-65.50908203124999,67.96826171875],[-65.49111328125,67.935693359375],[-65.552001953125,67.799365234375],[-65.54086914062499,67.765625],[-65.40126953125,67.674853515625],[-65.387109375,67.6802734375],[-65.4134765625,67.724072265625],[-65.44223632812499,67.83232421875],[-65.41533203124999,67.879248046875],[-65.30034179687499,67.939501953125],[-65.064404296875,68.026220703125],[-64.97690429687499,68.043408203125],[-64.922314453125,68.031640625],[-64.83544921875,67.989990234375],[-64.862548828125,67.96513671875],[-64.95639648437499,67.939111328125],[-65.026025390625,67.892041015625],[-65.071435546875,67.823828125],[-65.02109375,67.787548828125],[-64.82988281249999,67.78427734375],[-64.63779296874999,67.840234375],[-64.5275390625,67.8126953125],[-64.396435546875,67.73994140625],[-64.15625,67.622998046875],[-64.01943359375,67.6548828125],[-63.85019531249999,67.566064453125],[-64.07749023437499,67.49560546875],[-64.007958984375,67.347314453125],[-64.30327148437499,67.353466796875],[-64.46928710937499,67.341845703125],[-64.58046875,67.35517578125],[-64.699951171875,67.350537109375],[-64.5892578125,67.31552734375],[-64.375927734375,67.30107421875],[-64.3564453125,67.25615234375],[-64.18896484375,67.257275390625],[-64.063232421875,67.26591796875],[-63.83623046874999,67.264111328125],[-63.824121093749994,67.315673828125],[-63.67646484375,67.3451171875],[-63.59160156249999,67.3775390625],[-63.52109375,67.358349609375],[-63.315820312499994,67.336328125],[-63.04013671874999,67.235009765625],[-63.16162109375,67.174365234375],[-63.19467773437499,67.117041015625],[-63.235546875,67.068505859375],[-63.25839843749999,67.024658203125],[-63.306787109374994,66.994482421875],[-63.7015625,66.82236328125],[-63.63623046875,66.82080078125],[-63.469189453125,66.86240234375],[-63.143701171874994,66.92431640625],[-62.962304687499994,66.949267578125],[-62.83334960937499,66.93271484375],[-62.76816406249999,66.931982421875],[-62.71044921875,66.9541015625],[-62.60288085937499,66.92861328125],[-62.37973632812499,66.90537109375],[-62.12358398437499,67.046728515625],[-61.96855468749999,67.01904296875],[-61.824121093749994,66.93173828125],[-61.51469726562499,66.778466796875],[-61.353417968749994,66.689208984375],[-61.299707031249994,66.64873046875],[-61.30722656249999,66.608837890625],[-61.453076171875,66.5666015625],[-61.52783203125,66.55810546875],[-61.72412109375,66.63779296875],[-61.9044921875,66.678125],[-62.01425781249999,66.673779296875],[-62.12333984374999,66.64306640625],[-62.089306640625,66.625927734375],[-61.65263671874999,66.503125],[-61.576416015625,66.4125],[-61.57080078125,66.372900390625],[-61.862695312499994,66.312841796875],[-61.95634765624999,66.309326171875],[-62.158447265625,66.33798828125],[-62.27690429687499,66.39150390625],[-62.37451171875,66.41083984375],[-62.50981445312499,66.4171875],[-62.553125,66.4068359375],[-62.405664062499994,66.31591796875],[-62.419824218749994,66.28857421875],[-62.495996093749994,66.2708984375],[-62.53359375,66.227001953125],[-62.242089843749994,66.14794921875],[-62.02392578125,66.067529296875],[-61.991601562499994,66.035302734375],[-62.138671875,66.011376953125],[-62.2443359375,66.005859375],[-62.4677734375,66.01748046875],[-62.59033203125,66.034423828125],[-62.62412109374999,66.016259765625],[-62.49736328124999,65.9740234375],[-62.448388671874994,65.9455078125],[-62.410302734374994,65.90576171875],[-62.38818359375,65.868310546875],[-62.381982421874994,65.83330078125],[-62.48564453124999,65.8044921875],[-62.610253906249994,65.7236328125],[-62.65888671875,65.63994140625],[-62.771728515625,65.631982421875],[-62.817285156249994,65.647705078125],[-62.968896484374994,65.62236328125],[-63.1689453125,65.65732421875],[-63.240673828125,65.695556640625],[-63.458740234375,65.85302734375],[-63.46435546875,65.8353515625],[-63.409765625,65.755810546875],[-63.4208984375,65.70859375],[-63.651953125,65.67431640625],[-63.65107421875,65.660986328125],[-63.509228515625,65.63603515625],[-63.33745117187499,65.616748046875],[-63.3642578125,65.543212890625],[-63.36337890624999,65.229736328125],[-63.401806640625,65.11845703125],[-63.48583984375,65.021240234375],[-63.606591796874994,64.928076171875],[-63.73715820312499,64.989111328125],[-63.78935546874999,65.0513671875],[-63.833203125,65.08330078125],[-63.89560546874999,65.10927734375],[-63.97626953125,65.121484375],[-64.06142578125,65.121923828125],[-64.15185546875,65.066162109375],[-64.250439453125,65.114306640625],[-64.345703125,65.172412109375],[-64.309765625,65.324560546875],[-64.269677734375,65.40078125],[-64.28574218749999,65.4001953125],[-64.33994140624999,65.36416015625],[-64.46982421874999,65.252734375],[-64.555078125,65.1166015625],[-64.66533203124999,65.1689453125],[-64.764794921875,65.23408203125],[-64.846923828125,65.299560546875],[-64.979638671875,65.37509765625],[-65.10849609374999,65.46376953125],[-65.17568359375,65.5681640625],[-65.206982421875,65.5896484375],[-65.28203124999999,65.67666015625],[-65.311474609375,65.701513671875],[-65.33740234375,65.709765625],[-65.401611328125,65.764013671875],[-65.378125,65.8220703125],[-65.276953125,65.890673828125],[-65.18486328124999,65.93994140625],[-65.0322265625,65.988525390625],[-64.8537109375,66.01591796875],[-64.77250976562499,66.078564453125],[-64.672998046875,66.192724609375],[-64.56396484375,66.27216796875],[-64.44536132812499,66.317138671875],[-64.50439453125,66.32548828125],[-64.65517578125,66.28701171875],[-64.7611328125,66.230908203125],[-64.88725585937499,66.13740234375],[-65.00449218749999,66.077734375],[-65.30537109375,66.008447265625],[-65.41557617187499,65.994580078125],[-65.543701171875,65.98720703125],[-65.82573242187499,65.996923828125],[-65.891064453125,66.02021484375],[-65.857177734375,66.08642578125],[-65.65634765624999,66.204736328125],[-65.68837890625,66.2130859375],[-65.758984375,66.17119140625],[-65.85595703125,66.142236328125],[-65.94003906249999,66.12744140625],[-66.063720703125,66.13271484375],[-66.20859375,66.206396484375],[-66.27739257812499,66.2291015625],[-66.419189453125,66.2544921875],[-66.476953125,66.279736328125],[-66.7123046875,66.46044921875],[-66.759765625,66.50849609375],[-66.78740234374999,66.5556640625],[-66.862890625,66.5953125],[-66.986328125,66.627490234375],[-67.014794921875,66.622216796875],[-66.97041015625,66.581884765625],[-66.968994140625,66.54716796875],[-67.07685546875,66.52548828125],[-67.1896484375,66.5330078125],[-67.30732421875,66.5697265625],[-67.31767578124999,66.520361328125],[-67.19174804687499,66.432763671875],[-67.18974609374999,66.321728515625],[-67.22539062499999,66.31025390625],[-67.31123046875,66.303759765625],[-67.36884765625,66.31748046875],[-67.559765625,66.400439453125],[-67.74077148437499,66.458203125],[-67.86845703124999,66.49013671875],[-67.88339843749999,66.467431640625],[-67.80058593749999,66.367333984375],[-67.7044921875,66.268603515625],[-67.54721679687499,66.18720703125],[-67.29672851562499,66.090283203125],[-67.183203125,66.034423828125],[-67.27265625,65.95556640625],[-67.35043945312499,65.929736328125],[-67.39877929687499,65.921728515625],[-67.55078125,65.921630859375],[-67.82802734375,65.965185546875],[-67.958203125,66.013818359375],[-68.14726562499999,66.129833984375],[-68.459912109375,66.249267578125],[-68.527783203125,66.2486328125],[-68.74892578125,66.200048828125],[-68.71420898437499,66.192236328125],[-68.5716796875,66.188720703125],[-68.46708984374999,66.173193359375],[-68.2171875,66.078857421875],[-68.19833984374999,66.03896484375],[-68.260693359375,65.994580078125],[-68.2568359375,65.938623046875],[-68.18671875,65.87099609375],[-68.11503906249999,65.827783203125],[-67.96806640624999,65.797265625],[-67.894189453125,65.79326171875],[-67.866455078125,65.773681640625],[-67.954345703125,65.623095703125],[-67.96181640625,65.58193359375],[-67.936767578125,65.564892578125],[-67.90605468749999,65.5634765625],[-67.71713867187499,65.625341796875],[-67.6380859375,65.6404296875],[-67.56962890624999,65.6435546875],[-67.49013671875,65.626220703125],[-67.39970703124999,65.58837890625],[-67.34638671875,65.549365234375],[-67.330322265625,65.5091796875],[-67.30341796875,65.48291015625],[-67.11796874999999,65.440380859375],[-67.1349609375,65.4205078125],[-67.32607421875,65.356640625],[-67.33652343749999,65.34658203125],[-67.29833984375,65.341943359375],[-67.17758789062499,65.30380859375],[-67.06650390624999,65.244091796875],[-66.99858398437499,65.172998046875],[-66.98491210937499,65.138037109375],[-66.98564453124999,65.104833984375],[-66.970361328125,65.084912109375],[-66.9115234375,65.08134765625],[-66.8875,65.093994140625],[-66.86064453124999,65.0916015625],[-66.83090820312499,65.074169921875],[-66.79960937499999,65.019677734375],[-66.73276367187499,64.86005859375],[-66.697412109375,64.815185546875],[-66.6771484375,64.813671875],[-66.66669921875,64.973828125],[-66.635498046875,65.000341796875],[-66.5177734375,64.97197265625],[-66.34521484375,64.909619140625],[-66.22373046874999,64.8541015625],[-66.209716796875,64.828125],[-66.301513671875,64.777734375],[-66.28212890625,64.755322265625],[-66.21464843749999,64.722412109375],[-66.152490234375,64.734912109375],[-66.10751953124999,64.7912109375],[-66.03017578125,64.84658203125],[-65.93852539062499,64.8857421875],[-65.76806640625,64.853564453125],[-65.62675781249999,64.770751953125],[-65.60527343749999,64.742333984375],[-65.51318359375,64.706494140625],[-65.43193359374999,64.726416015625],[-65.2748046875,64.63154296875],[-65.34931640625,64.588525390625],[-65.51279296874999,64.5259765625],[-65.52934570312499,64.50478515625],[-65.489990234375,64.509619140625],[-65.17861328125,64.509716796875],[-65.09453124999999,64.4845703125],[-65.074609375,64.436669921875],[-65.21298828124999,64.303271484375],[-65.33989257812499,64.315087890625],[-65.507470703125,64.318310546875],[-65.59365234375,64.3111328125],[-65.580322265625,64.29384765625],[-65.347802734375,64.23232421875],[-65.281982421875,64.181640625],[-65.1927734375,64.129833984375],[-65.149609375,64.087158203125],[-65.150634765625,64.067529296875],[-65.18730468749999,64.03798828125],[-65.169873046875,64.028173828125],[-65.01059570312499,64.008837890625],[-64.91181640625,64.026171875],[-64.78779296875,64.032763671875],[-64.678466796875,64.027978515625],[-64.66972656249999,64.0095703125],[-64.686181640625,63.9609375],[-64.79814453124999,63.915966796875],[-64.76816406249999,63.905419921874994],[-64.63671875,63.918359375],[-64.576318359375,63.897363281249994],[-64.498486328125,63.79033203125],[-64.41093749999999,63.70634765625],[-64.48222656249999,63.687060546875],[-64.56157226562499,63.6796875],[-64.55029296875,63.57255859375],[-64.49863281249999,63.462792968749994],[-64.49809570312499,63.357568359374994],[-64.51435546875,63.26396484375],[-64.5869140625,63.2431640625],[-64.66464843749999,63.245361328125],[-64.69560546874999,63.26884765625],[-64.88627929687499,63.548730468749994],[-64.93330078125,63.599267578124994],[-64.989697265625,63.643359375],[-65.191845703125,63.7642578125],[-65.18393554687499,63.74482421875],[-65.13383789062499,63.6890625],[-65.08940429687499,63.60595703125],[-65.03134765624999,63.44013671875],[-65.00478515625,63.333398437499994],[-65.01669921874999,63.292822265625],[-65.058056640625,63.282861328124994],[-65.06894531249999,63.2634765625],[-65.04931640625,63.234619140625],[-64.89482421874999,63.125634765624994],[-64.82016601562499,63.060009765625],[-64.76738281249999,62.991796875],[-64.71811523437499,62.94580078125],[-64.67236328125,62.92197265625],[-64.68364257812499,62.902392578125],[-64.75185546875,62.887158203125],[-64.86870117187499,62.8798828125],[-64.9232421875,62.88916015625],[-65.132958984375,62.95234375],[-65.16279296875,62.9326171875],[-65.04658203125,62.70146484375],[-65.0501953125,62.646142578124994],[-65.10849609374999,62.62646484375],[-65.180322265625,62.649462890625],[-65.2658203125,62.715087890625],[-65.39653320312499,62.78818359375],[-65.572412109375,62.868896484375],[-65.740380859375,62.931982421875],[-65.77988281249999,62.9302734375],[-65.8056640625,62.911572265625],[-65.83369140625,62.908544921875],[-65.86406249999999,62.921142578125],[-65.92026367187499,62.968505859375],[-65.97885742187499,63.00068359375],[-66.2240234375,63.107177734375],[-66.24921875,63.108251953125],[-66.22607421875,63.076318359374994],[-66.20107421875,63.00625],[-66.228662109375,62.990966796875],[-66.29277343749999,62.9966796875],[-66.414453125,63.027197265625],[-66.49638671874999,63.097265625],[-66.60048828125,63.218896484374994],[-66.65498046875,63.26474609375],[-66.659814453125,63.234912109375],[-66.630859375,63.119042968749994],[-66.63642578125,63.080126953125],[-66.6974609375,63.06953125],[-66.72324218749999,63.08017578125],[-66.74853515625,63.111083984375],[-66.77324218749999,63.162255859374994],[-66.8314453125,63.201123046875],[-66.923291015625,63.227685546874994],[-66.97470703124999,63.25556640625],[-67.000146484375,63.305126953125],[-67.01791992187499,63.31650390625],[-67.17978515624999,63.305029296875],[-67.2609375,63.340722656249994],[-67.49501953125,63.4814453125],[-67.709228515625,63.633935546874994],[-67.84423828125,63.71455078125],[-67.89326171875,63.733740234375],[-67.821435546875,63.635009765625],[-67.74252929687499,63.4892578125],[-67.72255859375,63.422753906249994],[-67.7587890625,63.4197265625],[-67.837890625,63.44921875],[-68.2435546875,63.637060546875],[-68.49375,63.725488281249994],[-68.63286132812499,63.741113281249994],[-68.85893554687499,63.751855468749994],[-68.911083984375,63.70322265625],[-68.7892578125,63.595117187499994],[-68.670556640625,63.513671875],[-68.555126953125,63.458935546875],[-68.37392578125,63.352197265624994],[-68.20805664062499,63.214697265625],[-68.141259765625,63.172314453125],[-67.91533203124999,63.113671875],[-67.79746093749999,63.098095703125],[-67.6759765625,63.0935546875],[-67.66489257812499,63.07265625],[-67.723779296875,63.03369140625],[-67.736962890625,63.0095703125],[-67.468212890625,62.9482421875],[-67.366650390625,62.91416015625],[-67.268505859375,62.857568359374994],[-67.21269531249999,62.843505859375],[-66.97954101562499,62.700830078124994],[-66.921533203125,62.678076171875],[-66.714013671875,62.631787109375],[-66.64487304687499,62.60205078125],[-66.530517578125,62.5099609375],[-66.458740234375,62.463134765625],[-66.35727539062499,62.351904296875],[-66.28125,62.302685546875],[-66.09501953124999,62.24638671875],[-66.015625,62.2302734375],[-65.98017578125,62.208886718749994],[-66.004345703125,62.15830078125],[-66.026953125,62.13720703125],[-66.13315429687499,62.102392578125],[-66.11640625,62.05390625],[-66.05644531249999,61.96748046875],[-66.05888671874999,61.9138671875],[-66.12387695312499,61.89306640625],[-66.25668945312499,61.86826171875],[-66.32373046875,61.870263671874994],[-66.42451171875,61.89072265625],[-66.55131835937499,61.9255859375],[-66.803125,62.012597656249994],[-67.1810546875,62.0728515625],[-67.322021484375,62.105029296875],[-67.36899414062499,62.13408203125],[-67.44013671875,62.151269531249994],[-68.37861328125,62.23515625],[-68.535888671875,62.255615234375],[-68.63364257812499,62.281298828125],[-68.724365234375,62.318994140624994],[-69.08232421874999,62.405175781249994],[-69.12558593749999,62.423974609374994],[-69.36601562499999,62.571875],[-69.545166015625,62.744580078125],[-69.604736328125,62.767724609374994],[-69.79951171875,62.790478515625],[-69.962109375,62.776171875],[-70.070947265625,62.757226562499994],[-70.23613281249999,62.76337890625],[-70.34404296874999,62.79150390625],[-70.57133789062499,62.869189453125],[-70.801416015625,62.910498046875],[-71.0021484375,62.978271484375],[-71.10576171874999,63.00224609375],[-71.09619140625,63.019677734374994],[-70.946044921875,63.120703125],[-70.99267578125,63.119287109374994],[-71.25371093749999,63.042529296875],[-71.347265625,63.06611328125],[-71.50126953124999,63.126416015625],[-71.617138671875,63.18720703125],[-71.85546875,63.3552734375],[-71.99223632812499,63.416162109374994],[-71.973046875,63.4298828125],[-71.81918945312499,63.435449218749994],[-71.696533203125,63.430224609375],[-71.6142578125,63.444091796875],[-71.45585937499999,63.512255859375],[-71.38740234375,63.555029296875],[-71.380859375,63.580322265625],[-71.51347656249999,63.586572265624994],[-71.54189453125,63.598828125],[-71.565625,63.6267578125],[-71.62675781249999,63.66259765625],[-71.72529296875,63.70615234375],[-71.837548828125,63.724951171875],[-72.22294921874999,63.708886718749994],[-72.29013671874999,63.727978515625],[-72.28876953125,63.756982421874994],[-72.21347656249999,63.838720703125],[-72.17246093749999,63.8716796875],[-72.159375,63.889892578125],[-72.174267578125,63.893408203125],[-72.22646484375,63.891357421875],[-72.45,63.818115234375],[-72.4984375,63.823486328125],[-72.5861328125,63.90078125],[-72.639306640625,63.9890625],[-72.67807617187499,64.02001953125],[-72.72958984374999,64.03046875],[-72.91318359374999,64.1171875],[-73.17431640625,64.281884765625],[-73.27031249999999,64.33349609375],[-73.377099609375,64.37958984375],[-73.454541015625,64.399267578125],[-73.44365234374999,64.423486328125],[-73.27817382812499,64.56025390625],[-73.27128906249999,64.58251953125],[-73.4130859375,64.574169921875],[-73.626953125,64.6025390625],[-73.72841796875,64.56826171875],[-73.79277343749999,64.5662109375],[-73.86787109375,64.5853515625],[-73.9103515625,64.578125],[-73.950390625,64.4658203125],[-73.981103515625,64.437744140625],[-74.0255859375,64.42265625],[-74.06479492187499,64.424658203125],[-74.09873046874999,64.443701171875],[-74.097900390625,64.469921875],[-74.13046875,64.6078125],[-74.205078125,64.628125],[-74.41586914062499,64.63349609375],[-74.46123046874999,64.644677734375],[-74.512451171875,64.670166015625],[-74.55625,64.717333984375],[-74.59257812499999,64.786181640625],[-74.63427734375,64.82392578125],[-74.681396484375,64.8306640625],[-74.719189453125,64.825146484375],[-74.74775390625,64.80732421875],[-74.813427734375,64.796240234375],[-74.916259765625,64.7919921875],[-74.91943359375,64.76552734375],[-74.82304687499999,64.71689453125],[-74.72983398437499,64.64736328125],[-74.6400390625,64.557080078125],[-74.6947265625,64.49658203125],[-74.8939453125,64.46572265625],[-75.0673828125,64.456689453125],[-75.2150390625,64.469384765625],[-75.32841796874999,64.4904296875],[-75.48779296875,64.540771484375],[-75.7150390625,64.524365234375],[-75.76669921874999,64.391943359375],[-75.81523437499999,64.38466796875],[-76.03183593749999,64.3880859375],[-76.11806640625,64.376318359375],[-76.40683593749999,64.303173828125],[-76.49472656249999,64.29296875],[-76.5615234375,64.301611328125],[-76.62651367187499,64.283935546875],[-76.723828125,64.242041015625],[-76.85615234375,64.237646484375],[-77.02353515624999,64.270849609375],[-77.165673828125,64.28505859375],[-77.28251953124999,64.28037109375],[-77.40288085937499,64.29990234375],[-77.5267578125,64.34375],[-77.62778320312499,64.3634765625],[-77.760498046875,64.36015625],[-77.791162109375,64.36708984375],[-77.98486328125,64.461083984375],[-78.04521484374999,64.499267578125],[-78.174560546875,64.617724609375],[-78.19755859374999,64.6646484375],[-78.20087890625,64.71474609375],[-78.189697265625,64.751806640625],[-78.14462890624999,64.80771484375],[-78.09560546875,64.9392578125],[-78.05527343749999,64.98291015625],[-77.994580078125,65.022607421875],[-77.876171875,65.07294921875],[-77.4474609375,65.161572265625],[-77.36088867187499,65.196533203125],[-77.36386718749999,65.219775390625],[-77.46147460937499,65.328173828125],[-77.460400390625,65.355908203125],[-77.427685546875,65.372119140625],[-77.35800781249999,65.43544921875],[-77.32670898437499,65.453125],[-77.251171875,65.462890625],[-77.094140625,65.430859375],[-76.95859375,65.418017578125],[-76.77890625,65.4138671875],[-76.481689453125,65.3697265625],[-76.06699218749999,65.28544921875],[-75.8283203125,65.22705078125],[-75.64814453125,65.1408203125],[-75.519921875,65.056005859375],[-75.5015625,65.0130859375],[-75.5609375,64.947021484375],[-75.59086914062499,64.927685546875],[-75.589111328125,64.905029296875],[-75.55576171874999,64.87919921875],[-75.452099609375,64.8416015625],[-75.4271484375,64.855859375],[-75.43515625,64.90078125],[-75.413671875,64.938525390625],[-75.36279296875,64.96904296875],[-75.35712890625,65.008740234375],[-75.3966796875,65.057568359375],[-75.44580078125,65.09970703125],[-75.50468749999999,65.13515625],[-75.77294921875,65.25703125],[-75.79868164062499,65.297509765625],[-75.70859375,65.31572265625],[-75.316650390625,65.2748046875],[-75.16630859374999,65.283935546875],[-75.10927734375,65.3314453125],[-75.04775390625,65.36396484375],[-74.98173828124999,65.3814453125],[-74.849853515625,65.3890625],[-74.665478515625,65.366943359375],[-74.57490234375,65.363671875],[-74.494775390625,65.3716796875],[-74.39072265624999,65.39755859375],[-74.23686523437499,65.48388671875],[-74.13847656249999,65.503466796875],[-73.98959960937499,65.5169921875],[-73.8779296875,65.51884765625],[-73.675390625,65.484326171875],[-73.55078125,65.48525390625],[-73.5607421875,65.542919921875],[-73.64340820312499,65.65322265625],[-73.74609375,65.76669921875],[-73.82607421875,65.80517578125],[-74.03310546875,65.87705078125],[-74.27617187499999,66.012744140625],[-74.40107421875,66.09697265625],[-74.43393554687499,66.139013671875],[-74.41640625,66.16708984375],[-74.37490234375,66.208154296875],[-73.93369140624999,66.358056640625],[-73.584228515625,66.50693359375],[-73.43095703124999,66.583154296875],[-73.357373046875,66.636279296875],[-73.28081054687499,66.674951171875],[-73.201123046875,66.699169921875],[-73.03325195312499,66.728173828125],[-72.9853515625,66.765380859375],[-72.974853515625,66.828515625],[-72.94677734375,66.883251953125],[-72.788818359375,67.030615234375],[-72.667724609375,67.070458984375],[-72.48515624999999,67.098095703125],[-72.36494140625,67.1333984375],[-72.22001953124999,67.254296875],[-72.234130859375,67.284423828125],[-72.30107421874999,67.307275390625],[-72.35288085937499,67.34189453125],[-72.57646484374999,67.658642578125],[-72.72529296875,67.81162109375],[-72.903955078125,67.944775390625],[-73.063427734375,68.106982421875],[-73.32822265624999,68.266748046875],[-73.3314453125,68.308984375],[-73.28447265624999,68.356982421875],[-73.306884765625,68.367822265625],[-73.58017578124999,68.29775390625],[-73.644482421875,68.29453125],[-73.749462890625,68.325],[-73.8205078125,68.362939453125],[-73.879345703125,68.42939453125],[-73.87333984374999,68.46416015625],[-73.834423828125,68.4970703125],[-73.78251953124999,68.57802734375],[-73.78061523437499,68.619287109375],[-73.7984375,68.658642578125],[-73.82211914062499,68.685986328125],[-73.8515625,68.7013671875],[-73.93515625,68.710986328125],[-74.072998046875,68.71494140625],[-74.11796874999999,68.700927734375],[-73.966064453125,68.578759765625],[-73.9892578125,68.5486328125],[-74.1828125,68.53544921875],[-74.27011718749999,68.5412109375],[-74.35,68.5560546875],[-74.42241210937499,68.579931640625],[-74.64794921875,68.70751953125],[-74.69580078125,68.75556640625],[-74.68051757812499,68.790283203125],[-74.699951171875,68.808349609375],[-74.74599609375,68.796728515625],[-74.808349609375,68.7958984375],[-74.89296875,68.808154296875],[-74.910400390625,68.82314453125],[-74.752392578125,68.89208984375],[-74.74326171874999,68.91337890625],[-74.81611328125,68.9361328125],[-74.92509765624999,68.94072265625],[-74.95400390625,68.961083984375],[-74.91728515624999,68.982861328125],[-74.76933593749999,69.020654296875],[-74.71669921875,69.0455078125],[-74.80546874999999,69.0642578125],[-74.8548828125,69.0658203125],[-74.95444335937499,69.024609375],[-75.104248046875,68.940576171875],[-75.21328125,68.909375],[-75.362744140625,68.948291015625],[-75.456982421875,68.961279296875],[-75.52265625,68.952734375],[-75.623046875,68.887744140625],[-75.842236328125,68.840185546875],[-76.23471679687499,68.72802734375],[-76.40341796874999,68.692333984375],[-76.58505859374999,68.69873046875],[-76.61943359374999,68.72138671875],[-76.61625976562499,68.75986328125],[-76.603662109375,68.791552734375],[-76.58173828125,68.81630859375],[-76.57456054687499,68.8466796875],[-76.58769531249999,68.974462890625],[-76.55722656249999,69.00947265625],[-76.49516601562499,69.030419921875],[-76.38090820312499,69.05244140625],[-76.08920898437499,69.026171875],[-75.95371093749999,69.030810546875],[-75.85859375,69.060302734375],[-75.76337890625,69.1029296875],[-75.66796875,69.158837890625],[-75.64775390624999,69.212548828125],[-75.74907226562499,69.299560546875],[-75.78715820312499,69.31865234375],[-76.046484375,69.386376953125],[-76.18979492187499,69.410986328125],[-76.31621093749999,69.421630859375],[-76.407958984375,69.44111328125],[-76.46494140624999,69.46943359375],[-76.52036132812499,69.5166015625],[-76.52495117187499,69.548681640625],[-76.51611328125,69.59091796875],[-76.46328125,69.619970703125],[-76.231103515625,69.653466796875],[-76.23408203125,69.662109375],[-76.423828125,69.68681640625],[-76.51328125,69.683935546875],[-76.5900390625,69.65625],[-76.6865234375,69.591259765625],[-76.742333984375,69.572900390625],[-76.91557617187499,69.611181640625],[-77.01962890624999,69.616845703125],[-77.08994140624999,69.635107421875],[-77.12880859375,69.652734375],[-77.105078125,69.670751953125],[-77.018701171875,69.6890625],[-76.868603515625,69.745166015625],[-76.85859375,69.775390625],[-76.96225585937499,69.824853515625],[-77.01596679687499,69.8361328125],[-77.23247070312499,69.85458984375],[-77.494287109375,69.83623046875],[-77.59165039062499,69.84560546875],[-77.63530273437499,69.900439453125],[-77.66298828125,69.96572265625],[-77.674755859375,70.04150390625],[-77.721923828125,70.17080078125],[-77.77402343749999,70.238525390625],[-77.842529296875,70.2470703125],[-78.15678710937499,70.219140625],[-78.2314453125,70.218798828125],[-78.2828125,70.229150390625],[-78.49072265625,70.315576171875],[-78.57480468749999,70.34619140625],[-78.62143554687499,70.35341796875],[-78.77265625,70.4453125],[-78.83085937499999,70.46318359375],[-78.89990234375,70.508544921875],[-78.97978515624999,70.58134765625],[-79.06640625,70.603564453125],[-79.159765625,70.575244140625],[-79.253173828125,70.534716796875],[-79.346630859375,70.481884765625],[-79.39731445312499,70.437255859375],[-79.405224609375,70.400732421875],[-79.347412109375,70.372314453125],[-79.017529296875,70.3251953125],[-78.933837890625,70.293701171875],[-78.86284179687499,70.24189453125],[-78.809814453125,70.178564453125],[-78.774853515625,70.10361328125],[-78.77783203125,70.04765625],[-78.818798828125,70.01044921875],[-78.8896484375,69.977490234375],[-79.09287109374999,69.925341796875],[-79.30332031249999,69.89482421875],[-79.51542968749999,69.88759765625],[-79.61591796875,69.8947265625],[-80.162109375,69.99599609375],[-80.260400390625,69.99677734375],[-80.38681640624999,70.01044921875],[-80.6703125,70.052099609375],[-80.82578125,70.056640625],[-81.098291015625,70.091162109375],[-81.5595703125,70.11123046875],[-81.651953125,70.09462890625],[-81.529248046875,70.048046875],[-81.42172851562499,70.024609375],[-81.3294921875,70.024365234375],[-81.19682617187499,69.9828125],[-81.02373046874999,69.9],[-80.9248046875,69.8505859375],[-80.84287109374999,69.791650390625],[-80.840283203125,69.77138671875],[-80.92172851562499,69.730908203125],[-81.564697265625,69.942724609375],[-81.95771484375,69.86875],[-82.13872070312499,69.8412109375],[-82.29384765625,69.8369140625],[-82.487744140625,69.865966796875],[-82.925390625,69.9681640625],[-83.09116210937499,70.00390625],[-83.14995117187499,70.00908203125],[-83.53076171875,69.964794921875],[-83.85908203125,69.962744140625],[-84.521875,70.005224609375],[-84.76513671875,70.033642578125],[-84.82919921874999,70.063330078125],[-84.90908203125,70.07822265625],[-85.05263671875,70.07822265625],[-85.432373046875,70.111376953125],[-85.780029296875,70.036669921875],[-86.198193359375,70.105126953125],[-86.322021484375,70.14541015625],[-86.36142578124999,70.173046875],[-86.48310546875,70.28857421875],[-86.49980468749999,70.350390625],[-86.46538085937499,70.40625],[-86.43100585937499,70.44453125],[-86.396875,70.46533203125],[-86.62431640624999,70.40126953125],[-86.70415039062499,70.39072265625],[-86.80927734375,70.38828125],[-87.1224609375,70.411962890625],[-87.17197265624999,70.399853515625],[-87.15581054687499,70.37744140625],[-87.07402343749999,70.34482421875],[-87.06328124999999,70.32509765625],[-87.237890625,70.309716796875],[-87.50244140625,70.32568359375],[-87.61777343749999,70.31875],[-87.67021484374999,70.309814453125],[-87.789453125,70.258251953125],[-87.838134765625,70.24658203125],[-87.90068359374999,70.251904296875],[-88.17832031249999,70.368603515625],[-88.402099609375,70.44248046875],[-88.66298828125,70.470849609375],[-88.78271484375,70.494482421875],[-88.84843749999999,70.522900390625],[-89.20830078124999,70.759716796875],[-89.25751953125,70.810693359375],[-89.371533203125,70.996142578125],[-89.409765625,71.035693359375],[-89.45590820312499,71.06171875],[-89.36552734374999,71.0671875],[-89.025146484375,71.04462890625],[-88.69565429687499,71.04560546875],[-88.51665039062499,71.03056640625],[-88.30908203125,70.984326171875],[-88.03857421875,70.951318359375],[-87.844921875,70.944384765625],[-87.534423828125,70.956591796875],[-87.181591796875,70.987548828125],[-87.140087890625,71.01162109375],[-87.368603515625,71.05283203125],[-87.57231445312499,71.107568359375],[-87.76025390625,71.178515625],[-87.8724609375,71.208544921875],[-88.06064453124999,71.22724609375],[-88.589501953125,71.240283203125],[-89.079345703125,71.287939453125],[-89.41767578125,71.352197265625],[-89.693310546875,71.423486328125],[-89.80537109375,71.4623046875],[-89.84575195312499,71.49228515625],[-89.88852539062499,71.5857421875],[-89.93369140624999,71.742724609375],[-89.97734374999999,71.848046875],[-90.01953125,71.901806640625],[-90.02519531249999,71.948779296875],[-89.93149414062499,72.0490234375],[-89.663818359375,72.157958984375],[-89.65727539062499,72.175048828125],[-89.710546875,72.180126953125],[-89.822900390625,72.2078125],[-89.85869140624999,72.24833984375],[-89.87309570312499,72.312646484375],[-89.8740234375,72.3671875],[-89.8615234375,72.4119140625],[-89.816845703125,72.467724609375],[-89.70151367187499,72.56806640625],[-89.53642578124999,72.68984375],[-89.35771484374999,72.804150390625],[-89.327099609375,72.841552734375],[-89.31137695312499,72.94296875],[-89.28769531249999,73.016943359375],[-89.26323242187499,73.068994140625],[-89.225341796875,73.108056640625],[-89.11474609375,73.182177734375],[-88.976806640625,73.252490234375],[-88.7609375,73.31240234375],[-88.74252929687499,73.3345703125],[-88.73959960937499,73.365283203125],[-88.72714843749999,73.38818359375],[-88.70517578124999,73.403271484375],[-88.17001953124999,73.5953125],[-87.926416015625,73.67333984375],[-87.71977539062499,73.722900390625],[-87.47236328125,73.759423828125],[-86.76875,73.833984375],[-86.406396484375,73.85478515625],[-85.95078125,73.850146484375],[-85.110498046875,73.808154296875],[-85.00932617187499,73.77861328125],[-84.98359375,73.763720703125],[-84.94677734375,73.721630859375],[-84.97451171875,73.694775390625],[-85.204296875,73.603564453125],[-85.493603515625,73.527685546875],[-85.681884765625,73.461474609375],[-86.00053710937499,73.312548828125],[-86.08647460937499,73.26025390625],[-86.481396484375,72.96025390625],[-86.574658203125,72.910546875],[-86.629345703125,72.87080078125],[-86.66777343749999,72.762548828125],[-86.65629882812499,72.7240234375],[-86.59462890625,72.6611328125],[-86.380322265625,72.524658203125],[-86.32255859374999,72.46083984375],[-86.32402343749999,72.4021484375],[-86.348046875,72.262255859375],[-86.3509765625,72.19130859375],[-86.34135742187499,72.123193359375],[-86.29716796874999,72.02578125],[-86.21845703125,71.89912109375],[-86.0361328125,71.770947265625],[-85.75009765624999,71.641357421875],[-85.53715820312499,71.555419921875],[-85.32719726562499,71.492138671875],[-85.07871093749999,71.398486328125],[-85.023388671875,71.35322265625],[-85.13759765625,71.30341796875],[-85.40537109374999,71.2267578125],[-85.757275390625,71.1939453125],[-85.94541015624999,71.162646484375],[-86.179443359375,71.0958984375],[-86.47324218749999,71.042626953125],[-86.58935546875,71.010791015625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-69.48886718749999,83.016796875],[-68.6732421875,82.998779296875],[-68.40903320312499,83.0052734375],[-68.106884765625,82.961181640625],[-67.92460937499999,82.956005859375],[-67.624462890625,82.964404296875],[-67.4056640625,82.95390625],[-66.59165039062499,82.94404296875],[-66.42255859375,82.92685546875],[-66.4248046875,82.90615234375],[-66.60039062499999,82.86123046875],[-66.836328125,82.817919921875],[-68.357568359375,82.676806640625],[-68.46933593749999,82.653369140625],[-68.1728515625,82.645947265625],[-67.73588867187499,82.65244140625],[-67.39707031249999,82.668115234375],[-66.997705078125,82.716064453125],[-66.86572265625,82.71884765625],[-66.61186523437499,82.74208984375],[-66.12045898437499,82.80712890625],[-65.72744140625,82.842431640625],[-65.54960937499999,82.826953125],[-65.4,82.802392578125],[-65.2990234375,82.799609375],[-65.24658203125,82.818505859375],[-65.16240234374999,82.8701171875],[-65.11318359375,82.888916015625],[-64.98388671875,82.902294921875],[-64.90488281249999,82.900830078125],[-64.7767578125,82.87646484375],[-64.634765625,82.818603515625],[-64.50400390624999,82.77841796875],[-64.43339843749999,82.777734375],[-64.134228515625,82.823193359375],[-63.98359375,82.8291015625],[-63.641015625,82.81259765625],[-63.49873046875,82.792578125],[-63.473046875,82.771240234375],[-63.5640625,82.74873046875],[-63.62060546875,82.729296875],[-63.642529296875,82.71298828125],[-63.592675781249994,82.69404296875],[-63.385400390624994,82.653466796875],[-63.085351562499994,82.565234375],[-63.087060546874994,82.5328125],[-63.25083007812499,82.466845703125],[-63.24677734375,82.4501953125],[-62.47519531249999,82.519580078125],[-61.697167968749994,82.488623046875],[-61.47705078125,82.467431640625],[-61.392480468749994,82.44189453125],[-61.302490234375,82.399755859375],[-61.2072265625,82.341064453125],[-61.27353515624999,82.279833984375],[-61.615380859374994,82.184423828125],[-61.968652343749994,82.11025390625],[-62.176708984375,82.043408203125],[-62.496484375,82.006787109375],[-63.59228515625,81.8455078125],[-64.1279296875,81.79365234375],[-64.435791015625,81.742626953125],[-64.57402343749999,81.733740234375],[-65.226171875,81.743505859375],[-65.399169921875,81.715380859375],[-65.49541015624999,81.66806640625],[-65.70107421875,81.645556640625],[-66.00473632812499,81.629443359375],[-66.625732421875,81.61640625],[-66.7650390625,81.563037109375],[-66.80058593749999,81.526806640625],[-66.86113281249999,81.498681640625],[-66.9140625,81.485107421875],[-68.68852539062499,81.293310546875],[-68.72119140625,81.26123046875],[-68.542578125,81.247998046875],[-68.31767578124999,81.26123046875],[-65.73569335937499,81.49423828125],[-65.239990234375,81.50966796875],[-64.78007812499999,81.49287109375],[-64.832763671875,81.438623046875],[-65.483984375,81.284765625],[-66.31284179687499,81.146142578125],[-66.72685546874999,81.04091796875],[-67.774365234375,80.859423828125],[-68.63046875,80.6787109375],[-68.959375,80.586865234375],[-69.40009765625,80.4228515625],[-69.55068359375,80.383251953125],[-69.7337890625,80.366943359375],[-69.94931640624999,80.373779296875],[-70.143505859375,80.39765625],[-70.40263671874999,80.458984375],[-70.638671875,80.5275390625],[-70.71259765625,80.539599609375],[-70.66782226562499,80.50556640625],[-70.21279296875,80.277734375],[-70.264892578125,80.23359375],[-71.10029296875,80.187060546875],[-71.47006835937499,80.1458984375],[-71.66083984375,80.1359375],[-71.7958984375,80.143359375],[-71.92763671875,80.13916015625],[-72.05595703124999,80.1232421875],[-72.06298828125,80.10556640625],[-71.948681640625,80.086181640625],[-71.61611328125,80.071044921875],[-70.87705078124999,80.122314453125],[-70.75849609375,80.11865234375],[-70.56840820312499,80.093701171875],[-70.55908203125,80.07099609375],[-70.75751953125,79.9982421875],[-71.35581054687499,79.911279296875],[-71.27763671874999,79.90634765625],[-71.10634765625,79.875537109375],[-71.11015624999999,79.847802734375],[-71.298583984375,79.782568359375],[-71.387841796875,79.761767578125],[-71.96455078125,79.70107421875],[-72.21552734375,79.68681640625],[-72.4365234375,79.694384765625],[-73.44814453125,79.827099609375],[-73.805078125,79.8462890625],[-74.14423828125,79.87978515625],[-74.394482421875,79.874072265625],[-74.66020507812499,79.83515625],[-74.54072265625,79.815576171875],[-74.051025390625,79.77822265625],[-73.64208984375,79.77099609375],[-73.47246093749999,79.7564453125],[-73.405908203125,79.732177734375],[-73.22939453125,79.643994140625],[-73.201123046875,79.59658203125],[-73.24013671875,79.552490234375],[-73.29355468749999,79.52158203125],[-73.3615234375,79.50400390625],[-73.466064453125,79.495166015625],[-73.865966796875,79.501416015625],[-74.015380859375,79.49052734375],[-74.188671875,79.46474609375],[-74.406005859375,79.453564453125],[-74.79794921874999,79.45869140625],[-75.25947265625,79.421044921875],[-75.50341796875,79.41416015625],[-75.773828125,79.43115234375],[-76.06689453125,79.473193359375],[-76.37607421874999,79.49443359375],[-76.898828125,79.5123046875],[-76.855078125,79.488232421875],[-76.6708984375,79.478076171875],[-76.29570312499999,79.413623046875],[-76.116357421875,79.326123046875],[-75.947509765625,79.311328125],[-75.602734375,79.23955078125],[-75.353662109375,79.2283203125],[-75.09360351562499,79.20390625],[-74.72724609375,79.2353515625],[-74.481201171875,79.2294921875],[-74.53232421874999,79.052734375],[-74.64091796874999,79.035546875],[-75.233154296875,79.035546875],[-75.5146484375,79.06123046875],[-75.63896484374999,79.087744140625],[-75.91181640625,79.1177734375],[-76.15756835937499,79.100390625],[-76.38037109375,79.104150390625],[-76.5314453125,79.0865234375],[-76.771142578125,79.087158203125],[-77.398046875,79.057275390625],[-77.729248046875,79.05693359375],[-77.973779296875,79.076220703125],[-78.25791015624999,79.082177734375],[-78.581640625,79.075],[-78.558984375,79.05458984375],[-78.42177734375,79.048388671875],[-78.22197265624999,79.01513671875],[-78.03681640625,78.963916015625],[-77.882763671875,78.9423828125],[-77.6982421875,78.954541015625],[-77.510400390625,78.978466796875],[-76.82480468749999,79.01787109375],[-76.52412109375,79.02421875],[-76.255859375,79.0068359375],[-76.07734375,78.98515625],[-75.95268554687499,78.959033203125],[-75.795068359375,78.88974609375],[-75.399853515625,78.881298828125],[-75.09853515625,78.85830078125],[-74.618408203125,78.75771484375],[-74.486328125,78.75009765625],[-74.43310546875,78.72412109375],[-74.53505859375,78.65927734375],[-74.54658203125,78.6203125],[-74.87861328125,78.54482421875],[-75.39658203124999,78.5228515625],[-75.9658203125,78.529833984375],[-76.373486328125,78.52109375],[-76.41611328124999,78.5115234375],[-76.13652343749999,78.49169921875],[-75.48837890624999,78.403515625],[-75.23720703125,78.355712890625],[-75.19345703124999,78.327734375],[-75.55068359375,78.22109375],[-75.865966796875,78.009814453125],[-75.96962890625,77.993115234375],[-76.0775390625,77.9873046875],[-76.35556640624999,77.991015625],[-76.70810546874999,77.937890625],[-76.9740234375,77.92724609375],[-77.45595703125,77.94716796875],[-78.01259765625,77.946044921875],[-78.056396484375,77.91171875],[-78.084130859375,77.84609375],[-78.0810546875,77.74736328125],[-78.04716796874999,77.615478515625],[-78.076171875,77.51904296875],[-78.16796875,77.45810546875],[-78.28374023437499,77.4130859375],[-78.49321289062499,77.369384765625],[-78.70849609375,77.342138671875],[-78.86953125,77.33251953125],[-79.13759765625,77.331005859375],[-79.906396484375,77.299560546875],[-80.281689453125,77.30146484375],[-80.57304687499999,77.314794921875],[-80.874609375,77.35859375],[-81.37685546875,77.48212890625],[-81.519287109375,77.5095703125],[-81.65908203125,77.525439453125],[-81.65380859375,77.498828125],[-81.503564453125,77.42978515625],[-81.378173828125,77.385205078125],[-81.277734375,77.365185546875],[-81.30136718749999,77.34404296875],[-81.52294921875,77.31083984375],[-81.767333984375,77.295947265625],[-82.056787109375,77.296533203125],[-82.066015625,77.283642578125],[-81.96782226562499,77.2478515625],[-81.840234375,77.214111328125],[-81.75634765625,77.20400390625],[-81.53447265624999,77.214453125],[-81.27744140624999,77.257080078125],[-81.1171875,77.26962890625],[-80.79819335937499,77.25947265625],[-80.67255859375,77.244287109375],[-80.27421874999999,77.150927734375],[-80.218701171875,77.14658203125],[-79.92373046875,77.193603515625],[-79.497265625,77.19609375],[-79.34086914062499,77.1583984375],[-79.28110351562499,77.08515625],[-79.273828125,77.02578125],[-79.31894531249999,76.98037109375],[-79.22075195312499,76.93603515625],[-78.97919921875,76.89287109375],[-78.79179687499999,76.88359375],[-78.65854492187499,76.9080078125],[-78.45595703125,76.967236328125],[-78.37001953125,76.98125],[-78.28886718749999,76.977978515625],[-78.16508789062499,76.934912109375],[-77.99873046875,76.851953125],[-77.98330078125,76.75498046875],[-78.11870117187499,76.64404296875],[-78.284326171875,76.571240234375],[-78.93427734375,76.451171875],[-79.13071289062499,76.403955078125],[-79.285888671875,76.35478515625],[-79.51103515624999,76.310498046875],[-79.953564453125,76.25126953125],[-80.18681640624999,76.240185546875],[-80.69028320312499,76.17646484375],[-80.79970703125,76.173583984375],[-80.96293945312499,76.183935546875],[-80.99667968749999,76.214990234375],[-80.95517578124999,76.270166015625],[-80.90122070312499,76.321533203125],[-80.83481445312499,76.369140625],[-80.83237304687499,76.408642578125],[-80.97451171875,76.470068359375],[-81.074365234375,76.498486328125],[-81.17070312499999,76.512744140625],[-81.36479492187499,76.5044921875],[-81.47446289062499,76.487646484375],[-81.5919921875,76.484423828125],[-81.71738281249999,76.494970703125],[-81.82294921875,76.520849609375],[-82.0341796875,76.62939453125],[-82.113720703125,76.643212890625],[-82.217919921875,76.639794921875],[-82.31113281249999,76.65537109375],[-82.39345703125,76.689892578125],[-82.52983398437499,76.723291015625],[-82.493408203125,76.697802734375],[-82.35698242187499,76.63603515625],[-82.261962890625,76.57470703125],[-82.20834960937499,76.51376953125],[-82.233154296875,76.4658203125],[-83.38896484374999,76.4392578125],[-83.885693359375,76.453125],[-83.986328125,76.49501953125],[-84.223779296875,76.675341796875],[-84.275341796875,76.35654296875],[-85.141259765625,76.30458984375],[-85.34360351562499,76.31337890625],[-85.68056640625,76.3490234375],[-86.11582031249999,76.434912109375],[-86.29619140624999,76.491845703125],[-86.366845703125,76.5486328125],[-86.41943359375,76.579638671875],[-86.45371093749999,76.58486328125],[-86.5619140625,76.51650390625],[-86.68022460937499,76.376611328125],[-86.977685546875,76.412744140625],[-87.35419921875,76.448046875],[-87.48979492187499,76.58583984375],[-87.49755859375,76.386279296875],[-88.10434570312499,76.412744140625],[-88.39599609375,76.4052734375],[-88.481640625,76.580078125],[-88.495849609375,76.7728515625],[-88.61411132812499,76.65087890625],[-88.56254882812499,76.547216796875],[-88.54580078125,76.4208984375],[-88.8037109375,76.4568359375],[-89.36962890625,76.474462890625],[-89.570068359375,76.491943359375],[-89.5443359375,76.65966796875],[-89.499755859375,76.826806640625],[-88.7708984375,76.993359375],[-88.55620117187499,77.072216796875],[-88.39814453125,77.103955078125],[-88.14794921875,77.1240234375],[-87.82841796874999,77.136474609375],[-87.610498046875,77.12685546875],[-87.36171875,77.13623046875],[-87.064453125,77.165869140625],[-86.852197265625,77.1744140625],[-86.812255859375,77.184912109375],[-86.873779296875,77.20029296875],[-87.10087890624999,77.30771484375],[-87.18242187499999,77.33212890625],[-87.265380859375,77.343017578125],[-87.4296875,77.347802734375],[-87.58916015624999,77.39482421875],[-87.68144531249999,77.436376953125],[-87.78017578125,77.492822265625],[-87.937939453125,77.5998046875],[-88.094677734375,77.719189453125],[-88.0169921875,77.784716796875],[-87.75712890624999,77.83623046875],[-87.49677734375,77.871923828125],[-87.23603515625,77.891796875],[-87.01796875,77.892236328125],[-86.755078125,77.863720703125],[-86.38510742187499,77.80859375],[-86.172998046875,77.746142578125],[-85.906640625,77.613916015625],[-85.731201171875,77.508642578125],[-85.58847656249999,77.4611328125],[-84.95087890625,77.374951171875],[-84.738671875,77.36103515625],[-84.48701171875,77.36796875],[-83.973583984375,77.39052734375],[-83.72128906249999,77.414208984375],[-83.608056640625,77.442236328125],[-83.5498046875,77.482568359375],[-83.47734374999999,77.513623046875],[-83.25029296874999,77.584814453125],[-82.902734375,77.73271484375],[-82.7103515625,77.84951171875],[-82.664697265625,77.888818359375],[-82.62631835937499,77.936328125],[-82.5953125,77.992138671875],[-82.703564453125,77.96240234375],[-83.30375976562499,77.67373046875],[-83.42822265625,77.6212890625],[-83.77939453124999,77.5326171875],[-83.928173828125,77.518310546875],[-84.16782226562499,77.522705078125],[-84.48583984375,77.561962890625],[-84.860546875,77.49951171875],[-85.087890625,77.515380859375],[-85.28935546874999,77.559033203125],[-85.29204101562499,77.7638671875],[-85.54755859375,77.927685546875],[-85.26533203125,78.010595703125],[-85.031494140625,78.06201171875],[-84.6154296875,78.195703125],[-84.524169921875,78.1970703125],[-84.22270507812499,78.176025390625],[-84.388134765625,78.20634765625],[-84.55,78.2513671875],[-84.9103515625,78.239697265625],[-84.783203125,78.527587890625],[-85.02431640625,78.31240234375],[-85.270166015625,78.19951171875],[-85.41899414062499,78.142431640625],[-85.5859375,78.1095703125],[-86.2177734375,78.081201171875],[-86.06259765624999,78.186962890625],[-85.920068359375,78.34287109375],[-86.070947265625,78.284619140625],[-86.42705078124999,78.197021484375],[-86.693603515625,78.151025390625],[-86.913232421875,78.126806640625],[-87.33935546875,78.132666015625],[-87.5517578125,78.176611328125],[-87.49111328125,78.284423828125],[-87.49130859374999,78.4171875],[-87.361279296875,78.4787109375],[-87.164306640625,78.5576171875],[-86.95292968749999,78.663916015625],[-86.80791015624999,78.774365234375],[-86.24189453125,78.8236328125],[-85.691015625,78.843701171875],[-85.2296875,78.902001953125],[-85.00375976562499,78.912255859375],[-84.787255859375,78.8845703125],[-83.90791015625,78.83916015625],[-83.547021484375,78.8044921875],[-83.38872070312499,78.779345703125],[-83.271435546875,78.7703125],[-83.147412109375,78.807861328125],[-82.98979492187499,78.844140625],[-82.441796875,78.8404296875],[-82.290673828125,78.8470703125],[-82.15107421875,78.864111328125],[-81.981103515625,78.898486328125],[-81.78081054687499,78.950341796875],[-81.75009765624999,78.97578125],[-81.889111328125,78.974853515625],[-82.0283203125,78.961865234375],[-82.23740234374999,78.924072265625],[-82.43876953124999,78.903662109375],[-82.64409179687499,78.90751953125],[-83.058544921875,78.939501953125],[-83.77861328124999,78.945263671875],[-84.14580078124999,78.959814453125],[-84.31611328125,78.97529296875],[-84.41201171875,78.99658203125],[-84.495849609375,79.028564453125],[-84.5677734375,79.0712890625],[-84.5302734375,79.10126953125],[-84.38359374999999,79.1185546875],[-84.25664062499999,79.12216796875],[-84.05302734374999,79.098681640625],[-83.824609375,79.058837890625],[-83.57587890625,79.053662109375],[-83.66201171875,79.0900390625],[-83.978125,79.163134765625],[-84.19736328124999,79.22509765625],[-84.3810546875,79.30126953125],[-84.522412109375,79.376611328125],[-84.83642578125,79.4947265625],[-85.089794921875,79.612158203125],[-85.268505859375,79.664111328125],[-85.45693359375,79.68984375],[-86.031494140625,79.721923828125],[-86.146630859375,79.742822265625],[-86.42075195312499,79.84521484375],[-86.4943359375,80.0181640625],[-86.614501953125,80.12353515625],[-86.49853515625,80.258251953125],[-86.30717773437499,80.3193359375],[-85.159619140625,80.27177734375],[-84.675439453125,80.27890625],[-84.05654296875,80.261962890625],[-83.7236328125,80.228955078125],[-83.34375,80.14697265625],[-83.004296875,80.05458984375],[-82.677490234375,79.9927734375],[-82.37700195312499,79.908251953125],[-82.048779296875,79.782763671875],[-81.855712890625,79.72255859375],[-81.68837890625,79.685791015625],[-81.463037109375,79.654150390625],[-81.0380859375,79.614208984375],[-80.66782226562499,79.601025390625],[-80.47592773437499,79.60625],[-80.27060546874999,79.635205078125],[-80.124462890625,79.669482421875],[-80.28745117187499,79.678955078125],[-80.714013671875,79.674951171875],[-81.01015625,79.693115234375],[-81.17905273437499,79.733447265625],[-81.35869140624999,79.78779296875],[-81.64423828125,79.890234375],[-81.86025390625,79.957177734375],[-82.33237304687499,80.066357421875],[-82.681298828125,80.17490234375],[-82.9611328125,80.277880859375],[-82.98701171875,80.322607421875],[-82.784814453125,80.353759765625],[-82.5361328125,80.375537109375],[-80.979638671875,80.445263671875],[-80.05107421874999,80.528564453125],[-79.67436523437499,80.625244140625],[-79.629345703125,80.6478515625],[-78.386181640625,80.784375],[-77.50712890624999,80.834765625],[-77.169140625,80.842919921875],[-76.86298828125,80.864794921875],[-76.850341796875,80.878173828125],[-77.1185546875,80.896435546875],[-77.38945312499999,80.905419921875],[-78.00380859375,80.904833984375],[-78.5509765625,80.921435546875],[-78.7162109375,80.95166015625],[-78.68193359374999,81.00107421875],[-78.629296875,81.04345703125],[-78.46396484374999,81.11435546875],[-78.28681640625,81.167626953125],[-77.53603515625,81.32109375],[-77.030712890625,81.385693359375],[-76.88510742187499,81.4302734375],[-77.97236328125,81.330810546875],[-78.35214843749999,81.258935546875],[-78.73388671875,81.151025390625],[-78.93154296875,81.11923828125],[-79.0724609375,81.12763671875],[-79.19833984374999,81.117578125],[-79.30917968749999,81.0890625],[-79.40214843749999,81.036865234375],[-79.47724609375,80.960986328125],[-79.54541015625,80.909326171875],[-79.606640625,80.881787109375],[-79.761328125,80.841943359375],[-80.133544921875,80.763916015625],[-81.00703125,80.6548828125],[-81.3009765625,80.627197265625],[-81.552685546875,80.622802734375],[-82.36821289062499,80.561328125],[-82.613037109375,80.55888671875],[-82.88432617187499,80.5775390625],[-82.768310546875,80.6306640625],[-82.33676757812499,80.728662109375],[-82.22236328125,80.772314453125],[-82.4984375,80.76279296875],[-82.77998046875,80.73603515625],[-83.40141601562499,80.71396484375],[-83.647119140625,80.674072265625],[-83.88535156249999,80.6017578125],[-84.07626953124999,80.55625],[-84.21977539062499,80.53779296875],[-84.41782226562499,80.5267578125],[-85.14584960937499,80.521142578125],[-85.30742187499999,80.5259765625],[-85.726220703125,80.58115234375],[-86.09716796875,80.562109375],[-86.25034179687499,80.565771484375],[-86.53159179687499,80.604736328125],[-86.6154296875,80.630029296875],[-86.60307617187499,80.664013671875],[-86.44047851562499,80.72802734375],[-86.252099609375,80.78955078125],[-85.639306640625,80.924609375],[-85.2462890625,80.987890625],[-84.679931640625,81.0423828125],[-83.34921875,81.1033203125],[-83.288818359375,81.14794921875],[-84.63544921875,81.098095703125],[-85.780859375,81.03505859375],[-85.966796875,81.0119140625],[-86.23344726562499,80.95009765625],[-87.0802734375,80.72626953125],[-87.32988281249999,80.669775390625],[-87.711669921875,80.65625],[-88.003662109375,80.675390625],[-88.23198242187499,80.70380859375],[-88.62509765624999,80.770068359375],[-88.92143554687499,80.805615234375],[-89.061669921875,80.829541015625],[-89.14458007812499,80.853662109375],[-89.21176757812499,80.88193359375],[-89.26328125,80.914306640625],[-89.16689453125,80.94130859375],[-88.4130859375,80.999755859375],[-87.388671875,80.98837890625],[-86.92900390624999,81.000439453125],[-86.4767578125,81.0357421875],[-85.8095703125,81.123583984375],[-85.08330078124999,81.246875],[-84.94121093749999,81.28623046875],[-85.206298828125,81.294873046875],[-85.402490234375,81.285302734375],[-85.87504882812499,81.2412109375],[-86.62275390625,81.12265625],[-87.27509765625,81.080810546875],[-88.88681640624999,81.05849609375],[-89.398388671875,81.025341796875],[-89.623046875,81.032470703125],[-89.79228515624999,81.06484375],[-89.98095703125,81.12470703125],[-89.94731445312499,81.17265625],[-89.56337890625,81.22646484375],[-89.26254882812499,81.2390625],[-89.20869140625,81.25009765625],[-89.635693359375,81.30205078125],[-89.67368164062499,81.32861328125],[-89.427001953125,81.387451171875],[-88.89228515625,81.47412109375],[-88.62192382812499,81.501416015625],[-88.12651367187499,81.518798828125],[-87.61669921875,81.509326171875],[-87.59702148437499,81.525830078125],[-88.10136718749999,81.558642578125],[-88.47905273437499,81.5646484375],[-88.97836914062499,81.54150390625],[-90.30351562499999,81.401123046875],[-90.41630859374999,81.40537109375],[-90.609033203125,81.429541015625],[-90.55375976562499,81.464208984375],[-89.84521484375,81.611669921875],[-89.8216796875,81.63486328125],[-90.33085937499999,81.63154296875],[-90.48037109375,81.638525390625],[-90.62631835937499,81.656005859375],[-90.833740234375,81.640478515625],[-91.102734375,81.5919921875],[-91.2923828125,81.571240234375],[-91.402783203125,81.57822265625],[-91.68408203125,81.635693359375],[-91.64755859374999,81.683837890625],[-91.423828125,81.74423828125],[-91.219482421875,81.787744140625],[-90.94194335937499,81.82744140625],[-90.490185546875,81.87724609375],[-90.163037109375,81.89404296875],[-89.63334960937499,81.89453125],[-89.381005859375,81.916748046875],[-89.15634765624999,81.955419921875],[-88.875244140625,82.018017578125],[-88.566845703125,82.061083984375],[-88.06318359375,82.096484375],[-87.638916015625,82.08505859375],[-87.40439453124999,82.05419921875],[-87.2181640625,82.00009765625],[-87.018212890625,81.958740234375],[-86.99921875,81.992138671875],[-86.83403320312499,82.033349609375],[-86.62680664062499,82.051025390625],[-86.37753906249999,82.0451171875],[-86.158349609375,82.025537109375],[-85.87480468749999,81.97568359375],[-85.645654296875,81.953271484375],[-85.53798828125,81.954638671875],[-85.40317382812499,81.9822265625],[-85.04482421875,81.9828125],[-85.05224609375,81.99453125],[-85.16923828124999,82.023388671875],[-85.31059570312499,82.043994140625],[-86.58061523437499,82.18720703125],[-86.615625,82.2185546875],[-86.18759765624999,82.24794921875],[-85.92001953124999,82.283056640625],[-85.79443359375,82.2916015625],[-85.480859375,82.36630859375],[-85.27597656249999,82.405224609375],[-84.89682617187499,82.4494140625],[-84.74472656249999,82.437353515625],[-84.553369140625,82.39833984375],[-84.368115234375,82.37392578125],[-83.8236328125,82.35068359375],[-83.59067382812499,82.32646484375],[-83.17568359375,82.18720703125],[-83.01015625,82.14169921875],[-82.77421874999999,82.094921875],[-82.63369140625,82.077294921875],[-82.35600585937499,82.066015625],[-82.32744140624999,82.09248046875],[-82.65708007812499,82.15830078125],[-82.7474609375,82.196435546875],[-82.70859375,82.2287109375],[-82.63837890625,82.245751953125],[-82.53691406249999,82.247265625],[-82.2765625,82.21845703125],[-81.58447265625,82.120556640625],[-80.54990234374999,82.00458984375],[-80.15336914062499,81.97763671875],[-79.908642578125,81.93623046875],[-79.685546875,81.885888671875],[-79.46562,81.851123046875],[-79.42485351562499,81.854443359375],[-79.62949218749999,81.93232421875],[-80.129833984375,82.028369140625],[-81.46826171875,82.1923828125],[-81.99760742187499,82.278271484375],[-82.253662109375,82.336328125],[-82.44755859374999,82.39501953125],[-82.4513671875,82.427099609375],[-82.26889648437499,82.4646484375],[-82.02324218749999,82.494384765625],[-81.7177734375,82.50625],[-81.68115234375,82.51865234375],[-81.95859375,82.563232421875],[-82.122509765625,82.6017578125],[-82.116845703125,82.628662109375],[-81.7853515625,82.64921875],[-81.5796875,82.643017578125],[-81.1888671875,82.594482421875],[-80.8625,82.571533203125],[-80.80966796874999,82.586376953125],[-81.146630859375,82.715576171875],[-81.17807617187499,82.744677734375],[-81.128173828125,82.76171875],[-81.01015625,82.779052734375],[-80.65712890625,82.769091796875],[-80.07578125,82.706201171875],[-79.03505859375,82.674658203125],[-78.748779296875,82.67939453125],[-78.79179687499999,82.693896484375],[-79.2072265625,82.732763671875],[-79.6419921875,82.7849609375],[-79.83378906249999,82.81650390625],[-79.97431640625,82.858984375],[-80.14116210937499,82.89423828125],[-80.154931640625,82.9111328125],[-79.886328125,82.938525390625],[-79.18056640625,82.933203125],[-78.52495117187499,82.89111328125],[-77.96865234375,82.90634765625],[-77.61806640625,82.895849609375],[-77.47958984374999,82.883154296875],[-77.22587890624999,82.83720703125],[-76.42099609374999,82.6708984375],[-76.335546875,82.64443359375],[-76.24404296875,82.6041015625],[-76.146484375,82.549853515625],[-76.009375,82.53515625],[-75.7443359375,82.572412109375],[-75.565625,82.608544921875],[-75.64287109374999,82.643505859375],[-76.08696289062499,82.7236328125],[-76.18779296874999,82.75791015625],[-76.40996093749999,82.8158203125],[-76.908447265625,82.91943359375],[-77.0412109375,82.967529296875],[-77.12490234375,83.008544921875],[-75.74492187499999,83.04716796875],[-74.41416015624999,83.013134765625],[-74.19775390625,82.989013671875],[-74.055859375,82.95537109375],[-73.91650390625,82.90419921875],[-73.703125,82.85185546875],[-73.27202148437499,82.77158203125],[-72.65869140625,82.721630859375],[-72.77592773437499,82.7556640625],[-73.23466796874999,82.84423828125],[-73.44189453125,82.904833984375],[-73.44072265624999,82.945849609375],[-73.40380859375,82.9771484375],[-73.33115234374999,82.998779296875],[-72.811669921875,83.081201171875],[-72.06923828125,83.1060546875],[-71.98320312499999,83.101416015625],[-71.40595703125,82.974853515625],[-71.13203125,82.923046875],[-70.940380859375,82.90224609375],[-70.9330078125,82.911279296875],[-71.19833984374999,82.969580078125],[-71.40239257812499,83.00126953125],[-71.42353515625,83.021142578125],[-71.08481445312499,83.082666015625],[-70.870556640625,83.09814453125],[-69.969921875,83.11611328125],[-69.86767578125,83.109619140625],[-69.78212890625,83.092529296875],[-69.56938476562499,83.02490234375],[-69.48886718749999,83.016796875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-94.308349609375,71.764892578125],[-94.17124023437499,71.758447265625],[-94.08598632812499,71.771142578125],[-93.810205078125,71.766259765625],[-93.7462890625,71.742822265625],[-93.75087890625,71.716650390625],[-93.781640625,71.67431640625],[-93.762841796875,71.638037109375],[-93.57587890625,71.568701171875],[-93.407470703125,71.520703125],[-93.25634765625,71.46083984375],[-93.03129882812499,71.335693359375],[-92.982568359375,71.300341796875],[-92.948681640625,71.262109375],[-92.89018554687499,71.12236328125],[-92.88271484375,71.0693359375],[-92.90419921875,70.916064453125],[-92.92197265624999,70.887109375],[-92.9814453125,70.85224609375],[-92.960888671875,70.838134765625],[-92.78300781249999,70.79814453125],[-92.64169921874999,70.718798828125],[-92.56748046874999,70.693212890625],[-92.38847656249999,70.650439453125],[-92.35581054687499,70.63427734375],[-92.315380859375,70.60751953125],[-92.214453125,70.492919921875],[-92.04912109374999,70.3896484375],[-92.03720703124999,70.3673828125],[-92.07260742187499,70.31875],[-92.04736328125,70.3033203125],[-91.983544921875,70.285546875],[-91.926220703125,70.294775390625],[-91.87553710937499,70.33115234375],[-91.82041015624999,70.341650390625],[-91.76083984374999,70.32626953125],[-91.71562,70.29921875],[-91.654052734375,70.232958984375],[-91.5640625,70.178271484375],[-91.57163085937499,70.161572265625],[-91.61611328125,70.1478515625],[-91.85859375,70.132666015625],[-91.99497070312499,70.143212890625],[-92.121044921875,70.169921875],[-92.208642578125,70.197509765625],[-92.29033203124999,70.23984375],[-92.3205078125,70.2353515625],[-92.36328125,70.200830078125],[-92.4546875,70.150439453125],[-92.511865234375,70.103857421875],[-92.445751953125,70.083154296875],[-92.12700195312499,70.084521484375],[-92.05771484374999,70.071435546875],[-91.976708984375,70.038671875],[-92.06904296875,69.983984375],[-92.284765625,69.892138671875],[-92.750927734375,69.713916015625],[-92.88779296874999,69.668212890625],[-92.85454101562499,69.6548828125],[-92.80263671875,69.65146484375],[-92.642822265625,69.65927734375],[-92.49345703124999,69.683203125],[-92.311669921875,69.672900390625],[-92.23076171874999,69.653369140625],[-92.25830078125,69.634326171875],[-92.20908203124999,69.6033203125],[-91.91196289062499,69.53125],[-91.72412109375,69.54560546875],[-91.532373046875,69.6150390625],[-91.384228515625,69.649462890625],[-91.201806640625,69.644775390625],[-91.15087890625,69.637158203125],[-91.1703125,69.6203125],[-91.30502929687499,69.581298828125],[-91.42685546874999,69.537939453125],[-91.43994140625,69.52568359375],[-91.28813476562499,69.543212890625],[-90.9501953125,69.515478515625],[-90.78574218749999,69.50859375],[-90.666650390625,69.51552734375],[-90.554931640625,69.5044921875],[-90.45053710937499,69.475439453125],[-90.41557617187499,69.456982421875],[-90.51328125,69.4451171875],[-90.60556640624999,69.4453125],[-90.683984375,69.427734375],[-90.74853515625,69.39248046875],[-90.794580078125,69.346728515625],[-90.82211914062499,69.290478515625],[-90.89228515625,69.26728515625],[-91.00498046874999,69.277099609375],[-91.04921875,69.293017578125],[-91.024853515625,69.315234375],[-91.057763671875,69.318408203125],[-91.1478515625,69.302587890625],[-91.21796875,69.302099609375],[-91.23720703125,69.285546875],[-90.744775390625,69.105908203125],[-90.5873046875,68.946875],[-90.47900390625,68.88115234375],[-90.468359375,68.86376953125],[-90.53896484375,68.819580078125],[-90.54252929687499,68.785986328125],[-90.51015625,68.6888671875],[-90.52524414062499,68.611279296875],[-90.5736328125,68.47470703125],[-90.5283203125,68.4322265625],[-90.423046875,68.3947265625],[-90.36005859375,68.346728515625],[-90.31723632812499,68.330322265625],[-90.28525390624999,68.291650390625],[-90.24775390625,68.267431640625],[-90.20478515625,68.257470703125],[-90.17441406249999,68.27021484375],[-90.15683593749999,68.305517578125],[-90.11640625,68.33857421875],[-90.005322265625,68.398046875],[-89.897705078125,68.490771484375],[-89.87949218749999,68.521533203125],[-89.89658203124999,68.594384765625],[-89.884228515625,68.6255859375],[-89.78310546875,68.7359375],[-89.75083007812499,68.812451171875],[-89.720166015625,68.931591796875],[-89.66660156249999,69.014599609375],[-89.552001953125,69.084912109375],[-89.35190429687499,69.227001953125],[-89.279541015625,69.25546875],[-89.198486328125,69.269482421875],[-89.05673828124999,69.26611328125],[-88.953515625,69.22041015625],[-88.81455078124999,69.135888671875],[-88.63774414062499,69.058837890625],[-88.31552734374999,68.954443359375],[-88.22353515625,68.9150390625],[-88.04135742187499,68.81171875],[-87.96435546875,68.70927734375],[-87.9115234375,68.564697265625],[-87.865966796875,68.47763671875],[-87.827734375,68.448095703125],[-87.810302734375,68.404150390625],[-87.81357421874999,68.345703125],[-87.82792968749999,68.299951171875],[-87.853271484375,68.26689453125],[-87.89267578124999,68.24814453125],[-87.990966796875,68.242041015625],[-88.11113281249999,68.251171875],[-88.14580078124999,68.266015625],[-88.20908203124999,68.33486328125],[-88.23525390625,68.3390625],[-88.34697265624999,68.28828125],[-88.36069335937499,68.25986328125],[-88.31962890624999,68.165771484375],[-88.32509765625,67.98876953125],[-88.31381835937499,67.950341796875],[-88.19589843749999,67.7658203125],[-87.99716796874999,67.62568359375],[-87.49912109374999,67.355322265625],[-87.47080078124999,67.324609375],[-87.417919921875,67.21416015625],[-87.39194335937499,67.191064453125],[-87.359375,67.17724609375],[-87.320263671875,67.1728515625],[-87.266259765625,67.183837890625],[-87.083203125,67.2677734375],[-86.92392578124999,67.35625],[-86.81279296874999,67.402392578125],[-86.74985351562499,67.406103515625],[-86.68203125,67.422314453125],[-86.609375,67.450830078125],[-86.560791015625,67.48212890625],[-86.53642578124999,67.516162109375],[-86.503515625,67.649462890625],[-86.475537109375,67.713134765625],[-86.398046875,67.80009765625],[-86.36967773437499,67.8248046875],[-85.98447265624999,68.045361328125],[-85.952587890625,68.0724609375],[-85.78886718749999,68.32802734375],[-85.731103515625,68.44501953125],[-85.722802734375,68.515478515625],[-85.744873046875,68.578271484375],[-85.733837890625,68.630126953125],[-85.68979492187499,68.670947265625],[-85.64316406249999,68.69970703125],[-85.562451171875,68.72880859375],[-85.5177734375,68.76982421875],[-85.49106445312499,68.773974609375],[-85.425048828125,68.774267578125],[-85.3380859375,68.7462890625],[-85.27509765625,68.741357421875],[-84.867578125,68.77333984375],[-84.86748046874999,68.790380859375],[-85.106640625,68.84404296875],[-85.10434570312499,68.870947265625],[-85.0833984375,68.90791015625],[-85.00830078125,68.94921875],[-84.91606445312499,68.962255859375],[-84.89531249999999,68.988525390625],[-84.892724609375,69.02099609375],[-84.86220703125,69.073974609375],[-84.8900390625,69.0927734375],[-85.113525390625,69.165869140625],[-85.242626953125,69.162744140625],[-85.27548828124999,69.172314453125],[-85.38676757812499,69.231884765625],[-85.42753906249999,69.318408203125],[-85.43193359374999,69.353857421875],[-85.41640625,69.410888671875],[-85.40224609375,69.4267578125],[-85.4091796875,69.452490234375],[-85.43720703125,69.488232421875],[-85.43950195312499,69.519921875],[-85.415966796875,69.54775390625],[-85.430126953125,69.5806640625],[-85.48203125,69.61875],[-85.50244140625,69.651513671875],[-85.447900390625,69.74814453125],[-85.44609374999999,69.777783203125],[-85.4974609375,69.81904296875],[-85.534814453125,69.83505859375],[-85.50737304687499,69.845263671875],[-85.41513671874999,69.84951171875],[-85.30498046874999,69.8361328125],[-85.17680664062499,69.805126953125],[-85.01982421874999,69.80478515625],[-84.833984375,69.83505859375],[-84.64511718749999,69.84970703125],[-84.318798828125,69.843701171875],[-84.241650390625,69.835009765625],[-83.9171875,69.745361328125],[-83.66533203124999,69.69970703125],[-83.551708984375,69.703955078125],[-82.991357421875,69.685888671875],[-82.74560546875,69.6951171875],[-82.618359375,69.691064453125],[-82.374169921875,69.641796875],[-82.390234375,69.60087890625],[-82.495703125,69.5322265625],[-82.63330078125,69.518115234375],[-82.754833984375,69.494384765625],[-82.642041015625,69.4583984375],[-82.30986328124999,69.410009765625],[-82.2318359375,69.332568359375],[-82.208154296875,69.297021484375],[-82.24677734375,69.264990234375],[-82.2275390625,69.248876953125],[-82.150537109375,69.248876953125],[-81.951806640625,69.27607421875],[-81.732177734375,69.25810546875],[-81.4123046875,69.19814453125],[-81.37783203125,69.18564453125],[-81.32158203124999,69.138916015625],[-81.32866210937499,69.119921875],[-81.61142578124999,69.00302734375],[-81.75834960937499,68.95673828125],[-81.95166015625,68.90908203125],[-81.95791015625,68.883642578125],[-81.6869140625,68.878955078125],[-81.476025390625,68.865576171875],[-81.38090820312499,68.850048828125],[-81.331298828125,68.827978515625],[-81.26352539062499,68.780615234375],[-81.25249023437499,68.7431640625],[-81.25913085937499,68.692431640625],[-81.28154296874999,68.6572265625],[-81.52685546875,68.55595703125],[-81.63950195312499,68.524365234375],[-81.83139648437499,68.486865234375],[-81.91484374999999,68.4587890625],[-82.006494140625,68.462646484375],[-82.10634765625,68.49853515625],[-82.21015625,68.50625],[-82.397216796875,68.477587890625],[-82.49873046875,68.47861328125],[-82.54863281249999,68.468603515625],[-82.552685546875,68.446484375],[-82.46416015624999,68.382421875],[-82.41298828125,68.357177734375],[-82.39287109374999,68.338330078125],[-82.4306640625,68.306591796875],[-82.42270507812499,68.29658203125],[-82.392529296875,68.28525390625],[-82.222412109375,68.145263671875],[-82.18657226562499,68.134423828125],[-82.151318359375,68.139697265625],[-82.07763671875,68.1796875],[-82.03388671875,68.195947265625],[-82.0125,68.193896484375],[-82.01337890625,68.173388671875],[-82.09189453124999,68.05146484375],[-82.10214843749999,68.018896484375],[-82.10048828125,67.98984375],[-82.06254882812499,67.928173828125],[-81.97646484375,67.86201171875],[-81.8693359375,67.802490234375],[-81.70859375,67.72236328125],[-81.49277343749999,67.6369140625],[-81.4123046875,67.595361328125],[-81.2943359375,67.497412109375],[-81.27011718749999,67.459912109375],[-81.30107421874999,67.356982421875],[-81.38720703125,67.18857421875],[-81.44272460937499,67.09287109375],[-81.46757812499999,67.069873046875],[-81.630078125,67.002001953125],[-81.72236328125,66.986083984375],[-81.874462890625,66.987939453125],[-81.925537109375,66.97470703125],[-82.005078125,66.92041015625],[-82.11318359375,66.82509765625],[-82.19833984374999,66.7646484375],[-82.26054687499999,66.739111328125],[-82.374755859375,66.709423828125],[-82.553662109375,66.62138671875],[-82.64150390625,66.5875],[-82.948876953125,66.550830078125],[-83.19877929687499,66.431494140625],[-83.29838867187499,66.392138671875],[-83.4064453125,66.371240234375],[-83.523095703125,66.36875],[-83.590283203125,66.387841796875],[-83.628369140625,66.460693359375],[-83.65107421875,66.484619140625],[-83.739208984375,66.534375],[-83.92021484374999,66.679052734375],[-83.998046875,66.728515625],[-84.05,66.739501953125],[-84.154443359375,66.731689453125],[-84.2080078125,66.736328125],[-84.324365234375,66.781787109375],[-84.36625976562499,66.8111328125],[-84.361083984375,66.82255859375],[-84.27255859374999,66.839208984375],[-84.31035156249999,66.862744140625],[-84.466064453125,66.92744140625],[-84.5306640625,66.961328125],[-84.5384765625,66.972802734375],[-84.692578125,67.0166015625],[-84.84575195312499,67.0287109375],[-85.0400390625,66.9560546875],[-85.113720703125,66.90693359375],[-85.111279296875,66.89091796875],[-85.01826171875,66.8720703125],[-84.977978515625,66.88125],[-84.89902343749999,66.9265625],[-84.857373046875,66.940673828125],[-84.737744140625,66.93359375],[-84.63857421875,66.90234375],[-84.6025390625,66.875146484375],[-84.589501953125,66.856640625],[-84.31894531249999,66.71181640625],[-84.223046875,66.682470703125],[-84.18310546875,66.6478515625],[-84.152734375,66.590234375],[-84.09423828125,66.526220703125],[-83.96420898437499,66.420556640625],[-83.825830078125,66.289990234375],[-83.79755859375,66.2384765625],[-83.86904296875,66.21357421875],[-83.90507812499999,66.211767578125],[-84.011669921875,66.231201171875],[-84.29306640624999,66.291796875],[-84.32426757812499,66.290673828125],[-84.3984375,66.258740234375],[-84.459375,66.18623046875],[-84.47841796875,66.179296875],[-84.628076171875,66.20771484375],[-84.9083984375,66.271337890625],[-85.09619140625,66.325341796875],[-85.19150390624999,66.369677734375],[-85.3068359375,66.44033203125],[-85.44223632812499,66.537353515625],[-85.60385742187499,66.56826171875],[-85.791748046875,66.532958984375],[-86.063232421875,66.520361328125],[-86.633203125,66.53134765625],[-86.708154296875,66.523046875],[-86.73710937499999,66.510888671875],[-86.688623046875,66.457470703125],[-86.700146484375,66.4427734375],[-86.73837890624999,66.432861328125],[-86.74697265625,66.41708984375],[-86.68510742187499,66.360400390625],[-86.58476562499999,66.321923828125],[-86.301025390625,66.269921875],[-86.11308593749999,66.22529296875],[-86.00083007812499,66.18681640625],[-85.9642578125,66.154443359375],[-85.958740234375,66.11904296875],[-86.01225585937499,66.048486328125],[-86.04287109375,66.02255859375],[-86.70195312499999,65.670556640625],[-86.95317382812499,65.528271484375],[-87.08110351562499,65.4408203125],[-87.193798828125,65.383056640625],[-87.291455078125,65.354833984375],[-87.452880859375,65.33896484375],[-87.678125,65.3353515625],[-87.969970703125,65.34892578125],[-88.12099609375,65.394580078125],[-88.39487304687499,65.5162109375],[-88.58671874999999,65.587646484375],[-88.67246093749999,65.611572265625],[-88.74394531249999,65.678759765625],[-88.80849609375,65.691650390625],[-88.94614257812499,65.70302734375],[-89.08774414062499,65.73896484375],[-89.420361328125,65.860791015625],[-89.59267578125,65.909326171875],[-89.7494140625,65.93603515625],[-89.89047851562499,65.9408203125],[-89.943994140625,65.93359375],[-89.84775390624999,65.872265625],[-89.88969726562499,65.8685546875],[-90.00380859375,65.882568359375],[-90.1166015625,65.882421875],[-90.31625976562499,65.9263671875],[-90.51328125,65.9205078125],[-90.65546875,65.929345703125],[-90.82573242187499,65.953857421875],[-91.009521484375,65.96572265625],[-91.30546874999999,65.96455078125],[-91.4115234375,65.959375],[-91.42724609375,65.947900390625],[-91.28515625,65.89443359375],[-91.04111328124999,65.829833984375],[-91.0736328125,65.885546875],[-91.06494140625,65.89990234375],[-90.98344726562499,65.91923828125],[-90.596826171875,65.884814453125],[-90.158642578125,65.8126953125],[-90.04755859375,65.805615234375],[-89.924072265625,65.7802734375],[-89.78798828125,65.73671875],[-89.60039062499999,65.64775390625],[-89.24174804687499,65.44638671875],[-89.1265625,65.39560546875],[-88.9740234375,65.348291015625],[-88.19780273437499,65.2798828125],[-87.92954101562499,65.280322265625],[-87.39194335937499,65.260546875],[-87.10800781249999,65.2248046875],[-87.0275390625,65.198095703125],[-87.002685546875,65.10859375],[-87.028515625,65.063623046875],[-87.18291015624999,64.926806640625],[-87.280517578125,64.826171875],[-87.885009765625,64.400439453125],[-87.96357421875,64.302490234375],[-87.99755859375,64.2439453125],[-88.105615234375,64.18330078125],[-88.37895507812499,64.0892578125],[-88.65302734375,64.009375],[-88.81772460937499,63.992236328125],[-88.96440429687499,64.01123046875],[-89.05961914062499,64.034423828125],[-89.200634765625,64.11376953125],[-89.209423828125,64.105419921875],[-89.107666015625,63.981103515624994],[-89.13154296875,63.968505859375],[-89.21455078125,63.984130859375],[-89.403515625,64.039990234375],[-89.46474609375,64.0296875],[-89.500927734375,64.014501953125],[-89.55131835937499,64.014794921875],[-89.61582031249999,64.030615234375],[-89.73271484374999,64.076953125],[-89.763818359375,64.09951171875],[-89.79208984374999,64.16826171875],[-89.81132812499999,64.18056640625],[-90.041650390625,64.140869140625],[-90.080029296875,64.127734375],[-89.985595703125,64.1001953125],[-89.953564453125,64.080615234375],[-89.860595703125,63.97880859375],[-89.855712890625,63.956982421875],[-89.921875,63.9435546875],[-90.14189453124999,63.981982421875],[-90.1681640625,63.978759765625],[-90.05961914062499,63.877490234375],[-90.01796875,63.829345703125],[-90.013427734375,63.804296875],[-90.154736328125,63.6896484375],[-90.2453125,63.64189453125],[-90.36884765625,63.624414062499994],[-90.446240234375,63.636181640625],[-90.53349609374999,63.665429687499994],[-90.59638671875,63.661279296874994],[-90.635009765625,63.623779296875],[-90.70683593749999,63.596923828125],[-90.8119140625,63.580908203125],[-90.94565429687499,63.587841796875],[-91.108056640625,63.617822265624994],[-91.538818359375,63.7255859375],[-91.67465820312499,63.742236328125],[-91.926025390625,63.757080078125],[-91.956005859375,63.772314453125],[-91.95380859375,63.78681640625],[-91.91943359375,63.8005859375],[-91.92890625,63.812451171875],[-91.98222656249999,63.822412109374994],[-92.03759765625,63.813037109375],[-92.094873046875,63.784423828125],[-92.19521484375,63.7759765625],[-92.33842773437499,63.787646484375],[-92.55009765624999,63.829541015625],[-92.97021484375,63.937646484374994],[-93.4296875,64.02880859375],[-93.69633789062499,64.14716796875],[-93.59672851562499,64.040576171875],[-93.6048828125,64.0044921875],[-93.65581054687499,63.972802734374994],[-93.66416015624999,63.94140625],[-93.559814453125,63.865283203125],[-93.41557617187499,63.83798828125],[-93.27021484375,63.840869140625],[-93.26621093749999,63.8533203125],[-93.32685546875,63.872265625],[-93.3802734375,63.900048828124994],[-93.405859375,63.9412109375],[-93.378515625,63.948486328125],[-93.250439453125,63.926904296874994],[-93.16591796875,63.901757812499994],[-92.529248046875,63.76123046875],[-92.33920898437499,63.734912109375],[-92.196484375,63.7078125],[-92.156884765625,63.69169921875],[-92.205029296875,63.656787109375],[-92.46103515624999,63.56943359375],[-92.465087890625,63.555078125],[-92.28955078125,63.56298828125],[-92.076611328125,63.639990234375],[-91.95683593749999,63.675634765625],[-91.84184570312499,63.69755859375],[-91.68603515625,63.659716796875],[-91.48930664062499,63.56220703125],[-91.330078125,63.5068359375],[-91.10307617187499,63.47587890625],[-90.97006835937499,63.442773437499994],[-90.74658203125,63.3515625],[-90.71127929687499,63.304052734375],[-90.69072265624999,63.110546875],[-90.69858398437499,63.063867187499994],[-90.72763671874999,63.017480468749994],[-90.77788085937499,62.971630859375],[-90.87119140624999,62.945947265624994],[-91.00771484375,62.9404296875],[-91.114892578125,62.92158203125],[-91.34946289062499,62.818896484375],[-91.448974609375,62.804052734375],[-91.86962890625,62.834716796875],[-92.03422851562499,62.863427734374994],[-92.11005859375,62.86171875],[-92.152099609375,62.8390625],[-92.19614257812499,62.82880859375],[-92.361279296875,62.819384765625],[-92.388134765625,62.80087890625],[-92.37773437499999,62.772412109375],[-92.34526367187499,62.733837890625],[-92.30517578125,62.711669921875],[-92.2431640625,62.683642578125],[-92.14912109375,62.665283203125],[-91.95585937499999,62.644775390625],[-91.93583984374999,62.5923828125],[-91.94443359374999,62.57548828125],[-92.00786132812499,62.54052734375],[-92.08115234374999,62.544091796874994],[-92.2072265625,62.585351562499994],[-92.26953125,62.586962890625],[-92.32407226562499,62.564599609374994],[-92.4,62.5572265625],[-92.49736328124999,62.56484375],[-92.551416015625,62.546728515625],[-92.56220703125,62.502880859375],[-92.594970703125,62.470068359375],[-92.707421875,62.418212890625],[-92.76796875,62.37998046875],[-92.76596679687499,62.349951171875],[-92.70146484374999,62.32822265625],[-92.62744140625,62.279052734375],[-92.54404296874999,62.202294921874994],[-92.527978515625,62.168408203125],[-92.57919921874999,62.17734375],[-92.648095703125,62.207763671875],[-92.734765625,62.259716796875],[-92.86582031249999,62.306201171875],[-93.154443359375,62.366845703124994],[-93.20537109374999,62.36494140625],[-93.17924804687499,62.349560546875],[-92.98779296875,62.2859375],[-92.914453125,62.244970703125],[-92.905517578125,62.21513671875],[-93.065869140625,62.149755859375],[-93.070263671875,62.127832031249994],[-93.027734375,62.108642578125],[-93.016259765625,62.092675781249994],[-93.073388671875,62.060546875],[-93.16748046875,62.033642578125],[-93.349755859375,62.02978515625],[-93.366357421875,62.014550781249994],[-93.296875,61.981591796874994],[-93.2734375,61.961083984374994],[-93.33305664062499,61.93291015625],[-93.372021484375,61.928955078125],[-93.581787109375,61.942041015624994],[-93.52670898437499,61.871630859375],[-93.49423828124999,61.846923828125],[-93.429931640625,61.812109375],[-93.314404296875,61.77978515625],[-93.31201171875,61.76728515625],[-93.35234374999999,61.73955078125],[-93.42060546875,61.705810546875],[-93.70966796875,61.6025390625],[-93.912744140625,61.4814453125],[-93.940869140625,61.44365234375],[-93.88925781249999,61.3640625],[-93.888818359375,61.34404296875],[-93.94199218749999,61.308007812499994],[-94.0607421875,61.317822265625],[-94.083447265625,61.303662109375],[-94.05522460937499,61.266162109375],[-94.049951171875,61.211279296875],[-94.0677734375,61.1388671875],[-94.154052734375,61.025439453125],[-94.30869140624999,60.870996093749994],[-94.427197265625,60.730712890625],[-94.509375,60.604541015625],[-94.56889648437499,60.5419921875],[-94.67875976562499,60.5376953125],[-94.76171875,60.4982421875],[-94.7052734375,60.4775390625],[-94.670654296875,60.4533203125],[-94.64677734374999,60.41640625],[-94.67041015625,60.30107421875],[-94.7416015625,60.107373046875],[-94.785791015625,59.9533203125],[-94.77666015624999,59.478125],[-94.78828125,59.26787109375],[-94.81953125,59.151318359375],[-94.870263671875,59.08798828125],[-94.95732421874999,59.06884765625],[-94.84658203125,59.050341796875],[-94.77617187499999,59.02060546875],[-94.74375,58.975439453125],[-94.71337890625,58.9033203125],[-94.67338867187499,58.8701171875],[-94.62373046875,58.875732421875],[-94.57919921874999,58.86845703125],[-94.539697265625,58.848388671875],[-94.41923828124999,58.745507812499994],[-94.287060546875,58.716015625],[-94.28081054687499,58.658935546875],[-94.33261718749999,58.339111328125],[-94.3322265625,58.29736328125],[-94.27216796875,58.37802734375],[-94.208935546875,58.626367187499994],[-94.123193359375,58.73671875],[-94.05576171874999,58.760009765625],[-93.780029296875,58.77255859375],[-93.48618164062499,58.744482421875],[-93.37504882812499,58.741015625],[-93.27812,58.756396484375],[-93.17875976562499,58.725634765625],[-93.15458984374999,58.694580078125],[-93.12651367187499,58.564404296875],[-93.10019531249999,58.48984375],[-92.92514648437499,58.224511718749994],[-92.841748046875,58.07587890625],[-92.73984375,57.844042968749996],[-92.70166015625,57.777783203125],[-92.4896484375,57.468603515625],[-92.4494140625,57.38486328125],[-92.4328125,57.3203125],[-92.43979492187499,57.275048828125],[-92.47836914062499,57.2052734375],[-92.548486328125,57.1109375],[-92.61411132812499,57.039013671875],[-92.675244140625,56.989550781249996],[-92.73798828125,56.95263671875],[-92.802392578125,56.9283203125],[-92.79814453124999,56.92197265625],[-92.72529296875,56.933544921875],[-92.65097656249999,56.958300781249996],[-92.51030273437499,57.022314453125],[-92.456298828125,57.03671875],[-92.303369140625,57.045849609375],[-92.298291015625,57.022753906249996],[-92.37211914062499,56.975146484374996],[-92.355712890625,56.97060546875],[-92.2490234375,57.008984375],[-92.018017578125,57.063769531249996],[-91.111279296875,57.2412109375],[-90.8974609375,57.25693359375],[-90.5921875,57.224462890625],[-90.34482421874999,57.149072265625],[-90.0751953125,57.051904296875],[-89.79082031249999,56.98134765625],[-89.34233398437499,56.9154296875],[-89.211572265625,56.883837890624996],[-88.948486328125,56.851318359375],[-88.82646484374999,56.814257812499996],[-88.6798828125,56.725048828125],[-88.44707031249999,56.608691406249996],[-88.27133789062499,56.535693359374996],[-88.07509765625,56.46728515625],[-87.878125,56.341601562499996],[-87.56088867187499,56.05634765625],[-87.482421875,56.021289062499996],[-87.286865234375,55.974658203124996],[-86.919384765625,55.91455078125],[-86.376953125,55.773242187499996],[-86.138671875,55.71787109375],[-85.98447265624999,55.6958984375],[-85.830517578125,55.65693359375],[-85.67666015625,55.60107421875],[-85.559326171875,55.540185546875],[-85.478466796875,55.474267578125],[-85.40727539062499,55.43115234375],[-85.28271484375,55.38330078125],[-85.218017578125,55.348974609375],[-85.21201171874999,55.2974609375],[-85.36201171875,55.095458984375],[-85.36528320312499,55.079296875],[-85.21357421875,55.224365234375],[-85.128857421875,55.2662109375],[-85.0609375,55.28564453125],[-84.919921875,55.283349609375],[-84.70576171875,55.259228515625],[-84.51796875,55.25888671875],[-84.35649414062499,55.282519531249996],[-84.2189453125,55.293115234375],[-84.10537109375,55.290820312499996],[-84.02299804687499,55.297802734375],[-83.97177734374999,55.31416015625],[-83.910595703125,55.3146484375],[-83.66767578125,55.264501953125],[-83.569482421875,55.26181640625],[-83.21435546875,55.214599609375],[-82.986279296875,55.231396484375],[-82.947021484375,55.222216796874996],[-82.86777343749999,55.160693359374996],[-82.80068359375,55.155908203125],[-82.6875,55.16552734375],[-82.57744140624999,55.148730468749996],[-82.39326171875,55.067822265625],[-82.308251953125,54.99814453125],[-82.22661132812499,54.855908203125],[-82.219384765625,54.8134765625],[-82.37060546875,54.48349609375],[-82.41806640624999,54.355810546875],[-82.42416992187499,54.244580078125],[-82.394140625,54.18046875],[-82.26357421875,54.072998046875],[-82.239892578125,54.04482421875],[-82.16264648437499,53.885693359375],[-82.14145507812499,53.817626953125],[-82.15,53.739550781249996],[-82.190625,53.6109375],[-82.18037109375,53.512841796875],[-82.14619140625,53.364599609375],[-82.1591796875,53.26416015625],[-82.21923828125,53.211474609374996],[-82.259912109375,53.159814453125],[-82.29160156249999,53.06611328125],[-82.29155273437499,53.030712890625],[-82.26044921875,52.9611328125],[-82.20268554687499,52.921679687499996],[-82.10795898437499,52.877392578125],[-82.02001953125,52.81162109375],[-81.85927734375,52.651416015624996],[-81.742333984375,52.563623046875],[-81.59941406249999,52.4326171875],[-81.5716796875,52.36728515625],[-81.6115234375,52.324072265625],[-81.66123046874999,52.293896484375],[-81.7763671875,52.25361328125],[-81.827880859375,52.22421875],[-81.81455078124999,52.2171875],[-81.64799804687499,52.2390625],[-81.54951171875,52.236767578125],[-81.4662109375,52.2044921875],[-81.398095703125,52.142236328125],[-81.28505859375,52.089208984375],[-81.127197265625,52.04541015625],[-80.968505859375,51.972216796874996],[-80.705517578125,51.79833984375],[-80.657958984375,51.758349609374996],[-80.588037109375,51.667236328125],[-80.495849609375,51.52509765625],[-80.44760742187499,51.4322265625],[-80.443310546875,51.388574218749994],[-80.4955078125,51.344677734375],[-80.67270507812499,51.26474609375],[-80.851220703125,51.125],[-80.79497070312499,51.1318359375],[-80.67724609375,51.190869140625],[-80.47832031249999,51.30732421875],[-80.36796874999999,51.329882812499996],[-80.26567382812499,51.316357421875],[-80.10356445312499,51.282861328124994],[-79.960400390625,51.23515625],[-79.83623046874999,51.17333984375],[-79.651513671875,51.0078125],[-79.45615234374999,50.8755859375],[-79.347900390625,50.762646484375],[-79.38071289062499,50.834521484374996],[-79.45263671875,50.917285156249996],[-79.636181640625,51.0490234375],[-79.714453125,51.117578125],[-79.731396484375,51.15048828125],[-79.737451171875,51.186279296875],[-79.72324218749999,51.25166015625],[-79.68881835937499,51.346582031249994],[-79.64296875,51.413525390625],[-79.58574218749999,51.452441406249996],[-79.54746093749999,51.49384765625],[-79.52802734375,51.5376953125],[-79.49755859375,51.569921875],[-79.33867187499999,51.628173828125],[-79.29697265624999,51.622802734375],[-79.26425781249999,51.552001953125],[-79.22612304687499,51.5373046875],[-79.152734375,51.526220703125],[-79.09086914062499,51.501708984375],[-79.04052734375,51.463769531249994],[-79.005029296875,51.425341796874996],[-78.984326171875,51.386376953124994],[-78.9369140625,51.259130859375],[-78.90317382812499,51.20029296875],[-78.89750976562499,51.2716796875],[-78.85800781249999,51.383935546874994],[-78.82744140624999,51.429980468749996],[-78.73134765625,51.497460937499994],[-78.73642578124999,51.526611328125],[-78.776318359375,51.565771484375],[-78.977734375,51.7337890625],[-78.981640625,51.774560546875],[-78.927880859375,51.798828125],[-78.89111328125,51.8451171875],[-78.871240234375,51.913427734375],[-78.82822265624999,51.96298828125],[-78.70200195312499,52.03271484375],[-78.59331054687499,52.139697265624996],[-78.537353515625,52.21328125],[-78.491650390625,52.252099609375],[-78.44809570312499,52.261376953125],[-78.5130859375,52.29111328125],[-78.52607421875,52.310693359375],[-78.52910156249999,52.399169921875],[-78.557080078125,52.49189453125],[-78.6005859375,52.535107421875],[-78.723779296875,52.627734375],[-78.744140625,52.65537109375],[-78.765771484375,52.760058593749996],[-78.75361328125,52.81240234375],[-78.7216796875,52.8564453125],[-78.73984375,52.898974609374996],[-78.85410156249999,52.97607421875],[-78.89824218749999,53.043359375],[-78.94711914062499,53.206201171875],[-78.99204101562499,53.4103515625],[-79.043115234375,53.560498046875],[-79.100341796875,53.656640625],[-79.11313476562499,53.7171875],[-79.0814453125,53.74228515625],[-79.04033203124999,53.81796875],[-79.003173828125,53.836572265625],[-78.945703125,53.831591796874996],[-78.94438476562499,53.840234375],[-79.03203124999999,53.8810546875],[-79.075146484375,53.932373046875],[-79.07329101562499,53.951416015625],[-78.996044921875,54.002490234374996],[-79.009912109375,54.023974609374996],[-79.067138671875,54.051953125],[-79.241796875,54.098876953125],[-79.17880859374999,54.116943359375],[-79.138818359375,54.1572265625],[-79.146728515625,54.169238281249996],[-79.215966796875,54.185693359375],[-79.295654296875,54.216845703124996],[-79.35615234375,54.26337890625],[-79.43056640625,54.33662109375],[-79.4759765625,54.394775390625],[-79.520654296875,54.491552734375],[-79.59794921874999,54.60166015625],[-79.63173828125,54.6291015625],[-79.67041015625,54.646826171875],[-79.71396484374999,54.65498046875],[-79.712353515625,54.671826171875],[-79.66552734375,54.6974609375],[-78.90922851562499,54.881494140625],[-78.84624023437499,54.908007812499996],[-78.475048828125,55.011035156249996],[-78.30361328125,55.0685546875],[-78.128857421875,55.151318359375],[-77.89111328125,55.23642578125],[-77.77529296875,55.291259765625],[-77.7021484375,55.344189453125],[-77.324951171875,55.555517578125],[-77.16508789062499,55.663525390625],[-77.07255859374999,55.756298828125],[-76.93808593749999,55.867236328124996],[-76.76181640624999,55.996435546875],[-76.65048828124999,56.107226562499996],[-76.60405273437499,56.199560546875],[-76.54638671875,56.3587890625],[-76.52983398437499,56.499951171875],[-76.51962890624999,56.706982421875],[-76.5255859375,56.891796875],[-76.57285156249999,57.181201171874996],[-76.60141601562499,57.272265625],[-76.655419921875,57.38056640625],[-76.786279296875,57.598583984375],[-76.809814453125,57.657958984375],[-76.89091796874999,57.758105468749996],[-77.15678710937499,58.018896484375],[-77.48916015625,58.1953125],[-77.55244140625,58.239599609375],[-77.68408203125,58.291357421875],[-77.88413085937499,58.350732421874994],[-78.01357421875,58.399169921875],[-78.351708984375,58.5806640625],[-78.46298828124999,58.602441406249994],[-78.50590820312499,58.64912109375],[-78.515087890625,58.682373046875],[-78.50229492187499,58.769091796875],[-78.4826171875,58.8291015625],[-78.45869140625,58.873291015625],[-78.43051757812499,58.901757812499994],[-78.24443359374999,59.035058593749994],[-78.140234375,59.141748046874994],[-78.06767578124999,59.2001953125],[-77.98764648437499,59.245507812499994],[-77.84282226562499,59.305029296875],[-77.760693359375,59.380029296874994],[-77.779443359375,59.410400390625],[-77.844677734375,59.443505859374994],[-77.859033203125,59.47578125],[-77.7490234375,59.558154296875],[-77.73349609374999,59.580957031249994],[-77.747509765625,59.65849609375],[-77.726171875,59.67587890625],[-77.59042968749999,59.680517578125],[-77.3966796875,59.569238281249994],[-77.349072265625,59.578955078125],[-77.41103515625,59.609619140625],[-77.485302734375,59.6845703125],[-77.474560546875,59.715673828125],[-77.331640625,59.796630859375],[-77.32763671875,59.833398437499994],[-77.368408203125,59.884375],[-77.37294921875,59.92509765625],[-77.289208984375,60.022021484375],[-77.31181640624999,60.042382812499994],[-77.54716796874999,60.0611328125],[-77.585888671875,60.08818359375],[-77.57216796875,60.100976562499994],[-77.461376953125,60.13349609375],[-77.452880859375,60.14580078125],[-77.6486328125,60.3625],[-77.68144531249999,60.427099609375],[-77.59814453125,60.506738281249994],[-77.503564453125,60.542724609375],[-77.515576171875,60.56318359375],[-77.63945312499999,60.56689453125],[-77.714990234375,60.577783203124994],[-77.79082031249999,60.63984375],[-77.76123046875,60.679052734375],[-77.73422851562499,60.69697265625],[-77.66064453125,60.789501953125],[-77.58955078125,60.80859375],[-77.60302734375,60.8251953125],[-77.871533203125,60.78583984375],[-77.99814453124999,60.818212890625],[-78.1224609375,60.809619140625],[-78.18134765625,60.819140625],[-78.15966796875,60.852197265624994],[-77.93417968749999,61.00263671875],[-77.83012695312499,61.084033203125],[-77.7650390625,61.15751953125],[-77.730615234375,61.206396484375],[-77.726806640625,61.2306640625],[-77.749609375,61.393017578125],[-77.73618164062499,61.437353515625],[-77.648876953125,61.478662109374994],[-77.51435546875,61.556298828124994],[-77.6984375,61.626416015625],[-77.81376953124999,61.694775390625],[-77.889892578125,61.7287109375],[-77.94755859374999,61.761865234374994],[-78.02138671875,61.832080078125],[-78.07749023437499,61.923388671875],[-78.137158203125,62.107373046875],[-78.14697265625,62.20869140625],[-78.13339843749999,62.282275390625],[-78.10859375,62.318115234375],[-78.068115234375,62.355419921875],[-77.89990234375,62.4265625],[-77.603955078125,62.531396484374994],[-77.37241210937499,62.572509765625],[-77.2052734375,62.549951171874994],[-76.87939453125,62.525390625],[-76.616357421875,62.465673828125],[-75.81689453125,62.315869140625],[-75.675537109375,62.24951171875],[-75.809228515625,62.193408203125],[-75.78984374999999,62.179589843749994],[-75.48881835937499,62.28642578125],[-75.40922851562499,62.307080078125],[-75.3412109375,62.312109375],[-75.114013671875,62.270751953125],[-75.02275390624999,62.264453125],[-74.90756835937499,62.230029296875],[-74.632568359375,62.115673828125],[-74.612890625,62.1251953125],[-74.689892578125,62.183447265625],[-74.64580078124999,62.2111328125],[-74.42919921875,62.271826171875],[-74.20546875,62.32138671875],[-74.046484375,62.370019531249994],[-73.87783203125,62.434375],[-73.76396484374999,62.46875],[-73.705078125,62.47314453125],[-73.62998046874999,62.45419921875],[-73.428369140625,62.36884765625],[-73.298974609375,62.325048828125],[-73.19516601562499,62.279150390625],[-73.04936523437499,62.1982421875],[-72.9923828125,62.180419921875],[-72.8818359375,62.125390625],[-72.73496093749999,62.131103515625],[-72.686962890625,62.124560546875],[-72.67080078125,62.1138671875],[-72.64599609375,62.076611328125],[-72.63310546874999,62.052783203125],[-72.63212890624999,62.027246093749994],[-72.666015625,61.955322265625],[-72.771630859375,61.8404296875],[-72.72739257812499,61.838623046875],[-72.66064453125,61.863232421875],[-72.573876953125,61.907128906249994],[-72.50556640625,61.92265625],[-72.3607421875,61.88779296875],[-72.22612304687499,61.831591796875],[-72.178466796875,61.801806640625],[-72.126123046875,61.75322265625],[-72.0814453125,61.728271484375],[-72.0400390625,61.6802734375],[-72.04296875,61.664697265624994],[-72.08203125,61.64140625],[-72.2470703125,61.60205078125],[-72.21586914062499,61.587255859375],[-72.023095703125,61.611962890624994],[-71.96440429687499,61.636279296875],[-71.922265625,61.676953125],[-71.86611328125,61.688525390625],[-71.63828125,61.6171875],[-71.60478515624999,61.5923828125],[-71.61943359374999,61.572900390624994],[-71.656201171875,61.550927734374994],[-71.75576171875,61.526757812499994],[-71.841015625,61.466015625],[-71.85439453125,61.439794921875],[-71.79365234375,61.42119140625],[-71.64531249999999,61.413134765625],[-71.646435546875,61.39873046875],[-71.73212890625,61.3720703125],[-71.74345703124999,61.337255859375],[-71.551513671875,61.21328125],[-71.42270507812499,61.158935546875],[-71.34843749999999,61.148974609375],[-71.17514648437499,61.146533203125],[-71.03496093749999,61.125537109375],[-70.72324218749999,61.05517578125],[-70.540771484375,61.04248046875],[-70.38364257812499,61.06396484375],[-70.279296875,61.06865234375],[-70.18720703125,61.04052734375],[-70.157958984375,61.020654296874994],[-70.144140625,60.981103515624994],[-70.1458984375,60.921826171875],[-70.0953125,60.880273437499994],[-69.992431640625,60.856494140625],[-69.90922851562499,60.860107421875],[-69.800439453125,60.906689453125],[-69.7083984375,60.9146484375],[-69.67758789062499,60.949560546875],[-69.65043945312499,61.01416015625],[-69.62363281249999,61.04951171875],[-69.55698242187499,61.05966796875],[-69.5033203125,61.040429687499994],[-69.471923828125,61.0109375],[-69.41435546874999,60.9224609375],[-69.39833984375,60.882861328125],[-69.404736328125,60.84677734375],[-69.43344726562499,60.8142578125],[-69.48994140625,60.77958984375],[-69.57421875,60.742724609375],[-69.64047851562499,60.689794921875],[-69.72138671875,60.567431640625],[-69.75126953124999,60.487451171874994],[-69.75947265625,60.440234375],[-69.75590820312499,60.388525390625],[-69.74057617187499,60.332275390625],[-69.70849609375,60.2859375],[-69.63310546874999,60.220361328124994],[-69.62875976562499,60.198583984375],[-69.62314453124999,60.145458984375],[-69.62978515625,60.122119140625],[-69.67373046875,60.07587890625],[-69.795654296875,60.029736328125],[-69.962841796875,60.017822265625],[-70.50932617187499,60.015185546875],[-70.65483398437499,60.026220703125],[-70.61972656249999,59.984277343749994],[-70.46665039062499,59.970849609374994],[-70.32685546875,59.97138671875],[-69.8056640625,59.944873046875],[-69.73393554687499,59.918017578125],[-69.6734375,59.870751953124994],[-69.63022460937499,59.821826171875],[-69.58740234375,59.722314453124994],[-69.57939453124999,59.67509765625],[-69.60234374999999,59.622705078124994],[-69.656201171875,59.565087890624994],[-69.6923828125,59.488427734374994],[-69.710888671875,59.392529296875],[-69.681884765625,59.341748046875],[-69.4,59.337792968749994],[-69.34404296874999,59.303076171875],[-69.35043945312499,59.277197265625],[-69.45048828124999,59.180029296875],[-69.45976562499999,59.15244140625],[-69.41411132812499,59.086865234375],[-69.4203125,59.068212890625],[-69.44809570312499,59.049169921875],[-69.47465820312499,59],[-69.50009765624999,58.920654296875],[-69.531640625,58.86923828125],[-69.60820312499999,58.829492187499994],[-69.648388671875,58.82080078125],[-69.67734375,58.83134765625],[-69.75302734374999,58.939599609374994],[-69.7841796875,58.955712890624994],[-69.813671875,58.945556640625],[-69.828515625,58.928759765625],[-69.82861328125,58.90537109375],[-69.84160156249999,58.88115234375],[-69.867578125,58.85615234375],[-69.979150390625,58.816357421875],[-70.15996093749999,58.789404296875],[-70.15434570312499,58.760595703125],[-70.03300781249999,58.745166015625],[-69.878564453125,58.69697265625],[-69.78989257812499,58.689306640625],[-69.650537109375,58.728271484375],[-69.3818359375,58.850732421874994],[-69.27109375,58.883935546874994],[-69.173486328125,58.896630859374994],[-69.063623046875,58.8982421875],[-68.94150390624999,58.888916015625],[-68.698193359375,58.904541015625],[-68.63730468749999,58.89287109375],[-68.562890625,58.86591796875],[-68.47490234374999,58.823486328125],[-68.414306640625,58.78271484375],[-68.38115234374999,58.743505859375],[-68.32646484374999,58.59541015625],[-68.25297851562499,58.556640625],[-68.23515624999999,58.528173828125],[-68.22939453125,58.4845703125],[-68.23388671875,58.39921875],[-68.314697265625,58.226904296875],[-68.35654296874999,58.163232421874994],[-68.4681640625,58.076318359374994],[-68.596875,58.036865234375],[-68.82578125,57.999853515625],[-68.9453125,57.968798828124996],[-69.03544921874999,57.926025390625],[-69.04082031249999,57.902490234375],[-68.78095703125,57.975830078125],[-68.495068359375,58.011669921875],[-68.41357421875,58.0517578125],[-68.35185546874999,58.090722656249994],[-68.28911132812499,58.177685546875],[-68.175537109375,58.402587890625],[-68.11103515625,58.47333984375],[-68.02104492187499,58.485302734375],[-67.98115234375,58.46123046875],[-67.88779296874999,58.32939453125],[-67.88828125,58.295751953125],[-67.91142578124999,58.267236328124994],[-68.0638671875,58.13896484375],[-68.008984375,58.15205078125],[-67.855859375,58.272607421874994],[-67.82333984374999,58.31025390625],[-67.80522460937499,58.365478515625],[-67.75595703124999,58.40458984375],[-67.737060546875,58.38544921875],[-67.689697265625,58.243798828124994],[-67.68818359375,58.140234375],[-67.68056640625,58.10703125],[-67.69765625,58.008740234375],[-67.67827148437499,57.99111328125],[-67.6322265625,58.076123046875],[-67.6171875,58.14033203125],[-67.596337890625,58.1861328125],[-67.56962890624999,58.2134765625],[-67.381982421875,58.3],[-67.162841796875,58.370361328125],[-67.01943359375,58.43291015625],[-66.900390625,58.462792968749994],[-66.72216796875,58.491015625],[-66.60791015625,58.54892578125],[-66.55771484374999,58.636621093749994],[-66.5150390625,58.697314453125],[-66.47998046875,58.730908203125],[-66.36240234374999,58.791162109374994],[-66.29853515625,58.79453125],[-66.23740234374999,58.772265625],[-66.168212890625,58.727099609375],[-66.09091796874999,58.659033203125],[-66.04462890625,58.605615234374994],[-66.029541015625,58.566796875],[-66.017041015625,58.430810546874994],[-66.002392578125,58.431201171875],[-65.93125,58.535058593749994],[-65.92290039062499,58.57197265625],[-65.9279296875,58.6109375],[-65.949658203125,58.649853515625],[-66.02128906249999,58.734765625],[-66.04936523437499,58.787890625],[-66.04306640624999,58.820654296875],[-65.967041015625,58.839208984375],[-65.85483398437499,58.846630859375],[-65.8359375,58.860498046874994],[-65.918408203125,58.89560546875],[-65.92070312499999,58.9146484375],[-65.84140625,58.97705078125],[-65.79482421875,58.98046875],[-65.703564453125,58.970605468749994],[-65.721923828125,59.002587890624994],[-65.72099609374999,59.023779296875],[-65.695263671875,59.03203125],[-65.54399414062499,59.011865234374994],[-65.526318359375,59.03623046875],[-65.396240234375,59.038427734375],[-65.383544921875,59.060205078124994],[-65.49599609375,59.09130859375],[-65.60625,59.110742187499994],[-65.63984375,59.127734375],[-65.665625,59.152783203125],[-65.7,59.213330078125],[-65.69169921874999,59.229394531249994],[-65.66074218749999,59.2296875],[-65.60712890625,59.213134765625],[-65.57802734375,59.244970703125],[-65.5453125,59.319726562499994],[-65.51279296874999,59.350390625],[-65.41171875,59.314990234375],[-65.40727539062499,59.330224609374994],[-65.48935546874999,59.44775390625],[-65.47509765625,59.4703125],[-65.34970703124999,59.47880859375],[-65.27377929687499,59.46416015625],[-65.07431640624999,59.37802734375],[-65.038232421875,59.387890625],[-65.06884765625,59.411474609375],[-65.17094726562499,59.462255859375],[-65.26318359375,59.495458984375],[-65.34550781249999,59.51103515625],[-65.407421875,59.53935546875],[-65.47519531249999,59.616796875],[-65.486474609375,59.648681640625],[-65.480859375,59.690234375],[-65.43339843749999,59.776513671874994],[-65.40615234375,59.79521484375],[-65.35791015625,59.80908203125],[-65.28876953125,59.81806640625],[-65.21225585937499,59.809521484375],[-65.05449218749999,59.752783203125],[-65.02817382812499,59.770703125],[-65.11328125,59.801611328125],[-65.15922851562499,59.830126953125],[-65.181396484375,59.866650390625],[-65.17172851562499,59.9080078125],[-65.1048828125,59.993408203125],[-65.073388671875,60.06220703125],[-64.93125,60.252001953125],[-64.88955078125,60.286523437499994],[-64.84501953124999,60.30830078125],[-64.817333984375,60.3310546875],[-64.70585937499999,60.3361328125],[-64.4994140625,60.26826171875],[-64.43632812499999,60.228125],[-64.419580078125,60.17138671875],[-64.527734375,60.09453125],[-64.71328125,60.037158203125],[-64.76845703125,60.012109375],[-64.732568359375,59.99755859375],[-64.55917968749999,60.043408203125],[-64.40771484375,60.064794921875],[-64.28349609374999,60.0640625],[-64.182861328125,59.97294921875],[-64.16879882812499,59.846533203125],[-64.226318359375,59.7412109375],[-64.15068359374999,59.793603515624994],[-64.0560546875,59.82255859375],[-63.9787109375,59.7537109375],[-63.969482421875,59.697607421875],[-63.92880859374999,59.644921875],[-63.841259765625,59.5744140625],[-63.7501953125,59.512597656249994],[-63.85039062499999,59.447802734375],[-63.970703125,59.409082031249994],[-63.945458984374994,59.38017578125],[-63.780859375,59.349267578124994],[-63.75859374999999,59.31865234375],[-63.77587890625,59.2771484375],[-63.75200195312499,59.27734375],[-63.6375,59.341455078124994],[-63.53989257812499,59.332861328125],[-63.41513671874999,59.194384765625],[-63.50620117187499,59.115185546875],[-63.6455078125,59.07890625],[-63.75639648437499,59.0634765625],[-63.91049804687499,59.065576171874994],[-63.971142578125,59.05380859375],[-63.941015625,59.027392578125],[-63.79365234375,59.027001953124994],[-63.56787109375,59.047021484374994],[-63.39897460937499,59.079638671875],[-63.32553710937499,59.081591796875],[-63.2484375,59.068310546875],[-63.22250976562499,59.057177734375],[-63.3037109375,59.034423828125],[-63.30986328124999,59.02646484375],[-63.279443359374994,59.003173828125],[-63.21640625,58.927978515625],[-63.221923828125,58.911035156249994],[-63.282128906249994,58.8673828125],[-63.18535156249999,58.857763671875],[-63.05029296875,58.878173828125],[-63.00834960937499,58.855419921875],[-62.92607421874999,58.765039062499994],[-62.87387695312499,58.6724609375],[-63.10234374999999,58.545751953125],[-63.218652343749994,58.51953125],[-63.38994140624999,58.452539062499994],[-63.437939453125,58.398828125],[-63.537060546875,58.329931640625],[-63.4736328125,58.3306640625],[-63.296484375,58.4412109375],[-63.2099609375,58.466943359374994],[-63.1455078125,58.46044921875],[-63.11953125,58.441748046875],[-63.13212890624999,58.41083984375],[-63.07568359375,58.414794921875],[-62.83740234375,58.479394531249994],[-62.7373046875,58.4921875],[-62.607861328125,58.49638671875],[-62.59384765624999,58.474023437499994],[-62.67431640625,58.319189453125],[-62.81206054687499,58.200390625],[-63.06279296874999,58.127099609374994],[-63.15166015624999,58.0841796875],[-63.26152343749999,58.014697265625],[-63.22001953124999,58.0021484375],[-62.980908203125,58.093310546875],[-62.817529296874994,58.129248046875],[-62.5880859375,58.158105468749994],[-62.486230468749994,58.154052734375],[-62.3056640625,57.972265625],[-62.20151367187499,57.954638671874996],[-62.117431640625,57.964111328125],[-61.958642578124994,57.911767578125],[-61.899072265624994,57.861328125],[-61.9140625,57.825048828125],[-61.9677734375,57.8033203125],[-61.99492187499999,57.76943359375],[-61.93125,57.6685546875],[-61.96796875,57.6119140625],[-62.083984375,57.5619140625],[-62.166894531249994,57.536572265625],[-62.25361328125,57.528759765625],[-62.33857421875,57.484521484375],[-62.3771484375,57.477978515625],[-62.495556640625,57.489208984375],[-62.454980468749994,57.461962890624996],[-62.396484375,57.448193359375],[-62.30322265625,57.440673828125],[-62.194238281249994,57.45458984375],[-62.0880859375,57.45283203125],[-61.921142578125,57.42080078125],[-61.85107421875,57.381298828125],[-61.8498046875,57.370410156249996],[-61.88583984374999,57.3478515625],[-61.938867187499994,57.274365234375],[-61.977441406249994,57.24794921875],[-61.94453125,57.228125],[-61.86083984375,57.197558593749996],[-61.79833984375,57.18623046875],[-61.71630859375,57.19619140625],[-61.628515625,57.183154296874996],[-61.333740234375,57.010595703125],[-61.34575195312499,56.92158203125],[-61.39047851562499,56.852978515625],[-61.372802734375,56.775830078125],[-61.37163085937499,56.680810546875],[-61.531689453125,56.654589843749996],[-62.0625,56.699072265625],[-62.366113281249994,56.7669921875],[-62.381738281249994,56.7876953125],[-62.295800781249994,56.8328125],[-62.372021484375,56.836181640625],[-62.460205078125,56.81845703125],[-62.497265625,56.801708984375],[-62.3955078125,56.730029296874996],[-62.11650390624999,56.666845703125],[-61.991601562499994,56.5908203125],[-61.854931640625,56.584277343749996],[-61.813378906249994,56.5705078125],[-61.737744140625,56.526025390625],[-61.76005859374999,56.5107421875],[-61.8994140625,56.505419921874996],[-62.009667968749994,56.453857421875],[-61.9404296875,56.423583984375],[-61.69248046874999,56.3970703125],[-61.514599609375,56.39033203125],[-61.42529296875,56.360644531249996],[-61.498681640624994,56.327587890625],[-61.70712890624999,56.288720703125],[-61.7130859375,56.23095703125],[-61.55859375,56.2078125],[-61.42109375,56.221826171875],[-61.364697265625,56.216015625],[-61.3244140625,56.076220703124996],[-61.30112304687499,56.047167968749996],[-61.44892578125,56.02236328125],[-61.44951171874999,55.995703125],[-61.35126953125,55.973681640624996],[-61.187890625,55.955371093749996],[-61.13388671874999,55.9302734375],[-61.122998046875,55.88857421875],[-61.08935546875,55.866357421875],[-60.995751953124994,55.862353515624996],[-60.89267578124999,55.914208984375],[-60.83183593749999,55.957861328125],[-60.74326171874999,55.941455078124996],[-60.73662109374999,55.886962890625],[-60.63095703124999,55.825],[-60.59257812499999,55.81484375],[-60.562109375,55.727001953125],[-60.475830078125,55.805126953125],[-60.41259765625,55.78857421875],[-60.341015625,55.78466796875],[-60.3654296875,55.70908203125],[-60.40830078124999,55.649560546875],[-60.351953125,55.612353515624996],[-60.30830078125,55.556982421875],[-60.1923828125,55.480908203125],[-60.224023437499994,55.444384765624996],[-60.3609375,55.36630859375],[-60.43310546875,55.2427734375],[-60.450097656249994,55.199951171875],[-60.5205078125,55.12900390625],[-60.617138671875,55.060205078125],[-60.556542968749994,55.06748046875],[-60.340771484375,55.1939453125],[-60.212548828124994,55.23642578125],[-59.930322265624994,55.259423828125],[-59.86210937499999,55.294873046875],[-59.7587890625,55.3095703125],[-59.6955078125,55.269140625],[-59.6890625,55.196337890624996],[-59.60546875,55.17333984375],[-59.51767578124999,55.19736328125],[-59.437890625,55.175927734375],[-59.48583984375,55.130175781249996],[-59.74169921875,54.942578125],[-59.81640625,54.867236328124996],[-59.837792968749994,54.81396484375],[-59.749902343749994,54.887011718749996],[-59.42856445312499,55.055517578125],[-59.394189453124994,55.080712890625],[-59.324169921875,55.15283203125],[-59.25957031249999,55.199951171875],[-59.086328125,55.183251953125],[-58.99711914062499,55.149462890624996],[-58.955810546875,55.055078125],[-58.88579101562499,54.95224609375],[-58.780175781249994,54.83837890625],[-58.499902343749994,54.78310546875],[-58.39814453125,54.77412109375],[-58.2228515625,54.8126953125],[-58.195263671875,54.86591796875],[-58.058496093749994,54.8822265625],[-57.96245117187499,54.875732421875],[-57.929296875,54.77314453125],[-57.82685546875,54.71865234375],[-57.72490234374999,54.67373046875],[-57.626611328124994,54.650341796875],[-57.48300781249999,54.640283203125],[-57.4044921875,54.590869140624996],[-57.404443359374994,54.57041015625],[-57.4853515625,54.51748046875],[-57.563232421875,54.4404296875],[-57.69926757812499,54.386572265625],[-57.889111328125,54.384082031249996],[-58.1513671875,54.350439453125],[-58.16191406249999,54.319970703125],[-58.2197265625,54.286474609375],[-58.359130859375,54.2533203125],[-58.435205078124994,54.228125],[-58.55839843749999,54.102978515625],[-58.633203125,54.049560546875],[-58.71943359375,54.039404296875],[-58.8408203125,54.044482421874996],[-58.92021484374999,54.03310546875],[-58.978466796875,54.01025390625],[-59.012646484375,53.97626953125],[-59.038818359375,53.963623046875],[-59.201416015625,53.9291015625],[-59.496533203125,53.8341796875],[-59.65268554687499,53.83125],[-59.749462890625,53.84228515625],[-59.82304687499999,53.834423828125],[-59.87333984374999,53.807763671875],[-60.01416015625,53.761572265625],[-60.056542968749994,53.733349609375],[-60.08134765624999,53.701025390625],[-60.100488281249994,53.634228515625],[-60.11728515624999,53.610107421875],[-60.144921875,53.596142578125],[-60.263330078124994,53.61005859375],[-60.395410156249994,53.6533203125],[-60.36953125,53.607470703124996],[-60.16025390624999,53.52998046875],[-60.10029296875,53.486962890625],[-60.157128906249994,53.4498046875],[-60.290283203125,53.391455078125],[-60.30576171874999,53.360107421875],[-60.251171875,53.343554687499996],[-60.272705078125,53.31708984375],[-60.345703125,53.289013671875],[-60.3375,53.27744140625],[-60.329492187499994,53.26611328125],[-60.148339843749994,53.30654296875],[-59.98710937499999,53.392822265625],[-59.881738281249994,53.480078125],[-59.829052734375,53.504541015625],[-59.62109375,53.53681640625],[-59.49814453124999,53.574755859374996],[-59.322265625,53.64375],[-59.12939453125,53.743945312499996],[-58.919580078124994,53.875292968749996],[-58.65205078125,53.977880859375],[-58.32670898437499,54.051806640624996],[-58.0880859375,54.089501953125],[-57.935986328125,54.091162109375],[-57.92827148437499,54.103564453124996],[-58.06484375,54.126757812499996],[-58.17744140625,54.131298828125],[-58.31748046874999,54.114453125],[-58.360791015625,54.1544921875],[-58.35615234375,54.171923828124996],[-58.309960937499994,54.20166015625],[-58.19208984375,54.228173828125],[-57.61494140625,54.19111328125],[-57.41606445312499,54.162744140625],[-57.198876953124994,53.924365234374996],[-57.14897460937499,53.847705078124996],[-57.1349609375,53.791845703125],[-57.15693359375,53.756884765624996],[-57.24399414062499,53.715478515625],[-57.489453125,53.633105468749996],[-57.524072265624994,53.61142578125],[-57.52734375,53.599902343749996],[-57.42021484374999,53.583251953125],[-57.386132812499994,53.560546875],[-57.33173828125,53.469091796875],[-57.22138671875,53.528515625],[-57.012158203125,53.672607421875],[-56.84086914062499,53.739453125],[-56.69658203124999,53.757666015625],[-56.524316406249994,53.766455078125],[-56.464990234374994,53.7650390625],[-56.4443359375,53.718310546874996],[-56.35400390625,53.624462890625],[-56.27021484375,53.60009765625],[-56.11015624999999,53.58759765625],[-55.96611328124999,53.471142578125],[-55.91123046874999,53.3908203125],[-55.859375,53.343896484375],[-55.86337890624999,53.312255859375],[-55.85478515624999,53.28583984375],[-55.81689453125,53.245751953125],[-55.79794921874999,53.211962890624996],[-55.808203125,53.13466796875],[-55.892333984375,53.000439453125],[-55.82988281249999,52.87841796875],[-55.85791015625,52.823388671875],[-55.872509765625,52.735693359375],[-55.81865234374999,52.6771484375],[-55.80283203124999,52.6431640625],[-55.84843749999999,52.623339843749996],[-56.1669921875,52.574755859374996],[-56.292382812499994,52.573779296874996],[-56.32490234375,52.54453125],[-56.228417968749994,52.535986328125],[-56.05258789062499,52.537402343749996],[-55.84018554687499,52.507617187499996],[-55.746484375,52.474560546875],[-55.705957031249994,52.428271484374996],[-55.716210937499994,52.39150390625],[-55.77714843749999,52.3642578125],[-55.8966796875,52.369580078125],[-56.01171875,52.394482421875],[-56.004638671875,52.370410156249996],[-55.833642578124994,52.310400390625],[-55.78349609374999,52.279931640625],[-55.691064453124994,52.2416015625],[-55.672802734375,52.19013671875],[-55.695214843749994,52.13779296875],[-56.017480468749994,51.929296875],[-56.28256835937499,51.7970703125],[-56.548583984375,51.681005859375],[-56.975976562499994,51.457666015624994],[-57.01826171875,51.44677734375],[-57.095605468749994,51.442529296874994],[-57.29921875,51.478271484375],[-57.461669921875,51.469091796875],[-57.76958007812499,51.425927734374994],[-57.853759765625,51.39951171875],[-58.02265625,51.322070312499996],[-58.08940429687499,51.310986328125],[-58.270458984375,51.295214843749996],[-58.442285156249994,51.305908203125],[-58.51035156249999,51.295068359374994],[-58.59326171875,51.257128906249996],[-58.61474609375,51.237060546875],[-58.637597656249994,51.171679687499996],[-59.054931640625,50.8791015625],[-59.16538085937499,50.7798828125],[-59.37802734374999,50.675439453124994],[-59.61191406249999,50.492089843749994],[-59.815332031249994,50.418261718749996],[-59.886328125,50.31640625],[-60.08017578124999,50.25458984375],[-60.43808593749999,50.2388671875],[-60.60820312499999,50.221142578125],[-60.80722656249999,50.249804687499996],[-60.956298828125,50.205419921875],[-61.18071289062499,50.19150390625],[-61.28974609375,50.201953125],[-61.724853515625,50.104052734374996],[-61.835351562499994,50.19697265625],[-61.91953125,50.232861328125],[-62.165234375,50.238916015624994],[-62.36166992187499,50.277294921875],[-62.540917968749994,50.284521484375],[-62.71542968749999,50.301660156249994],[-62.830224609374994,50.30146484375],[-62.94975585937499,50.291357421875],[-63.135644531249994,50.293798828125],[-63.23862304687499,50.242578125],[-63.586669921875,50.258203125],[-63.73359375,50.304638671875],[-63.853955078125,50.314355468749994],[-64.0158203125,50.303955078125],[-64.17041015625,50.269433593749994],[-64.508935546875,50.308935546875],[-64.86787109375,50.27548828125],[-65.180908203125,50.297900390624996],[-65.26860351562499,50.32001953125],[-65.762451171875,50.25927734375],[-65.95537109374999,50.294140625],[-66.12553710937499,50.201025390625],[-66.2421875,50.220361328124994],[-66.36884765625,50.206640625],[-66.411083984375,50.224267578124994],[-66.4955078125,50.211865234375],[-66.550048828125,50.161181640624996],[-66.621728515625,50.155419921874994],[-66.740869140625,50.06552734375],[-66.941162109375,49.993701171874996],[-67.234375,49.6017578125],[-67.2619140625,49.451171875],[-67.372021484375,49.3484375],[-67.46923828125,49.334619140624994],[-67.549267578125,49.332275390625],[-68.05625,49.256787109375],[-68.28193359375,49.197167968749994],[-68.22060546875,49.149658203125],[-68.29453125,49.11435546875],[-68.41440429687499,49.099511718749994],[-68.54384765625,49.05615234375],[-68.627880859375,49.007177734375],[-68.66904296874999,48.939501953124996],[-68.92905273437499,48.828955078125],[-69.23076171874999,48.573632812499994],[-69.374951171875,48.38642578125],[-69.55009765624999,48.25078125],[-69.67387695312499,48.199169921875],[-69.7619140625,48.191162109375],[-69.851708984375,48.207373046875],[-70.00102539062499,48.270947265625],[-70.11064453124999,48.277978515624994],[-70.38369140625,48.366503906249996],[-71.01826171875,48.455615234374996],[-70.922607421875,48.422314453125],[-70.83876953125,48.3673828125],[-70.67109375,48.35322265625],[-70.500634765625,48.354345703125],[-70.14531249999999,48.243554687499994],[-69.97119140625,48.20576171875],[-69.86552734374999,48.172265625],[-69.775,48.098095703125],[-69.83984375,47.952587890625],[-69.90556640624999,47.8322265625],[-69.99443359374999,47.739892578124994],[-70.30009765624999,47.50302734375],[-70.44804687499999,47.4234375],[-70.70585937499999,47.139794921874994],[-70.97270507812499,47.006689453125],[-71.115625,46.924951171874994],[-71.2677734375,46.795947265624996],[-71.624755859375,46.698388671874994],[-71.757275390625,46.673583984375],[-71.87958984375,46.686816406249996],[-72.028466796875,46.607421875],[-72.20463867187499,46.558886718749996],[-72.25664062499999,46.48505859375],[-72.680126953125,46.2873046875],[-72.84267578125,46.26240234375],[-72.98100585937499,46.209716796875],[-73.021923828125,46.120263671874994],[-73.14541015625,46.066308593749994],[-73.1796875,46.025],[-73.28354492187499,45.899853515625],[-73.47661132812499,45.738232421875],[-73.711865234375,45.711181640625],[-73.7978515625,45.654931640624994],[-73.897412109375,45.56416015625],[-74.037841796875,45.501855468749994],[-74.315087890625,45.531054687499996],[-74.24765625,45.49287109375],[-73.999609375,45.433349609375],[-73.973828125,45.345117187499994],[-74.098095703125,45.324023437499996],[-74.35830078125,45.206396484375],[-74.70888671875,45.003857421875],[-74.56630859375,45.0416015625],[-74.26904296875,45.18828125],[-74.0498046875,45.24140625],[-73.7646484375,45.395458984375],[-73.55810546875,45.425097656249996],[-73.518798828125,45.458984375],[-73.48417968749999,45.586767578125],[-73.465283203125,45.63232421875],[-73.36884765625,45.7578125],[-73.25302734374999,45.863671875],[-73.1595703125,46.010058593749996],[-72.98994140625,46.10361328125],[-72.73344726562499,46.1818359375],[-72.49619140624999,46.352685546874994],[-72.366162109375,46.40478515625],[-72.24013671875,46.44208984375],[-72.18720703125,46.511523437499996],[-72.10927734375,46.551220703125],[-71.90092773437499,46.63193359375],[-71.6712890625,46.653759765625],[-71.439208984375,46.720751953124996],[-71.261181640625,46.75625],[-71.152001953125,46.819091796875],[-70.99326171874999,46.852197265624994],[-70.519482421875,47.032519531249996],[-70.3880859375,47.116943359375],[-70.2177734375,47.28984375],[-70.069580078125,47.377783203125],[-70.01713867187499,47.471435546875],[-69.80224609375,47.6234375],[-69.5810546875,47.823681640625],[-69.47104492187499,47.96728515625],[-69.30634765625,48.047021484374994],[-68.987060546875,48.275],[-68.815673828125,48.366015625],[-68.746044921875,48.376416015625],[-68.552001953125,48.457324218749996],[-68.43149414062499,48.54169921875],[-68.23818359375,48.626416015625],[-67.88901367187499,48.730908203125],[-67.56088867187499,48.85595703125],[-67.11748046874999,48.964160156249996],[-66.598095703125,49.126367187499994],[-66.178173828125,49.213134765625],[-65.8828125,49.22568359375],[-65.523388671875,49.266162109374996],[-65.396142578125,49.262060546875],[-64.836328125,49.191748046875],[-64.56772460937499,49.104785156249996],[-64.26181640624999,48.921875],[-64.2162109375,48.8736328125],[-64.20878906249999,48.806201171874996],[-64.370751953125,48.83896484375],[-64.51372070312499,48.841113281249996],[-64.41455078125,48.803613281249994],[-64.24609375,48.69111328125],[-64.25375976562499,48.550390625],[-64.348828125,48.423193359375],[-64.63315429687499,48.360498046874994],[-64.70576171875,48.310595703124996],[-64.76450195312499,48.228076171874996],[-64.82207031249999,48.196484375],[-64.959912109375,48.15986328125],[-65.036083984375,48.10625],[-65.259423828125,48.021240234375],[-65.360009765625,48.011132812499994],[-65.47587890624999,48.031494140625],[-65.75468749999999,48.111669921875],[-65.926708984375,48.188867187499994],[-66.01254882812499,48.1466796875],[-66.08310546874999,48.102685546874994],[-66.24863281249999,48.117333984374994],[-66.32426757812499,48.097900390625],[-66.448974609375,48.11962890625],[-66.70439453124999,48.0224609375],[-66.63154296875,48.011083984375],[-66.42880859374999,48.066943359374996],[-66.359619140625,48.06064453125],[-66.210205078125,47.988574218749996],[-65.84941406249999,47.911035156249994],[-65.75571289062499,47.859765625],[-65.666455078125,47.696142578125],[-65.60722656249999,47.67001953125],[-65.48349609374999,47.68701171875],[-65.3439453125,47.767919921875],[-65.228173828125,47.811279296875],[-65.00166015625,47.846826171874994],[-65.04638671875,47.793017578124996],[-64.873974609375,47.797216796875],[-64.70322265624999,47.724853515625],[-64.76630859375,47.673486328124994],[-64.85214843749999,47.569873046874996],[-64.91220703124999,47.36865234375],[-65.0861328125,47.233789062499994],[-65.31889648437499,47.101220703124994],[-65.260205078125,47.069238281249994],[-65.19208984375,47.049560546875],[-65.0423828125,47.088818359375],[-64.94243164062499,47.086181640625],[-64.83139648437499,47.060791015625],[-64.865869140625,46.9578125],[-64.90576171875,46.887939453125],[-64.88251953125,46.8228515625],[-64.81669921874999,46.698681640625],[-64.72587890624999,46.671435546874996],[-64.68950195312499,46.5123046875],[-64.641357421875,46.425585937499996],[-64.6478515625,46.35595703125],[-64.5568359375,46.311425781249994],[-64.54150390625,46.24033203125],[-64.21181640625,46.22021484375],[-64.14501953125,46.19287109375],[-63.915917968749994,46.165820312499996],[-63.87265625,46.14619140625],[-63.831933593749994,46.107177734375],[-64.056396484375,46.021337890625],[-63.87470703125,45.959228515625],[-63.702880859375,45.8580078125],[-63.56767578124999,45.8779296875],[-63.509228515625,45.87470703125],[-63.35800781249999,45.811279296875],[-63.31591796875,45.7798828125],[-63.29277343749999,45.751953125],[-63.21689453124999,45.757958984374994],[-63.10791015625,45.782421875],[-62.910791015624994,45.7763671875],[-62.70068359375,45.740576171875],[-62.718359375,45.685986328125],[-62.75009765624999,45.648242187499996],[-62.58564453125,45.660693359374996],[-62.483056640624994,45.621826171875],[-62.447265625,45.640527343749994],[-62.421875,45.6646484375],[-62.217724609375,45.730859375],[-61.955517578125,45.8681640625],[-61.923583984375,45.851171875],[-61.91162109375,45.799121093749996],[-61.87724609374999,45.714208984375],[-61.776513671874994,45.655615234375],[-61.656884765624994,45.6421875],[-61.49228515624999,45.68701171875],[-61.427636718749994,45.648291015625],[-61.350488281249994,45.573681640625],[-61.27705078125,45.476025390625],[-61.281982421875,45.441064453124994],[-61.376123046874994,45.410595703125],[-61.46098632812499,45.36669921875],[-61.10673828124999,45.3486328125],[-61.07080078125,45.33017578125],[-61.03154296874999,45.291748046875],[-61.06767578124999,45.252832031249994],[-61.10107421875,45.233447265624996],[-61.16533203124999,45.256103515625],[-61.28378906249999,45.235498046874994],[-61.38725585937499,45.18505859375],[-61.49790039062499,45.15703125],[-61.56875,45.15380859375],[-61.647412109375,45.130517578124994],[-61.71923828125,45.094482421875],[-61.793896484375,45.084423828125],[-62.026806640625,44.994482421875],[-62.26499023437499,44.936474609375],[-62.51401367187499,44.843652343749994],[-62.76806640625,44.785107421875],[-63.03183593749999,44.714794921875],[-63.08920898437499,44.708544921874996],[-63.155712890625,44.711328125],[-63.306298828124994,44.642578125],[-63.380810546875,44.651904296874996],[-63.45683593749999,44.639941406249996],[-63.544335937499994,44.655078125],[-63.60400390625,44.683203125],[-63.558251953124994,44.610595703125],[-63.544824218749994,44.54375],[-63.56767578124999,44.514453125],[-63.609765625,44.47998046875],[-63.761132812499994,44.48642578125],[-63.82065429687499,44.510644531249994],[-63.89130859375,44.546337890625],[-63.92368164062499,44.603857421875],[-63.99970703125,44.644921875],[-64.044921875,44.587890625],[-64.04462890625,44.54541015625],[-64.10087890624999,44.487451171874994],[-64.1669921875,44.586669921875],[-64.286083984375,44.550341796874996],[-64.338525390625,44.444873046874996],[-64.312255859375,44.41474609375],[-64.27568359374999,44.33408203125],[-64.33457031249999,44.2919921875],[-64.37822265624999,44.303564453125],[-64.46879882812499,44.18515625],[-64.57846679687499,44.142041015625],[-64.6916015625,44.021337890625],[-64.825634765625,43.929345703124994],[-64.86235351562499,43.86787109375],[-65.08681640625,43.727197265624994],[-65.1720703125,43.731396484375],[-65.23491210937499,43.7267578125],[-65.32958984375,43.668115234374994],[-65.34428710937499,43.549609375],[-65.38608398437499,43.565283203125],[-65.42851562499999,43.561425781249994],[-65.450439453125,43.52421875],[-65.481689453125,43.51806640625],[-65.564453125,43.553271484374996],[-65.66191406249999,43.534033203125],[-65.73813476562499,43.5607421875],[-65.83530273437499,43.734375],[-65.8869140625,43.795214843749996],[-65.97841796875,43.81484375],[-66.0021484375,43.778125],[-66.03764648437499,43.7421875],[-66.125732421875,43.813818359375],[-66.192529296875,44.0796875],[-66.19306640625,44.143847656249996],[-66.099560546875,44.367480468749996],[-65.86801757812499,44.568798828125],[-65.94194335937499,44.575537109375],[-66.14638671875,44.4359375],[-66.12529296874999,44.4697265625],[-66.09062,44.504931640624996],[-66.0216796875,44.56171875],[-65.91704101562499,44.615087890625],[-65.77768554687499,44.64619140625],[-65.6818359375,44.650927734374996],[-65.61577148437499,44.680419921875],[-65.52001953125,44.732666015625],[-65.50224609374999,44.760400390624994],[-65.587158203125,44.728515625],[-65.72822265625,44.697119140625],[-65.692041015625,44.73828125],[-65.65673828125,44.760302734374996],[-64.90292968749999,45.12080078125],[-64.75126953124999,45.180224609374996],[-64.448828125,45.2560546875],[-64.406884765625,45.305712890624996],[-64.44814453125,45.337451171874996],[-64.33076171875,45.309326171875],[-64.34042968749999,45.268212890624994],[-64.358837890625,45.238232421875],[-64.36572265625,45.187255859375],[-64.354248046875,45.138232421874996],[-64.235009765625,45.114306640624996],[-64.135498046875,45.023046875],[-64.18271484374999,45.147021484374996],[-64.0931640625,45.217089843749996],[-63.74833984374999,45.310888671875],[-63.46025390624999,45.32109375],[-63.36801757812499,45.364794921874996],[-63.614453125,45.394140625],[-63.9064453125,45.378173828125],[-64.087158203125,45.410888671875],[-64.33642578125,45.389550781249994],[-64.60019531249999,45.410058593749994],[-64.681103515625,45.382958984374994],[-64.74667968749999,45.324365234374994],[-64.83193359375,45.350244140624994],[-64.87314453124999,45.35458984375],[-64.91289062499999,45.374804687499996],[-64.827392578125,45.475537109375],[-64.56005859375,45.62548828125],[-64.39707031249999,45.755859375],[-64.35112304687499,45.783203125],[-64.3146484375,45.835693359375],[-64.404052734375,45.826904296875],[-64.48222656249999,45.80634765625],[-64.536328125,45.866601562499994],[-64.63271484375,45.946630859375],[-64.642041015625,45.913330078125],[-64.59365234375,45.813671875],[-64.778515625,45.638427734375],[-64.897900390625,45.6259765625],[-65.057275390625,45.544238281249996],[-65.28232421874999,45.473095703125],[-65.54501953124999,45.337304687499994],[-65.88447265625,45.222900390625],[-65.95561523437499,45.222460937499996],[-66.109765625,45.3166015625],[-66.066650390625,45.35947265625],[-66.0265625,45.417578125],[-66.064892578125,45.400830078125],[-66.08974609375,45.375634765624994],[-66.18271484374999,45.335205078125],[-66.10732421875,45.25693359375],[-66.14375,45.227587890624996],[-66.2515625,45.189013671874996],[-66.351953125,45.133203125],[-66.43984375,45.0958984375],[-66.5109375,45.143359375],[-66.707177734375,45.083398437499994],[-66.8724609375,45.067285156249994],[-66.908203125,45.09765625],[-66.918701171875,45.14560546875],[-66.9765625,45.157177734375],[-67.08408203124999,45.143945312499994],[-67.12485351562499,45.16943359375],[-67.13037109375,45.139013671875],[-67.10224609375,45.087744140625],[-67.08046875,44.989160156249994],[-67.113916015625,44.944384765624996],[-67.10673828124999,44.885058593749996],[-67.01401367187499,44.8677734375],[-66.991455078125,44.849609375],[-66.98701171875,44.827685546874996],[-67.19125976562499,44.675585937499996],[-67.36406249999999,44.696875],[-67.45781249999999,44.656542968749996],[-67.55600585937499,44.644775390625],[-67.599072265625,44.576806640624994],[-67.652978515625,44.562402343749994],[-67.726806640625,44.56650390625],[-67.790478515625,44.585693359375],[-67.8390625,44.57626953125],[-67.90703124999999,44.45361328125],[-67.96269531249999,44.464306640625],[-67.98486328125,44.420166015625],[-68.01396484374999,44.40087890625],[-68.056640625,44.384326171874996],[-68.093701171875,44.438818359375],[-68.11728515624999,44.490625],[-68.15205078125,44.502001953124996],[-68.1982421875,44.515234375],[-68.245751953125,44.514794921874994],[-68.27744140624999,44.507373046874996],[-68.31674804687499,44.473876953125],[-68.37373046875,44.445117187499996],[-68.41684570312499,44.469091796875],[-68.4505859375,44.507617187499996],[-68.479443359375,44.445654296875],[-68.521435546875,44.380224609375],[-68.51445312499999,44.30390625],[-68.53251953124999,44.258642578125],[-68.57236328124999,44.270849609375],[-68.61201171875,44.310546875],[-68.723291015625,44.34228515625],[-68.8119140625,44.33935546875],[-68.793896484375,44.381738281249994],[-68.710107421875,44.442578125],[-68.73588867187499,44.454492187499994],[-68.777001953125,44.446044921875],[-68.794921875,44.454492187499994],[-68.76552734375,44.509765625],[-68.7626953125,44.570751953125],[-68.8001953125,44.5494140625],[-68.84736328125,44.48505859375],[-68.96147460937499,44.433837890625],[-68.95615234374999,44.348095703125],[-69.06357421874999,44.17236328125],[-69.068359375,44.097558593749994],[-69.13725585937499,44.037841796875],[-69.22607421875,43.986474609374994],[-69.34453124999999,44.000927734375],[-69.4349609375,43.956298828125],[-69.480859375,43.905078125],[-69.520751953125,43.897363281249994],[-69.54155273437499,43.96259765625],[-69.55668945312499,43.982763671875],[-69.589990234375,43.886572265625],[-69.62392578125,43.880615234375],[-69.63676757812499,43.948828125],[-69.65288085937499,43.993896484375],[-69.69912109375,43.955029296875],[-69.72983398437499,43.852001953125],[-69.76201171874999,43.860693359375],[-69.77226562499999,43.8990234375],[-69.7953125,43.91064453125],[-69.80322265625,43.866845703124994],[-69.79160156249999,43.805224609374996],[-69.808349609375,43.772314453125],[-69.84033203125,43.789892578125],[-69.872509765625,43.81953125],[-69.92558593749999,43.797021484374994],[-69.97431640625,43.787890625],[-69.97451171875,43.81806640625],[-69.965234375,43.855078125],[-70.06235351562499,43.834619140624994],[-70.17880859374999,43.766357421875],[-70.26923828125,43.671923828124996],[-70.237890625,43.656201171875],[-70.202587890625,43.626123046874994],[-70.35966796874999,43.480224609375],[-70.520703125,43.348828125],[-70.642333984375,43.134423828124994],[-70.691162109375,43.109326171875],[-70.73310546875,43.07001953125],[-70.77763671874999,42.940576171874994],[-70.829052734375,42.825341796874994],[-70.80029296875,42.7740234375],[-70.78134765624999,42.721240234374996],[-70.73569335937499,42.669287109375],[-70.696875,42.664599609374996],[-70.65483398437499,42.673974609374994],[-70.623974609375,42.671777343749994],[-70.604150390625,42.649707031249996],[-70.612939453125,42.6232421875],[-70.66142578124999,42.616650390625],[-70.75185546875,42.570361328124996],[-70.83115234374999,42.552587890625],[-70.87089843749999,42.496630859374996],[-70.93046874999999,42.431982421875],[-71.04619140624999,42.331103515624996],[-70.996728515625,42.3],[-70.81796875,42.264941406249996],[-70.73828125,42.228857421875],[-70.61767578125,42.040429687499994],[-70.64521484375,42.02158203125],[-70.65615234375,41.987060546875],[-70.54892578124999,41.938623046874994],[-70.51469726562499,41.8033203125],[-70.42666015625,41.757275390625],[-70.29545898437499,41.728955078125],[-70.135009765625,41.769873046875],[-70.001416015625,41.826171875],[-70.006103515625,41.872314453125],[-70.0900390625,41.9796875],[-70.11025390625,42.030126953125],[-70.17255859375,42.062792968749996],[-70.196240234375,42.035107421875],[-70.2365234375,42.071044921875],[-70.24106445312499,42.091210937499994],[-70.203515625,42.101025390625],[-70.15986328125,42.097119140625],[-70.10893554687499,42.0783203125],[-69.97788085937499,41.961279296875],[-69.9416015625,41.807861328125],[-69.933837890625,41.71044921875],[-69.9486328125,41.677148437499994],[-69.986767578125,41.683984375],[-70.059521484375,41.67734375],[-70.4046875,41.626904296875],[-70.48134765625,41.582470703125],[-70.65712890625,41.534228515624996],[-70.66806640624999,41.55830078125],[-70.65537109374999,41.60810546875],[-70.666455078125,41.710107421874994],[-70.701123046875,41.71484375],[-70.97421875,41.54853515625],[-71.07978515625,41.5380859375],[-71.16855468749999,41.489404296874994],[-71.188427734375,41.51640625],[-71.204296875,41.64111328125],[-71.14873046874999,41.745703125],[-71.17832031249999,41.744042968749994],[-71.27109375,41.68125],[-71.3107421875,41.719873046874994],[-71.33061523437499,41.762255859374996],[-71.35917968749999,41.78623046875],[-71.39013671875,41.7953125],[-71.363671875,41.702734375],[-71.42656249999999,41.63330078125],[-71.443798828125,41.4537109375],[-71.5228515625,41.378955078124996],[-71.769287109375,41.330908203125],[-71.929931640625,41.341064453125],[-72.073876953125,41.326123046875],[-72.265283203125,41.291650390624994],[-72.371044921875,41.312158203124994],[-72.47939453125,41.27578125],[-72.84716796875,41.265869140625],[-72.92470703125,41.28515625],[-73.02373046874999,41.216455078124994],[-73.182275390625,41.175830078124996],[-73.5830078125,41.021875],[-73.67138671875,40.965869140624996],[-73.77900390625,40.87841796875],[-73.85126953125,40.831396484375],[-73.91069335937499,40.81611328125],[-73.947216796875,40.776953125],[-73.98710937499999,40.751367187499994],[-73.94858398437499,40.838769531249994],[-73.90673828125,40.912451171875],[-73.87197265625,41.05517578125],[-73.8822265625,41.17060546875],[-73.92534179687499,41.218066406249996],[-73.969921875,41.24970703125],[-73.91767578125,41.135791015624996],[-73.90922851562499,40.99609375],[-73.927197265625,40.9142578125],[-74.02548828124999,40.756396484374996],[-74.067333984375,40.719628906249994],[-74.11625976562499,40.687304687499996],[-74.15312,40.673242187499994],[-74.187158203125,40.647998046874996],[-74.226708984375,40.6080078125],[-74.26420898437499,40.528613281249996],[-74.24150390624999,40.45625],[-74.04985351562499,40.429833984374994],[-73.9984375,40.4521484375],[-73.972265625,40.400341796875],[-73.95761718749999,40.328369140625],[-73.97197265624999,40.250537109374996],[-74.00400390624999,40.171337890625],[-74.0283203125,40.072998046875],[-74.04892578124999,39.923046875],[-74.07993164062499,39.788134765624996],[-74.083984375,39.8291015625],[-74.064599609375,39.993115234375],[-74.09599609374999,39.975976562499994],[-74.117626953125,39.938134765624994],[-74.17612304687499,39.726611328124996],[-74.25654296875,39.6138671875],[-74.33061523437499,39.535888671875],[-74.40703124999999,39.548779296875],[-74.38984375,39.48681640625],[-74.41083984375,39.454541015625],[-74.42880859374999,39.38720703125],[-74.474365234375,39.342578125],[-74.5171875,39.346875],[-74.57871093749999,39.31611328125],[-74.602978515625,39.292578125],[-74.60478515624999,39.247509765625],[-74.645947265625,39.207861328125],[-74.79448242187499,39.001904296875],[-74.9234375,38.94111328125],[-74.954296875,38.949951171875],[-74.9203125,39.047167968749996],[-74.89702148437499,39.145458984375],[-74.97529296875,39.188232421875],[-75.0501953125,39.210839843749994],[-75.1361328125,39.207861328125],[-75.23105468749999,39.28427734375],[-75.35341796875,39.33984375],[-75.52421874999999,39.490185546875],[-75.51923828125,39.531884765624994],[-75.52353515624999,39.601855468749996],[-75.471630859375,39.71240234375],[-75.421875,39.789697265624994],[-75.353173828125,39.829736328124994],[-75.15380859375,39.870507812499994],[-75.10380859374999,39.9318359375],[-75.074169921875,39.98349609375],[-75.17294921874999,39.894775390625],[-75.32089843749999,39.864697265625],[-75.400634765625,39.831591796874996],[-75.46440429687499,39.78095703125],[-75.5021484375,39.7173828125],[-75.58759765625,39.640771484374994],[-75.58159179687499,39.589453125],[-75.56728515625,39.552978515625],[-75.573876953125,39.476953125],[-75.51982421874999,39.40283203125],[-75.41264648437499,39.281396484374994],[-75.3921875,39.0927734375],[-75.31040039062499,38.966552734375],[-75.18505859375,38.819384765624996],[-75.08867187499999,38.7775390625],[-75.083984375,38.722802734374994],[-75.12846679687499,38.632421875],[-75.187109375,38.591113281249996],[-75.11083984375,38.599365234375],[-75.07285156249999,38.5787109375],[-75.035888671875,38.503320312499994],[-75.03876953125,38.4263671875],[-75.05126953125,38.3830078125],[-75.074365234375,38.36572265625],[-75.073388671875,38.410009765625],[-75.08974609375,38.425390625],[-75.11674804687499,38.406201171875],[-75.134228515625,38.384326171874996],[-75.14150390625,38.298144531249996],[-75.16000976562499,38.255078125],[-75.22543945312499,38.24228515625],[-75.29179687499999,38.129199218749996],[-75.353515625,38.0650390625],[-75.59638671875,37.631201171875],[-75.587109375,37.55869140625],[-75.63154296875,37.5353515625],[-75.698828125,37.516357421875],[-75.76689453124999,37.472998046875],[-75.81206054687499,37.425195312499994],[-75.85400390625,37.296630859375],[-75.93437,37.151904296874996],[-75.984521484375,37.212207031249996],[-75.99736328124999,37.263818359374994],[-75.975048828125,37.3984375],[-75.888134765625,37.619140625],[-75.7923828125,37.75634765625],[-75.71933593749999,37.82138671875],[-75.65927734374999,37.953955078125],[-75.73515624999999,37.97373046875],[-75.850830078125,37.971582031249994],[-75.829052734375,38.032763671874996],[-75.7953125,38.086669921875],[-75.855615234375,38.140380859375],[-75.89130859375,38.147216796875],[-75.92807617187499,38.169238281249996],[-75.8849609375,38.21396484375],[-75.863916015625,38.26123046875],[-75.87675781249999,38.31875],[-75.85869140624999,38.362060546875],[-75.888818359375,38.355517578124996],[-75.937255859375,38.30966796875],[-75.96738281249999,38.291357421875],[-75.9857421875,38.331933593749994],[-76.00668945312499,38.32275390625],[-76.02031249999999,38.294873046875],[-76.051220703125,38.279541015625],[-76.11650390624999,38.317675781249996],[-76.211669921875,38.361328125],[-76.2646484375,38.436425781249994],[-76.294873046875,38.49462890625],[-76.26416015625,38.599951171875],[-76.198388671875,38.61865234375],[-76.112939453125,38.6015625],[-76.000927734375,38.601708984374994],[-76.01694335937499,38.62509765625],[-76.05693359374999,38.621240234374994],[-76.175,38.706689453124994],[-76.21298828124999,38.75830078125],[-76.2783203125,38.7724609375],[-76.30810546875,38.7228515625],[-76.34116210937499,38.70966796875],[-76.30034179687499,38.818212890625],[-76.24697265625,38.82265625],[-76.1681640625,38.852734375],[-76.191064453125,38.915576171874996],[-76.24082031249999,38.94306640625],[-76.33066406249999,38.90859375],[-76.32958984375,38.952783203124994],[-76.312744140625,39.009375],[-76.24501953125,39.009179687499994],[-76.185693359375,38.99072265625],[-76.135205078125,39.08212890625],[-76.132958984375,39.122949218749994],[-76.21684570312499,39.063623046874994],[-76.23569335937499,39.1916015625],[-76.15312,39.3150390625],[-76.074365234375,39.36884765625],[-75.9759765625,39.36728515625],[-75.8759765625,39.3759765625],[-75.938720703125,39.398583984374994],[-76.003125,39.41083984375],[-75.954736328125,39.459619140624994],[-75.9134765625,39.468359375],[-75.87294921875,39.510888671874994],[-75.97041015625,39.50458984375],[-75.958935546875,39.58505859375],[-76.006298828125,39.568701171875],[-76.06298828125,39.5611328125],[-76.08505859374999,39.527001953124994],[-76.080712890625,39.4703125],[-76.097265625,39.43310546875],[-76.141357421875,39.403222656249994],[-76.2158203125,39.379931640624996],[-76.223046875,39.4203125],[-76.24765625,39.438623046874994],[-76.2568359375,39.3521484375],[-76.2763671875,39.32275390625],[-76.330810546875,39.40390625],[-76.34716796875,39.387548828125],[-76.34506835937499,39.364501953125],[-76.358984375,39.324658203125],[-76.4056640625,39.30390625],[-76.402783203125,39.252832031249994],[-76.4208984375,39.225],[-76.57041015624999,39.269335937499996],[-76.57392578125,39.254296875],[-76.48935546874999,39.15869140625],[-76.42758789062499,39.126025390624996],[-76.420068359375,39.073876953124994],[-76.473095703125,39.030615234375],[-76.54624023437499,39.06796875],[-76.558544921875,39.065234375],[-76.518798828125,39.001171875],[-76.49375,38.945214843749994],[-76.51953125,38.898339843749994],[-76.51552734375,38.840625],[-76.52109375,38.78828125],[-76.536865234375,38.742626953125],[-76.50131835937499,38.532177734375],[-76.45849609375,38.474951171875],[-76.41640625,38.420214843749996],[-76.39409179687499,38.368994140625],[-76.43876953124999,38.3615234375],[-76.509912109375,38.403662109375],[-76.572412109375,38.435791015625],[-76.646875,38.538525390625],[-76.6591796875,38.579541015625],[-76.67734375,38.611962890624994],[-76.66855468749999,38.5375],[-76.6419921875,38.454345703125],[-76.40878906249999,38.26826171875],[-76.36572265625,38.196875],[-76.33291015625,38.140771484374994],[-76.34116210937499,38.08701171875],[-76.401953125,38.125048828124996],[-76.45439453124999,38.17353515625],[-76.59360351562499,38.228320312499996],[-76.769140625,38.262939453125],[-76.868115234375,38.390283203124994],[-76.86777343749999,38.337158203125],[-76.88974609374999,38.29208984375],[-76.95024414062499,38.347021484375],[-76.98837890624999,38.393896484375],[-77.001171875,38.445263671875],[-77.07670898437499,38.441748046875],[-77.155908203125,38.397119140624994],[-77.23251953124999,38.40771484375],[-77.2416015625,38.49482421875],[-77.2208984375,38.540966796875],[-77.134912109375,38.65009765625],[-77.05390625,38.705810546875],[-77.01816406249999,38.777734375],[-77.03037109374999,38.8892578125],[-77.04560546875,38.77578125],[-77.09189453124999,38.71953125],[-77.16464843749999,38.6765625],[-77.260400390625,38.6],[-77.28378906249999,38.529199218749994],[-77.313671875,38.396630859374994],[-77.27324218749999,38.3517578125],[-77.23193359375,38.3400390625],[-77.10991210937499,38.3701171875],[-77.04677734375,38.356689453125],[-76.90634765624999,38.197070312499996],[-76.64487304687499,38.133935546874994],[-76.54951171875,38.094482421875],[-76.47177734374999,38.011181640625],[-76.354931640625,37.963232421875],[-76.26425781249999,37.8935546875],[-76.26181640624999,37.848095703125],[-76.293212890625,37.794335937499994],[-76.305615234375,37.721582031249994],[-76.344140625,37.675683593749994],[-76.43662109374999,37.67041015625],[-76.49248046874999,37.6822265625],[-76.79277343749999,37.93798828125],[-76.82861328125,37.9615234375],[-76.93999023437499,38.095458984375],[-77.07065429687499,38.1671875],[-77.111083984375,38.165673828124994],[-76.92509765624999,38.033007812499996],[-76.84916992187499,37.940234375],[-76.71542968749999,37.81015625],[-76.61982421875,37.755078125],[-76.549462890625,37.669140625],[-76.48408203125,37.628857421875],[-76.30556640625,37.571484375],[-76.367626953125,37.5302734375],[-76.2685546875,37.495166015624996],[-76.25439453125,37.430615234375],[-76.26347656249999,37.35703125],[-76.40097656249999,37.386132812499994],[-76.40546875,37.331933593749994],[-76.39316406249999,37.299951171874994],[-76.45390624999999,37.27353515625],[-76.53837890624999,37.309375],[-76.75771484375,37.505419921874996],[-76.755859375,37.47919921875],[-76.73808593749999,37.448779296874996],[-76.61088867187499,37.322558593749996],[-76.49736328124999,37.246875],[-76.401123046875,37.212695312499996],[-76.32695312499999,37.149267578125],[-76.30078125,37.110888671874996],[-76.28330078124999,37.052685546875],[-76.33828125,37.013134765625],[-76.40087890625,36.99130859375],[-76.46201171874999,37.03076171875],[-76.5068359375,37.072314453124996],[-76.602294921875,37.142871093749996],[-76.63090820312499,37.221728515624996],[-76.703515625,37.217675781249994],[-77.006982421875,37.317675781249996],[-77.25087890625,37.32919921875],[-77.22705078125,37.30908203125],[-77.19619140625,37.295703125],[-77.001953125,37.271044921874996],[-76.9251953125,37.225],[-76.76542968749999,37.184130859374996],[-76.671875,37.17294921875],[-76.633935546875,37.047412109374996],[-76.504638671875,36.96103515625],[-76.48784179687499,36.897021484374996],[-76.399560546875,36.88984375],[-76.24423828124999,36.95263671875],[-76.143994140625,36.930615234375],[-75.9994140625,36.912646484374996],[-75.96635742187499,36.861962890624994],[-75.941552734375,36.765527343749994],[-75.89042968749999,36.65703125],[-75.75786132812499,36.229248046875],[-75.55869140624999,35.879345703125],[-75.5341796875,35.819091796875],[-75.58046875,35.871972656249994],[-75.72822265625,36.1037109375],[-75.809765625,36.271044921874996],[-75.8935546875,36.56650390625],[-75.91787109375,36.632666015625],[-75.946484375,36.659082031249994],[-75.96533203125,36.637597656249994],[-75.97343749999999,36.599951171875],[-75.95976562499999,36.571044921875],[-75.99277343749999,36.473779296874994],[-75.978466796875,36.429150390625],[-75.92485351562499,36.3830078125],[-75.8666015625,36.267871093749996],[-75.820068359375,36.112841796874996],[-75.8830078125,36.175683593749994],[-75.9501953125,36.208984375],[-76.05473632812499,36.234521484374994],[-76.1478515625,36.279296875],[-76.141064453125,36.215087890625],[-76.15,36.145751953125],[-76.22177734374999,36.166894531249994],[-76.27060546874999,36.189892578125],[-76.22739257812499,36.116015625],[-76.32119140625,36.13818359375],[-76.38369140625,36.133544921875],[-76.42431640625,36.06796875],[-76.47880859374999,36.028173828125],[-76.55937,36.01533203125],[-76.67890625,36.07529296875],[-76.71762695312499,36.148095703124994],[-76.733642578125,36.229150390624994],[-76.74003906249999,36.13330078125],[-76.71875,36.033496093749996],[-76.726220703125,35.9576171875],[-76.61113281249999,35.943652343749996],[-76.503515625,35.9560546875],[-76.35830078125,35.952880859375],[-76.26357421875,35.967089843749996],[-76.20654296875,35.9912109375],[-76.069775390625,35.9703125],[-76.06005859375,35.878662109375],[-76.07568359375,35.787548828125],[-76.08359375,35.69052734375],[-76.04570312499999,35.691162109375],[-76.001171875,35.72216796875],[-75.97890625,35.895947265625],[-75.85390625,35.96015625],[-75.81201171875,35.95576171875],[-75.772216796875,35.89990234375],[-75.75883789062499,35.84326171875],[-75.74472656249999,35.765478515625],[-75.77392578125,35.64697265625],[-75.965966796875,35.5083984375],[-76.103515625,35.380273437499994],[-76.173828125,35.354150390624994],[-76.27524414062499,35.369042968749994],[-76.390234375,35.401269531249994],[-76.44663085937499,35.407763671874996],[-76.489501953125,35.397021484374996],[-76.515625,35.436474609375],[-76.532470703125,35.508447265624994],[-76.57719726562499,35.53232421875],[-76.61103515625,35.5296875],[-76.63413085937499,35.45322265625],[-76.74140625,35.431494140625],[-76.88725585937499,35.4630859375],[-77.039990234375,35.527392578124996],[-76.97446289062499,35.458398437499994],[-76.595458984375,35.3296875],[-76.55278320312499,35.305615234375],[-76.512939453125,35.270410156249994],[-76.56596679687499,35.215185546875],[-76.60751953124999,35.152978515624994],[-76.61337890624999,35.104150390624994],[-76.62802734374999,35.07333984375],[-76.77915039062499,34.99033203125],[-76.86103515625,35.00498046875],[-77.070263671875,35.154638671875],[-76.97495117187499,35.025195312499996],[-76.8986328125,34.970263671874996],[-76.74497070312499,34.940966796874996],[-76.45673828125,34.98935546875],[-76.36220703125,34.9365234375],[-76.43979492187499,34.842919921874994],[-76.51689453124999,34.777246093749994],[-76.61801757812499,34.769921875],[-76.70708007812499,34.7521484375],[-76.73320312499999,34.706982421875],[-76.79667968749999,34.704150390624996],[-76.8958984375,34.701464843749996],[-77.04951171875,34.69736328125],[-77.13388671874999,34.707910156249994],[-77.25175781249999,34.615625],[-77.29624023437499,34.602929687499994],[-77.3583984375,34.620263671874994],[-77.38447265625,34.694384765624996],[-77.412255859375,34.730810546875],[-77.41293945312499,34.592138671875],[-77.40205078125,34.55478515625],[-77.37978515625,34.526611328125],[-77.51767578124999,34.4513671875],[-77.649658203125,34.35751953125],[-77.69697265625,34.331982421875],[-77.750732421875,34.284960937499996],[-77.86083984375,34.149169921875],[-77.88803710937499,34.050146484375],[-77.92783203124999,33.939746093749996],[-77.932861328125,33.989453125],[-77.926025390625,34.073144531249994],[-77.953271484375,34.168994140624996],[-77.97055664062499,33.993408203125],[-78.013330078125,33.91181640625],[-78.405859375,33.917578125],[-78.57768554687499,33.8732421875],[-78.841455078125,33.724072265625],[-78.9203125,33.65869140625],[-79.13818359375,33.405908203124994],[-79.193798828125,33.244140625],[-79.23837890624999,33.312158203124994],[-79.22734374999999,33.363183593749994],[-79.22646484375,33.4048828125],[-79.28134765624999,33.3154296875],[-79.229248046875,33.18515625],[-79.276025390625,33.135400390624994],[-79.419921875,33.042529296874996],[-79.498681640625,33.027294921875],[-79.587109375,33.000878906249994],[-79.61494140625,32.90927734375],[-79.735009765625,32.8248046875],[-79.80498046874999,32.787402343749996],[-79.93310546875,32.81005859375],[-79.89365234374999,32.7287109375],[-79.94072265624999,32.667138671874994],[-80.02177734374999,32.619921875],[-80.12255859375,32.589111328125],[-80.180322265625,32.59287109375],[-80.2296875,32.576513671875],[-80.26835937499999,32.537353515625],[-80.36284179687499,32.500732421875],[-80.46098632812499,32.521337890625],[-80.572216796875,32.53369140625],[-80.6341796875,32.51171875],[-80.530029296875,32.475390625],[-80.474267578125,32.422753906249994],[-80.4857421875,32.351806640625],[-80.513623046875,32.3244140625],[-80.579345703125,32.2873046875],[-80.60820312499999,32.292822265625],[-80.62583007812499,32.32626953125],[-80.647216796875,32.395947265625],[-80.67778320312499,32.381103515625],[-80.683056640625,32.3486328125],[-80.70932617187499,32.337060546874994],[-80.80253906249999,32.448046875],[-80.79790039062499,32.36337890625],[-80.76533203125,32.29833984375],[-80.733837890625,32.26533203125],[-80.70205078125,32.245898437499996],[-80.69423828125,32.215722656249994],[-80.7580078125,32.1421875],[-80.79082031249999,32.125830078125],[-80.84921875,32.113916015624994],[-80.882080078125,32.068603515625],[-80.87236328124999,32.029589843749996],[-80.9234375,31.944921875],[-81.045556640625,31.892041015624997],[-81.08286132812499,31.894091796874996],[-81.11328125,31.878613281249997],[-81.09550781249999,31.84091796875],[-81.06503906249999,31.8134765625],[-81.06611328125,31.787988281249994],[-81.098388671875,31.753369140624997],[-81.162109375,31.743701171874996],[-81.197900390625,31.70419921875],[-81.18657226562499,31.666943359374997],[-81.16552734375,31.646142578124994],[-81.169921875,31.610302734374997],[-81.2423828125,31.57431640625],[-81.259375,31.538916015625],[-81.223388671875,31.528466796874994],[-81.195703125,31.538916015625],[-81.175439453125,31.531298828124996],[-81.218896484375,31.472119140624997],[-81.25791015624999,31.43603515625],[-81.29497070312499,31.37119140625],[-81.38095703124999,31.353271484375],[-81.37773437499999,31.332324218749996],[-81.32915039062499,31.313769531249996],[-81.2884765625,31.263916015625],[-81.364892578125,31.171875],[-81.41259765625,31.179443359375],[-81.44174804687499,31.19970703125],[-81.4603515625,31.12705078125],[-81.45322265624999,31.08828125],[-81.47138671875,31.009033203125],[-81.50058593749999,30.913769531249997],[-81.52041015625,30.874658203124994],[-81.51621093749999,30.801806640624996],[-81.50395507812499,30.7314453125],[-81.457177734375,30.640771484374994],[-81.3857421875,30.269970703124997],[-81.337109375,30.1412109375],[-81.24951171875,29.793798828125],[-81.10454101562499,29.456982421874997],[-80.9,29.049853515624996],[-80.56430664062499,28.556396484375],[-80.52412109375,28.486083984375],[-80.567822265625,28.426464843749997],[-80.58115234374999,28.364697265624997],[-80.5849609375,28.27158203125],[-80.57285156249999,28.180859375],[-80.533154296875,28.070068359375],[-80.45688476562499,27.900683593749996],[-80.49956054687499,27.934472656249994],[-80.610009765625,28.177587890625],[-80.62285156249999,28.320361328124996],[-80.60693359375,28.522900390624997],[-80.63286132812499,28.518017578124997],[-80.65390625,28.452197265624996],[-80.665478515625,28.374902343749994],[-80.693505859375,28.344970703125],[-80.73173828124999,28.462890625],[-80.72905273437499,28.5162109375],[-80.6884765625,28.578515625],[-80.70024414062499,28.600927734375],[-80.76591796874999,28.6328125],[-80.77988281249999,28.682958984375],[-80.77099609375,28.732470703124996],[-80.80869140624999,28.758935546874994],[-80.83818359374999,28.757666015625],[-80.81840820312499,28.635595703125],[-80.78720703124999,28.56064453125],[-80.74863281249999,28.381005859374994],[-80.68637695312499,28.272167968749997],[-80.65009765625,28.180908203125],[-80.22612304687499,27.20703125],[-80.12578124999999,27.0830078125],[-80.08867187499999,26.993945312499996],[-80.050048828125,26.80771484375],[-80.04130859374999,26.568603515625],[-80.110595703125,26.131591796875],[-80.1263671875,25.83349609375],[-80.13627929687499,25.84262695312499],[-80.14291992187499,25.8740234375],[-80.158935546875,25.878320312499994],[-80.21909179687499,25.741748046875003],[-80.30083007812499,25.618554687499994],[-80.327734375,25.42709960937499],[-80.366943359375,25.33125],[-80.48466796874999,25.22983398437499],[-80.5576171875,25.232421875],[-80.7365234375,25.15634765624999],[-80.86220703125,25.176171875],[-81.011962890625,25.133251953124997],[-81.110498046875,25.13803710937499],[-81.1673828125,25.228515625],[-81.15869140625,25.268994140624997],[-81.13603515624999,25.30966796874999],[-81.09765625,25.319140625],[-80.96538085937499,25.224316406249997],[-80.9404296875,25.264208984375003],[-80.98037109375,25.311669921874994],[-81.0568359375,25.338134765625],[-81.11333007812499,25.367236328125003],[-81.22714843749999,25.583398437499994],[-81.34506835937499,25.731835937499994],[-81.36494140625,25.8310546875],[-81.56826171875,25.891552734374997],[-81.715478515625,25.983154296875],[-81.811474609375,26.14609375],[-81.86655273437499,26.435009765624997],[-81.93149414062499,26.467480468749997],[-81.958935546875,26.489941406249997],[-81.8955078125,26.59716796875],[-81.82866210937499,26.687060546874996],[-81.88154296875,26.664697265624994],[-81.920556640625,26.6314453125],[-81.970166015625,26.552050781249996],[-82.00639648437499,26.53984375],[-82.03959960937499,26.552050781249996],[-82.077880859375,26.704345703125],[-82.06694335937499,26.891552734374997],[-82.01328125,26.961572265624994],[-82.095703125,26.963427734374996],[-82.181103515625,26.936767578125],[-82.168603515625,26.874365234375],[-82.1806640625,26.840087890625],[-82.24287109375,26.848876953125],[-82.2900390625,26.870800781249997],[-82.35405273437499,26.935742187499997],[-82.441357421875,27.05966796875],[-82.62045898437499,27.401074218749997],[-82.65537109374999,27.44921875],[-82.714599609375,27.499609375],[-82.68671875,27.515283203124994],[-82.63583984374999,27.524560546874994],[-82.52084960937499,27.678271484374996],[-82.43051757812499,27.771142578124994],[-82.400537109375,27.835400390624997],[-82.40576171875,27.862890625],[-82.445703125,27.90283203125],[-82.49814453124999,27.867919921875],[-82.52060546874999,27.877880859374997],[-82.57958984375,27.958447265624997],[-82.6359375,27.981201171875],[-82.6751953125,27.963769531249994],[-82.6337890625,27.897753906249996],[-82.59658203125,27.873242187499997],[-82.610986328125,27.777246093749994],[-82.62602539062499,27.745996093749994],[-82.660888671875,27.718408203124994],[-82.71533203125,27.733105468749997],[-82.74287109375,27.709375],[-82.77529296875,27.734375],[-82.807568359375,27.7765625],[-82.843505859375,27.845996093749996],[-82.74853515625,28.23681640625],[-82.66064453125,28.48583984375],[-82.6505859375,28.769921875],[-82.64404296875,28.81201171875],[-82.65146484374999,28.8875],[-82.76933593749999,29.0515625],[-83.290478515625,29.451904296875],[-83.69438476562499,29.925976562499997],[-84.04423828124999,30.103808593749996],[-84.30966796874999,30.064746093749996],[-84.355615234375,30.029003906249997],[-84.37534179687499,29.982275390625],[-84.35869140624999,29.929394531249997],[-84.3828125,29.907373046874994],[-84.454052734375,29.91015625],[-84.55,29.897851562499994],[-84.800537109375,29.773046875],[-84.888916015625,29.777636718749996],[-84.969189453125,29.7453125],[-85.029296875,29.72109375],[-85.18603515625,29.707910156249994],[-85.31894531249999,29.680224609374996],[-85.3763671875,29.695214843749994],[-85.413818359375,29.767578125],[-85.413818359375,29.842480468749997],[-85.383447265625,29.785058593749994],[-85.33642578125,29.740136718749994],[-85.314892578125,29.758105468749996],[-85.3068359375,29.7978515625],[-85.35361328124999,29.875732421875],[-85.504296875,29.97578125],[-85.67578125,30.121923828125],[-85.623486328125,30.117089843749994],[-85.61025390625,30.148388671874997],[-85.66342773437499,30.189453125],[-85.64096679687499,30.2369140625],[-85.603515625,30.286767578124994],[-85.67587890624999,30.279296875],[-85.74082031249999,30.244384765625],[-85.74296874999999,30.20126953125],[-85.755810546875,30.1669921875],[-85.790771484375,30.17197265625],[-85.8556640625,30.214404296874996],[-86.17514648437499,30.33251953125],[-86.45444335937499,30.399121093749997],[-86.24008789062499,30.429101562499994],[-86.12382812499999,30.405810546874996],[-86.1376953125,30.441552734374994],[-86.165673828125,30.464257812499994],[-86.25737304687499,30.493017578125],[-86.374169921875,30.482080078124994],[-86.44794921875,30.49560546875],[-86.523388671875,30.467089843749996],[-86.60605468749999,30.424707031249994],[-86.679638671875,30.402880859374996],[-86.96762695312499,30.372363281249996],[-87.201171875,30.339257812499994],[-87.163720703125,30.37421875],[-87.123779296875,30.396679687499997],[-86.985791015625,30.430859375],[-86.96513671874999,30.501904296874997],[-86.99755859375,30.5703125],[-87.03388671875,30.55390625],[-87.072021484375,30.500439453124997],[-87.118798828125,30.538964843749994],[-87.17060546875,30.538769531249997],[-87.18466796874999,30.4537109375],[-87.25107421874999,30.396679687499997],[-87.28105468749999,30.339257812499994],[-87.47578125,30.294287109375],[-87.500732421875,30.309277343749997],[-87.44375,30.363818359374996],[-87.44829101562499,30.394140625],[-87.51328125,30.368115234374997],[-87.622265625,30.26474609375],[-88.00595703124999,30.230908203124997],[-87.985009765625,30.25439453125],[-87.90400390625,30.259082031249996],[-87.790283203125,30.291796875],[-87.81328124999999,30.346875],[-87.85712890625,30.407421875],[-87.897607421875,30.41416015625],[-87.92431640625,30.449658203124997],[-87.922998046875,30.5615234375],[-87.948876953125,30.626904296874997],[-88.011328125,30.694189453125],[-88.032421875,30.68125],[-88.078369140625,30.566210937499996],[-88.11655273437499,30.415332031249996],[-88.13544921875,30.366601562499994],[-88.24921875,30.363183593749994],[-88.34990234374999,30.373486328124997],[-88.69208984375,30.355371093749994],[-88.819921875,30.406494140625],[-88.87294921875,30.416308593749996],[-88.905224609375,30.41513671875],[-89.05405273437499,30.36826171875],[-89.2236328125,30.332373046875],[-89.26357421875,30.343652343749994],[-89.320556640625,30.3453125],[-89.443505859375,30.22314453125],[-89.58847656249999,30.165966796874997],[-89.954248046875,30.26875],[-90.04521484374999,30.351416015625],[-90.1259765625,30.369091796874997],[-90.22529296875,30.379296875],[-90.331982421875,30.277587890625],[-90.413037109375,30.140332031249997],[-90.28496093749999,30.065087890624994],[-90.17534179687499,30.029101562499996],[-89.99418945312499,30.059277343749997],[-89.89404296875,30.125878906249994],[-89.812255859375,30.123681640624994],[-89.77314453125,30.13720703125],[-89.737451171875,30.17197265625],[-89.66752929687499,30.14453125],[-89.6650390625,30.117041015625],[-89.71469726562499,30.078320312499997],[-89.77724609375,30.045703125],[-89.815185546875,30.007275390624997],[-89.743798828125,29.929833984374994],[-89.63168945312499,29.90380859375],[-89.589501953125,29.9150390625],[-89.56337890625,30.002099609374994],[-89.49443359374999,30.058154296874996],[-89.40073242187499,30.046044921874994],[-89.4140625,30.010888671874994],[-89.40092773437499,29.977685546874994],[-89.357861328125,29.92099609375],[-89.36279296875,29.839794921874997],[-89.354443359375,29.820214843749994],[-89.45541992187499,29.784375],[-89.5306640625,29.772216796875],[-89.59086914062499,29.725292968749997],[-89.559326171875,29.698046875],[-89.62065429687499,29.674121093749996],[-89.662109375,29.68369140625],[-89.68295898437499,29.674853515624996],[-89.689208984375,29.646044921874996],[-89.7208984375,29.619287109374994],[-89.6748046875,29.538671875],[-89.580322265625,29.486035156249997],[-89.513671875,29.420068359374994],[-89.245703125,29.333203125],[-89.18076171874999,29.335693359375],[-89.116845703125,29.248242187499997],[-89.06533203125,29.218164062499994],[-89.01572265624999,29.202880859375],[-89.02138671875,29.142724609374994],[-89.109521484375,29.098681640624996],[-89.13334960937499,29.046142578125],[-89.155517578125,29.0166015625],[-89.195263671875,29.054003906249996],[-89.236083984375,29.081103515624996],[-89.33056640625,28.998681640624994],[-89.376123046875,28.981347656249994],[-89.353515625,29.070214843749994],[-89.38920898437499,29.105029296874996],[-89.44316406249999,29.194140625],[-89.52177734374999,29.249267578125],[-89.5771484375,29.267529296874997],[-89.620263671875,29.302392578124994],[-89.67246093749999,29.31650390625],[-89.7169921875,29.312890625],[-89.7923828125,29.333203125],[-89.79736328125,29.380615234375],[-89.81826171875,29.41611328125],[-89.87724609374999,29.4580078125],[-90.15908203125,29.537158203124996],[-90.160791015625,29.50439453125],[-90.141259765625,29.479736328125],[-90.10078125,29.463330078124997],[-90.05234375,29.431396484375],[-90.05278320312499,29.336816406249994],[-90.07373046875,29.296777343749994],[-90.08271484375,29.23974609375],[-90.10136718749999,29.181787109374994],[-90.13583984374999,29.136083984375],[-90.21279296875,29.104931640624997],[-90.246728515625,29.131005859374994],[-90.30161132812499,29.255810546874997],[-90.37919921874999,29.295117187499997],[-90.50249023437499,29.299755859374997],[-90.58623046874999,29.271533203124996],[-90.677490234375,29.150634765625],[-90.75102539062499,29.130859375],[-91.00273437499999,29.193505859374994],[-91.29013671874999,29.288964843749994],[-91.28271484375,29.320751953124997],[-91.2375,29.330957031249994],[-91.15078125,29.317919921874996],[-91.15537109374999,29.35068359375],[-91.24399414062499,29.457324218749996],[-91.26025390625,29.50546875],[-91.24882812499999,29.564208984375],[-91.277734375,29.562890625],[-91.33095703125,29.513574218749994],[-91.51420898437499,29.555371093749997],[-91.56479492187499,29.605322265625],[-91.67246093749999,29.74609375],[-91.8244140625,29.750683593749997],[-91.89316406249999,29.83603515625],[-92.017333984375,29.80029296875],[-92.080224609375,29.7607421875],[-92.135498046875,29.699462890625],[-92.11396484375,29.667675781249997],[-92.05888671874999,29.6171875],[-92.08403320312499,29.592822265624996],[-92.26083984374999,29.556835937499997],[-92.6712890625,29.597070312499994],[-92.79130859374999,29.634667968749994],[-92.952392578125,29.714160156249996],[-93.17568359375,29.778955078124994],[-93.283203125,29.789404296875],[-93.38847656249999,29.7765625],[-93.69482421875,29.769921875],[-93.76591796874999,29.752685546875],[-93.82646484374999,29.725146484374996],[-93.86572265625,29.755615234375],[-93.88388671874999,29.810009765624997],[-93.84833984375,29.81884765625],[-93.8087890625,29.850830078125],[-93.773095703125,29.9140625],[-93.76904296875,29.952294921874994],[-93.79399414062499,29.977246093749997],[-93.841455078125,29.979736328125],[-93.9462890625,29.814990234374996],[-93.886376953125,29.72265625],[-93.89047851562499,29.689355468749994],[-94.09965820312499,29.67041015625],[-94.574462890625,29.484521484374994],[-94.75961914062499,29.38427734375],[-94.750146484375,29.418017578124996],[-94.52626953125,29.54794921875],[-94.60532226562499,29.567822265624997],[-94.7326171875,29.535351562499997],[-94.778271484375,29.5478515625],[-94.724365234375,29.6552734375],[-94.741943359375,29.75],[-94.83232421874999,29.752587890624994],[-94.889892578125,29.676953125],[-94.9298828125,29.68017578125],[-94.98227539062499,29.712597656249997],[-95.0228515625,29.70234375],[-94.992822265625,29.530957031249997],[-94.93588867187499,29.46044921875],[-94.88828125,29.370556640624997],[-95.018310546875,29.259472656249997],[-95.1390625,29.167822265625],[-95.15214843749999,29.079248046874994],[-95.27348632812499,28.9638671875],[-95.387646484375,28.8984375],[-95.655859375,28.74462890625],[-95.732373046875,28.71171875],[-95.85341796875,28.640332031249997],[-96.02041015625,28.586816406249994],[-96.18051757812499,28.501855468749994],[-96.234521484375,28.488964843749997],[-96.132275390625,28.560888671875],[-96.01103515624999,28.63193359375],[-96.11503906249999,28.622216796874994],[-96.275341796875,28.655126953125],[-96.3734375,28.65703125],[-96.37412109374999,28.631103515625],[-96.44873046875,28.594482421875],[-96.526025390625,28.648291015625],[-96.559716796875,28.684472656249994],[-96.57568359375,28.715722656249994],[-96.60849609374999,28.723291015624994],[-96.6400390625,28.708789062499996],[-96.524658203125,28.488720703124997],[-96.47548828125,28.479199218749997],[-96.42109375,28.457324218749996],[-96.48881835937499,28.406054687499996],[-96.56171875,28.367138671874997],[-96.67636718749999,28.34130859375],[-96.77353515624999,28.421630859375],[-96.794580078125,28.320849609374996],[-96.806884765625,28.22021484375],[-96.839501953125,28.194384765624996],[-96.8916015625,28.157568359375],[-96.919873046875,28.185351562499996],[-96.93330078125,28.224267578124994],[-96.96665039062499,28.18955078125],[-97.01547851562499,28.163476562499994],[-97.09604492187499,28.158251953124996],[-97.156494140625,28.144335937499996],[-97.15507812499999,28.10263671875],[-97.141259765625,28.060742187499997],[-97.034326171875,28.09384765625],[-97.07309570312499,27.986083984375],[-97.17143554687499,27.879589843749997],[-97.2515625,27.854443359374997],[-97.37412109374999,27.870019531249994],[-97.40439453124999,27.859326171874997],[-97.43149414062499,27.837207031249996],[-97.288720703125,27.670605468749997],[-97.38046875,27.419335937499994],[-97.439111328125,27.328271484374994],[-97.47978515624999,27.316601562499997],[-97.523876953125,27.31396484375],[-97.68212890625,27.394921875],[-97.76845703125,27.45751953125],[-97.6923828125,27.287158203124996],[-97.485107421875,27.23740234375],[-97.47451171875,27.17294921875],[-97.47568359374999,27.117871093749997],[-97.51650390625,27.05322265625],[-97.5546875,26.967333984374996],[-97.526513671875,26.907519531249996],[-97.493798828125,26.759619140625],[-97.4658203125,26.691748046875],[-97.43505859375,26.48583984375],[-97.40234375,26.396533203124996],[-97.21391601562499,26.06787109375],[-97.150390625,26.065332031249994],[-97.14018554687499,26.029736328124997],[-97.146240234375,25.961474609375003],[-97.164453125,25.754931640625003],[-97.22490234374999,25.58544921875],[-97.424072265625,25.233105468749997],[-97.507080078125,25.014550781249994],[-97.66767578125,24.38999023437499],[-97.717041015625,23.980615234374994],[-97.72861328124999,23.78793945312499],[-97.74267578125,23.760644531249994],[-97.72739257812499,23.732226562500003],[-97.765869140625,23.30615234375],[-97.74521484374999,22.9423828125],[-97.75834960937499,22.886035156250003],[-97.81669921874999,22.776318359374997],[-97.8578125,22.62451171875],[-97.84160156249999,22.557080078124997],[-97.84248046875,22.510302734375003],[-97.782373046875,22.279296875],[-97.76328125,22.105859375],[-97.58476562499999,21.808544921874997],[-97.484521484375,21.704833984375],[-97.36015624999999,21.614941406249997],[-97.31450195312499,21.564208984375],[-97.336865234375,21.437890625],[-97.38754882812499,21.373925781249994],[-97.4091796875,21.27255859374999],[-97.43413085937499,21.356494140625003],[-97.42441406249999,21.46533203125],[-97.38481445312499,21.523828125],[-97.383447265625,21.566699218750003],[-97.45659179687499,21.61240234374999],[-97.59038085937499,21.762011718750003],[-97.75380859375,22.026660156250003],[-97.63754882812499,21.603662109374994],[-97.597607421875,21.535888671875],[-97.566552734375,21.507714843749994],[-97.51455078125,21.477978515624997],[-97.50107421874999,21.43203125],[-97.50058593749999,21.398046875],[-97.35712890625,21.10400390625],[-97.194970703125,20.800097656250003],[-97.18632812499999,20.717041015625],[-97.12143554687499,20.614990234375],[-96.70869140625,20.18828125],[-96.4560546875,19.869775390624994],[-96.368359375,19.56723632812499],[-96.31533203125,19.472851562499997],[-96.28955078125,19.34375],[-96.123974609375,19.19907226562499],[-96.073388671875,19.105664062499997],[-95.98466796874999,19.053759765625003],[-95.913037109375,18.897167968749997],[-95.77812,18.80551757812499],[-95.81035156249999,18.803857421874994],[-95.92822265625,18.85009765625],[-95.920361328125,18.819580078125],[-95.82109374999999,18.754638671875],[-95.62680664062499,18.690576171874994],[-95.5783203125,18.6904296875],[-95.654931640625,18.723681640625003],[-95.71982421874999,18.768359375],[-95.69711914062499,18.77490234375],[-95.56142578125,18.719140625],[-95.1818359375,18.700732421875003],[-95.01469726562499,18.570605468750003],[-94.79814453124999,18.514599609374997],[-94.681640625,18.34848632812499],[-94.54619140624999,18.174853515625003],[-94.45976562499999,18.166650390624994],[-94.39228515625,18.165966796874997],[-94.18901367187499,18.195263671874997],[-93.87314453124999,18.304443359375],[-93.764404296875,18.35791015625],[-93.55234375,18.43046875],[-93.2279296875,18.443798828124997],[-93.12734375,18.4234375],[-92.884765625,18.468652343749994],[-92.76909179687499,18.524121093749997],[-92.728955078125,18.574511718750003],[-92.710107421875,18.61166992187499],[-92.485302734375,18.664794921875],[-92.441015625,18.67529296875],[-92.21318359374999,18.684863281250003],[-92.10322265625,18.704394531250003],[-91.973779296875,18.715869140625003],[-91.88037109375,18.63779296874999],[-91.88046875,18.599658203125003],[-91.94267578124999,18.563427734374997],[-91.91357421875,18.528515625],[-91.802978515625,18.470605468749994],[-91.59970703124999,18.447167968749994],[-91.53398437499999,18.45654296875],[-91.44047851562499,18.54184570312499],[-91.27524414062499,18.624462890624997],[-91.278759765625,18.720654296874997],[-91.30830078125,18.77329101562499],[-91.35629882812499,18.7765625],[-91.36777343749999,18.806103515624997],[-91.334228515625,18.87680664062499],[-91.34306640624999,18.900585937499997],[-91.445556640625,18.8328125],[-91.469189453125,18.8330078125],[-91.45786132812499,18.864648437499994],[-91.436669921875,18.889794921874994],[-91.1359375,19.0375],[-91.05893554687499,19.098193359375003],[-90.955029296875,19.151660156250003],[-90.7392578125,19.352246093749997],[-90.69316406249999,19.729882812499994],[-90.65009765625,19.795947265625003],[-90.507080078125,19.911865234375],[-90.49169921875,19.94677734375],[-90.482421875,20.02573242187499],[-90.48637695312499,20.224023437499994],[-90.47832031249999,20.37998046874999],[-90.484130859375,20.556347656249997],[-90.458447265625,20.71372070312499],[-90.43515625,20.757519531249997],[-90.353125,21.009423828124994],[-90.18291015624999,21.120898437500003],[-89.887646484375,21.252636718749997],[-89.819775390625,21.274609375],[-88.87871093749999,21.414111328125003],[-88.74667968749999,21.448144531249994],[-88.584912109375,21.538671875],[-88.46669921875,21.569384765625003],[-88.25102539062499,21.56689453125],[-88.184765625,21.57895507812499],[-88.17172851562499,21.591455078124994],[-88.17138671875,21.603515625],[-88.13164062499999,21.615869140624994],[-88.0068359375,21.604052734375003],[-87.77373046874999,21.549511718749997],[-87.68881835937499,21.535839843749997],[-87.48046875,21.472460937500003],[-87.25087890625,21.446972656249997],[-87.217919921875,21.4580078125],[-87.18759765624999,21.477294921875],[-87.164306640625,21.514208984375003],[-87.18828124999999,21.546435546875003],[-87.210595703125,21.5439453125],[-87.249462890625,21.526611328125],[-87.29575195312499,21.524951171875003],[-87.386669921875,21.551464843749997],[-87.36850585937499,21.57373046875],[-87.27573242187499,21.57163085937499],[-87.216455078125,21.582421875],[-87.12846679687499,21.621484375],[-87.034765625,21.592236328124997],[-86.91171875,21.462841796874997],[-86.82407226562499,21.421679687500003],[-86.81708984375,21.23422851562499],[-86.803857421875,21.20004882812499],[-86.77177734374999,21.150537109374994],[-86.81552734374999,21.00522460937499],[-86.864697265625,20.885058593750003],[-86.926220703125,20.78647460937499],[-87.0595703125,20.63125],[-87.22124023437499,20.507275390624997],[-87.42138671875,20.231396484374997],[-87.4671875,20.10214843749999],[-87.4658203125,19.99853515625],[-87.43193359374999,19.898486328125003],[-87.44174804687499,19.861523437499997],[-87.4662109375,19.824169921874997],[-87.50688476562499,19.82749023437499],[-87.58579101562499,19.779492187499997],[-87.6876953125,19.637109375],[-87.690087890625,19.593701171874997],[-87.64531249999999,19.55390625],[-87.5873046875,19.572998046875],[-87.511669921875,19.57470703125],[-87.469384765625,19.586474609375003],[-87.424755859375,19.58334960937499],[-87.434716796875,19.501708984375],[-87.482666015625,19.44375],[-87.512890625,19.425585937500003],[-87.56699218749999,19.415722656249997],[-87.62753906249999,19.382714843749994],[-87.65869140625,19.35234375],[-87.65576171875,19.257861328125003],[-87.6220703125,19.25048828125],[-87.55078125,19.320947265624994],[-87.50947265625,19.31748046874999],[-87.50107421874999,19.287792968749997],[-87.59355468749999,19.04638671875],[-87.65302734375,18.798535156249997],[-87.733544921875,18.655029296875],[-87.76181640624999,18.44614257812499],[-87.8041015625,18.357080078124994],[-87.85322265625,18.268994140624997],[-87.881982421875,18.273876953124997],[-87.95966796875,18.440869140624997],[-88.0390625,18.48388671875],[-88.05644531249999,18.524462890625003],[-88.0111328125,18.726855468750003],[-88.03173828125,18.838916015625003],[-88.07377929687499,18.83447265625],[-88.12675781249999,18.773046875],[-88.19677734375,18.719677734374997],[-88.1953125,18.642626953125003],[-88.27573242187499,18.514550781249994],[-88.295654296875,18.472412109375],[-88.349267578125,18.358837890624997],[-88.295654296875,18.34409179687499],[-88.247265625,18.3546875],[-88.1302734375,18.350732421874994],[-88.08525390624999,18.226123046875003],[-88.09721679687499,18.121630859375003],[-88.207470703125,17.84609375],[-88.221435546875,17.751367187499994],[-88.271728515625,17.60986328125],[-88.20346679687499,17.5166015625],[-88.2671875,17.392578125],[-88.288818359375,17.312695312499997],[-88.29399414062499,17.192138671875],[-88.26181640624999,16.963037109374994],[-88.313427734375,16.632763671874997],[-88.404541015625,16.48862304687499],[-88.4611328125,16.433789062499997],[-88.56230468749999,16.290429687499994],[-88.69516601562499,16.24765625],[-88.8791015625,16.016650390625003],[-88.91171875,15.956005859374997],[-88.89404296875,15.890625],[-88.839990234375,15.868994140624991],[-88.79833984375,15.8625],[-88.708642578125,15.806542968749994],[-88.60336914062499,15.76416015625],[-88.53623046874999,15.849609375],[-88.57158203124999,15.901074218749997],[-88.59799804687499,15.92734375],[-88.5939453125,15.950292968749991],[-88.22832031249999,15.72900390625],[-88.131103515625,15.701025390624991],[-88.05458984375,15.76484375],[-88.010400390625,15.786181640625003],[-87.90703124999999,15.862597656250003],[-87.874951171875,15.879345703124997],[-87.70185546875,15.91064453125],[-87.6181640625,15.909863281249997],[-87.54497070312499,15.832373046874991],[-87.48691406249999,15.790185546874994],[-87.37749023437499,15.826464843750003],[-87.285888671875,15.834423828124997],[-86.9072265625,15.762353515624994],[-86.75703125,15.794238281250003],[-86.48081054687499,15.801074218750003],[-86.356640625,15.783203125],[-86.18120117187499,15.88515625],[-86.0685546875,15.905664062499994],[-85.936279296875,15.953417968750003],[-85.95390624999999,16.002246093750003],[-85.98564453124999,16.024169921875],[-85.78398437499999,16.002832031249994],[-85.48369140624999,15.899511718749991],[-85.163671875,15.918164062499997],[-85.0482421875,15.973974609374991],[-84.97373046874999,15.989892578124994],[-84.64609375,15.88359375],[-84.55966796874999,15.802001953125],[-84.49228515624999,15.7939453125],[-84.44003906249999,15.812597656249991],[-84.4259765625,15.829492187499994],[-84.490380859375,15.847265625],[-84.51962890624999,15.872753906249997],[-84.26142578125,15.822607421874991],[-83.77548828124999,15.436865234374991],[-83.765283203125,15.40546875],[-83.972802734375,15.519628906249991],[-84.082763671875,15.510888671874994],[-84.111328125,15.492431640625],[-84.10517578125,15.430126953124997],[-84.09506835937499,15.400927734375003],[-84.04794921874999,15.397607421874994],[-84.01318359375,15.414404296874991],[-83.92744140625,15.39404296875],[-83.87065429687499,15.352734375],[-83.80166015625,15.289257812499997],[-83.76044921875,15.220361328124994],[-83.71591796874999,15.21923828125],[-83.67216796874999,15.2607421875],[-83.58964843749999,15.265771484374994],[-83.53593749999999,15.219384765624994],[-83.49794921875,15.222119140624997],[-83.55107421874999,15.293994140625003],[-83.67612304687499,15.365429687499997],[-83.64638671875,15.368408203125],[-83.36918945312499,15.239990234375],[-83.29086914062499,15.07890625],[-83.2255859375,15.042285156250003],[-83.15751953124999,14.993066406249994],[-83.18535156249999,14.956396484374991],[-83.21591796874999,14.932373046875],[-83.27988281249999,14.812792968750003],[-83.302001953125,14.802099609374991],[-83.30634765625,14.890527343749994],[-83.344384765625,14.902099609375],[-83.38901367187499,14.870654296875003],[-83.413720703125,14.825341796874994],[-83.37485351562499,14.76611328125],[-83.34072265625,14.765283203124994],[-83.29921875,14.7490234375],[-83.187744140625,14.340087890625],[-83.21171874999999,14.267138671875003],[-83.28081054687499,14.153613281250003],[-83.34658203125,14.056982421874991],[-83.4123046875,13.996484375],[-83.49375,13.738818359375003],[-83.567333984375,13.3203125],[-83.51445312499999,12.943945312499991],[-83.5412109375,12.596289062499991],[-83.51796875,12.514111328124997],[-83.5109375,12.411816406249997],[-83.56523437499999,12.393408203124991],[-83.5958984375,12.396484375],[-83.627197265625,12.459326171874991],[-83.623681640625,12.514550781249994],[-83.5912109375,12.579345703125],[-83.578076171875,12.667138671874994],[-83.593359375,12.713085937499997],[-83.62534179687499,12.612890625],[-83.681640625,12.568115234375],[-83.718359375,12.552636718749994],[-83.75424804687499,12.501953125],[-83.7162109375,12.40673828125],[-83.66733398437499,12.337060546874994],[-83.65126953125,12.287060546874997],[-83.66923828124999,12.2275390625],[-83.680419921875,12.024316406249994],[-83.697705078125,12.029980468749997],[-83.715576171875,12.057421874999989],[-83.7671875,12.059277343749997],[-83.77333984375,11.977392578124991],[-83.76933593749999,11.931640625],[-83.81318359375,11.896386718749994],[-83.82890624999999,11.861035156249997],[-83.79296875,11.836181640625],[-83.753369140625,11.8212890625],[-83.70458984375,11.824560546874991],[-83.664306640625,11.723876953125],[-83.6517578125,11.642041015624997],[-83.74497070312499,11.566503906249991],[-83.776611328125,11.503955078124989],[-83.82939453124999,11.428173828124997],[-83.85908203125,11.353662109374994],[-83.86787109375,11.300048828125],[-83.83183593749999,11.130517578124994],[-83.76791992187499,11.01025390625],[-83.7140625,10.933837890625],[-83.6419921875,10.917236328125],[-83.61728515624999,10.877490234374989],[-83.58818359374999,10.814990234374989],[-83.57529296874999,10.734716796874991],[-83.4482421875,10.465917968749991],[-83.346826171875,10.315380859374997],[-83.124609375,10.041601562499991],[-83.028515625,9.991259765624989],[-82.86630859374999,9.770947265624997],[-82.810302734375,9.734570312499997],[-82.77841796874999,9.66953125],[-82.61015624999999,9.616015624999989],[-82.56357421874999,9.57666015625],[-82.50034179687499,9.523242187499989],[-82.37080078125,9.428564453124991],[-82.36318359375,9.381933593749991],[-82.375390625,9.337255859374991],[-82.33974609375,9.209179687499997],[-82.2724609375,9.190625],[-82.20488281249999,9.215429687499991],[-82.188134765625,9.191748046874991],[-82.20068359375,9.168115234374994],[-82.23544921874999,9.141650390624989],[-82.24418945312499,9.031494140625],[-82.13330078125,8.980078125],[-82.077880859375,8.934863281249989],[-81.894140625,8.956103515624989],[-81.826416015625,8.944091796875],[-81.780224609375,8.957226562499997],[-81.831494140625,9.045605468749997],[-81.900146484375,9.111035156249997],[-81.894482421875,9.140429687499989],[-81.84238281249999,9.118701171874989],[-81.80258789062499,9.074121093749994],[-81.71220703124999,9.018945312499994],[-81.54560546875,8.827001953124991],[-81.35478515624999,8.780566406249989],[-81.203759765625,8.78671875],[-81.06308593749999,8.812646484374994],[-80.83867187499999,8.88720703125],[-80.67646484375,9.021875],[-80.546875,9.081933593749994],[-80.127099609375,9.209912109374997],[-79.977978515625,9.343701171874997],[-79.91508789062499,9.361328125],[-79.855078125,9.378076171874994],[-79.723095703125,9.479296874999989],[-79.65224609375,9.558203125],[-79.577294921875,9.597851562499997],[-79.35546875,9.569238281249994],[-79.21162109375,9.531933593749997],[-79.112255859375,9.536767578124994],[-79.01669921874999,9.510449218749997],[-78.975,9.452978515624991],[-78.931640625,9.428466796875],[-78.696923828125,9.434765625],[-78.504345703125,9.406298828124989],[-78.082763671875,9.236279296874997],[-77.830810546875,9.068115234375],[-77.697216796875,8.889453124999989],[-77.37421875,8.658300781249991],[-77.344140625,8.63671875],[-77.26157226562499,8.493701171874989],[-77.130126953125,8.400585937499997],[-76.99228515624999,8.250341796874991],[-76.93583984374999,8.146826171874991],[-76.89096679687499,8.127978515624989],[-76.85185546874999,8.090478515624994],[-76.869091796875,8.062695312499997],[-76.91220703124999,8.033398437499997],[-76.92465820312499,7.973193359374989],[-76.896630859375,7.939453125],[-76.86689453125,7.91796875],[-76.786572265625,7.931591796874997],[-76.742333984375,8.002148437499997],[-76.77207031249999,8.310546875],[-76.818603515625,8.464697265624991],[-76.872216796875,8.512744140624989],[-76.92045898437499,8.57373046875],[-76.88798828124999,8.619873046875],[-76.80224609375,8.640673828124989],[-76.68935546875,8.694726562499994],[-76.27685546875,8.989111328124991],[-76.135498046875,9.265625],[-76.02724609375,9.365771484374989],[-75.905029296875,9.430908203125],[-75.75556640625,9.415625],[-75.63935546875,9.450439453125],[-75.60361328124999,9.538476562499994],[-75.63535156249999,9.6578125],[-75.68002929687499,9.729785156249989],[-75.637109375,9.834277343749989],[-75.59267578125,9.992724609374989],[-75.5958984375,10.125830078124991],[-75.53857421875,10.205175781249991],[-75.55839843749999,10.236425781249991],[-75.6421875,10.172167968749989],[-75.70834960937499,10.143408203124991],[-75.6708984375,10.196337890624989],[-75.5537109375,10.327734375],[-75.49277343749999,10.527636718749989],[-75.44599609375,10.610888671874989],[-75.28061523437499,10.727197265624994],[-75.24794921875,10.783251953124989],[-75.123046875,10.870410156249989],[-74.92158203125,11.057568359374997],[-74.84458007812499,11.109716796874991],[-74.454248046875,10.989062499999989],[-74.330224609375,10.996679687499991],[-74.35239257812499,10.974658203124989],[-74.4095703125,10.9671875],[-74.49228515624999,10.934472656249994],[-74.516259765625,10.8625],[-74.46025390624999,10.787060546874997],[-74.40087890625,10.765234375],[-74.35019531249999,10.813720703125],[-74.299951171875,10.952246093749991],[-74.219140625,11.105322265624991],[-74.2001953125,11.265722656249991],[-74.14291992187499,11.320849609374989],[-74.05913085937499,11.34062],[-73.9095703125,11.308886718749989],[-73.79570312499999,11.275683593749989],[-73.676904296875,11.271484375],[-73.31337890625,11.295751953124991],[-72.721826171875,11.712158203125],[-72.44707031249999,11.801708984374997],[-72.275,11.889257812499991],[-72.165234375,12.060205078124994],[-72.1357421875,12.188574218749991],[-72.055078125,12.238427734374994],[-71.9701171875,12.23828125],[-71.93125,12.26953125],[-71.919140625,12.30908203125],[-71.71455078125,12.419970703124989],[-71.59746093749999,12.43437],[-71.49399414062499,12.432275390624994],[-71.262109375,12.335302734374991],[-71.155029296875,12.164160156249991],[-71.13730468749999,12.046337890624997],[-71.2841796875,11.918310546874991],[-71.3197265625,11.861914062499991],[-71.34941406249999,11.81494140625],[-71.41455078125,11.755175781249989],[-71.48837890624999,11.71875],[-71.86865234375,11.62734375],[-71.90751953124999,11.607958984374989],[-71.95693359375,11.569921875],[-71.9572265625,11.4828125],[-71.94697265625,11.414453125],[-71.835107421875,11.190332031249994],[-71.791455078125,11.135058593749989],[-71.6416015625,11.013525390624991],[-71.67568359375,10.996728515624994],[-71.730908203125,10.994677734374989],[-71.6904296875,10.835498046874989],[-71.59843749999999,10.726220703124994],[-71.59433593749999,10.657373046874994],[-71.66484374999999,10.44375],[-71.79350585937499,10.315966796874989],[-71.884765625,10.167236328125],[-71.955712890625,10.108056640624994],[-72.11284179687499,9.815576171874994],[-71.99326171874999,9.641503906249994],[-71.97626953125,9.55322265625],[-71.873046875,9.427636718749994],[-71.8056640625,9.386425781249997],[-71.7607421875,9.335742187499989],[-71.78134765624999,9.25],[-71.74013671875,9.133886718749991],[-71.68671875,9.072509765625],[-71.61953125,9.047949218749991],[-71.53662109375,9.048291015624997],[-71.29794921874999,9.125634765624994],[-71.24140625,9.160449218749989],[-71.20537109374999,9.222460937499989],[-71.08583984375,9.348242187499991],[-71.07841796874999,9.510791015624989],[-71.052685546875,9.705810546875],[-71.08173828125,9.833203125],[-71.2072265625,10.014599609374997],[-71.26220703125,10.143603515624989],[-71.38662109375,10.263769531249991],[-71.46279296875,10.46923828125],[-71.49423828124999,10.533203125],[-71.51787109374999,10.621826171875],[-71.54462890625,10.778710937499994],[-71.4611328125,10.835644531249997],[-71.46953124999999,10.964160156249989],[-71.26435546875,10.99951171875],[-70.8205078125,11.208447265624997],[-70.54560546875,11.261376953124994],[-70.23251953124999,11.372998046874997],[-70.15996093749999,11.428076171874991],[-70.097119140625,11.519775390625],[-70.04853515625,11.530322265624989],[-69.88535156249999,11.4443359375],[-69.80478515624999,11.47421875],[-69.772900390625,11.541308593749989],[-69.817333984375,11.672070312499997],[-69.91093749999999,11.672119140625],[-70.192578125,11.624609375],[-70.2201171875,11.680859375],[-70.22001953124999,11.730078125],[-70.2865234375,11.886035156249989],[-70.2451171875,12.003515625],[-70.202783203125,12.098388671875],[-70.122021484375,12.136621093749994],[-70.00395507812499,12.177880859374994],[-69.91435546874999,12.114599609374991],[-69.860107421875,12.05419921875],[-69.83061523437499,11.99560546875],[-69.810546875,11.836865234374997],[-69.76240234375,11.676025390625],[-69.7119140625,11.564208984375],[-69.631591796875,11.479931640624997],[-69.56982421875,11.485449218749991],[-69.52573242187499,11.49951171875],[-69.232568359375,11.518457031249994],[-69.05458984375,11.461035156249991],[-68.82797851562499,11.431738281249991],[-68.6162109375,11.30937],[-68.3986328125,11.160986328124991],[-68.3431640625,11.052832031249991],[-68.32480468749999,10.949316406249991],[-68.27207031249999,10.880029296874994],[-68.32470703125,10.808740234374994],[-68.2962890625,10.689355468749994],[-68.23408203125,10.569140624999989],[-68.13994140624999,10.492724609374989],[-67.87163085937499,10.472070312499994],[-67.58134765624999,10.523730468749989],[-67.13330078125,10.570410156249991],[-66.98906249999999,10.610644531249989],[-66.247216796875,10.632226562499994],[-66.105859375,10.574609375],[-66.09213867187499,10.51708984375],[-66.090478515625,10.472949218749989],[-65.8517578125,10.257763671874997],[-65.655859375,10.228466796874997],[-65.48935546874999,10.159423828125],[-65.3173828125,10.122363281249989],[-65.1291015625,10.070068359375],[-65.02329101562499,10.07666015625],[-64.94404296875,10.095019531249989],[-64.85048828125,10.098095703124997],[-64.18833007812499,10.457812499999989],[-63.83369140625,10.448535156249989],[-63.779052734375,10.471923828125],[-63.731884765625,10.50341796875],[-63.862695312499994,10.558154296874989],[-64.15791015625,10.579248046874994],[-64.247509765625,10.542578125],[-64.29819335937499,10.63515625],[-64.20195312499999,10.632666015624991],[-63.8734375,10.663769531249997],[-63.49677734375,10.643261718749997],[-63.189892578125,10.709179687499997],[-63.03549804687499,10.720117187499994],[-62.946728515625,10.707080078124989],[-62.70234375,10.749804687499989],[-62.24228515624999,10.699560546874991],[-61.87949218749999,10.741015624999989],[-61.92138671875,10.681445312499989],[-62.040429687499994,10.645361328124991],[-62.23291015625,10.633984375],[-62.37998046874999,10.546875],[-62.6935546875,10.56298828125],[-62.91357421875,10.531494140625],[-62.84296875,10.507226562499994],[-62.843017578125,10.417919921874997],[-62.812939453125,10.39990234375],[-62.78125,10.399218749999989],[-62.706298828125,10.333056640624989],[-62.68583984374999,10.289794921875],[-62.66162109375,10.198583984374991],[-62.69467773437499,10.10009765625],[-62.74057617187499,10.05615234375],[-62.65117187499999,10.070654296874991],[-62.600488281249994,10.116943359375],[-62.60791015625,10.163427734374991],[-62.600488281249994,10.21728515625],[-62.55034179687499,10.200439453125],[-62.51513671875,10.176123046874991],[-62.40092773437499,9.918408203124997],[-62.32041015624999,9.783056640624991],[-62.2998046875,9.788183593749991],[-62.280664062499994,9.79296875],[-62.256738281249994,9.818896484374989],[-62.221142578125,9.882568359375],[-62.1904296875,9.8421875],[-62.17197265624999,9.826708984374989],[-62.15336914062499,9.82177734375],[-62.1703125,9.879492187499991],[-62.1474609375,9.953417968749989],[-62.15532226562499,9.979248046875],[-62.11962890625,9.98486328125],[-62.077099609375,9.975048828124997],[-62.016503906249994,9.9546875],[-61.90859375,9.869921874999989],[-61.83725585937499,9.782080078124991],[-61.83115234374999,9.733056640624994],[-61.80537109375,9.705517578124997],[-61.758740234375,9.676513671875],[-61.7359375,9.631201171874991],[-61.73173828124999,9.702490234374991],[-61.759179687499994,9.754443359374989],[-61.76591796874999,9.813818359374991],[-61.625390625,9.816455078124989],[-61.5888671875,9.89453125],[-61.51230468749999,9.847509765624991],[-61.30937,9.633056640625],[-61.23442382812499,9.597607421874997],[-61.01337890625,9.556445312499989],[-60.87407226562499,9.453320312499997],[-60.79248046875,9.360742187499994],[-60.840966796874994,9.263671875],[-60.97104492187499,9.215185546874991],[-61.02314453125,9.154589843749989],[-61.05307617187499,9.095117187499994],[-61.05356445312499,9.035253906249991],[-61.09296875,8.965771484374997],[-61.098828125,8.941308593749994],[-61.12236328124999,8.843359375],[-61.17587890624999,8.725390624999989],[-61.247265625,8.600341796875],[-61.61870117187499,8.597460937499989],[-61.52690429687499,8.546142578125],[-61.442578125,8.508691406249994],[-61.30400390624999,8.410400390625],[-61.19375,8.487597656249989],[-61.03598632812499,8.493115234374997],[-60.865234375,8.578808593749997],[-60.8009765625,8.592138671874991],[-60.48149414062499,8.547265625],[-60.4044921875,8.610253906249994],[-60.340234375,8.628759765624991],[-60.16748046875,8.616992187499989],[-60.017529296875,8.54931640625],[-59.980615234374994,8.532617187499994],[-59.83652343749999,8.373828124999989],[-59.756738281249994,8.339501953124994],[-59.73994140625,8.338720703124991],[-59.73930664062499,8.379980468749991],[-59.66611328124999,8.362597656249989],[-59.47690429687499,8.254003906249991],[-59.20024414062499,8.074609375],[-58.81157226562499,7.735595703125],[-58.701074218749994,7.606640625],[-58.626611328124994,7.5458984375],[-58.51108398437499,7.398046875],[-58.477294921875,7.32578125],[-58.48056640624999,7.038134765624989],[-58.582910156249994,6.843652343749994],[-58.60791015625,6.697314453124989],[-58.6134765625,6.502539062499991],[-58.67294921874999,6.390771484374994],[-58.593994140625,6.451513671874991],[-58.569482421874994,6.627246093749989],[-58.50229492187499,6.733984375],[-58.414990234375,6.851171875],[-58.2984375,6.879296875],[-58.1728515625,6.829394531249989],[-58.07177734375,6.820605468749989],[-57.982568359374994,6.785888671875],[-57.792871093749994,6.598535156249994],[-57.607568359374994,6.450390625],[-57.54013671874999,6.33154296875],[-57.343652343749994,6.272119140624994],[-57.2275390625,6.178417968749997],[-57.19023437499999,6.097314453124994],[-57.167236328125,5.885009765625],[-57.2052734375,5.564599609374994],[-57.194775390625,5.5484375],[-57.18212890625,5.52890625],[-57.1408203125,5.643798828125],[-57.13603515624999,5.737207031249994],[-57.10458984374999,5.829394531249989],[-57.056640625,5.938671875],[-56.96982421874999,5.992871093749997],[-56.466015625,5.937744140625],[-56.235595703125,5.885351562499991],[-55.93955078124999,5.795458984374989],[-55.897607421874994,5.699316406249991],[-55.8955078125,5.795458984374989],[-55.909912109375,5.892626953124989],[-55.82817382812499,5.961669921875],[-55.648339843749994,5.985888671874989],[-55.379296875,5.95263671875],[-55.14829101562499,5.993457031249989],[-54.83369140625,5.988330078124989],[-54.35615234375,5.909863281249997],[-54.142333984375,5.856347656249994],[-54.05419921875,5.807910156249989],[-54.03740234374999,5.720507812499989],[-54.04594726562499,5.60888671875],[-54.08046875,5.502246093749989],[-54.15595703125,5.358984375],[-54.08530273437499,5.411816406249997],[-53.98959960937499,5.676025390625],[-53.919921875,5.768994140624997],[-53.84716796875,5.7822265625],[-53.45444335937499,5.5634765625],[-53.27036132812499,5.543261718749989],[-52.899316406249994,5.425048828125],[-52.76499023437499,5.273486328124989],[-52.45395507812499,5.021337890624991],[-52.29052734375,4.942187499999989],[-52.28891601562499,4.876123046874994],[-52.324609375,4.770898437499994],[-52.219970703125,4.86279296875],[-52.05810546875,4.717382812499991],[-52.01230468749999,4.64599609375],[-51.9619140625,4.514404296875],[-51.979345703125006,4.429882812499997],[-52.001708984375,4.38623046875],[-52.0029296875,4.352294921875],[-51.95478515624998,4.399072265624994],[-51.92768554687498,4.436132812499991],[-51.919580078124994,4.524316406249994],[-51.880273437499994,4.633740234374997],[-51.827539062499994,4.635693359374997],[-51.78564453125,4.570507812499997],[-51.698632812499994,4.286816406249997],[-51.66582031249999,4.228808593749989],[-51.65327148437498,4.138769531249991],[-51.658105468749994,4.098486328124991],[-51.65253906249998,4.061279296875],[-51.55781249999998,4.233789062499994],[-51.54707031249998,4.310888671874991],[-51.461523437500006,4.313769531249989],[-51.32709960937498,4.224755859374994],[-51.21992187499998,4.093603515624991],[-51.076269531250006,3.671679687499989],[-51.052392578124994,3.281835937499991],[-50.994140625,3.077539062499994],[-50.82719726562499,2.65185546875],[-50.816503906250006,2.573046874999989],[-50.789697265624994,2.477783203125],[-50.736962890624994,2.376757812499989],[-50.67875976562499,2.210351562499994],[-50.67656249999999,2.179443359375],[-50.71440429687499,2.134033203125],[-50.658935546875,2.130957031249991],[-50.60869140624999,2.104101562499991],[-50.57587890624998,1.998583984374989],[-50.534423828125,1.92724609375],[-50.458886718749994,1.82958984375],[-50.304296875,1.797656249999989],[-50.187597656250006,1.785986328124991],[-50.0546875,1.730712890625],[-49.957128906250006,1.659863281249997],[-49.881591796875,1.419921875],[-49.90625,1.26904296875],[-49.89887695312498,1.162988281249994],[-49.93793945312498,1.121435546874991],[-50.047216796875006,1.051953125],[-50.07099609374998,1.015087890624997],[-50.29443359375,0.835742187499989],[-50.34326171875,0.751025390624989],[-50.462988281250006,0.637304687499991],[-50.58154296875,0.420507812499991],[-50.75507812499998,0.222558593749994],[-50.81635742187498,0.172558593749997],[-50.91015625,0.160986328124991],[-50.96708984374999,0.130273437499994],[-51.101953125,-0.03125],[-51.28291015624998,-0.085205078125],[-51.299560546875,-0.178808593750006],[-51.404150390625006,-0.392675781250006],[-51.49628906249998,-0.509472656250011],[-51.555029296875006,-0.549121093750003],[-51.70263671875,-0.762304687500006],[-51.721533203125006,-0.85546875],[-51.720605468749994,-1.018457031250009],[-51.81914062499999,-1.117773437500006],[-51.921630859375,-1.180859375000011],[-51.934472656249994,-1.3203125],[-51.980810546875006,-1.36796875],[-52.020458984375,-1.399023437500006],[-52.229248046875,-1.3625],[-52.55341796875,-1.5140625],[-52.66416015624999,-1.5517578125],[-52.310302734375,-1.5595703125],[-52.196679687499994,-1.64013671875],[-51.94755859374999,-1.58671875],[-51.64628906249999,-1.394335937500003],[-51.53120117187498,-1.354101562500006],[-51.29736328125,-1.223535156250009],[-51.20234374999998,-1.136523437500003],[-51.028955078124994,-1.032128906250009],[-50.992041015625006,-0.986328125],[-50.894921875,-0.937597656250006],[-50.84228515625,-0.999609375],[-50.83818359374999,-1.038867187500003],[-50.917871093749994,-1.115234375],[-50.89716796874998,-1.164453125],[-50.844580078125006,-1.226269531250011],[-50.825537109375006,-1.311425781250009],[-50.81865234374999,-1.376269531250003],[-50.7861328125,-1.489941406250011],[-50.678955078125,-1.643847656250003],[-50.67529296875,-1.694726562500009],[-50.690039062500006,-1.76171875],[-50.638769531250006,-1.817089843750011],[-50.585595703124994,-1.849902343750003],[-50.403222656249994,-2.015527343750009],[-50.26044921874998,-1.922949218750006],[-50.172705078125006,-1.896191406250011],[-50.116601562499994,-1.857519531250006],[-49.99921874999998,-1.831835937500003],[-49.902978515624994,-1.87060546875],[-49.71953124999999,-1.926367187500006],[-49.585351562499994,-1.8671875],[-49.31367187499998,-1.731738281250003],[-49.39863281249998,-1.971582031250009],[-49.46015624999998,-2.191503906250006],[-49.506982421874994,-2.2802734375],[-49.553369140624994,-2.519921875],[-49.59931640624998,-2.583886718750009],[-49.63652343749999,-2.656933593750011],[-49.57587890624998,-2.631445312500006],[-49.52392578125,-2.596875],[-49.45751953125,-2.504589843750011],[-49.40766601562498,-2.344335937500006],[-49.211035156250006,-1.91650390625],[-49.15478515625,-1.878515625],[-48.991308593750006,-1.829785156250011],[-48.71000976562499,-1.487695312500009],[-48.6,-1.48876953125],[-48.52958984374999,-1.567480468750006],[-48.46293945312499,-1.613964843750011],[-48.44584960937499,-1.520410156250009],[-48.34980468749998,-1.482128906250011],[-48.45146484374999,-1.435839843750003],[-48.46806640624999,-1.393847656250003],[-48.47773437499998,-1.323828125],[-48.40859375,-1.229199218750011],[-48.449804687500006,-1.1455078125],[-48.306494140625006,-1.03984375],[-48.31757812499998,-0.960546875],[-48.266455078125006,-0.895117187500006],[-48.201757812500006,-0.827929687500003],[-48.12846679687499,-0.795214843750003],[-48.115087890625006,-0.7375],[-48.06884765625,-0.713671875],[-48.032568359375006,-0.705078125],[-47.9609375,-0.769628906250006],[-47.883398437500006,-0.693359375],[-47.80766601562499,-0.663476562500009],[-47.77373046874999,-0.6767578125],[-47.73149414062499,-0.71044921875],[-47.687109375,-0.724804687500011],[-47.65107421874998,-0.71875],[-47.55732421874998,-0.669921875],[-47.470703125,-0.74853515625],[-47.41865234374998,-0.765917968750003],[-47.43291015624999,-0.721875],[-47.460351562499994,-0.680957031250003],[-47.4390625,-0.647656250000011],[-47.398095703124994,-0.626660156250011],[-47.26860351562499,-0.645410156250009],[-47.200537109375006,-0.68046875],[-47.12690429687498,-0.745410156250003],[-47.02460937499998,-0.750195312500011],[-46.9443359375,-0.743359375000011],[-46.893652343750006,-0.779882812500006],[-46.81123046874998,-0.7796875],[-46.769921875,-0.836523437500006],[-46.644433593749994,-0.91640625],[-46.61723632812499,-0.970605468750009],[-46.51630859374998,-0.996875],[-46.421728515625006,-1.030078125],[-46.32084960937499,-1.039160156250006],[-46.219140625,-1.03125],[-46.214990234374994,-1.099804687500011],[-46.140380859375,-1.118359375000011],[-46.04462890624998,-1.10302734375],[-45.972265625,-1.187402343750009],[-45.77880859375,-1.25078125],[-45.644775390625,-1.347851562500011],[-45.55693359374999,-1.330664062500006],[-45.45859375,-1.35625],[-45.35302734375,-1.5673828125],[-45.32915039062499,-1.71728515625],[-45.282128906249994,-1.696582031250003],[-45.23857421874999,-1.629492187500006],[-45.18208007812498,-1.507031250000011],[-45.07636718749998,-1.46640625],[-45.02578125,-1.513476562500003],[-44.919775390625006,-1.5888671875],[-44.828369140625,-1.671679687500003],[-44.78984374999999,-1.724804687500011],[-44.72114257812498,-1.733496093750006],[-44.77851562499998,-1.798828125],[-44.720947265625,-1.792285156250003],[-44.651269531249994,-1.745800781250011],[-44.591650390625006,-1.841796875],[-44.546777343749994,-1.9462890625],[-44.53779296874998,-2.052734375],[-44.58002929687498,-2.113867187500006],[-44.617285156250006,-2.152148437500003],[-44.65864257812498,-2.2275390625],[-44.70751953125,-2.241113281250009],[-44.75634765625,-2.265527343750009],[-44.70063476562498,-2.320410156250006],[-44.66240234374999,-2.373242187500011],[-44.579003906249994,-2.23046875],[-44.520361328125006,-2.190332031250009],[-44.435449218749994,-2.168066406250006],[-44.39130859374998,-2.269628906250006],[-44.3818359375,-2.365527343750003],[-44.520117187500006,-2.405468750000011],[-44.520654296874994,-2.48125],[-44.56201171875,-2.52421875],[-44.589013671874994,-2.573437500000011],[-44.61079101562498,-2.676855468750006],[-44.63896484374999,-2.7625],[-44.72138671874998,-3.142285156250011],[-44.723046875,-3.204785156250011],[-44.62265625,-3.137890625000011],[-44.43754882812499,-2.944433593750006],[-44.38115234374999,-2.738378906250006],[-44.30815429687499,-2.53515625],[-44.228613281250006,-2.471289062500006],[-44.17939453124998,-2.47119140625],[-44.105566406250006,-2.493457031250003],[-44.10136718749999,-2.56005859375],[-44.112646484375006,-2.598535156250009],[-44.19160156249998,-2.699609375],[-44.225195312500006,-2.754980468750006],[-44.19267578124999,-2.8095703125],[-44.01323242187499,-2.6421875],[-43.93291015624999,-2.58349609375],[-43.86445312499998,-2.595410156250011],[-43.728613281250006,-2.518164062500006],[-43.45512695312499,-2.502050781250006],[-43.43461914062499,-2.413671875],[-43.38007812499998,-2.376074218750006],[-43.22968749999998,-2.386035156250003],[-42.93671874999998,-2.465039062500011],[-42.832275390625,-2.529589843750003],[-42.675878906250006,-2.589648437500003],[-42.59355468749999,-2.661035156250009],[-42.249609375,-2.7919921875],[-41.999853515625006,-2.806054687500009],[-41.87617187499998,-2.74658203125],[-41.72187,-2.808886718750003],[-41.64013671875,-2.878613281250011],[-41.47993164062498,-2.91650390625],[-41.318212890625006,-2.936230468750011],[-41.19453124999998,-2.886132812500009],[-40.875585937500006,-2.86962890625],[-40.47456054687498,-2.795605468750011],[-40.2353515625,-2.813183593750011],[-39.964697265625006,-2.861523437500011],[-39.771826171875006,-2.98583984375],[-39.60942382812499,-3.05625],[-39.51118164062498,-3.125585937500006],[-39.352685546874994,-3.197363281250006],[-39.01435546874998,-3.390234375],[-38.89599609375,-3.501757812500003],[-38.68623046874998,-3.653710937500009],[-38.47578124999998,-3.717480468750011],[-38.361914062500006,-3.87646484375],[-38.271875,-3.948046875],[-38.048828125,-4.21640625],[-37.795654296875,-4.404296875],[-37.626318359375006,-4.592089843750003],[-37.30146484374998,-4.713085937500011],[-37.174658203125006,-4.912402343750003],[-36.95488281249999,-4.936718750000011],[-36.86113281249999,-4.966601562500003],[-36.74736328124999,-5.050683593750009],[-36.590722656249994,-5.097558593750009],[-36.38671875,-5.084277343750003],[-36.161767578124994,-5.09375],[-35.979882812499994,-5.054394531250011],[-35.549414062500006,-5.12939453125],[-35.481689453125,-5.166015625],[-35.392578125,-5.250878906250009],[-35.235449218750006,-5.566699218750003],[-35.141748046874994,-5.917187500000011],[-35.095458984375,-6.185351562500003],[-34.988183593749994,-6.39375],[-34.929589843749994,-6.785058593750009],[-34.8798828125,-6.908203125],[-34.8759765625,-7.0029296875],[-34.833886718749994,-7.0244140625],[-34.80546874999999,-7.288378906250003],[-34.81660156249998,-7.394824218750003],[-34.857763671875006,-7.533300781250006],[-34.86083984375,-7.595019531250003],[-34.85478515624999,-7.63427734375],[-34.87299804687498,-7.692089843750011],[-34.87861328124998,-7.747460937500009],[-34.8369140625,-7.871777343750011],[-34.83466796874998,-7.971484375],[-34.890527343749994,-8.0921875],[-34.966650390625006,-8.407617187500009],[-35.15776367187499,-8.930566406250009],[-35.34086914062499,-9.230664062500011],[-35.597070312499994,-9.540625],[-35.76396484374999,-9.702539062500009],[-35.83012695312499,-9.719042968750003],[-35.89082031249998,-9.68701171875],[-35.847753906250006,-9.7724609375],[-35.88544921874998,-9.84765625],[-36.05498046874999,-10.07578125],[-36.223535156249994,-10.22509765625],[-36.398339843749994,-10.484082031250011],[-36.41162109375,-10.489941406250011],[-36.6357421875,-10.589941406250006],[-36.768310546875,-10.671679687500003],[-36.93779296874999,-10.820410156250006],[-37.093359375,-11.054785156250006],[-37.12548828125,-11.0849609375],[-37.18281249999998,-11.068457031250006],[-37.18120117187499,-11.1875],[-37.31513671874998,-11.3759765625],[-37.35600585937499,-11.40390625],[-37.354882812499994,-11.350488281250009],[-37.331640625,-11.309863281250003],[-37.32080078125,-11.2666015625],[-37.32177734375,-11.215136718750003],[-37.359228515625006,-11.252539062500006],[-37.4384765625,-11.39375],[-37.41181640624998,-11.497265625000011],[-37.469335937500006,-11.653613281250003],[-37.688720703125,-12.1],[-37.95732421874999,-12.475488281250009],[-38.01923828124998,-12.59130859375],[-38.23974609375,-12.84423828125],[-38.401757812499994,-12.966210937500009],[-38.44731445312499,-12.967089843750003],[-38.498925781249994,-12.956640625],[-38.52490234375,-12.762304687500006],[-38.65400390624998,-12.644628906250006],[-38.69096679687499,-12.623925781250009],[-38.743896484375,-12.74853515625],[-38.787988281249994,-12.78271484375],[-38.85175781249998,-12.790136718750006],[-38.78359375,-12.844433593750011],[-38.76372070312499,-12.9072265625],[-38.833154296874994,-13.032910156250011],[-38.835302734375006,-13.147167968750011],[-38.95917968749998,-13.273046875],[-39.030908203124994,-13.365136718750009],[-39.0673828125,-13.48046875],[-39.08935546875,-13.588183593750003],[-39.034912109375,-13.558789062500011],[-39.00908203124999,-13.581445312500009],[-38.988623046875006,-13.615039062500003],[-39.001220703125,-13.66455078125],[-39.041113281250006,-13.758105468750003],[-39.034912109375,-13.991015625],[-39.04814453124999,-14.0439453125],[-39.00849609374998,-14.101171875],[-38.96650390624998,-14.00341796875],[-38.94233398437498,-14.030664062500009],[-39.0595703125,-14.65478515625],[-39.01337890624998,-14.935644531250006],[-38.996191406250006,-15.253808593750009],[-38.943212890625006,-15.564355468750009],[-38.88525390625,-15.841992187500011],[-38.880615234375,-15.8642578125],[-38.960791015625006,-16.1865234375],[-39.063232421875,-16.50439453125],[-39.12504882812499,-16.76357421875001],[-39.163964843749994,-17.043554687500006],[-39.202880859375,-17.178125],[-39.215234375,-17.31582031250001],[-39.17060546874998,-17.64208984375],[-39.15400390624998,-17.70390625],[-39.27836914062499,-17.849414062500003],[-39.41259765625,-17.920019531250006],[-39.48676757812498,-17.99013671875001],[-39.65078125,-18.25234375],[-39.73979492187499,-18.63984375000001],[-39.741943359375,-18.845996093750003],[-39.699853515624994,-19.27783203125],[-39.7314453125,-19.45390625],[-39.783300781250006,-19.57177734375],[-39.8447265625,-19.64912109375001],[-40.001367187499994,-19.741992187500003],[-40.141699218750006,-19.96826171875],[-40.202734375,-20.2060546875],[-40.29887695312499,-20.29267578125001],[-40.31855468749998,-20.42578125],[-40.39594726562498,-20.569433593750006],[-40.596582031249994,-20.783789062500006],[-40.72705078125,-20.84619140625],[-40.78925781249998,-20.906054687500003],[-40.828759765624994,-21.031347656250006],[-40.95454101562498,-21.237890625],[-41.047265625,-21.505664062500003],[-41.02314453124998,-21.596875],[-41.021582031250006,-21.61083984375],[-40.98784179687499,-21.9203125],[-41.00029296874999,-21.9990234375],[-41.12250976562498,-22.084375],[-41.582910156249994,-22.24365234375],[-41.70551757812498,-22.309667968750006],[-41.98041992187498,-22.580664062500006],[-41.99755859375,-22.644628906250006],[-41.98613281249999,-22.73583984375],[-41.94091796875,-22.78828125000001],[-41.9875,-22.84511718750001],[-42.042382812499994,-22.947070312500003],[-42.122460937499994,-22.94082031250001],[-42.5810546875,-22.941015625],[-42.82929687499998,-22.97333984375001],[-42.95830078124999,-22.967089843750003],[-43.016210937500006,-22.94257812500001],[-43.081152343750006,-22.90253906250001],[-43.100683593750006,-22.85009765625],[-43.0654296875,-22.77070312500001],[-43.086279296875006,-22.72333984375001],[-43.154296875,-22.725195312500006],[-43.22900390625,-22.74765625],[-43.241943359375,-22.79511718750001],[-43.23662109374999,-22.82880859375001],[-43.208837890625006,-22.878125],[-43.193603515625,-22.938574218750006],[-43.22416992187499,-22.9912109375],[-43.369482421875006,-22.998046875],[-43.5328125,-23.04638671875],[-43.73652343749998,-23.06660156250001],[-43.898828125,-23.10146484375001],[-43.97382812499998,-23.05732421875001],[-43.898828125,-23.035253906250006],[-43.79140625,-23.045996093750006],[-43.67597656249998,-23.00947265625001],[-43.70292968749999,-22.96630859375],[-43.86616210937498,-22.910546875],[-44.047460937500006,-22.94472656250001],[-44.14799804687499,-23.011035156250003],[-44.367919921875,-23.004980468750006],[-44.63725585937499,-23.05546875],[-44.68115234375,-23.10693359375],[-44.673828125,-23.206640625],[-44.62109375,-23.228515625],[-44.569677734375006,-23.274023437500006],[-44.61909179687498,-23.31640625],[-44.66718749999998,-23.33515625000001],[-44.95166015625,-23.381445312500006],[-45.215429687500006,-23.57558593750001],[-45.32539062499998,-23.599707031250006],[-45.42329101562498,-23.685351562500003],[-45.43339843749999,-23.75849609375001],[-45.46430664062498,-23.802539062500003],[-45.527099609375,-23.804785156250006],[-45.664648437500006,-23.76484375000001],[-45.843164062499994,-23.763671875],[-45.972070312499994,-23.795507812500006],[-46.630761718749994,-24.1103515625],[-46.867285156250006,-24.236328125],[-47.13720703125,-24.4931640625],[-47.5921875,-24.781054687500003],[-47.831152343750006,-24.952929687500003],[-47.8765625,-24.99746093750001],[-47.914306640625,-24.99990234375001],[-47.989160156249994,-25.035742187500006],[-47.959375,-25.0654296875],[-47.908349609374994,-25.068164062500003],[-47.92939453124998,-25.168261718750003],[-48.02436523437498,-25.23671875],[-48.202734375,-25.41650390625],[-48.242431640625,-25.4033203125],[-48.1859375,-25.309863281250003],[-48.27348632812499,-25.30634765625001],[-48.402490234374994,-25.272070312500006],[-48.45849609375,-25.31074218750001],[-48.427636718749994,-25.4033203125],[-48.47612304687499,-25.44296875],[-48.56416015624998,-25.44746093750001],[-48.64399414062498,-25.4365234375],[-48.73173828124999,-25.36875],[-48.69218749999999,-25.491503906250003],[-48.50703124999998,-25.521289062500003],[-48.42988281249998,-25.55019531250001],[-48.40117187499999,-25.59736328125001],[-48.545166015625,-25.81591796875],[-48.665771484375,-25.844335937500006],[-48.67900390624999,-25.87519531250001],[-48.61284179687499,-25.875],[-48.576318359374994,-25.93544921875001],[-48.61943359374999,-26.17939453125001],[-48.67900390624999,-26.22578125000001],[-48.713769531249994,-26.226953125],[-48.748291015625,-26.268652343750006],[-48.70068359375,-26.34833984375001],[-48.651611328125,-26.40644531250001],[-48.65815429687498,-26.519140625],[-48.676513671875,-26.612402343750006],[-48.677734375,-26.702929687500003],[-48.61567382812498,-26.878125],[-48.593408203124994,-27.05800781250001],[-48.568359375,-27.1234375],[-48.55415039062498,-27.19599609375001],[-48.59550781249999,-27.26386718750001],[-48.57197265624998,-27.37275390625001],[-48.642578125,-27.557910156250003],[-48.60566406249998,-27.8251953125],[-48.62080078124998,-28.07558593750001],[-48.6484375,-28.20722656250001],[-48.693212890625006,-28.31015625],[-48.797265625,-28.442675781250003],[-48.799658203125006,-28.575292968750006],[-49.023583984374994,-28.69863281250001],[-49.27128906249999,-28.871191406250006],[-49.499902343749994,-29.07539062500001],[-49.745996093749994,-29.36318359375001],[-50.033349609374994,-29.80097656250001],[-50.29951171874998,-30.42578125],[-50.619970703125006,-30.89765625000001],[-50.748144531250006,-31.06806640625001],[-50.92138671875,-31.258398437500006],[-51.151757812499994,-31.48037109375001],[-51.46040039062498,-31.702441406250003],[-51.79814453124999,-31.90029296875001],[-51.92021484374999,-31.989550781250003],[-52.039208984374994,-32.11484375],[-52.06894531249999,-32.063085937500006],[-52.0431640625,-31.9775390625],[-52.0595703125,-31.91347656250001],[-52.063232421875,-31.830371093750003],[-51.9951171875,-31.815039062500006],[-51.893164062500006,-31.867773437500006],[-51.841210937499994,-31.83203125],[-51.80341796874998,-31.796679687500003],[-51.6806640625,-31.77460937500001],[-51.446191406249994,-31.55732421875001],[-51.27216796874998,-31.476953125],[-51.17431640625,-31.33974609375001],[-51.15751953124999,-31.26679687500001],[-51.16142578124999,-31.11884765625001],[-51.10595703125,-31.081347656250003],[-50.980078125,-31.09423828125],[-50.95439453124999,-31.05214843750001],[-50.96533203125,-31.00546875],[-50.940820312499994,-30.90371093750001],[-50.770166015624994,-30.81337890625001],[-50.689306640625006,-30.704199218750006],[-50.71630859375,-30.42597656250001],[-50.68505859375,-30.41347656250001],[-50.61484375,-30.456835937500003],[-50.581933593749994,-30.43886718750001],[-50.546533203124994,-30.31689453125],[-50.56352539062499,-30.25361328125001],[-50.64619140624998,-30.23681640625],[-50.931884765625,-30.374316406250003],[-51.02495117187499,-30.36865234375],[-51.040380859375006,-30.26064453125001],[-51.179296875,-30.211035156250006],[-51.23359374999998,-30.121386718750003],[-51.249853515625006,-30.05996093750001],[-51.29804687499998,-30.03486328125001],[-51.295019531250006,-30.141015625],[-51.28178710937499,-30.244140625],[-51.15727539062499,-30.3642578125],[-51.18754882812499,-30.411914062500003],[-51.24658203125,-30.467578125],[-51.287695312500006,-30.59121093750001],[-51.283056640625006,-30.7515625],[-51.31640625,-30.702734375],[-51.35908203124998,-30.67451171875001],[-51.37646484375,-30.846875],[-51.459130859374994,-30.91279296875001],[-51.485253906249994,-30.9775390625],[-51.46367187499999,-31.05263671875001],[-51.50629882812498,-31.1044921875],[-51.716894531250006,-31.24375],[-51.92680664062499,-31.3388671875],[-51.97246093749999,-31.3837890625],[-51.994873046875,-31.48994140625001],[-52.026953125,-31.59902343750001],[-52.11982421875,-31.694921875],[-52.1935546875,-31.885546875],[-52.191552734374994,-31.967578125],[-52.16708984374999,-32.088476562500006],[-52.127392578125,-32.1677734375],[-52.190185546875,-32.220800781250006],[-52.274609375,-32.32373046875],[-52.34165039062499,-32.43974609375],[-52.50849609375,-32.87529296875],[-52.652246093749994,-33.137792968750006],[-52.762890625,-33.26640625],[-52.920849609375,-33.401953125],[-53.37060546875,-33.7421875],[-53.419580078124994,-33.77919921875001],[-53.47246093749999,-33.84931640625001],[-53.53452148437499,-34.01748046875001],[-53.742919921875,-34.24951171875],[-53.785302734374994,-34.38037109375],[-54.01025390625,-34.51699218750001],[-54.16855468749999,-34.670703125],[-54.272119140624994,-34.66689453125001],[-54.36533203124999,-34.73271484375],[-54.902294921875,-34.93281250000001],[-55.095117187499994,-34.895117187500006],[-55.237890625,-34.89580078125],[-55.37060546875,-34.8076171875],[-55.67314453124999,-34.77568359375],[-55.862939453124994,-34.8109375],[-56.117919921875,-34.90791015625001],[-56.19462890624999,-34.90644531250001],[-56.249951171875,-34.90126953125001],[-56.387841796874994,-34.86103515625001],[-56.4630859375,-34.775390625],[-56.85517578125,-34.67666015625001],[-57.17070312499999,-34.45234375000001],[-57.54345703125,-34.448046875],[-57.8291015625,-34.47734375],[-57.8732421875,-34.44765625],[-57.90214843749999,-34.39013671875],[-57.96123046874999,-34.30693359375],[-58.20703125,-34.10908203125001],[-58.40019531249999,-33.91240234375],[-58.438134765624994,-33.719140625],[-58.411328125,-33.508886718750006],[-58.35336914062499,-33.26005859375],[-58.363525390625,-33.18232421875001],[-58.2921875,-33.13798828125],[-58.221582031249994,-33.12910156250001],[-58.153564453125,-33.06464843750001],[-58.092675781249994,-32.967382812500006],[-58.08232421874999,-32.893652343750006],[-58.12958984375,-32.75722656250001],[-58.16220703124999,-32.566503906250006],[-58.201171875,-32.4716796875],[-58.219970703125,-32.56396484375],[-58.17099609374999,-32.95927734375],[-58.20078125,-33.0146484375],[-58.250390625,-33.07832031250001],[-58.30888671874999,-33.08291015625001],[-58.3759765625,-33.071875],[-58.424462890624994,-33.11152343750001],[-58.454833984375,-33.2859375],[-58.54721679687499,-33.66347656250001],[-58.53056640624999,-33.753027343750006],[-58.45659179687499,-33.89833984375001],[-58.42949218749999,-33.99091796875001],[-58.40903320312499,-34.06074218750001],[-58.392480468749994,-34.19296875],[-58.435498046875,-34.252539062500006],[-58.475244140624994,-34.26298828125],[-58.52548828124999,-34.29619140625],[-58.466210937499994,-34.457421875],[-58.4189453125,-34.531640625],[-58.283349609374994,-34.68349609375001],[-57.763574218749994,-34.89453125],[-57.5478515625,-35.01894531250001],[-57.303662109375,-35.1884765625],[-57.170654296875,-35.3625],[-57.15888671875,-35.505957031250006],[-57.35390625,-35.7203125],[-57.37548828125,-35.90029296875001],[-57.33544921875,-36.02675781250001],[-57.26499023437499,-36.144140625],[-57.076171875,-36.29677734375001],[-56.937158203124994,-36.3525390625],[-56.749462890625,-36.346484375],[-56.71738281249999,-36.3890625],[-56.69809570312499,-36.42646484375001],[-56.66826171874999,-36.73525390625001],[-56.672021484374994,-36.85126953125001],[-56.72714843749999,-36.95771484375001],[-57.08769531249999,-37.446386718750006],[-57.395751953125,-37.74462890625],[-57.507275390625,-37.909277343750006],[-57.54697265624999,-38.08564453125001],[-57.64560546874999,-38.16962890625001],[-58.17919921875,-38.43583984375002],[-59.007226562499994,-38.67333984375],[-59.67626953125,-38.79667968750002],[-59.8283203125,-38.83818359375002],[-60.903955078124994,-38.97392578125002],[-61.112207031249994,-38.99296875000002],[-61.38286132812499,-38.980859375],[-61.6025390625,-38.99882812500002],[-61.847900390625,-38.961816406249994],[-62.06689453125,-38.91914062500001],[-62.18925781249999,-38.81328125000002],[-62.33476562499999,-38.80009765625002],[-62.374462890625,-38.852929687499994],[-62.303613281249994,-38.98808593750002],[-62.3380859375,-39.15058593750001],[-62.295068359374994,-39.243261718750006],[-62.20908203124999,-39.261816406250006],[-62.12646484375,-39.30976562500001],[-62.053662109375,-39.37382812500002],[-62.179345703124994,-39.38046875],[-62.13056640625,-39.431542968749994],[-62.076806640624994,-39.461523437500006],[-62.082763671875,-39.568359375],[-62.13154296875,-39.82539062500001],[-62.25395507812499,-39.88046875],[-62.28691406249999,-39.89531250000002],[-62.323974609375,-39.95068359375],[-62.40185546875,-40.19658203125002],[-62.427001953125,-40.35595703125],[-62.39360351562499,-40.45878906250002],[-62.246337890625,-40.67460937500002],[-62.30185546874999,-40.81464843750001],[-62.39501953125,-40.89082031250001],[-62.797998046874994,-41.04716796875002],[-62.95903320312499,-41.10966796875002],[-63.212841796875,-41.152441406250006],[-63.62177734375,-41.159765625],[-63.77299804687499,-41.15],[-64.123193359375,-41.0078125],[-64.383447265625,-40.922460937500006],[-64.621484375,-40.8544921875],[-64.852978515625,-40.81376953125002],[-64.81987304687499,-40.79326171875002],[-64.80439453125,-40.75654296875001],[-64.86948242187499,-40.73583984375],[-64.91689453125,-40.731347656249994],[-65.06943359374999,-40.805273437500006],[-65.13339843749999,-40.88066406250002],[-65.15185546875,-40.94697265625001],[-65.15498046875,-41.10566406250001],[-65.127880859375,-41.23876953125],[-65.01826171875,-41.56689453125],[-65.00703125,-41.7451171875],[-65.05908203125,-41.96992187500001],[-64.98637695312499,-42.10205078125],[-64.898046875,-42.16181640625001],[-64.69951171874999,-42.220800781250006],[-64.6224609375,-42.26103515625002],[-64.537744140625,-42.25458984375001],[-64.51171875,-42.27021484375001],[-64.52421874999999,-42.29921875],[-64.57412109375,-42.35595703125],[-64.57099609375,-42.416015625],[-64.42041015625,-42.43378906250001],[-64.264599609375,-42.42167968750002],[-64.10087890624999,-42.395117187500006],[-64.06220703125,-42.353417968749994],[-64.061181640625,-42.26611328125],[-64.2529296875,-42.25078125000002],[-64.228515625,-42.21826171875],[-64.083251953125,-42.18281250000001],[-63.89287109374999,-42.124609375],[-63.795556640624994,-42.113867187500006],[-63.7294921875,-42.152929687500006],[-63.684765625,-42.18867187500001],[-63.6298828125,-42.28271484375],[-63.5958984375,-42.40654296875002],[-63.59443359375,-42.555566406249994],[-63.617333984374994,-42.69580078125],[-63.644482421875,-42.745703125],[-63.69248046874999,-42.805273437500006],[-64.034765625,-42.88125],[-64.13066406249999,-42.861425781250006],[-64.219921875,-42.75556640625001],[-64.24794921875,-42.64609375],[-64.32426757812499,-42.572265625],[-64.48784179687499,-42.51347656250002],[-64.65048828124999,-42.53144531250001],[-64.811962890625,-42.633203125],[-64.970703125,-42.66630859375002],[-65.02690429687499,-42.758886718750006],[-64.62919921874999,-42.90898437500002],[-64.441552734375,-42.95068359375],[-64.38037109375,-42.94921875],[-64.31914062499999,-42.96894531250001],[-64.37568359375,-43.02460937500001],[-64.43222656249999,-43.059179687500006],[-64.715234375,-43.13554687500002],[-64.83994140624999,-43.188867187499994],[-64.985546875,-43.293554687500006],[-65.18974609374999,-43.522070312500006],[-65.25234375,-43.571875],[-65.28359375,-43.629980468750006],[-65.3046875,-43.7875],[-65.23857421874999,-44.048730468749994],[-65.30839843749999,-44.158203125],[-65.26552734375,-44.2796875],[-65.28984374999999,-44.360742187499994],[-65.361279296875,-44.47734375000002],[-65.647607421875,-44.66142578125002],[-65.69833984374999,-44.79619140625002],[-65.59912109375,-44.875585937500006],[-65.605712890625,-44.94501953125001],[-65.63876953124999,-45.0078125],[-65.75771484375,-45.00712890625002],[-66.19013671875,-44.964746093749994],[-66.34775390624999,-45.03359375],[-66.493603515625,-45.117578125],[-66.533447265625,-45.1578125],[-66.58505859374999,-45.18291015625002],[-66.882470703125,-45.227636718750006],[-66.94140625,-45.25732421875],[-67.25761718749999,-45.577246093750006],[-67.393017578125,-45.77558593750001],[-67.556640625,-45.970117187499994],[-67.599560546875,-46.05253906250002],[-67.60888671875,-46.16679687500002],[-67.586083984375,-46.26953125],[-67.56337890625,-46.34541015625001],[-67.50644531249999,-46.442773437499994],[-67.38662109375,-46.553808593750006],[-66.77685546875,-47.005859375],[-66.650390625,-47.0453125],[-65.99853515625,-47.09375],[-65.853662109375,-47.15673828125],[-65.76909179687499,-47.256738281249994],[-65.73808593749999,-47.34492187500001],[-65.775390625,-47.568359375],[-65.81430664062499,-47.63818359375],[-65.886328125,-47.7015625],[-66.040625,-47.783300781250006],[-66.225244140625,-47.826757812500006],[-66.17236328125,-47.85761718750001],[-66.09736328125,-47.85322265625001],[-65.934228515625,-47.826757812500006],[-65.863671875,-47.85322265625001],[-65.81005859375,-47.94111328125001],[-65.91215820312499,-47.97675781250001],[-65.94340820312499,-48.01933593750002],[-66.0171875,-48.08427734375002],[-66.39335937499999,-48.342382812500006],[-66.59628906249999,-48.41953125],[-66.7828125,-48.52294921875],[-67.03310546875,-48.62773437500002],[-67.13095703124999,-48.687890625],[-67.263330078125,-48.81425781250002],[-67.46630859375,-48.951757812500006],[-67.68486328124999,-49.246679687500006],[-67.69370117187499,-49.30400390625002],[-67.66196289062499,-49.3421875],[-67.78349609374999,-49.85888671875],[-67.82597656249999,-49.91962890625001],[-67.91396484375,-49.984472656250006],[-68.145654296875,-50.09140625],[-68.2572265625,-50.104589843750006],[-68.40463867187499,-50.04267578125001],[-68.487890625,-49.977929687499994],[-68.569287109375,-49.86699218750002],[-68.667578125,-49.752539062500006],[-68.67265624999999,-49.79345703125],[-68.63847656249999,-49.86298828125001],[-68.66162109375,-49.93574218750001],[-68.91298828125,-49.96875],[-68.97958984374999,-50.003027343750006],[-68.752685546875,-49.987695312499994],[-68.59794921874999,-50.00947265625001],[-68.53256835937499,-50.0361328125],[-68.47373046874999,-50.09140625],[-68.421875,-50.15791015625001],[-68.46542968749999,-50.194726562499994],[-68.58935546875,-50.225195312500006],[-68.74985351562499,-50.281152343749994],[-68.939453125,-50.38232421875],[-69.04477539062499,-50.499121093750006],[-69.09018554687499,-50.583105468750006],[-69.14140624999999,-50.752539062500006],[-69.15498046875,-50.86445312500001],[-69.23515624999999,-50.950585937499994],[-69.35859375,-51.028125],[-69.3517578125,-51.045800781249994],[-69.26796875,-51.00615234375002],[-69.20102539062499,-50.99365234375],[-69.143505859375,-51.09697265625002],[-69.06572265624999,-51.30351562500002],[-69.02958984374999,-51.44648437500001],[-69.035302734375,-51.48896484375001],[-69.05830078125,-51.54716796875002],[-69.21806640624999,-51.56123046875001],[-69.360546875,-51.559472656249994],[-69.46542968749999,-51.58447265625],[-69.40908203125,-51.610253906249994],[-69.31303710937499,-51.60107421875],[-69.180126953125,-51.66230468750001],[-69.03251953124999,-51.63623046875],[-68.96533203125,-51.677148437499994],[-68.91679687499999,-51.71464843750002],[-68.6908203125,-52.013085937499994],[-68.49350585937499,-52.19755859375002],[-68.39375,-52.30703125],[-68.443359375,-52.35664062500001],[-69.0072265625,-52.2626953125],[-69.1337890625,-52.21142578125],[-69.24101562499999,-52.20546875],[-69.446875,-52.269433593749994],[-69.56059570312499,-52.42158203125001],[-69.6203125,-52.464746093749994],[-69.763330078125,-52.50556640625001],[-69.9072265625,-52.513574218749994],[-70.39096679687499,-52.66083984375001],[-70.562939453125,-52.6734375],[-70.680322265625,-52.7125],[-70.7951171875,-52.76875],[-70.8390625,-52.889550781249994],[-70.82119140625,-52.96308593750001],[-70.95205078125,-53.226953125],[-70.984326171875,-53.373632812500006],[-70.985107421875,-53.448339843750006],[-70.94780273437499,-53.570410156250006],[-70.995849609375,-53.779296875],[-71.08281249999999,-53.825],[-71.29775390625,-53.883398437500006],[-71.44389648437499,-53.840917968750006],[-71.693798828125,-53.803125],[-71.87187,-53.72265625],[-72.10092773437499,-53.66582031250002],[-72.17441406249999,-53.63232421875],[-72.37680664062499,-53.47119140625],[-72.39824218749999,-53.41777343750002],[-72.41289062499999,-53.350195312500006],[-72.3060546875,-53.25371093750002],[-72.24863281249999,-53.246679687500006],[-72.08115234374999,-53.249609375],[-71.94169921874999,-53.23408203125001],[-71.852734375,-53.285742187500006],[-71.82822265624999,-53.398339843749994],[-71.867333984375,-53.458398437499994],[-71.902783203125,-53.495507812499994],[-71.89169921874999,-53.523535156250006],[-71.791455078125,-53.48457031250001],[-71.74052734374999,-53.23261718750001],[-71.400341796875,-53.10703125],[-71.28896484375,-53.03369140625],[-71.18022460937499,-52.920507812500006],[-71.16328125,-52.888085937499994],[-71.15507812499999,-52.845605468749994],[-71.22714843749999,-52.810644531250006],[-71.38774414062499,-52.764257812500006],[-71.89799804687499,-53.00175781250002],[-72.1291015625,-53.064355468749994],[-72.27802734375,-53.13232421875],[-72.45830078124999,-53.254492187500006],[-72.492578125,-53.290625],[-72.53081054687499,-53.371679687500006],[-72.54892578124999,-53.46074218750002],[-72.726806640625,-53.420019531250006],[-72.99838867187499,-53.29072265625001],[-73.052734375,-53.24345703125002],[-72.9982421875,-53.17724609375],[-72.91552734375,-53.121972656249994],[-72.909912109375,-52.9365234375],[-72.88916015625,-52.87158203125],[-72.83188476562499,-52.81953125000001],[-72.727685546875,-52.762304687500006],[-72.6759765625,-52.7490234375],[-72.632080078125,-52.773828125],[-72.626611328125,-52.81757812500001],[-72.45346679687499,-52.814453125],[-72.117578125,-52.65],[-71.97929687499999,-52.64609375],[-71.7970703125,-52.68281250000001],[-71.5912109375,-52.660742187500006],[-71.554150390625,-52.643945312499994],[-71.51127929687499,-52.605371093749994],[-71.66474609375,-52.56005859375],[-71.8119140625,-52.537011718749994],[-72.22568359374999,-52.52099609375],[-72.315380859375,-52.53857421875],[-72.4376953125,-52.62578125000002],[-72.478271484375,-52.60400390625],[-72.50439453125,-52.56005859375],[-72.64482421874999,-52.52910156250002],[-72.712109375,-52.535546875],[-72.7765625,-52.57744140625002],[-72.766015625,-52.642578125],[-72.801904296875,-52.71240234375],[-72.931884765625,-52.781640625],[-73.020263671875,-52.89179687500001],[-73.01611328125,-52.977441406249994],[-73.02299804687499,-53.022070312500006],[-73.05546874999999,-53.04560546875001],[-73.1224609375,-53.07392578125001],[-73.33818359374999,-53.0546875],[-73.45986328125,-52.96484375],[-73.50751953125,-52.90351562500001],[-73.64521484375,-52.837011718750006],[-73.345947265625,-52.754296875],[-73.24082031249999,-52.707128906250006],[-73.14482421874999,-52.601953125],[-73.073193359375,-52.535058593749994],[-73.12392578125,-52.48798828125001],[-73.1837890625,-52.487890625],[-73.178173828125,-52.56269531250001],[-73.244140625,-52.6240234375],[-73.38212890624999,-52.595117187499994],[-73.585693359375,-52.68574218750001],[-73.71083984375,-52.661523437499994],[-73.914697265625,-52.68818359375001],[-74.01445312499999,-52.63935546875001],[-74.03583984375,-52.577246093750006],[-73.99990234375,-52.512597656249994],[-74.037353515625,-52.402929687500006],[-74.093505859375,-52.37626953125002],[-74.150830078125,-52.38251953125001],[-74.17656249999999,-52.31718750000002],[-74.2384765625,-52.20234375000001],[-74.26596679687499,-52.171289062499994],[-74.295654296875,-52.11787109375001],[-74.26494140624999,-52.104882812499994],[-74.194921875,-52.120214843750006],[-74.133544921875,-52.15478515625],[-74.040234375,-52.1591796875],[-73.83447265625,-52.233984375],[-73.74912109374999,-52.21601562500001],[-73.702783203125,-52.198828125],[-73.68540039062499,-52.13671875],[-73.684326171875,-52.077734375],[-73.64902343749999,-52.077734375],[-73.5322265625,-52.153125],[-73.457958984375,-52.14599609375],[-73.32675781249999,-52.165917968749994],[-73.26044921875,-52.1578125],[-73.137353515625,-52.12968750000002],[-72.94370117187499,-52.046875],[-72.843212890625,-51.96113281250001],[-72.79501953124999,-51.94951171875002],[-72.73540039062499,-51.960546875],[-72.695458984375,-51.98515625000002],[-72.69482421875,-52.04472656250002],[-72.649560546875,-52.09990234375002],[-72.58798828124999,-52.145117187500006],[-72.57084960937499,-52.200097656249994],[-72.583447265625,-52.25419921875002],[-72.693603515625,-52.33027343750001],[-72.714013671875,-52.35673828125002],[-72.67705078124999,-52.384667968749994],[-72.631494140625,-52.37158203125],[-72.56870117187499,-52.333984375],[-72.53291015625,-52.282324218750006],[-72.52333984375,-52.25546875],[-72.51933593749999,-52.21708984375002],[-72.52412109375,-52.1703125],[-72.61357421874999,-52.037011718749994],[-72.624755859375,-52.006933593750006],[-72.624609375,-51.94648437500001],[-72.5228515625,-51.89091796875002],[-72.494140625,-51.847558593749994],[-72.4896484375,-51.763671875],[-72.54252929687499,-51.706152343750006],[-72.76123046875,-51.5732421875],[-73.12675781249999,-51.43994140625],[-73.16875,-51.45390625000002],[-73.197021484375,-51.47802734375],[-73.16337890624999,-51.49560546875],[-73.114990234375,-51.504492187500006],[-72.78935546874999,-51.6142578125],[-72.70458984375,-51.67792968750001],[-72.649072265625,-51.69501953125001],[-72.58330078124999,-51.7373046875],[-72.600048828125,-51.79912109375002],[-72.928369140625,-51.85986328125],[-73.188671875,-51.990625],[-73.383251953125,-52.07001953125001],[-73.51816406249999,-52.041015625],[-73.58232421874999,-51.960351562499994],[-73.65029296875,-51.85625],[-73.75263671875,-51.795507812500006],[-73.81064453124999,-51.801171875],[-73.857568359375,-51.789941406249994],[-73.89443359375,-51.7578125],[-73.97324218749999,-51.78447265625002],[-74.146435546875,-51.71210937500001],[-74.1966796875,-51.680566406249994],[-74.069580078125,-51.578710937500006],[-73.92978515624999,-51.61787109375001],[-73.8958984375,-51.331445312499994],[-73.93950195312499,-51.26630859375001],[-74.121240234375,-51.195410156250006],[-74.21049804687499,-51.20458984375],[-74.33232421874999,-51.19501953125001],[-74.41435546874999,-51.1625],[-74.50786132812499,-51.14960937500001],[-74.586865234375,-51.13066406250002],[-74.690087890625,-51.086523437500006],[-74.81474609374999,-51.062890625],[-74.98310546875,-50.88105468750001],[-75.055322265625,-50.785546875],[-75.094677734375,-50.68125],[-74.83662109375,-50.67890625000001],[-74.6857421875,-50.662011718749994],[-74.64892578125,-50.61845703125002],[-74.70205078125,-50.53535156250001],[-74.77587890625,-50.46992187500001],[-74.7216796875,-50.40849609375002],[-74.644482421875,-50.3609375],[-74.564111328125,-50.38203125000001],[-74.36557617187499,-50.487890625],[-74.3314453125,-50.5595703125],[-74.190185546875,-50.77802734375001],[-74.15610351562499,-50.797460937500006],[-74.139404296875,-50.817773437499994],[-73.84746093749999,-50.940039062500006],[-73.80654296875,-50.938378906249994],[-73.824609375,-50.835839843749994],[-73.74057617187499,-50.696679687499994],[-73.65903320312499,-50.65068359375002],[-73.6181640625,-50.65117187500002],[-73.61396484375,-50.6279296875],[-73.69326171875,-50.57001953125001],[-73.654443359375,-50.49267578125],[-73.679931640625,-50.490234375],[-73.7501953125,-50.53984375000002],[-73.89150390625,-50.78271484375],[-73.97802734375,-50.827050781249994],[-74.09672851562499,-50.71708984375002],[-74.16411132812499,-50.63789062500001],[-74.197216796875,-50.609765625],[-74.18559570312499,-50.4853515625],[-73.950341796875,-50.51054687500002],[-74.03105468749999,-50.469824218750006],[-74.30556640625,-50.398046875],[-74.37412109374999,-50.36298828125001],[-74.42509765624999,-50.350195312500006],[-74.51640624999999,-50.265625],[-74.62958984375,-50.19404296875001],[-74.434326171875,-50.06523437500002],[-74.333740234375,-49.974609375],[-74.01943359375,-50.02275390625002],[-73.95859375,-49.994726562500006],[-74.01123046875,-49.92851562500002],[-74.07329101562499,-49.94853515625002],[-74.171337890625,-49.907324218750006],[-74.32392578125,-49.78339843750001],[-74.31875,-49.720117187499994],[-74.29082031249999,-49.604101562500006],[-74.23037109375,-49.57929687500001],[-74.102001953125,-49.55537109375001],[-73.955517578125,-49.59306640625002],[-73.891552734375,-49.62373046875001],[-73.836376953125,-49.609375],[-73.89248046875,-49.5234375],[-73.988037109375,-49.49091796875001],[-74.09443359375,-49.4296875],[-74.08349609375,-49.36181640625],[-74.04921875,-49.3056640625],[-74.0234375,-49.244140625],[-74.005615234375,-49.15800781250002],[-74.015380859375,-49.090917968750006],[-73.984765625,-49.059960937499994],[-73.937890625,-49.04609375000001],[-73.9349609375,-49.020898437499994],[-74.027734375,-49.02617187500002],[-74.06132812499999,-49.11103515625001],[-74.073876953125,-49.188378906249994],[-74.139794921875,-49.25048828125],[-74.16787109375,-49.32050781250001],[-74.1845703125,-49.404394531250006],[-74.22128906249999,-49.500585937500006],[-74.301513671875,-49.463964843750006],[-74.34853515625,-49.42626953125],[-74.36655273437499,-49.400488281250006],[-74.358154296875,-49.35136718750002],[-74.37998046874999,-49.0478515625],[-74.38212890624999,-48.79365234375001],[-74.341015625,-48.595703125],[-74.227685546875,-48.516992187499994],[-74.176220703125,-48.494140625],[-74.129296875,-48.50419921875002],[-74.05693359374999,-48.50361328125001],[-74.00908203124999,-48.475],[-74.171533203125,-48.42744140625001],[-74.27006835937499,-48.45458984375],[-74.34296875,-48.492578125],[-74.47441406249999,-48.463964843750006],[-74.4994140625,-48.3623046875],[-74.57719726562499,-48.2744140625],[-74.59072265625,-48.16191406250002],[-74.58466796875,-47.9990234375],[-74.40048828124999,-48.013085937499994],[-74.250439453125,-48.044921875],[-73.85380859374999,-48.04218750000001],[-73.52817382812499,-48.1982421875],[-73.38447265625,-48.17734375],[-73.391064453125,-48.145898437499994],[-73.5009765625,-48.10664062500001],[-73.569580078125,-48.01933593750002],[-73.60991210937499,-47.99394531250002],[-73.62890625,-47.941503906250006],[-73.63510742187499,-47.88037109375],[-73.71586914062499,-47.65546875000001],[-73.7482421875,-47.66132812500001],[-73.779248046875,-47.73847656250001],[-73.8466796875,-47.86699218750002],[-73.940869140625,-47.92939453125001],[-74.08476562499999,-47.9546875],[-74.22705078125,-47.96894531250001],[-74.3505859375,-47.9443359375],[-74.379345703125,-47.891210937500006],[-74.376220703125,-47.8296875],[-74.4296875,-47.79960937500002],[-74.56923828125,-47.77294921875],[-74.60888671875,-47.75800781250001],[-74.654931640625,-47.702246093750006],[-74.58842773437499,-47.61796875000002],[-74.53378906249999,-47.56767578125002],[-74.46689453124999,-47.57763671875],[-74.403564453125,-47.60039062500002],[-74.32255859374999,-47.66669921875001],[-74.24296874999999,-47.679296875],[-74.151953125,-47.62666015625001],[-74.13408203124999,-47.5908203125],[-74.191015625,-47.568359375],[-74.242919921875,-47.559667968750006],[-74.323681640625,-47.53144531250001],[-74.482666015625,-47.43046875000002],[-74.403271484375,-47.327539062499994],[-74.21567382812499,-47.209570312500006],[-74.1583984375,-47.182519531249994],[-74.20805664062499,-47.083105468750006],[-74.15190429687499,-46.97441406250002],[-74.20947265625,-46.884765625],[-74.31357421874999,-46.788183593750006],[-74.45419921874999,-46.76679687500001],[-74.48442382812499,-46.795019531250006],[-74.48935546874999,-46.834570312500006],[-74.4669921875,-46.864355468750006],[-74.48017578125,-46.885839843750006],[-74.51225585937499,-46.88515625],[-74.6908203125,-46.86396484375001],[-74.81064453124999,-46.799707031249994],[-75.00595703124999,-46.741113281249994],[-75.0314453125,-46.6953125],[-75.05253906249999,-46.628027343750006],[-74.98417968749999,-46.512109375],[-75.01875,-46.51054687500002],[-75.145751953125,-46.60009765625],[-75.33740234375,-46.647070312500006],[-75.47841796875,-46.66240234375002],[-75.54033203124999,-46.69873046875],[-75.565087890625,-46.72871093750001],[-75.527587890625,-46.74638671875002],[-75.44599609375,-46.75078125000002],[-75.38642578125,-46.862695312499994],[-75.40122070312499,-46.905664062499994],[-75.43037109375,-46.9345703125],[-75.49663085937499,-46.94013671875001],[-75.63525390625,-46.86279296875],[-75.70810546874999,-46.775],[-75.70639648437499,-46.70527343750001],[-75.65678710937499,-46.6103515625],[-75.4369140625,-46.483007812500006],[-75.37602539062499,-46.429101562499994],[-75.247021484375,-46.36933593750001],[-75.074853515625,-46.23457031250001],[-74.924462890625,-46.15966796875],[-74.99765625,-46.09765625],[-75.07451171874999,-46.004492187500006],[-75.06669921874999,-45.874902343749994],[-74.763134765625,-45.823632812499994],[-74.63066406249999,-45.8447265625],[-74.46279296875,-45.840722656249994],[-74.369140625,-45.809667968750006],[-74.301171875,-45.80302734375002],[-74.157861328125,-45.7671875],[-74.09619140625,-45.716796875],[-74.08183593749999,-45.678320312500006],[-74.08251953125,-45.64472656250001],[-74.099267578125,-45.603417968749994],[-74.122705078125,-45.496191406250006],[-74.09892578124999,-45.460351562499994],[-74.037548828125,-45.41767578125001],[-73.957177734375,-45.404394531250006],[-73.9203125,-45.40771484375],[-73.825,-45.446875],[-73.844140625,-45.50244140625],[-73.88232421875,-45.5693359375],[-73.96025390624999,-45.83525390625002],[-73.99951171875,-45.89531250000002],[-74.06103515625,-45.947363281250006],[-74.019921875,-46.05585937500001],[-74.08154296875,-46.1318359375],[-74.35678710937499,-46.21269531250002],[-74.39296875,-46.217382812500006],[-74.3724609375,-46.24628906250001],[-74.213134765625,-46.23945312500001],[-74.08974609375,-46.22236328125001],[-73.96757812499999,-46.15410156250002],[-73.92919921875,-46.049902343750006],[-73.87871093749999,-45.846875],[-73.81254882812499,-45.81816406250002],[-73.73525390625,-45.81171875000001],[-73.69487304687499,-45.85957031250001],[-73.70791015625,-45.966699218749994],[-73.708154296875,-46.0703125],[-73.81064453124999,-46.37734375],[-73.934814453125,-46.50068359375001],[-73.9486328125,-46.533105468749994],[-73.94375,-46.57158203125002],[-73.845361328125,-46.566015625],[-73.770263671875,-46.49980468750002],[-73.7162109375,-46.41523437500001],[-73.662060546875,-46.297460937500006],[-73.668212890625,-46.21210937500001],[-73.65166015624999,-46.159277343750006],[-73.62944335937499,-45.98652343750001],[-73.59184570312499,-45.89912109375001],[-73.59433593749999,-45.77685546875],[-73.66196289062499,-45.73076171875002],[-73.756591796875,-45.70283203125001],[-73.78037109374999,-45.6279296875],[-73.73076171874999,-45.47998046875],[-73.54990234374999,-45.483789062499994],[-73.378564453125,-45.3828125],[-73.26621093749999,-45.34619140625],[-73.20234375,-45.35380859375002],[-72.978173828125,-45.451171875],[-72.933837890625,-45.45234375000001],[-72.9408203125,-45.41728515625002],[-72.975537109375,-45.392578125],[-73.0638671875,-45.359765625],[-73.22636718749999,-45.25517578125002],[-73.444970703125,-45.238183593749994],[-73.40488281249999,-45.10234375000002],[-73.362451171875,-44.97822265625001],[-73.25644531249999,-44.961035156250006],[-73.07841796874999,-44.92021484375002],[-72.73896484375,-44.73417968750002],[-72.680078125,-44.59394531250001],[-72.66386718749999,-44.436425781249994],[-72.8275390625,-44.395410156249994],[-73.00102539062499,-44.292382812499994],[-73.14096679687499,-44.2375],[-73.265087890625,-44.16865234375001],[-73.24072265625,-44.06572265625002],[-73.22446289062499,-43.89794921875],[-73.068798828125,-43.86201171875001],[-72.99658203125,-43.63154296875001],[-73.1009765625,-43.455175781250006],[-73.07597656249999,-43.323632812499994],[-72.93999023437499,-43.211328125],[-72.915478515625,-43.13359375000002],[-72.87802734374999,-43.04814453125002],[-72.7580078125,-43.039453125],[-72.75537109375,-42.99296875000002],[-72.766015625,-42.908203125],[-72.844970703125,-42.808007812499994],[-72.848046875,-42.66914062500001],[-72.77392578125,-42.50517578125002],[-72.65483398437499,-42.5166015625],[-72.6318359375,-42.509667968749994],[-72.71630859375,-42.41044921875002],[-72.78515625,-42.30126953125],[-72.77324218749999,-42.257714843749994],[-72.70737304687499,-42.22050781250002],[-72.6310546875,-42.199804687500006],[-72.5484375,-42.255761718749994],[-72.43027343749999,-42.43388671875002],[-72.412353515625,-42.38818359375],[-72.460107421875,-42.206640625],[-72.4994140625,-41.980859375],[-72.623974609375,-42.01054687500002],[-72.73818359375,-41.99462890625],[-72.781201171875,-41.959570312500006],[-72.82407226562499,-41.908789062500006],[-72.783837890625,-41.846777343750006],[-72.74370117187499,-41.80058593750002],[-72.65986328125,-41.74248046875002],[-72.48603515625,-41.722070312499994],[-72.36040039062499,-41.64912109375001],[-72.31826171875,-41.4990234375],[-72.35947265624999,-41.51386718750001],[-72.427734375,-41.645898437499994],[-72.5423828125,-41.690625],[-72.600830078125,-41.68408203125],[-72.66977539062499,-41.659375],[-72.805126953125,-41.544335937499994],[-72.87998046874999,-41.517578125],[-72.95283203125,-41.514746093750006],[-73.01499023437499,-41.543847656249994],[-73.174072265625,-41.74658203125],[-73.241796875,-41.780859375],[-73.52128906249999,-41.79707031250001],[-73.6240234375,-41.77363281250001],[-73.73515624999999,-41.74248046875002],[-73.721875,-41.692480468750006],[-73.68808593749999,-41.639257812500006],[-73.62504882812499,-41.611914062500006],[-73.62392578125,-41.58134765625002],[-73.71064453125,-41.573632812499994],[-73.8107421875,-41.517480468749994],[-73.85502929687499,-41.446386718750006],[-73.876171875,-41.3193359375],[-73.96586914062499,-41.118261718750006],[-73.98359375,-40.97431640625001],[-73.9203125,-40.87158203125],[-73.78403320312499,-40.46845703125001],[-73.74248046874999,-40.26298828125002],[-73.66943359375,-40.08232421875002],[-73.67099609374999,-39.96318359375002],[-73.48222656249999,-39.85429687500002],[-73.410400390625,-39.789160156250006],[-73.24990234375,-39.42236328125],[-73.22646484375,-39.22441406250002],[-73.48076171874999,-38.6240234375],[-73.52021484375,-38.509375],[-73.53256835937499,-38.366796875],[-73.471875,-38.13007812500001],[-73.464794921875,-38.04033203125002],[-73.516748046875,-37.910546875],[-73.66181640625,-37.69853515625],[-73.66459960937499,-37.590429687500006],[-73.60341796875,-37.479101562500006],[-73.66240234374999,-37.34101562500001],[-73.63364257812499,-37.25546875],[-73.60166015624999,-37.1884765625],[-73.37456054687499,-37.22431640625001],[-73.27109375,-37.207421875],[-73.215966796875,-37.16689453125001],[-73.1728515625,-37.053515625],[-73.15126953125,-36.87617187500001],[-73.13779296874999,-36.799902343750006],[-73.11806640625,-36.68837890625001],[-73.006591796875,-36.64345703125001],[-72.96782226562499,-36.53779296875001],[-72.87456054687499,-36.3904296875],[-72.77841796874999,-35.978515625],[-72.68339843749999,-35.876953125],[-72.587353515625,-35.75966796875001],[-72.62392578125,-35.5857421875],[-72.56206054687499,-35.50537109375],[-72.50517578124999,-35.44697265625001],[-72.45498046875,-35.3408203125],[-72.38671875,-35.24042968750001],[-72.223779296875,-35.09619140625],[-72.18242187499999,-34.92021484375],[-72.05595703124999,-34.615820312500006],[-72.03076171875,-34.420507812500006],[-71.99150390624999,-34.28847656250001],[-72.00283203125,-34.16533203125],[-71.92685546874999,-34.015625],[-71.853955078125,-33.88955078125001],[-71.83095703125,-33.81953125000001],[-71.66435546874999,-33.65263671875],[-71.63627929687499,-33.51923828125001],[-71.6955078125,-33.42900390625],[-71.69658203124999,-33.2890625],[-71.74296874999999,-33.09511718750001],[-71.63554687499999,-33.022558593750006],[-71.592041015625,-32.96953125],[-71.45224609374999,-32.65957031250001],[-71.46142578125,-32.537890625],[-71.4212890625,-32.386816406250006],[-71.51303710937499,-32.20791015625001],[-71.52587890625,-31.80585937500001],[-71.577294921875,-31.496386718750003],[-71.66196289062499,-31.16953125],[-71.65390625,-30.986621093750003],[-71.70566406249999,-30.75927734375],[-71.708935546875,-30.628027343750006],[-71.66948242187499,-30.330371093750003],[-71.400390625,-30.14296875],[-71.348046875,-29.933203125],[-71.31572265624999,-29.649707031250003],[-71.32670898437499,-29.443164062500003],[-71.353271484375,-29.350390625],[-71.48583984375,-29.1982421875],[-71.51923828125,-28.92646484375001],[-71.493603515625,-28.855273437500003],[-71.38408203124999,-28.77871093750001],[-71.30673828124999,-28.672460937500006],[-71.266845703125,-28.50751953125001],[-71.18642578125,-28.37783203125001],[-71.1544921875,-28.0640625],[-71.08652343749999,-27.814453125],[-71.05263671875,-27.72734375],[-70.94580078125,-27.61787109375001],[-70.92578125,-27.588671875],[-70.90927734374999,-27.505175781250003],[-70.9142578125,-27.307910156250003],[-70.897900390625,-27.1875],[-70.812744140625,-26.95058593750001],[-70.8029296875,-26.840917968750006],[-70.7083984375,-26.596972656250003],[-70.686962890625,-26.42177734375001],[-70.64658203124999,-26.329394531250003],[-70.662255859375,-26.225390625],[-70.63544921875,-25.99267578125],[-70.699609375,-25.861132812500003],[-70.71372070312499,-25.7841796875],[-70.6330078125,-25.54560546875001],[-70.578125,-25.4875],[-70.489501953125,-25.37646484375],[-70.45219726562499,-25.25185546875001],[-70.44536132812499,-25.17265625],[-70.55864257812499,-24.77851562500001],[-70.57412109375,-24.644335937500003],[-70.54643554687499,-24.331640625],[-70.507421875,-24.1296875],[-70.52006835937499,-23.968554687500003],[-70.507421875,-23.8857421875],[-70.48779296875,-23.78173828125],[-70.40996093749999,-23.655566406250003],[-70.392333984375,-23.56591796875],[-70.41962890625,-23.52851562500001],[-70.511962890625,-23.4828125],[-70.588134765625,-23.36835937500001],[-70.593359375,-23.25546875],[-70.56884765625,-23.17333984375],[-70.56318359375,-23.05703125],[-70.449658203125,-23.0341796875],[-70.38916015625,-22.96962890625001],[-70.331689453125,-22.8486328125],[-70.259521484375,-22.55605468750001],[-70.228515625,-22.193164062500003],[-70.18544921875,-21.974609375],[-70.15507812499999,-21.86660156250001],[-70.12958984375,-21.64082031250001],[-70.087548828125,-21.49306640625001],[-70.080029296875,-21.35683593750001],[-70.08837890625,-21.253222656250003],[-70.197021484375,-20.725390625],[-70.19365234374999,-20.53144531250001],[-70.1474609375,-20.229785156250003],[-70.14814453125,-19.805078125],[-70.157421875,-19.705859375],[-70.19833984374999,-19.61298828125001],[-70.210400390625,-19.486914062500006],[-70.27578125,-19.267578125],[-70.33486328125,-18.82753906250001],[-70.336083984375,-18.59521484375],[-70.36162109374999,-18.398046875],[-70.41826171874999,-18.34560546875001],[-70.4916015625,-18.277734375],[-70.81748046874999,-18.052539062500003],[-70.94169921874999,-17.93203125],[-71.056591796875,-17.87568359375001],[-71.33696289062499,-17.68251953125001],[-71.36494140625,-17.62050781250001],[-71.3994140625,-17.421972656250006],[-71.43588867187499,-17.366015625],[-71.5322265625,-17.29433593750001],[-71.77446289062499,-17.198828125],[-71.868359375,-17.15107421875001],[-71.96689453124999,-17.0640625],[-72.111279296875,-17.002539062500006],[-72.26860351562499,-16.87617187500001],[-72.3625,-16.775],[-72.46767578125,-16.708105468750006],[-72.7939453125,-16.614550781250003],[-72.95771484375,-16.52089843750001],[-73.26376953124999,-16.38857421875001],[-73.400048828125,-16.304296875],[-73.727685546875,-16.20166015625],[-73.824951171875,-16.15283203125],[-74.14707031249999,-15.9125],[-74.37290039062499,-15.833984375],[-74.5548828125,-15.699023437500003],[-75.104248046875,-15.411914062500003],[-75.19052734374999,-15.320117187500003],[-75.274560546875,-15.178125],[-75.39658203124999,-15.093554687500003],[-75.533642578125,-14.89921875],[-75.7376953125,-14.784960937500003],[-75.93388671874999,-14.63359375],[-76.006298828125,-14.495800781250011],[-76.136474609375,-14.3203125],[-76.17514648437499,-14.226660156250006],[-76.289013671875,-14.133105468750003],[-76.297021484375,-13.948437500000011],[-76.37646484375,-13.863085937500003],[-76.319482421875,-13.821484375000011],[-76.259228515625,-13.802832031250006],[-76.18393554687499,-13.515234375],[-76.2236328125,-13.371191406250006],[-76.42734375,-13.109960937500006],[-76.5021484375,-12.984375],[-76.55522460937499,-12.823437500000011],[-76.637109375,-12.72802734375],[-76.7580078125,-12.527148437500003],[-76.83212890624999,-12.348730468750006],[-76.994091796875,-12.21923828125],[-77.03813476562499,-12.172753906250009],[-77.0626953125,-12.106835937500009],[-77.152734375,-12.060351562500003],[-77.1576171875,-11.9234375],[-77.2203125,-11.663378906250003],[-77.30991210937499,-11.532421875000011],[-77.633203125,-11.287792968750011],[-77.63857421875,-11.193554687500011],[-77.664306640625,-11.022070312500006],[-77.736083984375,-10.83671875],[-78.095458984375,-10.260644531250009],[-78.18559570312499,-10.089062500000011],[-78.2755859375,-9.810351562500003],[-78.35649414062499,-9.652050781250011],[-78.44565429687499,-9.37060546875],[-78.58012695312499,-9.156640625],[-78.66459960937499,-8.97109375],[-78.75458984375,-8.740429687500011],[-78.76225585937499,-8.616992187500003],[-78.925390625,-8.404589843750003],[-79.01225585937499,-8.210156250000011],[-79.16440429687499,-8.047167968750003],[-79.31284179687499,-7.923242187500009],[-79.37724609374999,-7.835546875],[-79.5888671875,-7.4189453125],[-79.61772460937499,-7.295605468750011],[-79.761962890625,-7.066503906250006],[-79.9046875,-6.901660156250003],[-79.99497070312499,-6.768945312500009],[-80.11025390625,-6.649609375000011],[-80.81162109374999,-6.2822265625],[-81.05844726562499,-6.12939453125],[-81.142041015625,-6.056738281250006],[-81.18051757812499,-5.9423828125],[-81.164306640625,-5.875292968750003],[-81.09184570312499,-5.812402343750009],[-80.991650390625,-5.8609375],[-80.9306640625,-5.8408203125],[-80.88271484375,-5.758984375000011],[-80.88193359374999,-5.635058593750003],[-80.943115234375,-5.475390625],[-81.16767578125,-5.167089843750006],[-81.15073242187499,-5.101855468750003],[-81.10849609374999,-5.02783203125],[-81.195068359375,-4.879492187500006],[-81.28940429687499,-4.7607421875],[-81.33662109375,-4.66953125],[-81.283203125,-4.322265625],[-81.23203125,-4.234277343750009],[-80.89194335937499,-3.881640625],[-80.798583984375,-3.731054687500006],[-80.652734375,-3.63818359375],[-80.503662109375,-3.49609375],[-80.324658203125,-3.387890625000011],[-80.303125,-3.374804687500003],[-80.15986328125,-3.324316406250006],[-80.100341796875,-3.274023437500006],[-80.02666015624999,-3.228125],[-79.963330078125,-3.15771484375],[-79.92158203125,-3.090136718750003],[-79.822705078125,-2.776953125],[-79.7298828125,-2.5791015625],[-79.7455078125,-2.484667968750003],[-79.822412109375,-2.356542968750006],[-79.83974609375,-2.167871093750009],[-79.83261718749999,-2.110546875000011],[-79.84213867187499,-2.0673828125],[-79.89340820312499,-2.145703125000011],[-79.880322265625,-2.423632812500003],[-79.92558593749999,-2.548535156250011],[-79.989013671875,-2.578710937500006],[-80.03017578125,-2.556738281250006],[-80.00664062499999,-2.353808593750003],[-80.05307617187499,-2.390722656250006],[-80.1271484375,-2.528417968750006],[-80.24863281249999,-2.630566406250011],[-80.2552734375,-2.664648437500006],[-80.28471679687499,-2.706738281250011],[-80.378564453125,-2.66796875],[-80.45009765625,-2.6259765625],[-80.68486328124999,-2.396875],[-80.8390625,-2.349023437500009],[-80.93217773437499,-2.269140625],[-80.951611328125,-2.235449218750006],[-80.96279296875,-2.189257812500003],[-80.867626953125,-2.141210937500006],[-80.77036132812499,-2.07666015625],[-80.76059570312499,-1.9345703125],[-80.763134765625,-1.822949218750011],[-80.83500976562499,-1.632421875],[-80.801416015625,-1.383398437500006],[-80.82001953125,-1.285839843750011],[-80.90239257812499,-1.07890625],[-80.84140625,-0.974707031250006],[-80.623681640625,-0.898730468750003],[-80.55390625,-0.847949218750003],[-80.505078125,-0.683789062500011],[-80.45546875,-0.58544921875],[-80.3583984375,-0.625097656250006],[-80.282373046875,-0.620507812500009],[-80.384765625,-0.583984375],[-80.46831054687499,-0.43603515625],[-80.48227539062499,-0.368261718750006],[-80.3212890625,-0.165820312500003],[-80.23701171875,-0.113085937500003],[-80.13339843749999,-0.006054687500011],[-80.046142578125,0.155371093749991],[-80.025,0.41015625],[-80.06103515625,0.59228515625],[-80.08828125,0.784765625],[-80.03593749999999,0.834570312499991],[-79.903515625,0.860205078124991],[-79.795849609375,0.922265625],[-79.7412109375,0.979785156249989],[-79.61318359375,0.971142578124997],[-79.46538085937499,1.06005859375],[-79.22905273437499,1.104589843749991],[-78.899658203125,1.20625],[-78.82705078125,1.295947265624989],[-78.85966796874999,1.455371093749989],[-78.88847656249999,1.524072265624994],[-79.02543945312499,1.623681640624994],[-78.957666015625,1.752197265625],[-78.79296875,1.848730468749991],[-78.576904296875,1.773779296874991],[-78.550439453125,1.923632812499989],[-78.62861328125,2.05625],[-78.61704101562499,2.306787109374994],[-78.59169921875,2.356640625],[-78.53471679687499,2.423681640624991],[-78.46044921875,2.470068359374991],[-78.41689453125,2.483496093749991],[-78.34287109374999,2.460546875],[-78.296142578125,2.510498046875],[-78.12001953125,2.488183593749994],[-78.066650390625,2.509130859374991],[-78.03017578125,2.543066406249991],[-77.98720703125,2.568994140624994],[-77.932275390625,2.629248046874991],[-77.90078125,2.698828125],[-77.87451171875,2.725878906249989],[-77.81357421874999,2.716357421874989],[-77.80795898437499,2.746386718749989],[-77.77666015624999,2.787304687499997],[-77.67001953124999,2.878857421874997],[-77.67109375,2.919335937499994],[-77.70097656249999,3.007568359375],[-77.69365234374999,3.039941406249994],[-77.63203125,3.051171875],[-77.55913085937499,3.075976562499989],[-77.520263671875,3.160253906249991],[-77.47221679687499,3.233789062499994],[-77.417138671875,3.341796875],[-77.35654296874999,3.348583984374997],[-77.3244140625,3.474755859374994],[-77.24277343749999,3.585351562499994],[-77.076806640625,3.91328125],[-77.12685546875,3.906054687499989],[-77.16660156249999,3.862255859374997],[-77.21201171874999,3.867431640625],[-77.26352539062499,3.893212890624994],[-77.24838867187499,4.040966796874997],[-77.27802734375,4.058496093749994],[-77.35820312499999,3.944726562499994],[-77.42729492187499,4.060449218749994],[-77.433544921875,4.130957031249991],[-77.4044921875,4.20078125],[-77.40874023437499,4.247753906249997],[-77.520703125,4.212792968749994],[-77.51552734375,4.256298828124997],[-77.44584960937499,4.301025390625],[-77.4142578125,4.347607421874997],[-77.353515625,4.398291015624991],[-77.3283203125,4.475],[-77.313671875,4.593847656249991],[-77.286328125,4.721728515624989],[-77.30654296875,4.78466796875],[-77.339453125,4.838525390624994],[-77.36674804687499,5.0765625],[-77.35917968749999,5.215185546874991],[-77.373291015625,5.323974609375],[-77.4017578125,5.416162109374994],[-77.534423828125,5.537109375],[-77.324609375,5.675634765624991],[-77.249267578125,5.780175781249994],[-77.344677734375,5.995361328125],[-77.46943359375,6.1767578125],[-77.473046875,6.28564453125],[-77.440087890625,6.271728515625],[-77.39824218749999,6.275],[-77.35986328125,6.504492187499991],[-77.368798828125,6.575585937499994],[-77.4388671875,6.690332031249994],[-77.52597656249999,6.693115234375],[-77.60214843749999,6.837304687499994],[-77.64584960937499,6.86962890625],[-77.68095703124999,6.960400390624997],[-77.8037109375,7.137255859374989],[-77.90117187499999,7.229345703124991],[-77.92978515624999,7.25634765625],[-78.1701171875,7.543798828124991],[-78.37822265624999,7.89990234375],[-78.42158203125,8.060986328124997],[-78.367626953125,8.070556640625],[-78.3154296875,8.066943359374989],[-78.287353515625,8.091796875],[-78.2548828125,8.138623046874997],[-78.281201171875,8.24755859375],[-78.18002929687499,8.330273437499997],[-78.14189453124999,8.386083984374991],[-78.11386718749999,8.379589843749997],[-78.04775390625,8.284765625],[-77.95166015625,8.230273437499989],[-77.833642578125,8.151171874999989],[-77.76054687499999,8.133251953124997],[-77.8529296875,8.216210937499994],[-78.0125,8.325390625],[-78.05717773437499,8.397119140624994],[-78.09946289062499,8.496972656249994],[-78.16181640625,8.453710937499991],[-78.19077148437499,8.417333984374991],[-78.223046875,8.396630859374994],[-78.251123046875,8.421435546874989],[-78.256103515625,8.453710937499991],[-78.35014648437499,8.460009765624989],[-78.37431640624999,8.4892578125],[-78.39921874999999,8.505664062499989],[-78.387890625,8.443408203124989],[-78.369384765625,8.404931640624994],[-78.379296875,8.35859375],[-78.40986328125,8.355322265624991],[-78.43603515625,8.4033203125],[-78.46943359375,8.446679687499994],[-78.5140625,8.628173828125],[-78.62089843749999,8.713720703124991],[-78.66982421875,8.7421875],[-78.710205078125,8.7529296875],[-78.769677734375,8.811083984374989],[-78.84824218749999,8.8421875],[-78.95517578124999,8.932519531249994],[-79.086376953125,8.997167968749991],[-79.24667968749999,9.020068359374989],[-79.44150390624999,9.006005859374994],[-79.507080078125,8.970068359374991],[-79.55166015625,8.924462890624994],[-79.57236328124999,8.903271484374997],[-79.687451171875,8.850976562499994],[-79.73105468749999,8.775341796874997],[-79.758544921875,8.711572265624994],[-79.81591796875,8.639208984374989],[-79.750439453125,8.595507812499989],[-80.12578124999999,8.349658203124989],[-80.20009765625,8.31396484375],[-80.36870117187499,8.288769531249997],[-80.40756835937499,8.262451171875],[-80.458984375,8.2138671875],[-80.46586914062499,8.139941406249989],[-80.45810546874999,8.077050781249994],[-80.409130859375,8.028564453125],[-80.36557617187499,7.997998046874997],[-80.2609375,7.851660156249991],[-80.0751953125,7.667041015624989],[-80.0400390625,7.599804687499997],[-80.01123046875,7.500048828124989],[-80.06728515625,7.453222656249991],[-80.110595703125,7.433447265624991],[-80.2873046875,7.425634765624991],[-80.34824218749999,7.385693359374997],[-80.37294921875,7.324658203124997],[-80.4388671875,7.274951171874989],[-80.66669921875,7.225683593749991],[-80.84555664062499,7.220068359374991],[-80.90122070312499,7.277148437499989],[-80.91464843749999,7.4375],[-81.035107421875,7.711132812499997],[-81.0638671875,7.899755859374991],[-81.0939453125,7.876318359374991],[-81.1578125,7.854394531249994],[-81.17939453125,7.807519531249994],[-81.195458984375,7.668408203124997],[-81.21904296874999,7.620947265624991],[-81.26840820312499,7.62548828125],[-81.369580078125,7.67529296875],[-81.504150390625,7.72119140625],[-81.67568359375,8.015917968749989],[-81.694287109375,8.071386718749991],[-81.72763671874999,8.137548828124991],[-81.86025390625,8.165429687499994],[-81.973291015625,8.215087890625],[-82.09672851562499,8.222753906249991],[-82.15986328125,8.19482421875],[-82.22431640625,8.230371093749994],[-82.23544921874999,8.31103515625],[-82.36484375,8.274853515624997],[-82.53095703125,8.287402343749989],[-82.67954101562499,8.321972656249997],[-82.78115234375,8.303515624999989],[-82.86611328125,8.246337890625],[-82.85434570312499,8.099511718749994],[-82.879345703125,8.070654296874991],[-82.947265625,8.181738281249991],[-83.041455078125,8.287744140624994],[-83.12333984374999,8.353076171874989],[-83.12958984375,8.50546875],[-83.16240234374999,8.588183593749989],[-83.285791015625,8.664355468749989],[-83.39140624999999,8.717724609374997],[-83.4697265625,8.706835937499989],[-83.42177734375,8.619238281249991],[-83.29775390625,8.506884765624989],[-83.28955078125,8.463818359374997],[-83.29150390625,8.406005859375],[-83.37680664062499,8.414892578124991],[-83.45205078125,8.4384765625],[-83.54375,8.445849609374989],[-83.604736328125,8.480322265624991],[-83.73408203125,8.614453125],[-83.6421875,8.72890625],[-83.613720703125,8.804052734374991],[-83.616162109375,8.959814453124991],[-83.63725585937499,9.035351562499997],[-83.73691406249999,9.150292968749994],[-83.89555664062499,9.276416015624989],[-84.11787109375,9.379443359374989],[-84.22236328125,9.4625],[-84.482666015625,9.526171874999989],[-84.58159179687499,9.568359375],[-84.65888671875,9.646679687499997],[-84.67045898437499,9.702880859375],[-84.64306640625,9.789404296874991],[-84.71494140624999,9.8994140625],[-85.025048828125,10.11572265625],[-85.1984375,10.1953125],[-85.23564453124999,10.242089843749994],[-85.26318359375,10.256640624999989],[-85.2365234375,10.107373046874997],[-85.16074218749999,10.017431640624991],[-84.96279296875,9.933447265624991],[-84.908349609375,9.884570312499989],[-84.88642578125,9.820947265624994],[-85.00126953124999,9.699267578124989],[-85.059716796875,9.668310546874991],[-85.07705078125,9.601953125],[-85.114501953125,9.581787109375],[-85.15400390625,9.620068359374997],[-85.31455078124999,9.8109375],[-85.62485351562499,9.902441406249991],[-85.68100585937499,9.95859375],[-85.796484375,10.132861328124989],[-85.84965820312499,10.292041015624989],[-85.83061523437499,10.398144531249997],[-85.703125,10.5634765625],[-85.663330078125,10.635449218749997],[-85.67143554687499,10.679785156249991],[-85.667236328125,10.745019531249994],[-85.71484375,10.790576171874989],[-85.83286132812499,10.849951171874991],[-85.90800781249999,10.897558593749991],[-85.88740234375,10.921289062499994],[-85.75224609374999,10.985253906249994],[-85.74370117187499,11.04296875],[-85.7443359375,11.062109375],[-85.74521484374999,11.088574218749997],[-85.828515625,11.19873046875],[-85.9611328125,11.331347656249989],[-86.468896484375,11.73828125],[-86.655517578125,11.981542968749991],[-86.755615234375,12.156640625],[-86.8509765625,12.247753906249997],[-87.1251953125,12.434130859374989],[-87.188427734375,12.508349609374989],[-87.46015625,12.757568359375],[-87.66752929687499,12.903564453125],[-87.670166015625,12.965673828124991],[-87.58505859374999,13.043310546874991],[-87.54331054687499,13.039697265624994],[-87.49794921875,12.984179687499989],[-87.42436523437499,12.921142578125],[-87.3896484375,12.920654296875],[-87.33857421875,12.949951171875],[-87.33725585937499,12.979248046875],[-87.33251953125,13.084716796875],[-87.41279296875,13.12744140625],[-87.458447265625,13.215429687499991],[-87.49838867187499,13.27490234375],[-87.48515624999999,13.310595703125003],[-87.48911132812499,13.352929687499994],[-87.60224609375,13.385595703124991],[-87.70834960937499,13.360058593749997],[-87.76938476562499,13.376660156249997],[-87.814208984375,13.399169921875],[-87.83837890625,13.385791015625003],[-87.820703125,13.28515625],[-87.878076171875,13.224414062500003],[-87.930859375,13.1806640625],[-88.0234375,13.16875],[-88.1806640625,13.164013671874997],[-88.417138671875,13.213525390624994],[-88.591552734375,13.281054687500003],[-88.68564453124999,13.281494140625],[-88.655859375,13.259179687499994],[-88.58154296875,13.244970703124991],[-88.48388671875,13.197167968749994],[-88.51201171874999,13.183935546874991],[-88.86704101562499,13.283251953125003],[-89.27763671874999,13.478076171875003],[-89.52324218749999,13.509130859374991],[-89.80419921875,13.560107421875003],[-89.970458984375,13.683154296875003],[-90.09521484375,13.736523437499997],[-90.47910156249999,13.900927734375003],[-90.60693359375,13.929003906250003],[-91.14604492187499,13.925585937500003],[-91.37734375,13.990185546874997],[-91.64091796874999,14.114941406249997],[-91.819091796875,14.228222656249997],[-92.23515624999999,14.54541015625],[-92.26455078125,14.567773437499994],[-92.53095703125,14.839648437500003],[-92.80893554687499,15.138574218749994],[-92.918408203125,15.236132812500003],[-93.0244140625,15.310253906249997],[-93.16689453125,15.448046875],[-93.541162109375,15.750390625],[-93.734375,15.888476562500003],[-93.91606445312499,16.05356445312499],[-94.07895507812499,16.145263671875],[-94.239892578125,16.205078125],[-94.311279296875,16.23935546874999],[-94.374169921875,16.284765625],[-94.40903320312499,16.287353515625],[-94.426416015625,16.226269531249997],[-94.37016601562499,16.19541015624999],[-94.30283203124999,16.169335937499994],[-94.24951171875,16.167529296875003],[-94.19340820312499,16.14560546874999],[-94.0283203125,16.062060546875003],[-94.00126953124999,16.018945312499994],[-94.47075195312499,16.186572265625003],[-94.6615234375,16.201904296875],[-94.682275390625,16.228222656249997],[-94.587109375,16.315820312499994],[-94.616845703125,16.347558593749994],[-94.65078125,16.351806640625],[-94.75283203125,16.291210937499997],[-94.79082031249999,16.287158203125003],[-94.79746093749999,16.327050781249994],[-94.792919921875,16.36459960937499],[-94.85869140624999,16.419726562500003],[-94.90043945312499,16.41748046875],[-94.934716796875,16.379101562499997],[-95.02353515624999,16.30625],[-95.02084960937499,16.277636718750003],[-94.84604492187499,16.24658203125],[-94.785791015625,16.22910156249999],[-94.79941406249999,16.209667968749997],[-94.94931640624999,16.210009765625003],[-95.134375,16.176953125],[-95.46440429687499,15.974707031249991],[-95.77177734374999,15.887792968749991],[-96.21357421875,15.693066406249997],[-96.408642578125,15.68310546875],[-96.51083984374999,15.651904296875003],[-96.80795898437499,15.726416015624991],[-97.18466796874999,15.909277343749991],[-97.75478515625,15.966845703125003],[-98.13896484374999,16.206298828125],[-98.52031249999999,16.304833984374994],[-98.76220703125,16.534765625],[-98.907958984375,16.544580078124994],[-99.00166015625,16.581445312499994],[-99.348046875,16.664746093749997],[-99.690673828125,16.719628906249994],[-100.02451171874999,16.92050781249999],[-100.24301757812499,16.984179687500003],[-100.431884765625,17.0640625],[-100.847802734375,17.200488281250003],[-101.001953125,17.276123046875],[-101.1478515625,17.393115234375003],[-101.385498046875,17.514208984375003],[-101.487060546875,17.61533203124999],[-101.60029296875,17.6515625],[-101.76240234375,17.841992187499997],[-101.8470703125,17.922265625],[-101.918701171875,17.959765625],[-101.9955078125,17.972705078125003],[-102.21660156249999,17.957421875],[-102.54697265624999,18.04140625],[-102.69956054687499,18.06284179687499],[-103.018505859375,18.18686523437499],[-103.4416015625,18.325390625],[-103.5802734375,18.484375],[-103.69892578125,18.632958984374994],[-103.91245117187499,18.82846679687499],[-104.045654296875,18.911816406249997],[-104.277001953125,19.010986328125],[-104.40517578125,19.091210937499994],[-104.602978515625,19.152880859375003],[-104.9384765625,19.309375],[-105.04521484375,19.443261718749994],[-105.107666015625,19.562207031249997],[-105.286376953125,19.706494140624997],[-105.482080078125,19.97607421875],[-105.532421875,20.075390625],[-105.57041015624999,20.227832031250003],[-105.61591796875,20.316308593749994],[-105.66943359375,20.38559570312499],[-105.642138671875,20.435986328124997],[-105.542578125,20.497949218749994],[-105.37705078124999,20.511865234374994],[-105.26015625,20.579052734374997],[-105.244677734375,20.634179687499994],[-105.25229492187499,20.668505859375003],[-105.32705078125,20.752978515625003],[-105.4201171875,20.775390625],[-105.4923828125,20.776611328125],[-105.51083984374999,20.808740234374994],[-105.45634765625,20.843798828125003],[-105.393994140625,20.92612304687499],[-105.301953125,21.0265625],[-105.237060546875,21.119189453125003],[-105.225,21.249707031249997],[-105.23325195312499,21.380419921875003],[-105.20869140625,21.49082031249999],[-105.4314453125,21.61826171874999],[-105.457421875,21.67246093749999],[-105.52744140624999,21.81845703124999],[-105.64912109375,21.988085937500003],[-105.6455078125,22.326904296875],[-105.791796875,22.627490234375003],[-105.943359375,22.777001953124994],[-106.021728515625,22.829052734374997],[-106.2345703125,23.0609375],[-106.40224609375,23.195605468750003],[-106.56650390624999,23.449462890625],[-106.728759765625,23.61069335937499],[-106.935498046875,23.88125],[-107.08486328125,24.01611328125],[-107.76494140625,24.471923828125],[-107.726611328125,24.471923828125],[-107.52724609375,24.360058593749997],[-107.493701171875,24.369384765625],[-107.488916015625,24.423974609374994],[-107.5119140625,24.489160156249994],[-107.548876953125,24.504785156249994],[-107.602001953125,24.490136718749994],[-107.67368164062499,24.503564453124994],[-107.709521484375,24.525048828124994],[-107.81669921875,24.539013671874997],[-107.951171875,24.614892578124994],[-108.0087890625,24.693554687499997],[-108.015087890625,24.783398437499997],[-108.207666015625,24.974804687499997],[-108.28076171875,25.08154296875],[-108.243310546875,25.073681640624997],[-108.192041015625,25.030664062499994],[-108.140087890625,25.01840820312499],[-108.079638671875,25.01806640625],[-108.035693359375,25.035351562499997],[-108.05146484375,25.067041015624994],[-108.092822265625,25.093505859375],[-108.373681640625,25.1943359375],[-108.466259765625,25.26513671875],[-108.69638671874999,25.38291015624999],[-108.7509765625,25.42421875],[-108.787255859375,25.538037109374997],[-108.84360351562499,25.54331054687499],[-108.89316406249999,25.51157226562499],[-109.02880859375,25.48046875],[-109.0634765625,25.51669921874999],[-109.06845703124999,25.5515625],[-108.97275390624999,25.58847656249999],[-108.88486328124999,25.696044921875],[-108.88657226562499,25.733447265625003],[-108.93515625,25.69028320312499],[-109.008349609375,25.641992187499994],[-109.08408203124999,25.615039062500003],[-109.196484375,25.592529296875],[-109.253955078125,25.608789062499994],[-109.304296875,25.63315429687499],[-109.3849609375,25.72714843749999],[-109.42563476562499,26.032568359375],[-109.354150390625,26.138476562499996],[-109.270654296875,26.243115234374997],[-109.19970703125,26.305224609374996],[-109.15878906249999,26.258349609374996],[-109.11669921875,26.252734375],[-109.14633789062499,26.305712890624996],[-109.216015625,26.355273437499996],[-109.240625,26.4046875],[-109.24326171874999,26.449951171875],[-109.27626953125,26.533886718749997],[-109.482861328125,26.710351562499994],[-109.67607421875,26.696826171874996],[-109.75478515625,26.702929687499996],[-109.828369140625,26.7701171875],[-109.89091796875,26.8833984375],[-109.92172851562499,26.978173828124994],[-109.92563476562499,27.028662109375],[-109.943994140625,27.079345703125],[-110.2771484375,27.16220703125],[-110.37729492187499,27.233300781249994],[-110.477783203125,27.32265625],[-110.51938476562499,27.39560546875],[-110.56064453124999,27.450146484374997],[-110.59267578125,27.544335937499994],[-110.615478515625,27.65390625],[-110.578271484375,27.795654296875],[-110.52988281249999,27.864208984374997],[-110.759033203125,27.915185546874994],[-110.8486328125,27.917578125],[-110.92080078125,27.888867187499997],[-110.986083984375,27.925976562499997],[-111.12138671875,27.966992187499997],[-111.282421875,28.115234375],[-111.4716796875,28.383984375],[-111.680078125,28.470556640625],[-111.747216796875,28.56396484375],[-111.832421875,28.648144531249997],[-111.90703125,28.752490234374996],[-111.918603515625,28.797900390624996],[-111.9408203125,28.823193359374997],[-112.044873046875,28.895898437499994],[-112.161767578125,29.018896484375],[-112.192041015625,29.11796875],[-112.22348632812499,29.269482421874997],[-112.301416015625,29.322900390624994],[-112.37822265625,29.347705078124996],[-112.393212890625,29.419726562499996],[-112.388671875,29.460107421874994],[-112.41455078125,29.536425781249996],[-112.572900390625,29.71953125],[-112.653125,29.870068359374997],[-112.69716796875,29.916845703125],[-112.73837890624999,29.98544921875],[-112.759228515625,30.125683593749997],[-112.82480468749999,30.300146484375],[-112.95175781249999,30.510009765625],[-113.057666015625,30.651025390624994],[-113.11044921874999,30.793310546875],[-113.08701171874999,30.9380859375],[-113.10498046875,31.027197265625],[-113.118603515625,31.048095703125],[-113.107958984375,31.077294921874994],[-113.072802734375,31.060888671875],[-113.042919921875,31.08701171875],[-113.04672851562499,31.179248046874996],[-113.083642578125,31.207177734374994],[-113.186181640625,31.236035156249997],[-113.2314453125,31.25595703125],[-113.48081054687499,31.293603515624994],[-113.623486328125,31.345898437499997],[-113.6330078125,31.467626953125],[-113.699951171875,31.523339843749994],[-113.759423828125,31.557763671874994],[-113.94775390625,31.629345703124997],[-113.977490234375,31.592724609374997],[-114.002685546875,31.525146484375],[-114.08090820312499,31.5103515625],[-114.14931640625,31.507373046874996],[-114.2640625,31.554443359375],[-114.54868164062499,31.733544921874994],[-114.6087890625,31.762255859374996],[-114.69760742187499,31.77744140625],[-114.74130859374999,31.806494140625],[-114.93359375,31.900732421875],[-114.895068359375,31.850634765624996],[-114.839501953125,31.798535156249997],[-114.78989257812499,31.647119140624994],[-114.84814453125,31.537939453125],[-114.881884765625,31.156396484374994],[-114.844677734375,31.08046875],[-114.76103515625,30.958740234375],[-114.703369140625,30.765185546874996],[-114.68544921875,30.62119140625],[-114.63330078125,30.506884765624996],[-114.64975585937499,30.238134765625],[-114.629931640625,30.156298828124996],[-114.55048828125,30.022265625],[-114.40341796874999,29.896484375],[-114.372607421875,29.830224609374994],[-114.17919921875,29.734326171874997],[-114.0619140625,29.609521484374994],[-113.82895507812499,29.439453125],[-113.75546875,29.367480468749996],[-113.5453125,29.102246093749997],[-113.5384765625,29.023388671874997],[-113.49970703125,28.926708984374997],[-113.3818359375,28.946679687499994],[-113.32890625,28.873046875],[-113.335009765625,28.8390625],[-113.320703125,28.813134765624994],[-113.25888671874999,28.81884765625],[-113.20556640625,28.798779296874997],[-113.09365234375,28.511767578124996],[-113.03359375,28.472607421874997],[-112.956640625,28.455859375],[-112.870849609375,28.42421875],[-112.865234375,28.350634765624996],[-112.86845703125,28.2919921875],[-112.795703125,28.20712890625],[-112.808056640625,28.0921875],[-112.74931640625,27.994873046875],[-112.758203125,27.900634765625],[-112.734033203125,27.825976562499996],[-112.55263671875,27.657470703125],[-112.32919921874999,27.5234375],[-112.2826171875,27.347460937499996],[-112.191455078125,27.186669921874994],[-112.09814453125,27.145947265624997],[-112.003955078125,27.0791015625],[-112.015576171875,27.009716796874997],[-112.00908203125,26.967089843749996],[-111.88315429687499,26.840185546875],[-111.86264648437499,26.678515625],[-111.75400390624999,26.572705078124997],[-111.723388671875,26.564404296874997],[-111.6994140625,26.580957031249994],[-111.778515625,26.687255859375],[-111.816845703125,26.75625],[-111.82177734375,26.865087890625],[-111.79526367187499,26.8796875],[-111.56967773437499,26.7076171875],[-111.5458984375,26.57919921875],[-111.470166015625,26.506640625],[-111.464501953125,26.408447265625],[-111.418505859375,26.349951171875],[-111.40458984375,26.265039062499994],[-111.33212890624999,26.125439453124997],[-111.33037109375,25.931347656249997],[-111.29160156249999,25.789794921875],[-111.149560546875,25.57260742187499],[-111.034423828125,25.526953125],[-111.013623046875,25.4203125],[-110.8939453125,25.144238281249997],[-110.7556640625,24.994580078124997],[-110.686767578125,24.86767578125],[-110.67724609375,24.788525390624997],[-110.72900390625,24.671533203124994],[-110.734521484375,24.58984375],[-110.659326171875,24.341455078124994],[-110.54697265624999,24.214160156250003],[-110.421484375,24.183398437500003],[-110.399658203125,24.16513671874999],[-110.409619140625,24.13095703124999],[-110.367431640625,24.100488281249994],[-110.319970703125,24.139453125],[-110.296826171875,24.194873046875003],[-110.32089843749999,24.259179687499994],[-110.32509765625,24.305957031250003],[-110.303759765625,24.339453125],[-110.262890625,24.34453125],[-110.02280273437499,24.174609375],[-109.98251953124999,24.109375],[-109.89316406249999,24.033007812500003],[-109.811328125,23.939013671875003],[-109.77597656249999,23.864892578124994],[-109.710546875,23.80380859374999],[-109.6765625,23.661572265624997],[-109.50961914062499,23.597900390625],[-109.420849609375,23.480126953124994],[-109.414990234375,23.405566406250003],[-109.458056640625,23.214746093749994],[-109.495703125,23.159814453124994],[-109.63046875,23.078662109375003],[-109.72841796875,22.981835937499994],[-109.823046875,22.922167968750003],[-109.9234375,22.885888671874994],[-110.00625,22.89404296875],[-110.08603515624999,23.00546875],[-110.180615234375,23.341503906249997],[-110.244091796875,23.412255859374994],[-110.28876953125,23.51767578124999],[-110.3626953125,23.604931640624997],[-110.62998046874999,23.7373046875],[-110.764892578125,23.877001953125003],[-110.895556640625,23.970263671875003],[-111.036181640625,24.105273437500003],[-111.4193359375,24.329003906249994],[-111.57822265624999,24.443017578124994],[-111.68291015625,24.555810546874994],[-111.750390625,24.554150390624997],[-111.802490234375,24.542529296875003],[-111.822265625,24.573388671874994],[-111.8251953125,24.631787109374997],[-111.84824218749999,24.670068359374994],[-112.07255859375,24.840039062499997],[-112.11904296875,24.934033203124997],[-112.128515625,25.043115234374994],[-112.07797851562499,25.323974609375],[-112.05576171874999,25.488232421874997],[-112.069873046875,25.57285156249999],[-112.093359375,25.584375],[-112.11459960937499,25.63037109375],[-112.119775390625,25.765527343749994],[-112.173828125,25.91259765625],[-112.37724609375,26.213916015624996],[-112.52607421875,26.273486328124996],[-112.6583984375,26.316748046875],[-113.020751953125,26.583251953125],[-113.11923828124999,26.716503906249997],[-113.143212890625,26.7921875],[-113.155810546875,26.946240234374997],[-113.20576171875,26.856982421874996],[-113.272265625,26.790966796874997],[-113.42587890624999,26.795800781249994],[-113.59853515625,26.7212890625],[-113.70126953124999,26.791357421875],[-113.756640625,26.870849609375],[-113.840966796875,26.966503906249997],[-113.9359375,26.985253906249994],[-113.996484375,26.987695312499994],[-114.11005859375,27.10595703125],[-114.20185546875,27.143505859374997],[-114.3333984375,27.158007812499996],[-114.445263671875,27.218164062499994],[-114.4796875,27.28359375],[-114.498291015625,27.376220703125],[-114.53989257812499,27.431103515624997],[-114.715625,27.53955078125],[-114.85874023437499,27.6591796875],[-114.99350585937499,27.736035156249997],[-115.033203125,27.798876953124996],[-115.03647460937499,27.841845703124996],[-114.82353515625,27.829931640625],[-114.57001953125,27.783935546875],[-114.448486328125,27.796875],[-114.372705078125,27.841210937499994],[-114.3005859375,27.872998046874997],[-114.2890625,27.838574218749997],[-114.30224609375,27.775732421875],[-114.232666015625,27.718115234375],[-114.13720703125,27.671435546874996],[-114.0693359375,27.675683593749994],[-114.13505859375,27.726611328124996],[-114.175390625,27.83056640625],[-114.15732421874999,27.86796875],[-114.1583984375,27.919677734375],[-114.25263671875,27.908007812499996],[-114.265869140625,27.934472656249994],[-114.18525390625,28.01328125],[-114.092724609375,28.221337890624994],[-114.048486328125,28.426171875],[-114.1455078125,28.605419921874997],[-114.309228515625,28.729931640624997],[-114.664013671875,29.094580078125],[-114.875927734375,29.281884765624994],[-114.9373046875,29.351611328124996],[-114.99350585937499,29.384423828124994],[-115.16635742187499,29.42724609375],[-115.311181640625,29.531933593749997],[-115.56528320312499,29.680029296875],[-115.673828125,29.756396484374996],[-115.748681640625,29.935742187499997],[-115.80830078125,29.960205078125],[-115.78955078125,30.084179687499997],[-115.815625,30.303613281249994],[-115.858203125,30.359814453124997],[-115.99580078125,30.414453125],[-116.028564453125,30.56357421875],[-116.0353515625,30.70546875],[-116.062158203125,30.804150390624997],[-116.2962890625,30.970507812499996],[-116.30961914062499,31.050976562499997],[-116.30966796875,31.12734375],[-116.333447265625,31.202783203124994],[-116.45849609375,31.360986328124994],[-116.6095703125,31.499072265624996],[-116.66215820312499,31.564892578124997],[-116.66845703125,31.698632812499994],[-116.7220703125,31.734570312499997],[-116.70170898437499,31.74365234375],[-116.652099609375,31.74033203125],[-116.623876953125,31.758007812499997],[-116.62080078125,31.85107421875],[-116.847998046875,31.997363281249996],[-116.913671875,32.198535156249996],[-117.034765625,32.305029296875],[-117.063134765625,32.343603515625],[-117.128271484375,32.533349609374994],[-117.13046875,32.53974609375],[-117.13740234375,32.649169921875],[-117.183740234375,32.687890625],[-117.24345703124999,32.664013671875],[-117.270703125,32.80625],[-117.25576171875,32.873388671875],[-117.26298828124999,32.938867187499994],[-117.31884765625,33.100048828125],[-117.467431640625,33.2955078125],[-117.788525390625,33.538476562499994],[-117.952099609375,33.61962890625],[-118.080517578125,33.72216796875],[-118.16191406249999,33.75068359375],[-118.264404296875,33.75859375],[-118.294189453125,33.712304687499994],[-118.41044921874999,33.743945312499996],[-118.39296875,33.858300781249994],[-118.506201171875,34.017382812499996],[-118.598828125,34.035009765625],[-118.83203125,34.024462890624996],[-119.14375,34.11201171875],[-119.23583984375,34.164111328124996],[-119.26767578125,34.257421875],[-119.413671875,34.33857421875],[-119.6060546875,34.418017578124996],[-119.71318359374999,34.399658203125],[-119.85332031249999,34.411962890625],[-120.052978515625,34.469287109374996],[-120.16953125,34.476464843749994],[-120.396484375,34.4595703125],[-120.481201171875,34.471630859375],[-120.559814453125,34.543896484375],[-120.644677734375,34.579980468749994],[-120.626708984375,34.6689453125],[-120.63759765625,34.749365234375],[-120.62490234375,34.811962890625],[-120.663037109375,34.949267578124996],[-120.63359374999999,35.076464843749996],[-120.65908203125,35.122412109375],[-120.70703125,35.157666015625],[-120.857373046875,35.20966796875],[-120.88486328125,35.274951171874996],[-120.860302734375,35.3654296875],[-120.899609375,35.425097656249996],[-121.0228515625,35.480761718749996],[-121.137939453125,35.60712890625],[-121.283837890625,35.676318359374996],[-121.34384765625,35.792236328125],[-121.433740234375,35.8638671875],[-121.464990234375,35.927392578124994],[-121.66435546874999,36.154052734375],[-121.877392578125,36.3310546875],[-121.91015625,36.432910156249996],[-121.91865234375,36.57236328125],[-121.83515625,36.657470703125],[-121.789990234375,36.732275390625],[-121.79453125,36.8009765625],[-121.80742187499999,36.851220703124994],[-121.88066406249999,36.938916015625],[-122.164208984375,36.990966796875],[-122.394921875,37.20751953125],[-122.408447265625,37.37314453125],[-122.49921875,37.542626953124994],[-122.500439453125,37.652783203125],[-122.51420898437499,37.77197265625],[-122.44560546874999,37.797998046874994],[-122.38408203124999,37.788525390625],[-122.390283203125,37.741064453125],[-122.3697265625,37.655859375],[-122.297607421875,37.591845703124996],[-122.228662109375,37.563916015625],[-122.166015625,37.50166015625],[-122.11904296875,37.4828125],[-122.0705078125,37.478271484375],[-122.096533203125,37.518212890624994],[-122.12412109375,37.543798828125],[-122.158056640625,37.62646484375],[-122.22221679687499,37.73203125],[-122.29599609375,37.790332031249996],[-122.333447265625,37.89658203125],[-122.365478515625,37.921191406249996],[-122.38544921875,37.960595703124994],[-122.31425781249999,38.00732421875],[-122.217041015625,38.040625],[-122.08671874999999,38.049609375],[-121.71684570312499,38.034082031249994],[-121.6380859375,38.061279296875],[-121.572998046875,38.052392578124994],[-121.525341796875,38.055908203125],[-121.625732421875,38.083935546875],[-121.6822265625,38.0748046875],[-121.7486328125,38.08046875],[-121.88076171875,38.075],[-121.9341796875,38.086816406249994],[-121.993115234375,38.1201171875],[-122.031494140625,38.12353515625],[-122.153759765625,38.06552734375],[-122.20830078124999,38.072558593749996],[-122.337109375,38.135888671874994],[-122.39335937499999,38.144824218749996],[-122.48388671875,38.108837890625],[-122.49492187499999,37.953564453125],[-122.46689453125,37.838183593749996],[-122.521337890625,37.826416015625],[-122.5841796875,37.874072265624996],[-122.68071289062499,37.90234375],[-122.760400390625,37.945654296875],[-122.87294921875,38.02607421875],[-122.931982421875,38.05546875],[-122.998779296875,37.988623046875],[-123.00146484375,38.019287109375],[-122.9681640625,38.097021484375],[-122.97758789062499,38.22734375],[-122.876806640625,38.123339843749996],[-122.908154296875,38.196582031249996],[-122.9865234375,38.277099609375],[-123.04619140624999,38.305078125],[-123.12114257812499,38.449267578124996],[-123.28974609375,38.53583984375],[-123.4248046875,38.675634765625],[-123.701123046875,38.907275390624996],[-123.71953124999999,39.110986328124994],[-123.8203125,39.368408203125],[-123.777783203125,39.514941406249996],[-123.78349609374999,39.618701171874996],[-123.83291015625,39.77548828125],[-123.88447265625,39.860791015625],[-124.10849609375,40.09453125],[-124.32402343749999,40.251953125],[-124.35654296875,40.37109375],[-124.3716796875,40.4912109375],[-124.32451171874999,40.598095703125],[-124.28369140625,40.710546875],[-124.25390625,40.740283203124996],[-124.242333984375,40.727880859375],[-124.2505859375,40.70390625],[-124.22001953124999,40.696484375],[-124.208447265625,40.74609375],[-124.19023437499999,40.771728515625],[-124.222509765625,40.775048828124994],[-124.219189453125,40.79072265625],[-124.19990234375,40.822070312499996],[-124.13310546874999,40.969775390624996],[-124.1400390625,41.155908203124994],[-124.068505859375,41.384179687499994],[-124.071923828125,41.459521484374996],[-124.11767578125,41.621728515624994],[-124.163232421875,41.718994140625],[-124.24462890625,41.787939453125],[-124.208740234375,41.888574218749994],[-124.211669921875,41.984619140625],[-124.35527343749999,42.122900390625],[-124.410009765625,42.304345703124994],[-124.4205078125,42.381005859374994],[-124.40615234375,42.58369140625],[-124.443798828125,42.670214843749996],[-124.5396484375,42.812890625],[-124.49858398437499,42.936865234375],[-124.454443359375,43.012353515624994],[-124.34658203125,43.341650390625],[-124.32060546874999,43.368212890624996],[-124.27548828125,43.3673828125],[-124.196923828125,43.42333984375],[-124.233154296875,43.436376953125],[-124.28798828125,43.409716796874996],[-124.239208984375,43.5400390625],[-124.18437,43.6515625],[-124.14873046874999,43.691748046875],[-124.13066406249999,44.0556640625],[-124.09916992187499,44.333789062499996],[-124.0474609375,44.42548828125],[-124.0654296875,44.520068359374996],[-124.04453125,44.648242187499996],[-124.0591796875,44.777734375],[-123.948583984375,45.400830078125],[-123.9630859375,45.47607421875],[-123.929345703125,45.576953125],[-123.96123046874999,45.84296875],[-123.947119140625,46.140576171875],[-123.975244140625,46.1783203125],[-123.98930664062499,46.219384765624994],[-123.96293945312499,46.225439453125],[-123.91166992187499,46.182177734374996],[-123.67363281249999,46.1826171875],[-123.521630859375,46.22265625],[-123.46635742187499,46.209423828125],[-123.402294921875,46.15498046875],[-123.32158203124999,46.143994140625],[-123.22060546875,46.153613281249996],[-123.251318359375,46.167285156249996],[-123.298681640625,46.170849609375],[-123.404736328125,46.220996093749996],[-123.46484375,46.27109375],[-123.650341796875,46.267724609374994],[-123.68837890625,46.299853515624996],[-123.895703125,46.2677734375],[-123.95976562499999,46.300732421875],[-124.07275390625,46.279443359374994],[-124.0451171875,46.372900390625],[-124.0501953125,46.490527343749996],[-124.0443359375,46.605078125],[-124.01640624999999,46.521386718749994],[-123.946142578125,46.432568359375],[-123.91240234374999,46.533349609374994],[-123.88916015625,46.660009765625],[-123.95771484375,46.70869140625],[-124.0716796875,46.744775390624994],[-124.112548828125,46.862695312499994],[-123.84287109375,46.963183593749996],[-123.98603515625,46.98447265625],[-124.042236328125,47.0296875],[-124.11171875,47.035205078124996],[-124.116796875,47.000341796875],[-124.1392578125,46.9546875],[-124.16357421875,47.01533203125],[-124.1705078125,47.086669921875],[-124.198828125,47.208544921874996],[-124.30927734375,47.404589843749996],[-124.37602539062499,47.658642578125],[-124.46005859375,47.784228515624996],[-124.62109375,47.904150390625],[-124.6630859375,47.97412109375],[-124.70166015625,48.151660156249996],[-124.67998046874999,48.285888671875],[-124.7099609375,48.38037109375],[-124.63261718749999,48.375048828124996],[-124.429052734375,48.30078125],[-124.17548828125,48.242431640625],[-124.098779296875,48.2],[-123.97578125,48.16845703125],[-123.29443359375,48.11953125],[-123.24990234375,48.12421875],[-123.161865234375,48.154541015625],[-123.1244140625,48.150927734374996],[-123.02421874999999,48.081591796874996],[-122.973876953125,48.073291015624996],[-122.90888671875,48.076904296875],[-122.86088867187499,48.0900390625],[-122.77861328124999,48.137597656249994],[-122.767529296875,48.120019531249994],[-122.76909179687499,48.075976562499996],[-122.73974609375,48.013232421874996],[-122.67949218749999,47.931787109374994],[-122.656640625,47.881152343749996],[-122.77841796875,47.738427734374994],[-122.8017578125,47.7353515625],[-122.80537109375,47.783642578125],[-122.82138671875,47.7931640625],[-123.050634765625,47.551953125],[-123.1310546875,47.437744140625],[-123.1390625,47.386083984375],[-123.136328125,47.355810546875],[-123.10419921875,47.348388671875],[-123.030908203125,47.360205078125],[-122.92216796874999,47.407666015625],[-122.91689453125,47.41796875],[-123.018212890625,47.40107421875],[-123.066796875,47.399658203125],[-123.06015625,47.453662109374996],[-123.04863281249999,47.479345703125],[-122.98247070312499,47.559375],[-122.91289062499999,47.607373046875],[-122.8140625,47.658544921875],[-122.75712890624999,47.700537109375],[-122.71787109375,47.762109375],[-122.608154296875,47.835498046874996],[-122.587890625,47.85595703125],[-122.59267578125,47.91640625],[-122.58574218749999,47.927880859374994],[-122.5328125,47.919726562499996],[-122.51079101562499,47.815722656249996],[-122.52392578125,47.769335937499996],[-122.618408203125,47.712792968749994],[-122.63017578124999,47.692822265625],[-122.613623046875,47.615625],[-122.628271484375,47.608154296875],[-122.664306640625,47.617236328124996],[-122.67548828125,47.612353515624996],[-122.58583984375,47.52841796875],[-122.55742187499999,47.463183593749996],[-122.553564453125,47.404931640624994],[-122.577880859375,47.2931640625],[-122.60390625,47.274609375],[-122.6486328125,47.2814453125],[-122.70771484375,47.31640625],[-122.7208984375,47.305126953125],[-122.7677734375,47.218359375],[-122.78330078125,47.225976562499994],[-122.81254882812499,47.328955078125],[-122.828466796875,47.336572265624994],[-122.91953125,47.2896484375],[-122.956201171875,47.244580078125],[-122.987646484375,47.17255859375],[-123.027587890625,47.138916015625],[-122.91416015625,47.131494140624994],[-122.811962890625,47.14599609375],[-122.7298828125,47.11181640625],[-122.70195312499999,47.110888671874996],[-122.62705078125,47.14423828125],[-122.604150390625,47.1669921875],[-122.5421875,47.2755859375],[-122.511083984375,47.29501953125],[-122.46484375,47.295800781249994],[-122.4201171875,47.312109375],[-122.35380859374999,47.37158203125],[-122.35112304687499,47.39521484375],[-122.375244140625,47.528369140624996],[-122.368359375,47.60390625],[-122.38076171875,47.627832031249994],[-122.410498046875,47.652636718749996],[-122.40678710937499,47.6767578125],[-122.383642578125,47.716455078124994],[-122.381982421875,47.75234375],[-122.401806640625,47.78427734375],[-122.39287109374999,47.820556640625],[-122.330322265625,47.8986328125],[-122.31845703125,47.933056640625],[-122.24199218749999,48.0107421875],[-122.26127929687499,48.042041015624996],[-122.31748046875,48.08017578125],[-122.352978515625,48.113818359374996],[-122.388671875,48.166357421875],[-122.41582031249999,48.183935546875],[-122.42470703125,48.175927734374994],[-122.38662109375,48.08994140625],[-122.394775390625,48.084130859374994],[-122.49404296875,48.13046875],[-122.5169921875,48.15966796875],[-122.529150390625,48.19931640625],[-122.52031249999999,48.2291015625],[-122.467041015625,48.25849609375],[-122.40336914062499,48.269189453124994],[-122.408544921875,48.293896484375],[-122.488427734375,48.374316406249996],[-122.541650390625,48.4109375],[-122.58256835937499,48.428662109375],[-122.63779296875,48.43330078125],[-122.6625,48.44638671875],[-122.66899414062499,48.465234375],[-122.65727539062499,48.489990234375],[-122.62797851562499,48.497900390625],[-122.54267578125,48.48798828125],[-122.49677734375,48.50556640625],[-122.50107421875,48.5375],[-122.514794921875,48.55517578125],[-122.51274414062499,48.66943359375],[-122.5451171875,48.7623046875],[-122.56201171875,48.777978515624994],[-122.58017578125,48.779589843749996],[-122.59941406249999,48.76708984375],[-122.65302734375,48.7638671875],[-122.6859375,48.794287109375],[-122.72246093749999,48.85302734375],[-122.78876953125,48.993017578125],[-122.82670898437499,49.02841796875],[-122.924169921875,49.074658203125],[-122.96269531249999,49.074609375],[-123.002294921875,49.060888671875],[-123.02724609375,49.038525390625],[-123.04921875,48.993017578125],[-123.06328124999999,48.977734375],[-123.077294921875,48.980224609375],[-123.08642578125,48.993017578125],[-123.117626953125,49.05634765625],[-123.109326171875,49.084619140624994],[-123.077294921875,49.118359375],[-123.079541015625,49.130615234375],[-123.150146484375,49.121044921875],[-123.181884765625,49.1294921875],[-123.19633789062499,49.147705078125],[-123.191064453125,49.21953125],[-123.229443359375,49.260498046875],[-123.183935546875,49.277734375],[-123.06728515625,49.291552734374996],[-122.94765625,49.293261718749996],[-122.91298828125,49.323193359375],[-122.8791015625,49.39892578125],[-122.964453125,49.329345703125],[-123.01552734375,49.322167968749994],[-123.174267578125,49.348193359374996],[-123.2767578125,49.3439453125],[-123.29052734375,49.35947265625],[-123.286279296875,49.374951171875],[-123.2640625,49.390478515625],[-123.247705078125,49.443017578124994],[-123.222998046875,49.590478515624994],[-123.190673828125,49.644287109375],[-123.17958984375,49.67353515625],[-123.1875,49.680322265624994],[-123.325,49.577685546874996],[-123.336669921875,49.5451171875],[-123.322412109375,49.516992187499994],[-123.33564453125,49.4591796875],[-123.39897460937499,49.44189453125],[-123.436962890625,49.451318359374994],[-123.508203125,49.40244140625],[-123.53056640624999,49.397314453125],[-123.85893554687499,49.482861328125],[-123.891845703125,49.4947265625],[-123.948388671875,49.534716796874996],[-124.02861328124999,49.602880859375],[-124.05380859375,49.66171875],[-124.0240234375,49.711328125],[-123.992626953125,49.736181640625],[-123.95952148437499,49.736181640625],[-123.92275390625,49.717529296875],[-123.847119140625,49.636669921875],[-123.81718749999999,49.586572265624994],[-123.73906249999999,49.593554687499996],[-123.612744140625,49.657568359375],[-123.582470703125,49.68125],[-123.70830078124999,49.65693359375],[-123.7626953125,49.658496093749996],[-123.818017578125,49.68515625],[-123.8744140625,49.73681640625],[-123.90380859375,49.795458984374996],[-123.904248046875,49.98115234375],[-123.8849609375,50.017041015625],[-123.823828125,50.043701171875],[-123.78466796875,50.08798828125],[-123.7876953125,50.106738281249996],[-123.825439453125,50.14423828125],[-123.880126953125,50.173632812499996],[-123.93359375,50.18828125],[-123.9458984375,50.183935546875],[-123.863037109375,50.102587890624996],[-123.86572265625,50.072070312499996],[-123.957421875,49.9927734375],[-123.97138671875,49.96953125],[-123.972119140625,49.892041015625],[-123.98491210937499,49.8755859375],[-124.0587890625,49.853662109374994],[-124.1416015625,49.79267578125],[-124.28125,49.772119140624994],[-124.41259765625,49.778125],[-124.483251953125,49.808203125],[-124.702294921875,49.957666015624994],[-124.782373046875,50.0201171875],[-124.78427734375,50.072802734374996],[-124.9341796875,50.258056640625],[-124.933349609375,50.297900390624996],[-124.985595703125,50.355615234374994],[-125.043603515625,50.36376953125],[-125.05668945312499,50.41865234375],[-124.93681640624999,50.537402343749996],[-124.862646484375,50.6373046875],[-124.854248046875,50.66865234375],[-124.85751953125,50.717333984374996],[-124.875439453125,50.825634765625],[-124.85986328125,50.872412109375],[-124.93359375,50.810595703124996],[-124.94926757812499,50.764697265624996],[-124.9310546875,50.718408203124994],[-124.942529296875,50.665673828124994],[-124.98540039062499,50.591943359374994],[-125.0587890625,50.5138671875],[-125.20986328125,50.476318359375],[-125.476318359375,50.49716796875],[-125.507177734375,50.507275390625],[-125.5259765625,50.534130859375],[-125.53935546874999,50.6490234375],[-125.55556640625,50.63486328125],[-125.58583984375,50.573632812499994],[-125.61015624999999,50.48603515625],[-125.64130859375,50.466210937499994],[-125.69755859374999,50.46455078125],[-125.7412109375,50.478564453124996],[-125.772412109375,50.508203125],[-125.839599609375,50.510644531249994],[-125.9650390625,50.487353515624996],[-126.02412109375,50.496728515624994],[-126.0943359375,50.497607421874996],[-126.236572265625,50.523291015625],[-126.4044921875,50.5298828125],[-126.449951171875,50.549707031249994],[-126.4474609375,50.587744140625],[-126.41611328125,50.606982421874996],[-126.238916015625,50.623828125],[-126.067236328125,50.664306640625],[-125.897607421875,50.684375],[-125.90410156249999,50.704931640625],[-125.980712890625,50.711376953125],[-126.3703125,50.666748046875],[-126.49296874999999,50.672119140625],[-126.51435546875,50.67939453125],[-126.517333984375,50.724462890625],[-126.47221679687499,50.76728515625],[-126.397119140625,50.807080078125],[-126.374609375,50.837353515625],[-126.418212890625,50.8501953125],[-126.48818359375,50.841845703124996],[-126.52177734374999,50.866064453125],[-126.484619140625,50.960498046874996],[-126.517333984375,51.0568359375],[-126.562890625,50.965478515624994],[-126.631787109375,50.91513671875],[-126.960400390625,50.893701171874994],[-127.0140625,50.866796875],[-127.057568359375,50.867529296875],[-127.26748046875,50.916064453124996],[-127.35693359375,50.945556640625],[-127.44121093749999,50.989404296874994],[-127.59086914062499,51.087548828124994],[-127.70810546875,51.151171875],[-127.714306640625,51.26865234375],[-127.68916015625,51.34345703125],[-127.63271484375,51.427294921874996],[-127.419677734375,51.608056640625],[-127.34658203125,51.642382812499996],[-127.2806640625,51.654101562499996],[-126.968115234375,51.669921875],[-126.73540039062499,51.692626953125],[-126.69145507812499,51.703417968749996],[-127.03408203125,51.71669921875],[-127.338720703125,51.707373046875],[-127.442724609375,51.678955078125],[-127.57573242187499,51.562939453125],[-127.6095703125,51.5140625],[-127.644873046875,51.478466796875],[-127.668701171875,51.477587890624996],[-127.7140625,51.490185546875],[-127.7287109375,51.505517578124994],[-127.747509765625,51.5435546875],[-127.8189453125,51.60390625],[-127.850537109375,51.673193359375],[-127.869140625,51.775244140625],[-127.863232421875,51.82080078125],[-127.82998046875,51.87900390625],[-127.72763671875,51.993212890624996],[-127.8587890625,51.990283203124996],[-127.84331054687499,52.086474609374996],[-127.795361328125,52.191015625],[-127.67333984375,52.2529296875],[-127.54970703125,52.297607421875],[-127.437939453125,52.35615234375],[-127.24223632812499,52.3951171875],[-127.175732421875,52.31484375],[-127.007958984375,52.290673828125],[-126.95947265625,52.254541015625],[-126.9,52.188330078125],[-126.826318359375,52.125146484375],[-126.73857421874999,52.06494140625],[-126.71396484375,52.060693359375],[-126.75263671875,52.112353515624996],[-126.89521484375,52.22548828125],[-126.90141601562499,52.26533203125],[-126.93818359375,52.30859375],[-127.12705078125,52.370947265625],[-127.160595703125,52.394873046875],[-127.193994140625,52.457666015625],[-127.208251953125,52.4982421875],[-127.187109375,52.5376953125],[-126.99521484375,52.65791015625],[-126.951318359375,52.721240234374996],[-126.9513671875,52.751025390624996],[-126.96640625,52.78466796875],[-127.008251953125,52.842578125],[-127.01933593749999,52.84248046875],[-127.00639648437499,52.75458984375],[-127.01323242187499,52.719970703125],[-127.03486328125,52.68173828125],[-127.06621093749999,52.652685546875],[-127.107080078125,52.6328125],[-127.51923828125,52.35927734375],[-127.560302734375,52.343212890625],[-127.71337890625,52.318505859375],[-127.79189453125,52.289355468749996],[-127.834326171875,52.2509765625],[-127.902197265625,52.15087890625],[-127.99541015624999,51.950537109375],[-128.10224609375,51.788427734375],[-128.1935546875,51.998291015625],[-128.3576171875,52.15888671875],[-128.0375,52.318164062499996],[-128.029150390625,52.34248046875],[-128.060302734375,52.427539062499996],[-128.0515625,52.4533203125],[-128.0212890625,52.490673828125],[-127.94023437499999,52.545166015625],[-127.943359375,52.550732421875],[-128.038232421875,52.53115234375],[-128.183984375,52.40791015625],[-128.240966796875,52.36826171875],[-128.271533203125,52.36298828125],[-128.275146484375,52.435498046875],[-128.19677734375,52.623291015625],[-128.132373046875,52.805810546875],[-128.1087890625,52.858056640625],[-128.053271484375,52.910693359374996],[-128.10595703125,52.906884765625],[-128.3650390625,52.82578125],[-128.451953125,52.876611328125],[-128.52470703125,53.140673828124996],[-128.65234375,53.24384765625],[-128.8685546875,53.328125],[-129.080908203125,53.36728515625],[-129.129541015625,53.44228515625],[-129.17158203125,53.53359375],[-129.114453125,53.64111328125],[-129.021435546875,53.692138671875],[-128.935595703125,53.715185546875],[-128.85458984375,53.704541015625],[-128.850439453125,53.665185546875],[-128.905615234375,53.559326171875],[-128.833056640625,53.5494140625],[-128.542138671875,53.420654296875],[-128.47861328125,53.410302734375],[-128.358056640625,53.459814453125],[-128.291064453125,53.457861328125],[-128.13271484375,53.417773437499996],[-128.07919921875,53.369433593749996],[-127.92783203125,53.274707031249996],[-127.950048828125,53.329833984375],[-128.11513671875,53.445947265625],[-128.2072265625,53.483203125],[-128.369140625,53.490380859375],[-128.46962890625,53.4708984375],[-128.511767578125,53.4765625],[-128.600341796875,53.506103515625],[-128.675537109375,53.55458984375],[-128.75078125,53.66083984375],[-128.76787109375,53.710205078125],[-128.763671875,53.746875],[-128.745947265625,53.78017578125],[-128.71474609375,53.810009765625],[-128.652880859375,53.831640625],[-128.56044921875,53.845068359375],[-128.53212890625,53.85810546875],[-128.65087890625,53.91884765625],[-128.70478515625,53.918603515625],[-128.890185546875,53.82978515625],[-128.92783203125,53.822802734374996],[-128.943994140625,53.8400390625],[-128.959375,53.841455078125],[-129.01396484375,53.7974609375],[-129.056396484375,53.777783203125],[-129.20810546875,53.6416015625],[-129.23173828125,53.576416015625],[-129.24033203125,53.479052734374996],[-129.257861328125,53.41796875],[-129.28427734375,53.3931640625],[-129.46240234375,53.34658203125],[-129.563720703125,53.25146484375],[-129.68671875,53.333544921874996],[-129.82177734375,53.412744140625],[-129.911865234375,53.5513671875],[-130.074365234375,53.575634765625],[-130.26328125,53.654150390625],[-130.33525390625,53.723925781249996],[-130.232861328125,53.867431640625],[-130.0859375,53.97578125],[-130.063525390625,54.1056640625],[-130.043310546875,54.133544921875],[-129.790771484375,54.165771484375],[-129.626025390625,54.230273437499996],[-129.794970703125,54.236132812499996],[-129.8984375,54.226367187499996],[-130.084228515625,54.181396484375],[-130.29033203125,54.270361328125],[-130.39677734375,54.35166015625],[-130.4302734375,54.42099609375],[-130.39345703125,54.479638671875],[-130.388623046875,54.539355468749996],[-130.37001953125,54.62001953125],[-130.35048828125,54.655322265624996],[-130.3072265625,54.70029296875],[-130.2189453125,54.730273437499996],[-130.140869140625,54.82275390625],[-130.108642578125,54.887255859374996],[-129.94853515625,55.0810546875],[-129.89013671875,55.1646484375],[-129.78076171875,55.28046875],[-129.56064453125,55.462548828125],[-129.630126953125,55.45224609375],[-129.666650390625,55.436669921875],[-129.701318359375,55.43857421875],[-129.7341796875,55.4580078125],[-129.765478515625,55.4982421875],[-129.795166015625,55.5595703125],[-129.8119140625,55.5326171875],[-129.815625,55.417578125],[-129.837744140625,55.319091796875],[-129.8771484375,55.250634765625],[-129.985205078125,55.111474609375],[-130.048486328125,55.057275390625],[-130.091796875,55.107763671875],[-130.0583984375,55.194775390625],[-129.995849609375,55.2640625],[-129.98515625,55.358837890625],[-130.04404296875,55.471923828125],[-130.07998046875,55.562890625],[-130.09296875,55.6318359375],[-130.094677734375,55.694775390625],[-130.085107421875,55.751708984375],[-130.0603515625,55.813720703125],[-130.0203125,55.88076171875],[-130.02509765625,55.888232421874996],[-130.074658203125,55.83603515625],[-130.111962890625,55.77978515625],[-130.137060546875,55.719384765625],[-130.146533203125,55.6544921875],[-130.1404296875,55.585009765624996],[-130.12041015625,55.5244140625],[-130.05947265625,55.4123046875],[-130.0392578125,55.343603515625],[-130.036572265625,55.297900390624996],[-130.171826171875,55.137011718749996],[-130.218505859375,55.06025390625],[-130.2140625,55.02587890625],[-130.20390625,54.947021484375],[-130.3494140625,54.81455078125],[-130.535498046875,54.74873046875],[-130.575341796875,54.769677734375],[-130.6158203125,54.79091796875],[-130.849609375,54.8076171875],[-130.934619140625,54.950390625],[-130.9796875,55.061181640625],[-131.0478515625,55.157666015625],[-131.0458984375,55.17958984375],[-130.983935546875,55.243945312499996],[-130.750390625,55.29697265625],[-130.748193359375,55.318017578125],[-130.83505859375,55.332080078124996],[-130.85595703125,55.355126953125],[-130.87978515625,55.459521484374996],[-130.873388671875,55.551123046875],[-130.879638671875,55.61181640625],[-130.9185546875,55.735986328125],[-130.977001953125,55.811962890625],[-131.127685546875,55.96015625],[-131.140380859375,55.997509765625],[-131.0740234375,56.044384765625],[-131.032763671875,56.0880859375],[-131.28759765625,56.012109375],[-131.63525390625,55.9322265625],[-131.7841796875,55.8765625],[-131.815478515625,55.85419921875],[-131.826171875,55.8353515625],[-131.799072265625,55.7828125],[-131.803271484375,55.765966796875],[-131.83359375,55.734912109374996],[-131.86943359375,55.64716796875],[-131.94501953125,55.554150390625],[-131.9833984375,55.535009765625],[-132.118994140625,55.569775390625],[-132.155419921875,55.599560546875],[-132.2234375,55.721044921875],[-132.20751953125,55.75341796875],[-132.157958984375,55.7806640625],[-132.090673828125,55.83955078125],[-132.005712890625,55.930078125],[-131.84384765625,56.160107421875],[-131.738037109375,56.16123046875],[-131.5513671875,56.206787109375],[-131.84423828125,56.229638671875],[-131.887890625,56.241650390625],[-131.927294921875,56.272998046874996],[-131.9623046875,56.323681640625],[-132.021923828125,56.380078125],[-132.133251953125,56.399853515625],[-132.18203125,56.420654296875],[-132.25556640625,56.489111328125],[-132.30498046875,56.519873046875],[-132.33203125,56.557910156249996],[-132.336669921875,56.603125],[-132.357666015625,56.62587890625],[-132.434423828125,56.634130859375],[-132.475927734375,56.649658203125],[-132.487109375,56.76640625],[-132.639501953125,56.796435546874996],[-132.701953125,56.822265625],[-132.802197265625,56.895166015625],[-132.8298828125,56.930615234375],[-132.838818359375,56.960205078125],[-132.8142578125,57.04072265625],[-132.824609375,57.055810546875],[-132.913427734375,57.0474609375],[-133.465869140625,57.172167968749996],[-133.436669921875,57.336865234375],[-133.53896484375,57.554150390625],[-133.64873046875,57.64228515625],[-133.626953125,57.676513671875],[-133.603369140625,57.694677734375],[-133.55419921875,57.695068359375],[-133.342333984375,57.631103515625],[-133.142822265625,57.555126953125],[-133.117041015625,57.566210937499996],[-133.4357421875,57.72705078125],[-133.515478515625,57.775146484375],[-133.535205078125,57.832958984375],[-133.53642578125,57.8638671875],[-133.5111328125,57.880126953125],[-133.212060546875,57.865673828125],[-133.1943359375,57.877685546875],[-133.497412109375,57.924658203125],[-133.55937,57.924462890625],[-133.625732421875,57.856982421874996],[-133.657275390625,57.841015625],[-133.722314453125,57.84423828125],[-133.744140625,57.85458984375],[-133.82138671875,57.936376953125],[-133.894482421875,57.99326171875],[-134.031103515625,58.072167968749994],[-134.05673828125,58.128369140625],[-134.063330078125,58.211083984374994],[-134.045263671875,58.2892578125],[-133.933642578125,58.46787109375],[-133.888525390625,58.49873046875],[-133.8767578125,58.5181640625],[-133.9111328125,58.515234375],[-133.94384765625,58.498291015625],[-134.0361328125,58.41533203125],[-134.131201171875,58.279345703125],[-134.208837890625,58.232958984375],[-134.2576171875,58.244189453125],[-134.3314453125,58.299609375],[-134.48544921875,58.3671875],[-134.663623046875,58.384716796875],[-134.776123046875,58.453857421875],[-134.942529296875,58.6462890625],[-134.964794921875,58.7421875],[-134.9861328125,58.765625],[-135.07646484375,58.796777343749994],[-135.1318359375,58.84287109375],[-135.2173828125,59.076611328125],[-135.330322265625,59.2390625],[-135.358447265625,59.32490234375],[-135.34892578125,59.410058593749994],[-135.363671875,59.41943359375],[-135.4025390625,59.353076171875],[-135.412744140625,59.31845703125],[-135.48408203125,59.30869140625],[-135.416943359375,59.24150390625],[-135.400146484375,59.207910156249994],[-135.433740234375,59.210693359375],[-135.50234375,59.202294921874994],[-135.3861328125,59.087548828124994],[-135.33408203125,58.909619140625],[-135.25703125,58.777734375],[-135.207080078125,58.6708984375],[-135.1845703125,58.589746093749994],[-135.151904296875,58.51220703125],[-135.06201171875,58.340869140625],[-135.04970703125,58.306787109374994],[-135.060498046875,58.27890625],[-135.090234375,58.245849609375],[-135.141552734375,58.2333984375],[-135.3025390625,58.255908203125],[-135.363134765625,58.298291015625],[-135.449951171875,58.376123046874994],[-135.57177734375,58.412060546875],[-135.8734375,58.39423828125],[-135.89755859375,58.4001953125],[-135.896337890625,58.463818359375],[-135.86171875,58.577050781249994],[-135.88955078125,58.622705078124994],[-136.0455078125,58.789111328125],[-136.043115234375,58.821630859375],[-135.8263671875,58.89794921875],[-135.931689453125,58.903759765625],[-136.0166015625,58.873974609375],[-136.049365234375,58.893212890624994],[-136.100634765625,58.999853515625],[-136.13369140625,59.03955078125],[-136.150048828125,59.048095703125],[-136.15947265625,58.94677734375],[-136.12353515625,58.893457031249994],[-136.118408203125,58.86259765625],[-136.124169921875,58.81962890625],[-136.146826171875,58.788818359375],[-136.186328125,58.770166015624994],[-136.225830078125,58.765478515625],[-136.2990234375,58.7869140625],[-136.3802734375,58.827294921874994],[-136.451171875,58.846337890624994],[-136.477587890625,58.8625],[-136.511181640625,58.907080078125],[-136.5662109375,58.94091796875],[-136.83095703125,58.983837890625],[-136.989013671875,59.03447265625],[-137.0021484375,59.021142578124994],[-136.95283203125,58.966943359374994],[-136.948046875,58.934912109375],[-136.987890625,58.925146484375],[-137.059033203125,58.87373046875],[-137.03837890625,58.866650390625],[-136.963037109375,58.883544921875],[-136.8791015625,58.88154296875],[-136.74013671875,58.8501953125],[-136.613916015625,58.80927734375],[-136.568212890625,58.786328125],[-136.54931640625,58.752392578125],[-136.53349609375,58.740234375],[-136.410107421875,58.700634765625],[-136.40419921875,58.67978515625],[-136.483740234375,58.61767578125],[-136.319873046875,58.624462890625],[-136.224609375,58.60224609375],[-136.102880859375,58.506298828125],[-136.061474609375,58.452734375],[-136.05595703125,58.384179687499994],[-136.08125,58.364208984375],[-136.129638671875,58.350390625],[-136.46240234375,58.327978515625],[-136.5826171875,58.24521484375],[-136.607421875,58.243994140625],[-136.69892578125,58.266455078125],[-136.864990234375,58.332421875],[-137.071923828125,58.39521484375],[-137.543994140625,58.581201171874994],[-137.55693359375,58.58994140625],[-137.564599609375,58.625878906249994],[-137.5970703125,58.64423828125],[-137.661083984375,58.659912109375],[-137.75,58.707080078125],[-137.863720703125,58.785546875],[-137.933984375,58.846875],[-137.960888671875,58.891015625],[-138.026904296875,58.941455078125],[-138.24072265625,59.046826171875],[-138.352490234375,59.087304687499994],[-138.451318359375,59.110107421875],[-138.537158203125,59.115087890625],[-138.560302734375,59.129150390625],[-138.520703125,59.152246093749994],[-138.514892578125,59.165917968749994],[-138.70419921875,59.187548828125],[-138.884326171875,59.2369140625],[-139.340966796875,59.375634765624994],[-139.576806640625,59.462451171875],[-139.714453125,59.503955078125],[-139.773291015625,59.527294921875],[-139.79912109375,59.546240234375],[-139.766064453125,59.566064453124994],[-139.67412109375,59.586816406249994],[-139.61162109375,59.610302734375],[-139.513037109375,59.698095703125],[-139.50556640625,59.726318359375],[-139.55849609375,59.790185546874994],[-139.582177734375,59.848291015624994],[-139.58115234375,59.880517578124994],[-139.569140625,59.912353515625],[-139.5541015625,59.93330078125],[-139.5123046875,59.953564453125],[-139.4830078125,59.963769531249994],[-139.446875,59.9568359375],[-139.33095703125,59.877001953125],[-139.3146484375,59.84794921875],[-139.32001953125,59.738720703125],[-139.28671875,59.6109375],[-139.27626953125,59.620361328125],[-139.265625,59.66259765625],[-139.258740234375,59.743310546874994],[-139.245703125,59.782080078125],[-139.22080078125,59.819873046875],[-139.178857421875,59.83984375],[-139.048291015625,59.82822265625],[-138.9880859375,59.835009765625],[-139.24248046875,59.8927734375],[-139.402490234375,60.0009765625],[-139.4314453125,60.012255859375],[-139.5189453125,60.01708984375],[-139.611669921875,59.9734375],[-139.8501953125,59.830712890624994],[-139.91689453125,59.8056640625],[-140.216748046875,59.72666015625],[-140.41982421875,59.7107421875],[-140.648388671875,59.723193359375],[-140.8431640625,59.748876953125],[-141.33193359375,59.873779296875],[-141.40830078125,59.902783203125],[-141.29462890625,59.980029296875],[-141.28994140625,60.004150390625],[-141.329541015625,60.0828125],[-141.362158203125,60.1052734375],[-141.408740234375,60.11767578125],[-141.4216796875,60.108837890625],[-141.42216796875,60.085498046875],[-141.409716796875,60.04228515625],[-141.4470703125,60.019433593749994],[-141.53017578125,59.994775390624994],[-141.670166015625,59.969873046874994],[-142.1041015625,60.033447265625],[-142.548583984375,60.08603515625],[-142.945654296875,60.09697265625],[-143.506103515625,60.055029296875],[-143.805078125,60.012890625],[-143.9794921875,60.0087890625],[-144.147216796875,60.01640625],[-144.1609375,60.045800781249994],[-144.08427734375,60.063037109375],[-144.088525390625,60.084326171875],[-144.185498046875,60.150732421875],[-144.3326171875,60.191015625],[-144.52998046875,60.205224609374994],[-144.64296875,60.224658203125],[-144.67158203125,60.24921875],[-144.74140625,60.272705078125],[-144.85244140625,60.295068359374994],[-144.901318359375,60.33515625],[-144.862451171875,60.4591796875],[-144.8244140625,60.53359375],[-144.786572265625,60.584619140624994],[-144.69111328125,60.669091796874994],[-144.7244140625,60.662841796875],[-144.8630859375,60.60087890625],[-144.984033203125,60.5369140625],[-145.09599609375,60.453662109375],[-145.1626953125,60.415380859375],[-145.248291015625,60.380126953125],[-145.381787109375,60.388574218749994],[-145.563134765625,60.44072265625],[-145.71845703125,60.467578125],[-145.84775390625,60.46923828125],[-145.898876953125,60.478173828124994],[-145.81064453125,60.524658203125],[-145.759814453125,60.56201171875],[-145.690234375,60.621972656249994],[-145.67490234375,60.651123046875],[-146.1490234375,60.660693359375],[-146.16640625,60.692285156249994],[-146.16708984375,60.71552734375],[-146.18232421875,60.734765625],[-146.251025390625,60.749072265625],[-146.34716796875,60.738134765625],[-146.502978515625,60.70078125],[-146.570458984375,60.729150390624994],[-146.54638671875,60.7451171875],[-146.4955078125,60.756787109375],[-146.3919921875,60.81083984375],[-146.53193359375,60.8388671875],[-146.603564453125,60.870947265625],[-146.638427734375,60.897314453125],[-146.63603515625,60.992529296875],[-146.59912109375,61.053515625],[-146.284912109375,61.112646484375],[-146.384375,61.13583984375],[-146.58271484375,61.127832031249994],[-146.71591796875,61.077539062499994],[-146.8740234375,61.0048828125],[-146.98017578125,60.977783203125],[-147.034326171875,60.99619140625],[-147.10595703125,61.0025390625],[-147.19501953125,60.996826171875],[-147.2548828125,60.978271484375],[-147.285595703125,60.94677734375],[-147.32109375,60.92548828125],[-147.361376953125,60.914501953125],[-147.390576171875,60.918017578125],[-147.4333984375,60.95029296875],[-147.523291015625,60.9703125],[-147.56728515625,60.994921875],[-147.592578125,60.979443359375],[-147.623291015625,60.933007812499994],[-147.6556640625,60.909521484375],[-147.8076171875,60.885400390624994],[-147.89111328125,60.889892578125],[-147.990771484375,60.948291015625],[-148.005126953125,60.9685546875],[-147.97119140625,61.01904296875],[-147.75185546875,61.2189453125],[-147.773779296875,61.217822265625],[-147.84482421875,61.186376953125],[-147.986376953125,61.106494140625],[-148.0494140625,61.082666015624994],[-148.15791015625,61.0796875],[-148.20869140625,61.08828125],[-148.27001953125,61.081787109375],[-148.34189453125,61.060400390625],[-148.38876953125,61.036962890625],[-148.4107421875,61.011474609375],[-148.395849609375,61.00712890625],[-148.28740234375,61.03623046875],[-148.22587890625,61.04404296875],[-148.20869140625,61.029931640624994],[-148.2931640625,60.939697265625],[-148.34443359375,60.853564453125],[-148.393310546875,60.831884765625],[-148.471044921875,60.835498046875],[-148.55615234375,60.827001953125],[-148.557373046875,60.8029296875],[-148.398681640625,60.734033203124994],[-148.341259765625,60.72431640625],[-148.26787109375,60.69970703125],[-148.25673828125,60.67529296875],[-148.284228515625,60.609326171875],[-148.30498046875,60.583349609375],[-148.338427734375,60.56982421875],[-148.4677734375,60.5720703125],[-148.5095703125,60.565234375],[-148.596630859375,60.523779296875],[-148.64013671875,60.489453125],[-148.624267578125,60.48642578125],[-148.54912109375,60.514794921874994],[-148.43984375,60.52998046875],[-148.29638671875,60.532080078125],[-148.189453125,60.547119140625],[-148.119189453125,60.575146484375],[-148.05068359375,60.5671875],[-147.984033203125,60.523339843749994],[-147.964111328125,60.48486328125],[-147.990966796875,60.45185546875],[-148.04599609375,60.4283203125],[-148.12919921875,60.414208984374994],[-148.181689453125,60.39306640625],[-148.203564453125,60.36494140625],[-148.215869140625,60.323144531249994],[-148.21865234375,60.26767578125],[-148.197607421875,60.1677734375],[-148.21376953125,60.154248046875],[-148.24501953125,60.146826171875],[-148.291357421875,60.145458984375],[-148.33310546875,60.122021484375],[-148.430712890625,59.989111328125],[-148.465087890625,59.97470703125],[-148.5060546875,59.98896484375],[-148.5423828125,59.98740234375],[-148.574072265625,59.970068359375],[-148.643603515625,59.9568359375],[-148.75087890625,59.94775390625],[-148.842724609375,59.951220703125],[-149.004248046875,59.97998046875],[-149.0701171875,60.000244140625],[-149.12158203125,60.03349609375],[-149.2666015625,59.998291015625],[-149.304931640625,60.013671875],[-149.395263671875,60.10576171875],[-149.41484375,60.100244140624994],[-149.4322265625,60.001025390625],[-149.459716796875,59.966259765625],[-149.549169921875,59.8943359375],[-149.598046875,59.770458984375],[-149.612890625,59.766845703125],[-149.629638671875,59.78466796875],[-149.68466796875,59.8953125],[-149.7138671875,59.919580078124994],[-149.794775390625,59.855810546875],[-149.803662109375,59.83271484375],[-149.782470703125,59.750341796875],[-149.80126953125,59.737939453124994],[-149.964990234375,59.782275390625],[-150.005322265625,59.784423828125],[-150.015966796875,59.776953125],[-149.96015625,59.713037109374994],[-149.96650390625,59.6900390625],[-150.198046875,59.566552734374994],[-150.25849609375,59.570947265624994],[-150.296484375,59.583251953125],[-150.338134765625,59.58134765625],[-150.4853515625,59.535302734374994],[-150.5259765625,59.5373046875],[-150.58154296875,59.564599609374994],[-150.607373046875,59.563378906249994],[-150.621142578125,59.535058593749994],[-150.622900390625,59.479638671874994],[-150.67744140625,59.426953125],[-150.852783203125,59.341845703125],[-150.89931640625,59.302685546875],[-150.934521484375,59.24912109375],[-150.9607421875,59.243994140625],[-151.06357421875,59.27841796875],[-151.182763671875,59.30078125],[-151.19921875,59.2896484375],[-151.163037109375,59.25693359375],[-151.170703125,59.2369140625],[-151.222265625,59.229394531249994],[-151.2875,59.232324218749994],[-151.366357421875,59.24560546875],[-151.477001953125,59.23056640625],[-151.619384765625,59.1873046875],[-151.73818359375,59.188525390625],[-151.903857421875,59.259765625],[-151.94951171875,59.265087890625],[-151.9640625,59.285107421875],[-151.931689453125,59.342724609375],[-151.884619140625,59.386328125],[-151.849951171875,59.40634765625],[-151.692578125,59.46220703125],[-151.5126953125,59.48271484375],[-151.399609375,59.51630859375],[-151.262109375,59.585595703124994],[-151.189404296875,59.6376953125],[-151.046484375,59.771826171875],[-151.05732421875,59.782177734375],[-151.089453125,59.789404296875],[-151.403662109375,59.662255859374994],[-151.45009765625,59.650390625],[-151.51259765625,59.651269531249994],[-151.763818359375,59.7],[-151.816943359375,59.7208984375],[-151.85322265625,59.782080078125],[-151.783447265625,59.921142578125],[-151.734521484375,59.988330078125],[-151.611865234375,60.092041015625],[-151.45146484375,60.20263671875],[-151.39599609375,60.274462890625],[-151.3126953125,60.466455078124994],[-151.317529296875,60.553564453125],[-151.355029296875,60.65986328125],[-151.3564453125,60.72294921875],[-151.32177734375,60.742919921875],[-150.953759765625,60.841210937499994],[-150.7794921875,60.914794921875],[-150.441259765625,61.023583984374994],[-150.34912109375,61.02265625],[-150.281494140625,60.985205078125],[-150.202783203125,60.955224609374994],[-150.113037109375,60.9328125],[-149.99755859375,60.93515625],[-149.85625,60.962255859375],[-149.632470703125,60.952001953125],[-149.1728515625,60.880419921875],[-149.07509765625,60.876416015625],[-149.0712890625,60.885546875],[-149.142236328125,60.935693359374994],[-149.459130859375,60.964746093749994],[-149.59248046875,60.99384765625],[-149.967724609375,61.121728515624994],[-150.053271484375,61.17109375],[-150.0185546875,61.194238281249994],[-149.9267578125,61.21328125],[-149.8953125,61.23173828125],[-149.88203125,61.263720703125],[-149.82919921875,61.307519531249994],[-149.7369140625,61.363330078125],[-149.59599609375,61.41728515625],[-149.329052734375,61.49736328125],[-149.433544921875,61.50078125],[-149.625439453125,61.48603515625],[-149.695263671875,61.470703125],[-149.82373046875,61.41337890625],[-149.873681640625,61.372998046875],[-149.94521484375,61.29423828125],[-149.97568359375,61.279345703125],[-150.108935546875,61.267919921875],[-150.47177734375,61.2599609375],[-150.533203125,61.300244140625],[-150.567236328125,61.306787109374994],[-150.612255859375,61.301123046875],[-150.9455078125,61.1982421875],[-151.064990234375,61.145703125],[-151.150146484375,61.085839843749994],[-151.281884765625,61.041943359375],[-151.460107421875,61.014111328125],[-151.593505859375,60.979638671874994],[-151.733984375,60.9107421875],[-151.781640625,60.857958984375],[-151.784423828125,60.833154296874994],[-151.75048828125,60.7548828125],[-151.785107421875,60.740234375],[-151.866162109375,60.73408203125],[-151.996240234375,60.6822265625],[-152.270703125,60.528125],[-152.306591796875,60.472216796875],[-152.305078125,60.453027343749994],[-152.260302734375,60.409423828125],[-152.29150390625,60.381103515625],[-152.36884765625,60.336328125],[-152.54091796875,60.2654296875],[-152.653955078125,60.238427734374994],[-152.727294921875,60.237060546875],[-152.797900390625,60.24716796875],[-152.923388671875,60.292871093749994],[-153.025,60.295654296875],[-153.03125,60.2892578125],[-152.892919921875,60.240380859374994],[-152.752392578125,60.177490234375],[-152.66474609375,60.12529296875],[-152.630126953125,60.0837890625],[-152.628564453125,60.04111328125],[-152.660107421875,59.997216796874994],[-152.75947265625,59.9208984375],[-152.85693359375,59.898095703124994],[-153.1060546875,59.875048828125],[-153.186376953125,59.856884765625],[-153.21123046875,59.842724609375],[-153.040087890625,59.810498046875],[-153.024609375,59.793994140625],[-153.04814453125,59.730029296875],[-153.093603515625,59.709130859374994],[-153.236181640625,59.670947265625],[-153.364013671875,59.65986328125],[-153.38349609375,59.6671875],[-153.359619140625,59.71748046875],[-153.366455078125,59.729833984375],[-153.414404296875,59.740136718749994],[-153.4826171875,59.720947265625],[-153.6525390625,59.647021484375],[-153.670703125,59.634814453125],[-153.609375,59.6150390625],[-153.622265625,59.598486328125],[-153.71435546875,59.545263671875],[-153.752587890625,59.50986328125],[-153.81416015625,59.47373046875],[-154.088330078125,59.36328125],[-154.06748046875,59.336376953125],[-154.138818359375,59.240136718749994],[-154.1783203125,59.15556640625],[-154.129833984375,59.119873046875],[-153.899560546875,59.078027343749994],[-153.787939453125,59.067919921875],[-153.656396484375,59.038671875],[-153.41826171875,58.9599609375],[-153.33896484375,58.908544921875],[-153.32705078125,58.884326171875],[-153.334423828125,58.857861328125],[-153.362939453125,58.822216796875],[-153.43759765625,58.754833984375],[-153.617333984375,58.654736328125],[-153.698583984375,58.626367187499994],[-153.821484375,58.6041015625],[-153.861962890625,58.587841796875],[-154.019873046875,58.49296875],[-154.062451171875,58.441748046875],[-154.055712890625,58.39716796875],[-154.085888671875,58.3658203125],[-154.289013671875,58.304345703124994],[-154.281787109375,58.29345703125],[-154.208056640625,58.28876953125],[-154.235107421875,58.234619140625],[-154.247021484375,58.159423828125],[-154.282275390625,58.14677734375],[-154.409228515625,58.147314453125],[-154.57060546875,58.118066406249994],[-154.58193359375,58.109765625],[-154.584912109375,58.0556640625],[-155.006884765625,58.016064453125],[-155.099267578125,57.913330078125],[-155.14736328125,57.8818359375],[-155.312744140625,57.80712890625],[-155.41396484375,57.77705078125],[-155.529638671875,57.75888671875],[-155.590234375,57.73359375],[-155.595849609375,57.70107421875],[-155.6287109375,57.673046875],[-155.728955078125,57.626611328125],[-155.777978515625,57.568212890625],[-155.813671875,57.559033203125],[-156.0001953125,57.544970703124996],[-156.037353515625,57.526513671875],[-156.05537109375,57.447558593749996],[-156.089892578125,57.445068359375],[-156.156005859375,57.463427734374996],[-156.2421875,57.44921875],[-156.435888671875,57.3599609375],[-156.47841796875,57.327880859375],[-156.473681640625,57.310693359375],[-156.4435546875,57.29365234375],[-156.39765625,57.240576171875],[-156.40048828125,57.204833984375],[-156.475146484375,57.10517578125],[-156.501318359375,57.089794921875],[-156.592041015625,57.065087890625],[-156.62900390625,57.0099609375],[-156.712646484375,57.016064453125],[-156.7798828125,57.005615234375],[-156.823876953125,56.96884765625],[-156.871728515625,56.94765625],[-156.9234375,56.94208984375],[-156.988427734375,56.912939453125],[-157.06669921875,56.860205078125],[-157.13916015625,56.8265625],[-157.20576171875,56.812060546874996],[-157.270556640625,56.80849609375],[-157.33359375,56.815869140625],[-157.390234375,56.809814453125],[-157.440576171875,56.790332031249996],[-157.4896484375,56.759765625],[-157.5287109375,56.673193359375],[-157.578369140625,56.63447265625],[-157.609765625,56.627685546875],[-157.673876953125,56.633447265625],[-157.770703125,56.651660156249996],[-157.869091796875,56.64521484375],[-158.027880859375,56.592138671875],[-158.0783203125,56.552050781249996],[-157.978271484375,56.5431640625],[-157.9287109375,56.531689453125],[-157.92998046875,56.520458984375],[-157.982177734375,56.509570312499996],[-158.070947265625,56.5103515625],[-158.124365234375,56.501025390624996],[-158.189404296875,56.478173828125],[-158.352490234375,56.453515625],[-158.414404296875,56.435839843749996],[-158.53740234375,56.33544921875],[-158.5521484375,56.3126953125],[-158.536376953125,56.307666015624996],[-158.467333984375,56.31826171875],[-158.3861328125,56.3015625],[-158.343994140625,56.280322265624996],[-158.3169921875,56.254150390625],[-158.29140625,56.203662109374996],[-158.275634765625,56.196240234375],[-158.4318359375,56.111474609375],[-158.476123046875,56.075488281249996],[-158.5046875,56.062109375],[-158.52333984375,56.0724609375],[-158.54267578125,56.166845703125],[-158.554443359375,56.182861328125],[-158.591162109375,56.184521484375],[-158.6267578125,56.1546875],[-158.7048828125,56.043115234375],[-158.78984375,55.9869140625],[-159.429443359375,55.842724609375],[-159.5232421875,55.810009765625],[-159.54130859375,55.748486328125],[-159.567626953125,55.69521484375],[-159.61005859375,55.652783203125],[-159.65966796875,55.625927734375],[-159.670263671875,55.64501953125],[-159.66533203125,55.794873046875],[-159.678515625,55.824658203125],[-159.743017578125,55.84375],[-159.77138671875,55.841113281249996],[-159.810400390625,55.83271484375],[-159.874365234375,55.80029296875],[-159.913525390625,55.7921875],[-159.9623046875,55.794873046875],[-160.045654296875,55.762939453125],[-160.243798828125,55.660546875],[-160.373193359375,55.635107421875],[-160.407421875,55.613818359374996],[-160.4626953125,55.5578125],[-160.49931640625,55.5373046875],[-160.553515625,55.535498046875],[-160.625244140625,55.552392578125],[-160.68291015625,55.5404296875],[-160.726513671875,55.499658203125],[-160.770849609375,55.483544921875],[-160.896728515625,55.513623046875],[-160.952197265625,55.49306640625],[-161.02421875,55.4404296875],[-161.09951171875,55.405712890625],[-161.17802734375,55.3888671875],[-161.38193359375,55.3712890625],[-161.4638671875,55.38251953125],[-161.480517578125,55.397802734375],[-161.476708984375,55.464892578124996],[-161.443798828125,55.51328125],[-161.413330078125,55.5361328125],[-161.372705078125,55.556298828125],[-161.31328125,55.558642578124996],[-161.202099609375,55.5435546875],[-161.214697265625,55.559765625],[-161.255126953125,55.57900390625],[-161.357470703125,55.61220703125],[-161.4587890625,55.629150390625],[-161.516943359375,55.618408203125],[-161.598779296875,55.592822265624996],[-161.654296875,55.56337890625],[-161.683544921875,55.529931640625],[-161.720361328125,55.420703125],[-161.741552734375,55.391162109374996],[-161.980322265625,55.1986328125],[-162.073974609375,55.139306640625],[-162.1666015625,55.14375],[-162.211474609375,55.121337890625],[-162.274658203125,55.0732421875],[-162.33291015625,55.050244140625],[-162.386376953125,55.05234375],[-162.4279296875,55.061474609375],[-162.457470703125,55.077685546874996],[-162.452392578125,55.092822265624996],[-162.412548828125,55.106884765625],[-162.426806640625,55.14541015625],[-162.495263671875,55.208447265625],[-162.54189453125,55.242724609374996],[-162.63037109375,55.2466796875],[-162.644140625,55.218017578125],[-162.614306640625,55.071484375],[-162.618896484375,55.038427734375],[-162.674365234375,54.99658203125],[-162.819580078125,54.95],[-162.8650390625,54.954541015625],[-162.9958984375,55.046484375],[-163.11962890625,55.064697265625],[-163.12783203125,55.034765625],[-163.1001953125,54.9736328125],[-163.131103515625,54.916552734374996],[-163.220556640625,54.86337890625],[-163.288623046875,54.83759765625],[-163.335302734375,54.839160156249996],[-163.337890625,54.8763671875],[-163.296337890625,54.949267578124996],[-163.285693359375,55.0099609375],[-163.30595703125,55.058544921875],[-163.303662109375,55.095849609375],[-163.27880859375,55.121826171875],[-163.114501953125,55.1939453125],[-163.045361328125,55.204736328125],[-163.008251953125,55.186865234375],[-162.961962890625,55.183837890625],[-162.906591796875,55.195556640625],[-162.87158203125,55.218603515625],[-162.85712890625,55.25302734375],[-162.78623046875,55.2970703125],[-162.658984375,55.35078125],[-162.51337890625,55.45],[-162.349365234375,55.5947265625],[-162.15712890625,55.71943359375],[-161.93662109375,55.824169921875],[-161.697314453125,55.9072265625],[-161.21562,56.021435546875],[-161.17861328125,56.014453125],[-161.22255859375,55.97744140625],[-161.192529296875,55.954296875],[-161.145166015625,55.951318359375],[-160.96865234375,55.96962890625],[-160.8986328125,55.99365234375],[-160.87783203125,55.970507812499996],[-160.902392578125,55.94130859375],[-161.0083984375,55.91171875],[-161.00537109375,55.887158203125],[-160.851318359375,55.771875],[-160.80283203125,55.754443359374996],[-160.76259765625,55.756591796875],[-160.7455078125,55.771484375],[-160.7583984375,55.854638671875],[-160.70634765625,55.870458984375],[-160.59970703125,55.874316406249996],[-160.530224609375,55.8634765625],[-160.497900390625,55.837890625],[-160.4369140625,55.816699218749996],[-160.347314453125,55.79990234375],[-160.29169921875,55.805078125],[-160.2701171875,55.832177734375],[-160.30849609375,55.864453125],[-160.4798828125,55.93544921875],[-160.52744140625,55.9650390625],[-160.5390625,56.006298828125],[-160.514697265625,56.059130859374996],[-160.46083984375,56.1375],[-160.377490234375,56.241455078125],[-160.30205078125,56.314111328125],[-160.149267578125,56.396337890625],[-160.046240234375,56.43701171875],[-159.78505859375,56.56162109375],[-159.28310546875,56.68857421875],[-159.159033203125,56.770068359374996],[-158.990380859375,56.86005859375],[-158.918017578125,56.882177734375],[-158.918017578125,56.847412109375],[-158.894873046875,56.81640625],[-158.782080078125,56.795751953125],[-158.708837890625,56.78857421875],[-158.675146484375,56.794873046875],[-158.66591796875,56.827929687499996],[-158.6810546875,56.887744140624996],[-158.684814453125,56.94423828125],[-158.67724609375,56.997363281249996],[-158.660791015625,57.039404296875],[-158.585595703125,57.1140625],[-158.47373046875,57.199072265625],[-158.320947265625,57.297900390624996],[-158.22451171875,57.34267578125],[-158.133544921875,57.36640625],[-158.045703125,57.409472656249996],[-157.8943359375,57.511376953125],[-157.845751953125,57.528076171875],[-157.73720703125,57.548144531249996],[-157.697412109375,57.5392578125],[-157.6740234375,57.513720703124996],[-157.645556640625,57.497802734375],[-157.535302734375,57.483447265624996],[-157.4619140625,57.506201171875],[-157.473876953125,57.518212890625],[-157.53349609375,57.52587890625],[-157.571630859375,57.540673828125],[-157.607568359375,57.60146484375],[-157.6806640625,57.6380859375],[-157.697216796875,57.679443359375],[-157.683984375,57.743896484375],[-157.62119140625,57.89521484375],[-157.610888671875,58.050830078125],[-157.555029296875,58.13994140625],[-157.44267578125,58.17216796875],[-157.193701171875,58.194189453125],[-157.339404296875,58.234521484374994],[-157.393603515625,58.234814453125],[-157.48837890625,58.2537109375],[-157.5244140625,58.350732421874994],[-157.5236328125,58.421337890625],[-157.460888671875,58.50302734375],[-157.228857421875,58.64091796875],[-156.974658203125,58.736328125],[-157.009033203125,58.744189453125],[-157.040478515625,58.77255859375],[-156.9232421875,58.963671875],[-156.80888671875,59.13427734375],[-156.96337890625,58.9888671875],[-157.142041015625,58.87763671875],[-157.66572265625,58.748486328125],[-158.021923828125,58.640185546875],[-158.19091796875,58.6142578125],[-158.302587890625,58.641796875],[-158.3896484375,58.745654296875],[-158.439306640625,58.782617187499994],[-158.503173828125,58.850341796875],[-158.47626953125,58.938378906249994],[-158.425634765625,58.99931640625],[-158.314501953125,59.009326171875],[-158.189208984375,58.979931640625],[-158.080517578125,58.977441406249994],[-158.22060546875,59.0375],[-158.422802734375,59.08984375],[-158.514404296875,59.0728515625],[-158.58447265625,58.98779296875],[-158.678271484375,58.92939453125],[-158.760595703125,58.950097656249994],[-158.80947265625,58.973876953125],[-158.775537109375,58.9025390625],[-158.837744140625,58.7939453125],[-158.861376953125,58.71875],[-158.772119140625,58.5203125],[-158.788623046875,58.440966796875],[-158.95068359375,58.404541015625],[-159.082666015625,58.469775390625],[-159.358203125,58.7212890625],[-159.45419921875,58.792919921875],[-159.670263671875,58.9111328125],[-159.741455078125,58.894287109375],[-159.8322265625,58.835986328125],[-159.92021484375,58.819873046875],[-160.152587890625,58.905908203124994],[-160.260791015625,58.971533203125],[-160.363134765625,59.051171875],[-160.519921875,59.00732421875],[-160.656640625,58.955078125],[-160.81708984375,58.8716796875],[-160.924267578125,58.872412109375],[-161.21591796875,58.8009765625],[-161.246826171875,58.799462890624994],[-161.287890625,58.7609375],[-161.328125,58.743701171875],[-161.361328125,58.66953125],[-161.75546875,58.61201171875],[-162.144921875,58.64423828125],[-162.00869140625,58.685009765625],[-161.856494140625,58.71708984375],[-161.724365234375,58.794287109375],[-161.780517578125,58.897412109375],[-161.790283203125,58.949951171875],[-161.788671875,59.01640625],[-161.644384765625,59.10966796875],[-161.794482421875,59.10947265625],[-161.890771484375,59.076074218749994],[-161.9810546875,59.146142578124994],[-162.023291015625,59.283984375],[-161.9201171875,59.365478515625],[-161.872216796875,59.428271484375],[-161.831689453125,59.514501953125],[-161.8287109375,59.588623046875],[-161.908642578125,59.714111328125],[-162.138134765625,59.980029296875],[-162.24248046875,60.1783203125],[-162.421337890625,60.283984375],[-162.28779296875,60.456884765625],[-162.1388671875,60.61435546875],[-161.94658203125,60.684814453125],[-161.96201171875,60.695361328125],[-162.06826171875,60.694873046875],[-162.138037109375,60.685546875],[-162.19990234375,60.634326171875],[-162.2650390625,60.59521484375],[-162.468701171875,60.394677734374994],[-162.59970703125,60.29697265625],[-162.6849609375,60.268945312499994],[-162.547705078125,60.2310546875],[-162.526953125,60.199121093749994],[-162.50048828125,60.1265625],[-162.53564453125,60.03837890625],[-162.570751953125,59.98974609375],[-162.7326171875,59.99365234375],[-162.87783203125,59.922753906249994],[-163.219384765625,59.845605468749994],[-163.68037109375,59.801513671875],[-163.906884765625,59.806787109374994],[-164.142822265625,59.89677734375],[-164.14111328125,59.948876953124994],[-164.13154296875,59.99423828125],[-164.4705078125,60.149316406249994],[-164.662255859375,60.30380859375],[-164.799951171875,60.3072265625],[-164.9197265625,60.3484375],[-165.0611328125,60.412548828125],[-165.04873046875,60.464257812499994],[-165.026513671875,60.500634765624994],[-165.11328125,60.52607421875],[-165.22451171875,60.523583984374994],[-165.35380859375,60.5412109375],[-165.016015625,60.7400390625],[-164.8998046875,60.87314453125],[-164.80517578125,60.892041015625],[-164.682373046875,60.871533203125],[-164.512939453125,60.81904296875],[-164.370068359375,60.7958984375],[-164.318505859375,60.7712890625],[-164.265673828125,60.724658203125],[-164.32138671875,60.646630859374994],[-164.37236328125,60.591845703125],[-164.30966796875,60.60673828125],[-164.1318359375,60.69150390625],[-163.999560546875,60.766064453125],[-163.9361328125,60.75830078125],[-163.894921875,60.745166015625],[-163.82138671875,60.66826171875],[-163.72998046875,60.589990234374994],[-163.5287109375,60.66455078125],[-163.420947265625,60.757421875],[-163.511865234375,60.79814453125],[-163.623046875,60.822216796875],[-163.90654296875,60.85380859375],[-163.8373046875,60.880419921875],[-163.655419921875,60.877490234375],[-163.5869140625,60.902978515624994],[-163.658935546875,60.938232421875],[-163.7490234375,60.9697265625],[-163.99462890625,60.864697265625],[-164.441552734375,60.869970703125],[-164.753955078125,60.931298828124994],[-165.065625,60.920654296875],[-165.11484375,60.9328125],[-165.17548828125,60.965673828125],[-164.99990234375,61.04365234375],[-164.8755859375,61.086767578125],[-164.868994140625,61.111767578125],[-164.9412109375,61.114892578124994],[-165.077099609375,61.094189453125],[-165.1376953125,61.130126953125],[-165.127783203125,61.192431640625],[-165.150048828125,61.186865234375],[-165.203759765625,61.15283203125],[-165.27978515625,61.16962890625],[-165.344873046875,61.197705078125],[-165.310791015625,61.22763671875],[-165.2439453125,61.26875],[-165.2736328125,61.274853515625],[-165.33369140625,61.26611328125],[-165.392041015625,61.212304687499994],[-165.379296875,61.16875],[-165.38076171875,61.106298828125],[-165.48046875,61.094873046874994],[-165.565869140625,61.10234375],[-165.627587890625,61.165185546874994],[-165.691357421875,61.29990234375],[-165.86396484375,61.335693359375],[-165.906298828125,61.40380859375],[-165.797119140625,61.491162109375],[-165.8453125,61.53623046875],[-165.961328125,61.55087890625],[-166.093994140625,61.506738281249994],[-166.152734375,61.545947265625],[-166.163525390625,61.589013671874994],[-166.168115234375,61.650830078125],[-166.13115234375,61.65732421875],[-166.10048828125,61.645068359375],[-165.8345703125,61.67939453125],[-165.808935546875,61.69609375],[-166.019921875,61.748291015625],[-166.07880859375,61.803125],[-165.99140625,61.8341796875],[-165.833837890625,61.836816406249994],[-165.61279296875,61.869287109374994],[-165.705810546875,61.92744140625],[-165.725244140625,61.959375],[-165.7439453125,62.01171875],[-165.707275390625,62.100439453125],[-165.44765625,62.30390625],[-165.19453125,62.473535156249994],[-165.115625,62.5126953125],[-164.99970703125,62.5337890625],[-164.891845703125,62.517578125],[-164.77919921875,62.48115234375],[-164.757861328125,62.496728515624994],[-164.79609375,62.511621093749994],[-164.844384765625,62.5810546875],[-164.68798828125,62.608251953125],[-164.5962890625,62.686669921874994],[-164.589453125,62.709375],[-164.68896484375,62.6767578125],[-164.79267578125,62.623193359374994],[-164.81865234375,62.67705078125],[-164.84541015625,62.8009765625],[-164.799658203125,62.91806640625],[-164.7640625,62.970605468749994],[-164.67744140625,63.020458984375],[-164.428125,63.040429687499994],[-164.384228515625,63.03046875],[-164.37509765625,63.05400390625],[-164.5251953125,63.12763671875],[-164.46328125,63.185205078124994],[-164.409033203125,63.2150390625],[-164.1076171875,63.26171875],[-163.94287109375,63.247216796874994],[-163.73623046875,63.192822265625],[-163.61630859375,63.125146484374994],[-163.633740234375,63.0904296875],[-163.66357421875,63.0703125],[-163.725732421875,63.047802734375],[-163.748974609375,63.030322265625],[-163.737841796875,63.01640625],[-163.649365234375,63.056787109374994],[-163.504345703125,63.105859375],[-163.423193359375,63.084521484375],[-163.358837890625,63.045751953125],[-163.287841796875,63.046435546875],[-163.062255859375,63.079736328124994],[-162.947705078125,63.114990234375],[-162.807763671875,63.206591796875],[-162.621484375,63.2658203125],[-162.359814453125,63.452587890625],[-162.2828125,63.529199218749994],[-162.193310546875,63.540966796875],[-162.1125,63.5341796875],[-162.05625,63.471337890624994],[-161.973974609375,63.4529296875],[-161.505419921875,63.468164062499994],[-161.266015625,63.496972656249994],[-161.09970703125,63.55791015625],[-160.926708984375,63.660546875],[-160.826513671875,63.729345703125],[-160.778564453125,63.8189453125],[-160.840478515625,63.934912109375],[-160.903955078125,64.031201171875],[-160.987548828125,64.25126953125],[-161.2201171875,64.39658203125],[-161.385693359375,64.43994140625],[-161.49072265625,64.4337890625],[-161.414599609375,64.5263671875],[-161.19306640625,64.51640625],[-161.048779296875,64.53447265625],[-160.93193359375,64.5791015625],[-160.893701171875,64.612890625],[-160.83603515625,64.68193359375],[-160.855908203125,64.755615234375],[-160.886962890625,64.795556640625],[-160.96748046875,64.83955078125],[-161.063232421875,64.90400390625],[-161.13017578125,64.925439453125],[-161.1869140625,64.9240234375],[-161.466357421875,64.794873046875],[-161.633984375,64.79248046875],[-161.759375,64.816259765625],[-161.868310546875,64.74267578125],[-162.172265625,64.678076171875],[-162.334619140625,64.612841796875],[-162.6357421875,64.450830078125],[-162.711083984375,64.3775390625],[-162.80703125,64.37421875],[-162.876416015625,64.51640625],[-163.20390625,64.652001953125],[-163.30283203125,64.605908203125],[-163.248291015625,64.56328125],[-163.174072265625,64.532958984375],[-163.0517578125,64.5197265625],[-163.1044921875,64.47861328125],[-163.1443359375,64.423828125],[-163.267041015625,64.4751953125],[-163.486181640625,64.5498046875],[-163.7130859375,64.588232421875],[-164.303955078125,64.583935546875],[-164.691845703125,64.507421875],[-164.727490234375,64.523291015625],[-164.76494140625,64.529638671875],[-164.829541015625,64.511376953125],[-164.857275390625,64.480322265625],[-164.89951171875,64.46064453125],[-164.978759765625,64.453662109375],[-165.138134765625,64.465234375],[-165.44619140625,64.512841796875],[-166.1427734375,64.582763671875],[-166.32509765625,64.625732421875],[-166.481396484375,64.728076171875],[-166.478125,64.79755859375],[-166.40869140625,64.826953125],[-166.415234375,64.926513671875],[-166.55087890625,64.952978515625],[-166.826953125,65.09609375],[-166.92841796875,65.157080078125],[-166.906396484375,65.163818359375],[-166.856787109375,65.147265625],[-166.762548828125,65.134912109375],[-166.531005859375,65.154736328125],[-166.45166015625,65.247314453125],[-166.2796875,65.273779296875],[-166.121484375,65.2607421875],[-166.15703125,65.28583984375],[-166.197412109375,65.30556640625],[-166.609375,65.352734375],[-166.665380859375,65.33828125],[-167.40400390625,65.422119140625],[-167.987255859375,65.5677734375],[-168.035009765625,65.59560546875],[-168.08837890625,65.657763671875],[-168.00966796875,65.719140625],[-167.93056640625,65.74814453125],[-167.927001953125,65.71435546875],[-167.91435546875,65.681201171875],[-167.580029296875,65.75830078125],[-167.405322265625,65.859326171875],[-167.07421875,65.87705078125],[-166.997216796875,65.904931640625],[-166.89443359375,65.9591796875],[-166.74765625,66.05185546875],[-166.54013671875,66.100634765625],[-166.39873046875,66.14443359375],[-166.214599609375,66.170263671875],[-166.057421875,66.12724609375],[-166.008935546875,66.121337890625],[-165.723681640625,66.112548828125],[-165.629931640625,66.131201171875],[-165.589990234375,66.1451171875],[-165.560205078125,66.16708984375],[-165.840234375,66.245068359375],[-165.811865234375,66.2884765625],[-165.776171875,66.31904296875],[-165.4494140625,66.409912109375],[-165.198291015625,66.43994140625],[-165.06396484375,66.437841796875],[-164.67412109375,66.555029296875],[-164.460498046875,66.588427734375],[-164.058251953125,66.6107421875],[-163.727685546875,66.616455078125],[-163.638232421875,66.574658203125],[-163.81572265625,66.58349609375],[-163.8939453125,66.57587890625],[-163.838232421875,66.561572265625],[-163.77548828125,66.531103515625],[-163.793701171875,66.492626953125],[-163.902880859375,66.378369140625],[-163.8939453125,66.2869140625],[-163.964990234375,66.25732421875],[-164.033740234375,66.21552734375],[-163.695361328125,66.083837890625],[-163.171435546875,66.075439453125],[-162.886474609375,66.09921875],[-162.72177734375,66.059814453125],[-162.586865234375,66.050830078125],[-162.2142578125,66.071044921875],[-161.93369140625,66.04287109375],[-161.81630859375,66.053662109375],[-161.5568359375,66.250537109375],[-161.455419921875,66.281396484375],[-161.345068359375,66.24716796875],[-161.20107421875,66.219384765625],[-161.109228515625,66.239501953125],[-161.03427734375,66.188818359375],[-161.06953125,66.29462890625],[-161.1203125,66.334326171875],[-161.54443359375,66.40703125],[-161.828173828125,66.370849609375],[-161.91689453125,66.41181640625],[-161.88759765625,66.49306640625],[-162.191162109375,66.693115234375],[-162.317724609375,66.73369140625],[-162.467431640625,66.73564453125],[-162.54365234375,66.805126953125],[-162.607421875,66.894384765625],[-162.4783203125,66.930810546875],[-162.36162109375,66.947314453125],[-162.253564453125,66.91865234375],[-162.131396484375,66.8013671875],[-162.017626953125,66.784130859375],[-162.050732421875,66.66728515625],[-161.9095703125,66.559619140625],[-161.591015625,66.459521484375],[-161.3359375,66.496337890625],[-161.155810546875,66.4953125],[-161.04814453125,66.47421875],[-160.78447265625,66.384375],[-160.650537109375,66.373095703125],[-160.231689453125,66.420263671875],[-160.22734375,66.508544921875],[-160.262548828125,66.5724609375],[-160.360888671875,66.6125],[-160.643798828125,66.60498046875],[-160.864013671875,66.670849609375],[-161.05146484375,66.652783203125],[-161.398046875,66.55185546875],[-161.571728515625,66.5916015625],[-161.680908203125,66.6455078125],[-161.856689453125,66.700341796875],[-161.878759765625,66.803955078125],[-161.731298828125,66.922802734375],[-161.622216796875,66.979345703125],[-161.719921875,67.020556640625],[-161.9654296875,67.049560546875],[-162.391552734375,67.019873046875],[-162.411572265625,67.060302734375],[-162.409423828125,67.103955078125],[-162.58310546875,67.018505859375],[-162.76142578125,67.03642578125],[-163.001708984375,67.027294921875],[-163.5318359375,67.102587890625],[-163.720556640625,67.195556640625],[-163.7998046875,67.27099609375],[-163.94267578125,67.477587890625],[-164.1251953125,67.60673828125],[-165.38603515625,68.04560546875],[-165.9595703125,68.155908203125],[-166.2359375,68.2779296875],[-166.409130859375,68.307958984375],[-166.574462890625,68.320263671875],[-166.786279296875,68.359619140625],[-166.643896484375,68.4080078125],[-166.5458984375,68.424365234375],[-166.6478515625,68.373828125],[-166.57041015625,68.361083984375],[-166.447021484375,68.390234375],[-166.380517578125,68.425146484375],[-166.282958984375,68.5732421875],[-166.18203125,68.797216796875],[-166.20908203125,68.8853515625],[-165.50947265625,68.867578125],[-165.0439453125,68.882470703125],[-164.889697265625,68.90244140625],[-164.30234375,68.936474609375],[-164.1501953125,68.961181640625],[-163.867919921875,69.036669921875],[-163.535693359375,69.1701171875],[-163.250537109375,69.345361328125],[-163.20517578125,69.392529296875],[-163.187109375,69.38046875],[-163.161474609375,69.387939453125],[-163.131005859375,69.454345703125],[-163.0935546875,69.610693359375],[-162.952099609375,69.75810546875],[-162.350390625,70.094140625],[-162.071142578125,70.227197265625],[-161.977978515625,70.287646484375],[-161.88095703125,70.33173828125],[-161.81259765625,70.28984375],[-161.779931640625,70.27734375],[-161.761083984375,70.257666015625],[-161.818408203125,70.2484375],[-161.911962890625,70.20546875],[-162.0423828125,70.17666015625],[-162.073876953125,70.161962890625],[-161.997412109375,70.165234375],[-161.7681640625,70.196533203125],[-161.639013671875,70.234521484375],[-160.9962890625,70.30458984375],[-160.64765625,70.420556640625],[-160.634130859375,70.44638671875],[-160.117138671875,70.5912109375],[-160.04560546875,70.585595703125],[-159.963134765625,70.5681640625],[-160.106396484375,70.47255859375],[-160.00556640625,70.44755859375],[-160.095068359375,70.33330078125],[-159.907568359375,70.3314453125],[-159.865673828125,70.278857421875],[-159.855224609375,70.324169921875],[-159.85751953125,70.3892578125],[-159.842626953125,70.45302734375],[-159.814990234375,70.4970703125],[-159.68330078125,70.4771484375],[-159.386767578125,70.52451171875],[-159.74619140625,70.53046875],[-159.96181640625,70.63408203125],[-160.081591796875,70.63486328125],[-159.680908203125,70.786767578125],[-159.314501953125,70.878515625],[-159.23173828125,70.8767578125],[-159.191748046875,70.85966796875],[-159.183154296875,70.83193359375],[-159.26220703125,70.8138671875],[-159.33984375,70.78125],[-159.304150390625,70.7525390625],[-159.251171875,70.7484375],[-159.075048828125,70.7720703125],[-158.9962890625,70.801611328125],[-158.620947265625,70.7990234375],[-158.51083984375,70.8201171875],[-158.484375,70.841064453125],[-157.998486328125,70.8453125],[-157.909375,70.860107421875],[-157.605615234375,70.941259765625],[-157.324755859375,71.039599609375],[-157.1953125,71.09326171875],[-156.97333984375,71.230029296875],[-156.78330078125,71.3189453125],[-156.47021484375,71.407666015625],[-156.395263671875,71.3966796875],[-156.4966796875,71.3791015625],[-156.567236328125,71.341552734375],[-156.469970703125,71.291552734375],[-155.8111328125,71.188427734375],[-155.64560546875,71.182763671875],[-155.579443359375,71.12109375],[-155.6345703125,71.061572265625],[-155.804345703125,70.99541015625],[-156.14658203125,70.92783203125],[-156.041943359375,70.90224609375],[-155.97353515625,70.8419921875],[-155.872216796875,70.83466796875],[-155.708056640625,70.857275390625],[-155.57939453125,70.8943359375],[-155.31337890625,71.014990234375],[-155.229736328125,71.0822265625],[-155.166845703125,71.09921875],[-154.943798828125,71.083056640625],[-154.817529296875,71.048486328125],[-154.673681640625,70.987109375],[-154.726318359375,70.927783203125],[-154.785205078125,70.894287109375],[-154.5986328125,70.847998046875],[-154.3921875,70.838330078125],[-154.19521484375,70.801123046875],[-153.918212890625,70.87734375],[-153.7013671875,70.893603515625],[-153.497705078125,70.891064453125],[-153.23291015625,70.932568359375],[-152.784912109375,70.876025390625],[-152.670849609375,70.89072265625],[-152.4912109375,70.88095703125],[-152.300390625,70.84677734375],[-152.23291015625,70.8103515625],[-152.437255859375,70.733251953125],[-152.47060546875,70.65361328125],[-152.39921875,70.620458984375],[-152.269677734375,70.61474609375],[-152.253369140625,70.56826171875],[-152.17294921875,70.556640625],[-151.76904296875,70.56015625],[-151.79990234375,70.538037109375],[-151.81962890625,70.511328125],[-151.944677734375,70.452099609375],[-151.2248046875,70.41875],[-151.12802734375,70.451611328125],[-150.979052734375,70.464697265625],[-150.662646484375,70.509912109375],[-150.543505859375,70.49013671875],[-150.40322265625,70.443896484375],[-150.2736328125,70.434326171875],[-150.152490234375,70.443701171875],[-149.8701171875,70.50966796875],[-149.54404296875,70.512890625],[-149.410595703125,70.49140625],[-149.26943359375,70.50078125],[-148.844775390625,70.4251953125],[-148.68837890625,70.41630859375],[-148.47919921875,70.317919921875],[-148.371142578125,70.314990234375],[-148.248779296875,70.35673828125],[-148.142724609375,70.35546875],[-148.0390625,70.315478515625],[-147.86953125,70.303271484375],[-147.790576171875,70.24013671875],[-147.70537109375,70.217236328125],[-147.062939453125,70.17041015625],[-146.744873046875,70.191748046875],[-146.28125,70.1861328125],[-146.057666015625,70.15625],[-145.82314453125,70.16005859375],[-145.440087890625,70.050927734375],[-145.23681640625,70.033935546875],[-145.19736328125,70.00869140625],[-144.619189453125,69.98212890625],[-144.41689453125,70.039013671875],[-144.064111328125,70.0541015625],[-143.746435546875,70.101953125],[-143.56640625,70.10146484375],[-143.35703125,70.08955078125],[-143.27646484375,70.0953125],[-143.218310546875,70.116259765625],[-142.707861328125,70.0337890625],[-142.422119140625,69.939501953125],[-142.29697265625,69.869873046875],[-141.69921875,69.770361328125],[-141.5263671875,69.714697265625],[-141.40791015625,69.653369140625],[-141.338623046875,69.64677734375],[-141.2896484375,69.664697265625],[-141.080810546875,69.659423828125],[-141.0021484375,69.65078125],[-140.860009765625,69.63525390625],[-140.405126953125,69.602490234375],[-139.976611328125,69.621728515625],[-139.18154296875,69.51552734375],[-138.689892578125,69.316796875],[-138.291015625,69.21904296875],[-138.128369140625,69.151953125],[-137.86943359375,69.092822265625],[-137.2599609375,68.964111328125],[-137.07041015625,68.95087890625],[-136.717333984375,68.88916015625],[-136.498681640625,68.897314453125],[-136.12236328125,68.8822265625],[-135.866650390625,68.8326171875],[-135.362158203125,68.696435546875],[-135.258837890625,68.684326171875],[-135.231201171875,68.694287109375],[-135.40693359375,68.828955078125],[-135.4345703125,68.8419921875],[-135.63798828125,68.892236328125],[-135.876318359375,68.9169921875],[-135.8947265625,68.926708984375],[-135.939013671875,68.974169921875],[-135.924755859375,68.992626953125],[-135.8728515625,69.001025390625],[-135.69521484375,69.000634765625],[-135.589990234375,69.008251953125],[-135.575537109375,69.026953125],[-135.65126953125,69.031298828125],[-135.742626953125,69.0494140625],[-135.84970703125,69.081396484375],[-135.910205078125,69.111474609375],[-135.691455078125,69.311181640625],[-135.61494140625,69.291015625],[-135.499560546875,69.337158203125],[-135.292822265625,69.307861328125],[-135.25498046875,69.323828125],[-135.22978515625,69.4251953125],[-135.1990234375,69.449609375],[-135.1408203125,69.467822265625],[-134.852880859375,69.485888671875],[-134.49384765625,69.467919921875],[-134.4568359375,69.47763671875],[-134.4912109375,69.5453125],[-134.495361328125,69.571923828125],[-134.473681640625,69.6328125],[-134.45146484375,69.665478515625],[-134.408935546875,69.681787109375],[-134.242041015625,69.66884765625],[-134.189892578125,69.638818359375],[-134.134033203125,69.587255859375],[-134.077490234375,69.557861328125],[-133.899951171875,69.52822265625],[-133.87978515625,69.50771484375],[-133.9474609375,69.4294921875],[-134.018408203125,69.3884765625],[-134.1650390625,69.28056640625],[-134.17431640625,69.25283203125],[-133.948046875,69.301318359375],[-133.69404296875,69.368408203125],[-133.475927734375,69.40537109375],[-133.29365234375,69.412158203125],[-133.163134765625,69.43388671875],[-133.084423828125,69.470654296875],[-133.028271484375,69.508251953125],[-132.91533203125,69.629638671875],[-132.84033203125,69.65068359375],[-132.526806640625,69.64326171875],[-132.45234375,69.646923828125],[-132.40390625,69.658740234375],[-132.412744140625,69.674072265625],[-132.478955078125,69.69287109375],[-132.568359375,69.69814453125],[-132.57060546875,69.706689453125],[-132.537548828125,69.7265625],[-132.4884765625,69.7380859375],[-132.333984375,69.751806640625],[-132.232421875,69.708154296875],[-132.163427734375,69.70498046875],[-131.934130859375,69.753466796875],[-131.5818359375,69.88212890625],[-131.44091796875,69.917919921875],[-131.3189453125,69.924169921875],[-131.215869140625,69.90078125],[-131.136376953125,69.906884765625],[-131.0318359375,69.9794921875],[-130.990625,70.018115234375],[-130.926171875,70.051611328125],[-130.665478515625,70.12705078125],[-130.4984375,70.1431640625],[-130.39638671875,70.129248046875],[-130.274951171875,70.097998046875],[-130.174951171875,70.085888671875],[-130.043310546875,70.095068359375],[-129.944970703125,70.09091796875],[-129.898046875,70.10615234375],[-129.730078125,70.19208984375],[-129.675634765625,70.19296875],[-129.622998046875,70.167626953125],[-129.538427734375,70.10517578125],[-129.53818359375,70.07392578125],[-129.648291015625,69.99775390625],[-130.458837890625,69.77998046875],[-130.708544921875,69.685986328125],[-130.832080078125,69.65146484375],[-130.960107421875,69.63203125],[-131.207958984375,69.615771484375],[-131.30634765625,69.596630859375],[-131.47294921875,69.5794921875],[-131.86279296875,69.549365234375],[-131.93779296875,69.534716796875],[-131.98876953125,69.517626953125],[-132.128759765625,69.40234375],[-132.196826171875,69.364697265625],[-132.33076171875,69.307958984375],[-132.481201171875,69.27314453125],[-132.68671875,69.25986328125],[-132.81748046875,69.20576171875],[-132.96796875,69.101416015625],[-133.089453125,69.028759765625],[-133.22822265625,68.967138671875],[-133.378955078125,68.886669921875],[-133.418310546875,68.844287109375],[-133.373388671875,68.7884765625],[-133.348388671875,68.769873046875],[-133.196826171875,68.73984375],[-133.138037109375,68.74658203125],[-133.1921875,68.776513671875],[-133.31953125,68.8197265625],[-133.336669921875,68.83525390625],[-133.30400390625,68.847412109375],[-132.706005859375,68.814892578125],[-132.57763671875,68.847802734375],[-132.532666015625,68.875634765625],[-132.542236328125,68.88994140625],[-132.704345703125,68.8958984375],[-132.739111328125,68.9224609375],[-132.764697265625,68.9724609375],[-132.7701171875,69.012158203125],[-132.75546875,69.0416015625],[-132.7189453125,69.07919921875],[-132.545166015625,69.140625],[-132.358056640625,69.166943359375],[-132.21396484375,69.20166015625],[-132.134375,69.23447265625],[-131.91962890625,69.29052734375],[-131.8333984375,69.335986328125],[-131.7869140625,69.3712890625],[-131.7810546875,69.3888671875],[-131.820166015625,69.401611328125],[-131.78837890625,69.431982421875],[-131.631787109375,69.45908203125],[-131.562939453125,69.461376953125],[-131.342919921875,69.435400390625],[-131.30302734375,69.415087890625],[-131.32470703125,69.361181640625],[-131.293896484375,69.363720703125],[-131.209033203125,69.432177734375],[-131.16171875,69.45498046875],[-131.112841796875,69.45947265625],[-131.063427734375,69.45068359375],[-131.013427734375,69.4287109375],[-130.986279296875,69.362890625],[-130.981982421875,69.253271484375],[-130.970654296875,69.20908203125],[-130.914306640625,69.28486328125],[-130.875048828125,69.32001953125],[-130.660693359375,69.481298828125],[-130.515966796875,69.569677734375],[-130.35361328125,69.655810546875],[-130.117626953125,69.720068359375],[-129.572119140625,69.826708984375],[-129.26484375,69.855419921875],[-129.109130859375,69.88193359375],[-129.03291015625,69.90498046875],[-128.984326171875,69.933447265625],[-128.89892578125,69.966162109375],[-128.88369140625,69.9634765625],[-128.916796875,69.894873046875],[-128.938623046875,69.875],[-129.138330078125,69.83251953125],[-129.15791015625,69.80009765625],[-129.13623046875,69.750048828125],[-129.101708984375,69.717041015625],[-129.054345703125,69.70107421875],[-128.971435546875,69.71240234375],[-128.85302734375,69.751025390625],[-128.705517578125,69.81015625],[-128.38671875,69.96015625],[-128.3591796875,69.98759765625],[-128.27861328125,70.10810546875],[-128.095849609375,70.161328125],[-127.76494140624999,70.221875],[-127.6837890625,70.2603515625],[-127.9740234375,70.292919921875],[-128.0341796875,70.31533203125],[-128.04365234375,70.328759765625],[-127.988916015625,70.363134765625],[-128.121484375,70.39736328125],[-128.1701171875,70.41845703125],[-128.16806640625,70.47978515625],[-128.127294921875,70.523828125],[-128.040478515625,70.56640625],[-127.99101562499999,70.573828125],[-127.86162109374999,70.549072265625],[-127.75283203125,70.517138671875],[-127.37685546875,70.36875],[-127.2259765625,70.296142578125],[-127.13847656249999,70.23935546875],[-126.92680664062499,70.06171875],[-126.83349609375,69.95908203125],[-126.75869140625,69.853369140625],[-126.684912109375,69.777099609375],[-126.612158203125,69.730322265625],[-126.250439453125,69.545263671875],[-126.063818359375,69.46708984375],[-125.907421875,69.4185546875],[-125.727783203125,69.37998046875],[-125.52495117187499,69.3515625],[-125.38676757812499,69.34921875],[-125.171875,69.427978515625],[-125.166845703125,69.47978515625],[-125.261572265625,69.566162109375],[-125.35693359375,69.6259765625],[-125.34550781249999,69.662451171875],[-125.219384765625,69.732373046875],[-125.227880859375,69.75673828125],[-125.201171875,69.82880859375],[-125.114013671875,69.8150390625],[-125.07958984375,69.817822265625],[-125.031005859375,69.844287109375],[-124.96826171875,69.894384765625],[-124.88916015625,69.935791015625],[-124.79365234375,69.968505859375],[-124.767919921875,69.9900390625],[-124.86259765624999,70.005517578125],[-124.92001953125,70.00556640625],[-124.96259765625,70.01259765625],[-124.990380859375,70.026611328125],[-124.95244140624999,70.041748046875],[-124.7451171875,70.08017578125],[-124.70634765624999,70.1169921875],[-124.63994140624999,70.141455078125],[-124.555029296875,70.151220703125],[-124.502587890625,70.14111328125],[-124.444482421875,70.110595703125],[-124.44150390625,70.0619140625],[-124.4671875,69.982568359375],[-124.471923828125,69.918505859375],[-124.40693359375,69.767431640625],[-124.349365234375,69.734521484375],[-124.124609375,69.689990234375],[-124.13847656249999,69.653173828125],[-124.398388671875,69.49384765625],[-124.45390624999999,69.454833984375],[-124.48134765625,69.425146484375],[-124.4720703125,69.400048828125],[-124.426171875,69.379443359375],[-124.3380859375,69.36484375],[-124.11171875,69.35888671875],[-124.049658203125,69.3728515625],[-123.609130859375,69.37744140625],[-123.52841796875,69.38935546875],[-123.46044921875,69.42001953125],[-123.361474609375,69.496630859375],[-123.248974609375,69.52001953125],[-123.21367187499999,69.54150390625],[-123.144482421875,69.632470703125],[-123.11040039062499,69.738134765625],[-123.076611328125,69.782470703125],[-123.02578125,69.810009765625],[-122.956689453125,69.81884765625],[-122.785400390625,69.808447265625],[-122.70488281249999,69.8173828125],[-122.3875,69.808447265625],[-122.070068359375,69.816162109375],[-121.741845703125,69.797509765625],[-121.531103515625,69.77578125],[-121.33623046874999,69.741552734375],[-120.96245117187499,69.660400390625],[-120.8146484375,69.616845703125],[-120.29252929687499,69.420556640625],[-120.139990234375,69.38056640625],[-119.85283203124999,69.342333984375],[-118.86870117187499,69.257177734375],[-118.744873046875,69.23427734375],[-118.485595703125,69.144873046875],[-118.306982421875,69.092724609375],[-118.09521484375,69.042919921875],[-117.830322265625,68.99990234375],[-117.311279296875,68.934912109375],[-117.226953125,68.913427734375],[-117.13173828125,68.90712890625],[-117.025732421875,68.915966796875],[-116.549951171875,68.87880859375],[-116.424560546875,68.880615234375],[-116.33408203125,68.8736328125],[-116.22270507812499,68.846826171875],[-116.05947265625,68.83701171875],[-116.06523437499999,68.855419921875],[-116.251611328125,68.95791015625],[-116.243408203125,68.974072265625],[-116.166748046875,68.975341796875],[-115.936083984375,68.95810546875],[-115.883251953125,68.9873046875],[-115.80634765625,68.98662109375],[-115.63115234375,68.97255859375],[-115.44228515625,68.94091796875],[-115.23984375,68.891845703125],[-114.99375,68.850048828125],[-114.620166015625,68.74609375],[-114.4138671875,68.6595703125],[-114.2181640625,68.55205078125],[-114.11083984375,68.47734375],[-114.092041015625,68.435400390625],[-114.05112304687499,68.4146484375],[-113.98818359375,68.414990234375],[-113.964404296875,68.399072265625],[-114.02080078125,68.306494140625],[-114.05322265625,68.2833984375],[-114.095947265625,68.266796875],[-114.27475585937499,68.2478515625],[-114.765283203125,68.27021484375],[-114.852197265625,68.195263671875],[-115.12705078124999,68.13203125],[-115.175927734375,68.10439453125],[-115.186767578125,68.0841796875],[-115.16708984374999,68.0185546875],[-115.20185546875,67.9984375],[-115.42685546874999,67.92353515625],[-115.43447265625,67.90234375],[-115.2884765625,67.8716796875],[-115.133203125,67.819189453125],[-115.011181640625,67.806396484375],[-114.85673828125,67.81357421875],[-114.662890625,67.79521484375],[-114.42939453125,67.751220703125],[-114.267041015625,67.73115234375],[-114.175732421875,67.735009765625],[-114.05107421875,67.726904296875],[-113.893212890625,67.706884765625],[-113.68193359375,67.699951171875],[-113.214990234375,67.7017578125],[-113.074951171875,67.686669921875],[-112.879443359375,67.6798828125],[-112.50302734374999,67.68193359375],[-112.43515625,67.684765625],[-112.31455078124999,67.719580078125],[-112.23671875,67.731103515625],[-112.101318359375,67.73173828125],[-111.710888671875,67.75732421875],[-111.575732421875,67.7568359375],[-111.45068359375,67.776171875],[-111.2908203125,67.815234375],[-111.1921875,67.82255859375],[-111.15478515625,67.7982421875],[-111.08740234375,67.787646484375],[-110.9900390625,67.7908203125],[-110.8048828125,67.83232421875],[-110.37197265625,67.95419921875],[-110.216259765625,67.95400390625],[-110.101953125,67.992236328125],[-110.07392578125,67.992919921875],[-110.04248046875,67.977197265625],[-109.9365234375,67.887890625],[-109.904248046875,67.87353515625],[-109.83134765625,67.8658203125],[-109.76015625,67.8201171875],[-109.68603515625,67.7517578125],[-109.63037109375,67.73271484375],[-109.22431640625,67.72978515625],[-109.08125,67.7107421875],[-109.038037109375,67.691162109375],[-108.99448242187499,67.637109375],[-108.96767578125,67.532373046875],[-108.94990234375,67.4939453125],[-108.89096679687499,67.4380859375],[-108.852001953125,67.42197265625],[-108.815185546875,67.4375],[-108.71513671875,67.5828125],[-108.680224609375,67.606201171875],[-108.613330078125,67.598046875],[-108.592919921875,67.590869140625],[-108.49150390625,67.48330078125],[-108.34697265625,67.40341796875],[-107.988720703125,67.256396484375],[-107.93051757812499,67.202490234375],[-107.9091796875,67.162548828125],[-107.929443359375,67.126806640625],[-107.99130859374999,67.095166015625],[-108.088427734375,67.069775390625],[-108.22080078124999,67.0505859375],[-108.34433593749999,67.05751953125],[-108.45908203124999,67.0904296875],[-108.496044921875,67.09228515625],[-108.4552734375,67.06298828125],[-108.2181640625,66.941259765625],[-108.157666015625,66.892626953125],[-108.10146484375,66.8603515625],[-108.049609375,66.8443359375],[-108.0017578125,66.818017578125],[-107.957958984375,66.781298828125],[-107.7609375,66.68369140625],[-107.7048828125,66.637109375],[-107.48032226562499,66.491796875],[-107.373681640625,66.43466796875],[-107.29135742187499,66.401806640625],[-107.25947265625,66.39853515625],[-107.278076171875,66.42490234375],[-107.564453125,66.618505859375],[-107.7103515625,66.7400390625],[-107.730859375,66.769189453125],[-107.740234375,66.81376953125],[-107.74599609375,66.961474609375],[-107.72509765625,66.984130859375],[-107.626171875,67.003125],[-107.49921875,66.936181640625],[-107.45126953124999,66.9267578125],[-107.41884765625,66.930712890625],[-107.402099609375,66.947998046875],[-107.32919921874999,66.931982421875],[-107.2001953125,66.882568359375],[-107.156494140625,66.88173828125],[-107.25375976562499,66.9763671875],[-107.32333984374999,67.02255859375],[-107.3478515625,67.05478515625],[-107.283154296875,67.103271484375],[-107.31845703124999,67.127783203125],[-107.482373046875,67.19912109375],[-107.56748046874999,67.273046875],[-107.64404296875,67.384765625],[-107.650927734375,67.42822265625],[-107.63837890625,67.47421875],[-107.64990234375,67.511279296875],[-107.75302734374999,67.586865234375],[-107.86508789062499,67.639208984375],[-107.954052734375,67.7],[-107.972119140625,67.73203125],[-107.9583984375,67.818603515625],[-107.89091796875,67.85634765625],[-107.7630859375,67.9068359375],[-107.72861328124999,67.958837890625],[-107.78745117187499,68.0125],[-107.798291015625,68.0369140625],[-107.76103515625,68.032177734375],[-107.509375,68.059130859375],[-107.44619140625,68.049658203125],[-107.351123046875,68.061181640625],[-107.22412109375,68.093798828125],[-107.1248046875,68.108447265625],[-106.99365234375,68.106298828125],[-106.92255859375,68.11416015625],[-106.83564453125,68.12861328125],[-106.79072265625,68.14482421875],[-106.710986328125,68.206787109375],[-106.668408203125,68.216015625],[-106.53486328125,68.20927734375],[-106.45947265625,68.195654296875],[-106.424267578125,68.2005859375],[-106.4294921875,68.2884765625],[-106.40439453124999,68.3193359375],[-106.271240234375,68.383203125],[-106.13212890625,68.389892578125],[-106.039306640625,68.40732421875],[-105.933056640625,68.443115234375],[-105.85693359375,68.475146484375],[-105.781201171875,68.5265625],[-105.7501953125,68.59228515625],[-105.77431640625,68.6111328125],[-105.93222656249999,68.6365234375],[-106.0271484375,68.62333984375],[-106.2373046875,68.5765625],[-106.458056640625,68.516455078125],[-106.54331054687499,68.460595703125],[-106.566650390625,68.38896484375],[-106.60849609374999,68.357373046875],[-106.780419921875,68.3873046875],[-106.8537109375,68.38681640625],[-106.94580078125,68.374365234375],[-107.04331054687499,68.346826171875],[-107.14619140625,68.30419921875],[-107.29814453125,68.296435546875],[-107.49912109374999,68.32353515625],[-107.6193359375,68.3310546875],[-107.74150390625,68.2857421875],[-107.73422851562499,68.25205078125],[-107.67763671875,68.2029296875],[-107.7341796875,68.17373046875],[-108.02719726562499,68.162939453125],[-108.10458984374999,68.169287109375],[-108.26103515625,68.14990234375],[-108.322802734375,68.1541015625],[-108.367919921875,68.1775390625],[-108.686572265625,68.27734375],[-108.71811523437499,68.2974609375],[-108.64091796875,68.378515625],[-108.345751953125,68.597802734375],[-108.3134765625,68.610791015625],[-107.766357421875,68.64892578125],[-107.4359375,68.6888671875],[-106.83066406249999,68.80947265625],[-106.71347656249999,68.819482421875],[-106.324267578125,68.899462890625],[-106.164453125,68.919873046875],[-106.015673828125,68.9060546875],[-105.79794921874999,68.864794921875],[-105.685595703125,68.828173828125],[-105.60605468749999,68.782421875],[-105.53984375,68.71865234375],[-105.45693359375,68.578076171875],[-105.42861328125,68.458251953125],[-105.37744140625,68.413818359375],[-105.194970703125,68.33037109375],[-105.101318359375,68.297998046875],[-105.043603515625,68.287890625],[-104.993798828125,68.307421875],[-104.95981445312499,68.310546875],[-104.93671875,68.30302734375],[-104.91196289062499,68.25048828125],[-104.879443359375,68.245263671875],[-104.76962890624999,68.2517578125],[-104.65317382812499,68.230078125],[-104.636376953125,68.213916015625],[-104.6611328125,68.148779296875],[-104.628173828125,68.121484375],[-104.48681640625,68.06318359375],[-104.350732421875,68.0412109375],[-104.1935546875,68.031201171875],[-103.9015625,68.041064453125],[-103.6572265625,68.069091796875],[-103.47412109375,68.1150390625],[-103.3232421875,68.063818359375],[-103.02177734374999,67.940234375],[-102.841552734375,67.852734375],[-102.69199218749999,67.811572265625],[-102.389111328125,67.76220703125],[-102.32036132812499,67.73564453125],[-102.20976562499999,67.73271484375],[-102.05722656249999,67.7533203125],[-101.88364257812499,67.7453125],[-101.6888671875,67.708642578125],[-101.55498046874999,67.6931640625],[-101.09638671875,67.762353515625],[-101.02641601562499,67.765673828125],[-100.855615234375,67.798974609375],[-100.74560546875,67.80908203125],[-100.61611328125,67.808251953125],[-100.51962890624999,67.818408203125],[-100.45610351562499,67.839453125],[-100.21293945312499,67.83857421875],[-99.77294921875,67.81484375],[-99.472265625,67.78408203125],[-99.29355468749999,67.7453125],[-99.146875,67.7236328125],[-99.032177734375,67.71884765625],[-98.92045898437499,67.72578125],[-98.81171875,67.74443359375],[-98.697265625,67.779736328125],[-98.452783203125,67.797900390625],[-98.412109375,67.807177734375],[-98.417138671875,67.82646484375],[-98.46782226562499,67.855810546875],[-98.60649414062499,67.91142578125],[-98.703564453125,67.96572265625],[-98.72221679687499,68.0001953125],[-98.72006835937499,68.0419921875],[-98.68984375,68.06611328125],[-98.63154296875,68.07255859375],[-98.53984374999999,68.046630859375],[-98.414794921875,67.988427734375],[-98.06254882812499,67.769677734375],[-97.97763671874999,67.738623046875],[-97.93076171874999,67.710791015625],[-97.607421875,67.6310546875],[-97.45493164062499,67.6169921875],[-97.27426757812499,67.666259765625],[-97.19443359374999,67.696923828125],[-97.155419921875,67.726416015625],[-97.157177734375,67.754833984375],[-97.13984375,67.796240234375],[-97.15805664062499,67.821923828125],[-97.20654296875,67.855078125],[-97.3361328125,67.9013671875],[-97.546630859375,67.9607421875],[-97.73911132812499,67.978173828125],[-97.913330078125,67.953564453125],[-98.110498046875,67.90302734375],[-98.192529296875,67.922998046875],[-98.43837890625,68.064697265625],[-98.50029296874999,68.11767578125],[-98.500244140625,68.132275390625],[-98.38608398437499,68.11533203125],[-98.380859375,68.132470703125],[-98.449169921875,68.20078125],[-98.49125976562499,68.2236328125],[-98.6330078125,68.33115234375],[-98.65048828124999,68.363525390625],[-98.562255859375,68.370849609375],[-98.522216796875,68.3833984375],[-98.46855468749999,68.38212890625],[-98.21855468749999,68.317431640625],[-98.09052734375,68.346337890625],[-97.79423828124999,68.38759765625],[-97.91103515625,68.44951171875],[-97.9388671875,68.51044921875],[-97.92509765624999,68.523681640625],[-97.828564453125,68.532763671875],[-97.63955078125,68.481982421875],[-97.548046875,68.474951171875],[-97.481103515625,68.495166015625],[-97.4103515625,68.496533203125],[-97.33579101562499,68.479150390625],[-97.26591796874999,68.4529296875],[-97.135986328125,68.377978515625],[-97.07177734375,68.332861328125],[-96.99956054687499,68.26494140625],[-96.976708984375,68.255419921875],[-96.628173828125,68.25029296875],[-96.4306640625,68.310595703125],[-96.4349609375,68.290087890625],[-96.480224609375,68.242822265625],[-96.72514648437499,68.06123046875],[-96.7220703125,68.03876953125],[-96.5921875,68.0484375],[-96.53129882812499,68.063134765625],[-96.49370117187499,68.0849609375],[-96.461181640625,68.13583984375],[-96.43935546875,68.15087890625],[-96.0755859375,68.2365234375],[-95.9703125,68.24912109375],[-96.03603515625,68.157763671875],[-96.171337890625,67.831689453125],[-96.198828125,67.717822265625],[-96.228466796875,67.67919921875],[-96.37138671874999,67.553857421875],[-96.369140625,67.509765625],[-96.212841796875,67.404296875],[-96.185009765625,67.3755859375],[-96.16923828124999,67.28896484375],[-96.14145507812499,67.271826171875],[-96.01259765625,67.2708984375],[-95.8791015625,67.298486328125],[-95.719921875,67.316796875],[-95.69516601562499,67.29873046875],[-95.78251953124999,67.193798828125],[-95.77768554687499,67.184619140625],[-95.626416015625,67.211572265625],[-95.55703125,67.215283203125],[-95.5287109375,67.2091796875],[-95.41591796875,67.15556640625],[-95.40458984374999,67.115576171875],[-95.406982421875,67.056103515625],[-95.418896484375,67.013232421875],[-95.456982421875,66.989453125],[-95.50224609374999,66.9798828125],[-95.55937,66.97275390625],[-95.61064453124999,66.97568359375],[-95.76865234374999,66.96669921875],[-95.86181640625,66.978173828125],[-95.954052734375,67.010888671875],[-96.01953125,67.01875],[-96.095458984375,66.9935546875],[-96.215576171875,66.997705078125],[-96.35043945312499,67.07001953125],[-96.404248046875,67.063232421875],[-96.42255859375,67.0517578125],[-96.42026367187499,67.036181640625],[-96.359521484375,66.989404296875],[-95.88530273437499,66.741357421875],[-95.81328124999999,66.69013671875],[-95.79736328125,66.616552734375],[-95.787548828125,66.616796875],[-95.7431640625,66.6904296875],[-95.772119140625,66.72607421875],[-96.01611328125,66.870458984375],[-96.045361328125,66.92314453125],[-96.036865234375,66.9375],[-95.97236328125,66.95224609375],[-95.62504882812499,66.916259765625],[-95.490380859375,66.92412109375],[-95.399658203125,66.949462890625],[-95.35410156249999,66.980712890625],[-95.32109374999999,67.152490234375],[-95.258740234375,67.262548828125],[-95.29560546875,67.36103515625],[-95.38955078125,67.517822265625],[-95.46337890625,67.610205078125],[-95.63369140625,67.703857421875],[-95.65048828124999,67.737451171875],[-95.460693359375,68.02138671875],[-95.426513671875,68.045263671875],[-95.38408203124999,68.05556640625],[-95.23471679687499,68.059716796875],[-95.12587890625,68.08330078125],[-94.955224609375,68.05029296875],[-94.86103515625,68.041650390625],[-94.74443359374999,68.0708984375],[-94.485302734375,68.190087890625],[-94.38383789062499,68.227001953125],[-94.25478515625,68.296826171875],[-94.09814453125,68.3994140625],[-93.927734375,68.473828125],[-93.65170898437499,68.543115234375],[-93.48300781249999,68.598876953125],[-93.44892578125,68.618896484375],[-93.60581054687499,68.623681640625],[-93.6439453125,68.63310546875],[-93.676171875,68.685986328125],[-93.65986328125,68.783740234375],[-93.66279296875,68.83818359375],[-93.68144531249999,68.887255859375],[-93.715771484375,68.9310546875],[-93.76572265624999,68.969580078125],[-93.81132812499999,68.99267578125],[-93.85244140625,69.000341796875],[-93.88071289062499,68.996826171875],[-93.89609375,68.982177734375],[-93.93808593749999,68.8890625],[-93.99155273437499,68.82060546875],[-94.064892578125,68.784765625],[-94.216943359375,68.760546875],[-94.47832031249999,68.7427734375],[-94.58676757812499,68.775537109375],[-94.60043945312499,68.80322265625],[-94.56254882812499,68.911669921875],[-94.47563476562499,68.958154296875],[-94.23662109374999,69.049755859375],[-94.083642578125,69.123095703125],[-94.08115234374999,69.13583984375],[-94.221826171875,69.136376953125],[-94.25537109375,69.15146484375],[-94.28496093749999,69.2416015625],[-94.2767578125,69.275244140625],[-94.25473632812499,69.31376953125],[-94.15634765624999,69.341748046875],[-93.85439453125,69.3763671875],[-93.61948242187499,69.4169921875],[-93.61264648437499,69.40283203125],[-93.8009765625,69.280908203125],[-93.820458984375,69.25263671875],[-93.74853515625,69.226123046875],[-93.56748046874999,69.296875],[-93.4505859375,69.35517578125],[-93.43095703124999,69.375048828125],[-93.537060546875,69.38232421875],[-93.54287109375,69.4064453125],[-93.522412109375,69.45068359375],[-93.53227539062499,69.480908203125],[-93.6498046875,69.51904296875],[-93.794384765625,69.4978515625],[-93.91508789062499,69.457666015625],[-94.015283203125,69.446728515625],[-94.16318359374999,69.445947265625],[-94.27080078124999,69.455126953125],[-94.338134765625,69.474267578125],[-94.419189453125,69.517041015625],[-94.513916015625,69.583447265625],[-94.63383789062499,69.649658203125],[-94.67626953125,69.656884765625],[-94.71269531249999,69.6494140625],[-94.7892578125,69.58544921875],[-94.822509765625,69.577783203125],[-95.29208984374999,69.6673828125],[-95.49125976562499,69.717626953125],[-95.58759765625,69.755712890625],[-95.707421875,69.77822265625],[-95.85068359374999,69.785107421875],[-95.96494140624999,69.802783203125],[-96.05014648437499,69.83115234375],[-96.119091796875,69.871875],[-96.17177734375,69.924951171875],[-96.26938476562499,69.991796875],[-96.4923828125,70.12490234375],[-96.55136718749999,70.210302734375],[-96.5595703125,70.243017578125],[-96.54560546875,70.32724609375],[-96.336572265625,70.470166015625],[-96.29770507812499,70.511376953125],[-96.22641601562499,70.54169921875],[-96.12275390625,70.56123046875],[-96.04814453124999,70.56708984375],[-95.87861328125,70.548974609375],[-95.98017578125,70.593212890625],[-95.98818359375,70.616845703125],[-95.886328125,70.694287109375],[-95.906396484375,70.69775390625],[-96.18642578125,70.63828125],[-96.2580078125,70.64228515625],[-96.35888671875,70.678662109375],[-96.54892578124999,70.808740234375],[-96.55107421874999,70.88974609375],[-96.49130859374999,71.00234375],[-96.47041015625,71.0697265625],[-96.52475585937499,71.12705078125],[-96.50444335937499,71.1431640625],[-96.445458984375,71.159228515625],[-96.42075195312499,71.17646484375],[-96.44658203124999,71.239892578125],[-96.4056640625,71.2736328125],[-96.27133789062499,71.339111328125],[-96.1396484375,71.39638671875],[-96.06201171875,71.4138671875],[-95.99443359374999,71.41064453125],[-95.924072265625,71.39306640625],[-95.85087890624999,71.361083984375],[-95.72539062499999,71.328173828125],[-95.632568359375,71.318798828125],[-95.56425781249999,71.336767578125],[-95.447509765625,71.46005859375],[-95.40625,71.491650390625],[-95.44541015624999,71.50537109375],[-95.67421875,71.504052734375],[-95.773388671875,71.5142578125],[-95.83037109374999,71.52607421875],[-95.872314453125,71.57314453125],[-95.83774414062499,71.5982421875],[-95.61591796875,71.685400390625],[-95.511669921875,71.776806640625],[-95.20122070312499,71.9037109375],[-94.886962890625,71.96337890625],[-94.73486328125,71.982958984375],[-94.61113281249999,71.986865234375],[-94.557080078125,71.978955078125],[-94.49106445312499,71.91552734375],[-94.47880859374999,71.848583984375],[-94.308349609375,71.764892578125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-80.731689453125,52.747265625],[-80.80234375,52.733984375],[-81.00986328124999,52.76064453125],[-81.09658203125,52.7798828125],[-81.35224609375,52.852001953125],[-81.8390625,52.95791015625],[-82.005029296875,53.010498046875],[-82.0392578125,53.04990234375],[-81.951123046875,53.1322265625],[-81.9013671875,53.165576171874996],[-81.847314453125,53.186279296875],[-81.3353515625,53.224267578125],[-81.13559570312499,53.205810546875],[-80.900390625,53.037158203124996],[-80.76533203125,52.9232421875],[-80.71044921875,52.831591796874996],[-80.70952148437499,52.787402343749996],[-80.731689453125,52.747265625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-73.621728515625,67.783837890625],[-74.10908203125,67.78251953125],[-74.37407226562499,67.789599609375],[-74.480712890625,67.8048828125],[-74.573388671875,67.828662109375],[-74.67861328125,67.90556640625],[-74.74599609375,67.984814453125],[-74.749267578125,68.01845703125],[-74.7314453125,68.048779296875],[-74.70654296875,68.06708984375],[-74.37939453125,68.09345703125],[-74.11137695312499,68.060595703125],[-73.88071289062499,68.021923828125],[-73.58403320312499,68.01533203125],[-73.49375,68.000634765625],[-73.459228515625,67.989892578125],[-73.43525390625,67.97001953125],[-73.4015625,67.8787109375],[-73.398193359375,67.829931640625],[-73.407177734375,67.79306640625],[-73.621728515625,67.783837890625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-77.876708984375,63.470556640625],[-77.79208984374999,63.42783203125],[-77.70371093749999,63.430859375],[-77.65478515625,63.39599609375],[-77.5384765625,63.287060546875],[-77.527294921875,63.268945312499994],[-77.53271484375,63.233642578125],[-77.593896484375,63.188427734375],[-77.657666015625,63.164599609375],[-77.791455078125,63.12958984375],[-77.94243164062499,63.114404296874994],[-78.0244140625,63.1388671875],[-78.25595703124999,63.23984375],[-78.46875,63.35791015625],[-78.536767578125,63.423730468749994],[-78.50732421875,63.451123046875],[-78.41728515624999,63.469970703125],[-78.23491210937499,63.48955078125],[-77.93393554687499,63.478955078125],[-77.876708984375,63.470556640625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-82.00048828125,62.95419921875],[-81.960546875,62.926220703125],[-81.94858398437499,62.884033203125],[-81.96440429687499,62.82763671875],[-81.990185546875,62.776318359375],[-82.025830078125,62.730078125],[-82.113720703125,62.652246093749994],[-82.38803710937499,62.519140625],[-82.490966796875,62.44658203125],[-82.56826171875,62.403222656249994],[-83.0158203125,62.209912109375],[-83.07138671874999,62.200390625],[-83.12968749999999,62.2041015625],[-83.252392578125,62.232958984375],[-83.37680664062499,62.238134765625],[-83.698876953125,62.16025390625],[-83.71440429687499,62.173583984375],[-83.72861328124999,62.257177734375],[-83.7609375,62.303515625],[-83.90312,62.402490234374994],[-83.91240234374999,62.425537109375],[-83.91049804687499,62.454150390625],[-83.89926757812499,62.476464843749994],[-83.73906249999999,62.56884765625],[-83.376416015625,62.904931640624994],[-83.289453125,62.92158203125],[-83.1109375,62.884130859375],[-83.02626953125,62.8720703125],[-82.965771484375,62.873925781249994],[-82.7064453125,62.94453125],[-82.459716796875,62.936181640624994],[-82.234765625,62.977441406249994],[-82.12924804687499,62.977685546874994],[-82.047607421875,62.970556640625],[-82.00048828125,62.95419921875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-79.5453125,62.41171875],[-79.4662109375,62.384521484375],[-79.33603515624999,62.293701171875],[-79.28647460937499,62.24765625],[-79.27202148437499,62.185986328125],[-79.30644531249999,62.103515625],[-79.32392578125,62.02607421875],[-79.372265625,61.9677734375],[-79.462158203125,61.894091796875],[-79.54184570312499,61.808007812499994],[-79.611328125,61.709619140624994],[-79.66875,61.644433593749994],[-79.7142578125,61.612548828125],[-79.763330078125,61.595947265625],[-79.81611328125,61.594628906249994],[-79.89633789062499,61.630126953125],[-80.004150390625,61.702539062499994],[-80.0919921875,61.746826171875],[-80.20493164062499,61.777246093749994],[-80.26518554687499,61.818212890625],[-80.27617187499999,61.85859375],[-80.27983398437499,61.989501953125],[-80.27509765625,62.054638671875],[-80.26005859374999,62.109033203124994],[-80.23466796874999,62.152685546875],[-80.17856445312499,62.212792968749994],[-80.02158203124999,62.34296875],[-79.9267578125,62.39287109375],[-79.86806640625,62.404345703125],[-79.712548828125,62.39501953125],[-79.649560546875,62.398291015625],[-79.59765625,62.413232421874994],[-79.5453125,62.41171875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-104.558154296875,77.141748046875],[-104.711376953125,77.123974609375],[-105.015576171875,77.164599609375],[-105.215087890625,77.182080078125],[-105.379931640625,77.254248046875],[-105.55634765625,77.35263671875],[-105.6951171875,77.461376953125],[-105.747216796875,77.525390625],[-105.84814453125,77.563427734375],[-105.88315429687499,77.626513671875],[-106.06611328125,77.725390625],[-106.035595703125,77.73984375],[-105.86298828125,77.75439453125],[-105.587890625,77.735986328125],[-105.456103515625,77.700927734375],[-105.28964843749999,77.64208984375],[-105.073876953125,77.548291015625],[-105.0072265625,77.50673828125],[-104.994287109375,77.449658203125],[-104.955322265625,77.418701171875],[-104.77021484375,77.413232421875],[-104.542236328125,77.337744140625],[-104.50078125,77.308544921875],[-104.45371093749999,77.24912109375],[-104.456982421875,77.22080078125],[-104.493359375,77.162353515625],[-104.558154296875,77.141748046875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-95.484375,77.7919921875],[-95.233056640625,77.75380859375],[-94.959912109375,77.774072265625],[-94.66679687499999,77.776220703125],[-94.01474609374999,77.759912109375],[-93.58286132812499,77.770751953125],[-93.47109375,77.764306640625],[-93.3009765625,77.739794921875],[-93.21074218749999,77.710205078125],[-93.12871093749999,77.66015625],[-93.33916015624999,77.6296875],[-93.51958007812499,77.4744140625],[-93.5439453125,77.466650390625],[-93.740185546875,77.46455078125],[-93.836181640625,77.45224609375],[-94.40898437499999,77.47421875],[-95.987060546875,77.484130859375],[-96.056103515625,77.503466796875],[-96.2638671875,77.59453125],[-96.276611328125,77.63056640625],[-96.23916015625,77.67255859375],[-96.194580078125,77.700537109375],[-96.14296875,77.71435546875],[-95.68393554687499,77.782275390625],[-95.484375,77.7919921875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-98.79160156249999,79.981103515625],[-98.7689453125,79.85087890625],[-98.789794921875,79.785400390625],[-98.84062,79.737060546875],[-98.885205078125,79.72568359375],[-98.94521484375,79.724072265625],[-99.21845703125,79.761865234375],[-99.3017578125,79.78408203125],[-99.30625,79.802880859375],[-99.3330078125,79.83955078125],[-99.515625,79.887158203125],[-99.85747070312499,79.8794921875],[-99.99990234375,79.884033203125],[-100.0568359375,79.8982421875],[-100.092431640625,79.91865234375],[-100.12602539062499,80.00126953125],[-100.120361328125,80.030419921875],[-100.078515625,80.081103515625],[-100.05327148437499,80.093359375],[-99.80278320312499,80.14013671875],[-99.731201171875,80.144091796875],[-99.42485351562499,80.126416015625],[-99.15322265625,80.12421875],[-99.0166015625,80.1111328125],[-98.894677734375,80.081787109375],[-98.823193359375,80.037353515625],[-98.79160156249999,79.981103515625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-89.833251953125,77.267626953125],[-90.0947265625,77.210400390625],[-90.228271484375,77.212451171875],[-90.99321289062499,77.3294921875],[-91.14726562499999,77.3873046875],[-91.17661132812499,77.42626953125],[-91.18505859375,77.48154296875],[-91.18266601562499,77.557177734375],[-91.14946289062499,77.608056640625],[-91.109130859375,77.625732421875],[-91.01904296875,77.643896484375],[-90.84257812499999,77.65498046875],[-90.67485351562499,77.6486328125],[-90.42275390625,77.628369140625],[-90.17192382812499,77.594677734375],[-89.83896484374999,77.49140625],[-89.719482421875,77.442138671875],[-89.69418945312499,77.378125],[-89.694580078125,77.33896484375],[-89.71201171874999,77.310400390625],[-89.74667968749999,77.292578125],[-89.833251953125,77.267626953125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-93.542578125,75.0279296875],[-93.478271484375,74.951953125],[-93.46660156249999,74.921337890625],[-93.46347656249999,74.856494140625],[-93.490869140625,74.77197265625],[-93.5091796875,74.756494140625],[-93.53564453125,74.74931640625],[-93.548291015625,74.7275390625],[-93.54716796874999,74.691064453125],[-93.57309570312499,74.66884765625],[-93.626171875,74.660888671875],[-93.9845703125,74.644189453125],[-94.2060546875,74.647412109375],[-94.53452148437499,74.63671875],[-94.697265625,74.6421875],[-94.803857421875,74.660107421875],[-94.958740234375,74.699951171875],[-95.286083984375,74.794091796875],[-95.45122070312499,74.79736328125],[-95.8654296875,74.830419921875],[-96.09423828125,74.93251953125],[-96.18173828124999,74.95078125],[-96.27011718749999,74.9203125],[-96.294189453125,74.927197265625],[-96.3185546875,74.947705078125],[-96.3431640625,74.98193359375],[-96.386328125,74.999462890625],[-96.55986328124999,74.990380859375],[-96.59116210937499,75.00185546875],[-96.599609375,75.031787109375],[-96.596923828125,75.057861328125],[-96.56577148437499,75.09873046875],[-96.38286132812499,75.211376953125],[-96.2923828125,75.219287109375],[-96.18037109375,75.240087890625],[-96.118408203125,75.300927734375],[-96.12490234375,75.35830078125],[-95.95463867187499,75.443798828125],[-95.853173828125,75.46904296875],[-95.67080078125,75.528662109375],[-95.04951171875,75.621826171875],[-94.878173828125,75.630029296875],[-94.6486328125,75.623046875],[-94.42724609375,75.593359375],[-94.25668945312499,75.544091796875],[-93.90908203125,75.422509765625],[-93.75083007812499,75.3490234375],[-93.66684570312499,75.27353515625],[-93.5912109375,75.230224609375],[-93.49755859375,75.136865234375],[-93.53173828125,75.100341796875],[-93.55180664062499,75.051171875],[-93.542578125,75.0279296875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-109.815966796875,78.650390625],[-109.64096679687499,78.59208984375],[-109.580859375,78.59326171875],[-109.504150390625,78.582470703125],[-109.46728515625,78.5671875],[-109.36220703125,78.49287109375],[-109.34213867187499,78.456005859375],[-109.33603515624999,78.408447265625],[-109.352099609375,78.36865234375],[-109.39052734375,78.336669921875],[-109.48447265624999,78.31640625],[-109.7087890625,78.303759765625],[-110.021875,78.322802734375],[-110.29345703125,78.298193359375],[-110.418359375,78.294970703125],[-110.755078125,78.3107421875],[-110.8400390625,78.322314453125],[-111.0267578125,78.367626953125],[-111.169189453125,78.386279296875],[-111.22900390625,78.376318359375],[-111.30048828125,78.336572265625],[-111.43505859375,78.287353515625],[-111.51748046875,78.27470703125],[-111.759716796875,78.282958984375],[-112.13125,78.366064453125],[-112.5578125,78.34150390625],[-112.99990234375,78.292919921875],[-113.172509765625,78.2837890625],[-113.223046875,78.297900390625],[-113.292578125,78.334375],[-113.281689453125,78.352783203125],[-113.149951171875,78.4083984375],[-112.855859375,78.466845703125],[-112.6408203125,78.4998046875],[-112.214013671875,78.547802734375],[-111.7087890625,78.57470703125],[-111.51987304687499,78.60322265625],[-111.400341796875,78.64404296875],[-111.071484375,78.7083984375],[-110.877587890625,78.73505859375],[-110.61806640625,78.7578125],[-110.4078125,78.756640625],[-110.14047851562499,78.704443359375],[-109.940869140625,78.678466796875],[-109.815966796875,78.650390625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-118.328125,75.5796875],[-118.6138671875,75.5154296875],[-118.817138671875,75.522119140625],[-119.086669921875,75.5693359375],[-119.3060546875,75.5853515625],[-119.383251953125,75.601025390625],[-119.39458007812499,75.617333984375],[-119.320166015625,75.662548828125],[-119.226806640625,75.6986328125],[-119.00346679687499,75.769580078125],[-118.62607421875,75.90625],[-118.37900390625,75.957958984375],[-118.136669921875,75.994482421875],[-117.88935546875,76.07607421875],[-117.75249023437499,76.112451171875],[-117.63369140625,76.115087890625],[-117.51259765625,76.0994140625],[-117.49912109375,76.077197265625],[-117.6263671875,75.965966796875],[-117.715966796875,75.921142578125],[-117.8908203125,75.80546875],[-118.226513671875,75.611181640625],[-118.328125,75.5796875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-105.28891601562499,72.919921875],[-105.33935546875,72.914892578125],[-105.43408203125,72.93798828125],[-105.572998046875,72.989306640625],[-105.80014648437499,73.093310546875],[-106.071044921875,73.19638671875],[-106.11264648437499,73.25810546875],[-106.18002929687499,73.3041015625],[-106.52573242187499,73.41337890625],[-106.750390625,73.45771484375],[-106.921533203125,73.479833984375],[-106.949658203125,73.5103515625],[-106.831005859375,73.599072265625],[-106.69482421875,73.669921875],[-106.61396484375,73.69560546875],[-106.362109375,73.718603515625],[-105.51230468749999,73.765771484375],[-105.31796875,73.767138671875],[-105.114453125,73.74443359375],[-104.83466796875,73.647265625],[-104.71826171875,73.636279296875],[-104.64877929687499,73.614404296875],[-104.5875,73.578076171875],[-104.555078125,73.54111328125],[-104.55234375,73.465576171875],[-104.58286132812499,73.35390625],[-104.621728515625,73.3111328125],[-104.791015625,73.167626953125],[-104.96865234375,73.088671875],[-105.002587890625,73.037548828125],[-105.074609375,72.997021484375],[-105.200634765625,72.947314453125],[-105.28891601562499,72.919921875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-100.001904296875,73.9458984375],[-99.157958984375,73.731591796875],[-99.03964843749999,73.749267578125],[-98.78452148437499,73.760546875],[-98.51933593749999,73.79208984375],[-98.15185546875,73.818212890625],[-97.927734375,73.865771484375],[-97.832177734375,73.879345703125],[-97.66997070312499,73.887744140625],[-97.58183593749999,73.887548828125],[-97.32705078125,73.861865234375],[-97.224755859375,73.843798828125],[-97.17050781249999,73.824853515625],[-97.11171875,73.79033203125],[-97.01127929687499,73.70615234375],[-96.99658203125,73.67490234375],[-97.001708984375,73.66650390625],[-97.09458007812499,73.61474609375],[-97.156396484375,73.5921875],[-97.2841796875,73.570751953125],[-97.394775390625,73.564208984375],[-97.48979492187499,73.526611328125],[-97.59697265624999,73.53662109375],[-97.62587890625,73.502294921875],[-97.61459960937499,73.48134765625],[-97.58583984375,73.471142578125],[-97.53183593749999,73.473583984375],[-97.4701171875,73.488232421875],[-97.35029296875,73.48095703125],[-97.287109375,73.458447265625],[-97.23037109375,73.4212890625],[-97.27250976562499,73.38681640625],[-97.48408203125,73.339208984375],[-97.7958984375,73.285302734375],[-98.17583007812499,73.115771484375],[-98.37558593749999,73.044677734375],[-98.41684570312499,73.022509765625],[-98.436962890625,73.000244140625],[-98.430908203125,72.958056640625],[-98.42177734375,72.941015625],[-98.366650390625,72.934130859375],[-98.180810546875,72.99306640625],[-98.06103515625,73.0205078125],[-97.939404296875,73.035595703125],[-97.7248046875,73.036669921875],[-97.636328125,73.02763671875],[-97.47568359374999,72.99228515625],[-97.328759765625,72.937841796875],[-97.295849609375,72.918017578125],[-97.30991210937499,72.89814453125],[-97.37099609375,72.878125],[-97.377685546875,72.86494140625],[-97.23759765624999,72.837451171875],[-97.0830078125,72.762841796875],[-97.072900390625,72.717578125],[-97.14047851562499,72.67275390625],[-97.158935546875,72.6427734375],[-97.128125,72.627587890625],[-97.05180664062499,72.63681640625],[-96.86904296875,72.68701171875],[-96.6712890625,72.71318359375],[-96.59208984374999,72.71025390625],[-96.54208984374999,72.69873046875],[-96.489208984375,72.6298828125],[-96.44560546874999,72.55244140625],[-96.44013671875,72.4873046875],[-96.4728515625,72.434375],[-96.51987304687499,72.393115234375],[-96.63828125,72.342041015625],[-96.7455078125,72.322607421875],[-96.80146484375,72.322412109375],[-96.7958984375,72.31376953125],[-96.66875,72.271240234375],[-96.61557617187499,72.237255859375],[-96.59287109374999,72.2044921875],[-96.6005859375,72.1728515625],[-96.618115234375,72.1458984375],[-96.76630859375,72.045947265625],[-96.75830078125,72.031689453125],[-96.71728515625,72.025146484375],[-96.62436523437499,71.967578125],[-96.613427734375,71.833837890625],[-96.946484375,71.79189453125],[-97.024658203125,71.7607421875],[-97.11669921875,71.71083984375],[-97.22221679687499,71.673486328125],[-97.46123046874999,71.634228515625],[-97.582275390625,71.6296875],[-98.18134765625,71.662451171875],[-98.241943359375,71.681494140625],[-98.28388671875,71.71552734375],[-98.307080078125,71.764501953125],[-98.31337890625,71.803076171875],[-98.302685546875,71.831103515625],[-98.305810546875,71.84755859375],[-98.322705078125,71.85234375],[-98.389306640625,71.824267578125],[-98.45883789062499,71.773193359375],[-98.42080078125,71.71650390625],[-98.2314453125,71.558935546875],[-98.1953125,71.4912109375],[-98.19013671875,71.462451171875],[-98.1986328125,71.440869140625],[-98.4123046875,71.348828125],[-98.53593749999999,71.317626953125],[-98.66289062499999,71.302099609375],[-98.783837890625,71.313671875],[-98.89877929687499,71.35234375],[-98.98623046875,71.369482421875],[-99.167138671875,71.3671875],[-99.2236328125,71.387109375],[-99.27617187499999,71.42421875],[-99.40366210937499,71.557177734375],[-99.5814453125,71.6515625],[-99.73471679687499,71.7572265625],[-100.12412109374999,71.9115234375],[-100.32568359375,72.003857421875],[-100.594482421875,72.15234375],[-100.70683593749999,72.1859375],[-100.8001953125,72.1994140625],[-100.983642578125,72.21005859375],[-101.02622070312499,72.228564453125],[-101.09311523437499,72.279052734375],[-101.20854492187499,72.3169921875],[-101.25068359375,72.32177734375],[-101.31870117187499,72.312841796875],[-101.49833984374999,72.277880859375],[-101.72392578124999,72.314892578125],[-101.77451171874999,72.34091796875],[-101.804443359375,72.38505859375],[-101.83291015625,72.40927734375],[-101.909326171875,72.4310546875],[-101.97368164062499,72.4861328125],[-102.40224609375,72.5947265625],[-102.65708007812499,72.71943359375],[-102.708740234375,72.764501953125],[-102.71367187499999,72.78291015625],[-102.6875,72.842822265625],[-102.62846679687499,72.910791015625],[-102.55107421874999,72.978271484375],[-102.50380859375,73.005908203125],[-102.3361328125,73.064111328125],[-102.20400390625,73.077294921875],[-102.01962890624999,73.069921875],[-101.92246093749999,73.056982421875],[-101.835400390625,73.018017578125],[-101.798046875,72.973095703125],[-101.754541015625,72.942822265625],[-101.61777343749999,72.909716796875],[-101.543603515625,72.883056640625],[-101.43461914062499,72.821044921875],[-101.3505859375,72.7462890625],[-101.273193359375,72.7216796875],[-101.08759765625,72.71328125],[-100.89604492187499,72.725927734375],[-100.484765625,72.77294921875],[-100.468017578125,72.77880859375],[-100.442578125,72.8068359375],[-100.395703125,72.977001953125],[-100.36752929687499,72.977734375],[-100.2279296875,72.89892578125],[-100.18833007812499,72.890283203125],[-100.128125,72.906689453125],[-100.09238281249999,72.944970703125],[-100.09672851562499,72.963134765625],[-100.18447265625,73.055322265625],[-100.23618164062499,73.09541015625],[-100.282666015625,73.1203125],[-100.334375,73.128466796875],[-100.44619140625,73.120556640625],[-100.531396484375,73.13828125],[-100.5501953125,73.163720703125],[-100.536376953125,73.1978515625],[-100.48930664062499,73.233935546875],[-100.43881835937499,73.25458984375],[-100.34072265625,73.265185546875],[-100.22587890624999,73.2546875],[-100.06699218749999,73.211083984375],[-99.96640625,73.201416015625],[-99.825146484375,73.2138671875],[-100.00590820312499,73.239501953125],[-100.257958984375,73.340234375],[-100.36611328125,73.359033203125],[-100.497998046875,73.3158203125],[-100.58701171874999,73.299560546875],[-100.755322265625,73.278466796875],[-100.88935546875,73.275341796875],[-101.45087890625,73.43095703125],[-101.482080078125,73.445849609375],[-101.523193359375,73.486376953125],[-101.51845703125,73.505029296875],[-101.463037109375,73.533837890625],[-101.32314453125,73.57197265625],[-101.11494140625,73.595849609375],[-100.97578125,73.599755859375],[-100.85410156249999,73.5712890625],[-100.67680664062499,73.494287109375],[-100.5216796875,73.44931640625],[-100.508935546875,73.465478515625],[-100.536328125,73.509716796875],[-100.60712890625,73.575390625],[-100.65791015625,73.593359375],[-100.78271484375,73.612939453125],[-100.89824218749999,73.658056640625],[-100.952587890625,73.69140625],[-100.98154296874999,73.727197265625],[-100.985107421875,73.76533203125],[-100.96298828124999,73.79140625],[-100.91513671874999,73.80537109375],[-100.483642578125,73.843505859375],[-100.18232421875,73.80126953125],[-99.99111328125,73.795166015625],[-99.911865234375,73.847021484375],[-99.93950195312499,73.85712890625],[-100.04008789062499,73.843798828125],[-100.15380859375,73.844091796875],[-100.2248046875,73.872509765625],[-100.22705078125,73.889111328125],[-100.13847656249999,73.928857421875],[-100.001904296875,73.9458984375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-84.91962890625,65.261083984375],[-84.88510742187499,65.248974609375],[-84.84208984374999,65.255908203125],[-84.77128906249999,65.3052734375],[-84.6125,65.447314453125],[-84.56791992187499,65.46064453125],[-84.501123046875,65.458447265625],[-84.26640624999999,65.367236328125],[-84.17998046874999,65.31630859375],[-84.13349609375,65.245458984375],[-84.08486328125,65.217822265625],[-83.90009765625,65.18125],[-83.72255859375,65.168994140625],[-83.49077148437499,65.131787109375],[-83.40712890625,65.10390625],[-83.222265625,64.96796875],[-83.20097656249999,64.95966796875],[-82.99057617187499,64.9041015625],[-82.667626953125,64.780322265625],[-82.58579101562499,64.7619140625],[-82.2716796875,64.721142578125],[-82.15888671875,64.690673828125],[-82.05,64.644287109375],[-81.92890625,64.559423828125],[-81.78720703124999,64.4259765625],[-81.67612304687499,64.212646484375],[-81.6673828125,64.1705078125],[-81.680908203125,64.145556640625],[-81.720947265625,64.118896484375],[-81.90263671874999,64.03125],[-81.887109375,64.01640625],[-81.71611328124999,64.021875],[-81.33564453125,64.07578125],[-81.10405273437499,64.037109375],[-81.023583984375,64.0310546875],[-81.005029296875,64.03330078125],[-80.921142578125,64.10048828125],[-80.82895507812499,64.08994140625],[-80.694287109375,64.024755859375],[-80.607568359375,63.972070312499994],[-80.56884765625,63.93193359375],[-80.57919921874999,63.909228515625],[-80.66826171874999,63.90146484375],[-80.4505859375,63.862939453124994],[-80.261328125,63.801953125],[-80.30205078124999,63.76220703125],[-80.504052734375,63.673779296875],[-80.71176757812499,63.59638671875],[-80.953515625,63.4802734375],[-81.0138671875,63.462548828124994],[-81.04638671875,63.461572265624994],[-81.1796875,63.483203125],[-81.371728515625,63.5380859375],[-81.963330078125,63.664453125],[-82.14599609375,63.691162109375],[-82.378125,63.706787109375],[-82.41171875,63.7365234375],[-82.46708984374999,63.926953125],[-82.571484375,63.960693359375],[-82.9296875,64.000439453125],[-83.03388671875,64.0232421875],[-83.038671875,64.06142578125],[-83.01616210937499,64.127001953125],[-83.06513671875,64.159033203125],[-83.185546875,64.15751953125],[-83.303955078125,64.143798828125],[-83.4943359375,64.09921875],[-83.58359375,64.05810546875],[-83.61708984375,64.013427734375],[-83.63798828124999,63.917822265625],[-83.66162109375,63.872607421875],[-83.728271484375,63.813378906249994],[-84.022119140625,63.65986328125],[-84.1416015625,63.613720703125],[-84.26044921875,63.600488281249994],[-84.3076171875,63.585791015625],[-84.3875,63.5291015625],[-84.50620117187499,63.390039062499994],[-84.55458984375,63.35],[-84.63291015624999,63.309228515624994],[-84.795556640625,63.246923828125],[-84.96152343749999,63.197216796875],[-85.23813476562499,63.139306640624994],[-85.39262695312499,63.119677734375],[-85.4955078125,63.139111328125],[-85.56611328125,63.270898437499994],[-85.71416015624999,63.657958984375],[-85.738720703125,63.684130859375],[-85.7689453125,63.700341796874994],[-85.8046875,63.70654296875],[-86.30156249999999,63.656787109375],[-86.57568359375,63.6623046875],[-86.846875,63.57529296875],[-86.915234375,63.568994140624994],[-87.0529296875,63.57177734375],[-87.15190429687499,63.58564453125],[-87.1771484375,63.595117187499994],[-87.19384765625,63.6328125],[-87.188916015625,63.672265625],[-87.15439453124999,63.714892578125],[-87.03193359375,63.830419921875],[-86.93203125,63.90166015625],[-86.88603515624999,63.923730468749994],[-86.42172851562499,64.0515625],[-86.30859375,64.09365234375],[-86.252099609375,64.136865234375],[-86.252197265625,64.18125],[-86.274169921875,64.238037109375],[-86.3544921875,64.376513671875],[-86.37490234375,64.502978515625],[-86.374267578125,64.5658203125],[-86.34384765624999,64.662353515625],[-86.22763671874999,64.896337890625],[-86.18828124999999,65.010302734375],[-86.114208984375,65.41728515625],[-86.074609375,65.533837890625],[-86.01708984375,65.640283203125],[-85.961669921875,65.704248046875],[-85.81396484375,65.83193359375],[-85.69907226562499,65.883154296875],[-85.5546875,65.91865234375],[-85.523046875,65.91455078125],[-85.4955078125,65.89970703125],[-85.44243164062499,65.845556640625],[-85.24111328125,65.7955078125],[-85.176220703125,65.746875],[-85.13037109375,65.692919921875],[-85.10537109375,65.622705078125],[-85.130322265625,65.59208984375],[-85.226318359375,65.545751953125],[-85.24277343749999,65.526220703125],[-85.23994140625,65.510302734375],[-85.0560546875,65.43740234375],[-84.91962890625,65.261083984375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-75.67587890624999,68.322509765625],[-75.15380859375,68.234033203125],[-75.103125,68.201904296875],[-75.078125,68.17314453125],[-75.0634765625,68.1412109375],[-75.06235351562499,68.075390625],[-75.07285156249999,68.0490234375],[-75.12387695312499,67.98525390625],[-75.12734375,67.965234375],[-75.086376953125,67.751416015625],[-75.09052734375,67.634765625],[-75.12729492187499,67.5373046875],[-75.20195312499999,67.4591796875],[-75.31450195312499,67.400439453125],[-75.40009765625,67.36669921875],[-75.78007812499999,67.283544921875],[-76.048974609375,67.26201171875],[-76.332763671875,67.25810546875],[-76.69394531249999,67.23583984375],[-76.858837890625,67.240478515625],[-76.94418945312499,67.25029296875],[-77.0048828125,67.266943359375],[-77.075927734375,67.31962890625],[-77.15708007812499,67.408349609375],[-77.22421875,67.508203125],[-77.30439453125,67.685107421875],[-77.305908203125,67.706103515625],[-77.22856445312499,67.85009765625],[-77.12587890625,67.9470703125],[-76.9447265625,68.090966796875],[-76.740234375,68.23125],[-76.688232421875,68.25439453125],[-76.59580078124999,68.278955078125],[-76.364453125,68.318701171875],[-76.172802734375,68.3087890625],[-76.08828125,68.313818359375],[-75.98276367187499,68.33232421875],[-75.86650390624999,68.33681640625],[-75.67587890624999,68.322509765625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-79.5373046875,73.6544921875],[-79.366796875,73.641357421875],[-78.2865234375,73.6658203125],[-78.062939453125,73.64765625],[-77.38212890624999,73.536669921875],[-77.20654296875,73.499560546875],[-77.119775390625,73.45048828125],[-77.04150390625,73.373046875],[-77.005322265625,73.3560546875],[-76.75869140625,73.310009765625],[-76.65727539062499,73.25419921875],[-76.62158203125,73.225341796875],[-76.569775390625,73.15927734375],[-76.458447265625,73.121826171875],[-76.33115234374999,73.10048828125],[-76.28955078125,73.081005859375],[-76.3095703125,72.997900390625],[-76.2552734375,72.959228515625],[-76.13505859374999,72.91240234375],[-76.089990234375,72.881201171875],[-76.18339843749999,72.84306640625],[-76.400537109375,72.820654296875],[-77.01357421875,72.843994140625],[-77.8359375,72.896826171875],[-78.314208984375,72.8818359375],[-78.55405273437499,72.85771484375],[-79.1341796875,72.771630859375],[-79.3193359375,72.75771484375],[-79.50053710937499,72.75595703125],[-79.820703125,72.826318359375],[-79.93686523437499,72.863623046875],[-79.97529296875,72.89248046875],[-80.05161132812499,72.977001953125],[-80.114453125,73.07822265625],[-80.146435546875,73.161328125],[-80.18330078125,73.224658203125],[-80.292724609375,73.24560546875],[-80.617919921875,73.27080078125],[-80.72685546874999,73.30546875],[-80.77641601562499,73.3341796875],[-80.824169921875,73.3806640625],[-80.82294921875,73.428955078125],[-80.797998046875,73.471533203125],[-80.776953125,73.481982421875],[-80.73583984375,73.48310546875],[-80.82700195312499,73.53466796875],[-80.85849609374999,73.59140625],[-80.8607421875,73.670556640625],[-80.848876953125,73.721240234375],[-80.82285156249999,73.74345703125],[-80.76274414062499,73.757763671875],[-80.62138671874999,73.767333984375],[-80.4123046875,73.7654296875],[-80.120263671875,73.707080078125],[-79.88935546875,73.701513671875],[-79.5373046875,73.6544921875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-97.700927734375,76.46650390625],[-97.68974609374999,76.421826171875],[-97.70185546875,76.38740234375],[-97.73710937499999,76.363134765625],[-97.73876953125,76.33525390625],[-97.70683593749999,76.3037109375],[-97.57314453125,76.22421875],[-97.5306640625,76.18154296875],[-97.52426757812499,76.138720703125],[-97.53105468749999,76.109423828125],[-97.6134765625,76.05263671875],[-97.65,75.979150390625],[-97.65214843749999,75.940185546875],[-97.60302734375,75.879345703125],[-97.60166015624999,75.85107421875],[-97.69423828125,75.802587890625],[-97.89052734375,75.7603515625],[-97.86279296875,75.7380859375],[-97.43955078124999,75.6845703125],[-97.40751953124999,75.672509765625],[-97.409619140625,75.552099609375],[-97.33603515624999,75.41982421875],[-97.3634765625,75.417236328125],[-97.465234375,75.458642578125],[-97.6533203125,75.507763671875],[-97.87822265624999,75.41611328125],[-97.852734375,75.260302734375],[-97.70488281249999,75.1908203125],[-97.659912109375,75.151171875],[-97.67431640625,75.127294921875],[-97.79936523437499,75.116650390625],[-97.842724609375,75.121826171875],[-97.970849609375,75.153271484375],[-98.0453125,75.200830078125],[-98.06875,75.199169921875],[-98.09169921875,75.176220703125],[-98.07675781249999,75.152978515625],[-97.989990234375,75.110693359375],[-97.9533203125,75.06015625],[-97.991796875,75.04580078125],[-98.12094726562499,75.03271484375],[-98.295166015625,75.032177734375],[-98.56865234374999,75.009326171875],[-98.703515625,75.005810546875],[-98.83481445312499,75.0181640625],[-99.01005859374999,75.02109375],[-99.15581054687499,75.01572265625],[-99.24492187499999,75.02578125],[-99.326123046875,75.0494140625],[-99.42060546875,75.04375],[-99.626904296875,74.983740234375],[-99.94663085937499,75.00283203125],[-100.234375,75.00771484375],[-100.29228515624999,75.027734375],[-100.356640625,75.066748046875],[-100.48349609374999,75.188427734375],[-100.45947265625,75.219091796875],[-100.15205078125,75.23564453125],[-100.145703125,75.246142578125],[-100.36411132812499,75.28955078125],[-100.614892578125,75.321435546875],[-100.73115234375,75.346533203125],[-100.704248046875,75.3943359375],[-100.7119140625,75.40634765625],[-100.27963867187499,75.460986328125],[-99.965283203125,75.568505859375],[-99.77021484375,75.612255859375],[-99.756005859375,75.6333984375],[-99.59116210937499,75.65537109375],[-99.209423828125,75.668603515625],[-99.194580078125,75.698388671875],[-99.91513671874999,75.68125],[-100.9017578125,75.62041015625],[-101.20683593749999,75.5904296875],[-101.461328125,75.60791015625],[-102.54140625,75.513623046875],[-102.58740234375,75.513671875],[-102.700390625,75.543603515625],[-102.797509765625,75.599658203125],[-102.72783203124999,75.638720703125],[-102.41069335937499,75.712841796875],[-102.25205078124999,75.777734375],[-102.270654296875,75.81279296875],[-102.1447265625,75.875048828125],[-101.942822265625,75.883837890625],[-101.59965820312499,75.832666015625],[-101.42124023437499,75.78193359375],[-101.26142578125,75.758203125],[-101.119384765625,75.762890625],[-100.972802734375,75.7984375],[-101.009912109375,75.802392578125],[-101.25883789062499,75.783642578125],[-101.288037109375,75.789111328125],[-101.414990234375,75.845849609375],[-101.4703125,75.88193359375],[-101.50590820312499,75.91806640625],[-101.50786132812499,75.943603515625],[-101.43134765625,75.9919921875],[-101.716796875,76.00791015625],[-101.823388671875,76.041357421875],[-101.87211914062499,76.08310546875],[-101.86137695312499,76.10126953125],[-101.77138671875,76.15009765625],[-101.528955078125,76.21728515625],[-101.55703125,76.23583984375],[-101.909814453125,76.234375],[-101.987451171875,76.243115234375],[-102.13774414062499,76.28486328125],[-102.1046875,76.331201171875],[-101.96420898437499,76.3990234375],[-101.85849609374999,76.439013671875],[-101.787548828125,76.45126953125],[-101.67724609375,76.451025390625],[-101.415185546875,76.42490234375],[-101.33974609375,76.410498046875],[-101.1390625,76.345166015625],[-101.087890625,76.307861328125],[-101.094189453125,76.271923828125],[-101.055810546875,76.245556640625],[-100.90009765625,76.207080078125],[-100.2306640625,76.007666015625],[-100.105712890625,75.96044921875],[-100.02011718749999,75.93955078125],[-99.865478515625,75.92421875],[-99.774853515625,75.927392578125],[-99.70126953124999,75.941455078125],[-99.688916015625,75.959716796875],[-99.97832031249999,76.0294921875],[-100.0509765625,76.0666015625],[-100.11284179687499,76.117236328125],[-100.08579101562499,76.133544921875],[-100.00175781249999,76.139208984375],[-99.790185546875,76.1326171875],[-99.54106445312499,76.1462890625],[-99.81723632812499,76.167578125],[-99.99760742187499,76.195849609375],[-100.182763671875,76.197216796875],[-100.414208984375,76.242529296875],[-100.41435546874999,76.256689453125],[-100.3576171875,76.271142578125],[-100.042724609375,76.291259765625],[-99.98310546875,76.29990234375],[-99.977734375,76.312451171875],[-100.08188476562499,76.3427734375],[-100.17465820312499,76.35927734375],[-100.65068359374999,76.395947265625],[-100.81987304687499,76.43701171875],[-100.87363281249999,76.456591796875],[-100.890771484375,76.47548828125],[-100.829736328125,76.523876953125],[-100.57373046875,76.584619140625],[-100.387939453125,76.61357421875],[-100.06870117187499,76.634765625],[-99.8140625,76.6322265625],[-99.66904296874999,76.62412109375],[-99.3294921875,76.5212890625],[-99.16962890625,76.453662109375],[-98.89033203125,76.465576171875],[-98.97099609374999,76.536572265625],[-99.0236328125,76.61455078125],[-98.940869140625,76.6431640625],[-98.71083984375,76.69384765625],[-98.527587890625,76.6673828125],[-98.288671875,76.59873046875],[-98.23618164062499,76.575341796875],[-97.96733398437499,76.53291015625],[-97.80839843749999,76.518798828125],[-97.72587890624999,76.49609375],[-97.700927734375,76.46650390625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-103.426025390625,79.315625],[-103.191650390625,79.2953125],[-102.91435546874999,79.231103515625],[-102.652294921875,79.09501953125],[-102.63896484374999,79.077587890625],[-102.63759765625,79.05498046875],[-102.648193359375,79.0271484375],[-102.682861328125,78.991015625],[-102.73051757812499,78.9693359375],[-102.59560546875,78.94296875],[-102.58076171875,78.930126953125],[-102.5927734375,78.900927734375],[-102.576171875,78.87939453125],[-102.494580078125,78.90068359375],[-102.4248046875,78.933203125],[-102.40732421874999,78.9541015625],[-102.39316406249999,79.010302734375],[-102.18857421874999,79.03837890625],[-101.9736328125,79.07919921875],[-101.87260742187499,79.08837890625],[-101.70366210937499,79.07890625],[-101.2990234375,78.982177734375],[-101.14458007812499,78.972900390625],[-101.08847656249999,78.9615234375],[-101.03715820312499,78.939013671875],[-101.03369140625,78.914697265625],[-101.11591796875,78.85830078125],[-101.1474609375,78.823974609375],[-101.128125,78.80166015625],[-100.9169921875,78.78291015625],[-100.435498046875,78.8203125],[-100.01474609374999,78.72861328125],[-99.78183593749999,78.61962890625],[-99.60942382812499,78.583056640625],[-99.58212890624999,78.56328125],[-99.631103515625,78.544677734375],[-99.68017578125,78.493505859375],[-99.818310546875,78.45537109375],[-99.847802734375,78.438232421875],[-99.77412109375,78.39296875],[-99.76865234374999,78.36455078125],[-99.77822265625,78.32509765625],[-99.7513671875,78.302978515625],[-99.562451171875,78.279345703125],[-99.13154296875,78.117529296875],[-99.053125,78.07236328125],[-99.00458984375,78.015966796875],[-98.999609375,77.996875],[-99.061181640625,77.965625],[-99.128369140625,77.8771484375],[-99.16640625,77.85693359375],[-99.34130859375,77.8396484375],[-99.659130859375,77.824072265625],[-99.95590820312499,77.793798828125],[-100.274658203125,77.83271484375],[-100.58603515624999,77.891796875],[-100.68027343749999,77.9306640625],[-100.75791015624999,77.977685546875],[-100.77822265625,77.996044921875],[-100.8095703125,78.071630859375],[-100.826171875,78.087744140625],[-100.95761718749999,78.130224609375],[-101.07412109375,78.19384765625],[-101.297998046875,78.199365234375],[-101.8294921875,78.264111328125],[-102.05698242187499,78.279541015625],[-102.28447265624999,78.275],[-102.60698242187499,78.24892578125],[-102.66767578125,78.255908203125],[-102.72270507812499,78.275244140625],[-102.77207031249999,78.306884765625],[-102.784326171875,78.33017578125],[-102.73134765625,78.371044921875],[-103.67724609375,78.319580078125],[-103.94658203125,78.260009765625],[-104.32421875,78.269482421875],[-104.512646484375,78.29462890625],[-104.76357421875,78.35166015625],[-104.879345703125,78.40126953125],[-104.985400390625,78.468017578125],[-104.995556640625,78.518505859375],[-104.909619140625,78.55263671875],[-104.8201171875,78.572900390625],[-104.72705078125,78.57939453125],[-104.21396484374999,78.53974609375],[-103.76435546875,78.51953125],[-103.5705078125,78.53984375],[-103.482568359375,78.5939453125],[-103.58798828124999,78.622998046875],[-104.02084960937499,78.634912109375],[-103.928515625,78.66337890625],[-103.5626953125,78.69267578125],[-103.37158203125,78.736328125],[-103.4083984375,78.751611328125],[-103.518359375,78.769140625],[-104.008740234375,78.764013671875],[-104.185009765625,78.781298828125],[-104.194580078125,78.79560546875],[-104.15498046875,78.81396484375],[-103.875634765625,78.902685546875],[-103.887158203125,78.918798828125],[-104.0072265625,78.9478515625],[-104.112744140625,78.985595703125],[-104.151953125,78.989892578125],[-104.39482421875,78.95615234375],[-104.73603515625,78.825927734375],[-104.817431640625,78.807080078125],[-104.8955078125,78.808154296875],[-104.97021484375,78.829150390625],[-104.96953125,78.856494140625],[-104.89340820312499,78.890185546875],[-104.73525390625,78.99111328125],[-104.74677734375,79.027099609375],[-104.9013671875,79.051123046875],[-105.3087890625,79.033203125],[-105.53564453125,79.03251953125],[-105.570751953125,79.060986328125],[-105.58017578124999,79.114208984375],[-105.571044921875,79.164208984375],[-105.51455078125,79.24248046875],[-105.435693359375,79.30224609375],[-105.3876953125,79.323583984375],[-104.84736328125,79.310986328125],[-103.964599609375,79.34814453125],[-103.70639648437499,79.35205078125],[-103.426025390625,79.315625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-91.88554687499999,81.132861328125],[-91.75498046874999,81.04931640625],[-91.2724609375,80.85009765625],[-91.05390625,80.777685546875],[-90.68291015624999,80.6876953125],[-90.63671875,80.655322265625],[-90.632470703125,80.64169921875],[-90.643017578125,80.593701171875],[-90.537255859375,80.575927734375],[-90.21762695312499,80.5482421875],[-89.86186523437499,80.4984375],[-89.7978515625,80.50126953125],[-89.673828125,80.53076171875],[-89.5248046875,80.538818359375],[-89.329052734375,80.53173828125],[-89.235595703125,80.51064453125],[-89.16689453125,80.479638671875],[-89.13828125,80.457421875],[-89.1341796875,80.440234375],[-89.20439453124999,80.40693359375],[-89.19658203124999,80.39404296875],[-89.1546875,80.378515625],[-89.14726562499999,80.3603515625],[-89.21767578125,80.2892578125],[-89.19833984374999,80.26318359375],[-89.01923828125,80.198486328125],[-88.85732421875,80.1662109375],[-88.537548828125,80.13115234375],[-88.329248046875,80.13369140625],[-88.19990234375,80.111474609375],[-88.19682617187499,80.1251953125],[-88.25537109375,80.16650390625],[-88.38076171875,80.2251953125],[-88.6125,80.25537109375],[-88.646240234375,80.28974609375],[-88.66342773437499,80.348291015625],[-88.64365234374999,80.386865234375],[-88.5248046875,80.418017578125],[-88.42436523437499,80.428076171875],[-88.125244140625,80.4294921875],[-87.96000976562499,80.415625],[-87.675,80.372119140625],[-87.6455078125,80.3484375],[-87.6302734375,80.301611328125],[-87.618359375,80.207470703125],[-87.62548828125,80.18720703125],[-87.869140625,80.13388671875],[-87.922314453125,80.097705078125],[-87.86069335937499,80.0875],[-87.6513671875,80.079443359375],[-87.328515625,80.046533203125],[-87.20205078125,80.043212890625],[-87.076171875,79.966943359375],[-86.977197265625,79.89423828125],[-87.04951171875,79.805419921875],[-87.14423828125,79.662646484375],[-87.22026367187499,79.629931640625],[-87.295166015625,79.58017578125],[-87.24287109375,79.571142578125],[-86.925244140625,79.590966796875],[-86.86103515625,79.597705078125],[-86.648828125,79.646240234375],[-86.33696289062499,79.6349609375],[-86.23222656249999,79.622412109375],[-86.18046874999999,79.605419921875],[-86.085546875,79.551220703125],[-86.00703125,79.479443359375],[-85.948974609375,79.485986328125],[-85.803857421875,79.573046875],[-85.750927734375,79.59453125],[-85.67861328125,79.615283203125],[-85.6478515625,79.61142578125],[-85.5013671875,79.530322265625],[-85.17558593749999,79.387255859375],[-85.06376953124999,79.328173828125],[-85.042138671875,79.2845703125],[-85.18134765625,79.233740234375],[-85.28984374999999,79.208349609375],[-86.09165039062499,79.1],[-86.45053710937499,79.038671875],[-86.62944335937499,78.99130859375],[-86.72080078124999,78.97548828125],[-86.9134765625,78.9828125],[-86.957177734375,78.97490234375],[-87.01645507812499,78.898681640625],[-87.08037109374999,78.86611328125],[-87.24638671874999,78.8134765625],[-87.478759765625,78.7181640625],[-87.6173828125,78.676318359375],[-87.861474609375,78.7068359375],[-87.922314453125,78.7513671875],[-87.95625,78.851611328125],[-87.96074218749999,78.893115234375],[-87.95317382812499,78.9150390625],[-87.922607421875,78.9505859375],[-87.81674804687499,79.036328125],[-87.82939453124999,79.0453125],[-87.878369140625,79.03818359375],[-88.040185546875,78.9953125],[-88.10405273437499,78.972802734375],[-88.163818359375,78.93349609375],[-88.19023437499999,78.867431640625],[-88.16660156249999,78.7455078125],[-88.189697265625,78.69638671875],[-88.25375976562499,78.67197265625],[-88.22788085937499,78.65302734375],[-88.03701171875,78.626953125],[-88.003125,78.61552734375],[-87.98198242187499,78.5947265625],[-87.9736328125,78.56474609375],[-87.982861328125,78.537060546875],[-88.040234375,78.49443359375],[-88.14755859374999,78.477099609375],[-88.2845703125,78.496533203125],[-88.58066406249999,78.601904296875],[-88.70927734374999,78.59609375],[-88.7416015625,78.584033203125],[-88.71396484374999,78.546435546875],[-88.623046875,78.462109375],[-88.6064453125,78.3919921875],[-88.648388671875,78.333740234375],[-88.73295898437499,78.24169921875],[-88.791015625,78.192431640625],[-88.822412109375,78.185888671875],[-88.96962890625,78.184423828125],[-89.095703125,78.209228515625],[-89.47001953124999,78.37021484375],[-89.6552734375,78.4388671875],[-89.926220703125,78.573046875],[-89.995361328125,78.60068359375],[-90.037109375,78.6068359375],[-90.076318359375,78.549169921875],[-90.00102539062499,78.49580078125],[-89.757275390625,78.37021484375],[-89.61166992187499,78.27890625],[-89.5068359375,78.203271484375],[-89.48984375,78.171923828125],[-89.52568359374999,78.159619140625],[-89.5794921875,78.1666015625],[-89.651123046875,78.193017578125],[-89.873046875,78.23759765625],[-89.96518554687499,78.262451171875],[-90.02543945312499,78.291259765625],[-90.13608398437499,78.3130859375],[-90.29721679687499,78.32802734375],[-90.45903320312499,78.330908203125],[-90.62158203125,78.321728515625],[-90.65239257812499,78.30771484375],[-90.469189453125,78.2685546875],[-90.405419921875,78.2466796875],[-90.35795898437499,78.21875],[-90.32675781249999,78.184765625],[-90.386962890625,78.16328125],[-90.614404296875,78.149853515625],[-90.918115234375,78.1583984375],[-91.409619140625,78.18798828125],[-91.899169921875,78.236865234375],[-92.35126953125,78.312890625],[-92.67827148437499,78.389111328125],[-92.8076171875,78.429736328125],[-92.84824218749999,78.460107421875],[-92.7255859375,78.486669921875],[-92.29672851562499,78.52080078125],[-91.86689453125,78.54267578125],[-91.9349609375,78.56171875],[-92.71552734375,78.605029296875],[-92.97250976562499,78.612939453125],[-93.109375,78.6015625],[-93.2666015625,78.60830078125],[-93.38945312499999,78.64267578125],[-93.55205078124999,78.7078125],[-93.634423828125,78.750927734375],[-93.62333984374999,78.7677734375],[-93.56142578125,78.77734375],[-93.20834960937499,78.769189453125],[-93.15986328125,78.775634765625],[-93.33647460937499,78.808056640625],[-93.90224609375,78.872216796875],[-94.11459960937499,78.92890625],[-94.15361328124999,78.951025390625],[-94.169677734375,78.972802734375],[-94.16279296875,78.994189453125],[-93.9501953125,79.03740234375],[-93.293896484375,79.139501953125],[-93.06845703124999,79.15537109375],[-92.84160156249999,79.156396484375],[-92.68364257812499,79.185791015625],[-92.54721679687499,79.2826171875],[-91.867578125,79.317431640625],[-91.34365234375,79.360888671875],[-91.29990234374999,79.372705078125],[-91.692626953125,79.36474609375],[-92.24794921875,79.3734375],[-92.4845703125,79.4392578125],[-92.6447265625,79.450439453125],[-92.821923828125,79.44990234375],[-93.02812,79.429248046875],[-93.380859375,79.3681640625],[-93.550439453125,79.353955078125],[-93.93315429687499,79.29072265625],[-94.03984374999999,79.29521484375],[-94.093359375,79.302734375],[-94.109375,79.315087890625],[-94.040283203125,79.35703125],[-93.939697265625,79.385693359375],[-93.96025390624999,79.3955078125],[-94.110302734375,79.4015625],[-94.284130859375,79.400439453125],[-94.40488281249999,79.39052734375],[-94.84604492187499,79.33505859375],[-95.043701171875,79.2935546875],[-95.103173828125,79.289892578125],[-95.3166015625,79.354736328125],[-95.65703124999999,79.390380859375],[-95.73300781249999,79.418212890625],[-95.66289062499999,79.52734375],[-95.5634765625,79.549755859375],[-95.30234375,79.56806640625],[-94.519677734375,79.667138671875],[-94.475537109375,79.686181640625],[-94.40185546875,79.736328125],[-94.58085937499999,79.725634765625],[-94.973046875,79.677197265625],[-95.29697265624999,79.653076171875],[-95.552490234375,79.65322265625],[-95.73935546874999,79.66015625],[-95.85751953124999,79.673779296875],[-95.999658203125,79.7046875],[-96.46274414062499,79.847509765625],[-96.5890625,79.916650390625],[-96.60673828124999,79.977685546875],[-96.63920898437499,80.024169921875],[-96.77324218749999,80.135791015625],[-95.781982421875,80.06640625],[-95.39384765624999,80.053271484375],[-94.6458984375,80.04873046875],[-94.61083984375,80.055517578125],[-94.5998046875,80.0736328125],[-94.6126953125,80.102978515625],[-94.60698242187499,80.1255859375],[-94.58261718749999,80.14140625],[-94.304443359375,80.181640625],[-94.26259765625,80.194873046875],[-94.59013671874999,80.201513671875],[-95.1923828125,80.134375],[-95.40507812499999,80.135009765625],[-95.646240234375,80.23095703125],[-95.90400390625,80.214111328125],[-96.02568359374999,80.221728515625],[-96.215087890625,80.2458984375],[-96.30830078125,80.2669921875],[-96.368408203125,80.29306640625],[-96.39409179687499,80.3150390625],[-96.38535156249999,80.332861328125],[-96.334375,80.352783203125],[-96.11215820312499,80.380419921875],[-96.011865234375,80.383056640625],[-95.74736328124999,80.365283203125],[-95.549072265625,80.3666015625],[-95.614453125,80.396240234375],[-95.90107421875,80.470849609375],[-96.151806640625,80.553466796875],[-96.1328125,80.69140625],[-95.926953125,80.720654296875],[-95.713623046875,80.725439453125],[-95.5052734375,80.690576171875],[-95.225830078125,80.685791015625],[-95.02573242187499,80.646435546875],[-94.892578125,80.5708984375],[-94.73447265624999,80.57236328125],[-94.48540039062499,80.558056640625],[-93.9279296875,80.5591796875],[-94.0287109375,80.586181640625],[-94.2021484375,80.609716796875],[-94.59628906249999,80.640625],[-94.7884765625,80.75126953125],[-95.19584960937499,80.80830078125],[-95.51474609374999,80.838134765625],[-95.50927734375,80.863232421875],[-95.269775390625,81.00078125],[-94.98051757812499,81.049658203125],[-94.51943359375,81.031201171875],[-94.21630859375,81.057177734375],[-93.82597656249999,81.105712890625],[-93.44375,81.083251953125],[-93.3451171875,81.0853515625],[-93.28671875,81.10029296875],[-93.23564453124999,81.128857421875],[-93.23540039062499,81.155126953125],[-93.28593749999999,81.179248046875],[-93.40654296874999,81.20908203125],[-93.89443359375,81.21328125],[-94.1103515625,81.225],[-94.19443359374999,81.24091796875],[-94.21865234375,81.26494140625],[-94.23149414062499,81.289697265625],[-94.23295898437499,81.31513671875],[-94.2201171875,81.33076171875],[-94.179345703125,81.3392578125],[-94.059716796875,81.34931640625],[-93.6048828125,81.3505859375],[-93.332763671875,81.364404296875],[-93.03466796875,81.3462890625],[-92.41259765625,81.278271484375],[-92.21176757812499,81.243603515625],[-91.99785156249999,81.185498046875],[-91.88554687499999,81.132861328125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-94.29497070312499,76.912451171875],[-94.10795898437499,76.903759765625],[-93.94804687499999,76.91708984375],[-93.8109375,76.91416015625],[-93.6083984375,76.873828125],[-93.42075195312499,76.81220703125],[-93.2765625,76.784326171875],[-93.23002929687499,76.770263671875],[-93.211865234375,76.7546875],[-93.18925781249999,76.7080078125],[-93.18999023437499,76.686376953125],[-93.2005859375,76.669091796875],[-93.263671875,76.62646484375],[-93.31674804687499,76.573681640625],[-93.42626953125,76.5271484375],[-93.4845703125,76.492041015625],[-93.5345703125,76.447705078125],[-93.421875,76.47412109375],[-92.995361328125,76.62041015625],[-92.716259765625,76.602978515625],[-92.297021484375,76.616015625],[-91.789453125,76.67578125],[-91.5484375,76.685107421875],[-91.30502929687499,76.68076171875],[-91.124267578125,76.6619140625],[-90.738427734375,76.58134765625],[-90.60478515624999,76.54296875],[-90.554638671875,76.515771484375],[-90.542626953125,76.495751953125],[-90.62163085937499,76.464697265625],[-90.86406249999999,76.48359375],[-91.26303710937499,76.500244140625],[-91.33598632812499,76.510595703125],[-91.398095703125,76.509765625],[-91.44326171875,76.49853515625],[-91.41508789062499,76.455859375],[-91.33388671875,76.446484375],[-90.85478515624999,76.4373046875],[-89.28452148437499,76.301611328125],[-89.21909179687499,76.258203125],[-89.2365234375,76.239013671875],[-89.29208984374999,76.217724609375],[-89.40659179687499,76.18916015625],[-90.31206054687499,76.1580078125],[-90.82734375,76.185595703125],[-91.260400390625,76.22998046875],[-91.40732421874999,76.220068359375],[-91.279443359375,76.159912109375],[-91.019775390625,76.141552734375],[-90.802392578125,76.10595703125],[-90.712109375,76.076171875],[-90.2513671875,76.053466796875],[-90.176025390625,76.0302734375],[-90.03276367187499,75.9708984375],[-89.912548828125,75.96630859375],[-89.793408203125,75.924853515625],[-89.6953125,75.85361328125],[-89.650048828125,75.844091796875],[-89.51123046875,75.85693359375],[-89.277587890625,75.795068359375],[-89.20488281249999,75.76201171875],[-89.204541015625,75.737255859375],[-89.25664062499999,75.698486328125],[-89.36123046875,75.64580078125],[-89.625439453125,75.583740234375],[-89.64604492187499,75.5650390625],[-89.3373046875,75.57236328125],[-89.280419921875,75.564111328125],[-88.91669921875,75.453955078125],[-88.86884765625,75.451953125],[-88.83891601562499,75.4634765625],[-88.8041015625,75.502490234375],[-88.81962890624999,75.53857421875],[-88.86406249999999,75.588623046875],[-88.85214843749999,75.62490234375],[-88.783935546875,75.6474609375],[-88.71489257812499,75.658642578125],[-88.644970703125,75.658447265625],[-88.56904296875,75.6451171875],[-88.201318359375,75.51201171875],[-87.729736328125,75.575634765625],[-87.64365234374999,75.5470703125],[-87.572412109375,75.49365234375],[-87.53911132812499,75.48486328125],[-87.3646484375,75.59130859375],[-87.25693359374999,75.617724609375],[-86.814453125,75.491357421875],[-86.54472656249999,75.46337890625],[-86.4365234375,75.436279296875],[-86.236328125,75.40634765625],[-85.95146484374999,75.39501953125],[-85.904541015625,75.441943359375],[-86.06875,75.50224609375],[-85.97299804687499,75.5287109375],[-85.58125,75.57978515625],[-85.372314453125,75.572607421875],[-84.986767578125,75.644921875],[-84.7501953125,75.6546875],[-84.6048828125,75.653466796875],[-84.12763671875,75.762646484375],[-84.01425781249999,75.779931640625],[-83.93198242187499,75.8189453125],[-83.744580078125,75.812841796875],[-83.23710937499999,75.750830078125],[-83.093408203125,75.7564453125],[-82.553466796875,75.81826171875],[-82.35385742187499,75.833349609375],[-82.15366210937499,75.8310546875],[-81.64736328125,75.794921875],[-81.2685546875,75.756005859375],[-81.15078125,75.735546875],[-81.19267578124999,75.684375],[-81.17353515625,75.66923828125],[-81.1244140625,75.658154296875],[-81.00078124999999,75.643115234375],[-80.527734375,75.642138671875],[-80.32197265625,75.6291015625],[-80.158349609375,75.58115234375],[-80.11918945312499,75.562060546875],[-80.125732421875,75.542138671875],[-80.28662109375,75.490380859375],[-80.26044921875,75.479443359375],[-80.099609375,75.467431640625],[-79.7376953125,75.461474609375],[-79.66020507812499,75.44951171875],[-79.58574218749999,75.38486328125],[-79.5078125,75.295361328125],[-79.50908203124999,75.259814453125],[-79.634423828125,75.19931640625],[-79.97714843749999,75.118603515625],[-80.357568359375,75.0515625],[-80.381982421875,75.0341796875],[-80.26064453125,75.0021484375],[-80.13525390625,74.9880859375],[-80.03642578124999,74.99091796875],[-79.73300781249999,75.021435546875],[-79.6640625,75.020849609375],[-79.5248046875,74.989697265625],[-79.460400390625,74.9587890625],[-79.40141601562499,74.917626953125],[-79.507958984375,74.880126953125],[-79.944482421875,74.833642578125],[-80.20244140624999,74.89482421875],[-80.289208984375,74.90830078125],[-80.34775390624999,74.902978515625],[-80.31455078124999,74.876171875],[-80.18974609374999,74.827685546875],[-80.14892578125,74.795703125],[-80.19223632812499,74.78017578125],[-80.21269531249999,74.749462890625],[-80.21025390624999,74.70361328125],[-80.22060546875,74.65703125],[-80.26274414062499,74.58447265625],[-80.277734375,74.581591796875],[-81.226220703125,74.566650390625],[-81.340478515625,74.553515625],[-81.607177734375,74.50234375],[-81.808837890625,74.476611328125],[-81.940185546875,74.472705078125],[-82.068505859375,74.482080078125],[-82.41474609375,74.535205078125],[-82.64541015625,74.5251953125],[-82.735791015625,74.5302734375],[-82.9310546875,74.565576171875],[-82.97841796875,74.583447265625],[-83.0576171875,74.62978515625],[-83.11699218749999,74.693115234375],[-83.1123046875,74.73212890625],[-83.0873046875,74.78837890625],[-83.10263671874999,74.816552734375],[-83.15830078124999,74.816748046875],[-83.2203125,74.82841796875],[-83.40703124999999,74.884814453125],[-83.52207031249999,74.90146484375],[-83.54355468749999,74.89228515625],[-83.509765625,74.848193359375],[-83.4873046875,74.834130859375],[-83.364208984375,74.801904296875],[-83.34130859375,74.764599609375],[-83.393701171875,74.670166015625],[-83.41220703124999,74.65498046875],[-83.531884765625,74.585693359375],[-83.62187,74.56591796875],[-83.86806640625,74.564404296875],[-84.24516601562499,74.515185546875],[-84.425537109375,74.50810546875],[-84.66708984374999,74.519580078125],[-84.81826171875,74.5419921875],[-84.91630859374999,74.56767578125],[-85.01152343749999,74.60419921875],[-85.06142578125,74.60693359375],[-85.08676757812499,74.527685546875],[-85.133447265625,74.517431640625],[-85.214306640625,74.51865234375],[-85.3392578125,74.543310546875],[-85.442333984375,74.6005859375],[-85.47441406249999,74.600341796875],[-85.488671875,74.5669921875],[-85.51171875,74.5451171875],[-85.54350585937499,74.534765625],[-85.8080078125,74.498974609375],[-85.95561523437499,74.498779296875],[-86.10986328125,74.53974609375],[-86.2109375,74.535595703125],[-86.340576171875,74.5134765625],[-86.655419921875,74.555419921875],[-86.73076171874999,74.55703125],[-86.66611328124999,74.489111328125],[-86.770166015625,74.47861328125],[-86.99472656249999,74.480322265625],[-87.36376953125,74.502197265625],[-87.59257812499999,74.470361328125],[-88.005859375,74.48935546875],[-88.423046875,74.494140625],[-88.500732421875,74.509716796875],[-88.5556640625,74.541455078125],[-88.557861328125,74.5697265625],[-88.53764648437499,74.6087890625],[-88.47661132812499,74.66689453125],[-88.37470703125,74.744140625],[-88.33955078125,74.78486328125],[-88.43144531249999,74.8037109375],[-88.48818359375,74.82890625],[-88.53496093749999,74.83173828125],[-88.68203125,74.802001953125],[-88.77783203125,74.715185546875],[-88.85107421875,74.689990234375],[-88.88339843749999,74.711083984375],[-88.9078125,74.763818359375],[-88.94013671875,74.789501953125],[-88.98037109375,74.7880859375],[-89.01962890624999,74.7740234375],[-89.057861328125,74.747265625],[-89.11528320312499,74.73759765625],[-89.19194335937499,74.744873046875],[-89.219140625,74.731787109375],[-89.19682617187499,74.6982421875],[-89.1890625,74.666845703125],[-89.19580078125,74.637548828125],[-89.261865234375,74.6091796875],[-89.45,74.567919921875],[-89.55869140624999,74.554736328125],[-89.844384765625,74.548583984375],[-90.01533203125,74.560888671875],[-90.36162109374999,74.61044921875],[-90.55327148437499,74.612744140625],[-90.78408203125,74.6958984375],[-90.966796875,74.715087890625],[-90.95751953125,74.745166015625],[-90.87763671875,74.80107421875],[-90.88022460937499,74.8177734375],[-91.1298828125,74.736279296875],[-91.163720703125,74.71025390625],[-91.13457031249999,74.649853515625],[-91.167724609375,74.6455078125],[-91.339453125,74.667236328125],[-91.50834960937499,74.65068359375],[-91.54912109374999,74.65556640625],[-91.665771484375,74.699169921875],[-91.871044921875,74.743505859375],[-91.961572265625,74.793212890625],[-92.1025390625,74.948388671875],[-92.17416992187499,75.05107421875],[-92.165234375,75.072021484375],[-92.060498046875,75.1009765625],[-92.076318359375,75.12353515625],[-92.20683593749999,75.18125],[-92.34746093749999,75.22978515625],[-92.38925781249999,75.263330078125],[-92.408349609375,75.297265625],[-92.42709960937499,75.34638671875],[-92.427978515625,75.38271484375],[-92.411083984375,75.40625],[-92.33066406249999,75.479443359375],[-92.11044921874999,75.61064453125],[-92.080712890625,75.63447265625],[-92.06884765625,75.65791015625],[-92.09916992187499,75.727294921875],[-92.141845703125,75.796826171875],[-92.18510742187499,75.846533203125],[-92.306591796875,75.91513671875],[-92.47373046874999,75.986474609375],[-92.70888671875,76.114453125],[-92.88330078125,76.21396484375],[-93.091748046875,76.35400390625],[-93.19228515625,76.366015625],[-93.30859375,76.359619140625],[-93.5599609375,76.31142578125],[-93.64443359375,76.288525390625],[-93.665185546875,76.27314453125],[-93.85234374999999,76.269677734375],[-94.382568359375,76.28232421875],[-94.5853515625,76.29716796875],[-94.73671875,76.29326171875],[-94.99663085937499,76.25771484375],[-95.273876953125,76.264404296875],[-95.447412109375,76.363037109375],[-95.84165039062499,76.416162109375],[-95.95927734374999,76.44599609375],[-96.039697265625,76.48671875],[-96.0130859375,76.513330078125],[-95.78886718749999,76.53720703125],[-95.695703125,76.563427734375],[-95.65097656249999,76.58466796875],[-95.873193359375,76.56640625],[-95.971337890625,76.56962890625],[-96.63969726562499,76.7029296875],[-96.845654296875,76.726416015625],[-96.88071289062499,76.738330078125],[-96.89799804687499,76.75400390625],[-96.89755859374999,76.773486328125],[-96.87802734374999,76.802783203125],[-96.67939453125,76.765771484375],[-96.590283203125,76.763037109375],[-96.451171875,76.774072265625],[-96.4015625,76.797216796875],[-96.433203125,76.810693359375],[-96.66103515625,76.85517578125],[-96.771142578125,76.888916015625],[-96.81352539062499,76.9134765625],[-96.76982421874999,76.9482421875],[-96.75830078125,76.97177734375],[-96.68510742187499,76.985009765625],[-96.55009765624999,76.987939453125],[-96.37729492187499,77.00458984375],[-96.06123046875,77.050048828125],[-95.84951171875,77.0662109375],[-95.63823242187499,77.06376953125],[-95.126416015625,77.017333984375],[-94.61611328125,76.958349609375],[-94.29497070312499,76.912451171875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-96.2044921875,78.531298828125],[-95.96845703125,78.505126953125],[-95.56113281249999,78.5166015625],[-95.41293945312499,78.49755859375],[-95.031201171875,78.4302734375],[-94.91538085937499,78.39052734375],[-94.88774414062499,78.360498046875],[-94.887158203125,78.34521484375],[-95.0138671875,78.31259765625],[-95.26787109374999,78.262646484375],[-95.329248046875,78.225048828125],[-95.102734375,78.178076171875],[-94.98779296875,78.136279296875],[-94.93603515625,78.106396484375],[-94.93427734375,78.075634765625],[-95.08701171874999,77.992626953125],[-95.19912109375,77.9681640625],[-95.3705078125,77.97080078125],[-95.4515625,77.963232421875],[-95.67080078125,77.924462890625],[-96.01157226562499,77.88740234375],[-96.47685546874999,77.87216796875],[-96.60302734375,77.84931640625],[-96.833984375,77.8119140625],[-96.9896484375,77.806005859375],[-97.040478515625,77.82744140625],[-97.06381835937499,77.85908203125],[-97.051953125,77.88095703125],[-97.01909179687499,77.90810546875],[-97.09331054687499,77.93349609375],[-97.42666015625,77.982275390625],[-97.620849609375,78.050244140625],[-97.648388671875,78.071630859375],[-97.658154296875,78.090625],[-97.22661132812499,78.10322265625],[-97.04091796875,78.116943359375],[-96.95834960937499,78.139013671875],[-96.94467773437499,78.15185546875],[-97.02734375,78.157421875],[-97.32304687499999,78.20322265625],[-97.81904296875,78.230615234375],[-97.842724609375,78.262353515625],[-98.04951171875,78.325927734375],[-98.069287109375,78.386328125],[-98.11430664062499,78.40302734375],[-98.25493164062499,78.429248046875],[-98.27568359374999,78.437890625],[-98.317333984375,78.47685546875],[-98.32373046875,78.49814453125],[-98.315625,78.51748046875],[-98.06035156249999,78.558349609375],[-98.09599609374999,78.586669921875],[-98.28989257812499,78.6923828125],[-98.3408203125,78.751220703125],[-98.33261718749999,78.77353515625],[-98.212109375,78.804541015625],[-98.04287109375,78.805224609375],[-97.5958984375,78.79580078125],[-97.38232421875,78.78291015625],[-97.1693359375,78.757666015625],[-96.935791015625,78.720263671875],[-96.587060546875,78.687109375],[-96.475341796875,78.665185546875],[-96.265283203125,78.595361328125],[-96.242626953125,78.573193359375],[-96.256494140625,78.551123046875],[-96.2044921875,78.531298828125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-110.458056640625,78.10322265625],[-109.656884765625,78.079248046875],[-109.622265625,78.074755859375],[-109.61904296875,78.0568359375],[-109.67939453125,77.99931640625],[-109.77177734375,77.957421875],[-110.19951171875,77.904833984375],[-110.751123046875,77.8572265625],[-110.865625,77.834130859375],[-110.85654296874999,77.820361328125],[-110.81162109374999,77.803173828125],[-110.719384765625,77.7814453125],[-110.2921875,77.786376953125],[-110.189208984375,77.777001953125],[-110.152734375,77.762939453125],[-110.130859375,77.7423828125],[-110.117578125,77.715576171875],[-110.11689453125,77.62470703125],[-110.139453125,77.572119140625],[-110.198486328125,77.52451171875],[-110.371533203125,77.490625],[-110.682861328125,77.4458984375],[-110.893994140625,77.4259765625],[-111.06044921875,77.433154296875],[-111.226220703125,77.428515625],[-111.951953125,77.344189453125],[-112.176513671875,77.34375],[-112.37265625,77.364111328125],[-112.643798828125,77.443701171875],[-112.92563476562499,77.474951171875],[-113.046044921875,77.5107421875],[-113.16435546875,77.5302734375],[-113.19711914062499,77.558837890625],[-113.208544921875,77.58017578125],[-113.188623046875,77.599755859375],[-113.13740234375,77.617529296875],[-113.120654296875,77.6326171875],[-113.1677734375,77.67646484375],[-113.189501953125,77.718310546875],[-113.2712890625,77.77841796875],[-113.283447265625,77.813037109375],[-113.282958984375,77.83564453125],[-113.2693359375,77.86005859375],[-113.21518554687499,77.903515625],[-113.187060546875,77.912353515625],[-113.021630859375,77.919140625],[-112.80454101562499,77.9416015625],[-112.30458984375,78.006787109375],[-111.206591796875,78.088134765625],[-110.8732421875,78.080615234375],[-110.72734375,78.09658203125],[-110.458056640625,78.10322265625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-115.55126953125,77.36328125],[-115.4755859375,77.32431640625],[-115.47021484375,77.308642578125],[-115.506640625,77.292138671875],[-115.62392578125,77.26591796875],[-116.213720703125,77.17822265625],[-116.32919921875,77.137060546875],[-116.2857421875,77.10166015625],[-116.073095703125,77.02998046875],[-115.8568359375,76.96923828125],[-115.81005859375,76.939111328125],[-115.912890625,76.908447265625],[-116.109765625,76.918212890625],[-116.183251953125,76.915576171875],[-116.25273437499999,76.901416015625],[-116.233984375,76.87431640625],[-116.0162109375,76.784521484375],[-115.944580078125,76.73623046875],[-115.9462890625,76.711279296875],[-115.984814453125,76.6869140625],[-116.07622070312499,76.653515625],[-116.220458984375,76.611083984375],[-116.467626953125,76.5771484375],[-116.99921875,76.531591796875],[-117.016796875,76.49609375],[-117.01328125,76.469091796875],[-117.02617187499999,76.403515625],[-117.04448242187499,76.373095703125],[-117.107763671875,76.321923828125],[-117.15390625,76.297998046875],[-117.23359375,76.28154296875],[-117.346923828125,76.27255859375],[-117.4923828125,76.272705078125],[-117.732421875,76.316748046875],[-117.84140625,76.34482421875],[-117.99296874999999,76.405810546875],[-118.02021484375,76.446533203125],[-118.00541992187499,76.4966796875],[-117.9654296875,76.5740234375],[-117.89951171875,76.653076171875],[-117.8076171875,76.733935546875],[-117.78046875,76.78427734375],[-117.81791992187499,76.8041015625],[-117.880810546875,76.805078125],[-118.076416015625,76.77236328125],[-118.202783203125,76.760498046875],[-118.30058593749999,76.736669921875],[-118.369873046875,76.7009765625],[-118.409130859375,76.6623046875],[-118.431005859375,76.58798828125],[-118.4681640625,76.54736328125],[-118.573681640625,76.5251953125],[-118.73154296875,76.5255859375],[-118.79140625,76.51298828125],[-118.820751953125,76.48583984375],[-118.799560546875,76.46376953125],[-118.643896484375,76.417529296875],[-118.62451171875,76.365869140625],[-118.643408203125,76.33466796875],[-118.81157226562499,76.277099609375],[-118.85112304687499,76.2578125],[-118.95546875,76.16767578125],[-118.99394531249999,76.144873046875],[-119.080712890625,76.124072265625],[-119.168212890625,76.126513671875],[-119.249267578125,76.15947265625],[-119.367919921875,76.22177734375],[-119.44780273437499,76.275390625],[-119.48881835937499,76.3203125],[-119.52373046874999,76.340283203125],[-119.58037109374999,76.326513671875],[-119.64892578125,76.2798828125],[-119.65078125,76.243701171875],[-119.63583984375,76.189892578125],[-119.6396484375,76.156689453125],[-119.7396484375,76.117724609375],[-119.7251953125,76.099951171875],[-119.54970703125,76.05205078125],[-119.52714843749999,76.03056640625],[-119.526123046875,75.997216796875],[-119.537744140625,75.982177734375],[-119.60795898437499,75.9845703125],[-119.667138671875,75.94599609375],[-119.734814453125,75.9154296875],[-119.91289062499999,75.858837890625],[-120.160546875,75.851953125],[-120.365380859375,75.824755859375],[-120.40888671875,75.825634765625],[-120.45830078124999,75.870166015625],[-120.513818359375,75.958349609375],[-120.56328124999999,76.008447265625],[-120.637158203125,76.034033203125],[-120.728662109375,76.13408203125],[-120.77158203125,76.16630859375],[-120.81337890625,76.179296875],[-120.848388671875,76.182666015625],[-120.90009765625,76.163427734375],[-121.019287109375,76.020263671875],[-121.2134765625,75.98369140625],[-121.320166015625,75.977001953125],[-121.427978515625,75.981103515625],[-121.69453125,76.0203125],[-121.908203125,76.034765625],[-122.05742187499999,76.018212890625],[-122.302734375,75.959814453125],[-122.40048828125,75.94423828125],[-122.533056640625,75.950927734375],[-122.59111328124999,75.972998046875],[-122.640478515625,76.00908203125],[-122.645947265625,76.031005859375],[-122.607373046875,76.038671875],[-122.546240234375,76.080517578125],[-122.548193359375,76.097314453125],[-122.608642578125,76.121435546875],[-122.60947265625,76.140283203125],[-122.587890625,76.152978515625],[-122.592724609375,76.162060546875],[-122.62392578125,76.16748046875],[-122.68466796875,76.16240234375],[-122.902783203125,76.134716796875],[-122.878271484375,76.164794921875],[-122.7740234375,76.227685546875],[-122.519384765625,76.353173828125],[-122.423046875,76.390087890625],[-122.365380859375,76.401220703125],[-121.61376953125,76.441455078125],[-121.5611328125,76.453466796875],[-121.20390624999999,76.62216796875],[-121.102001953125,76.6607421875],[-120.99760742187499,76.691455078125],[-120.4853515625,76.793212890625],[-120.43759765625,76.816455078125],[-120.357666015625,76.8869140625],[-120.3109375,76.90458984375],[-120.200341796875,76.93134765625],[-119.83115234375,77.073876953125],[-119.49482421875,77.176904296875],[-119.323974609375,77.240673828125],[-119.090185546875,77.305078125],[-118.82001953125,77.33271484375],[-118.00517578124999,77.381201171875],[-117.418603515625,77.3173828125],[-117.27910156249999,77.31337890625],[-117.210791015625,77.3314453125],[-117.14897460937499,77.36083984375],[-117.061376953125,77.348486328125],[-116.84355468749999,77.33955078125],[-116.7953125,77.34658203125],[-116.70361328125,77.379931640625],[-116.766259765625,77.3982421875],[-117.02978515625,77.431884765625],[-117.045751953125,77.448974609375],[-117.03974609375,77.46513671875],[-116.94716796875,77.503857421875],[-116.835302734375,77.528857421875],[-116.511328125,77.547607421875],[-116.36259765624999,77.542822265625],[-116.20888671875,77.516015625],[-116.0080078125,77.46064453125],[-115.55126953125,77.36328125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-108.2923828125,76.05712890625],[-108.16630859375,76.054296875],[-108.01875,76.065234375],[-107.852294921875,76.05771484375],[-107.77685546875,76.035302734375],[-107.72348632812499,75.99541015625],[-107.72128906249999,75.9740234375],[-107.7318359375,75.955615234375],[-107.75517578125,75.940283203125],[-107.97041015625,75.839599609375],[-108.020703125,75.80478515625],[-107.95107421875,75.7962890625],[-107.917529296875,75.8021484375],[-107.702587890625,75.877587890625],[-107.54091796875,75.901171875],[-107.41826171875,75.906591796875],[-107.2162109375,75.891552734375],[-107.135693359375,75.878564453125],[-107.08041992187499,75.86318359375],[-107.050390625,75.84541015625],[-106.970947265625,75.773095703125],[-106.913525390625,75.679638671875],[-106.90419921875,75.6892578125],[-106.902783203125,75.741650390625],[-106.89169921874999,75.782421875],[-106.693115234375,75.8099609375],[-106.68808593749999,75.81904296875],[-106.759375,75.8416015625],[-106.820068359375,75.872412109375],[-106.862060546875,75.930078125],[-106.845654296875,75.9515625],[-106.8041015625,75.974658203125],[-106.677001953125,76.02373046875],[-106.52861328125,76.05302734375],[-106.39658203124999,76.060107421875],[-105.904833984375,76.008984375],[-105.711328125,75.9669921875],[-105.63266601562499,75.945361328125],[-105.604443359375,75.929931640625],[-105.56328125,75.8806640625],[-105.480908203125,75.745654296875],[-105.4814453125,75.70224609375],[-105.519482421875,75.632373046875],[-105.67841796875,75.5013671875],[-105.70263671875,75.4125],[-105.86259765625,75.191552734375],[-105.97197265625,75.131494140625],[-106.09262695312499,75.089453125],[-106.58823242187499,75.0154296875],[-106.9611328125,74.940087890625],[-107.055615234375,74.928173828125],[-107.15341796874999,74.9271484375],[-107.4619140625,74.9521484375],[-107.820068359375,75.000048828125],[-108.0236328125,74.986474609375],[-108.226611328125,74.951904296875],[-108.354443359375,74.942626953125],[-108.474755859375,74.947216796875],[-108.594189453125,74.9595703125],[-108.75131835937499,74.991943359375],[-108.67026367187499,75.00673828125],[-108.63330078125,75.023291015625],[-108.666015625,75.04033203125],[-108.831298828125,75.064892578125],[-109.00253906249999,75.010302734375],[-109.503125,74.882763671875],[-110.17578125,74.839990234375],[-110.38671875,74.81396484375],[-110.543408203125,74.78037109375],[-110.624755859375,74.752685546875],[-110.74931640625,74.6876953125],[-110.940869140625,74.638720703125],[-111.287548828125,74.58515625],[-111.7287109375,74.501953125],[-112.5193359375,74.416845703125],[-113.01689453125,74.401904296875],[-113.5140625,74.430078125],[-113.67158203125,74.45302734375],[-113.83681640625,74.48896484375],[-114.174755859375,74.57373046875],[-114.26826171875,74.604345703125],[-114.376953125,74.670849609375],[-114.3126953125,74.715087890625],[-114.132470703125,74.76611328125],[-113.862890625,74.812548828125],[-113.32431640624999,74.87529296875],[-112.835986328125,74.9755859375],[-112.663037109375,74.99443359375],[-112.192822265625,75.009765625],[-111.95576171875,75.000390625],[-111.784228515625,75.0056640625],[-111.67109375,75.01943359375],[-111.50327148437499,75.055615234375],[-111.257958984375,75.127734375],[-111.07890625,75.19521484375],[-111.03349609375,75.2267578125],[-111.09345703125,75.256298828125],[-111.181201171875,75.26044921875],[-111.47392578125,75.19111328125],[-111.620849609375,75.1677734375],[-111.780859375,75.166162109375],[-112.00048828125,75.142431640625],[-112.21416015625,75.13291015625],[-112.255517578125,75.13369140625],[-112.478076171875,75.2],[-112.5970703125,75.211669921875],[-112.652392578125,75.2046875],[-112.703125,75.187158203125],[-112.799609375,75.13818359375],[-112.85532226562499,75.12060546875],[-112.9513671875,75.1078125],[-113.3396484375,75.09326171875],[-113.71176757812499,75.068603515625],[-113.79462890625,75.083837890625],[-113.844970703125,75.11220703125],[-113.85537109375,75.1294921875],[-113.8609375,75.187744140625],[-113.88603515625,75.2109375],[-113.8533203125,75.259375],[-113.81088867187499,75.296337890625],[-113.7587890625,75.321728515625],[-113.50302734374999,75.3966796875],[-113.46708984375,75.41611328125],[-113.58896484374999,75.412109375],[-113.878515625,75.375439453125],[-113.91635742187499,75.38818359375],[-113.984130859375,75.430078125],[-114.01650390625,75.43427734375],[-114.05341796875,75.41689453125],[-114.07490234375,75.3923828125],[-114.124658203125,75.2912109375],[-114.16845703125,75.239501953125],[-114.2849609375,75.249951171875],[-114.42900390625,75.28115234375],[-114.4828125,75.285400390625],[-114.513818359375,75.27548828125],[-114.503955078125,75.2580078125],[-114.35776367187499,75.1712890625],[-114.356103515625,75.140966796875],[-114.45175781249999,75.087890625],[-114.8591796875,74.999755859375],[-115.02011718749999,74.976171875],[-115.07705078125,74.985302734375],[-115.1283203125,75.00947265625],[-115.173828125,75.048828125],[-115.27963867187499,75.1015625],[-115.34262695312499,75.11337890625],[-115.41318359374999,75.114990234375],[-115.478076171875,75.1041015625],[-115.5373046875,75.080712890625],[-115.57407226562499,75.055859375],[-115.608984375,75.0095703125],[-115.683154296875,74.974169921875],[-115.72885742187499,74.968115234375],[-116.14262695312499,75.041552734375],[-116.47607421875,75.17177734375],[-116.841015625,75.151513671875],[-117.004833984375,75.156103515625],[-117.501953125,75.203857421875],[-117.56523437499999,75.233349609375],[-117.60009765625,75.2716796875],[-117.59672851562499,75.292529296875],[-117.57607421875,75.3140625],[-117.513134765625,75.356787109375],[-117.38779296875,75.421484375],[-117.335546875,75.442333984375],[-117.25761718749999,75.459521484375],[-117.15419921875,75.472998046875],[-116.890771484375,75.480517578125],[-116.212744140625,75.482958984375],[-116.0771484375,75.49296875],[-115.3353515625,75.61806640625],[-115.25068359375,75.63857421875],[-115.141845703125,75.678515625],[-115.117236328125,75.69501953125],[-115.121875,75.705810546875],[-116.034326171875,75.606689453125],[-116.425634765625,75.5853515625],[-117.02519531249999,75.601513671875],[-117.137939453125,75.617138671875],[-117.16362304687499,75.644873046875],[-117.03857421875,75.718408203125],[-116.97265625,75.745751953125],[-116.8021484375,75.77158203125],[-116.3896484375,75.808203125],[-115.8380859375,75.840576171875],[-115.47685546875,75.84130859375],[-115.17373046875,75.8669921875],[-114.99150390625,75.896337890625],[-115.60224609375,75.89482421875],[-116.337890625,75.8810546875],[-116.44423828125,75.890625],[-116.654296875,75.929296875],[-116.66455078125,75.957568359375],[-116.58046875,75.991552734375],[-116.549658203125,76.016845703125],[-116.609765625,76.07373046875],[-116.59130859375,76.09580078125],[-116.454248046875,76.143212890625],[-116.20986328125,76.19443359375],[-116.05913085937499,76.201708984375],[-115.76826171875,76.184228515625],[-114.939404296875,76.16611328125],[-114.77861328125,76.172607421875],[-114.88017578125,76.194873046875],[-115.024560546875,76.211474609375],[-115.664453125,76.23984375],[-115.796875,76.2525390625],[-115.82216796875,76.27001953125],[-115.83173828125,76.29580078125],[-115.8255859375,76.329833984375],[-115.779296875,76.364697265625],[-115.58066406249999,76.4375],[-114.998486328125,76.4974609375],[-114.766845703125,76.505712890625],[-114.534765625,76.5017578125],[-114.298974609375,76.4748046875],[-114.19394531249999,76.45146484375],[-114.141259765625,76.42265625],[-114.115771484375,76.395849609375],[-114.11279296875,76.349462890625],[-114.10146484375,76.331201171875],[-114.058837890625,76.300732421875],[-113.923291015625,76.229150390625],[-113.823486328125,76.2068359375],[-113.36298828125,76.2484375],[-113.1712890625,76.257763671875],[-112.978466796875,76.244677734375],[-112.69760742187499,76.201708984375],[-112.33388671875,76.071875],[-111.865234375,75.939306640625],[-111.867626953125,75.9107421875],[-112.04716796875,75.86640625],[-112.08090820312499,75.847412109375],[-112.056689453125,75.834228515625],[-111.877392578125,75.825537109375],[-111.709375,75.832080078125],[-111.54912109375,75.822119140625],[-111.513232421875,75.810693359375],[-111.45444335937499,75.762158203125],[-111.37275390625,75.67646484375],[-111.27568359375,75.6125],[-111.16328125,75.57021484375],[-111.052685546875,75.54853515625],[-110.889599609375,75.546923828125],[-110.7255859375,75.559521484375],[-110.459375,75.555322265625],[-109.086376953125,75.506494140625],[-109.005029296875,75.514990234375],[-108.94716796875,75.541796875],[-108.91259765625,75.586962890625],[-108.89951171874999,75.624072265625],[-108.918212890625,75.674755859375],[-108.944775390625,75.698974609375],[-109.796044921875,75.863037109375],[-109.8705078125,75.929052734375],[-109.454638671875,76.021240234375],[-109.424755859375,76.042529296875],[-109.41660156249999,76.071826171875],[-109.43037109375,76.109130859375],[-109.48681640625,76.144677734375],[-109.71015625,76.212451171875],[-109.9078125,76.22265625],[-110.20078125,76.289453125],[-110.247021484375,76.30634765625],[-110.28486328125,76.332958984375],[-110.314453125,76.369384765625],[-110.30947265625,76.397412109375],[-110.27001953125,76.4169921875],[-109.981591796875,76.484765625],[-109.86484375,76.52236328125],[-109.505029296875,76.691650390625],[-109.338525390625,76.7599609375],[-109.21953125,76.7919921875],[-109.09824218749999,76.811865234375],[-108.831640625,76.821142578125],[-108.55390625,76.758056640625],[-108.4923828125,76.75419921875],[-108.4669921875,76.73759765625],[-108.477783203125,76.708251953125],[-108.512451171875,76.6802734375],[-108.61181640625,76.629736328125],[-108.63515625,76.608544921875],[-108.62763671875,76.58671875],[-108.559521484375,76.536328125],[-108.538623046875,76.503125],[-108.52353515624999,76.44716796875],[-108.5125,76.438916015625],[-108.345458984375,76.391650390625],[-108.1935546875,76.330078125],[-108.123193359375,76.233447265625],[-108.1779296875,76.200048828125],[-108.305810546875,76.154052734375],[-108.381884765625,76.11572265625],[-108.40615234375,76.08505859375],[-108.38681640624999,76.066552734375],[-108.2923828125,76.05712890625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-93.170849609375,74.160986328125],[-92.77802734375,74.113720703125],[-92.58681640625,74.08271484375],[-92.492822265625,74.062060546875],[-92.3138671875,73.9923828125],[-92.22270507812499,73.97236328125],[-91.874169921875,74.01279296875],[-91.63041992187499,74.027783203125],[-91.08798828124999,74.00927734375],[-90.62744140625,73.951708984375],[-90.4580078125,73.9083984375],[-90.35458984374999,73.86865234375],[-90.38139648437499,73.824755859375],[-90.46616210937499,73.753857421875],[-90.565576171875,73.68642578125],[-90.76455078125,73.580615234375],[-90.93369140624999,73.527685546875],[-90.97548828125,73.502294921875],[-91.001953125,73.46708984375],[-91.067626953125,73.41552734375],[-91.24931640624999,73.30400390625],[-91.297802734375,73.284912109375],[-91.5537109375,73.236083984375],[-91.466015625,73.214208984375],[-91.425927734375,73.194873046875],[-91.459619140625,73.145361328125],[-91.62099609375,73.02587890625],[-91.788330078125,72.915380859375],[-91.90532226562499,72.84931640625],[-92.117919921875,72.75380859375],[-92.23491210937499,72.726806640625],[-92.39194335937499,72.71845703125],[-93.34062,72.80185546875],[-93.57866210937499,72.800537109375],[-94.211328125,72.75693359375],[-94.15170898437499,72.73564453125],[-93.92001953124999,72.703369140625],[-93.77055664062499,72.668212890625],[-93.572265625,72.558642578125],[-93.546484375,72.531298828125],[-93.533935546875,72.499462890625],[-93.54160156249999,72.43701171875],[-93.55517578125,72.421142578125],[-93.87060546875,72.25263671875],[-93.97255859375,72.12998046875],[-94.037548828125,72.028759765625],[-94.14375,72.000830078125],[-94.49716796874999,72.043603515625],[-94.61123046875,72.042333984375],[-95.00786132812499,72.01279296875],[-95.19296875,72.02744140625],[-95.16679687499999,72.180029296875],[-95.19267578124999,72.344775390625],[-95.25102539062499,72.501953125],[-95.547607421875,72.78154296875],[-95.580322265625,72.83115234375],[-95.60214843749999,72.88447265625],[-95.61318359375,72.9416015625],[-95.61220703125,72.999072265625],[-95.59160156249999,73.115283203125],[-95.5892578125,73.174169921875],[-95.60410156249999,73.327734375],[-95.64423828125,73.557470703125],[-95.64799804687499,73.638525390625],[-95.645263671875,73.67080078125],[-95.63291015624999,73.695458984375],[-95.56943359374999,73.728173828125],[-95.447412109375,73.75166015625],[-95.385986328125,73.755126953125],[-94.99614257812499,73.6857421875],[-94.816845703125,73.662548828125],[-94.69760742187499,73.66357421875],[-94.691015625,73.671435546875],[-94.79716796874999,73.686083984375],[-94.896923828125,73.716015625],[-95.05947265625,73.805078125],[-95.13413085937499,73.88125],[-95.14902343749999,73.906396484375],[-95.152587890625,73.932763671875],[-95.144775390625,73.960302734375],[-95.12119140624999,73.98505859375],[-95.03984374999999,74.023876953125],[-94.97353515625,74.04140625],[-94.728955078125,74.085986328125],[-94.482568359375,74.113134765625],[-93.93881835937499,74.131591796875],[-93.784619140625,74.118359375],[-93.54921875,74.167138671875],[-93.410302734375,74.178759765625],[-93.170849609375,74.160986328125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-97.439453125,69.64267578125],[-97.408642578125,69.63076171875],[-97.35068359374999,69.640869140625],[-97.30576171874999,69.673486328125],[-97.278466796875,69.679638671875],[-97.236083984375,69.673486328125],[-97.096337890625,69.614990234375],[-96.98906249999999,69.55361328125],[-96.8751953125,69.510009765625],[-96.69453125,69.47109375],[-96.299951171875,69.344384765625],[-96.183740234375,69.25869140625],[-96.060986328125,69.125439453125],[-95.9513671875,69.02373046875],[-95.8548828125,68.953564453125],[-95.7513671875,68.89765625],[-95.58549804687499,68.835107421875],[-95.43754882812499,68.880615234375],[-95.374169921875,68.892138671875],[-95.31953125,68.873193359375],[-95.2677734375,68.82607421875],[-95.295166015625,68.805029296875],[-95.35947265624999,68.778369140625],[-95.465576171875,68.747265625],[-95.614208984375,68.74501953125],[-95.68564453124999,68.73583984375],[-95.8021484375,68.686474609375],[-95.89462890624999,68.62724609375],[-96.02402343749999,68.607275390625],[-96.26762695312499,68.50791015625],[-96.4015625,68.470703125],[-96.598828125,68.46083984375],[-97.00839843749999,68.538671875],[-97.263671875,68.527734375],[-97.47202148437499,68.543701171875],[-97.70478515625,68.625927734375],[-97.88535156249999,68.6724609375],[-98.23505859375,68.73935546875],[-98.257958984375,68.749267578125],[-98.273046875,68.771875],[-98.28017578125,68.807177734375],[-98.296044921875,68.83076171875],[-98.320556640625,68.842724609375],[-98.37558593749999,68.84169921875],[-98.4318359375,68.818359375],[-98.53964843749999,68.7982421875],[-98.70380859375,68.802783203125],[-98.77524414062499,68.816748046875],[-98.82963867187499,68.838623046875],[-98.859130859375,68.86435546875],[-98.863720703125,68.893798828125],[-98.878857421875,68.916455078125],[-98.9044921875,68.932421875],[-98.964013671875,68.932861328125],[-99.057373046875,68.91767578125],[-99.09384765624999,68.898876953125],[-99.073388671875,68.8765625],[-99.09062,68.863330078125],[-99.25400390624999,68.86318359375],[-99.31796875,68.87626953125],[-99.440869140625,68.91767578125],[-99.49467773437499,68.9595703125],[-99.5640625,69.034130859375],[-99.557373046875,69.054296875],[-99.51328125,69.099609375],[-99.455712890625,69.131201171875],[-99.08544921875,69.149755859375],[-98.91220703124999,69.167578125],[-98.7236328125,69.219140625],[-98.503515625,69.30830078125],[-98.45595703125,69.33466796875],[-98.450390625,69.354052734375],[-98.46660156249999,69.375],[-98.5353515625,69.426318359375],[-98.558544921875,69.46142578125],[-98.53671875,69.47802734375],[-98.448388671875,69.479541015625],[-98.494873046875,69.499365234375],[-98.534375,69.52744140625],[-98.5482421875,69.544970703125],[-98.54599609374999,69.572900390625],[-98.475830078125,69.579052734375],[-98.38935546875,69.5650390625],[-98.222314453125,69.484521484375],[-98.15576171875,69.46884765625],[-98.04135742187499,69.456640625],[-98.16298828125,69.51220703125],[-98.288818359375,69.62900390625],[-98.30449218749999,69.669287109375],[-98.301220703125,69.69169921875],[-98.268212890625,69.754443359375],[-98.238671875,69.780029296875],[-98.20048828124999,69.79697265625],[-98.08076171875,69.833056640625],[-97.88896484374999,69.858251953125],[-97.79072265625,69.86162109375],[-97.69121093749999,69.841259765625],[-97.60434570312499,69.802197265625],[-97.411376953125,69.7384765625],[-97.382568359375,69.71240234375],[-97.385693359375,69.700244140625],[-97.46015625,69.68271484375],[-97.46943359375,69.666796875],[-97.439453125,69.64267578125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-114.521533203125,72.592919921875],[-114.45810546874999,72.58037109375],[-114.342431640625,72.590771484375],[-114.174462890625,72.624072265625],[-113.9578125,72.65146484375],[-113.692431640625,72.672802734375],[-113.62216796874999,72.646826171875],[-113.578076171875,72.652099609375],[-113.500048828125,72.69443359375],[-113.4861328125,72.722265625],[-113.4958984375,72.753662109375],[-113.49140625,72.8220703125],[-113.449853515625,72.863232421875],[-113.2923828125,72.9498046875],[-113.2080078125,72.981005859375],[-113.07353515625,72.995263671875],[-112.75361328125,72.98603515625],[-112.453759765625,72.93662109375],[-112.048095703125,72.888037109375],[-111.45541992187499,72.76591796875],[-111.2697265625,72.713720703125],[-111.250390625,72.6685546875],[-111.355517578125,72.572119140625],[-111.610888671875,72.435595703125],[-111.816015625,72.386328125],[-111.895166015625,72.356103515625],[-111.76162109375,72.33525390625],[-111.67509765625,72.300146484375],[-111.54355468749999,72.350927734375],[-111.44736328124999,72.40771484375],[-111.311181640625,72.454833984375],[-111.264794921875,72.459033203125],[-111.25341796875,72.449072265625],[-111.2771484375,72.424853515625],[-111.287255859375,72.401123046875],[-111.283740234375,72.377978515625],[-111.26806640625,72.3638671875],[-111.184619140625,72.356640625],[-111.139892578125,72.36533203125],[-110.958984375,72.431982421875],[-110.78154296875,72.53388671875],[-110.51254882812499,72.59970703125],[-110.43930664062499,72.633349609375],[-110.205126953125,72.661279296875],[-110.207958984375,72.6810546875],[-110.19716796875,72.75888671875],[-110.2791015625,72.792041015625],[-110.55361328125,72.86142578125],[-110.689404296875,72.94453125],[-110.66083984375,73.008203125],[-110.50927734375,72.99892578125],[-110.09462890625,72.992138671875],[-110.008447265625,72.983642578125],[-109.60996093749999,72.87568359375],[-109.46909179687499,72.808447265625],[-109.35712890625,72.775048828125],[-109.12192382812499,72.726416015625],[-109.043017578125,72.686865234375],[-108.98740234374999,72.67080078125],[-108.9681640625,72.6541015625],[-108.985400390625,72.63681640625],[-108.99443359375,72.59599609375],[-108.95078125,72.582861328125],[-108.7978515625,72.567529296875],[-108.75498046874999,72.55107421875],[-108.698291015625,72.499267578125],[-108.627734375,72.41201171875],[-108.566357421875,72.317333984375],[-108.46958007812499,72.13876953125],[-108.276416015625,71.900390625],[-108.210400390625,71.751171875],[-108.188232421875,71.723779296875],[-108.144677734375,71.704931640625],[-108.02080078125,71.677490234375],[-107.925341796875,71.638671875],[-107.81284179687499,71.626171875],[-107.78544921875,71.6296875],[-107.757470703125,71.663037109375],[-107.687255859375,71.71611328125],[-107.346923828125,71.81923828125],[-107.329296875,71.83525390625],[-107.36943359375,71.858984375],[-107.381787109375,71.875146484375],[-107.37685546875,71.886083984375],[-107.30600585937499,71.894677734375],[-107.542626953125,72.025341796875],[-107.695849609375,72.14931640625],[-107.79404296874999,72.30263671875],[-107.809033203125,72.3474609375],[-107.82373046875,72.4427734375],[-107.855615234375,72.467822265625],[-107.909814453125,72.490771484375],[-107.93251953125,72.52041015625],[-107.92368164062499,72.556640625],[-107.934375,72.587744140625],[-107.99716796874999,72.652685546875],[-108.238232421875,73.105810546875],[-108.23740234374999,73.14990234375],[-108.204150390625,73.183056640625],[-108.118310546875,73.20205078125],[-107.979931640625,73.20673828125],[-107.936181640625,73.217138671875],[-107.987060546875,73.23310546875],[-108.07749023437499,73.281396484375],[-108.089404296875,73.3037109375],[-108.029052734375,73.34873046875],[-107.72001953125,73.329052734375],[-107.4962890625,73.28837890625],[-107.1134765625,73.192138671875],[-107.0744140625,73.197412109375],[-107.03251953125,73.2453125],[-106.95078125,73.276025390625],[-106.828369140625,73.26591796875],[-106.48212890625,73.19619140625],[-106.081640625,73.071923828125],[-105.8126953125,73.01064453125],[-105.624169921875,72.927490234375],[-105.49594726562499,72.848974609375],[-105.41513671874999,72.788330078125],[-105.411669921875,72.7646484375],[-105.430078125,72.740380859375],[-105.411083984375,72.708740234375],[-105.354541015625,72.6697265625],[-105.323193359375,72.634814453125],[-105.29755859375,72.56044921875],[-105.24692382812499,72.46357421875],[-105.23408203125,72.415087890625],[-104.8783203125,71.97998046875],[-104.810302734375,71.903173828125],[-104.7669921875,71.867578125],[-104.518310546875,71.69921875],[-104.3859375,71.576953125],[-104.37314453124999,71.4951171875],[-104.35537109375,71.4716796875],[-104.349560546875,71.433984375],[-104.35581054687499,71.382080078125],[-104.38486328124999,71.337548828125],[-104.43681640625,71.30029296875],[-104.487060546875,71.247900390625],[-104.56308593749999,71.132421875],[-104.569580078125,71.104052734375],[-104.514794921875,71.0642578125],[-104.16684570312499,70.927197265625],[-103.95346679687499,70.762646484375],[-103.853466796875,70.7337890625],[-103.58457031249999,70.630859375],[-103.294677734375,70.5724609375],[-103.19716796875,70.547314453125],[-103.10498046875,70.51025390625],[-103.07719726562499,70.508837890625],[-103.02119140625,70.5158203125],[-103.00517578124999,70.525927734375],[-103.001220703125,70.540966796875],[-103.08281249999999,70.619091796875],[-103.08857421875,70.64970703125],[-103.049560546875,70.655078125],[-102.75048828125,70.521875],[-102.58916015624999,70.46884765625],[-102.36875,70.413232421875],[-101.98984375,70.28505859375],[-101.93720703125,70.274560546875],[-101.73222656249999,70.286376953125],[-101.67631835937499,70.278271484375],[-101.64116210937499,70.265576171875],[-101.62680664062499,70.24833984375],[-101.61845703124999,70.172412109375],[-101.56240234375,70.135009765625],[-101.23916015625,70.1509765625],[-101.14853515624999,70.147607421875],[-101.090771484375,70.135693359375],[-101.04267578125,70.110791015625],[-100.97333984375,70.0294921875],[-100.90908203125,69.869189453125],[-100.905712890625,69.81171875],[-100.93510742187499,69.71533203125],[-100.982373046875,69.6798828125],[-101.043701171875,69.668701171875],[-101.2162109375,69.679638671875],[-101.33725585937499,69.71025390625],[-101.40009765625,69.749267578125],[-101.45673828125,69.83388671875],[-101.483837890625,69.8501953125],[-101.50839843749999,69.833154296875],[-101.565087890625,69.7556640625],[-101.602490234375,69.7212890625],[-101.64765625,69.69853515625],[-101.73359375,69.704150390625],[-101.86025390625,69.7380859375],[-102.09794921874999,69.824609375],[-102.18212890625,69.845947265625],[-102.234326171875,69.842236328125],[-102.348095703125,69.81298828125],[-102.52348632812499,69.758203125],[-102.5958984375,69.717919921875],[-102.56523437499999,69.6921875],[-102.544921875,69.659814453125],[-102.53486328125,69.62080078125],[-102.54091796875,69.59208984375],[-102.563134765625,69.573583984375],[-102.62109375,69.551513671875],[-102.743603515625,69.54775390625],[-102.91977539062499,69.5646484375],[-103.05917968749999,69.594677734375],[-103.30322265625,69.67431640625],[-103.35927734375,69.6853515625],[-103.434765625,69.66767578125],[-103.464892578125,69.644482421875],[-103.418017578125,69.61142578125],[-103.29404296874999,69.56845703125],[-103.14243164062499,69.497265625],[-103.10185546874999,69.483349609375],[-103.062744140625,69.484912109375],[-103.04892578124999,69.47177734375],[-103.03183593749999,69.43349609375],[-103.039794921875,69.367578125],[-103.1126953125,69.235986328125],[-103.12021484374999,69.20458984375],[-103.09033203125,69.21201171875],[-102.88408203124999,69.34130859375],[-102.77744140624999,69.377587890625],[-102.546484375,69.43447265625],[-102.44677734375,69.476318359375],[-102.15141601562499,69.4876953125],[-102.04594726562499,69.46484375],[-101.97822265625,69.42509765625],[-101.975537109375,69.40703125],[-102.052880859375,69.36044921875],[-102.06689453125,69.337109375],[-102.07089843749999,69.3076171875],[-102.06401367187499,69.28115234375],[-102.04609375,69.257666015625],[-101.99296874999999,69.23603515625],[-101.89912109375,69.2455078125],[-101.87285156249999,69.23994140625],[-101.822509765625,69.21708984375],[-101.7892578125,69.181640625],[-101.78779296875,69.132275390625],[-101.85712890625,69.023974609375],[-101.98056640624999,68.988525390625],[-102.3587890625,68.9228515625],[-102.488427734375,68.888916015625],[-102.73833007812499,68.864990234375],[-102.83486328125,68.833251953125],[-102.89506835937499,68.8236328125],[-103.162255859375,68.8287109375],[-103.468212890625,68.808544921875],[-103.820361328125,68.847998046875],[-104.067333984375,68.865576171875],[-104.352685546875,68.928173828125],[-104.46015625,68.91240234375],[-104.571435546875,68.872119140625],[-105.105859375,68.92041015625],[-105.16928710937499,68.95537109375],[-105.14833984375,68.978125],[-105.021630859375,69.052490234375],[-105.01357421875,69.06806640625],[-105.019580078125,69.08125],[-105.262353515625,69.093994140625],[-105.5330078125,69.133544921875],[-105.80498046875,69.153173828125],[-106.00839843749999,69.147607421875],[-106.140869140625,69.16201171875],[-106.270166015625,69.194580078125],[-106.34116210937499,69.224365234375],[-106.353955078125,69.251220703125],[-106.355712890625,69.280615234375],[-106.34423828125,69.3396484375],[-106.361376953125,69.3810546875],[-106.419970703125,69.41376953125],[-106.539794921875,69.44306640625],[-106.65908203125,69.439599609375],[-106.7599609375,69.40712890625],[-106.85581054687499,69.347314453125],[-107.033447265625,69.18076171875],[-107.122509765625,69.152294921875],[-107.35336914062499,69.031689453125],[-107.439892578125,69.0021484375],[-107.86337890624999,68.954345703125],[-108.364990234375,68.934765625],[-108.5525390625,68.897412109375],[-108.730419921875,68.82744140625],[-108.94589843749999,68.759814453125],[-109.472119140625,68.676708984375],[-109.958544921875,68.6302734375],[-110.46762695312499,68.610009765625],[-110.848095703125,68.57841796875],[-110.9572265625,68.594189453125],[-111.127587890625,68.588330078125],[-111.3109375,68.542041015625],[-111.51806640625,68.533056640625],[-112.304931640625,68.5162109375],[-112.6662109375,68.48525390625],[-112.8642578125,68.477099609375],[-113.01953125,68.48134765625],[-113.127734375,68.494140625],[-113.231396484375,68.535400390625],[-113.3380859375,68.598779296875],[-113.554833984375,68.767578125],[-113.616845703125,68.8384765625],[-113.592529296875,68.95986328125],[-113.608544921875,69.03017578125],[-113.6806640625,69.181982421875],[-113.694140625,69.19501953125],[-114.0734375,69.251318359375],[-114.32294921875,69.269140625],[-114.69907226562499,69.27275390625],[-115.15903320312499,69.26474609375],[-115.618115234375,69.282958984375],[-115.8607421875,69.303564453125],[-116.1015625,69.337158203125],[-116.51347656249999,69.424609375],[-116.53681640625,69.433544921875],[-116.568798828125,69.4626953125],[-116.60947265625,69.51201171875],[-116.71201171875,69.576220703125],[-116.9927734375,69.719384765625],[-117.10400390625,69.804248046875],[-117.12197265625,69.82587890625],[-117.1486328125,69.888134765625],[-117.184033203125,69.991064453125],[-117.19541015625,70.054052734375],[-117.162744140625,70.09248046875],[-117.13544921875,70.100146484375],[-116.55380859375,70.175048828125],[-115.5291015625,70.25712890625],[-114.592333984375,70.312451171875],[-114.1669921875,70.307470703125],[-113.91660156249999,70.28154296875],[-113.66552734375,70.269677734375],[-113.2107421875,70.263818359375],[-112.637890625,70.225244140625],[-112.52275390625,70.228564453125],[-112.26596679687499,70.2546875],[-112.1896484375,70.2755859375],[-111.78369140625,70.272900390625],[-111.7048828125,70.2857421875],[-111.632568359375,70.308837890625],[-111.725830078125,70.35205078125],[-112.11416015625,70.446875],[-113.1455078125,70.616357421875],[-113.397021484375,70.652392578125],[-113.757275390625,70.69072265625],[-113.966064453125,70.69619140625],[-114.232177734375,70.674267578125],[-114.33139648437499,70.675244140625],[-114.59262695312499,70.642236328125],[-114.84072265625,70.62138671875],[-115.31123046875,70.601171875],[-115.99091796875,70.586279296875],[-116.086083984375,70.590673828125],[-116.22587890624999,70.61640625],[-116.327294921875,70.62373046875],[-116.992529296875,70.603662109375],[-117.587060546875,70.629541015625],[-118.2640625,70.888330078125],[-118.37651367187499,70.967724609375],[-118.3525390625,71.000048828125],[-118.26909179687499,71.034716796875],[-117.933837890625,71.13466796875],[-117.8140625,71.158447265625],[-117.31396484375,71.212109375],[-116.815283203125,71.276953125],[-116.421533203125,71.33798828125],[-116.22822265625,71.3591796875],[-116.04208984375,71.361669921875],[-115.891650390625,71.381787109375],[-115.922265625,71.40107421875],[-116.0453125,71.423095703125],[-116.0439453125,71.454296875],[-115.9802734375,71.469287109375],[-115.73374023437499,71.485107421875],[-115.471875,71.4658203125],[-115.341015625,71.472412109375],[-115.30341796875,71.493701171875],[-115.338134765625,71.510888671875],[-115.586669921875,71.54638671875],[-116.7802734375,71.444189453125],[-117.337109375,71.434619140625],[-117.72333984375,71.390673828125],[-117.93564453125,71.39208984375],[-118.18818359375,71.4359375],[-118.221875,71.449072265625],[-118.22646484375,71.46708984375],[-118.14833984375,71.525732421875],[-117.87841796875,71.56083984375],[-117.742333984375,71.659326171875],[-117.88759765625,71.66103515625],[-118.371533203125,71.63994140625],[-118.5830078125,71.6490234375],[-118.868408203125,71.686767578125],[-118.952099609375,71.73173828125],[-118.9876953125,71.7642578125],[-118.99375,71.80302734375],[-118.98417968749999,71.9130859375],[-118.959814453125,71.972216796875],[-118.94462890624999,71.985546875],[-118.58984375,72.16748046875],[-118.36865234375,72.20546875],[-118.2134765625,72.262890625],[-118.207470703125,72.2869140625],[-118.24589843749999,72.31103515625],[-118.390478515625,72.36953125],[-118.4486328125,72.39921875],[-118.481298828125,72.427685546875],[-118.45659179687499,72.472509765625],[-118.37451171875,72.53388671875],[-118.13310546874999,72.6328125],[-117.551708984375,72.831103515625],[-117.2564453125,72.914404296875],[-116.9716796875,72.959326171875],[-116.5732421875,73.054931640625],[-115.552197265625,73.2134765625],[-114.638232421875,73.37265625],[-114.301904296875,73.330712890625],[-114.20639648437499,73.297802734375],[-114.16396484375,73.26982421875],[-114.12705078124999,73.230712890625],[-114.095458984375,73.1802734375],[-114.051708984375,73.07099609375],[-114.046142578125,73.014599609375],[-114.053759765625,72.958056640625],[-114.074755859375,72.9068359375],[-114.1091796875,72.860986328125],[-114.177685546875,72.805078125],[-114.280322265625,72.7390625],[-114.4978515625,72.62587890625],[-114.521533203125,72.592919921875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-119.736328125,74.112646484375],[-119.72856445312499,74.108447265625],[-119.47109375,74.201220703125],[-119.31484375,74.20625],[-119.20595703125,74.197998046875],[-119.17143554687499,74.186181640625],[-119.149609375,74.16787109375],[-119.13876953125,74.127587890625],[-119.13188476562499,74.027880859375],[-119.11796874999999,74.01552734375],[-119.08251953125,74.02119140625],[-119.02568359374999,74.0447265625],[-118.744140625,74.19208984375],[-118.62529296874999,74.23251953125],[-118.54399414062499,74.24462890625],[-118.199658203125,74.266748046875],[-117.96586914062499,74.266064453125],[-117.707470703125,74.25234375],[-117.51484375,74.23173828125],[-117.198828125,74.171142578125],[-116.950390625,74.101416015625],[-116.72236328125,74.0271484375],[-115.95771484375,73.74794921875],[-115.634326171875,73.66552734375],[-115.510693359375,73.61875],[-115.45566406249999,73.58466796875],[-115.40751953125,73.54189453125],[-115.392822265625,73.501953125],[-115.411572265625,73.464794921875],[-115.446875,73.4388671875],[-115.524462890625,73.416748046875],[-115.99228515624999,73.3232421875],[-116.238623046875,73.294580078125],[-116.48251953125,73.25322265625],[-117.0654296875,73.107275390625],[-117.464453125,73.037744140625],[-117.98320312499999,72.902197265625],[-118.961572265625,72.684130859375],[-119.077978515625,72.64033203125],[-119.13154296875,72.608837890625],[-119.40776367187499,72.360400390625],[-119.512841796875,72.302685546875],[-119.76748046875,72.24384765625],[-120.08974609375,72.229150390625],[-120.1798828125,72.212646484375],[-120.19443359375,72.1267578125],[-120.310009765625,71.98408203125],[-120.36625976562499,71.888037109375],[-120.44316406249999,71.630810546875],[-120.4609375,71.605078125],[-120.519677734375,71.557421875],[-120.6193359375,71.50576171875],[-120.930322265625,71.446240234375],[-121.159814453125,71.414990234375],[-121.47216796875,71.389013671875],[-121.546826171875,71.406787109375],[-121.62216796875,71.447607421875],[-121.70068359375,71.451171875],[-121.749365234375,71.444775390625],[-122.156640625,71.26591796875],[-122.54951171875,71.1935546875],[-122.71977539062499,71.128173828125],[-122.83994140625,71.0974609375],[-122.9365234375,71.08798828125],[-123.095654296875,71.093798828125],[-123.210595703125,71.1234375],[-123.31474609374999,71.169189453125],[-123.39335937499999,71.21884765625],[-123.595166015625,71.423193359375],[-123.6818359375,71.493115234375],[-123.75556640625,71.52802734375],[-123.953271484375,71.652490234375],[-124.007763671875,71.67744140625],[-124.7599609375,71.83515625],[-125.126123046875,71.9236328125],[-125.21464843749999,71.95478515625],[-125.29667968749999,71.973046875],[-125.76689453124999,71.96083984375],[-125.8291015625,71.965625],[-125.8453125,71.978662109375],[-125.7896484375,72.025],[-125.767724609375,72.054248046875],[-125.760498046875,72.08291015625],[-125.76860351562499,72.129150390625],[-125.76259765625,72.1375],[-125.58378906249999,72.183056640625],[-125.61279296875,72.192529296875],[-125.6337890625,72.210302734375],[-125.64677734374999,72.2365234375],[-125.627294921875,72.254833984375],[-125.57548828124999,72.265283203125],[-125.51240234375,72.30771484375],[-125.4380859375,72.382080078125],[-125.382763671875,72.423828125],[-125.306005859375,72.450732421875],[-125.168310546875,72.522607421875],[-125.07021484375,72.551611328125],[-124.98710937499999,72.58798828125],[-124.98466796874999,72.60439453125],[-125.0185546875,72.6169921875],[-125.030224609375,72.644775390625],[-125.01474609375,72.7314453125],[-125.01542968749999,72.77607421875],[-125.000390625,72.813330078125],[-124.969677734375,72.843310546875],[-124.930859375,72.86318359375],[-124.58256835937499,72.925927734375],[-124.56494140625,72.944140625],[-124.56083984374999,72.9650390625],[-124.57021484375,72.988720703125],[-124.58828125,73.005322265625],[-124.643310546875,73.0189453125],[-124.73642578125,73.022705078125],[-124.81708984375,73.0587890625],[-124.83642578125,73.07626953125],[-124.804052734375,73.12568359375],[-124.646923828125,73.204443359375],[-124.593994140625,73.243310546875],[-124.42421875,73.418701171875],[-124.11416015625,73.527392578125],[-124.03017578125,73.64423828125],[-123.797265625,73.7681640625],[-123.797802734375,73.785302734375],[-123.873046875,73.827587890625],[-124.088037109375,73.856884765625],[-124.19150390625,73.902001953125],[-124.2607421875,73.953271484375],[-124.575341796875,74.24814453125],[-124.6291015625,74.27001953125],[-124.64501953125,74.304345703125],[-124.709326171875,74.327001953125],[-124.696240234375,74.348193359375],[-123.46831054687499,74.4361328125],[-122.62314453125,74.46416015625],[-121.747900390625,74.540625],[-121.504150390625,74.5451171875],[-121.31523437499999,74.52998046875],[-121.12871093749999,74.490234375],[-120.88164062499999,74.420751953125],[-120.55449218749999,74.3529296875],[-119.943603515625,74.2537109375],[-119.562646484375,74.2328125],[-119.71538085937499,74.153662109375],[-119.7369140625,74.129931640625],[-119.736328125,74.112646484375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-56.15073242187499,46.76240234375],[-56.17167968749999,46.752832031249994],[-56.24326171874999,46.7671875],[-56.2091796875,46.798242187499994],[-56.18505859375,46.807275390624994],[-56.15263671874999,46.811083984374996],[-56.137353515624994,46.8015625],[-56.13925781249999,46.778662109375],[-56.15073242187499,46.76240234375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-94.5265625,75.74931640625],[-94.62436523437499,75.748876953125],[-94.75146484375,75.769677734375],[-94.787353515625,75.79140625],[-94.81474609374999,75.82119140625],[-94.833642578125,75.858984375],[-94.860107421875,75.889208984375],[-94.89409179687499,75.911865234375],[-94.90122070312499,75.93076171875],[-94.88134765625,75.945947265625],[-94.839794921875,75.954443359375],[-94.74482421875,75.9572265625],[-94.53789062499999,75.996435546875],[-94.498681640625,75.9921875],[-94.47128906249999,75.971435546875],[-94.443359375,75.91708984375],[-94.41376953125,75.88486328125],[-94.3322265625,75.8259765625],[-94.2962890625,75.7880859375],[-94.30400390624999,75.776318359375],[-94.329541015625,75.76591796875],[-94.5265625,75.74931640625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-79.38427734375,51.951953125],[-79.42558593749999,51.944873046874996],[-79.52060546874999,51.952929687499996],[-79.596875,51.97802734375],[-79.64375,52.010058593749996],[-79.33486328125,52.09814453125],[-79.27128906249999,52.08681640625],[-79.27021484375,52.07109375],[-79.3166015625,52.02392578125],[-79.32895507812499,51.99228515625],[-79.351513671875,51.968310546874996],[-79.38427734375,51.951953125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-78.82651367187499,56.1453125],[-78.87729492187499,56.1314453125],[-78.913818359375,56.1328125],[-78.90703124999999,56.166357421875],[-78.856884765625,56.232080078125],[-78.82841796874999,56.28984375],[-78.82158203124999,56.339648437499996],[-78.79941406249999,56.38330078125],[-78.761865234375,56.420703125],[-78.72451171875,56.439208984375],[-78.66875,56.438623046875],[-78.657177734375,56.3173828125],[-78.672802734375,56.260498046875],[-78.71015625,56.212890625],[-78.761376953125,56.17451171875],[-78.82651367187499,56.1453125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-78.93559570312499,56.266064453125],[-79.01796875,56.164990234375],[-79.08388671875,56.06787109375],[-79.17548828125,55.885058593749996],[-79.22783203124999,55.878515625],[-79.2736328125,55.9224609375],[-79.14228515625,56.13642578125],[-79.13608398437499,56.16025390625],[-79.14228515625,56.180712890624996],[-79.18212890625,56.212158203125],[-79.221826171875,56.1759765625],[-79.407421875,55.934863281249996],[-79.455322265625,55.89619140625],[-79.4951171875,55.874755859375],[-79.5267578125,55.870654296874996],[-79.605712890625,55.87568359375],[-79.76474609374999,55.806787109375],[-79.4974609375,56.0931640625],[-79.49467773437499,56.114990234375],[-79.54472656249999,56.128369140625],[-79.56455078124999,56.120947265625],[-79.78110351562499,55.940576171875],[-79.90458984374999,55.871044921875],[-79.9875,55.892138671874996],[-80.008251953125,55.91103515625],[-80.00078124999999,55.932080078125],[-79.7900390625,56.11416015625],[-79.596337890625,56.244482421875],[-79.515283203125,56.326513671875],[-79.482373046875,56.40380859375],[-79.467919921875,56.4603515625],[-79.4689453125,56.522607421875],[-79.45888671875,56.53974609375],[-79.44765625,56.536572265625],[-79.435302734375,56.513037109375],[-79.43203125,56.4474609375],[-79.47626953125,56.312841796875],[-79.51181640624999,56.24658203125],[-79.55419921875,56.1919921875],[-79.536328125,56.180078125],[-79.45830078124999,56.211083984375],[-79.39262695312499,56.27646484375],[-79.33935546875,56.376318359375],[-79.305322265625,56.4630859375],[-79.272412109375,56.600439453125],[-79.2611328125,56.595654296875],[-79.245751953125,56.56826171875],[-79.21044921875,56.54892578125],[-79.15517578125,56.53759765625],[-79.12353515625,56.519970703125],[-79.100244140625,56.473925781249996],[-79.077734375,56.45361328125],[-78.99497070312499,56.43642578125],[-78.96318359374999,56.421728515625],[-78.94033203125,56.371435546875],[-78.94243164062499,56.344921875],[-78.93120117187499,56.327929687499996],[-78.906640625,56.32041015625],[-78.93559570312499,56.266064453125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-79.86699218749999,56.774560546875],[-79.894482421875,56.757128906249996],[-79.94365234374999,56.7767578125],[-79.945703125,56.826904296875],[-79.89814453125,56.865283203124996],[-79.860546875,56.863525390625],[-79.82666015625,56.843115234375],[-79.83500976562499,56.816015625],[-79.86699218749999,56.774560546875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-79.71650390625,57.51552734375],[-79.73222656249999,57.50751953125],[-79.77519531249999,57.514453125],[-79.79204101562499,57.448583984375],[-79.80844726562499,57.442431640624996],[-79.83823242187499,57.4830078125],[-79.81591796875,57.517724609375],[-79.81914062499999,57.5416015625],[-79.81083984374999,57.55927734375],[-79.76787109374999,57.59873046875],[-79.742578125,57.607958984374996],[-79.726708984375,57.60458984375],[-79.71347656249999,57.555029296875],[-79.71650390625,57.51552734375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-79.97758789062499,56.20703125],[-80.02861328124999,56.1994140625],[-80.0888671875,56.2138671875],[-80.05747070312499,56.287353515625],[-80.005078125,56.317919921874996],[-79.874462890625,56.3484375],[-79.85214843749999,56.3671875],[-79.81040039062499,56.376513671874996],[-79.749169921875,56.376513671874996],[-79.68100585937499,56.403955078125],[-79.605859375,56.458837890625],[-79.579736328125,56.466357421874996],[-79.632568359375,56.386523437499996],[-79.687939453125,56.326806640625],[-79.97758789062499,56.20703125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-80.28525390624999,59.62412109375],[-80.31723632812499,59.621044921875],[-80.324658203125,59.633203125],[-80.298974609375,59.674169921875],[-80.25664062499999,59.679150390625],[-80.2099609375,59.724609375],[-80.167236328125,59.708886718749994],[-80.183056640625,59.683496093749994],[-80.24052734374999,59.644921875],[-80.28525390624999,59.62412109375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-79.938232421875,53.304150390625],[-79.93930664062499,53.274267578125],[-80.0041015625,53.280078125],[-80.03935546874999,53.297167968749996],[-80.06787109375,53.324072265625],[-80.07402343749999,53.344287109374996],[-80.04970703125,53.364453125],[-79.974560546875,53.35224609375],[-79.938232421875,53.304150390625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-80.064208984375,59.77080078125],[-80.16708984374999,59.7638671875],[-80.122216796875,59.823193359375],[-80.083642578125,59.85185546875],[-80.041162109375,59.870166015625],[-79.95585937499999,59.876953125],[-79.8986328125,59.853125],[-79.949609375,59.809912109375],[-80.064208984375,59.77080078125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-79.51816406249999,56.656689453125],[-79.553466796875,56.643847656249996],[-79.577392578125,56.644921875],[-79.550732421875,56.73349609375],[-79.58173828125,56.76484375],[-79.58354492187499,56.78095703125],[-79.57011718749999,56.795703125],[-79.552880859375,56.79873046875],[-79.51123046875,56.771435546875],[-79.49106445312499,56.74267578125],[-79.482177734375,56.714404296874996],[-79.4845703125,56.6865234375],[-79.496533203125,56.667285156249996],[-79.51816406249999,56.656689453125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-96.78232421874999,72.93662109375],[-96.943798828125,72.926708984375],[-97.0927734375,72.996923828125],[-97.09765625,73.06240234375],[-97.08769531249999,73.098486328125],[-97.06923828125,73.13017578125],[-97.01499023437499,73.157275390625],[-96.86240234374999,73.188818359375],[-96.7931640625,73.165478515625],[-96.7677734375,73.1373046875],[-96.74443359374999,73.12626953125],[-96.64599609375,73.101904296875],[-96.59848632812499,73.073828125],[-96.603515625,73.041552734375],[-96.635400390625,72.992431640625],[-96.67060546875,72.9609375],[-96.709228515625,72.94697265625],[-96.78232421874999,72.93662109375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-97.35551757812499,74.526318359375],[-97.65610351562499,74.465673828125],[-97.72158203125,74.489208984375],[-97.75,74.510546875],[-97.51630859375,74.602490234375],[-97.41650390625,74.6265625],[-97.31821289062499,74.597998046875],[-97.29130859374999,74.5763671875],[-97.303857421875,74.55966796875],[-97.35551757812499,74.526318359375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-98.27036132812499,73.868505859375],[-98.558203125,73.847412109375],[-98.691064453125,73.856494140625],[-98.761376953125,73.828857421875],[-98.8166015625,73.817138671875],[-98.97392578124999,73.812060546875],[-99.298046875,73.861962890625],[-99.38515625,73.879296875],[-99.4169921875,73.89541015625],[-99.40380859375,73.910888671875],[-99.34560546875,73.925732421875],[-99.096875,73.948291015625],[-99.00468749999999,73.96494140625],[-98.96669921875,73.98818359375],[-98.9044921875,74.006884765625],[-98.81816406249999,74.02099609375],[-98.5849609375,74.034521484375],[-98.06103515625,74.1046875],[-97.800439453125,74.1146484375],[-97.6982421875,74.10869140625],[-97.667431640625,74.09013671875],[-97.659130859375,74.071630859375],[-97.67333984375,74.05302734375],[-97.75473632812499,74.005517578125],[-97.861083984375,73.96845703125],[-98.14697265625,73.888818359375],[-98.27036132812499,73.868505859375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-90.19980468749999,69.419091796875],[-90.177392578125,69.357080078125],[-90.26728515625,69.272900390625],[-90.29545898437499,69.2578125],[-90.3302734375,69.252197265625],[-90.36406249999999,69.26259765625],[-90.46469726562499,69.3287109375],[-90.49204101562499,69.369873046875],[-90.45512695312499,69.390478515625],[-90.37724609374999,69.4162109375],[-90.32207031249999,69.4287109375],[-90.25283203125,69.417919921875],[-90.22856445312499,69.43603515625],[-90.19980468749999,69.419091796875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-90.492578125,69.22109375],[-90.5744140625,69.209423828125],[-90.62578124999999,69.250927734375],[-90.667431640625,69.25947265625],[-90.68588867187499,69.287158203125],[-90.77158203124999,69.292578125],[-90.76567382812499,69.335986328125],[-90.7423828125,69.35732421875],[-90.66279296875,69.374169921875],[-90.59970703124999,69.367822265625],[-90.53984374999999,69.324609375],[-90.51064453125,69.2904296875],[-90.4853515625,69.246630859375],[-90.492578125,69.22109375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-74.000439453125,62.618408203125],[-74.05356445312499,62.60966796875],[-74.253515625,62.621972656249994],[-74.49951171875,62.668798828125],[-74.62646484375,62.712744140625],[-74.61997070312499,62.726318359375],[-74.564208984375,62.733300781249994],[-74.500927734375,62.726513671875],[-74.394775390625,62.69580078125],[-74.10893554687499,62.680322265624994],[-74.016796875,62.6626953125],[-73.98818359375,62.636083984375],[-74.000439453125,62.618408203125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-74.880859375,68.348681640625],[-74.95932617187499,68.342236328125],[-75.072509765625,68.404150390625],[-75.31015625,68.474462890625],[-75.40024414062499,68.52548828125],[-75.40341796874999,68.550146484375],[-75.39619140625,68.588818359375],[-75.37016601562499,68.636083984375],[-75.28740234374999,68.687744140625],[-75.19975585937499,68.69609375],[-75.07470703125,68.684716796875],[-74.983642578125,68.647607421875],[-74.884765625,68.54462890625],[-74.81894531249999,68.49443359375],[-74.7982421875,68.457958984375],[-74.83095703125,68.44072265625],[-74.82792968749999,68.423779296875],[-74.812890625,68.413330078125],[-74.8185546875,68.394091796875],[-74.844970703125,68.365966796875],[-74.880859375,68.348681640625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-78.531640625,60.728564453125],[-78.668896484375,60.71689453125],[-78.669091796875,60.731347656249994],[-78.61201171875,60.772314453125],[-78.399560546875,60.80810546875],[-78.24169921875,60.81865234375],[-78.27885742187499,60.78388671875],[-78.3724609375,60.756396484375],[-78.531640625,60.728564453125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-78.98271484374999,68.192822265625],[-79.0640625,68.181787109375],[-79.1740234375,68.2349609375],[-79.174755859375,68.264453125],[-79.153466796875,68.33525390625],[-78.952587890625,68.35302734375],[-78.86870117187499,68.310302734375],[-78.828515625,68.2681640625],[-78.98271484374999,68.192822265625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-76.67758789062499,63.393945312499994],[-76.783154296875,63.384033203125],[-76.921875,63.40634765625],[-77.05722656249999,63.449755859375],[-77.36474609375,63.588330078125],[-77.13369140625,63.68203125],[-76.763623046875,63.573583984375],[-76.65244140624999,63.503564453124994],[-76.67758789062499,63.393945312499994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-64.823828125,62.558740234374994],[-64.6318359375,62.547998046874994],[-64.51533203125,62.551806640625],[-64.4650390625,62.5359375],[-64.41806640624999,62.48740234375],[-64.47832031249999,62.417871093749994],[-64.546484375,62.39140625],[-64.657421875,62.38359375],[-64.8373046875,62.40625],[-64.90122070312499,62.421044921874994],[-64.956494140625,62.458349609375],[-64.93076171874999,62.485009765624994],[-64.841943359375,62.494140625],[-64.827099609375,62.50498046875],[-64.849853515625,62.525439453125],[-64.848779296875,62.543310546875],[-64.823828125,62.558740234374994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-62.681542968749994,67.056298828125],[-62.805419921875,67.02880859375],[-62.87163085937499,67.06259765625],[-62.825097656249994,67.072119140625],[-62.756982421874994,67.112548828125],[-62.66440429687499,67.1482421875],[-62.62529296874999,67.176953125],[-62.4697265625,67.1900390625],[-62.41679687499999,67.1884765625],[-62.39633789062499,67.1783203125],[-62.484619140625,67.134228515625],[-62.681542968749994,67.056298828125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-68.2337890625,60.24091796875],[-68.32412109375,60.23291015625],[-68.365234375,60.254052734374994],[-68.36787109375,60.31474609375],[-68.33828125,60.360595703125],[-68.234765625,60.45556640625],[-68.14189453124999,60.56201171875],[-68.08759765625,60.587841796875],[-67.97802734375,60.57041015625],[-67.914208984375,60.53984375],[-67.84755859375,60.488818359375],[-67.81884765625,60.44951171875],[-67.84423828125,60.391650390625],[-67.922314453125,60.339892578125],[-68.01230468749999,60.304638671875],[-68.2337890625,60.24091796875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-70.337060546875,62.548730468749994],[-70.40634765624999,62.544824218749994],[-70.54150390625,62.55234375],[-70.68657226562499,62.573193359375],[-70.766064453125,62.596875],[-70.837548828125,62.648095703124994],[-70.85126953125,62.704345703125],[-70.98613281249999,62.78779296875],[-71.1369140625,62.81591796875],[-71.2201171875,62.873925781249994],[-71.13486328124999,62.877978515625],[-71.013671875,62.86533203125],[-70.834619140625,62.840087890625],[-70.67431640625,62.80703125],[-70.442626953125,62.733789062499994],[-70.366796875,62.6658203125],[-70.29150390625,62.615966796875],[-70.26884765624999,62.578076171875],[-70.28857421875,62.561572265625],[-70.337060546875,62.548730468749994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-64.83261718749999,61.366064453125],[-64.8568359375,61.354443359375],[-64.87978515625,61.357080078124994],[-64.954248046875,61.410400390625],[-65.05439453125,61.43203125],[-65.09150390625,61.452978515625],[-65.39389648437499,61.562841796875],[-65.42680664062499,61.61103515625],[-65.43212890625,61.64951171875],[-65.331640625,61.66826171875],[-65.12978515625,61.685693359374994],[-64.95444335937499,61.685107421875],[-64.78964843749999,61.66220703125],[-64.75634765625,61.637646484375],[-64.669580078125,61.593017578125],[-64.69096679687499,61.53935546875],[-64.69638671874999,61.471484375],[-64.73232421875,61.438427734375],[-64.78759765625,61.41328125],[-64.83261718749999,61.366064453125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-67.914697265625,69.540966796875],[-67.94028320312499,69.53486328125],[-68.20234375,69.580419921875],[-68.22138671875,69.616748046875],[-68.09326171875,69.65703125],[-67.98911132812499,69.678759765625],[-67.908837890625,69.6818359375],[-67.8291015625,69.675],[-67.75458984375,69.6314453125],[-67.844921875,69.591748046875],[-67.914697265625,69.540966796875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-79.4306640625,69.78779296875],[-79.390283203125,69.730419921875],[-79.364990234375,69.712353515625],[-79.40244140624999,69.68515625],[-79.55283203124999,69.630859375],[-79.88168945312499,69.60869140625],[-80.047509765625,69.634326171875],[-79.971142578125,69.55634765625],[-79.9544921875,69.523486328125],[-79.97783203124999,69.50966796875],[-80.046875,69.5138671875],[-80.16147460937499,69.5359375],[-80.22734374999999,69.56240234375],[-80.24448242187499,69.5931640625],[-80.26865234374999,69.6],[-80.29970703125,69.582861328125],[-80.32958984375,69.586767578125],[-80.3978515625,69.6326171875],[-80.44804687499999,69.64970703125],[-80.77822265625,69.677001953125],[-80.79477539062499,69.6892578125],[-80.7775390625,69.7103515625],[-80.72661132812499,69.7404296875],[-80.6525390625,69.7505859375],[-80.46591796874999,69.737109375],[-80.45068359375,69.744775390625],[-80.43833007812499,69.78271484375],[-80.42421875,69.797607421875],[-80.294921875,69.793798828125],[-80.21367187499999,69.801953125],[-80.16884765625,69.782421875],[-80.124609375,69.737255859375],[-80.061767578125,69.7455078125],[-79.970849609375,69.73896484375],[-79.869580078125,69.755517578125],[-79.71484375,69.795703125],[-79.593994140625,69.810498046875],[-79.4306640625,69.78779296875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-78.02910156249999,69.714892578125],[-77.97783203124999,69.664892578125],[-77.969140625,69.63896484375],[-78.039990234375,69.6083984375],[-78.30722656249999,69.551806640625],[-78.47006835937499,69.5025390625],[-78.552392578125,69.491552734375],[-78.662060546875,69.50263671875],[-78.7953125,69.479736328125],[-78.84819335937499,69.4828125],[-78.789306640625,69.52314453125],[-78.578564453125,69.638818359375],[-78.40185546875,69.650634765625],[-78.344189453125,69.6748046875],[-78.29550781249999,69.667138671875],[-78.267333984375,69.687158203125],[-78.262451171875,69.716845703125],[-78.20073242187499,69.739501953125],[-78.14521484375,69.739208984375],[-78.02910156249999,69.714892578125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-77.64208984375,63.99189453125],[-77.7140625,63.945703125],[-77.92880859374999,63.96201171875],[-77.95791015625,63.976025390625],[-77.965966796875,63.992919921875],[-77.93134765625,64.014794921875],[-77.71079101562499,64.03564453125],[-77.61728515624999,64.03720703125],[-77.56938476562499,64.030419921875],[-77.563623046875,64.0220703125],[-77.64208984375,63.99189453125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-83.123486328125,66.2828125],[-83.023876953125,66.270654296875],[-82.94814453125,66.271923828125],[-82.93134765625,66.25732421875],[-83.01083984374999,66.208447265625],[-83.05986328124999,66.199267578125],[-83.147900390625,66.234228515625],[-83.21391601562499,66.27705078125],[-83.232568359375,66.302978515625],[-83.23784179687499,66.33154296875],[-83.222265625,66.336474609375],[-83.123486328125,66.2828125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-79.21064453125,68.845458984375],[-79.279736328125,68.838720703125],[-79.36137695312499,68.857666015625],[-79.39047851562499,68.890185546875],[-79.40576171875,68.923046875],[-79.39116210937499,68.93994140625],[-79.354736328125,68.955908203125],[-79.30522460937499,68.992333984375],[-79.24267578125,69.049267578125],[-79.144970703125,69.087451171875],[-78.93046874999999,69.122900390625],[-78.9,69.135400390625],[-78.8041015625,69.235107421875],[-78.77182617187499,69.252197265625],[-78.66201171875,69.262353515625],[-78.65019531249999,69.2751953125],[-78.6890625,69.299755859375],[-78.6890625,69.32509765625],[-78.65019531249999,69.351220703125],[-78.5966796875,69.37060546875],[-78.45791015625,69.389501953125],[-78.33256835937499,69.38603515625],[-78.30048828125,69.3787109375],[-78.2724609375,69.36123046875],[-78.23408203125,69.314599609375],[-78.228955078125,69.30400390625],[-78.28701171875,69.2626953125],[-78.43896484375,69.199169921875],[-78.53291015625,69.146044921875],[-78.5517578125,69.128662109375],[-78.560302734375,69.10625],[-78.595654296875,69.079052734375],[-78.70537109374999,69.013671875],[-78.77919921875,68.95048828125],[-78.852685546875,68.915673828125],[-79.05361328125,68.88291015625],[-79.21064453125,68.845458984375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-76.995361328125,69.14375],[-77.12163085937499,69.13212890625],[-77.2150390625,69.1380859375],[-77.2755859375,69.161669921875],[-77.321923828125,69.193603515625],[-77.37939453125,69.2740234375],[-77.358056640625,69.3115234375],[-77.351513671875,69.378662109375],[-77.34091796874999,69.403857421875],[-77.31870117187499,69.41630859375],[-77.18754882812499,69.440087890625],[-77.10917968749999,69.43740234375],[-76.994091796875,69.411767578125],[-76.745703125,69.40400390625],[-76.68408203125,69.380419921875],[-76.66884765625,69.366162109375],[-76.67001953124999,69.348583984375],[-76.687451171875,69.327685546875],[-76.810302734375,69.266748046875],[-76.8693359375,69.224853515625],[-76.91123046874999,69.174658203125],[-76.995361328125,69.14375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-65.03056640624999,61.879052734374994],[-65.008056640625,61.870263671874994],[-64.98105468749999,61.880615234375],[-64.960546875,61.8716796875],[-64.9466796875,61.843359375],[-64.92353515625,61.82373046875],[-64.86513671875,61.79814453125],[-64.84550781249999,61.7798828125],[-64.8470703125,61.7615234375],[-64.89658203124999,61.733300781249994],[-64.927734375,61.73251953125],[-65.16591796875,61.79765625],[-65.23027343749999,61.864013671875],[-65.2353515625,61.897705078125],[-65.210546875,61.928369140624994],[-65.17392578124999,61.943212890625],[-65.125634765625,61.942236328125],[-65.068359375,61.926025390625],[-65.03056640624999,61.879052734374994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-86.913037109375,70.113232421875],[-86.798779296875,70.1052734375],[-86.69121093749999,70.1150390625],[-86.612744140625,70.105712890625],[-86.56337890625,70.07724609375],[-86.530908203125,70.04765625],[-86.515234375,70.017041015625],[-86.55766601562499,69.9953125],[-86.734326171875,69.976318359375],[-86.854931640625,69.9857421875],[-86.983984375,70.0111328125],[-87.04379882812499,69.999853515625],[-87.1908203125,70.0185546875],[-87.263916015625,70.0439453125],[-87.3232421875,70.080126953125],[-87.32314453125,70.10224609375],[-87.168115234375,70.12724609375],[-87.10727539062499,70.1466796875],[-86.913037109375,70.113232421875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-83.7259765625,65.796728515625],[-83.59750976562499,65.757470703125],[-83.46943359375,65.735205078125],[-83.26318359375,65.723291015625],[-83.23374023437499,65.7150390625],[-83.23393554687499,65.69658203125],[-83.263671875,65.667822265625],[-83.332421875,65.6310546875],[-83.38144531249999,65.62998046875],[-83.49541015624999,65.65595703125],[-83.537109375,65.669189453125],[-83.583203125,65.6986328125],[-83.60654296874999,65.7013671875],[-83.636376953125,65.69150390625],[-83.64438476562499,65.678515625],[-83.63066406249999,65.662353515625],[-83.64951171874999,65.657763671875],[-83.787548828125,65.668896484375],[-83.809228515625,65.6783203125],[-83.79819335937499,65.710009765625],[-83.701904296875,65.756201171875],[-83.7865234375,65.77041015625],[-83.81357421874999,65.7875],[-83.93896484375,65.758447265625],[-84.00849609375,65.751513671875],[-84.11826171874999,65.77177734375],[-84.12993164062499,65.87744140625],[-84.143212890625,65.915966796875],[-84.19321289062499,65.942138671875],[-84.22294921874999,65.969775390625],[-84.2708984375,65.990625],[-84.3701171875,66.01181640625],[-84.4505859375,66.064404296875],[-84.46738281249999,66.08828125],[-84.45634765624999,66.10625],[-84.407177734375,66.131005859375],[-84.122265625,66.07783203125],[-83.950390625,66.027490234375],[-83.78696289062499,65.965771484375],[-83.7013671875,65.9201171875],[-83.69365234374999,65.890380859375],[-83.71489257812499,65.8607421875],[-83.76513671875,65.83115234375],[-83.7259765625,65.796728515625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-86.59555664062499,67.7359375],[-86.63818359375,67.73486328125],[-86.70595703125,67.750146484375],[-86.861083984375,67.810498046875],[-86.892529296875,67.836572265625],[-86.90830078124999,67.867041015625],[-86.908447265625,67.901953125],[-86.89458007812499,67.9380859375],[-86.8470703125,68.01025390625],[-86.937744140625,68.067578125],[-86.95981445312499,68.100244140625],[-86.949169921875,68.118701171875],[-86.898681640625,68.162890625],[-86.88486328124999,68.19052734375],[-86.833984375,68.2296875],[-86.702099609375,68.305615234375],[-86.569921875,68.2876953125],[-86.45195312499999,68.22548828125],[-86.421142578125,68.183447265625],[-86.430322265625,68.138720703125],[-86.42001953124999,68.07392578125],[-86.39033203125,67.988916015625],[-86.382421875,67.927294921875],[-86.396435546875,67.88896484375],[-86.446923828125,67.8169921875],[-86.4896484375,67.78359375],[-86.546044921875,67.752197265625],[-86.59555664062499,67.7359375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-84.674755859375,65.575],[-84.727001953125,65.563720703125],[-84.78291015625,65.570068359375],[-84.8302734375,65.598974609375],[-84.86894531249999,65.650537109375],[-84.93115234375,65.68916015625],[-85.07197265625,65.737353515625],[-85.096337890625,65.756201171875],[-85.13627929687499,65.820849609375],[-85.14404296875,65.8853515625],[-85.17416992187499,65.94375],[-85.17568359375,65.972412109375],[-85.149609375,66.015380859375],[-85.031396484375,66.02548828125],[-84.93857421874999,66.008544921875],[-84.91982421875,65.997021484375],[-84.88945312499999,65.9720703125],[-84.86953125,65.94150390625],[-84.75737304687499,65.858935546875],[-84.69174804687499,65.7931640625],[-84.60263671874999,65.657373046875],[-84.60224609375,65.631494140625],[-84.62626953124999,65.604052734375],[-84.674755859375,65.575]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-93.0439453125,61.844091796875],[-93.08481445312499,61.841699218749994],[-93.17656249999999,61.892724609374994],[-93.1966796875,61.9185546875],[-93.07578125,61.935009765625],[-92.99301757812499,61.889697265625],[-92.999951171875,61.86748046875],[-93.0439453125,61.844091796875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-102.22734374999999,76.014892578125],[-102.01787109374999,75.953515625],[-102.0080078125,75.939404296875],[-102.04746093749999,75.927734375],[-102.318115234375,75.895166015625],[-102.4234375,75.869189453125],[-102.511376953125,75.8083984375],[-102.57958984375,75.780224609375],[-102.9435546875,75.763427734375],[-103.31474609375,75.764208984375],[-103.24472656249999,75.82294921875],[-103.04150390625,75.91884765625],[-103.2015625,75.95849609375],[-103.769775390625,75.8923828125],[-103.98525390625,75.93310546875],[-103.80078125,76.03701171875],[-103.984521484375,76.046533203125],[-104.24248046875,76.04697265625],[-104.4060546875,76.10849609375],[-104.350634765625,76.18232421875],[-104.01206054687499,76.222998046875],[-103.571435546875,76.258203125],[-103.09824218749999,76.311474609375],[-102.72802734375,76.30703125],[-102.58408203124999,76.281640625],[-102.5361328125,76.196435546875],[-102.49003906249999,76.095068359375],[-102.42568359375,76.08642578125],[-102.22734374999999,76.014892578125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-101.22612304687499,76.579345703125],[-101.48520507812499,76.575],[-101.60498046875,76.58701171875],[-101.61308593749999,76.60458984375],[-101.50947265625,76.627734375],[-101.1650390625,76.6654296875],[-100.962158203125,76.7341796875],[-100.886474609375,76.74267578125],[-100.62158203125,76.752490234375],[-100.467236328125,76.750341796875],[-100.269140625,76.734130859375],[-100.74658203125,76.649169921875],[-101.22612304687499,76.579345703125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-104.0228515625,76.58310546875],[-103.97348632812499,76.577587890625],[-103.82109375,76.597509765625],[-103.72275390624999,76.60107421875],[-103.61313476562499,76.563427734375],[-103.584619140625,76.5388671875],[-103.19013671875,76.47744140625],[-103.05131835937499,76.449853515625],[-103.03354492187499,76.431494140625],[-103.082958984375,76.40517578125],[-103.19951171874999,76.370849609375],[-103.31137695312499,76.34755859375],[-103.472216796875,76.329052734375],[-104.270654296875,76.32626953125],[-104.35751953124999,76.334619140625],[-104.407666015625,76.36513671875],[-104.50644531249999,76.478955078125],[-104.576611328125,76.540185546875],[-104.60302734375,76.58271484375],[-104.585693359375,76.606494140625],[-104.500390625,76.63037109375],[-104.205126953125,76.66611328125],[-104.07451171875,76.66611328125],[-103.99248046875,76.656982421875],[-103.95908203124999,76.63876953125],[-103.969189453125,76.61416015625],[-104.0228515625,76.58310546875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-103.003369140625,78.146435546875],[-103.11821289062499,78.1263671875],[-103.25224609375,78.138134765625],[-103.27099609375,78.150634765625],[-103.273583984375,78.165771484375],[-103.26005859375,78.18349609375],[-103.11044921874999,78.245849609375],[-102.973291015625,78.267236328125],[-102.891796875,78.271240234375],[-102.82553710937499,78.250048828125],[-102.78828125,78.2181640625],[-103.003369140625,78.146435546875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-101.6935546875,77.69658203125],[-101.8310546875,77.687353515625],[-102.079833984375,77.6921875],[-102.37783203125,77.728125],[-102.458203125,77.770166015625],[-102.475048828125,77.836669921875],[-102.47153320312499,77.873486328125],[-102.447705078125,77.880615234375],[-102.26318359375,77.88935546875],[-101.91787109375,77.899609375],[-101.639404296875,77.89208984375],[-101.322021484375,77.854150390625],[-101.19321289062499,77.82978515625],[-101.127587890625,77.81259765625],[-101.04624023437499,77.77783203125],[-101.01958007812499,77.762451171875],[-101.00205078124999,77.735107421875],[-101.39765625,77.729052734375],[-101.58457031249999,77.718310546875],[-101.6935546875,77.69658203125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-89.72646484375,76.507421875],[-89.77329101562499,76.49384765625],[-89.92412109374999,76.50087890625],[-89.97412109375,76.487548828125],[-90.054296875,76.4951171875],[-90.16455078125,76.523583984375],[-90.29350585937499,76.5794921875],[-90.44096679687499,76.66279296875],[-90.55625,76.7345703125],[-90.5625,76.754296875],[-90.5248046875,76.787841796875],[-90.40952148437499,76.81015625],[-90.136328125,76.836962890625],[-89.94877929687499,76.83623046875],[-89.774560546875,76.78203125],[-89.72529296875,76.763427734375],[-89.69541015624999,76.741162109375],[-89.69443359374999,76.71982421875],[-89.708642578125,76.701171875],[-89.787548828125,76.659619140625],[-89.82211914062499,76.630615234375],[-89.821923828125,76.602197265625],[-89.80478515624999,76.561083984375],[-89.77294921875,76.533935546875],[-89.72636718749999,76.52080078125],[-89.72646484375,76.507421875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-96.078564453125,75.510107421875],[-96.156396484375,75.47724609375],[-96.23662109374999,75.4748046875],[-96.344482421875,75.50595703125],[-96.46162109375,75.49423828125],[-96.62197265625,75.431298828125],[-96.67900390624999,75.394189453125],[-96.7228515625,75.38076171875],[-96.85712890625,75.369140625],[-96.91513671874999,75.3796875],[-96.96962890625,75.412646484375],[-97.020654296875,75.46806640625],[-96.9828125,75.509814453125],[-96.85615234375,75.537939453125],[-96.522900390625,75.583642578125],[-96.427685546875,75.60634765625],[-96.417236328125,75.630712890625],[-96.39726562499999,75.646826171875],[-96.367822265625,75.654638671875],[-96.14541015625,75.613525390625],[-96.03984374999999,75.585791015625],[-95.95986328125,75.554345703125],[-95.96860351562499,75.541845703125],[-96.078564453125,75.510107421875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-95.306640625,74.505419921875],[-95.35244140625,74.500390625],[-95.44150390624999,74.506103515625],[-95.77719726562499,74.550732421875],[-95.834375,74.56904296875],[-95.850732421875,74.582470703125],[-95.7744140625,74.598681640625],[-95.74560546875,74.615966796875],[-95.66044921874999,74.6369140625],[-95.510205078125,74.636767578125],[-95.3525390625,74.585693359375],[-95.27836914062499,74.53955078125],[-95.27446289062499,74.519189453125],[-95.306640625,74.505419921875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-113.832470703125,77.754638671875],[-114.105908203125,77.720703125],[-114.28720703124999,77.721484375],[-114.608349609375,77.7693359375],[-114.980419921875,77.9154296875],[-115.029345703125,77.967529296875],[-114.8904296875,77.976904296875],[-114.789501953125,77.992919921875],[-114.72646484375,78.01552734375],[-114.606884765625,78.04033203125],[-114.33037109375,78.0775390625],[-114.296875,78.06318359375],[-114.302880859375,78.03271484375],[-114.279833984375,78.004296875],[-114.18095703125,77.9982421875],[-114.08720703125,77.9779296875],[-113.89775390625,77.915576171875],[-113.768017578125,77.903564453125],[-113.72138671875,77.889892578125],[-113.6966796875,77.8689453125],[-113.617919921875,77.832421875],[-113.619384765625,77.8134765625],[-113.725830078125,77.77578125],[-113.832470703125,77.754638671875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-121.07622070312499,75.745263671875],[-121.154296875,75.740625],[-121.24091796875,75.75185546875],[-121.22109375,75.777490234375],[-121.026318359375,75.847509765625],[-121.01542968749999,75.867529296875],[-121.01806640625,75.883837890625],[-121.04228515624999,75.902978515625],[-120.993017578125,75.92744140625],[-120.91396484375,75.9375],[-120.88779296875,75.927978515625],[-120.87871093749999,75.906689453125],[-120.896875,75.84453125],[-120.921240234375,75.814453125],[-120.954931640625,75.78876953125],[-121.00664062499999,75.76572265625],[-121.07622070312499,75.745263671875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-113.560693359375,76.74326171875],[-113.712451171875,76.710546875],[-114.75146484375,76.75888671875],[-114.80830078125,76.774072265625],[-114.83525390625,76.794677734375],[-114.64707031249999,76.851025390625],[-114.419873046875,76.875341796875],[-113.891650390625,76.894873046875],[-113.70751953125,76.87294921875],[-113.585400390625,76.847314453125],[-113.51650390625,76.825048828125],[-113.48759765625,76.783251953125],[-113.560693359375,76.74326171875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-104.119921875,75.036328125],[-104.30869140624999,75.03095703125],[-104.634326171875,75.061279296875],[-104.828125,75.1197265625],[-104.88740234375,75.14775390625],[-104.881640625,75.160498046875],[-104.848095703125,75.173046875],[-104.801318359375,75.21103515625],[-104.690380859375,75.320703125],[-104.648828125,75.349755859375],[-104.474169921875,75.413037109375],[-104.34619140625,75.429931640625],[-104.074658203125,75.42451171875],[-103.9169921875,75.391845703125],[-103.851171875,75.37080078125],[-103.8041015625,75.3455078125],[-103.75791015624999,75.2890625],[-103.746484375,75.25244140625],[-103.667236328125,75.210693359375],[-103.643505859375,75.186572265625],[-103.642138671875,75.162939453125],[-103.6642578125,75.1390625],[-103.709716796875,75.114990234375],[-103.813916015625,75.079736328125],[-104.119921875,75.036328125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-55.458740234375,51.536523437499994],[-55.532421875,51.436962890625],[-55.583398437499994,51.388574218749994],[-55.630761718749994,51.372900390625],[-55.730712890625,51.358691406249996],[-55.941162109375,51.343017578125],[-56.03110351562499,51.328369140625],[-56.0439453125,51.261865234374994],[-56.030664062499994,51.226904296875],[-55.999902343749994,51.199267578124996],[-55.960839843749994,51.19140625],[-55.87353515625,51.207910156249994],[-55.84111328124999,51.205078125],[-55.815087890624994,51.191162109375],[-55.79550781249999,51.166162109374994],[-55.7853515625,51.1314453125],[-55.78471679687499,51.087060546874994],[-55.8,51.03330078125],[-55.87138671874999,50.907373046874994],[-55.96201171874999,50.837695312499996],[-56.078125,50.78095703125],[-56.10654296874999,50.75927734375],[-56.12119140624999,50.733789062499994],[-56.135644531249994,50.6509765625],[-56.195751953125,50.584765625],[-56.382421875,50.4169921875],[-56.454345703125,50.380029296874994],[-56.45478515625,50.350488281249994],[-56.48393554687499,50.270849609375],[-56.53935546874999,50.20673828125],[-56.693994140624994,50.05966796875],[-56.732324218749994,50.007714843749994],[-56.74956054687499,49.966552734375],[-56.74716796874999,49.908496093749996],[-56.7541015625,49.88291015625],[-56.789501953125,49.833740234375],[-56.8388671875,49.787744140624994],[-56.8486328125,49.76533203125],[-56.82919921874999,49.724609375],[-56.809228515624994,49.710400390625],[-56.806884765625,49.67333984375],[-56.822167968749994,49.6134765625],[-56.756787109375,49.651611328125],[-56.61064453124999,49.7876953125],[-56.500927734375,49.86962890625],[-56.42758789062499,49.897412109375],[-56.376416015625,49.93369140625],[-56.32182617187499,50.01376953125],[-56.2470703125,50.090087890625],[-56.17939453125,50.114990234375],[-56.148388671875,50.100341796875],[-56.12216796874999,50.062841796875],[-56.12744140625,50.01513671875],[-56.16416015624999,49.957275390625],[-56.161279296874994,49.94013671875],[-56.075,49.9826171875],[-55.927001953125,50.0177734375],[-55.87333984374999,50.013134765625],[-55.76474609374999,49.96044921875],[-55.674462890624994,49.966552734375],[-55.530029296875,49.99716796875],[-55.5029296875,49.983154296875],[-55.527001953124994,49.936767578125],[-55.58369140625,49.892382812499996],[-55.71762695312499,49.829003906249994],[-56.039990234375,49.7046875],[-56.14018554687499,49.619140625],[-56.12119140624999,49.621728515624994],[-56.05161132812499,49.6583984375],[-55.978515625,49.678125],[-55.90185546875,49.680859375],[-55.86982421875,49.670166015625],[-55.88232421875,49.645947265625],[-55.892041015625,49.5802734375],[-56.087304687499994,49.451953125],[-56.0412109375,49.456835937499996],[-55.81523437499999,49.515283203124994],[-55.678125,49.434619140624996],[-55.48974609375,49.4625],[-55.375927734375,49.48974609375],[-55.379150390625,49.472900390625],[-55.3544921875,49.4376953125],[-55.355371093749994,49.380859375],[-55.34384765624999,49.372900390625],[-55.289941406249994,49.391943359375],[-55.280175781249994,49.412744140624994],[-55.28300781249999,49.513818359374994],[-55.266357421875,49.52392578125],[-55.22954101562499,49.508154296875],[-55.20703125,49.48203125],[-55.20029296874999,49.408496093749996],[-55.225,49.33466796875],[-55.25932617187499,49.266992187499994],[-55.34248046875,49.168115234374994],[-55.331933593749994,49.1255859375],[-55.353173828124994,49.079443359375],[-55.33476562499999,49.077880859375],[-55.25234375,49.120898437499996],[-55.24736328124999,49.138574218749994],[-55.253808593749994,49.179638671875],[-55.24453125,49.1998046875],[-55.17612304687499,49.244433593749996],[-55.06318359375,49.29736328125],[-55.02617187499999,49.30537109375],[-55.010400390624994,49.293017578124996],[-55.01591796874999,49.2603515625],[-54.9826171875,49.268115234374996],[-54.910546875,49.316259765625],[-54.843652343749994,49.34541015625],[-54.781884765624994,49.35546875],[-54.71762695312499,49.388574218749994],[-54.65087890625,49.44453125],[-54.579052734375,49.4908203125],[-54.502197265625,49.52734375],[-54.469189453125,49.52978515625],[-54.480615234374994,49.4693359375],[-54.46542968749999,49.400537109374994],[-54.46347656249999,49.341748046875],[-54.4482421875,49.329443359375],[-54.3890625,49.392138671874996],[-54.35615234375,49.4150390625],[-54.31674804687499,49.424121093749996],[-54.27080078124999,49.419287109375],[-53.95771484375,49.441845703125],[-53.862451171874994,49.426318359374996],[-53.75498046874999,49.385302734374996],[-53.61943359374999,49.321630859375],[-53.569580078125,49.26416015625],[-53.56005859375,49.191699218749996],[-53.5734375,49.1412109375],[-53.671142578125,49.077539062499994],[-53.758056640625,49.035400390625],[-53.809326171875,48.993408203125],[-53.82490234375,48.9513671875],[-53.84521484375,48.925439453124994],[-53.903222656249994,48.88916015625],[-54.161279296874994,48.7876953125],[-54.099511718749994,48.784765625],[-53.95068359375,48.806787109374994],[-53.85288085937499,48.811328125],[-53.84775390624999,48.796679687499996],[-53.88681640624999,48.767822265625],[-53.96152343749999,48.7388671875],[-53.96958007812499,48.724902343749996],[-53.966015625,48.706689453124994],[-53.886132812499994,48.68466796875],[-53.784082031249994,48.69541015625],[-53.69804687499999,48.679833984374994],[-53.70634765624999,48.655517578125],[-53.774609375,48.576318359374994],[-53.79462890625,48.5263671875],[-53.88554687499999,48.4845703125],[-54.067773437499994,48.418847656249994],[-54.114453125,48.393603515624996],[-54.104248046875,48.38837890625],[-53.93701171875,48.43662109375],[-53.852734375,48.448828125],[-53.79931640625,48.44921875],[-53.73886718749999,48.49580078125],[-53.644433593749994,48.51123046875],[-53.55205078124999,48.481787109375],[-53.411328125,48.562158203124994],[-53.361083984375,48.572607421875],[-53.27543945312499,48.563330078125],[-53.22026367187499,48.577880859375],[-53.12734375,48.632568359375],[-53.057275390624994,48.659033203125],[-53.04267578125,48.656640625],[-53.027587890625,48.634716796875],[-53.020751953125,48.571630859375],[-53.0373046875,48.515869140625],[-53.060205078124994,48.480322265625],[-53.1357421875,48.40185546875],[-53.18212890625,48.374365234375],[-53.22509765625,48.364013671875],[-53.301171875,48.3681640625],[-53.33432617187499,48.35595703125],[-53.405517578125,48.294335937499994],[-53.531201171875,48.231884765625],[-53.609765625,48.20771484375],[-53.560205078124994,48.173828125],[-53.54184570312499,48.108447265624996],[-53.56943359374999,48.0880859375],[-53.704296875,48.067919921874996],[-53.71015625,48.0568359375],[-53.758203125,48.042382812499994],[-53.869580078125,48.019677734374994],[-53.79355468749999,48.009716796875],[-53.65302734375,48.025732421875],[-53.63823242187499,48.0146484375],[-53.657617187499994,47.968652343749994],[-53.69501953125,47.921191406249996],[-53.86166992187499,47.799267578125],[-53.863671875,47.787011718749994],[-53.83774414062499,47.72724609375],[-53.80537109375,47.68203125],[-53.76513671875,47.65009765625],[-53.67236328125,47.648242187499996],[-53.603759765625,47.6623046875],[-53.50375976562499,47.74384765625],[-53.28271484375,47.997851562499996],[-53.08544921875,48.068505859374994],[-52.92099609374999,48.1470703125],[-52.88330078125,48.131152343749996],[-52.86601562499999,48.11298828125],[-52.872021484375,48.0939453125],[-52.954980468749994,48.029296875],[-52.9982421875,47.975927734375],[-53.11083984375,47.811914062499994],[-53.15385742187499,47.7345703125],[-53.175537109375,47.652978515624994],[-53.169824218749994,47.512109375],[-53.157666015625,47.48779296875],[-53.122460937499994,47.455126953124996],[-53.0568359375,47.48310546875],[-52.94501953125,47.55283203125],[-52.873193359374994,47.619433593749996],[-52.81694335937499,47.727880859375],[-52.782421875,47.769433593749994],[-52.74492187499999,47.768945312499994],[-52.71142578125,47.7453125],[-52.703271484374994,47.693017578124994],[-52.67216796874999,47.62177734375],[-52.65366210937499,47.5494140625],[-52.66850585937499,47.46982421875],[-52.68364257812499,47.426318359374996],[-52.91240234374999,47.10322265625],[-52.888134765625,47.045849609375],[-52.882080078125,47.011083984375],[-52.88920898437499,46.97412109375],[-52.96171874999999,46.81943359375],[-53.03193359375,46.72275390625],[-53.069775390625,46.68125],[-53.11484375,46.655810546874996],[-53.1669921875,46.646484375],[-53.21367187499999,46.660498046875],[-53.2548828125,46.697705078125],[-53.29130859374999,46.717041015625],[-53.32304687499999,46.718359375],[-53.381738281249994,46.71142578125],[-53.5361328125,46.63251953125],[-53.567773437499994,46.628271484375],[-53.589794921875,46.6388671875],[-53.616357421874994,46.6802734375],[-53.595166015625,46.888476562499996],[-53.58134765624999,46.957275390625],[-53.61215820312499,47.0103515625],[-53.57963867187499,47.099414062499996],[-53.57846679687499,47.133251953125],[-53.59736328125,47.14599609375],[-53.636376953124994,47.1376953125],[-53.69536132812499,47.092919921874994],[-53.774316406249994,47.01181640625],[-53.860009765624994,46.939453125],[-54.00957031249999,46.839599609375],[-54.07602539062499,46.819970703124994],[-54.10239257812499,46.82490234375],[-54.1328125,46.83857421875],[-54.173730468749994,46.88037109375],[-54.173291015625,46.9171875],[-54.155224609375,46.96748046875],[-54.092675781249994,47.086230468749996],[-53.97050781249999,47.261962890625],[-53.869091796875,47.387011718749996],[-53.849511718749994,47.440332031249994],[-53.877880859375,47.46357421875],[-53.900830078125,47.509326171874996],[-53.93974609374999,47.644677734374994],[-53.989013671875,47.756201171875],[-54.047265625,47.805615234375],[-54.191845703125,47.859814453125],[-54.218408203124994,47.846728515624996],[-54.23388671875,47.7716796875],[-54.4046875,47.555908203125],[-54.434472656249994,47.462304687499994],[-54.45590820312499,47.427587890625],[-54.48813476562499,47.403857421874996],[-54.56254882812499,47.3751953125],[-54.542382812499994,47.425097656249996],[-54.46323242187499,47.53623046875],[-54.47392578124999,47.5470703125],[-54.57451171874999,47.457763671875],[-54.65117187499999,47.408203125],[-54.74467773437499,47.395458984375],[-54.801513671875,47.3986328125],[-54.856640625,47.385009765625],[-55.09042968749999,47.17392578125],[-55.09921875,47.103564453124996],[-55.1396484375,47.045947265624996],[-55.25493164062499,46.941748046875],[-55.31572265624999,46.905712890625],[-55.401269531249994,46.899267578125],[-55.47929687499999,46.917285156249996],[-55.530712890625,46.914013671875],[-55.65234375,46.8814453125],[-55.788525390625,46.867236328124996],[-55.8447265625,46.873828125],[-55.880615234375,46.88720703125],[-55.94990234375,46.927685546875],[-55.958203125,46.956396484375],[-55.954492187499994,46.9732421875],[-55.91923828124999,47.016894531249996],[-55.83837890625,47.071630859375],[-55.77182617187499,47.092089843749996],[-55.61005859375,47.11962890625],[-55.49150390624999,47.16064453125],[-55.40122070312499,47.221484375],[-55.36088867187499,47.25859375],[-55.190820312499994,47.448974609375],[-54.97563476562499,47.516162109374996],[-54.86953125,47.5708984375],[-54.795361328125,47.64033203125],[-54.784619140625,47.66474609375],[-54.891015625,47.6294921875],[-54.945947265624994,47.620849609375],[-55.03500976562499,47.63388671875],[-55.07456054687499,47.657568359375],[-55.19658203124999,47.650048828124994],[-55.36630859374999,47.661083984375],[-55.390771484374994,47.642871093749996],[-55.41269531249999,47.550390625],[-55.43466796874999,47.501269531249996],[-55.46064453125,47.484765625],[-55.49863281249999,47.475048828125],[-55.576123046875,47.465234375],[-55.77470703124999,47.498291015625],[-55.81137695312499,47.516357421875],[-55.862060546875,47.530078125],[-56.08134765624999,47.499951171875],[-56.12724609374999,47.502832031249994],[-56.08369140625,47.52451171875],[-55.867089843749994,47.592333984374996],[-55.844384765624994,47.787841796875],[-55.85791015625,47.819189453125],[-55.91845703125,47.791894531249994],[-56.02011718749999,47.763720703124996],[-56.08964843749999,47.771875],[-56.12143554687499,47.78916015625],[-56.1505859375,47.77451171875],[-56.22128906249999,47.67138671875],[-56.26298828124999,47.658447265625],[-56.32578125,47.6544921875],[-56.45957031249999,47.616943359375],[-56.722314453124994,47.59228515625],[-56.77412109375,47.564990234374996],[-56.95249023437499,47.574462890625],[-57.47343749999999,47.631103515625],[-57.659814453124994,47.625390625],[-57.88408203124999,47.660009765625],[-57.925537109375,47.67490234375],[-58.23930664062499,47.668847656249994],[-58.333203125,47.67685546875],[-58.32695312499999,47.719873046874994],[-58.336865234375,47.730859375],[-58.42802734374999,47.683398437499996],[-58.50888671874999,47.652587890625],[-58.61313476562499,47.626220703125],[-58.941162109375,47.58046875],[-59.116943359375,47.570703125],[-59.21928710937499,47.6025390625],[-59.259765625,47.634179687499994],[-59.32065429687499,47.7369140625],[-59.36240234374999,47.865673828125],[-59.362060546875,47.888964843749996],[-59.34086914062499,47.933642578124996],[-59.27207031249999,47.995556640625],[-58.960839843749994,48.159375],[-58.710595703124994,48.325048828125],[-58.60498046875,48.411328125],[-58.50263671875,48.442041015624994],[-58.335546875,48.513671875],[-58.330224609374994,48.522119140624994],[-58.49223632812499,48.513037109375],[-58.60615234375,48.532861328124994],[-58.722558593749994,48.54072265625],[-58.943798828125,48.521777343749996],[-59.16679687499999,48.521777343749996],[-59.16767578125,48.558496093749994],[-59.063427734375,48.627685546875],[-58.841796875,48.746435546875],[-58.81918945312499,48.746826171875],[-58.887109375,48.691552734374994],[-58.9064453125,48.650195312499996],[-58.87724609374999,48.622705078124994],[-58.843408203124994,48.605322265625],[-58.716455078124994,48.598046875],[-58.68735351562499,48.6220703125],[-58.6416015625,48.749414062499994],[-58.54560546875,48.896875],[-58.49375,49.003222656249996],[-58.40366210937499,49.084326171875],[-58.35869140624999,49.096533203125],[-58.31875,49.081347656249996],[-58.18613281249999,49.061914062499994],[-58.04965820312499,48.987548828125],[-58.00556640625,48.98125],[-57.99052734374999,48.987939453124994],[-58.04057617187499,49.009765625],[-58.08183593749999,49.044726562499996],[-58.09892578124999,49.077441406249996],[-58.049072265625,49.179980468749996],[-57.990673828125,49.20947265625],[-57.980078125,49.229638671874994],[-58.096875,49.230078125],[-58.19091796875,49.258740234375],[-58.218896484374994,49.305126953125],[-58.21337890625,49.386669921875],[-58.18271484374999,49.435400390625],[-58.107421875,49.49970703125],[-58.0158203125,49.54248046875],[-57.96123046874999,49.531542968749996],[-57.85605468749999,49.473828125],[-57.79130859374999,49.489990234375],[-57.798828125,49.508544921875],[-57.8974609375,49.600390625],[-57.92905273437499,49.668408203125],[-57.926171875,49.700830078124994],[-57.7125,50.02490234375],[-57.60795898437499,50.198779296874996],[-57.46552734375,50.463671875],[-57.4326171875,50.505810546875],[-57.36044921874999,50.583935546875],[-57.33056640625,50.60517578125],[-57.23740234374999,50.605371093749994],[-57.179589843749994,50.61484375],[-57.26416015625,50.649365234375],[-57.29443359375,50.673388671874996],[-57.297998046874994,50.69873046875],[-57.27490234375,50.72529296875],[-57.242138671875,50.744921875],[-57.13164062499999,50.787402343749996],[-57.05327148437499,50.857324218749994],[-57.00566406249999,50.9396484375],[-57.01274414062499,50.967724609375],[-57.0373046875,50.995654296874996],[-57.03593749999999,51.01083984375],[-56.97636718749999,51.027978515624994],[-56.825146484375,51.125732421875],[-56.80546874999999,51.144482421875],[-56.7501953125,51.27490234375],[-56.68242187499999,51.332763671875],[-56.619042968749994,51.362451171874994],[-56.51796875,51.399316406249994],[-56.20737304687499,51.488623046875],[-56.0255859375,51.568359375],[-55.902099609375,51.563916015625],[-55.86582031249999,51.50830078125],[-55.6904296875,51.471337890624994],[-55.659570312499994,51.511035156249996],[-55.700634765625,51.559423828125],[-55.66640625,51.57890625],[-55.521630859374994,51.59638671875],[-55.49643554687499,51.58984375],[-55.45322265624999,51.562304687499996],[-55.458740234375,51.536523437499994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-55.5361328125,50.719677734375],[-55.56967773437499,50.70869140625],[-55.60078125,50.709033203124996],[-55.629345703125,50.72080078125],[-55.63388671874999,50.740185546875],[-55.6044921875,50.780712890625],[-55.52719726562499,50.801220703125],[-55.46928710937499,50.79638671875],[-55.47275390624999,50.775927734374996],[-55.503808593749994,50.742138671875],[-55.5361328125,50.719677734375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-54.55439453125,49.5888671875],[-54.70869140625,49.530664062499994],[-54.74384765625,49.507763671875],[-54.786523437499994,49.496142578124996],[-54.818505859374994,49.514453125],[-54.86357421874999,49.576074218749994],[-54.855419921875,49.596582031249994],[-54.81308593749999,49.599365234375],[-54.78876953125,49.591210937499994],[-54.782617187499994,49.572070312499996],[-54.7640625,49.562353515625],[-54.73310546875,49.562158203124994],[-54.61875,49.6220703125],[-54.55917968749999,49.631494140624994],[-54.53769531249999,49.619970703125],[-54.55439453125,49.5888671875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-55.361230468749994,51.8896484375],[-55.40888671875,51.888818359375],[-55.41962890625,51.900048828125],[-55.399804687499994,51.9384765625],[-55.34648437499999,51.982861328125],[-55.274072265624994,51.995166015624996],[-55.29355468749999,51.929980468749996],[-55.361230468749994,51.8896484375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-54.093701171875,49.744433593749996],[-54.019921875,49.679492187499996],[-53.9806640625,49.661962890625],[-54.23837890624999,49.591650390625],[-54.26923828125,49.58701171875],[-54.2861328125,49.595361328124994],[-54.28876953125,49.66083984375],[-54.27763671874999,49.711474609374996],[-54.258984375,49.718994140625],[-54.199365234374994,49.688525390624996],[-54.1376953125,49.751171875],[-54.093701171875,49.744433593749996]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-56.26708984375,46.8384765625],[-56.35419921875,46.7953125],[-56.384765625,46.81943359375],[-56.37724609374999,46.84765625],[-56.33256835937499,46.915966796875],[-56.333935546875,46.93564453125],[-56.3869140625,47.06796875],[-56.3779296875,47.08955078125],[-56.364648437499994,47.098974609375],[-56.287353515625,47.07099609375],[-56.27836914062499,47.035009765625],[-56.314892578125,46.953857421875],[-56.289794921875,46.89990234375],[-56.25546875,46.860986328124994],[-56.26708984375,46.8384765625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-54.22714843749999,47.441357421875],[-54.27607421875,47.406542968749996],[-54.32597656249999,47.408105468749994],[-54.32011718749999,47.438525390624996],[-54.258691406249994,47.49765625],[-54.22739257812499,47.539990234375],[-54.22626953125,47.56552734375],[-54.21494140624999,47.585107421874994],[-54.168359375,47.607080078124994],[-54.128173828125,47.646826171875],[-54.14755859374999,47.573095703125],[-54.22714843749999,47.441357421875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-100.217236328125,68.806689453125],[-100.248779296875,68.775048828125],[-100.28793945312499,68.766064453125],[-100.36572265625,68.72880859375],[-100.39731445312499,68.723828125],[-100.442578125,68.74755859375],[-100.4806640625,68.786181640625],[-100.49692382812499,68.792236328125],[-100.52104492187499,68.790673828125],[-100.573388671875,68.766064453125],[-100.59653320312499,68.76640625],[-100.615966796875,68.78291015625],[-100.625390625,68.81591796875],[-100.624658203125,68.865283203125],[-100.59990234374999,68.941357421875],[-100.59833984375,68.969091796875],[-100.611572265625,68.990185546875],[-100.60063476562499,69.009423828125],[-100.56547851562499,69.026806640625],[-100.52031249999999,69.03505859375],[-100.41396484375,69.028076171875],[-100.32993164062499,68.99755859375],[-100.28896484375,68.957666015625],[-100.20688476562499,68.926171875],[-100.178466796875,68.90390625],[-100.217236328125,68.806689453125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-99.99467773437499,69.013525390625],[-100.018017578125,68.95400390625],[-100.14130859375,68.969921875],[-100.195703125,68.991455078125],[-100.24199218749999,69.040380859375],[-100.24736328124999,69.052783203125],[-100.237060546875,69.071484375],[-100.186962890625,69.114013671875],[-100.15312,69.1294921875],[-100.07280273437499,69.111474609375],[-100.0353515625,69.086572265625],[-100.005615234375,69.047119140625],[-99.99467773437499,69.013525390625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-100.308349609375,70.49580078125],[-100.321240234375,70.4876953125],[-100.537255859375,70.525],[-100.62065429687499,70.546923828125],[-100.64775390624999,70.563134765625],[-100.666943359375,70.596240234375],[-100.67832031249999,70.64619140625],[-100.63530273437499,70.6703125],[-100.53793945312499,70.668603515625],[-100.43393554687499,70.6494140625],[-100.276123046875,70.59462890625],[-100.32109374999999,70.578369140625],[-100.3232421875,70.542431640625],[-100.30551757812499,70.5083984375],[-100.308349609375,70.49580078125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-95.513671875,69.5736328125],[-95.38090820312499,69.506591796875],[-95.382080078125,69.474072265625],[-95.3994140625,69.419775390625],[-95.437451171875,69.378466796875],[-95.496240234375,69.35009765625],[-95.578515625,69.33583984375],[-95.68437,69.335693359375],[-95.730126953125,69.34755859375],[-95.69589843749999,69.38955078125],[-95.670166015625,69.402001953125],[-95.66582031249999,69.43896484375],[-95.6828125,69.50029296875],[-95.7041015625,69.538037109375],[-95.763623046875,69.559619140625],[-95.80620117187499,69.560498046875],[-95.8177734375,69.540576171875],[-95.79833984375,69.4998046875],[-95.81181640624999,69.447021484375],[-95.85820312499999,69.3822265625],[-95.89345703125,69.3517578125],[-95.9560546875,69.367138671875],[-95.9859375,69.39189453125],[-95.9779296875,69.43271484375],[-95.994775390625,69.469677734375],[-95.97885742187499,69.508837890625],[-95.93623046875,69.567041015625],[-95.87583007812499,69.606005859375],[-95.79775390625,69.625732421875],[-95.706640625,69.62431640625],[-95.602490234375,69.601806640625],[-95.513671875,69.5736328125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-101.17172851562499,69.3970703125],[-101.253515625,69.3884765625],[-101.268505859375,69.390576171875],[-101.26152343749999,69.417822265625],[-101.26762695312499,69.431494140625],[-101.289501953125,69.441259765625],[-101.2177734375,69.462939453125],[-101.20732421874999,69.479833984375],[-101.230126953125,69.492822265625],[-101.32846679687499,69.517431640625],[-101.35649414062499,69.539697265625],[-101.351318359375,69.559228515625],[-101.312890625,69.57607421875],[-101.244873046875,69.57353515625],[-101.09833984375,69.540771484375],[-101.03115234375,69.495458984375],[-101.000634765625,69.4619140625],[-101.04916992187499,69.45693359375],[-101.086865234375,69.443359375],[-101.126953125,69.414697265625],[-101.17172851562499,69.3970703125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-101.8458984375,68.586328125],[-101.88720703125,68.5849609375],[-101.94462890624999,68.60283203125],[-102.266357421875,68.663671875],[-102.30815429687499,68.681982421875],[-102.2705078125,68.707568359375],[-102.1533203125,68.740478515625],[-102.074365234375,68.7740234375],[-102.01337890625,68.825390625],[-101.828369140625,68.798974609375],[-101.75932617187499,68.774609375],[-101.73295898437499,68.75341796875],[-101.721630859375,68.72412109375],[-101.73203125,68.6521484375],[-101.79428710937499,68.636865234375],[-101.8458984375,68.586328125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-104.540673828125,68.405908203125],[-104.59599609375,68.402197265625],[-104.699462890625,68.41826171875],[-104.851123046875,68.453955078125],[-104.965234375,68.491748046875],[-105.041748046875,68.53154296875],[-105.05136718749999,68.559033203125],[-104.99399414062499,68.57421875],[-104.907275390625,68.581787109375],[-104.700390625,68.576708984375],[-104.602001953125,68.5615234375],[-104.472119140625,68.503515625],[-104.44453125,68.470703125],[-104.440478515625,68.44951171875],[-104.45712890624999,68.43115234375],[-104.540673828125,68.405908203125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-107.899853515625,67.401806640625],[-107.950244140625,67.318212890625],[-107.96953125,67.326025390625],[-108.003955078125,67.36591796875],[-108.07333984374999,67.38505859375],[-108.15224609375,67.429443359375],[-108.151123046875,67.5248046875],[-108.120849609375,67.5681640625],[-108.12753906249999,67.628564453125],[-108.048974609375,67.664892578125],[-107.990869140625,67.622119140625],[-107.97490234375,67.549365234375],[-107.98935546874999,67.51357421875],[-107.931787109375,67.47646484375],[-107.90517578125,67.467041015625],[-107.89096679687499,67.43720703125],[-107.899853515625,67.401806640625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-109.16640625,67.982373046875],[-109.05390625,67.971875],[-108.9705078125,67.979736328125],[-108.909619140625,67.939404296875],[-108.88603515625,67.89853515625],[-108.89384765625,67.88447265625],[-108.920166015625,67.87880859375],[-109.096240234375,67.9240234375],[-109.1615234375,67.951708984375],[-109.18359375,67.975],[-109.16640625,67.982373046875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-108.092724609375,67.00517578125],[-107.966455078125,66.997265625],[-107.80551757812499,66.998583984375],[-107.83334960937499,66.921337890625],[-107.895166015625,66.871875],[-107.94394531249999,66.8578125],[-107.96513671875,66.88486328125],[-108.059716796875,66.946875],[-108.092724609375,67.00517578125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-109.32314453125,67.990869140625],[-109.36083984375,67.98759765625],[-109.49794921875,68.047021484375],[-109.469140625,68.097998046875],[-109.34169921875,68.045849609375],[-109.32353515625,68.013330078125],[-109.32314453125,67.990869140625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-60.99448242187499,56.039306640625],[-60.98271484374999,56.01513671875],[-61.13701171874999,56.032568359375],[-61.191308593749994,56.0478515625],[-61.19584960937499,56.063916015625],[-61.18818359375,56.08896484375],[-61.15756835937499,56.118359375],[-61.0869140625,56.1408203125],[-61.04853515625,56.129248046875],[-60.96640625,56.098828125],[-60.95537109374999,56.080419921875],[-60.99448242187499,56.039306640625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-61.743603515625,57.55458984375],[-61.65952148437499,57.524951171874996],[-61.6375,57.416064453124996],[-61.79526367187499,57.4224609375],[-61.975488281249994,57.495410156249996],[-62.01123046875,57.548486328125],[-62.007226562499994,57.5576171875],[-61.983300781249994,57.566748046875],[-61.9375,57.5541015625],[-61.89306640625,57.57314453125],[-61.84833984375,57.579345703125],[-61.743603515625,57.55458984375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-69.16005859375,59.040234375],[-69.220849609375,58.967578125],[-69.301708984375,58.976611328125],[-69.330810546875,58.96162109375],[-69.35283203124999,58.9607421875],[-69.31630859375,59.028955078124994],[-69.3115234375,59.0748046875],[-69.32998046875,59.121240234374994],[-69.30322265625,59.144873046875],[-69.19516601562499,59.146142578124994],[-69.193798828125,59.0927734375],[-69.1806640625,59.072705078125],[-69.15517578125,59.06357421875],[-69.16005859375,59.040234375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[22.175097656250017,60.370751953124994],[22.3017578125,60.347558593749994],[22.35498046875,60.355859375],[22.41552734375,60.303369140624994],[22.312890625000023,60.269970703125],[22.305761718750006,60.228564453125],[22.346289062500006,60.20283203125],[22.36054687500001,60.165576171875],[22.25830078125,60.165625],[22.209375,60.19697265625],[22.188085937500006,60.236767578125],[22.140527343750023,60.264892578125],[22.0771484375,60.286328125],[22.108203125000017,60.314892578125],[22.125878906250023,60.355859375],[22.175097656250017,60.370751953124994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[21.45087890625001,60.52958984375],[21.436914062500023,60.483056640624994],[21.369042968750023,60.488232421875],[21.3,60.47978515625],[21.24433593750001,60.5259765625],[21.21455078125001,60.603857421875],[21.224707031250006,60.62060546875],[21.26806640625,60.63828125],[21.30126953125,60.595556640625],[21.45087890625001,60.52958984375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[21.83320312500001,60.140527343749994],[21.73310546875001,60.10615234375],[21.69501953125001,60.11435546875],[21.70478515625001,60.172314453125],[21.764257812500006,60.198828125],[21.864355468750006,60.201806640624994],[21.83320312500001,60.140527343749994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-64.40703124999999,60.367089843749994],[-64.44194335937499,60.2978515625],[-64.558203125,60.3232421875],[-64.737939453125,60.375634765624994],[-64.808984375,60.410400390625],[-64.83378906249999,60.4484375],[-64.83642578125,60.501025390625],[-64.78256835937499,60.509619140625],[-64.64628906249999,60.514599609375],[-64.53251953124999,60.44140625],[-64.49980468749999,60.430224609375],[-64.40703124999999,60.367089843749994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[126.17197265625003,34.73115234375],[126.15878906250003,34.706982421875],[126.115234375,34.714208984375],[126.07060546874999,34.783056640625],[126.05205078124999,34.837548828124994],[126.00751953125001,34.867480468749996],[126.07841796874999,34.91484375],[126.16855468750003,34.8296875],[126.17197265625003,34.73115234375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[72.49199218750002,-7.37744140625],[72.46875,-7.417187500000011],[72.42910156250002,-7.435351562500003],[72.40761718750002,-7.33447265625],[72.34970703125,-7.263378906250011],[72.37285156250002,-7.263378906250011],[72.42744140625001,-7.2998046875],[72.447265625,-7.395703125000011],[72.46718750000002,-7.367578125],[72.46220703125002,-7.337792968750009],[72.47373046875,-7.309667968750006],[72.4654296875,-7.278222656250009],[72.43574218750001,-7.230273437500003],[72.44560546875002,-7.220410156250011],[72.49355468750002,-7.26171875],[72.49853515625,-7.294824218750009],[72.49199218750002,-7.37744140625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-139.556201171875,-8.940234375],[-139.62099609375,-8.947949218750011],[-139.631787109375,-8.898535156250006],[-139.611767578125,-8.872363281250003],[-139.583984375,-8.860058593750011],[-139.5345703125,-8.875390625],[-139.508349609375,-8.897070312500006],[-139.509912109375,-8.915625],[-139.556201171875,-8.940234375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[157.64541015625002,-8.758886718750006],[157.64316406250003,-8.794042968750006],[157.58583984375002,-8.783105468750009],[157.45791015625002,-8.730175781250011],[157.45351562500002,-8.705957031250009],[157.5263671875,-8.697070312500003],[157.579296875,-8.703710937500006],[157.6232421875,-8.734570312500011],[157.64541015625002,-8.758886718750006]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[20.611328125,60.040673828124994],[20.603417968750023,60.016943359375],[20.521777343750017,60.011669921875],[20.4875,60.032763671875],[20.411230468750006,60.030126953125],[20.39794921875,60.040673828124994],[20.429589843750023,60.06171875],[20.490136718750023,60.07490234375],[20.569140625000017,60.06962890625],[20.611328125,60.040673828124994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[21.628320312500023,60.1078125],[21.540625,60.097900390625],[21.48603515625001,60.126806640625],[21.506738281250023,60.148339843749994],[21.56796875,60.172314453125],[21.634082031250017,60.168994140625],[21.64814453125001,60.140869140625],[21.628320312500023,60.1078125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[24.848242187500006,64.991015625],[24.69892578125001,64.9578125],[24.57861328125,64.978564453125],[24.576562500000023,65.04287109375],[24.651171875000017,65.073974609375],[24.786035156250023,65.08642578125],[24.970605468750023,65.055322265625],[24.99755859375,65.038720703125],[24.89179687500001,65.02626953125],[24.848242187500006,64.991015625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[29.956152343750006,69.79677734375],[29.766210937500006,69.767529296875],[29.744238281250006,69.7916015625],[29.785937500000017,69.829052734375],[29.835839843750023,69.90556640625],[29.913964843750023,69.90244140625],[29.992968750000017,69.8732421875],[30.05517578125,69.83837890625],[29.956152343750006,69.79677734375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[4.958691406250011,61.0845703125],[4.8701171875,61.071923828124994],[4.799023437500011,61.08271484375],[4.824414062500011,61.17822265625],[4.861621093750017,61.19384765625],[4.915429687500023,61.199365234374994],[4.973242187500006,61.1482421875],[4.958691406250011,61.0845703125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[8.102734375000011,63.33759765625],[8.004687500000017,63.3369140625],[7.88828125,63.35234375],[7.815332031250023,63.38505859375],[7.804003906250017,63.413916015625],[7.938378906250023,63.4498046875],[8.073535156250017,63.47080078125],[8.136132812500023,63.43134765625],[8.140917968750017,63.36640625],[8.102734375000011,63.33759765625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[8.470800781250006,63.667138671874994],[8.356152343750011,63.664794921875],[8.287109375,63.687158203124994],[8.451269531250006,63.731835937499994],[8.708886718750023,63.774316406249994],[8.7333984375,63.801318359375],[8.7646484375,63.804638671875],[8.809179687500006,63.771435546875],[8.814843750000023,63.725976562499994],[8.786523437500023,63.703466796875],[8.470800781250006,63.667138671874994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[12.509570312500017,65.901953125],[12.429492187500017,65.899072265625],[12.43017578125,65.93994140625],[12.47607421875,65.977099609375],[12.548828125,66.001904296875],[12.642382812500017,66.008544921875],[12.7470703125,66.011376953125],[12.77880859375,65.99169921875],[12.718652343750023,65.9638671875],[12.509570312500017,65.901953125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[12.419921875,66.04326171875],[12.327343750000011,66.03662109375],[12.3427734375,66.08076171875],[12.417675781250011,66.12265625],[12.446386718750006,66.151318359375],[12.461328125000023,66.185009765625],[12.527441406250006,66.210546875],[12.620800781250011,66.1779296875],[12.62265625,66.1224609375],[12.576367187500011,66.071923828125],[12.419921875,66.04326171875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[19.767480468750023,70.21669921875],[19.818359375,70.20498046875],[19.86865234375,70.212255859375],[19.910449218750017,70.201904296875],[19.994140625,70.149267578125],[20.084277343750017,70.128564453125],[20.088476562500006,70.10205078125],[20.005957031250006,70.076220703125],[19.897265625000017,70.06845703125],[19.780859375,70.07744140625],[19.746679687500006,70.110498046875],[19.710839843750023,70.16533203125],[19.61347656250001,70.219091796875],[19.599023437500023,70.266162109375],[19.68378906250001,70.273583984375],[19.767480468750023,70.21669921875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[23.440527343750006,70.815771484375],[23.4208984375,70.784423828125],[23.387109375000023,70.75390625],[23.30517578125,70.7216796875],[23.068164062500017,70.594091796875],[22.92890625000001,70.57353515625],[22.884765625,70.553515625],[22.8291015625,70.541552734375],[22.656054687500017,70.559033203125],[22.605371093750023,70.533154296875],[22.557519531250023,70.515869140625],[22.432226562500006,70.5091796875],[22.358691406250017,70.514794921875],[22.16875,70.562109375],[22.055761718750006,70.613330078125],[21.994531250000023,70.65712890625],[22.170019531250006,70.656298828125],[22.23261718750001,70.66689453125],[22.35029296875001,70.657666015625],[22.420996093750006,70.702587890625],[22.570703125000023,70.69716796875],[22.85810546875001,70.72841796875],[22.96357421875001,70.710986328125],[23.2046875,70.815478515625],[23.280175781250023,70.812744140625],[23.395605468750006,70.842578125],[23.440527343750006,70.815771484375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[20.779199218750023,70.08974609375],[20.72529296875001,70.06650390625],[20.642578125,70.05703125],[20.598046875000023,70.071435546875],[20.53466796875,70.080908203125],[20.464257812500023,70.0765625],[20.405078125000017,70.119140625],[20.41171875,70.1548828125],[20.492773437500006,70.2033203125],[20.654882812500006,70.230859375],[20.786035156250023,70.21953125],[20.819433593750006,70.20546875],[20.779199218750023,70.08974609375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[25.586328125000023,71.14208984375],[25.853515625,71.103857421875],[25.94501953125001,71.104638671875],[26.07763671875,71.033154296875],[26.146875,71.039501953125],[26.1337890625,70.99580078125],[25.99970703125001,70.97509765625],[25.791308593750017,70.9625],[25.760156250000023,70.95380859375],[25.58203125,70.960791015625],[25.48203125,71.019580078125],[25.31494140625,71.034130859375],[25.315234375000017,71.052978515625],[25.4234375,71.097412109375],[25.586328125000023,71.14208984375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[23.615332031250006,70.54931640625],[23.63398437500001,70.5025390625],[23.641015625000023,70.46396484375],[23.547753906250023,70.408154296875],[23.332812500000017,70.3349609375],[23.345117187500023,70.315283203125],[23.27070312500001,70.296484375],[23.1591796875,70.2826171875],[23.10029296875001,70.29609375],[23.1083984375,70.358837890625],[23.090625,70.37763671875],[23.005957031250006,70.352783203125],[22.917871093750023,70.38466796875],[22.917773437500017,70.416748046875],[22.941015625,70.444580078125],[23.0224609375,70.4869140625],[23.15839843750001,70.516064453125],[23.248046875,70.505126953125],[23.546679687500017,70.61708984375],[23.578906250000017,70.59365234375],[23.615332031250006,70.54931640625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[24.017578125,70.5673828125],[23.8271484375,70.527490234375],[23.716601562500017,70.561865234375],[23.67011718750001,70.5970703125],[23.66328125000001,70.675244140625],[23.68916015625001,70.722802734375],[23.778417968750006,70.74736328125],[23.836523437500006,70.72939453125],[23.85205078125,70.71435546875],[23.956445312500023,70.699609375],[24.07832031250001,70.6505859375],[24.017578125,70.5673828125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[13.872851562500017,68.26533203125],[13.932324218750011,68.2482421875],[14.087695312500017,68.25322265625],[14.118847656250011,68.246826171875],[14.096777343750006,68.218603515625],[14.029296875,68.187548828125],[13.8876953125,68.168505859375],[13.824023437500017,68.12109375],[13.778417968750006,68.10498046875],[13.656152343750023,68.10478515625],[13.583984375,68.09384765625],[13.495214843750006,68.05166015625],[13.424218750000023,68.082763671875],[13.404394531250006,68.060693359375],[13.391503906250023,68.021240234375],[13.35205078125,68.00966796875],[13.229394531250023,67.995361328125],[13.199511718750017,68.087255859375],[13.255957031250006,68.12060546875],[13.300195312500023,68.16044921875],[13.367968750000017,68.166552734375],[13.4287109375,68.163232421875],[13.537988281250023,68.2490234375],[13.687695312500011,68.273388671875],[13.784082031250023,68.276123046875],[13.872851562500017,68.26533203125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[12.971777343750006,67.87412109375],[12.824023437500017,67.821240234375],[12.8779296875,67.9177734375],[12.957714843750011,68.015478515625],[13.068066406250011,68.071337890625],[13.122851562500017,68.0494140625],[13.097753906250006,68.002685546875],[13.098242187500006,67.9564453125],[13.074609375000023,67.9345703125],[12.971777343750006,67.87412109375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[17.503027343750006,69.596240234375],[17.62324218750001,69.5390625],[17.67734375,69.55654296875],[17.78369140625,69.563037109375],[17.86279296875,69.54296875],[17.92744140625001,69.506640625],[18.00410156250001,69.50498046875],[18.05224609375,69.45751953125],[18.076757812500006,69.395751953125],[18.02109375,69.349609375],[17.94208984375001,69.3287109375],[17.920703125000017,69.27431640625],[17.95068359375,69.19814453125],[17.773535156250006,69.172021484375],[17.568164062500017,69.160400390625],[17.487890625,69.196826171875],[17.323632812500023,69.130029296875],[17.160937500000017,69.025927734375],[17.08251953125,69.013671875],[17.077050781250023,69.046630859375],[16.96015625000001,69.069384765625],[16.810449218750023,69.070703125],[16.8154296875,69.0951171875],[16.842578125000017,69.112353515625],[16.971777343750006,69.137890625],[16.99755859375,69.190625],[16.97412109375,69.284716796875],[16.996875,69.33037109375],[17.001757812500017,69.3619140625],[17.0830078125,69.398828125],[17.36083984375,69.381494140625],[17.39453125,69.41669921875],[17.373437500000023,69.4388671875],[17.229882812500023,69.477685546875],[17.251953125,69.50380859375],[17.355566406250006,69.5271484375],[17.45361328125,69.53017578125],[17.48310546875001,69.569677734375],[17.488183593750023,69.586865234375],[17.503027343750006,69.596240234375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[19.25507812500001,70.06640625],[19.34375,70.011962890625],[19.422265625000023,70.0171875],[19.445898437500006,70.037744140625],[19.49951171875,70.047900390625],[19.607812500000023,70.019140625],[19.59228515625,69.970166015625],[19.4423828125,69.9083984375],[19.334765625000017,69.820263671875],[19.197070312500017,69.7998046875],[19.130859375,69.81044921875],[19.0078125,69.7595703125],[18.9091796875,69.706689453125],[18.806933593750017,69.63984375],[18.800683593750023,69.60537109375],[18.784765625,69.57900390625],[18.410253906250006,69.55283203125],[18.27412109375001,69.535498046875],[18.1298828125,69.557861328125],[18.0615234375,69.602099609375],[18.08349609375,69.626123046875],[18.227441406250023,69.6357421875],[18.23203125,69.6767578125],[18.268457031250023,69.701806640625],[18.315039062500006,69.715478515625],[18.34931640625001,69.76787109375],[18.40625,69.78154296875],[18.51240234375001,69.76865234375],[18.583984375,69.806591796875],[18.624316406250017,69.813037109375],[18.67402343750001,69.781640625],[18.69794921875001,69.824853515625],[18.67402343750001,69.864306640625],[18.6865234375,69.89091796875],[18.823828125,69.960107421875],[18.883203125000023,70.010546875],[18.968652343750023,70.043017578125],[19.05097656250001,70.037841796875],[19.07490234375001,70.085693359375],[19.05097656250001,70.13466796875],[19.06005859375,70.1666015625],[19.132714843750023,70.244140625],[19.212695312500017,70.2474609375],[19.249414062500023,70.178564453125],[19.25507812500001,70.06640625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[15.760351562500006,68.56123046875],[15.772363281250023,68.55419921875],[15.908593750000023,68.65048828125],[16.0595703125,68.680517578125],[16.068945312500006,68.714013671875],[16.12744140625,68.746435546875],[16.12080078125001,68.799365234375],[16.15058593750001,68.8423828125],[16.2275390625,68.853759765625],[16.27558593750001,68.868310546875],[16.328906250000017,68.876318359375],[16.425195312500023,68.841552734375],[16.47968750000001,68.8029296875],[16.54736328125,68.716552734375],[16.51923828125001,68.6330078125],[16.337988281250006,68.56787109375],[16.193945312500006,68.5384765625],[16.0484375,68.463671875],[15.975292968750011,68.402490234375],[15.9125,68.3892578125],[15.872753906250011,68.39423828125],[15.83740234375,68.409033203125],[15.763671875,68.40908203125],[15.682519531250023,68.356005859375],[15.4375,68.312841796875],[15.34140625,68.32529296875],[15.337011718750006,68.37822265625],[15.279687500000023,68.373828125],[15.187890625000023,68.310400390625],[15.098046875000023,68.289208984375],[15.037695312500006,68.28271484375],[14.926855468750006,68.306591796875],[14.62890625,68.198486328125],[14.349511718750023,68.178271484375],[14.257519531250011,68.190771484375],[14.257226562500023,68.25693359375],[14.437792968750017,68.341552734375],[14.585839843750023,68.400341796875],[15.0953125,68.44140625],[15.41259765625,68.6158203125],[15.4892578125,68.805322265625],[15.564257812500017,68.87373046875],[15.529003906250011,68.91240234375],[15.443652343750017,68.919189453125],[15.4384765625,68.978564453125],[15.483007812500006,69.04345703125],[15.649511718750006,69.132568359375],[15.741992187500017,69.1705078125],[15.892675781250006,69.277880859375],[15.96533203125,69.30205078125],[16.04804687500001,69.30205078125],[16.129492187500006,69.27392578125],[16.11484375,69.21640625],[15.99267578125,69.112646484375],[15.811718750000011,69.02421875],[15.833789062500017,68.9607421875],[15.905859375,68.90849609375],[15.923535156250011,68.819189453125],[15.927929687500011,68.733203125],[15.790722656250011,68.617041015625],[15.760351562500006,68.56123046875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[15.207128906250006,68.943115234375],[15.337207031250017,68.842431640625],[15.396582031250006,68.78359375],[15.348437500000017,68.672412109375],[15.222070312500023,68.61630859375],[15.027050781250011,68.60634765625],[14.890234375,68.610986328125],[14.804003906250017,68.63798828125],[14.793261718750017,68.66826171875],[14.743457031250017,68.677197265625],[14.612109375000017,68.638330078125],[14.520800781250017,68.633056640625],[14.404687500000023,68.663232421875],[14.373437500000023,68.71142578125],[14.496679687500006,68.771875],[14.5537109375,68.81884765625],[14.6904296875,68.814697265625],[14.724609375,68.80009765625],[14.801855468750006,68.790966796875],[14.848828125000011,68.84755859375],[14.837988281250006,68.886669921875],[14.872363281250017,68.9138671875],[15.0375,68.894287109375],[15.037792968750011,69.000537109375],[15.101855468750017,69.0080078125],[15.128125,69.003955078125],[15.175585937500017,68.98154296875],[15.207128906250006,68.943115234375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[11.2314453125,64.865869140625],[11.179003906250017,64.838037109375],[11.0625,64.860400390625],[10.83251953125,64.843115234375],[10.73984375,64.8703125],[10.8134765625,64.9232421875],[11.02099609375,64.9787109375],[11.132617187500017,64.976171875],[11.246191406250006,64.90791015625],[11.2314453125,64.865869140625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[5.085839843750023,60.307568359375],[5.089062500000011,60.18876953125],[4.996972656250023,60.19775390625],[4.95556640625,60.243310546874994],[4.943554687500011,60.272412109375],[4.95078125,60.341162109375],[4.930078125000023,60.412060546875],[4.957226562500011,60.447265625],[4.990625,60.452050781249994],[5.050195312500023,60.38896484375],[5.085839843750023,60.307568359375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[11.967968750000011,65.626513671875],[11.90185546875,65.595703125],[11.7783203125,65.604541015625],[11.76513671875,65.63095703125],[11.800390625,65.68388671875],[11.875390625000023,65.705908203125],[11.972363281250011,65.7015625],[12.003222656250017,65.679443359375],[11.967968750000011,65.626513671875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-79.06308593749999,75.92587890625],[-79.0517578125,75.8669921875],[-79.1244140625,75.869677734375],[-79.3556640625,75.83115234375],[-79.54453125,75.825634765625],[-79.63876953124999,75.842919921875],[-79.69873046875,75.883251953125],[-79.55126953125,75.958349609375],[-79.381787109375,76.01083984375],[-79.17832031249999,76.0923828125],[-79.00932617187499,76.1458984375],[-78.92587890624999,76.13466796875],[-78.845166015625,76.106298828125],[-78.946435546875,76.025439453125],[-79.056640625,75.98515625],[-79.06308593749999,75.92587890625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-71.66733398437499,77.32529296875],[-72.02353515624999,77.316455078125],[-72.3744140625,77.355419921875],[-72.49492187499999,77.385546875],[-72.48955078124999,77.431640625],[-72.43642578125,77.44755859375],[-72.24677734375,77.463525390625],[-72.0890625,77.46708984375],[-71.98276367187499,77.4599609375],[-71.73291015625,77.431640625],[-71.5521484375,77.403271484375],[-71.43344726562499,77.394384765625],[-71.46708984374999,77.353662109375],[-71.66733398437499,77.32529296875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-44.86455078124999,82.083642578125],[-45.06743164062499,82.066015625],[-45.49077148437499,82.171826171875],[-46.161035156249994,82.277685546875],[-46.75190429687498,82.348193359375],[-47.307519531249994,82.5333984375],[-47.351220703124994,82.59921875],[-47.27226562499999,82.65693359375],[-46.787207031250006,82.66572265625],[-46.399169921875,82.692138671875],[-45.411376953125,82.5775390625],[-44.91748046875,82.480517578125],[-44.749902343749994,82.401123046875],[-44.7763671875,82.2423828125],[-44.86455078124999,82.083642578125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-18.664746093749983,81.846484375],[-18.767675781249977,81.814306640625],[-19.031445312499983,81.827197265625],[-19.369287109374994,81.91728515625],[-19.594482421875,81.991259765625],[-19.610546874999983,82.078125],[-19.494726562499977,82.11669921875],[-19.314550781249977,82.123193359375],[-19.06689453125,82.049169921875],[-18.812695312499983,81.949462890625],[-18.664746093749983,81.846484375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-17.6125,79.82587890625],[-18.035839843749983,79.71123046875],[-18.662011718749994,79.72001953125],[-19.032421874999983,79.77294921875],[-19.138281249999977,79.85234375],[-18.997167968749977,79.940478515625],[-18.54736328125,80.011083984375],[-17.98291015625,80.05517578125],[-17.471386718749983,80.0287109375],[-17.400830078124983,79.940478515625],[-17.6125,79.82587890625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-18.997167968749977,77.973779296875],[-19.129492187499977,77.938525390625],[-19.217626953124977,78.0443359375],[-19.297021484374994,78.18544921875],[-19.314697265625,78.344189453125],[-19.11181640625,78.423583984375],[-19.005957031249977,78.4412109375],[-18.935400390624977,78.423583984375],[-18.953027343749994,78.352978515625],[-18.953027343749994,78.2119140625],[-18.882470703124994,78.114892578125],[-18.997167968749977,77.973779296875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-18.582617187499977,76.042333984375],[-18.697265625,76.015869140625],[-19.085351562499994,76.43037109375],[-19.085351562499994,76.5802734375],[-19.05888671874999,76.694970703125],[-18.882470703124994,76.70380859375],[-18.732617187499983,76.642041015625],[-18.662011718749994,76.40390625],[-18.582617187499977,76.042333984375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-18.00053710937499,75.40732421875],[-17.92119140624999,75.301513671875],[-17.885888671874994,75.204443359375],[-17.762402343749983,75.1427734375],[-17.49785156249999,75.151513671875],[-17.391992187499994,75.0369140625],[-17.586035156249977,74.9927734375],[-18.35332031249999,75.01044921875],[-18.670800781249994,75.00166015625],[-18.891308593749983,75.07216796875],[-18.882470703124994,75.195654296875],[-18.856054687499977,75.319140625],[-18.63554687499999,75.3896484375],[-18.450341796874994,75.327978515625],[-18.229882812499994,75.3720703125],[-18.00053710937499,75.40732421875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-17.953710937499977,77.642333984375],[-18.14799804687499,77.642333984375],[-18.22001953124999,77.668359375],[-18.174023437499983,77.71435546875],[-17.903710937499994,77.86259765625],[-17.813574218749977,77.874609375],[-17.68144531249999,77.85859375],[-17.641357421875,77.782470703125],[-17.7294921875,77.706396484375],[-17.953710937499977,77.642333984375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-29.952880859375,83.56484375],[-28.99199218749999,83.50478515625],[-28.483789062499994,83.434912109375],[-28.377050781250006,83.43720703125],[-27.688378906249994,83.410400390625],[-27.034423828125,83.376904296875],[-25.947412109374994,83.2896484375],[-25.795068359374994,83.260986328125],[-25.912451171874977,83.2375],[-26.182714843749977,83.22138671875],[-27.571875,83.192626953125],[-30.091992187499983,83.157421875],[-31.53398437499999,83.088916015625],[-31.99267578125,83.0853515625],[-32.03271484375,82.983447265625],[-31.836767578125006,82.977880859375],[-31.515576171874983,82.991650390625],[-30.38603515624999,83.093701171875],[-29.963574218749983,83.110498046875],[-29.175,83.102001953125],[-28.151464843750006,83.063720703125],[-27.738525390625,83.077197265625],[-27.002050781250006,83.0671875],[-26.140820312499983,83.096435546875],[-25.123388671874977,83.159619140625],[-24.845166015624983,83.0185546875],[-24.470312499999977,82.877392578125],[-24.17363281249999,82.893017578125],[-23.919531249999977,82.885107421875],[-23.83354492187499,82.83876953125],[-23.69462890624999,82.819140625],[-23.406933593749983,82.8296875],[-22.52490234375,82.78916015625],[-21.919677734375,82.71640625],[-21.691796875,82.68251953125],[-21.58251953125,82.6341796875],[-21.520654296874994,82.59541015625],[-21.61577148437499,82.547705078125],[-21.99394531249999,82.46279296875],[-22.472558593749994,82.384716796875],[-23.118066406249994,82.32470703125],[-23.862207031249994,82.287060546875],[-29.57939453124999,82.161181640625],[-29.77275390624999,82.13125],[-29.887402343749983,82.054833984375],[-29.810986328124983,81.95546875],[-29.543847656249994,81.93994140625],[-28.91943359375,81.9958984375],[-27.839501953124994,82.048876953125],[-27.04594726562499,82.046337890625],[-25.148828125,82.001123046875],[-24.58916015624999,81.8828125],[-24.293066406249977,81.7009765625],[-23.63652343749999,81.741845703125],[-23.49614257812499,81.773046875],[-23.39296875,81.827197265625],[-23.310546875,81.885302734375],[-23.248779296875,81.947265625],[-23.179833984374994,81.989453125],[-23.103710937499983,82.01181640625],[-22.940087890624994,82.030517578125],[-22.563378906249994,82.05302734375],[-21.575537109374977,82.074951171875],[-21.337988281249977,82.068701171875],[-21.167382812499994,81.983837890625],[-21.130322265624983,81.934228515625],[-21.11796874999999,81.86962890625],[-21.1234375,81.78994140625],[-21.146582031249977,81.695166015625],[-21.23051757812499,81.6013671875],[-21.50390625,81.4375],[-21.7236328125,81.3482421875],[-21.96074218749999,81.283935546875],[-22.415283203125,81.137109375],[-22.57275390625,81.097900390625],[-23.072460937499983,80.926708984375],[-23.196386718749977,80.84736328125],[-23.20366210937499,80.7892578125],[-23.11772460937499,80.778173828125],[-22.972851562499983,80.8328125],[-22.9189453125,80.871826171875],[-22.82568359375,80.912646484375],[-22.08940429687499,81.02021484375],[-21.931347656249983,81.0501953125],[-21.44975585937499,81.178173828125],[-21.142431640624977,81.226171875],[-20.889746093749977,81.2763671875],[-20.755859375,81.31201171875],[-20.015722656249977,81.56435546875],[-19.62993164062499,81.639892578125],[-19.224755859374994,81.6400390625],[-19.152978515624994,81.51220703125],[-18.667382812499994,81.492431640625],[-18.45654296875,81.49794921875],[-18.117871093749983,81.466845703125],[-17.969384765624994,81.441162109375],[-17.716650390624977,81.428173828125],[-17.4560546875,81.397705078125],[-17.226220703124994,81.430419921875],[-17.159033203124977,81.450927734375],[-16.93706054687499,81.543896484375],[-16.637109375,81.626220703125],[-16.358984374999977,81.729052734375],[-16.266796874999983,81.753955078125],[-16.120703124999977,81.776611328125],[-15.968896484374994,81.785498046875],[-15.555517578124977,81.83359375],[-15.450634765624983,81.836962890625],[-15.227490234374983,81.82177734375],[-14.241992187499989,81.8138671875],[-13.704492187499994,81.7890625],[-12.956005859374983,81.72021484375],[-12.434423828124977,81.68251953125],[-12.19287109375,81.64912109375],[-11.841113281249989,81.5775390625],[-11.557470703124977,81.50263671875],[-11.425537109375,81.480615234375],[-11.4306640625,81.4568359375],[-11.52880859375,81.4240234375],[-12.231347656249994,81.309228515625],[-12.461230468749989,81.23251953125],[-13.126220703125,81.08779296875],[-13.451171875,81.0380859375],[-13.804296874999977,81.018603515625],[-14.197363281249977,81.013916015625],[-14.452343749999983,80.993115234375],[-14.490136718749994,80.973291015625],[-14.308496093749994,80.913232421875],[-14.228564453124989,80.870458984375],[-14.240185546874983,80.832421875],[-14.43125,80.77607421875],[-14.503564453124994,80.76328125],[-15.194238281249994,80.721435546875],[-15.542675781249983,80.650390625],[-15.997509765624983,80.64169921875],[-16.318945312499977,80.6498046875],[-16.760595703124977,80.573388671875],[-16.587792968749994,80.51123046875],[-16.429443359375,80.484228515625],[-15.937255859375,80.42763671875],[-15.9326171875,80.3951171875],[-16.16777343749999,80.32939453125],[-16.48876953125,80.251953125],[-16.868408203125,80.1982421875],[-17.011132812499994,80.190185546875],[-17.191162109375,80.203662109375],[-17.35722656249999,80.20078125],[-17.722851562499983,80.176025390625],[-18.070947265624994,80.1720703125],[-18.692578124999983,80.207080078125],[-19.029003906249983,80.247607421875],[-19.206005859374983,80.26162109375],[-19.42919921875,80.25771484375],[-19.515039062499994,80.24140625],[-19.866796874999977,80.1447265625],[-20.039501953124983,80.0787109375],[-20.150146484375,80.01123046875],[-20.197412109374994,79.937646484375],[-20.181347656249983,79.857958984375],[-20.13847656249999,79.803369140625],[-20.06884765625,79.773779296875],[-19.98540039062499,79.755859375],[-19.839306640624983,79.746484375],[-19.51787109374999,79.75537109375],[-19.391503906249994,79.750341796875],[-19.35302734375,79.7341796875],[-19.28359375,79.683154296875],[-19.295996093749977,79.635009765625],[-19.354199218749983,79.567333984375],[-19.399316406249994,79.48837890625],[-19.43120117187499,79.39814453125],[-19.414013671874983,79.348828125],[-19.28398437499999,79.338037109375],[-19.22294921874999,79.3416015625],[-19.152197265624977,79.325390625],[-19.07177734375,79.289453125],[-19.011328124999977,79.25146484375],[-18.970800781249977,79.211376953125],[-18.99199218749999,79.178369140625],[-19.074951171875,79.15234375],[-19.26220703125,79.122998046875],[-19.723046875,79.0650390625],[-19.76982421874999,79.04736328125],[-19.806054687499994,79.012109375],[-19.83159179687499,78.959130859375],[-19.88720703125,78.9109375],[-19.972900390625,78.867626953125],[-20.050488281249983,78.841796875],[-20.199902343749983,78.830322265625],[-20.395703124999983,78.82880859375],[-20.615576171874977,78.80390625],[-21.133740234374983,78.658642578125],[-21.141455078124977,78.642529296875],[-20.947460937499983,78.5958984375],[-20.955664062499977,78.555029296875],[-21.194775390624983,78.379833984375],[-21.260205078124983,78.293017578125],[-21.31201171875,78.173974609375],[-21.39726562499999,78.073583984375],[-21.515966796874977,77.991845703125],[-21.632666015624977,77.8974609375],[-21.74755859375,77.790625],[-21.729589843749977,77.708544921875],[-21.57890624999999,77.6513671875],[-21.37968749999999,77.69755859375],[-21.13188476562499,77.847216796875],[-20.86259765624999,77.911865234375],[-20.57182617187499,77.891552734375],[-20.318603515625,77.861962890625],[-19.9951171875,77.80341796875],[-19.724316406249983,77.766943359375],[-19.490429687499983,77.718896484375],[-19.393994140624983,77.678369140625],[-19.296875,77.6212890625],[-19.296093749999983,77.58525390625],[-19.467529296875,77.5658203125],[-19.524121093749983,77.57197265625],[-19.953222656249977,77.666357421875],[-20.162060546874983,77.68984375],[-20.439208984375,77.66162109375],[-20.680810546874994,77.618994140625],[-20.463769531249994,77.447314453125],[-20.23193359375,77.368408203125],[-19.80864257812499,77.332373046875],[-19.587597656249983,77.29443359375],[-19.426416015624994,77.24599609375],[-19.30029296875,77.22236328125],[-19.131005859374994,77.232763671875],[-18.903417968749977,77.28046875],[-18.585888671874983,77.283056640625],[-18.442626953125,77.259375],[-18.339013671874994,77.215283203125],[-18.292382812499994,77.132861328125],[-18.302734375,77.012109375],[-18.337255859374977,76.92119140625],[-18.39604492187499,76.86005859375],[-18.51030273437499,76.778173828125],[-18.60576171874999,76.76328125],[-18.74028320312499,76.767724609375],[-18.865332031249977,76.784521484375],[-18.98100585937499,76.81376953125],[-19.156347656249977,76.836572265625],[-19.5087890625,76.861083984375],[-19.864941406249983,76.914404296875],[-20.064355468749994,76.927587890625],[-20.48671875,76.92080078125],[-20.942089843749983,76.88701171875],[-20.959912109374983,76.84267578125],[-21.614697265624983,76.687890625],[-21.7490234375,76.689990234375],[-21.930810546874994,76.7431640625],[-22.185253906249983,76.794091796875],[-22.334326171874977,76.793701171875],[-22.554541015624977,76.729248046875],[-22.609326171874983,76.704296875],[-22.606640624999983,76.68076171875],[-22.444433593749977,76.625048828125],[-22.378613281249983,76.61220703125],[-22.294873046874983,76.60146484375],[-22.00371093749999,76.5880859375],[-21.87734375,76.573486328125],[-21.75810546874999,76.400537109375],[-21.569091796875,76.293701171875],[-21.488232421874983,76.271875],[-21.416845703124977,76.264013671875],[-21.185449218749994,76.26796875],[-20.887402343749983,76.30400390625],[-20.783300781249977,76.275146484375],[-20.563818359374977,76.23984375],[-20.435400390624977,76.2310546875],[-20.279296875,76.232470703125],[-20.103613281249977,76.219091796875],[-19.862890624999977,76.120654296875],[-19.957714843749983,75.9966796875],[-19.806884765625,75.89736328125],[-19.566015624999977,75.794970703125],[-19.508984374999983,75.75751953125],[-19.485693359374977,75.689599609375],[-19.48027343749999,75.644775390625],[-19.462158203125,75.603857421875],[-19.43144531249999,75.56689453125],[-19.399511718749977,75.49443359375],[-19.366455078125,75.38642578125],[-19.37529296874999,75.298193359375],[-19.425976562499983,75.229833984375],[-19.5263671875,75.180224609375],[-19.67626953125,75.149365234375],[-19.798486328124994,75.157470703125],[-19.893164062499977,75.204541015625],[-20.026562499999983,75.2546875],[-20.198681640624983,75.307958984375],[-20.484960937499977,75.3142578125],[-20.905859374999977,75.15693359375],[-21.093847656249977,75.149072265625],[-21.246533203124983,75.1333984375],[-21.409423828125,75.064794921875],[-21.649316406249994,75.0234375],[-21.861035156249983,75.03984375],[-22.232861328124983,75.1197265625],[-22.097753906249977,75.066357421875],[-21.90434570312499,75.00390625],[-21.783935546875,74.971484375],[-21.69511718749999,74.964453125],[-21.59765625,74.97197265625],[-21.45732421874999,74.99755859375],[-21.140576171874983,75.0685546875],[-21.05668945312499,75.07939453125],[-20.985791015624983,75.074365234375],[-20.92778320312499,75.05341796875],[-20.861083984375,74.992578125],[-20.78569335937499,74.891748046875],[-20.7953125,74.80595703125],[-20.889990234374977,74.735205078125],[-20.97099609374999,74.68984375],[-21.038281249999983,74.669873046875],[-21.038476562499994,74.654150390625],[-20.861572265625,74.6359375],[-20.61113281249999,74.72822265625],[-20.53173828125,74.842919921875],[-20.417089843749977,74.9751953125],[-20.214257812499994,75.01923828125],[-19.98491210937499,74.9751953125],[-19.799707031249994,74.851708984375],[-19.537792968749983,74.624560546875],[-19.427343749999977,74.600927734375],[-19.287011718749994,74.54638671875],[-19.22509765625,74.4794921875],[-19.241650390624983,74.4001953125],[-19.271582031249977,74.342626953125],[-19.31494140625,74.306787109375],[-19.369140625,74.284033203125],[-19.466748046874983,74.269482421875],[-19.646240234375,74.257958984375],[-20.047558593749983,74.282275390625],[-20.256445312499977,74.2828125],[-20.230566406249977,74.204638671875],[-20.65312,74.137353515625],[-21.12944335937499,74.110888671875],[-21.58056640625,74.1634765625],[-21.954931640624977,74.244287109375],[-21.83203125,74.357275390625],[-21.761962890625,74.482763671875],[-21.94291992187499,74.56572265625],[-21.982617187499983,74.56748046875],[-21.920166015625,74.439208984375],[-21.97270507812499,74.3900390625],[-22.177197265624983,74.33017578125],[-22.32158203124999,74.3025390625],[-22.334326171874977,74.286376953125],[-22.263525390624977,74.272412109375],[-22.21733398437499,74.2455078125],[-22.195654296874977,74.205712890625],[-22.22001953124999,74.16552734375],[-22.29057617187499,74.125],[-22.328955078124977,74.090966796875],[-22.33525390624999,74.063427734375],[-22.27055664062499,74.0298828125],[-22.13481445312499,73.990478515625],[-21.987695312499994,73.97099609375],[-21.298291015624983,73.962451171875],[-21.022216796875,73.941259765625],[-20.367285156249977,73.8482421875],[-20.337988281249977,73.819677734375],[-20.448925781249983,73.65302734375],[-20.509667968749994,73.49287109375],[-20.63671875,73.46357421875],[-21.325878906249983,73.456640625],[-21.547998046874994,73.431689453125],[-21.87285156249999,73.35810546875],[-22.18505859375,73.269873046875],[-22.34687,73.26923828125],[-22.9875,73.346240234375],[-23.23320312499999,73.397705078125],[-23.760595703124977,73.543115234375],[-24.15771484375,73.764453125],[-24.33989257812499,73.672412109375],[-24.451269531249977,73.628515625],[-24.566308593749994,73.60576171875],[-24.67724609375,73.602197265625],[-24.7841796875,73.617919921875],[-24.905468749999983,73.652783203125],[-25.108837890624983,73.73369140625],[-25.351464843749994,73.813623046875],[-25.52128906249999,73.851611328125],[-25.527734375,73.8408203125],[-25.427441406249983,73.793798828125],[-25.280517578125,73.739599609375],[-24.908886718749983,73.58017578125],[-24.7783203125,73.539892578125],[-24.791259765625,73.511279296875],[-25.02587890625,73.485791015625],[-25.310742187499983,73.431005859375],[-25.450097656249994,73.390673828125],[-25.665429687499994,73.292822265625],[-25.740185546874983,73.27763671875],[-26.06230468749999,73.25302734375],[-26.168554687499977,73.259033203125],[-26.40673828125,73.312939453125],[-26.765478515625006,73.348193359375],[-26.976708984374994,73.379541015625],[-27.270410156249994,73.436279296875],[-27.169384765624983,73.374169921875],[-26.603613281250006,73.2794921875],[-26.541845703125006,73.248974609375],[-26.657617187499994,73.192138671875],[-26.728613281250006,73.17138671875],[-26.86333007812499,73.1669921875],[-27.061865234375006,73.17890625],[-27.264892578125,73.17646484375],[-27.472363281249983,73.159814453125],[-27.561621093750006,73.1384765625],[-27.532568359375006,73.112548828125],[-27.483154296875,73.088916015625],[-27.413330078125,73.067626953125],[-27.348046875,73.067822265625],[-27.189892578124983,73.132421875],[-27.070019531249983,73.13701171875],[-26.75322265624999,73.12109375],[-26.432861328125,73.171484375],[-26.202001953124977,73.193212890625],[-26.028759765624983,73.198779296875],[-25.399023437499977,73.27578125],[-25.268310546875,73.361962890625],[-25.05703125,73.396484375],[-24.58720703124999,73.42294921875],[-24.132666015624977,73.409375],[-23.89897460937499,73.398291015625],[-23.709619140624994,73.316796875],[-23.455761718749983,73.25908203125],[-23.244091796874983,73.19326171875],[-22.996044921874983,73.17158203125],[-22.852294921875,73.083984375],[-22.4501953125,72.986083984375],[-22.194238281249994,72.9650390625],[-22.036328124999983,72.91845703125],[-22.02348632812499,72.72080078125],[-22.006738281249994,72.63544921875],[-22.074804687499977,72.39921875],[-22.280224609374983,72.344775390625],[-22.2392578125,72.220263671875],[-22.293212890625,72.11953125],[-22.497509765624983,72.157763671875],[-22.70683593749999,72.22392578125],[-23.2080078125,72.3265625],[-23.67436523437499,72.392578125],[-23.855566406249977,72.45244140625],[-24.069042968749983,72.49873046875],[-24.358593749999983,72.6873046875],[-24.547216796874977,72.921728515625],[-24.629980468749977,73.037646484375],[-24.78857421875,73.044140625],[-24.99248046874999,73.0130859375],[-25.170556640624994,72.9802734375],[-25.255859375,72.92412109375],[-25.86083984375,72.846875],[-26.08046875,72.793994140625],[-26.205761718749983,72.795556640625],[-26.657617187499994,72.7158203125],[-26.4765625,72.67763671875],[-26.39208984375,72.672802734375],[-26.20947265625,72.694384765625],[-26.099804687499983,72.721923828125],[-25.68798828125,72.79736328125],[-25.357421875,72.81025390625],[-25.2375,72.8427734375],[-24.984814453124983,72.889208984375],[-24.813330078124977,72.901513671875],[-24.789453125,72.88974609375],[-24.77104492187499,72.86865234375],[-24.65,72.58251953125],[-24.70068359375,72.50634765625],[-24.8369140625,72.47333984375],[-25.128027343749977,72.419189453125],[-25.203710937499977,72.39296875],[-25.117871093749983,72.34697265625],[-24.844189453124983,72.39033203125],[-24.666845703124977,72.437353515625],[-24.572363281249977,72.42021484375],[-24.417187499999983,72.3482421875],[-24.242285156249977,72.311328125],[-23.797705078124977,72.200732421875],[-23.587109374999983,72.139794921875],[-23.290917968749994,72.081005859375],[-22.955761718749983,71.9994140625],[-22.868505859374977,71.970654296875],[-22.562158203124994,71.928271484375],[-22.49687,71.913818359375],[-22.370214843749977,71.76982421875],[-22.264501953124977,71.75380859375],[-21.959667968749983,71.744677734375],[-22.013330078124994,71.688818359375],[-22.31103515625,71.56455078125],[-22.464990234374994,71.52490234375],[-22.50322265624999,71.500439453125],[-22.48857421874999,71.456689453125],[-22.479638671874994,71.383447265625],[-22.417578124999977,71.248681640625],[-22.347753906249977,71.373486328125],[-22.299023437499983,71.43232421875],[-22.233789062499994,71.449951171875],[-22.169580078124994,71.4525390625],[-21.96142578125,71.508203125],[-21.75224609374999,71.4783203125],[-21.697949218749983,71.337451171875],[-21.67119140624999,71.20595703125],[-21.689648437499983,71.0923828125],[-21.666601562499977,70.915869140625],[-21.674511718749983,70.856298828125],[-21.625146484374994,70.804638671875],[-21.573925781249983,70.590478515625],[-21.522656249999983,70.526220703125],[-21.62553710937499,70.4685546875],[-21.943505859374994,70.44345703125],[-22.069287109374983,70.471875],[-22.384130859374977,70.46240234375],[-22.384521484375,70.513134765625],[-22.399853515624983,70.5712890625],[-22.401123046875,70.6119140625],[-22.422119140625,70.648681640625],[-22.43701171875,70.860009765625],[-22.526074218749983,70.8078125],[-22.531347656249977,70.764990234375],[-22.555029296874977,70.721435546875],[-22.60966796874999,70.493310546875],[-22.690673828125,70.4373046875],[-22.942578124999983,70.45078125],[-23.19062,70.44248046875],[-23.327832031249983,70.4509765625],[-23.79179687499999,70.55517578125],[-23.971386718749983,70.649462890625],[-24.13037109375,70.791064453125],[-24.228515625,70.923388671875],[-24.265722656249977,71.046337890625],[-24.37700195312499,71.14638671875],[-24.562207031249983,71.22353515625],[-24.781005859375,71.286083984375],[-25.033398437499983,71.333935546875],[-25.254980468749977,71.395703125],[-25.44580078125,71.471240234375],[-25.655859374999977,71.530029296875],[-25.88515625,71.571923828125],[-26.21142578125,71.58994140625],[-26.68852539062499,71.583349609375],[-27.010644531249994,71.63056640625],[-27.08720703124999,71.6265625],[-27.162304687499983,71.602197265625],[-27.10703125,71.532666015625],[-26.737207031249994,71.50078125],[-26.452001953125006,71.493505859375],[-26.074072265624977,71.498046875],[-25.842724609374983,71.48017578125],[-25.7578125,71.43994140625],[-25.699414062499983,71.368310546875],[-25.667578124999977,71.26533203125],[-25.74223632812499,71.18359375],[-26.014111328124983,71.092822265625],[-26.15751953124999,71.05029296875],[-26.57597656249999,70.968701171875],[-26.717919921874994,70.95048828125],[-27.067333984374983,70.944921875],[-27.335693359375,70.952783203125],[-27.68876953124999,70.99345703125],[-27.888916015625,71.001708984375],[-28.303125,71.007177734375],[-28.3984375,70.992919921875],[-28.29155273437499,70.94931640625],[-28.115869140624994,70.924609375],[-27.9921875,70.89521484375],[-27.97929687499999,70.839501953125],[-28.023876953124983,70.756787109375],[-28.06987304687499,70.6990234375],[-28.145654296874994,70.6556640625],[-28.41748046875,70.57353515625],[-28.53007812499999,70.54755859375],[-29.036816406249983,70.4615234375],[-29.07207031249999,70.444970703125],[-28.953466796875006,70.447216796875],[-28.63310546874999,70.477783203125],[-28.540917968749994,70.476904296875],[-28.015039062499994,70.40224609375],[-27.59609375,70.406689453125],[-26.747265624999983,70.475537109375],[-26.677490234375,70.47421875],[-26.621777343749983,70.46337890625],[-26.5654296875,70.437548828125],[-26.508398437500006,70.396630859375],[-26.576806640624994,70.357080078125],[-26.770654296874994,70.318896484375],[-27.072509765625,70.281201171875],[-27.203222656250006,70.255712890625],[-27.328125,70.217138671875],[-27.56083984374999,70.124462890625],[-27.628857421874983,70.02822265625],[-27.384179687499994,69.9916015625],[-27.27421874999999,70.037939453125],[-27.144482421874983,70.1408203125],[-27.027734375,70.201220703125],[-26.752148437499983,70.2421875],[-26.415673828124994,70.221337890625],[-26.155712890624983,70.24560546875],[-25.624853515624977,70.34697265625],[-25.529882812499977,70.353173828125],[-24.74882812499999,70.295068359375],[-24.041015625,70.181201171875],[-23.667333984374977,70.139306640625],[-23.173242187499994,70.114599609375],[-22.28447265624999,70.125830078125],[-22.20659179687499,70.10791015625],[-22.235449218749977,70.067578125],[-22.287060546874983,70.0333984375],[-22.43510742187499,69.9857421875],[-22.614941406249983,69.954248046875],[-22.726220703124994,69.945361328125],[-22.820898437499977,69.9228515625],[-23.033642578124983,69.900830078125],[-23.088232421874977,69.882958984375],[-23.014550781249994,69.804833984375],[-23.049560546875,69.792724609375],[-23.236962890624994,69.791455078125],[-23.55253906249999,69.74052734375],[-23.811621093749977,69.744189453125],[-23.86572265625,69.73671875],[-23.816552734374994,69.717822265625],[-23.764257812499977,69.68134765625],[-23.708984375,69.62724609375],[-23.739404296874994,69.588623046875],[-23.855566406249977,69.565576171875],[-23.94365234374999,69.558056640625],[-24.247509765624983,69.590380859375],[-24.29667968749999,69.585546875],[-24.252294921874977,69.562353515625],[-24.22705078125,69.526953125],[-24.220898437499983,69.479296875],[-24.295556640624994,69.439306640625],[-24.451074218749994,69.407080078125],[-24.740576171874977,69.318408203125],[-24.866601562499994,69.29306640625],[-25.132519531249983,69.272119140625],[-25.188574218749977,69.260546875],[-25.08046875,69.19248046875],[-25.092431640624994,69.165185546875],[-25.272216796875,69.0916015625],[-25.544042968749977,69.045703125],[-25.581152343749977,69.020947265625],[-25.606347656249994,68.954443359375],[-25.626123046874994,68.927978515625],[-25.697998046875,68.889892578125],[-25.95585937499999,68.81728515625],[-26.138623046874983,68.78115234375],[-26.229248046875,68.7515625],[-26.341406249999977,68.7021484375],[-26.48291015625,68.675927734375],[-26.653710937499994,68.6728515625],[-26.815332031249994,68.654345703125],[-27.081152343750006,68.601806640625],[-27.266259765624994,68.584326171875],[-27.851220703124994,68.493505859375],[-28.12646484375,68.47900390625],[-28.36455078124999,68.446533203125],[-28.854345703125006,68.359814453125],[-29.08769531249999,68.33193359375],[-29.24951171875,68.298779296875],[-29.426220703124983,68.289306640625],[-29.713574218749983,68.31083984375],[-29.868505859375006,68.311572265625],[-29.963769531249994,68.29853515625],[-30.051123046875006,68.271923828125],[-30.195507812499983,68.198974609375],[-30.318115234375,68.193310546875],[-30.72001953124999,68.251171875],[-30.711865234374983,68.224951171875],[-30.605664062499983,68.162353515625],[-30.610742187499994,68.117919921875],[-30.849755859374994,68.0728515625],[-30.97856445312499,68.061328125],[-31.16845703125,68.079833984375],[-31.41948242187499,68.128466796875],[-31.74199218749999,68.22998046875],[-32.13725585937499,68.384912109375],[-32.32744140624999,68.4373046875],[-32.31367187499998,68.38759765625],[-32.269628906250006,68.339013671875],[-32.195214843749994,68.291650390625],[-32.18012695312498,68.257275390625],[-32.22421875,68.235986328125],[-32.282373046874994,68.225244140625],[-32.354589843750006,68.22509765625],[-32.366845703124994,68.213037109375],[-32.248925781249994,68.139111328125],[-32.15595703124998,68.06318359375],[-32.16455078125,67.99111328125],[-32.274804687499994,67.9228515625],[-32.36953125,67.882763671875],[-32.44873046875,67.870947265625],[-32.91801757812499,67.70068359375],[-33.048730468749994,67.679248046875],[-33.108154296875,67.658203125],[-33.156982421875,67.626708984375],[-33.293603515624994,67.4857421875],[-33.348876953125,67.442724609375],[-33.45849609375,67.38671875],[-33.50444335937499,67.377001953125],[-33.517578125,67.35419921875],[-33.49775390624998,67.3181640625],[-33.527978515624994,67.258154296875],[-33.60820312499999,67.17421875],[-33.88134765625,66.94228515625],[-34.101660156250006,66.725927734375],[-34.1982421875,66.655078125],[-34.268896484375006,66.625048828125],[-34.313623046874994,66.635791015625],[-34.4228515625,66.63017578125],[-34.47587890624999,66.592138671875],[-34.52392578125,66.52333984375],[-34.576269531250006,66.4708984375],[-34.6328125,66.434765625],[-35.07465820312498,66.279150390625],[-35.188574218750006,66.25029296875],[-35.290869140625006,66.2685546875],[-35.41171875,66.2615234375],[-35.66206054687498,66.34375],[-35.70546875,66.373974609375],[-35.86723632812499,66.44140625],[-35.86186523437499,66.40625],[-35.834716796875,66.386865234375],[-35.812109375,66.3583984375],[-35.755517578124994,66.32353515625],[-35.63007812499998,66.13994140625],[-35.72929687499999,66.10224609375],[-35.81791992187499,66.059228515625],[-36.044189453125,65.98662109375],[-36.288720703124994,65.86484375],[-36.37919921874999,65.830810546875],[-36.39921874999999,65.930078125],[-36.38896484374999,65.959716796875],[-36.527246093749994,66.00771484375],[-36.52275390624999,65.97314453125],[-36.537011718749994,65.940869140625],[-36.63725585937499,65.8123046875],[-36.665185546874994,65.790087890625],[-36.714501953124994,65.795068359375],[-36.822167968749994,65.771337890625],[-36.93242187499999,65.782568359375],[-37.02587890625,65.84111328125],[-37.06279296874999,65.871435546875],[-37.23320312499999,65.7880859375],[-37.316015625,65.790234375],[-37.329833984375,65.720166015625],[-37.410058593749994,65.65634765625],[-37.51606445312498,65.6287109375],[-37.66376953124998,65.630859375],[-37.75419921874999,65.59306640625],[-37.95478515624998,65.63359375],[-38.00126953124999,65.709619140625],[-37.84228515625,65.813818359375],[-37.79736328125,65.856787109375],[-37.826513671875006,65.90966796875],[-37.787841796875,65.977978515625],[-37.484472656250006,66.19462890625],[-37.278710937499994,66.30439453125],[-37.290673828124994,66.32392578125],[-37.569921875,66.3478515625],[-37.81391601562498,66.385498046875],[-38.051660156249994,66.3984375],[-38.156640625,66.385595703125],[-37.989160156249994,66.32265625],[-37.75234375,66.2615234375],[-37.868896484375,66.203125],[-37.96943359374998,66.14111328125],[-38.07343749999998,65.97255859375],[-38.13994140624999,65.903515625],[-38.39814453124998,65.982861328125],[-38.520361328125006,66.00966796875],[-38.44267578124999,65.9216796875],[-38.21635742187499,65.838330078125],[-38.20185546874998,65.810888671875],[-38.203369140625,65.71171875],[-38.63671875,65.624365234375],[-39.088964843750006,65.6111328125],[-39.41337890624999,65.586279296875],[-39.9609375,65.556201171875],[-40.17353515624998,65.55615234375],[-40.191552734374994,65.522509765625],[-39.65595703124998,65.368896484375],[-39.57792968749999,65.340771484375],[-39.65253906249998,65.287841796875],[-39.76318359375,65.254931640625],[-39.937255859375,65.1416015625],[-40.02802734374998,65.1025390625],[-40.25312,65.048876953125],[-40.667578125,65.108740234375],[-40.88056640624998,65.081982421875],[-41.08442382812498,65.100830078125],[-41.08867187499999,65.0353515625],[-41.027734375,64.987548828125],[-40.96601562499998,64.86884765625],[-40.82929687499998,64.878076171875],[-40.65546874999998,64.91533203125],[-40.52109375,64.82548828125],[-40.432714843750006,64.673193359375],[-40.278417968750006,64.595947265625],[-40.209863281249994,64.536279296875],[-40.182226562500006,64.479931640625],[-40.278466796874994,64.423828125],[-40.477636718750006,64.34443359375],[-40.69853515624999,64.329736328125],[-40.686425781249994,64.266943359375],[-40.78173828125,64.22177734375],[-40.98457031249998,64.235009765625],[-41.07939453124999,64.26650390625],[-41.177734375,64.2814453125],[-41.58100585937498,64.29833984375],[-41.175,64.177392578125],[-41.03056640624999,64.121044921875],[-40.96630859375,64.154443359375],[-40.82568359375,64.162548828125],[-40.617773437500006,64.13173828125],[-40.65234375,63.927734375],[-40.561279296875,63.762353515624994],[-40.550390625,63.725244140624994],[-40.77153320312499,63.626171875],[-40.77519531249999,63.533642578125],[-40.906835937500006,63.507861328125],[-41.048730468749994,63.513818359374994],[-41.05615234375,63.412255859374994],[-41.152246093749994,63.34892578125],[-41.13520507812498,63.30927734375],[-41.10771484374999,63.273779296875],[-41.195458984374994,63.209228515625],[-41.27470703124999,63.1306640625],[-41.38789062499998,63.061865234375],[-41.447851562500006,63.0689453125],[-41.6279296875,63.064501953125],[-41.844482421875,63.070263671875],[-42.01972656249998,63.159619140625],[-42.092382812500006,63.189355468749994],[-42.17451171874998,63.2087890625],[-42.14296875,63.151318359375],[-42.093994140625,63.116748046875],[-41.932275390624994,63.05224609375],[-41.63447265624998,62.9724609375],[-41.64360351562499,62.915869140625],[-41.723242187500006,62.891259765624994],[-41.90898437499999,62.737109375],[-41.97490234374999,62.733789062499994],[-42.058251953124994,62.693994140624994],[-42.31562,62.70732421875],[-42.423730468749994,62.72314453125],[-42.741113281249994,62.713037109374994],[-42.84907226562498,62.72666015625],[-42.941650390625,62.72021484375],[-42.85527343749999,62.676708984375],[-42.673681640625006,62.6375],[-42.467138671875006,62.598193359375],[-42.152978515624994,62.56845703125],[-42.16435546874999,62.51220703125],[-42.2431640625,62.466064453125],[-42.19794921874998,62.397119140624994],[-42.23310546874998,62.347705078125],[-42.248144531250006,62.2890625],[-42.32148437499998,62.152734375],[-42.23613281249999,62.0591796875],[-42.14306640625,62.013525390625],[-42.15385742187499,61.95341796875],[-42.110205078125006,61.8572265625],[-42.24970703124998,61.771386718749994],[-42.36542968749998,61.774609375],[-42.530419921874994,61.755322265625],[-42.585302734375006,61.71748046875],[-42.323632812499994,61.68173828125],[-42.34736328124998,61.617431640625],[-42.41875,61.537011718749994],[-42.49375,61.36279296875],[-42.64599609375,61.064111328124994],[-42.717041015625,60.767480468749994],[-43.044091796874994,60.523681640625],[-43.15996093749999,60.516943359375],[-43.1890625,60.507275390625],[-43.34833984374998,60.519775390625],[-43.59833984374998,60.576025390625],[-43.7919921875,60.594580078125],[-43.922705078125006,60.595361328124994],[-43.939550781250006,60.5673828125],[-43.831152343750006,60.52197265625],[-43.66547851562498,60.502978515625],[-43.533056640625006,60.472998046875],[-43.295654296875,60.444970703124994],[-43.212988281250006,60.390673828125],[-43.156494140625,60.332861328125],[-43.16484374999999,60.301025390625],[-43.16533203124999,60.263427734375],[-43.122900390625006,60.06123046875],[-43.23481445312498,59.99130859375],[-43.32011718749999,59.928125],[-43.61689453124998,59.936914062499994],[-43.66850585937499,59.958935546875],[-43.95502929687498,60.02548828125],[-43.937402343749994,59.99423828125],[-43.730126953124994,59.903759765625],[-43.65791015624998,59.858642578125],[-43.706201171874994,59.84931640625],[-43.78984374999999,59.845947265625],[-43.90654296874999,59.815478515625],[-44.11699218749999,59.831933593749994],[-44.10541992187498,59.877734375],[-44.06547851562499,59.9248046875],[-44.16171875,59.916796875],[-44.268945312499994,59.892919921875],[-44.33125,59.901708984375],[-44.38359374999999,59.899072265624994],[-44.412939453125006,59.922607421875],[-44.453466796875006,60.014550781249994],[-44.404931640624994,60.060791015625],[-44.231347656249994,60.1802734375],[-44.176123046875006,60.244384765625],[-44.224365234375,60.27353515625],[-44.34833984374998,60.20478515625],[-44.47636718749999,60.0955078125],[-44.53315429687498,60.0294921875],[-44.61328125,60.016650390625],[-44.81220703124998,60.04990234375],[-45.379248046875006,60.2029296875],[-45.36235351562499,60.295947265625],[-45.367773437500006,60.372949218749994],[-45.202490234375006,60.382714843749994],[-45.082275390625,60.4162109375],[-44.974707031250006,60.4572265625],[-44.853515625,60.53193359375],[-44.742431640625,60.6552734375],[-44.756738281249994,60.664599609375],[-45.08271484374998,60.507177734375],[-45.283300781250006,60.454541015625],[-45.380517578124994,60.444921875],[-45.428857421874994,60.46826171875],[-45.59028320312498,60.51884765625],[-45.695214843749994,60.541845703125],[-45.934326171875,60.579443359375],[-45.97651367187498,60.59970703125],[-46.046630859375,60.61572265625],[-46.141943359375006,60.776513671874994],[-46.018652343750006,60.97177734375],[-45.933740234374994,61.02841796875],[-45.8798828125,61.094140625],[-45.84941406249999,61.18115234375],[-45.870214843750006,61.218310546875],[-45.942285156249994,61.20556640625],[-45.975683593750006,61.17578125],[-45.97041015624998,61.12919921875],[-46.01171875,61.096826171874994],[-46.29667968749999,61.022363281249994],[-46.582421875,60.962060546874994],[-46.7177734375,60.904931640624994],[-46.8056640625,60.860302734375],[-46.87446289062498,60.81640625],[-46.97968749999998,60.820361328125],[-47.124853515625006,60.811328125],[-47.22441406249999,60.782861328124994],[-47.369726562500006,60.800341796875],[-47.46464843749999,60.842626953125],[-47.57905273437498,60.8474609375],[-47.70747070312498,60.827099609375],[-47.796240234375006,60.828857421875],[-47.78886718749999,60.800146484375],[-47.72993164062498,60.7294921875],[-47.82792968749999,60.724755859374994],[-48.01396484374999,60.72197265625],[-48.107519531250006,60.742431640625],[-48.180810546874994,60.76923828125],[-48.241943359375,60.8068359375],[-48.205175781250006,60.855908203125],[-47.90595703124998,60.945751953125],[-47.77031249999999,60.99775390625],[-47.858789062499994,61.015673828125],[-48.146142578124994,60.999462890625],[-48.193945312500006,61.012939453125],[-48.38642578124998,61.004736328125],[-48.37812,61.1384765625],[-48.424951171874994,61.1716796875],[-48.42817382812498,61.187402343749994],[-48.49482421874998,61.22470703125],[-48.55791015624999,61.233984375],[-48.59716796875,61.247412109375],[-48.92207031249998,61.27744140625],[-48.964501953124994,61.352001953125],[-48.987207031249994,61.4287109375],[-49.04921875,61.523876953125],[-49.204736328124994,61.548681640625],[-49.2890625,61.58994140625],[-49.222265625,61.63212890625],[-49.193115234375,61.68564453125],[-49.265234375,61.71005859375],[-49.31123046874998,61.747802734375],[-49.30449218749999,61.772314453125],[-49.362890625,61.838525390624994],[-49.380273437499994,61.890185546875],[-49.3134765625,61.938623046874994],[-49.129785156249994,61.993408203125],[-49.070556640625,62.015478515625],[-49.039648437500006,62.03935546875],[-48.828710937500006,62.0796875],[-49.008154296875006,62.108203125],[-49.120458984375006,62.11259765625],[-49.202294921874994,62.09931640625],[-49.277929687500006,62.045751953125],[-49.348535156249994,62.010205078125],[-49.623779296875,61.998583984375],[-49.66425781249998,62.016943359375],[-49.68339843749999,62.092578125],[-49.667724609375,62.15087890625],[-49.553466796875,62.23271484375],[-49.68525390624998,62.273339843749994],[-49.806054687499994,62.286523437499994],[-49.943359375,62.324462890625],[-50.070214843749994,62.364501953125],[-50.17915039062498,62.4111328125],[-50.28520507812499,62.466210937499994],[-50.319238281249994,62.473193359375],[-50.280908203124994,62.53076171875],[-50.25932617187499,62.578076171875],[-50.256005859374994,62.67978515625],[-50.298730468749994,62.72197265625],[-50.203759765624994,62.8087890625],[-50.076025390625006,62.903759765625],[-49.793115234374994,63.04462890625],[-50.09223632812498,62.9767578125],[-50.33833007812498,62.828759765624994],[-50.39008789062498,62.822021484375],[-50.408203125,62.848828125],[-50.5015625,62.944921875],[-50.572021484375,62.971142578125],[-50.603515625,63.000048828125],[-50.743505859375006,63.05126953125],[-50.804296875,63.090771484375],[-50.890478515625006,63.166943359375],[-51.013085937499994,63.257568359375],[-51.187597656250006,63.436425781249994],[-51.468847656250006,63.64228515625],[-51.538183593750006,63.7580078125],[-51.451074218749994,63.90478515625],[-51.547509765624994,64.006103515625],[-51.28007812499999,64.052978515625],[-50.897558593750006,64.10556640625],[-50.699365234374994,64.149267578125],[-50.58500976562499,64.162353515625],[-50.341894531250006,64.170361328125],[-50.26069335937498,64.2142578125],[-50.39594726562498,64.203173828125],[-50.48662109374999,64.20888671875],[-50.492285156250006,64.229345703125],[-50.458740234375,64.2658203125],[-50.43706054687499,64.312841796875],[-50.4833984375,64.304345703125],[-50.721044921875006,64.22333984375],[-51.07231445312499,64.159033203125],[-51.3466796875,64.123095703125],[-51.39111328125,64.125],[-51.48710937499999,64.103271484375],[-51.54228515624999,64.097021484375],[-51.58491210937498,64.103173828125],[-51.68203125,64.16474609375],[-51.707861328125006,64.205078125],[-51.533789062500006,64.314208984375],[-51.40375976562498,64.46318359375],[-51.231542968750006,64.560595703125],[-51.10991210937499,64.572802734375],[-50.90654296874999,64.567578125],[-50.83491210937498,64.558984375],[-50.85771484374999,64.616796875],[-50.84921875,64.644677734375],[-50.684326171875,64.678173828125],[-50.492089843749994,64.6931640625],[-50.355126953124994,64.682568359375],[-50.268945312499994,64.61474609375],[-50.158203125,64.48955078125],[-50.00898437499998,64.447265625],[-50.015527343749994,64.507421875],[-50.09296874999998,64.584912109375],[-50.12163085937499,64.703759765625],[-50.21992187499998,64.753857421875],[-50.29887695312499,64.778564453125],[-50.516992187499994,64.76650390625],[-50.64814453124998,64.8533203125],[-50.677880859374994,64.885205078125],[-50.681298828124994,64.9275390625],[-50.812158203124994,65.05185546875],[-50.854248046875,65.11396484375],[-50.923730468749994,65.196728515625],[-50.96064453124998,65.201123046875],[-50.913720703124994,65.09697265625],[-50.85234374999999,65.023681640625],[-50.76484374999998,64.862548828125],[-50.721582031249994,64.797607421875],[-50.780175781249994,64.746142578125],[-50.89106445312498,64.69521484375],[-50.98906249999999,64.66484375],[-51.220605468749994,64.628466796875],[-51.17084960937498,64.707763671875],[-51.13896484374999,64.7857421875],[-51.25537109375,64.75810546875],[-51.363623046875006,64.7015625],[-51.40092773437499,64.623095703125],[-51.470458984375,64.551806640625],[-51.6767578125,64.37705078125],[-51.75810546874999,64.279931640625],[-51.8349609375,64.231982421875],[-51.922607421875,64.21875],[-51.998681640624994,64.256787109375],[-52.06318359375,64.34609375],[-52.093408203124994,64.41591796875],[-52.09702148437499,64.5970703125],[-52.0888671875,64.68154296875],[-52.1240234375,64.79541015625],[-52.23544921874999,65.060546875],[-52.259033203125,65.154931640625],[-52.44760742187499,65.205126953125],[-52.450341796874994,65.221337890625],[-52.49970703125,65.275048828125],[-52.53769531249999,65.32880859375],[-52.50625,65.348486328125],[-52.46142578125,65.3626953125],[-52.179589843749994,65.441943359375],[-51.970703125,65.530712890625],[-51.72109375,65.669921875],[-51.619140625,65.71318359375],[-51.2529296875,65.746484375],[-51.09038085937499,65.751025390625],[-51.091894531250006,65.77578125],[-51.146386718749994,65.78564453125],[-51.393798828125,65.779150390625],[-51.72343749999999,65.723486328125],[-51.779882812500006,65.70341796875],[-51.92412109374999,65.616796875],[-52.0353515625,65.569482421875],[-52.34824218749999,65.461328125],[-52.55126953125,65.461376953125],[-52.7609375,65.5908203125],[-52.99492187499999,65.566015625],[-53.15292968749999,65.574560546875],[-53.198974609375,65.59404296875],[-53.23374023437499,65.770849609375],[-53.106347656249994,65.9771484375],[-53.24375,65.979052734375],[-53.272216796875,65.98740234375],[-53.3447265625,66.034375],[-53.392041015625,66.04833984375],[-53.35693359375,66.073291015625],[-53.01787109374999,66.1708984375],[-52.510888671874994,66.36240234375],[-52.292626953124994,66.437646484375],[-52.15791015625,66.4701171875],[-52.056103515625,66.50732421875],[-51.93217773437499,66.587890625],[-51.891210937500006,66.62314453125],[-51.822119140625006,66.6515625],[-51.676367187500006,66.68359375],[-51.51708984375,66.73203125],[-51.25859374999999,66.8412109375],[-51.225,66.88154296875],[-51.28105468749999,66.890966796875],[-51.401953125,66.853759765625],[-51.647705078125,66.75400390625],[-51.82304687499999,66.6978515625],[-52.42124023437499,66.4466796875],[-52.67587890624999,66.355224609375],[-52.814453125,66.296875],[-52.92192382812499,66.24111328125],[-53.035791015624994,66.201416015625],[-53.15605468749999,66.177734375],[-53.412744140624994,66.1599609375],[-53.53876953125,66.13935546875],[-53.614697265625,66.1544921875],[-53.648095703124994,66.27353515625],[-53.62260742187499,66.34404296875],[-53.634716796875,66.413671875],[-53.570703125,66.51328125],[-53.47568359374999,66.583837890625],[-53.435791015625,66.62216796875],[-53.41875,66.64853515625],[-53.22270507812499,66.721435546875],[-53.114648437499994,66.75380859375],[-53.03828125,66.826806640625],[-52.603125,66.852734375],[-52.49106445312499,66.850146484375],[-52.43144531249999,66.859912109375],[-52.386865234374994,66.88115234375],[-52.42973632812499,66.89755859375],[-52.56010742187499,66.90908203125],[-52.906689453125,66.906884765625],[-53.226953125,66.919384765625],[-53.37309570312499,66.93193359375],[-53.443603515625,66.924658203125],[-53.560009765625,66.945947265625],[-53.687158203124994,66.986474609375],[-53.884423828124994,67.135546875],[-53.80546874999999,67.326904296875],[-53.798583984375,67.4181640625],[-53.54790039062499,67.498193359375],[-53.41386718749999,67.52470703125],[-53.223583984375,67.5849609375],[-52.96953124999999,67.687255859375],[-52.666455078125,67.74970703125],[-52.51201171874999,67.761279296875],[-52.38359374999999,67.75234375],[-51.909082031249994,67.663720703125],[-51.6650390625,67.64638671875],[-51.450585937499994,67.667724609375],[-51.18144531249999,67.6365234375],[-50.70537109374999,67.50888671875],[-50.61347656249998,67.5279296875],[-50.64013671875,67.558837890625],[-51.171044921874994,67.693603515625],[-51.16796875,67.733837890625],[-51.032080078125006,67.744384765625],[-50.88701171874999,67.783544921875],[-50.968847656250006,67.806640625],[-51.32148437499998,67.786572265625],[-51.423242187499994,67.7544921875],[-51.765234375,67.737841796875],[-51.94384765625,67.765185546875],[-52.10419921875,67.7787109375],[-52.34482421874999,67.8369140625],[-52.54619140624999,67.817919921875],[-52.673242187499994,67.794970703125],[-52.898339843749994,67.7732421875],[-52.97958984374999,67.757763671875],[-53.41879882812499,67.574560546875],[-53.60361328124999,67.536474609375],[-53.73520507812499,67.5490234375],[-53.642822265625,67.66826171875],[-53.6162109375,67.71533203125],[-53.616357421874994,67.7666015625],[-53.57797851562499,67.83681640625],[-53.352929687499994,67.9705078125],[-53.211376953125,68.116943359375],[-53.1515625,68.207763671875],[-53.040966796875,68.217919921875],[-52.88984375,68.204541015625],[-52.43608398437499,68.145654296875],[-52.058496093749994,68.07548828125],[-51.77998046874998,68.05673828125],[-51.59687,68.05478515625],[-51.51835937499999,68.0771484375],[-51.45649414062498,68.116064453125],[-51.43266601562499,68.143017578125],[-51.414697265624994,68.198193359375],[-51.393701171874994,68.2177734375],[-51.33251953125,68.241845703125],[-51.207275390625,68.325537109375],[-51.16914062499998,68.385205078125],[-51.21015624999998,68.419921875],[-51.29345703125,68.416357421875],[-51.45610351562499,68.393505859375],[-51.47802734375,68.383984375],[-51.47504882812498,68.365380859375],[-51.632421875,68.273046875],[-51.80400390624999,68.251806640625],[-52.19853515624999,68.22080078125],[-52.378515625,68.218603515625],[-52.698388671874994,68.2615234375],[-52.74677734375,68.278369140625],[-52.780029296875,68.30986328125],[-53.172509765624994,68.302734375],[-53.28984374999999,68.29326171875],[-53.38315429687499,68.29736328125],[-53.33740234375,68.3521484375],[-53.21328125,68.41298828125],[-53.039453125,68.610888671875],[-52.89384765624999,68.6615234375],[-52.60458984374999,68.708740234375],[-52.30278320312499,68.701123046875],[-51.780664062499994,68.548193359375],[-51.623144531250006,68.534814453125],[-51.47871093749998,68.54716796875],[-51.13330078125,68.5984375],[-51.069921875,68.619189453125],[-50.945703125,68.682666015625],[-50.800634765625006,68.791259765625],[-50.807714843750006,68.8169921875],[-51.03022460937498,68.756298828125],[-51.14887695312498,68.73994140625],[-51.249414062499994,68.73994140625],[-51.15605468749999,68.938427734375],[-51.119726562500006,69.09052734375],[-51.084863281249994,69.128271484375],[-50.79228515624999,69.116845703125],[-50.392675781250006,69.13740234375],[-50.29736328125,69.17060546875],[-50.29887695312499,69.1853515625],[-50.459375,69.205517578125],[-50.53662109375,69.2478515625],[-50.671044921874994,69.23447265625],[-50.85107421875,69.20625],[-51.07695312499999,69.20947265625],[-51.05781249999998,69.2748046875],[-50.892236328124994,69.411767578125],[-50.87519531249998,69.47421875],[-50.81059570312499,69.5990234375],[-50.804101562499994,69.663037109375],[-50.72026367187499,69.725341796875],[-50.459082031250006,69.7697265625],[-50.349462890625006,69.796240234375],[-50.34345703124998,69.825244140625],[-50.5,69.935791015625],[-50.46025390624999,69.96630859375],[-50.3375,69.994140625],[-50.29169921874998,70.014453125],[-50.32294921874998,70.0271484375],[-50.43608398437499,70.03935546875],[-50.60986328125,70.01494140625],[-50.80234375,70.00322265625],[-50.97270507812499,70.039892578125],[-51.105712890625,70.057421875],[-51.18994140625,70.051904296875],[-51.418847656249994,69.989208984375],[-51.49907226562499,69.987158203125],[-51.59809570312498,70.004541015625],[-52.254638671875,70.058935546875],[-52.33603515624999,70.078125],[-52.571240234375,70.172119140625],[-52.765039062499994,70.234130859375],[-53.023046875,70.301904296875],[-53.35751953124999,70.3533203125],[-53.768505859375,70.388525390625],[-54.01445312499999,70.4216796875],[-54.135644531249994,70.468408203125],[-54.34331054687499,70.57119140625],[-54.501171875,70.656884765625],[-54.53076171875,70.699267578125],[-54.43798828125,70.751611328125],[-54.34355468749999,70.789208984375],[-54.16582031249999,70.8201171875],[-53.85917968749999,70.809912109375],[-53.69443359374999,70.79609375],[-53.513085937499994,70.7666015625],[-53.37602539062499,70.76103515625],[-53.09130859375,70.769384765625],[-52.801953125,70.7505859375],[-52.63041992187499,70.729931640625],[-52.405224609375,70.686767578125],[-51.783789062500006,70.50322265625],[-51.52446289062499,70.439453125],[-51.41171875,70.431787109375],[-50.946875,70.363623046875],[-50.87236328124999,70.364892578125],[-50.68212890625,70.396875],[-50.66328124999998,70.417578125],[-50.7275390625,70.43798828125],[-50.93266601562499,70.453857421875],[-51.17333984375,70.5291015625],[-51.322851562500006,70.58876953125],[-51.33989257812499,70.687548828125],[-51.320410156250006,70.74287109375],[-51.2828125,70.768017578125],[-51.256591796875,70.852685546875],[-51.39609375,70.90302734375],[-51.493554687499994,70.918896484375],[-51.752685546875,70.992236328125],[-51.774316406249994,71.01044921875],[-51.65009765624998,71.01904296875],[-51.528417968750006,71.014013671875],[-51.26708984375,70.97685546875],[-51.13007812499998,70.971728515625],[-51.030419921874994,70.986279296875],[-51.018945312499994,71.001318359375],[-51.17778320312499,71.04345703125],[-51.37666015624998,71.11904296875],[-51.791894531249994,71.130126953125],[-52.06137695312499,71.121630859375],[-52.23359375,71.14755859375],[-52.416894531249994,71.189697265625],[-52.534570312499994,71.200439453125],[-52.775,71.1740234375],[-52.8966796875,71.170703125],[-53.007568359375,71.17998046875],[-53.11704101562499,71.312890625],[-53.087890625,71.352734375],[-53.002099609374994,71.369970703125],[-52.93730468749999,71.412841796875],[-52.891845703125,71.457666015625],[-52.749414062499994,71.501513671875],[-51.96728515625,71.59912109375],[-51.769921875,71.671728515625],[-51.77861328124999,71.68291015625],[-51.91171875,71.66943359375],[-52.081933593749994,71.63671875],[-52.19580078125,71.62998046875],[-52.65629882812499,71.672265625],[-52.72807617187499,71.662646484375],[-52.91455078125,71.601904296875],[-53.16752929687499,71.5359375],[-53.284082031249994,71.53994140625],[-53.440087890624994,71.57900390625],[-53.46484375,71.606787109375],[-53.476025390625,71.640185546875],[-53.30473632812499,71.685888671875],[-53.24970703125,71.71015625],[-53.1388671875,71.7751953125],[-53.14453125,71.807421875],[-53.33369140625,71.78974609375],[-53.358349609375,71.81962890625],[-53.35527343749999,71.8708984375],[-53.37363281249999,71.9357421875],[-53.4201171875,71.999755859375],[-53.575390625,72.098046875],[-53.639794921874994,72.12333984375],[-53.69287109375,72.15966796875],[-53.80986328124999,72.292578125],[-53.77597656249999,72.325830078125],[-53.672021484374994,72.351025390625],[-53.65214843749999,72.362646484375],[-53.900537109374994,72.341748046875],[-53.927734375,72.318798828125],[-53.88090820312499,72.2849609375],[-53.84746093749999,72.23984375],[-53.827539062499994,72.183447265625],[-53.792871093749994,72.13408203125],[-53.70292968749999,72.080029296875],[-53.63095703124999,72.051513671875],[-53.513671875,71.97626953125],[-53.4625,71.8935546875],[-53.47758789062499,71.849951171875],[-53.56865234374999,71.80556640625],[-53.71542968749999,71.757666015625],[-53.75986328124999,71.718017578125],[-53.7796875,71.678515625],[-53.89409179687499,71.6419921875],[-53.96435546875,71.6556640625],[-54.019921875,71.657861328125],[-53.954296875,71.59267578125],[-53.912060546875,71.525927734375],[-53.96298828124999,71.458984375],[-54.09892578124999,71.418505859375],[-54.17270507812499,71.41728515625],[-54.31772460937499,71.38447265625],[-54.6890625,71.367236328125],[-54.818310546875,71.37529296875],[-55.05537109375,71.40859375],[-55.33642578125,71.4267578125],[-55.447900390624994,71.47177734375],[-55.59404296874999,71.553515625],[-55.66782226562499,71.6267578125],[-55.669335937499994,71.69150390625],[-55.629785156249994,71.738623046875],[-55.54921875,71.76826171875],[-55.45244140624999,71.957666015625],[-55.315576171874994,72.110693359375],[-54.9708984375,72.268408203125],[-54.87260742187499,72.325439453125],[-54.84013671874999,72.356103515625],[-54.84062,72.37939453125],[-54.89633789062499,72.394189453125],[-55.32011718749999,72.199560546875],[-55.581445312499994,72.178857421875],[-55.65947265624999,72.222607421875],[-55.63583984374999,72.300439453125],[-55.589306640625,72.318505859375],[-55.3779296875,72.3111328125],[-55.29570312499999,72.35439453125],[-55.427978515625,72.419873046875],[-55.56875,72.43701171875],[-55.601708984374994,72.453466796875],[-55.456787109375,72.503271484375],[-55.12187,72.499609375],[-55.04624023437499,72.534423828125],[-54.924951171874994,72.57197265625],[-54.79038085937499,72.6416015625],[-54.74003906249999,72.7001953125],[-54.7287109375,72.75048828125],[-54.757714843749994,72.791064453125],[-54.76083984374999,72.83173828125],[-54.737939453124994,72.872509765625],[-54.773095703124994,72.917578125],[-54.8662109375,72.966845703125],[-55.07309570312499,73.01513671875],[-55.133984375,72.96064453125],[-55.1984375,72.938232421875],[-55.28891601562499,72.933203125],[-55.37241210937499,72.95615234375],[-55.45952148437499,72.964404296875],[-55.5451171875,72.984912109375],[-55.633984375,72.99140625],[-55.66855468749999,73.00791015625],[-55.690820312499994,73.0541015625],[-55.692773437499994,73.112841796875],[-55.59228515625,73.140283203125],[-55.45234375,73.1619140625],[-55.35869140624999,73.2029296875],[-55.29716796874999,73.2623046875],[-55.28828125,73.327099609375],[-55.33203125,73.39736328125],[-55.445703125,73.460498046875],[-55.656201171875,73.399072265625],[-55.73886718749999,73.383984375],[-55.75791015624999,73.4279296875],[-55.787060546875,73.460498046875],[-55.87553710937499,73.504638671875],[-55.99199218749999,73.53681640625],[-56.10405273437499,73.558154296875],[-56.10917968749999,73.590771484375],[-56.08261718749999,73.627490234375],[-56.03300781249999,73.6703125],[-55.968408203124994,73.7595703125],[-55.89731445312499,73.751611328125],[-55.83828125,73.759716796875],[-55.87241210937499,73.833447265625],[-55.92949218749999,73.89541015625],[-55.996533203125,73.930615234375],[-55.998925781249994,73.945947265625],[-56.01445312499999,73.9638671875],[-56.06621093749999,74.007275390625],[-56.12421875,74.0390625],[-56.22539062499999,74.1291015625],[-56.298486328124994,74.163427734375],[-56.3921875,74.181201171875],[-56.4931640625,74.182177734375],[-56.655175781249994,74.158544921875],[-56.954296875,74.131201171875],[-57.19111328125,74.118212890625],[-57.23056640624999,74.12529296875],[-57.11210937499999,74.15947265625],[-56.9375,74.195068359375],[-56.70634765624999,74.219189453125],[-56.63896484374999,74.278369140625],[-56.66391601562499,74.32958984375],[-56.654296875,74.378125],[-56.717675781249994,74.429248046875],[-56.656005859375,74.457568359375],[-56.445556640625,74.486083984375],[-56.35029296875,74.490478515625],[-56.25546875,74.526806640625],[-56.52207031249999,74.614306640625],[-56.80131835937499,74.6716796875],[-56.87114257812499,74.694970703125],[-56.932568359375,74.733349609375],[-56.985546875,74.786767578125],[-57.071679687499994,74.840234375],[-57.190869140625,74.89375],[-57.36479492187499,74.945458984375],[-57.81318359375,75.039990234375],[-57.96708984374999,75.10517578125],[-58.108837890625,75.204931640625],[-58.1796875,75.2474609375],[-58.253320312499994,75.278955078125],[-58.56552734374999,75.352734375],[-58.603466796875,75.385302734375],[-58.281201171875,75.4720703125],[-58.249658203124994,75.506689453125],[-58.381298828125,75.61201171875],[-58.51621093749999,75.6890625],[-58.6630859375,75.71640625],[-58.88144531249999,75.73046875],[-59.08159179687499,75.764697265625],[-59.263623046875,75.818896484375],[-59.4453125,75.85859375],[-59.717431640624994,75.8962890625],[-60.172753906249994,75.993310546875],[-60.874609375,76.09716796875],[-61.188232421875,76.157861328125],[-61.37480468749999,76.17998046875],[-61.620849609375,76.18564453125],[-62.0966796875,76.242333984375],[-62.49619140624999,76.26044921875],[-62.74287109375,76.2521484375],[-62.8234375,76.2615234375],[-63.005810546875,76.319091796875],[-63.29130859374999,76.35205078125],[-63.438867187499994,76.339453125],[-63.621972656249994,76.277880859375],[-63.84306640624999,76.217138671875],[-63.960351562499994,76.208935546875],[-64.135205078125,76.264501953125],[-64.22319335937499,76.3033203125],[-64.307275390625,76.31650390625],[-64.38730468749999,76.30400390625],[-64.543408203125,76.253076171875],[-64.69208984375,76.216259765625],[-64.91196289062499,76.172509765625],[-65.087646484375,76.151513671875],[-65.313232421875,76.14638671875],[-65.36992187499999,76.13056640625],[-65.456787109375,76.129833984375],[-65.57373046875,76.14423828125],[-65.68330078125,76.172705078125],[-65.78544921874999,76.21533203125],[-65.875732421875,76.238330078125],[-65.954052734375,76.24169921875],[-66.134033203125,76.21962890625],[-66.361767578125,76.15478515625],[-66.465771484375,76.13916015625],[-66.55322265625,76.145947265625],[-66.65996093749999,76.166162109375],[-66.8740234375,76.21787109375],[-66.992578125,76.212939453125],[-67.07871093749999,76.19482421875],[-67.05478515624999,76.15185546875],[-66.85390625,76.05],[-66.6748046875,75.977392578125],[-66.826171875,75.968798828125],[-68.14873046874999,76.067041015625],[-68.31728515625,76.090771484375],[-68.56064453124999,76.1501953125],[-68.7630859375,76.18662109375],[-69.107568359375,76.280859375],[-69.37290039062499,76.331884765625],[-69.460888671875,76.371728515625],[-69.48408203125,76.399169921875],[-69.399658203125,76.436279296875],[-68.864990234375,76.561376953125],[-68.66074218749999,76.58662109375],[-68.24541015624999,76.616748046875],[-68.147216796875,76.63564453125],[-68.1142578125,76.650634765625],[-68.223388671875,76.677685546875],[-68.76738281249999,76.668017578125],[-69.25205078124999,76.6861328125],[-69.673828125,76.735888671875],[-69.747216796875,76.752392578125],[-69.81865234374999,76.782763671875],[-69.8880859375,76.82705078125],[-69.872216796875,76.876611328125],[-69.77104492187499,76.9314453125],[-69.71171874999999,76.96904296875],[-69.69423828125,76.989453125],[-70.22446289062499,76.85458984375],[-70.44130859375,76.807373046875],[-70.61313476562499,76.821826171875],[-70.73369140624999,76.844189453125],[-70.79282226562499,76.869091796875],[-70.790625,76.896484375],[-70.771240234375,76.91650390625],[-70.73466796874999,76.92900390625],[-71.0150390625,76.98486328125],[-71.14145507812499,77.028662109375],[-71.15488281249999,77.073876953125],[-71.05546874999999,77.1205078125],[-70.95810546874999,77.154345703125],[-70.86284179687499,77.175439453125],[-70.6037109375,77.19384765625],[-69.65654296874999,77.22900390625],[-68.97832031249999,77.1953125],[-68.7474609375,77.30693359375],[-68.59160156249999,77.342529296875],[-68.13554687499999,77.37958984375],[-67.4337890625,77.38466796875],[-66.93798828125,77.364208984375],[-66.70576171875,77.338037109375],[-66.38945312499999,77.2802734375],[-66.3712890625,77.297705078125],[-66.44765625,77.3498046875],[-66.453076171875,77.39306640625],[-66.32529296874999,77.468212890625],[-66.26645507812499,77.515380859375],[-66.30644531249999,77.564501953125],[-66.44536132812499,77.615673828125],[-66.69121093749999,77.681201171875],[-66.82353515624999,77.68662109375],[-66.970654296875,77.670849609375],[-67.14736328125,77.634521484375],[-67.5146484375,77.542919921875],[-67.68808593749999,77.523779296875],[-67.97734374999999,77.518896484375],[-68.13730468749999,77.53046875],[-68.29189453125,77.544189453125],[-68.53349609374999,77.5927734375],[-68.621533203125,77.60185546875],[-68.72822265625,77.58056640625],[-68.853662109375,77.528857421875],[-68.974560546875,77.492626953125],[-69.09091796874999,77.471923828125],[-69.199658203125,77.462939453125],[-69.35136718749999,77.467138671875],[-69.9767578125,77.54765625],[-70.1181640625,77.58349609375],[-70.1263671875,77.63779296875],[-70.318310546875,77.690380859375],[-70.535400390625,77.699560546875],[-70.5619140625,77.7171875],[-70.28662109375,77.7982421875],[-70.081494140625,77.831396484375],[-70.114453125,77.841357421875],[-70.41240234374999,77.843115234375],[-70.613525390625,77.8],[-70.7287109375,77.792724609375],[-70.993603515625,77.791552734375],[-71.271630859375,77.813134765625],[-71.38984375,77.83203125],[-71.51240234375,77.875390625],[-71.64990234375,77.8998046875],[-72.06494140625,77.93681640625],[-72.15854492187499,77.95693359375],[-72.247265625,77.9904296875],[-72.586328125,78.085205078125],[-72.79150390625,78.1548828125],[-72.81806640625,78.1943359375],[-72.581298828125,78.2791015625],[-72.570947265625,78.29873046875],[-72.67246093749999,78.335302734375],[-72.714794921875,78.3623046875],[-72.67973632812499,78.399560546875],[-72.47250976562499,78.48203125],[-72.39560546874999,78.504345703125],[-72.023681640625,78.552783203125],[-71.651318359375,78.62314453125],[-71.515625,78.63896484375],[-71.394775390625,78.642626953125],[-70.90576171875,78.6384765625],[-70.7541015625,78.655810546875],[-70.625390625,78.69013671875],[-70.414208984375,78.72490234375],[-69.97353515625,78.777685546875],[-68.99345703124999,78.857421875],[-68.929638671875,78.866796875],[-68.92392578124999,78.88193359375],[-69.011962890625,78.923046875],[-69.030517578125,78.94287109375],[-68.829833984375,78.979736328125],[-68.37705078124999,79.037841796875],[-68.067529296875,79.0658203125],[-67.868359375,79.06787109375],[-67.707763671875,79.08037109375],[-67.48222656249999,79.11689453125],[-67.35454101562499,79.12333984375],[-66.583740234375,79.1376953125],[-66.24277343749999,79.117822265625],[-66.075341796875,79.118212890625],[-65.96787109374999,79.132373046875],[-65.82553710937499,79.17373046875],[-65.559765625,79.27646484375],[-65.419873046875,79.340234375],[-65.28779296875,79.4373046875],[-65.116943359375,79.589013671875],[-64.9892578125,79.736962890625],[-64.90463867187499,79.88125],[-64.83896484374999,79.969189453125],[-64.79228515624999,80.000634765625],[-64.632421875,80.040576171875],[-64.46572265625,80.0716796875],[-64.179150390625,80.099267578125],[-64.2052734375,80.112109375],[-64.326806640625,80.13359375],[-64.43994140625,80.141845703125],[-64.54462890625,80.1369140625],[-64.73525390625,80.104443359375],[-64.98222656249999,80.082470703125],[-65.222119140625,80.0859375],[-65.394921875,80.077734375],[-65.55341796875,80.047998046875],[-65.81044921875,80.024072265625],[-65.98193359375,80.0294921875],[-66.29150390625,80.072265625],[-66.447705078125,80.0802734375],[-66.84365234375,80.076220703125],[-66.95947265625,80.092041015625],[-67.06064453124999,80.12314453125],[-67.14130859375,80.166455078125],[-67.20146484374999,80.22216796875],[-67.19316406249999,80.280078125],[-67.05063476562499,80.384521484375],[-66.99589843749999,80.41298828125],[-66.61005859375,80.52958984375],[-66.372314453125,80.5841796875],[-66.135693359375,80.625],[-65.96328125,80.648974609375],[-65.8009765625,80.659716796875],[-65.64521484375,80.68505859375],[-65.35820312499999,80.76650390625],[-65.062158203125,80.836328125],[-64.693798828125,80.966015625],[-64.51552734375,81],[-63.891552734375,81.0564453125],[-63.72197265624999,81.05732421875],[-63.578027343749994,81.04326171875],[-63.44169921874999,81.0138671875],[-63.05859375,80.885595703125],[-63.02866210937499,80.88955078125],[-63.095458984375,80.9380859375],[-63.23520507812499,81.083349609375],[-63.2125,81.143115234375],[-62.99326171874999,81.206982421875],[-62.90336914062499,81.218359375],[-62.67192382812499,81.214111328125],[-62.29887695312499,81.194384765625],[-62.04941406249999,81.17275390625],[-61.8603515625,81.13759765625],[-61.63559570312499,81.11572265625],[-61.51909179687499,81.116796875],[-61.435986328125,81.13359375],[-61.31699218749999,81.1884765625],[-61.162060546875,81.281494140625],[-61.1,81.39609375],[-61.130761718749994,81.53232421875],[-61.1759765625,81.631884765625],[-61.23569335937499,81.694580078125],[-61.20292968749999,81.746875],[-61.015039062499994,81.8095703125],[-60.84287109374999,81.85537109375],[-60.432373046875,81.920166015625],[-60.09946289062499,81.937353515625],[-59.90190429687499,81.9330078125],[-59.64228515625,81.90263671875],[-59.28193359375,81.884033203125],[-58.956787109375,81.8251953125],[-58.42978515624999,81.6900390625],[-58.07993164062499,81.622216796875],[-57.79033203124999,81.591748046875],[-57.5048828125,81.539892578125],[-57.08286132812499,81.429931640625],[-56.862060546875,81.38271484375],[-56.7306640625,81.365625],[-56.615136718749994,81.362890625],[-56.658154296875,81.394287109375],[-56.85966796874999,81.4599609375],[-57.168408203125,81.532177734375],[-57.85302734375,81.66201171875],[-58.230078125,81.753662109375],[-58.56821289062499,81.858203125],[-58.81674804687499,81.92041015625],[-59.268017578125,81.982080078125],[-59.26181640624999,82.006640625],[-58.71738281249999,82.09306640625],[-57.71689453124999,82.168310546875],[-56.58935546875,82.2271484375],[-56.21196289062499,82.221142578125],[-55.54868164062499,82.245751953125],[-55.486230468749994,82.282861328125],[-55.34360351562499,82.299560546875],[-54.72587890624999,82.3513671875],[-54.54887695312499,82.350634765625],[-54.27705078125,82.32607421875],[-53.9873046875,82.279248046875],[-53.85322265625,82.236865234375],[-53.671337890625,82.1640625],[-53.58203125,82.061572265625],[-53.59550781249999,81.738037109375],[-53.590771484375,81.67685546875],[-53.5556640625,81.653271484375],[-53.430126953125,81.68837890625],[-53.27998046875,81.75361328125],[-53.14501953125,81.799755859375],[-53.0412109375,81.87099609375],[-52.968505859375,81.967138671875],[-52.925537109375,82.03837890625],[-53.101953125,82.1189453125],[-53.110742187499994,82.251220703125],[-53.02255859374999,82.321728515625],[-52.7755859375,82.321728515625],[-51.754003906250006,82.07822265625],[-51.35185546874999,82.025634765625],[-50.894433593749994,81.89521484375],[-50.36005859374998,81.90908203125],[-49.867041015625006,81.893017578125],[-49.648828125,81.897802734375],[-49.54106445312499,81.91806640625],[-49.69428710937498,81.972119140625],[-50.39482421874999,82.120703125],[-50.713134765625,82.237353515625],[-50.935546875,82.3828125],[-50.98994140624998,82.46015625],[-50.81953124999998,82.474072265625],[-50.037109375,82.472412109375],[-48.861181640625006,82.405419921875],[-47.357421875,82.1736328125],[-46.617333984374994,82.09697265625],[-45.29106445312499,81.82880859375],[-44.890966796875006,81.78828125],[-44.7294921875,81.779833984375],[-44.60761718749998,81.812939453125],[-44.53242187499998,81.84892578125],[-44.52690429687499,81.896826171875],[-44.59101562499998,81.956689453125],[-44.62773437499999,82.02587890625],[-44.637109375,82.104443359375],[-44.54707031249998,82.26005859375],[-44.33320312499998,82.310791015625],[-44.238867187500006,82.3681640625],[-44.3265625,82.471728515625],[-44.577246093750006,82.542626953125],[-45.55244140624998,82.725244140625],[-45.556542968749994,82.747021484375],[-45.359619140625,82.770947265625],[-45.06743164062499,82.7849609375],[-42.650732421875006,82.741455078125],[-42.23295898437499,82.72548828125],[-42.05463867187498,82.709814453125],[-41.9765625,82.68916015625],[-41.87646484375,82.680322265625],[-41.357275390625006,82.70498046875],[-41.36962890625,82.75],[-41.434423828125006,82.77861328125],[-44.23920898437498,82.856787109375],[-44.761962890625,82.883544921875],[-45.027929687500006,82.885595703125],[-45.302978515625,82.865087890625],[-45.87333984374999,82.8548828125],[-46.136816406250006,82.858837890625],[-46.478173828124994,82.951904296875],[-46.169042968750006,83.0638671875],[-45.90888671874998,83.061328125],[-45.41459960937499,83.01767578125],[-45.12177734374998,83.078662109375],[-44.65693359374998,83.129052734375],[-44.19731445312499,83.146826171875],[-43.194580078125,83.255126953125],[-43.00927734375,83.264599609375],[-42.775537109374994,83.2587890625],[-42.259521484375,83.231982421875],[-42.054589843749994,83.20517578125],[-41.81977539062498,83.14775390625],[-41.683496093749994,83.130029296875],[-41.52197265625,83.1267578125],[-41.300146484375006,83.10078125],[-40.979394531249994,83.18486328125],[-40.689453125,83.2751953125],[-40.356835937499994,83.332177734375],[-39.886328125,83.29892578125],[-39.58842773437499,83.25556640625],[-39.316015625,83.20390625],[-38.93110351562498,83.175341796875],[-38.27836914062499,82.998876953125],[-38.15625,82.9986328125],[-38.09858398437498,83.01357421875],[-38.037011718749994,83.0462890625],[-38.014892578125,83.09482421875],[-37.93476562499998,83.1607421875],[-37.992773437500006,83.185107421875],[-38.53955078125,83.258154296875],[-38.642919921875006,83.286279296875],[-38.747802734375,83.332568359375],[-38.74956054687499,83.370849609375],[-38.64824218749999,83.401025390625],[-38.54145507812498,83.414794921875],[-38.18793945312498,83.402294921875],[-38.07109374999999,83.412109375],[-37.960839843749994,83.437646484375],[-37.828027343749994,83.485546875],[-37.72333984374998,83.49775390625],[-37.486914062500006,83.49912109375],[-37.12299804687498,83.468408203125],[-36.80449218749999,83.4658203125],[-36.689599609374994,83.479931640625],[-36.672119140625,83.509912109375],[-36.644433593749994,83.528955078125],[-36.60649414062499,83.536962890625],[-35.45185546874998,83.538623046875],[-35.16552734375,83.545751953125],[-34.941650390625,83.56845703125],[-34.66777343749999,83.571142578125],[-34.428320312500006,83.557568359375],[-34.131933593750006,83.528662109375],[-33.83735351562498,83.52998046875],[-33.398339843749994,83.57724609375],[-32.98442382812499,83.599609375],[-30.70292968749999,83.593408203125],[-29.952880859375,83.56484375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[180,-16.5400390625],[179.98720703125002,-16.54121093750001],[179.98466796875005,-16.52216796875001],[180,-16.488867187500006],[180,-16.5400390625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-179.95615234375,-16.14921875],[-180,-16.168261718750003],[-180,-16.156054687500003],[-180,-16.152929687500006],[-179.969384765625,-16.126074218750006],[-179.944580078125,-16.126074218750006],[-179.95615234375,-16.14921875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-85.87094726562499,16.46152343749999],[-85.947216796875,16.403613281250003],[-85.96098632812499,16.4296875],[-85.92421875,16.483300781249994],[-85.87822265624999,16.513964843750003],[-85.83378906249999,16.510888671874994],[-85.84443359375,16.487744140624997],[-85.87094726562499,16.46152343749999]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[25.402734375000023,37.419140625],[25.30712890625,37.412988281249994],[25.31269531250001,37.489306640624996],[25.34814453125,37.509179687499994],[25.462988281250006,37.47109375],[25.457421875000023,37.447070312499996],[25.402734375000023,37.419140625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[166.95839843750002,-0.5166015625],[166.93896484375,-0.55078125],[166.91640625000002,-0.546484375],[166.90703125000005,-0.523730468750003],[166.91357421875,-0.499121093750006],[166.93896484375,-0.489355468750006],[166.95566406250003,-0.496972656250009],[166.95839843750002,-0.5166015625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[169.63505859375005,5.830078125],[169.6154296875,5.7998046875],[169.59052734375,5.801904296874994],[169.61220703125002,5.824414062499997],[169.6271484375,5.855810546874991],[169.65107421875,5.945117187499989],[169.700390625,5.97705078125],[169.7345703125,6.01416015625],[169.72636718750005,5.975683593749991],[169.67255859375,5.935205078124994],[169.63505859375005,5.830078125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[172.96962890625002,3.129199218749989],[172.90625,3.095898437499997],[172.88710937500002,3.101269531249997],[172.9625,3.148779296874991],[172.96220703125005,3.142919921874991],[172.96962890625002,3.129199218749989]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[172.84423828125,3.051220703124997],[172.77031250000005,3.012548828124991],[172.75048828125,3.033056640624991],[172.77734375,3.033886718749997],[172.82695312500005,3.071093749999989],[172.88710937500002,3.073974609375],[172.88027343750002,3.053515624999989],[172.84423828125,3.051220703124997]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[173.01875,1.845703125],[173.0236328125,1.822558593749989],[172.96660156250005,1.885400390624994],[172.93271484375003,1.925927734374994],[172.934765625,1.943701171874991],[172.95009765625002,1.932519531249994],[172.96914062500002,1.912695312499991],[172.98154296875003,1.89697265625],[173.01875,1.845703125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[173.02939453125003,1.717382812499991],[172.99326171875003,1.713085937499997],[173.02041015625002,1.727490234374997],[173.02783203125,1.747314453125],[173.0236328125,1.809326171875],[173.03769531250003,1.804394531249997],[173.04267578125,1.778759765624997],[173.04521484375005,1.741552734374991],[173.02939453125003,1.717382812499991]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[173.03281250000003,1.013134765624997],[173.08652343750003,0.973437499999989],[173.07949218750002,0.946240234374997],[173.06142578125002,0.915234375],[172.99111328125002,0.83544921875],[172.969921875,0.8427734375],[173.03857421875,0.914746093749997],[173.06503906250003,0.962695312499989],[173.0255859375,0.999072265624989],[173.0099609375,0.990966796875],[173.00371093750005,0.990966796875],[172.99003906250005,1.025097656249997],[173.00371093750005,1.025097656249997],[173.03281250000003,1.013134765624997]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[174.50869140625002,-0.8017578125],[174.47636718750005,-0.829003906250009],[174.4640625,-0.80419921875],[174.4796875,-0.773632812500011],[174.45273437500003,-0.647070312500006],[174.40781250000003,-0.629785156250009],[174.3810546875,-0.591796875],[174.39404296875,-0.591796875],[174.43876953125005,-0.6265625],[174.4748046875,-0.6421875],[174.49541015625005,-0.725683593750006],[174.50869140625002,-0.8017578125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[174.77324218750005,-1.2119140625],[174.77890625000003,-1.263378906250011],[174.75595703125003,-1.256445312500006],[174.74843750000002,-1.236425781250006],[174.74101562500005,-1.1845703125],[174.716796875,-1.133691406250009],[174.744140625,-1.147363281250009],[174.7666015625,-1.187109375],[174.77324218750005,-1.2119140625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[168.8302734375,7.308984375],[168.8154296875,7.293554687499991],[168.71923828125,7.302734375],[168.67509765625005,7.321923828124994],[168.67929687500003,7.336230468749989],[168.75546875000003,7.322460937499997],[168.8302734375,7.308984375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[171.57734375,7.048242187499994],[171.61474609375,7.026611328125],[171.68837890625002,7.028271484374997],[171.7568359375,6.97314453125],[171.73046875,6.976611328124989],[171.693359375,7.000146484374994],[171.659375,7.010058593749989],[171.61416015625002,7.007177734374991],[171.5927734375,7.016259765624994],[171.57734375,7.048242187499994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[171.10195312500002,7.138232421874989],[171.22695312500002,7.086962890624989],[171.39375,7.1109375],[171.36699218750005,7.095556640624991],[171.3046875,7.081152343749991],[171.26328125000003,7.06875],[171.2353515625,7.06875],[171.20234375,7.073535156249989],[171.09550781250005,7.109277343749994],[171.03574218750003,7.156103515624991],[171.05039062500003,7.171777343749994],[171.10195312500002,7.138232421874989]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-178.0466796875,-14.318359375],[-178.1033203125,-14.324902343750011],[-178.15859375,-14.311914062500009],[-178.194384765625,-14.25546875],[-178.17802734375,-14.231640625000011],[-178.142236328125,-14.242578125],[-178.105029296875,-14.2841796875],[-178.04365234375,-14.30322265625],[-178.0466796875,-14.318359375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-140.80937,-17.85664062500001],[-140.804443359375,-17.87568359375001],[-140.8408203125,-17.873144531250006],[-140.8515625,-17.86660156250001],[-140.850732421875,-17.8310546875],[-140.824267578125,-17.78798828125001],[-140.80361328125,-17.75166015625001],[-140.76142578125,-17.7177734375],[-140.686181640625,-17.68378906250001],[-140.6498046875,-17.669726562500003],[-140.638232421875,-17.678027343750003],[-140.65205078125,-17.68310546875],[-140.776318359375,-17.75410156250001],[-140.815185546875,-17.8037109375],[-140.83251953125,-17.838476562500006],[-140.829248046875,-17.84921875],[-140.80937,-17.85664062500001]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-136.293896484375,-18.54433593750001],[-136.3140625,-18.56630859375001],[-136.316015625,-18.545214843750003],[-136.34404296875,-18.53486328125001],[-136.38291015625,-18.513671875],[-136.435693359375,-18.4890625],[-136.4642578125,-18.48505859375001],[-136.478515625,-18.470800781250006],[-136.45869140625,-18.463183593750003],[-136.426123046875,-18.47431640625001],[-136.38037109375,-18.49677734375001],[-136.32763671875,-18.519335937500003],[-136.293896484375,-18.54433593750001]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-136.971728515625,-18.34199218750001],[-136.971337890625,-18.3609375],[-137.067578125,-18.26533203125001],[-137.029638671875,-18.27285156250001],[-136.971728515625,-18.34199218750001]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-138.505859375,-20.857226562500003],[-138.53486328125,-20.87587890625001],[-138.5240234375,-20.8505859375],[-138.54638671875,-20.79511718750001],[-138.568359375,-20.787109375],[-138.54638671875,-20.77119140625001],[-138.51494140625,-20.81337890625001],[-138.505859375,-20.857226562500003]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-140.6853515625,-18.3798828125],[-140.671875,-18.416113281250006],[-140.696044921875,-18.39912109375001],[-140.7732421875,-18.36376953125],[-140.78173828125,-18.33417968750001],[-140.6853515625,-18.3798828125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-140.8298828125,-18.18935546875001],[-140.822705078125,-18.216894531250006],[-140.86005859375,-18.19873046875],[-140.895458984375,-18.14794921875],[-140.958642578125,-18.085058593750006],[-140.97353515625,-18.059179687500006],[-140.925146484375,-18.083789062500003],[-140.89326171875,-18.12050781250001],[-140.8298828125,-18.18935546875001]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-142.51181640625,-16.096289062500006],[-142.52958984375,-16.10712890625001],[-142.5068359375,-16.027734375],[-142.481201171875,-16.01777343750001],[-142.51181640625,-16.096289062500006]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-143.440576171875,-16.619726562500006],[-143.386181640625,-16.66884765625001],[-143.458544921875,-16.63544921875001],[-143.55068359375,-16.62109375],[-143.515576171875,-16.6123046875],[-143.464697265625,-16.613574218750003],[-143.440576171875,-16.619726562500006]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-143.571142578125,-16.634765625],[-143.61064453125,-16.640429687500003],[-143.707421875,-16.580859375],[-143.67021484375,-16.580859375],[-143.614794921875,-16.61806640625001],[-143.571142578125,-16.634765625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-145.0513671875,-15.856054687500006],[-145.057666015625,-15.901074218750011],[-145.076416015625,-15.857617187500011],[-145.137939453125,-15.7880859375],[-145.1607421875,-15.757031250000011],[-145.133544921875,-15.762011718750003],[-145.0513671875,-15.856054687500006]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-145.486669921875,-16.32978515625001],[-145.4822265625,-16.346777343750006],[-145.502734375,-16.345800781250006],[-145.53984375,-16.29511718750001],[-145.553125,-16.25117187500001],[-145.576708984375,-16.201464843750003],[-145.609130859375,-16.16523437500001],[-145.61279296875,-16.1318359375],[-145.613818359375,-16.079199218750006],[-145.577099609375,-16.15986328125001],[-145.542333984375,-16.224609375],[-145.5169921875,-16.27783203125],[-145.486669921875,-16.32978515625001]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[173.03837890625005,1.342089843749989],[173.01132812500003,1.33837890625],[173.02861328125005,1.358740234374991],[173.14335937500005,1.38134765625],[173.1533203125,1.387548828124991],[173.171875,1.375146484374994],[173.17148437500003,1.363378906249991],[173.1630859375,1.357519531249991],[173.10634765625002,1.357080078124994],[173.06171875,1.346337890624994],[173.03837890625005,1.342089843749989]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-169.755224609375,56.635058593749996],[-169.62392578125,56.61513671875],[-169.55048828125,56.628125],[-169.485693359375,56.617724609374996],[-169.47431640625,56.594042968749996],[-169.586865234375,56.542431640625],[-169.6326171875,56.545703125],[-169.766162109375,56.607958984374996],[-169.755224609375,56.635058593749996]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-72.6640625,20.0375],[-72.623486328125,20.01416015625],[-72.6388671875,19.98583984375],[-72.73979492187499,20.00341796875],[-72.84423828125,20.035449218750003],[-72.87841796875,20.02744140624999],[-72.89931640625,20.031445312499997],[-72.9603515625,20.062255859375],[-72.90673828125,20.085839843749994],[-72.85146484375,20.093652343749994],[-72.791015625,20.09189453124999],[-72.6640625,20.0375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[24.523535156250006,37.12509765625],[24.48652343750001,37.11005859375],[24.4248046875,37.131982421874994],[24.441210937500017,37.186865234375],[24.483789062500023,37.210205078125],[24.529101562500017,37.192333984375],[24.535937500000017,37.16767578125],[24.523535156250006,37.12509765625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[142.18818359375,26.616503906249996],[142.169921875,26.615673828124997],[142.10712890625,26.721533203125],[142.12529296875005,26.726464843749994],[142.16171875000003,26.7099609375],[142.2021484375,26.648779296875],[142.18818359375,26.616503906249996]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[130.916015625,37.478466796875],[130.87060546875,37.44873046875],[130.81679687500002,37.478466796875],[130.81025390625,37.509912109374994],[130.83837890625,37.53720703125],[130.90371093750002,37.5537109375],[130.93427734375,37.529736328125],[130.916015625,37.478466796875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-57.020654296874994,-63.37285156250002],[-56.92734375,-63.50556640625001],[-56.78183593749999,-63.571679687499994],[-56.83476562499999,-63.63125],[-56.97368164062499,-63.624609375],[-57.11918945312499,-63.637792968750006],[-57.152246093749994,-63.571679687499994],[-57.09770507812499,-63.523535156250006],[-57.152246093749994,-63.479101562500006],[-57.28388671875,-63.490625],[-57.46064453125,-63.513574218749994],[-57.581494140625,-63.54658203125001],[-57.73691406249999,-63.61660156250002],[-57.85673828124999,-63.656835937500006],[-58.26298828124999,-63.76337890625001],[-58.531884765624994,-63.91542968750002],[-58.7228515625,-64.07744140625002],[-58.83896484374999,-64.18681640625002],[-59.005322265625,-64.194921875],[-59.047314453125,-64.23447265625],[-58.97724609375,-64.26591796875002],[-58.922998046874994,-64.279296875],[-58.79931640625,-64.29267578125001],[-58.81914062499999,-64.33896484375],[-58.90512695312499,-64.3521484375],[-58.895458984375,-64.38886718750001],[-58.805908203125,-64.44482421875],[-58.786083984375,-64.52421875000002],[-58.89189453124999,-64.53740234375002],[-59.050683593749994,-64.45136718750001],[-59.229394531249994,-64.44355468750001],[-59.36967773437499,-64.40351562500001],[-59.46074218749999,-64.34560546875002],[-59.546777343749994,-64.35878906250002],[-59.61215820312499,-64.44013671875001],[-59.573193359375,-64.53076171875],[-59.64599609375,-64.58369140625001],[-59.734375,-64.55888671875002],[-59.765039062499994,-64.45136718750001],[-59.85019531249999,-64.43359375],[-59.9630859375,-64.43134765625001],[-60.24248046874999,-64.546875],[-60.34052734375,-64.55058593750002],[-60.39365234374999,-64.609375],[-60.55595703124999,-64.67656250000002],[-60.65996093749999,-64.72919921875001],[-60.91538085937499,-64.9068359375],[-61.05986328124999,-64.98125],[-61.33183593749999,-65.02382812500002],[-61.439453125,-65.01767578125],[-61.50302734374999,-64.99970703125001],[-61.60322265625,-64.98779296875],[-61.703125,-64.98720703125002],[-61.73618164062499,-65.03349609375002],[-61.57744140624999,-65.18564453125],[-61.66342773437499,-65.23857421875002],[-61.855615234374994,-65.2353515625],[-61.94785156249999,-65.19228515625002],[-62.02451171874999,-65.23251953125],[-62.08466796875,-65.27324218750002],[-62.14531249999999,-65.33173828125001],[-62.053662109375,-65.45683593750002],[-61.90336914062499,-65.51347656250002],[-61.79570312499999,-65.52294921875],[-61.756005859374994,-65.56923828125002],[-61.99140625,-65.58916015625002],[-62.1505859375,-65.698828125],[-62.222412109375,-65.775],[-62.30502929687499,-65.8404296875],[-62.29326171874999,-65.91640625000002],[-62.169140625,-66.03134765625],[-62.005029296874994,-66.112890625],[-61.8390625,-66.11953125000002],[-61.62480468749999,-66.0947265625],[-61.57470703125,-66.07148437500001],[-61.359130859375,-66.05878906250001],[-61.26611328125,-65.97998046875],[-61.198144531249994,-65.97451171875002],[-61.137597656249994,-65.98867187500002],[-61.0392578125,-65.99199218750002],[-60.98813476562499,-65.94023437500002],[-60.91279296875,-65.9208984375],[-60.81298828125,-65.93408203125],[-60.618310546874994,-65.93310546875],[-60.565380859375,-65.97939453125002],[-60.624902343749994,-66.03232421875],[-60.74399414062499,-66.105078125],[-60.8564453125,-66.06533203125002],[-60.95566406249999,-66.07197265625001],[-61.00927734375,-66.11054687500001],[-60.902734375,-66.191015625],[-60.94243164062499,-66.26376953125],[-61.02841796874999,-66.3365234375],[-61.13427734375,-66.29023437500001],[-61.14975585937499,-66.21171875000002],[-61.29296875,-66.16455078125],[-61.43193359374999,-66.14472656250001],[-61.526123046875,-66.22568359375],[-61.67563476562499,-66.24951171875],[-61.696484375,-66.34316406250002],[-61.756005859374994,-66.42919921875],[-61.8419921875,-66.40273437500002],[-61.875439453125,-66.29609375000001],[-62.11650390624999,-66.208984375],[-62.24125976562499,-66.19707031250002],[-62.494140625,-66.2193359375],[-62.58281249999999,-66.21748046875001],[-62.68203125,-66.2373046875],[-62.754833984375,-66.31015625],[-62.650292968749994,-66.36367187500002],[-62.615380859374994,-66.43574218750001],[-62.617919921875,-66.48964843750002],[-62.63754882812499,-66.51113281250002],[-62.65507812499999,-66.55605468750002],[-62.5431640625,-66.62099609375002],[-62.536523437499994,-66.70703125],[-62.62890625,-66.70615234375],[-62.70478515625,-66.68007812500002],[-62.996728515624994,-66.45283203125001],[-63.17954101562499,-66.3525390625],[-63.25751953125,-66.26376953125],[-63.44853515624999,-66.24375],[-63.58662109375,-66.24169921875],[-63.75253906249999,-66.27773437500002],[-63.68754882812499,-66.31982421875],[-63.65439453124999,-66.38291015625],[-63.75566406249999,-66.40898437500002],[-63.88041992187499,-66.50595703125],[-63.96435546875,-66.58876953125002],[-64.0150390625,-66.60664062500001],[-64.077734375,-66.65410156250002],[-63.8087890625,-66.76093750000001],[-63.76904296875,-66.80322265625],[-63.75473632812499,-66.87294921875002],[-63.839599609375,-66.91201171875002],[-64.042578125,-66.92724609375],[-64.40097656249999,-66.85332031250002],[-64.55400390624999,-66.85175781250001],[-64.60693359375,-66.79960937500002],[-64.686279296875,-66.80625],[-64.73544921874999,-66.894140625],[-64.793359375,-66.97197265625002],[-64.878125,-67.02451171875],[-64.85410156249999,-67.10478515625002],[-64.78549804687499,-67.12373046875001],[-64.83872070312499,-67.15605468750002],[-64.95087890625,-67.183203125],[-65.02690429687499,-67.21406250000001],[-64.85825195312499,-67.2427734375],[-64.82646484374999,-67.269140625],[-64.819287109375,-67.30732421875001],[-65.07958984375,-67.33535156250002],[-65.24853515625,-67.34199218750001],[-65.35009765625,-67.31093750000002],[-65.443115234375,-67.326171875],[-65.503125,-67.37724609375002],[-65.5234375,-67.44462890625002],[-65.50390625,-67.52822265625002],[-65.47080078124999,-67.587890625],[-65.44677734375,-67.61015625000002],[-65.41806640624999,-67.65957031250002],[-65.57402343749999,-67.78837890625002],[-65.5892578125,-67.81630859375002],[-65.600048828125,-67.87568359375001],[-65.52783203125,-67.92998046875002],[-65.46943359375,-68.00947265625001],[-65.551171875,-68.04833984375],[-65.63950195312499,-68.13056640625001],[-65.54624023437499,-68.14667968750001],[-65.3875,-68.150390625],[-65.218017578125,-68.14003906250002],[-64.95883789062499,-68.06757812500001],[-64.884716796875,-68.05634765625001],[-64.853466796875,-68.08310546875],[-64.8294921875,-68.12744140625],[-64.895947265625,-68.16835937500002],[-65.365185546875,-68.2875],[-65.45200195312499,-68.33671875000002],[-65.33139648437499,-68.36416015625002],[-65.08974609375,-68.37021484375],[-64.996484375,-68.4078125],[-65.05454101562499,-68.44931640625],[-65.140087890625,-68.4892578125],[-65.2416015625,-68.58320312500001],[-65.158349609375,-68.61796875000002],[-64.89829101562499,-68.67333984375],[-64.42890625,-68.74609375],[-64.07846679687499,-68.77119140625001],[-64.15683593749999,-68.68691406250002],[-64.16923828124999,-68.58251953125],[-63.924462890624994,-68.49765625],[-63.796484375,-68.4697265625],[-63.21660156249999,-68.41884765625002],[-63.056542968749994,-68.42070312500002],[-62.93330078125,-68.44257812500001],[-62.9796875,-68.486328125],[-63.11474609375,-68.47060546875002],[-63.34750976562499,-68.49941406250002],[-63.70732421874999,-68.59218750000002],[-63.7734375,-68.6318359375],[-63.747021484375,-68.70458984375],[-63.44272460937499,-68.76416015625],[-63.343505859375,-68.81044921875002],[-63.47822265625,-68.951171875],[-63.455957031249994,-69.04189453125002],[-63.30146484375,-69.14101562500002],[-63.094384765624994,-69.25302734375],[-62.994091796875,-69.32890625000002],[-62.839746093749994,-69.371875],[-62.586816406249994,-69.47724609375001],[-62.45053710937499,-69.584375],[-62.407128906249994,-69.82724609375],[-62.20244140624999,-70.0279296875],[-61.961083984374994,-70.1201171875],[-61.93461914062499,-70.19951171875002],[-62.01396484374999,-70.27890625],[-62.21787109374999,-70.23320312500002],[-62.331494140625,-70.27890625],[-62.37778320312499,-70.36484375],[-62.23227539062499,-70.4244140625],[-62.00078124999999,-70.49716796875],[-61.50468749999999,-70.49052734375002],[-61.49140625,-70.569921875],[-61.60532226562499,-70.61669921875],[-61.696484375,-70.67578125],[-61.80893554687499,-70.70878906250002],[-61.994140625,-70.72861328125],[-62.040429687499994,-70.8013671875],[-61.961083984374994,-70.90058593750001],[-61.7021484375,-70.85673828125002],[-61.51337890625,-70.851171875],[-61.31284179687499,-70.86757812500002],[-61.25166015625,-71.00224609375002],[-61.017236328124994,-71.16689453125002],[-60.96225585937499,-71.24462890625],[-61.003076171874994,-71.3193359375],[-61.1484375,-71.34189453125],[-61.2373046875,-71.40058593750001],[-61.369287109374994,-71.45234375000001],[-61.51591796874999,-71.4791015625],[-61.78955078125,-71.61601562500002],[-61.909570312499994,-71.630859375],[-61.95878906249999,-71.6578125],[-61.72543945312499,-71.67255859375001],[-61.56279296874999,-71.67529296875],[-61.21357421875,-71.5640625],[-61.08134765624999,-71.58857421875001],[-60.9953125,-71.66132812500001],[-60.94902343749999,-71.74726562500001],[-61.035058593749994,-71.82001953125001],[-61.64453125,-71.862890625],[-61.938916015625,-71.90361328125002],[-62.25664062499999,-72.017578125],[-61.89404296875,-72.07099609375001],[-61.62802734374999,-72.052734375],[-61.49267578125,-72.07265625000002],[-61.31025390625,-72.11269531250002],[-61.10747070312499,-72.09150390625001],[-60.95175781249999,-72.05019531250002],[-60.833203125,-72.05156250000002],[-60.71943359375,-72.07265625000002],[-60.704296875,-72.144140625],[-60.691064453124994,-72.26982421875002],[-60.66459960937499,-72.3625],[-60.73032226562499,-72.42597656250001],[-61.047509765624994,-72.47050781250002],[-61.27978515625,-72.46826171875],[-61.2861328125,-72.60078125000001],[-60.93916015625,-72.69970703125],[-60.72412109375,-72.646875],[-60.53232421874999,-72.67333984375],[-60.53232421874999,-72.83212890625],[-60.384667968749994,-73.00732421875],[-60.25449218749999,-73.01728515625001],[-60.148681640625,-72.93789062500002],[-60.009765625,-72.93789062500002],[-59.95683593749999,-73.03056640625002],[-60.01640624999999,-73.18925781250002],[-60.122216796874994,-73.27529296875002],[-60.403759765625,-73.240234375],[-60.560693359374994,-73.21142578125],[-60.68662109374999,-73.27099609375],[-60.89584960937499,-73.32041015625],[-61.08134765624999,-73.32822265625],[-61.242089843749994,-73.25029296875002],[-61.42841796875,-73.19140625],[-61.72641601562499,-73.1607421875],[-62.00830078125,-73.14765625000001],[-61.91474609375,-73.21572265625002],[-61.78759765625,-73.2548828125],[-61.737695312499994,-73.37548828125],[-61.636962890625,-73.50019531250001],[-61.40546875,-73.46708984375002],[-61.07978515625,-73.538671875],[-60.878857421875,-73.61201171875001],[-60.790283203125,-73.71181640625002],[-60.902734375,-73.87060546875],[-61.08828125,-73.92949218750002],[-61.20341796874999,-73.956640625],[-61.404052734375,-73.89599609375],[-61.54541015625,-73.89599609375],[-61.69169921874999,-73.923828125],[-61.741601562499994,-73.99619140625],[-61.83823242187499,-74.03203125000002],[-61.31943359374999,-74.03593750000002],[-61.16069335937499,-74.05576171875],[-61.041650390624994,-74.12197265625002],[-61.22685546874999,-74.20791015625002],[-61.57080078125,-74.19472656250002],[-61.71826171875,-74.228125],[-61.8427734375,-74.2896484375],[-61.331787109375,-74.32861328125],[-61.12060546875,-74.30693359375002],[-60.78369140625,-74.24101562500002],[-60.704296875,-74.30712890625],[-60.83847656249999,-74.37294921875002],[-61.01079101562499,-74.47832031250002],[-61.37016601562499,-74.51181640625],[-61.63999023437499,-74.51357421875002],[-61.99453125,-74.47578125000001],[-62.0888671875,-74.45283203125001],[-62.235302734375,-74.44130859375002],[-62.22568359374999,-74.50556640625001],[-62.132714843749994,-74.55],[-61.894433593749994,-74.71308593750001],[-61.855224609375,-74.77675781250002],[-61.92802734374999,-74.86279296875],[-62.13779296874999,-74.9263671875],[-62.372460937499994,-74.9521484375],[-62.566796875,-74.89580078125002],[-62.70849609375,-74.73710937500002],[-62.887109375,-74.69082031250002],[-63.07231445312499,-74.67753906250002],[-63.178125,-74.6841796875],[-63.167919921875,-74.76455078125002],[-63.125244140625,-74.84951171875002],[-63.197998046875,-74.90908203125002],[-63.35703125,-74.87832031250002],[-63.5587890625,-74.90566406250002],[-63.750878906249994,-74.95234375000001],[-63.924707031249994,-75.0044921875],[-63.57099609375,-75.0302734375],[-63.3369140625,-75.034765625],[-63.17319335937499,-75.11474609375],[-63.23105468749999,-75.15380859375],[-63.551416015624994,-75.171484375],[-63.85751953124999,-75.20615234375],[-64.279541015625,-75.29287109375002],[-63.97246093749999,-75.32939453125002],[-63.67841796875,-75.32792968750002],[-63.474853515625,-75.33632812500002],[-63.30380859374999,-75.35224609375001],[-63.25751953125,-75.39853515625],[-63.36337890624999,-75.45146484375002],[-64.05263671875,-75.57958984375],[-64.778271484375,-75.73818359375002],[-65.044384765625,-75.7875],[-65.321728515625,-75.81513671875001],[-65.96567382812499,-75.95166015625],[-66.37041015624999,-76.01337890625001],[-67.518212890625,-76.10976562500002],[-69.30439453125,-76.35078125000001],[-69.915283203125,-76.52197265625],[-70.09550781249999,-76.65449218750001],[-70.21015625,-76.67412109375002],[-70.55078125,-76.71806640625002],[-70.89501953125,-76.73935546875],[-71.79868164062499,-76.75273437500002],[-72.722314453125,-76.6890625],[-73.47177734374999,-76.67548828125001],[-73.87978515625,-76.69677734375],[-75.26835937499999,-76.58144531250002],[-75.443505859375,-76.58671875000002],[-75.65927734374999,-76.60820312500002],[-75.83134765624999,-76.60820312500002],[-75.962841796875,-76.59208984375002],[-76.24418945312499,-76.58535156250002],[-77.19003906249999,-76.62978515625002],[-77.287060546875,-76.70166015625],[-77.16796875,-76.83388671875002],[-76.82358398437499,-76.99345703125002],[-76.24858398437499,-77.27490234375],[-75.937255859375,-77.33447265625],[-75.74814453124999,-77.3984375],[-75.3869140625,-77.47421875],[-74.58061523437499,-77.47802734375],[-73.47822265625,-77.53554687500002],[-72.851953125,-77.59023437500002],[-72.875146484375,-77.69384765625],[-73.2515625,-77.89423828125001],[-73.485009765625,-77.97080078125],[-74.042138671875,-78.109375],[-74.81206054687499,-78.17783203125],[-75.3984375,-78.1578125],[-76.43784179687499,-78.04414062500001],[-77.742138671875,-77.94033203125002],[-79.67900390624999,-77.84257812500002],[-80.10410156249999,-77.79658203125001],[-80.6015625,-77.751953125],[-80.88852539062499,-77.79765625000002],[-81.103125,-77.841796875],[-81.58095703125,-77.84609375000002],[-81.441015625,-77.88564453125002],[-79.50966796875,-78.154296875],[-77.85810546875,-78.35097656250002],[-77.664794921875,-78.40146484375],[-77.432568359375,-78.43466796875],[-77.45244140624999,-78.56035156250002],[-77.54501953124999,-78.65957031250002],[-77.869140625,-78.74550781250002],[-78.71162109375,-78.75205078125],[-79.766552734375,-78.82070312500002],[-80.29228515624999,-78.82275390625],[-80.81630859375,-78.75429687500002],[-81.929296875,-78.55908203125],[-82.60844726562499,-78.41240234375002],[-83.08251953125,-78.2466796875],[-83.412060546875,-78.11464843750002],[-83.77900390625,-77.98359375000001],[-83.752099609375,-78.06630859375002],[-83.687744140625,-78.148046875],[-83.508251953125,-78.248046875],[-83.24589843749999,-78.35703125],[-83.226953125,-78.40156250000001],[-83.35498046875,-78.40761718750002],[-83.54443359375,-78.35527343750002],[-83.70590820312499,-78.40410156250002],[-83.76274414062499,-78.46113281250001],[-83.69663085937499,-78.53730468750001],[-83.595166015625,-78.61103515625001],[-83.260009765625,-78.77421875000002],[-82.97075195312499,-78.81669921875002],[-82.58920898437499,-78.91630859375002],[-81.660888671875,-79.09980468750001],[-81.5029296875,-79.16289062500002],[-81.22216796875,-79.2978515625],[-81.16318359374999,-79.400390625],[-80.8919921875,-79.50185546875002],[-80.70478515625,-79.5171875],[-80.534814453125,-79.51279296875],[-80.478759765625,-79.42617187500002],[-80.488525390625,-79.32099609375001],[-80.415771484375,-79.29453125],[-80.15117187499999,-79.26806640625],[-79.45566406249999,-79.30439453125001],[-76.49912109374999,-79.32568359375],[-76.21767578125,-79.38720703125],[-76.105126953125,-79.46513671875002],[-76.03159179687499,-79.62705078125],[-76.3439453125,-79.8208984375],[-76.557861328125,-79.90351562500001],[-76.90400390625,-79.95527343750001],[-77.222265625,-79.994140625],[-77.70185546875,-80.00957031250002],[-78.69223632812499,-79.99541015625002],[-79.660400390625,-79.996875],[-78.90712890625,-80.08964843750002],[-78.17607421874999,-80.16679687500002],[-77.16044921874999,-80.1529296875],[-76.75712890624999,-80.13125],[-76.40732421874999,-80.09492187500001],[-76.25961914062499,-80.16005859375002],[-75.98564453124999,-80.29501953125],[-75.822412109375,-80.33818359375002],[-75.70903320312499,-80.38271484375002],[-75.55502929687499,-80.530859375],[-75.49453125,-80.61748046875002],[-75.34458007812499,-80.71894531250001],[-75.2365234375,-80.80263671875002],[-75.0755859375,-80.86005859375001],[-74.806591796875,-80.88652343750002],[-74.5111328125,-80.83798828125],[-73.93784179687499,-80.81591796875],[-73.38334960937499,-80.89365234375],[-73.0294921875,-80.91728515625002],[-72.55322265625,-80.853125],[-72.173583984375,-80.76386718750001],[-71.380029296875,-80.6822265625],[-71.2306640625,-80.64677734375002],[-71.01767578124999,-80.61904296875002],[-70.687890625,-80.62626953125002],[-70.56005859375,-80.64658203125],[-70.39243164062499,-80.73544921875],[-70.23911132812499,-80.85664062500001],[-70.012451171875,-80.91777343750002],[-69.77226562499999,-80.9615234375],[-69.633984375,-80.9658203125],[-69.181591796875,-81.0048828125],[-68.58984375,-80.96796875000001],[-68.3265625,-81.00410156250001],[-68.284619140625,-81.073828125],[-68.14375,-81.13037109375],[-67.96542968749999,-81.14824218750002],[-65.573681640625,-81.460546875],[-64.750146484375,-81.52167968750001],[-63.477734375,-81.55322265625],[-62.490234375,-81.55673828125],[-62.3537109375,-81.57666015625],[-62.16538085937499,-81.63613281250002],[-62.54184570312499,-81.6783203125],[-62.94589843749999,-81.68398437500002],[-63.553955078125,-81.66718750000001],[-63.76865234374999,-81.67607421875002],[-64.232666015625,-81.659765625],[-64.47568359374999,-81.67167968750002],[-64.69609374999999,-81.65234375],[-65.02158203124999,-81.69648437500001],[-65.61972656249999,-81.72929687500002],[-65.48662109374999,-81.775],[-65.26376953124999,-81.78564453125],[-64.810546875,-81.802734375],[-64.190185546875,-81.79482421875002],[-64.137109375,-81.86933593750001],[-64.70615234374999,-81.8875],[-65.9162109375,-81.90224609375002],[-66.04228515624999,-81.91386718750002],[-66.13383789062499,-81.95341796875002],[-65.95302734375,-81.97099609375002],[-65.84384765624999,-81.99326171875],[-65.78662109375,-82.0455078125],[-65.91318359374999,-82.183203125],[-65.71396484374999,-82.27919921875002],[-65.571923828125,-82.29433593750002],[-65.42441406249999,-82.28037109375],[-65.1701171875,-82.31826171875002],[-64.919580078125,-82.37050781250002],[-64.39658203124999,-82.37441406250002],[-63.772851562499994,-82.304296875],[-63.46630859375,-82.30683593750001],[-62.64531249999999,-82.26308593750002],[-61.90166015624999,-82.27109375],[-60.85908203125,-82.18671875000001],[-60.687109375,-82.18857421875],[-60.527734375,-82.19990234375001],[-60.81718749999999,-82.27578125000002],[-62.09453124999999,-82.46660156250002],[-62.55302734374999,-82.50332031250002],[-62.73564453124999,-82.52734375],[-62.63090820312499,-82.620703125],[-62.465576171875,-82.71816406250002],[-62.12861328125,-82.82236328125],[-61.9169921875,-82.97666015625],[-61.708935546875,-83.00996093750001],[-61.31284179687499,-82.93916015625001],[-61.218408203124994,-82.991796875],[-61.200390625,-83.09794921875002],[-61.30322265625,-83.1841796875],[-61.43632812499999,-83.232421875],[-61.53056640624999,-83.27939453125],[-61.58984375,-83.34121093750002],[-61.42529296875,-83.39560546875],[-60.98320312499999,-83.42753906250002],[-60.39702148437499,-83.44072265625002],[-59.85380859374999,-83.4423828125],[-59.516015625,-83.45839843750002],[-58.289941406249994,-83.120703125],[-57.797753906249994,-82.95859375],[-57.55712890625,-82.890234375],[-57.35361328124999,-82.84023437500002],[-56.31787109375,-82.6333984375],[-56.07504882812499,-82.57021484375002],[-55.800683593749994,-82.47841796875002],[-55.294677734375,-82.46484375],[-54.60112304687499,-82.31621093750002],[-53.986083984375,-82.20058593750002],[-53.73959960937499,-82.17841796875001],[-53.557568359375,-82.16943359375],[-53.3390625,-82.14453125],[-52.79887695312499,-82.15361328125002],[-52.414941406249994,-82.13486328125],[-51.73066406249998,-82.0615234375],[-51.20966796874998,-82.015234375],[-50.65302734374998,-81.97548828125002],[-50.02924804687498,-81.96767578125002],[-48.36079101562498,-81.89228515625001],[-47.886816406250006,-81.92519531250002],[-47.360253906249994,-82.00400390625],[-47.019873046875006,-82.00322265625002],[-46.56669921874999,-81.97919921875001],[-46.258056640625,-81.94697265625001],[-46.119140625,-82.03955078125],[-46.04638671875,-82.15869140625],[-46.19853515624999,-82.27109375],[-46.448339843750006,-82.33984375],[-46.516748046874994,-82.45458984375],[-46.17529296875,-82.51162109375002],[-45.78857421875,-82.49492187500002],[-45.04375,-82.43798828125],[-44.45488281249999,-82.36591796875001],[-44.29179687499999,-82.31777343750002],[-44.064208984375,-82.33144531250002],[-43.669335937499994,-82.2701171875],[-43.18037109374998,-82.0171875],[-42.564550781250006,-81.76162109375002],[-42.046289062499994,-81.59785156250001],[-41.711572265624994,-81.40771484375],[-41.433837890625,-81.29775390625002],[-41.125878906249994,-81.21484375],[-40.91455078125,-81.17236328125],[-40.440820312499994,-81.16513671875],[-39.762304687500006,-81.03203125000002],[-38.771728515625,-80.88232421875],[-38.01093749999998,-80.95429687500001],[-37.20927734374999,-81.06386718750002],[-36.812402343749994,-80.97470703125],[-36.49951171875,-80.9595703125],[-36.233984375,-80.9205078125],[-35.96577148437498,-80.89091796875002],[-35.77587890625,-80.81269531250001],[-35.52055664062499,-80.745703125],[-35.327001953125006,-80.65068359375002],[-34.349951171875006,-80.60341796875002],[-33.328710937500006,-80.54042968750002],[-33.191308593749994,-80.51865234375],[-33.057226562500006,-80.53164062500002],[-32.706201171874994,-80.51386718750001],[-32.255712890625006,-80.46074218750002],[-31.634228515624983,-80.44462890625002],[-31.312109375,-80.45009765625002],[-31.01542968749999,-80.30810546875],[-30.42529296875,-80.27968750000002],[-29.79736328125,-80.22333984375001],[-29.531494140625,-80.18183593750001],[-29.3291015625,-80.17207031250001],[-24.24028320312499,-80.06191406250002],[-24.01982421874999,-80.00898437500001],[-23.574462890625,-79.96484375],[-23.406835937499977,-79.858984375],[-24.08828125,-79.81484375000002],[-24.29985351562499,-79.77080078125002],[-24.533886718749983,-79.75791015625],[-24.67041015625,-79.77460937500001],[-25.258642578124977,-79.7625],[-29.949316406250006,-79.59902343750002],[-30.049072265625,-79.58535156250002],[-30.21123046874999,-79.48525390625002],[-30.177929687499983,-79.304296875],[-30.31591796875,-79.1630859375],[-30.645263671875,-79.12412109375],[-30.98515624999999,-79.1279296875],[-31.412792968749983,-79.14521484375001],[-32.541845703125006,-79.22216796875],[-32.994238281250006,-79.22880859375002],[-34.197363281250006,-79.11025390625002],[-34.99492187499999,-78.9775390625],[-35.515966796875006,-78.93300781250002],[-35.89008789062498,-78.84355468750002],[-36.239160156249994,-78.77421875000002],[-36.265625,-78.61552734375002],[-36.18085937499998,-78.468359375],[-35.50927734375,-78.04121093750001],[-35.08759765624998,-77.83710937500001],[-34.808349609375,-77.82060546875002],[-34.55146484374998,-77.728515625],[-34.290185546874994,-77.521875],[-34.07578125,-77.425390625],[-33.591162109375006,-77.31123046875001],[-33.37675781249999,-77.28164062500002],[-32.61406249999999,-77.14082031250001],[-32.4052734375,-77.13623046875],[-32.063378906249994,-77.15986328125001],[-31.67578125,-77.03310546875002],[-30.489208984374983,-76.7623046875],[-30.22197265624999,-76.66035156250001],[-29.891552734374983,-76.59794921875002],[-28.93364257812499,-76.37031250000001],[-28.07939453124999,-76.2578125],[-27.653076171875,-76.22636718750002],[-27.134521484375,-76.15732421875],[-26.56005859375,-76.0546875],[-26.059326171875,-75.95722656250001],[-24.26958007812499,-75.76699218750002],[-23.197265625,-75.71767578125002],[-22.465478515624994,-75.66103515625002],[-21.948095703124977,-75.69414062500002],[-21.433789062499983,-75.68310546875],[-20.989013671875,-75.634375],[-20.783300781249977,-75.59394531250001],[-20.4875,-75.49199218750002],[-19.493017578124977,-75.53994140625002],[-18.850927734374977,-75.47021484375],[-18.585156249999983,-75.46259765625001],[-18.304589843749994,-75.43134765625001],[-18.415136718749977,-75.396484375],[-18.516943359374977,-75.38994140625002],[-18.617285156249977,-75.3423828125],[-18.749218749999983,-75.24208984375002],[-18.617285156249977,-75.11533203125],[-18.516943359374977,-75.05195312500001],[-18.22119140625,-74.97451171875002],[-18.068261718749994,-74.86298828125001],[-17.922753906249994,-74.69921875],[-17.43583984374999,-74.37910156250001],[-17.299023437499983,-74.33388671875002],[-16.9892578125,-74.31982421875],[-16.72709960937499,-74.32763671875],[-16.429541015624977,-74.32392578125001],[-15.672509765624994,-74.40732421875],[-15.53125,-74.3755859375],[-15.289746093749983,-74.280859375],[-15.089160156249989,-74.16328125000001],[-14.658935546875,-73.9888671875],[-14.573828124999977,-73.9375],[-14.611425781249977,-73.85175781250001],[-15.259619140624977,-73.88886718750001],[-15.748828124999989,-73.94560546875002],[-16.220117187499994,-73.91572265625001],[-16.281884765624994,-73.86699218750002],[-16.180859374999983,-73.83027343750001],[-16.00312,-73.81591796875],[-15.935644531249977,-73.75761718750002],[-16.09746093749999,-73.70908203125],[-16.38774414062499,-73.68134765625001],[-16.51884765624999,-73.64404296875],[-16.507031249999983,-73.55595703125002],[-16.435205078124994,-73.42568359375002],[-16.27910156249999,-73.38847656250002],[-16.149023437499977,-73.33447265625],[-15.802832031249977,-73.15214843750002],[-15.595996093749989,-73.09677734375],[-15.007031249999983,-73.0474609375],[-14.320996093749983,-73.123046875],[-14.164697265624994,-73.10244140625002],[-14.000097656249977,-73.0005859375],[-14.168310546874977,-72.84326171875],[-14.298242187499994,-72.78457031250002],[-14.297753906249994,-72.7330078125],[-13.93896484375,-72.75625],[-13.602832031249989,-72.79208984375],[-13.208593749999977,-72.78505859375002],[-12.746923828124977,-72.62890625],[-12.0947265625,-72.49814453125],[-11.77734375,-72.44404296875001],[-11.496972656249994,-72.41289062500002],[-11.346484374999989,-72.28164062500002],[-11.121386718749989,-72.03154296875002],[-10.958105468749977,-71.901953125],[-10.961035156249977,-71.82236328125],[-11.009228515624983,-71.75791015625],[-11.179345703124994,-71.77685546875],[-11.333056640624989,-71.78554687500002],[-11.69687,-71.7193359375],[-12.148193359375,-71.61367187500002],[-12.284521484374977,-71.4951171875],[-12.351318359375,-71.38974609375],[-12.207812499999989,-71.33222656250001],[-12.073681640624983,-71.296875],[-11.926123046874977,-71.288671875],[-11.663037109374983,-71.33125],[-11.328076171874983,-71.43974609375002],[-11.16015625,-71.48115234375001],[-10.969824218749977,-71.56005859375],[-10.825439453125,-71.5533203125],[-10.659472656249989,-71.44267578125002],[-10.520068359374989,-71.2955078125],[-10.406640625,-71.25029296875002],[-10.230566406249977,-71.20097656250002],[-10.033496093749989,-71.13066406250002],[-10.122314453125,-71.06093750000002],[-10.331005859374983,-71.0240234375],[-10.359960937499977,-70.982421875],[-10.270605468749977,-70.93574218750001],[-10.098730468749977,-70.9263671875],[-9.887988281249989,-71.02734375],[-9.599365234375,-71.0953125],[-9.40234375,-71.11757812500002],[-9.230664062499983,-71.17402343750001],[-8.965917968749977,-71.361328125],[-8.646484375,-71.67275390625002],[-8.497705078124994,-71.6748046875],[-8.216455078124994,-71.6470703125],[-7.915820312499989,-71.6353515625],[-7.713720703124977,-71.546484375],[-7.668994140624989,-71.32431640625],[-7.590136718749989,-71.22373046875],[-7.617968749999989,-71.12148437500002],[-7.756884765624989,-71.0171875],[-7.873486328124983,-70.94033203125002],[-7.854931640624983,-70.88457031250002],[-7.752734374999989,-70.8427734375],[-7.619775390624994,-70.82900390625002],[-7.388134765624983,-70.78691406250002],[-7.031591796874977,-70.83515625000001],[-6.838183593749989,-70.84453125000002],[-6.547509765624994,-70.81689453125],[-6.245214843749977,-70.75576171875002],[-5.936328124999989,-70.71269531250002],[-5.694726562499994,-70.74531250000001],[-5.587890625,-70.85673828125002],[-5.708691406249983,-70.96826171875],[-5.90380859375,-71.05185546875],[-6.080273437499983,-71.15410156250002],[-6.126757812499989,-71.265625],[-6.117480468749989,-71.32597656250002],[-5.950048828124977,-71.34160156250002],[-4.450146484374983,-71.327734375],[-4.253222656249989,-71.3384765625],[-3.994824218749983,-71.3388671875],[-3.713183593749989,-71.374609375],[-3.239648437499994,-71.36044921875],[-2.81201171875,-71.32099609375001],[-2.610253906249994,-71.32080078125],[-2.261328124999977,-71.35712890625001],[-2.014599609374983,-71.43339843750002],[-1.500634765624994,-71.41230468750001],[-1.354248046875,-71.38681640625],[-1.216357421874989,-71.2841796875],[-1.067773437499994,-71.265625],[-0.895849609374977,-71.34921875],[-0.840087890625,-71.53974609375001],[-0.759863281249977,-71.63027343750002],[-0.543164062499983,-71.71269531250002],[-0.326953124999989,-71.64189453125002],[-0.1845703125,-71.55888671875002],[0.154199218750023,-71.39794921875],[0.538476562500023,-71.27421875000002],[0.8349609375,-71.20234375000001],[1.55224609375,-71.08027343750001],[1.90869140625,-71.00361328125001],[2.609472656250006,-70.90009765625001],[3.506933593750006,-70.84443359375001],[5.113085937500017,-70.65566406250002],[5.643945312500023,-70.636328125],[6.508007812500011,-70.58642578125],[6.950976562500017,-70.53525390625],[7.401171875000017,-70.49443359375002],[7.6767578125,-70.35634765625002],[8.306738281250006,-70.46162109375001],[8.523046875,-70.47382812500001],[8.817480468750006,-70.39082031250001],[9.1416015625,-70.18369140625],[9.613476562500011,-70.26904296875],[9.885546875000017,-70.4029296875],[10.217675781250023,-70.50791015625],[10.968847656250006,-70.68769531250001],[11.203515625000023,-70.72871093750001],[11.701269531250006,-70.7666015625],[11.83359375,-70.73652343750001],[12.06796875,-70.61650390625002],[12.308789062500011,-70.44326171875002],[12.461621093750011,-70.3701171875],[12.681933593750017,-70.30869140625],[12.929394531250011,-70.21337890625],[12.864550781250017,-70.16230468750001],[12.723437500000017,-70.14365234375],[12.595117187500023,-70.11738281250001],[12.626269531250017,-70.065625],[13.065625,-70.05361328125002],[13.297949218750006,-70.22958984375],[13.532617187500023,-70.2875],[13.822656250000023,-70.34316406250002],[14.491796875,-70.29960937500002],[15.063867187500023,-70.29472656250002],[15.562890625000023,-70.33076171875001],[15.806933593750017,-70.32402343750002],[16.025195312500017,-70.19345703125],[16.38105468750001,-70.1451171875],[16.584863281250023,-70.20380859375001],[16.70917968750001,-70.39726562500002],[17.16669921875001,-70.45087890625001],[18.124609375,-70.54033203125002],[18.23203125,-70.51826171875001],[18.351367187500017,-70.41552734375],[18.4326171875,-70.28994140625002],[18.627343750000023,-70.26943359375002],[18.877246093750017,-70.20136718750001],[19.009375,-70.21210937500001],[19.196386718750006,-70.29316406250001],[19.13232421875,-70.49189453125001],[19.02656250000001,-70.67402343750001],[19.152929687500006,-70.8208984375],[19.26513671875,-70.90234375],[19.409277343750006,-70.9169921875],[19.65185546875,-70.92060546875001],[19.944238281250023,-70.91015625],[20.128125,-70.917578125],[21.07080078125,-70.84345703125001],[21.18603515625,-70.68056640625002],[21.337304687500023,-70.4951171875],[21.704980468750023,-70.25849609375001],[21.848925781250017,-70.27675781250002],[21.962304687500023,-70.300390625],[22.2158203125,-70.41728515625002],[22.366015625000017,-70.47509765625],[22.396484375,-70.56132812500002],[22.233691406250017,-70.64267578125],[22.27783203125,-70.69560546875002],[22.445410156250006,-70.73974609375],[22.97900390625,-70.81035156250002],[23.14990234375,-70.79628906250002],[23.406835937500006,-70.7232421875],[23.664843750000017,-70.575],[23.803613281250023,-70.40458984375002],[24.02412109375001,-70.41337890625002],[24.235742187500023,-70.44863281250002],[24.3857421875,-70.53691406250002],[24.3857421875,-70.70439453125002],[24.58837890625,-70.82041015625],[24.756738281250023,-70.89208984375],[25.187402343750023,-70.97099609375002],[25.650195312500017,-70.990625],[25.97412109375,-71.03740234375002],[26.498828125000017,-71.01953125],[26.75439453125,-70.96728515625],[26.91796875,-70.9537109375],[27.206835937500017,-70.91093750000002],[27.508593750000017,-70.81328125000002],[27.69775390625,-70.7724609375],[28.38642578125001,-70.68203125000002],[28.911523437500023,-70.58310546875],[29.4638671875,-70.40625],[30.003320312500023,-70.3],[30.834082031250006,-70.24628906250001],[31.062890625000023,-70.22470703125],[31.378808593750023,-70.22578125000001],[32.15957031250002,-70.09980468750001],[32.45654296875,-70.0259765625],[32.62128906250001,-70.0005859375],[32.80976562500001,-69.909375],[32.91152343750002,-69.73369140625002],[32.989355468750006,-69.62421875000001],[32.97597656250002,-69.51699218750002],[32.903125,-69.37871093750002],[32.73798828125001,-69.2548828125],[32.56757812500001,-69.07421875],[32.6416015625,-68.86894531250002],[32.77617187500002,-68.78310546875002],[33.12148437500002,-68.68916015625001],[33.465625,-68.67070312500002],[33.853515625,-68.68300781250002],[34.19287109375,-68.70244140625002],[34.219335937500006,-68.790625],[34.07421875,-68.8853515625],[33.884863281250006,-68.97929687500002],[33.772070312500006,-69.02001953125],[33.81367187500001,-69.09931640625001],[34.05859375,-69.11054687500001],[34.59589843750001,-69.09453125000002],[34.74951171875,-69.16767578125001],[35.13134765625,-69.4869140625],[35.22480468750001,-69.6373046875],[35.35703125,-69.68134765625001],[35.56767578125002,-69.66005859375002],[36.01777343750001,-69.66181640625001],[36.331152343750006,-69.63935546875001],[36.5859375,-69.63789062500001],[36.71875,-69.65224609375002],[36.85576171875002,-69.7255859375],[37.11484375,-69.81044921875002],[37.37451171875,-69.74785156250002],[37.55976562500001,-69.718359375],[37.787109375,-69.72568359375],[38.14433593750002,-69.82421875],[38.49941406250002,-70.05615234375],[38.88554687500002,-70.171875],[38.91171875,-70.09785156250001],[38.85927734375002,-70.00605468750001],[39.01875,-69.92421875000002],[39.21132812500002,-69.78593750000002],[39.48701171875001,-69.6080078125],[39.705078125,-69.42558593750002],[39.762304687500006,-69.17333984375],[39.863867187500006,-68.96699218750001],[40.04169921875001,-68.8677734375],[40.215625,-68.80488281250001],[40.48388671875,-68.7388671875],[40.81708984375001,-68.7236328125],[41.13271484375002,-68.57509765625002],[41.35634765625002,-68.51494140625002],[41.82460937500002,-68.4326171875],[42.408789062500006,-68.35185546875002],[42.81953125000001,-68.12324218750001],[42.9609375,-68.0953125],[43.1708984375,-68.05976562500001],[43.55410156250002,-68.04560546875001],[44.17753906250002,-67.97246093750002],[44.37285156250002,-67.96132812500002],[44.699804687500006,-67.904296875],[44.98955078125002,-67.76923828125001],[45.19697265625001,-67.73115234375001],[45.5693359375,-67.73642578125],[45.8876953125,-67.659765625],[46.15390625,-67.65703125000002],[46.399023437500006,-67.61757812500002],[46.4365234375,-67.53339843750001],[46.31972656250002,-67.4765625],[46.31728515625002,-67.401953125],[46.4541015625,-67.30361328125002],[46.559667968750006,-67.2681640625],[46.883886718750006,-67.27480468750002],[47.154394531250006,-67.35722656250002],[47.3515625,-67.3619140625],[47.402929687500006,-67.4091796875],[47.23134765625002,-67.46826171875],[47.1171875,-67.57265625000002],[47.31416015625001,-67.66494140625002],[47.48984375,-67.72792968750002],[47.70351562500002,-67.71621093750002],[47.95859375,-67.66005859375002],[48.2099609375,-67.69931640625],[48.32167968750002,-67.78525390625],[48.32167968750002,-67.91748046875],[48.37451171875,-67.98808593750002],[48.55097656250001,-67.9263671875],[48.648046875,-67.79404296875],[48.62001953125002,-67.62519531250001],[48.63037109375,-67.52060546875],[49.05292968750001,-67.35244140625002],[49.219335937500006,-67.22685546875002],[48.92304687500001,-67.19970703125],[48.71367187500002,-67.21689453125],[48.59843750000002,-67.17128906250002],[48.46523437500002,-67.04345703125],[48.83027343750001,-66.93828125000002],[49.2470703125,-66.94160156250001],[49.48867187500002,-67.03095703125001],[50.00615234375002,-67.17519531250002],[50.29296875,-67.17216796875002],[50.55302734375002,-67.1943359375],[50.60595703125,-67.15019531250002],[50.508886718750006,-66.93857421875],[50.52089843750002,-66.82001953125001],[50.30605468750002,-66.75332031250002],[50.24433593750001,-66.60341796875002],[50.33242187500002,-66.44462890625002],[50.58828125000002,-66.3564453125],[50.93691406250002,-66.3154296875],[51.6875,-66.07216796875002],[51.88457031250002,-66.02001953125],[52.37822265625002,-65.96914062500002],[52.95527343750001,-65.94550781250001],[53.67177734375002,-65.85869140625002],[54.947851562500006,-65.91630859375002],[55.29042968750002,-65.95419921875],[55.504492187500006,-66.00263671875001],[55.71035156250002,-66.07998046875002],[55.97402343750002,-66.209375],[56.36152343750001,-66.37275390625001],[56.859375,-66.4234375],[57.00029296875002,-66.47480468750001],[57.18544921875002,-66.61328125],[56.98652343750001,-66.70439453125002],[56.82363281250002,-66.71269531250002],[56.51005859375002,-66.65927734375],[56.29453125,-66.60341796875002],[56.14589843750002,-66.62607421875],[56.29189453125002,-66.72109375000002],[56.453222656250006,-66.77978515625],[56.47968750000001,-66.85917968750002],[56.39140625000002,-66.97382812500001],[55.802734375,-67.19931640625],[56.154882812500006,-67.26455078125002],[56.36591796875001,-67.2125],[56.562109375,-67.11591796875001],[56.76005859375002,-67.07333984375],[56.8916015625,-67.05625],[57.36113281250002,-67.05263671875002],[57.62744140625,-67.01406250000002],[57.828125,-67.04130859375002],[58.02675781250002,-67.10341796875002],[58.317480468750006,-67.1630859375],[58.737402343750006,-67.22958984375],[59.25078125000002,-67.4849609375],[59.65019531250002,-67.45859375],[59.86757812500002,-67.403125],[60.48203125,-67.38515625000002],[61.01210937500002,-67.49951171875],[61.30908203125,-67.54023437500001],[62.173925781250006,-67.57548828125002],[62.68789062500002,-67.64755859375],[63.017675781250006,-67.56181640625002],[63.23759765625002,-67.52685546875],[63.69902343750002,-67.50830078125],[63.93125,-67.52607421875001],[64.57363281250002,-67.62041015625002],[65.70751953125,-67.71640625],[66.48837890625,-67.76552734375002],[67.1748046875,-67.76796875000002],[67.50244140625,-67.81015625],[68.09853515625002,-67.8541015625],[68.32792968750002,-67.88955078125002],[68.89951171875,-67.86210937500002],[69.16718750000001,-67.8248046875],[69.41640625000002,-67.74296875000002],[69.5591796875,-67.76318359375],[69.65595703125001,-67.86455078125002],[69.60302734375,-68.041015625],[69.70449218750002,-68.16083984375001],[69.788671875,-68.27949218750001],[69.90742187500001,-68.3794921875],[69.98222656250002,-68.46425781250002],[69.92792968750001,-68.53535156250001],[69.76191406250001,-68.59853515625002],[69.5341796875,-68.7369140625],[69.546875,-68.85664062500001],[69.64560546875,-68.9322265625],[69.53076171875,-69.0240234375],[69.61464843750002,-69.15371093750002],[69.6294921875,-69.23164062500001],[69.5494140625,-69.29375],[69.371875,-69.33144531250002],[69.06494140625,-69.33740234375],[68.90625,-69.37275390625001],[68.87978515625002,-69.4697265625],[68.95917968750001,-69.54023437500001],[69.13554687500002,-69.57792968750002],[69.1884765625,-69.6548828125],[69.16201171875002,-69.76962890625],[69.0826171875,-69.86660156250002],[68.9205078125,-69.91181640625001],[68.74375,-69.92138671875],[68.41523437500001,-69.90214843750002],[68.178125,-69.83730468750002],[68.02714843750002,-69.89443359375002],[67.9169921875,-69.952734375],[67.57539062500001,-70.087890625],[67.4166015625,-70.17714843750002],[67.26796875000002,-70.27314453125001],[67.65898437500002,-70.32597656250002],[67.94082031250002,-70.4228515625],[68.559375,-70.4125],[68.757421875,-70.36992187500002],[69.02089843750002,-70.3251953125],[69.16201171875002,-70.333984375],[69.25019531250001,-70.43105468750002],[69.19667968750002,-70.58525390625002],[69.18837890625002,-70.70458984375],[68.87275390625001,-71.03515625],[68.76796875000002,-71.09072265625002],[68.62373046875001,-71.18144531250002],[68.44755859375002,-71.2515625],[68.310546875,-71.28652343750002],[68.03740234375002,-71.39101562500002],[67.87333984375002,-71.57978515625001],[67.69355468750001,-71.73671875000002],[67.4322265625,-72.0029296875],[67.28105468750002,-72.290625],[67.21484375,-72.46142578125],[67.11337890625,-72.64111328125],[66.89208984375,-72.94863281250002],[66.74648437500002,-72.99980468750002],[66.49765625,-73.12548828125],[66.56914062500002,-73.20917968750001],[66.76474609375,-73.21689453125],[67.003125,-73.23642578125],[67.32207031250002,-73.30029296875],[67.7486328125,-73.16816406250001],[67.97138671875001,-73.08564453125001],[68.01552734375002,-72.91816406250001],[67.97138671875001,-72.7505859375],[68.10683593750002,-72.65068359375002],[68.41982421875002,-72.51503906250002],[69.15703125000002,-72.41865234375001],[69.30947265625002,-72.4087890625],[69.5546875,-72.37451171875],[69.76972656250001,-72.25361328125001],[69.96210937500001,-72.13291015625],[70.29433593750002,-72.05537109375001],[70.5728515625,-71.93095703125002],[70.6162109375,-71.84208984375002],[70.73164062500001,-71.822265625],[71.07880859375001,-71.73671875000002],[71.16787109375002,-71.67158203125001],[71.27675781250002,-71.62392578125002],[71.34921875,-71.51386718750001],[71.37880859375002,-71.3091796875],[71.46484375,-71.15458984375002],[71.63388671875,-70.94921875],[71.77138671875002,-70.80126953125],[71.9048828125,-70.706640625],[72.26259765625002,-70.65673828125],[72.41796875,-70.5986328125],[72.62236328125002,-70.47207031250002],[72.7603515625,-70.39570312500001],[72.74433593750001,-70.23916015625002],[72.82207031250002,-70.09589843750001],[73.04140625000002,-70.00966796875002],[73.3248046875,-69.84892578125002],[73.67607421875002,-69.82578125],[73.94218750000002,-69.7431640625],[74.22675781250001,-69.800390625],[74.57109375000002,-69.87958984375001],[75.14785156250002,-69.85546875],[75.423828125,-69.89306640625],[75.63554687500002,-69.84892578125002],[75.82070312500002,-69.72548828125002],[75.8912109375,-69.57558593750002],[76.11171875000002,-69.48740234375],[76.35976562500002,-69.490234375],[76.77011718750003,-69.33964843750002],[77.19199218750003,-69.20595703125002],[77.54091796875002,-69.1744140625],[77.81748046875003,-69.0689453125],[78.01513671875,-68.89189453125002],[78.228515625,-68.75615234375002],[78.48896484375001,-68.62578125000002],[78.5634765625,-68.39375],[78.72626953125001,-68.27783203125],[79.03515625,-68.175390625],[79.28779296875001,-68.11933593750001],[80.36308593749999,-67.946875],[81.18740234375002,-67.83125],[82.01699218750002,-67.6900390625],[82.27324218749999,-67.69169921875002],[82.60703125000003,-67.61308593750002],[83.15781250000003,-67.61054687500001],[83.30429687500003,-67.60302734375],[83.49365234375,-67.44121093750002],[83.90371093750002,-67.2919921875],[84.16074218750003,-67.244140625],[84.48515624999999,-67.11445312500001],[84.74833984374999,-67.10224609375001],[85.11679687500003,-67.1255859375],[85.42900390624999,-67.16093750000002],[85.71074218749999,-67.16132812500001],[86.11835937500001,-67.05498046875002],[86.75019531250001,-67.037109375],[86.94658203124999,-66.98554687500001],[87.08486328125002,-66.94013671875001],[87.98027343749999,-66.78847656250002],[88.31416015625001,-66.81748046875],[88.78945312500002,-66.7919921875],[89.07656250000002,-66.7994140625],[89.35175781250001,-66.81816406250002],[89.69843750000001,-66.82304687500002],[90.29296875,-66.76962890625],[90.54726562500002,-66.73427734375002],[91.02167968750001,-66.60283203125002],[91.54609375000001,-66.57207031250002],[91.77705078125001,-66.5375],[92.07343750000001,-66.50791015625],[92.31230468749999,-66.55859375],[92.48583984375,-66.60429687500002],[92.59199218750001,-66.61445312500001],[92.73056640625003,-66.62441406250002],[93.07490234375001,-66.57109375000002],[93.35800781250003,-66.58544921875],[93.7216796875,-66.64296875000002],[93.96425781250002,-66.68964843750001],[94.08876953125002,-66.68886718750002],[94.3134765625,-66.64716796875001],[94.58681640625002,-66.5435546875],[94.83984375,-66.50136718750002],[95.083984375,-66.52744140625],[95.24794921875002,-66.57119140625002],[95.541015625,-66.63095703125],[95.99140625000001,-66.62119140625],[96.42373046875002,-66.599609375],[96.78886718749999,-66.55058593750002],[97.1005859375,-66.49941406250002],[97.38847656249999,-66.57861328125],[97.71982421875003,-66.60732421875002],[98.25761718749999,-66.46748046875001],[98.46171874999999,-66.49853515625],[98.603125,-66.534765625],[98.72011718750002,-66.553125],[98.85888671875,-66.67080078125002],[99.3701171875,-66.64824218750002],[99.82431640625003,-66.54863281250002],[100.21171874999999,-66.47392578125002],[100.59121093750002,-66.42519531250002],[100.88906250000002,-66.3580078125],[101.3271484375,-66.10048828125002],[101.32089843750003,-66.02089843750002],[101.38134765625,-65.97304687500002],[101.47441406249999,-65.951171875],[102.17412109374999,-65.95419921875],[102.39218750000003,-65.9326171875],[102.67421875000002,-65.86513671875002],[103.16660156250003,-65.91689453125002],[103.63876953125003,-65.99892578125002],[103.76347656249999,-65.98974609375],[103.951171875,-65.98808593750002],[104.2890625,-66.03916015625],[104.6669921875,-66.13681640625],[105.00039062500002,-66.1640625],[106.38691406250001,-66.41064453125],[107.1708984375,-66.47041015625001],[107.56552734375003,-66.55234375],[107.66728515624999,-66.58037109375002],[107.78505859375002,-66.6640625],[107.99169921875,-66.67207031250001],[108.15791015625001,-66.63906250000002],[108.37617187500001,-66.76582031250001],[108.91005859375002,-66.8619140625],[109.46279296875002,-66.90869140625],[109.82373046875,-66.83369140625001],[110.43701171875,-66.62109375],[110.62226562500001,-66.5240234375],[110.58701171875003,-66.31230468750002],[110.90673828125,-66.07666015625],[111.453125,-65.9609375],[112.13027343750002,-65.90009765625001],[112.5478515625,-65.84794921875002],[113.09941406249999,-65.79990234375],[113.36796874999999,-65.84873046875],[113.50214843750001,-65.886328125],[113.70976562499999,-65.92958984375002],[113.95449218750002,-66.06044921875002],[114.3369140625,-66.36015625000002],[114.61855468750002,-66.46796875000001],[114.86953125000002,-66.47695312500002],[115.08242187500002,-66.49296875000002],[115.31035156249999,-66.56083984375002],[115.63535156250003,-66.77119140625001],[115.44189453125,-66.9580078125],[115.27373046874999,-67.0279296875],[114.57060546874999,-67.10849609375],[114.259765625,-67.17226562500002],[113.9912109375,-67.2119140625],[113.9125,-67.36767578125],[114.02656250000001,-67.44121093750002],[114.31904296875001,-67.40566406250002],[114.65791015625001,-67.38789062500001],[114.92578125,-67.35654296875],[115.171875,-67.30781250000001],[115.38417968750002,-67.23808593750002],[115.88525390625,-67.20195312500002],[116.21464843749999,-67.14277343750001],[116.50908203124999,-67.10791015625],[116.71347656250003,-67.04716796875002],[116.92363281249999,-67.05546875000002],[117.13193359375003,-67.11435546875],[117.2978515625,-67.10927734375002],[117.74472656250003,-67.128515625],[117.95195312499999,-67.08535156250002],[118.138671875,-67.08242187500002],[118.32578125000003,-67.11503906250002],[118.51894531250002,-67.16093750000002],[118.7138671875,-67.17167968750002],[118.96464843749999,-67.14482421875002],[119.31826171875002,-67.07080078125],[119.76796875000002,-66.99150390625002],[120.18730468749999,-66.96621093750002],[120.28925781250001,-66.96660156250002],[120.37480468749999,-66.98378906250002],[119.95371093750003,-67.07587890625001],[119.28066406250002,-67.19921875],[118.92167968749999,-67.31972656250002],[119.13300781250001,-67.370703125],[120.400390625,-67.23603515625001],[120.97871093750001,-67.1357421875],[121.48759765624999,-67.09072265625002],[121.61318359375002,-67.05703125000002],[122.03310546875002,-66.90175781250002],[122.18281250000001,-66.85947265625],[122.63300781250001,-66.80488281250001],[123.2216796875,-66.7451171875],[123.66660156250003,-66.67685546875],[123.96933593750003,-66.60810546875001],[124.19619140625002,-66.60078125000001],[124.37050781250002,-66.65224609375002],[124.59785156250001,-66.70820312500001],[124.82158203124999,-66.69453125000001],[125.09511718750002,-66.64111328125],[125.28632812500001,-66.51582031250001],[125.39794921875,-66.4244140625],[125.60302734375,-66.39335937500002],[125.865625,-66.36445312500001],[126.0771484375,-66.3955078125],[126.42373046875002,-66.46240234375],[126.66474609375001,-66.49755859375],[126.87363281250003,-66.759375],[127.36542968750001,-66.98964843750002],[127.54121093750001,-67.05107421875002],[127.96806640625005,-67.0279296875],[128.43056640625002,-67.119140625],[128.62783203125002,-67.10712890625001],[128.81640625,-67.08037109375002],[128.982421875,-67.0982421875],[129.23691406250003,-67.0416015625],[129.5,-66.7529296875],[129.7412109375,-66.46855468750002],[129.97578125,-66.34482421875],[130.12050781250002,-66.29150390625],[130.30058593750005,-66.26845703125002],[130.57851562500002,-66.20859375],[130.95175781250003,-66.19140625],[131.23203125000003,-66.21552734375001],[131.83085937500005,-66.23583984375],[132.3203125,-66.16542968750002],[132.87431640625005,-66.17802734375002],[133.14824218750005,-66.09482421875],[133.44453125,-66.08144531250002],[133.8427734375,-66.15361328125002],[133.95751953125,-66.20429687500001],[134.17890625,-66.27705078125001],[134.23183593750002,-66.34765625],[134.28945312500002,-66.47675781250001],[134.39814453125,-66.47988281250002],[134.7697265625,-66.35332031250002],[134.97148437500005,-66.33017578125],[135.35195312500002,-66.12714843750001],[135.55478515625003,-66.18007812500002],[136.009375,-66.26679687500001],[136.19394531250003,-66.29218750000001],[136.55332031250003,-66.43896484375],[136.73964843750002,-66.40771484375],[136.88916015625,-66.33964843750002],[137.33623046875005,-66.34648437500002],[137.75380859375002,-66.40644531250001],[137.92578125,-66.45693359375002],[138.13994140625005,-66.5439453125],[138.27099609375,-66.564453125],[138.37646484375,-66.54042968750002],[139.24160156250002,-66.57402343750002],[139.61318359375002,-66.63759765625002],[139.90009765625,-66.71513671875002],[140.9015625,-66.751953125],[141.28593750000005,-66.83183593750002],[141.51718750000003,-66.79404296875],[141.9728515625,-66.80673828125],[142.15898437500005,-66.8736328125],[142.32666015625,-66.94833984375],[142.6875,-67.01279296875],[142.88837890625,-67.00009765625],[143.1689453125,-66.94863281250002],[143.4482421875,-66.87675781250002],[143.73037109375002,-66.87675781250002],[143.86269531250002,-66.93857421875],[143.9111328125,-67.09072265625002],[144.11767578125,-67.08769531250002],[144.3478515625,-67.01796875000002],[144.55058593750005,-67.03554687500002],[144.62119140625003,-67.14140625000002],[144.51533203125,-67.28251953125002],[144.25966796875002,-67.47871093750001],[144.15371093750002,-67.644140625],[143.94199218750003,-67.79404296875],[143.97734375000005,-67.86455078125002],[144.18906250000003,-67.89980468750002],[144.404296875,-67.79423828125002],[144.8791015625,-67.72089843750001],[145.1279296875,-67.6259765625],[145.55644531250005,-67.59091796875],[145.97519531250003,-67.62421875000001],[146.2763671875,-67.75087890625002],[146.82783203125,-67.96464843750002],[146.85244140625002,-68.041015625],[146.89658203125003,-68.12031250000001],[146.87822265625005,-68.19121093750002],[146.79765625000005,-68.27363281250001],[147.09365234375002,-68.36865234375],[147.35380859375005,-68.38427734375],[147.5685546875,-68.37509765625],[148.45625,-68.46699218750001],[148.88056640625,-68.43115234375],[149.2626953125,-68.43134765625001],[149.71689453125003,-68.41777343750002],[150.06552734375003,-68.419921875],[150.34218750000002,-68.43574218750001],[150.67197265625003,-68.4029296875],[150.93593750000002,-68.35849609375],[151.06826171875002,-68.38496093750001],[151.12109375,-68.623046875],[151.1388671875,-68.76416015625],[151.28876953125,-68.81708984375001],[151.44755859375005,-68.76416015625],[151.56210937500003,-68.69365234375002],[152.26523437500003,-68.7255859375],[152.54550781250003,-68.72958984375],[152.81416015625,-68.76767578125],[153.08183593750005,-68.85683593750002],[153.33994140625003,-68.81796875],[153.49570312500003,-68.76435546875001],[153.7052734375,-68.72890625000002],[153.76699218750002,-68.640625],[153.79238281250002,-68.49335937500001],[153.78466796875,-68.349609375],[153.90800781250005,-68.32314453125002],[154.03154296875005,-68.349609375],[154.19970703125,-68.41787109375002],[154.5763671875,-68.63427734375],[154.86601562500005,-68.77431640625002],[154.9875,-68.84130859375],[155.16396484375002,-68.89462890625],[155.52031250000005,-69.0244140625],[156.0109375,-69.07783203125001],[156.48867187500002,-69.18300781250002],[157.04638671875,-69.17626953125],[157.48134765625002,-69.30869140625],[157.77578125000002,-69.2046875],[157.93251953125002,-69.18076171875],[158.15781250000003,-69.20888671875002],[158.4326171875,-69.2994140625],[158.64716796875,-69.32011718750002],[159.38632812500003,-69.468359375],[159.78398437500005,-69.521875],[159.93095703125005,-69.63056640625001],[160.12578125000005,-69.73427734375002],[160.12578125000005,-69.84013671875002],[160.20966796875,-69.97490234375002],[160.65185546875,-70.08056640625],[160.82675781250003,-70.18203125000002],[161.03701171875002,-70.31718750000002],[161.42451171875,-70.8267578125],[161.62509765625003,-70.91611328125],[161.91611328125003,-70.90732421875],[162.189453125,-71.03955078125],[162.27773437500002,-71.021875],[162.28652343750002,-70.96904296875002],[162.03964843750003,-70.625],[162.02197265625,-70.43984375000002],[162.216015625,-70.333984375],[162.6748046875,-70.30458984375002],[163.02646484375003,-70.50136718750002],[163.34873046875003,-70.62089843750002],[163.56650390625003,-70.64228515625001],[163.99843750000002,-70.63652343750002],[164.40322265625002,-70.51044921875001],[164.716015625,-70.55654296875002],[165.209375,-70.57080078125],[165.85390625000002,-70.64531250000002],[166.13203125,-70.6328125],[166.626953125,-70.66425781250001],[167.22880859375005,-70.77128906250002],[167.56943359375003,-70.81025390625001],[167.64003906250002,-70.85439453125002],[167.798828125,-70.92490234375],[167.878125,-71.01308593750002],[167.96630859375,-71.09248046875001],[168.17265625000005,-71.183203125],[168.3828125,-71.19736328125],[168.7978515625,-71.27480468750002],[169.66376953125,-71.511328125],[169.97695312500002,-71.5806640625],[170.1623046875,-71.63046875],[170.25048828125,-71.56875],[170.27685546875,-71.4439453125],[170.4357421875,-71.41875],[170.60332031250005,-71.60400390625],[170.77968750000002,-71.7451171875],[170.85908203125,-71.86855468750002],[170.67539062500003,-71.96855468750002],[170.40927734375003,-71.94794921875001],[170.22402343750002,-71.94794921875001],[170.03007812500005,-72.11552734375002],[169.95351562500002,-72.40283203125],[170.1271484375,-72.39775390625002],[170.259375,-72.37128906250001],[170.28583984375,-72.4771484375],[170.20644531250002,-72.56533203125002],[170.04775390625002,-72.6005859375],[169.77490234375,-72.5337890625],[169.44033203125002,-72.48681640625],[169.07236328125003,-72.46875],[168.71884765625003,-72.38447265625001],[168.576171875,-72.37910156250001],[168.42841796875,-72.3833984375],[168.62167968750003,-72.47265625],[168.82001953125,-72.55244140625001],[169.26953125,-72.62128906250001],[169.82861328125,-72.72880859375002],[169.84482421875003,-72.79462890625001],[169.712109375,-72.876953125],[169.54501953125003,-73.050390625],[169.0333984375,-73.20039062500001],[168.73593750000003,-73.09121093750002],[168.38134765625,-73.06591796875],[168.20449218750002,-73.12978515625002],[167.85302734375,-73.12246093750002],[167.15566406250002,-73.14726562500002],[166.8828125,-73.01123046875],[166.45283203125,-72.93603515625],[166.4669921875,-72.99746093750002],[166.833984375,-73.22431640625001],[167.2255859375,-73.27578125000002],[167.61582031250003,-73.33681640625002],[167.70908203125003,-73.39423828125001],[167.5341796875,-73.447265625],[167.29648437500003,-73.4400390625],[166.99609375,-73.54433593750002],[166.42880859375003,-73.526953125],[166.159375,-73.5337890625],[166.00107421875003,-73.57666015625],[165.86015625000005,-73.59267578125002],[165.97060546875002,-73.63076171875002],[166.10605468750003,-73.73515625000002],[165.91328125,-73.8228515625],[165.73369140625005,-73.86669921875],[165.54892578125003,-73.84609375000002],[165.34697265625005,-73.87939453125],[165.24990234375002,-73.78242187500001],[165.24453125000002,-73.57119140625002],[165.12949218750003,-73.38261718750002],[165.0048828125,-73.37451171875],[164.81298828125,-73.39677734375002],[164.74960937500003,-73.55878906250001],[164.8876953125,-73.83769531250002],[164.97988281250002,-73.92587890625],[164.90595703125,-74.0029296875],[164.77568359375005,-74.02851562500001],[165.03720703125003,-74.26347656250002],[165.26308593750002,-74.42617187500002],[165.39980468750002,-74.47919921875001],[165.40859375000002,-74.55859375],[165.30283203125003,-74.59375],[165.001171875,-74.56269531250001],[164.85302734375,-74.57832031250001],[164.68896484375,-74.568359375],[164.41074218750003,-74.53339843750001],[164.1740234375,-74.52324218750002],[163.93583984375005,-74.5673828125],[163.73525390625002,-74.56376953125002],[163.55654296875002,-74.41738281250002],[163.39785156250002,-74.38212890625002],[163.26552734375002,-74.42626953125],[163.16738281250002,-74.60195312500002],[162.96123046875005,-74.65605468750002],[162.75205078125003,-74.73613281250002],[162.60410156250003,-74.82314453125002],[162.53359375000002,-75.16708984375],[162.41005859375002,-75.23759765625002],[162.2255859375,-75.23457031250001],[162.08779296875002,-75.26162109375002],[161.9103515625,-75.23388671875],[161.67958984375002,-75.2177734375],[160.91074218750003,-75.33466796875001],[161.03291015625,-75.39589843750002],[161.22734375000005,-75.38613281250002],[161.903515625,-75.40419921875002],[162.1896484375,-75.46689453125],[162.23906250000005,-75.6216796875],[162.35195312500002,-75.6865234375],[162.57763671875,-75.75800781250001],[162.75400390625003,-75.79326171875002],[162.81572265625005,-75.84619140625],[162.7451171875,-75.95195312500002],[162.64824218750005,-76.04902343750001],[162.4365234375,-76.1548828125],[162.4982421875,-76.20771484375001],[162.7275390625,-76.22539062500002],[162.82460937500002,-76.46357421875001],[162.67460937500005,-76.5693359375],[162.74521484375003,-76.65751953125002],[162.76279296875003,-76.745703125],[162.6095703125,-76.8287109375],[162.489453125,-76.86923828125],[162.45029296875003,-76.9556640625],[162.67910156250002,-77.00673828125002],[162.85019531250003,-77.02353515625],[163.0869140625,-77.03232421875],[163.24990234375002,-77.12646484375],[163.45849609375,-77.26933593750002],[163.6076171875,-77.38779296875],[163.619140625,-77.58232421875002],[163.76621093750003,-77.69990234375001],[164.04521484375005,-77.77460937500001],[164.03642578125005,-77.85302734375],[164.23203125000003,-77.87705078125],[164.4208984375,-77.88349609375001],[164.49150390625005,-77.95400390625002],[164.4296875,-78.04218750000001],[164.10781250000002,-78.14677734375002],[163.97763671875003,-78.22382812500001],[164.29736328125,-78.23623046875002],[164.628125,-78.315625],[165.05058593750005,-78.22607421875],[165.27402343750003,-78.12861328125001],[165.41757812500003,-78.04218750000001],[165.52402343750003,-78.06357421875],[165.5341796875,-78.15380859375],[165.66298828125002,-78.3056640625],[166.20859375000003,-78.45166015625],[166.51035156250003,-78.49736328125002],[166.80117187500002,-78.52158203125],[167.05800781250002,-78.51845703125002],[167.13027343750002,-78.60615234375001],[167.0490234375,-78.68603515625],[166.85,-78.67988281250001],[166.524609375,-78.694921875],[166.28652343750002,-78.62783203125002],[166.11679687500003,-78.57109375000002],[164.634765625,-78.60322265625001],[164.30058593750005,-78.63007812500001],[163.90175781250002,-78.71708984375002],[163.503125,-78.75859375000002],[162.89511718750003,-78.84482421875],[162.63945312500005,-78.89775390625002],[161.97451171875002,-78.69423828125002],[161.75742187500003,-78.544921875],[161.66923828125005,-78.5361328125],[161.51044921875,-78.57138671875],[161.50175781250005,-78.67724609375],[161.81337890625002,-78.90742187500001],[161.95146484375005,-78.96826171875],[161.95146484375005,-79.02998046875001],[161.8642578125,-79.06093750000002],[161.7373046875,-79.05996093750002],[161.54609375,-79.01503906250002],[161.19052734375003,-78.97871093750001],[160.87353515625,-79.04970703125002],[160.48271484375005,-79.20146484375002],[160.5673828125,-79.30234375],[160.67021484375005,-79.35888671875],[160.64609375000003,-79.42685546875],[160.2091796875,-79.55439453125001],[160.06796875000003,-79.56123046875001],[159.97587890625005,-79.58564453125001],[160.08359375000003,-79.63251953125001],[160.32275390625,-79.63554687500002],[160.34628906250003,-79.69150390625],[160.26484375,-79.73662109375002],[159.871875,-79.78984375000002],[159.896484375,-79.858984375],[160.11142578125003,-79.89248046875002],[160.38730468750003,-79.8794921875],[160.55800781250002,-79.92958984375002],[160.5587890625,-80.01054687500002],[160.38173828125002,-80.05449218750002],[160.17939453125,-80.08808593750001],[158.76748046875002,-80.29335937500002],[158.56035156250005,-80.34892578125002],[158.57363281250002,-80.4234375],[159.06513671875,-80.44257812500001],[160.5421875,-80.425],[160.63730468750003,-80.44990234375001],[160.60332031250005,-80.50761718750002],[160.52128906250005,-80.58339843750002],[160.60136718750005,-80.63652343750002],[160.8232421875,-80.67402343750001],[160.8302734375,-80.72988281250002],[160.72001953125005,-80.753125],[160.50253906250003,-80.779296875],[160.26015625000002,-80.78671875],[160.27578125000002,-80.84677734375],[160.60722656250005,-80.90117187500002],[160.716796875,-80.90742187500001],[160.72792968750002,-81.112890625],[160.71669921875002,-81.19960937500002],[160.5400390625,-81.24169921875],[160.47861328125003,-81.2701171875],[160.46982421875003,-81.340625],[160.90781250000003,-81.390234375],[161.58212890625003,-81.60976562500002],[161.73017578125,-81.61044921875],[161.99609375,-81.65302734375001],[162.42529296875,-81.76494140625002],[162.57666015625,-81.83203125],[162.82119140625002,-81.8662109375],[162.85439453125002,-81.92070312500002],[163.00429687500002,-81.96894531250001],[163.60234375000005,-82.12060546875],[163.68007812500002,-82.18730468750002],[162.42656250000005,-82.314453125],[161.16650390625,-82.4078125],[161.283203125,-82.48994140625001],[162.64375,-82.48154296875],[163.01181640625003,-82.53496093750002],[163.17470703125002,-82.51894531250002],[163.2685546875,-82.46328125000002],[164.00136718750002,-82.39677734375002],[164.74716796875003,-82.35439453125002],[164.98007812500003,-82.38496093750001],[165.981640625,-82.62968750000002],[166.44589843750003,-82.72216796875],[166.7421875,-82.75703125000001],[166.95673828125,-82.7646484375],[167.11630859375003,-82.80126953125],[167.27128906250005,-82.87939453125],[167.2326171875,-82.95234375000001],[167.29746093750003,-82.98583984375],[167.4044921875,-82.99882812500002],[167.60195312500002,-83.0474609375],[167.82753906250002,-83.03076171875],[168.091796875,-82.97470703125],[168.27597656250003,-82.98720703125002],[168.60732421875002,-83.06533203125002],[168.481640625,-83.12675781250002],[168.4083984375,-83.15507812500002],[168.32001953125,-83.21074218750002],[168.240234375,-83.22988281250002],[167.97304687500002,-83.2431640625],[167.825390625,-83.24296875000002],[167.67441406250003,-83.2314453125],[167.65761718750002,-83.27216796875001],[167.8427734375,-83.31621093750002],[168.11005859375,-83.36201171875001],[169.837890625,-83.3990234375],[170.33203125,-83.47880859375002],[170.81748046875003,-83.43574218750001],[171.03574218750003,-83.44843750000001],[171.220703125,-83.475],[171.2892578125,-83.55546875000002],[171.537109375,-83.58134765625002],[171.9171875,-83.64404296875],[172.45009765625002,-83.675390625],[172.87392578125002,-83.67314453125002],[173.39726562500005,-83.7587890625],[173.66181640625,-83.76093750000001],[173.82236328125003,-83.81015625],[175.01103515625005,-83.83906250000001],[175.18740234375002,-83.87744140625],[175.32285156250003,-83.9400390625],[175.60576171875005,-83.96757812500002],[175.91123046875003,-83.97314453125],[177.5810546875,-84.07490234375001],[178.20859375000003,-84.1298828125],[178.35263671875003,-84.12666015625001],[178.49599609375002,-84.1357421875],[178.94443359375003,-84.18144531250002],[179.40302734375,-84.20615234375],[179.6203125,-84.26835937500002],[180,-84.3515625],[180,-89.99892578125002],[178.59375,-89.99892578125002],[177.1875,-89.99892578125002],[175.78125,-89.99892578125002],[174.375,-89.99892578125002],[172.96875,-89.99892578125002],[171.5625,-89.99892578125002],[170.15625,-89.99892578125002],[168.75,-89.99892578125002],[167.34375,-89.99892578125002],[165.9375,-89.99892578125002],[164.53115234375002,-89.99892578125002],[163.125,-89.99892578125002],[161.71875,-89.99892578125002],[160.3125,-89.99892578125002],[158.90625,-89.99892578125002],[157.5,-89.99892578125002],[156.09375,-89.99892578125002],[154.6875,-89.99892578125002],[153.28125,-89.99892578125002],[151.875,-89.99892578125002],[150.46875,-89.99892578125002],[149.0625,-89.99892578125002],[147.65625,-89.99892578125002],[146.25,-89.99892578125002],[144.84375,-89.99892578125002],[143.4375,-89.99892578125002],[142.03125,-89.99892578125002],[140.625,-89.99892578125002],[139.21875,-89.99892578125002],[137.8125,-89.99892578125002],[136.40625,-89.99892578125002],[135,-89.99892578125002],[133.59375,-89.99892578125002],[132.1875,-89.99892578125002],[130.78125,-89.99892578125002],[129.375,-89.99892578125002],[127.96875,-89.99892578125002],[126.56240234375002,-89.99892578125002],[125.15625,-89.99892578125002],[123.75,-89.99892578125002],[122.34375,-89.99892578125002],[120.9375,-89.99892578125002],[119.53125,-89.99892578125002],[118.125,-89.99892578125002],[116.71875,-89.99892578125002],[115.3125,-89.99892578125002],[113.90625,-89.99892578125002],[112.5,-89.99892578125002],[111.09384765625003,-89.99892578125002],[109.6875,-89.99892578125002],[108.28125,-89.99892578125002],[106.875,-89.99892578125002],[105.46875,-89.99892578125002],[104.0625,-89.99892578125002],[102.65625,-89.99892578125002],[101.25,-89.99892578125002],[99.84375,-89.99892578125002],[98.4375,-89.99892578125002],[97.03125,-89.99892578125002],[95.625,-89.99892578125002],[94.21875,-89.99892578125002],[92.8125,-89.99892578125002],[91.40625,-89.99892578125002],[90,-89.99892578125002],[88.59375,-89.99892578125002],[87.1875,-89.99892578125002],[85.78125,-89.99892578125002],[84.375,-89.99892578125002],[82.96875,-89.99892578125002],[81.5625,-89.99892578125002],[80.15625,-89.99892578125002],[78.75,-89.99892578125002],[77.34375,-89.99892578125002],[75.9375,-89.99892578125002],[74.53125,-89.99892578125002],[73.125,-89.99892578125002],[71.71875,-89.99892578125002],[70.3125,-89.99892578125002],[68.90625,-89.99892578125002],[67.5,-89.99892578125002],[66.09375,-89.99892578125002],[64.6875,-89.99892578125002],[63.28125,-89.99892578125002],[61.875,-89.99892578125002],[60.46875,-89.99892578125002],[59.0625,-89.99892578125002],[57.65625,-89.99892578125002],[56.25,-89.99892578125002],[54.84375,-89.99892578125002],[53.4375,-89.99892578125002],[52.03125,-89.99892578125002],[50.625,-89.99892578125002],[49.21875,-89.99892578125002],[47.8125,-89.99892578125002],[46.40625,-89.99892578125002],[45,-89.99892578125002],[43.59375,-89.99892578125002],[42.1875,-89.99892578125002],[40.78125,-89.99892578125002],[39.375,-89.99892578125002],[37.96875,-89.99892578125002],[36.5625,-89.99892578125002],[35.15625,-89.99892578125002],[33.75,-89.99892578125002],[32.34375,-89.99892578125002],[30.9375,-89.99892578125002],[29.53125,-89.99892578125002],[28.124902343750023,-89.99892578125002],[26.71875,-89.99892578125002],[25.3125,-89.99892578125002],[23.906152343750023,-89.99892578125002],[22.5,-89.99892578125002],[21.09375,-89.99892578125002],[19.6875,-89.99892578125002],[18.281152343750023,-89.99892578125002],[16.875,-89.99892578125002],[15.46875,-89.99892578125002],[14.0625,-89.99892578125002],[12.65625,-89.99892578125002],[11.25,-89.99892578125002],[9.84375,-89.99892578125002],[8.4375,-89.99892578125002],[7.03125,-89.99892578125002],[5.625,-89.99892578125002],[4.21875,-89.99892578125002],[2.8125,-89.99892578125002],[1.40625,-89.99892578125002],[0,-89.99892578125002],[-1.40625,-89.99892578125002],[-2.8125,-89.99892578125002],[-4.218798828124989,-89.99892578125002],[-5.625048828124989,-89.99892578125002],[-7.03125,-89.99892578125002],[-8.437548828124989,-89.99892578125002],[-9.843798828124989,-89.99892578125002],[-11.250048828124989,-89.99892578125002],[-12.65625,-89.99892578125002],[-14.0625,-89.99892578125002],[-15.46875,-89.99892578125002],[-16.875,-89.99892578125002],[-18.28125,-89.99892578125002],[-19.6875,-89.99892578125002],[-21.09375,-89.99892578125002],[-22.5,-89.99892578125002],[-23.90625,-89.99892578125002],[-25.31254882812499,-89.99892578125002],[-26.71875,-89.99892578125002],[-28.125,-89.99892578125002],[-29.53125,-89.99892578125002],[-30.9375,-89.99892578125002],[-32.34375,-89.99892578125002],[-33.75,-89.99892578125002],[-35.15625,-89.99892578125002],[-36.5625,-89.99892578125002],[-37.96875,-89.99892578125002],[-39.375,-89.99892578125002],[-40.78125,-89.99892578125002],[-42.1875,-89.99892578125002],[-43.59379882812499,-89.99892578125002],[-45,-89.99892578125002],[-46.40625,-89.99892578125002],[-47.8125,-89.99892578125002],[-49.21875,-89.99892578125002],[-50.625,-89.99892578125002],[-52.03125,-89.99892578125002],[-53.43754882812499,-89.99892578125002],[-54.84375,-89.99892578125002],[-56.25,-89.99892578125002],[-57.65625,-89.99892578125002],[-59.0625,-89.99892578125002],[-60.46875,-89.99892578125002],[-61.875,-89.99892578125002],[-63.28125,-89.99892578125002],[-64.6875,-89.99892578125002],[-66.09375,-89.99892578125002],[-67.5,-89.99892578125002],[-68.90625,-89.99892578125002],[-70.3125,-89.99892578125002],[-71.71875,-89.99892578125002],[-73.125,-89.99892578125002],[-74.53125,-89.99892578125002],[-75.9375,-89.99892578125002],[-77.34375,-89.99892578125002],[-78.75,-89.99892578125002],[-80.15625,-89.99892578125002],[-81.5625,-89.99892578125002],[-82.96875,-89.99892578125002],[-84.375,-89.99892578125002],[-85.78125,-89.99892578125002],[-87.1875,-89.99892578125002],[-88.59375,-89.99892578125002],[-90,-89.99892578125002],[-91.40625,-89.99892578125002],[-92.8125,-89.99892578125002],[-94.21875,-89.99892578125002],[-95.625,-89.99892578125002],[-97.03125,-89.99892578125002],[-98.4375,-89.99892578125002],[-99.84375,-89.99892578125002],[-101.25,-89.99892578125002],[-102.65625,-89.99892578125002],[-104.0625,-89.99892578125002],[-105.46875,-89.99892578125002],[-106.875,-89.99892578125002],[-108.28125,-89.99892578125002],[-109.6875,-89.99892578125002],[-111.09375,-89.99892578125002],[-112.5,-89.99892578125002],[-113.90625,-89.99892578125002],[-115.3125,-89.99892578125002],[-116.71875,-89.99892578125002],[-118.125,-89.99892578125002],[-119.53125,-89.99892578125002],[-120.9375,-89.99892578125002],[-122.34375,-89.99892578125002],[-123.75,-89.99892578125002],[-125.15625,-89.99892578125002],[-126.5625,-89.99892578125002],[-127.96875,-89.99892578125002],[-129.375,-89.99892578125002],[-130.78125,-89.99892578125002],[-132.1875,-89.99892578125002],[-133.59375,-89.99892578125002],[-135,-89.99892578125002],[-136.40625,-89.99892578125002],[-137.8125,-89.99892578125002],[-139.21875,-89.99892578125002],[-140.625,-89.99892578125002],[-142.03125,-89.99892578125002],[-143.4375,-89.99892578125002],[-144.84375,-89.99892578125002],[-146.25,-89.99892578125002],[-147.65625,-89.99892578125002],[-149.0625,-89.99892578125002],[-150.46875,-89.99892578125002],[-151.875,-89.99892578125002],[-153.28125,-89.99892578125002],[-154.687548828125,-89.99892578125002],[-156.09375,-89.99892578125002],[-157.5,-89.99892578125002],[-158.90625,-89.99892578125002],[-160.3125,-89.99892578125002],[-161.718798828125,-89.99892578125002],[-163.125,-89.99892578125002],[-164.53125,-89.99892578125002],[-165.937548828125,-89.99892578125002],[-167.343798828125,-89.99892578125002],[-168.750048828125,-89.99892578125002],[-170.156298828125,-89.99892578125002],[-171.5625,-89.99892578125002],[-172.96875,-89.99892578125002],[-174.375,-89.99892578125002],[-175.78125,-89.99892578125002],[-177.1875,-89.99892578125002],[-178.59375,-89.99892578125002],[-180,-89.99892578125002],[-180,-89.58291015625002],[-180,-89.29296875],[-180,-88.58701171875],[-180,-87.88105468750001],[-180,-87.17519531250002],[-180,-86.4693359375],[-180,-85.76337890625001],[-180,-85.05751953125002],[-180,-84.3515625],[-178.389501953125,-84.3375],[-178.06904296875,-84.35234375000002],[-177.730419921875,-84.39521484375001],[-176.985546875,-84.39931640625002],[-176.289013671875,-84.41835937500002],[-176.107373046875,-84.47529296875001],[-175.874609375,-84.5103515625],[-175.381005859375,-84.47978515625002],[-174.98671875,-84.4654296875],[-174.66318359375,-84.46269531250002],[-171.703662109375,-84.54238281250002],[-168.6677734375,-84.68359375],[-168.048583984375,-84.72861328125],[-167.4921875,-84.83369140625001],[-166.911083984375,-84.81923828125002],[-163.463720703125,-84.90087890625],[-162.9333984375,-84.90117187500002],[-160.8208984375,-84.98662109375002],[-157.127490234375,-85.18564453125],[-156.810302734375,-85.19218750000002],[-156.459130859375,-85.18603515625],[-156.6427734375,-85.07939453125002],[-156.98828125,-84.98222656250002],[-157.45390625,-84.91240234375002],[-157.149609375,-84.89130859375001],[-156.4896484375,-84.8892578125],[-156.62099609375,-84.83964843750002],[-156.986328125,-84.8111328125],[-158.30341796875,-84.77802734375001],[-163.568505859375,-84.52871093750002],[-163.68544921875,-84.51308593750002],[-163.758984375,-84.4927734375],[-163.897021484375,-84.47041015625001],[-164.11416015625,-84.44541015625],[-164.916845703125,-84.43134765625001],[-165.1353515625,-84.40986328125001],[-165.2404296875,-84.38125],[-165.184814453125,-84.36953125000002],[-165.125146484375,-84.374609375],[-163.899169921875,-84.35263671875],[-163.765185546875,-84.32421875],[-163.7576171875,-84.30546875000002],[-163.82138671875,-84.29052734375],[-164.03212890625,-84.2740234375],[-164.5283203125,-84.191015625],[-164.68505859375,-84.15458984375002],[-164.60283203125,-84.0966796875],[-164.5025390625,-84.07158203125002],[-164.12392578125,-84.05351562500002],[-164.011328125,-84.015625],[-164.08291015625,-83.94609375000002],[-164.95087890625,-83.80585937500001],[-165.536328125,-83.75664062500002],[-165.92177734375,-83.79023437500001],[-166.649462890625,-83.7919921875],[-167.552880859375,-83.81083984375002],[-167.801220703125,-83.79082031250002],[-168.052734375,-83.73544921875],[-168.34736328125,-83.63681640625],[-168.497265625,-83.611328125],[-168.785009765625,-83.529296875],[-169.16767578125,-83.4498046875],[-171.187841796875,-83.2564453125],[-171.539404296875,-83.2037109375],[-174.065966796875,-82.90009765625001],[-174.172021484375,-82.84775390625],[-174.2359375,-82.79345703125],[-173.071142578125,-82.91582031250002],[-172.851513671875,-82.91679687500002],[-172.592919921875,-82.88417968750002],[-172.392041015625,-82.89306640625],[-172.124365234375,-82.86240234375],[-171.8212890625,-82.84746093750002],[-171.031298828125,-82.94296875],[-169.440771484375,-83.09599609375002],[-169.016064453125,-83.15029296875002],[-168.79013671875,-83.18789062500002],[-168.603759765625,-83.20156250000002],[-168.41767578125,-83.22880859375002],[-168.191015625,-83.21328125000002],[-168.054736328125,-83.2265625],[-167.724267578125,-83.2173828125],[-166.21689453125,-83.20078125],[-165.619189453125,-83.21552734375001],[-164.915625,-83.2900390625],[-164.6443359375,-83.4125],[-164.445556640625,-83.46767578125002],[-164.0583984375,-83.42470703125002],[-163.7333984375,-83.373046875],[-163.111083984375,-83.3291015625],[-162.912060546875,-83.34707031250002],[-162.574169921875,-83.41064453125],[-162.197265625,-83.51894531250002],[-160.5947265625,-83.48955078125002],[-159.92353515625,-83.4947265625],[-159.444384765625,-83.54316406250001],[-157.699267578125,-83.38125],[-157.428466796875,-83.34638671875001],[-157.027783203125,-83.234375],[-157.355810546875,-83.19843750000001],[-157.589208984375,-83.18740234375002],[-157.6794921875,-83.1294921875],[-157.521875,-83.10664062500001],[-157.01826171875,-83.0751953125],[-156.03701171875,-83.02685546875],[-155.459423828125,-82.98076171875002],[-155.150244140625,-82.8583984375],[-153.822265625,-82.66933593750002],[-153.3986328125,-82.58623046875002],[-153.00986328125,-82.44960937500002],[-153.8826171875,-82.17656250000002],[-154.717431640625,-81.94072265625002],[-154.45146484375,-81.86757812500002],[-154.1884765625,-81.810546875],[-154.061376953125,-81.76542968750002],[-153.956640625,-81.7001953125],[-154.232080078125,-81.62324218750001],[-154.48515625,-81.56621093750002],[-154.9078125,-81.5103515625],[-156.492578125,-81.376953125],[-157.03251953125,-81.31914062500002],[-156.815087890625,-81.23095703125],[-156.52822265625,-81.16230468750001],[-155.921142578125,-81.1333984375],[-152.034765625,-81.02900390625001],[-148.12275390625,-80.90078125000002],[-148.0234375,-80.83574218750002],[-148.54296875,-80.76005859375002],[-148.9841796875,-80.74150390625002],[-149.14716796875,-80.71865234375002],[-149.207421875,-80.67041015625],[-149.2140625,-80.60419921875001],[-149.264404296875,-80.59306640625002],[-149.42861328125,-80.58623046875002],[-150.132763671875,-80.51044921875001],[-150.281689453125,-80.48046875],[-150.51611328125,-80.40947265625002],[-150.575390625,-80.35371093750001],[-150.43544921875,-80.21103515625],[-150.220703125,-80.15],[-149.845361328125,-80.11767578125],[-149.57763671875,-80.10595703125],[-148.766064453125,-80.10810546875001],[-148.447998046875,-80.09052734375001],[-148.317138671875,-80.07099609375001],[-148.339794921875,-80.00273437500002],[-148.4302734375,-79.9712890625],[-148.43349609375,-79.92949218750002],[-148.296435546875,-79.90654296875002],[-148.129296875,-79.90771484375],[-148.082958984375,-79.85673828125002],[-148.176513671875,-79.77587890625],[-148.41748046875,-79.7314453125],[-149.051416015625,-79.65693359375001],[-150.490625,-79.54560546875001],[-151.0484375,-79.45966796875001],[-151.36826171875,-79.39335937500002],[-151.6361328125,-79.31767578125002],[-151.903564453125,-79.28056640625002],[-152.09140625,-79.24160156250002],[-152.05341796875,-79.19277343750002],[-152.1376953125,-79.11591796875001],[-152.243505859375,-79.10273437500001],[-152.7013671875,-79.13486328125],[-153.517578125,-79.11728515625],[-154.517724609375,-79.04658203125001],[-155.209912109375,-78.96484375],[-156.11455078125,-78.74462890625],[-156.4693359375,-78.6353515625],[-156.20791015625,-78.55869140625],[-155.919775390625,-78.5103515625],[-154.71640625,-78.39814453125001],[-154.537646484375,-78.35888671875],[-154.293017578125,-78.25908203125002],[-154.695068359375,-78.21699218750001],[-155.03662109375,-78.22080078125],[-155.34150390625,-78.1919921875],[-156.56923828125,-78.1861328125],[-157.266796875,-78.1998046875],[-157.848046875,-78.07392578125001],[-158.285888671875,-77.95078125],[-158.40693359375,-77.88779296875],[-158.500390625,-77.7783203125],[-158.351416015625,-77.61484375],[-158.22998046875,-77.49765625],[-158.246484375,-77.35429687500002],[-158.21357421875,-77.15712890625002],[-158.003076171875,-77.09121093750002],[-157.842041015625,-77.07919921875],[-157.465380859375,-77.23125],[-157.139306640625,-77.24208984375002],[-156.66767578125,-77.21298828125],[-156.368212890625,-77.134765625],[-156.21123046875,-77.10566406250001],[-155.919580078125,-77.09804687500002],[-155.358837890625,-77.13330078125],[-155.1017578125,-77.11953125000002],[-154.81494140625,-77.126953125],[-153.9099609375,-77.22695312500002],[-153.71259765625,-77.27421875000002],[-153.606103515625,-77.31015625],[-153.573046875,-77.36308593750002],[-153.460595703125,-77.416015625],[-153.076953125,-77.44248046875],[-151.998388671875,-77.41259765625],[-151.718994140625,-77.42587890625],[-150.956396484375,-77.57353515625002],[-150.30556640625,-77.7314453125],[-150.084326171875,-77.77099609375],[-149.717724609375,-77.7974609375],[-149.5884765625,-77.77421875000002],[-149.4740234375,-77.71484375],[-149.1259765625,-77.64267578125],[-148.33994140625,-77.55117187500002],[-148.155712890625,-77.46230468750002],[-148.259814453125,-77.41259765625],[-148.55927734375,-77.361328125],[-148.744384765625,-77.34326171875],[-148.843603515625,-77.28369140625],[-148.839013671875,-77.20234375000001],[-148.777490234375,-77.125],[-148.572412109375,-77.105078125],[-148.196337890625,-77.21132812500002],[-147.730224609375,-77.30976562500001],[-147.56640625,-77.32529296875],[-147.44228515625,-77.32070312500002],[-147.2072265625,-77.28583984375001],[-146.927587890625,-77.25986328125],[-146.390625,-77.47246093750002],[-146.0736328125,-77.48671875000002],[-145.6771484375,-77.48808593750002],[-145.600634765625,-77.45527343750001],[-145.649658203125,-77.39833984375002],[-145.713818359375,-77.33837890625],[-145.794287109375,-77.32998046875002],[-145.807958984375,-77.27324218750002],[-145.6345703125,-77.2212890625],[-145.51572265625,-77.19921875],[-145.56318359375,-77.16171875],[-145.753125,-77.10332031250002],[-145.864306640625,-77.09414062500002],[-145.9669921875,-77.06875],[-145.933935546875,-77.02900390625001],[-145.80634765625,-77.01210937500002],[-145.629248046875,-76.9537109375],[-145.685693359375,-76.88447265625001],[-145.67568359375,-76.79667968750002],[-145.75048828125,-76.7490234375],[-146.166455078125,-76.65761718750002],[-146.77666015625,-76.50703125000001],[-147.3404296875,-76.43837890625002],[-148.60107421875,-76.49326171875],[-149.045849609375,-76.4580078125],[-149.3396484375,-76.4189453125],[-149.654248046875,-76.36533203125],[-149.2849609375,-76.31123046875001],[-148.89482421875,-76.27177734375002],[-148.78037109375,-76.23828125],[-148.631787109375,-76.16796875],[-148.458984375,-76.11796875000002],[-148.3203125,-76.1044921875],[-147.860205078125,-76.130859375],[-146.817333984375,-76.31806640625001],[-146.597412109375,-76.33779296875002],[-145.8857421875,-76.42431640625],[-145.686865234375,-76.42880859375],[-145.44208984375,-76.4091796875],[-145.642333984375,-76.32568359375],[-145.860400390625,-76.2666015625],[-146.3830078125,-76.09970703125],[-146.323486328125,-76.02031250000002],[-145.987744140625,-75.88876953125],[-145.105517578125,-75.87890625],[-144.7212890625,-75.83212890625],[-144.22060546875,-75.7314453125],[-143.574267578125,-75.56357421875],[-143.02216796875,-75.54345703125],[-142.329833984375,-75.49091796875001],[-142.094189453125,-75.52978515625],[-141.505712890625,-75.6904296875],[-141.134619140625,-75.74599609375002],[-141.008984375,-75.75078125000002],[-140.87431640625,-75.74589843750002],[-141.22333984375,-75.5458984375],[-140.99873046875,-75.52001953125],[-140.70927734375,-75.49765625],[-140.47099609375,-75.447265625],[-140.293798828125,-75.405859375],[-139.691162109375,-75.21279296875002],[-139.148828125,-75.16015625],[-137.6181640625,-75.07558593750002],[-137.09013671875,-75.15263671875002],[-136.649853515625,-75.16171875],[-136.54951171875,-75.13945312500002],[-136.4619140625,-75.03583984375001],[-136.22783203125,-74.83603515625],[-136.030078125,-74.76533203125001],[-135.362060546875,-74.6904296875],[-134.840380859375,-74.69414062500002],[-134.465087890625,-74.77617187500002],[-134.117138671875,-74.8296875],[-133.796337890625,-74.85458984375],[-133.474853515625,-74.85185546875002],[-132.991650390625,-74.80615234375],[-132.35126953125,-74.78935546875002],[-132.049365234375,-74.76572265625],[-131.70654296875,-74.81093750000002],[-130.857470703125,-74.82597656250002],[-130.19560546875,-74.890625],[-129.7908203125,-74.89140625000002],[-129.23828125,-74.82890625000002],[-128.940625,-74.82021484375002],[-127.86337890625,-74.71923828125],[-127.02021484375,-74.6978515625],[-126.383984375,-74.74257812500002],[-125.35341796875,-74.71464843750002],[-124.312451171875,-74.73574218750002],[-123.88945312499999,-74.773046875],[-121.5439453125,-74.75],[-119.677001953125,-74.65458984375002],[-119.422216796875,-74.62158203125],[-119.022412109375,-74.51787109375002],[-118.8029296875,-74.42226562500002],[-118.65576171875,-74.39277343750001],[-118.342041015625,-74.38154296875001],[-117.80620117187499,-74.4029296875],[-117.068310546875,-74.4732421875],[-116.4330078125,-74.44707031250002],[-115.222607421875,-74.48740234375],[-115.10517578125,-74.455078125],[-114.991015625,-74.275],[-114.791015625,-73.98857421875002],[-114.62373046875,-73.9029296875],[-114.345947265625,-73.925],[-113.50849609375,-74.0888671875],[-113.489404296875,-74.15839843750001],[-113.574658203125,-74.20791015625002],[-113.71357421875,-74.22773437500001],[-113.75327148437499,-74.36669921875],[-113.6408203125,-74.40634765625],[-113.454248046875,-74.39423828125001],[-113.332958984375,-74.45419921875],[-113.597314453125,-74.55878906250001],[-113.78310546875,-74.6181640625],[-113.903466796875,-74.64443359375002],[-113.984765625,-74.84296875000001],[-114.097216796875,-74.90908203125002],[-114.11044921874999,-74.98183593750002],[-113.9318359375,-74.98183593750002],[-113.75253906249999,-74.9521484375],[-113.593408203125,-74.94365234375002],[-113.09150390625,-74.89169921875],[-112.17001953124999,-74.83222656250001],[-111.868212890625,-74.80117187500002],[-111.696240234375,-74.79218750000001],[-111.584423828125,-74.75087890625002],[-111.738720703125,-74.65341796875],[-111.788720703125,-74.57167968750002],[-111.69589843749999,-74.50410156250001],[-111.722265625,-74.38662109375002],[-111.80634765625,-74.26972656250001],[-111.62998046874999,-74.18144531250002],[-111.466796875,-74.20078125],[-111.18017578125,-74.1880859375],[-111.01982421875,-74.23046875],[-110.77041015625,-74.26894531250002],[-110.533935546875,-74.28886718750002],[-110.307080078125,-74.36669921875],[-110.22978515625,-74.53632812500001],[-110.300439453125,-74.71064453125001],[-110.53193359375,-74.83632812500002],[-110.967578125,-74.95126953125],[-111.463134765625,-75.1333984375],[-111.3587890625,-75.21992187500001],[-111.10419921875,-75.19082031250002],[-109.989990234375,-75.19912109375002],[-109.27216796875,-75.18505859375],[-108.822265625,-75.206640625],[-108.25449218749999,-75.2525390625],[-107.804736328125,-75.32158203125002],[-107.266796875,-75.33447265625],[-106.93212890625,-75.309375],[-106.61884765625,-75.34394531250001],[-105.399365234375,-75.19765625000002],[-104.90185546875,-75.11513671875002],[-104.617822265625,-75.15625],[-104.15966796875,-75.120703125],[-103.901318359375,-75.15253906250001],[-103.42490234374999,-75.10126953125001],[-103.121044921875,-75.09521484375],[-102.77133789062499,-75.11699218750002],[-101.70810546874999,-75.12734375000002],[-101.62783203125,-75.22177734375],[-101.3037109375,-75.3658203125],[-101.03935546874999,-75.421875],[-100.70634765624999,-75.39814453125001],[-100.46342773437499,-75.35341796875002],[-100.08281249999999,-75.37041015625002],[-99.53134765624999,-75.30898437500002],[-98.980224609375,-75.32744140625002],[-98.75234375,-75.31708984375001],[-98.645703125,-75.27714843750002],[-98.557861328125,-75.18974609375002],[-98.72724609375,-75.14082031250001],[-99.208154296875,-75.07851562500002],[-99.65190429687499,-74.948828125],[-99.848583984375,-74.92167968750002],[-100.1640625,-74.93789062500002],[-100.31298828125,-74.91435546875002],[-100.47333984375,-74.87236328125002],[-100.264892578125,-74.82294921875001],[-100.0126953125,-74.662109375],[-100.118603515625,-74.51503906250002],[-100.23813476562499,-74.48417968750002],[-100.530859375,-74.4888671875],[-100.8818359375,-74.54111328125],[-101.02314453125,-74.50498046875],[-101.251708984375,-74.48574218750002],[-101.3427734375,-74.35009765625],[-101.58671874999999,-74.09638671875001],[-101.71542968749999,-74.02373046875002],[-102.105126953125,-73.95771484375001],[-102.4408203125,-73.92578125],[-102.76645507812499,-73.8837890625],[-102.862744140625,-73.78359375000002],[-102.79951171875,-73.64570312500001],[-102.41064453125,-73.61640625000001],[-102.03662109375,-73.63056640625001],[-101.828369140625,-73.65546875000001],[-101.58740234375,-73.66679687500002],[-101.3107421875,-73.69521484375002],[-101.13022460937499,-73.73486328125],[-100.98544921874999,-73.75722656250002],[-100.7177734375,-73.7578125],[-99.78110351562499,-73.72011718750002],[-99.65615234375,-73.69414062500002],[-99.541015625,-73.6451171875],[-99.343359375,-73.63417968750002],[-99.16191406249999,-73.64082031250001],[-98.896142578125,-73.61113281250002],[-99.200341796875,-73.57099609375001],[-99.52792968749999,-73.4951171875],[-100.02080078124999,-73.40253906250001],[-100.43637695312499,-73.353125],[-101.189453125,-73.31787109375],[-101.57373046875,-73.32958984375],[-101.81596679687499,-73.31123046875001],[-102.675048828125,-73.3208984375],[-102.90878906249999,-73.28515625],[-103.076171875,-73.1845703125],[-103.30771484374999,-72.9453125],[-103.375,-72.81884765625],[-103.2166015625,-72.7720703125],[-103.110107421875,-72.72119140625],[-102.855859375,-72.71621093750002],[-102.484765625,-72.73564453125002],[-102.362890625,-72.76015625000002],[-102.27202148437499,-72.8349609375],[-102.362939453125,-72.91142578125002],[-102.48203125,-72.951171875],[-102.40927734374999,-72.98740234375],[-102.02885742187499,-72.99814453125],[-101.84150390625,-73.02089843750002],[-101.68120117187499,-73.0298828125],[-101.33183593749999,-72.99541015625002],[-100.8205078125,-72.98115234375001],[-100.56357421874999,-73.01552734375002],[-100.2587890625,-73.04130859375002],[-99.8107421875,-72.99990234375002],[-98.20859375,-73.02226562500002],[-98.01240234375,-73.033203125],[-97.818505859375,-73.10175781250001],[-97.651025390625,-73.14443359375002],[-97.47646484375,-73.12626953125002],[-96.95576171875,-73.20644531250002],[-96.67583007812499,-73.2685546875],[-96.39423828125,-73.30117187500002],[-96.15214843749999,-73.30927734375001],[-95.88056640625,-73.29384765625002],[-95.529248046875,-73.24140625000001],[-95.23662109374999,-73.22011718750002],[-95.02958984374999,-73.23896484375001],[-94.58647460937499,-73.24951171875],[-94.24619140624999,-73.31298828125],[-93.98466796874999,-73.28671875],[-93.70595703125,-73.21503906250001],[-92.828369140625,-73.1646484375],[-92.24101562499999,-73.17841796875001],[-91.16865234375,-73.30703125000002],[-90.92094726562499,-73.31914062500002],[-90.430908203125,-73.24326171875],[-90.27377929687499,-73.11865234375],[-90.29541015625,-72.97792968750002],[-90.15244140624999,-72.94453125000001],[-90.03520507812499,-72.96015625000001],[-89.81767578124999,-72.86259765625002],[-89.52236328125,-72.87089843750002],[-89.341259765625,-72.88955078125002],[-89.22939453125,-72.82578125],[-89.1271484375,-72.69316406250002],[-88.77998046875,-72.68300781250002],[-88.52690429687499,-72.70234375000001],[-88.194091796875,-72.7875],[-88.19453125,-72.85859375000001],[-88.33173828125,-72.934375],[-88.5607421875,-73.120703125],[-88.419384765625,-73.22900390625],[-88.20498046875,-73.21953125000002],[-87.93632812499999,-73.24091796875001],[-87.60844726562499,-73.19453125000001],[-87.401025390625,-73.1919921875],[-87.03793945312499,-73.35390625000002],[-86.791015625,-73.36367187500002],[-86.60214843749999,-73.35371093750001],[-85.98076171874999,-73.20849609375],[-85.801416015625,-73.19208984375001],[-85.582177734375,-73.25898437500001],[-85.26059570312499,-73.41328125000001],[-84.981201171875,-73.50205078125],[-84.5712890625,-73.55673828125],[-84.21416015624999,-73.57275390625],[-83.7962890625,-73.6451171875],[-83.56484375,-73.70595703125002],[-83.04189453125,-73.70722656250001],[-82.81523437499999,-73.73232421875002],[-82.18349609375,-73.85683593750002],[-81.606103515625,-73.79570312500002],[-81.308740234375,-73.73828125],[-81.16318359374999,-73.632421875],[-81.235986328125,-73.47373046875],[-81.26240234375,-73.31494140625],[-81.176416015625,-73.24882812500002],[-81.02431640625,-73.23554687500001],[-80.336376953125,-73.41416015625],[-80.379833984375,-73.30810546875],[-80.43876953124999,-73.225],[-80.614208984375,-73.08339843750002],[-80.58774414062499,-72.97763671875],[-80.44223632812499,-72.94453125000001],[-80.1517578125,-73.00009765625],[-79.8080078125,-73.028125],[-79.521728515625,-73.08955078125001],[-78.96372070312499,-73.31240234375002],[-78.78623046874999,-73.50673828125002],[-78.407861328125,-73.55576171875],[-78.144140625,-73.54707031250001],[-77.84560546875,-73.51503906250002],[-77.44404296875,-73.48798828125001],[-77.13554687499999,-73.49580078125001],[-76.85048828125,-73.46044921875],[-76.76450195312499,-73.56630859375002],[-77.03300781249999,-73.71845703125001],[-77.134912109375,-73.81767578125002],[-77.04892578124999,-73.84414062500002],[-76.8875,-73.82050781250001],[-76.75498046874999,-73.78945312500002],[-76.2912109375,-73.80537109375001],[-75.9162109375,-73.73642578125],[-75.59501953124999,-73.71123046875002],[-75.29306640624999,-73.63876953125],[-75.04355468749999,-73.6451171875],[-74.85546875,-73.65800781250002],[-74.59404296874999,-73.71523437500002],[-74.34526367187499,-73.68388671875002],[-74.19731445312499,-73.69550781250001],[-73.996044921875,-73.6998046875],[-72.92919921875,-73.44794921875001],[-72.68740234375,-73.45234375000001],[-72.380810546875,-73.43837890625002],[-71.99418945312499,-73.37919921875002],[-71.69755859374999,-73.35302734375],[-71.452734375,-73.3544921875],[-71.0171875,-73.26279296875],[-70.32265625,-73.2740234375],[-69.96860351562499,-73.22646484375002],[-69.2822265625,-73.16962890625001],[-68.820947265625,-73.10546875],[-68.00034179687499,-72.935546875],[-67.66708984374999,-72.8345703125],[-67.30673828124999,-72.61113281250002],[-67.079541015625,-72.38759765625002],[-66.827734375,-72.0904296875],[-66.95166015625,-71.89726562500002],[-67.084130859375,-71.81220703125001],[-67.195751953125,-71.71894531250001],[-67.4603515625,-71.52675781250002],[-67.529931640625,-71.28457031250002],[-67.50458984375,-71.05781250000001],[-67.598388671875,-70.84462890625002],[-67.69218749999999,-70.6861328125],[-67.88847656249999,-70.42167968750002],[-68.12568359375,-70.24990234375002],[-68.4033203125,-70.01972656250001],[-68.40366210937499,-69.8091796875],[-68.46982421874999,-69.64384765625002],[-68.63754882812499,-69.5263671875],[-68.707958984375,-69.4322265625],[-68.580029296875,-69.4126953125],[-68.46152343749999,-69.38398437500001],[-68.140869140625,-69.34755859375002],[-67.37177734375,-69.41230468750001],[-67.304345703125,-69.31757812500001],[-67.11044921874999,-69.248046875],[-66.97490234374999,-69.16103515625002],[-67.021240234375,-69.02871093750002],[-67.18759765624999,-68.97441406250002],[-67.39052734375,-68.86123046875002],[-67.2990234375,-68.77070312500001],[-67.13369140625,-68.77070312500001],[-67.054296875,-68.671484375],[-67.11689453125,-68.5748046875],[-67.041015625,-68.453125],[-66.893505859375,-68.29765625000002],[-66.793359375,-68.24042968750001],[-66.97758789062499,-68.14677734375002],[-67.149853515625,-68.02460937500001],[-67.106689453125,-67.93007812500002],[-67.02128906249999,-67.83144531250002],[-66.91538085937499,-67.69257812500001],[-66.76987304687499,-67.593359375],[-66.67724609375,-67.56025390625001],[-66.70498046875,-67.52714843750002],[-66.92314453124999,-67.49160156250002],[-67.12431640624999,-67.48505859375001],[-67.48691406249999,-67.54697265625],[-67.54453125,-67.53466796875],[-67.56474609374999,-67.5029296875],[-67.58579101562499,-67.43515625],[-67.550390625,-67.26923828125001],[-67.493359375,-67.11279296875],[-67.44047851562499,-67.09072265625002],[-67.2990234375,-67.07080078125],[-67.16015625,-66.9517578125],[-67.03447265624999,-66.94511718750002],[-66.955078125,-66.98476562500002],[-66.92861328125,-67.1435546875],[-66.8861328125,-67.17998046875002],[-66.90214843749999,-67.25595703125],[-66.83603515624999,-67.28242187500001],[-66.75732421875,-67.23251953125],[-66.610009765625,-67.20859375],[-66.55156249999999,-67.26259765625002],[-66.498681640625,-67.2890625],[-66.47221679687499,-67.2427734375],[-66.490966796875,-67.1142578125],[-66.51513671875,-67.0625],[-66.53330078124999,-66.97929687500002],[-66.502099609375,-66.94013671875001],[-66.46469726562499,-66.87519531250001],[-66.526806640625,-66.74072265625],[-66.50361328125,-66.68984375000002],[-66.37089843749999,-66.60888671875],[-66.30654296875,-66.59199218750001],[-66.181884765625,-66.59248046875001],[-65.953759765625,-66.64560546875],[-65.84746093749999,-66.64980468750002],[-65.76640624999999,-66.62490234375002],[-65.71796875,-66.5732421875],[-65.678466796875,-66.40273437500002],[-65.77578125,-66.34257812500002],[-65.77451171874999,-66.28798828125002],[-65.71748046875,-66.2544921875],[-65.61728515624999,-66.13525390625],[-65.465087890625,-66.12929687500002],[-65.316357421875,-66.13984375000001],[-65.172021484375,-66.116796875],[-65.2220703125,-66.06845703125],[-65.26748046875,-65.99423828125],[-65.105078125,-65.95791015625002],[-64.99873046875,-65.9462890625],[-64.7216796875,-65.9927734375],[-64.613525390625,-66.01904296875],[-64.514306640625,-65.9595703125],[-64.54736328125,-65.9],[-64.65322265625,-65.86689453125001],[-64.673046875,-65.8140625],[-64.64658203124999,-65.74785156250002],[-64.474609375,-65.78095703125001],[-64.43535156249999,-65.76835937500002],[-64.3900390625,-65.70849609375],[-64.41679687499999,-65.67988281250001],[-64.438916015625,-65.640625],[-64.21347656249999,-65.63291015625],[-64.17998046874999,-65.61738281250001],[-64.1322265625,-65.57050781250001],[-64.06591796875,-65.5537109375],[-63.862207031249994,-65.55595703125002],[-63.818115234375,-65.53154296875002],[-63.79794921874999,-65.48037109375002],[-63.90800781249999,-65.4673828125],[-64.05126953125,-65.41718750000001],[-64.07109374999999,-65.27822265625002],[-64.038037109375,-65.17900390625002],[-63.91240234374999,-65.09306640625002],[-63.76025390625,-65.03349609375002],[-63.48212890625,-65.0849609375],[-63.26416015625,-65.07314453125002],[-63.178125,-65.12607421875],[-63.05908203125,-65.13935546875001],[-63.032617187499994,-65.07978515625001],[-63.085693359375,-65.0279296875],[-63.119873046875,-64.94248046875],[-62.774658203125,-64.84169921875002],[-62.664501953125,-64.85751953125],[-62.5275390625,-64.83339843750002],[-62.57622070312499,-64.75566406250002],[-62.50346679687499,-64.65644531250001],[-62.404248046875,-64.64326171875001],[-62.3380859375,-64.72919921875001],[-62.243310546874994,-64.746875],[-62.1396484375,-64.72675781250001],[-61.88251953125,-64.62539062500002],[-61.75639648437499,-64.60986328125],[-61.631787109375,-64.60468750000001],[-61.50048828125,-64.54560546875001],[-61.47001953124999,-64.4755859375],[-61.395947265625,-64.42714843750002],[-61.173583984375,-64.3625],[-61.08212890624999,-64.31474609375002],[-60.886621093749994,-64.14970703125002],[-60.9220703125,-64.10791015625],[-60.864160156249994,-64.07343750000001],[-60.277246093749994,-63.923925781250006],[-59.98984375,-63.90957031250002],[-59.51015625,-63.82070312500002],[-59.21757812499999,-63.7138671875],[-59.03642578124999,-63.67031250000002],[-58.8720703125,-63.551855468750006],[-58.67353515625,-63.534375],[-58.215576171875,-63.451269531250006],[-57.868066406249994,-63.31875],[-57.3896484375,-63.22626953125001],[-57.16826171874999,-63.234765625],[-57.07670898437499,-63.2625],[-57.020654296874994,-63.37285156250002]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[178.8615234375,70.826416015625],[178.79257812500003,70.8220703125],[178.64824218750005,71.0005859375],[178.62832031250002,71.04736328125],[178.68388671875005,71.1056640625],[178.82900390625002,71.177880859375],[178.89111328125,71.231103515625],[179.23505859375,71.32451171875],[179.54765625000005,71.44765625],[179.71591796875003,71.4662109375],[179.88642578125,71.52333984375],[180,71.537744140625],[180,70.993017578125],[179.88134765625,70.97568359375],[179.64765625,70.89892578125],[179.1525390625,70.8802734375],[178.8615234375,70.826416015625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[17.979785156250017,59.329052734375],[18.132617187500017,59.3162109375],[18.210546875,59.331445312499994],[18.2705078125,59.367138671875],[18.336035156250006,59.375341796875],[18.395800781250017,59.368603515625],[18.45917968750001,59.396728515625],[18.508886718750006,59.407958984375],[18.56025390625001,59.394482421875],[18.617578125000023,59.327050781249994],[18.498632812500006,59.291943359375],[18.41425781250001,59.29033203125],[18.373046875,59.179736328125],[18.32197265625001,59.132226562499994],[18.28535156250001,59.109375],[18.09814453125,59.0623046875],[17.974609375,59.00263671875],[17.829003906250023,58.95458984375],[17.765429687500017,58.9650390625],[17.66962890625001,58.9162109375],[17.45673828125001,58.8583984375],[17.34765625,58.780517578125],[17.102832031250017,58.710839843749994],[16.978125,58.654150390625],[16.63935546875001,58.651171875],[16.315820312500023,58.663623046875],[16.214257812500023,58.636669921875],[16.31806640625001,58.628320312499994],[16.39082031250001,58.60185546875],[16.47802734375,58.612890625],[16.683007812500023,58.599658203125],[16.788476562500023,58.58525390625],[16.923828125,58.492578125],[16.824316406250006,58.459619140624994],[16.651953125,58.434326171875],[16.716601562500017,58.302880859374994],[16.769921875000023,58.214257812499994],[16.700097656250023,58.160791015624994],[16.694921875,57.917529296874996],[16.596972656250017,57.912890625],[16.55537109375001,57.812255859375],[16.586230468750017,57.7609375],[16.583789062500017,57.641748046875],[16.60419921875001,57.568310546875],[16.652246093750023,57.50068359375],[16.630859375,57.43017578125],[16.475976562500023,57.26513671875],[16.4794921875,57.1876953125],[16.50732421875,57.14169921875],[16.527929687500006,57.068164062499996],[16.45751953125,56.926806640624996],[16.4078125,56.80869140625],[16.348730468750006,56.709277343749996],[16.21650390625001,56.589990234375],[16.150683593750017,56.500830078125],[15.996679687500006,56.222607421875],[15.920312500000023,56.1673828125],[15.82666015625,56.124951171875],[15.722265625,56.164208984375],[15.6265625,56.185595703124996],[15.509667968750023,56.1830078125],[15.326562500000023,56.150830078125],[15.051171875000023,56.172216796875],[14.782031250000017,56.161914062499996],[14.713964843750006,56.134130859375],[14.754785156250023,56.033154296875],[14.655566406250017,56.019921875],[14.55859375,56.048632812499996],[14.473242187500006,56.01435546875],[14.401953125,55.9767578125],[14.261914062500011,55.887548828125],[14.215039062500011,55.8326171875],[14.202929687500017,55.729150390625],[14.276464843750006,55.636376953125],[14.341699218750023,55.527734375],[14.173730468750023,55.396630859375],[14.079980468750023,55.3921875],[13.806347656250011,55.428564453125],[13.321386718750006,55.34638671875],[12.885839843750006,55.411376953125],[12.940625,55.481591796875],[12.938769531250017,55.533203125],[12.96337890625,55.612597656249996],[12.97802734375,55.693798828125],[12.973925781250017,55.74814453125],[12.941992187500006,55.8060546875],[12.834570312500006,55.8818359375],[12.592578125000017,56.13759765625],[12.52099609375,56.245556640625],[12.47119140625,56.29052734375],[12.507031250000011,56.29296875],[12.706347656250017,56.235009765625],[12.752832031250023,56.242138671875],[12.801660156250023,56.263916015625],[12.7421875,56.346875],[12.691113281250011,56.384423828125],[12.656445312500011,56.440576171875],[12.773144531250011,56.45576171875],[12.857421875,56.452392578125],[12.91953125,56.515576171875],[12.883691406250023,56.617724609374996],[12.793164062500011,56.649169921875],[12.717578125000017,56.662841796875],[12.572656250000023,56.823291015624996],[12.421484375,56.906396484375],[12.15185546875,57.226953125],[12.05322265625,57.44697265625],[11.961523437500006,57.426074218749996],[11.9169921875,57.521923828125],[11.885058593750017,57.6126953125],[11.878710937500017,57.679443359375],[11.734960937500006,57.71767578125],[11.729101562500006,57.764453125],[11.703222656250006,57.973193359374996],[11.549023437500011,58.001220703125],[11.449316406250006,58.118359375],[11.431542968750023,58.339990234374994],[11.329980468750023,58.380322265625],[11.248242187500011,58.369140625],[11.252050781250006,58.424072265625],[11.271582031250006,58.475634765625],[11.223828125000011,58.679931640625],[11.207910156250023,58.86640625],[11.169140625000011,58.922705078125],[11.147167968750011,58.988623046875],[11.166894531250023,59.045556640624994],[11.19580078125,59.078271484374994],[11.295312500000023,59.086865234375],[11.38828125,59.036523437499994],[11.386425781250011,59.06572265625],[11.365917968750011,59.104541015625],[11.132128906250017,59.143212890624994],[11.0908203125,59.141796875],[10.998925781250023,59.164453125],[10.945019531250011,59.170849609375],[10.83447265625,59.183935546875],[10.742578125000023,59.29599609375],[10.644921875000023,59.389208984375],[10.631054687500011,59.428173828125],[10.634375,59.602490234375],[10.6044921875,59.680029296875],[10.5953125,59.764550781249994],[10.533886718750011,59.69580078125],[10.569531250000011,59.587109375],[10.49375,59.54150390625],[10.398144531250011,59.5193359375],[10.407128906250023,59.4556640625],[10.446386718750006,59.443603515625],[10.45458984375,59.377490234375],[10.431347656250011,59.279638671875],[10.2431640625,59.062060546875],[10.205175781250006,59.038671875],[10.179394531250011,59.00927734375],[10.083105468750006,59.02880859375],[9.959570312500006,58.968212890625],[9.842578125000017,58.95849609375],[9.800195312500023,59.02705078125],[9.635156250000023,59.1177734375],[9.557226562500006,59.112695312499994],[9.627148437500011,59.067919921875],[9.696093750000017,59.009716796875],[9.656933593750011,58.97119140625],[9.618457031250017,58.946044921875],[9.551074218750017,58.933007812499994],[9.309960937500023,58.856835937499994],[9.395800781250017,58.8056640625],[9.322949218750011,58.74755859375],[9.238671875000023,58.739013671875],[9.19375,58.711865234375],[9.178125,58.675],[8.928417968750011,58.569970703124994],[8.521386718750023,58.3005859375],[8.312207031250011,58.224462890625],[8.166113281250006,58.1453125],[8.037402343750017,58.147265625],[7.875585937500006,58.079980468749994],[7.465917968750006,58.020947265625],[7.194140625000017,58.04765625],[7.0048828125,58.02421875],[6.903417968750006,58.0705078125],[6.890234375,58.102294921875],[6.895312500000017,58.120751953124994],[6.912304687500011,58.14287109375],[6.877050781250006,58.150732421875],[6.802832031250006,58.154541015625],[6.77109375,58.132226562499994],[6.766796875000011,58.08154296875],[6.7314453125,58.068310546875],[6.590527343750011,58.097314453124994],[6.555078125000023,58.1234375],[6.605761718750017,58.1763671875],[6.692480468750006,58.224023437499994],[6.6767578125,58.233789062499994],[6.659863281250011,58.262744140625],[6.617578125000023,58.26640625],[6.491503906250017,58.259423828124994],[6.389062500000023,58.26796875],[6.0546875,58.375146484374994],[5.9765625,58.43232421875],[5.706835937500017,58.5236328125],[5.5859375,58.62041015625],[5.517285156250011,58.726513671875],[5.5224609375,58.82265625],[5.555566406250023,58.9751953125],[5.612207031250023,59.012890625],[5.854296875000017,58.95947265625],[6.099023437500023,58.870263671874994],[6.137304687500006,58.874658203124994],[6.214160156250017,58.944677734375],[6.36328125,59.000927734375],[6.321093750000017,59.016455078125],[6.099414062500017,58.951953125],[6.016992187500023,58.987695312499994],[5.88916015625,59.060498046875],[5.88916015625,59.09794921875],[5.94873046875,59.13544921875],[5.968554687500017,59.1861328125],[5.937304687500017,59.233984375],[5.951855468750011,59.299072265625],[6.050683593750023,59.3681640625],[6.198925781250011,59.4380859375],[6.3056640625,59.50556640625],[6.415332031250017,59.547119140625],[6.40390625,59.560986328125],[6.278515625000011,59.534521484375],[6.158593750000023,59.489648437499994],[6.017382812500017,59.414453125],[5.84521484375,59.353466796875],[5.717968750000011,59.329833984375],[5.657324218750006,59.31025390625],[5.5640625,59.2912109375],[5.467578125000017,59.20380859375],[5.3623046875,59.166357421875],[5.173242187500023,59.162548828125],[5.131640625000017,59.226464843749994],[5.18505859375,59.453662109375],[5.2421875,59.564306640625],[5.304882812500011,59.642578125],[5.403515625000011,59.65576171875],[5.472460937500017,59.7130859375],[5.529687500000023,59.7130859375],[5.579492187500023,59.68662109375],[5.772167968750011,59.6609375],[5.867285156250006,59.733984375],[5.991015625000017,59.744677734375],[6.216601562500017,59.818359375],[6.2119140625,59.831787109375],[6.059277343750011,59.815576171874994],[5.966699218750023,59.81318359375],[5.833984375,59.794677734375],[5.763476562500017,59.80791015625],[5.73046875,59.8630859375],[5.783593750000023,59.91279296875],[5.996484375000023,60.031494140625],[6.069921875,60.08349609375],[6.11181640625,60.132080078125],[6.105175781250011,60.16513671875],[6.140527343750023,60.23349609375],[6.348730468750006,60.352978515625],[6.51806640625,60.407568359375],[6.573632812500023,60.360595703125],[6.5263671875,60.213623046875],[6.52685546875,60.1529296875],[6.660937500000017,60.367236328125],[6.719921875000011,60.4181640625],[6.787109375,60.4541015625],[6.94970703125,60.47822265625],[6.995703125,60.511962890625],[6.806347656250011,60.50078125],[6.346972656250017,60.419091796874994],[6.1533203125,60.346240234375],[6.101757812500011,60.29013671875],[5.967382812500006,60.20556640625],[5.904394531250006,60.150634765625],[5.8765625,60.07001953125],[5.800878906250006,60.026220703125],[5.698828125,60.010009765625],[5.557031250000023,59.907763671875],[5.494531250000023,59.825585937499994],[5.353417968750023,59.760107421875],[5.263867187500011,59.709765625],[5.234472656250006,59.691796875],[5.18603515625,59.64228515625],[5.145800781250017,59.638818359374994],[5.110742187500023,59.667822265625],[5.104882812500023,59.731689453125],[5.119238281250006,59.83369140625],[5.187109375,59.907080078125],[5.219531250000017,59.978759765625],[5.174414062500006,60.045703125],[5.205664062500006,60.087939453125],[5.265429687500017,60.086474609375],[5.37646484375,60.067236328125],[5.494531250000023,60.0703125],[5.688574218750006,60.123193359374994],[5.657617187500023,60.1541015625],[5.573828125,60.15849609375],[5.417382812500023,60.1541015625],[5.285839843750011,60.205712890624994],[5.18359375,60.3083984375],[5.137109375000023,60.44560546875],[5.168164062500011,60.484814453125],[5.546484375,60.624560546875],[5.648339843750023,60.68798828125],[5.58935546875,60.694287109375],[5.447363281250006,60.617333984374994],[5.244042968750023,60.569580078125],[5.115820312500006,60.635986328125],[5.049121093750017,60.70751953125],[5.0107421875,60.858544921874994],[5.024609375000011,60.9361328125],[5.008593750000017,61.03818359375],[5.095410156250011,61.071337890625],[5.192480468750006,61.0537109375],[5.288183593750006,61.04716796875],[5.505273437500023,61.056103515625],[5.983984375,61.117333984374994],[6.292578125,61.080957031249994],[6.41796875,61.08427734375],[6.60986328125,61.13701171875],[6.77783203125,61.142431640625],[6.903417968750006,61.1021484375],[6.972070312500023,61.05595703125],[6.980566406250006,60.994140625],[7.038671875,60.9529296875],[7.077929687500017,60.96630859375],[7.046679687500017,61.015283203124994],[7.040136718750006,61.091162109375],[7.545019531250006,61.177148437499994],[7.6044921875,61.210546875],[7.40390625,61.22216796875],[7.346582031250023,61.3005859375],[7.452539062500023,61.41923828125],[7.442578125000011,61.434619140625],[7.331152343750006,61.372021484375],[7.276269531250023,61.283935546875],[7.298046875000011,61.213623046875],[7.275976562500006,61.18095703125],[7.173535156250011,61.165966796875],[6.942578125000011,61.160546875],[6.794335937500023,61.190380859375],[6.657031250000017,61.206591796875],[6.610253906250023,61.2291015625],[6.625878906250023,61.279296875],[6.599902343750017,61.2896484375],[6.543066406250006,61.24453125],[6.492578125000023,61.15458984375],[6.383496093750011,61.13388671875],[6.08251953125,61.16728515625],[5.646777343750017,61.147607421874994],[5.451269531250006,61.10234375],[5.324609375000023,61.108251953125],[5.106738281250017,61.187548828125],[5.021679687500011,61.2505859375],[4.989941406250011,61.377685546875],[5.002734375000017,61.43359375],[5.172460937500006,61.45712890625],[5.25830078125,61.45546875],[5.338671875000017,61.485498046874994],[5.267578125,61.505029296874994],[5.167578125,61.543359375],[5.099414062500017,61.620166015625],[4.996679687500006,61.64521484375],[4.927832031250006,61.710693359375],[4.910351562500011,61.8095703125],[4.930078125000023,61.878320312499994],[4.985058593750011,61.900439453125],[5.116992187500017,61.885400390624994],[5.46533203125,61.896923828125],[5.793261718750017,61.827099609375],[6.015820312500011,61.7875],[6.466699218750023,61.807421875],[6.730761718750017,61.869775390624994],[6.682324218750011,61.88701171875],[6.395898437500023,61.850976562499994],[6.131152343750017,61.852441406249994],[5.664453125000023,61.922900390625],[5.473046875000023,61.94560546875],[5.266894531250017,61.935595703125],[5.159570312500023,61.956982421875],[5.096484375000017,62.02666015625],[5.143164062500006,62.159912109375],[5.240917968750011,62.188671875],[5.293847656250023,62.15390625],[5.357714843750017,62.151708984375],[5.42236328125,62.207373046875],[5.484277343750023,62.239111328125],[5.533300781250006,62.310888671875],[5.718164062500023,62.37890625],[5.796289062500023,62.384667968749994],[5.908300781250006,62.416015625],[5.979785156250017,62.407128906249994],[6.025585937500011,62.37568359375],[6.08349609375,62.349609375],[6.208984375,62.352783203125],[6.580078125,62.407275390625],[6.620019531250023,62.423291015625],[6.6923828125,62.46806640625],[6.457128906250006,62.448095703125],[6.26171875,62.41630859375],[6.136132812500023,62.407470703125],[6.118457031250017,62.447167968749994],[6.164746093750011,62.482421875],[6.2375,62.519921875],[6.272851562500023,62.583837890625],[6.352929687500023,62.6111328125],[6.439453125,62.60966796875],[6.618359375000011,62.6212890625],[6.74462890625,62.637890625],[6.961132812500011,62.6267578125],[7.283789062500006,62.602294921875],[7.491796875,62.542822265625],[7.570117187500017,62.548193359375],[7.653125,62.564013671875],[7.690722656250017,62.585595703124994],[7.527441406250006,62.610302734375],[7.518164062500006,62.6455078125],[7.538378906250017,62.6720703125],[7.8046875,62.72099609375],[8.095507812500017,62.731835937499994],[8.045507812500006,62.771240234375],[7.408398437500011,62.711767578125],[7.242089843750023,62.75234375],[7.11083984375,62.752001953125],[7.02490234375,62.72880859375],[6.779980468750011,62.700732421875],[6.734960937500006,62.720703125],[6.781542968750017,62.7896484375],[6.92822265625,62.902734375],[6.9404296875,62.93046875],[7.008496093750011,62.957666015624994],[7.389062500000023,63.023291015625],[7.571875,63.099511718749994],[7.654296875,63.1091796875],[7.736035156250011,63.103857421875],[7.8603515625,63.11279296875],[8.1005859375,63.090966796874994],[8.211132812500011,62.995507812499994],[8.310546875,62.96552734375],[8.623144531250006,62.846240234375],[8.609179687500017,62.88056640625],[8.338574218750011,63.0421875],[8.235156250000017,63.082177734374994],[8.158007812500017,63.161523437499994],[8.184472656250023,63.2365234375],[8.271484375,63.286572265625],[8.580175781250006,63.313378906249994],[8.635546875000017,63.342333984375],[8.641015625000023,63.39208984375],[8.59375,63.426123046875],[8.480175781250011,63.424169921875],[8.386523437500017,63.445263671875],[8.360742187500023,63.498876953125],[8.398144531250011,63.535107421875],[8.576171875,63.601171875],[8.673632812500017,63.622607421875],[8.842382812500006,63.645898437499994],[9.135839843750006,63.593652343749994],[9.158105468750023,63.566259765625],[9.075878906250011,63.500390625],[9.084179687500011,63.463427734375],[9.156054687500017,63.459326171875],[9.323632812500023,63.570361328125],[9.520703125000011,63.585693359375],[9.602246093750011,63.6095703125],[9.696875,63.624560546875],[9.832226562500011,63.524169921875],[9.891503906250023,63.492041015625],[9.93603515625,63.478857421875],[9.979199218750011,63.395263671875],[10.02099609375,63.3908203125],[10.08056640625,63.43271484375],[10.188574218750006,63.45478515625],[10.340039062500011,63.4693359375],[10.590917968750006,63.447216796875],[10.704492187500023,63.46357421875],[10.760156250000023,63.461279296875],[10.706738281250011,63.536328125],[10.673632812500017,63.558007812499994],[10.725292968750011,63.625],[10.779199218750023,63.651171875],[10.952539062500023,63.698193359375],[11.117871093750011,63.719189453125],[11.225781250000011,63.763818359374994],[11.370703125,63.804833984374994],[11.347949218750017,63.8376953125],[11.3076171875,63.875732421875],[11.2138671875,63.878125],[11.175585937500017,63.898876953125],[11.294628906250011,63.948193359375],[11.457617187500006,64.002978515625],[11.42919921875,64.02451171875],[11.306640625,64.048876953125],[11.213574218750011,64.030517578125],[11.0751953125,63.988134765625],[10.914257812500011,63.92109375],[10.966699218750023,63.9015625],[11.047265625000023,63.84521484375],[10.934863281250017,63.77021484375],[10.339160156250017,63.571044921875],[10.055078125000023,63.5126953125],[9.924023437500011,63.52177734375],[9.892773437500011,63.576220703125],[9.832324218750017,63.61650390625],[9.767480468750023,63.69951171875],[9.6572265625,63.697314453125],[9.594628906250023,63.678955078125],[9.567285156250023,63.70615234375],[9.61474609375,63.794824218749994],[9.7080078125,63.864892578124994],[9.864453125000011,63.917822265625],[9.939453125,63.98173828125],[10.009960937500011,64.083154296875],[10.236230468750023,64.179638671875],[10.565625,64.418310546875],[10.833984375,64.494482421875],[10.932324218750011,64.577734375],[11.090429687500006,64.61455078125],[11.225390625000017,64.6794921875],[11.331347656250017,64.6859375],[11.523828125000023,64.744384765625],[11.632910156250006,64.813916015625],[11.561718750000011,64.81826171875],[11.392480468750023,64.772998046875],[11.296777343750023,64.75478515625],[11.303515625000017,64.82939453125],[11.349902343750017,64.905908203125],[11.489355468750006,64.975830078125],[12.15966796875,65.178955078125],[12.2265625,65.145361328125],[12.306542968750023,65.085986328125],[12.508398437500006,65.0994140625],[12.738378906250006,65.214404296875],[12.91552734375,65.3392578125],[12.81982421875,65.31748046875],[12.71533203125,65.266357421875],[12.51171875,65.1953125],[12.417578125,65.18408203125],[12.363867187500006,65.193310546875],[12.333984375,65.24072265625],[12.263378906250011,65.256103515625],[12.199609375000023,65.245458984375],[12.133886718750006,65.279150390625],[12.122167968750006,65.362353515625],[12.20625,65.48623046875],[12.272851562500023,65.5681640625],[12.344824218750006,65.63017578125],[12.627734375000017,65.80615234375],[12.688867187500023,65.902197265625],[12.816796875000023,65.952880859375],[12.983007812500006,65.9416015625],[13.033105468750023,65.95625],[12.97607421875,66.019189453125],[12.794921875,66.069091796875],[12.783789062500006,66.100439453125],[13.387109375000023,66.182763671875],[13.674414062500006,66.17998046875],[13.759667968750023,66.221044921875],[13.915820312500017,66.24736328125],[14.0341796875,66.29755859375],[13.97314453125,66.3197265625],[13.681347656250011,66.273583984375],[13.498925781250023,66.251904296875],[13.416406250000023,66.252587890625],[13.35205078125,66.23671875],[13.118847656250011,66.2306640625],[13.068164062500017,66.430810546875],[13.104687500000011,66.539404296875],[13.191601562500011,66.537158203125],[13.21142578125,66.6408203125],[13.311816406250017,66.70185546875],[13.450390625000011,66.71552734375],[13.520214843750011,66.741650390625],[13.62109375,66.79482421875],[13.787988281250023,66.782470703125],[13.95947265625,66.7943359375],[13.9169921875,66.819384765625],[13.7041015625,66.85166015625],[13.651562500000011,66.907080078125],[13.726660156250006,66.938037109375],[13.808398437500017,66.960791015625],[13.880175781250017,66.964892578125],[14.022363281250023,67.073095703125],[14.108789062500023,67.11923828125],[14.20556640625,67.11123046875],[14.34033203125,67.158935546875],[14.47265625,67.14267578125],[14.600683593750006,67.173876953125],[14.775585937500011,67.194482421875],[15.415722656250011,67.20244140625],[15.434765625000011,67.2466796875],[15.300097656250017,67.25693359375],[14.824414062500011,67.268310546875],[14.58154296875,67.267431640625],[14.479296875000017,67.25595703125],[14.441699218750017,67.27138671875],[14.448339843750006,67.2978515625],[14.53662109375,67.33974609375],[14.578515625000023,67.38603515625],[14.754980468750006,67.4990234375],[14.9619140625,67.574267578125],[15.120507812500023,67.555029296875],[15.289160156250006,67.483154296875],[15.409375,67.474169921875],[15.46533203125,67.450927734375],[15.552929687500011,67.3517578125],[15.594433593750011,67.34853515625],[15.57568359375,67.44384765625],[15.691503906250006,67.52138671875],[15.661328125000011,67.542822265625],[15.4873046875,67.514794921875],[15.35400390625,67.5439453125],[15.248730468750011,67.6021484375],[15.218652343750023,67.65537109375],[15.284082031250023,67.707958984375],[15.345800781250006,67.734423828125],[15.303906250000011,67.765283203125],[15.040820312500017,67.682568359375],[14.854687500000011,67.663330078125],[14.781347656250006,67.67490234375],[14.821093750000017,67.749853515625],[14.798925781250006,67.809326171875],[15.0484375,67.95576171875],[15.13427734375,67.972705078125],[15.2744140625,67.9609375],[15.40087890625,67.91962890625],[15.506640625000017,67.926220703125],[15.621386718750017,67.948291015625],[15.605761718750017,67.987890625],[15.35693359375,68.00361328125],[15.292871093750023,68.036474609375],[15.316015625,68.06875],[15.48681640625,68.10283203125],[15.656640625000023,68.16435546875],[15.851269531250011,68.182177734375],[16.007910156250006,68.2287109375],[16.0380859375,68.2181640625],[16.064550781250006,68.19990234375],[16.12080078125001,68.02734375],[16.2607421875,67.886572265625],[16.312304687500017,67.8814453125],[16.258593750000017,68.001220703125],[16.308691406250006,68.03564453125],[16.372167968750006,68.06181640625],[16.391992187500023,68.0916015625],[16.319238281250023,68.1017578125],[16.259765625,68.14453125],[16.1748046875,68.28125],[16.20380859375001,68.316748046875],[16.38789062500001,68.38955078125],[16.61884765625001,68.406298828125],[16.86494140625001,68.3552734375],[16.95136718750001,68.3546875],[17.094042968750017,68.368408203125],[17.33613281250001,68.4103515625],[17.478515625,68.426318359375],[17.552832031250006,68.42626953125],[17.571191406250023,68.4474609375],[17.502343750000023,68.461083984375],[17.48017578125001,68.47431640625],[17.426171875000023,68.48193359375],[17.20234375000001,68.45927734375],[16.584863281250023,68.466455078125],[16.525292968750023,68.490673828125],[16.51435546875001,68.532568359375],[16.579882812500017,68.59267578125],[16.65185546875,68.62578125],[16.884667968750023,68.685400390625],[17.131152343750017,68.69345703125],[17.39082031250001,68.799365234375],[17.490039062500017,68.878759765625],[17.546289062500023,69.001123046875],[17.70458984375,69.100048828125],[18.101464843750023,69.156298828125],[18.117480468750017,69.181201171875],[18.07539062500001,69.2326171875],[18.078710937500006,69.325244140625],[18.1875,69.43310546875],[18.259765625,69.47060546875],[18.29316406250001,69.47509765625],[18.378710937500017,69.43984375],[18.48261718750001,69.36484375],[18.6455078125,69.321875],[18.858984375,69.314453125],[18.915917968750023,69.335595703125],[18.75,69.37841796875],[18.624414062500023,69.434375],[18.61445312500001,69.490576171875],[18.67402343750001,69.520361328125],[18.7666015625,69.517041015625],[18.8828125,69.52333984375],[18.991113281250023,69.5611328125],[19.0068359375,69.5876953125],[19.011328125,69.62373046875],[19.038378906250017,69.660400390625],[19.197265625,69.7478515625],[19.68701171875,69.804736328125],[19.722460937500017,69.781640625],[19.69599609375001,69.612939453125],[19.639746093750006,69.50380859375],[19.641503906250023,69.4240234375],[19.73681640625,69.50380859375],[19.864648437500023,69.722119140625],[19.960546875,69.824609375],[20.068945312500006,69.883447265625],[20.146386718750023,69.896728515625],[20.223046875000023,69.927197265625],[20.32421875,69.9453125],[20.35517578125001,69.921923828125],[20.38720703125,69.867626953125],[20.33271484375001,69.676953125],[20.338183593750017,69.616650390625],[20.277148437500017,69.53583984375],[20.04375,69.3556640625],[20.054492187500017,69.332666015625],[20.107226562500017,69.3412109375],[20.197656250000023,69.370947265625],[20.486718750000023,69.54208984375],[20.73945312500001,69.5205078125],[20.742578125000023,69.534521484375],[20.661523437500023,69.584716796875],[20.5625,69.6328125],[20.53271484375,69.692333984375],[20.545996093750006,69.85107421875],[20.6220703125,69.913916015625],[20.84033203125,69.90732421875],[20.971093750000023,69.916015625],[21.032128906250023,69.887451171875],[21.1630859375,69.889501953125],[21.253710937500017,70.00322265625],[21.432910156250017,70.01318359375],[21.590234375000023,69.938037109375],[21.779589843750017,69.887451171875],[21.931738281250006,69.814697265625],[21.974707031250006,69.8345703125],[21.892578125,70.004248046875],[21.802734375,70.066064453125],[21.607812500000023,70.098193359375],[21.400390625,70.174462890625],[21.346289062500006,70.208251953125],[21.355761718750017,70.2333984375],[21.53876953125001,70.257666015625],[21.7802734375,70.2298828125],[21.995507812500023,70.293359375],[22.05439453125001,70.2759765625],[22.21943359375001,70.3091796875],[22.32197265625001,70.264501953125],[22.384765625,70.277734375],[22.421191406250017,70.33759765625],[22.6845703125,70.374755859375],[22.851660156250006,70.340478515625],[22.941210937500017,70.30498046875],[22.982812500000023,70.236767578125],[23.046484375,70.10185546875],[23.17695312500001,70.029052734375],[23.257910156250006,69.993310546875],[23.353906250000023,69.9833984375],[23.400195312500017,70.019775390625],[23.31025390625001,70.06357421875],[23.286035156250023,70.104833984375],[23.3291015625,70.2072265625],[23.37939453125,70.2474609375],[23.661230468750006,70.399755859375],[23.89716796875001,70.478759765625],[24.038476562500023,70.4853515625],[24.285546875000023,70.66240234375],[24.355566406250006,70.694580078125],[24.420019531250006,70.702001953125],[24.40351562500001,70.7453125],[24.268164062500006,70.772705078125],[24.263476562500017,70.826318359375],[24.441796875000023,70.891552734375],[24.658007812500017,71.001025390625],[24.764746093750006,71.008447265625],[24.831640625,70.97802734375],[25.04218750000001,70.92861328125],[25.171191406250017,70.872021484375],[25.2646484375,70.843505859375],[25.32539062500001,70.8494140625],[25.375585937500006,70.891943359375],[25.435937500000023,70.911865234375],[25.56982421875,70.90068359375],[25.649707031250017,70.87333984375],[25.7119140625,70.8697265625],[25.768164062500006,70.853173828125],[25.78144531250001,70.816796875],[25.665625,70.7771484375],[25.46826171875,70.67197265625],[25.273535156250006,70.552392578125],[25.209277343750017,70.489404296875],[25.146386718750023,70.3240234375],[24.994238281250006,70.218212890625],[24.982714843750017,70.143994140625],[25.043847656250023,70.109033203125],[25.211816406250023,70.136474609375],[25.418847656250023,70.235498046875],[25.470507812500017,70.340576171875],[25.988085937500017,70.625390625],[26.230859375000023,70.7826171875],[26.506933593750006,70.91279296875],[26.66132812500001,70.93974609375],[26.733984375,70.853564453125],[26.67548828125001,70.740966796875],[26.558203125,70.669140625],[26.644628906250006,70.63623046875],[26.628125,70.55087890625],[26.601171875,70.503466796875],[26.583984375,70.45380859375],[26.585058593750006,70.410009765625],[26.666113281250006,70.4216796875],[26.989355468750006,70.511376953125],[27.0712890625,70.608447265625],[27.147265625000017,70.681201171875],[27.183691406250006,70.74404296875],[27.309375,70.803564453125],[27.546484375,70.80400390625],[27.5556640625,70.827392578125],[27.26904296875,70.910009765625],[27.235253906250023,70.947216796875],[27.331640625,70.996728515625],[27.597070312500023,71.09130859375],[27.733496093750006,71.080859375],[27.815039062500006,71.059375],[28.141699218750006,71.043017578125],[28.39228515625001,70.97529296875],[28.382714843750023,70.86943359375],[28.32685546875001,70.8251953125],[28.271875,70.79794921875],[27.950976562500017,70.717578125],[27.898046875,70.6779296875],[27.998828125000017,70.6642578125],[28.215625,70.704345703125],[28.271777343750017,70.66796875],[28.202734375,70.576904296875],[28.191015625,70.440185546875],[28.166015625,70.360400390625],[28.166015625,70.287646484375],[28.19296875,70.248583984375],[28.280078125000017,70.40341796875],[28.309863281250017,70.44306640625],[28.437304687500017,70.5013671875],[28.484765625000023,70.618798828125],[28.609375,70.75966796875],[28.749804687500017,70.84150390625],[28.83154296875,70.86396484375],[29.102343750000017,70.8607421875],[29.218554687500017,70.829931640625],[29.321093750000017,70.761474609375],[29.39765625000001,70.734130859375],[29.639062500000023,70.705029296875],[29.721972656250017,70.6685546875],[29.7375,70.646826171875],[29.796484375,70.642529296875],[29.959375,70.694384765625],[30.06513671875001,70.702978515625],[30.237695312500023,70.62216796875],[30.203027343750023,70.5623046875],[30.213183593750017,70.543310546875],[30.42207031250001,70.54716796875],[30.59589843750001,70.523681640625],[30.926367187500006,70.401123046875],[30.96064453125001,70.34384765625],[30.944140625000017,70.2744140625],[30.46894531250001,70.1978515625],[30.262988281250017,70.12470703125],[29.925878906250006,70.096484375],[28.781152343750023,70.14541015625],[28.804296875,70.092529296875],[29.601367187500017,69.9767578125],[29.646875,69.943701171875],[29.621386718750017,69.874072265625],[29.620996093750023,69.818212890625],[29.63593750000001,69.780126953125],[29.694628906250017,69.744580078125],[29.792089843750006,69.727880859375],[29.990332031250006,69.736669921875],[30.088281250000023,69.717578125],[30.155175781250023,69.745947265625],[30.180078125000023,69.841162109375],[30.237597656250017,69.86220703125],[30.34882812500001,69.8345703125],[30.397265625000017,69.7328125],[30.428320312500006,69.722265625],[30.484375,69.794873046875],[30.594531250000017,69.7896484375],[30.714453125,69.795703125],[30.869726562500006,69.783447265625],[31.04951171875001,69.76923828125],[31.452734375,69.689599609375],[31.546972656250006,69.696923828125],[31.66621093750001,69.72099609375],[31.78857421875,69.815771484375],[31.87939453125,69.831982421875],[31.997949218750023,69.809912109375],[32.03056640625002,69.835302734375],[31.969335937500006,69.913916015625],[31.98457031250001,69.953662109375],[32.3916015625,69.868701171875],[32.5654296875,69.806494140625],[32.94169921875002,69.75185546875],[33.0078125,69.722119140625],[33.01259765625002,69.6705078125],[32.99462890625,69.626171875],[32.9150390625,69.601708984375],[32.75429687500002,69.605712890625],[32.1767578125,69.6740234375],[32.09150390625001,69.632568359375],[32.16132812500001,69.596630859375],[32.33056640625,69.554248046875],[32.37773437500002,69.4791015625],[32.636816406250006,69.489453125],[32.8837890625,69.46083984375],[32.99980468750002,69.4701171875],[33.02099609375,69.44560546875],[32.94160156250001,69.383349609375],[32.97890625000002,69.367333984375],[33.255859375,69.427734375],[33.384863281250006,69.444287109375],[33.45429687500001,69.428173828125],[33.46367187500002,69.378173828125],[33.41796875,69.315283203125],[33.41298828125002,69.267431640625],[33.327734375,69.15185546875],[33.196386718750006,69.116845703125],[33.141210937500006,69.068701171875],[33.33339843750002,69.098193359375],[33.435644531250006,69.13037109375],[33.627050781250006,69.28916015625],[33.684375,69.31025390625],[34.22939453125002,69.313134765625],[34.35273437500001,69.3029296875],[34.86396484375001,69.228076171875],[35.00957031250002,69.221240234375],[35.175878906250006,69.230810546875],[35.23320312500002,69.265576171875],[35.28984375000002,69.275439453125],[35.85791015625,69.191748046875],[36.618261718750006,69.003466796875],[37.730566406250006,68.692138671875],[38.35761718750001,68.41513671875],[38.43017578125,68.355615234375],[38.656835937500006,68.321875],[38.70556640625,68.3447265625],[38.83154296875,68.32490234375],[39.568945312500006,68.071728515625],[39.823339843750006,68.05859375],[39.78974609375001,68.112158203125],[39.74628906250001,68.16220703125],[39.80927734375001,68.150830078125],[39.895605468750006,68.114501953125],[40.035742187500006,68.015380859375],[40.206640625,67.94189453125],[40.38066406250002,67.831884765625],[40.52578125000002,67.789697265625],[40.65654296875002,67.774072265625],[40.76630859375001,67.743017578125],[40.96640625,67.7134765625],[41.06093750000002,67.444189453125],[41.133886718750006,67.38603515625],[41.133886718750006,67.266943359375],[41.26171875,67.21845703125],[41.35878906250002,67.20966796875],[41.35429687500002,67.121435546875],[41.27558593750001,66.914306640625],[41.18896484375,66.826171875],[40.521582031250006,66.446630859375],[40.10332031250002,66.299951171875],[39.2890625,66.13203125],[38.65390625,66.06904296875],[38.397558593750006,66.064453125],[37.90068359375002,66.09560546875],[37.62822265625002,66.12958984375],[37.29482421875002,66.225048828125],[36.98369140625002,66.27255859375],[36.76992187500002,66.2935546875],[36.37343750000002,66.302294921875],[35.51347656250002,66.39580078125],[35.36396484375001,66.428662109375],[34.82460937500002,66.6111328125],[34.61025390625002,66.559619140625],[34.48261718750001,66.550341796875],[34.39609375,66.61318359375],[34.43085937500001,66.62978515625],[34.45156250000002,66.651220703125],[34.14609375,66.703271484375],[33.893652343750006,66.70673828125],[33.75957031250002,66.7509765625],[33.59541015625001,66.784619140625],[33.52294921875,66.76435546875],[33.48203125,66.76455078125],[33.15019531250002,66.8439453125],[33.001953125,66.90830078125],[32.84755859375002,67.021533203125],[32.88525390625,67.0611328125],[32.93046875000002,67.08681640625],[32.39990234375,67.152685546875],[31.895312500000017,67.16142578125],[31.983007812500006,67.129833984375],[32.20156250000002,67.113232421875],[32.340625,67.06787109375],[32.5009765625,67.003857421875],[32.46367187500002,66.91630859375],[32.68642578125002,66.829541015625],[32.85732421875002,66.746923828125],[32.862402343750006,66.72138671875],[32.9287109375,66.7041015625],[33.18056640625002,66.679931640625],[33.22441406250002,66.603857421875],[33.18291015625002,66.573876953125],[33.217382812500006,66.531640625],[33.4052734375,66.48427734375],[33.517675781250006,66.47138671875],[33.65595703125001,66.442626953125],[33.59326171875,66.3845703125],[33.47695312500002,66.346875],[33.36054687500001,66.329541015625],[33.41582031250002,66.315625],[33.56669921875002,66.32099609375],[34.11269531250002,66.225244140625],[34.39980468750002,66.12841796875],[34.69179687500002,65.95185546875],[34.78632812500001,65.86455078125],[34.79316406250001,65.816357421875],[34.776953125,65.76826171875],[34.73476562500002,65.71630859375],[34.71552734375001,65.6640625],[34.61572265625,65.509912109375],[34.54414062500001,65.456689453125],[34.40644531250001,65.395751953125],[34.53593750000002,65.2779296875],[34.67109375000001,65.168115234375],[34.80351562500002,64.985986328125],[34.8271484375,64.9126953125],[34.832617187500006,64.8001953125],[34.952246093750006,64.75595703125],[34.90546875000001,64.738671875],[34.85830078125002,64.706689453125],[34.86953125000002,64.560009765625],[35.03535156250001,64.440234375],[35.28408203125002,64.362548828125],[35.43203125000002,64.34677734375],[35.647070312500006,64.3783203125],[35.80205078125002,64.3353515625],[36.146484375,64.189013671875],[36.30195312500001,64.034375],[36.36494140625001,64.00283203125],[36.71376953125002,63.945068359375],[36.975195312500006,63.909521484375],[37.37275390625001,63.816748046875],[37.44218750000002,63.813378906249994],[37.635351562500006,63.893408203125],[37.96796875000001,63.949121093749994],[38.07080078125,64.025830078125],[38.06220703125001,64.091015625],[37.977148437500006,64.20703125],[37.953710937500006,64.3201171875],[37.84355468750002,64.36630859375],[37.740625,64.39697265625],[37.42958984375002,64.373583984375],[37.28955078125,64.3779296875],[37.183691406250006,64.40849609375],[37.04042968750002,64.48916015625],[36.76933593750002,64.68525390625],[36.62421875000001,64.750537109375],[36.578710937500006,64.790966796875],[36.52822265625002,64.84736328125],[36.53457031250002,64.938623046875],[36.652929687500006,64.93544921875],[36.78593750000002,64.987158203125],[36.8828125,65.17236328125],[37.05019531250002,65.1958984375],[37.14082031250001,65.194287109375],[37.528125,65.108251953125],[38.009375,64.878759765625],[38.11572265625,64.85458984375],[38.22822265625001,64.851220703125],[38.412109375,64.857080078125],[38.441992187500006,64.8271484375],[38.54091796875002,64.791259765625],[38.61308593750002,64.786669921875],[39.05351562500002,64.713916015625],[39.5673828125,64.570556640625],[39.75800781250001,64.57705078125],[39.8330078125,64.656396484375],[39.8486328125,64.69052734375],[40.05781250000001,64.770751953125],[40.203710937500006,64.784033203125],[40.4078125,64.7548828125],[40.444921875,64.7787109375],[40.37539062500002,64.8962890625],[40.28125,64.998095703125],[40.142675781250006,65.06328125],[39.896484375,65.25478515625],[39.79804687500001,65.349853515625],[39.749121093750006,65.44794921875],[39.78115234375002,65.534716796875],[39.816503906250006,65.59794921875],[40.32783203125001,65.751708984375],[40.512792968750006,65.843798828125],[40.69160156250001,65.963427734375],[40.7744140625,65.987890625],[41.07607421875002,66.02109375],[41.47578125000001,66.1234375],[41.780859375,66.259326171875],[42.08359375,66.46591796875],[42.210546875,66.519677734375],[42.31367187500001,66.51474609375],[42.45078125,66.482421875],[42.602148437500006,66.422509765625],[42.80654296875002,66.411328125],[43.005957031250006,66.420947265625],[43.23320312500002,66.41552734375],[43.550878906250006,66.3212890625],[43.60332031250002,66.2912109375],[43.653125,66.2509765625],[43.550390625,66.173388671875],[43.54189453125002,66.123388671875],[43.62392578125002,66.146728515625],[43.73701171875001,66.1583984375],[43.84375,66.1423828125],[43.94414062500002,66.098681640625],[44.016699218750006,66.049755859375],[44.10439453125002,66.00859375],[44.132421875,66.06455078125],[44.14531250000002,66.112744140625],[44.09716796875,66.23505859375],[44.220703125,66.407080078125],[44.31640625,66.481689453125],[44.48867187500002,66.67177734375],[44.437109375,66.79462890625],[44.429296875,66.937744140625],[44.40390625,67.00419921875],[44.29179687500002,67.099658203125],[44.07441406250001,67.167333984375],[43.85537109375002,67.188623046875],[43.78242187500001,67.2544921875],[43.79570312500002,67.32958984375],[43.85634765625002,67.439306640625],[44.03642578125002,67.670654296875],[44.22539062500002,67.99560546875],[44.231542968750006,68.071240234375],[44.2138671875,68.11259765625],[44.22646484375002,68.154443359375],[44.2046875,68.253759765625],[44.16914062500001,68.327099609375],[43.40400390625001,68.608544921875],[43.358007812500006,68.635791015625],[43.33320312500001,68.673388671875],[43.41328125000001,68.68173828125],[43.47197265625002,68.679833984375],[44.04804687500001,68.548828125],[44.17529296875,68.541748046875],[45.078125,68.578173828125],[45.51943359375002,68.546533203125],[45.89199218750002,68.4796875],[46.15839843750001,68.291357421875],[46.4296875,68.11884765625],[46.68359375,67.970458984375],[46.6904296875,67.848828125],[46.42890625000001,67.823681640625],[46.17421875000002,67.8181640625],[45.52871093750002,67.757568359375],[45.374121093750006,67.6888671875],[44.939453125,67.47744140625],[44.90214843750002,67.413134765625],[44.939453125,67.35078125],[45.13886718750001,67.284716796875],[45.56220703125001,67.185595703125],[45.752539062500006,66.98916015625],[45.885351562500006,66.891064453125],[45.98603515625001,66.853125],[46.083984375,66.843505859375],[46.29775390625002,66.842822265625],[46.44853515625002,66.818994140625],[46.49238281250001,66.8001953125],[46.55234375,66.818994140625],[46.69082031250002,66.825537109375],[47.49648437500002,66.929833984375],[47.655859375,66.975927734375],[47.709082031250006,67.04501953125],[47.76806640625,67.275634765625],[47.83925781250002,67.355712890625],[47.908203125,67.4546875],[47.88261718750002,67.51533203125],[47.87470703125001,67.5841796875],[48.27871093750002,67.650390625],[48.65380859375,67.695263671875],[48.83320312500001,67.681494140625],[48.8779296875,67.73134765625],[48.7626953125,67.827001953125],[48.69570312500002,67.87421875],[48.75429687500002,67.895947265625],[48.840625,67.8697265625],[48.95390625000002,67.85380859375],[49.1552734375,67.87041015625],[49.93125,68.06513671875],[50.23320312500002,68.175341796875],[50.4140625,68.218359375],[50.69941406250001,68.317724609375],[50.8388671875,68.349951171875],[51.07851562500002,68.363330078125],[51.33613281250001,68.40244140625],[51.61669921875,68.476318359375],[51.994726562500006,68.53876953125],[52.0556640625,68.54130859375],[52.12880859375002,68.53203125],[52.28535156250001,68.459375],[52.22744140625002,68.418603515625],[52.18349609375002,68.374267578125],[52.25917968750002,68.350927734375],[52.322265625,68.339697265625],[52.39667968750001,68.351708984375],[52.475,68.38212890625],[52.66972656250002,68.4267578125],[52.72265625,68.484033203125],[52.64765625000001,68.50615234375],[52.55009765625002,68.592431640625],[52.43505859375,68.610205078125],[52.34404296875002,68.608154296875],[52.68359375,68.731201171875],[53.41289062500002,68.912548828125],[53.80195312500001,68.9958984375],[54.18583984375002,69.0033203125],[54.4912109375,68.992333984375],[54.37626953125002,68.96474609375],[53.87441406250002,68.926611328125],[53.79765625000002,68.907470703125],[53.79824218750002,68.88466796875],[53.91953125,68.871240234375],[53.97060546875002,68.844287109375],[53.929296875,68.811865234375],[53.891210937500006,68.801513671875],[53.83388671875002,68.708935546875],[53.758886718750006,68.633984375],[53.91767578125001,68.536962890625],[53.93085937500001,68.435546875],[53.82949218750002,68.382666015625],[53.690039062500006,68.4025390625],[53.56669921875002,68.36708984375],[53.34257812500002,68.343212890625],[53.29335937500002,68.311669921875],[53.26054687500002,68.26748046875],[53.403125,68.2568359375],[53.51513671875,68.25966796875],[53.913671875,68.231201171875],[53.967871093750006,68.22734375],[54.09921875,68.259033203125],[54.23291015625,68.26630859375],[54.39394531250002,68.27509765625],[54.476171875,68.294140625],[54.56123046875001,68.273046875],[54.71796875000001,68.1841796875],[54.861328125,68.20185546875],[54.92304687500001,68.373828125],[55.15087890625,68.480029296875],[55.418066406250006,68.567822265625],[55.67529296875,68.57587890625],[55.92460937500002,68.6373046875],[56.04365234375001,68.648876953125],[56.27568359375002,68.624072265625],[56.620214843750006,68.61904296875],[56.909375,68.56669921875],[57.12685546875002,68.55400390625],[57.4443359375,68.64150390625],[58.17304687500001,68.88974609375],[58.23701171875001,68.833935546875],[58.35390625000002,68.9162109375],[58.9189453125,69.00380859375],[59.05732421875001,69.0060546875],[59.05986328125002,68.97255859375],[59.11015625000002,68.8962890625],[59.22041015625001,68.849609375],[59.37050781250002,68.73837890625],[59.29833984375,68.708447265625],[59.22255859375002,68.69130859375],[59.1123046875,68.61630859375],[59.09902343750002,68.4443359375],[59.31074218750001,68.40029296875],[59.60429687500002,68.351123046875],[59.725683593750006,68.351611328125],[59.82753906250002,68.380322265625],[59.85878906250002,68.396044921875],[59.89736328125002,68.421923828125],[59.9228515625,68.471337890625],[59.94140625,68.510498046875],[59.86513671875002,68.604931640625],[59.89599609375,68.70634765625],[60.160253906250006,68.69951171875],[60.48916015625002,68.728955078125],[60.6376953125,68.78701171875],[60.81513671875001,68.89521484375],[60.93359375,68.986767578125],[60.85859375000001,69.1455078125],[60.66455078125,69.11025390625],[60.33730468750002,69.45703125],[60.17060546875001,69.59091796875],[60.276464843750006,69.65263671875],[60.558691406250006,69.692333984375],[60.81298828125,69.821142578125],[60.90908203125002,69.847119140625],[61.01591796875002,69.85146484375],[61.7705078125,69.763037109375],[62.63125,69.743115234375],[63.361425781250006,69.67529296875],[64.1904296875,69.53466796875],[64.59218750000002,69.43564453125],[64.92851562500002,69.325390625],[64.89628906250002,69.247802734375],[65.03154296875002,69.26982421875],[65.3267578125,69.2013671875],[65.5279296875,69.1734375],[65.73574218750002,69.13232421875],[65.81269531250001,69.077001953125],[66.08476562500002,69.036328125],[66.41611328125,68.9478515625],[66.7564453125,68.8919921875],[67.00244140625,68.873583984375],[67.14921875000002,68.753955078125],[67.6396484375,68.579296875],[67.73076171875002,68.513671875],[68.15693359375001,68.403662109375],[68.37119140625,68.3142578125],[68.50419921875002,68.3484375],[68.82949218750002,68.567431640625],[69.02431640625002,68.81796875],[69.14052734375002,68.950634765625],[68.9244140625,68.956201171875],[68.76289062500001,68.9173828125],[68.65957031250002,68.927392578125],[68.54277343750002,68.96708984375],[68.355078125,69.067578125],[68.11738281250001,69.23623046875],[68.07304687500002,69.42080078125],[68.005859375,69.480029296875],[67.77431640625002,69.52998046875],[67.62412109375,69.584423828125],[67.064453125,69.693701171875],[66.96406250000001,69.65556640625],[66.9341796875,69.5966796875],[66.89667968750001,69.55380859375],[66.84023437500002,69.6091796875],[66.80400390625002,69.659228515625],[66.80292968750001,69.74013671875],[66.83222656250001,69.8421875],[66.9263671875,70.0142578125],[67.06904296875001,70.005615234375],[67.14443359375002,70.030615234375],[67.2392578125,70.108056640625],[67.19746093750001,70.171630859375],[67.146484375,70.219921875],[67.1568359375,70.2951171875],[67.246875,70.50009765625],[67.284765625,70.738720703125],[67.2115234375,70.7984375],[67.14335937500002,70.837548828125],[66.82246093750001,70.79736328125],[66.70224609375,70.818505859375],[66.67519531250002,70.864697265625],[66.66611328125,70.9005859375],[66.7587890625,70.962353515625],[66.84707031250002,71.063720703125],[66.69257812500001,71.04169921875],[66.6396484375,71.081396484375],[66.76806640625,71.139892578125],[66.917578125,71.282373046875],[67.27421875000002,71.3478515625],[67.54179687500002,71.41201171875],[67.959375,71.548388671875],[68.26923828125001,71.6828125],[68.46943359375001,71.85263671875],[68.607421875,72.012744140625],[68.8296875,72.391552734375],[69.0390625,72.669921875],[69.39140625000002,72.955517578125],[69.61181640625,72.98193359375],[69.6943359375,72.9775390625],[69.708984375,72.956396484375],[69.6587890625,72.9318359375],[69.6451171875,72.89755859375],[69.73828125,72.8849609375],[69.8875,72.882568359375],[70.17216796875002,72.901171875],[70.65537109375,72.890380859375],[71.50019531250001,72.913671875],[71.61699218750002,72.902099609375],[71.92958984375002,72.819677734375],[72.10097656250002,72.82900390625],[72.44638671875,72.79033203125],[72.6337890625,72.744482421875],[72.812109375,72.69140625],[72.78740234375002,72.482958984375],[72.7529296875,72.3431640625],[72.62441406250002,72.079443359375],[72.57412109375002,72.012548828125],[72.375,71.821630859375],[72.27949218750001,71.6955078125],[72.12968750000002,71.6091796875],[71.91201171875002,71.54794921875],[71.884375,71.511376953125],[71.86728515625,71.457373046875],[72.07929687500001,71.306689453125],[72.58134765625002,71.151123046875],[72.70449218750002,70.963232421875],[72.73164062500001,70.8228515625],[72.7,70.45732421875],[72.6533203125,70.40341796875],[72.56191406250002,70.345556640625],[72.46943359375001,70.274951171875],[72.52968750000002,70.172509765625],[72.59941406250002,69.793212890625],[72.615625,69.484033203125],[72.55732421875001,69.37841796875],[72.52705078125001,69.154248046875],[72.52734375,69.080517578125],[72.5767578125,68.968701171875],[72.6783203125,68.874853515625],[72.81191406250002,68.815234375],[73.19072265625002,68.706787109375],[73.54804687500001,68.57451171875],[73.57343750000001,68.5326171875],[73.59169921875002,68.481884765625],[73.46523437500002,68.43076171875],[73.26640625000002,68.294482421875],[73.13945312500002,68.18134765625],[73.12939453125,68.09091796875],[73.17304687500001,67.973046875],[73.15214843750002,67.8650390625],[73.06679687500002,67.766943359375],[72.94873046875,67.696240234375],[72.5943359375,67.586962890625],[71.84746093750002,67.0076171875],[71.66816406250001,66.939697265625],[71.365234375,66.9615234375],[71.44892578125001,66.878955078125],[71.55117187500002,66.76044921875],[71.53955078125,66.68310546875],[71.34199218750001,66.68671875],[71.065625,66.6044921875],[70.939453125,66.54814453125],[70.72490234375002,66.51943359375],[70.56142578125002,66.548681640625],[70.3828125,66.602490234375],[70.40888671875001,66.647607421875],[70.44257812500001,66.66826171875],[70.56796875,66.70087890625],[70.69072265625002,66.7453125],[70.63076171875002,66.75419921875],[70.5791015625,66.753759765625],[70.4439453125,66.697314453125],[70.28339843750001,66.685791015625],[70.09375,66.754345703125],[69.94863281250002,66.82998046875],[69.87714843750001,66.845458984375],[69.74042968750001,66.814599609375],[69.2177734375,66.82861328125],[69.0787109375,66.81591796875],[69.01347656250002,66.788330078125],[69.05117187500002,66.766357421875],[69.09111328125002,66.723583984375],[69.14394531250002,66.64072265625],[69.1943359375,66.578662109375],[69.41201171875002,66.5107421875],[69.70097656250002,66.4845703125],[69.982421875,66.401416015625],[70.339453125,66.3423828125],[71.1455078125,66.366650390625],[71.3580078125,66.359423828125],[71.565625,66.333740234375],[71.9169921875,66.246728515625],[72.06757812500001,66.2533203125],[72.32158203125002,66.33212890625],[72.38398437500001,66.50654296875],[72.41738281250002,66.560791015625],[73.34160156250002,66.8068359375],[73.51357421875002,66.861083984375],[73.79208984375,66.9953125],[73.88330078125,67.0849609375],[73.98623046875002,67.327685546875],[74.07451171875002,67.414111328125],[74.67607421875002,67.69462890625],[74.76953125,67.766357421875],[74.78730468750001,67.897509765625],[74.77822265625002,67.9859375],[74.74267578125,68.07353515625],[74.632421875,68.218310546875],[74.51123046875,68.303076171875],[74.39140625000002,68.42060546875],[74.48095703125,68.65888671875],[74.57958984375,68.751220703125],[75.124609375,68.86171875],[75.58955078125001,68.901171875],[76.10751953125003,68.975732421875],[76.31601562500003,68.99150390625],[76.45917968750001,68.978271484375],[76.60576171874999,68.897607421875],[76.73505859375001,68.776904296875],[77.11171875000002,68.59619140625],[77.23847656250001,68.469580078125],[77.26103515624999,68.315576171875],[77.24843750000002,67.941015625],[77.17441406250003,67.778515625],[77.32509765625002,67.73564453125],[77.39560546875003,67.698681640625],[77.57919921875003,67.6439453125],[77.67509765624999,67.589599609375],[77.77158203125003,67.570263671875],[77.98554687500001,67.5591796875],[78.58955078125001,67.578466796875],[78.92246093750003,67.589111328125],[78.88759765625002,67.613134765625],[78.83906250000001,67.631201171875],[78.55908203125,67.639111328125],[78.16123046875003,67.678369140625],[77.58828125000002,67.751904296875],[77.52011718750003,67.909619140625],[77.53593749999999,68.007666015625],[77.66484374999999,68.190380859375],[77.7568359375,68.22236328125],[77.86826171875003,68.234716796875],[77.9951171875,68.25947265625],[77.95869140625001,68.37705078125],[77.90683593750003,68.482275390625],[77.78525390625003,68.63046875],[77.65068359374999,68.90302734375],[77.46630859375,68.905126953125],[77.32832031250001,68.958642578125],[76.64492187500002,69.1173828125],[76.0009765625,69.23505859375],[75.5611328125,69.251806640625],[75.42001953125,69.238623046875],[75.05351562500002,69.11630859375],[74.81484375000002,69.090576171875],[74.36259765625002,69.144580078125],[73.97744140625002,69.1146484375],[73.83603515625,69.143212890625],[73.77568359375002,69.1982421875],[73.89091796875002,69.41796875],[73.83271484375001,69.50390625],[73.66328125000001,69.61708984375],[73.56015625,69.7072265625],[73.578125,69.802978515625],[73.83017578125,70.17568359375],[73.93740234375002,70.2728515625],[74.20673828125001,70.445458984375],[74.343359375,70.5787109375],[74.31093750000002,70.65361328125],[73.73154296875,71.068701171875],[73.57656250000002,71.21650390625],[73.50722656250002,71.263525390625],[73.365234375,71.319775390625],[73.15048828125,71.385205078125],[73.08623046875002,71.444921875],[73.67177734375002,71.845068359375],[73.939453125,71.91474609375],[74.31123046875001,71.9578125],[74.48906250000002,71.997021484375],[74.80410156250002,72.077392578125],[74.9921875,72.14482421875],[75.05322265625,72.19921875],[75.08994140625,72.263134765625],[75.09707031250002,72.420654296875],[75.06035156250002,72.548779296875],[75.00800781250001,72.61943359375],[74.896875,72.710107421875],[74.78681640625001,72.811865234375],[74.86494140625001,72.838427734375],[74.94218750000002,72.85380859375],[75.15244140625,72.852734375],[75.36933593750001,72.796630859375],[75.47490234375002,72.685009765625],[75.603515625,72.5810546875],[75.603125,72.512158203125],[75.59140625,72.4572265625],[75.64433593750002,72.382275390625],[75.69111328125001,72.35],[75.74140625000001,72.296240234375],[75.69443359375,72.253515625],[75.64433593750002,72.23232421875],[75.55019531250002,72.17080078125],[75.39453125,71.983203125],[75.27382812500002,71.958935546875],[75.24746093750002,71.81337890625],[75.50322265625002,71.654638671875],[75.46855468750002,71.534375],[75.41718750000001,71.494677734375],[75.2802734375,71.430078125],[75.29804687500001,71.378466796875],[75.33203125,71.341748046875],[75.73359375000001,71.26591796875],[76.11044921875003,71.2185546875],[76.74199218749999,71.20205078125],[76.92900390624999,71.127880859375],[76.99521484375003,71.1810546875],[77.58964843749999,71.167919921875],[78.06826171875002,70.986328125],[78.32060546874999,70.930419921875],[78.52578125000002,70.91181640625],[78.94218749999999,70.9337890625],[79.01542968749999,70.9501953125],[79.08388671875002,71.002001953125],[78.888671875,70.99716796875],[78.80351562499999,70.97353515625],[78.72392578124999,70.9759765625],[78.58769531249999,70.993896484375],[78.49140625000001,71.025390625],[78.38652343749999,71.087109375],[78.21259765625001,71.26630859375],[77.90839843750001,71.324072265625],[77.70664062500003,71.3005859375],[77.48105468750003,71.311572265625],[77.11367187500002,71.409375],[76.87119140625003,71.44658203125],[76.43339843749999,71.552490234375],[76.31210937500003,71.595458984375],[76.21572265625002,71.682861328125],[76.10361328125003,71.82900390625],[76.03242187500001,71.910400390625],[76.1240234375,71.926611328125],[76.42167968749999,72.006005859375],[76.87138671874999,72.0330078125],[77.06132812499999,72.00419921875],[77.55078125,71.84208984375],[77.77753906250001,71.83642578125],[78.18691406250002,71.907080078125],[78.232421875,71.952294921875],[78.14082031250001,72.044677734375],[78.01640624999999,72.092041015625],[77.78066406250002,72.114306640625],[77.49287109375001,72.071728515625],[77.41083984375001,72.107763671875],[77.43974609374999,72.15654296875],[77.47158203125002,72.192138671875],[77.62529296874999,72.201416015625],[77.73320312499999,72.22919921875],[77.96816406250002,72.3287109375],[78.22539062499999,72.37744140625],[78.48261718750001,72.394970703125],[79.42207031250001,72.38076171875],[79.95390624999999,72.223046875],[80.47402343750002,72.153125],[80.69921875,72.098291015625],[80.7625,72.08916015625],[80.81474609374999,72.054296875],[80.85605468750003,71.97021484375],[81.51123046875,71.746142578125],[81.66162109375,71.715966796875],[82.07988281249999,71.7068359375],[82.54726562500002,71.75859375],[82.7578125,71.764111328125],[82.98613281249999,71.748681640625],[83.10664062500001,71.7205078125],[83.23359375000001,71.6681640625],[83.16552734375,71.602197265625],[83.10566406250001,71.562451171875],[82.97705078125,71.4513671875],[82.91796875,71.419921875],[82.4931640625,71.29287109375],[82.32285156250003,71.260009765625],[82.27695312500003,71.09345703125],[82.25429687500002,71.056201171875],[82.23916015625002,70.997705078125],[82.31601562500003,70.879443359375],[82.3359375,70.807373046875],[82.27070312500001,70.70673828125],[82.16318359375003,70.59814453125],[82.18242187499999,70.511474609375],[82.22119140625,70.395703125],[82.23583984375,70.4302734375],[82.2314453125,70.48291015625],[82.25839843750003,70.543603515625],[82.45166015625,70.690087890625],[82.59248046875001,70.88994140625],[82.73779296875,70.94208984375],[82.869140625,70.954833984375],[83.01015625000002,70.89541015625],[83.05107421874999,70.815234375],[83.05839843749999,70.6947265625],[83.03017578125002,70.580517578125],[82.91982421875002,70.407421875],[82.74248046874999,70.286474609375],[82.68232421875001,70.217724609375],[82.76728515625001,70.154052734375],[82.85654296875003,70.104541015625],[82.96103515625003,70.08828125],[83.08076171875001,70.093017578125],[83.10957031250001,70.1095703125],[83.13203125000001,70.157177734375],[83.09414062500002,70.22109375],[83.07382812500003,70.276708984375],[83.29345703125,70.321337890625],[83.4970703125,70.345263671875],[83.65986328125001,70.418359375],[83.70048828124999,70.46640625],[83.73593750000003,70.546484375],[83.65126953125002,70.672216796875],[83.57890624999999,70.76591796875],[83.33388671875002,70.988525390625],[83.15126953125002,71.10361328125],[83.26601562500002,71.27587890625],[83.45761718750003,71.467529296875],[83.53105468749999,71.5142578125],[83.55048828125001,71.54365234375],[83.5712890625,71.594384765625],[83.55351562499999,71.6498046875],[83.534375,71.683935546875],[83.34042968750003,71.8275390625],[83.20029296875003,71.87470703125],[82.75507812500001,71.90283203125],[82.64541015625002,71.925244140625],[82.31914062499999,72.071826171875],[82.28066406250002,72.105126953125],[82.20927734374999,72.211181640625],[82.18359375,72.237548828125],[82.09365234375002,72.2654296875],[81.79287109375002,72.326611328125],[81.58623046874999,72.351708984375],[81.28271484375,72.358837890625],[81.09814453125,72.38974609375],[80.82705078125002,72.48828125],[80.79775390625002,72.519970703125],[80.71962890625002,72.647900390625],[80.65625,72.71201171875],[80.67539062500003,72.7591796875],[80.77373046874999,72.860791015625],[80.84160156249999,72.949169921875],[80.75742187500003,73.025244140625],[80.638671875,73.049169921875],[80.50966796875002,73.086083984375],[80.45546875000002,73.155224609375],[80.42451171875001,73.23115234375],[80.4189453125,73.2896484375],[80.39804687500003,73.3568359375],[80.45830078124999,73.413720703125],[80.59589843750001,73.4740234375],[80.56191406250002,73.514990234375],[80.58320312500001,73.56845703125],[81.46884765625003,73.6404296875],[81.81699218750003,73.658837890625],[83.54472656249999,73.66650390625],[83.6669921875,73.686474609375],[84.41738281250002,73.722021484375],[84.73789062500003,73.762841796875],[85.07744140624999,73.71953125],[85.20058593750002,73.721533203125],[85.44833984375003,73.734619140625],[85.61142578125003,73.82158203125],[85.97929687499999,73.85693359375],[86.59140625000003,73.894287109375],[86.89296875000002,73.887109375],[86.96132812500002,73.8607421875],[87.02949218750001,73.824169921875],[86.69765625000002,73.716845703125],[86.36591796875001,73.619775390625],[86.09414062500002,73.5783203125],[85.82705078125002,73.4927734375],[85.80048828125001,73.458935546875],[85.79257812500003,73.438330078125],[85.80244140625001,73.3716796875],[85.81816406249999,73.326953125],[86.09814453125,73.272607421875],[86.30791015624999,73.195751953125],[86.51435546875001,73.140478515625],[86.67705078124999,73.106787109375],[86.71503906250001,73.125830078125],[86.12167968750003,73.30673828125],[85.97080078125003,73.3470703125],[85.91005859375002,73.3904296875],[85.93896484375,73.456494140625],[85.99892578125002,73.48583984375],[86.09238281250003,73.519140625],[86.15507812499999,73.53466796875],[86.37626953124999,73.56884765625],[87.1201171875,73.6150390625],[87.29443359375,73.7046875],[87.36953125000002,73.755908203125],[87.57119140625002,73.8107421875],[87.50322265624999,73.832470703125],[87.3375,73.846044921875],[87.20966796875001,73.878662109375],[86.69707031249999,74.1953125],[86.57109374999999,74.24375],[86.17783203125003,74.27939453125],[86.00136718750002,74.316015625],[86.18291015624999,74.423046875],[86.39580078124999,74.45009765625],[86.53847656250002,74.44423828125],[86.66474609375001,74.4142578125],[86.89794921875,74.325341796875],[87.22968750000001,74.3638671875],[87.10615234375001,74.403564453125],[86.89423828125001,74.44970703125],[86.70009765625002,74.5224609375],[86.42568359375002,74.585498046875],[86.11611328125002,74.628564453125],[85.791015625,74.6451171875],[85.88076171875002,74.740234375],[86.05888671874999,74.72822265625],[86.11953125000002,74.757421875],[86.20126953125003,74.8162109375],[86.65146484375003,74.682421875],[86.86289062500003,74.71787109375],[87.04179687499999,74.778857421875],[87.41933593750002,74.94091796875],[87.46757812499999,75.013232421875],[87.28740234374999,75.0525390625],[87.14072265625003,75.072265625],[86.93906250000003,75.068115234375],[86.92167968749999,75.11279296875],[87.00595703125003,75.16982421875],[87.17080078125002,75.191748046875],[87.67138671875,75.12958984375],[88.50371093749999,75.290478515625],[88.73310546875001,75.369189453125],[89.31025390625001,75.4701171875],[89.59511718750002,75.458251953125],[90.18496093750002,75.591064453125],[91.00468749999999,75.649560546875],[91.4794921875,75.649658203125],[91.84541015625001,75.723681640625],[92.40751953124999,75.749658203125],[92.6025390625,75.7791015625],[93.5498046875,75.8541015625],[94.0751953125,75.912890625],[94.15634765625003,75.959228515625],[93.68701171875,75.92158203125],[93.57402343749999,75.956298828125],[93.47548828125002,75.932861328125],[93.40605468749999,75.90126953125],[93.178125,75.958984375],[93.11630859375003,75.94462890625],[93.06865234374999,75.912841796875],[92.98662109374999,75.902685546875],[92.89042968749999,75.9099609375],[92.85859375000001,75.9794921875],[92.97158203125002,76.07509765625],[93.10488281250002,76.025830078125],[93.25927734375,76.098779296875],[93.35957031250001,76.100732421875],[93.6484375,76.054150390625],[93.84287109375003,76.101318359375],[94.10234374999999,76.123583984375],[94.38828125000003,76.102783203125],[94.50673828125002,76.107958984375],[94.57558593750002,76.1517578125],[95.03847656250002,76.113525390625],[95.35927734375002,76.139599609375],[95.57871093750003,76.1373046875],[95.919921875,76.113134765625],[96.07548828124999,76.081982421875],[95.98603515625001,76.00966796875],[95.6533203125,75.8921875],[95.74384765625001,75.872314453125],[95.93476562500001,75.926025390625],[96.50859374999999,76.00556640625],[96.6005859375,75.989892578125],[96.53769531250003,75.921630859375],[96.4970703125,75.8912109375],[96.87919921874999,75.9310546875],[97.20546875000002,76.018701171875],[97.35068359375003,76.0333984375],[97.49921875000001,75.980224609375],[97.6376953125,76.029052734375],[97.66982421875002,76.07802734375],[97.91835937500002,76.088671875],[98.02001953125,76.13369140625],[98.19462890624999,76.16640625],[98.34199218750001,76.18056640625],[98.66201171875002,76.24267578125],[98.77128906249999,76.2240234375],[98.98466796874999,76.207568359375],[99.18730468749999,76.17763671875],[99.56269531250001,76.109326171875],[99.615625,76.08232421875],[99.66318359375003,76.07802734375],[99.77041015625002,76.028759765625],[99.68925781249999,75.95634765625],[99.60234374999999,75.85205078125],[99.44218749999999,75.803173828125],[99.54072265625001,75.798583984375],[99.609375,75.811279296875],[99.7375,75.8806640625],[99.85136718749999,75.9302734375],[99.82539062500001,76.1359375],[99.61679687500003,76.240185546875],[99.46064453125001,76.27509765625],[99.09384765625003,76.384326171875],[98.96953124999999,76.430810546875],[98.8056640625,76.4806640625],[98.86943359374999,76.5095703125],[99.57626953125003,76.471435546875],[99.93574218750001,76.489892578125],[100.32236328125003,76.479150390625],[100.84375,76.5251953125],[101.06074218750001,76.47724609375],[101.31074218750001,76.47890625],[101.59775390625003,76.439208984375],[101.68378906250001,76.485498046875],[101.21298828125003,76.535693359375],[101.00263671875001,76.530517578125],[100.92802734374999,76.55673828125],[101.00625,76.615087890625],[101.09931640625001,76.70400390625],[101.00820312500002,76.78134765625],[100.92041015625,76.822509765625],[100.90585937500003,76.90068359375],[100.98994140625001,76.990478515625],[101.18574218750001,77.028564453125],[101.29287109375002,77.1015625],[101.51767578125003,77.198095703125],[102.61015624999999,77.508544921875],[103.13144531250003,77.62646484375],[103.33125,77.641064453125],[103.56074218750001,77.63193359375],[104.01455078125002,77.730419921875],[104.18486328124999,77.73046875],[104.81425781249999,77.652099609375],[104.96523437500002,77.5947265625],[105.30898437500002,77.54921875],[105.71025390624999,77.525244140625],[105.89453125,77.4888671875],[105.9833984375,77.447607421875],[106.0595703125,77.39052734375],[105.73417968749999,77.352001953125],[105.38457031249999,77.237841796875],[104.91191406249999,77.17470703125],[104.32363281250002,77.132666015625],[104.20244140624999,77.101806640625],[105.32021484375002,77.092333984375],[105.64589843750002,77.10068359375],[105.71201171875003,77.00146484375],[105.82216796875002,76.997509765625],[106.14541015625002,77.0453125],[106.33867187499999,77.0478515625],[106.705078125,77.01376953125],[106.78369140625,77.031787109375],[106.94160156250001,77.034375],[107.27890625000003,76.990966796875],[107.42978515625003,76.9265625],[107.19023437499999,76.822021484375],[106.94091796875,76.73046875],[106.63876953125003,76.573388671875],[106.54550781250003,76.586279296875],[106.38466796875002,76.589453125],[106.41357421875,76.512255859375],[106.68320312500003,76.514697265625],[106.82539062500001,76.480078125],[107.15771484375,76.524072265625],[107.62421875000001,76.510107421875],[107.72216796875,76.522314453125],[107.90224609375002,76.569677734375],[107.94990234375001,76.66064453125],[108.02792968750003,76.71845703125],[108.181640625,76.737841796875],[108.35205078125,76.71953125],[108.63837890625001,76.7201171875],[109.36933593750001,76.74921875],[109.98115234375001,76.711865234375],[110.47148437499999,76.7583984375],[111.11484375000003,76.723046875],[111.39248046875002,76.686669921875],[111.6005859375,76.622314453125],[111.7861328125,76.603564453125],[111.93867187500001,76.55341796875],[112.09394531250001,76.480322265625],[112.01679687500001,76.420556640625],[111.94267578124999,76.38046875],[112.14277343750001,76.423974609375],[112.29707031250001,76.43466796875],[112.41328125000001,76.40830078125],[112.61953125000002,76.383544921875],[112.68417968750003,76.21884765625],[112.74257812500002,76.1869140625],[112.79843750000003,76.129638671875],[112.721875,76.077197265625],[112.65625,76.053564453125],[112.81894531250003,76.05859375],[113.04667968749999,76.114111328125],[113.09404296874999,76.13291015625],[113.150390625,76.17451171875],[113.06601562500003,76.215234375],[112.98798828125001,76.23974609375],[113.08603515625003,76.25810546875],[113.27265625000001,76.25166015625],[113.36552734374999,76.178857421875],[113.427734375,76.112109375],[113.56386718750002,75.891650390625],[113.85722656249999,75.9212890625],[113.87099609375002,75.856005859375],[113.74873046875001,75.70478515625],[113.61992187499999,75.59267578125],[113.56757812500001,75.568408203125],[113.48593750000003,75.56396484375],[113.51718750000003,75.621875],[113.46904296874999,75.656689453125],[113.3916015625,75.677880859375],[113.12636718750002,75.698681640625],[112.62919921874999,75.835400390625],[112.49667968750003,75.84990234375],[112.46611328124999,75.84365234375],[112.45302734375002,75.83017578125],[112.72958984375003,75.737646484375],[112.95566406250003,75.571923828125],[113.16152343750002,75.6205078125],[113.24296874999999,75.61142578125],[113.35625,75.53427734375],[113.55888671874999,75.50205078125],[113.72617187500003,75.450634765625],[113.61357421874999,75.29296875],[112.92490234375003,75.0150390625],[112.19199218750003,74.853173828125],[111.86826171875003,74.7400390625],[111.29902343750001,74.658447265625],[110.89277343750001,74.548095703125],[110.37353515625,74.466064453125],[110.22587890624999,74.378662109375],[109.84033203125,74.32197265625],[109.86640625000001,74.29306640625],[109.91132812500001,74.261328125],[109.86386718750003,74.20888671875],[109.81025390625001,74.169189453125],[109.51083984375003,74.088818359375],[109.075,74.03232421875],[108.19951171874999,73.694091796875],[107.76542968749999,73.625],[107.27109375000003,73.621044921875],[107.1669921875,73.589404296875],[106.79423828124999,73.37666015625],[106.67939453125001,73.3306640625],[106.18867187500001,73.3080078125],[105.67714843750002,72.95927734375],[105.39277343750001,72.841015625],[105.14394531250002,72.77705078125],[105.40273437500002,72.78994140625],[105.70820312500001,72.836669921875],[106.06669921874999,72.949853515625],[106.15957031250002,73.002001953125],[106.20878906249999,73.060546875],[106.31503906250003,73.106396484375],[106.47792968750002,73.139404296875],[107.10878906250002,73.177294921875],[107.36875,73.163134765625],[107.75039062500002,73.17314453125],[108.00126953124999,73.235595703125],[108.15097656250003,73.25791015625],[108.28535156250001,73.265869140625],[108.35146484375002,73.310205078125],[108.57539062500001,73.31904296875],[109.08994140625003,73.37841796875],[109.165625,73.399609375],[109.3310546875,73.487451171875],[109.63710937500002,73.45400390625],[109.85527343749999,73.4724609375],[110.4287109375,73.62890625],[110.77333984375002,73.68916015625],[110.8681640625,73.730712890625],[110.79921875000002,73.759765625],[110.72236328125001,73.779931640625],[110.38828125000003,73.726025390625],[110.09121093750002,73.708544921875],[109.75273437499999,73.72255859375],[109.70673828125001,73.74375],[109.665625,73.800244140625],[109.77412109375001,73.88125],[109.869140625,73.930615234375],[110.08388671875002,73.994384765625],[110.26142578125001,74.017431640625],[110.92011718750001,73.947900390625],[111.05625,73.93935546875],[111.130859375,74.05283203125],[111.34140625000003,74.04736328125],[111.55058593749999,74.028515625],[111.4599609375,74.004833984375],[111.228125,73.9685546875],[111.29951171875001,73.88486328125],[111.400390625,73.827734375],[111.8037109375,73.745263671875],[112.14726562499999,73.708935546875],[112.4,73.7111328125],[112.79541015625,73.74609375],[112.85595703125,73.771142578125],[112.93964843750001,73.83564453125],[112.8359375,73.962060546875],[112.93496093750002,73.945703125],[113.03281250000003,73.9138671875],[113.18154296875002,73.83740234375],[113.32685546875001,73.707421875],[113.41621093750001,73.647607421875],[113.36445312500001,73.582763671875],[113.15693359375001,73.4595703125],[113.27695312500003,73.39150390625],[113.49091796875001,73.34609375],[113.48759765624999,73.1451171875],[113.474609375,73.0478515625],[113.36933593750001,72.94189453125],[113.24736328124999,72.897216796875],[113.12783203125002,72.8306640625],[113.158203125,72.769482421875],[113.18613281250003,72.73017578125],[113.31220703125001,72.657373046875],[113.66455078125,72.634521484375],[113.7119140625,72.654150390625],[113.63007812500001,72.677099609375],[113.39140624999999,72.71103515625],[113.29814453124999,72.7388671875],[113.21552734375001,72.805859375],[113.3115234375,72.8783203125],[113.41748046875,72.932177734375],[113.54277343749999,73.054345703125],[113.58144531250002,73.142236328125],[113.55888671874999,73.2326171875],[113.63916015625,73.273583984375],[113.76523437500003,73.31796875],[113.82929687500001,73.3265625],[113.88623046875,73.34580078125],[113.79511718750001,73.367431640625],[113.71132812500002,73.378564453125],[113.53945312500002,73.433642578125],[113.51035156250003,73.50498046875],[113.85693359375,73.5333984375],[114.060546875,73.58466796875],[114.81601562500003,73.607177734375],[115.33769531249999,73.702587890625],[116.49550781250002,73.67607421875],[117.30859375,73.599169921875],[118.4501953125,73.589794921875],[118.87089843749999,73.537890625],[118.91123046875003,73.518359375],[118.93642578125002,73.481201171875],[118.75449218750003,73.464501953125],[118.45703125,73.464404296875],[118.37656250000003,73.367236328125],[118.43027343750003,73.246533203125],[118.96035156250002,73.11728515625],[119.42529296875,73.06396484375],[119.75039062500002,72.9791015625],[119.92167968749999,72.971337890625],[120.59794921874999,72.981103515625],[120.99716796875003,72.93671875],[121.35429687499999,72.970849609375],[121.74785156249999,72.969677734375],[121.88603515624999,72.960888671875],[122.02978515625,72.897216796875],[122.26015625000002,72.88056640625],[122.5375,72.877783203125],[122.69208984375001,72.8908203125],[122.751953125,72.906494140625],[122.73085937500002,72.931298828125],[122.501953125,72.970654296875],[122.52675781250002,73.01669921875],[122.615234375,73.0279296875],[122.99931640624999,72.9646484375],[123.16035156250001,72.9548828125],[123.30117187500002,73.001806640625],[123.40458984374999,73.08564453125],[123.46162109375001,73.144189453125],[123.521875,73.172900390625],[123.57246093750001,73.17734375],[123.62226562500001,73.19326171875],[123.5009765625,73.26162109375],[123.38388671875003,73.347314453125],[123.35527343749999,73.402490234375],[123.32265625000002,73.430810546875],[123.30507812500002,73.53291015625],[123.41621093750001,73.636865234375],[123.49111328125002,73.666357421875],[123.796875,73.6267578125],[123.93388671874999,73.689306640625],[124.01904296875,73.7123046875],[124.38808593750002,73.754833984375],[124.54121093750001,73.75126953125],[124.79628906250002,73.711767578125],[125.61708984375002,73.52060546875],[125.59853515625002,73.447412109375],[125.79443359375,73.46845703125],[125.88789062500001,73.498095703125],[126.107421875,73.51748046875],[126.25449218750003,73.548193359375],[126.29599609375003,73.536669921875],[126.34492187500001,73.506298828125],[126.30888671874999,73.463671875],[126.25742187500003,73.419775390625],[126.29248046875,73.394189453125],[126.33544921875,73.38876953125],[126.55253906249999,73.334912109375],[126.83847656250003,73.4341796875],[126.95517578125003,73.52822265625],[127.03134765625003,73.5474609375],[127.74033203125003,73.48154296875],[127.955078125,73.445556640625],[127.996875,73.425634765625],[128.02568359375005,73.390771484375],[128.14169921875003,73.352392578125],[128.2814453125,73.33056640625],[128.26416015625,73.300732421875],[128.2578125,73.26748046875],[128.58701171875003,73.26240234375],[128.73046875,73.2333984375],[128.888671875,73.190234375],[128.87167968750003,73.13935546875],[128.91337890625005,73.110595703125],[129.05917968750003,73.10751953125],[129.1005859375,73.112353515625],[129.0537109375,73.04541015625],[128.853515625,72.972607421875],[128.73525390625002,72.94326171875],[128.59902343750002,72.895166015625],[128.6740234375,72.885888671875],[129.01728515625,72.8724609375],[129.22910156250003,72.775732421875],[129.25039062500002,72.70517578125],[129.11757812500002,72.676953125],[128.81533203125002,72.585888671875],[128.63339843750003,72.550146484375],[128.50849609375,72.547314453125],[128.41826171875005,72.53515625],[128.54941406250003,72.495849609375],[129.11660156250002,72.4857421875],[129.28134765625003,72.4376953125],[129.41171875000003,72.315478515625],[129.41064453125,72.16630859375],[129.28349609375005,72.092041015625],[128.93496093750002,72.0794921875],[128.47519531250003,72.245556640625],[128.19697265625,72.309619140625],[127.80341796875001,72.434033203125],[127.72607421875,72.41318359375],[127.84140625000003,72.308251953125],[128.0265625,72.25],[128.35878906250002,72.088330078125],[128.91142578125005,71.755322265625],[129.04013671875003,71.782421875],[129.11660156250002,71.824609375],[129.15419921875002,71.878662109375],[129.12158203125,71.95322265625],[129.21025390625005,71.916943359375],[129.29179687500005,71.8501953125],[129.46083984375002,71.739306640625],[129.23417968750005,71.74482421875],[128.94902343750005,71.707568359375],[128.84326171875,71.6634765625],[128.92265625000005,71.6017578125],[129.13427734375,71.59287109375],[129.22451171875002,71.508837890625],[129.38984375,71.4048828125],[129.7619140625,71.11953125],[130.02597656250003,71.065380859375],[130.28125,70.947314453125],[130.537109375,70.892529296875],[130.66845703125,70.888330078125],[130.75712890625005,70.962353515625],[130.83193359375002,70.935888671875],[130.89804687500003,70.803564453125],[131.02158203125003,70.74609375],[131.157421875,70.7421875],[131.26826171875,70.76552734375],[131.43232421875,70.828271484375],[131.56201171875,70.901025390625],[131.76904296875,71.101416015625],[131.9064453125,71.20263671875],[132.0353515625,71.24404296875],[131.99082031250003,71.293212890625],[132.00371093750005,71.3501953125],[132.098828125,71.483984375],[132.22763671875003,71.6427734375],[132.32578125000003,71.726220703125],[132.56230468750005,71.8953125],[132.65390625000003,71.9259765625],[132.7158203125,71.871484375],[132.7685546875,71.79873046875],[132.80361328125002,71.767578125],[132.83925781250002,71.75517578125],[133.130859375,71.606689453125],[133.42617187500002,71.490966796875],[133.68886718750002,71.434228515625],[134.10283203125005,71.378955078125],[134.70273437500003,71.38681640625],[134.81386718750002,71.460595703125],[135.02236328125002,71.5150390625],[135.359375,71.543505859375],[135.55917968750003,71.6103515625],[135.884765625,71.63056640625],[136.09033203125,71.619580078125],[136.40615234375002,71.570751953125],[137.11582031250003,71.415673828125],[137.3154296875,71.359423828125],[137.41748046875,71.2990234375],[137.6505859375,71.208154296875],[137.7978515625,71.163916015625],[137.9396484375,71.1333984375],[137.99169921875,71.142724609375],[137.97373046875003,71.16865234375],[137.90195312500003,71.19404296875],[137.84404296875005,71.226806640625],[138.0126953125,71.26083984375],[138.03251953125005,71.28583984375],[138.090625,71.307421875],[138.31406250000003,71.325537109375],[138.09716796875,71.35859375],[138.02216796875,71.363427734375],[137.91835937500002,71.38408203125],[137.92734375000003,71.42978515625],[137.99570312500003,71.463525390625],[138.04833984375,71.5259765625],[138.11845703125005,71.566162109375],[138.23417968750005,71.596337890625],[138.31806640625,71.60283203125],[138.52519531250005,71.562744140625],[138.67001953125003,71.634814453125],[138.78017578125002,71.62900390625],[139.0048828125,71.5560546875],[139.209375,71.444775390625],[139.32021484375002,71.4447265625],[139.63212890625005,71.4892578125],[139.98417968750005,71.49150390625],[139.93876953125005,71.557666015625],[139.69511718750005,71.700439453125],[139.72294921875005,71.8849609375],[139.55234375000003,71.926708984375],[139.35927734375002,71.9513671875],[139.64023437500003,71.99833984375],[139.84707031250002,72.148583984375],[140.01406250000002,72.162109375],[140.1876953125,72.19130859375],[140.134375,72.209619140625],[139.61699218750005,72.22568359375],[139.50527343750002,72.207666015625],[139.43046875000005,72.1634765625],[139.17636718750003,72.1634765625],[139.14501953125,72.264404296875],[139.1408203125,72.329736328125],[139.4736328125,72.46650390625],[139.60117187500003,72.49609375],[140.45058593750002,72.493115234375],[140.705078125,72.5189453125],[141.079296875,72.5869140625],[140.98320312500005,72.630029296875],[140.9728515625,72.7169921875],[140.65234375,72.842822265625],[140.6759765625,72.871630859375],[140.70810546875003,72.8900390625],[140.80820312500003,72.890966796875],[141.309765625,72.85771484375],[141.51835937500005,72.788671875],[142.06142578125002,72.72080078125],[143.5158203125,72.6982421875],[143.68095703125005,72.673193359375],[144.30390625,72.643017578125],[144.56865234375005,72.609912109375],[145.19931640625003,72.57021484375],[145.48574218750002,72.54208984375],[145.71416015625005,72.49736328125],[146.08330078125005,72.47138671875],[146.2529296875,72.442236328125],[146.23476562500002,72.34970703125],[145.46708984375005,72.362060546875],[145.212890625,72.39267578125],[144.8974609375,72.396240234375],[144.7763671875,72.382275390625],[144.58759765625,72.305517578125],[144.36093750000003,72.26533203125],[144.16923828125005,72.2587890625],[144.294921875,72.192626953125],[144.470703125,72.174755859375],[145.03916015625003,72.25986328125],[146.59414062500002,72.30244140625],[146.83183593750005,72.29541015625],[146.80703125000002,72.236572265625],[146.59921875000003,72.12353515625],[146.40166015625005,72.035498046875],[146.11328125,71.944970703125],[146.005859375,71.945458984375],[146.23027343750005,72.1375],[146.13730468750003,72.146484375],[146.05146484375,72.14228515625],[145.79941406250003,72.221875],[145.75859375000005,72.22587890625],[145.70966796875,72.20634765625],[145.71015625,72.177587890625],[145.6640625,72.0669921875],[145.75673828125002,72.020654296875],[145.75673828125002,71.94130859375],[145.4072265625,71.89013671875],[145.27119140625,71.89462890625],[145.12578125000005,71.9271484375],[145.06396484375,71.92607421875],[145.046875,71.901025390625],[145.07773437500003,71.854638671875],[145.07373046875,71.830859375],[145.01787109375005,71.793701171875],[144.98964843750002,71.753369140625],[145.07558593750002,71.707373046875],[145.18857421875003,71.69580078125],[145.80478515625003,71.746484375],[146.0732421875,71.808349609375],[146.36796875000005,71.9220703125],[146.8947265625,72.197509765625],[147.12705078125003,72.292041015625],[147.26181640625003,72.327880859375],[147.43398437500002,72.34091796875],[148.40205078125,72.311962890625],[148.96484375,72.25234375],[149.50156250000003,72.164306640625],[149.76621093750003,72.091259765625],[149.9630859375,71.9921875],[149.99814453125003,71.95048828125],[150.01689453125005,71.895654296875],[149.8810546875,71.843017578125],[149.27968750000002,71.825537109375],[149.04873046875002,71.795751953125],[148.96533203125,71.76279296875],[148.95488281250005,71.744140625],[148.92333984375,71.7146484375],[148.96816406250002,71.690478515625],[149.23789062500003,71.687939453125],[149.498046875,71.664013671875],[149.85712890625,71.60146484375],[149.91269531250003,71.580712890625],[150.02646484375003,71.521337890625],[150.06083984375005,71.51083984375],[150.5998046875,71.5201171875],[150.63486328125003,71.498876953125],[150.66777343750005,71.455224609375],[150.52509765625,71.38583984375],[150.384765625,71.338818359375],[150.09765625,71.2265625],[150.24296875000005,71.2671875],[150.82167968750002,71.362890625],[150.9677734375,71.38046875],[151.14531250000005,71.37373046875],[151.58242187500002,71.286962890625],[151.759765625,71.217822265625],[152.0927734375,71.023291015625],[151.99980468750005,71.002490234375],[151.76201171875005,70.982470703125],[152.5087890625,70.83447265625],[152.79833984375,70.83564453125],[153.46064453125,70.87861328125],[153.794140625,70.87998046875],[154.41396484375002,70.974462890625],[155.0294921875,71.034228515625],[155.5958984375,71.038623046875],[155.89521484375,71.0955078125],[156.6845703125,71.09375],[157.44736328125003,71.07451171875],[158.03701171875002,71.0392578125],[158.7021484375,70.935009765625],[159.35068359375003,70.79072265625],[159.72792968750002,70.649658203125],[159.8046875,70.604931640625],[159.91181640625,70.506103515625],[159.95859375000003,70.4236328125],[160.00644531250003,70.30966796875],[159.9833984375,70.22138671875],[159.8896484375,70.1587890625],[159.83144531250002,70.0814453125],[159.83916015625005,69.989990234375],[159.72939453125002,69.87021484375],[159.83251953125,69.7849609375],[160.119140625,69.72978515625],[160.739453125,69.65517578125],[160.91074218750003,69.60634765625],[160.92890625,69.458544921875],[160.98203125000003,69.33447265625],[161.03554687500002,69.098193359375],[161.1408203125,69.0388671875],[161.30986328125005,68.982275390625],[161.340625,68.90517578125],[161.12900390625003,68.653857421875],[160.99667968750003,68.60751953125],[160.85605468750003,68.538330078125],[161.1044921875,68.5625],[161.23017578125,68.65390625],[161.36513671875002,68.822998046875],[161.4953125,68.849853515625],[161.565625,68.90517578125],[161.565625,69.06396484375],[161.48007812500003,69.201708984375],[161.48007812500003,69.30009765625],[161.53691406250005,69.379541015625],[161.94511718750005,69.5451171875],[162.166015625,69.611572265625],[162.37568359375,69.649072265625],[162.94462890625005,69.682763671875],[163.2013671875,69.71474609375],[163.498046875,69.69326171875],[163.7052734375,69.701806640625],[163.94599609375,69.73515625],[164.15957031250002,69.719287109375],[164.51328125000003,69.609130859375],[165.7607421875,69.584423828125],[165.98046875,69.54599609375],[166.8203125,69.499560546875],[166.884375,69.49990234375],[167.07314453125002,69.554443359375],[167.628125,69.74033203125],[167.85683593750002,69.72822265625],[167.95009765625002,69.699169921875],[168.04765625000005,69.625634765625],[168.15,69.577392578125],[168.22998046875,69.447021484375],[168.30302734375005,69.271484375],[168.423046875,69.239501953125],[168.58759765625,69.228369140625],[168.94619140625002,69.163330078125],[169.31064453125003,69.079541015625],[169.41464843750003,68.91962890625],[169.60986328125,68.78603515625],[170.065625,68.798681640625],[170.53759765625,68.825390625],[170.99541015625005,69.0453125],[170.99667968750003,69.134716796875],[170.8837890625,69.263623046875],[170.71416015625005,69.388232421875],[170.5822265625,69.583349609375],[170.16093750000005,69.6265625],[170.201171875,69.683203125],[170.3595703125,69.7509765625],[170.503125,69.85654296875],[170.525390625,69.937890625],[170.48681640625,70.107568359375],[170.86796875000005,70.096044921875],[171.24667968750003,70.076123046875],[171.97050781250005,70.000341796875],[172.5595703125,69.968359375],[172.86923828125003,69.919775390625],[173.05634765625,69.86494140625],[173.27744140625003,69.823828125],[173.35332031250005,69.9240234375],[173.438671875,69.946826171875],[173.7333984375,69.89111328125],[173.94804687500005,69.87412109375],[174.31943359375003,69.881640625],[174.78554687500002,69.8556640625],[175.29560546875,69.86005859375],[175.751171875,69.904150390625],[175.92148437500003,69.8953125],[176.10751953125003,69.860302734375],[176.41044921875005,69.768505859375],[176.92441406250003,69.64599609375],[177.39453125,69.61162109375],[177.93369140625003,69.49560546875],[178.44277343750002,69.452978515625],[178.84833984375,69.38720703125],[178.90693359375,69.362109375],[178.925,69.3259765625],[178.95068359375,69.29580078125],[179.27265625,69.25966796875],[179.86826171875003,69.0126953125],[180,68.983447265625],[180,65.309912109375],[180,65.067236328125],[179.82734375,65.0341796875],[179.6513671875,64.920947265625],[179.4482421875,64.822021484375],[179.15,64.781591796875],[178.6984375,64.631103515625],[178.51953125,64.602978515625],[178.2853515625,64.672265625],[177.74863281250003,64.717041015625],[177.58164062500003,64.777880859375],[177.33701171875003,64.93134765625],[177.25185546875002,64.95361328125],[177.17919921875,65.014111328125],[176.880859375,65.08193359375],[176.62480468750005,65.03759765625],[176.4130859375,65.071240234375],[176.341015625,65.047314453125],[176.4521484375,65.025244140625],[176.6455078125,65.007177734375],[176.94003906250003,65.016015625],[177.0373046875,64.999658203125],[177.12343750000002,64.947021484375],[177.2228515625,64.861669921875],[177.14824218750005,64.804833984375],[177.06875,64.786669921875],[176.8310546875,64.84921875],[176.556640625,64.839990234375],[176.42949218750005,64.85517578125],[176.06113281250003,64.960888671875],[175.78115234375002,64.84404296875],[175.396484375,64.78369140625],[175.09775390625003,64.77685546875],[174.548828125,64.68388671875],[174.69863281250002,64.6814453125],[175.09707031250002,64.746630859375],[175.33066406250003,64.746630859375],[175.6779296875,64.782470703125],[175.85859375,64.82529296875],[175.94589843750003,64.865185546875],[176.05654296875002,64.904736328125],[176.16923828125005,64.884765625],[176.24697265625002,64.843017578125],[176.30087890625003,64.783837890625],[176.35097656250002,64.705126953125],[176.283203125,64.663818359375],[176.21943359375,64.641943359375],[176.14091796875005,64.58583984375],[176.50761718750005,64.682421875],[176.73095703125,64.624853515625],[176.84287109375003,64.6337890625],[177.0498046875,64.71923828125],[177.3875,64.7740234375],[177.42744140625,64.76337890625],[177.46718750000002,64.73681640625],[177.40986328125,64.572802734375],[177.43291015625005,64.444482421875],[177.6875,64.304736328125],[177.9533203125,64.222265625],[178.04472656250005,64.219580078125],[178.13056640625,64.23525390625],[178.16396484375002,64.30908203125],[178.2294921875,64.364404296875],[178.31298828125,64.314404296875],[178.38144531250003,64.260888671875],[178.47714843750003,64.127880859375],[178.4748046875,64.089013671875],[178.4513671875,64.011376953125],[178.53603515625002,63.975634765625],[178.65029296875002,63.965283203125],[178.69248046875003,63.842333984375],[178.7314453125,63.66708984375],[178.68134765625,63.650732421875],[178.6259765625,63.650732421875],[178.4404296875,63.60556640625],[178.46611328125005,63.574072265625],[178.65371093750002,63.556640625],[178.70644531250002,63.521533203125],[178.66884765625002,63.43994140625],[178.6787109375,63.402294921875],[178.74404296875002,63.394775390625],[178.78671875000003,63.442431640625],[178.775390625,63.51025390625],[178.79296875,63.54033203125],[178.91855468750003,63.400244140625],[178.92148437500003,63.34501953125],[179.028125,63.282421875],[179.33232421875005,63.190185546875],[179.38857421875002,63.147216796875],[179.40507812500005,63.077734375],[179.32900390625002,63.05791015625],[179.25957031250005,63.00830078125],[179.30214843750002,62.93984375],[179.3810546875,62.883691406249994],[179.5109375,62.86279296875],[179.5705078125,62.773486328125],[179.5705078125,62.6875],[179.47724609375,62.6130859375],[179.28867187500003,62.5103515625],[179.176953125,62.469189453125],[179.13388671875003,62.396435546875],[179.12070312500003,62.320361328125],[179.04462890625,62.323681640625],[178.9638671875,62.3552734375],[178.01923828125,62.54697265625],[177.6630859375,62.5828125],[177.35126953125,62.587451171875],[177.29257812500003,62.599023437499994],[177.2958984375,62.644482421875],[177.31582031250002,62.68525390625],[177.35966796875005,62.736962890624994],[177.33896484375003,62.78134765625],[177.29833984375,62.784228515625],[177.25869140625002,62.750439453125],[177.17265625000005,62.750341796875],[177.09121093750002,62.78955078125],[177.02353515625003,62.777246093749994],[176.99003906250005,62.722216796875],[176.96347656250003,62.693261718749994],[176.96474609375002,62.658642578125],[177.0080078125,62.6265625],[177.1896484375,62.5916015625],[177.15947265625005,62.560986328125],[176.907421875,62.536083984375],[176.70253906250002,62.505761718749994],[176.4365234375,62.41083984375],[176.32841796875005,62.346044921875],[175.61386718750003,62.184375],[175.44199218750003,62.1279296875],[175.36582031250003,62.121337890625],[175.26787109375005,62.102392578125],[175.1923828125,62.034423828125],[174.79755859375,61.938867187499994],[174.7150390625,61.947900390624994],[174.610546875,61.867626953125],[174.51435546875,61.823632812499994],[174.28496093750005,61.817529296874994],[174.1388671875,61.795166015625],[173.82236328125003,61.67939453125],[173.62343750000002,61.716064453125],[173.39072265625003,61.55673828125],[173.1318359375,61.406640625],[173.05458984375002,61.406201171875],[172.85654296875003,61.469189453125],[172.8068359375,61.4361328125],[172.837890625,61.3755859375],[172.90800781250005,61.31162109375],[172.86777343750003,61.29306640625],[172.7890625,61.310693359374994],[172.7306640625,61.314404296875],[172.69003906250003,61.295166015625],[172.69697265625,61.24931640625],[172.58476562500005,61.1904296875],[172.4970703125,61.185888671875],[172.39609375000003,61.167382812499994],[172.36240234375003,61.116601562499994],[172.3927734375,61.061767578125],[172.21328125000002,60.9978515625],[172.06728515625002,60.915673828124994],[171.99765625000003,60.90068359375],[171.91796875,60.864111328125],[171.83056640625,60.837353515625],[171.7294921875,60.843115234375],[171.48974609375,60.725732421874994],[170.94931640625003,60.52294921875],[170.79931640625,60.496484375],[170.60820312500005,60.434912109375],[170.58974609375002,60.393701171874994],[170.58857421875,60.34287109375],[170.51230468750003,60.259521484375],[170.42343750000003,60.047802734375],[170.396484375,60.009765625],[170.35097656250002,59.96552734375],[170.15410156250005,59.986083984375],[169.9826171875,60.06708984375],[169.92724609375,60.104248046875],[169.89755859375003,60.147851562499994],[169.88701171875005,60.217919921874994],[169.85429687500005,60.250244140625],[169.81474609375005,60.265380859375],[169.618359375,60.438037109375],[169.27568359375005,60.556640625],[169.2267578125,60.595947265625],[168.78828125,60.563818359375],[168.67031250000002,60.562890625],[168.46279296875002,60.592236328125],[168.1375,60.57392578125],[167.74599609375002,60.509326171875],[167.62607421875003,60.4689453125],[167.2267578125,60.406298828125],[166.9640625,60.30703125],[166.45253906250002,59.947021484375],[166.33183593750005,59.872412109375],[166.27304687500003,59.85625],[166.1865234375,59.849462890625],[166.14892578125,59.9220703125],[166.13603515625005,59.979345703125],[166.16835937500002,60.088818359375],[166.22978515625005,60.1783203125],[166.29248046875,60.34609375],[166.30810546875,60.4142578125],[166.35214843750003,60.484814453125],[166.18017578125,60.480371093749994],[165.94199218750003,60.356884765625],[165.5830078125,60.236474609374994],[165.41582031250005,60.20517578125],[165.28525390625003,60.134912109374994],[165.192578125,60.124755859375],[165.08457031250003,60.098583984375],[165.07363281250002,59.94560546875],[165.01894531250002,59.860742187499994],[164.95371093750003,59.843603515625],[164.85429687500005,59.840966796874994],[164.77939453125003,59.87421875],[164.66972656250005,59.997460937499994],[164.52529296875002,60.061279296875],[164.44003906250003,60.072705078125],[164.37685546875002,60.058056640625],[164.25156250000003,59.973779296874994],[164.11328125,59.89755859375],[164.13505859375005,59.984375],[164.017578125,60.017333984375],[163.91289062500005,60.037060546875],[163.78007812500005,60.04111328125],[163.74384765625,60.02802734375],[163.69003906250003,59.978417968749994],[163.57431640625003,59.9140625],[163.49375,59.886767578125],[163.40996093750005,59.8349609375],[163.36484375000003,59.7814453125],[163.32119140625002,59.705419921875],[163.26904296875,59.52001953125],[163.27285156250002,59.302587890625],[163.08486328125002,59.131396484375],[163.01015625000002,59.148291015625],[162.97490234375005,59.137060546875],[162.94003906250003,59.114306640625],[163.00429687500002,59.020166015624994],[162.96982421875003,58.986474609374994],[162.9345703125,58.96396484375],[162.84726562500003,58.9392578125],[162.64335937500005,58.79990234375],[162.45302734375002,58.70859375],[162.1416015625,58.447412109374994],[162.04921875000002,58.272851562499994],[161.96005859375003,58.076904296875],[162.001953125,57.98095703125],[162.03964843750003,57.918261718749996],[162.09794921875005,57.874658203125],[162.1974609375,57.829150390624996],[162.41142578125005,57.778369140624996],[162.39218750000003,57.74501953125],[162.39140625000005,57.717236328125],[162.4669921875,57.7662109375],[162.52197265625,57.904101562499996],[162.654296875,57.9482421875],[162.71835937500003,57.94609375],[163.14501953125,57.8373046875],[163.22578125,57.790380859375],[163.2138671875,57.686816406249996],[163.18789062500002,57.63740234375],[163.10878906250002,57.56484375],[162.95703125,57.477490234375],[162.779296875,57.3576171875],[162.76230468750003,57.28408203125],[162.76152343750005,57.243945312499996],[162.80810546875,57.102783203125],[162.81484375000002,57.023388671875],[162.79111328125003,56.875390625],[162.80263671875002,56.811474609375],[162.84990234375005,56.7568359375],[162.9220703125,56.72265625],[163.04638671875,56.74130859375],[163.16542968750002,56.72548828125],[163.25654296875,56.688037109374996],[163.24326171875003,56.56455078125],[163.29404296875003,56.447705078125],[163.33554687500003,56.23251953125],[163.26132812500003,56.17373046875],[163.18925781250005,56.137011718749996],[163.04736328125,56.044677734375],[162.9716796875,56.0337890625],[162.84033203125,56.065625],[162.628125,56.232275390625],[162.71318359375005,56.330859375],[162.89326171875,56.399462890624996],[162.97519531250003,56.449023437499996],[163.03837890625005,56.521875],[162.94414062500005,56.508056640625],[162.87763671875,56.476367187499996],[162.67148437500003,56.490087890625],[162.5890625,56.454931640625],[162.48867187500002,56.39912109375],[162.52822265625002,56.260693359375],[162.4611328125,56.235498046875],[162.33408203125003,56.187744140625],[162.14609375000003,56.128271484375],[162.0849609375,56.089648437499996],[161.9240234375,55.840380859374996],[161.7755859375,55.654833984374996],[161.72392578125005,55.496142578124996],[161.72939453125002,55.3580078125],[161.78496093750005,55.205322265625],[161.82421875,55.138916015625],[161.99609375,54.997998046875],[162.0802734375,54.8861328125],[162.10556640625003,54.7521484375],[161.96689453125003,54.688671875],[161.72568359375003,54.532958984375],[161.62480468750005,54.516259765625],[161.29404296875003,54.520556640624996],[161.1298828125,54.5982421875],[160.935546875,54.578369140625],[160.77265625,54.541357421875],[160.51718750000003,54.430859375],[160.28886718750005,54.288232421875],[160.0744140625,54.18916015625],[160.01015625000002,54.130859375],[159.92177734375002,54.0083984375],[159.84375,53.783642578125],[159.87089843750005,53.67265625],[159.9142578125,53.620849609375],[159.95585937500005,53.552197265625],[159.89912109375,53.447705078125],[159.89765625,53.38076171875],[160.0021484375,53.27490234375],[160.02509765625,53.12958984375],[159.9474609375,53.12509765625],[159.77158203125003,53.2296875],[159.5859375,53.2376953125],[159.13613281250002,53.117138671875],[158.95205078125002,53.04755859375],[158.74541015625005,52.908935546875],[158.68369140625003,52.935400390625],[158.63955078125002,53.014794921875],[158.5646484375,53.05],[158.47207031250002,53.032373046875],[158.43232421875,52.957421875],[158.56015625000003,52.922167968749996],[158.60878906250002,52.8736328125],[158.53369140625,52.688427734375],[158.48076171875005,52.62666015625],[158.50039062500002,52.460302734375],[158.4931640625,52.383154296875],[158.46347656250003,52.304980468749996],[158.33164062500003,52.090869140624996],[158.103515625,51.809619140624996],[157.8232421875,51.605322265625],[157.62890625,51.534570312499994],[157.53095703125,51.479882812499994],[157.48984375000003,51.408935546875],[157.20224609375003,51.212744140625],[156.84746093750005,51.006591796875],[156.74775390625,50.969287109374996],[156.72431640625,51.0470703125],[156.71347656250003,51.12412109375],[156.67080078125002,51.226855468749996],[156.54345703125,51.31162109375],[156.52119140625,51.380273437499994],[156.50039062500002,51.47509765625],[156.48984375000003,51.913037109375],[156.37734375000002,52.366552734375],[156.36474609375,52.509375],[156.22861328125003,52.626269531249996],[156.15439453125003,52.747265625],[156.1103515625,52.866162109375],[156.098828125,53.006494140625],[155.9501953125,53.744287109375],[155.90488281250003,53.928125],[155.70644531250002,54.521484375],[155.6203125,54.864550781249996],[155.56386718750002,55.19912109375],[155.5548828125,55.348486328125],[155.64345703125002,55.7935546875],[155.71660156250005,56.072216796875],[155.98251953125003,56.69521484375],[156.025390625,56.752001953124996],[156.06748046875003,56.781591796875],[156.529296875,57.02119140625],[156.72841796875002,57.15224609375],[156.848828125,57.290185546875],[156.9767578125,57.46630859375],[156.96357421875,57.5609375],[156.9482421875,57.615771484374996],[156.89990234375,57.676904296875],[156.79160156250003,57.74794921875],[156.82988281250005,57.779638671875],[156.87197265625002,57.803662109375],[156.98574218750002,57.83017578125],[157.216796875,57.776806640625],[157.450390625,57.799267578125],[157.66640625000002,58.019775390625],[157.974609375,57.9859375],[158.21044921875,58.025292968749994],[158.27519531250005,58.008984375],[158.32109375000005,58.083447265625],[158.4494140625,58.162841796875],[158.68701171875,58.28134765625],[159.03691406250005,58.42392578125],[159.21064453125,58.519433593749994],[159.30839843750005,58.610546875],[159.45263671875,58.695947265624994],[159.59150390625,58.803662109375],[159.84736328125,59.1271484375],[160.35039062500005,59.39404296875],[160.54746093750003,59.54736328125],[160.71142578125,59.60166015625],[160.85527343750005,59.626855468749994],[161.2189453125,59.845605468749994],[161.44931640625003,60.02734375],[161.75351562500003,60.152294921875],[161.84599609375005,60.2322265625],[162.00361328125,60.420166015625],[162.06816406250005,60.46640625],[162.26630859375,60.53671875],[162.71318359375005,60.65947265625],[162.97314453125,60.78291015625],[163.35234375000005,60.800439453124994],[163.46640625000003,60.849755859374994],[163.58515625,60.8771484375],[163.7099609375,60.916796875],[163.55351562500005,61.025634765625],[163.58925781250002,61.084375],[163.61962890625,61.111328125],[163.89335937500005,61.240478515625],[164.00546875000003,61.343798828125],[163.99208984375002,61.388232421875],[163.97275390625003,61.419873046875],[163.80439453125,61.461376953125],[163.837109375,61.558251953124994],[163.88271484375002,61.64013671875],[164.01953125,61.710693359375],[164.06796875000003,61.873876953125],[164.07421875,62.04501953125],[164.2072265625,62.292236328125],[164.2875,62.346630859375],[164.59833984375,62.470556640625],[164.67070312500005,62.473779296874994],[164.8876953125,62.431884765625],[165.12412109375003,62.411523437499994],[165.20810546875003,62.373974609375],[165.22568359375003,62.40576171875],[165.2138671875,62.448193359375],[165.28037109375003,62.46298828125],[165.41738281250002,62.4470703125],[165.39658203125003,62.493896484375],[165.04404296875003,62.516992187499994],[164.79238281250002,62.57109375],[164.56699218750003,62.67548828125],[164.41835937500002,62.704638671875],[164.25566406250005,62.69658203125],[163.33173828125,62.550927734374994],[163.287109375,62.51142578125],[163.24423828125003,62.45537109375],[163.30214843750002,62.372998046875],[163.2580078125,62.3369140625],[163.21328125000002,62.313427734375],[163.16347656250002,62.2595703125],[163.11845703125005,62.1529296875],[163.1310546875,62.04990234375],[163.01767578125003,61.891064453125],[163.00927734375,61.79150390625],[163.20761718750003,61.736572265625],[163.2578125,61.699462890625],[163.19785156250003,61.644775390625],[163.1388671875,61.61142578125],[163.08525390625005,61.570556640625],[163.04726562500002,61.554052734375],[162.99394531250005,61.544189453125],[162.92167968750005,61.597705078125],[162.85595703125,61.705029296875],[162.75234375000002,61.711279296875],[162.71787109375003,61.6951171875],[162.69902343750005,61.652587890625],[162.6076171875,61.650048828124994],[162.50644531250003,61.6701171875],[162.392578125,61.662109375],[162.18837890625002,61.540673828124994],[161.037109375,60.962890625],[160.9150390625,60.89267578125],[160.7666015625,60.753320312499994],[160.48203125000003,60.73984375],[160.3681640625,60.708544921875],[160.2873046875,60.667041015625],[160.17363281250005,60.638427734375],[160.17734375000003,60.69072265625],[160.20107421875002,60.729638671874994],[160.22578125,60.83154296875],[160.37890625,61.02548828125],[160.28125,61.044775390625],[160.18427734375,61.04765625],[160.00400390625003,61.007421875],[159.88310546875005,60.943408203125],[159.79042968750002,60.956640625],[159.83457031250003,61.01396484375],[159.94921875,61.12861328125],[159.91396484375002,61.23447265625],[159.88310546875005,61.291796875],[159.930859375,61.32392578125],[160.16269531250003,61.5375],[160.246875,61.647607421874994],[160.3173828125,61.793359375],[160.321484375,61.83857421875],[160.309375,61.894384765625],[160.23779296875,61.903857421875],[160.18251953125002,61.90283203125],[159.72216796875,61.7583984375],[159.55234375000003,61.719482421875],[159.4962890625,61.7814453125],[159.423046875,61.808056640625],[159.29501953125003,61.91416015625],[159.18925781250005,61.92939453125],[159.07666015625,61.922265625],[158.82431640625003,61.850244140624994],[158.54716796875005,61.810888671875],[158.33369140625,61.82568359375],[158.1515625,61.76484375],[158.07011718750005,61.75361328125],[157.79931640625,61.795263671875],[157.46933593750003,61.79892578125],[157.37070312500003,61.7470703125],[157.0841796875,61.675683593749994],[156.891796875,61.565185546875],[156.790625,61.529638671875],[156.68027343750003,61.480615234374994],[156.62968750000005,61.2724609375],[156.4826171875,61.206005859375],[156.34414062500002,61.155078125],[156.05595703125005,60.99560546875],[155.85332031250005,60.7771484375],[155.71611328125005,60.682373046875],[155.42783203125003,60.549853515625],[154.97080078125003,60.37666015625],[154.57822265625003,60.09501953125],[154.44072265625005,59.8837890625],[154.38984375,59.8767578125],[154.29306640625003,59.833349609375],[154.2666015625,59.730371093749994],[154.26884765625005,59.6583984375],[154.2091796875,59.600341796875],[154.14980468750002,59.528515625],[154.212890625,59.4833984375],[154.27216796875,59.475146484375],[154.3576171875,59.4814453125],[154.58251953125,59.540087890625],[154.97128906250003,59.449609375],[155.16669921875,59.36015625],[155.15302734375,59.27021484375],[155.16044921875005,59.19013671875],[155.01669921875003,59.19560546875],[154.82373046875,59.187548828125],[154.70351562500002,59.14130859375],[154.4580078125,59.216552734375],[154.3759765625,59.187841796875],[154.24667968750003,59.10859375],[154.0109375,59.075537109375],[153.89169921875003,59.114160156249994],[153.69521484375002,59.224755859374994],[153.36113281250005,59.214794921875],[153.27294921875,59.09130859375],[153.19609375000005,59.09443359375],[153.07773437500003,59.081884765625],[152.88222656250002,58.9390625],[152.81787109375,58.92626953125],[152.57558593750002,58.9541015625],[152.40068359375005,59.026416015625],[152.31962890625005,59.03076171875],[152.165234375,58.997021484375],[152.087890625,58.91044921875],[151.70458984375,58.86669921875],[151.32675781250003,58.87509765625],[151.12109375,59.08251953125],[151.50498046875003,59.164013671875],[151.73349609375003,59.1466796875],[151.99003906250005,59.160058593749994],[152.26064453125002,59.223583984375],[152.16953125000003,59.2779296875],[152.1044921875,59.290576171875],[151.9423828125,59.284082031249994],[151.798046875,59.3232421875],[151.48574218750002,59.52412109375],[151.34824218750003,59.5611328125],[151.17031250000002,59.583251953125],[151.03359375000002,59.58564453125],[150.98251953125003,59.571337890625],[150.91191406250005,59.523046875],[150.86328125,59.475439453125],[150.8234375,59.4607421875],[150.7294921875,59.469140625],[150.615234375,59.50654296875],[150.48359375,59.494384765625],[150.53984375000005,59.524951171875],[150.66728515625005,59.55634765625],[150.4572265625,59.590722656249994],[150.32558593750002,59.6388671875],[150.20253906250002,59.651269531249994],[149.642578125,59.770410156249994],[149.42451171875,59.760986328125],[149.29042968750002,59.728466796875],[149.06523437500005,59.630517578124994],[149.12773437500005,59.5587890625],[149.17539062500003,59.526757812499994],[149.20498046875002,59.488183593749994],[149.1330078125,59.480517578125],[148.925,59.475],[148.7970703125,59.53232421875],[148.70888671875002,59.44853515625],[148.744140625,59.37353515625],[148.8896484375,59.4],[148.96464843750005,59.369140625],[148.9140625,59.28271484375],[148.72666015625003,59.25791015625],[148.4912109375,59.2623046875],[148.25742187500003,59.414208984374994],[147.87460937500003,59.388037109375],[147.68789062500002,59.290673828124994],[147.51445312500005,59.2685546875],[147.0400390625,59.36572265625],[146.8037109375,59.372949218749994],[146.53720703125003,59.456982421875],[146.4443359375,59.43046875],[146.2734375,59.221484375],[146.04951171875,59.170556640624994],[145.931640625,59.198388671874994],[145.8291015625,59.330322265625],[145.75644531250003,59.37373046875],[145.55458984375002,59.413525390625],[144.4833984375,59.37626953125],[144.12343750000002,59.40830078125],[143.86875,59.411376953125],[143.52382812500002,59.343652343749994],[143.19218750000005,59.3701171875],[142.5802734375,59.240136718749994],[142.33037109375005,59.15263671875],[142.025390625,58.999658203124994],[141.75468750000005,58.745263671874994],[141.60292968750002,58.6490234375],[141.34707031250002,58.528076171875],[140.98769531250002,58.416845703125],[140.790234375,58.303466796875],[140.68496093750002,58.212158203125],[140.4951171875,57.8654296875],[140.446875,57.813671875],[140.00234375000002,57.6875],[139.8615234375,57.54931640625],[139.80332031250003,57.51416015625],[139.61923828125003,57.455712890625],[139.50664062500005,57.35830078125],[139.44384765625,57.3296875],[139.181640625,57.261523437499996],[138.96572265625002,57.088134765625],[138.662109375,56.96552734375],[138.2177734375,56.62900390625],[138.18007812500002,56.588525390625],[138.140625,56.498681640625],[138.07382812500003,56.43310546875],[137.69150390625003,56.13935546875],[137.57294921875,56.112109375],[137.38408203125005,55.974755859375],[137.18984375000002,55.89228515625],[137.01210937500002,55.795263671875],[136.79355468750003,55.694189453125],[136.46025390625005,55.576708984374996],[136.35117187500003,55.510009765625],[136.17519531250002,55.35224609375],[135.75078125000005,55.16064453125],[135.540625,55.11376953125],[135.2625,54.943310546875],[135.23476562500002,54.90322265625],[135.21152343750003,54.8408203125],[135.25771484375002,54.731494140624996],[135.325390625,54.707421875],[135.43779296875005,54.69248046875],[135.8515625,54.583935546875],[136.23798828125,54.6140625],[136.5802734375,54.613623046875],[136.71455078125,54.624316406249996],[136.79726562500002,54.62099609375],[136.82373046875,54.561474609375],[136.82041015625003,54.45234375],[136.77041015625002,54.353320312499996],[136.72939453125002,54.06064453125],[136.68300781250002,53.931298828125],[136.71884765625003,53.8041015625],[136.80263671875002,53.781982421875],[136.88642578125,53.83935546875],[137.01875,53.84814453125],[137.15537109375003,53.8216796875],[137.2580078125,54.025244140625],[137.17246093750003,54.056884765625],[137.09619140625,54.128564453125],[137.1416015625,54.1822265625],[137.37773437500005,54.28232421875],[137.52509765625,54.2912109375],[137.666015625,54.28330078125],[137.51318359375,54.156396484375],[137.45126953125003,54.13046875],[137.40341796875003,54.12353515625],[137.33925781250002,54.100537109375],[137.47646484375002,54.027587890625],[137.62275390625,53.970458984375],[137.83476562500005,53.946728515625],[137.7861328125,53.9033203125],[137.64482421875005,53.8658203125],[137.51699218750002,53.707080078124996],[137.313671875,53.631591796875],[137.22148437500005,53.57919921875],[137.25371093750005,53.546142578125],[137.3283203125,53.53896484375],[137.73818359375002,53.560302734375],[137.95048828125005,53.603564453124996],[138.2529296875,53.726416015625],[138.37890625,53.90927734375],[138.49355468750002,53.95966796875],[138.52792968750003,53.95986328125],[138.56816406250005,53.94716796875],[138.56914062500005,53.818798828125],[138.40703125000005,53.674169921875],[138.2921875,53.592431640625],[138.24970703125,53.5240234375],[138.3203125,53.522900390625],[138.45068359375,53.53701171875],[138.5109375,53.57001953125],[138.66074218750003,53.744775390625],[138.6994140625,53.8697265625],[138.7216796875,54.04375],[138.70468750000003,54.14765625],[138.71591796875003,54.22265625],[138.6572265625,54.29833984375],[138.69570312500002,54.32001953125],[139.10507812500003,54.217822265624996],[139.31972656250002,54.19296875],[139.70742187500002,54.277148437499996],[139.79550781250003,54.2564453125],[139.8583984375,54.205322265625],[140.1787109375,54.0515625],[140.24169921875,54.001025390624996],[140.34707031250002,53.81259765625],[140.68759765625003,53.596435546875],[141.00566406250005,53.494580078125],[141.01503906250002,53.454248046875],[141.21767578125002,53.33447265625],[141.37373046875,53.292773437499996],[141.40205078125,53.183984375],[141.32792968750005,53.097265625],[141.18125,53.015283203125],[140.88730468750003,53.09150390625],[140.83964843750005,53.087890625],[140.87451171875,53.03984375],[141.08681640625002,52.89755859375],[141.255859375,52.840136718749996],[141.26591796875005,52.652587890625],[141.24501953125002,52.550146484375],[141.13242187500003,52.435693359375],[141.16982421875002,52.368408203125],[141.32968750000003,52.271142578125],[141.40908203125002,52.234326171875],[141.48525390625002,52.178515625],[141.38554687500005,52.0572265625],[141.36689453125,51.920654296875],[141.25839843750003,51.860693359375],[141.12939453125,51.727783203125],[140.9326171875,51.619921875],[140.83857421875,51.41416015625],[140.6876953125,51.232275390625],[140.67070312500005,51.051318359374996],[140.64560546875003,50.986767578125],[140.52089843750002,50.800195312499994],[140.47636718750005,50.54599609375],[140.53544921875005,50.130761718749994],[140.56406250000003,50.106689453125],[140.62451171875,50.082421875],[140.61328125,50.0537109375],[140.58457031250003,50.033349609374994],[140.46269531250005,49.911474609375],[140.46455078125,49.825585937499994],[140.51132812500003,49.761669921875],[140.51718750000003,49.596142578125],[140.43105468750002,49.331494140625],[140.39912109375,49.289794921875],[140.36435546875003,49.220849609374994],[140.3486328125,49.1591796875],[140.32558593750002,49.120019531249994],[140.30898437500002,49.05390625],[140.33369140625,48.99482421875],[140.37832031250002,48.964111328125],[140.22421875000003,48.772851562499994],[140.17060546875,48.523681640625],[140.11328125,48.42265625],[139.99843750000002,48.323779296874996],[139.7607421875,48.180566406249994],[139.67626953125,48.089892578124996],[139.5205078125,47.97529296875],[139.37265625000003,47.887353515624994],[139.1669921875,47.63486328125],[139.00136718750002,47.38330078125],[138.58681640625002,47.0572265625],[138.52968750000002,46.976220703124994],[138.50048828125,46.88984375],[138.391796875,46.745068359375],[138.3369140625,46.543408203125],[138.21015625,46.462939453124996],[138.10634765625002,46.250732421875],[137.76914062500003,45.928515625],[137.68544921875002,45.818359375],[137.42519531250002,45.639990234375],[137.14697265625,45.393505859375],[136.80351562500005,45.171142578125],[136.73720703125002,45.080029296875],[136.60410156250003,44.978173828124994],[136.46044921875,44.822119140625],[136.251171875,44.666796875],[136.20869140625,44.56201171875],[136.14228515625,44.489111328125],[135.98701171875,44.43984375],[135.87460937500003,44.37353515625],[135.533203125,43.971484375],[135.48906250000005,43.898828125],[135.4833984375,43.835009765624996],[135.26015625000002,43.684619140624996],[135.1310546875,43.525732421875],[134.9169921875,43.4265625],[134.69179687500002,43.290576171874996],[134.1564453125,43.042138671874994],[134.01044921875,42.9474609375],[133.709375,42.829931640625],[133.58671875000005,42.82822265625],[133.32949218750002,42.7638671875],[133.15996093750005,42.69697265625],[133.059375,42.722802734374994],[132.99658203125,42.808007812499994],[132.92392578125003,42.8052734375],[132.86357421875005,42.79375],[132.708984375,42.875830078125],[132.57646484375005,42.87158203125],[132.48134765625002,42.909765625],[132.30380859375003,42.88330078125],[132.334375,43.238671875],[132.3095703125,43.313525390624996],[132.23320312500005,43.245068359375],[132.02871093750002,43.118945312499996],[131.947265625,43.09541015625],[131.86660156250002,43.095166015625],[131.89833984375002,43.170751953125],[132.01308593750002,43.280029296875],[131.97626953125,43.296044921874994],[131.93896484375,43.301953125],[131.79472656250005,43.255273437499994],[131.72207031250002,43.20263671875],[131.51640625000005,42.996435546875],[131.39326171875,42.822314453124996],[131.29248046875,42.772119140624994],[131.2453125,42.697412109374994],[131.15830078125003,42.626025390624996],[131.02480468750002,42.645166015624994],[130.94570312500002,42.633935546874994],[130.75615234375005,42.673291015625],[130.709375,42.656396484374994],[130.8341796875,42.52294921875],[130.72988281250002,42.32578125],[130.68730468750005,42.302539062499996],[130.63652343750005,42.274853515625],[130.56923828125002,42.29169921875],[130.45751953125,42.301708984375],[130.31474609375005,42.214111328125],[130.23574218750002,42.183203125],[130.1798828125,42.096972656249996],[130.06826171875002,42.045751953125],[130.00732421875,41.991162109375],[129.92822265625,41.896728515625],[129.87636718750002,41.805517578125],[129.75634765625,41.712255859375],[129.68632812500005,41.594970703125],[129.68242187500005,41.4943359375],[129.758984375,41.391503906249994],[129.7658203125,41.303857421874994],[129.712109375,41.123681640624994],[129.74199218750005,40.932275390624994],[129.70869140625,40.857324218749994],[129.34111328125005,40.726318359375],[129.2451171875,40.661035156249994],[129.10976562500002,40.491064453125],[128.94521484375002,40.427880859374994],[128.84296875,40.35849609375],[128.7013671875,40.317529296874994],[128.61074218750002,40.197900390624994],[128.51123046875,40.130224609375],[128.39296875000002,40.08896484375],[128.30449218750005,40.0359375],[128.10634765625002,40.032568359375],[127.96660156250005,39.99560546875],[127.86708984375002,39.895947265625],[127.56816406250005,39.781982421875],[127.52744140625003,39.695703125],[127.54726562500002,39.562792968749996],[127.54892578125003,39.461083984374994],[127.52285156250002,39.377392578125],[127.45742187500002,39.4009765625],[127.42226562500002,39.373583984374996],[127.38349609375001,39.296142578125],[127.39453125,39.207910156249994],[127.49697265625002,39.179492187499996],[127.58095703125002,39.14326171875],[127.69892578125001,39.125048828124996],[127.7861328125,39.084130859374994],[127.9716796875,38.897998046874996],[128.123046875,38.81640625],[128.1625,38.7861328125],[128.24941406250002,38.74521484375],[128.32949218750002,38.680908203125],[128.37460937500003,38.6234375],[128.61884765625,38.176074218749996],[128.85244140625002,37.887060546875],[129.05156250000005,37.677636718749994],[129.33515625,37.274560546874994],[129.41826171875005,37.059033203125],[129.42617187500002,36.925537109375],[129.47343750000005,36.74189453125],[129.43300781250002,36.636621093749994],[129.44501953125,36.470703125],[129.42714843750002,36.385498046875],[129.392578125,36.322705078125],[129.39130859375,36.2021484375],[129.40244140625003,36.137646484375],[129.403515625,36.052148437499994],[129.42578125,36.018798828125],[129.45830078125005,36.0064453125],[129.509765625,36.03759765625],[129.57285156250003,36.050537109375],[129.56171875,35.94765625],[129.48544921875003,35.687402343749994],[129.419140625,35.497851562499996],[129.32900390625002,35.332763671875],[129.21416015625005,35.1818359375],[129.07675781250003,35.122705078124994],[128.98007812500003,35.101513671875],[128.79570312500005,35.093896484374994],[128.642578125,35.119580078125],[128.5109375,35.100976562499994],[128.45810546875003,35.06943359375],[128.41884765625002,35.015673828124996],[128.44765625000002,34.932080078125],[128.44394531250003,34.870361328125],[128.3876953125,34.87509765625],[128.27597656250003,34.910986328125],[128.15234375,34.915869140625],[128.09453125000005,34.93359375],[128.03623046875003,35.02197265625],[127.97675781250001,35.018701171874994],[127.87324218750001,34.96630859375],[127.71484375,34.9546875],[127.65908203125002,34.9263671875],[127.63935546875001,34.889697265624996],[127.6625,34.843408203124994],[127.7421875,34.782568359375],[127.71542968750003,34.721044921875],[127.63242187500003,34.690234375],[127.5654296875,34.765917968749996],[127.52363281250001,34.840087890625],[127.47695312500002,34.844287109374996],[127.404296875,34.823095703125],[127.3896484375,34.743017578125],[127.42343750000003,34.6884765625],[127.47910156250003,34.625244140625],[127.40117187500005,34.552539062499996],[127.38056640625001,34.500634765624994],[127.32460937500002,34.46328125],[127.17343750000003,34.546142578125],[127.19492187500003,34.605029296874996],[127.26054687500005,34.661669921874996],[127.26865234375003,34.720361328124994],[127.2470703125,34.755126953125],[127.03076171875,34.606884765625],[126.8974609375,34.438867187499994],[126.82626953125003,34.451074218749994],[126.79648437500003,34.494287109374994],[126.75478515625002,34.511865234374994],[126.61083984375,34.403515625],[126.584375,34.317529296874994],[126.53144531250001,34.314257812499996],[126.50830078125,34.350634765624996],[126.50644531250003,34.428369140624994],[126.48173828124999,34.493945312499996],[126.33261718750003,34.589648437499996],[126.26445312499999,34.673242187499994],[126.30107421874999,34.719970703125],[126.42558593749999,34.694580078125],[126.52451171875003,34.697900390624994],[126.50498046875003,34.737548828125],[126.47285156250001,34.75634765625],[126.53857421875,34.778662109375],[126.59335937500003,34.824365234374994],[126.54794921875003,34.836767578125],[126.478515625,34.810351562499996],[126.42070312499999,34.823388671874994],[126.39785156250002,34.9328125],[126.32744140624999,35.0451171875],[126.29111328125003,35.154150390625],[126.36054687500001,35.21689453125],[126.39589843750002,35.314404296875],[126.46044921875,35.455615234374996],[126.49277343750003,35.501269531249996],[126.58222656250001,35.534472656249996],[126.61406249999999,35.57099609375],[126.56494140625,35.589746093749994],[126.48652343750001,35.606347656249994],[126.48847656250001,35.6470703125],[126.54189453125002,35.669335937499994],[126.6015625,35.714208984375],[126.71738281250003,35.768847656249996],[126.75302734375003,35.871972656249994],[126.71962890625002,35.897900390625],[126.6474609375,35.922412109374996],[126.66367187500003,35.974511718749994],[126.69345703125003,36.01416015625],[126.68232421875001,36.037939453125],[126.59707031250002,36.105029296874996],[126.54042968750002,36.166162109374994],[126.55722656250003,36.23583984375],[126.54423828124999,36.341210937499994],[126.55195312500001,36.4296875],[126.54824218750002,36.47763671875],[126.50664062499999,36.58564453125],[126.48769531250002,36.693798828125],[126.43300781250002,36.678027343749996],[126.38876953125003,36.651171875],[126.23066406250001,36.689257812499996],[126.18085937500001,36.6916015625],[126.16054687500002,36.771923828125],[126.21718750000002,36.870947265625],[126.3515625,36.958203125],[126.4287109375,36.969042968749996],[126.48701171875001,37.007470703124994],[126.57773437500003,37.019580078124996],[126.68671875000001,36.960351562499994],[126.78447265624999,36.9484375],[126.83876953125002,36.84609375],[126.8720703125,36.824462890625],[126.87910156250001,36.862060546875],[126.9580078125,36.906152343749994],[126.97685546874999,36.939404296875],[126.95976562499999,36.9576171875],[126.86894531249999,36.975732421874994],[126.78740234374999,37.102734375],[126.77607421875001,37.158203125],[126.74638671874999,37.1935546875],[126.79052734375,37.294921875],[126.69619140625002,37.410693359374996],[126.65029296875002,37.447119140625],[126.65683593750003,37.551171875],[126.60761718750001,37.617431640625],[126.58017578125003,37.653759765625],[126.56337890625002,37.71650390625],[126.57773437500003,37.7447265625],[126.62070312500003,37.75546875],[126.63388671875003,37.7818359375],[126.62324218750001,37.790185546874994],[126.57275390625,37.796826171875],[126.36992187499999,37.878369140625],[126.203125,37.828515625],[126.16103515625002,37.763720703124996],[126.11669921875,37.742919921875],[126.05029296875,37.86982421875],[125.94169921874999,37.873681640624994],[125.76914062500003,37.9853515625],[125.69501953125001,37.962695312499996],[125.67617187500002,37.917724609375],[125.58154296875,37.8150390625],[125.44931640625003,37.730224609375],[125.40664062500002,37.719042968749996],[125.35781250000002,37.7248046875],[125.36484375000003,37.7482421875],[125.31074218750001,37.843505859375],[125.10195312500002,37.882080078125],[125.02675781250002,37.922607421875],[124.98876953125,37.931445312499996],[125.19316406249999,38.03779296875],[125.24667968750003,38.0568359375],[125.20673828125001,38.08154296875],[125.16259765625,38.093652343749994],[124.99501953125002,38.07783203125],[124.90703124999999,38.112646484375],[124.77949218750001,38.101513671875],[124.69091796875,38.129199218749996],[124.87451171875,38.2333984375],[124.88271484375002,38.294970703124996],[124.88056640625001,38.341650390625],[124.97373046875003,38.480126953124994],[125.0673828125,38.55673828125],[125.30966796875003,38.665380859375],[125.41533203124999,38.680419921875],[125.49179687500003,38.676123046875],[125.55449218749999,38.68623046875],[125.48867187500002,38.727783203125],[125.42421875000002,38.746875],[125.29892578125003,38.74296875],[125.16884765625002,38.805517578125],[125.15732421875003,38.871533203125],[125.40966796875,39.288378906249996],[125.41318359375003,39.32626953125],[125.37363281250003,39.427636718749994],[125.36083984375,39.526611328125],[125.18007812500002,39.58349609375],[125.10009765625,39.59033203125],[124.86787109375001,39.701806640624994],[124.77529296875002,39.758056640625],[124.73886718750003,39.741503906249996],[124.73222656249999,39.652197265625],[124.69921875,39.632373046874996],[124.63828125000003,39.615087890625],[124.60761718750001,39.716943359374994],[124.55742187499999,39.790576171874996],[124.40380859375,39.865527343749996],[124.3486328125,39.906884765624994],[124.37509765625003,39.996142578124996],[124.36210937499999,40.004052734374994],[124.35,40.011572265625],[124.26748046875002,39.924169921875],[124.10576171874999,39.841015625],[123.76015625000002,39.822412109374994],[123.65087890625,39.881591796875],[123.61123046875002,39.8408203125],[123.58066406250003,39.7861328125],[123.49003906249999,39.767871093749996],[123.34814453125,39.762939453125],[123.26894531250002,39.726904296875],[123.2265625,39.68662109375],[123.0322265625,39.67353515625],[122.9609375,39.619921875],[122.84003906250001,39.600830078125],[122.33486328125002,39.366113281249994],[122.225,39.267333984375],[122.12089843749999,39.151904296874996],[122.04765624999999,39.093798828124996],[121.98232421875002,39.053173828125],[121.92265624999999,39.036523437499994],[121.86435546875003,38.996484375],[121.80517578125,38.99140625],[121.74482421875001,39.009667968749994],[121.67724609375,39.00341796875],[121.6328125,38.954833984375],[121.67041015625,38.891796875],[121.64990234375,38.865087890625],[121.51718750000003,38.83076171875],[121.32011718749999,38.808203125],[121.236328125,38.766943359375],[121.20742187500002,38.743505859375],[121.16357421875,38.731640625],[121.12167968750003,38.81328125],[121.10673828124999,38.920800781249994],[121.18828124999999,38.946679687499994],[121.26328125000003,38.960253906249996],[121.67988281250001,39.108691406249996],[121.62763671875001,39.220166015625],[121.66455078125,39.26875],[121.7578125,39.347558593749994],[121.81845703125003,39.386523437499996],[121.78544921874999,39.400830078125],[121.5125,39.374853515625],[121.35566406250001,39.376806640625],[121.27548828125003,39.384765625],[121.2998046875,39.452197265624996],[121.28632812500001,39.519433593749994],[121.26748046875002,39.544677734375],[121.40644531250001,39.621240234374994],[121.46953124999999,39.64013671875],[121.517578125,39.638964843749996],[121.51425781250003,39.68525390625],[121.47421875000003,39.7548828125],[121.51738281249999,39.84482421875],[121.80097656250001,39.950537109375],[121.86894531249999,40.04638671875],[121.98281250000002,40.13583984375],[122.19091796875,40.358251953125],[122.20332031250001,40.396044921874996],[122.26386718750001,40.5001953125],[122.275,40.541845703125],[122.1787109375,40.602734375],[122.14042968749999,40.68818359375],[121.85878906250002,40.842089843749996],[121.83486328125002,40.974267578124994],[121.80859375,40.968505859375],[121.765625,40.875878906249994],[121.72929687499999,40.846142578125],[121.59892578124999,40.843408203124994],[121.537109375,40.87841796875],[121.17451171875001,40.901269531249994],[121.0859375,40.841601562499996],[121.0029296875,40.74912109375],[120.92226562500002,40.68310546875],[120.84130859375,40.64921875],[120.77070312500001,40.5890625],[120.47910156250003,40.23095703125],[120.36894531249999,40.203857421875],[119.85039062499999,39.987451171874994],[119.59111328124999,39.902636718749996],[119.39111328125,39.752490234374996],[119.32236328125003,39.66162109375],[119.26132812500003,39.560888671875],[119.224609375,39.408056640625],[119.04013671875003,39.22236328125],[118.97695312500002,39.182568359375],[118.91230468750001,39.16640625],[118.82646484374999,39.172119140625],[118.75244140625,39.160498046875],[118.62636718750002,39.17685546875],[118.47197265624999,39.118017578125],[118.2978515625,39.06708984375],[118.14785156250002,39.195068359375],[118.04091796875002,39.2267578125],[117.86572265625,39.191259765625],[117.78466796875,39.13447265625],[117.61669921875,38.852880859375],[117.55380859375003,38.691455078124996],[117.55781250000001,38.625146484374994],[117.65605468749999,38.42421875],[117.76669921875003,38.311669921874994],[118.01494140624999,38.183398437499996],[118.54326171874999,38.094921875],[118.66708984375003,38.126367187499994],[118.8,38.12666015625],[118.94003906250003,38.042773437499996],[119.02753906250001,37.90400390625],[119.03564453125,37.8091796875],[119.03847656250002,37.776513671874994],[119.0703125,37.748583984374996],[119.08916015624999,37.700732421874996],[119.03349609374999,37.661035156249994],[118.99082031250003,37.641357421875],[118.95488281249999,37.494091796875],[118.95263671875,37.33115234375],[118.99814453125003,37.277099609375],[119.11181640625,37.201171875],[119.28740234374999,37.13828125],[119.44990234375001,37.124755859375],[119.76054687499999,37.155078125],[119.8875,37.253369140625],[119.87998046875003,37.295800781249994],[119.88291015625003,37.350830078125],[120.15585937500003,37.495019531249994],[120.3115234375,37.622705078124994],[120.287109375,37.656494140625],[120.25722656250002,37.679003906249996],[120.28466796875,37.69208984375],[120.3701171875,37.701025390625],[120.75,37.833935546875],[121.04902343750001,37.7251953125],[121.21953124999999,37.600146484374996],[121.38808593750002,37.578955078125],[121.50527343750002,37.515039062499994],[121.64023437500003,37.460351562499994],[121.81640625,37.456640625],[121.96484375,37.4453125],[122.01015625000002,37.495751953124994],[122.056640625,37.52890625],[122.10957031250001,37.522314453125],[122.16914062500001,37.45615234375],[122.33769531249999,37.4052734375],[122.49326171875003,37.407958984375],[122.60234374999999,37.426416015624994],[122.6669921875,37.40283203125],[122.57333984375003,37.317919921874996],[122.58730468750002,37.181103515625],[122.51552734375002,37.137841796874994],[122.44667968750002,37.068115234375],[122.48740234375003,37.022265625],[122.5234375,37.00263671875],[122.51972656250001,36.946826171874996],[122.45703125,36.91513671875],[122.34091796875003,36.8322265625],[122.27421874999999,36.833837890625],[122.24228515625003,36.849853515625],[122.2197265625,36.879541015624994],[122.20322265625003,36.927197265625],[122.16240234374999,36.958642578124994],[122.04951171875001,36.970751953124996],[121.93271484375003,36.95947265625],[121.66962890625001,36.836376953125],[121.4130859375,36.73837890625],[121.14404296875,36.660449218749996],[121.05380859375003,36.611376953124996],[120.98994140625001,36.597949218749996],[120.87851562500003,36.63515625],[120.81083984374999,36.6328125],[120.79667968749999,36.607226562499996],[120.88261718749999,36.538916015625],[120.90498046875001,36.485302734375],[120.89580078124999,36.444140625],[120.84707031250002,36.426074218749996],[120.77617187499999,36.456298828125],[120.71152343750003,36.41328125],[120.68222656250003,36.340722656249994],[120.68095703124999,36.168359375],[120.63789062500001,36.129931640624996],[120.51933593749999,36.108691406249996],[120.39306640625,36.053857421874994],[120.34824218750003,36.07919921875],[120.33027343750001,36.110107421875],[120.34345703125001,36.189453125],[120.32773437500003,36.228173828124994],[120.27011718750003,36.226171875],[120.18330078125001,36.202441406249996],[120.11699218749999,36.150292968749994],[120.09414062500002,36.118896484375],[120.18144531249999,36.017480468749994],[120.26474609375003,36.007226562499994],[120.28476562500003,35.984423828124996],[120.21904296874999,35.934912109375],[120.0546875,35.861132812499996],[120.02744140625003,35.799365234374996],[119.97871093750001,35.740234375],[119.91171875000003,35.693212890625],[119.8662109375,35.64365234375],[119.810546875,35.617724609374996],[119.7197265625,35.588720703125],[119.6083984375,35.469873046874994],[119.52646484375003,35.35859375],[119.4296875,35.301416015624994],[119.35283203124999,35.113818359374996],[119.2158203125,35.011767578124996],[119.16533203124999,34.848828125],[119.20097656249999,34.7484375],[119.35136718749999,34.749414062499994],[119.4267578125,34.714160156249996],[119.58291015625002,34.5822265625],[119.76972656250001,34.49619140625],[119.96367187499999,34.447802734374996],[120.20146484374999,34.32568359375],[120.26669921875003,34.2740234375],[120.32265625000002,34.168994140624996],[120.42568359375002,33.86630859375],[120.49980468749999,33.716455078124994],[120.50478515625002,33.63818359375],[120.615625,33.490527343749996],[120.73447265625003,33.236621093749996],[120.87109375,33.016503906249994],[120.89736328125002,32.843212890625],[120.85302734375,32.764111328125],[120.85322265625001,32.661376953125],[120.98994140625001,32.567041015624994],[121.29335937500002,32.457324218749996],[121.34169921875002,32.425048828125],[121.40097656250003,32.371923828125],[121.40390625000003,32.20625],[121.45078125000003,32.1533203125],[121.49052734374999,32.12109375],[121.67421875000002,32.051025390625],[121.75107421875003,31.992871093749997],[121.83242187500002,31.899755859375],[121.85634765625002,31.816455078124996],[121.86630859375003,31.703564453124997],[121.76357421875002,31.699511718749996],[121.68085937500001,31.712158203125],[121.35195312500002,31.858789062499994],[121.26640624999999,31.862695312499994],[121.14580078124999,31.842333984374996],[120.97353515625002,31.869384765625],[120.79169921875001,32.03173828125],[120.66054687500002,32.0810546875],[120.52011718750003,32.105859375],[120.18408203125,31.966162109375],[120.09873046875003,31.975976562499994],[120.07392578125001,31.960253906249996],[120.03593749999999,31.936279296875],[120.19160156250001,31.90634765625],[120.34746093749999,31.952099609374997],[120.49716796875003,32.019824218749996],[120.71552734375001,31.983740234375],[120.75224609374999,31.9228515625],[120.78779296875001,31.819775390624997],[120.9375,31.750195312499997],[121.05537109375001,31.719433593749997],[121.20488281249999,31.628076171874994],[121.35097656250002,31.4853515625],[121.66064453125,31.319726562499994],[121.78593749999999,31.162890625],[121.83447265625,31.06162109375],[121.8779296875,30.9169921875],[121.76943359375002,30.870361328125],[121.67519531250002,30.86376953125],[121.52753906250001,30.840966796874994],[121.4189453125,30.789794921875],[121.30996093750002,30.69970703125],[120.99765625000003,30.558251953124994],[120.93828124999999,30.4697265625],[120.8974609375,30.392626953124996],[120.82148437500001,30.354638671874994],[120.62998046875003,30.390869140625],[120.44980468750003,30.387841796874994],[120.24550781250002,30.283544921875],[120.19462890624999,30.24130859375],[120.228515625,30.249560546874996],[120.26054687499999,30.263037109375],[120.3525390625,30.247412109375],[120.49453125000002,30.303076171875],[120.63339843750003,30.133154296875],[120.90449218750001,30.16064453125],[121.159375,30.3017578125],[121.25800781250001,30.304101562499994],[121.34062,30.282373046874994],[121.43271484375003,30.22666015625],[121.67792968750001,29.9791015625],[121.81230468749999,29.9521484375],[121.9443359375,29.894091796874996],[122.01728515625001,29.8876953125],[122.08291015625002,29.870361328125],[121.90576171875,29.7796875],[121.67656249999999,29.583789062499996],[121.57460937500002,29.537011718749994],[121.50625,29.484570312499997],[121.6904296875,29.510986328125],[121.821875,29.604638671874994],[121.88798828124999,29.627783203125],[121.94121093749999,29.605908203124997],[121.96835937500003,29.490625],[121.91777343749999,29.135009765625],[121.853515625,29.12890625],[121.79082031249999,29.22568359375],[121.71748046875001,29.25634765625],[121.65595703125001,29.236132812499996],[121.53369140625,29.23671875],[121.48710937499999,29.193164062499996],[121.44765625000002,29.13134765625],[121.52089843750002,29.118457031249996],[121.66494140625002,29.010595703125],[121.6796875,28.953125],[121.64101562500002,28.915917968749994],[121.5400390625,28.931884765625],[121.6625,28.851416015625],[121.63007812500001,28.767919921875],[121.59033203125,28.734814453124997],[121.51914062500003,28.713671875],[121.47519531250003,28.64140625],[121.5380859375,28.52109375],[121.60205078125,28.366601562499994],[121.60996093750003,28.292138671874994],[121.50996093750001,28.324267578124996],[121.35458984375003,28.229882812499994],[121.27226562499999,28.222119140624997],[121.216796875,28.34619140625],[121.14570312500001,28.32666015625],[121.09843749999999,28.29052734375],[121.03544921874999,28.157275390624996],[120.95859375000003,28.037011718749994],[120.89248046875002,28.00390625],[120.81298828125,28.013378906249997],[120.74765625000003,28.009960937499997],[120.76347656249999,27.977441406249994],[120.8330078125,27.937792968749996],[120.8330078125,27.891455078125],[120.68515625000003,27.744580078124997],[120.66132812500001,27.687890625],[120.66484374999999,27.639453125],[120.5875,27.580761718749997],[120.62910156250001,27.482128906249997],[120.60751953125003,27.412402343749996],[120.53984374999999,27.318359375],[120.46865234375002,27.25625],[120.38457031249999,27.155517578125],[120.27871093750002,27.097070312499994],[120.13857421875002,26.886132812499994],[120.09746093749999,26.780664062499994],[120.08671874999999,26.671582031249997],[120.04296875,26.633837890624996],[119.9677734375,26.586376953124997],[119.88222656250002,26.61044921875],[119.87949218750003,26.683007812499994],[119.84238281250003,26.689306640625],[119.8212890625,26.7369140625],[119.81513671875001,26.797607421875],[119.82421875,26.846386718749997],[119.78867187500003,26.831494140624997],[119.76669921875003,26.774707031249996],[119.71044921875,26.728662109374994],[119.65156250000001,26.747265625],[119.58818359374999,26.784960937499996],[119.58994140625003,26.73046875],[119.62363281250003,26.67587890625],[119.63818359375,26.62119140625],[119.72597656250002,26.609423828124996],[119.78476562500003,26.546630859375],[119.83115234375003,26.4501953125],[119.84033203125,26.41416015625],[119.87646484375,26.370947265625],[119.88105468750001,26.334179687499997],[119.79726562500002,26.300146484375],[119.69267578124999,26.23642578125],[119.56708984375001,26.12734375],[119.46308593750001,26.0546875],[119.36972656250003,26.054052734375],[119.31308593750003,26.062548828124996],[119.23212890625001,26.104394531249994],[119.13945312499999,26.121777343749997],[119.26376953125003,25.974804687499997],[119.33203125,25.94873046875],[119.41777343749999,25.954345703125],[119.50087890625002,26.009179687499994],[119.61875,26.003564453124994],[119.64824218749999,25.918701171875],[119.61689453125001,25.822900390624994],[119.55283203125003,25.698681640624997],[119.53945312500002,25.591259765624997],[119.619140625,25.437451171874997],[119.62246093750002,25.391162109375003],[119.5927734375,25.36801757812499],[119.49921875000001,25.408642578124997],[119.42177734375002,25.459619140624994],[119.34375,25.4462890625],[119.26308593750002,25.468017578125],[119.18007812500002,25.44980468749999],[119.14628906249999,25.414306640625],[119.16933593750002,25.355712890625],[119.24355468750002,25.30703125],[119.28554687500002,25.232226562500003],[119.23554687500001,25.205957031249994],[119.02460937500001,25.2234375],[118.9775390625,25.209277343750003],[118.91445312500002,25.12680664062499],[118.95566406250003,25.004785156249994],[118.90908203125002,24.92890625],[118.82207031249999,24.9111328125],[118.70751953125,24.849804687499997],[118.63691406250001,24.835546875],[118.64023437500003,24.80908203125],[118.69179687500002,24.78232421874999],[118.71914062500002,24.746142578125003],[118.65703124999999,24.62143554687499],[118.56035156249999,24.580371093750003],[118.41201171875002,24.600732421874994],[118.29531250000002,24.57275390625],[118.19453125000001,24.62583007812499],[118.08710937500001,24.627001953125003],[118.01386718750001,24.55991210937499],[118.00595703125003,24.481982421875003],[117.93505859375,24.47421875],[117.896875,24.47983398437499],[117.84267578125002,24.474316406249997],[117.84824218750003,24.43247070312499],[117.87900390625003,24.395898437499994],[118.02421874999999,24.379638671875],[118.05058593749999,24.3271484375],[118.05605468750002,24.24609375],[117.90410156249999,24.1064453125],[117.83945312500003,24.01230468749999],[117.74169921875,24.014794921874994],[117.66787109375002,23.939257812500003],[117.62822265624999,23.83671875],[117.57919921875003,23.856982421875003],[117.46640625000003,23.840576171875],[117.43310546875,23.791699218749997],[117.45957031250003,23.771484375],[117.46220703124999,23.736230468749994],[117.4169921875,23.620996093749994],[117.36767578125,23.588623046875],[117.3466796875,23.6357421875],[117.33076171875001,23.708789062500003],[117.29082031249999,23.71435546875],[117.225,23.647021484375003],[117.14814453125001,23.598779296874994],[117.08251953125,23.578759765624994],[117.03281250000003,23.6234375],[116.91064453125,23.646679687499997],[116.86093750000003,23.453076171874997],[116.75957031249999,23.382519531249997],[116.71210937500001,23.360498046874994],[116.62939453125,23.35385742187499],[116.68232421875001,23.327392578125],[116.69882812500003,23.277783203124997],[116.66914062500001,23.228173828124994],[116.58642578125,23.21826171875],[116.53828125000001,23.1796875],[116.51982421874999,23.006591796875],[116.470703125,22.94589843749999],[116.34550781249999,22.941064453124994],[116.25185546875002,22.981347656249994],[116.22207031250002,22.94956054687499],[116.20634765624999,22.918652343749997],[116.15742187500001,22.887451171875],[116.06259765625003,22.879101562499997],[115.85214843750003,22.8015625],[115.755859375,22.823925781249997],[115.64042968749999,22.853417968749994],[115.56113281250003,22.82470703125],[115.53466796875,22.765185546875003],[115.49833984374999,22.71884765624999],[115.38251953125001,22.71884765624999],[115.28994140625002,22.77597656249999],[115.19580078125,22.817285156249994],[115.09150390625001,22.781689453124997],[115.01210937500002,22.708935546874997],[114.91445312500002,22.684619140625003],[114.89638671875002,22.63950195312499],[114.85380859374999,22.616796875],[114.75039062500002,22.62631835937499],[114.71113281250001,22.738720703124997],[114.65166015624999,22.755273437499994],[114.5927734375,22.6984375],[114.57197265625001,22.654052734375],[114.54443359375,22.62060546875],[114.55419921875,22.52890625],[114.49619140625003,22.527050781249997],[114.42011718750001,22.583251953125],[114.34062,22.593212890624997],[114.26601562500002,22.540966796874997],[114.29111328125003,22.499462890624997],[114.28457031250002,22.45761718749999],[114.3251953125,22.437402343749994],[114.33525390624999,22.396240234375],[114.29052734375,22.373779296875],[114.28789062499999,22.32529296874999],[114.26796875000002,22.295556640624994],[114.13906250000002,22.3484375],[114.03281250000003,22.375878906249994],[113.93730468749999,22.364990234375],[113.90253906250001,22.39609375],[113.896484375,22.428173828124997],[114.00673828125002,22.484033203124994],[114.01542968749999,22.511914062499997],[113.93115234375,22.531054687500003],[113.82832031250001,22.607226562500003],[113.75449218750003,22.733642578125],[113.6611328125,22.801660156249994],[113.61962890625,22.86142578124999],[113.60341796875002,22.968896484374994],[113.58632812500002,23.02001953125],[113.59218750000002,23.076953125],[113.62050781250002,23.127490234375003],[113.51972656250001,23.102099609375003],[113.4453125,23.055078125],[113.46035156250002,22.995703125],[113.44189453125,22.940576171874994],[113.3310546875,22.912011718749994],[113.33779296875002,22.888818359374994],[113.34482421875003,22.86459960937499],[113.43203125000002,22.78940429687499],[113.44980468750003,22.726123046875003],[113.48476562500002,22.6923828125],[113.55302734374999,22.594042968750003],[113.55146484375001,22.40415039062499],[113.5888671875,22.350488281249994],[113.57646484374999,22.297265625],[113.54814453124999,22.222607421874997],[113.49882812499999,22.20166015625],[113.41572265625001,22.178369140624994],[113.36738281250001,22.16484375],[113.32773437500003,22.145410156249994],[113.26640624999999,22.088769531249994],[113.14902343750003,22.075],[113.08876953125002,22.207958984374997],[113.00820312500002,22.119335937499997],[112.98378906250002,21.938232421875],[112.95390624999999,21.90732421874999],[112.90380859375,21.88144531249999],[112.80859375,21.944628906250003],[112.72539062499999,21.90234375],[112.66074218750003,21.85947265624999],[112.63408203124999,21.819873046875003],[112.58632812500002,21.77685546875],[112.49472656250003,21.818310546874997],[112.42128906250002,21.880615234375],[112.439453125,21.92734375],[112.42929687500003,21.95810546874999],[112.39609375000003,21.981347656249994],[112.35966796874999,21.97802734375],[112.37744140625,21.91748046875],[112.38974609375003,21.801220703124997],[112.3564453125,21.767578125],[112.30498046874999,21.74169921875],[112.193359375,21.763134765624997],[112.1171875,21.80649414062499],[112.02519531249999,21.843017578125],[111.94394531250003,21.849658203125003],[111.92646484375001,21.776269531249994],[111.87343750000002,21.71713867187499],[111.82460937500002,21.709765625],[111.77597656250003,21.71923828125],[111.7119140625,21.655224609374997],[111.681640625,21.60849609374999],[111.60273437500001,21.55908203125],[111.39238281249999,21.535107421874997],[111.31914062499999,21.486132812500003],[111.22060546875002,21.493896484375],[111.14423828125001,21.482226562500003],[111.1005859375,21.48471679687499],[111.06113281250003,21.510986328125],[111.01689453124999,21.51171875],[110.99677734375001,21.43027343749999],[110.87802734375003,21.395947265624997],[110.77109375000003,21.386523437500003],[110.65214843749999,21.279101562500003],[110.56718749999999,21.2140625],[110.50429687500002,21.207421875],[110.4580078125,21.23056640624999],[110.4345703125,21.326904296875],[110.41093749999999,21.338134765625],[110.3974609375,21.247705078124994],[110.37460937500003,21.17236328125],[110.33115234375003,21.13134765625],[110.19355468750001,21.037646484375003],[110.15400390625001,20.944628906250003],[110.18037109375001,20.85859375],[110.36542968750001,20.837597656249997],[110.38847656249999,20.79052734375],[110.37050781250002,20.75205078124999],[110.326171875,20.719921875],[110.31308593750003,20.671679687500003],[110.51152343749999,20.518261718749997],[110.517578125,20.460009765625003],[110.48691406250003,20.42685546874999],[110.44951171874999,20.355419921874997],[110.3447265625,20.294824218749994],[110.12314453125003,20.263720703125003],[109.9384765625,20.295117187499997],[109.88251953125001,20.3640625],[109.88583984375003,20.413134765625003],[109.931640625,20.398876953124997],[109.98388671875,20.403271484374997],[109.96835937500003,20.448144531249994],[109.94638671875003,20.474365234375],[109.86103515625001,20.514306640624994],[109.7919921875,20.621875],[109.80527343750003,20.711474609375003],[109.76738281249999,20.780712890624997],[109.72626953125001,20.838769531249994],[109.68476562500001,20.87363281249999],[109.66259765625,20.916894531249994],[109.70449218750002,21.052734375],[109.68125,21.131640625],[109.76015625000002,21.22836914062499],[109.77958984374999,21.337451171875003],[109.92109375000001,21.37646484375],[109.93076171875003,21.48056640624999],[109.82958984375,21.48359375],[109.759375,21.56005859375],[109.74335937500001,21.527978515624994],[109.68691406250002,21.524609375],[109.59433593750003,21.67197265624999],[109.56640625,21.690576171874994],[109.521484375,21.693408203125003],[109.54404296875003,21.53793945312499],[109.435546875,21.4794921875],[109.3466796875,21.45395507812499],[109.22041015625001,21.443408203125003],[109.14863281250001,21.425537109375],[109.08154296875,21.44028320312499],[109.09814453125,21.487353515625003],[109.13349609375001,21.543603515624994],[109.10175781250001,21.590478515624994],[109.03056640624999,21.626513671875003],[108.92177734375002,21.624414062499994],[108.84638671875001,21.634472656249997],[108.77167968750001,21.63046875],[108.74394531249999,21.651269531249994],[108.67451171875001,21.724658203125003],[108.61582031250003,21.770458984374997],[108.58935546875,21.815966796875003],[108.61582031250003,21.868896484375],[108.59375,21.901025390624994],[108.47988281250002,21.90463867187499],[108.48085937500002,21.828808593749997],[108.49257812500002,21.739404296874994],[108.52568359374999,21.67138671875],[108.50214843750001,21.633447265624994],[108.4443359375,21.607324218749994],[108.3828125,21.67919921875],[108.35458984375003,21.696923828124994],[108.32480468750003,21.693505859374994],[108.30214843750002,21.62192382812499],[108.24628906250001,21.558398437500003],[108.14560546875003,21.565185546875],[108.0673828125,21.52597656249999],[107.97265625,21.507958984374994],[107.92578125,21.498925781249994],[107.80908203125,21.497119140625003],[107.70722656250001,21.405859375],[107.63671875,21.368066406249994],[107.52695312500003,21.336230468750003],[107.40996093749999,21.284814453124994],[107.37617187500001,21.194140625],[107.37333984374999,21.128466796875003],[107.35429687499999,21.05517578125],[107.16474609375001,20.94873046875],[107.11171875000002,20.95957031249999],[107.0751953125,20.999267578125],[107.01923828125001,20.9912109375],[106.9814453125,20.971386718749997],[106.93642578125002,20.974072265624997],[106.88623046875,20.95],[106.82060546874999,20.95751953125],[106.76025390625,20.991113281249994],[106.72519531250003,20.999902343749994],[106.68339843749999,21.000292968750003],[106.67548828125001,20.960498046875003],[106.7373046875,20.80615234375],[106.75341796875,20.735058593749997],[106.55078125,20.5265625],[106.57285156250003,20.3921875],[106.51796875000002,20.288867187500003],[106.3955078125,20.20590820312499],[106.16572265625001,19.99204101562499],[106.06220703125001,19.987353515625003],[105.98408203125001,19.9390625],[105.81396484375,19.587451171875003],[105.81210937500003,19.466992187499997],[105.78535156250001,19.378857421874997],[105.79111328125003,19.294189453125],[105.71640625000003,19.12778320312499],[105.63906250000002,19.057177734375003],[105.62177734375001,18.96630859375],[105.73203125000003,18.779296875],[105.74423828125003,18.746289062499997],[105.80820312500003,18.64584960937499],[105.83925781250002,18.574169921874997],[105.88828125000003,18.502490234375003],[106.065625,18.316357421874997],[106.14453125,18.259423828124994],[106.23955078124999,18.220703125],[106.41191406249999,18.053173828124997],[106.4990234375,17.946435546874994],[106.459375,17.873681640624994],[106.47890625000002,17.71958007812499],[106.35585937500002,17.765039062499994],[106.37050781250002,17.746875],[106.51679687500001,17.662792968749997],[106.73574218750002,17.3671875],[106.92617187500002,17.221386718749997],[107.11992187499999,17.05551757812499],[107.18037109375001,16.89794921875],[107.35507812500003,16.79375],[107.54931640625,16.642578125],[107.54082031249999,16.608642578125],[107.59345703125001,16.568066406249997],[107.72412109375,16.487841796875003],[107.803125,16.403076171875],[107.83378906249999,16.322460937499997],[107.88203125000001,16.309619140625003],[107.93632812499999,16.329394531250003],[107.99072265625,16.337109375],[108.02939453125003,16.331103515625003],[108.08798828125003,16.242724609375003],[108.16972656249999,16.163671875],[108.208984375,16.091064453125],[108.24082031250003,16.10078125],[108.26738281249999,16.089794921874997],[108.27402343750003,16.029052734375],[108.28603515625002,15.9890625],[108.39531249999999,15.872460937499994],[108.44746093750001,15.7626953125],[108.57783203125001,15.584716796875],[108.67421875000002,15.48359375],[108.74277343750003,15.426611328124991],[108.8212890625,15.3779296875],[108.89824218749999,15.180517578124991],[108.93994140625,15.00146484375],[109.0224609375,14.802832031249991],[109.08486328125002,14.716162109374991],[109.08701171875003,14.552587890624991],[109.13730468750003,14.384130859374991],[109.19140625,14.270458984374997],[109.20732421874999,14.154296875],[109.22392578124999,14.0966796875],[109.24462890625,14.053417968749997],[109.30332031250003,13.8564453125],[109.2880859375,13.765039062499994],[109.2470703125,13.854736328125],[109.25205078125003,13.590527343749997],[109.2880859375,13.45078125],[109.271875,13.279345703125003],[109.3095703125,13.219189453124997],[109.37675781249999,13.025488281249991],[109.42392578125003,12.955957031249994],[109.42001953125003,12.719042968749989],[109.44492187500003,12.599609375],[109.38144531250003,12.670751953124991],[109.33554687500003,12.751904296874997],[109.27402343750003,12.709033203124989],[109.21894531250001,12.645800781249989],[109.3046875,12.391162109374989],[109.20683593749999,12.415380859374991],[109.21572265625002,12.072900390624994],[109.25625,11.992871093749997],[109.25917968750002,11.954541015624997],[109.24726562500001,11.90869140625],[109.22021484375,11.958837890624991],[109.21455078125001,12.010449218749997],[109.19912109375002,11.9990234375],[109.19990234375001,11.972460937499989],[109.16728515624999,11.912011718749994],[109.15751953124999,11.837109375],[109.19267578124999,11.7734375],[109.19863281250002,11.724853515625],[109.17324218750002,11.664746093749997],[109.13251953125001,11.60107421875],[109.03964843750003,11.592675781249994],[109.01845703125002,11.468359375],[108.98671875000002,11.336376953124997],[108.82080078125,11.3154296875],[108.70029296875003,11.199267578124989],[108.55126953125,11.155957031249997],[108.41855468750003,11.040722656249997],[108.27167968750001,10.934277343749997],[108.17617187500002,10.920166015625],[108.09492187500001,10.897265624999989],[108.00136718750002,10.720361328124994],[107.84511718750002,10.700097656249994],[107.564453125,10.555468749999989],[107.47031250000003,10.48583984375],[107.38447265625001,10.458642578124994],[107.26152343749999,10.398388671874997],[107.23505859375001,10.419873046874997],[107.19414062499999,10.471582031249994],[107.08779296875002,10.498339843749989],[107.03574218750003,10.556298828124994],[107.02070312500001,10.630957031249991],[107.00664062499999,10.660546875],[106.98369140624999,10.618310546874994],[106.96611328124999,10.440722656249989],[106.94746093750001,10.400341796874997],[106.90205078125001,10.3828125],[106.81269531250001,10.433300781249997],[106.72734374999999,10.53564453125],[106.60585937500002,10.464941406249991],[106.64306640625,10.45625],[106.69843750000001,10.462060546874994],[106.7412109375,10.444384765624989],[106.77753906250001,10.376123046874994],[106.77626953125002,10.338964843749991],[106.75742187500003,10.295800781249994],[106.6435546875,10.288916015624991],[106.49169921875,10.304101562499994],[106.46406250000001,10.298291015624997],[106.60244140625002,10.231738281249989],[106.72900390625,10.193310546874997],[106.78525390625003,10.151171874999989],[106.78525390625003,10.116455078125],[106.71416015624999,10.060205078124994],[106.6591796875,9.99140625],[106.65810546875002,9.94873046875],[106.65683593750003,9.901074218749997],[106.59560546875002,9.85986328125],[106.55732421875001,9.868066406249994],[106.44912109375002,9.939648437499997],[106.13642578125001,10.2216796875],[106.18359375,10.14208984375],[106.50742187500003,9.821240234374997],[106.56435546875002,9.71562],[106.57246093750001,9.64111328125],[106.53916015625003,9.603564453124989],[106.48408203125001,9.559423828124991],[106.37802734375003,9.556103515624997],[106.20400390625002,9.675439453124994],[105.92568359375002,9.961718749999989],[105.83095703125002,10.000732421875],[106.1125,9.673583984375],[106.15859375000002,9.594140625],[106.20615234375003,9.50234375],[106.19257812500001,9.447802734374989],[106.16835937500002,9.396728515625],[105.5009765625,9.093212890624997],[105.4013671875,8.96240234375],[105.322265625,8.801123046874991],[105.19121093749999,8.711328125],[105.11435546875003,8.629199218749989],[104.89189453124999,8.583251953125],[104.77041015625002,8.59765625],[104.89628906249999,8.746630859374989],[104.81855468750001,8.801855468749991],[104.81464843750001,9.185498046874997],[104.84521484375,9.606152343749997],[104.90322265625002,9.816259765624991],[104.98710937499999,9.86865234375],[105.09257812499999,9.900976562499991],[105.09492187500001,9.945263671874997],[105.08447265625,9.995703125],[105.02783203125,10.067431640624989],[104.9658203125,10.1005859375],[104.87324218750001,10.114794921874989],[104.80195312500001,10.202734375],[104.74765625000003,10.199121093749994],[104.66347656250002,10.169921875],[104.61269531250002,10.207666015624994],[104.59404296874999,10.266894531249989],[104.51611328125,10.339990234374994],[104.42636718750003,10.411230468749991],[104.26240234375001,10.541259765625],[103.93710937500003,10.586621093749997],[103.90175781250002,10.643945312499994],[103.87050781250002,10.655126953124991],[103.84052734375001,10.58056640625],[103.66191406249999,10.508935546874994],[103.58710937500001,10.552197265624997],[103.5322265625,10.604638671874994],[103.54042968750002,10.668701171875],[103.59208984374999,10.721044921874991],[103.68085937500001,10.758593749999989],[103.721875,10.89013671875],[103.654296875,11.058691406249991],[103.59501953124999,11.107763671874991],[103.53242187500001,11.146679687499997],[103.46669921875002,11.083984375],[103.41132812500001,10.976757812499997],[103.35361328125003,10.921582031249997],[103.27216796875001,10.909277343749991],[103.15283203125,10.913720703124994],[103.1064453125,11.073779296874989],[103.09111328124999,11.211083984374994],[103.107421875,11.367773437499991],[103.12548828125,11.460644531249997],[103.01054687499999,11.588671874999989],[103.00419921874999,11.710595703124994],[102.94863281250002,11.773486328124989],[102.93232421875001,11.74169921875],[102.93388671874999,11.706689453124994],[102.91230468750001,11.703857421875],[102.88369140625002,11.772753906249989],[102.79160156250003,11.888623046874997],[102.76298828124999,12.012451171875],[102.65488281250003,12.148828125],[102.59414062500002,12.203027343749994],[102.57480468750003,12.1578125],[102.54023437500001,12.109228515624991],[102.43408203125,12.179248046874989],[102.34316406250002,12.252587890624994],[102.25908203124999,12.394335937499989],[102.24843750000002,12.361425781249991],[102.22958984375003,12.331640625],[102.13417968750002,12.443017578124994],[102.034375,12.531884765624994],[101.94453125000001,12.563671875],[101.88906250000002,12.59326171875],[101.83574218749999,12.640380859375],[101.7236328125,12.689355468749994],[101.44492187500003,12.618945312499989],[101.09023437500002,12.673632812499989],[100.95371093750003,12.621240234374994],[100.89775390624999,12.65380859375],[100.86328125,12.714501953124994],[100.89638671875002,12.818164062499989],[100.90390625000003,13.034912109375],[100.94609374999999,13.187255859375],[100.92626953125,13.303027343750003],[100.94697265625001,13.357568359374994],[100.96269531249999,13.431982421874991],[100.90654296874999,13.46240234375],[100.65605468749999,13.521289062500003],[100.60292968750002,13.568164062500003],[100.53642578124999,13.514453125],[100.23564453124999,13.484472656249991],[100.12236328124999,13.439550781249991],[100.01748046875002,13.353173828124994],[99.99052734374999,13.243457031250003],[100.05107421874999,13.171240234374991],[100.08994140625003,13.045654296875],[99.98203125000003,12.771484375],[99.96396484375003,12.690039062499991],[100.00566406249999,12.354736328125],[99.98906249999999,12.170800781249994],[99.93027343750003,12.047460937499991],[99.83710937500001,11.936621093749991],[99.79873046875002,11.748779296875],[99.72548828125002,11.661767578124994],[99.62734375000002,11.462890625],[99.56132812499999,11.215185546874991],[99.51435546875001,11.1005859375],[99.48691406250003,10.889550781249994],[99.28476562500003,10.569140624999989],[99.2373046875,10.388134765624997],[99.1650390625,10.31982421875],[99.19033203125002,10.265869140625],[99.19462890624999,10.175439453124994],[99.16933593750002,9.934179687499991],[99.16074218750003,9.734033203124994],[99.19130859375002,9.627148437499997],[99.28828125000001,9.414599609374989],[99.26503906250002,9.352978515624997],[99.25390625,9.265234375],[99.33544921875,9.225439453124991],[99.39384765624999,9.213720703124991],[99.72382812500001,9.314208984375],[99.83554687500003,9.288378906249989],[99.87753906250003,9.194628906249989],[99.90468750000002,9.112890625],[99.96064453125001,8.671240234374991],[99.98955078124999,8.589208984374991],[100.05625,8.511132812499994],[100.12929687500002,8.428076171874991],[100.15410156249999,8.44296875],[100.15888671875001,8.473779296874994],[100.16347656250002,8.508398437499991],[100.22871093750001,8.424707031249994],[100.27939453125003,8.268505859374997],[100.45351562500002,7.442285156249994],[100.50371093749999,7.337304687499994],[100.54521484374999,7.226904296874991],[100.43935546875002,7.28076171875],[100.41074218750003,7.464306640624997],[100.38037109375,7.54150390625],[100.34296875000001,7.552880859374994],[100.28378906250003,7.551513671875],[100.27998046875001,7.584326171874991],[100.32431640625003,7.644189453124994],[100.3173828125,7.715966796874994],[100.25664062499999,7.77490234375],[100.158203125,7.728125],[100.16074218750003,7.599267578124994],[100.20488281249999,7.500537109374989],[100.37138671874999,7.280126953124991],[100.42353515625001,7.187841796874991],[100.48974609375,7.161376953125],[100.58623046874999,7.175976562499997],[100.70166015625,7.081982421874997],[100.79257812500003,6.994677734374989],[101.01787109374999,6.8609375],[101.15439453125003,6.875146484374994],[101.30195312500001,6.908300781249991],[101.40087890625,6.899560546874994],[101.49794921875002,6.865283203124989],[101.6142578125,6.753955078124989],[101.79921875000002,6.474609375],[102.10107421875,6.242236328124989],[102.27402343750003,6.203417968749989],[102.34013671874999,6.172021484374994],[102.534375,5.862548828125],[102.79023437500001,5.644921875],[102.89853515625003,5.563769531249989],[102.982421875,5.524951171874989],[103.09707031250002,5.408447265625],[103.19697265625001,5.262158203124997],[103.41582031249999,4.850292968749997],[103.45390624999999,4.669482421874989],[103.46875,4.393261718749997],[103.42050781250003,3.976855468749989],[103.36201171875001,3.769140625],[103.37333984374999,3.67109375],[103.45351562500002,3.520605468749991],[103.42949218749999,3.378564453124994],[103.44501953125001,3.260595703124991],[103.439453125,2.93310546875],[103.48515624999999,2.836572265624994],[103.53730468750001,2.774755859374991],[103.81220703125001,2.58046875],[103.83232421874999,2.508496093749997],[103.9677734375,2.26123046875],[104.21855468749999,1.722851562499997],[104.28847656250002,1.480664062499997],[104.28037109375003,1.415576171874989],[104.25009765625003,1.388574218749994],[104.17636718750003,1.364892578124994],[104.11494140625001,1.412255859374994],[104.09423828125,1.446191406249994],[104.1005859375,1.488330078124989],[104.076171875,1.52978515625],[104.01601562500002,1.579296875],[103.9814453125,1.623632812499991],[103.9912109375,1.550048828125],[103.99150390624999,1.454785156249997],[103.91513671875003,1.446679687499994],[103.81679687500002,1.4765625],[103.69453125000001,1.449658203124997],[103.5498046875,1.332812499999989],[103.48027343749999,1.329492187499994],[103.42734375000003,1.429833984374994],[103.4,1.497851562499989],[103.35683593750002,1.546142578125],[102.896875,1.792333984374991],[102.72714843750003,1.855566406249991],[102.54824218750002,2.042382812499994],[102.14560546875003,2.248486328124997],[101.88994140624999,2.449414062499997],[101.78125,2.573583984374991],[101.51972656250001,2.683642578124989],[101.40683593750003,2.8134765625],[101.35136718749999,2.838964843749991],[101.29550781250003,2.885205078124997],[101.35429687499999,3.011132812499994],[101.33017578125003,3.142480468749994],[101.29990234375003,3.253271484374991],[101.11542968750001,3.472021484374991],[101.02480468750002,3.624707031249997],[100.85126953125001,3.776708984374991],[100.78183593750003,3.864453125],[100.71542968750003,3.966210937499994],[100.75703125000001,4.001806640624991],[100.79550781250003,4.023388671874997],[100.76025390625,4.097216796874989],[100.66103515625002,4.225732421874994],[100.61455078124999,4.3734375],[100.61455078124999,4.652246093749994],[100.47343749999999,5.044287109374991],[100.35263671875003,5.587695312499989],[100.3740234375,5.777978515624994],[100.34326171875,5.984179687499989],[100.26328125000003,6.182519531249994],[100.15839843750001,6.32421875],[100.119140625,6.441992187499991],[99.86865234375,6.749902343749994],[99.69599609375001,6.876660156249997],[99.72031250000003,7.106201171875],[99.66777343749999,7.15087890625],[99.60244140625002,7.155322265624989],[99.55302734374999,7.218798828124989],[99.59697265624999,7.355615234374994],[99.52910156249999,7.329492187499994],[99.43515625000003,7.334375],[99.35859375000001,7.372216796874994],[99.30039062500003,7.561328124999989],[99.263671875,7.619042968749994],[99.18339843749999,7.718066406249989],[99.07763671875,7.718066406249989],[99.04267578125001,7.765625],[99.05107421874999,7.887841796874994],[98.97392578124999,7.962792968749994],[98.87246093750002,8.02392578125],[98.78867187500003,8.059814453125],[98.70351562500002,8.256738281249994],[98.63632812500003,8.305029296874991],[98.57919921875003,8.344287109374989],[98.49980468749999,8.317822265624997],[98.47402343750002,8.246923828124991],[98.42099609375003,8.17822265625],[98.36074218750002,8.186962890624997],[98.30546874999999,8.226220703124994],[98.23818359375002,8.423095703125],[98.22695312500002,8.543652343749997],[98.24179687500003,8.767871093749989],[98.32597656249999,8.968945312499997],[98.37138671874999,9.29052734375],[98.44316406249999,9.492822265624994],[98.49296874999999,9.561425781249994],[98.56191406250002,9.8375],[98.70253906250002,10.190380859374997],[98.65800781249999,10.179052734374991],[98.56259765625003,10.034960937499989],[98.52128906249999,10.107226562499989],[98.49687,10.182519531249994],[98.52304687500003,10.353125],[98.46494140625003,10.675830078124989],[98.5009765625,10.718945312499997],[98.53564453125,10.740673828124997],[98.59882812500001,10.864404296874994],[98.67558593749999,10.986914062499991],[98.6826171875,11.133105468749989],[98.74472656250003,11.240380859374994],[98.73007812500003,11.329980468749994],[98.73330078125002,11.435253906249997],[98.74638671874999,11.521289062499989],[98.74140625000001,11.591699218749994],[98.79072265625001,11.665087890624989],[98.8759765625,11.7197265625],[98.84023437500002,11.7392578125],[98.80478515625003,11.779248046874997],[98.69365234374999,11.718359375],[98.63632812500003,11.738378906249991],[98.62490234375002,11.801464843749997],[98.63906250000002,11.869140625],[98.64492187500002,11.910302734374994],[98.689453125,11.956738281249997],[98.68632812499999,12.047119140625],[98.66386718749999,12.126708984375],[98.6962890625,12.225244140624994],[98.63056640625001,12.225488281249994],[98.60029296875001,12.2453125],[98.619140625,12.3],[98.6787109375,12.348486328124991],[98.62441406250002,12.440722656249989],[98.66464843750003,12.539941406249994],[98.66318359375003,12.662402343749989],[98.63564453125002,12.7705078125],[98.63710937500002,12.848242187499991],[98.59511718750002,12.986035156249997],[98.57597656249999,13.161914062499989],[98.48710937499999,13.293066406249991],[98.42128906250002,13.483789062499994],[98.24541015624999,13.733496093749991],[98.24843750000002,13.840380859375003],[98.23896484375001,13.934472656249994],[98.20039062500001,13.980175781249997],[98.14951171875003,13.647607421874994],[98.11064453124999,13.712890625],[98.09824218750003,13.898339843749994],[98.07265625000002,13.986474609374994],[98.10019531250003,14.161523437499994],[97.99843750000002,14.335302734374991],[97.9765625,14.461474609375003],[97.90976562500003,14.652685546874991],[97.92929687500003,14.695556640625],[98.01875,14.652587890625],[97.9365234375,14.763916015625],[97.869140625,14.738720703124997],[97.81230468749999,14.858935546875003],[97.7998046875,15.184912109374991],[97.74375,15.306787109374994],[97.77421874999999,15.430957031250003],[97.71035156250002,15.875537109375003],[97.58427734374999,16.019580078125003],[97.60927734375002,16.143847656250003],[97.640625,16.253857421874997],[97.63369140625002,16.457666015624994],[97.66464843750003,16.520458984374997],[97.72597656250002,16.568554687499997],[97.66845703125,16.55161132812499],[97.61962890625,16.53720703124999],[97.50507812500001,16.525292968749994],[97.37587890625002,16.52294921875],[97.3310546875,16.671777343749994],[97.26748046875002,16.743115234374997],[97.21171874999999,16.892578125],[97.17832031250003,17.06201171875],[97.2001953125,17.095410156249997],[97.10019531250003,17.16455078125],[97.07451171874999,17.206933593749994],[96.97011718750002,17.317333984374997],[96.85146484375002,17.401025390624994],[96.87773437499999,17.3421875],[96.90976562500003,17.304833984374994],[96.85087890624999,17.202929687500003],[96.90859375000002,17.030957031249997],[96.85800781250003,16.921191406250003],[96.81064453125003,16.778369140625003],[96.76542968749999,16.710351562499994],[96.62246093750002,16.563916015624997],[96.50664062499999,16.514355468749997],[96.43115234375,16.504931640625003],[96.36435546875003,16.5205078125],[96.2822265625,16.595996093750003],[96.26210937500002,16.659130859374997],[96.24892578125002,16.765332031249997],[96.22031250000003,16.780566406250003],[96.18906250000003,16.768310546875],[96.23769531250002,16.63125],[96.23671875000002,16.567431640625003],[96.32431640625003,16.44443359374999],[96.29306640625003,16.410058593749994],[96.13505859374999,16.342529296875],[96.08095703125002,16.35336914062499],[96.04287109375002,16.33994140624999],[96.03212890625002,16.284619140624997],[96.01230468750003,16.253710937500003],[95.76328125000003,16.16904296874999],[95.71142578125,16.073388671874994],[95.67949218749999,15.976757812499997],[95.5556640625,15.837841796874997],[95.38955078125002,15.722753906249991],[95.34843749999999,15.729296875],[95.30146484375001,15.756152343750003],[95.30781250000001,15.880419921875003],[95.36474609375,15.985449218749991],[95.34677734375003,16.097607421874997],[95.3330078125,16.033251953125003],[95.22587890624999,15.876806640624991],[95.17695312500001,15.82568359375],[95.07832031250001,15.839160156250003],[94.94257812500001,15.818261718749994],[94.89121093750003,15.979101562499991],[94.89218750000003,16.03818359374999],[94.88222656250002,16.087939453125003],[94.89785156250002,16.140820312499997],[94.89316406250003,16.1828125],[94.86015624999999,16.102441406249994],[94.84775390625003,16.032861328124994],[94.79814453124999,15.97109375],[94.66152343750002,15.904394531249991],[94.65625,15.98876953125],[94.6513671875,16.06484375],[94.68076171875003,16.13330078125],[94.67656249999999,16.24204101562499],[94.71992187500001,16.398730468750003],[94.71660156249999,16.45249023437499],[94.70332031250001,16.511914062499997],[94.67900390624999,16.425585937500003],[94.66523437500001,16.336132812499997],[94.6376953125,16.30908203125],[94.5875,16.288818359375],[94.49570312500003,16.18613281249999],[94.44160156250001,16.094384765624994],[94.29902343750001,16.007617187500003],[94.22382812500001,16.01645507812499],[94.21425781250002,16.126611328124994],[94.27128906249999,16.517285156249997],[94.32734375000001,16.572167968749994],[94.35341796875002,16.639941406250003],[94.4,16.8681640625],[94.45244140624999,16.954492187499994],[94.47314453125,17.135449218749997],[94.49433593750001,17.166552734375003],[94.564453125,17.308544921874997],[94.58896484375003,17.5693359375],[94.56005859375,17.698974609375],[94.49433593750001,17.824609375],[94.43076171875003,18.20166015625],[94.26582031250001,18.507226562499994],[94.25214843750001,18.609179687500003],[94.17070312499999,18.732421875],[94.24570312500003,18.741162109374997],[94.09130859375,18.84921875],[94.07001953125001,18.89340820312499],[94.03896484375002,19.146191406249997],[94.044921875,19.287402343750003],[94.0224609375,19.268798828125],[94.00156250000003,19.181787109374994],[93.94101562500003,19.14609375],[93.96806640624999,18.995068359374997],[93.96132812500002,18.958398437499994],[93.92919921875,18.899658203125],[93.80009765624999,18.960595703124994],[93.70546875000002,19.026904296875003],[93.59814453125,19.1884765625],[93.49306640625002,19.36948242187499],[93.53056640624999,19.39755859374999],[93.57861328125,19.401171875],[93.72802734375,19.266503906249994],[93.82490234375001,19.238476562499997],[93.88613281250002,19.271923828124997],[93.96201171875003,19.329345703125],[93.99814453125003,19.440869140624997],[93.96074218749999,19.481689453125],[93.88789062500001,19.50390625],[93.83955078125001,19.534130859374997],[93.76992187500002,19.609570312499997],[93.76103515624999,19.648046875],[93.73955078124999,19.697265625],[93.66875,19.731982421875003],[93.61171875000002,19.776074218749997],[93.65986328125001,19.854150390624994],[93.70703125,19.912158203125003],[93.58183593749999,19.909570312499994],[93.43906250000003,20.009423828124994],[93.40957031250002,20.038330078125],[93.3623046875,20.058300781249997],[93.25,20.070117187500003],[93.15664062500002,20.040771484375],[93.19902343749999,19.898339843749994],[93.190625,19.851220703124994],[93.12949218750003,19.85800781249999],[93.001953125,20.074853515624994],[93.04033203124999,20.129785156249994],[93.09550781249999,20.181347656249997],[93.068359375,20.188671875],[93.01513671875,20.185253906249997],[93.06679687500002,20.377636718749997],[93.03535156250001,20.406152343749994],[93.01875,20.34604492187499],[92.99072265625,20.287988281249994],[92.88212890624999,20.152148437500003],[92.82832031250001,20.17758789062499],[92.79121093750001,20.21142578125],[92.84355468749999,20.282617187499994],[92.87167968750003,20.3017578125],[92.89111328125,20.34033203125],[92.85068359375003,20.41484375],[92.78691406249999,20.469042968750003],[92.73564453124999,20.562695312499997],[92.708984375,20.56396484375],[92.73261718750001,20.453369140625],[92.72285156250001,20.295605468749997],[92.60800781250003,20.469873046874994],[92.37832031250002,20.717578125],[92.32412109375002,20.79184570312499],[92.30781250000001,20.790429687499994],[92.24814453125003,20.88359375],[92.19462890624999,20.984277343749994],[92.05605468750002,21.1748046875],[92.01093750000001,21.516259765624994],[92.00800781250001,21.684765625],[91.91318359375003,21.883056640625],[91.85,22.157373046874994],[91.82480468750003,22.228662109374994],[91.85781250000002,22.317333984374997],[91.86337890625003,22.350488281249994],[91.84541015625001,22.34311523437499],[91.79707031250001,22.29746093749999],[91.73408203125001,22.406689453124997],[91.69296875000003,22.504785156249994],[91.52968750000002,22.707666015624994],[91.48212890625001,22.797412109375003],[91.48007812500003,22.884814453125003],[91.40957031250002,22.797021484374994],[91.31376953124999,22.73515625],[91.21621093750002,22.642236328124994],[91.1513671875,22.6140625],[90.94560546874999,22.59702148437499],[90.82675781250003,22.721386718749997],[90.65625,23.02548828124999],[90.63359374999999,23.09423828125],[90.65605468749999,23.273046875],[90.615625,23.442333984374997],[90.61611328125002,23.531640625],[90.60400390625,23.591357421875003],[90.57343750000001,23.578125],[90.56162109375003,23.537109375],[90.56806640625001,23.474267578124994],[90.5556640625,23.421533203124994],[90.40800781249999,23.431884765625],[90.26914062500003,23.455859375],[90.39150390625002,23.366943359375],[90.52275390624999,23.346142578124997],[90.59091796875003,23.26640625],[90.59921875000003,23.204150390625003],[90.59511718750002,23.133935546874994],[90.52773437500002,23.0849609375],[90.46601562500001,23.05390625],[90.4775390625,22.986767578124997],[90.55224609375,22.90488281249999],[90.46162109375001,22.881787109374997],[90.43691406250002,22.828173828125003],[90.43505859375,22.751904296874997],[90.48066406250001,22.68466796874999],[90.49843750000002,22.634814453125003],[90.48740234375003,22.58872070312499],[90.53173828125,22.539306640625],[90.59550781249999,22.435839843750003],[90.61611328125002,22.36215820312499],[90.58945312500003,22.258447265624994],[90.55283203125003,22.218164062499994],[90.494140625,22.17890625],[90.35576171874999,22.048242187499994],[90.28818359375003,21.8994140625],[90.23056640625003,21.829785156249997],[90.15878906250003,21.816845703124997],[90.13076171875002,21.847412109375],[90.07119140625002,21.887255859375003],[90.07001953125001,21.959912109374997],[90.087890625,22.017480468749994],[90.20957031250003,22.15659179687499],[90.14345703125002,22.137890625],[90.06855468750001,22.098193359375003],[89.95419921875003,22.022851562499994],[89.91806640625003,22.116162109374997],[89.89404296875,22.202587890624997],[89.89384765624999,22.308398437500003],[89.98515624999999,22.46640625],[89.8818359375,22.387597656249994],[89.85322265625001,22.288964843749994],[89.86582031250003,22.173046875],[89.8525390625,22.09091796874999],[89.81191406250002,21.98349609374999],[89.7568359375,21.91904296874999],[89.66777343749999,21.877685546875],[89.628125,21.814160156249997],[89.56855468750001,21.76743164062499],[89.56660156250001,21.860595703125],[89.54746093750003,21.983691406250003],[89.48320312499999,22.275537109374994],[89.46933593750003,22.212939453125003],[89.50253906250003,22.031884765624994],[89.50058593750003,21.914355468750003],[89.45195312499999,21.82109375],[89.35371093750001,21.72109375],[89.27861328124999,21.706982421874997],[89.23427734375002,21.722363281249997],[89.16708984375003,21.78427734374999],[89.09394531250001,21.872753906249997],[89.08164062500003,22.014941406250003],[89.05146484375001,22.093164062499994],[89.02792968750003,21.937207031249997],[88.94931640625003,21.937939453124997],[89.01962890625003,21.833642578124994],[89.0419921875,21.758691406249994],[89.05166015625002,21.654101562500003],[88.96708984374999,21.641357421875],[88.90742187500001,21.653076171875],[88.85751953125003,21.744677734375003],[88.834375,21.661376953125],[88.74501953125002,21.584375],[88.71298828125003,21.621972656249994],[88.69472656250002,21.662402343750003],[88.69121093749999,21.73349609374999],[88.740234375,22.005419921875003],[88.73027343749999,22.036083984374997],[88.70830078124999,22.05615234375],[88.65957031250002,22.066943359375003],[88.6416015625,22.121972656249994],[88.56679687500002,21.83212890624999],[88.59980468750001,21.713769531249994],[88.58466796875001,21.659716796875003],[88.44599609375001,21.6142578125],[88.30546874999999,21.723339843749997],[88.2875,21.758203125],[88.27919921875002,21.696875],[88.25371093749999,21.622314453125],[88.1220703125,21.635791015625003],[88.05683593750001,21.694140625],[88.09941406249999,21.79355468749999],[88.18105468750002,22.032910156249997],[88.1962890625,22.139550781249994],[88.08710937500001,22.217724609374997],[87.99443359374999,22.265673828125003],[87.94140625,22.374316406250003],[87.96162109375001,22.255029296874994],[88.0107421875,22.212646484375],[88.0830078125,22.18271484374999],[88.15927734375003,22.121728515624994],[88.10410156250003,22.04736328125],[88.05078125,22.00107421874999],[87.94843750000001,21.825439453125],[87.82373046875,21.72734375],[87.67822265625,21.653515625],[87.20068359375,21.544873046874997],[87.10068359375003,21.50078125],[86.9541015625,21.36533203124999],[86.85957031250001,21.23671875],[86.84228515625,21.106347656249994],[86.89580078124999,20.965576171875],[86.93935546875002,20.745068359374997],[86.97548828125002,20.700146484374997],[86.92451171875001,20.619775390624994],[86.8359375,20.534326171874994],[86.7625,20.419140625],[86.76923828125001,20.355908203124997],[86.75039062500002,20.313232421875],[86.49873046875001,20.171630859375],[86.44580078125,20.088916015625003],[86.37656250000003,20.006738281249994],[86.29365234375001,20.053759765625003],[86.24521484375003,20.053027343750003],[86.31191406250002,19.98779296875],[86.30292968750001,19.94467773437499],[86.27949218750001,19.91943359375],[86.21621093750002,19.895800781250003],[85.85292968750002,19.791748046875],[85.575,19.692919921875003],[85.49687,19.696923828124994],[85.51113281250002,19.72690429687499],[85.55976562500001,19.753466796875003],[85.55507812500002,19.866894531249997],[85.50410156250001,19.8876953125],[85.4599609375,19.895898437499994],[85.24863281250003,19.75766601562499],[85.16279296875001,19.620898437500003],[85.18076171875003,19.594873046874994],[85.228515625,19.601318359375],[85.37089843749999,19.67890625],[85.43691406250002,19.656884765624994],[85.44160156250001,19.6265625],[85.2255859375,19.508349609375003],[84.77099609375,19.125390625],[84.74980468749999,19.050097656250003],[84.69082031250002,18.96469726562499],[84.609375,18.884326171875003],[84.46279296875002,18.689746093750003],[84.18173828125003,18.400585937499997],[84.10410156250003,18.292675781249997],[83.654296875,18.069873046875003],[83.572265625,18.003613281249997],[83.38798828124999,17.786669921875003],[83.19833984375003,17.608984375],[82.97685546874999,17.461816406249994],[82.59316406250002,17.27392578125],[82.35957031250001,17.09619140625],[82.28652343750002,16.978076171875003],[82.28193359375001,16.936083984375003],[82.30722656250003,16.878564453124994],[82.35,16.8251953125],[82.35976562500002,16.7828125],[82.33867187499999,16.70654296875],[82.3271484375,16.664355468750003],[82.2587890625,16.559863281250003],[82.14150390625002,16.4853515625],[81.76191406250001,16.329492187499994],[81.71171874999999,16.33447265625],[81.40185546875,16.365234375],[81.2861328125,16.337060546874994],[81.23857421874999,16.263964843750003],[81.13212890624999,15.961767578124991],[81.03007812499999,15.881445312499991],[80.99345703124999,15.808740234374994],[80.97871093750001,15.758349609375003],[80.91777343749999,15.759667968749994],[80.86474609375,15.7822265625],[80.82597656249999,15.765917968750003],[80.78183593750003,15.867333984374994],[80.70781249999999,15.888085937499994],[80.64658203125003,15.89501953125],[80.38486328125003,15.792773437500003],[80.29345703125,15.710742187500003],[80.10107421875,15.323632812499994],[80.05341796875001,15.074023437500003],[80.0986328125,14.798242187499994],[80.16542968750002,14.577832031249997],[80.1787109375,14.478320312500003],[80.17011718750001,14.349414062500003],[80.13623046875,14.286572265624997],[80.11171875000002,14.212207031250003],[80.14365234375003,14.058935546874991],[80.22441406249999,13.858203125],[80.244140625,13.773486328125003],[80.24580078125001,13.685839843750003],[80.30654296875002,13.485058593749997],[80.265625,13.521289062500003],[80.2333984375,13.605761718750003],[80.15625,13.713769531249994],[80.06210937500003,13.60625],[80.1142578125,13.528710937499994],[80.29033203124999,13.43671875],[80.34238281250003,13.361328125],[80.22910156250003,12.690332031249994],[80.14306640625,12.452001953124991],[80.0375,12.295800781249994],[79.98173828124999,12.235449218749991],[79.85849609375003,11.98876953125],[79.77138671875002,11.690234374999989],[79.75410156250001,11.575292968749991],[79.79335937500002,11.446679687499994],[79.74892578125002,11.37060546875],[79.69316406249999,11.312548828124989],[79.79902343750001,11.338671874999989],[79.83525390624999,11.268847656249989],[79.8486328125,11.196875],[79.85019531250003,10.768847656249989],[79.83818359374999,10.322558593749989],[79.75693359375003,10.304345703124994],[79.66738281250002,10.299707031249994],[79.58857421875001,10.312353515624991],[79.53164062500002,10.329638671874989],[79.39052734375002,10.305957031249989],[79.31455078125003,10.256689453124991],[79.25361328125001,10.1748046875],[79.2578125,10.035205078124989],[78.99628906250001,9.68310546875],[78.93994140625,9.565771484374991],[78.91914062500001,9.452880859375],[78.953125,9.393798828125],[79.01992187500002,9.333349609374991],[79.10703125000003,9.308935546874991],[79.27548828125003,9.284619140624997],[79.35634765625002,9.252148437499997],[79.41142578124999,9.1923828125],[79.212890625,9.256005859374994],[78.97958984375003,9.2685546875],[78.42148437500003,9.105029296874989],[78.27451171875003,8.990185546874997],[78.19248046875003,8.890869140625],[78.13603515624999,8.663378906249989],[78.12636718750002,8.511328125],[78.06015625000003,8.384570312499989],[77.77031249999999,8.18984375],[77.58720703124999,8.1298828125],[77.517578125,8.078320312499997],[77.30146484375001,8.145312499999989],[77.06591796875,8.31591796875],[76.96689453125003,8.407275390624989],[76.61728515625003,8.847070312499994],[76.55341796875001,8.902783203124997],[76.48291015625,9.090771484374997],[76.47177734375003,9.160839843749997],[76.45234375000001,9.188769531249989],[76.41904296875003,9.207812499999989],[76.40312,9.23681640625],[76.32460937500002,9.452099609374997],[76.29238281250002,9.676464843749997],[76.24238281250001,9.927099609374991],[76.28466796875,9.909863281249997],[76.34306640624999,9.82734375],[76.37226562500001,9.707373046874991],[76.37558593750003,9.539892578124991],[76.41953125000003,9.520458984374997],[76.45878906249999,9.536230468749991],[76.34648437499999,9.922119140625],[76.24873046875001,10.01796875],[76.22275390625003,10.024267578124991],[76.19560546874999,10.086132812499997],[76.19267578124999,10.163769531249997],[76.20146484374999,10.200634765624997],[76.12333984374999,10.327001953124991],[76.09609375000002,10.402246093749994],[75.92255859375001,10.784082031249994],[75.84462890625002,11.057568359374997],[75.72382812500001,11.361767578124997],[75.64609375,11.468408203124994],[75.52451171875,11.703125],[75.42265625000002,11.812207031249997],[75.31464843750001,11.958447265624997],[75.22978515625002,12.023339843749994],[75.19667968750002,12.057519531249994],[74.94550781250001,12.564550781249991],[74.86826171875,12.844580078124991],[74.80292968750001,12.976855468749989],[74.7705078125,13.07734375],[74.68232421875001,13.506933593749991],[74.681640625,13.583740234375],[74.6708984375,13.667626953124994],[74.60849609375,13.849658203125003],[74.49853515625,14.046337890624997],[74.46669921875002,14.168847656249994],[74.46699218750001,14.216503906249997],[74.39716796875001,14.407421875],[74.38222656250002,14.494726562499991],[74.33505859375,14.575439453125],[74.28037109375,14.649511718749991],[74.22304687500002,14.708886718749994],[74.08876953125002,14.902197265624991],[74.040625,14.949365234374994],[73.94921875,15.074755859375003],[73.88427734375,15.306445312500003],[73.80078125,15.39697265625],[73.93193359375002,15.39697265625],[73.85195312500002,15.482470703125003],[73.81386718750002,15.53857421875],[73.77177734375002,15.573046875],[73.83281250000002,15.659375],[73.73281250000002,15.656933593749997],[73.67988281250001,15.708886718749994],[73.60771484375002,15.87109375],[73.47607421875,16.054248046875003],[73.4537109375,16.152099609375],[73.33759765625001,16.459863281249994],[73.23916015625002,17.198535156250003],[73.1490234375,17.52744140624999],[73.15605468750002,17.62192382812499],[73.04716796875002,17.90673828125],[72.99394531250002,18.097705078125003],[72.97207031250002,18.25927734375],[72.94316406250002,18.365625],[72.91718750000001,18.576123046874997],[72.87548828125,18.642822265625],[72.87089843750002,18.683056640624997],[72.89873046875002,18.778955078124994],[72.97685546875002,18.927197265624997],[73.00556640625001,19.02109375],[72.97207031250002,19.1533203125],[72.90068359375002,19.01450195312499],[72.83466796875001,18.9755859375],[72.80302734375002,19.079296875],[72.802734375,19.21875],[72.79453125,19.252099609374994],[72.81162109375,19.29892578124999],[72.98720703125002,19.27744140624999],[72.78789062500002,19.362988281249997],[72.76396484375002,19.41318359374999],[72.7564453125,19.45053710937499],[72.7994140625,19.519824218750003],[72.7265625,19.578271484374994],[72.69746093750001,19.757128906250003],[72.67597656250001,19.79794921874999],[72.66777343750002,19.830957031249994],[72.708984375,20.078027343749994],[72.88115234375002,20.563183593749997],[72.89375,20.672753906249994],[72.87890625,20.828515625],[72.84052734375001,20.95249023437499],[72.82431640625,21.08359375],[72.81386718750002,21.1171875],[72.7515625,21.129150390625],[72.6923828125,21.177636718749994],[72.62382812500002,21.371972656249994],[72.6865234375,21.435742187499997],[72.73476562500002,21.47080078124999],[72.66835937500002,21.45590820312499],[72.61328125,21.461816406249994],[72.71757812500002,21.55126953125],[72.810546875,21.619921875],[73.0224609375,21.699609375],[73.1125,21.750439453124997],[72.9791015625,21.7046875],[72.83974609375002,21.687255859375],[72.54306640625,21.696582031250003],[72.59248046875001,21.877587890624994],[72.64404296875,21.93798828125],[72.7001953125,21.971923828125],[72.61748046875002,21.96171875],[72.52226562500002,21.976220703124994],[72.55302734375002,22.159960937500003],[72.6279296875,22.199609375],[72.70878906250002,22.207177734374994],[72.8091796875,22.233300781249994],[72.70195312500002,22.263623046874997],[72.59013671875002,22.278125],[72.45595703125002,22.248095703125003],[72.3326171875,22.270214843749997],[72.18281250000001,22.269726562499997],[72.24257812500002,22.245166015625003],[72.30644531250002,22.189208984375],[72.2744140625,22.089746093749994],[72.24433593750001,22.027636718750003],[72.16171875,21.984814453124997],[72.09443359375001,21.919970703125003],[72.07558593750002,21.862988281249997],[72.03720703125,21.823046875],[72.10292968750002,21.794580078124994],[72.1708984375,21.774316406249994],[72.21035156250002,21.728222656249997],[72.25664062500002,21.66123046874999],[72.25400390625,21.531005859375],[72.07656250000002,21.224072265624997],[72.015234375,21.155712890624997],[71.57109375000002,20.97055664062499],[71.396484375,20.869775390624994],[71.02460937500001,20.73886718749999],[70.87968750000002,20.714501953124994],[70.7193359375,20.740429687499997],[70.48505859375001,20.84018554687499],[70.12734375000002,21.094677734374997],[70.034375,21.17880859374999],[69.74843750000002,21.50571289062499],[69.5419921875,21.67856445312499],[69.38544921875001,21.839550781249997],[69.19169921875002,21.991503906250003],[69.0087890625,22.19677734375],[68.96992187500001,22.290283203125],[68.98349609375,22.385400390624994],[69.05166015625002,22.437304687500003],[69.13134765625,22.416259765625],[69.19423828125002,22.336083984374994],[69.2388671875,22.300195312499994],[69.27656250000001,22.28549804687499],[69.54921875000002,22.408398437499997],[69.65517578125002,22.403515625],[69.7275390625,22.46518554687499],[69.81904296875001,22.45175781249999],[70.005859375,22.54770507812499],[70.08417968750001,22.553515625],[70.17724609375,22.57275390625],[70.327734375,22.81577148437499],[70.4404296875,22.9703125],[70.51347656250002,23.002490234375003],[70.509375,23.04013671874999],[70.4892578125,23.089501953124994],[70.4345703125,23.077099609374997],[70.39628906250002,23.03012695312499],[70.36796875000002,22.97348632812499],[70.339453125,22.939746093750003],[70.25117187500001,22.970898437499997],[70.19169921875002,22.96567382812499],[70.11826171875,22.947021484375],[69.84980468750001,22.8564453125],[69.73964843750002,22.775195312500003],[69.6646484375,22.759082031250003],[69.2359375,22.848535156249994],[68.81708984375001,23.0537109375],[68.64072265625,23.18994140625],[68.52919921875002,23.3640625],[68.41748046875,23.571484375],[68.45380859375001,23.62949218749999],[68.62714843750001,23.754150390625],[68.77675781250002,23.852099609375003],[68.64238281250002,23.808496093749994],[68.496875,23.747998046874997],[68.42490234375,23.70556640625],[68.343359375,23.616845703124994],[68.2349609375,23.596972656250003],[68.1919921875,23.72890625],[68.1650390625,23.857324218749994],[68.14882812500002,23.79721679687499],[68.11552734375002,23.753369140624997],[68.06777343750002,23.818359375],[68.03701171875002,23.84824218749999],[68.00146484375,23.826074218749994],[67.95097656250002,23.82861328125],[67.8599609375,23.90268554687499],[67.81904296875001,23.828076171874997],[67.66845703125,23.810986328124997],[67.64951171875,23.86728515624999],[67.64580078125002,23.919873046874997],[67.5630859375,23.8818359375],[67.50361328125001,23.94003906249999],[67.47685546875002,24.018261718749997],[67.45390625000002,24.03989257812499],[67.42763671875002,24.06484375],[67.365234375,24.091601562500003],[67.309375,24.1748046875],[67.304296875,24.262890625],[67.288671875,24.36777343749999],[67.171484375,24.756103515625],[67.1005859375,24.791943359374997],[66.70302734375002,24.8609375],[66.6822265625,24.928857421874994],[66.70986328125002,25.111328125],[66.69863281250002,25.226318359375],[66.569921875,25.378515625],[66.53388671875001,25.484375],[66.42861328125002,25.575341796874994],[66.32421875,25.601806640625],[66.21904296875002,25.589892578125003],[66.16230468750001,25.55390625],[66.13115234375002,25.49326171874999],[66.3564453125,25.507373046875003],[66.40712890625002,25.485058593749997],[66.46767578125002,25.4453125],[66.4029296875,25.446826171875003],[66.32832031250001,25.465771484374997],[66.23466796875002,25.46435546875],[65.88359375000002,25.419628906249997],[65.6796875,25.355273437500003],[65.40625,25.374316406250003],[65.06132812500002,25.311083984375003],[64.77666015625002,25.307324218749997],[64.65898437500002,25.18408203125],[64.59404296875002,25.206298828125],[64.54375,25.23666992187499],[64.15205078125001,25.333447265624997],[64.12490234375002,25.373925781249994],[64.059375,25.40292968749999],[63.9873046875,25.351171875],[63.935546875,25.342529296875],[63.72089843750001,25.385888671874994],[63.556640625,25.353173828124994],[63.495703125,25.297509765624994],[63.49140625000001,25.210839843749994],[63.285742187500006,25.227587890625003],[63.170019531250006,25.2548828125],[63.01503906250002,25.224658203125003],[62.66474609375001,25.264794921874994],[62.57246093750001,25.25473632812499],[62.44472656250002,25.197265625],[62.391210937500006,25.152539062499997],[62.31533203125002,25.134912109374994],[62.24873046875001,25.19736328124999],[62.19863281250002,25.224853515625],[62.15214843750002,25.206640625],[62.089453125,25.155322265625003],[61.90791015625001,25.131298828124997],[61.74365234375,25.13818359375],[61.53310546875002,25.195507812499997],[61.490332031250006,25.15366210937499],[61.412207031250006,25.102099609375003],[61.24296875000002,25.141992187499994],[61.10859375000001,25.183886718750003],[60.66386718750002,25.2822265625],[60.61513671875002,25.329833984375],[60.5875,25.413525390624997],[60.51054687500002,25.437060546875003],[60.40019531250002,25.311572265625003],[60.02470703125002,25.38413085937499],[59.897070312500006,25.36181640625],[59.818359375,25.40087890625],[59.61601562500002,25.403271484374997],[59.4560546875,25.481494140625003],[59.22724609375001,25.427734375],[59.04609375000001,25.417285156250003],[58.7978515625,25.554589843749994],[58.530859375,25.592431640624994],[58.31425781250002,25.580859375],[58.20292968750002,25.591601562500003],[58.02236328125002,25.640820312499997],[57.936621093750006,25.691650390625],[57.79609375000001,25.653027343749997],[57.732519531250006,25.724902343750003],[57.334570312500006,25.791552734375003],[57.26093750000001,25.918847656249994],[57.20556640625,26.03720703125],[57.20136718750001,26.158837890624994],[57.10429687500002,26.371435546875],[57.07197265625001,26.680078125],[57.03603515625002,26.800683593749994],[56.98222656250002,26.90546875],[56.91044921875002,26.994580078124997],[56.81289062500002,27.089990234374994],[56.728125,27.127685546875],[56.35615234375001,27.200244140624996],[56.284375,27.190625],[56.11806640625002,27.143115234374996],[55.94111328125001,27.03759765625],[55.65029296875002,26.9775390625],[55.59160156250002,26.93212890625],[55.5185546875,26.829931640625],[55.42402343750001,26.770556640624996],[55.29414062500001,26.7859375],[55.15458984375002,26.725390625],[54.89580078125002,26.556689453124996],[54.75927734375,26.505078125],[54.64492187500002,26.508935546874994],[54.522070312500006,26.589160156249996],[54.2470703125,26.696630859375],[54.0693359375,26.732373046874997],[53.82255859375002,26.707714843749997],[53.70576171875001,26.7255859375],[53.50712890625002,26.851757812499997],[53.45498046875002,26.943261718749994],[53.34169921875002,27.0044921875],[52.982519531250006,27.141943359375],[52.69160156250001,27.323388671874994],[52.63818359375,27.391992187499994],[52.602636718750006,27.493359375],[52.47587890625002,27.616503906249996],[52.19189453125,27.71728515625],[52.03076171875,27.824414062499997],[51.84199218750001,27.8482421875],[51.66630859375002,27.844970703125],[51.58906250000001,27.864208984374997],[51.5185546875,27.910009765625],[51.27890625,28.13134765625],[51.27607421875001,28.21884765625],[51.12841796875,28.43515625],[51.093847656250006,28.512109375],[51.06201171875,28.726123046874996],[51.02119140625001,28.782080078125],[50.86699218750002,28.870166015624996],[50.84296875000001,28.92783203125],[50.87578125000002,29.00439453125],[50.87578125000002,29.062695312499997],[50.795507812500006,29.117431640625],[50.67519531250002,29.14658203125],[50.64609375,29.212207031249996],[50.66796875,29.33984375],[50.64960937500001,29.420068359374994],[50.543554687500006,29.547998046874994],[50.38691406250001,29.679052734375],[50.23017578125001,29.872900390625],[50.1689453125,29.921240234375],[50.12890625,30.048095703125],[50.07158203125002,30.198535156249996],[49.98310546875001,30.209375],[49.55488281250001,30.028955078124994],[49.42998046875002,30.13046875],[49.054296875,30.306933593749996],[49.028125,30.333447265624997],[49.001953125,30.373925781249994],[49.04902343750001,30.397265625],[49.09619140625,30.406787109374996],[49.19033203125002,30.375390625],[49.24726562500001,30.4125],[49.22451171875002,30.472314453124994],[49.13037109375,30.509423828124994],[49.001953125,30.506542968749997],[49.037109375,30.450488281249996],[48.91679687500002,30.397265625],[48.891210937500006,30.32763671875],[48.90869140625,30.241455078125],[48.91914062500001,30.120898437499996],[48.8701171875,30.062402343749994],[48.83242187500002,30.035498046875],[48.6708984375,30.0283203125],[48.59550781250002,29.975048828124997],[48.546484375,29.962353515624997],[48.454199218750006,29.9384765625],[48.354589843750006,29.956738281249997],[48.141699218750006,30.040917968749994],[48.07275390625,30.043212890625],[47.982519531250006,30.011328125],[47.97871093750001,29.9828125],[47.9736328125,29.9458984375],[48.00566406250002,29.835791015625],[48.07734375000001,29.715576171875],[48.13613281250002,29.618115234374997],[48.14345703125002,29.572460937499997],[48.089453125,29.5791015625],[48.04833984375,29.597509765625],[47.96962890625002,29.61669921875],[47.817480468750006,29.48740234375],[47.72529296875001,29.416943359374997],[47.72265625,29.393017578124997],[47.8453125,29.36572265625],[47.93535156250002,29.366601562499994],[47.998144531250006,29.385546875],[48.05146484375001,29.355371093749994],[48.08632812500002,29.27548828125],[48.10039062500002,29.210742187499996],[48.18378906250001,28.979394531249994],[48.2529296875,28.901269531249994],[48.33925781250002,28.76328125],[48.37128906250001,28.691845703124997],[48.3896484375,28.631591796875],[48.442480468750006,28.542919921874997],[48.49853515625,28.448876953124994],[48.523046875,28.355029296874996],[48.62636718750002,28.132568359375],[48.77373046875002,27.95908203125],[48.80898437500002,27.895898437499994],[48.83281250000002,27.800683593749994],[48.807226562500006,27.765283203124994],[48.79716796875002,27.724316406249997],[48.90644531250001,27.629052734374994],[49.0869140625,27.548583984375],[49.15751953125002,27.528222656249994],[49.2375,27.492724609374996],[49.17509765625002,27.437646484374994],[49.28154296875002,27.310498046874997],[49.4052734375,27.180957031249996],[49.537695312500006,27.151757812499994],[49.71650390625001,26.955859375],[49.98613281250002,26.82890625],[50.14980468750002,26.662646484374996],[50.13466796875002,26.659521484375],[50.08662109375001,26.676416015624994],[50.0263671875,26.69921875],[50.00810546875002,26.678515625],[50.011328125,26.608789062499994],[50.02734375,26.52685546875],[50.11074218750002,26.455957031249994],[50.18496093750002,26.404931640624994],[50.2138671875,26.308496093749994],[50.15546875000001,26.100537109374997],[50.13525390625,26.10068359375],[50.09599609375002,26.118701171874996],[50.05390625000001,26.122851562499996],[50.03164062500002,26.110986328124994],[50.0810546875,25.961376953124997],[50.13027343750002,25.846630859374997],[50.18964843750001,25.755810546874997],[50.23896484375001,25.622851562500003],[50.28125,25.566113281249997],[50.455175781250006,25.4248046875],[50.50849609375001,25.306689453125003],[50.55791015625002,25.086669921875],[50.66689453125002,24.963818359374997],[50.7255859375,24.869384765625],[50.80439453125001,24.789257812499997],[50.8359375,24.850390625],[50.846777343750006,24.888574218749994],[50.77734375,25.177441406249997],[50.75458984375001,25.39926757812499],[50.76289062500001,25.444726562499994],[50.80263671875002,25.4970703125],[50.86865234375,25.612695312499994],[50.90380859375,25.724072265624997],[51.003125,25.9814453125],[51.10810546875001,26.08056640625],[51.262304687500006,26.153271484374997],[51.38906250000002,26.011132812499994],[51.543066406250006,25.902392578125003],[51.572265625,25.781005859375],[51.526953125,25.68212890625],[51.4853515625,25.524707031250003],[51.51025390625,25.45234375],[51.51953125,25.38974609374999],[51.56142578125002,25.284472656250003],[51.60195312500002,25.14794921875],[51.60888671875,25.052880859374994],[51.5869140625,24.96484375],[51.53339843750001,24.890869140625],[51.42792968750001,24.668261718750003],[51.396484375,24.64511718749999],[51.26796875000002,24.607226562500003],[51.338476562500006,24.564355468749994],[51.411230468750006,24.57080078125],[51.41835937500002,24.530957031249997],[51.36992187500002,24.47690429687499],[51.30986328125002,24.340380859375003],[51.39521484375001,24.31884765625],[51.47675781250001,24.308203125],[51.534765625,24.286328125],[51.568359375,24.286181640625003],[51.60546875,24.338427734375003],[51.623144531250006,24.301074218750003],[51.66455078125,24.250439453124997],[51.73476562500002,24.26279296874999],[51.767578125,24.25439453125],[51.79169921875001,24.074755859375003],[51.84316406250002,24.010888671874994],[51.90605468750002,23.9853515625],[52.11855468750002,23.97109375],[52.25087890625002,23.99521484374999],[52.51142578125001,24.1125],[52.64824218750002,24.15463867187499],[53.0263671875,24.14731445312499],[53.32958984375,24.0984375],[53.8017578125,24.069482421874994],[53.89335937500002,24.077050781249994],[54.14794921875,24.171191406250003],[54.304296875,24.254296875],[54.397070312500006,24.27817382812499],[54.45839843750002,24.35825195312499],[54.49882812500002,24.462695312500003],[54.53466796875,24.530957031249997],[54.58046875000002,24.563525390625003],[54.624121093750006,24.621289062499997],[54.65898437500002,24.715527343749997],[54.74677734375001,24.810449218749994],[55.09814453125,25.04160156249999],[55.30351562500002,25.23681640625],[55.32167968750002,25.2998046875],[55.43339843750002,25.394482421874997],[55.52285156250002,25.49814453124999],[55.94121093750002,25.793994140625003],[56.02519531250002,25.916015625],[56.07460937500002,26.052783203124996],[56.08046875000002,26.062646484374994],[56.16445312500002,26.20703125],[56.197265625,26.229199218749997],[56.22841796875002,26.219775390624996],[56.30556640625002,26.235205078125],[56.34648437500002,26.313623046874994],[56.37871093750002,26.356347656249994],[56.4130859375,26.351171875],[56.429785156250006,26.327197265624996],[56.41777343750002,26.208154296874994],[56.41640625000002,26.108740234375],[56.373632812500006,25.804589843749994],[56.32929687500001,25.751953125],[56.307226562500006,25.70932617187499],[56.2978515625,25.650683593750003],[56.36347656250001,25.569384765625003],[56.37285156250002,25.018310546875],[56.38798828125002,24.979199218749997],[56.48984375,24.716357421875003],[56.640625,24.4703125],[56.77412109375001,24.33457031249999],[56.9125,24.150195312500003],[57.123046875,23.980712890625],[57.219824218750006,23.922753906249994],[57.611328125,23.803662109374997],[57.82509765625002,23.75913085937499],[58.12041015625002,23.716552734375],[58.32451171875002,23.623828125],[58.393164062500006,23.6181640625],[58.5,23.645654296874994],[58.57802734375002,23.643457031249994],[58.773046875,23.5171875],[58.83037109375002,23.3974609375],[58.91152343750002,23.334179687499997],[58.9833984375,23.23471679687499],[59.029882812500006,23.130566406249997],[59.19472656250002,22.971875],[59.31093750000002,22.793359375],[59.42939453125001,22.660839843749997],[59.53515625,22.578515625],[59.69560546875002,22.546142578125],[59.8232421875,22.508984375],[59.8375,22.420556640624994],[59.82441406250001,22.30517578125],[59.8,22.219921875],[59.68085937500001,22.05380859374999],[59.65253906250001,21.951367187499997],[59.517578125,21.78232421874999],[59.37148437500002,21.498828125],[59.30449218750002,21.435351562500003],[59.06875,21.2890625],[58.89570312500001,21.11279296875],[58.6904296875,20.80712890625],[58.5341796875,20.50390625],[58.47421875,20.406884765624994],[58.348730468750006,20.386914062499997],[58.26601562500002,20.395458984374997],[58.208984375,20.423974609374994],[58.23164062500001,20.5068359375],[58.24501953125002,20.59921875],[58.16943359375,20.589501953124994],[58.10292968750002,20.570361328125003],[57.94716796875002,20.34360351562499],[57.86181640625,20.244140625],[57.84365234375002,20.117724609375003],[57.80214843750002,19.95458984375],[57.7412109375,19.804492187500003],[57.71416015625002,19.678417968749997],[57.71513671875002,19.60693359375],[57.760839843750006,19.43222656249999],[57.76396484375002,19.253320312499994],[57.79033203125002,19.145947265624997],[57.811621093750006,19.01708984375],[57.73847656250001,18.97734375],[57.67578125,18.95786132812499],[57.42792968750001,18.943798828124997],[57.17656250000002,18.902587890625],[56.95722656250001,18.827832031249997],[56.82597656250002,18.753515625],[56.65507812500002,18.587353515624997],[56.55078125,18.165966796874997],[56.38349609375001,17.987988281249997],[56.27031250000002,17.95078125],[55.99765625,17.935205078124994],[55.613867187500006,17.88608398437499],[55.479101562500006,17.84326171875],[55.25537109375,17.585644531249997],[55.23818359375002,17.50473632812499],[55.28144531250001,17.446240234374997],[55.29560546875001,17.381591796875],[55.27519531250002,17.32089843749999],[55.17373046875002,17.157617187499994],[55.06416015625001,17.03891601562499],[54.771875,16.964648437500003],[54.664648437500006,17.00888671874999],[54.566503906250006,17.03125],[54.376953125,17.033642578124997],[54.06816406250002,17.005517578124994],[53.95439453125002,16.91782226562499],[53.775390625,16.855712890625],[53.60986328125,16.759960937499997],[53.29775390625002,16.723339843749997],[53.08564453125001,16.648388671874997],[52.58144531250002,16.470361328124994],[52.44843750000001,16.391259765624994],[52.327734375,16.29355468749999],[52.2373046875,16.17138671875],[52.17402343750001,15.956835937500003],[52.22207031250002,15.760595703124991],[52.21748046875001,15.655517578125],[52.08730468750002,15.5859375],[51.9658203125,15.535693359375003],[51.83076171875001,15.459277343750003],[51.748632812500006,15.440136718749997],[51.68154296875002,15.379101562499997],[51.60371093750001,15.336816406249994],[51.32246093750001,15.226269531249997],[51.01513671875,15.140771484374994],[50.52705078125001,15.038183593749991],[50.33857421875001,14.927197265624997],[50.16689453125002,14.851025390624997],[49.906347656250006,14.828125],[49.54863281250002,14.722412109375],[49.34990234375002,14.637792968749991],[49.10292968750002,14.500048828125003],[49.04804687500001,14.456445312499994],[49.00468750000002,14.355029296875003],[48.9287109375,14.267480468749994],[48.77998046875001,14.123876953124991],[48.66835937500002,14.050146484374991],[48.59375,14.046240234374991],[48.44902343750002,14.005908203125003],[48.27783203125,13.99765625],[47.98994140625001,14.048095703125],[47.916015625,14.012841796874994],[47.855078125,13.956933593749994],[47.633398437500006,13.858447265625003],[47.40771484375,13.66162109375],[47.24257812500002,13.609375],[46.975683593750006,13.547460937499991],[46.78886718750002,13.465576171875],[46.66347656250002,13.432714843749991],[46.501953125,13.415576171875003],[46.203125,13.423828125],[45.91972656250002,13.394287109375],[45.657324218750006,13.338720703124991],[45.53398437500002,13.233496093749991],[45.3935546875,13.067041015624994],[45.16386718750002,12.998291015625],[45.10976562500002,12.938574218749991],[45.038671875,12.815869140624997],[44.88984375000001,12.7841796875],[44.75527343750002,12.763769531249991],[44.617773437500006,12.817236328124991],[44.358496093750006,12.669140625],[44.260351562500006,12.644628906249991],[44.11152343750001,12.638671875],[44.005859375,12.607666015625],[43.929785156250006,12.616503906249989],[43.83535156250002,12.674414062499991],[43.634375,12.744482421874991],[43.48759765625002,12.698828125],[43.47529296875001,12.839013671874994],[43.23193359375,13.26708984375],[43.28261718750002,13.63984375],[43.28242187500001,13.692529296874994],[43.23408203125001,13.858935546875003],[43.08906250000001,14.010986328125],[43.093359375,14.203662109375003],[43.04482421875002,14.341552734375],[43.00625,14.483105468749997],[43.01875,14.520800781250003],[43.02109375,14.554882812499997],[42.94697265625001,14.773144531249997],[42.92216796875002,14.8173828125],[42.91298828125002,14.863085937500003],[42.93730468750002,14.898046875],[42.93642578125002,14.938574218749991],[42.897070312500006,15.005566406249997],[42.85566406250001,15.132958984374994],[42.6578125,15.2328125],[42.697851562500006,15.326318359374994],[42.736425781250006,15.293554687499991],[42.78847656250002,15.265722656249991],[42.79902343750001,15.326269531249991],[42.799902343750006,15.371630859375003],[42.71718750000002,15.654638671874991],[42.83964843750002,16.03203125],[42.79931640625,16.371777343749997],[42.78984375000002,16.4515625],[42.73066406250001,16.56982421875],[42.72636718750002,16.6533203125],[42.698828125,16.736962890624994],[42.6474609375,16.80136718749999],[42.55292968750001,16.868457031250003],[42.54414062500001,16.959667968749997],[42.475,17.049853515625003],[42.38330078125,17.122460937499994],[42.33242187500002,17.256640625],[42.2939453125,17.434960937499994],[42.05224609375,17.669335937499994],[41.75,17.8857421875],[41.65800781250002,18.00766601562499],[41.50761718750002,18.256103515625],[41.431738281250006,18.452441406250003],[41.2294921875,18.678417968749997],[41.220800781250006,18.765234375],[41.19082031250002,18.87119140624999],[41.144140625,18.9890625],[41.11601562500002,19.082177734374994],[40.91328125000001,19.490136718749994],[40.84785156250001,19.55527343749999],[40.791601562500006,19.646386718749994],[40.77705078125001,19.71689453124999],[40.75917968750002,19.75546875],[40.61591796875001,19.82236328124999],[40.48222656250002,19.993457031250003],[40.080664062500006,20.265917968750003],[39.88408203125002,20.29296875],[39.72832031250002,20.390332031249997],[39.61367187500002,20.51767578124999],[39.4912109375,20.737011718749997],[39.27607421875001,20.97397460937499],[39.09355468750002,21.310351562500003],[39.15068359375002,21.432763671874994],[39.147070312500006,21.518994140624997],[39.09101562500001,21.663964843749994],[39.02978515625,21.77597656249999],[38.987890625,21.881738281249994],[39.02119140625001,22.033447265625],[39.03398437500002,22.203369140625],[39.069921875,22.293652343749997],[39.09589843750001,22.392773437499997],[39.06201171875,22.5921875],[39.00136718750002,22.698974609375],[39.007421875,22.770068359375003],[38.93876953125002,22.80478515624999],[38.882910156250006,22.88203125],[38.94111328125001,22.8818359375],[38.835546875,22.9890625],[38.796875,23.048583984375],[38.75703125000001,23.194287109374997],[38.7060546875,23.30551757812499],[38.54228515625002,23.557910156250003],[38.46416015625002,23.711865234374997],[38.28886718750002,23.91098632812499],[38.0986328125,24.058007812499994],[37.97783203125002,24.124560546875003],[37.91972656250002,24.18540039062499],[37.82099609375001,24.1875],[37.71337890625,24.2744140625],[37.63818359375,24.277734375],[37.543066406250006,24.291650390624994],[37.43095703125002,24.459033203125003],[37.338476562500006,24.61582031249999],[37.18085937500001,24.820019531249997],[37.22041015625001,24.873339843750003],[37.26630859375001,24.96005859374999],[37.24345703125002,25.0734375],[37.218359375,25.150683593750003],[37.14882812500002,25.29111328124999],[36.92070312500002,25.641162109375003],[36.86015625000002,25.69248046874999],[36.7626953125,25.75131835937499],[36.70253906250002,25.902880859375003],[36.67519531250002,26.038867187499996],[36.51875,26.104882812499994],[36.249609375,26.594775390624996],[36.09375,26.765820312499997],[36.03203125000002,26.881005859374994],[35.851660156250006,27.070458984374994],[35.76298828125002,27.2587890625],[35.58134765625002,27.432470703125],[35.423828125,27.733789062499994],[35.18046875000002,28.034863281249997],[35.07832031250001,28.08701171875],[34.82753906250002,28.10859375],[34.72207031250002,28.130664062499996],[34.625,28.064501953124996],[34.6162109375,28.148339843749994],[34.68330078125001,28.264111328124997],[34.779882812500006,28.50732421875],[34.79912109375002,28.720507812499996],[34.95078125,29.353515625],[34.98222656250002,29.48447265625],[34.97343750000002,29.555029296875],[34.904296875,29.47734375],[34.84853515625002,29.43212890625],[34.736425781250006,29.27060546875],[34.6171875,28.75791015625],[34.44648437500001,28.357324218749994],[34.42714843750002,28.106494140624996],[34.39970703125002,28.016015625],[34.31855468750001,27.888964843749996],[34.22011718750002,27.764306640624994],[34.04511718750001,27.828857421875],[33.76025390625,28.04765625],[33.59414062500002,28.255566406249997],[33.416113281250006,28.38984375],[33.24775390625001,28.567724609375],[33.20195312500002,28.695703125],[33.203710937500006,28.777783203124997],[33.13017578125002,28.978271484375],[33.07578125,29.073046875],[32.87060546875,29.28623046875],[32.81171875000001,29.4],[32.766699218750006,29.45],[32.72148437500002,29.521777343749996],[32.64716796875001,29.7984375],[32.56572265625002,29.973974609375],[32.47304687500002,29.925439453124994],[32.48945312500001,29.851513671874997],[32.40859375000002,29.749316406249996],[32.35976562500002,29.630664062499996],[32.39726562500002,29.5337890625],[32.565039062500006,29.386328125],[32.59902343750002,29.321923828124994],[32.63808593750002,29.182177734374996],[32.6318359375,28.992236328124996],[32.65888671875001,28.927734375],[32.78447265625002,28.78662109375],[32.82949218750002,28.702880859375],[32.856542968750006,28.630615234375],[32.89824218750002,28.565234375],[33.02285156250002,28.442285156249994],[33.2021484375,28.208300781249996],[33.37226562500001,28.050585937499996],[33.49492187500002,27.974462890625],[33.54707031250001,27.898144531249997],[33.55878906250001,27.701220703124996],[33.5498046875,27.607373046874997],[33.65742187500001,27.430566406249994],[33.697265625,27.341113281249996],[33.80166015625002,27.2681640625],[33.84931640625001,27.184912109375],[33.89306640625,27.049462890624994],[33.959082031250006,26.6490234375],[34.04951171875001,26.550732421874997],[34.32929687500001,26.024365234374997],[34.56513671875001,25.691162109375],[34.679296875,25.442529296874994],[34.85322265625001,25.139794921874994],[35.19414062500002,24.475146484375003],[35.397070312500006,24.269970703124997],[35.47783203125002,24.15478515625],[35.62470703125001,24.066015625],[35.78388671875001,23.937792968750003],[35.63203125000001,23.950341796874994],[35.593847656250006,23.942578125],[35.54082031250002,23.920654296875],[35.515234375,23.84287109374999],[35.50439453125,23.779296875],[35.52275390625002,23.442529296874994],[35.56435546875002,23.27109375],[35.697851562500006,22.946191406249994],[35.79736328125,22.84873046874999],[35.845800781250006,22.785693359375003],[35.91337890625002,22.739648437499994],[36.22968750000001,22.628808593749994],[36.41455078125,22.394189453124994],[36.8296875,22.09765625],[36.87041015625002,22.015771484374994],[36.87138671875002,21.996728515624994],[36.88261718750002,21.768798828125],[36.92695312500001,21.58652343749999],[37.081152343750006,21.32602539062499],[37.21171875000002,21.185839843750003],[37.25859375000002,21.108544921874994],[37.26318359375,21.07265625],[37.25722656250002,21.03940429687499],[37.21748046875001,21.07763671875],[37.15058593750001,21.103759765625],[37.14111328125,20.98178710937499],[37.156835937500006,20.894921875],[37.17265625000002,20.731982421875003],[37.2275390625,20.55673828124999],[37.18789062500002,20.394921875],[37.19316406250002,20.120703125],[37.26259765625002,19.791894531249994],[37.24843750000002,19.58188476562499],[37.36152343750001,19.091992187499997],[37.471289062500006,18.820117187500003],[37.53164062500002,18.753125],[37.59941406250002,18.717431640624994],[37.72978515625002,18.6943359375],[37.921875,18.555908203125],[38.07402343750002,18.409765625],[38.128125,18.333300781250003],[38.201757812500006,18.249414062499994],[38.25214843750001,18.264404296875],[38.28310546875002,18.28671875],[38.33291015625002,18.219042968750003],[38.57402343750002,18.072949218749997],[38.609472656250006,18.005078125],[38.91171875,17.427148437499994],[39.03447265625002,17.085546875],[39.142578125,16.729150390624994],[39.22255859375002,16.19370117187499],[39.298925781250006,15.92109375],[39.42226562500002,15.786669921875003],[39.50654296875001,15.532128906249994],[39.57880859375001,15.522509765625003],[39.63125,15.452539062499994],[39.720800781250006,15.213671875],[39.78554687500002,15.124853515624991],[39.819433593750006,15.201269531249991],[39.815625,15.2453125],[39.79033203125002,15.31884765625],[39.8134765625,15.41357421875],[39.86376953125,15.4703125],[39.97832031250002,15.393115234375003],[40.041015625,15.334521484375003],[40.05781250000001,15.217089843750003],[40.084082031250006,15.151953125],[40.2041015625,15.014111328124997],[40.305273437500006,14.974023437499994],[40.4365234375,14.963964843749991],[40.54628906250002,14.93359375],[40.634375,14.883007812499997],[40.79931640625,14.743017578124991],[41.17646484375001,14.6203125],[41.47968750000001,14.243896484375],[41.658203125,13.983056640624994],[42.2451171875,13.587646484375],[42.34648437500002,13.398095703124994],[42.39931640625002,13.212597656249997],[42.52285156250002,13.221484375],[42.734472656250006,13.018603515624989],[42.79619140625002,12.8642578125],[42.96953125000002,12.808349609375],[42.9990234375,12.899511718749991],[43.08291015625002,12.824609375],[43.11669921875,12.70859375],[43.130859375,12.660449218749989],[43.29863281250002,12.4638671875],[43.353515625,12.367041015624991],[43.409765625,12.18994140625],[43.38027343750002,12.091259765624997],[43.33671875000002,12.027001953124994],[43.272070312500006,11.969531249999989],[43.04804687500001,11.829052734374997],[42.79902343750001,11.739404296874994],[42.64003906250002,11.560107421874989],[42.52177734375002,11.572167968749994],[42.53974609375001,11.504296875],[42.58378906250002,11.496777343749997],[42.65273437500002,11.509570312499989],[42.78974609375001,11.56171875],[42.91152343750002,11.586621093749997],[43.04277343750002,11.588476562499991],[43.16171875,11.566015625],[43.24599609375002,11.499804687499989],[43.44121093750002,11.346435546875],[43.63115234375002,11.035449218749989],[43.85273437500001,10.784277343749991],[44.158203125,10.55078125],[44.279296875,10.471875],[44.38652343750002,10.430224609374989],[44.94296875,10.43671875],[45.33769531250002,10.649755859374991],[45.695898437500006,10.80390625],[45.81669921875002,10.835888671874997],[46.024511718750006,10.793701171875],[46.25390625,10.781103515624991],[46.46025390625002,10.734179687499989],[46.565039062500006,10.745996093749994],[46.97343750000002,10.925390625],[47.230078125,11.099902343749989],[47.40498046875001,11.174023437499997],[47.47382812500001,11.1748046875],[47.7125,11.112011718749997],[48.01923828125001,11.139355468749997],[48.43886718750002,11.290136718749991],[48.57255859375002,11.320507812499997],[48.674414062500006,11.32265625],[48.903125,11.2548828125],[48.938574218750006,11.258447265624994],[49.062109375,11.270849609374991],[49.38828125,11.342724609374997],[49.64208984375,11.450927734375],[50.11005859375001,11.529296875],[50.46621093750002,11.7275390625],[50.5283203125,11.823193359374997],[50.63593750000001,11.943798828124997],[50.79228515625002,11.983691406249989],[51.19130859375002,11.841992187499997],[51.2548828125,11.830712890624994],[51.23183593750002,11.745019531249994],[51.21816406250002,11.657666015624997],[51.136328125,11.505126953125],[51.08427734375002,11.335644531249997],[51.12226562500001,11.076757812499991],[51.140625,10.656884765624994],[51.13125,10.595898437499997],[51.10488281250002,10.535839843749997],[51.093847656250006,10.488525390625],[51.05078125,10.471972656249989],[51.031835937500006,10.444775390624997],[51.06318359375001,10.433935546874991],[51.18828125000002,10.479736328125],[51.185546875,10.529833984374989],[51.19296875,10.554638671874997],[51.29570312500002,10.498681640624994],[51.369140625,10.475244140624994],[51.390234375,10.422607421875],[51.38457031250002,10.386523437499989],[51.268164062500006,10.40312],[51.20878906250002,10.431054687499994],[51.03593750000002,10.38515625],[50.93007812500002,10.335546875],[50.8984375,10.253125],[50.87373046875001,9.924169921874991],[50.83281250000002,9.710498046874989],[50.825,9.428173828124997],[50.68515625,9.241162109374997],[50.63798828125002,9.109277343749994],[50.429785156250006,8.845263671874989],[50.32119140625002,8.619580078124997],[50.285742187500006,8.509423828124994],[50.10283203125002,8.199804687499991],[49.85205078125,7.962548828124994],[49.76123046875,7.659521484374991],[49.67119140625002,7.469531249999989],[49.57001953125001,7.296972656249991],[49.34853515625002,6.990527343749989],[49.234960937500006,6.77734375],[49.09267578125002,6.407861328124994],[49.04931640625,6.173632812499989],[48.649023437500006,5.494384765625],[48.233984375,4.952685546874989],[47.97529296875001,4.497021484374997],[47.51142578125001,3.96826171875],[46.87880859375002,3.28564453125],[46.05117187500002,2.475146484374989],[45.826269531250006,2.309863281249989],[44.92021484375002,1.81015625],[44.33271484375001,1.390966796874991],[44.03271484375,1.105908203124997],[43.71757812500002,0.857861328124997],[43.46767578125002,0.621630859374989],[42.71210937500001,-0.175683593750009],[42.63417968750002,-0.25078125],[42.56074218750001,-0.321484375000011],[42.465625,-0.45654296875],[42.3994140625,-0.510058593750003],[42.21894531250001,-0.737988281250011],[42.10625,-0.856152343750011],[41.97988281250002,-0.973046875],[41.92626953125,-1.055566406250009],[41.88828125,-1.150585937500011],[41.84619140625,-1.203417968750003],[41.73222656250002,-1.430078125],[41.63203125000001,-1.578515625],[41.53271484375,-1.6953125],[41.38691406250001,-1.866992187500003],[41.26748046875002,-1.945019531250011],[41.10683593750002,-1.982324218750009],[41.058691406250006,-1.975195312500006],[40.99550781250002,-1.950585937500009],[40.970703125,-1.991796875],[40.9521484375,-2.055957031250003],[40.916601562500006,-2.04248046875],[40.889746093750006,-2.023535156250006],[40.905859375,-2.1375],[40.92236328125,-2.19375],[40.89824218750002,-2.269921875],[40.82011718750002,-2.336328125],[40.81318359375001,-2.392382812500003],[40.644140625,-2.539453125],[40.40449218750001,-2.5556640625],[40.27851562500001,-2.628613281250011],[40.22246093750002,-2.688378906250009],[40.179785156250006,-2.819042968750011],[40.19472656250002,-3.019238281250011],[40.128125,-3.17333984375],[40.11542968750001,-3.250585937500006],[39.99169921875,-3.350683593750006],[39.93681640625002,-3.442480468750006],[39.89628906250002,-3.535839843750011],[39.8609375,-3.576757812500006],[39.81914062500002,-3.786035156250009],[39.76142578125001,-3.9130859375],[39.74580078125001,-3.955175781250006],[39.73164062500001,-3.993261718750006],[39.68691406250002,-4.06787109375],[39.65800781250002,-4.119140625],[39.63710937500002,-4.15283203125],[39.49091796875001,-4.478417968750009],[39.376953125,-4.62548828125],[39.2875,-4.608593750000011],[39.228125,-4.66552734375],[39.221777343750006,-4.6923828125],[39.20185546875001,-4.776464843750006],[39.12324218750001,-4.98046875],[39.11875,-5.0654296875],[39.087988281250006,-5.165429687500009],[39.05830078125001,-5.231542968750006],[38.97822265625001,-5.5185546875],[38.91103515625002,-5.6259765625],[38.81923828125002,-5.877636718750011],[38.8046875,-6.070117187500003],[38.85527343750002,-6.204882812500003],[38.8740234375,-6.33125],[38.9814453125,-6.455078125],[39.0673828125,-6.499316406250003],[39.12548828125,-6.555957031250003],[39.22841796875002,-6.685253906250011],[39.28730468750001,-6.81494140625],[39.47236328125001,-6.878613281250011],[39.54609375000001,-7.024023437500006],[39.51923828125001,-7.124121093750006],[39.43339843750002,-7.20703125],[39.353125,-7.34140625],[39.28847656250002,-7.517871093750003],[39.28701171875002,-7.787695312500006],[39.33046875000002,-7.746679687500006],[39.42841796875001,-7.812792968750003],[39.441015625,-8.011523437500003],[39.34003906250001,-8.242871093750011],[39.30898437500002,-8.350976562500009],[39.30400390625002,-8.44384765625],[39.37734375000002,-8.720800781250006],[39.488378906250006,-8.86181640625],[39.480078125,-8.905957031250011],[39.451269531250006,-8.94296875],[39.64130859375001,-9.192480468750006],[39.62548828125,-9.409472656250003],[39.69667968750002,-9.578417968750003],[39.72792968750002,-9.724804687500011],[39.77480468750002,-9.837109375000011],[39.783789062500006,-9.91455078125],[39.725195312500006,-10.00048828125],[39.86376953125,-10.02197265625],[39.94521484375002,-10.09228515625],[39.98359375000001,-10.159570312500009],[40.08369140625001,-10.156640625],[40.13789062500001,-10.20263671875],[40.21601562500001,-10.240625],[40.388769531250006,-10.353515625],[40.435546875,-10.410253906250006],[40.45253906250002,-10.44296875],[40.46357421875001,-10.46435546875],[40.516699218750006,-10.5673828125],[40.61171875000002,-10.661523437500009],[40.55507812500002,-10.716210937500009],[40.48662109375002,-10.76513671875],[40.59716796875,-10.830664062500006],[40.51611328125,-10.929589843750009],[40.50625,-10.9984375],[40.52685546875,-11.025390625],[40.54453125,-11.065625],[40.49140625000001,-11.178906250000011],[40.420996093750006,-11.265625],[40.40283203125,-11.33203125],[40.46513671875002,-11.449414062500011],[40.43310546875,-11.657324218750006],[40.49355468750002,-11.844433593750011],[40.51044921875001,-11.9404296875],[40.53154296875002,-12.004589843750011],[40.50146484375,-12.119433593750003],[40.50917968750002,-12.312890625],[40.52314453125001,-12.392773437500011],[40.48710937500002,-12.4921875],[40.54833984375,-12.526562500000011],[40.58085937500002,-12.635546875],[40.57207031250002,-12.758398437500006],[40.553320312500006,-12.824609375],[40.44765625000002,-12.90478515625],[40.43515625,-12.9359375],[40.43681640625002,-12.983105468750011],[40.56875,-12.984667968750003],[40.5732421875,-13.057714843750006],[40.564453125,-13.115234375],[40.56953125000001,-13.2234375],[40.55195312500001,-13.29375],[40.58291015625002,-13.3740234375],[40.54511718750001,-13.462890625],[40.558203125,-13.531445312500011],[40.55986328125002,-13.620312500000011],[40.59052734375001,-13.845019531250003],[40.595703125,-14.122851562500003],[40.6025390625,-14.167382812500009],[40.649511718750006,-14.198828125],[40.715625,-14.214453125],[40.71308593750001,-14.290625],[40.63994140625002,-14.390039062500009],[40.63554687500002,-14.451855468750011],[40.64609375,-14.538671875],[40.726660156250006,-14.420703125],[40.775,-14.421289062500009],[40.81816406250002,-14.467578125],[40.812109375,-14.535546875],[40.82695312500002,-14.569042968750011],[40.82060546875002,-14.634960937500011],[40.84453125000002,-14.718652343750009],[40.83515625000001,-14.79150390625],[40.775976562500006,-14.842480468750011],[40.70068359375,-14.929785156250006],[40.68740234375002,-15.011621093750009],[40.6943359375,-15.065234375],[40.6421875,-15.082421875],[40.617773437500006,-15.115527343750003],[40.653125,-15.192675781250003],[40.650976562500006,-15.260937500000011],[40.55898437500002,-15.4734375],[40.31386718750002,-15.763964843750003],[40.2080078125,-15.867089843750009],[40.10878906250002,-15.979296875],[40.10888671875,-16.02529296875001],[40.09921875,-16.06533203125001],[39.98359375000001,-16.22548828125001],[39.85976562500002,-16.251757812500003],[39.79091796875002,-16.29453125],[39.84462890625002,-16.435644531250006],[39.76455078125002,-16.46816406250001],[39.62539062500002,-16.579394531250003],[39.242285156250006,-16.792578125],[39.181738281250006,-16.84199218750001],[39.084375,-16.97285156250001],[38.9560546875,-17.00458984375001],[38.884765625,-17.041601562500006],[38.75761718750002,-17.05517578125],[38.71328125000002,-17.045703125],[38.669921875,-17.05029296875],[38.63330078125,-17.07832031250001],[38.38076171875002,-17.17011718750001],[38.14492187500002,-17.242773437500006],[38.0869140625,-17.275976562500006],[38.04824218750002,-17.321386718750006],[37.839453125,-17.393164062500006],[37.512304687500006,-17.570703125],[37.24453125000002,-17.73994140625001],[37.05058593750002,-17.909277343750006],[36.99951171875,-17.93496093750001],[36.93935546875002,-17.993457031250003],[36.91923828125002,-18.080078125],[36.89960937500001,-18.129003906250006],[36.75615234375002,-18.30732421875001],[36.540136718750006,-18.518164062500006],[36.498046875,-18.57578125],[36.412207031250006,-18.69296875],[36.40371093750002,-18.76972656250001],[36.327246093750006,-18.79316406250001],[36.26289062500001,-18.71962890625001],[36.23564453125002,-18.861328125],[36.183203125,-18.871386718750003],[36.125,-18.842382812500006],[35.980078125,-18.9125],[35.85371093750001,-18.99335937500001],[35.65126953125002,-19.163867187500003],[35.365332031250006,-19.493945312500003],[34.947851562500006,-19.81269531250001],[34.89082031250001,-19.82177734375],[34.85234375000002,-19.82050781250001],[34.72099609375002,-19.709570312500006],[34.6494140625,-19.70136718750001],[34.713476562500006,-19.7671875],[34.75576171875002,-19.82197265625001],[34.74501953125002,-19.929492187500003],[34.75,-20.0908203125],[34.69814453125002,-20.404394531250006],[34.705078125,-20.473046875],[34.764746093750006,-20.56191406250001],[34.877050781250006,-20.67080078125001],[34.98232421875002,-20.80625],[35.11757812500002,-21.19521484375001],[35.128027343750006,-21.3953125],[35.267675781250006,-21.650976562500006],[35.27294921875,-21.76171875],[35.32929687500001,-22.037402343750003],[35.32558593750002,-22.260351562500006],[35.31572265625002,-22.396875],[35.38300781250001,-22.45458984375],[35.4078125,-22.40253906250001],[35.40087890625,-22.316210937500003],[35.41884765625002,-22.17763671875001],[35.45634765625002,-22.11591796875001],[35.49375,-22.12470703125001],[35.5048828125,-22.19013671875001],[35.53007812500002,-22.248144531250006],[35.54023437500001,-22.30263671875001],[35.5419921875,-22.3765625],[35.490234375,-22.65771484375],[35.50576171875002,-22.772070312500006],[35.57539062500001,-22.96308593750001],[35.49443359375002,-23.18515625],[35.376953125,-23.7078125],[35.37041015625002,-23.79824218750001],[35.39882812500002,-23.837695312500003],[35.46210937500001,-23.85107421875],[35.4853515625,-23.784472656250003],[35.5224609375,-23.784960937500003],[35.5419921875,-23.82441406250001],[35.48964843750002,-24.065527343750006],[35.438085937500006,-24.171191406250003],[35.2548828125,-24.430273437500006],[35.15595703125001,-24.54140625],[34.99208984375002,-24.65058593750001],[34.60732421875002,-24.8212890625],[33.836035156250006,-25.06796875],[33.53007812500002,-25.18886718750001],[33.34746093750002,-25.26093750000001],[32.96113281250001,-25.49042968750001],[32.79218750000001,-25.644335937500003],[32.72255859375002,-25.820898437500006],[32.655859375,-25.90175781250001],[32.590429687500006,-26.00410156250001],[32.6474609375,-26.09199218750001],[32.70351562500002,-26.158496093750003],[32.769628906250006,-26.20302734375001],[32.80390625000001,-26.24140625000001],[32.84882812500001,-26.26806640625],[32.89404296875,-26.1298828125],[32.91640625000002,-26.0869140625],[32.95488281250002,-26.08359375],[32.93359375,-26.25234375],[32.88916015625,-26.83046875],[32.88613281250002,-26.84931640625001],[32.84912109375,-27.080175781250006],[32.70585937500002,-27.44160156250001],[32.65703125000002,-27.60732421875001],[32.534765625,-28.19970703125],[32.37519531250001,-28.49824218750001],[32.285742187500006,-28.621484375],[32.02724609375002,-28.83955078125001],[31.955371093750017,-28.8837890625],[31.891503906250023,-28.912109375],[31.778222656250023,-28.937109375],[31.33515625000001,-29.378125],[31.169921875,-29.5908203125],[31.023339843750023,-29.90087890625],[30.87763671875001,-30.07109375],[30.66357421875,-30.434179687500006],[30.472265625,-30.71455078125001],[30.288671875,-30.97011718750001],[29.97119140625,-31.322070312500003],[29.83027343750001,-31.423828125],[29.735156250000017,-31.47041015625001],[29.48291015625,-31.67470703125001],[29.127832031250023,-32.003125],[28.85595703125,-32.29423828125],[28.44941406250001,-32.624609375],[28.21406250000001,-32.76923828125001],[27.860644531250017,-33.05390625000001],[27.762109375000023,-33.09599609375],[27.36376953125,-33.36054687500001],[27.077441406250017,-33.52119140625001],[26.613671875000023,-33.707421875],[26.429492187500017,-33.7595703125],[25.989550781250017,-33.711328125],[25.80585937500001,-33.737109375],[25.652441406250006,-33.849609375],[25.63818359375,-34.01113281250001],[25.57421875,-34.03535156250001],[25.47724609375001,-34.028125],[25.169726562500017,-33.9607421875],[25.0029296875,-33.9736328125],[24.905566406250017,-34.05976562500001],[24.8271484375,-34.1689453125],[24.595507812500017,-34.17451171875001],[24.183007812500023,-34.0615234375],[23.697851562500006,-33.992773437500006],[23.585546875,-33.98515625],[23.350390625000017,-34.068945312500006],[23.268164062500006,-34.081152343750006],[22.925585937500017,-34.06318359375001],[22.73554687500001,-34.01025390625],[22.553808593750006,-34.01005859375],[22.414453125000023,-34.053808593750006],[22.245507812500023,-34.069140625],[21.788964843750023,-34.37265625],[21.55322265625,-34.373046875],[21.34980468750001,-34.408203125],[21.248925781250023,-34.40703125],[21.06015625,-34.36464843750001],[20.98984375,-34.36748046875],[20.882421875,-34.3865234375],[20.774804687500023,-34.43994140625],[20.529882812500006,-34.46308593750001],[20.434667968750006,-34.50859375],[20.020605468750006,-34.785742187500006],[19.92626953125,-34.77470703125],[19.85,-34.756640625],[19.63496093750001,-34.75332031250001],[19.391503906250023,-34.60566406250001],[19.298242187500023,-34.6150390625],[19.3232421875,-34.57080078125],[19.33076171875001,-34.49238281250001],[19.279394531250006,-34.43701171875],[19.24462890625,-34.41230468750001],[19.14912109375001,-34.41689453125001],[19.09833984375001,-34.35009765625],[18.9521484375,-34.34375],[18.90156250000001,-34.36064453125],[18.831347656250017,-34.3640625],[18.825097656250023,-34.296484375],[18.830664062500006,-34.25390625],[18.82636718750001,-34.1884765625],[18.80878906250001,-34.108203125],[18.75214843750001,-34.082617187500006],[18.70869140625001,-34.071875],[18.60517578125001,-34.07734375000001],[18.53388671875001,-34.0859375],[18.500390625000023,-34.10927734375001],[18.46210937500001,-34.168066406250006],[18.46162109375001,-34.346875],[18.41035156250001,-34.29560546875001],[18.35205078125,-34.1884765625],[18.333398437500023,-34.07421875],[18.354394531250023,-33.9390625],[18.46503906250001,-33.887792968750006],[18.456445312500023,-33.796484375],[18.433007812500023,-33.71728515625],[18.309472656250023,-33.514453125],[18.26123046875,-33.4216796875],[18.156347656250006,-33.35878906250001],[18.074804687500006,-33.20732421875],[17.992578125000023,-33.15234375],[17.958398437500023,-33.04638671875],[17.878222656250017,-32.961523437500006],[17.85107421875,-32.82744140625],[17.895312500000017,-32.75048828125],[17.965234375000023,-32.70859375],[18.036523437500023,-32.77509765625001],[18.125,-32.749121093750006],[18.250878906250023,-32.6521484375],[18.325292968750006,-32.504980468750006],[18.329882812500017,-32.26953125],[18.31074218750001,-32.12246093750001],[18.210839843750023,-31.742480468750003],[18.163671875,-31.65517578125001],[17.938574218750006,-31.383203125],[17.67744140625001,-31.01904296875],[17.347070312500023,-30.44482421875],[17.1890625,-30.09980468750001],[16.95,-29.403417968750006],[16.73945312500001,-29.009375],[16.480761718750017,-28.64150390625001],[16.447558593750017,-28.617578125],[16.335058593750006,-28.53652343750001],[16.007128906250017,-28.231738281250003],[15.890917968750017,-28.15253906250001],[15.719042968750017,-27.9658203125],[15.341503906250011,-27.386523437500003],[15.28759765625,-27.275],[15.215722656250023,-26.9951171875],[15.1328125,-26.78759765625],[15.123730468750011,-26.66787109375001],[15.163281250000011,-26.600195312500006],[15.139062500000023,-26.50800781250001],[15.096582031250023,-26.42578125],[14.9677734375,-26.31806640625001],[14.93125,-25.95820312500001],[14.84521484375,-25.725683593750006],[14.863671875000023,-25.53359375],[14.822558593750017,-25.35859375000001],[14.818554687500011,-25.246386718750003],[14.837109375000011,-25.033203125],[14.767968750000023,-24.78798828125001],[14.6279296875,-24.54804687500001],[14.5015625,-24.201953125],[14.4833984375,-24.050390625],[14.496875,-23.642871093750003],[14.472460937500017,-23.476660156250006],[14.473828125000011,-23.28115234375001],[14.423828125,-23.07861328125],[14.4033203125,-22.968066406250003],[14.4384765625,-22.88056640625001],[14.459277343750017,-22.908203125],[14.495703125,-22.92138671875],[14.519921875000023,-22.80517578125],[14.525976562500006,-22.70253906250001],[14.462792968750023,-22.44912109375001],[14.321875,-22.18994140625],[13.973242187500006,-21.767578125],[13.888085937500023,-21.60664062500001],[13.83935546875,-21.473242187500006],[13.450585937500023,-20.91669921875001],[13.284375,-20.52392578125],[13.168359375000023,-20.184667968750006],[13.042089843750006,-20.02822265625001],[12.458203125000011,-18.9267578125],[12.328710937500006,-18.751074218750006],[12.095703125,-18.54091796875001],[12.041210937500011,-18.470703125],[11.951367187500011,-18.2705078125],[11.77587890625,-18.001757812500003],[11.733496093750006,-17.7509765625],[11.7216796875,-17.466796875],[11.743066406250023,-17.24921875000001],[11.780078125000017,-16.87128906250001],[11.818945312500006,-16.7041015625],[11.819921875,-16.504296875],[11.796972656250006,-15.986425781250006],[11.769433593750023,-15.915332031250003],[11.750878906250023,-15.831933593750009],[11.849707031250006,-15.768359375],[11.89990234375,-15.719824218750006],[11.967871093750006,-15.633984375000011],[12.01611328125,-15.513671875],[12.0732421875,-15.248242187500011],[12.280468750000011,-14.6375],[12.37890625,-14.0390625],[12.503710937500017,-13.75546875],[12.550488281250011,-13.437792968750003],[12.897656250000011,-13.027734375],[12.983203125000017,-12.775683593750003],[13.162695312500006,-12.652148437500003],[13.4169921875,-12.520410156250009],[13.597949218750017,-12.2861328125],[13.685546875,-12.123828125],[13.785351562500011,-11.812792968750003],[13.784277343750006,-11.487988281250011],[13.847460937500017,-11.054394531250011],[13.83359375,-10.9296875],[13.738964843750011,-10.757128906250003],[13.721386718750011,-10.63359375],[13.633496093750011,-10.512304687500006],[13.539453125000023,-10.420703125],[13.495410156250017,-10.257128906250003],[13.332226562500011,-9.998925781250009],[13.2875,-9.826757812500006],[13.209375,-9.703222656250006],[13.196875,-9.550683593750009],[13.155664062500023,-9.3896484375],[13.075976562500017,-9.230371093750009],[12.99853515625,-9.048046875000011],[12.99853515625,-8.991015625],[13.046777343750023,-8.922265625],[13.0927734375,-8.899707031250003],[13.077246093750006,-8.934277343750011],[13.046582031250011,-8.975195312500006],[13.053808593750006,-9.0068359375],[13.358984375,-8.687207031250011],[13.378320312500023,-8.624707031250011],[13.368066406250023,-8.554785156250006],[13.366406250000011,-8.46923828125],[13.378515625,-8.369726562500006],[13.0908203125,-7.780175781250009],[12.8623046875,-7.231835937500009],[12.823437500000011,-6.954785156250011],[12.521289062500017,-6.59033203125],[12.402148437500017,-6.353417968750009],[12.334277343750017,-6.187304687500003],[12.283300781250006,-6.124316406250003],[12.302539062500017,-6.092578125],[12.38037109375,-6.084277343750003],[12.553515625000017,-6.0458984375],[12.790625,-6.00390625],[13.009765625,-5.907617187500009],[13.068164062500017,-5.86484375],[13.003320312500023,-5.836132812500011],[12.86083984375,-5.854101562500006],[12.791601562500006,-5.877734375],[12.6806640625,-5.960839843750009],[12.514550781250023,-6.004199218750003],[12.452929687500017,-6.00048828125],[12.41171875,-5.986328125],[12.315039062500006,-5.8953125],[12.240429687500011,-5.807324218750011],[12.213671875000017,-5.758691406250009],[12.199023437500017,-5.73193359375],[12.155468750000011,-5.632714843750009],[12.180078125000023,-5.538671875],[12.20654296875,-5.46826171875],[12.177148437500023,-5.324804687500006],[12.110546875000011,-5.197167968750009],[12.039941406250023,-5.03515625],[12.018359375000017,-5.004296875],[12.002734375000017,-4.98203125],[11.966796875,-4.954394531250003],[11.893261718750011,-4.86572265625],[11.820703125000023,-4.75546875],[11.80126953125,-4.705175781250006],[11.780859375,-4.6765625],[11.777539062500011,-4.565820312500009],[11.668066406250006,-4.434277343750011],[11.393847656250017,-4.200292968750006],[11.364453125000011,-4.130566406250011],[11.130175781250017,-3.916308593750003],[11.032031250000017,-3.826464843750003],[10.947265625,-3.662109375],[10.848535156250023,-3.561328125],[10.640722656250006,-3.398046875],[10.58544921875,-3.278027343750011],[10.34765625,-3.013085937500009],[10.006152343750017,-2.748339843750003],[9.759472656250011,-2.5185546875],[9.722070312500023,-2.467578125],[9.763671875,-2.473828125000011],[10.001953125,-2.58837890625],[10.034472656250017,-2.575585937500009],[10.06201171875,-2.549902343750006],[9.959082031250006,-2.48984375],[9.86083984375,-2.442578125000011],[9.768652343750006,-2.4130859375],[9.676367187500006,-2.415625],[9.624609375,-2.367089843750009],[9.591015625000011,-2.293164062500011],[9.574023437500017,-2.22998046875],[9.533203125,-2.163867187500003],[9.402246093750023,-2.027636718750003],[9.370507812500023,-1.975],[9.298925781250006,-1.903027343750011],[9.342480468750011,-1.893652343750006],[9.482812500000023,-1.962304687500009],[9.495312500000011,-1.934960937500009],[9.483203125000017,-1.894628906250006],[9.342187500000023,-1.829394531250003],[9.265625,-1.825097656250009],[9.247949218750023,-1.779296875],[9.258398437500006,-1.726269531250011],[9.157519531250017,-1.527734375],[9.052832031250006,-1.379101562500011],[9.036328125000011,-1.308886718750003],[9.31884765625,-1.632031250000011],[9.356640625000011,-1.637597656250009],[9.406347656250006,-1.634570312500003],[9.523339843750023,-1.598339843750011],[9.501074218750006,-1.55517578125],[9.448339843750006,-1.508886718750006],[9.397167968750011,-1.530175781250009],[9.330664062500006,-1.534570312500009],[9.295800781250023,-1.515234375],[9.280175781250023,-1.48193359375],[9.3466796875,-1.325],[9.31787109375,-1.332910156250009],[9.296679687500017,-1.3609375],[9.260156250000023,-1.374218750000011],[9.203808593750011,-1.382421875],[9.064648437500011,-1.29833984375],[8.94189453125,-1.071484375000011],[8.909375,-1.025],[8.8765625,-0.94609375],[8.84423828125,-0.91357421875],[8.703125,-0.591015625000011],[8.757226562500023,-0.614941406250011],[8.821386718750006,-0.708398437500009],[8.946386718750006,-0.688769531250003],[8.995214843750006,-0.634667968750009],[9.037890625000017,-0.63671875],[9.08154296875,-0.624316406250003],[9.136523437500017,-0.573339843750006],[9.296679687500017,-0.351269531250011],[9.339062500000011,-0.058251953125009],[9.325292968750006,0.115820312499991],[9.301855468750006,0.288525390624997],[9.354882812500023,0.343603515624991],[9.375781250000017,0.307226562499991],[9.386132812500023,0.245898437499989],[9.4111328125,0.200439453125],[9.468164062500023,0.159765625],[9.574316406250006,0.14892578125],[9.738378906250006,0.0849609375],[9.796777343750023,0.044238281249989],[9.812695312500011,0.125585937499991],[10.00146484375,0.194970703124994],[9.944433593750006,0.219873046874994],[9.776660156250017,0.192480468749991],[9.546484375,0.295947265624989],[9.470117187500023,0.361914062499991],[9.398828125000023,0.48671875],[9.324804687500006,0.552099609374991],[9.329980468750023,0.61083984375],[9.495312500000011,0.664843749999989],[9.538964843750023,0.65869140625],[9.556640625,0.594189453124997],[9.60107421875,0.567724609374991],[9.617968750000017,0.576513671874991],[9.625292968750017,0.631640624999989],[9.625878906250023,0.779443359374994],[9.575390625000011,0.991308593749991],[9.5908203125,1.031982421875],[9.599414062500017,1.054443359375],[9.509863281250006,1.114794921874989],[9.4453125,1.120654296874989],[9.385937500000011,1.139257812499991],[9.43408203125,1.29638671875],[9.494238281250006,1.435302734375],[9.584277343750017,1.540234375],[9.632128906250017,1.565527343749991],[9.647656250000011,1.617578125],[9.718847656250006,1.788671875],[9.807031250000023,1.927490234375],[9.779687500000023,2.068212890624991],[9.80078125,2.304443359375],[9.82177734375,2.539257812499997],[9.867578125000023,2.734960937499991],[9.885449218750011,2.916552734374989],[9.948437500000011,3.079052734374997],[9.9150390625,3.239648437499994],[9.876171875000011,3.309765625],[9.672070312500011,3.53759765625],[9.765722656250006,3.623828124999989],[9.642382812500017,3.611767578124997],[9.615917968750011,3.696484375],[9.55615234375,3.798046875],[9.5927734375,3.814306640624991],[9.628125,3.870019531249994],[9.739648437500023,3.852929687499994],[9.736132812500017,3.880126953125],[9.639941406250017,3.96533203125],[9.649218750000017,4.008349609374989],[9.688867187500023,4.056396484375],[9.66953125,4.07666015625],[9.600390625000017,4.026904296874989],[9.550585937500017,4.028417968749991],[9.511816406250006,4.060644531249991],[9.483691406250017,4.066113281249997],[9.500781250000017,4.000732421875],[9.462011718750006,3.942529296874994],[9.42529296875,3.922314453124997],[9.3623046875,3.925732421874997],[9.310937500000023,3.940380859374997],[9.29736328125,3.972949218749989],[9.249121093750006,3.997851562499989],[9.113867187500006,4.041064453124989],[9.000097656250006,4.091601562499989],[8.97705078125,4.230419921874997],[8.932031250000023,4.290234375],[8.91357421875,4.3578125],[8.90283203125,4.43515625],[8.918261718750017,4.553759765624989],[8.889453125000017,4.57275390625],[8.8564453125,4.579248046874994],[8.80712890625,4.5734375],[8.761914062500011,4.580029296874997],[8.707910156250023,4.645703125],[8.660351562500011,4.670996093749991],[8.689648437500011,4.550244140624997],[8.65625,4.516357421875],[8.574414062500011,4.526220703124991],[8.53955078125,4.571875],[8.5328125,4.605859375],[8.570507812500011,4.752099609374994],[8.555859375000011,4.755224609374991],[8.54375,4.7578125],[8.514843750000011,4.724707031249991],[8.431347656250011,4.746240234374994],[8.393652343750006,4.813769531249989],[8.342089843750017,4.824755859374989],[8.252734375000017,4.923974609374994],[8.233789062500023,4.907470703125],[8.328027343750023,4.656103515624991],[8.293066406250006,4.5576171875],[8.028515625000011,4.555371093749997],[7.80078125,4.522265624999989],[7.644238281250011,4.525341796874997],[7.565625,4.5609375],[7.53076171875,4.655175781249994],[7.517382812500017,4.645458984374997],[7.509472656250011,4.594921875],[7.459863281250023,4.555224609374989],[7.284375,4.547656249999989],[7.206738281250011,4.612060546875],[7.143847656250017,4.68408203125],[7.076562500000023,4.716162109374991],[7.0869140625,4.685839843749989],[7.164160156250006,4.615576171874991],[7.154687500000023,4.514404296875],[7.013378906250011,4.397314453124991],[6.923242187500023,4.390673828124989],[6.867871093750011,4.441113281249997],[6.839160156250017,4.523486328124989],[6.82470703125,4.645263671875],[6.78759765625,4.724707031249991],[6.767675781250006,4.724707031249991],[6.786035156250023,4.652001953124994],[6.792187500000011,4.592626953124991],[6.793066406250006,4.469140625],[6.8603515625,4.373339843749989],[6.757031250000011,4.343554687499989],[6.715136718750017,4.342431640624994],[6.633007812500011,4.340234375],[6.617285156250006,4.375781249999989],[6.6015625,4.455175781249991],[6.579980468750023,4.475976562499994],[6.554589843750023,4.34140625],[6.5,4.331933593749994],[6.462109375000011,4.333154296874994],[6.2998046875,4.303857421874994],[6.263671875,4.309423828124991],[6.255957031250006,4.33447265625],[6.275292968750023,4.371679687499991],[6.27099609375,4.43212890625],[6.214648437500017,4.385498046875],[6.20556640625,4.292285156249989],[6.17333984375,4.277392578124989],[6.076562500000023,4.290625],[5.970703125,4.338574218749997],[5.906445312500011,4.387744140624989],[5.798632812500017,4.455957031249994],[5.587792968750023,4.647216796875],[5.553613281250023,4.733203124999989],[5.493261718750006,4.838769531249994],[5.448144531250023,4.945849609374989],[5.38330078125,5.129003906249991],[5.403222656250023,5.142285156249997],[5.4521484375,5.1265625],[5.475976562500023,5.153857421874989],[5.38828125,5.173779296874997],[5.370019531250023,5.195019531249997],[5.364160156250023,5.25927734375],[5.367968750000017,5.337744140624991],[5.439257812500017,5.365332031249991],[5.500878906250023,5.378613281249997],[5.531835937500006,5.426367187499991],[5.549707031250023,5.47421875],[5.385839843750006,5.401757812499994],[5.232421875,5.483789062499994],[5.19921875,5.533544921874991],[5.2158203125,5.571679687499994],[5.2890625,5.577490234374991],[5.393847656250017,5.574511718749989],[5.456640625,5.61171875],[5.418066406250006,5.624707031249997],[5.350292968750011,5.623291015625],[5.325292968750006,5.64794921875],[5.327343750000011,5.70751953125],[5.305371093750011,5.6943359375],[5.276269531250023,5.641552734374997],[5.1728515625,5.602734375],[5.112402343750006,5.641552734374997],[5.10625,5.728125],[5.093066406250017,5.76708984375],[5.042089843750006,5.797509765624994],[4.861035156250011,6.026318359374997],[4.633593750000017,6.2171875],[4.431347656250011,6.348583984374997],[4.125878906250023,6.411376953125],[3.486621093750017,6.408935546875],[3.45078125,6.427050781249989],[3.489941406250011,6.457275390625],[3.546093750000011,6.477441406249994],[3.751660156250011,6.583837890624991],[3.716992187500011,6.597949218749989],[3.503320312500023,6.531347656249991],[3.43017578125,6.525],[3.335546875,6.396923828124997],[2.7724609375,6.375732421875],[2.706445312500023,6.369238281249991],[2.286914062500017,6.328076171874997],[1.818164062500017,6.260644531249994],[1.62265625,6.216796875],[1.310644531250006,6.146875],[1.187207031250011,6.089404296874989],[1.105566406250006,6.051367187499991],[1.05029296875,5.993994140624991],[1.008007812500011,5.906396484374994],[0.94970703125,5.810253906249997],[0.748828125000017,5.760107421874991],[0.671875,5.759716796874997],[0.259667968750023,5.75732421875],[-0.126513671874989,5.568164062499989],[-0.348730468749977,5.500781249999989],[-0.485449218749977,5.394238281249997],[-0.66943359375,5.318554687499997],[-0.797705078124977,5.226708984374994],[-1.064306640624977,5.182666015624989],[-1.501660156249983,5.037988281249994],[-1.638476562499989,4.980859375],[-1.77685546875,4.88037109375],[-2.001855468749994,4.762451171875],[-2.090185546874977,4.7640625],[-2.266406249999989,4.874072265624989],[-2.39892578125,4.929345703124994],[-2.723046875,5.013720703124989],[-2.964990234374994,5.046289062499994],[-3.081884765624977,5.082470703124997],[-3.114013671875,5.088671874999989],[-3.246386718749989,5.114062499999989],[-3.214892578124989,5.147216796875],[-3.086718749999989,5.128320312499994],[-3.019140624999977,5.130810546874997],[-3.02587890625,5.150537109374994],[-3.06396484375,5.15771484375],[-3.168701171875,5.203027343749994],[-3.151416015624989,5.348291015624994],[-3.199951171875,5.3544921875],[-3.237597656249989,5.335400390624997],[-3.31201171875,5.160791015624994],[-3.347558593749994,5.130664062499989],[-3.87060546875,5.220703125],[-3.984179687499989,5.293164062499997],[-4.120166015624989,5.309716796874994],[-4.357275390624977,5.301416015624994],[-4.552832031249977,5.279882812499991],[-4.60888671875,5.235888671874989],[-4.115185546874983,5.261621093749994],[-4.062060546874989,5.256640624999989],[-4.037207031249977,5.230126953124994],[-4.661523437499994,5.172558593749997],[-4.899707031249989,5.138330078124994],[-4.970117187499994,5.147753906249989],[-5.023681640625,5.20361328125],[-5.282373046874994,5.210253906249989],[-5.33544921875,5.191992187499991],[-5.367529296874977,5.15078125],[-5.265771484374994,5.159716796874989],[-5.104882812499994,5.162158203124989],[-5.061816406249989,5.130664062499989],[-5.564746093749989,5.089453125],[-5.913769531249983,5.0109375],[-6.061718749999983,4.952832031249997],[-6.548437499999977,4.761767578124989],[-6.845166015624983,4.671484375],[-6.922900390624989,4.638330078124994],[-7.057958984374977,4.544726562499989],[-7.231396484374983,4.485986328124994],[-7.426074218749989,4.376025390624989],[-7.544970703124989,4.351318359375],[-7.660009765624977,4.366796875],[-7.998242187499983,4.508691406249994],[-8.259033203125,4.589990234374994],[-9.132177734374977,5.054638671874997],[-9.374755859375,5.241064453124991],[-9.654394531249977,5.518701171874994],[-10.2763671875,6.07763671875],[-10.418164062499983,6.167333984374991],[-10.597070312499994,6.2109375],[-10.707617187499977,6.258496093749997],[-10.785595703124983,6.31015625],[-10.849023437499994,6.465087890625],[-11.004541015624994,6.557373046875],[-11.291601562499977,6.688232421875],[-11.507519531249983,6.906542968749989],[-11.547509765624994,6.946972656249997],[-11.733447265624989,7.088574218749997],[-11.92919921875,7.183544921874997],[-12.346630859374983,7.341796875],[-12.485644531249989,7.386279296874989],[-12.480664062499983,7.442480468749991],[-12.432714843749977,7.545019531249991],[-12.510449218749983,7.665722656249997],[-12.480273437499989,7.753271484374991],[-12.510449218749983,7.753369140624997],[-12.570214843749994,7.700585937499994],[-12.697607421874977,7.715869140624989],[-12.781933593749983,7.791113281249991],[-12.850878906249989,7.818701171874991],[-12.880957031249977,7.856640625],[-12.925146484374977,8.05517578125],[-12.956933593749994,8.145312499999989],[-13.020800781249989,8.200927734375],[-13.148974609374989,8.214599609375],[-13.201757812499977,8.335839843749994],[-13.272753906249989,8.429736328124989],[-13.26123046875,8.487597656249989],[-13.203320312499983,8.484277343749994],[-13.157958984375,8.442285156249994],[-13.085009765624989,8.424755859374997],[-12.994238281249977,8.526464843749991],[-12.912939453124977,8.58154296875],[-12.894091796874989,8.629785156249994],[-12.904003906249983,8.65625],[-12.953369140625,8.615136718749994],[-13.088232421874977,8.625732421875],[-13.121630859374989,8.588769531249994],[-13.181835937499983,8.576904296875],[-13.228417968749994,8.695898437499991],[-13.226171874999977,8.765966796874991],[-13.206933593749994,8.843115234374991],[-13.071044921875,8.856347656249994],[-13.059472656249994,8.881152343749989],[-13.153710937499994,8.897705078125],[-13.271630859374994,8.987402343749991],[-13.292675781249983,9.04921875],[-13.302636718749994,9.078369140625],[-13.269482421874983,9.170556640624994],[-13.2958984375,9.218505859375],[-13.396093749999977,9.314306640624991],[-13.405566406249989,9.360644531249989],[-13.436279296875,9.4203125],[-13.568261718749994,9.543408203124997],[-13.691357421874983,9.535791015624994],[-13.657128906249994,9.639111328124997],[-13.65869140625,9.7763671875],[-13.700488281249989,9.851269531249997],[-13.689794921874977,9.927783203124989],[-13.712646484375,9.922949218749991],[-13.753710937499989,9.870263671874994],[-13.820117187499989,9.88720703125],[-13.954638671874989,9.968701171874997],[-14.021875,10.0478515625],[-14.029931640624994,10.115136718749994],[-14.045019531249977,10.141259765624994],[-14.086279296874977,10.127246093749989],[-14.17041015625,10.128613281249997],[-14.426904296874994,10.248339843749989],[-14.609570312499983,10.549853515624989],[-14.613623046874977,10.617822265624994],[-14.58740234375,10.734912109374989],[-14.593505859375,10.766699218749991],[-14.677343749999977,10.68896484375],[-14.693359375,10.741015624999989],[-14.757373046874989,10.862060546875],[-14.775927734374989,10.931640625],[-14.837451171874989,10.962548828124994],[-14.88671875,10.968066406249989],[-14.9248046875,10.944921875],[-14.975,10.803417968749997],[-15.012402343749983,10.804345703124994],[-15.051220703124983,10.834570312499991],[-15.043017578124989,10.940136718749997],[-15.09375,11.011035156249989],[-15.054589843749994,11.141943359374991],[-15.096777343749977,11.140039062499994],[-15.181054687499994,11.034228515624989],[-15.222119140624983,11.030908203124994],[-15.216699218749994,11.15625],[-15.263378906249983,11.160888671875],[-15.317480468749977,11.152001953124994],[-15.393115234374989,11.217236328124997],[-15.400585937499983,11.266210937499991],[-15.39453125,11.33447265625],[-15.348437499999989,11.378076171874994],[-15.354687499999983,11.396337890624991],[-15.399169921875,11.401464843749991],[-15.448974609375,11.389746093749991],[-15.4794921875,11.410302734374994],[-15.429101562499994,11.498876953124991],[-15.252587890624994,11.573291015624989],[-15.163769531249983,11.580957031249994],[-15.07265625,11.597802734374994],[-15.122412109374977,11.661572265624997],[-15.230371093749994,11.686767578125],[-15.316699218749989,11.669189453125],[-15.359667968749989,11.622900390624991],[-15.412988281249994,11.615234375],[-15.501904296874983,11.723779296874994],[-15.500244140625,11.778369140624989],[-15.4671875,11.842822265624989],[-15.415722656249983,11.871777343749997],[-15.210839843749994,11.870947265624991],[-15.133105468749989,11.907324218749991],[-15.101708984374994,11.913964843749994],[-15.071972656249983,11.947021484375],[-15.078271484374994,11.968994140625],[-15.111523437499983,11.970263671874989],[-15.188085937499977,11.927294921874989],[-15.434765624999983,11.943554687499997],[-15.513476562499989,11.917578125],[-15.650683593749989,11.818359375],[-15.819384765624989,11.763476562499989],[-15.941748046874977,11.78662109375],[-15.902734375,11.919677734375],[-15.920214843749989,11.937792968749989],[-15.958789062499989,11.959619140624994],[-16.138427734375,11.917285156249989],[-16.274316406249994,11.978125],[-16.328076171874983,12.051611328124991],[-16.31884765625,12.14375],[-16.254736328124977,12.2060546875],[-16.244580078124983,12.237109374999989],[-16.31230468749999,12.243017578124991],[-16.43681640624999,12.204150390624989],[-16.711816406249994,12.354833984374991],[-16.745849609375,12.399707031249989],[-16.784863281249983,12.472509765624991],[-16.76030273437499,12.52578125],[-16.677636718749994,12.56005859375],[-16.55322265625,12.604882812499994],[-16.48808593749999,12.581835937499989],[-16.449951171875,12.580712890624994],[-16.44287109375,12.609472656249991],[-16.455029296874983,12.624804687499989],[-16.548828125,12.663818359375],[-16.59765625,12.715283203124997],[-16.637841796874994,12.68515625],[-16.672558593749983,12.622021484374997],[-16.701416015625,12.603173828124994],[-16.743896484375,12.58544921875],[-16.76796875,12.62841796875],[-16.778417968749977,12.670166015625],[-16.758984374999983,12.70234375],[-16.768945312499994,12.88330078125],[-16.75737304687499,12.979785156249989],[-16.763330078124994,13.064160156249997],[-16.76933593749999,13.148486328124989],[-16.824804687499977,13.341064453125],[-16.750390625,13.425390625],[-16.669335937499994,13.475],[-16.61479492187499,13.435302734375],[-16.598339843749983,13.356835937499994],[-16.55644531249999,13.30322265625],[-16.41337890624999,13.269726562499997],[-16.271679687499983,13.293798828124991],[-16.18505859375,13.28271484375],[-16.187890625,13.326171875],[-16.158398437499983,13.384033203125],[-15.986425781249977,13.408837890624994],[-15.804492187499989,13.425390625],[-15.61767578125,13.460107421874994],[-15.471289062499977,13.458642578124994],[-15.427490234375,13.468359375],[-15.438134765624994,13.483203125],[-15.569531249999983,13.499853515624991],[-15.849902343749989,13.4599609375],[-16.135449218749983,13.4482421875],[-16.351806640625,13.343359375],[-16.440527343749977,13.353173828124994],[-16.53007812499999,13.457958984374997],[-16.56230468749999,13.587304687499994],[-16.587792968749994,13.689550781249991],[-16.647851562499994,13.77099609375],[-16.74541015624999,13.840429687499991],[-16.766943359374977,13.904931640624994],[-16.73388671875,13.961181640625],[-16.639599609374983,14.007470703124994],[-16.618115234374983,14.04052734375],[-16.66748046875,14.035595703124997],[-16.742138671874983,14.005810546874997],[-16.791748046875,14.004150390625],[-16.797753906249994,14.09326171875],[-16.880517578124994,14.208349609374991],[-16.973828124999983,14.403222656249994],[-17.07939453124999,14.483056640624994],[-17.168066406249977,14.640625],[-17.260644531249994,14.701074218749994],[-17.345800781249977,14.729296875],[-17.41845703125,14.723486328124991],[-17.445019531249983,14.651611328125],[-17.53564453125,14.755126953125],[-17.411816406249983,14.7921875],[-17.147167968749983,14.922021484374994],[-16.843408203124994,15.293994140625003],[-16.570751953124983,15.734423828125003],[-16.535253906249977,15.83837890625],[-16.535742187499977,16.286816406249997],[-16.481298828124977,16.454248046874994],[-16.463623046875,16.601513671874997],[-16.3466796875,16.926416015624994],[-16.207470703124983,17.192578125],[-16.07890624999999,17.545849609374997],[-16.03032226562499,17.887939453125],[-16.046728515624977,18.22314453125],[-16.0849609375,18.521191406249997],[-16.150097656249983,18.718164062499994],[-16.213085937499983,19.003320312499994],[-16.305908203125,19.15380859375],[-16.476171874999977,19.285058593749994],[-16.51445312499999,19.361962890624994],[-16.474804687499983,19.390625],[-16.371289062499983,19.41025390624999],[-16.305273437499977,19.512646484374997],[-16.44487304687499,19.47314453125],[-16.283398437499983,19.787158203125003],[-16.23320312499999,20.0009765625],[-16.241162109374983,20.141259765624994],[-16.21044921875,20.227929687499994],[-16.333740234375,20.41586914062499],[-16.429785156249977,20.65234375],[-16.479199218749983,20.68979492187499],[-16.530419921874994,20.709521484375003],[-16.534912109375,20.654003906249997],[-16.562695312499983,20.604150390624994],[-16.622509765624983,20.634179687499994],[-16.728369140624977,20.80615234375],[-16.876074218749977,21.086132812499997],[-16.927929687499983,21.114794921875003],[-16.971142578124983,21.076464843750003],[-16.998242187499983,21.039697265624994],[-17.048046874999983,20.80615234375],[-17.098779296874994,20.856884765624997],[-17.009619140624977,21.377099609374994],[-16.930859374999983,21.9],[-16.79326171874999,22.159716796875003],[-16.683984375,22.274365234374997],[-16.514404296875,22.33349609375],[-16.358740234374977,22.59453125],[-16.304296874999977,22.83481445312499],[-16.201855468749983,22.945361328125003],[-16.16972656249999,23.031933593749997],[-16.21025390624999,23.097900390625],[-16.113671875,23.2275390625],[-15.996728515624994,23.425488281249997],[-15.942626953125,23.552636718749994],[-15.805957031249989,23.74951171875],[-15.789257812499983,23.792871093749994],[-15.801660156249994,23.842236328124997],[-15.855175781249983,23.800341796875003],[-15.912548828124983,23.727587890625003],[-15.980712890625,23.6703125],[-15.952832031249983,23.74082031249999],[-15.899316406249994,23.844433593749997],[-15.777783203124983,23.952929687500003],[-15.586328125,24.07275390625],[-15.188623046874994,24.478808593750003],[-15.038867187499989,24.548828125],[-14.904296875,24.719775390625003],[-14.856054687499977,24.87158203125],[-14.842919921874994,25.220117187499994],[-14.794921875,25.40415039062499],[-14.70703125,25.54770507812499],[-14.602294921875,25.808544921874997],[-14.522753906249989,25.925244140624997],[-14.470556640624977,26.163037109374997],[-14.413867187499989,26.253710937499996],[-14.312451171874983,26.296728515625],[-14.168359375,26.415429687499994],[-13.952099609374983,26.48876953125],[-13.695898437499977,26.642919921875],[-13.575781249999977,26.735107421875],[-13.495751953124994,26.87265625],[-13.409814453124994,27.146630859374994],[-13.256152343749989,27.434619140624996],[-13.175976562499983,27.655712890624997],[-13.040722656249983,27.769824218749996],[-12.948925781249983,27.91416015625],[-12.793652343749983,27.978417968749994],[-12.468896484374994,28.009423828124994],[-11.986083984375,28.129296875],[-11.552685546874983,28.310107421874996],[-11.43017578125,28.38203125],[-11.299072265625,28.526074218749997],[-11.080957031249994,28.713769531249994],[-10.673828125,28.939208984375],[-10.486474609374994,29.06494140625],[-10.200585937499994,29.38037109375],[-10.010498046875,29.64140625],[-9.852636718749977,29.809228515624994],[-9.743457031249989,29.958203125],[-9.667089843749977,30.109277343749994],[-9.623828124999989,30.35263671875],[-9.652929687499977,30.447558593749996],[-9.773144531249983,30.603125],[-9.85390625,30.644580078124996],[-9.87548828125,30.717919921874994],[-9.832421875,30.847265625],[-9.833349609374977,31.069628906249996],[-9.808691406249977,31.424609375],[-9.674951171874994,31.710986328124996],[-9.347460937499989,32.086376953125],[-9.286572265624983,32.240576171875],[-9.249121093749977,32.48583984375],[-9.245849609375,32.5724609375],[-8.836230468749989,32.920458984374996],[-8.596289062499977,33.187158203124994],[-8.512841796874994,33.25244140625],[-8.301171875,33.374365234375],[-7.562353515624977,33.640283203124994],[-7.144677734374994,33.830322265625],[-6.900976562499977,33.969042968749996],[-6.755761718749994,34.13291015625],[-6.35312,34.77607421875],[-5.957568359374989,35.68115234375],[-5.9248046875,35.785791015624994],[-5.747949218749994,35.815966796874996],[-5.622851562499989,35.82890625],[-5.522265624999989,35.86201171875],[-5.397363281249994,35.9298828125],[-5.27783203125,35.902734375],[-5.337646484375,35.85654296875],[-5.337646484375,35.74521484375],[-5.252685546875,35.61474609375],[-5.105371093749994,35.4677734375],[-4.837207031249989,35.281298828124996],[-4.628320312499994,35.206396484375],[-4.329980468749994,35.161474609375],[-3.982421875,35.243408203125],[-3.787988281249994,35.244921875],[-3.693261718749994,35.27998046875],[-3.59062,35.228320312499996],[-3.394726562499983,35.211816406249994],[-3.206005859374983,35.239111328125],[-3.063085937499977,35.317236328125],[-2.972216796874989,35.407275390624996],[-2.957958984374983,35.363085937499996],[-2.95361328125,35.31513671875],[-2.925976562499983,35.287109375],[-2.86953125,35.17265625],[-2.839941406249977,35.127832031249994],[-2.731396484374983,35.135205078125],[-2.636816406249977,35.112695312499994],[-2.423730468749994,35.123486328125],[-2.219628906249994,35.10419921875],[-2.017773437499983,35.08505859375],[-1.913281249999983,35.09423828125],[-1.673632812499989,35.18310546875],[-1.483740234374977,35.303076171875],[-1.335839843749994,35.3642578125],[-1.205371093749989,35.495751953124994],[-1.087695312499989,35.578857421875],[-0.91748046875,35.668408203125],[-0.426123046874977,35.8615234375],[-0.350781249999983,35.863183593749994],[-0.189160156249983,35.819091796875],[-0.048242187499994,35.8328125],[0.047949218750006,35.900537109374994],[0.151660156250017,36.063134765624994],[0.312207031250011,36.162353515625],[0.514941406250017,36.26181640625],[0.790820312500017,36.35654296875],[0.9716796875,36.4439453125],[1.257226562500023,36.519580078124996],[1.974511718750023,36.567578125],[2.342871093750006,36.610302734375],[2.593359375,36.60068359375],[2.846484375000017,36.7388671875],[2.972851562500011,36.784472656249996],[3.5205078125,36.7951171875],[3.779003906250011,36.89619140625],[4.758105468750017,36.896337890625],[4.877832031250023,36.86240234375],[4.995410156250017,36.808056640625],[5.195605468750017,36.676806640624996],[5.29541015625,36.648242187499996],[5.424609375000017,36.675439453124994],[5.725488281250023,36.799609375],[6.064746093750017,36.8642578125],[6.249121093750006,36.938330078125],[6.327832031250011,37.046044921874994],[6.486523437500011,37.085742187499996],[6.575878906250011,37.00302734375],[6.927539062500017,36.91943359375],[7.143457031250023,36.943359375],[7.238476562500011,36.968505859375],[7.204296875000011,37.0923828125],[7.432421875000017,37.05927734375],[7.607714843750017,36.999755859375],[7.791601562500006,36.880273437499994],[7.910449218750017,36.856347656249994],[8.127148437500011,36.9103515625],[8.576562500000023,36.93720703125],[8.823535156250017,36.997607421874996],[9.058886718750017,37.155859375],[9.141992187500023,37.194628906249996],[9.68798828125,37.340380859374996],[9.758886718750006,37.3302734375],[9.838476562500006,37.308984375],[9.815527343750006,37.254638671875],[9.783984375000017,37.21142578125],[9.830273437500011,37.1353515625],[9.896386718750023,37.181640625],[9.87939453125,37.212841796875],[9.875585937500006,37.254150390625],[9.988085937500017,37.257763671875],[10.08740234375,37.251269531249996],[10.196386718750006,37.205859375],[10.188769531250017,37.03388671875],[10.334082031250006,36.865380859374994],[10.293261718750017,36.781494140625],[10.412304687500011,36.731835937499994],[10.518164062500006,36.791357421875],[10.5712890625,36.879443359374996],[10.766210937500006,36.9302734375],[10.951367187500011,37.05927734375],[11.053906250000011,37.072509765625],[11.077050781250023,36.966699218749994],[11.126660156250011,36.874072265624996],[11.056542968750023,36.841455078124994],[10.967187500000023,36.743017578125],[10.798144531250017,36.493115234375],[10.642382812500017,36.41962890625],[10.525683593750017,36.32333984375],[10.487988281250011,36.2548828125],[10.4765625,36.175146484375],[10.505761718750023,36.032421875],[10.5908203125,35.887255859374996],[10.68896484375,35.79951171875],[10.78369140625,35.7720703125],[11.004296875000023,35.633837890624996],[11.000683593750011,35.551611328125],[11.031542968750017,35.453857421875],[11.043261718750017,35.335107421874994],[11.1201171875,35.240283203124996],[10.955859375000017,35.033642578125],[10.8662109375,34.884326171874996],[10.69091796875,34.678466796875],[10.534863281250011,34.544726562499996],[10.200390625000011,34.346044921875],[10.118359375000011,34.280078125],[10.064843750000023,34.21162109375],[10.0400390625,34.14033203125],[10.049023437500011,34.056298828124994],[10.158984375000017,33.850048828125],[10.305273437500006,33.728271484375],[10.454296875000011,33.6625],[10.713183593750017,33.689013671874996],[10.704296875000011,33.609667968749996],[10.722753906250006,33.514404296875],[10.828125,33.518896484375],[10.8984375,33.53369140625],[10.9580078125,33.626318359375],[11.084570312500006,33.562890625],[11.150292968750023,33.36923828125],[11.257421875,33.308837890625],[11.269921875000023,33.286328125],[11.232128906250011,33.27158203125],[11.20263671875,33.24921875],[11.234277343750023,33.23359375],[11.338085937500011,33.20947265625],[11.400585937500011,33.224902343749996],[11.504589843750011,33.181933593749996],[11.657128906250023,33.118896484375],[11.8134765625,33.093701171875],[12.279882812500006,32.858544921874994],[12.427050781250017,32.8291015625],[12.753515625,32.801074218749996],[13.138085937500023,32.897363281249994],[13.283496093750017,32.9146484375],[13.536328125000011,32.824267578124996],[13.647753906250017,32.798828125],[13.835351562500023,32.791796875],[14.155664062500023,32.709765625],[14.237109375000017,32.68125],[14.423828125,32.55029296875],[14.513378906250011,32.511083984375],[15.176562500000017,32.391162109374996],[15.266894531250017,32.311669921874994],[15.359082031250011,32.15966796875],[15.363085937500017,31.97119140625],[15.4140625,31.834228515625],[15.496386718750017,31.656787109374996],[15.595800781250006,31.531103515625],[15.705957031250023,31.426416015624994],[15.832226562500011,31.360986328124994],[16.123046875,31.264453125],[16.450976562500017,31.227294921875],[16.781542968750017,31.214746093749994],[17.34921875,31.081494140624997],[17.830468750000023,30.927587890625],[17.949316406250006,30.851904296875],[18.1904296875,30.777294921874997],[18.669824218750023,30.415673828124994],[18.936425781250023,30.290429687499994],[19.12373046875001,30.26611328125],[19.29169921875001,30.2880859375],[19.58984375,30.413769531249997],[19.713281250000023,30.48837890625],[20.01318359375,30.800683593749994],[20.11152343750001,30.963720703125],[20.150976562500006,31.07861328125],[20.14111328125,31.195507812499997],[20.103808593750017,31.300537109375],[20.02001953125,31.41064453125],[19.961230468750017,31.556005859375],[19.926367187500006,31.817529296874994],[19.973437500000017,31.999072265624996],[20.03095703125001,32.107861328125],[20.121484375000023,32.21875],[20.37060546875,32.43076171875],[20.62109375,32.58017578125],[21.062304687500017,32.775537109374994],[21.31875,32.777685546875],[21.424707031250023,32.799169921875],[21.63593750000001,32.937304687499996],[21.72138671875001,32.94248046875],[21.839453125,32.908642578125],[22.187402343750023,32.918261718749996],[22.340625,32.8798828125],[22.5234375,32.7939453125],[22.75410156250001,32.740527343749996],[22.916894531250023,32.687158203124994],[23.090625,32.61875],[23.129687500000017,32.448144531249994],[23.110449218750006,32.397412109375],[23.10625,32.331445312499994],[23.28632812500001,32.213818359375],[23.797656250000017,32.15869140625],[23.8984375,32.127197265625],[24.038964843750023,32.037011718749994],[24.129687500000017,32.009228515625],[24.479785156250017,31.996533203124997],[24.683886718750017,32.015966796875],[24.878515625,31.984277343749994],[24.95068359375,31.9537109375],[25.025,31.883349609374996],[25.115039062500017,31.712304687499994],[25.150488281250006,31.654980468749997],[25.225488281250023,31.5337890625],[25.382226562500023,31.51279296875],[25.89326171875001,31.620898437499996],[26.457324218750017,31.512109375],[26.768652343750006,31.470361328124994],[27.248046875,31.377880859374997],[27.5400390625,31.212695312499996],[27.6201171875,31.191748046875],[27.829980468750023,31.195019531249997],[27.967578125000017,31.097412109375],[28.51484375000001,31.050439453124994],[28.806933593750017,30.942675781249996],[28.972753906250006,30.856738281249996],[29.072070312500017,30.830273437499997],[29.159960937500017,30.8345703125],[29.27890625,30.866943359375],[29.428515625000017,30.927441406249997],[29.591601562500017,31.011523437499996],[29.929785156250006,31.227490234374997],[30.049414062500006,31.265429687499996],[30.127539062500006,31.255664062499996],[30.22265625,31.2583984375],[30.262304687500006,31.316845703124997],[30.312304687500017,31.35703125],[30.34375,31.402734375],[30.395117187500006,31.4576171875],[30.57099609375001,31.472998046875],[30.92353515625001,31.566845703124997],[30.884179687500023,31.522363281249994],[30.56298828125,31.4169921875],[30.700488281250017,31.403857421874996],[30.84140625,31.439892578124997],[31.001757812500017,31.462792968749994],[31.030859375,31.507568359375],[31.05195312500001,31.591552734375],[31.082910156250023,31.603320312499996],[31.193945312500006,31.587597656249997],[31.5244140625,31.458251953125],[31.606542968750006,31.455761718749997],[31.839257812500023,31.526318359374997],[31.888964843750017,31.54140625],[31.964257812500023,31.502099609374994],[32.13603515625002,31.341064453125],[32.07607421875002,31.344482421875],[31.8921875,31.482470703124996],[31.875878906250023,31.413720703124994],[31.77109375,31.292578125],[31.90205078125001,31.240185546874997],[32.00849609375001,31.220507812499996],[32.065625,31.152978515624994],[32.10175781250001,31.092822265624996],[32.20654296875,31.119042968749994],[32.281835937500006,31.200878906249997],[32.242773437500006,31.246533203124997],[32.21621093750002,31.29375],[32.250585937500006,31.294921875],[32.32353515625002,31.256054687499997],[32.5328125,31.100732421874994],[32.60332031250002,31.06875],[32.6845703125,31.074023437499996],[32.8544921875,31.117724609374996],[32.90156250000001,31.1109375],[33.1298828125,31.168164062499997],[33.15673828125,31.126220703125],[33.1943359375,31.084521484374996],[33.3779296875,31.13095703125],[33.66650390625,31.130419921874996],[33.90253906250001,31.180957031249996],[34.17626953125,31.30390625],[34.19814453125002,31.322607421875],[34.387304687500006,31.483789062499994],[34.47734375000002,31.584863281249994],[34.483984375,31.59228515625],[34.67841796875001,31.895703125],[34.803808593750006,32.196337890624996],[34.921875,32.6140625],[35.005859375,32.826611328125],[35.07705078125002,32.9671875],[35.10859375000001,33.08369140625],[35.15507812500002,33.160009765625],[35.20351562500002,33.258984375],[35.25136718750002,33.392626953124996],[35.33574218750002,33.503466796874996],[35.510839843750006,33.879736328125],[35.61181640625,34.032177734375],[35.64785156250002,34.2482421875],[35.804296875,34.437402343749994],[35.92138671875,34.493310546874994],[35.97792968750002,34.547412109374996],[35.97626953125001,34.629199218749996],[35.89931640625002,34.852099609374996],[35.88789062500001,34.948632812499994],[35.88994140625002,35.060302734375],[35.94306640625001,35.223828125],[35.918066406250006,35.29951171875],[35.916015625,35.350537109375],[35.902441406250006,35.420703125],[35.76445312500002,35.571582031249996],[35.83964843750002,35.84921875],[35.892675781250006,35.916552734374996],[35.95693359375002,35.99814453125],[35.88710937500002,36.159082031249994],[35.81093750000002,36.309863281249996],[35.8828125,36.40634765625],[36.03173828125,36.522705078125],[36.1884765625,36.658984375],[36.18818359375001,36.743066406249994],[36.18007812500002,36.8072265625],[36.13515625000002,36.851611328124996],[36.048925781250006,36.910595703125],[35.90458984375002,36.847607421875],[35.80156250000002,36.778076171875],[35.73427734375002,36.763964843749996],[35.6611328125,36.72431640625],[35.625585937500006,36.652783203125],[35.53740234375002,36.597021484375],[35.393164062500006,36.5751953125],[35.17617187500002,36.63486328125],[34.94316406250002,36.72568359375],[34.81123046875001,36.799267578125],[34.70361328125,36.816796875],[34.60136718750002,36.784472656249996],[34.29960937500002,36.60419921875],[34.0234375,36.340771484375],[33.95488281250002,36.295214843749996],[33.69472656250002,36.181982421875],[33.52275390625002,36.143994140625],[33.44179687500002,36.15283203125],[33.09951171875002,36.102978515625],[32.92949218750002,36.095703125],[32.79482421875002,36.035888671875],[32.533789062500006,36.100732421874994],[32.37773437500002,36.183642578124996],[32.283789062500006,36.267871093749996],[32.13056640625001,36.449121093749994],[32.02197265625,36.535302734374994],[31.777929687500006,36.61279296875],[31.3525390625,36.801074218749996],[31.240625,36.821728515625],[30.950292968750006,36.848681640624996],[30.64404296875,36.865673828125],[30.58203125,36.797167968749996],[30.558496093750023,36.525830078125],[30.50605468750001,36.451123046875],[30.48359375000001,36.310400390625],[30.446093750000017,36.269873046875],[30.387304687500006,36.24326171875],[30.29541015625,36.2876953125],[30.23164062500001,36.30732421875],[30.08320312500001,36.249365234375],[29.78925781250001,36.16806640625],[29.6890625,36.156689453125],[29.34833984375001,36.258837890624996],[29.2236328125,36.324462890625],[29.14326171875001,36.397216796875],[29.116113281250023,36.5201171875],[29.065527343750006,36.590087890625],[29.05810546875,36.638134765625],[29.03828125000001,36.69345703125],[28.969628906250023,36.71533203125],[28.895898437500023,36.673583984375],[28.81689453125,36.67529296875],[28.717675781250023,36.70087890625],[28.48359375000001,36.80380859375],[28.3037109375,36.811962890625],[28.195605468750017,36.686328125],[28.11152343750001,36.646386718749994],[28.019433593750023,36.63447265625],[28.01416015625,36.670214843749996],[28.083984375,36.75146484375],[27.803808593750006,36.736474609374994],[27.655859375,36.674609375],[27.540429687500023,36.684228515624994],[27.453906250000017,36.712158203125],[27.466894531250006,36.746337890625],[27.5546875,36.75888671875],[27.630859375,36.786669921874996],[27.934472656250023,36.80927734375],[28.00537109375,36.831982421875],[28.0830078125,36.920263671875],[28.224414062500017,36.996386718749996],[28.24238281250001,37.029052734375],[28.133691406250023,37.0294921875],[27.668359375000023,37.007421875],[27.348925781250017,37.019580078124996],[27.31103515625,36.981884765625],[27.262988281250017,36.9765625],[27.24970703125001,37.079150390624996],[27.300195312500023,37.126855468749994],[27.3681640625,37.122412109375],[27.535058593750023,37.163867187499996],[27.520117187500006,37.24912109375],[27.40058593750001,37.30673828125],[27.376269531250017,37.340722656249994],[27.28955078125,37.348681640624996],[27.21923828125,37.38916015625],[27.203906250000017,37.49140625],[27.14794921875,37.60361328125],[27.06796875,37.65791015625],[27.07783203125001,37.6876953125],[27.224414062500017,37.725439453125],[27.254785156250023,37.88232421875],[27.232421875,37.978662109374994],[27.15869140625,37.986865234374996],[26.94384765625,38.062890625],[26.87861328125001,38.05478515625],[26.807421875000017,38.138330078124994],[26.68281250000001,38.19833984375],[26.62109375,38.1763671875],[26.582421875000023,38.149267578125],[26.524707031250017,38.162255859374994],[26.42792968750001,38.21435546875],[26.332910156250023,38.242480468749996],[26.29072265625001,38.277197265625],[26.343652343750023,38.370068359375],[26.416406250000023,38.36787109375],[26.4296875,38.440625],[26.37226562500001,38.561914062499994],[26.377832031250023,38.624169921874994],[26.441308593750023,38.6412109375],[26.513574218750023,38.6294921875],[26.586523437500006,38.55703125],[26.6103515625,38.4869140625],[26.595019531250017,38.418603515624994],[26.64130859375001,38.352441406249994],[26.674218750000023,38.335742187499996],[26.696386718750006,38.40537109375],[26.727343750000017,38.418603515624994],[26.769921875000023,38.38818359375],[26.861425781250006,38.372949218749994],[27.0986328125,38.41572265625],[27.14423828125001,38.451953125],[26.97041015625001,38.4478515625],[26.906835937500006,38.481738281249996],[26.837792968750023,38.557568359375],[26.795312500000023,38.626416015625],[26.787695312500006,38.660205078124996],[26.763671875,38.709619140624994],[26.790136718750006,38.736083984375],[26.9091796875,38.77578125],[27.013671875,38.886865234374994],[26.970117187500023,38.91904296875],[26.920312500000023,38.934228515624994],[26.8662109375,38.92294921875],[26.81494140625,38.960986328124996],[26.80830078125001,39.013916015625],[26.84931640625001,39.05673828125],[26.853613281250006,39.115625],[26.719335937500006,39.260644531249994],[26.68183593750001,39.292236328125],[26.710742187500017,39.339648437499996],[26.813281250000017,39.41904296875],[26.910937500000017,39.517333984375],[26.899218750000017,39.549658203125],[26.827050781250023,39.562890625],[26.48408203125001,39.520703125],[26.35078125000001,39.48408203125],[26.113085937500017,39.4673828125],[26.095996093750017,39.520800781249996],[26.101367187500017,39.5689453125],[26.154687500000023,39.656640625],[26.149804687500023,39.872851562499996],[26.18134765625001,39.990087890625],[26.313378906250023,40.025],[26.475390625000017,40.197265625],[26.738085937500017,40.400244140625],[27.012109375000023,40.396337890625],[27.121679687500006,40.45234375],[27.284570312500023,40.455615234374996],[27.31416015625001,40.414892578125],[27.332617187500006,40.375927734375],[27.4755859375,40.319921875],[27.72802734375,40.32880859375],[27.789355468750017,40.350878906249996],[27.848535156250023,40.381738281249994],[27.731835937500023,40.481494140624996],[27.769140625,40.509619140625],[27.874902343750023,40.512939453125],[27.989550781250017,40.489453125],[27.99482421875001,40.466601562499996],[27.96435546875,40.435302734375],[27.92890625000001,40.380419921874996],[27.96259765625001,40.369873046875],[28.2890625,40.40302734375],[28.630273437500023,40.37646484375],[28.738867187500006,40.390869140625],[29.007128906250017,40.38974609375],[29.05517578125,40.424169921875],[28.974023437500023,40.4673828125],[28.894628906250006,40.482421875],[28.841210937500023,40.503466796874996],[28.787890625000017,40.534033203125],[28.9580078125,40.63056640625],[29.054101562500023,40.64912109375],[29.507617187500017,40.708398437499994],[29.84492187500001,40.738085937499996],[29.84921875,40.760107421875],[29.800585937500017,40.76015625],[29.36474609375,40.80927734375],[29.259765625,40.847314453124994],[29.113867187500006,40.937841796875],[29.08222656250001,40.963427734374996],[29.045507812500006,41.007568359375],[29.0673828125,41.10166015625],[29.094335937500006,41.17724609375],[29.14814453125001,41.221044921875],[29.322265625,41.227734375],[29.919335937500023,41.150830078125],[30.34492187500001,41.196923828124994],[30.81005859375,41.084863281249994],[31.2548828125,41.1076171875],[31.3466796875,41.15791015625],[31.4580078125,41.32001953125],[32.08642578125,41.589208984375],[32.30644531250002,41.72958984375],[32.54218750000001,41.806396484375],[32.94667968750002,41.891748046874994],[33.284765625,42.00458984375],[33.38134765625,42.017578125],[34.19296875,41.963671875],[34.75048828125,41.956835937499996],[35.006445312500006,42.06328125],[35.154882812500006,42.0275390625],[35.14101562500002,41.989501953125],[35.11406250000002,41.956982421875],[35.1220703125,41.89111328125],[35.20917968750001,41.794384765625],[35.29775390625002,41.728515625],[35.55800781250002,41.634033203125],[35.91982421875002,41.713720703125],[35.978125,41.704833984375],[36.0517578125,41.682568359375],[36.17919921875,41.4265625],[36.278417968750006,41.3361328125],[36.405371093750006,41.274609375],[36.50966796875002,41.2625],[36.58710937500001,41.32666015625],[36.647070312500006,41.3525390625],[36.77773437500002,41.3634765625],[36.99199218750002,41.275390625],[37.06621093750002,41.184423828125],[37.43095703125002,41.114111328125],[37.765625,41.07890625],[37.91005859375002,41.001904296875],[38.38105468750001,40.92451171875],[38.55693359375002,40.9365234375],[38.852148437500006,41.01767578125],[39.426367187500006,41.1064453125],[39.80791015625002,40.98251953125],[39.9111328125,40.966455078124994],[40.00019531250001,40.9771484375],[40.12841796875,40.943017578124994],[40.265234375,40.961328125],[40.6875,41.107421875],[40.81953125000001,41.190234375],[40.95947265625,41.21162109375],[41.08359375,41.261181640625],[41.41435546875002,41.423632812499996],[41.51005859375002,41.517480468749994],[41.701757812500006,41.705419921875],[41.7587890625,41.817138671875],[41.7607421875,41.88486328125],[41.76298828125002,41.970019531249996],[41.66328125000001,42.146875],[41.577734375,42.397851562499994],[41.48876953125,42.659326171874994],[41.41943359375,42.737646484375],[41.12871093750002,42.828125],[41.061621093750006,42.930859375],[40.83662109375001,43.0634765625],[40.524023437500006,43.121044921875],[40.46210937500001,43.145703125],[40.190625,43.312402343749994],[39.97832031250002,43.419824218749994],[39.873632812500006,43.472802734374994],[39.516699218750006,43.727880859375],[39.32939453125002,43.897265625],[38.71728515625,44.2880859375],[38.635839843750006,44.318017578124994],[38.31181640625002,44.374462890625],[38.18125,44.419677734375],[37.85146484375002,44.698828125],[37.70488281250002,44.661376953125],[37.57246093750001,44.670849609375],[37.4951171875,44.695263671875],[37.41132812500001,44.7353515625],[37.35234375000002,44.788378906249996],[37.28408203125002,44.905029296875],[37.20478515625001,44.971972656249996],[36.944433593750006,45.069580078125],[36.65078125000002,45.12646484375],[36.62763671875001,45.151318359375],[36.619140625,45.185498046875],[36.873046875,45.251757812499996],[36.94121093750002,45.289697265624994],[36.81103515625,45.3400390625],[36.76162109375002,45.34833984375],[36.72041015625001,45.371875],[36.79375,45.409716796874996],[36.86591796875001,45.427050781249996],[36.97783203125002,45.38359375],[37.103515625,45.302880859374994],[37.21357421875001,45.272314453125],[37.264257812500006,45.3109375],[37.64716796875001,45.377197265625],[37.672949218750006,45.429736328124996],[37.671875,45.48837890625],[37.634375,45.486328125],[37.609960937500006,45.49951171875],[37.612402343750006,45.564697265625],[37.66923828125002,45.654052734375],[37.840917968750006,45.799560546875],[37.93310546875,46.001708984375],[38.014257812500006,46.047753906249994],[38.073828125,46.01708984375],[38.06972656250002,45.969873046874994],[38.07958984375,45.934814453125],[38.1328125,46.002832031249994],[38.18359375,46.09482421875],[38.31181640625002,46.095361328124994],[38.400390625,46.080029296875],[38.492285156250006,46.09052734375],[38.31523437500002,46.241943359375],[38.077734375,46.394335937499996],[37.9775390625,46.382861328124996],[37.91386718750002,46.406494140625],[37.8095703125,46.532080078125],[37.76650390625002,46.636132812499994],[37.86738281250001,46.6337890625],[37.96796875000001,46.618017578125],[38.15947265625002,46.690673828125],[38.22998046875,46.70126953125],[38.34345703125001,46.6783203125],[38.5009765625,46.663671875],[38.48798828125001,46.732177734375],[38.43867187500001,46.8130859375],[38.63076171875002,46.873046875],[38.80107421875002,46.906152343749994],[39.12675781250002,47.0234375],[39.27070312500001,47.044140625],[39.2890625,47.0708984375],[39.29345703125,47.105761718749996],[39.24453125000002,47.199511718749996],[39.19570312500002,47.268847656249996],[39.02373046875002,47.272216796875],[38.928320312500006,47.175683593749994],[38.66816406250001,47.143945312499994],[38.55244140625001,47.150341796875],[38.64433593750002,47.212207031249996],[38.73603515625001,47.23583984375],[38.76191406250001,47.261621093749994],[38.577246093750006,47.239111328125],[38.48476562500002,47.175537109375],[38.21435546875,47.091455078124994],[38.178320312500006,47.080224609374994],[37.828710937500006,47.095849609374994],[37.54335937500002,47.074560546875],[37.33984375,46.916894531249994],[37.21855468750002,46.917333984375],[37.04755859375001,46.876220703125],[36.93203125000002,46.825146484375],[36.79482421875002,46.714404296874996],[36.68867187500001,46.764111328125],[36.55878906250001,46.7626953125],[36.43203125000002,46.732568359374994],[36.27949218750001,46.65859375],[36.19462890625002,46.6455078125],[36.02490234375,46.666796875],[35.8271484375,46.624316406249996],[35.40019531250002,46.381396484374996],[35.25664062500002,46.20390625],[35.20439453125002,46.169189453125],[35.13232421875,46.125878906249994],[35.055273437500006,46.10400390625],[35.01455078125002,46.106005859374996],[35.2177734375,46.232177734375],[35.28017578125002,46.2794921875],[35.29091796875002,46.314404296875],[35.2919921875,46.370703125],[35.23037109375002,46.440625],[35.0640625,46.267236328124994],[34.96953125000002,46.242089843749994],[34.849609375,46.189892578125],[34.84375,46.073583984375],[34.85732421875002,45.987353515624996],[34.90664062500002,45.878808593749994],[35.02285156250002,45.700976562499996],[35.26015625000002,45.446923828124994],[35.37392578125002,45.35361328125],[35.45751953125,45.316308593749994],[35.55800781250002,45.310888671875],[35.7509765625,45.38935546875],[35.83349609375,45.401611328125],[36.01289062500001,45.3716796875],[36.0771484375,45.424121093749996],[36.170507812500006,45.453076171875],[36.29033203125002,45.45673828125],[36.42705078125002,45.433251953124994],[36.575,45.3935546875],[36.514257812500006,45.303759765624996],[36.45078125,45.232324218749994],[36.42841796875001,45.153271484375],[36.39335937500002,45.065380859375],[36.22988281250002,45.0259765625],[36.054785156250006,45.030810546874996],[35.8701171875,45.005322265625],[35.80361328125002,45.039599609374996],[35.75947265625001,45.070849609374996],[35.67753906250002,45.102001953125],[35.56953125000001,45.1193359375],[35.47255859375002,45.098486328125],[35.35781250000002,44.978417968749994],[35.15478515625,44.896337890625],[35.08769531250002,44.802636718749994],[34.887792968750006,44.823583984375],[34.716894531250006,44.80712890625],[34.46992187500001,44.7216796875],[34.28173828125,44.538427734375],[34.07441406250001,44.423828125],[33.90996093750002,44.387597656249994],[33.75566406250002,44.39892578125],[33.655859375,44.433203125],[33.45068359375,44.553662109375],[33.46269531250002,44.596826171874994],[33.491308593750006,44.618603515625],[33.53007812500002,44.680517578125],[33.61220703125002,44.9078125],[33.601171875,44.981494140624996],[33.55517578125,45.09765625],[33.39248046875002,45.187841796875],[33.26152343750002,45.170751953125],[33.18691406250002,45.194775390625],[32.91865234375001,45.34814453125],[32.77265625000001,45.358984375],[32.611328125,45.328076171875],[32.551855468750006,45.350390625],[32.50800781250001,45.40380859375],[32.82802734375002,45.593017578125],[33.14228515625001,45.74921875],[33.28007812500002,45.765234375],[33.46621093750002,45.837939453124996],[33.66484375000002,45.947070312499996],[33.63671875,46.032861328124994],[33.59414062500002,46.096240234374996],[33.49882812500002,46.078857421875],[33.42988281250001,46.0576171875],[33.26347656250002,46.12568359375],[33.202246093750006,46.175732421875],[32.94179687500002,46.123779296875],[32.796875,46.131494140624994],[32.47675781250001,46.08369140625],[32.32988281250002,46.13037109375],[32.035742187500006,46.260986328125],[31.925195312500023,46.287255859374994],[31.83125,46.281689453125],[31.77998046875001,46.324658203125],[31.842871093750006,46.346142578125],[31.915917968750023,46.348681640624996],[31.99169921875,46.364404296874994],[32.01308593750002,46.387158203125],[32.00849609375001,46.429980468749996],[31.855761718750017,46.462451171874996],[31.713671875000017,46.47177734375],[31.623632812500006,46.51025390625],[31.55488281250001,46.554296875],[31.71601562500001,46.554980468749996],[31.8779296875,46.5216796875],[32.131445312500006,46.509375],[32.361328125,46.474951171875],[32.4189453125,46.5177734375],[32.55253906250002,46.5919921875],[32.57802734375002,46.615625],[32.354101562500006,46.56484375],[32.12724609375002,46.597216796874996],[32.04433593750002,46.642480468749994],[31.97431640625001,46.708789062499996],[31.944921875,46.784375],[31.96406250000001,46.854833984375],[31.939550781250006,46.981982421874996],[31.86474609375,47.095117187499994],[31.838183593750017,47.1572265625],[31.759179687500023,47.212841796875],[31.8369140625,47.08701171875],[31.86591796875001,47.003271484375],[31.912695312500006,46.926123046875],[31.901660156250017,46.721630859375],[31.872851562500017,46.649755859375],[31.779589843750017,46.631640625],[31.657031250000017,46.642431640625],[31.532128906250023,46.66474609375],[31.563378906250023,46.777294921875],[31.496875,46.73837890625],[31.402929687500006,46.628808593749994],[31.3203125,46.6125],[31.136816406250006,46.624462890625],[30.796289062500023,46.552001953125],[30.772851562500023,46.473046875],[30.7216796875,46.3662109375],[30.672265625000023,46.304003906249996],[30.65673828125,46.266503906249994],[30.511523437500017,46.105371093749994],[30.492968750000017,46.090136718749996],[30.219042968750017,45.866748046874996],[30.184179687500006,45.849951171875],[30.006640625000017,45.79794921875],[29.901660156250017,45.752392578125],[29.821191406250023,45.732080078124994],[29.68505859375,45.7546875],[29.62841796875,45.722460937499996],[29.601660156250006,45.682519531249994],[29.601171875,45.6],[29.670312500000023,45.540673828124994],[29.726953125000023,45.343310546874996],[29.705859375000017,45.259912109374994],[29.6890625,45.193212890625],[29.678613281250023,45.151660156249996],[29.635351562500006,44.979638671874994],[29.60546875,44.915478515625],[29.557519531250023,44.843408203124994],[29.048242187500023,44.757568359375],[29.0810546875,44.798828125],[29.069140625000017,44.871142578124996],[29.047753906250023,44.925683593749994],[29.0953125,44.975048828125],[28.98066406250001,44.992919921875],[28.930566406250023,44.9658203125],[28.891503906250023,44.91865234375],[28.926171875000023,44.810009765625],[28.870410156250017,44.749951171875],[28.849023437500023,44.71630859375],[28.846484375000017,44.636865234374994],[28.813574218750006,44.602490234375],[28.807031250000023,44.5650390625],[28.88818359375,44.574755859374996],[28.85175781250001,44.506103515625],[28.69921875,44.37421875],[28.645410156250023,44.295654296875],[28.658593750000023,43.983837890625],[28.590722656250023,43.797412109374996],[28.585351562500023,43.742236328124996],[28.561816406250017,43.501318359375],[28.465429687500006,43.389306640624994],[28.319628906250017,43.42685546875],[28.133691406250023,43.39560546875],[28.03515625,43.26826171875],[27.979296875000017,43.230517578124996],[27.92890625000001,43.1861328125],[27.896484375,43.020703125],[27.88886718750001,42.74970703125],[27.818359375,42.716650390625],[27.753710937500017,42.70654296875],[27.484765625000023,42.468066406249996],[27.639550781250023,42.4009765625],[27.70820312500001,42.349951171875],[27.821386718750006,42.2080078125],[27.982714843750017,42.047412109374996],[28.014453125000017,41.969042968749996],[27.9873046875,41.854882812499994],[28.05029296875,41.729150390624994],[28.197851562500006,41.554492187499996],[28.34638671875001,41.466357421874996],[28.94677734375,41.248388671875],[29.057226562500006,41.229736328125],[29.032128906250023,41.140478515625],[28.995996093750023,41.0611328125],[28.95625,41.008203125],[28.780371093750006,40.974169921874996],[28.294921875,41.071484375],[28.172167968750017,41.080712890624994],[28.085546875,41.061328125],[27.925195312500023,40.990576171875],[27.747363281250017,41.01328125],[27.499414062500023,40.97314453125],[27.43017578125,40.83994140625],[27.25800781250001,40.687353515625],[26.974609375,40.564013671874996],[26.772070312500006,40.498046875],[26.46796875000001,40.261474609375],[26.329980468750023,40.123388671875],[26.271777343750017,40.096582031249994],[26.202734375,40.075390625],[26.225976562500023,40.14169921875],[26.260156250000023,40.202392578125],[26.252343750000023,40.24814453125],[26.253808593750023,40.314697265625],[26.355273437500017,40.390234375],[26.44746093750001,40.44501953125],[26.7203125,40.544238281249996],[26.792089843750006,40.626611328124994],[26.578125,40.624658203124994],[26.3609375,40.606347656249994],[26.22421875,40.618066406249994],[26.10546875,40.611328125],[26.067773437500023,40.683398437499996],[26.038964843750023,40.7267578125],[26.0107421875,40.769140625],[25.85566406250001,40.844091796875],[25.49677734375001,40.88779296875],[25.325292968750006,40.943115234375],[25.250097656250006,40.9328125],[25.1044921875,40.9947265625],[25.004687500000017,40.967529296875],[24.79296875,40.85751953125],[24.6787109375,40.869482421875],[24.556542968750023,40.935595703124996],[24.47705078125,40.94775390625],[24.3837890625,40.912744140624994],[24.234375,40.7861328125],[24.082324218750017,40.724072265625],[23.946093750000017,40.748339843749996],[23.762792968750006,40.747802734375],[23.743261718750006,40.677001953125],[23.778710937500023,40.627978515624996],[23.87890625,40.544384765625],[23.831933593750023,40.48154296875],[23.866796875,40.4185546875],[23.932031250000023,40.40576171875],[24.030566406250017,40.409326171874994],[24.212792968750023,40.327783203124994],[24.29248046875,40.241796875],[24.343359375,40.147705078125],[24.232421875,40.215185546875],[24.158789062500006,40.280029296875],[24.056054687500023,40.303564453125],[23.913183593750006,40.358789062499994],[23.82343750000001,40.368017578125],[23.727929687500023,40.329736328124994],[23.720507812500017,40.286279296874994],[23.82343750000001,40.205126953124996],[23.917578125,40.155224609375],[23.96748046875001,40.114550781249996],[24.000781250000017,40.024609375],[23.981835937500023,39.994042968749994],[23.947070312500017,39.965576171875],[23.835351562500023,40.022265625],[23.66455078125,40.223828125],[23.42626953125,40.263964843749996],[23.38642578125001,40.221972656249996],[23.433203125,40.1154296875],[23.467089843750017,40.07392578125],[23.674121093750017,39.958886718749994],[23.657519531250017,39.934472656249994],[23.627343750000023,39.924072265625],[23.395605468750006,39.98984375],[23.328222656250006,40.08994140625],[23.31201171875,40.216455078124994],[23.09814453125,40.304296875],[22.896484375,40.39990234375],[22.851367187500017,40.490625],[22.892871093750017,40.524267578125],[22.922265625000023,40.590869140624996],[22.811425781250023,40.57861328125],[22.74189453125001,40.536474609375],[22.629492187500006,40.495556640625],[22.624902343750023,40.428613281249994],[22.642675781250006,40.366601562499994],[22.60546875,40.276416015624996],[22.5693359375,40.1193359375],[22.592187500000023,40.036914062499996],[22.835742187500017,39.800585937499996],[22.919042968750006,39.62890625],[22.978808593750017,39.563818359375],[23.103417968750023,39.492041015625],[23.2333984375,39.358447265624996],[23.288476562500023,39.288818359375],[23.327734375,39.17490234375],[23.218359375,39.104394531249994],[23.154687500000023,39.101464843749994],[23.119433593750017,39.132763671875],[23.16875,39.21044921875],[23.16171875,39.257763671875],[22.99287109375001,39.3310546875],[22.92138671875,39.30634765625],[22.838964843750006,39.25859375],[22.886035156250017,39.169970703124996],[22.93896484375,39.1115234375],[22.96552734375001,39.030908203124994],[23.066699218750017,39.037939453125],[22.930468750000017,38.947705078125],[22.802636718750023,38.901611328125],[22.676855468750006,38.89892578125],[22.596777343750006,38.890576171875],[22.569140625000017,38.867480468749996],[22.63427734375,38.85068359375],[22.6875,38.849169921874996],[22.774023437500006,38.800390625],[23.020312500000017,38.74189453125],[23.1376953125,38.66796875],[23.2529296875,38.66123046875],[23.368945312500017,38.525537109374994],[23.569628906250017,38.489404296874994],[23.683984375000023,38.352441406249994],[23.836035156250006,38.325488281249996],[23.96699218750001,38.275],[24.00537109375,38.226806640625],[24.024511718750006,38.139794921874994],[24.033007812500017,37.955322265625],[24.061328125000017,37.817919921874996],[24.062304687500017,37.77451171875],[24.05537109375001,37.709619140624994],[24.01972656250001,37.677734375],[23.971582031250023,37.6767578125],[23.877343750000023,37.777783203125],[23.732812500000023,37.884082031249996],[23.580468750000023,38.010546875],[23.537207031250006,38.032763671874996],[23.501757812500017,38.03486328125],[23.420214843750017,37.992089843749994],[23.193652343750017,37.959033203124996],[23.08740234375,37.912841796875],[23.047460937500006,37.902636718749996],[23.03632812500001,37.878369140625],[23.08613281250001,37.853125],[23.14716796875001,37.7953125],[23.14716796875001,37.716259765625],[23.197558593750017,37.62021484375],[23.2626953125,37.59541015625],[23.347558593750023,37.597558593749994],[23.39619140625001,37.57978515625],[23.408789062500006,37.541552734374996],[23.458105468750006,37.496923828125],[23.490625,37.4638671875],[23.4892578125,37.440185546875],[23.252539062500006,37.377294921875],[23.203027343750023,37.348535156249994],[23.161523437500023,37.333837890625],[23.1,37.36376953125],[23.096484375000017,37.440576171874994],[23.01513671875,37.481787109375],[22.940527343750006,37.51708984375],[22.85107421875,37.5322265625],[22.775,37.585107421874994],[22.725390625000017,37.542138671874994],[22.765039062500023,37.393310546875],[22.85107421875,37.290820312499996],[22.995019531250023,37.015869140625],[23.060351562500017,36.853515625],[23.073535156250017,36.774951171874996],[23.041015625,36.64453125],[23.111718750000023,36.547607421875],[23.16015625,36.448095703125],[23.106835937500023,36.45185546875],[23.060546875,36.486962890624994],[22.98291015625,36.528369140624996],[22.832324218750017,36.687109375],[22.779882812500006,36.786181640624996],[22.717187500000023,36.7939453125],[22.6083984375,36.779736328125],[22.489062500000017,36.568164062499996],[22.48945312500001,36.446923828124994],[22.427734375,36.47578125],[22.374804687500017,36.513574218749994],[22.38125,36.64619140625],[22.3759765625,36.701904296875],[22.23115234375001,36.882568359375],[22.16474609375001,36.90283203125],[22.1337890625,36.963916015624996],[22.080468750000023,37.028955078124994],[22.01171875,37.016503906249994],[21.95556640625,36.990087890625],[21.940039062500006,36.891796875],[21.93427734375001,36.803662109375],[21.892382812500017,36.7373046875],[21.738085937500017,36.863232421875],[21.582910156250023,37.080957031249994],[21.57880859375001,37.200390625],[21.692480468750006,37.30927734375],[21.67890625000001,37.38720703125],[21.5712890625,37.541015625],[21.41621093750001,37.639941406249996],[21.32929687500001,37.669335937499994],[21.288476562500023,37.77451171875],[21.20527343750001,37.828857421875],[21.137988281250017,37.854150390624994],[21.12470703125001,37.8916015625],[21.14501953125,37.919287109375],[21.30810546875,38.02744140625],[21.403710937500023,38.196679687499994],[21.451171875,38.204736328124994],[21.548730468750023,38.164599609374996],[21.65839843750001,38.175097656249996],[21.748437500000023,38.27421875],[21.82470703125,38.328125],[21.95332031250001,38.321191406249994],[22.24375,38.188720703125],[22.55585937500001,38.113232421875],[22.711523437500006,38.046923828124996],[22.799609375000017,37.981201171875],[22.84638671875001,37.967578125],[22.920312500000023,37.958300781249996],[22.9169921875,38.007470703124994],[22.893164062500006,38.050927734374994],[22.95478515625001,38.074609375],[23.1220703125,38.07333984375],[23.15253906250001,38.09638671875],[23.183496093750023,38.133691406249994],[23.14892578125,38.176074218749996],[23.093554687500017,38.196435546874994],[23.034375,38.202099609375],[22.995410156250017,38.21552734375],[22.932519531250023,38.201953125],[22.834375,38.234716796875],[22.78369140625,38.26171875],[22.75390625,38.289501953125],[22.583398437500023,38.344921875],[22.421679687500017,38.438525390624996],[22.38525390625,38.385546875],[22.319921875,38.356835937499994],[22.226855468750017,38.352832031249996],[21.96533203125,38.412451171875],[21.8046875,38.366943359375],[21.717089843750017,38.355029296874996],[21.65009765625001,38.35400390625],[21.567675781250017,38.33359375],[21.472558593750023,38.32138671875],[21.39013671875,38.4078125],[21.35546875,38.4748046875],[21.3310546875,38.4873046875],[21.32978515625001,38.424365234374996],[21.303320312500006,38.373925781249994],[21.1826171875,38.345556640625],[21.113183593750023,38.384667968749994],[21.05976562500001,38.503271484375],[20.9921875,38.65400390625],[20.87324218750001,38.775732421875],[20.77685546875,38.807519531249994],[20.7685546875,38.874414062499994],[20.77734375,38.927880859374994],[20.893164062500006,38.94111328125],[21.07421875,38.88515625],[21.111621093750017,38.896289062499996],[21.15234375,38.9220703125],[21.14453125,38.97919921875],[21.11835937500001,39.02998046875],[21.06855468750001,39.032275390624996],[21.034082031250023,39.026269531249994],[20.922753906250023,39.036767578124994],[20.779687500000023,39.008544921875],[20.71337890625,39.03515625],[20.691308593750023,39.06748046875],[20.571679687500023,39.147705078125],[20.46826171875,39.255273437499994],[20.30078125,39.327099609375],[20.19140625,39.545800781249994],[20.099414062500017,39.641259765624994],[20.001269531250017,39.709423828125],[19.99560546875,39.801025390625],[19.96484375,39.872265625],[19.851855468750017,40.0435546875],[19.48457031250001,40.2099609375],[19.39814453125001,40.28486328125],[19.360156250000017,40.347705078124996],[19.322265625,40.407080078125],[19.35859375000001,40.408740234374996],[19.39453125,40.393701171874994],[19.440527343750006,40.37568359375],[19.45917968750001,40.40537109375],[19.439257812500017,40.470263671874996],[19.344628906250023,40.6220703125],[19.3375,40.663818359375],[19.383886718750006,40.79072265625],[19.461230468750017,40.93330078125],[19.4560546875,41.1060546875],[19.480078125,41.236376953124996],[19.453417968750017,41.32099609375],[19.440625,41.424755859375],[19.497363281250017,41.5626953125],[19.545800781250023,41.596826171874994],[19.57568359375,41.640429687499996],[19.577539062500023,41.7875],[19.46826171875,41.85615234375],[19.342382812500006,41.869091796875],[19.186425781250023,41.948632812499994],[19.12226562500001,42.060498046875],[18.89423828125001,42.249462890625],[18.632910156250006,42.378076171874994],[18.619042968750023,42.398388671875],[18.633398437500006,42.423144531249996],[18.645898437500023,42.442724609375],[18.591601562500017,42.444189453125],[18.553515625000017,42.428515625],[18.517480468750023,42.432910156249996],[18.3330078125,42.527880859374996],[18.16064453125,42.634033203125],[17.823828125,42.797412109374996],[17.5849609375,42.837158203125],[17.258203125000023,42.96845703125],[17.04541015625,43.014892578125],[17.12646484375,43.0255859375],[17.219824218750006,43.02587890625],[17.7236328125,42.85068359375],[17.667578125,42.897119140624994],[17.58515625000001,42.938378906249994],[17.53730468750001,42.962255859375],[17.329882812500017,43.114892578124994],[17.12939453125,43.2111328125],[16.903125,43.392431640625],[16.60029296875001,43.4640625],[16.393945312500023,43.543359375],[16.268945312500023,43.53125],[16.13105468750001,43.506298828125],[16.045996093750006,43.505517578124994],[15.985546875000011,43.519775390625],[15.942578125000011,43.5689453125],[15.949121093750023,43.606982421874996],[15.941503906250006,43.656640625],[15.820605468750017,43.7359375],[15.655664062500023,43.811279296875],[15.499414062500023,43.9087890625],[15.185839843750017,44.172119140625],[15.122949218750023,44.256787109375],[15.184667968750006,44.272900390625],[15.231347656250023,44.271435546875],[15.284277343750006,44.288818359375],[15.369726562500006,44.2892578125],[15.470996093750017,44.27197265625],[15.38134765625,44.328271484374994],[15.269824218750017,44.38349609375],[14.981347656250023,44.602929687499994],[14.895214843750011,44.706591796874996],[14.88525390625,44.818261718749994],[14.906542968750017,44.97138671875],[14.854589843750006,45.081005859375],[14.632031250000011,45.222900390625],[14.550488281250011,45.297705078125],[14.386132812500023,45.342138671875],[14.312695312500011,45.337792968749994],[14.2685546875,45.282519531249996],[14.236328125,45.15966796875],[14.090625,44.997607421874996],[14.0419921875,44.927197265625],[13.9658203125,44.83564453125],[13.899804687500023,44.829345703125],[13.860742187500023,44.83740234375],[13.742480468750017,44.991503906249996],[13.629296875000023,45.108203125],[13.613476562500011,45.163427734375],[13.603320312500017,45.231396484375],[13.5171875,45.481787109375],[13.577929687500017,45.516894531249996],[13.637304687500006,45.5359375],[13.719824218750006,45.58759765625],[13.783300781250006,45.627246093749996],[13.628320312500023,45.770947265625],[13.558203125,45.770703125],[13.465136718750017,45.7099609375],[13.206347656250017,45.771386718749994],[13.15673828125,45.74658203125],[13.1201171875,45.697900390624994],[13.0302734375,45.6375],[12.903027343750011,45.610791015625],[12.76123046875,45.544287109375],[12.611718750000023,45.497216796874994],[12.49755859375,45.461669921875],[12.43212890625,45.467919921874994],[12.5361328125,45.544921875],[12.491796875,45.546289062499994],[12.353808593750017,45.491992187499996],[12.274316406250023,45.446044921875],[12.248828125000017,45.36884765625],[12.225683593750006,45.241503906249996],[12.286328125000011,45.20771484375],[12.392480468750023,45.039794921875],[12.5234375,44.96796875],[12.497949218750023,44.8994140625],[12.463574218750011,44.84521484375],[12.384472656250011,44.79833984375],[12.319042968750011,44.83310546875],[12.27890625,44.8322265625],[12.248339843750017,44.722509765625],[12.304980468750017,44.429443359375],[12.396289062500017,44.223876953125],[12.48681640625,44.134228515625],[12.691113281250011,43.9947265625],[12.907031250000017,43.921191406249996],[13.295312500000023,43.686083984374996],[13.508203125000023,43.611669921875],[13.564160156250011,43.5712890625],[13.693261718750023,43.389892578125],[13.8046875,43.18037109375],[13.924902343750006,42.8515625],[14.010449218750011,42.68955078125],[14.182714843750006,42.5064453125],[14.540722656250011,42.244287109374994],[14.866113281250023,42.052539062499996],[15.16875,41.934033203125],[15.404980468750011,41.913232421874994],[15.964062500000011,41.939453125],[16.0615234375,41.928125],[16.164648437500006,41.89619140625],[16.18916015625001,41.814013671874996],[16.151269531250023,41.75849609375],[16.03369140625,41.70078125],[15.913769531250011,41.620849609375],[15.900488281250006,41.512060546875],[16.012597656250023,41.435400390625],[16.551855468750006,41.23203125],[17.103417968750023,41.062158203124994],[17.275195312500017,40.975439453125],[17.47421875,40.840576171875],[17.954980468750023,40.655175781249994],[18.0361328125,40.56494140625],[18.328222656250006,40.370849609375],[18.46064453125001,40.221044921875],[18.48583984375,40.104833984375],[18.42255859375001,39.986865234374996],[18.393457031250023,39.903613281249996],[18.34375,39.82138671875],[18.219335937500006,39.8525390625],[18.077929687500017,39.936962890625],[17.865039062500017,40.280175781249994],[17.476171875,40.31494140625],[17.395800781250017,40.340234375],[17.257714843750023,40.399072265624994],[17.249414062500023,40.437890625],[17.21533203125,40.48642578125],[17.179980468750017,40.502783203125],[17.03125,40.513476562499996],[16.92822265625,40.458056640624996],[16.807031250000023,40.326464843749996],[16.66962890625001,40.13720703125],[16.52998046875001,39.859667968749996],[16.521875,39.74755859375],[16.597753906250006,39.638916015625],[16.824316406250006,39.5783203125],[16.99921875000001,39.481591796874994],[17.114550781250017,39.380615234375],[17.122949218750023,39.136572265625],[17.174609375000017,38.998095703124996],[17.098535156250023,38.919335937499994],[16.951464843750017,38.939794921875],[16.75546875,38.889697265624996],[16.61669921875,38.800146484375],[16.558984375000023,38.714794921875],[16.57421875,38.493554687499994],[16.54560546875001,38.409082031249994],[16.28242187500001,38.249560546874996],[16.144140625,38.086376953125],[16.109765625000023,38.01865234375],[16.05683593750001,37.941845703125],[15.724511718750023,37.939111328124994],[15.645800781250017,38.034228515624996],[15.64306640625,38.175390625],[15.7001953125,38.2623046875],[15.822363281250006,38.302978515625],[15.90478515625,38.48349609375],[15.87890625,38.613916015624994],[15.926953125000011,38.671728515625],[15.972363281250011,38.71259765625],[16.065527343750006,38.73642578125],[16.19677734375,38.759228515625],[16.2099609375,38.94111328125],[16.107421875,39.023828125],[16.07148437500001,39.139453125],[16.02363281250001,39.35361328125],[15.854394531250023,39.626513671874996],[15.763671875,39.870068359375],[15.692773437500023,39.990185546875],[15.585156250000011,40.05283203125],[15.390917968750017,40.052148437499994],[15.29453125,40.07001953125],[14.950878906250011,40.239013671875],[14.926953125000011,40.26474609375],[14.929101562500023,40.3095703125],[14.986132812500017,40.377490234374996],[14.947656250000023,40.4693359375],[14.906933593750011,40.556054687499994],[14.839550781250011,40.62998046875],[14.765722656250006,40.668408203125],[14.611230468750023,40.644775390625],[14.556933593750017,40.626416015625],[14.459375,40.632714843749994],[14.382714843750023,40.599853515625],[14.339941406250006,40.598828125],[14.460546875,40.7287109375],[14.428125,40.759326171874996],[14.308886718750017,40.812646484374994],[14.147167968750011,40.820703125],[14.102343750000017,40.8271484375],[14.075878906250011,40.7939453125],[14.044335937500023,40.812255859375],[14.047656250000017,40.8703125],[13.859765625000023,41.12998046875],[13.7333984375,41.235644531249996],[13.669726562500017,41.2544921875],[13.554785156250006,41.232177734375],[13.361914062500006,41.278515625],[13.246875,41.288867187499996],[13.183398437500017,41.277685546875],[13.088671875000017,41.24384765625],[13.041015625,41.2662109375],[13.024218750000017,41.300927734374994],[12.84921875,41.408740234374996],[12.630859375,41.469677734375],[12.205664062500006,41.812646484374994],[12.075292968750006,41.940869140625],[11.807031250000023,42.08203125],[11.637304687500006,42.287548828125],[11.498437500000023,42.362939453124994],[11.296289062500023,42.423291015625],[11.249707031250011,42.41572265625],[11.188867187500023,42.393115234374996],[11.141210937500006,42.389892578125],[11.103222656250011,42.4166015625],[11.141796875000011,42.444091796875],[11.184765625000011,42.456591796874996],[11.167773437500017,42.53515625],[10.937792968750017,42.738720703125],[10.803125,42.804296875],[10.76513671875,42.844677734375],[10.737109375000017,42.899951171874996],[10.708398437500023,42.936328125],[10.644628906250006,42.957177734374994],[10.590234375000023,42.95361328125],[10.514843750000011,42.967529296875],[10.517285156250011,43.06513671875],[10.532324218750006,43.14013671875],[10.520800781250017,43.20380859375],[10.447558593750017,43.37119140625],[10.320507812500011,43.513085937499994],[10.245800781250011,43.852099609374996],[10.188085937500006,43.947509765625],[10.047656250000017,44.019970703125],[9.730859375000023,44.101171875],[9.289355468750017,44.319238281249994],[9.195996093750011,44.322998046875],[8.930371093750011,44.407763671874996],[8.765820312500011,44.422314453125],[8.551953125000011,44.346142578125],[8.292382812500023,44.136523437499996],[8.081640625,43.9189453125],[8.004980468750006,43.876757812499996],[7.733300781250023,43.802587890625],[7.4931640625,43.767138671874996],[7.261523437500017,43.69609375],[7.181445312500017,43.659130859375],[6.86474609375,43.438330078125],[6.716601562500017,43.373583984374996],[6.687402343750023,43.3345703125],[6.6572265625,43.261669921875],[6.570214843750023,43.199072265625],[6.494042968750023,43.169287109375],[6.305371093750011,43.138720703124996],[6.115917968750011,43.07236328125],[6.030566406250017,43.100976562499994],[5.809472656250023,43.097900390625],[5.671582031250011,43.17783203125],[5.406542968750017,43.228515625],[5.320214843750023,43.344921875],[5.199511718750017,43.352490234375],[5.120410156250017,43.348974609375],[5.073144531250023,43.366601562499994],[5.060839843750017,43.406298828124996],[5.059765625000011,43.44453125],[4.975976562500023,43.426953125],[4.911914062500017,43.426953125],[4.873730468750011,43.41162109375],[4.843554687500017,43.393945312499994],[4.807910156250017,43.405224609375],[4.787207031250006,43.401416015624996],[4.7890625,43.37890625],[4.712109375000011,43.373291015625],[4.628710937500017,43.387109375],[4.409765625,43.447216796875],[4.376171875000011,43.456396484375],[4.22421875,43.479638671874994],[4.162792968750011,43.503662109375],[4.113085937500017,43.563037109374996],[4.075097656250023,43.581835937499996],[4.052636718750023,43.593066406249996],[3.910839843750011,43.5630859375],[3.861621093750017,43.516357421875],[3.784765625,43.46162109375],[3.258886718750006,43.193212890625],[3.162890625000017,43.08076171875],[3.0517578125,42.91513671875],[3.043066406250006,42.837890625],[3.090917968750006,42.590869140624996],[3.197851562500006,42.461181640625],[3.21142578125,42.43115234375],[3.23984375,42.36787109375],[3.287890625000017,42.343701171875],[3.306738281250006,42.288964843749994],[3.218652343750023,42.2603515625],[3.166406250000023,42.256494140624994],[3.150390625,42.162451171875],[3.175195312500023,42.135986328125],[3.224609375,42.111132812499996],[3.238085937500017,42.0822265625],[3.248046875,41.944238281249994],[3.146875,41.86103515625],[3.0048828125,41.767431640625],[2.310937500000023,41.46650390625],[2.145605468750006,41.320751953125],[2.082617187500006,41.287402343749996],[1.566601562500011,41.195605468749996],[1.205859375000017,41.097558593749994],[1.032910156250011,41.062060546874996],[0.81689453125,40.8916015625],[0.714648437500017,40.8228515625],[0.796093750000011,40.80380859375],[0.89111328125,40.72236328125],[0.859179687500017,40.68623046875],[0.720605468750023,40.63046875],[0.660058593750023,40.613330078124996],[0.627148437500011,40.622216796874994],[0.596093750000023,40.614501953125],[0.363671875000023,40.31904296875],[0.158398437500011,40.106591796874994],[0.043066406250006,40.013964843749996],[-0.075146484374983,39.875927734375],[-0.327001953124977,39.519873046875],[-0.328955078124977,39.41708984375],[-0.204931640624977,39.06259765625],[-0.1337890625,38.969482421875],[-0.034130859374983,38.8912109375],[0.154882812500006,38.824658203125],[0.201562500000023,38.759179687499994],[0.136328125,38.69677734375],[-0.052734375,38.585693359375],[-0.38125,38.43564453125],[-0.520800781249989,38.317285156249994],[-0.550683593749994,38.203125],[-0.646777343749989,38.15185546875],[-0.683203124999977,37.992041015625],[-0.741552734374977,37.886132812499994],[-0.752734374999989,37.850244140624994],[-0.814648437499983,37.769921875],[-0.823095703124977,37.71162109375],[-0.721582031249994,37.6310546875],[-0.771875,37.596240234374996],[-0.822167968749994,37.58076171875],[-0.938085937499977,37.571337890624996],[-1.327539062499994,37.5611328125],[-1.640966796874977,37.386962890625],[-1.797607421875,37.232861328125],[-1.939306640624977,36.945849609374996],[-2.111523437499983,36.776660156249996],[-2.187695312499983,36.745458984375],[-2.305566406249994,36.81982421875],[-2.452832031249983,36.83115234375],[-2.595703125,36.806494140625],[-2.670605468749983,36.74755859375],[-2.787548828124983,36.714746093749994],[-2.90185546875,36.7431640625],[-3.149169921875,36.75849609375],[-3.259130859374977,36.755761718749994],[-3.43125,36.707910156249994],[-3.578808593749983,36.73984375],[-3.827783203124994,36.7560546875],[-4.366845703124994,36.718115234375],[-4.434863281249989,36.700244140624996],[-4.502246093749989,36.629150390625],[-4.674121093749989,36.5064453125],[-4.935302734375,36.50205078125],[-5.171484374999977,36.423779296875],[-5.230517578124989,36.3736328125],[-5.329687499999977,36.235742187499994],[-5.360937499999977,36.134912109374994],[-5.381591796875,36.134082031249996],[-5.4072265625,36.15888671875],[-5.443603515625,36.1505859375],[-5.4625,36.073779296874996],[-5.55126953125,36.038818359375],[-5.62548828125,36.025927734374996],[-5.808398437499989,36.088330078125],[-5.960693359375,36.18173828125],[-6.040673828124994,36.188427734375],[-6.170458984374989,36.333789062499996],[-6.226269531249983,36.42646484375],[-6.265917968749989,36.526513671874994],[-6.257714843749994,36.56484375],[-6.268945312499994,36.596728515624996],[-6.384130859374977,36.637011718749996],[-6.412255859374994,36.728857421875],[-6.328320312499983,36.84814453125],[-6.259423828124994,36.898974609374996],[-6.216796875,36.91357421875],[-6.320947265624994,36.908496093749996],[-6.396191406249983,36.831640625],[-6.492431640625,36.954638671874996],[-6.884619140624977,37.194238281249994],[-6.859375,37.249169921874994],[-6.86376953125,37.27890625],[-6.929492187499989,37.21494140625],[-6.974658203124989,37.1984375],[-7.174951171874994,37.208789062499996],[-7.406152343749994,37.179443359375],[-7.493603515624983,37.168310546875],[-7.834130859374994,37.005712890625],[-7.939697265625,37.005419921874996],[-8.136767578124989,37.077050781249994],[-8.484326171874983,37.100048828125],[-8.59765625,37.121337890625],[-8.739111328124977,37.074609375],[-8.848437499999989,37.07568359375],[-8.935351562499989,37.016015625],[-8.997802734375,37.032275390624996],[-8.92626953125,37.166064453124996],[-8.814160156249983,37.430810546874994],[-8.818554687499983,37.592431640624994],[-8.791845703124977,37.7328125],[-8.82265625,37.871875],[-8.878955078124989,37.95869140625],[-8.80224609375,38.183837890625],[-8.8109375,38.299755859375],[-8.881103515625,38.446679687499994],[-8.668310546874977,38.42431640625],[-8.733984374999977,38.482421875],[-8.798876953124989,38.5181640625],[-8.861621093749989,38.5099609375],[-8.914794921875,38.512109375],[-9.095996093749989,38.455224609374994],[-9.186718749999983,38.43818359375],[-9.21328125,38.448095703125],[-9.203369140625,38.538964843749994],[-9.250390625,38.65673828125],[-9.177832031249977,38.687792968749996],[-9.093310546874989,38.696679687499994],[-9.021484375,38.746875],[-8.97705078125,38.8029296875],[-9.00048828125,38.90302734375],[-8.938085937499977,38.998095703124996],[-8.791601562499977,39.078173828124996],[-8.867480468749989,39.065966796874996],[-8.954296874999983,39.016064453125],[-9.091015624999983,38.83466796875],[-9.135791015624989,38.7427734375],[-9.252294921874977,38.712792968749994],[-9.356738281249989,38.697900390624994],[-9.410205078124989,38.70751953125],[-9.47412109375,38.730859375],[-9.479736328125,38.798779296875],[-9.474755859374994,38.852929687499994],[-9.431445312499989,38.96044921875],[-9.414355468749989,39.112109375],[-9.352832031249989,39.24814453125],[-9.357226562499989,39.28427734375],[-9.374755859375,39.33828125],[-9.319628906249989,39.39111328125],[-9.251416015624983,39.426025390625],[-9.148291015624977,39.542578125],[-9.004052734374994,39.820556640625],[-8.837841796874983,40.115673828125],[-8.851318359375,40.151806640625],[-8.886621093749994,40.179443359375],[-8.872656249999977,40.259082031249996],[-8.772412109374983,40.6056640625],[-8.731591796874994,40.650927734374996],[-8.684619140624989,40.7525390625],[-8.673974609374994,40.91650390625],[-8.655566406249989,41.0294921875],[-8.659814453124994,41.086279296875],[-8.674609374999989,41.1544921875],[-8.738378906249977,41.28466796875],[-8.8056640625,41.560009765625],[-8.810839843749989,41.651953125],[-8.755419921874989,41.698388671874994],[-8.846386718749983,41.70517578125],[-8.887597656249994,41.764599609375],[-8.878222656249989,41.832080078124996],[-8.777148437499989,41.941064453124994],[-8.852343749999989,41.926904296874994],[-8.878320312499994,41.946875],[-8.88720703125,42.105273437499996],[-8.7724609375,42.210595703124994],[-8.69091796875,42.274169921875],[-8.729199218749983,42.287011718749994],[-8.815820312499994,42.28525390625],[-8.809960937499994,42.33447265625],[-8.769384765624977,42.358154296875],[-8.730029296874989,42.41171875],[-8.776171874999989,42.434814453125],[-8.812109374999977,42.470068359375],[-8.809912109374977,42.562353515625],[-8.799902343749977,42.599902343749996],[-8.8115234375,42.64033203125],[-8.98779296875,42.58564453125],[-9.033105468749994,42.59384765625],[-9.035058593749994,42.662353515625],[-8.937207031249983,42.76669921875],[-8.927197265624983,42.798583984375],[-9.041601562499977,42.814013671874996],[-9.127197265625,42.865234375],[-9.179443359375,42.910986328125],[-9.235205078124977,42.976904296875],[-9.235644531249989,43.035791015624994],[-9.178076171874977,43.1740234375],[-9.095556640624977,43.214208984375],[-9.024511718749977,43.23896484375],[-8.873681640624994,43.334423828125],[-8.66562,43.3166015625],[-8.537060546874983,43.337060546874994],[-8.421582031249983,43.38583984375],[-8.35546875,43.396826171875],[-8.248925781249994,43.439404296875],[-8.252294921874977,43.496923828125],[-8.288867187499989,43.539599609374996],[-8.256738281249994,43.579882812499996],[-8.137158203124983,43.629052734374994],[-8.004687499999989,43.694384765624996],[-7.852734374999983,43.706982421875],[-7.698144531249994,43.764550781249994],[-7.594580078124977,43.72734375],[-7.503613281249983,43.73994140625],[-7.399316406249994,43.69580078125],[-7.261962890625,43.594628906249994],[-7.060986328124983,43.553955078125],[-6.900683593749989,43.58564453125],[-6.617285156249977,43.5923828125],[-6.475683593749977,43.57890625],[-6.22412109375,43.603857421875],[-6.080126953124989,43.594921875],[-5.8466796875,43.645068359374996],[-5.665820312499989,43.582470703125],[-5.315722656249989,43.553173828125],[-5.105273437499989,43.501855468749994],[-4.523046874999977,43.41572265625],[-4.312792968749989,43.41474609375],[-4.015332031249983,43.4630859375],[-3.889355468749983,43.499414062499994],[-3.774023437499977,43.477880859375],[-3.604638671874994,43.519482421875],[-3.523632812499983,43.511035156249996],[-3.417871093749994,43.451708984374996],[-3.045605468749983,43.37158203125],[-2.947705078124983,43.439697265625],[-2.875048828124989,43.454443359375],[-2.607080078124994,43.412744140624994],[-2.337109374999983,43.328027343749994],[-2.196679687499994,43.321923828124994],[-1.991308593749977,43.345068359375],[-1.828515625,43.400830078125],[-1.794042968749977,43.40732421875],[-1.631445312499977,43.438037109374996],[-1.48486328125,43.563769531249996],[-1.345996093749989,44.02021484375],[-1.245507812499994,44.559863281249996],[-1.170800781249994,44.66181640625],[-1.076953124999989,44.68984375],[-1.152880859374989,44.764013671875],[-1.200390624999983,44.726464843749994],[-1.220312499999977,44.68662109375],[-1.245214843749977,44.66669921875],[-1.189062499999977,45.161474609375],[-1.149072265624994,45.342626953125],[-1.081005859374983,45.532421875],[-0.941748046874977,45.457080078124996],[-0.826318359374994,45.380664062499996],[-0.766650390624989,45.314355468749994],[-0.691113281249983,45.09345703125],[-0.633984374999983,45.047119140625],[-0.548486328124994,45.0005859375],[-0.582275390625,45.0513671875],[-0.64111328125,45.090185546875],[-0.733105468749983,45.384619140625],[-0.790771484375,45.468017578125],[-0.880664062499989,45.53818359375],[-1.169970703124989,45.6859375],[-1.195996093749983,45.714453125],[-1.2099609375,45.770898437499994],[-1.114355468749977,45.768505859375],[-1.03173828125,45.741064453125],[-1.04150390625,45.77265625],[-1.066015624999977,45.8056640625],[-1.104394531249994,45.925341796874996],[-1.136376953124994,46.204833984375],[-1.132031249999983,46.252685546875],[-1.146289062499989,46.311376953125],[-1.238818359374989,46.324511718749996],[-1.312792968749989,46.326904296875],[-1.392480468749994,46.35009765625],[-1.786523437499994,46.51484375],[-1.921435546874989,46.684814453125],[-2.05937,46.810302734375],[-2.092480468749983,46.865039062499996],[-2.090283203124983,46.9205078125],[-2.018896484374977,47.037646484374996],[-2.081933593749994,47.111621093749996],[-2.1435546875,47.126318359375],[-2.197070312499989,47.162939453125],[-2.148583984374994,47.223925781249996],[-2.108300781249994,47.262939453125],[-2.027587890625,47.273583984374994],[-1.921728515624977,47.260644531249994],[-1.8212890625,47.225341796875],[-1.742529296874977,47.215966796874994],[-1.975390624999989,47.310693359374994],[-2.35302734375,47.278759765625],[-2.434423828124977,47.290966796875],[-2.50312,47.312060546874996],[-2.530029296875,47.381591796875],[-2.476318359375,47.412939453125],[-2.427685546874983,47.4708984375],[-2.482714843749989,47.511621093749994],[-2.554052734374977,47.52705078125],[-2.665917968749994,47.526171875],[-2.770312499999989,47.5138671875],[-2.796777343749994,47.537255859374994],[-2.733105468749983,47.601806640625],[-2.787207031249977,47.625537109374996],[-2.859375,47.614453125],[-2.964062499999983,47.60107421875],[-3.064208984375,47.621337890625],[-3.158837890624994,47.694677734375],[-3.221582031249994,47.694140625],[-3.264697265624989,47.685107421874996],[-3.32861328125,47.713330078125],[-3.395898437499994,47.72041015625],[-3.443945312499977,47.71103515625],[-3.5078125,47.753125],[-3.900927734374989,47.837548828124994],[-4.070703125,47.8478515625],[-4.226416015624977,47.809619140624996],[-4.312109374999977,47.822900390624994],[-4.375097656249977,47.87744140625],[-4.427978515625,47.9689453125],[-4.678808593749977,48.039501953125],[-4.629199218749989,48.085791015625],[-4.512402343749983,48.096728515624996],[-4.377832031249994,48.128808593749994],[-4.329443359374977,48.169970703124996],[-4.434619140624989,48.21796875],[-4.51220703125,48.229736328125],[-4.544335937499994,48.246972656249994],[-4.5771484375,48.2900390625],[-4.530664062499994,48.309716796874994],[-4.497900390624977,48.299267578125],[-4.4033203125,48.29306640625],[-4.241406249999983,48.303662109375],[-4.3017578125,48.347070312499994],[-4.364404296874994,48.356738281249996],[-4.393164062499977,48.367626953125],[-4.524804687499994,48.372314453125],[-4.584716796875,48.35751953125],[-4.719384765624994,48.363134765625],[-4.74853515625,48.410009765625],[-4.7625,48.450244140624996],[-4.720751953124989,48.539892578125],[-4.531201171874983,48.619970703125],[-4.058886718749989,48.70751953125],[-3.855664062499983,48.694726562499994],[-3.714794921874983,48.710498046874996],[-3.545996093749977,48.765673828124996],[-3.471484374999989,48.812939453125],[-3.2314453125,48.8408203125],[-3.003222656249989,48.790673828124994],[-2.792871093749994,48.60107421875],[-2.692333984374983,48.53681640625],[-2.446191406249994,48.648291015625],[-2.079443359374977,48.64501953125],[-2.003710937499989,48.582080078124996],[-1.97314453125,48.635107421875],[-1.905712890624983,48.697119140625],[-1.851953125,48.668847656249994],[-1.82470703125,48.630517578124994],[-1.437646484374994,48.64140625],[-1.37646484375,48.652587890625],[-1.48046875,48.697607421875],[-1.565478515624989,48.805517578125],[-1.583105468749977,49.202392578125],[-1.690332031249994,49.31318359375],[-1.813427734374983,49.490136718749994],[-1.870068359374983,49.595117187499994],[-1.875390625,49.631396484374996],[-1.8564453125,49.6837890625],[-1.705126953124989,49.680957031249996],[-1.588232421874977,49.66767578125],[-1.36572265625,49.707275390625],[-1.258642578124977,49.68017578125],[-1.264941406249989,49.5982421875],[-1.232275390624977,49.494873046875],[-1.194970703124994,49.44482421875],[-1.138525390624977,49.387890625],[-0.959130859374994,49.3931640625],[-0.765527343749994,49.359716796875],[-0.520898437499994,49.354541015624996],[-0.163476562499994,49.296777343749994],[-0.011181640624983,49.330224609374994],[0.136132812500023,49.401513671874994],[0.416894531250023,49.448388671874994],[0.439257812500017,49.473193359374996],[0.277636718750017,49.46328125],[0.12939453125,49.508447265624994],[0.109375,49.557519531249994],[0.1265625,49.6015625],[0.186718750000011,49.703027343749994],[0.6162109375,49.862939453124994],[0.924121093750017,49.910205078124996],[1.245507812500023,49.9982421875],[1.4072265625,50.088525390624994],[1.514062500000023,50.205078125],[1.5484375,50.230712890625],[1.5927734375,50.252197265625],[1.551562500000017,50.2939453125],[1.579492187500023,50.7392578125],[1.609570312500011,50.819482421874994],[1.672265625000023,50.885009765625],[1.767675781250006,50.935693359374994],[1.9125,50.990625],[2.445703125000023,51.06650390625],[2.52490234375,51.097119140625],[2.960156250000011,51.265429687499996],[3.225195312500006,51.351611328124996],[3.35009765625,51.377685546875],[3.42578125,51.393505859375],[3.589453125,51.3994140625],[3.716503906250011,51.369140625],[3.883398437500006,51.3544921875],[4.011035156250017,51.395947265625],[4.111523437500011,51.360644531249996],[4.226171875,51.386474609375],[4.138867187500011,51.401513671874994],[4.006542968750011,51.443212890625],[3.821875,51.409375],[3.693554687500011,51.44990234375],[3.5869140625,51.45390625],[3.5205078125,51.486181640625],[3.448925781250011,51.540771484375],[3.499609375,51.57666015625],[3.548632812500017,51.589111328125],[3.743945312500017,51.596044921875],[3.886035156250017,51.57421875],[4.141308593750011,51.45576171875],[4.205761718750011,51.456689453124994],[4.274121093750011,51.471630859375],[4.239355468750006,51.50390625],[4.175488281250011,51.519287109375],[4.080468750000023,51.551123046875],[4.004785156250023,51.595849609374994],[4.1826171875,51.610302734375],[4.158007812500017,51.633447265625],[4.134570312500017,51.672900390624996],[3.946875,51.810546875],[3.978906250000023,51.847802734375],[4.026074218750011,51.927734375],[4.084863281250023,51.994091796875],[4.131738281250023,52.0119140625],[4.208789062500017,52.058984375],[4.376269531250017,52.196826171874996],[4.482812500000023,52.3091796875],[4.562109375,52.442578125],[4.678320312500006,52.809765625],[4.712695312500017,52.872119140624996],[4.76875,52.94130859375],[4.839062500000011,52.928271484374996],[4.887988281250017,52.908349609375],[5.061230468750011,52.96064453125],[5.3583984375,53.096484375],[5.445996093750011,53.2140625],[5.532031250000017,53.268701171875],[5.87353515625,53.3751953125],[6.062207031250011,53.407080078125],[6.353222656250011,53.415283203125],[6.563574218750006,53.43427734375],[6.816210937500017,53.441162109375],[6.912402343750017,53.375390625],[6.968164062500023,53.327294921875],[7.058007812500023,53.300585937499996],[7.197265625,53.282275390624996],[7.152050781250011,53.326953125],[7.053320312500006,53.375830078125],[7.074316406250006,53.47763671875],[7.107128906250011,53.556982421875],[7.206445312500023,53.654541015625],[7.285253906250006,53.68134765625],[7.629199218750017,53.697265625],[8.00927734375,53.690722656249996],[8.167089843750006,53.543408203125],[8.108496093750006,53.46767578125],[8.20078125,53.432421875],[8.245214843750006,53.4453125],[8.279003906250011,53.511181640625],[8.301562500000017,53.584130859375],[8.333886718750023,53.606201171875],[8.451367187500011,53.551708984375],[8.49267578125,53.51435546875],[8.495214843750006,53.39423828125],[8.538476562500023,53.556884765625],[8.50625,53.670751953125],[8.528417968750006,53.781103515625],[8.575585937500023,53.8384765625],[8.618945312500017,53.875],[8.897753906250017,53.835693359375],[9.20556640625,53.85595703125],[9.321972656250011,53.8134765625],[9.585351562500023,53.60048828125],[9.673144531250017,53.565625],[9.783984375000017,53.554638671875],[9.63125,53.6001953125],[9.31201171875,53.859130859375],[9.21640625,53.8912109375],[9.069628906250017,53.900927734374996],[8.978125,53.926220703125],[8.92041015625,53.96533203125],[8.903515625000011,54.000292968749996],[8.906640625000023,54.260791015624996],[8.8515625,54.299560546875],[8.780371093750006,54.313037109374996],[8.736035156250011,54.295214843749996],[8.644921875000023,54.294970703124996],[8.625781250000017,54.353955078125],[8.648046875,54.39765625],[8.831152343750006,54.427539062499996],[8.951855468750011,54.467578125],[8.957226562500011,54.538330078125],[8.880957031250006,54.5939453125],[8.789648437500006,54.695947265625],[8.682324218750011,54.791845703125],[8.661425781250017,54.9859375],[8.63828125,55.045556640625],[8.572949218750011,55.13427734375],[8.669824218750023,55.1556640625],[8.651074218750011,55.328564453125],[8.615917968750011,55.418212890625],[8.3453125,55.510302734374996],[8.132128906250017,55.5998046875],[8.181347656250011,55.901171875],[8.202343750000011,55.982373046875],[8.121484375000023,56.139892578125],[8.1298828125,56.32119140625],[8.163964843750023,56.606884765625],[8.231738281250017,56.61806640625],[8.281445312500011,56.61669921875],[8.47314453125,56.5654296875],[8.552929687500011,56.560302734375],[8.607617187500011,56.514501953125],[8.671679687500017,56.495654296874996],[8.718066406250017,56.544287109375],[8.736132812500017,56.62744140625],[8.888085937500023,56.73505859375],[8.994531250000023,56.7748046875],[9.067089843750011,56.79384765625],[9.140332031250011,56.750439453125],[9.196386718750006,56.70166015625],[9.209667968750011,56.808398437499996],[9.2548828125,57.01171875],[9.110449218750006,57.04365234375],[8.992773437500006,57.01611328125],[8.876074218750006,56.887255859374996],[8.77197265625,56.72529296875],[8.603125,56.710400390625],[8.468359375,56.66455078125],[8.3466796875,56.712109375],[8.268261718750011,56.75400390625],[8.266308593750011,56.81533203125],[8.284082031250023,56.85234375],[8.427050781250017,56.984423828124996],[8.618554687500023,57.111279296875],[8.8115234375,57.11005859375],[8.952246093750006,57.1505859375],[9.036328125000011,57.155419921875],[9.298828125,57.146533203124996],[9.43359375,57.17431640625],[9.554296875,57.232470703124996],[9.815136718750011,57.47841796875],[9.962304687500023,57.58095703125],[10.259082031250017,57.617041015625],[10.533300781250006,57.735400390624996],[10.609960937500006,57.7369140625],[10.48095703125,57.648681640625],[10.460253906250017,57.614550781249996],[10.444628906250017,57.56220703125],[10.537109375,57.448535156249996],[10.517578125,57.379345703125],[10.524121093750011,57.243212890624996],[10.436914062500023,57.172265625],[10.338476562500006,57.021337890625],[10.296093750000011,56.99912109375],[10.287011718750023,56.82294921875],[10.296679687500017,56.780908203125],[10.28271484375,56.6205078125],[10.383593750000017,56.554833984375],[10.490234375,56.5205078125],[10.845898437500011,56.521728515625],[10.8828125,56.49287109375],[10.926171875000023,56.44326171875],[10.894433593750023,56.359033203125],[10.8564453125,56.2955078125],[10.75341796875,56.241992187499996],[10.621191406250006,56.202099609375],[10.538964843750023,56.200341796875],[10.426953125000011,56.276171875],[10.373730468750011,56.2515625],[10.31875,56.212890625],[10.226660156250006,56.00537109375],[10.183007812500023,55.865185546875],[10.159375,55.853808593749996],[10.107324218750023,55.874462890625],[10.017382812500017,55.87607421875],[9.903710937500023,55.842822265624996],[9.962011718750006,55.8130859375],[10.023632812500011,55.76142578125],[9.9990234375,55.735546875],[9.899023437500006,55.707568359374996],[9.810351562500017,55.6509765625],[9.773242187500017,55.608154296875],[9.661425781250017,55.557470703125],[9.591113281250017,55.493212890624996],[9.625585937500006,55.41357421875],[9.640234375,55.34365234375],[9.670996093750006,55.26640625],[9.643261718750011,55.204736328125],[9.504785156250023,55.116259765624996],[9.453710937500006,55.03955078125],[9.572363281250006,55.04052734375],[9.645410156250023,55.022802734375],[9.688183593750011,55.000146484375],[9.732324218750023,54.968017578125],[9.705273437500011,54.9283203125],[9.745898437500017,54.807177734374996],[9.892285156250011,54.780615234375],[9.953808593750011,54.73828125],[10.022167968750011,54.67392578125],[10.02880859375,54.581298828125],[9.941308593750023,54.5146484375],[9.86865234375,54.472460937499996],[10.143457031250023,54.488427734375],[10.170800781250023,54.4501953125],[10.21240234375,54.408935546875],[10.360449218750006,54.438330078125],[10.731542968750006,54.316259765625],[10.955957031250023,54.37568359375],[11.013378906250011,54.379150390625],[11.064355468750023,54.280517578125],[11.008593750000017,54.18115234375],[10.810742187500011,54.075146484375],[10.854589843750006,54.009814453124996],[10.917773437500017,53.9953125],[11.104296875000017,54.0091796875],[11.399609375000011,53.944628906249996],[11.461132812500011,53.96474609375],[11.700585937500023,54.113525390625],[11.796289062500023,54.145458984375],[12.111328125,54.168310546875],[12.168652343750011,54.225878906249996],[12.296289062500023,54.2837890625],[12.378515625,54.347021484375],[12.575390625000011,54.4673828125],[12.779101562500017,54.445703125],[12.898046875,54.42265625],[13.028613281250017,54.41103515625],[13.1474609375,54.28271484375],[13.448046875000017,54.140869140625],[13.72421875,54.15322265625],[13.822265625,54.01904296875],[13.865527343750017,53.853369140625],[13.950390625000011,53.8013671875],[14.025,53.767431640625],[14.25,53.731884765625],[14.487597656250017,53.671875],[14.58349609375,53.63935546875],[14.571582031250017,53.67587890625],[14.552148437500023,53.707324218749996],[14.56494140625,53.753515625],[14.558398437500017,53.823193359375],[14.350878906250017,53.858740234375],[14.172167968750017,53.874365234375],[14.04833984375,53.863085937499996],[13.92578125,53.879052734375],[13.902148437500017,53.93896484375],[13.921679687500017,53.996630859374996],[13.872460937500023,54.036279296875],[13.8271484375,54.0595703125],[13.820410156250006,54.092822265624996],[13.827734375,54.127246093749996],[14.038867187500017,54.0345703125],[14.21142578125,53.950341796875],[14.249316406250017,53.931933593749996],[14.384179687500023,53.92470703125],[14.715722656250023,54.018310546875],[15.288378906250017,54.139892578125],[15.9,54.253955078124996],[16.042773437500017,54.266357421875],[16.186328125000017,54.290380859375],[16.239355468750006,54.333056640624996],[16.292285156250017,54.361621093749996],[16.375585937500006,54.436865234375],[16.55976562500001,54.55380859375],[16.88544921875001,54.59638671875],[17.00703125000001,54.65185546875],[17.26191406250001,54.729541015624996],[17.84296875000001,54.816699218749996],[18.08564453125001,54.83583984375],[18.32343750000001,54.838183593749996],[18.53515625,54.76943359375],[18.75927734375,54.6845703125],[18.799609375000017,54.633349609374996],[18.678320312500006,54.665283203125],[18.5015625,54.741503906249996],[18.43623046875001,54.7447265625],[18.58710937500001,54.512890625],[18.66962890625001,54.430908203125],[18.83642578125,54.369580078125],[18.97626953125001,54.348925781249996],[19.407128906250023,54.386083984375],[19.56015625,54.434619140624996],[19.604394531250023,54.4591796875],[19.75849609375001,54.54482421875],[19.85888671875,54.633837890624996],[19.944140625000017,54.75],[19.953222656250006,54.83046875],[19.974511718750023,54.921191406249996],[20.10761718750001,54.956494140625],[20.39667968750001,54.95126953125],[20.520312500000017,54.994873046875],[20.67890625000001,55.10263671875],[20.845703125,55.23203125],[20.899804687500023,55.286669921874996],[21.014062500000023,55.401953125],[21.0576171875,55.476806640625],[21.087890625,55.58310546875],[21.11484375,55.616503906249996],[21.11572265625,55.568164062499996],[21.103906250000023,55.487744140625],[21.03173828125,55.35048828125],[20.859375,55.183642578124996],[20.594824218750006,54.982373046875],[20.677734375,54.9556640625],[20.774023437500006,54.947021484375],[20.8875,54.909472656249996],[20.995898437500017,54.902685546875],[21.188867187500023,54.935205078125],[21.22285156250001,55.107763671875],[21.236328125,55.27119140625],[21.201074218750023,55.343798828124996],[21.237890625,55.455029296875],[21.17109375000001,55.617724609374996],[21.061914062500023,55.813427734375],[21.053808593750006,56.02294921875],[21.04609375000001,56.070068359375],[21.014941406250017,56.258935546875],[21.03144531250001,56.636572265625],[21.0712890625,56.82373046875],[21.257421875,56.932763671875],[21.35078125000001,57.01767578125],[21.405078125000017,57.131005859375],[21.421484375,57.23583984375],[21.45917968750001,57.3224609375],[21.72871093750001,57.57099609375],[21.9423828125,57.5978515625],[22.2314453125,57.666796875],[22.554589843750023,57.724267578125],[22.616992187500017,57.651171875],[22.64863281250001,57.595361328125],[23.03779296875001,57.39208984375],[23.136816406250006,57.323828125],[23.28730468750001,57.08974609375],[23.647753906250017,56.971044921875],[23.93115234375,57.00849609375],[24.054296875,57.06611328125],[24.28125,57.172314453125],[24.382617187500017,57.250048828124996],[24.403222656250023,57.325],[24.36298828125001,57.6453125],[24.301562500000017,57.784130859375],[24.322558593750017,57.87060546875],[24.33203125,57.909765625],[24.4638671875,58.10595703125],[24.4875,58.261621093749994],[24.535742187500006,58.2830078125],[24.549707031250023,58.304589843749994],[24.529101562500017,58.354248046875],[24.3921875,58.386083984375],[24.3369140625,58.381396484375],[24.287207031250006,58.328027343749994],[24.235644531250017,58.28955078125],[24.11484375,58.26611328125],[24.01093750000001,58.306640625],[23.767578125,58.36083984375],[23.7060546875,58.433007812499994],[23.691503906250006,58.505615234375],[23.562792968750017,58.575830078124994],[23.50927734375,58.658544921875],[23.530664062500023,58.716259765625],[23.6474609375,58.754150390625],[23.680761718750006,58.787158203125],[23.533593750000023,58.78193359375],[23.50361328125001,58.78984375],[23.497167968750006,58.81953125],[23.432031250000023,58.920654296875],[23.489648437500023,58.960498046875],[23.515039062500023,58.99921875],[23.4677734375,59.032177734375],[23.48017578125001,59.069677734375],[23.516992187500023,59.107568359374994],[23.494433593750017,59.195654296875],[23.640527343750023,59.242333984374994],[23.782519531250017,59.275146484375],[24.083398437500023,59.291894531249994],[24.053613281250023,59.372314453125],[24.175390625,59.375927734375],[24.38037109375,59.47265625],[24.58359375,59.4556640625],[24.877539062500006,59.5220703125],[25.44375,59.521142578124994],[25.520898437500023,59.559472656249994],[25.507421875,59.597998046875],[25.50927734375,59.639013671875],[25.61572265625,59.6275390625],[25.79375,59.634667968749994],[26.460839843750023,59.55390625],[26.625,59.55390625],[26.85205078125,59.47177734375],[26.974707031250006,59.450634765625],[27.335839843750023,59.45048828125],[27.892578125,59.414208984374994],[28.001855468750023,59.46982421875],[28.0125,59.484277343749994],[28.06396484375,59.55400390625],[28.046289062500023,59.64716796875],[28.013964843750017,59.724755859374994],[28.058007812500023,59.78154296875],[28.131152343750017,59.786523437499994],[28.2125,59.724658203125],[28.334570312500006,59.692529296874994],[28.423730468750023,59.73408203125],[28.453906250000017,59.8142578125],[28.518164062500006,59.849560546875],[28.603906250000023,59.81806640625],[28.74765625,59.806689453125],[28.86689453125001,59.811914062499994],[28.947265625,59.828759765624994],[28.981542968750006,59.85478515625],[29.01337890625001,59.9015625],[29.0791015625,59.960986328125],[29.147265625000017,59.999755859375],[29.669726562500017,59.9556640625],[30.12255859375,59.873583984375],[30.156835937500006,59.904296875],[30.172656250000017,59.95712890625],[30.059960937500023,60.002587890624994],[29.97675781250001,60.0263671875],[29.87226562500001,60.120849609375],[29.72119140625,60.1953125],[29.5693359375,60.20185546875],[29.370410156250017,60.175927734374994],[29.069140625000017,60.191455078125],[28.81269531250001,60.33154296875],[28.643164062500006,60.37529296875],[28.522265625000017,60.482958984375],[28.491601562500023,60.54013671875],[28.622460937500023,60.491601562499994],[28.64033203125001,60.542871093749994],[28.65058593750001,60.610986328124994],[28.57783203125001,60.6525390625],[28.512792968750006,60.677294921875],[28.179296875,60.57099609375],[27.797656250000017,60.5361328125],[27.761621093750023,60.532861328124994],[27.669335937500023,60.498974609375],[27.52509765625001,60.490771484375],[27.46240234375,60.46484375],[27.24189453125001,60.538671875],[27.20527343750001,60.54345703125],[27.075585937500023,60.525146484375],[26.951171875,60.471484375],[26.721484375000017,60.455078125],[26.607421875,60.4376953125],[26.53466796875,60.412890625],[26.51972656250001,60.471582031249994],[26.551171875000023,60.54599609375],[26.60175781250001,60.595605468749994],[26.6064453125,60.6279296875],[26.5693359375,60.624560546875],[26.49580078125001,60.551806640625],[26.456445312500023,60.466796875],[26.377734375000017,60.424072265625],[26.2046875,60.406591796875],[26.036035156250023,60.47490234375],[25.955957031250023,60.47421875],[26.00625,60.42529296875],[26.04023437500001,60.37158203125],[26.03583984375001,60.34150390625],[25.945898437500006,60.34677734375],[25.845800781250006,60.314599609374994],[25.75800781250001,60.267529296875],[25.715429687500006,60.267431640625],[25.65644531250001,60.333203125],[25.548242187500023,60.302490234375],[25.45576171875001,60.26123046875],[25.267871093750017,60.24833984375],[25.155859375,60.194091796875],[24.957617187500006,60.157470703125],[24.848730468750006,60.158349609374994],[24.600488281250023,60.1142578125],[24.517968750000023,60.046289062499994],[24.445605468750017,60.0212890625],[24.342578125000017,60.042333984375],[24.025195312500017,60.009179687499994],[23.721777343750006,59.965673828125],[23.592675781250023,59.968164062499994],[23.46357421875001,59.986230468749994],[23.326757812500006,59.92578125],[23.181445312500017,59.844921875],[23.021289062500017,59.816015625],[22.9638671875,59.8263671875],[23.009765625,59.868798828124994],[23.11572265625,59.9126953125],[23.1884765625,59.972216796875],[23.19843750000001,60.021826171875],[23.1484375,60.04130859375],[23.080175781250006,60.047265625],[22.994140625,60.098535156249994],[22.91171875,60.209716796875],[22.867089843750023,60.2158203125],[22.84443359375001,60.18662109375],[22.819140625000017,60.1013671875],[22.79345703125,60.076806640624994],[22.749804687500017,60.057275390624994],[22.697363281250006,60.03759765625],[22.64619140625001,60.02802734375],[22.462695312500017,60.029199218749994],[22.438574218750006,60.072265625],[22.438574218750006,60.090283203125],[22.471093750000023,60.14697265625],[22.442675781250017,60.156884765624994],[22.4697265625,60.201318359374994],[22.512988281250017,60.19892578125],[22.564257812500017,60.205517578125],[22.589941406250006,60.228369140625],[22.587988281250006,60.2556640625],[22.516699218750006,60.262744140625],[22.512304687500006,60.28134765625],[22.57587890625001,60.35908203125],[22.5849609375,60.38056640625],[22.560351562500017,60.385009765625],[22.5205078125,60.3765625],[22.257910156250006,60.400927734375],[21.933984375000023,60.50029296875],[21.854296875000017,60.505419921875],[21.805273437500006,60.594140625],[21.727148437500006,60.582910156249994],[21.61328125,60.53095703125],[21.52783203125,60.57041015625],[21.43603515625,60.59638671875],[21.41064453125,60.636962890625],[21.411914062500017,60.696826171875],[21.40400390625001,60.767431640625],[21.37890625,60.850048828125],[21.36054687500001,60.96748046875],[21.377734375000017,61.059228515624994],[21.450976562500017,61.1271484375],[21.479101562500006,61.1705078125],[21.513476562500017,61.281201171875],[21.52119140625001,61.41083984375],[21.501757812500017,61.454980468749994],[21.506640625000017,61.484326171875],[21.565039062500006,61.484326171875],[21.55234375,61.509521484375],[21.526660156250017,61.523291015625],[21.49824218750001,61.551953125],[21.5224609375,61.567138671875],[21.592382812500006,61.568212890625],[21.598046875000023,61.577880859375],[21.60595703125,61.591552734375],[21.551855468750006,61.666845703125],[21.54560546875001,61.702734375],[21.470507812500017,61.811669921874994],[21.384863281250006,61.914941406249994],[21.255957031250006,61.989648437499994],[21.301660156250023,62.112646484375],[21.35371093750001,62.223828125],[21.343359375,62.277392578125],[21.32343750000001,62.342578125],[21.165625,62.4140625],[21.1421875,62.514794921874994],[21.103613281250006,62.622949218749994],[21.1181640625,62.6892578125],[21.143847656250017,62.739990234375],[21.195703125000023,62.79052734375],[21.45751953125,62.95],[21.473535156250023,63.033251953125],[21.650976562500006,63.039306640625],[21.568652343750017,63.113720703125],[21.549218750000023,63.155517578125],[21.54511718750001,63.204296875],[21.800390625,63.237695312499994],[21.89570312500001,63.21025390625],[22.12031250000001,63.244140625],[22.319726562500023,63.310449218749994],[22.316210937500017,63.345654296875],[22.285546875000023,63.377197265625],[22.243261718750006,63.437939453125],[22.273242187500017,63.45478515625],[22.345996093750017,63.4423828125],[22.312597656250006,63.472558593749994],[22.318652343750017,63.50439453125],[22.398046875,63.491162109375],[22.527636718750017,63.579980468749994],[22.532324218750006,63.647851562499994],[22.75625,63.683349609375],[23.014453125000017,63.821826171875],[23.133593750000017,63.86494140625],[23.24873046875001,63.896142578124994],[23.493945312500017,64.03447265625],[23.598925781250017,64.04091796875],[23.652929687500006,64.1341796875],[23.861425781250006,64.258251953125],[23.9248046875,64.27412109375],[24.022265625000017,64.385986328125],[24.2783203125,64.515283203125],[24.440625,64.680126953125],[24.530175781250023,64.738671875],[24.557910156250017,64.801025390625],[24.657617187500023,64.806298828125],[24.74755859375,64.852099609375],[24.942187500000017,64.884033203125],[25.13427734375,64.8751953125],[25.214257812500023,64.853466796875],[25.288183593750006,64.8603515625],[25.28076171875,64.91640625],[25.22802734375,64.951025390625],[25.27109375,64.98427734375],[25.37265625,65.00947265625],[25.3623046875,65.06513671875],[25.340234375000023,65.0986328125],[25.255859375,65.14326171875],[25.2978515625,65.243212890625],[25.307910156250017,65.352734375],[25.34785156250001,65.479248046875],[25.241796875,65.5462890625],[24.83935546875,65.6603515625],[24.764257812500006,65.656396484375],[24.674902343750006,65.670703125],[24.58154296875,65.75712890625],[24.62324218750001,65.831689453125],[24.628027343750006,65.8591796875],[24.591601562500017,65.858349609375],[24.532617187500023,65.822021484375],[24.404296875,65.78046875],[24.2375,65.812353515625],[24.15546875000001,65.8052734375],[23.890527343750023,65.7822265625],[23.69140625,65.828515625],[23.592089843750017,65.805322265625],[23.418359375000023,65.804345703125],[23.221093750000023,65.7861328125],[23.154589843750017,65.74990234375],[23.102343750000017,65.7353515625],[22.919335937500023,65.786474609375],[22.74658203125,65.870947265625],[22.62031250000001,65.80654296875],[22.53857421875,65.7943359375],[22.465136718750017,65.85263671875],[22.400976562500006,65.862109375],[22.366308593750006,65.84267578125],[22.3359375,65.791162109375],[22.28759765625,65.750634765625],[22.275,65.725],[22.2666015625,65.621533203125],[22.254003906250006,65.59755859375],[22.086230468750017,65.6109375],[22.096289062500006,65.5837890625],[22.1328125,65.5701171875],[22.147558593750006,65.552880859375],[22.086718750000017,65.530224609375],[21.92011718750001,65.532373046875],[21.903125,65.508349609375],[21.95,65.470361328125],[21.913476562500023,65.437109375],[21.87958984375001,65.4240234375],[21.6806640625,65.403369140625],[21.565527343750006,65.40810546875],[21.532617187500023,65.386572265625],[21.5234375,65.35859375],[21.545214843750017,65.33115234375],[21.595996093750017,65.316552734375],[21.612695312500023,65.29912109375],[21.609179687500017,65.261376953125],[21.56689453125,65.254541015625],[21.446875,65.320849609375],[21.41035156250001,65.317431640625],[21.437792968750017,65.282958984375],[21.50634765625,65.245361328125],[21.545996093750006,65.206982421875],[21.580664062500006,65.160791015625],[21.57392578125001,65.12578125],[21.424902343750006,65.0126953125],[21.29375,64.941259765625],[21.195898437500006,64.876904296875],[21.13818359375,64.80869140625],[21.204980468750023,64.77431640625],[21.279296875,64.72470703125],[21.33154296875,64.629345703125],[21.393847656250017,64.5443359375],[21.519628906250006,64.4630859375],[21.49433593750001,64.41611328125],[21.46503906250001,64.37958984375],[21.255761718750023,64.299169921875],[21.018457031250023,64.177978515625],[20.7626953125,63.867822265624994],[20.677636718750023,63.82626953125],[20.453710937500006,63.77373046875],[20.371386718750017,63.722900390625],[20.2046875,63.662451171875],[19.913671875,63.610546875],[19.781640625000023,63.53818359375],[19.722070312500023,63.463330078125],[19.65576171875,63.4580078125],[19.59003906250001,63.487255859375],[19.502343750000023,63.509033203125],[19.49091796875001,63.460205078125],[19.49462890625,63.424365234375],[19.354296875000017,63.477490234375],[19.2880859375,63.428759765625],[19.236328125,63.34736328125],[19.034375,63.237744140625],[18.816699218750017,63.257470703124994],[18.792285156250017,63.238134765625],[18.850195312500006,63.22412109375],[18.858984375,63.206591796875],[18.819433593750006,63.197265625],[18.759570312500017,63.1982421875],[18.66718750000001,63.1765625],[18.6064453125,63.178271484375],[18.57763671875,63.126416015625],[18.530664062500023,63.063525390625],[18.40771484375,63.0375],[18.34423828125,63.032128906249994],[18.312890625000023,62.99638671875],[18.502050781250006,62.9888671875],[18.486914062500006,62.95859375],[18.48261718750001,62.9283203125],[18.46308593750001,62.895849609375],[18.248046875,62.849072265625],[18.214941406250006,62.81220703125],[18.170019531250006,62.78935546875],[18.07441406250001,62.790673828124994],[18.077929687500017,62.811962890625],[18.093554687500017,62.83603515625],[17.951074218750023,62.833886718749994],[17.906640625000023,62.886767578125],[17.87958984375001,62.873193359374994],[17.895605468750006,62.830517578125],[17.932910156250017,62.7861328125],[17.974414062500017,62.721044921875],[17.940722656250017,62.6798828125],[17.90302734375001,62.65947265625],[17.930468750000017,62.640625],[18.00654296875001,62.62626953125],[18.03730468750001,62.600537109375],[17.947070312500017,62.578466796875],[17.83447265625,62.502734375],[17.7177734375,62.500878906249994],[17.646386718750023,62.45087890625],[17.570605468750017,62.451025390625],[17.50898437500001,62.48251953125],[17.410253906250006,62.5083984375],[17.37841796875,62.462792968749994],[17.373339843750017,62.426513671875],[17.429003906250017,62.334716796875],[17.535253906250006,62.263671875],[17.633691406250023,62.2330078125],[17.562890625000023,62.212304687499994],[17.510156250000023,62.16630859375],[17.446582031250017,62.02265625],[17.412011718750023,61.96611328125],[17.37451171875,61.86630859375],[17.398242187500017,61.782080078125],[17.417285156250017,61.740673828125],[17.465429687500006,61.684472656249994],[17.334570312500006,61.69169921875],[17.196386718750006,61.724560546875],[17.215625,61.65634765625],[17.130761718750023,61.575732421875],[17.146582031250006,61.504638671875],[17.16425781250001,61.45830078125],[17.137988281250017,61.381689453125],[17.17792968750001,61.3576171875],[17.199609375000023,61.311962890625],[17.163867187500017,61.278271484375],[17.179785156250006,61.249267578125],[17.18574218750001,61.146533203125],[17.212890625,60.98583984375],[17.202929687500017,60.95185546875],[17.27890625,60.812158203124994],[17.26123046875,60.76318359375],[17.2509765625,60.70078125],[17.35986328125,60.6408203125],[17.45703125,60.641796875],[17.555468750000017,60.642724609374994],[17.593066406250017,60.627685546875],[17.630761718750023,60.58525390625],[17.6611328125,60.53515625],[17.7421875,60.539306640625],[17.87158203125,60.580078125],[17.95576171875001,60.589794921875],[18.011328125,60.51142578125],[18.1625,60.40791015625],[18.25048828125,60.3615234375],[18.4,60.337109375],[18.557519531250023,60.253564453124994],[18.535449218750017,60.152880859375],[18.601171875,60.11923828125],[18.787011718750023,60.079492187499994],[18.85273437500001,60.02587890625],[18.88427734375,59.98017578125],[18.933203125,59.942285156249994],[18.99042968750001,59.827783203124994],[18.970507812500017,59.757226562499994],[18.895605468750006,59.732958984375],[18.71875,59.657373046874994],[18.639941406250017,59.600927734375],[18.578125,59.565771484375],[18.402441406250006,59.490380859374994],[18.33808593750001,59.47685546875],[18.276464843750006,59.437646484374994],[18.216894531250006,59.4205078125],[18.16357421875,59.43037109375],[17.964257812500023,59.359375],[17.979785156250017,59.329052734375]],[[50.67988281250001,46.938720703125],[50.58291015625002,46.882275390625],[50.528417968750006,46.873291015625],[50.472265625,46.88291015625],[50.41933593750002,46.8794921875],[50.30625,46.794921875],[50.1015625,46.696435546874994],[49.99980468750002,46.63427734375],[49.886328125,46.595654296875],[49.76054687500002,46.571484375],[49.63154296875001,46.567578125],[49.584375,46.545214843749996],[49.43720703125001,46.537255859374994],[49.34746093750002,46.519140625],[49.34423828125,46.485546875],[49.36210937500002,46.410205078124996],[49.28583984375001,46.436816406249996],[49.205664062500006,46.385693359375],[49.23222656250002,46.337158203125],[49.24589843750002,46.2916015625],[49.12548828125,46.28173828125],[49.11064453125002,46.228466796875],[49.07958984375,46.189208984375],[48.80996093750002,46.100488281249994],[48.74257812500002,46.100732421874994],[48.683691406250006,46.086181640625],[48.68730468750002,46.028759765625],[48.70341796875002,45.976220703124994],[48.749609375,45.920556640624994],[48.729589843750006,45.896826171875],[48.68964843750001,45.8888671875],[48.63740234375001,45.90576171875],[48.58906250000001,45.934863281249996],[48.53730468750001,45.942138671875],[48.48701171875001,45.934863281249996],[48.25761718750002,45.777783203125],[48.1591796875,45.73701171875],[48.052832031250006,45.720996093749996],[47.830175781250006,45.663037109375],[47.76396484375002,45.665966796875],[47.70107421875002,45.686181640624994],[47.64980468750002,45.65673828125],[47.63330078125,45.584033203124996],[47.57402343750002,45.63427734375],[47.508398437500006,45.674169921875],[47.47939453125002,45.68759765625],[47.46328125000002,45.6796875],[47.52421875000002,45.601708984374994],[47.52949218750001,45.530224609375],[47.51455078125002,45.49091796875],[47.48867187500002,45.455078125],[47.45449218750002,45.433056640625],[47.4130859375,45.421044921874994],[47.39111328125,45.294775390625],[47.35126953125001,45.217724609375],[47.29619140625002,45.149462890624996],[47.22148437500002,45.024267578125],[47.16152343750002,44.969628906249994],[47.11474609375,44.90595703125],[47.08378906250002,44.8169921875],[47.03925781250001,44.837890625],[47.0029296875,44.87607421875],[46.98369140625002,44.825585937499994],[46.95742187500002,44.782568359375],[46.84121093750002,44.71826171875],[46.75527343750002,44.656542968749996],[46.71611328125002,44.560693359374994],[46.70722656250001,44.503320312499994],[46.72089843750001,44.45166015625],[46.753027343750006,44.420654296875],[46.91572265625001,44.387158203125],[47.02363281250001,44.34326171875],[47.12265625,44.261669921875],[47.22988281250002,44.1923828125],[47.30703125000002,44.103125],[47.36152343750001,43.993359375],[47.42919921875,43.7798828125],[47.46279296875002,43.555029296875],[47.562597656250006,43.83466796875],[47.646484375,43.884619140625],[47.62783203125002,43.805957031249996],[47.56796875,43.684960937499994],[47.50898437500001,43.509716796875],[47.48984375,43.381689453125],[47.51162109375002,43.270751953125],[47.51289062500001,43.21875],[47.46318359375002,43.035058593749994],[47.488867187500006,42.999755859375],[47.52900390625001,42.967138671875],[47.634863281250006,42.903466796874994],[47.709082031250006,42.8109375],[47.72773437500001,42.680712890624996],[47.76972656250001,42.644775390625],[47.822363281250006,42.6134765625],[48.080175781250006,42.3537109375],[48.228613281250006,42.180957031249996],[48.30302734375002,42.080224609374994],[48.3837890625,41.953417968749996],[48.426367187500006,41.923974609374994],[48.47675781250001,41.905126953125],[48.572851562500006,41.844482421875],[48.664648437500006,41.78662109375],[48.82392578125001,41.62958984375],[49.050878906250006,41.373974609375],[49.10664062500001,41.301708984375],[49.14326171875001,41.2177734375],[49.17470703125002,41.116113281249994],[49.22646484375002,41.026220703125],[49.45673828125001,40.799853515624996],[49.55615234375,40.71630859375],[49.718359375,40.60810546875],[49.775976562500006,40.583984375],[49.85175781250001,40.577197265624996],[49.990625,40.576806640624994],[50.119140625,40.534521484375],[50.18251953125002,40.504785156249994],[50.248046875,40.461767578125],[50.30683593750001,40.41220703125],[50.36591796875001,40.2794921875],[50.143164062500006,40.3232421875],[49.91884765625002,40.31640625],[49.7919921875,40.287890625],[49.669042968750006,40.2490234375],[49.55117187500002,40.194140625],[49.47734375000002,40.087255859375],[49.415136718750006,39.83984375],[49.32441406250001,39.608349609375],[49.32753906250002,39.501220703125],[49.36738281250001,39.398388671875],[49.36279296875,39.349560546875],[49.32119140625002,39.32890625],[49.26933593750002,39.28515625],[49.199804687500006,39.07265625],[49.16533203125002,39.0302734375],[49.12099609375002,39.00390625],[49.10869140625002,39.029052734375],[49.111328125,39.084716796875],[49.01347656250002,39.133984375],[48.96171875000002,39.078759765624994],[48.92617187500002,38.961767578125],[48.8544921875,38.838818359375],[48.85087890625002,38.815332031249994],[48.86875,38.435498046875],[48.870703125,38.392529296875],[48.9013671875,38.14365234375],[48.92509765625002,38.01513671875],[48.9599609375,37.89013671875],[49.01533203125001,37.77607421875],[49.08095703125002,37.667578125],[49.17119140625002,37.6005859375],[49.37246093750002,37.519970703125],[49.47011718750002,37.4966796875],[49.72695312500002,37.480517578124996],[49.98066406250001,37.444873046874996],[50.13046875,37.407128906249994],[50.17626953125,37.380517578124994],[50.21406250000001,37.339599609375],[50.337890625,37.149169921875],[50.533203125,37.013671875],[50.92744140625001,36.810205078124994],[51.11855468750002,36.742578125],[51.76201171875002,36.614501953125],[52.19013671875001,36.621728515624994],[53.374121093750006,36.86875],[53.767675781250006,36.930322265624994],[53.91542968750002,36.930322265624994],[53.82744140625002,36.881201171875],[53.67949218750002,36.853125],[53.76875,36.81845703125],[53.90625,36.8126953125],[53.97011718750002,36.818310546875],[54.016210937500006,36.849658203124996],[54.02382812500002,36.901318359375],[54.0171875,36.952490234375],[53.95195312500002,37.18173828125],[53.914160156250006,37.343554687499996],[53.89785156250002,37.41357421875],[53.84785156250001,37.669580078124994],[53.82353515625002,37.9279296875],[53.8251953125,38.046923828124996],[53.854101562500006,38.28564453125],[53.85185546875002,38.405908203124994],[53.84003906250001,38.514941406249996],[53.8515625,38.62177734375],[53.87373046875001,38.741943359375],[53.885351562500006,38.8640625],[53.86865234375,38.949267578124996],[53.81494140625,39.018017578125],[53.72412109375,39.103076171874996],[53.70976562500002,39.15341796875],[53.70458984375,39.2095703125],[53.61757812500002,39.215966796874994],[53.53945312500002,39.274072265624994],[53.475,39.305712890624996],[53.33632812500002,39.3408203125],[53.26679687500001,39.342626953125],[53.20332031250001,39.316796875],[53.15664062500002,39.264990234375],[53.1240234375,39.3466796875],[53.12480468750002,39.432080078125],[53.23564453125002,39.608544921874994],[53.30498046875002,39.557080078125],[53.3896484375,39.536425781249996],[53.49736328125002,39.53330078125],[53.603125,39.54697265625],[53.58242187500002,39.607421875],[53.533300781250006,39.641748046874994],[53.472265625,39.668798828125],[53.45048828125002,39.74853515625],[53.45830078125002,39.831201171874994],[53.4873046875,39.909375],[53.45429687500001,39.940869140625],[53.40419921875002,39.960351562499994],[53.28857421875,39.9580078125],[53.13857421875002,39.978662109374994],[52.9875,39.987597656249996],[52.9521484375,39.895458984375],[53.03554687500002,39.7744140625],[52.96484375,39.833886718749994],[52.89824218750002,39.9125],[52.8046875,40.054003906249996],[52.74443359375002,40.219775390624996],[52.73369140625002,40.398730468749996],[52.784765625,40.546728515625],[52.84990234375002,40.68564453125],[52.889257812500006,40.8634765625],[52.943457031250006,41.0380859375],[52.99765625,40.959863281249994],[53.0595703125,40.88974609375],[53.14521484375001,40.824951171875],[53.191992187500006,40.809472656249994],[53.33291015625002,40.78271484375],[53.42363281250002,40.792773437499996],[53.52031250000002,40.8310546875],[53.615234375,40.818505859374994],[53.69375,40.746435546875],[53.763769531250006,40.665673828124994],[53.87001953125002,40.648681640625],[54.0888671875,40.707080078124996],[54.19296875,40.72041015625],[54.283300781250006,40.693701171875],[54.32988281250002,40.688769531249996],[54.37734375000002,40.693261718749994],[54.33623046875002,40.764941406249996],[54.319433593750006,40.8345703125],[54.37441406250002,40.871386718749996],[54.54707031250001,40.832275390625],[54.65703125000002,40.858349609375],[54.68505859375,40.873046875],[54.710058593750006,40.89111328125],[54.723242187500006,40.95126953125],[54.71796875000001,41.012988281249996],[54.703710937500006,41.071142578125],[54.671484375,41.12216796875],[54.59218750000002,41.1935546875],[54.28457031250002,41.363720703125],[54.18105468750002,41.431591796875],[54.094824218750006,41.519384765625],[54.03984375000002,41.643359375],[53.995214843750006,41.77255859375],[53.95380859375001,41.868457031249996],[53.84648437500002,42.091162109375],[53.8046875,42.117626953125],[53.75234375000002,42.12939453125],[53.62490234375002,42.136376953124994],[53.49589843750002,42.120166015624996],[53.28496093750002,42.081835937499996],[53.164160156250006,42.093798828124996],[53.10830078125002,42.070068359375],[52.97001953125002,41.976220703124994],[52.9052734375,41.895751953125],[52.81484375000002,41.711816406249994],[52.88349609375001,41.6525390625],[52.88222656250002,41.613671875],[52.830175781250006,41.34189453125],[52.86181640625,41.21005859375],[52.85039062500002,41.20029296875],[52.82558593750002,41.230859375],[52.74726562500001,41.3654296875],[52.609375,41.529443359374994],[52.49384765625001,41.78037109375],[52.46757812500002,41.885888671874994],[52.45859375,42.04833984375],[52.46210937500001,42.100634765624996],[52.5171875,42.237158203125],[52.5732421875,42.330859375],[52.61835937500001,42.42822265625],[52.63847656250002,42.5556640625],[52.59658203125002,42.76015625],[52.55,42.80546875],[52.49394531250002,42.820263671875],[52.43427734375001,42.824462890625],[52.32441406250001,42.816162109375],[52.273046875,42.7998046875],[52.183691406250006,42.86875],[52.07558593750002,42.879785156249994],[52.0185546875,42.860546875],[51.96074218750002,42.8505859375],[51.89824218750002,42.86962890625],[51.84414062500002,42.910449218749996],[51.81103515625,42.954443359375],[51.78515625,43.004345703125],[51.70039062500001,43.104052734374996],[51.61601562500002,43.158447265625],[51.51406250000002,43.1705078125],[51.34785156250001,43.167382812499994],[51.29541015625,43.174121093749996],[51.29238281250002,43.230712890625],[51.31337890625002,43.3556640625],[51.31386718750002,43.420849609375],[51.3017578125,43.482373046875],[51.27412109375001,43.53291015625],[51.23896484375001,43.576708984374996],[51.1396484375,43.648779296875],[51.06484375000002,43.750146484374994],[50.93984375000002,43.958544921874996],[50.83076171875001,44.192773437499994],[50.78261718750002,44.22802734375],[50.68496093750002,44.265087890625],[50.471777343750006,44.294775390625],[50.331152343750006,44.325488281249996],[50.27558593750001,44.355126953124994],[50.252539062500006,44.406494140625],[50.2529296875,44.4615234375],[50.26455078125002,44.5265625],[50.297460937500006,44.58154296875],[50.40947265625002,44.6240234375],[50.652441406250006,44.633349609374996],[50.8603515625,44.628759765625],[51.048828125,44.53046875],[51.11074218750002,44.5078125],[51.17714843750002,44.501367187499994],[51.31074218750001,44.532421875],[51.37666015625001,44.5412109375],[51.543554687500006,44.531005859375],[51.49375,44.577539062499994],[51.43105468750002,44.601953125],[51.366308593750006,44.599853515625],[51.31025390625001,44.61875],[51.21816406250002,44.708984375],[51.05791015625002,44.811572265624996],[51.02070312500001,44.85400390625],[51.009375,44.921826171875],[51.04033203125002,44.980322265625],[51.15371093750002,45.040234375],[51.24990234375002,45.1216796875],[51.294042968750006,45.229785156249996],[51.33339843750002,45.279589843749996],[51.41572265625001,45.357861328125],[51.539648437500006,45.34287109375],[51.73261718750001,45.399462890624996],[52.04873046875002,45.38837890625],[52.4267578125,45.404638671875],[52.53105468750002,45.3986328125],[52.77197265625,45.343505859375],[52.910742187500006,45.319726562499994],[53.07890625000002,45.307519531249994],[53.20039062500001,45.331982421875],[53.08574218750002,45.407373046874994],[52.8375,45.496728515624994],[52.77382812500002,45.57275390625],[52.8875,45.779541015625],[53.041601562500006,45.96787109375],[53.13525390625,46.191650390625],[53.108984375,46.4140625],[53.06396484375,46.47529296875],[53.07851562500002,46.5474609375],[53.132421875,46.608349609375],[53.17021484375002,46.66904296875],[53.1375,46.742041015625],[53.069433593750006,46.8560546875],[53.03457031250002,46.892919921875],[52.916015625,46.954394531249996],[52.67763671875002,46.95712890625],[52.48320312500002,46.990673828125],[52.42031250000002,46.963671875],[52.384863281250006,46.922119140625],[52.34033203125,46.894775390625],[52.18876953125002,46.839501953124994],[52.13828125,46.82861328125],[52.085546875,46.839599609375],[52.01113281250002,46.901904296874996],[51.94511718750002,46.894873046875],[51.74453125000002,46.933740234374994],[51.65009765625001,47.01806640625],[51.615234375,47.029931640624994],[51.29082031250002,47.097314453124994],[51.17802734375002,47.11015625],[50.920019531250006,47.040673828124994],[50.73271484375002,46.95166015625],[50.67988281250001,46.938720703125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[145.88154296875,43.459521484374996],[145.89560546875003,43.454541015625],[145.91386718750005,43.455371093749996],[145.93115234375,43.45703125],[145.94111328125,43.445458984374994],[145.9435546875,43.42646484375],[145.93115234375,43.425634765625],[145.9072265625,43.422314453125],[145.89394531250002,43.419824218749994],[145.88652343750005,43.433056640625],[145.88154296875,43.443798828125],[145.869140625,43.450439453125],[145.869140625,43.457861328125],[145.88154296875,43.459521484374996]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[146.35878906250002,43.625390625],[146.33232421875005,43.619921875],[146.28818359375003,43.625390625],[146.27382812500002,43.629833984375],[146.28369140625,43.638623046875],[146.31015625000003,43.65185546875],[146.33330078125005,43.6474609375],[146.3498046875,43.644140625],[146.35878906250002,43.625390625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[146.04560546875,43.409326171874994],[146.03232421875003,43.407128906249994],[146.02802734375,43.420361328125],[146.04892578125003,43.43359375],[146.08857421875,43.449023437499996],[146.10078125,43.440185546875],[146.08632812500002,43.42919921875],[146.06992187500003,43.421484375],[146.04560546875,43.409326171874994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-159.74052734375,-21.24921875000001],[-159.77255859375,-21.24951171875],[-159.8130859375,-21.24208984375001],[-159.839599609375,-21.238085937500003],[-159.84248046875,-21.229101562500006],[-159.83203125,-21.200488281250003],[-159.810595703125,-21.18642578125001],[-159.768359375,-21.1884765625],[-159.739501953125,-21.208105468750006],[-159.736865234375,-21.240625],[-159.74052734375,-21.24921875000001]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-172.479150390625,-8.580761718750011],[-172.48369140625,-8.582910156250009],[-172.488232421875,-8.571582031250003],[-172.49404296875,-8.559179687500006],[-172.498681640625,-8.547949218750006],[-172.497021484375,-8.546484375],[-172.487255859375,-8.55615234375],[-172.481103515625,-8.567480468750006],[-172.479150390625,-8.580761718750011]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-171.18642578125,-9.35546875],[-171.188623046875,-9.358300781250009],[-171.193017578125,-9.352441406250009],[-171.200048828125,-9.3447265625],[-171.204443359375,-9.333300781250003],[-171.20166015625,-9.332617187500006],[-171.19443359375,-9.338769531250009],[-171.189306640625,-9.346582031250009],[-171.18642578125,-9.35546875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-172.21455078125,-4.511132812500009],[-172.20830078125,-4.51796875],[-172.193896484375,-4.516015625],[-172.18095703125,-4.514843750000011],[-172.188818359375,-4.521679687500011],[-172.215234375,-4.5244140625],[-172.2283203125,-4.507031250000011],[-172.21220703125,-4.493945312500003],[-172.1978515625,-4.49169921875],[-172.19638671875,-4.495410156250003],[-172.197216796875,-4.49951171875],[-172.203857421875,-4.49951171875],[-172.21474609375,-4.502636718750011],[-172.21455078125,-4.511132812500009]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-171.697607421875,-2.76640625],[-171.664990234375,-2.785546875],[-171.6396484375,-2.811230468750011],[-171.62763671875,-2.846972656250003],[-171.62841796875,-2.855859375],[-171.64736328125,-2.855566406250006],[-171.67060546875,-2.844433593750011],[-171.6873046875,-2.829785156250011],[-171.69609375,-2.82568359375],[-171.698291015625,-2.822265625],[-171.678369140625,-2.824511718750003],[-171.65537109375,-2.83984375],[-171.638525390625,-2.8466796875],[-171.63974609375,-2.829199218750006],[-171.660205078125,-2.798535156250011],[-171.67265625,-2.787988281250009],[-171.688037109375,-2.779101562500003],[-171.70595703125,-2.773144531250011],[-171.7181640625,-2.778613281250003],[-171.7248046875,-2.781347656250006],[-171.72763671875,-2.774121093750011],[-171.725146484375,-2.767871093750003],[-171.718896484375,-2.761425781250011],[-171.697607421875,-2.76640625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-171.08515625,-3.135449218750011],[-171.089794921875,-3.143261718750011],[-171.096728515625,-3.136914062500011],[-171.091748046875,-3.125097656250006],[-171.0876953125,-3.115039062500003],[-171.081005859375,-3.120410156250003],[-171.08515625,-3.135449218750011]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-171.233203125,-4.463476562500006],[-171.243017578125,-4.468066406250003],[-171.254541015625,-4.466503906250011],[-171.261767578125,-4.459765625],[-171.261962890625,-4.44921875],[-171.252392578125,-4.441601562500011],[-171.239404296875,-4.444140625],[-171.231884765625,-4.453710937500006],[-171.233203125,-4.463476562500006]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-174.512939453125,-4.675097656250003],[-174.501123046875,-4.688378906250009],[-174.501025390625,-4.694726562500009],[-174.50673828125,-4.693652343750003],[-174.523876953125,-4.689648437500011],[-174.529248046875,-4.681640625],[-174.516748046875,-4.686816406250003],[-174.511474609375,-4.685644531250006],[-174.523046875,-4.674023437500011],[-174.53310546875,-4.665332031250003],[-174.540673828125,-4.66171875],[-174.5408203125,-4.657324218750006],[-174.531396484375,-4.659472656250003],[-174.512939453125,-4.675097656250003]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-154.95625,-4.087988281250006],[-154.959033203125,-4.093847656250006],[-154.97109375,-4.085839843750009],[-154.99462890625,-4.07109375],[-155.014599609375,-4.054882812500011],[-155.0150390625,-4.048046875000011],[-154.986962890625,-4.03857421875],[-154.951220703125,-4.031054687500003],[-154.943359375,-4.041601562500006],[-154.950048828125,-4.055957031250003],[-154.95625,-4.087988281250006]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-151.7826171875,-11.441015625],[-151.790869140625,-11.456835937500003],[-151.806689453125,-11.451269531250006],[-151.815966796875,-11.43115234375],[-151.819140625,-11.409277343750006],[-151.81328125,-11.391796875000011],[-151.802783203125,-11.392675781250006],[-151.79111328125,-11.414355468750003],[-151.7826171875,-11.441015625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-155.863818359375,-5.626660156250011],[-155.887109375,-5.6318359375],[-155.91435546875,-5.631640625],[-155.9279296875,-5.618554687500009],[-155.92861328125,-5.607617187500011],[-155.919384765625,-5.607519531250006],[-155.910791015625,-5.609472656250006],[-155.872265625,-5.611328125],[-155.862353515625,-5.619140625],[-155.863818359375,-5.626660156250011]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-178.535107421875,-19.166015625],[-178.546337890625,-19.175],[-178.57373046875,-19.16494140625001],[-178.595947265625,-19.1513671875],[-178.598681640625,-19.137109375],[-178.589306640625,-19.11884765625001],[-178.56767578125,-19.10927734375001],[-178.556689453125,-19.11298828125001],[-178.56298828125,-19.11875],[-178.576171875,-19.12519531250001],[-178.574072265625,-19.143164062500006],[-178.55712890625,-19.154101562500003],[-178.540625,-19.15703125],[-178.535107421875,-19.166015625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-179.799853515625,-18.94033203125001],[-179.797607421875,-18.969824218750006],[-179.812451171875,-18.96816406250001],[-179.830224609375,-18.95556640625],[-179.83935546875,-18.96171875],[-179.8455078125,-18.970800781250006],[-179.848583984375,-18.991308593750006],[-179.851220703125,-19.0029296875],[-179.8650390625,-18.99873046875001],[-179.867333984375,-18.97841796875001],[-179.86279296875,-18.964160156250003],[-179.856201171875,-18.94326171875001],[-179.831103515625,-18.92421875],[-179.799853515625,-18.94033203125001]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-178.71162109375,-20.667773437500003],[-178.709521484375,-20.670507812500006],[-178.71494140625,-20.6703125],[-178.723095703125,-20.666796875],[-178.7291015625,-20.66015625],[-178.73056640625,-20.65283203125],[-178.7275390625,-20.64521484375001],[-178.724560546875,-20.64570312500001],[-178.719189453125,-20.65234375],[-178.714208984375,-20.659765625],[-178.71162109375,-20.667773437500003]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-78.804150390625,-33.646484375],[-78.983349609375,-33.6677734375],[-78.989453125,-33.66171875],[-78.97929687499999,-33.644140625],[-78.938134765625,-33.61357421875],[-78.88828125,-33.57636718750001],[-78.87744140625,-33.5751953125],[-78.859033203125,-33.578125],[-78.83818359374999,-33.585058593750006],[-78.78466796875,-33.61015625],[-78.7689453125,-33.62734375],[-78.77470703124999,-33.6416015625],[-78.804150390625,-33.646484375]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-14.364355468749977,-7.974316406250011],[-14.398681640625,-7.975781250000011],[-14.40869140625,-7.967480468750011],[-14.414941406249994,-7.94375],[-14.398583984374994,-7.90576171875],[-14.383642578124977,-7.882617187500003],[-14.360400390624989,-7.885937500000011],[-14.328857421875,-7.91259765625],[-14.302539062499989,-7.935449218750009],[-14.316796875,-7.956152343750006],[-14.364355468749977,-7.974316406250011]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[72.78037109375,11.202490234374991],[72.773046875,11.196093749999989],[72.7724609375,11.214257812499994],[72.7818359375,11.243310546874994],[72.79267578125001,11.262744140624989],[72.7958984375,11.260449218749997],[72.79287109375002,11.241552734374991],[72.78789062500002,11.215917968749991],[72.78037109375,11.202490234374991]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[73.0673828125,8.269091796874989],[73.0533203125,8.256689453124991],[73.03886718750002,8.251953125],[73.02851562500001,8.253515625],[73.0234375,8.265917968749989],[73.02607421875001,8.275292968749994],[73.03896484375002,8.26484375],[73.05585937500001,8.274560546874994],[73.0751953125,8.306347656249997],[73.07949218750002,8.316503906249991],[73.08359375,8.31103515625],[73.07978515625001,8.293066406249991],[73.0673828125,8.269091796874989]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[73.4166015625,3.23125],[73.39531250000002,3.229394531249994],[73.38203125000001,3.246484375],[73.38496093750001,3.271386718749994],[73.40156250000001,3.288769531249997],[73.427734375,3.289843749999989],[73.44277343750002,3.274316406249994],[73.43496093750002,3.250146484374994],[73.4166015625,3.23125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[73.51220703125,4.16455078125],[73.49482421875001,4.155175781249994],[73.47861328125,4.158935546875],[73.47304687500002,4.170703124999989],[73.48115234375001,4.188134765624994],[73.4947265625,4.21044921875],[73.50410156250001,4.234619140625],[73.51777343750001,4.24765625],[73.5283203125,4.243310546874994],[73.52714843750002,4.2296875],[73.52216796875001,4.211035156249991],[73.51904296875,4.186865234374991],[73.51220703125,4.16455078125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[131.17236328125,3.026220703124991],[131.149609375,3.021875],[131.1349609375,3.025244140624991],[131.13671875,3.039453125],[131.1515625,3.054101562499994],[131.17236328125,3.060595703124989],[131.18789062500002,3.055615234374997],[131.18632812500005,3.042089843749991],[131.17236328125,3.026220703124991]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[151.64775390625005,7.34619140625],[151.63945312500005,7.3330078125],[151.5783203125,7.338085937499997],[151.56972656250002,7.345507812499989],[151.57509765625002,7.351318359375],[151.60429687500005,7.357226562499989],[151.60781250000002,7.375390625],[151.59287109375003,7.379248046874991],[151.6056640625,7.388720703124989],[151.62949218750003,7.390429687499989],[151.64326171875,7.379248046874991],[151.65048828125003,7.362841796874989],[151.64775390625005,7.34619140625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[151.88144531250003,7.43203125],[151.8642578125,7.4267578125],[151.85595703125,7.431787109374994],[151.85996093750003,7.457373046874991],[151.86533203125003,7.466162109374991],[151.8818359375,7.467089843749989],[151.91054687500002,7.46015625],[151.91259765625,7.453857421875],[151.88144531250003,7.43203125]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[166.89033203125,11.153076171875],[166.864453125,11.146240234375],[166.8447265625,11.153369140624989],[166.85888671875,11.166308593749989],[166.88808593750002,11.168652343749997],[166.8994140625,11.1650390625],[166.89033203125,11.153076171875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[177.12148437500002,-12.50546875],[177.08242187500002,-12.515625],[177.01933593750005,-12.50732421875],[177.00625,-12.491113281250009],[177.0263671875,-12.4875],[177.067578125,-12.476953125],[177.11806640625002,-12.482324218750009],[177.126953125,-12.492871093750011],[177.12148437500002,-12.50546875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[174.62968750000005,-21.69501953125001],[174.621875,-21.705859375],[174.59296875,-21.70234375000001],[174.58720703125005,-21.680078125],[174.60419921875,-21.66748046875],[174.62773437500005,-21.67597656250001],[174.62968750000005,-21.69501953125001]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[179.21367187500005,-8.52421875],[179.20058593750002,-8.534960937500003],[179.19570312500002,-8.534765625],[179.20087890625,-8.512109375],[179.19794921875,-8.488671875],[179.19853515625005,-8.470019531250003],[179.20302734375002,-8.46630859375],[179.21162109375,-8.488085937500003],[179.21660156250005,-8.514843750000011],[179.21367187500005,-8.52421875]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[178.69482421875,-7.483496093750006],[178.69287109375,-7.4951171875],[178.68710937500003,-7.494042968750009],[178.67421875000002,-7.480175781250011],[178.66669921875,-7.4578125],[178.67685546875003,-7.463183593750003],[178.68984375000002,-7.473828125000011],[178.69482421875,-7.483496093750006]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[178.38974609375003,-8.045800781250009],[178.37705078125003,-8.068457031250006],[178.37070312500003,-8.060644531250006],[178.37939453125,-8.046679687500003],[178.38701171875005,-8.031835937500006],[178.38974609375003,-8.045800781250009]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[169.55107421875005,-0.873730468750011],[169.54169921875,-0.8759765625],[169.52294921875,-0.865625],[169.5255859375,-0.852636718750006],[169.53867187500003,-0.846875],[169.55527343750003,-0.856542968750006],[169.55107421875005,-0.873730468750011]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-128.290087890625,-24.39736328125001],[-128.3,-24.41259765625],[-128.320654296875,-24.399707031250003],[-128.3421875,-24.370703125],[-128.3501953125,-24.340234375],[-128.330126953125,-24.3232421875],[-128.30361328125,-24.33359375],[-128.2908203125,-24.36464843750001],[-128.290087890625,-24.39736328125001]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-166.10986328125,66.22744140625],[-166.1486328125,66.221826171875],[-166.146484375,66.237158203125],[-166.03251953125,66.277734375],[-165.822216796875,66.328076171875],[-165.8298828125,66.317138671875],[-165.94228515625,66.278173828125],[-166.10986328125,66.22744140625]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-86.714013671875,21.239306640625003],[-86.6962890625,21.191015625],[-86.713623046875,21.19677734375],[-86.73637695312499,21.233300781249994],[-86.752880859375,21.27880859375],[-86.73906249999999,21.279980468749997],[-86.72690429687499,21.264306640624994],[-86.714013671875,21.239306640625003]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[54.465429687500006,24.442773437499994],[54.456640625,24.42333984375],[54.42841796875001,24.425097656250003],[54.35771484375002,24.442773437499994],[54.33476562500002,24.47104492187499],[54.37890625,24.504589843749997],[54.39833984375002,24.50634765625],[54.42656250000002,24.47104492187499],[54.465429687500006,24.442773437499994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[-81.783837890625,24.544580078124994],[-81.809228515625,24.54233398437499],[-81.81142578125,24.5578125],[-81.76767578124999,24.576708984375003],[-81.738671875,24.575439453125],[-81.73974609375,24.554492187500003],[-81.783837890625,24.544580078124994]]]}},{"type":"Feature","properties":{"scalerank":0,"featureclass":"Land"},"geometry":{"type":"Polygon","coordinates":[[[124.74453125000002,37.980615234374994],[124.75546875000003,37.96982421875],[124.75371093749999,37.95517578125],[124.73984375000003,37.947216796875],[124.71708984374999,37.932861328125],[124.69667968750002,37.920166015625],[124.65585937500003,37.924755859375],[124.62539062500002,37.945214843749994],[124.63593750000001,37.980615234374994],[124.6611328125,37.9734375],[124.71660156249999,37.98876953125],[124.74453125000002,37.980615234374994]]]}}]} \ No newline at end of file diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/index.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/index.html new file mode 100644 index 000000000..526590f6a --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/index.html @@ -0,0 +1,22 @@ + + + + Mapbox GL JS Benchmarks + + + + + + + + + +
+ + + + + + + + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/lib/access_token.js b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/lib/access_token.js new file mode 100644 index 000000000..7364928e6 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/lib/access_token.js @@ -0,0 +1,18 @@ +'use strict'; + +const accessToken = ( + process.env.MapboxAccessToken || + process.env.MAPBOX_ACCESS_TOKEN || + getURLParameter('access_token') || + localStorage.getItem('accessToken') +); + +localStorage.setItem('accessToken', accessToken); + +module.exports = accessToken; + +function getURLParameter(name) { + const regexp = new RegExp(`[?&]${name}=([^&#]*)`, 'i'); + const output = regexp.exec(window.location.href); + return output && output[1]; +} diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/lib/coordinates.js b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/lib/coordinates.js new file mode 100644 index 000000000..5312e928b --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/lib/coordinates.js @@ -0,0 +1,159 @@ +'use strict'; + +// This file contains the set of coordinates of tiles used in a "flyTo" from +// the Mapbox SF office to the Mapbox DC office. + +const Coordinate = require('../../src/geo/coordinate'); + +module.exports = [ + new Coordinate(5242, 12665, 15), + new Coordinate(5242, 12666, 15), + new Coordinate(5242, 12664, 15), + new Coordinate(2620, 6332, 14), + new Coordinate(2620, 6333, 14), + new Coordinate(2621, 6332, 14), + new Coordinate(2621, 6333, 14), + new Coordinate(2620, 6331, 14), + new Coordinate(2621, 6331, 14), + new Coordinate(1309, 3166, 13), + new Coordinate(1309, 3167, 13), + new Coordinate(655, 1583, 12), + new Coordinate(655, 1582, 12), + new Coordinate(654, 1583, 12), + new Coordinate(654, 1582, 12), + new Coordinate(327, 790, 11), + new Coordinate(326, 791, 11), + new Coordinate(326, 790, 11), + new Coordinate(326, 792, 11), + new Coordinate(328, 791, 11), + new Coordinate(328, 790, 11), + new Coordinate(328, 792, 11), + new Coordinate(163, 395, 10), + new Coordinate(164, 395, 10), + new Coordinate(163, 396, 10), + new Coordinate(164, 396, 10), + new Coordinate(81, 197, 9), + new Coordinate(82, 197, 9), + new Coordinate(81, 198, 9), + new Coordinate(82, 198, 9), + new Coordinate(81, 196, 9), + new Coordinate(82, 196, 9), + new Coordinate(40, 98, 8), + new Coordinate(41, 98, 8), + new Coordinate(40, 99, 8), + new Coordinate(41, 99, 8), + new Coordinate(40, 97, 8), + new Coordinate(41, 97, 8), + new Coordinate(20, 49, 7), + new Coordinate(20, 48, 7), + new Coordinate(19, 49, 7), + new Coordinate(19, 48, 7), + new Coordinate(20, 50, 7), + new Coordinate(19, 50, 7), + new Coordinate(10, 24, 6), + new Coordinate(9, 24, 6), + new Coordinate(10, 25, 6), + new Coordinate(9, 25, 6), + new Coordinate(10, 23, 6), + new Coordinate(9, 23, 6), + new Coordinate(5, 12, 5), + new Coordinate(4, 12, 5), + new Coordinate(5, 11, 5), + new Coordinate(4, 11, 5), + new Coordinate(2, 6, 4), + new Coordinate(2, 5, 4), + new Coordinate(1, 5, 4), + new Coordinate(1, 6, 4), + new Coordinate(3, 5, 4), + new Coordinate(3, 6, 4), + new Coordinate(1, 2, 3), + new Coordinate(1, 3, 3), + new Coordinate(0, 2, 3), + new Coordinate(0, 3, 3), + new Coordinate(0, 1, 2), + new Coordinate(0, 0, 2), + new Coordinate(0, 2, 2), + new Coordinate(1, 1, 2), + new Coordinate(1, 0, 2), + new Coordinate(1, 2, 2), + new Coordinate(0, 0, 1), + new Coordinate(0, 1, 1), + new Coordinate(1, 0, 1), + new Coordinate(1, 1, 1), + new Coordinate(0, 0, 0), + new Coordinate(1, 1, 2), + new Coordinate(1, 2, 2), + new Coordinate(1, 0, 2), + new Coordinate(2, 3, 3), + new Coordinate(2, 2, 3), + new Coordinate(1, 2, 3), + new Coordinate(4, 6, 4), + new Coordinate(4, 5, 4), + new Coordinate(9, 12, 5), + new Coordinate(8, 12, 5), + new Coordinate(9, 11, 5), + new Coordinate(8, 11, 5), + new Coordinate(9, 13, 5), + new Coordinate(8, 13, 5), + new Coordinate(18, 24, 6), + new Coordinate(18, 23, 6), + new Coordinate(19, 24, 6), + new Coordinate(17, 24, 6), + new Coordinate(18, 25, 6), + new Coordinate(19, 23, 6), + new Coordinate(17, 23, 6), + new Coordinate(19, 25, 6), + new Coordinate(17, 25, 6), + new Coordinate(36, 48, 7), + new Coordinate(37, 48, 7), + new Coordinate(36, 49, 7), + new Coordinate(37, 49, 7), + new Coordinate(36, 47, 7), + new Coordinate(37, 47, 7), + new Coordinate(73, 97, 8), + new Coordinate(73, 98, 8), + new Coordinate(72, 97, 8), + new Coordinate(73, 96, 8), + new Coordinate(72, 98, 8), + new Coordinate(72, 96, 8), + new Coordinate(146, 195, 9), + new Coordinate(147, 195, 9), + new Coordinate(146, 196, 9), + new Coordinate(146, 194, 9), + new Coordinate(147, 196, 9), + new Coordinate(147, 194, 9), + new Coordinate(293, 391, 10), + new Coordinate(292, 391, 10), + new Coordinate(293, 390, 10), + new Coordinate(292, 390, 10), + new Coordinate(293, 392, 10), + new Coordinate(292, 392, 10), + new Coordinate(585, 783, 11), + new Coordinate(586, 783, 11), + new Coordinate(585, 782, 11), + new Coordinate(586, 782, 11), + new Coordinate(585, 784, 11), + new Coordinate(586, 784, 11), + new Coordinate(1171, 1566, 12), + new Coordinate(1172, 1566, 12), + new Coordinate(1171, 1567, 12), + new Coordinate(1171, 1565, 12), + new Coordinate(1172, 1567, 12), + new Coordinate(1172, 1565, 12), + new Coordinate(2343, 3133, 13), + new Coordinate(2342, 3133, 13), + new Coordinate(2343, 3132, 13), + new Coordinate(2342, 3132, 13), + new Coordinate(2343, 3134, 13), + new Coordinate(2342, 3134, 13), + new Coordinate(4686, 6266, 14), + new Coordinate(4686, 6267, 14), + new Coordinate(4685, 6266, 14), + new Coordinate(4685, 6267, 14), + new Coordinate(9372, 12533, 15), + new Coordinate(9372, 12534, 15), + new Coordinate(9373, 12533, 15), + new Coordinate(9373, 12534, 15), + new Coordinate(9372, 12532, 15), + new Coordinate(9373, 12532, 15) +]; diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/lib/create_map.js b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/lib/create_map.js new file mode 100644 index 000000000..3c0a600f6 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/lib/create_map.js @@ -0,0 +1,28 @@ +'use strict'; + +const util = require('../../src/util/util'); +const mapboxgl = require('../../src'); + +module.exports = function createMap(options) { + options = util.extend({width: 512, height: 512}, options); + + const element = document.createElement('div'); + element.style.width = `${options.width}px`; + element.style.height = `${options.height}px`; + element.style.margin = '0 auto'; + document.body.appendChild(element); + + mapboxgl.accessToken = require('./access_token'); + + const map = new mapboxgl.Map(util.extend({ + container: element, + style: 'mapbox://styles/mapbox/streets-v9', + interactive: false + }, options)); + + map.on('remove', () => { + map.getContainer().remove(); + }); + + return map; +}; diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/lib/format_number.js b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/lib/format_number.js new file mode 100644 index 000000000..f9afa66b0 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/lib/format_number.js @@ -0,0 +1,5 @@ +'use strict'; + +module.exports = function formatNumber(x) { + return Math.round(x).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","); +}; diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/lib/measure_framerate.js b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/lib/measure_framerate.js new file mode 100644 index 000000000..4ae1e3f4b --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/lib/measure_framerate.js @@ -0,0 +1,16 @@ +'use strict'; + +module.exports = function measureFramerate(duration, callback) { + const startTime = performance.now(); + let count = 0; + + requestAnimationFrame(function onAnimationFrame() { + count++; + if (performance.now() < startTime + duration) { + requestAnimationFrame(onAnimationFrame); + } else { + const endTime = performance.now(); + callback(null, count / (endTime - startTime) * 1000); + } + }); +}; diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/lib/set_data_perf.js b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/lib/set_data_perf.js new file mode 100644 index 000000000..64d0c35c2 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/lib/set_data_perf.js @@ -0,0 +1,29 @@ +'use strict'; + +module.exports = function(sourceCache, data, callback) { + const sampleCount = 50; + let startTime = null; + const samples = []; + + sourceCache.on('data', function onData() { + if (sourceCache.loaded()) { + samples.push(performance.now() - startTime); + sourceCache.off('data', onData); + if (samples.length < sampleCount) { + startTime = performance.now(); + sourceCache.clearTiles(); + sourceCache.on('data', onData); + sourceCache.getSource().setData(data); + } else { + callback(null, average(samples)); + } + } + }); + + startTime = performance.now(); + sourceCache.getSource().setData(data); +}; + +function average(array) { + return array.reduce((sum, value) => { return sum + value; }, 0) / array.length; +} diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/lib/setup_geojson_map.js b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/lib/setup_geojson_map.js new file mode 100644 index 000000000..4fa2b1da4 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/lib/setup_geojson_map.js @@ -0,0 +1,35 @@ +'use strict'; + +module.exports = function(map) { + map.addSource('geojson', { + 'type': 'geojson', + 'data': { + 'type': 'FeatureCollection', + 'features': [] + } + }); + + map.addLayer({ + 'id': 'geojson-polygon', + 'source': 'geojson', + 'type': 'fill', + 'filter': ['all', ['==', '$type', 'Polygon']], + 'paint': { + 'fill-color': '#000000', + 'fill-opacity': 0.25 + } + }); + + map.addLayer({ + 'id': 'geojson-point', + 'source': 'geojson', + 'type': 'circle', + 'filter': ['all', ['==', '$type', 'Point']], + 'paint': { + 'circle-radius': 5, + 'circle-color': '#000000' + } + }); + + return map; +}; diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/unit/bench_transform.js b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/unit/bench_transform.js new file mode 100644 index 000000000..994e4e66a --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/unit/bench_transform.js @@ -0,0 +1,27 @@ +'use strict'; + +const Benchmark = require('benchmark'); +const suite = new Benchmark.Suite(); + +const Transform = require('../../src/geo/transform'); +const LngLat = require('../../src/geo/lng_lat.js'); +const Point = require('point-geometry'); + +const t = new Transform(); +t.resize(512, 512); +t.zoom = 12; +t.center = new LngLat(30.5, 50.5); + +suite +.add('locationPoint', () => { + const lnglat = new LngLat(30 + Math.random(), 50 + Math.random()); + t.locationPoint(lnglat); +}) +.add('pointLocation', () => { + const point = new Point(1000 * Math.random(), 1000 * Math.random()); + t.pointLocation(point); +}) +.on('cycle', (event) => { + console.log(String(event.target)); +}) +.run(); diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/unit/feature_filter/785.vector.pbf b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/unit/feature_filter/785.vector.pbf new file mode 100644 index 000000000..dd9a664e0 Binary files /dev/null and b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/unit/feature_filter/785.vector.pbf differ diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/unit/feature_filter/bench.js b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/unit/feature_filter/bench.js new file mode 100644 index 000000000..f7ceba1b1 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/unit/feature_filter/bench.js @@ -0,0 +1,59 @@ +'use strict'; + +const VectorTile = require('vector-tile').VectorTile; +const Pbf = require('pbf'); +const fs = require('fs'); +const createFilter = require('../../../src/style-spec').featureFilter; +const filters = require('./filters.json'); +const path = require('path'); + +const tile = new VectorTile(new Pbf(fs.readFileSync(path.join(__dirname, './785.vector.pbf')))); + +const layers = []; +for (const name in tile.layers) { + const layer = tile.layers[name]; + if (!layer.length) continue; + + const features = []; + for (let j = 0; j < layer.length; j++) { + features.push(layer.feature(j)); + } + + const layerFilters = []; + for (let j = 0; j < filters.length; j++) { + if (filters[j].layer === name) layerFilters.push(filters[j].filter); + } + + layers.push({ + name: name, + features: features, + rawFilters: layerFilters + }); +} + +console.time('create filters'); +for (let m = 0; m < 100; m++) { + for (let i = 0; i < layers.length; i++) { + const layer = layers[i]; + layer.filters = []; + for (let j = 0; j < layer.rawFilters.length; j++) { + layer.filters.push(createFilter(layer.rawFilters[j])); + } + } +} +console.timeEnd('create filters'); + +console.time('apply filters'); +for (let m = 0; m < 100; m++) { + for (let i = 0; i < layers.length; i++) { + const layer = layers[i]; + for (let j = 0; j < layer.features.length; j++) { + const feature = layer.features[j]; + for (let k = 0; k < layer.filters.length; k++) { + const filter = layer.filters[k]; + filter(feature); + } + } + } +} +console.timeEnd('apply filters'); diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/unit/feature_filter/big.js b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/unit/feature_filter/big.js new file mode 100644 index 000000000..9cb097c0a --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/unit/feature_filter/big.js @@ -0,0 +1,21 @@ +'use strict'; + +const filter = require('../../../src/style-spec').featureFilter; + +const N = 64000; + +const arr = ['in', 'foo']; +for (let i = 0; i < N; i++) arr.push(i); + +console.time(`create ${N}-item filter`); +const f = filter(arr); +console.timeEnd(`create ${N}-item filter`); + +const feature = {properties: {foo: 0}}; + +console.time('filter 1 million times'); +for (let i = 0; i < 1000000; i++) { + feature.properties.foo = Math.floor(Math.random() * N * 2); + f(feature); +} +console.timeEnd('filter 1 million times'); diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/unit/feature_filter/filters.json b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/unit/feature_filter/filters.json new file mode 100644 index 000000000..9a90c4195 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/unit/feature_filter/filters.json @@ -0,0 +1,1462 @@ +[ + { + "filter": [ + "==", + "class", + "crop" + ], + "layer": "landcover" + }, + { + "filter": [ + "==", + "class", + "grass" + ], + "layer": "landcover" + }, + { + "filter": [ + "==", + "class", + "scrub" + ], + "layer": "landcover" + }, + { + "filter": [ + "==", + "class", + "wood" + ], + "layer": "landcover" + }, + { + "filter": [ + "==", + "class", + "snow" + ], + "layer": "landcover" + }, + { + "filter": [ + "==", + "class", + "hospital" + ], + "layer": "landuse" + }, + { + "filter": [ + "==", + "class", + "school" + ], + "layer": "landuse" + }, + { + "filter": [ + "==", + "class", + "park" + ], + "layer": "landuse" + }, + { + "filter": [ + "==", + "class", + "pitch" + ], + "layer": "landuse" + }, + { + "filter": [ + "==", + "class", + "pitch" + ], + "layer": "landuse" + }, + { + "filter": [ + "==", + "class", + "cemetery" + ], + "layer": "landuse" + }, + { + "filter": [ + "==", + "class", + "industrial" + ], + "layer": "landuse" + }, + { + "filter": [ + "==", + "class", + "sand" + ], + "layer": "landuse" + }, + { + "filter": [ + "==", + "level", + 94 + ], + "layer": "hillshade" + }, + { + "filter": [ + "==", + "level", + 90 + ], + "layer": "hillshade" + }, + { + "filter": [ + "==", + "level", + 89 + ], + "layer": "hillshade" + }, + { + "filter": [ + "==", + "level", + 78 + ], + "layer": "hillshade" + }, + { + "filter": [ + "==", + "level", + 67 + ], + "layer": "hillshade" + }, + { + "filter": [ + "==", + "level", + 56 + ], + "layer": "hillshade" + }, + { + "filter": [ + "all", + [ + "!=", + "class", + "river" + ], + [ + "!=", + "class", + "canal" + ] + ], + "layer": "waterway" + }, + { + "filter": [ + "all", + [ + "==", + "$type", + "Polygon" + ], + [ + "==", + "class", + "land" + ] + ], + "layer": "barrier_line" + }, + { + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "==", + "class", + "land" + ] + ], + "layer": "barrier_line" + }, + { + "filter": [ + "all", + [ + "==", + "$type", + "Polygon" + ], + [ + "!=", + "type", + "apron" + ] + ], + "layer": "aeroway" + }, + { + "filter": [ + "all", + [ + "==", + "$type", + "Polygon" + ], + [ + "==", + "class", + "street_limited" + ] + ], + "layer": "tunnel" + }, + { + "filter": [ + "==", + "class", + "path" + ], + "layer": "tunnel" + }, + { + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "==", + "class", + "street" + ] + ], + "layer": "tunnel" + }, + { + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "==", + "class", + "street_limited" + ] + ], + "layer": "tunnel" + }, + { + "filter": [ + "==", + "class", + "motorway_link" + ], + "layer": "tunnel" + }, + { + "filter": [ + "in", + "class", + "service", + "driveway" + ], + "layer": "tunnel" + }, + { + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "street_limited" + ], + [ + "!=", + "type", + "construction" + ] + ] + ], + "layer": "tunnel" + }, + { + "filter": [ + "==", + "class", + "street" + ], + "layer": "tunnel" + }, + { + "filter": [ + "all", + [ + "==", + "class", + "main" + ], + [ + "!=", + "type", + "trunk" + ] + ], + "layer": "tunnel" + }, + { + "filter": [ + "all", + [ + "==", + "class", + "main" + ], + [ + "==", + "type", + "trunk" + ] + ], + "layer": "tunnel" + }, + { + "filter": [ + "==", + "class", + "motorway" + ], + "layer": "tunnel" + }, + { + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "street_limited" + ], + [ + "==", + "type", + "construction" + ] + ] + ], + "layer": "tunnel" + }, + { + "filter": [ + "all", + [ + "==", + "oneway", + 1 + ], + [ + "in", + "class", + "main", + "street", + "street_limited" + ], + [ + "!=", + "type", + "trunk" + ] + ], + "layer": "tunnel" + }, + { + "filter": [ + "all", + [ + "==", + "oneway", + 1 + ], + [ + "==", + "type", + "trunk" + ] + ], + "layer": "tunnel" + }, + { + "filter": [ + "in", + "class", + "major_rail", + "minor_rail" + ], + "layer": "tunnel" + }, + { + "filter": [ + "all", + [ + "==", + "oneway", + 1 + ], + [ + "in", + "class", + "motorway", + "motorway_link" + ] + ], + "layer": "tunnel" + }, + { + "filter": [ + "==", + "class", + "path" + ], + "layer": "road" + }, + { + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "==", + "class", + "street" + ] + ], + "layer": "road" + }, + { + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "==", + "class", + "street_limited" + ] + ], + "layer": "road" + }, + { + "filter": [ + "in", + "class", + "service", + "driveway" + ], + "layer": "road" + }, + { + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "street_limited" + ], + [ + "!=", + "type", + "construction" + ] + ] + ], + "layer": "road" + }, + { + "filter": [ + "==", + "class", + "street" + ], + "layer": "road" + }, + { + "filter": [ + "all", + [ + "==", + "class", + "main" + ], + [ + "!=", + "type", + "trunk" + ] + ], + "layer": "road" + }, + { + "filter": [ + "==", + "class", + "motorway" + ], + "layer": "road" + }, + { + "filter": [ + "all", + [ + "==", + "oneway", + 1 + ], + [ + "in", + "class", + "main", + "street", + "street_limited" + ], + [ + "!=", + "type", + "trunk" + ] + ], + "layer": "road" + }, + { + "filter": [ + "all", + [ + "==", + "oneway", + 1 + ], + [ + "==", + "type", + "trunk" + ] + ], + "layer": "road" + }, + { + "filter": [ + "in", + "class", + "major_rail", + "minor_rail" + ], + "layer": "road" + }, + { + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "street_limited" + ], + [ + "==", + "type", + "construction" + ] + ] + ], + "layer": "road" + }, + { + "filter": [ + "all", + [ + "==", + "oneway", + 1 + ], + [ + "in", + "class", + "motorway", + "motorway_link" + ] + ], + "layer": "road" + }, + { + "filter": [ + "all", + [ + "==", + "$type", + "Polygon" + ], + [ + "==", + "class", + "street_limited" + ] + ], + "layer": "bridge" + }, + { + "filter": [ + "==", + "class", + "path" + ], + "layer": "bridge" + }, + { + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "==", + "class", + "street" + ] + ], + "layer": "bridge" + }, + { + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "==", + "class", + "street_limited" + ] + ], + "layer": "bridge" + }, + { + "filter": [ + "==", + "class", + "motorway_link" + ], + "layer": "bridge" + }, + { + "filter": [ + "in", + "class", + "service", + "driveway" + ], + "layer": "bridge" + }, + { + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "street_limited" + ], + [ + "!=", + "type", + "construction" + ] + ] + ], + "layer": "bridge" + }, + { + "filter": [ + "==", + "class", + "street" + ], + "layer": "bridge" + }, + { + "filter": [ + "all", + [ + "==", + "oneway", + 1 + ], + [ + "in", + "class", + "main", + "street", + "street_limited" + ], + [ + "!=", + "type", + "trunk" + ] + ], + "layer": "bridge" + }, + { + "filter": [ + "any", + [ + "==", + "class", + "motorway" + ], + [ + "==", + "type", + "trunk" + ] + ], + "layer": "bridge" + }, + { + "filter": [ + "in", + "class", + "service", + "driveway" + ], + "layer": "bridge" + }, + { + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "street_limited" + ], + [ + "==", + "type", + "construction" + ] + ] + ], + "layer": "bridge" + }, + { + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "street_limited" + ], + [ + "!=", + "type", + "construction" + ] + ] + ], + "layer": "bridge" + }, + { + "filter": [ + "==", + "class", + "street" + ], + "layer": "bridge" + }, + { + "filter": [ + "all", + [ + "==", + "class", + "main" + ], + [ + "!=", + "type", + "trunk" + ] + ], + "layer": "bridge" + }, + { + "filter": [ + "all", + [ + "==", + "class", + "main" + ], + [ + "==", + "type", + "trunk" + ] + ], + "layer": "bridge" + }, + { + "filter": [ + "all", + [ + "==", + "oneway", + 1 + ], + [ + "==", + "type", + "trunk" + ] + ], + "layer": "bridge" + }, + { + "filter": [ + "==", + "class", + "motorway" + ], + "layer": "bridge" + }, + { + "filter": [ + "in", + "class", + "major_rail", + "minor_rail" + ], + "layer": "bridge" + }, + { + "filter": [ + "==", + "class", + "aerialway" + ], + "layer": "bridge" + }, + { + "filter": [ + "all", + [ + "==", + "oneway", + 1 + ], + [ + "in", + "class", + "motorway", + "motorway_link" + ] + ], + "layer": "bridge" + }, + { + "filter": [ + "==", + "class", + "hedge" + ], + "layer": "barrier_line" + }, + { + "filter": [ + "==", + "class", + "fence" + ], + "layer": "barrier_line" + }, + { + "filter": [ + "==", + "class", + "gate" + ], + "layer": "barrier_line" + }, + { + "filter": [ + "all", + [ + ">=", + "admin_level", + 3 + ], + [ + "==", + "maritime", + 0 + ] + ], + "layer": "admin" + }, + { + "filter": [ + "all", + [ + ">=", + "admin_level", + 3 + ], + [ + "==", + "maritime", + 0 + ] + ], + "layer": "admin" + }, + { + "filter": [ + "!=", + "index", + 5 + ], + "layer": "contour" + }, + { + "filter": [ + "==", + "index", + 5 + ], + "layer": "contour" + }, + { + "filter": [ + "==", + "index", + 5 + ], + "layer": "contour" + }, + { + "filter": [ + "==", + "class", + "river" + ], + "layer": "waterway_label" + }, + { + "filter": [ + "all", + [ + "!in", + "maki", + "rail-light", + "rail-metro", + "rail", + "airport", + "airfield", + "heliport", + "rocket", + "park", + "golf", + "cemetery", + "zoo", + "campsite", + "swimming", + "dog-park" + ], + [ + "==", + "scalerank", + 4 + ], + [ + ">=", + "localrank", + 15 + ] + ], + "layer": "poi_label" + }, + { + "filter": [ + "all", + [ + "!in", + "maki", + "rail-light", + "rail-metro", + "rail", + "airport", + "airfield", + "heliport", + "rocket", + "park", + "golf", + "cemetery", + "zoo", + "campsite", + "swimming", + "dog-park" + ], + [ + "==", + "scalerank", + 4 + ], + [ + "<=", + "localrank", + 14 + ] + ], + "layer": "poi_label" + }, + { + "filter": [ + "all", + [ + "in", + "maki", + "park", + "cemetery", + "golf", + "zoo", + "playground" + ], + [ + "==", + "scalerank", + 4 + ] + ], + "layer": "poi_label" + }, + { + "filter": [ + "all", + [ + "!in", + "maki", + "rail-light", + "rail-metro", + "rail", + "airport", + "airfield", + "heliport", + "rocket", + "park", + "golf", + "cemetery", + "zoo", + "campsite", + "swimming", + "dog-park" + ], + [ + "==", + "scalerank", + 3 + ] + ], + "layer": "poi_label" + }, + { + "filter": [ + "all", + [ + "in", + "maki", + "park", + "cemetery", + "golf", + "zoo" + ], + [ + "==", + "scalerank", + 3 + ] + ], + "layer": "poi_label" + }, + { + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "!in", + "class", + "motorway", + "main", + "street_limited", + "street" + ] + ], + "layer": "road_label" + }, + { + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "in", + "class", + "street", + "street_limited" + ] + ], + "layer": "road_label" + }, + { + "filter": [ + "in", + "class", + "main", + "motorway" + ], + "layer": "road_label" + }, + { + "filter": [ + "all", + [ + "!in", + "shield", + "us-interstate", + "us-interstate-business", + "us-interstate-duplex" + ], + [ + "<=", + "reflen", + 6 + ] + ], + "layer": "road_label" + }, + { + "filter": [ + "all", + [ + "in", + "shield", + "us-interstate", + "us-interstate-business", + "us-interstate-duplex" + ], + [ + "<=", + "reflen", + 6 + ] + ], + "layer": "road_label" + }, + { + "filter": [ + "all", + [ + "!in", + "maki", + "rail-light", + "rail-metro", + "rail", + "airport", + "airfield", + "heliport", + "rocket", + "park", + "golf", + "cemetery", + "zoo", + "campsite", + "swimming", + "dog-park" + ], + [ + "==", + "scalerank", + 2 + ] + ], + "layer": "poi_label" + }, + { + "filter": [ + "all", + [ + "in", + "maki", + "park", + "golf", + "cemetery", + "zoo", + "campsite", + "swimming", + "dog-park" + ], + [ + "==", + "scalerank", + 2 + ] + ], + "layer": "poi_label" + }, + { + "filter": [ + "==", + "type", + "Rail Station" + ], + "layer": "poi_label" + }, + { + "filter": [ + "<=", + "area", + 10000 + ], + "layer": "water_label" + }, + { + "filter": [ + "all", + [ + "in", + "maki", + "park", + "golf", + "cemetery", + "zoo", + "campsite", + "swimming", + "dog-park" + ], + [ + "<=", + "scalerank", + 1 + ] + ], + "layer": "poi_label" + }, + { + "filter": [ + "all", + [ + "!in", + "maki", + "rail-light", + "rail-metro", + "rail", + "airport", + "airfield", + "heliport", + "rocket", + "park", + "golf", + "cemetery", + "zoo", + "campsite", + "swimming", + "dog-park" + ], + [ + "<=", + "scalerank", + 1 + ], + [ + "!=", + "type", + "Island" + ] + ], + "layer": "poi_label" + }, + { + "filter": [ + "==", + "type", + "Islet" + ], + "layer": "poi_label" + }, + { + "filter": [ + "==", + "type", + "Island" + ], + "layer": "poi_label" + }, + { + "filter": [ + "all", + [ + "!in", + "scalerank", + 0, + 1, + 2, + 3, + 4, + 5 + ], + [ + "==", + "type", + "city" + ] + ], + "layer": "place_label" + }, + { + "filter": [ + "all", + [ + "in", + "scalerank", + 3, + 4, + 5 + ], + [ + "==", + "type", + "city" + ], + [ + "in", + "ldir", + "S", + "SE", + "SW", + "E" + ] + ], + "layer": "place_label" + }, + { + "filter": [ + "all", + [ + "in", + "scalerank", + 3, + 4, + 5 + ], + [ + "==", + "type", + "city" + ], + [ + "in", + "ldir", + "N", + "NE", + "NW", + "W" + ] + ], + "layer": "place_label" + } +] diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/unit/function/profile.js b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/unit/function/profile.js new file mode 100644 index 000000000..8f8a1dc28 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/bench/unit/function/profile.js @@ -0,0 +1,99 @@ +'use strict'; + +const createFunction = require('../../../src/style-spec').function.interpolated; + +function buildExponentialFunction(stopsCount) { + // Build an exponential function with a long list of stops + const stops = []; + for (let i = 0; i < stopsCount; i++) { + stops.push([i, i * 2]); + } + + return createFunction({ + type: 'exponential', + stops: stops + }); +} + +function buildCategoricalFunction(stopsCount, useStrings) { + // Build a categorical function with a long list of stops + const stops = []; + for (let i = 0; i < stopsCount; i++) { + stops.push([useStrings ? String(i) : i, i * 2]); + } + + return createFunction({ + type: 'categorical', + stops: stops + }); +} + + +function profileExponentialFunction(stops, iterations) { + const f = buildExponentialFunction(stops); + console.log(`\n\n>>> Evaluating exponential function for ${iterations} iterations with ${stops} stops`); + console.log("Only include values within the domain of stops:"); + console.time("Time"); + let value; + for (let i = 0; i < iterations; i++) { + value = Math.random() * stops; + f(value); + } + console.timeEnd("Time"); + + console.log("Include values outside the domain of stops:"); + console.time("Time"); + for (let i = 0; i < iterations; i++) { + value = Math.random() * (stops * 3) - stops; + f(value); + } + console.timeEnd("Time"); +} + +function profileCategoricalFunction(stops, iterations) { + let f = buildCategoricalFunction(stops, true); + console.log(`\n\n>>> Evaluating categorical function for ${iterations} iterations with ${stops} stops`); + console.log("Using strings as categories:"); + console.time("Time"); + let value; + for (let i = 0; i < iterations; i++) { + value = String(Math.floor(Math.random() * stops)); + f(value); + } + console.timeEnd("Time"); + + console.log("Using values not included in string categories:"); + console.time("Time"); + for (let i = 0; i < iterations; i++) { + value = String(Math.floor(Math.random() * stops * 2)); + f(value); + } + console.timeEnd("Time"); + + f = buildCategoricalFunction(stops, false); + console.log("Using integers as categories:"); + console.time("Time"); + for (let i = 0; i < iterations; i++) { + value = Math.floor(Math.random() * stops); + f(value); + } + console.timeEnd("Time"); + + f = buildCategoricalFunction(stops, false); + console.log("Using values not included in integer categories:"); + console.time("Time"); + for (let i = 0; i < iterations; i++) { + value = Math.floor(Math.random() * stops * 2); + f(value); + } + console.timeEnd("Time"); +} + +profileExponentialFunction(10000, 100000); +profileExponentialFunction(100, 100000); +profileExponentialFunction(10, 1000000); + +profileCategoricalFunction(10000, 10000); +profileCategoricalFunction(100, 10000); +profileCategoricalFunction(10, 100000); +profileCategoricalFunction(100, 10000); diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/ci-scripts/dependencies.sh b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/ci-scripts/dependencies.sh new file mode 100755 index 000000000..48e07e974 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/ci-scripts/dependencies.sh @@ -0,0 +1,23 @@ +# disable spotlight to ensure we waste no CPU on needless file indexing +if [[ $(uname -s) == 'Darwin' ]]; then sudo mdutil -i off /; fi; + +if [[ ! -d ./nvm ]]; then + git clone --depth 1 https://github.com/creationix/nvm.git ./nvm +fi + +source ./nvm/nvm.sh + +nvm install ${NODE_VERSION} +nvm use ${NODE_VERSION} + +if [[ ! -d ~/.yarn ]]; then + curl -o- -L https://yarnpkg.com/install.sh | bash +fi + +PATH="~/.yarn/bin:$PATH" + +yarn + +if [ "$CIRCLE_BRANCH" == "master" ] || [ -n "$CIRCLE_TAG" ]; then + pip install --user --upgrade awscli +fi diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/ci-scripts/deploy.sh b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/ci-scripts/deploy.sh new file mode 100755 index 000000000..4fe201e6b --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/ci-scripts/deploy.sh @@ -0,0 +1,36 @@ +#!/bin/bash + +set -eu + +if [ -z $CIRCLE_TAG ]; then + echo '$CIRCLE_TAG must be set' + exit 1 +fi + +function upload { + aws s3 cp --acl public-read --content-type $2 dist/$1 s3://mapbox-gl-js/$CIRCLE_TAG/$1 + echo "upload: dist/$1 to s3://mapbox-gl-js/$CIRCLE_TAG/$1" +} + +function cn_upload { + aws s3 cp --region cn-north-1 --acl public-read --content-type $2 dist/$1 s3://mapbox-gl-js-cn-north-1/$CIRCLE_TAG/$1 + echo "upload: dist/$1 to s3://mapbox-gl-js-cn-north-1/$CIRCLE_TAG/$1" +} + +# add python packages to $PATH +PATH=$(python -m site --user-base)/bin:${PATH} + +npm run build-dev +npm run build-min + +upload mapbox-gl.js application/javascript +upload mapbox-gl.js.map application/octet-stream +upload mapbox-gl-dev.js application/javascript +upload mapbox-gl.css text/css + +export AWS_ACCESS_KEY_ID=$AWSCN_ACCESS_KEY_ID +export AWS_SECRET_ACCESS_KEY=$AWSCN_SECRET_ACCESS_KEY +cn_upload mapbox-gl.js application/javascript +cn_upload mapbox-gl.js.map application/octet-stream +cn_upload mapbox-gl-dev.js application/javascript +cn_upload mapbox-gl.css text/css diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/ci-scripts/test.sh b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/ci-scripts/test.sh new file mode 100755 index 000000000..c2a0e7985 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/ci-scripts/test.sh @@ -0,0 +1,43 @@ +#!/usr/bin/env bash + +source ./nvm/nvm.sh +nvm use ${NODE_VERSION} + +set -e +set -o pipefail + +# add npm packages to $PATH +PATH=$(pwd)/node_modules/.bin:$PATH + +# add python packages to $PATH +PATH=$(python -m site --user-base)/bin:${PATH} + +# set up code coverage instrumentation +rm -rf coverage .nyc_output + +# run linters +npm run lint +npm run lint-docs + +# build and run build tests +npm run build-min +npm run build-dev + +# run flow to check types +npm run test-flow + +# run unit, render & query tests with coverage +npm run test-cov + +# send coverage report to coveralls +nyc report --reporter=lcov +# this code works around a Coveralls / CircleCI bug triggered by tagged builds +if [ -z "$CIRCLE_TAG" ]; then + (node ./node_modules/coveralls/bin/coveralls.js < ./coverage/lcov.info) || true +fi + +# upload benchmarks +if [ "$CIRCLE_BRANCH" == "master" ]; then + npm run build-benchmarks + aws s3 cp --acl public-read --content-type application/javascript bench/benchmarks_generated.js s3://mapbox-gl-js/master/benchmarks.js +fi diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/circle.yml b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/circle.yml new file mode 100644 index 000000000..f3d9599c5 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/circle.yml @@ -0,0 +1,26 @@ +machine: + xcode: + version: 7.3 + environment: + XCODE_SCHEME: "no" + XCODE_WORKSPACE: "no" + NODE_VERSION: 6 + +dependencies: + cache_directories: + - './nvm' + - '~/.yarn' + override: + - ./ci-scripts/dependencies.sh +test: + override: + - ./ci-scripts/test.sh +deployment: + release: + tag: /v[0-9]+\.[0-9]+\.[0-9]+(\-dev)?/ + commands: + - ./ci-scripts/deploy.sh +general: + artifacts: + - "node_modules/mapbox-gl-test-suite/render-tests/index.html" + - "node_modules/mapbox-gl-test-suite/query-tests/index.html" diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/cloudformation/travis-cn.template b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/cloudformation/travis-cn.template new file mode 100644 index 000000000..138e05646 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/cloudformation/travis-cn.template @@ -0,0 +1,71 @@ +{ + "AWSTemplateFormatVersion": "2010-09-09", + "Description": "mapbox-gl-js build user", + "Resources": { + "BuildUser": { + "Type": "AWS::IAM::User", + "Properties": { + "Policies": [ + { + "PolicyName": "list", + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "s3:ListBucket" + ], + "Effect": "Allow", + "Resource": [ + "arn:aws-cn:s3:::mapbox-gl-js-cn-north-1" + ] + } + ] + } + }, + { + "PolicyName": "build", + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "s3:GetObject", + "s3:GetObjectAcl", + "s3:PutObject", + "s3:PutObjectAcl" + ], + "Effect": "Allow", + "Resource": [ + "arn:aws-cn:s3:::mapbox-gl-js-cn-north-1/*" + ] + } + ] + } + } + ] + } + }, + "BuildUserKey": { + "Type": "AWS::IAM::AccessKey", + "Properties": { + "UserName": { + "Ref": "BuildUser" + } + } + } + }, + "Outputs": { + "AwsAccessKeyId": { + "Value": { + "Ref": "BuildUserKey" + } + }, + "AwsSecretAccessKey": { + "Value": { + "Fn::GetAtt": [ + "BuildUserKey", + "SecretAccessKey" + ] + } + } + } +} diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/cloudformation/travis.template b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/cloudformation/travis.template new file mode 100644 index 000000000..31b550cd5 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/cloudformation/travis.template @@ -0,0 +1,71 @@ +{ + "AWSTemplateFormatVersion": "2010-09-09", + "Description": "mapbox-gl-js build user", + "Resources": { + "BuildUser": { + "Type": "AWS::IAM::User", + "Properties": { + "Policies": [ + { + "PolicyName": "list", + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "s3:ListBucket" + ], + "Effect": "Allow", + "Resource": [ + "arn:aws:s3:::mapbox-gl-js" + ] + } + ] + } + }, + { + "PolicyName": "build", + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "s3:GetObject", + "s3:GetObjectAcl", + "s3:PutObject", + "s3:PutObjectAcl" + ], + "Effect": "Allow", + "Resource": [ + "arn:aws:s3:::mapbox-gl-js/*" + ] + } + ] + } + } + ] + } + }, + "BuildUserKey": { + "Type": "AWS::IAM::AccessKey", + "Properties": { + "UserName": { + "Ref": "BuildUser" + } + } + } + }, + "Outputs": { + "AccessKeyId": { + "Value": { + "Ref": "BuildUserKey" + } + }, + "SecretAccessKey": { + "Value": { + "Fn::GetAtt": [ + "BuildUserKey", + "SecretAccessKey" + ] + } + } + } +} diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/debug/.eslintrc b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/debug/.eslintrc new file mode 100644 index 000000000..151bc5ce8 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/debug/.eslintrc @@ -0,0 +1,16 @@ +{ + "rules": { + "prefer-arrow-callback": "off", + "no-var": "off", + "strict": "off", + "no-unused-vars": "off", + "prefer-template": "off" + }, + "env": { + "es6": false, + "browser": true + }, + "globals": { + "mapboxgl": false + } +} diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/debug/2762.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/debug/2762.html new file mode 100644 index 000000000..c6ea063e3 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/debug/2762.html @@ -0,0 +1,57 @@ + + + + Mapbox GL JS debug page + + + + + + + +
+ + + + + + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/debug/3895.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/debug/3895.html new file mode 100644 index 000000000..1b38f88e1 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/debug/3895.html @@ -0,0 +1,52 @@ + + + + Mapbox GL JS debug page + + + + + + + +
+ + + + + + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/debug/access_token.js b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/debug/access_token.js new file mode 100644 index 000000000..e7ca3cb68 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/debug/access_token.js @@ -0,0 +1,20 @@ +'use strict'; + +mapboxgl.accessToken = getAccessToken(); + +function getAccessToken() { + var accessToken = ( + process.env.MapboxAccessToken || + process.env.MAPBOX_ACCESS_TOKEN || + getURLParameter('access_token') || + localStorage.getItem('accessToken') + ); + localStorage.setItem('accessToken', accessToken); + return accessToken; +} + +function getURLParameter(name) { + var regexp = new RegExp('[?&]' + name + '=([^&#]*)', 'i'); + var output = regexp.exec(window.location.href); + return output && output[1]; +} diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/debug/chinese.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/debug/chinese.html new file mode 100644 index 000000000..8637a7368 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/debug/chinese.html @@ -0,0 +1,65 @@ + + + + Mapbox GL JS debug page + + + + + + + +
+ + + + + + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/debug/circles.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/debug/circles.html new file mode 100644 index 000000000..c9943e5cd --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/debug/circles.html @@ -0,0 +1,68 @@ + + + + Mapbox GL JS debug page + + + + + + + +
+ + + + + + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/debug/cluster.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/debug/cluster.html new file mode 100644 index 000000000..d40092eab --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/debug/cluster.html @@ -0,0 +1,89 @@ + + + + Mapbox GL JS debug page + + + + + + + +
+ + + + + + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/debug/color_spaces.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/debug/color_spaces.html new file mode 100644 index 000000000..73da913cb --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/debug/color_spaces.html @@ -0,0 +1,84 @@ + + + + Mapbox GL JS debug page + + + + + + + +
+
+ +
+ + + + + + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/debug/dark-v9.js b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/debug/dark-v9.js new file mode 100644 index 000000000..d32abbf19 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/debug/dark-v9.js @@ -0,0 +1,8979 @@ +window.darkv9 = { + "version": 8, + "name": "Mapbox Dark", + "metadata": { + "mapbox:autocomposite": true, + "mapbox:type": "default", + "mapbox:groups": { + "1444934828655.3389": { + "name": "Aeroways", + "collapsed": true + }, + "1444933322393.2852": { + "name": "POI labels (scalerank 1)", + "collapsed": true + }, + "1444855786460.0557": { + "name": "Roads", + "collapsed": true + }, + "1444856071629.7817": { + "name": "Place labels", + "collapsed": true + }, + "1444934295202.7542": { + "name": "Admin boundaries", + "collapsed": true + }, + "1444856151690.9143": { + "name": "State labels", + "collapsed": true + }, + "1444933721429.3076": { + "name": "Road labels", + "collapsed": true + }, + "1444933358918.2366": { + "name": "POI labels (scalerank 2)", + "collapsed": true + }, + "1444933808272.805": { + "name": "Water labels", + "collapsed": true + }, + "1444933372896.5967": { + "name": "POI labels (scalerank 3)", + "collapsed": true + }, + "1444855799204.86": { + "name": "Bridges", + "collapsed": true + }, + "1444856087950.3635": { + "name": "Marine labels", + "collapsed": true + }, + "1456969573402.7817": { + "name": "Hillshading", + "collapsed": true + }, + "1444856869758.2375": { + "name": "Wetlands", + "collapsed": true + }, + "1444862510685.128": { + "name": "City labels", + "collapsed": true + }, + "1444855769305.6016": { + "name": "Tunnels", + "collapsed": true + }, + "1456970288113.8113": { + "name": "Landcover", + "collapsed": true + }, + "1444856144497.7825": { + "name": "Country labels", + "collapsed": true + } + } + }, + "sources": { + "composite": { + "url": "mapbox://mapbox.mapbox-terrain-v2,mapbox.mapbox-streets-v7", + "type": "vector" + } + }, + "sprite": "mapbox://sprites/mapbox/light-v9", + "glyphs": "mapbox://fonts/mapbox/{fontstack}/{range}.pbf", + "layers": [ + { + "id": "background", + "type": "background", + "layout": {}, + "paint": { + "background-color": "hsl(55, 1%, 20%)" + } + }, + { + "id": "landcover_wood", + "type": "fill", + "metadata": { + "mapbox:group": "1456970288113.8113" + }, + "source": "composite", + "source-layer": "landcover", + "maxzoom": 14, + "filter": [ + "==", + "class", + "wood" + ], + "layout": {}, + "paint": { + "fill-color": "hsl(55, 1%, 20%)", + "fill-opacity": 0.1, + "fill-antialias": false + } + }, + { + "id": "landcover_scrub", + "type": "fill", + "metadata": { + "mapbox:group": "1456970288113.8113" + }, + "source": "composite", + "source-layer": "landcover", + "maxzoom": 14, + "filter": [ + "==", + "class", + "scrub" + ], + "layout": {}, + "paint": { + "fill-color": "hsl(55, 1%, 20%)", + "fill-opacity": 0.1, + "fill-antialias": false + } + }, + { + "id": "landcover_grass", + "type": "fill", + "metadata": { + "mapbox:group": "1456970288113.8113" + }, + "source": "composite", + "source-layer": "landcover", + "maxzoom": 14, + "filter": [ + "==", + "class", + "grass" + ], + "layout": {}, + "paint": { + "fill-color": "hsl(55, 1%, 20%)", + "fill-opacity": 0.1, + "fill-antialias": false + } + }, + { + "id": "landcover_crop", + "type": "fill", + "metadata": { + "mapbox:group": "1456970288113.8113" + }, + "source": "composite", + "source-layer": "landcover", + "maxzoom": 14, + "filter": [ + "==", + "class", + "crop" + ], + "layout": {}, + "paint": { + "fill-color": "hsl(55, 1%, 20%)", + "fill-opacity": 0.1, + "fill-antialias": false + } + }, + { + "id": "national_park", + "type": "fill", + "source": "composite", + "source-layer": "landuse_overlay", + "filter": [ + "==", + "class", + "national_park" + ], + "layout": {}, + "paint": { + "fill-color": "hsl(132, 2%, 20%)", + "fill-opacity": { + "base": 1, + "stops": [ + [ + 5, + 0 + ], + [ + 6, + 0.5 + ] + ] + } + } + }, + { + "id": "parks", + "type": "fill", + "source": "composite", + "source-layer": "landuse", + "filter": [ + "==", + "class", + "park" + ], + "layout": {}, + "paint": { + "fill-color": "hsl(132, 2%, 20%)", + "fill-opacity": { + "base": 1, + "stops": [ + [ + 5, + 0 + ], + [ + 6, + 0.75 + ] + ] + } + } + }, + { + "id": "pitch", + "type": "fill", + "source": "composite", + "source-layer": "landuse", + "filter": [ + "==", + "class", + "pitch" + ], + "layout": {}, + "paint": { + "fill-color": "hsl(132, 2%, 20%)" + } + }, + { + "id": "industrial", + "type": "fill", + "source": "composite", + "source-layer": "landuse", + "filter": [ + "==", + "class", + "industrial" + ], + "layout": {}, + "paint": { + "fill-color": "hsl(0, 0%, 20%)" + } + }, + { + "id": "sand", + "type": "fill", + "source": "composite", + "source-layer": "landuse", + "filter": [ + "==", + "class", + "sand" + ], + "layout": {}, + "paint": { + "fill-color": "hsl(132, 2%, 20%)" + } + }, + { + "id": "hillshade_highlight_bright", + "type": "fill", + "metadata": { + "mapbox:group": "1456969573402.7817" + }, + "source": "composite", + "source-layer": "hillshade", + "maxzoom": 16, + "filter": [ + "==", + "level", + 94 + ], + "layout": {}, + "paint": { + "fill-color": "#fff", + "fill-opacity": { + "stops": [ + [ + 14, + 0.04 + ], + [ + 16, + 0 + ] + ] + }, + "fill-antialias": false + } + }, + { + "id": "hillshade_highlight_med", + "type": "fill", + "metadata": { + "mapbox:group": "1456969573402.7817" + }, + "source": "composite", + "source-layer": "hillshade", + "maxzoom": 16, + "filter": [ + "==", + "level", + 90 + ], + "layout": {}, + "paint": { + "fill-color": "#fff", + "fill-opacity": { + "stops": [ + [ + 14, + 0.04 + ], + [ + 16, + 0 + ] + ] + }, + "fill-antialias": false + } + }, + { + "id": "hillshade_shadow_faint", + "type": "fill", + "metadata": { + "mapbox:group": "1456969573402.7817" + }, + "source": "composite", + "source-layer": "hillshade", + "maxzoom": 16, + "filter": [ + "==", + "level", + 89 + ], + "layout": {}, + "paint": { + "fill-color": "hsl(0, 0%, 35%)", + "fill-opacity": { + "stops": [ + [ + 14, + 0.033 + ], + [ + 16, + 0 + ] + ] + }, + "fill-antialias": false + } + }, + { + "id": "hillshade_shadow_med", + "type": "fill", + "metadata": { + "mapbox:group": "1456969573402.7817" + }, + "source": "composite", + "source-layer": "hillshade", + "maxzoom": 16, + "filter": [ + "==", + "level", + 78 + ], + "layout": {}, + "paint": { + "fill-color": "hsl(0, 0%, 35%)", + "fill-opacity": { + "stops": [ + [ + 14, + 0.033 + ], + [ + 16, + 0 + ] + ] + }, + "fill-antialias": false + } + }, + { + "id": "hillshade_shadow_dark", + "type": "fill", + "metadata": { + "mapbox:group": "1456969573402.7817" + }, + "source": "composite", + "source-layer": "hillshade", + "maxzoom": 16, + "filter": [ + "==", + "level", + 67 + ], + "layout": {}, + "paint": { + "fill-color": "hsl(0, 0%, 35%)", + "fill-opacity": { + "stops": [ + [ + 14, + 0.06 + ], + [ + 16, + 0 + ] + ] + }, + "fill-antialias": false + } + }, + { + "id": "hillshade_shadow_extreme", + "type": "fill", + "metadata": { + "mapbox:group": "1456969573402.7817" + }, + "source": "composite", + "source-layer": "hillshade", + "maxzoom": 16, + "filter": [ + "==", + "level", + 56 + ], + "layout": {}, + "paint": { + "fill-color": "hsl(0, 0%, 35%)", + "fill-opacity": { + "stops": [ + [ + 14, + 0.06 + ], + [ + 16, + 0 + ] + ] + }, + "fill-antialias": false + } + }, + { + "id": "waterway-river-canal", + "type": "line", + "source": "composite", + "source-layer": "waterway", + "minzoom": 8, + "filter": [ + "any", + [ + "==", + "class", + "canal" + ], + [ + "==", + "class", + "river" + ] + ], + "layout": { + "line-cap": { + "base": 1, + "stops": [ + [ + 0, + "butt" + ], + [ + 11, + "round" + ] + ] + }, + "line-join": "round" + }, + "paint": { + "line-color": "hsl(185, 2%, 10%)", + "line-width": { + "base": 1.3, + "stops": [ + [ + 8.5, + 0.1 + ], + [ + 20, + 8 + ] + ] + }, + "line-opacity": { + "base": 1, + "stops": [ + [ + 8, + 0 + ], + [ + 8.5, + 1 + ] + ] + } + } + }, + { + "id": "water shadow", + "type": "fill", + "source": "composite", + "source-layer": "water", + "layout": {}, + "paint": { + "fill-color": "hsl(185, 3%, 5%)", + "fill-translate": { + "base": 1.2, + "stops": [ + [ + 7, + [ + 0, + 0 + ] + ], + [ + 16, + [ + -1, + -1 + ] + ] + ] + }, + "fill-translate-anchor": "viewport", + "fill-opacity": 1 + } + }, + { + "id": "water", + "ref": "water shadow", + "paint": { + "fill-color": "hsl(185, 2%, 10%)" + } + }, + { + "id": "barrier_line-land-polygon", + "type": "fill", + "source": "composite", + "source-layer": "barrier_line", + "filter": [ + "all", + [ + "==", + "$type", + "Polygon" + ], + [ + "==", + "class", + "land" + ] + ], + "layout": {}, + "paint": { + "fill-color": "hsl(55, 1%, 20%)", + "fill-outline-color": "hsl(55, 1%, 20%)" + } + }, + { + "id": "barrier_line-land-line", + "type": "line", + "source": "composite", + "source-layer": "barrier_line", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "==", + "class", + "land" + ] + ], + "layout": { + "line-cap": "round" + }, + "paint": { + "line-width": { + "base": 1.99, + "stops": [ + [ + 14, + 0.75 + ], + [ + 20, + 40 + ] + ] + }, + "line-color": "hsl(55, 1%, 20%)" + } + }, + { + "id": "aeroway-polygon", + "type": "fill", + "metadata": { + "mapbox:group": "1444934828655.3389" + }, + "source": "composite", + "source-layer": "aeroway", + "minzoom": 11, + "filter": [ + "all", + [ + "==", + "$type", + "Polygon" + ], + [ + "!=", + "type", + "apron" + ] + ], + "layout": {}, + "paint": { + "fill-color": "hsl(0, 0%, 27%)", + "fill-opacity": { + "base": 1, + "stops": [ + [ + 11, + 0 + ], + [ + 11.5, + 1 + ] + ] + } + } + }, + { + "id": "aeroway-runway", + "type": "line", + "metadata": { + "mapbox:group": "1444934828655.3389" + }, + "source": "composite", + "source-layer": "aeroway", + "minzoom": 9, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "==", + "type", + "runway" + ] + ], + "layout": {}, + "paint": { + "line-color": "hsl(0, 0%, 27%)", + "line-width": { + "base": 1.5, + "stops": [ + [ + 9, + 1 + ], + [ + 18, + 80 + ] + ] + } + } + }, + { + "id": "aeroway-taxiway", + "type": "line", + "metadata": { + "mapbox:group": "1444934828655.3389" + }, + "source": "composite", + "source-layer": "aeroway", + "minzoom": 9, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "==", + "type", + "taxiway" + ] + ], + "layout": {}, + "paint": { + "line-color": "hsl(0, 0%, 27%)", + "line-width": { + "base": 1.5, + "stops": [ + [ + 10, + 0.5 + ], + [ + 18, + 20 + ] + ] + } + } + }, + { + "id": "building", + "type": "fill", + "source": "composite", + "source-layer": "building", + "minzoom": 15, + "filter": [ + "all", + [ + "!=", + "type", + "building:part" + ], + [ + "==", + "underground", + "false" + ] + ], + "layout": {}, + "paint": { + "fill-color": "hsl(55, 1%, 17%)", + "fill-opacity": { + "base": 1, + "stops": [ + [ + 15.5, + 0 + ], + [ + 16, + 1 + ] + ] + }, + "fill-outline-color": "hsl(55, 1%, 15%)", + "fill-antialias": true + } + }, + { + "id": "tunnel-street-low", + "type": "line", + "metadata": { + "mapbox:group": "1444855769305.6016" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 11, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "street" + ], + [ + "==", + "structure", + "tunnel" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12.5, + 0.5 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-color": "hsl(185, 2%, 15%)", + "line-opacity": { + "stops": [ + [ + 11.5, + 0 + ], + [ + 12, + 1 + ], + [ + 14, + 1 + ], + [ + 14.01, + 0 + ] + ] + } + } + }, + { + "id": "tunnel-street_limited-low", + "type": "line", + "metadata": { + "mapbox:group": "1444855769305.6016" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 11, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "street_limited" + ], + [ + "==", + "structure", + "tunnel" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12.5, + 0.5 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-color": "hsl(185, 2%, 15%)", + "line-opacity": { + "stops": [ + [ + 11.5, + 0 + ], + [ + 12, + 1 + ], + [ + 14, + 1 + ], + [ + 14.01, + 0 + ] + ] + } + } + }, + { + "id": "tunnel-service-link-track-case", + "type": "line", + "metadata": { + "mapbox:group": "1444855769305.6016" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 14, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "in", + "class", + "link", + "service", + "track" + ], + [ + "==", + "structure", + "tunnel" + ], + [ + "!=", + "type", + "trunk_link" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12, + 0.75 + ], + [ + 20, + 2 + ] + ] + }, + "line-color": "hsl(185, 2%, 29%)", + "line-gap-width": { + "base": 1.5, + "stops": [ + [ + 14, + 0.5 + ], + [ + 18, + 12 + ] + ] + }, + "line-dasharray": [ + 3, + 3 + ] + } + }, + { + "id": "tunnel-street_limited-case", + "metadata": { + "mapbox:group": "1444855769305.6016" + }, + "ref": "tunnel-street_limited-low", + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12, + 0.75 + ], + [ + 20, + 2 + ] + ] + }, + "line-color": "hsl(185, 2%, 29%)", + "line-gap-width": { + "base": 1.5, + "stops": [ + [ + 13, + 0 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-dasharray": [ + 3, + 3 + ], + "line-opacity": { + "base": 1, + "stops": [ + [ + 13.99, + 0 + ], + [ + 14, + 1 + ] + ] + } + } + }, + { + "id": "tunnel-street-case", + "metadata": { + "mapbox:group": "1444855769305.6016" + }, + "ref": "tunnel-street-low", + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12, + 0.75 + ], + [ + 20, + 2 + ] + ] + }, + "line-color": "hsl(185, 2%, 29%)", + "line-gap-width": { + "base": 1.5, + "stops": [ + [ + 13, + 0 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-dasharray": [ + 3, + 3 + ], + "line-opacity": { + "base": 1, + "stops": [ + [ + 13.99, + 0 + ], + [ + 14, + 1 + ] + ] + } + } + }, + { + "id": "tunnel-secondary-tertiary-case", + "type": "line", + "metadata": { + "mapbox:group": "1444855769305.6016" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "in", + "class", + "secondary", + "tertiary" + ], + [ + "==", + "structure", + "tunnel" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.2, + "stops": [ + [ + 10, + 0.75 + ], + [ + 18, + 2 + ] + ] + }, + "line-dasharray": [ + 3, + 3 + ], + "line-gap-width": { + "base": 1.5, + "stops": [ + [ + 8.5, + 0.5 + ], + [ + 10, + 0.75 + ], + [ + 18, + 26 + ] + ] + }, + "line-color": "hsl(185, 2%, 29%)" + } + }, + { + "id": "tunnel-primary-case", + "type": "line", + "metadata": { + "mapbox:group": "1444855769305.6016" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "primary" + ], + [ + "==", + "structure", + "tunnel" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 5, + 0.75 + ], + [ + 16, + 2 + ] + ] + }, + "line-dasharray": [ + 3, + 3 + ], + "line-gap-width": { + "base": 1.5, + "stops": [ + [ + 5, + 0.75 + ], + [ + 18, + 32 + ] + ] + }, + "line-color": "hsl(185, 2%, 29%)" + } + }, + { + "id": "tunnel-trunk_link-case", + "type": "line", + "metadata": { + "mapbox:group": "1444855769305.6016" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "structure", + "tunnel" + ], + [ + "==", + "type", + "trunk_link" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12, + 0.75 + ], + [ + 20, + 2 + ] + ] + }, + "line-color": "hsl(185, 2%, 29%)", + "line-gap-width": { + "base": 1.5, + "stops": [ + [ + 12, + 0.5 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-dasharray": [ + 3, + 3 + ] + } + }, + { + "id": "tunnel-motorway_link-case", + "type": "line", + "metadata": { + "mapbox:group": "1444855769305.6016" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "motorway_link" + ], + [ + "==", + "structure", + "tunnel" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12, + 0.75 + ], + [ + 20, + 2 + ] + ] + }, + "line-color": "hsl(185, 2%, 29%)", + "line-gap-width": { + "base": 1.5, + "stops": [ + [ + 12, + 0.5 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-dasharray": [ + 3, + 3 + ] + } + }, + { + "id": "tunnel-trunk-case", + "type": "line", + "metadata": { + "mapbox:group": "1444855769305.6016" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "structure", + "tunnel" + ], + [ + "==", + "type", + "trunk" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 5, + 0.75 + ], + [ + 16, + 2 + ] + ] + }, + "line-color": "hsl(185, 2%, 29%)", + "line-gap-width": { + "base": 1.5, + "stops": [ + [ + 5, + 0.75 + ], + [ + 18, + 32 + ] + ] + }, + "line-opacity": 1, + "line-dasharray": [ + 3, + 3 + ] + } + }, + { + "id": "tunnel-motorway-case", + "type": "line", + "metadata": { + "mapbox:group": "1444855769305.6016" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "motorway" + ], + [ + "==", + "structure", + "tunnel" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 5, + 0.75 + ], + [ + 16, + 2 + ] + ] + }, + "line-color": "hsl(185, 2%, 29%)", + "line-gap-width": { + "base": 1.5, + "stops": [ + [ + 5, + 0.75 + ], + [ + 18, + 32 + ] + ] + }, + "line-opacity": 1, + "line-dasharray": [ + 3, + 3 + ] + } + }, + { + "id": "tunnel-construction", + "type": "line", + "metadata": { + "mapbox:group": "1444855769305.6016" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 14, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "construction" + ], + [ + "==", + "structure", + "tunnel" + ] + ] + ], + "layout": { + "line-join": "miter" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12.5, + 0.5 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-color": "hsl(185, 2%, 15%)", + "line-opacity": { + "base": 1, + "stops": [ + [ + 13.99, + 0 + ], + [ + 14, + 1 + ] + ] + }, + "line-dasharray": { + "base": 1, + "stops": [ + [ + 14, + [ + 0.4, + 0.8 + ] + ], + [ + 15, + [ + 0.3, + 0.6 + ] + ], + [ + 16, + [ + 0.2, + 0.3 + ] + ], + [ + 17, + [ + 0.2, + 0.25 + ] + ], + [ + 18, + [ + 0.15, + 0.15 + ] + ] + ] + } + } + }, + { + "id": "tunnel-path", + "type": "line", + "metadata": { + "mapbox:group": "1444855769305.6016" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "path" + ], + [ + "==", + "structure", + "tunnel" + ], + [ + "!=", + "type", + "steps" + ] + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 15, + 1 + ], + [ + 18, + 4 + ] + ] + }, + "line-dasharray": { + "base": 1, + "stops": [ + [ + 14, + [ + 1, + 0 + ] + ], + [ + 15, + [ + 1.75, + 1 + ] + ], + [ + 16, + [ + 1, + 0.75 + ] + ], + [ + 17, + [ + 1, + 0.5 + ] + ] + ] + }, + "line-color": "hsl(185, 2%, 15%)", + "line-opacity": { + "base": 1, + "stops": [ + [ + 14, + 0 + ], + [ + 14.25, + 1 + ] + ] + } + } + }, + { + "id": "tunnel-steps", + "type": "line", + "metadata": { + "mapbox:group": "1444855769305.6016" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "structure", + "tunnel" + ], + [ + "==", + "type", + "steps" + ] + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 15, + 1 + ], + [ + 18, + 4 + ] + ] + }, + "line-color": "hsl(185, 2%, 15%)", + "line-dasharray": { + "base": 1, + "stops": [ + [ + 14, + [ + 1, + 0 + ] + ], + [ + 15, + [ + 1.75, + 1 + ] + ], + [ + 16, + [ + 1, + 0.75 + ] + ], + [ + 17, + [ + 0.3, + 0.3 + ] + ] + ] + }, + "line-opacity": { + "base": 1, + "stops": [ + [ + 14, + 0 + ], + [ + 14.25, + 1 + ] + ] + } + } + }, + { + "id": "tunnel-trunk_link", + "metadata": { + "mapbox:group": "1444855769305.6016" + }, + "ref": "tunnel-trunk_link-case", + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12, + 0.5 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-color": "hsl(185, 2%, 15%)", + "line-opacity": 1, + "line-dasharray": [ + 1, + 0 + ] + } + }, + { + "id": "tunnel-motorway_link", + "metadata": { + "mapbox:group": "1444855769305.6016" + }, + "ref": "tunnel-motorway_link-case", + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12, + 0.5 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-color": "hsl(185, 2%, 15%)", + "line-opacity": 1, + "line-dasharray": [ + 1, + 0 + ] + } + }, + { + "id": "tunnel-pedestrian", + "type": "line", + "metadata": { + "mapbox:group": "1444855769305.6016" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "pedestrian" + ], + [ + "==", + "structure", + "tunnel" + ] + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 14, + 0.5 + ], + [ + 18, + 12 + ] + ] + }, + "line-color": "hsl(185, 2%, 15%)", + "line-opacity": 1, + "line-dasharray": { + "base": 1, + "stops": [ + [ + 14, + [ + 1, + 0 + ] + ], + [ + 15, + [ + 1.5, + 0.4 + ] + ], + [ + 16, + [ + 1, + 0.2 + ] + ] + ] + } + } + }, + { + "id": "tunnel-service-link-track", + "metadata": { + "mapbox:group": "1444855769305.6016" + }, + "ref": "tunnel-service-link-track-case", + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 14, + 0.5 + ], + [ + 18, + 12 + ] + ] + }, + "line-color": "hsl(185, 2%, 15%)", + "line-dasharray": [ + 1, + 0 + ] + } + }, + { + "id": "tunnel-street_limited", + "metadata": { + "mapbox:group": "1444855769305.6016" + }, + "ref": "tunnel-street_limited-low", + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12.5, + 0.5 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-color": "hsl(185, 2%, 15%)", + "line-opacity": { + "base": 1, + "stops": [ + [ + 13.99, + 0 + ], + [ + 14, + 1 + ] + ] + } + } + }, + { + "id": "tunnel-street", + "metadata": { + "mapbox:group": "1444855769305.6016" + }, + "ref": "tunnel-street-low", + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12.5, + 0.5 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-color": "hsl(185, 2%, 15%)", + "line-opacity": { + "base": 1, + "stops": [ + [ + 13.99, + 0 + ], + [ + 14, + 1 + ] + ] + } + } + }, + { + "id": "tunnel-secondary-tertiary", + "metadata": { + "mapbox:group": "1444855769305.6016" + }, + "ref": "tunnel-secondary-tertiary-case", + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 8.5, + 0.5 + ], + [ + 10, + 0.75 + ], + [ + 18, + 26 + ] + ] + }, + "line-color": "hsl(185, 2%, 15%)", + "line-opacity": 1, + "line-dasharray": [ + 1, + 0 + ], + "line-blur": 0 + } + }, + { + "id": "tunnel-primary", + "metadata": { + "mapbox:group": "1444855769305.6016" + }, + "ref": "tunnel-primary-case", + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 5, + 0.75 + ], + [ + 18, + 32 + ] + ] + }, + "line-color": "hsl(185, 2%, 15%)", + "line-opacity": 1, + "line-dasharray": [ + 1, + 0 + ], + "line-blur": 0 + } + }, + { + "id": "tunnel-trunk", + "type": "line", + "metadata": { + "mapbox:group": "1444855769305.6016" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "trunk" + ], + [ + "==", + "structure", + "tunnel" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 5, + 0.75 + ], + [ + 18, + 32 + ] + ] + }, + "line-color": "hsl(185, 2%, 15%)" + } + }, + { + "id": "tunnel-motorway", + "metadata": { + "mapbox:group": "1444855769305.6016" + }, + "ref": "tunnel-motorway-case", + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 5, + 0.75 + ], + [ + 18, + 32 + ] + ] + }, + "line-dasharray": [ + 1, + 0 + ], + "line-opacity": 1, + "line-color": "hsl(185, 2%, 15%)", + "line-blur": 0 + } + }, + { + "id": "road-pedestrian-case", + "type": "line", + "metadata": { + "mapbox:group": "1444855786460.0557" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 12, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "pedestrian" + ], + [ + "==", + "structure", + "none" + ] + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 14, + 2 + ], + [ + 18, + 14.5 + ] + ] + }, + "line-color": "hsl(0, 0%, 17%)", + "line-gap-width": 0, + "line-opacity": { + "base": 1, + "stops": [ + [ + 13.9, + 0 + ], + [ + 14, + 1 + ] + ] + } + } + }, + { + "id": "road-street-low", + "type": "line", + "metadata": { + "mapbox:group": "1444855786460.0557" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 11, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "street" + ], + [ + "==", + "structure", + "none" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12.5, + 0.5 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-color": "hsl(0, 0%, 27%)", + "line-opacity": { + "stops": [ + [ + 11, + 0 + ], + [ + 11.25, + 1 + ], + [ + 14, + 1 + ], + [ + 14.01, + 0 + ] + ] + } + } + }, + { + "id": "road-street_limited-low", + "type": "line", + "metadata": { + "mapbox:group": "1444855786460.0557" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 11, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "street_limited" + ], + [ + "==", + "structure", + "none" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12.5, + 0.5 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-color": "hsl(0, 0%, 27%)", + "line-opacity": { + "stops": [ + [ + 11, + 0 + ], + [ + 11.25, + 1 + ], + [ + 14, + 1 + ], + [ + 14.01, + 0 + ] + ] + } + } + }, + { + "id": "road-service-link-track-case", + "type": "line", + "metadata": { + "mapbox:group": "1444855786460.0557" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 14, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "in", + "class", + "link", + "service", + "track" + ], + [ + "!in", + "structure", + "bridge", + "tunnel" + ], + [ + "!=", + "type", + "trunk_link" + ] + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12, + 0.75 + ], + [ + 20, + 2 + ] + ] + }, + "line-color": "hsl(0, 0%, 17%)", + "line-gap-width": { + "base": 1.5, + "stops": [ + [ + 14, + 0.5 + ], + [ + 18, + 12 + ] + ] + }, + "line-opacity": { + "base": 1, + "stops": [ + [ + 13.9, + 0 + ], + [ + 14, + 1 + ] + ] + } + } + }, + { + "id": "road-street_limited-case", + "metadata": { + "mapbox:group": "1444855786460.0557" + }, + "ref": "road-street_limited-low", + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12, + 0.75 + ], + [ + 20, + 2 + ] + ] + }, + "line-color": "hsl(0, 0%, 17%)", + "line-gap-width": { + "base": 1.5, + "stops": [ + [ + 13, + 0 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-opacity": { + "base": 1, + "stops": [ + [ + 13.9, + 0 + ], + [ + 14, + 1 + ] + ] + } + } + }, + { + "id": "road-street-case", + "metadata": { + "mapbox:group": "1444855786460.0557" + }, + "ref": "road-street-low", + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12, + 0.75 + ], + [ + 20, + 2 + ] + ] + }, + "line-color": "hsl(0, 0%, 17%)", + "line-gap-width": { + "base": 1.5, + "stops": [ + [ + 13, + 0 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-opacity": { + "base": 1, + "stops": [ + [ + 13.9, + 0 + ], + [ + 14, + 1 + ] + ] + } + } + }, + { + "id": "road-main-case", + "type": "line", + "metadata": { + "mapbox:group": "1444855786460.0557" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "in", + "class", + "secondary", + "tertiary" + ], + [ + "!in", + "structure", + "bridge", + "tunnel" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.2, + "stops": [ + [ + 10, + 0.75 + ], + [ + 18, + 2 + ] + ] + }, + "line-color": "hsl(0, 0%, 17%)", + "line-gap-width": { + "base": 1.5, + "stops": [ + [ + 8.5, + 0.5 + ], + [ + 10, + 0.75 + ], + [ + 18, + 26 + ] + ] + }, + "line-opacity": { + "base": 1, + "stops": [ + [ + 6, + 0 + ], + [ + 7, + 0.4 + ], + [ + 9, + 0.5 + ], + [ + 10, + 1 + ] + ] + } + } + }, + { + "id": "road-primary-case", + "type": "line", + "metadata": { + "mapbox:group": "1444855786460.0557" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "primary" + ], + [ + "!in", + "structure", + "bridge", + "tunnel" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 5, + 0.75 + ], + [ + 16, + 2 + ] + ] + }, + "line-color": "hsl(0, 0%, 17%)", + "line-gap-width": { + "base": 1.5, + "stops": [ + [ + 5, + 0.75 + ], + [ + 18, + 32 + ] + ] + }, + "line-opacity": { + "base": 1, + "stops": [ + [ + 6, + 0 + ], + [ + 7, + 0.4 + ], + [ + 9, + 0.5 + ], + [ + 10, + 1 + ] + ] + } + } + }, + { + "id": "road-motorway_link-case", + "type": "line", + "metadata": { + "mapbox:group": "1444855786460.0557" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 10, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "motorway_link" + ], + [ + "!in", + "structure", + "bridge", + "tunnel" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12, + 0.75 + ], + [ + 20, + 2 + ] + ] + }, + "line-color": "hsl(0, 0%, 17%)", + "line-gap-width": { + "base": 1.5, + "stops": [ + [ + 12, + 0.5 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-opacity": { + "base": 1, + "stops": [ + [ + 6, + 0 + ], + [ + 7, + 0.4 + ], + [ + 9, + 0.5 + ], + [ + 10, + 1 + ] + ] + } + } + }, + { + "id": "road-trunk_link-case", + "type": "line", + "metadata": { + "mapbox:group": "1444855786460.0557" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 11, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "!in", + "structure", + "bridge", + "tunnel" + ], + [ + "==", + "type", + "trunk_link" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12, + 0.75 + ], + [ + 20, + 2 + ] + ] + }, + "line-color": "hsl(0, 0%, 17%)", + "line-gap-width": { + "base": 1.5, + "stops": [ + [ + 12, + 0.5 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-opacity": { + "base": 1, + "stops": [ + [ + 6, + 0 + ], + [ + 7, + 0.4 + ], + [ + 9, + 0.5 + ], + [ + 10, + 1 + ] + ] + } + } + }, + { + "id": "road-trunk-case", + "type": "line", + "metadata": { + "mapbox:group": "1444855786460.0557" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 5, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "trunk" + ], + [ + "!in", + "structure", + "bridge", + "tunnel" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 7, + 0.5 + ], + [ + 10, + 1 + ], + [ + 16, + 2 + ] + ] + }, + "line-color": "hsl(0, 0%, 17%)", + "line-gap-width": { + "base": 1.5, + "stops": [ + [ + 5, + 0.5 + ], + [ + 9, + 1.4 + ], + [ + 18, + 32 + ] + ] + }, + "line-opacity": { + "base": 1, + "stops": [ + [ + 6, + 0 + ], + [ + 6.1, + 1 + ] + ] + } + } + }, + { + "id": "road-motorway-case", + "type": "line", + "metadata": { + "mapbox:group": "1444855786460.0557" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "motorway" + ], + [ + "!in", + "structure", + "bridge", + "tunnel" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 7, + 0.5 + ], + [ + 10, + 1 + ], + [ + 16, + 2 + ] + ] + }, + "line-color": "hsl(0, 0%, 17%)", + "line-gap-width": { + "base": 1.5, + "stops": [ + [ + 5, + 0.75 + ], + [ + 18, + 32 + ] + ] + }, + "line-opacity": 1 + } + }, + { + "id": "road-construction", + "type": "line", + "metadata": { + "mapbox:group": "1444855786460.0557" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 14, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "construction" + ], + [ + "==", + "structure", + "none" + ] + ] + ], + "layout": { + "line-join": "miter" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12.5, + 0.5 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-color": "hsl(0, 0%, 27%)", + "line-opacity": { + "base": 1, + "stops": [ + [ + 13.99, + 0 + ], + [ + 14, + 1 + ] + ] + }, + "line-dasharray": { + "base": 1, + "stops": [ + [ + 14, + [ + 0.4, + 0.8 + ] + ], + [ + 15, + [ + 0.3, + 0.6 + ] + ], + [ + 16, + [ + 0.2, + 0.3 + ] + ], + [ + 17, + [ + 0.2, + 0.25 + ] + ], + [ + 18, + [ + 0.15, + 0.15 + ] + ] + ] + } + } + }, + { + "id": "road-sidewalks", + "type": "line", + "metadata": { + "mapbox:group": "1444855786460.0557" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 16, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "!in", + "structure", + "bridge", + "tunnel" + ], + [ + "in", + "type", + "crossing", + "sidewalk" + ] + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 15, + 1 + ], + [ + 18, + 4 + ] + ] + }, + "line-color": "hsl(0, 0%, 27%)", + "line-dasharray": { + "base": 1, + "stops": [ + [ + 14, + [ + 1, + 0 + ] + ], + [ + 15, + [ + 1.75, + 1 + ] + ], + [ + 16, + [ + 1, + 0.75 + ] + ], + [ + 17, + [ + 1, + 0.5 + ] + ] + ] + }, + "line-opacity": { + "base": 1, + "stops": [ + [ + 16, + 0 + ], + [ + 16.25, + 1 + ] + ] + } + } + }, + { + "id": "road-path", + "type": "line", + "metadata": { + "mapbox:group": "1444855786460.0557" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "path" + ], + [ + "!in", + "structure", + "bridge", + "tunnel" + ], + [ + "!in", + "type", + "crossing", + "sidewalk", + "steps" + ] + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 15, + 1 + ], + [ + 18, + 4 + ] + ] + }, + "line-color": "hsl(0, 0%, 27%)", + "line-dasharray": { + "base": 1, + "stops": [ + [ + 14, + [ + 1, + 0 + ] + ], + [ + 15, + [ + 1.75, + 1 + ] + ], + [ + 16, + [ + 1, + 0.75 + ] + ], + [ + 17, + [ + 1, + 0.5 + ] + ] + ] + }, + "line-opacity": { + "base": 1, + "stops": [ + [ + 14, + 0 + ], + [ + 14.25, + 1 + ] + ] + } + } + }, + { + "id": "road-steps", + "type": "line", + "metadata": { + "mapbox:group": "1444855786460.0557" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "!in", + "structure", + "bridge", + "tunnel" + ], + [ + "==", + "type", + "steps" + ] + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 15, + 1 + ], + [ + 18, + 4 + ] + ] + }, + "line-color": "hsl(0, 0%, 27%)", + "line-dasharray": { + "base": 1, + "stops": [ + [ + 14, + [ + 1, + 0 + ] + ], + [ + 15, + [ + 1.75, + 1 + ] + ], + [ + 16, + [ + 1, + 0.75 + ] + ], + [ + 17, + [ + 0.3, + 0.3 + ] + ] + ] + }, + "line-opacity": { + "base": 1, + "stops": [ + [ + 14, + 0 + ], + [ + 14.25, + 1 + ] + ] + } + } + }, + { + "id": "road-trunk_link", + "metadata": { + "mapbox:group": "1444855786460.0557" + }, + "ref": "road-trunk_link-case", + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12, + 0.5 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-color": "hsl(0, 0%, 27%)", + "line-opacity": 1 + } + }, + { + "id": "road-motorway_link", + "metadata": { + "mapbox:group": "1444855786460.0557" + }, + "ref": "road-motorway_link-case", + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12, + 0.5 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-color": "hsl(0, 0%, 27%)", + "line-opacity": 1 + } + }, + { + "id": "road-pedestrian", + "metadata": { + "mapbox:group": "1444855786460.0557" + }, + "ref": "road-pedestrian-case", + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 14, + 0.5 + ], + [ + 18, + 12 + ] + ] + }, + "line-color": "hsl(0, 0%, 27%)", + "line-opacity": 1, + "line-dasharray": { + "base": 1, + "stops": [ + [ + 14, + [ + 1, + 0 + ] + ], + [ + 15, + [ + 1.5, + 0.4 + ] + ], + [ + 16, + [ + 1, + 0.2 + ] + ] + ] + } + } + }, + { + "id": "road-service-link-track", + "type": "line", + "metadata": { + "mapbox:group": "1444855786460.0557" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 14, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "in", + "class", + "link", + "service", + "track" + ], + [ + "!in", + "structure", + "bridge", + "tunnel" + ], + [ + "!=", + "type", + "trunk_link" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 14, + 0.5 + ], + [ + 18, + 12 + ] + ] + }, + "line-color": "hsl(0, 0%, 27%)" + } + }, + { + "id": "road-street_limited", + "metadata": { + "mapbox:group": "1444855786460.0557" + }, + "ref": "road-street_limited-low", + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12.5, + 0.5 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-color": "hsl(0, 0%, 27%)", + "line-opacity": { + "base": 1, + "stops": [ + [ + 13.99, + 0 + ], + [ + 14, + 1 + ] + ] + } + } + }, + { + "id": "road-street", + "metadata": { + "mapbox:group": "1444855786460.0557" + }, + "ref": "road-street-low", + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12.5, + 0.5 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-color": "hsl(0, 0%, 27%)", + "line-opacity": { + "base": 1, + "stops": [ + [ + 13.99, + 0 + ], + [ + 14, + 1 + ] + ] + } + } + }, + { + "id": "road-secondary-tertiary", + "metadata": { + "mapbox:group": "1444855786460.0557" + }, + "ref": "road-main-case", + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 8.5, + 0.5 + ], + [ + 10, + 0.75 + ], + [ + 18, + 26 + ] + ] + }, + "line-color": "hsl(0, 0%, 27%)", + "line-opacity": { + "base": 1.2, + "stops": [ + [ + 5, + 0 + ], + [ + 5.5, + 1 + ] + ] + } + } + }, + { + "id": "road-primary", + "metadata": { + "mapbox:group": "1444855786460.0557" + }, + "ref": "road-primary-case", + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 5, + 0.75 + ], + [ + 18, + 32 + ] + ] + }, + "line-color": "hsl(0, 0%, 27%)", + "line-opacity": { + "base": 1.2, + "stops": [ + [ + 5, + 0 + ], + [ + 5.5, + 1 + ] + ] + } + } + }, + { + "id": "road-trunk", + "metadata": { + "mapbox:group": "1444855786460.0557" + }, + "ref": "road-trunk-case", + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 5, + 0.5 + ], + [ + 9, + 1.4 + ], + [ + 18, + 32 + ] + ] + }, + "line-color": "hsl(0, 0%, 27%)", + "line-opacity": 1 + } + }, + { + "id": "road-motorway", + "metadata": { + "mapbox:group": "1444855786460.0557" + }, + "ref": "road-motorway-case", + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 5, + 0.75 + ], + [ + 18, + 32 + ] + ] + }, + "line-color": "hsl(0, 0%, 27%)", + "line-opacity": 1 + } + }, + { + "id": "road-rail", + "type": "line", + "metadata": { + "mapbox:group": "1444855786460.0557" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "in", + "class", + "major_rail", + "minor_rail" + ], + [ + "!in", + "structure", + "bridge", + "tunnel" + ] + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "hsl(0, 0%, 17%)", + "line-width": { + "base": 1, + "stops": [ + [ + 14, + 0.75 + ], + [ + 20, + 1 + ] + ] + } + } + }, + { + "id": "bridge-pedestrian-case", + "type": "line", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "pedestrian" + ], + [ + "==", + "structure", + "bridge" + ] + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 14, + 2 + ], + [ + 18, + 14.5 + ] + ] + }, + "line-color": "hsl(0, 0%, 17%)", + "line-gap-width": 0, + "line-opacity": { + "base": 1, + "stops": [ + [ + 13.99, + 0 + ], + [ + 14, + 1 + ] + ] + } + } + }, + { + "id": "bridge-street-low", + "type": "line", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 11, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "street" + ], + [ + "==", + "structure", + "bridge" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12.5, + 0.5 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-color": "hsl(0, 0%, 27%)", + "line-opacity": { + "stops": [ + [ + 11.5, + 0 + ], + [ + 12, + 1 + ], + [ + 14, + 1 + ], + [ + 14.01, + 0 + ] + ] + } + } + }, + { + "id": "bridge-street_limited-low", + "type": "line", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 11, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "street_limited" + ], + [ + "==", + "structure", + "bridge" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12.5, + 0.5 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-color": "hsl(0, 0%, 27%)", + "line-opacity": { + "stops": [ + [ + 11.5, + 0 + ], + [ + 12, + 1 + ], + [ + 14, + 1 + ], + [ + 14.01, + 0 + ] + ] + } + } + }, + { + "id": "bridge-service-link-track-case", + "type": "line", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 14, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "in", + "class", + "link", + "service", + "track" + ], + [ + "==", + "structure", + "bridge" + ], + [ + "!=", + "type", + "trunk_link" + ] + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12, + 0.75 + ], + [ + 20, + 2 + ] + ] + }, + "line-color": "hsl(0, 0%, 17%)", + "line-gap-width": { + "base": 1.5, + "stops": [ + [ + 14, + 0.5 + ], + [ + 18, + 12 + ] + ] + } + } + }, + { + "id": "bridge-street_limited-case", + "type": "line", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 11, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "street_limited" + ], + [ + "==", + "structure", + "bridge" + ] + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12, + 0.75 + ], + [ + 20, + 2 + ] + ] + }, + "line-color": "hsl(0, 0%, 17%)", + "line-gap-width": { + "base": 1.5, + "stops": [ + [ + 13, + 0 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + } + } + }, + { + "id": "bridge-street-case", + "type": "line", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 11, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "street" + ], + [ + "==", + "structure", + "bridge" + ] + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12, + 0.75 + ], + [ + 20, + 2 + ] + ] + }, + "line-color": "hsl(0, 0%, 17%)", + "line-opacity": { + "base": 1, + "stops": [ + [ + 13.99, + 0 + ], + [ + 14, + 1 + ] + ] + }, + "line-gap-width": { + "base": 1.5, + "stops": [ + [ + 13, + 0 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + } + } + }, + { + "id": "bridge-secondary-tertiary-case", + "type": "line", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "in", + "class", + "secondary", + "tertiary" + ], + [ + "==", + "structure", + "bridge" + ] + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.2, + "stops": [ + [ + 10, + 0.75 + ], + [ + 18, + 2 + ] + ] + }, + "line-color": "hsl(0, 0%, 17%)", + "line-gap-width": { + "base": 1.5, + "stops": [ + [ + 8.5, + 0.5 + ], + [ + 10, + 0.75 + ], + [ + 18, + 26 + ] + ] + }, + "line-translate": [ + 0, + 0 + ] + } + }, + { + "id": "bridge-primary-case", + "type": "line", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "primary" + ], + [ + "==", + "structure", + "bridge" + ] + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 5, + 0.75 + ], + [ + 16, + 2 + ] + ] + }, + "line-color": "hsl(0, 0%, 17%)", + "line-gap-width": { + "base": 1.5, + "stops": [ + [ + 5, + 0.75 + ], + [ + 18, + 32 + ] + ] + }, + "line-translate": [ + 0, + 0 + ] + } + }, + { + "id": "bridge-trunk_link-case", + "type": "line", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "structure", + "bridge" + ], + [ + "==", + "type", + "trunk_link" + ] + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12, + 0.75 + ], + [ + 20, + 2 + ] + ] + }, + "line-color": "hsl(0, 0%, 17%)", + "line-gap-width": { + "base": 1.5, + "stops": [ + [ + 12, + 0.5 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-opacity": { + "base": 1, + "stops": [ + [ + 10.99, + 0 + ], + [ + 11, + 1 + ] + ] + } + } + }, + { + "id": "bridge-motorway_link-case", + "type": "line", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "motorway_link" + ], + [ + "<=", + "layer", + 1 + ], + [ + "==", + "structure", + "bridge" + ] + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12, + 0.75 + ], + [ + 20, + 2 + ] + ] + }, + "line-color": "hsl(0, 0%, 17%)", + "line-gap-width": { + "base": 1.5, + "stops": [ + [ + 12, + 0.5 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-opacity": 1 + } + }, + { + "id": "bridge-trunk-case", + "type": "line", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "trunk" + ], + [ + "==", + "structure", + "bridge" + ] + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 10, + 1 + ], + [ + 16, + 2 + ] + ] + }, + "line-color": "hsl(0, 0%, 17%)", + "line-gap-width": { + "base": 1.5, + "stops": [ + [ + 5, + 0.75 + ], + [ + 18, + 32 + ] + ] + } + } + }, + { + "id": "bridge-motorway-case", + "type": "line", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "motorway" + ], + [ + "==", + "structure", + "bridge" + ] + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 7, + 0.5 + ], + [ + 10, + 1 + ], + [ + 16, + 2 + ] + ] + }, + "line-color": "hsl(0, 0%, 17%)", + "line-gap-width": { + "base": 1.5, + "stops": [ + [ + 5, + 0.75 + ], + [ + 18, + 32 + ] + ] + } + } + }, + { + "id": "bridge-construction", + "type": "line", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 14, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "construction" + ], + [ + "==", + "structure", + "bridge" + ] + ] + ], + "layout": { + "line-join": "miter" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12.5, + 0.5 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-color": "hsl(0, 0%, 27%)", + "line-opacity": { + "base": 1, + "stops": [ + [ + 13.99, + 0 + ], + [ + 14, + 1 + ] + ] + }, + "line-dasharray": { + "base": 1, + "stops": [ + [ + 14, + [ + 0.4, + 0.8 + ] + ], + [ + 15, + [ + 0.3, + 0.6 + ] + ], + [ + 16, + [ + 0.2, + 0.3 + ] + ], + [ + 17, + [ + 0.2, + 0.25 + ] + ], + [ + 18, + [ + 0.15, + 0.15 + ] + ] + ] + } + } + }, + { + "id": "bridge-path", + "type": "line", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "path" + ], + [ + "==", + "structure", + "bridge" + ], + [ + "!=", + "type", + "steps" + ] + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 15, + 1 + ], + [ + 18, + 4 + ] + ] + }, + "line-color": "hsl(0, 0%, 27%)", + "line-dasharray": { + "base": 1, + "stops": [ + [ + 14, + [ + 1, + 0 + ] + ], + [ + 15, + [ + 1.75, + 1 + ] + ], + [ + 16, + [ + 1, + 0.75 + ] + ], + [ + 17, + [ + 1, + 0.5 + ] + ] + ] + }, + "line-opacity": { + "base": 1, + "stops": [ + [ + 14, + 0 + ], + [ + 14.25, + 1 + ] + ] + } + } + }, + { + "id": "bridge-steps", + "type": "line", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "structure", + "bridge" + ], + [ + "==", + "type", + "steps" + ] + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 15, + 1 + ], + [ + 18, + 4 + ] + ] + }, + "line-color": "hsl(0, 0%, 27%)", + "line-dasharray": { + "base": 1, + "stops": [ + [ + 14, + [ + 1, + 0 + ] + ], + [ + 15, + [ + 1.75, + 1 + ] + ], + [ + 16, + [ + 1, + 0.75 + ] + ], + [ + 17, + [ + 0.3, + 0.3 + ] + ] + ] + }, + "line-opacity": { + "base": 1, + "stops": [ + [ + 14, + 0 + ], + [ + 14.25, + 1 + ] + ] + } + } + }, + { + "id": "bridge-trunk_link", + "type": "line", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "!in", + "layer", + 2, + 3, + 4, + 5 + ], + [ + "==", + "structure", + "bridge" + ], + [ + "==", + "type", + "trunk_link" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12, + 0.5 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-color": "hsl(0, 0%, 27%)" + } + }, + { + "id": "bridge-motorway_link", + "type": "line", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "motorway_link" + ], + [ + "!in", + "layer", + 2, + 3, + 4, + 5 + ], + [ + "==", + "structure", + "bridge" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12, + 0.5 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-color": "hsl(0, 0%, 27%)" + } + }, + { + "id": "bridge-pedestrian", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "ref": "bridge-pedestrian-case", + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 14, + 0.5 + ], + [ + 18, + 12 + ] + ] + }, + "line-color": "hsl(0, 0%, 27%)", + "line-opacity": 1, + "line-dasharray": { + "base": 1, + "stops": [ + [ + 14, + [ + 1, + 0 + ] + ], + [ + 15, + [ + 1.5, + 0.4 + ] + ], + [ + 16, + [ + 1, + 0.2 + ] + ] + ] + } + } + }, + { + "id": "bridge-service-link-track", + "type": "line", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 14, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "in", + "class", + "link", + "service", + "track" + ], + [ + "==", + "structure", + "bridge" + ], + [ + "!=", + "type", + "trunk_link" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 14, + 0.5 + ], + [ + 18, + 12 + ] + ] + }, + "line-color": "hsl(0, 0%, 27%)" + } + }, + { + "id": "bridge-street_limited", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "ref": "bridge-street_limited-low", + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12.5, + 0.5 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-color": "hsl(0, 0%, 27%)", + "line-opacity": { + "base": 1, + "stops": [ + [ + 13.99, + 0 + ], + [ + 14, + 1 + ] + ] + } + } + }, + { + "id": "bridge-street", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "ref": "bridge-street-low", + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12.5, + 0.5 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-color": "hsl(0, 0%, 27%)", + "line-opacity": { + "base": 1, + "stops": [ + [ + 13.99, + 0 + ], + [ + 14, + 1 + ] + ] + } + } + }, + { + "id": "bridge-secondary-tertiary", + "type": "line", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "structure", + "bridge" + ], + [ + "in", + "type", + "secondary", + "tertiary" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 8.5, + 0.5 + ], + [ + 10, + 0.75 + ], + [ + 18, + 26 + ] + ] + }, + "line-color": "hsl(0, 0%, 27%)", + "line-opacity": { + "base": 1.2, + "stops": [ + [ + 5, + 0 + ], + [ + 5.5, + 1 + ] + ] + } + } + }, + { + "id": "bridge-primary", + "type": "line", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "structure", + "bridge" + ], + [ + "==", + "type", + "primary" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 5, + 0.75 + ], + [ + 18, + 32 + ] + ] + }, + "line-color": "hsl(0, 0%, 27%)", + "line-opacity": { + "base": 1.2, + "stops": [ + [ + 5, + 0 + ], + [ + 5.5, + 1 + ] + ] + } + } + }, + { + "id": "bridge-trunk", + "type": "line", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "trunk" + ], + [ + "!in", + "layer", + 2, + 3, + 4, + 5 + ], + [ + "==", + "structure", + "bridge" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 5, + 0.75 + ], + [ + 18, + 32 + ] + ] + }, + "line-color": "hsl(0, 0%, 27%)" + } + }, + { + "id": "bridge-motorway", + "type": "line", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "motorway" + ], + [ + "!in", + "layer", + 2, + 3, + 4, + 5 + ], + [ + "==", + "structure", + "bridge" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 5, + 0.75 + ], + [ + 18, + 32 + ] + ] + }, + "line-color": "hsl(0, 0%, 27%)" + } + }, + { + "id": "bridge-rail", + "type": "line", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "in", + "class", + "major_rail", + "minor_rail" + ], + [ + "==", + "structure", + "bridge" + ] + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "hsl(0, 0%, 17%)", + "line-width": { + "base": 1, + "stops": [ + [ + 14, + 0.75 + ], + [ + 20, + 1 + ] + ] + } + } + }, + { + "id": "bridge-trunk_link-2-case", + "type": "line", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + ">=", + "layer", + 2 + ], + [ + "==", + "structure", + "bridge" + ], + [ + "==", + "type", + "trunk_link" + ] + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12, + 0.75 + ], + [ + 20, + 2 + ] + ] + }, + "line-color": "hsl(0, 0%, 27%)", + "line-gap-width": { + "base": 1.5, + "stops": [ + [ + 12, + 0.5 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-opacity": { + "base": 1, + "stops": [ + [ + 10.99, + 0 + ], + [ + 11, + 1 + ] + ] + } + } + }, + { + "id": "bridge-motorway_link-2-case", + "type": "line", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "motorway_link" + ], + [ + ">=", + "layer", + 2 + ], + [ + "==", + "structure", + "bridge" + ] + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12, + 0.75 + ], + [ + 20, + 2 + ] + ] + }, + "line-color": "hsl(0, 0%, 17%)", + "line-gap-width": { + "base": 1.5, + "stops": [ + [ + 12, + 0.5 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-opacity": 1 + } + }, + { + "id": "bridge-trunk-2-case", + "type": "line", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "trunk" + ], + [ + ">=", + "layer", + 2 + ], + [ + "==", + "structure", + "bridge" + ] + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 10, + 1 + ], + [ + 16, + 2 + ] + ] + }, + "line-color": "hsl(0, 0%, 27%)", + "line-gap-width": { + "base": 1.5, + "stops": [ + [ + 5, + 0.75 + ], + [ + 18, + 32 + ] + ] + } + } + }, + { + "id": "bridge-motorway-2-case", + "type": "line", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "motorway" + ], + [ + ">=", + "layer", + 2 + ], + [ + "==", + "structure", + "bridge" + ] + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 7, + 0.5 + ], + [ + 10, + 1 + ], + [ + 16, + 2 + ] + ] + }, + "line-color": "hsl(0, 0%, 17%)", + "line-gap-width": { + "base": 1.5, + "stops": [ + [ + 5, + 0.75 + ], + [ + 18, + 32 + ] + ] + } + } + }, + { + "id": "bridge-trunk_link-2", + "type": "line", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + ">=", + "layer", + 2 + ], + [ + "==", + "structure", + "bridge" + ], + [ + "==", + "type", + "trunk_link" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12, + 0.5 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-color": "hsl(0, 0%, 27%)" + } + }, + { + "id": "bridge-motorway_link-2", + "type": "line", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "motorway_link" + ], + [ + ">=", + "layer", + 2 + ], + [ + "==", + "structure", + "bridge" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12, + 0.5 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-color": "hsl(0, 0%, 27%)" + } + }, + { + "id": "bridge-trunk-2", + "type": "line", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "trunk" + ], + [ + ">=", + "layer", + 2 + ], + [ + "==", + "structure", + "bridge" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 5, + 0.75 + ], + [ + 18, + 32 + ] + ] + }, + "line-color": "hsl(0, 0%, 27%)" + } + }, + { + "id": "bridge-motorway-2", + "type": "line", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "motorway" + ], + [ + ">=", + "layer", + 2 + ], + [ + "==", + "structure", + "bridge" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 5, + 0.75 + ], + [ + 18, + 32 + ] + ] + }, + "line-color": "hsl(0, 0%, 27%)" + } + }, + { + "id": "admin-3-4-boundaries-bg", + "type": "line", + "metadata": { + "mapbox:group": "1444934295202.7542" + }, + "source": "composite", + "source-layer": "admin", + "filter": [ + "all", + [ + ">=", + "admin_level", + 3 + ], + [ + "==", + "maritime", + 0 + ] + ], + "layout": { + "line-join": "bevel" + }, + "paint": { + "line-color": "hsl(0, 0%, 10%)", + "line-width": { + "base": 1, + "stops": [ + [ + 3, + 3.5 + ], + [ + 10, + 8 + ] + ] + }, + "line-opacity": { + "base": 1, + "stops": [ + [ + 4, + 0 + ], + [ + 6, + 0.75 + ] + ] + }, + "line-dasharray": [ + 1, + 0 + ], + "line-translate": [ + 0, + 0 + ], + "line-blur": { + "base": 1, + "stops": [ + [ + 3, + 0 + ], + [ + 8, + 3 + ] + ] + } + } + }, + { + "id": "admin-2-boundaries-bg", + "type": "line", + "metadata": { + "mapbox:group": "1444934295202.7542" + }, + "source": "composite", + "source-layer": "admin", + "minzoom": 1, + "filter": [ + "all", + [ + "==", + "admin_level", + 2 + ], + [ + "==", + "maritime", + 0 + ] + ], + "layout": { + "line-join": "miter" + }, + "paint": { + "line-width": { + "base": 1, + "stops": [ + [ + 3, + 3.5 + ], + [ + 10, + 10 + ] + ] + }, + "line-color": "hsl(0, 0%, 10%)", + "line-opacity": { + "base": 1, + "stops": [ + [ + 3, + 0 + ], + [ + 4, + 0.5 + ] + ] + }, + "line-translate": [ + 0, + 0 + ], + "line-blur": { + "base": 1, + "stops": [ + [ + 3, + 0 + ], + [ + 10, + 2 + ] + ] + } + } + }, + { + "id": "admin-3-4-boundaries", + "type": "line", + "metadata": { + "mapbox:group": "1444934295202.7542" + }, + "source": "composite", + "source-layer": "admin", + "filter": [ + "all", + [ + ">=", + "admin_level", + 3 + ], + [ + "==", + "maritime", + 0 + ] + ], + "layout": { + "line-join": "round", + "line-cap": "round" + }, + "paint": { + "line-dasharray": { + "base": 1, + "stops": [ + [ + 6, + [ + 2, + 0 + ] + ], + [ + 7, + [ + 2, + 2, + 6, + 2 + ] + ] + ] + }, + "line-width": { + "base": 1, + "stops": [ + [ + 7, + 0.75 + ], + [ + 12, + 1.5 + ] + ] + }, + "line-opacity": { + "base": 1, + "stops": [ + [ + 2, + 0 + ], + [ + 3, + 1 + ] + ] + }, + "line-color": { + "base": 1, + "stops": [ + [ + 4, + "hsl(0, 0%, 27%)" + ], + [ + 5, + "hsl(0, 0%, 35%)" + ] + ] + } + } + }, + { + "id": "admin-2-boundaries", + "type": "line", + "metadata": { + "mapbox:group": "1444934295202.7542" + }, + "source": "composite", + "source-layer": "admin", + "minzoom": 1, + "filter": [ + "all", + [ + "==", + "admin_level", + 2 + ], + [ + "==", + "disputed", + 0 + ], + [ + "==", + "maritime", + 0 + ] + ], + "layout": { + "line-join": "round", + "line-cap": "round" + }, + "paint": { + "line-color": "hsl(0, 0%, 43%)", + "line-width": { + "base": 1, + "stops": [ + [ + 3, + 0.5 + ], + [ + 10, + 2 + ] + ] + } + } + }, + { + "id": "admin-2-boundaries-dispute", + "type": "line", + "metadata": { + "mapbox:group": "1444934295202.7542" + }, + "source": "composite", + "source-layer": "admin", + "minzoom": 1, + "filter": [ + "all", + [ + "==", + "admin_level", + 2 + ], + [ + "==", + "disputed", + 1 + ], + [ + "==", + "maritime", + 0 + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-dasharray": [ + 1.5, + 1.5 + ], + "line-color": "hsl(0, 0%, 14%)", + "line-width": { + "base": 1, + "stops": [ + [ + 3, + 0.5 + ], + [ + 10, + 2 + ] + ] + } + } + }, + { + "id": "waterway-label", + "type": "symbol", + "source": "composite", + "source-layer": "waterway_label", + "minzoom": 12, + "filter": [ + "in", + "class", + "canal", + "river" + ], + "layout": { + "text-field": "{name_en}", + "text-font": [ + "DIN Offc Pro Italic", + "Arial Unicode MS Regular" + ], + "symbol-placement": "line", + "text-max-angle": 30, + "text-size": { + "base": 1, + "stops": [ + [ + 13, + 12 + ], + [ + 18, + 16 + ] + ] + } + }, + "paint": { + "text-halo-width": 0, + "text-halo-blur": 0, + "text-color": "hsl(0, 0%, 32%)" + } + }, + { + "id": "poi-scalerank3", + "type": "symbol", + "metadata": { + "mapbox:group": "1444933372896.5967" + }, + "source": "composite", + "source-layer": "poi_label", + "filter": [ + "all", + [ + "!in", + "maki", + "campsite", + "cemetery", + "dog-park", + "garden", + "golf", + "park", + "picnic-site", + "playground", + "zoo" + ], + [ + "==", + "scalerank", + 3 + ] + ], + "layout": { + "text-line-height": 1.1, + "text-size": { + "base": 1, + "stops": [ + [ + 16, + 11 + ], + [ + 20, + 13 + ] + ] + }, + "text-max-angle": 38, + "symbol-spacing": 250, + "text-font": [ + "DIN Offc Pro Medium", + "Arial Unicode MS Regular" + ], + "text-padding": 1, + "text-offset": [ + 0, + 0 + ], + "text-field": "{name_en}", + "text-letter-spacing": 0.01, + "text-max-width": 8 + }, + "paint": { + "text-color": "hsl(0, 0%, 60%)", + "text-halo-color": "#212121", + "text-halo-width": 1, + "text-halo-blur": 0 + } + }, + { + "id": "poi-parks-scalerank3", + "type": "symbol", + "metadata": { + "mapbox:group": "1444933372896.5967" + }, + "source": "composite", + "source-layer": "poi_label", + "filter": [ + "all", + [ + "in", + "maki", + "campsite", + "cemetery", + "dog-park", + "garden", + "golf", + "park", + "picnic-site", + "playground", + "zoo" + ], + [ + "==", + "scalerank", + 3 + ] + ], + "layout": { + "text-line-height": 1.1, + "text-size": { + "base": 1, + "stops": [ + [ + 16, + 11 + ], + [ + 20, + 12 + ] + ] + }, + "text-max-angle": 38, + "symbol-spacing": 250, + "text-font": [ + "DIN Offc Pro Medium", + "Arial Unicode MS Regular" + ], + "text-padding": 2, + "text-offset": [ + 0, + 0 + ], + "text-field": "{name_en}", + "text-letter-spacing": 0.01, + "text-max-width": 8 + }, + "paint": { + "text-halo-blur": 0, + "text-halo-color": "#212121", + "text-halo-width": 1, + "text-color": { + "base": 1, + "stops": [ + [ + 7, + "hsl(0, 0%, 47%)" + ], + [ + 9, + "hsl(0, 0%, 73%)" + ] + ] + } + } + }, + { + "id": "road-label-small", + "type": "symbol", + "metadata": { + "mapbox:group": "1444933721429.3076" + }, + "source": "composite", + "source-layer": "road_label", + "minzoom": 15, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "!in", + "class", + "", + "ferry", + "link", + "motorway", + "path", + "pedestrian", + "primary", + "secondary", + "street", + "street_limited", + "tertiary", + "track", + "trunk" + ] + ], + "layout": { + "text-size": { + "base": 1, + "stops": [ + [ + 15, + 10 + ], + [ + 20, + 13 + ] + ] + }, + "text-max-angle": 30, + "symbol-spacing": 500, + "text-font": [ + "DIN Offc Pro Regular", + "Arial Unicode MS Regular" + ], + "symbol-placement": "line", + "text-padding": 1, + "text-rotation-alignment": "map", + "text-field": "{name_en}", + "text-letter-spacing": 0.01 + }, + "paint": { + "text-color": "hsl(0, 0%, 78%)", + "text-halo-color": "#212121", + "text-halo-width": 1.25, + "text-halo-blur": 0 + } + }, + { + "id": "road-label-medium", + "type": "symbol", + "metadata": { + "mapbox:group": "1444933721429.3076" + }, + "source": "composite", + "source-layer": "road_label", + "minzoom": 13, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "in", + "class", + "", + "link", + "pedestrian", + "street", + "street_limited" + ] + ], + "layout": { + "text-size": { + "base": 1, + "stops": [ + [ + 11, + 10 + ], + [ + 20, + 14 + ] + ] + }, + "text-max-angle": 30, + "symbol-spacing": 500, + "text-font": [ + "DIN Offc Pro Regular", + "Arial Unicode MS Regular" + ], + "symbol-placement": "line", + "text-padding": 1, + "text-rotation-alignment": "map", + "text-field": "{name_en}", + "text-letter-spacing": 0.01 + }, + "paint": { + "text-color": "hsl(0, 0%, 78%)", + "text-halo-color": "#212121", + "text-halo-width": 1, + "text-halo-blur": 0 + } + }, + { + "id": "road-label-large", + "type": "symbol", + "metadata": { + "mapbox:group": "1444933721429.3076" + }, + "source": "composite", + "source-layer": "road_label", + "minzoom": 12, + "filter": [ + "in", + "class", + "motorway", + "primary", + "secondary", + "tertiary", + "trunk" + ], + "layout": { + "text-size": { + "base": 1, + "stops": [ + [ + 9, + 10 + ], + [ + 20, + 16 + ] + ] + }, + "text-max-angle": 30, + "symbol-spacing": 400, + "text-font": [ + "DIN Offc Pro Regular", + "Arial Unicode MS Regular" + ], + "symbol-placement": "line", + "text-padding": 1, + "text-rotation-alignment": "map", + "text-field": "{name_en}", + "text-letter-spacing": 0.01 + }, + "paint": { + "text-color": "hsl(0, 0%, 78%)", + "text-halo-color": "#212121", + "text-halo-width": 1, + "text-halo-blur": 0 + } + }, + { + "id": "poi-scalerank2", + "type": "symbol", + "metadata": { + "mapbox:group": "1444933358918.2366" + }, + "source": "composite", + "source-layer": "poi_label", + "filter": [ + "all", + [ + "!in", + "maki", + "campsite", + "cemetery", + "dog-park", + "garden", + "golf", + "park", + "picnic-site", + "playground", + "zoo" + ], + [ + "==", + "scalerank", + 2 + ] + ], + "layout": { + "text-line-height": 1.1, + "text-size": { + "base": 1, + "stops": [ + [ + 14, + 11 + ], + [ + 20, + 12 + ] + ] + }, + "text-max-angle": 38, + "symbol-spacing": 250, + "text-font": [ + "DIN Offc Pro Medium", + "Arial Unicode MS Regular" + ], + "text-padding": 2, + "text-offset": [ + 0, + 0.65 + ], + "text-field": "{name_en}", + "text-letter-spacing": 0.01, + "text-max-width": 8 + }, + "paint": { + "text-color": "hsl(0, 0%, 60%)", + "text-halo-color": "#212121", + "text-halo-width": 1, + "text-halo-blur": 0 + } + }, + { + "id": "poi-parks-scalerank2", + "type": "symbol", + "metadata": { + "mapbox:group": "1444933358918.2366" + }, + "source": "composite", + "source-layer": "poi_label", + "filter": [ + "all", + [ + "in", + "maki", + "campsite", + "cemetery", + "dog-park", + "garden", + "golf", + "park", + "picnic-site", + "playground", + "zoo" + ], + [ + "==", + "scalerank", + 2 + ] + ], + "layout": { + "text-line-height": 1.1, + "text-size": { + "base": 1, + "stops": [ + [ + 14, + 11 + ], + [ + 20, + 12 + ] + ] + }, + "text-max-angle": 38, + "symbol-spacing": 250, + "text-font": [ + "DIN Offc Pro Medium", + "Arial Unicode MS Regular" + ], + "text-padding": 2, + "text-offset": [ + 0, + 0 + ], + "text-field": "{name_en}", + "text-letter-spacing": 0.01, + "text-max-width": 8 + }, + "paint": { + "text-color": { + "base": 1, + "stops": [ + [ + 7, + "hsl(0, 0%, 47%)" + ], + [ + 9, + "hsl(0, 0%, 73%)" + ] + ] + }, + "text-halo-color": "#212121", + "text-halo-width": 1, + "text-halo-blur": 0 + } + }, + { + "id": "water-label", + "type": "symbol", + "metadata": { + "mapbox:group": "1444933808272.805" + }, + "source": "composite", + "source-layer": "water_label", + "minzoom": 5, + "filter": [ + ">", + "area", + 10000 + ], + "layout": { + "text-field": "{name_en}", + "text-font": [ + "DIN Offc Pro Italic", + "Arial Unicode MS Regular" + ], + "text-max-width": 7, + "text-size": { + "base": 1, + "stops": [ + [ + 13, + 13 + ], + [ + 18, + 18 + ] + ] + } + }, + "paint": { + "text-color": "hsl(0, 0%, 32%)", + "text-halo-blur": 0 + } + }, + { + "id": "poi-parks-scalerank1", + "type": "symbol", + "metadata": { + "mapbox:group": "1444933322393.2852" + }, + "source": "composite", + "source-layer": "poi_label", + "filter": [ + "all", + [ + "in", + "maki", + "campsite", + "cemetery", + "dog-park", + "garden", + "golf", + "park", + "picnic-site", + "playground", + "zoo" + ], + [ + "<=", + "scalerank", + 1 + ] + ], + "layout": { + "text-line-height": 1.1, + "text-size": { + "base": 1, + "stops": [ + [ + 10, + 11 + ], + [ + 18, + 12 + ] + ] + }, + "text-max-angle": 38, + "symbol-spacing": 250, + "text-font": [ + "DIN Offc Pro Medium", + "Arial Unicode MS Regular" + ], + "text-padding": 2, + "text-offset": [ + 0, + 0 + ], + "text-field": "{name_en}", + "text-letter-spacing": 0.01, + "text-max-width": 8 + }, + "paint": { + "text-color": { + "base": 1, + "stops": [ + [ + 7, + "hsl(0, 0%, 47%)" + ], + [ + 9, + "hsl(0, 0%, 73%)" + ] + ] + }, + "text-halo-color": "#212121", + "text-halo-width": 1, + "text-halo-blur": 0 + } + }, + { + "id": "poi-scalerank1", + "type": "symbol", + "metadata": { + "mapbox:group": "1444933322393.2852" + }, + "source": "composite", + "source-layer": "poi_label", + "filter": [ + "all", + [ + "!in", + "maki", + "campsite", + "cemetery", + "dog-park", + "garden", + "golf", + "park", + "picnic-site", + "playground", + "zoo" + ], + [ + "<=", + "scalerank", + 1 + ] + ], + "layout": { + "text-line-height": 1.1, + "text-size": { + "base": 1, + "stops": [ + [ + 10, + 11 + ], + [ + 18, + 12 + ] + ] + }, + "text-max-angle": 38, + "symbol-spacing": 250, + "text-font": [ + "DIN Offc Pro Medium", + "Arial Unicode MS Regular" + ], + "text-padding": 2, + "text-offset": [ + 0, + 0 + ], + "text-field": "{name_en}", + "text-letter-spacing": 0.01, + "text-max-width": 8 + }, + "paint": { + "text-color": "hsl(0, 0%, 60%)", + "text-halo-color": "#212121", + "text-halo-width": 1, + "text-halo-blur": 0 + } + }, + { + "id": "airport-label", + "type": "symbol", + "source": "composite", + "source-layer": "airport_label", + "minzoom": 10, + "filter": [ + "<=", + "scalerank", + 2 + ], + "layout": { + "text-line-height": 1.1, + "text-size": { + "base": 1, + "stops": [ + [ + 10, + 12 + ], + [ + 18, + 18 + ] + ] + }, + "icon-image": { + "stops": [ + [ + 12, + "{maki}-11" + ], + [ + 13, + "{maki}-15" + ] + ] + }, + "symbol-spacing": 250, + "text-font": [ + "DIN Offc Pro Medium", + "Arial Unicode MS Regular" + ], + "text-padding": 2, + "text-offset": [ + 0, + 0.75 + ], + "text-anchor": "top", + "text-field": { + "stops": [ + [ + 11, + "{ref}" + ], + [ + 14, + "{name_en}" + ] + ] + }, + "text-letter-spacing": 0.01, + "text-max-width": 9 + }, + "paint": { + "text-color": "hsl(0, 0%, 85%)", + "text-halo-color": "hsla(0, 0%, 10%, 0.75)", + "text-halo-width": 0.5, + "text-halo-blur": 0 + } + }, + { + "id": "place-islets-archipelago-aboriginal", + "type": "symbol", + "source": "composite", + "source-layer": "place_label", + "maxzoom": 16, + "filter": [ + "in", + "type", + "aboriginal_lands", + "archipelago", + "islet" + ], + "layout": { + "text-line-height": 1.2, + "text-size": { + "base": 1, + "stops": [ + [ + 10, + 11 + ], + [ + 18, + 16 + ] + ] + }, + "text-max-angle": 38, + "symbol-spacing": 250, + "text-font": [ + "DIN Offc Pro Regular", + "Arial Unicode MS Regular" + ], + "text-padding": 2, + "text-offset": [ + 0, + 0 + ], + "text-field": "{name_en}", + "text-letter-spacing": 0.01, + "text-max-width": 8 + }, + "paint": { + "text-color": "hsl(0, 0%, 85%)", + "text-halo-color": "hsla(0, 0%, 10%, 0.75)", + "text-halo-width": 1, + "text-halo-blur": 0 + } + }, + { + "id": "place-neighbourhood", + "type": "symbol", + "source": "composite", + "source-layer": "place_label", + "minzoom": 12, + "maxzoom": 16, + "filter": [ + "==", + "type", + "neighbourhood" + ], + "layout": { + "text-field": "{name_en}", + "text-transform": "uppercase", + "text-letter-spacing": 0.1, + "text-max-width": 7, + "text-font": [ + "DIN Offc Pro Regular", + "Arial Unicode MS Regular" + ], + "text-padding": 3, + "text-size": { + "base": 1, + "stops": [ + [ + 12, + 11 + ], + [ + 16, + 16 + ] + ] + } + }, + "paint": { + "text-halo-color": "hsla(0, 0%, 10%, 0.75)", + "text-halo-width": 1, + "text-color": "hsl(0, 0%, 70%)", + "text-halo-blur": 0 + } + }, + { + "id": "place-suburb", + "type": "symbol", + "source": "composite", + "source-layer": "place_label", + "minzoom": 11, + "maxzoom": 16, + "filter": [ + "==", + "type", + "suburb" + ], + "layout": { + "text-field": "{name_en}", + "text-transform": "uppercase", + "text-font": [ + "DIN Offc Pro Regular", + "Arial Unicode MS Regular" + ], + "text-letter-spacing": 0.15, + "text-max-width": 7, + "text-padding": 3, + "text-size": { + "base": 1, + "stops": [ + [ + 11, + 11 + ], + [ + 15, + 18 + ] + ] + } + }, + "paint": { + "text-halo-color": "hsla(0, 0%, 10%, 0.75)", + "text-halo-width": 1, + "text-color": "hsl(0, 0%, 70%)", + "text-halo-blur": 0 + } + }, + { + "id": "place-hamlet", + "type": "symbol", + "source": "composite", + "source-layer": "place_label", + "minzoom": 10, + "maxzoom": 16, + "filter": [ + "==", + "type", + "hamlet" + ], + "layout": { + "text-field": "{name_en}", + "text-font": [ + "DIN Offc Pro Regular", + "Arial Unicode MS Regular" + ], + "text-size": { + "base": 1, + "stops": [ + [ + 12, + 11.5 + ], + [ + 15, + 16 + ] + ] + } + }, + "paint": { + "text-halo-color": "hsla(0, 0%, 10%, 0.75)", + "text-halo-width": 1.25, + "text-color": "hsl(0, 0%, 85%)", + "text-halo-blur": 0 + } + }, + { + "id": "place-village", + "type": "symbol", + "source": "composite", + "source-layer": "place_label", + "minzoom": 11, + "maxzoom": 15, + "filter": [ + "==", + "type", + "village" + ], + "layout": { + "text-field": "{name_en}", + "text-font": [ + "DIN Offc Pro Regular", + "Arial Unicode MS Regular" + ], + "text-max-width": 7, + "text-size": { + "base": 1, + "stops": [ + [ + 10, + 11.5 + ], + [ + 16, + 18 + ] + ] + } + }, + "paint": { + "text-halo-color": "hsla(0, 0%, 10%, 0.75)", + "text-halo-width": 1.25, + "text-color": { + "base": 1, + "stops": [ + [ + 10, + "hsl(0, 0%, 75%)" + ], + [ + 11, + "hsl(0, 0%, 85%)" + ] + ] + }, + "text-halo-blur": 0 + } + }, + { + "id": "place-town", + "type": "symbol", + "source": "composite", + "source-layer": "place_label", + "minzoom": 7, + "maxzoom": 15, + "filter": [ + "==", + "type", + "town" + ], + "layout": { + "text-size": { + "base": 1, + "stops": [ + [ + 7, + 11.5 + ], + [ + 15, + 20 + ] + ] + }, + "text-font": { + "base": 1, + "stops": [ + [ + 11, + [ + "DIN Offc Pro Regular", + "Arial Unicode MS Regular" + ] + ], + [ + 12, + [ + "DIN Offc Pro Medium", + "Arial Unicode MS Regular" + ] + ] + ] + }, + "text-padding": 2, + "text-offset": [ + 0, + 0 + ], + "text-field": "{name_en}", + "text-max-width": 7 + }, + "paint": { + "text-color": { + "base": 1, + "stops": [ + [ + 10, + "hsl(0, 0%, 75%)" + ], + [ + 11, + "hsl(0, 0%, 85%)" + ] + ] + }, + "text-halo-color": "hsla(0, 0%, 10%, 0.75)", + "text-halo-width": 1.25, + "icon-opacity": { + "base": 1, + "stops": [ + [ + 7.99, + 1 + ], + [ + 8, + 0 + ] + ] + }, + "text-halo-blur": 0 + } + }, + { + "id": "place-islands", + "type": "symbol", + "source": "composite", + "source-layer": "place_label", + "maxzoom": 16, + "filter": [ + "==", + "type", + "island" + ], + "layout": { + "text-line-height": 1.2, + "text-size": { + "base": 1, + "stops": [ + [ + 10, + 11 + ], + [ + 18, + 16 + ] + ] + }, + "text-max-angle": 38, + "symbol-spacing": 250, + "text-font": [ + "DIN Offc Pro Regular", + "Arial Unicode MS Regular" + ], + "text-padding": 2, + "text-offset": [ + 0, + 0 + ], + "text-field": "{name_en}", + "text-letter-spacing": 0.01, + "text-max-width": 7 + }, + "paint": { + "text-color": "hsl(0, 0%, 85%)", + "text-halo-color": "hsla(0, 0%, 10%, 0.75)", + "text-halo-width": 1, + "text-halo-blur": 0 + } + }, + { + "id": "place-city-sm", + "type": "symbol", + "metadata": { + "mapbox:group": "1444862510685.128" + }, + "source": "composite", + "source-layer": "place_label", + "maxzoom": 14, + "filter": [ + "all", + [ + "!in", + "scalerank", + 0, + 1, + 2, + 3, + 4, + 5 + ], + [ + "==", + "type", + "city" + ] + ], + "layout": { + "text-size": { + "base": 1, + "stops": [ + [ + 6, + 12 + ], + [ + 14, + 22 + ] + ] + }, + "text-font": { + "base": 1, + "stops": [ + [ + 7, + [ + "DIN Offc Pro Regular", + "Arial Unicode MS Regular" + ] + ], + [ + 8, + [ + "DIN Offc Pro Medium", + "Arial Unicode MS Regular" + ] + ] + ] + }, + "text-offset": [ + 0, + 0 + ], + "text-field": "{name_en}", + "text-max-width": 7 + }, + "paint": { + "text-color": "hsl(0, 0%, 90%)", + "text-halo-color": "hsla(0, 0%, 10%, 0.75)", + "text-halo-width": 1.25, + "icon-opacity": { + "base": 1, + "stops": [ + [ + 7.99, + 1 + ], + [ + 8, + 0 + ] + ] + }, + "text-halo-blur": 0 + } + }, + { + "id": "place-city-md-s", + "type": "symbol", + "metadata": { + "mapbox:group": "1444862510685.128" + }, + "source": "composite", + "source-layer": "place_label", + "maxzoom": 14, + "filter": [ + "all", + [ + "in", + "ldir", + "E", + "S", + "SE", + "SW" + ], + [ + "in", + "scalerank", + 3, + 4, + 5 + ], + [ + "==", + "type", + "city" + ] + ], + "layout": { + "text-field": "{name_en}", + "text-size": { + "base": 0.9, + "stops": [ + [ + 5, + 12 + ], + [ + 12, + 22 + ] + ] + }, + "text-anchor": "top", + "text-offset": { + "base": 1, + "stops": [ + [ + 7.99, + [ + 0, + 0.1 + ] + ], + [ + 8, + [ + 0, + 0 + ] + ] + ] + }, + "text-font": { + "base": 1, + "stops": [ + [ + 7, + [ + "DIN Offc Pro Regular", + "Arial Unicode MS Regular" + ] + ], + [ + 8, + [ + "DIN Offc Pro Medium", + "Arial Unicode MS Regular" + ] + ] + ] + }, + "icon-image": "dot-10" + }, + "paint": { + "text-halo-width": 1, + "text-halo-color": "hsla(0, 0%, 10%, 0.75)", + "text-color": "hsl(0, 0%, 90%)", + "text-halo-blur": 0, + "icon-opacity": { + "base": 1, + "stops": [ + [ + 7.99, + 1 + ], + [ + 8, + 0 + ] + ] + } + } + }, + { + "id": "place-city-md-n", + "type": "symbol", + "metadata": { + "mapbox:group": "1444862510685.128" + }, + "source": "composite", + "source-layer": "place_label", + "maxzoom": 14, + "filter": [ + "all", + [ + "in", + "ldir", + "N", + "NE", + "NW", + "W" + ], + [ + "in", + "scalerank", + 3, + 4, + 5 + ], + [ + "==", + "type", + "city" + ] + ], + "layout": { + "text-size": { + "base": 0.9, + "stops": [ + [ + 5, + 12 + ], + [ + 12, + 22 + ] + ] + }, + "text-font": { + "base": 1, + "stops": [ + [ + 7, + [ + "DIN Offc Pro Regular", + "Arial Unicode MS Regular" + ] + ], + [ + 8, + [ + "DIN Offc Pro Medium", + "Arial Unicode MS Regular" + ] + ] + ] + }, + "text-offset": { + "base": 1, + "stops": [ + [ + 7.99, + [ + 0, + -0.25 + ] + ], + [ + 8, + [ + 0, + 0 + ] + ] + ] + }, + "text-anchor": "bottom", + "text-field": "{name_en}", + "text-max-width": 7, + "icon-image": "dot-10" + }, + "paint": { + "text-color": "hsl(0, 0%, 90%)", + "text-halo-color": "hsla(0, 0%, 10%, 0.75)", + "text-halo-width": 1, + "icon-opacity": { + "base": 1, + "stops": [ + [ + 7.99, + 1 + ], + [ + 8, + 0 + ] + ] + }, + "text-halo-blur": 0 + } + }, + { + "id": "place-city-lg-s", + "type": "symbol", + "metadata": { + "mapbox:group": "1444862510685.128" + }, + "source": "composite", + "source-layer": "place_label", + "minzoom": 1, + "maxzoom": 14, + "filter": [ + "all", + [ + "in", + "ldir", + "E", + "S", + "SE", + "SW" + ], + [ + "<=", + "scalerank", + 2 + ], + [ + "==", + "type", + "city" + ] + ], + "layout": { + "icon-image": "dot-11", + "text-font": { + "base": 1, + "stops": [ + [ + 7, + [ + "DIN Offc Pro Regular", + "Arial Unicode MS Regular" + ] + ], + [ + 8, + [ + "DIN Offc Pro Medium", + "Arial Unicode MS Regular" + ] + ] + ] + }, + "text-offset": { + "base": 1, + "stops": [ + [ + 7.99, + [ + 0, + 0.15 + ] + ], + [ + 8, + [ + 0, + 0 + ] + ] + ] + }, + "text-anchor": { + "base": 1, + "stops": [ + [ + 7, + "top" + ], + [ + 8, + "center" + ] + ] + }, + "text-field": "{name_en}", + "text-max-width": 7, + "text-size": { + "base": 0.9, + "stops": [ + [ + 4, + 12 + ], + [ + 10, + 22 + ] + ] + } + }, + "paint": { + "text-color": { + "base": 1, + "stops": [ + [ + 7, + "hsl(0, 0%, 95%)" + ], + [ + 9, + "hsl(0, 0%, 90%)" + ] + ] + }, + "text-halo-color": "hsla(0, 0%, 10%, 0.75)", + "text-halo-width": 1, + "icon-opacity": { + "base": 1, + "stops": [ + [ + 7.99, + 1 + ], + [ + 8, + 0 + ] + ] + }, + "text-halo-blur": 0 + } + }, + { + "id": "place-city-lg-n", + "type": "symbol", + "metadata": { + "mapbox:group": "1444862510685.128" + }, + "source": "composite", + "source-layer": "place_label", + "minzoom": 1, + "maxzoom": 14, + "filter": [ + "all", + [ + "in", + "ldir", + "N", + "NE", + "NW", + "W" + ], + [ + "<=", + "scalerank", + 2 + ], + [ + "==", + "type", + "city" + ] + ], + "layout": { + "icon-image": "dot-11", + "text-font": { + "base": 1, + "stops": [ + [ + 7, + [ + "DIN Offc Pro Regular", + "Arial Unicode MS Regular" + ] + ], + [ + 8, + [ + "DIN Offc Pro Medium", + "Arial Unicode MS Regular" + ] + ] + ] + }, + "text-offset": { + "base": 1, + "stops": [ + [ + 7.99, + [ + 0, + -0.25 + ] + ], + [ + 8, + [ + 0, + 0 + ] + ] + ] + }, + "text-anchor": { + "base": 1, + "stops": [ + [ + 7, + "bottom" + ], + [ + 8, + "center" + ] + ] + }, + "text-field": "{name_en}", + "text-max-width": 7, + "text-size": { + "base": 0.9, + "stops": [ + [ + 4, + 12 + ], + [ + 10, + 22 + ] + ] + } + }, + "paint": { + "text-color": { + "base": 1, + "stops": [ + [ + 7, + "hsl(0, 0%, 95%)" + ], + [ + 9, + "hsl(0, 0%, 90%)" + ] + ] + }, + "text-opacity": 1, + "text-halo-color": "hsla(0, 0%, 10%, 0.75)", + "text-halo-width": 1, + "icon-opacity": { + "base": 1, + "stops": [ + [ + 7.99, + 1 + ], + [ + 8, + 0 + ] + ] + }, + "text-halo-blur": 0 + } + }, + { + "id": "marine-label-sm-ln", + "type": "symbol", + "metadata": { + "mapbox:group": "1444856087950.3635" + }, + "source": "composite", + "source-layer": "marine_label", + "minzoom": 3, + "maxzoom": 10, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + ">=", + "labelrank", + 4 + ] + ], + "layout": { + "text-line-height": 1.1, + "text-size": { + "base": 1, + "stops": [ + [ + 3, + 12 + ], + [ + 6, + 16 + ] + ] + }, + "symbol-spacing": { + "base": 1, + "stops": [ + [ + 4, + 100 + ], + [ + 6, + 400 + ] + ] + }, + "text-font": [ + "DIN Offc Pro Italic", + "Arial Unicode MS Regular" + ], + "symbol-placement": "line", + "text-field": "{name_en}", + "text-letter-spacing": 0.1, + "text-max-width": 5 + }, + "paint": { + "text-color": "hsl(0, 0%, 32%)", + "text-halo-blur": 0, + "text-halo-color": "hsla(0, 0%, 10%, 0.75)" + } + }, + { + "id": "marine-label-sm-pt", + "type": "symbol", + "metadata": { + "mapbox:group": "1444856087950.3635" + }, + "source": "composite", + "source-layer": "marine_label", + "minzoom": 3, + "maxzoom": 10, + "filter": [ + "all", + [ + "==", + "$type", + "Point" + ], + [ + ">=", + "labelrank", + 4 + ] + ], + "layout": { + "text-field": "{name_en}", + "text-max-width": 5, + "text-letter-spacing": 0.1, + "text-line-height": 1.5, + "text-font": [ + "DIN Offc Pro Italic", + "Arial Unicode MS Regular" + ], + "text-size": { + "base": 1, + "stops": [ + [ + 3, + 12 + ], + [ + 6, + 16 + ] + ] + } + }, + "paint": { + "text-color": "hsl(0, 0%, 32%)", + "text-halo-blur": 0, + "text-halo-color": "hsla(0, 0%, 10%, 0.75)" + } + }, + { + "id": "marine-label-md-ln", + "type": "symbol", + "metadata": { + "mapbox:group": "1444856087950.3635" + }, + "source": "composite", + "source-layer": "marine_label", + "minzoom": 2, + "maxzoom": 8, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "in", + "labelrank", + 2, + 3 + ] + ], + "layout": { + "text-line-height": 1.1, + "text-size": { + "base": 1.1, + "stops": [ + [ + 2, + 12 + ], + [ + 5, + 20 + ] + ] + }, + "symbol-spacing": 250, + "text-font": [ + "DIN Offc Pro Italic", + "Arial Unicode MS Regular" + ], + "symbol-placement": "line", + "text-field": "{name_en}", + "text-letter-spacing": 0.15, + "text-max-width": 5 + }, + "paint": { + "text-color": "hsl(0, 0%, 32%)", + "text-halo-blur": 0, + "text-halo-color": "hsla(0, 0%, 10%, 0.75)" + } + }, + { + "id": "marine-label-md-pt", + "type": "symbol", + "metadata": { + "mapbox:group": "1444856087950.3635" + }, + "source": "composite", + "source-layer": "marine_label", + "minzoom": 2, + "maxzoom": 8, + "filter": [ + "all", + [ + "==", + "$type", + "Point" + ], + [ + "in", + "labelrank", + 2, + 3 + ] + ], + "layout": { + "text-field": "{name_en}", + "text-max-width": 5, + "text-letter-spacing": 0.15, + "text-line-height": 1.5, + "text-font": [ + "DIN Offc Pro Italic", + "Arial Unicode MS Regular" + ], + "text-size": { + "base": 1.1, + "stops": [ + [ + 2, + 14 + ], + [ + 5, + 20 + ] + ] + } + }, + "paint": { + "text-color": "hsl(0, 0%, 32%)", + "text-halo-blur": 0, + "text-halo-color": "hsla(0, 0%, 10%, 0.75)" + } + }, + { + "id": "marine-label-lg-ln", + "type": "symbol", + "metadata": { + "mapbox:group": "1444856087950.3635" + }, + "source": "composite", + "source-layer": "marine_label", + "minzoom": 1, + "maxzoom": 4, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "==", + "labelrank", + 1 + ] + ], + "layout": { + "text-field": "{name_en}", + "text-max-width": 4, + "text-letter-spacing": 0.25, + "text-line-height": 1.1, + "symbol-placement": "line", + "text-font": [ + "DIN Offc Pro Italic", + "Arial Unicode MS Regular" + ], + "text-size": { + "base": 1, + "stops": [ + [ + 1, + 14 + ], + [ + 4, + 30 + ] + ] + } + }, + "paint": { + "text-color": "hsl(0, 0%, 32%)", + "text-halo-blur": 0, + "text-halo-color": "hsla(0, 0%, 10%, 0.75)" + } + }, + { + "id": "marine-label-lg-pt", + "type": "symbol", + "metadata": { + "mapbox:group": "1444856087950.3635" + }, + "source": "composite", + "source-layer": "marine_label", + "minzoom": 1, + "maxzoom": 4, + "filter": [ + "all", + [ + "==", + "$type", + "Point" + ], + [ + "==", + "labelrank", + 1 + ] + ], + "layout": { + "text-field": "{name_en}", + "text-max-width": 4, + "text-letter-spacing": 0.25, + "text-line-height": 1.5, + "text-font": [ + "DIN Offc Pro Italic", + "Arial Unicode MS Regular" + ], + "text-size": { + "base": 1, + "stops": [ + [ + 1, + 14 + ], + [ + 4, + 30 + ] + ] + } + }, + "paint": { + "text-color": "hsl(0, 0%, 32%)", + "text-halo-blur": 0, + "text-halo-color": "hsla(0, 0%, 10%, 0.75)" + } + }, + { + "id": "state-label-sm", + "type": "symbol", + "metadata": { + "mapbox:group": "1444856151690.9143" + }, + "source": "composite", + "source-layer": "state_label", + "minzoom": 3, + "maxzoom": 9, + "filter": [ + "<", + "area", + 20000 + ], + "layout": { + "text-size": { + "base": 1, + "stops": [ + [ + 6, + 10 + ], + [ + 9, + 14 + ] + ] + }, + "text-transform": "uppercase", + "text-font": [ + "DIN Offc Pro Bold", + "Arial Unicode MS Bold" + ], + "text-field": { + "base": 1, + "stops": [ + [ + 0, + "{abbr}" + ], + [ + 6, + "{name_en}" + ] + ] + }, + "text-letter-spacing": 0.15, + "text-max-width": 5 + }, + "paint": { + "text-opacity": 1, + "text-color": "hsl(0, 0%, 50%)", + "text-halo-color": "hsla(0, 0%, 10%, 0.75)", + "text-halo-width": 1, + "text-halo-blur": 0 + } + }, + { + "id": "state-label-md", + "type": "symbol", + "metadata": { + "mapbox:group": "1444856151690.9143" + }, + "source": "composite", + "source-layer": "state_label", + "minzoom": 3, + "maxzoom": 8, + "filter": [ + "all", + [ + "<", + "area", + 80000 + ], + [ + ">=", + "area", + 20000 + ] + ], + "layout": { + "text-size": { + "base": 1, + "stops": [ + [ + 5, + 10 + ], + [ + 8, + 16 + ] + ] + }, + "text-transform": "uppercase", + "text-font": [ + "DIN Offc Pro Bold", + "Arial Unicode MS Bold" + ], + "text-field": { + "base": 1, + "stops": [ + [ + 0, + "{abbr}" + ], + [ + 5, + "{name_en}" + ] + ] + }, + "text-letter-spacing": 0.15, + "text-max-width": 6 + }, + "paint": { + "text-opacity": 1, + "text-color": "hsl(0, 0%, 50%)", + "text-halo-color": "hsla(0, 0%, 10%, 0.75)", + "text-halo-width": 1, + "text-halo-blur": 0 + } + }, + { + "id": "state-label-lg", + "type": "symbol", + "metadata": { + "mapbox:group": "1444856151690.9143" + }, + "source": "composite", + "source-layer": "state_label", + "minzoom": 3, + "maxzoom": 7, + "filter": [ + ">=", + "area", + 80000 + ], + "layout": { + "text-size": { + "base": 1, + "stops": [ + [ + 4, + 10 + ], + [ + 7, + 18 + ] + ] + }, + "text-transform": "uppercase", + "text-font": [ + "DIN Offc Pro Bold", + "Arial Unicode MS Bold" + ], + "text-padding": 1, + "text-field": { + "base": 1, + "stops": [ + [ + 0, + "{abbr}" + ], + [ + 4, + "{name_en}" + ] + ] + }, + "text-letter-spacing": 0.15, + "text-max-width": 6 + }, + "paint": { + "text-opacity": 1, + "text-color": "hsl(0, 0%, 50%)", + "text-halo-color": "hsla(0, 0%, 10%, 0.75)", + "text-halo-width": 1, + "text-halo-blur": 0 + } + }, + { + "id": "country-label-sm", + "type": "symbol", + "metadata": { + "mapbox:group": "1444856144497.7825" + }, + "source": "composite", + "source-layer": "country_label", + "minzoom": 1, + "maxzoom": 10, + "filter": [ + ">=", + "scalerank", + 5 + ], + "layout": { + "text-field": "{name_en}", + "text-max-width": 6, + "text-font": [ + "DIN Offc Pro Medium", + "Arial Unicode MS Regular" + ], + "text-size": { + "base": 0.9, + "stops": [ + [ + 5, + 14 + ], + [ + 9, + 22 + ] + ] + } + }, + "paint": { + "text-halo-width": 1.25, + "text-halo-color": "hsla(0, 0%, 10%, 0.75)", + "text-color": "hsl(0, 0%, 45%)", + "text-halo-blur": 0 + } + }, + { + "id": "country-label-md", + "type": "symbol", + "metadata": { + "mapbox:group": "1444856144497.7825" + }, + "source": "composite", + "source-layer": "country_label", + "minzoom": 1, + "maxzoom": 8, + "filter": [ + "in", + "scalerank", + 3, + 4 + ], + "layout": { + "text-field": { + "base": 1, + "stops": [ + [ + 0, + "{code}" + ], + [ + 2, + "{name_en}" + ] + ] + }, + "text-max-width": 6, + "text-font": [ + "DIN Offc Pro Medium", + "Arial Unicode MS Regular" + ], + "text-size": { + "base": 1, + "stops": [ + [ + 3, + 10 + ], + [ + 8, + 24 + ] + ] + } + }, + "paint": { + "text-halo-width": 1.25, + "text-halo-color": "hsla(0, 0%, 10%, 0.75)", + "text-color": "hsl(0, 0%, 45%)", + "text-halo-blur": 0 + } + }, + { + "id": "country-label-lg", + "type": "symbol", + "metadata": { + "mapbox:group": "1444856144497.7825" + }, + "source": "composite", + "source-layer": "country_label", + "minzoom": 1, + "maxzoom": 7, + "filter": [ + "in", + "scalerank", + 1, + 2 + ], + "layout": { + "text-field": "{name_en}", + "text-max-width": { + "base": 1, + "stops": [ + [ + 0, + 5 + ], + [ + 3, + 6 + ] + ] + }, + "text-font": [ + "DIN Offc Pro Medium", + "Arial Unicode MS Regular" + ], + "text-size": { + "base": 1, + "stops": [ + [ + 1, + 10 + ], + [ + 6, + 24 + ] + ] + } + }, + "paint": { + "text-halo-width": 1.25, + "text-halo-color": "hsla(0, 0%, 10%, 0.75)", + "text-color": "hsl(0, 0%, 45%)", + "text-halo-blur": 0 + } + } + ], + "created": 0, + "modified": 0, + "owner": "mapbox", + "id": "dark-v9", + "draft": false +} diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/debug/debug.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/debug/debug.html new file mode 100644 index 000000000..f6459f01f --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/debug/debug.html @@ -0,0 +1,103 @@ + + + + Mapbox GL JS debug page + + + + + + + +
+
+
+
+
+
+
+ + + + + + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/debug/events.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/debug/events.html new file mode 100644 index 000000000..d9df02ee3 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/debug/events.html @@ -0,0 +1,197 @@ + + + +Mapbox GL JS debug page + + + + + + + +
+
+
+
+
+ +
+ + + + + + + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/debug/image.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/debug/image.html new file mode 100644 index 000000000..646e5d867 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/debug/image.html @@ -0,0 +1,60 @@ + + + + Mapbox GL JS debug page + + + + + + + +
+ + + + + + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/debug/index.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/debug/index.html new file mode 100644 index 000000000..9c7f3bb64 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/debug/index.html @@ -0,0 +1,31 @@ + + + + Mapbox GL JS debug page + + + + + + + +
+ + + + + + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/debug/light-v9.js b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/debug/light-v9.js new file mode 100644 index 000000000..4cbca9b06 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/debug/light-v9.js @@ -0,0 +1,9131 @@ +window.lightv9 = { + "version": 8, + "name": "Mapbox Light", + "metadata": { + "mapbox:autocomposite": true, + "mapbox:type": "default", + "mapbox:groups": { + "1444934828655.3389": { + "name": "Aeroways", + "collapsed": true + }, + "1444933322393.2852": { + "name": "POI labels (scalerank 1)", + "collapsed": true + }, + "1444862578782.6787": { + "name": "Road labels", + "collapsed": true + }, + "1444855786460.0557": { + "name": "Roads", + "collapsed": true + }, + "1444934295202.7542": { + "name": "Admin boundaries", + "collapsed": true + }, + "1444856151690.9143": { + "name": "State labels", + "collapsed": true + }, + "1444933721429.3076": { + "name": "Road labels", + "collapsed": true + }, + "1444933358918.2366": { + "name": "POI labels (scalerank 2)", + "collapsed": true + }, + "1444933808272.805": { + "name": "Water labels", + "collapsed": true + }, + "1444933372896.5967": { + "name": "POI labels (scalerank 3)", + "collapsed": true + }, + "1444855799204.86": { + "name": "Bridges", + "collapsed": true + }, + "1444856087950.3635": { + "name": "Marine labels", + "collapsed": true + }, + "1456969573402.7817": { + "name": "Hillshading", + "collapsed": true + }, + "1444862510685.128": { + "name": "City labels", + "collapsed": true + }, + "1444855769305.6016": { + "name": "Tunnels", + "collapsed": true + }, + "1456970288113.8113": { + "name": "Landcover", + "collapsed": true + }, + "1444856144497.7825": { + "name": "Country labels", + "collapsed": true + } + } + }, + "sources": { + "composite": { + "url": "mapbox://mapbox.mapbox-terrain-v2,mapbox.mapbox-streets-v7", + "type": "vector" + } + }, + "sprite": "mapbox://sprites/mapbox/light-v9", + "glyphs": "mapbox://fonts/mapbox/{fontstack}/{range}.pbf", + "layers": [ + { + "id": "background", + "type": "background", + "layout": {}, + "paint": { + "background-color": "hsl(55, 11%, 96%)" + } + }, + { + "id": "landcover_wood", + "type": "fill", + "metadata": { + "mapbox:group": "1456970288113.8113" + }, + "source": "composite", + "source-layer": "landcover", + "maxzoom": 14, + "filter": [ + "==", + "class", + "wood" + ], + "layout": {}, + "paint": { + "fill-color": "hsl(0, 0%, 89%)", + "fill-opacity": 0.1, + "fill-antialias": false + } + }, + { + "id": "landcover_scrub", + "type": "fill", + "metadata": { + "mapbox:group": "1456970288113.8113" + }, + "source": "composite", + "source-layer": "landcover", + "maxzoom": 14, + "filter": [ + "==", + "class", + "scrub" + ], + "layout": {}, + "paint": { + "fill-color": "hsl(0, 0%, 89%)", + "fill-opacity": 0.1, + "fill-antialias": false + } + }, + { + "id": "landcover_grass", + "type": "fill", + "metadata": { + "mapbox:group": "1456970288113.8113" + }, + "source": "composite", + "source-layer": "landcover", + "maxzoom": 14, + "filter": [ + "==", + "class", + "grass" + ], + "layout": {}, + "paint": { + "fill-color": "hsl(0, 0%, 89%)", + "fill-opacity": 0.1, + "fill-antialias": false + } + }, + { + "id": "landcover_crop", + "type": "fill", + "metadata": { + "mapbox:group": "1456970288113.8113" + }, + "source": "composite", + "source-layer": "landcover", + "maxzoom": 14, + "filter": [ + "==", + "class", + "crop" + ], + "layout": {}, + "paint": { + "fill-color": "hsl(0, 0%, 89%)", + "fill-opacity": 0.1, + "fill-antialias": false + } + }, + { + "id": "national_park", + "type": "fill", + "source": "composite", + "source-layer": "landuse_overlay", + "filter": [ + "==", + "class", + "national_park" + ], + "layout": {}, + "paint": { + "fill-color": "hsl(150, 6%, 93%)", + "fill-opacity": { + "base": 1, + "stops": [ + [ + 5, + 0 + ], + [ + 6, + 0.5 + ] + ] + } + } + }, + { + "id": "parks", + "type": "fill", + "source": "composite", + "source-layer": "landuse", + "filter": [ + "==", + "class", + "park" + ], + "layout": {}, + "paint": { + "fill-color": "hsl(150, 6%, 93%)", + "fill-opacity": { + "base": 1, + "stops": [ + [ + 5, + 0 + ], + [ + 6, + 0.75 + ] + ] + } + } + }, + { + "id": "pitch", + "type": "fill", + "source": "composite", + "source-layer": "landuse", + "filter": [ + "==", + "class", + "pitch" + ], + "layout": {}, + "paint": { + "fill-color": "hsl(150, 6%, 93%)" + } + }, + { + "id": "industrial", + "type": "fill", + "source": "composite", + "source-layer": "landuse", + "filter": [ + "==", + "class", + "industrial" + ], + "layout": {}, + "paint": { + "fill-color": "hsl(150, 6%, 93%)" + } + }, + { + "id": "sand", + "type": "fill", + "source": "composite", + "source-layer": "landuse", + "filter": [ + "==", + "class", + "sand" + ], + "layout": {}, + "paint": { + "fill-color": "hsl(150, 6%, 93%)" + } + }, + { + "id": "hillshade_highlight_bright", + "type": "fill", + "metadata": { + "mapbox:group": "1456969573402.7817" + }, + "source": "composite", + "source-layer": "hillshade", + "maxzoom": 16, + "filter": [ + "==", + "level", + 94 + ], + "layout": {}, + "paint": { + "fill-color": "#fff", + "fill-opacity": { + "stops": [ + [ + 14, + 0.08 + ], + [ + 16, + 0 + ] + ] + }, + "fill-antialias": false + } + }, + { + "id": "hillshade_highlight_med", + "type": "fill", + "metadata": { + "mapbox:group": "1456969573402.7817" + }, + "source": "composite", + "source-layer": "hillshade", + "maxzoom": 16, + "filter": [ + "==", + "level", + 90 + ], + "layout": {}, + "paint": { + "fill-color": "#fff", + "fill-opacity": { + "stops": [ + [ + 14, + 0.08 + ], + [ + 16, + 0 + ] + ] + }, + "fill-antialias": false + } + }, + { + "id": "hillshade_shadow_faint", + "type": "fill", + "metadata": { + "mapbox:group": "1456969573402.7817" + }, + "source": "composite", + "source-layer": "hillshade", + "maxzoom": 16, + "filter": [ + "==", + "level", + 89 + ], + "layout": {}, + "paint": { + "fill-color": "hsl(0, 0%, 35%)", + "fill-opacity": { + "stops": [ + [ + 14, + 0.033 + ], + [ + 16, + 0 + ] + ] + }, + "fill-antialias": false + } + }, + { + "id": "hillshade_shadow_med", + "type": "fill", + "metadata": { + "mapbox:group": "1456969573402.7817" + }, + "source": "composite", + "source-layer": "hillshade", + "maxzoom": 16, + "filter": [ + "==", + "level", + 78 + ], + "layout": {}, + "paint": { + "fill-color": "hsl(0, 0%, 35%)", + "fill-opacity": { + "stops": [ + [ + 14, + 0.033 + ], + [ + 16, + 0 + ] + ] + }, + "fill-antialias": false + } + }, + { + "id": "hillshade_shadow_dark", + "type": "fill", + "metadata": { + "mapbox:group": "1456969573402.7817" + }, + "source": "composite", + "source-layer": "hillshade", + "maxzoom": 16, + "filter": [ + "==", + "level", + 67 + ], + "layout": {}, + "paint": { + "fill-color": "hsl(0, 0%, 35%)", + "fill-opacity": { + "stops": [ + [ + 14, + 0.06 + ], + [ + 16, + 0 + ] + ] + }, + "fill-antialias": false + } + }, + { + "id": "hillshade_shadow_extreme", + "type": "fill", + "metadata": { + "mapbox:group": "1456969573402.7817" + }, + "source": "composite", + "source-layer": "hillshade", + "maxzoom": 16, + "filter": [ + "==", + "level", + 56 + ], + "layout": {}, + "paint": { + "fill-color": "hsl(0, 0%, 35%)", + "fill-opacity": { + "stops": [ + [ + 14, + 0.06 + ], + [ + 16, + 0 + ] + ] + }, + "fill-antialias": false + } + }, + { + "id": "waterway-river-canal", + "type": "line", + "source": "composite", + "source-layer": "waterway", + "minzoom": 8, + "filter": [ + "any", + [ + "==", + "class", + "canal" + ], + [ + "==", + "class", + "river" + ] + ], + "layout": { + "line-cap": { + "base": 1, + "stops": [ + [ + 0, + "butt" + ], + [ + 11, + "round" + ] + ] + }, + "line-join": "round" + }, + "paint": { + "line-color": "#cbd3d4", + "line-width": { + "base": 1.3, + "stops": [ + [ + 8.5, + 0.1 + ], + [ + 20, + 8 + ] + ] + }, + "line-opacity": { + "base": 1, + "stops": [ + [ + 8, + 0 + ], + [ + 8.5, + 1 + ] + ] + } + } + }, + { + "id": "water shadow", + "type": "fill", + "source": "composite", + "source-layer": "water", + "layout": {}, + "paint": { + "fill-color": "hsl(185, 7%, 73%)", + "fill-translate": { + "base": 1.2, + "stops": [ + [ + 7, + [ + 0, + 0 + ] + ], + [ + 16, + [ + -1, + -1 + ] + ] + ] + }, + "fill-translate-anchor": "viewport", + "fill-opacity": 1 + } + }, + { + "id": "water", + "ref": "water shadow", + "paint": { + "fill-color": "hsl(185, 9%, 81%)" + } + }, + { + "id": "barrier_line-land-polygon", + "type": "fill", + "source": "composite", + "source-layer": "barrier_line", + "filter": [ + "all", + [ + "==", + "$type", + "Polygon" + ], + [ + "==", + "class", + "land" + ] + ], + "layout": {}, + "paint": { + "fill-outline-color": "#f0f5f3", + "fill-color": "#f0f5f3" + } + }, + { + "id": "barrier_line-land-line", + "type": "line", + "source": "composite", + "source-layer": "barrier_line", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "==", + "class", + "land" + ] + ], + "layout": { + "line-cap": "round" + }, + "paint": { + "line-width": { + "base": 1.99, + "stops": [ + [ + 14, + 0.75 + ], + [ + 20, + 40 + ] + ] + }, + "line-color": "#f0f5f3" + } + }, + { + "id": "aeroway-polygon", + "type": "fill", + "metadata": { + "mapbox:group": "1444934828655.3389" + }, + "source": "composite", + "source-layer": "aeroway", + "minzoom": 11, + "filter": [ + "all", + [ + "==", + "$type", + "Polygon" + ], + [ + "!=", + "type", + "apron" + ] + ], + "layout": {}, + "paint": { + "fill-color": "hsl(0, 0%, 97%)", + "fill-opacity": { + "base": 1, + "stops": [ + [ + 11, + 0 + ], + [ + 11.5, + 1 + ] + ] + } + } + }, + { + "id": "aeroway-runway", + "type": "line", + "metadata": { + "mapbox:group": "1444934828655.3389" + }, + "source": "composite", + "source-layer": "aeroway", + "minzoom": 9, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "==", + "type", + "runway" + ] + ], + "layout": {}, + "paint": { + "line-color": "hsl(0, 0%, 95%)", + "line-width": { + "base": 1.5, + "stops": [ + [ + 9, + 1 + ], + [ + 18, + 80 + ] + ] + } + } + }, + { + "id": "aeroway-taxiway", + "type": "line", + "metadata": { + "mapbox:group": "1444934828655.3389" + }, + "source": "composite", + "source-layer": "aeroway", + "minzoom": 9, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "==", + "type", + "taxiway" + ] + ], + "layout": {}, + "paint": { + "line-color": "hsl(0, 0%, 95%)", + "line-width": { + "base": 1.5, + "stops": [ + [ + 10, + 0.5 + ], + [ + 18, + 20 + ] + ] + } + } + }, + { + "id": "building", + "type": "fill", + "source": "composite", + "source-layer": "building", + "minzoom": 15, + "filter": [ + "all", + [ + "!=", + "type", + "building:part" + ], + [ + "==", + "underground", + "false" + ] + ], + "layout": {}, + "paint": { + "fill-color": "hsl(55, 5%, 91%)", + "fill-opacity": { + "base": 1, + "stops": [ + [ + 15.5, + 0 + ], + [ + 16, + 1 + ] + ] + }, + "fill-outline-color": "hsl(55, 3%, 87%)", + "fill-antialias": true + } + }, + { + "id": "tunnel-street-low", + "type": "line", + "metadata": { + "mapbox:group": "1444855769305.6016" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 11, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "street" + ], + [ + "==", + "structure", + "tunnel" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12.5, + 0.5 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-color": "hsl(187, 7%, 88%)", + "line-opacity": { + "stops": [ + [ + 11.5, + 0 + ], + [ + 12, + 1 + ], + [ + 14, + 1 + ], + [ + 14.01, + 0 + ] + ] + } + } + }, + { + "id": "tunnel-street_limited-low", + "type": "line", + "metadata": { + "mapbox:group": "1444855769305.6016" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 11, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "street_limited" + ], + [ + "==", + "structure", + "tunnel" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12.5, + 0.5 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-color": "hsl(187, 7%, 88%)", + "line-opacity": { + "stops": [ + [ + 11.5, + 0 + ], + [ + 12, + 1 + ], + [ + 14, + 1 + ], + [ + 14.01, + 0 + ] + ] + } + } + }, + { + "id": "tunnel-service-link-track-case", + "type": "line", + "metadata": { + "mapbox:group": "1444855769305.6016" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 14, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "in", + "class", + "link", + "service", + "track" + ], + [ + "==", + "structure", + "tunnel" + ], + [ + "!=", + "type", + "trunk_link" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12, + 0.75 + ], + [ + 20, + 2 + ] + ] + }, + "line-color": "hsl(185, 12%, 89%)", + "line-gap-width": { + "base": 1.5, + "stops": [ + [ + 14, + 0.5 + ], + [ + 18, + 12 + ] + ] + }, + "line-dasharray": [ + 3, + 3 + ] + } + }, + { + "id": "tunnel-street_limited-case", + "metadata": { + "mapbox:group": "1444855769305.6016" + }, + "ref": "tunnel-street_limited-low", + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12, + 0.75 + ], + [ + 20, + 2 + ] + ] + }, + "line-color": "hsl(185, 12%, 89%)", + "line-gap-width": { + "base": 1.5, + "stops": [ + [ + 13, + 0 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-dasharray": [ + 3, + 3 + ], + "line-opacity": { + "base": 1, + "stops": [ + [ + 13.99, + 0 + ], + [ + 14, + 1 + ] + ] + } + } + }, + { + "id": "tunnel-street-case", + "metadata": { + "mapbox:group": "1444855769305.6016" + }, + "ref": "tunnel-street-low", + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12, + 0.75 + ], + [ + 20, + 2 + ] + ] + }, + "line-color": "hsl(185, 12%, 89%)", + "line-gap-width": { + "base": 1.5, + "stops": [ + [ + 13, + 0 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-dasharray": [ + 3, + 3 + ], + "line-opacity": { + "base": 1, + "stops": [ + [ + 13.99, + 0 + ], + [ + 14, + 1 + ] + ] + } + } + }, + { + "id": "tunnel-secondary-tertiary-case", + "type": "line", + "metadata": { + "mapbox:group": "1444855769305.6016" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "in", + "class", + "secondary", + "tertiary" + ], + [ + "==", + "structure", + "tunnel" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.2, + "stops": [ + [ + 10, + 0.75 + ], + [ + 18, + 2 + ] + ] + }, + "line-dasharray": [ + 3, + 3 + ], + "line-gap-width": { + "base": 1.5, + "stops": [ + [ + 8.5, + 0.5 + ], + [ + 10, + 0.75 + ], + [ + 18, + 26 + ] + ] + }, + "line-color": "hsl(185, 12%, 89%)" + } + }, + { + "id": "tunnel-primary-case", + "type": "line", + "metadata": { + "mapbox:group": "1444855769305.6016" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "primary" + ], + [ + "==", + "structure", + "tunnel" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 5, + 0.75 + ], + [ + 16, + 2 + ] + ] + }, + "line-dasharray": [ + 3, + 3 + ], + "line-gap-width": { + "base": 1.5, + "stops": [ + [ + 5, + 0.75 + ], + [ + 18, + 32 + ] + ] + }, + "line-color": "hsl(185, 12%, 89%)" + } + }, + { + "id": "tunnel-trunk_link-case", + "type": "line", + "metadata": { + "mapbox:group": "1444855769305.6016" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "structure", + "tunnel" + ], + [ + "==", + "type", + "trunk_link" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12, + 0.75 + ], + [ + 20, + 2 + ] + ] + }, + "line-color": "hsl(185, 12%, 89%)", + "line-gap-width": { + "base": 1.5, + "stops": [ + [ + 12, + 0.5 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-dasharray": [ + 3, + 3 + ] + } + }, + { + "id": "tunnel-motorway_link-case", + "type": "line", + "metadata": { + "mapbox:group": "1444855769305.6016" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "motorway_link" + ], + [ + "==", + "structure", + "tunnel" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12, + 0.75 + ], + [ + 20, + 2 + ] + ] + }, + "line-color": "hsl(185, 12%, 89%)", + "line-gap-width": { + "base": 1.5, + "stops": [ + [ + 12, + 0.5 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-dasharray": [ + 3, + 3 + ] + } + }, + { + "id": "tunnel-trunk-case", + "type": "line", + "metadata": { + "mapbox:group": "1444855769305.6016" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "structure", + "tunnel" + ], + [ + "==", + "type", + "trunk" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 5, + 0.75 + ], + [ + 16, + 2 + ] + ] + }, + "line-color": "hsl(185, 12%, 89%)", + "line-gap-width": { + "base": 1.5, + "stops": [ + [ + 5, + 0.75 + ], + [ + 18, + 32 + ] + ] + }, + "line-opacity": 1, + "line-dasharray": [ + 3, + 3 + ] + } + }, + { + "id": "tunnel-motorway-case", + "type": "line", + "metadata": { + "mapbox:group": "1444855769305.6016" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "motorway" + ], + [ + "==", + "structure", + "tunnel" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 5, + 0.75 + ], + [ + 16, + 2 + ] + ] + }, + "line-color": "hsl(185, 12%, 89%)", + "line-gap-width": { + "base": 1.5, + "stops": [ + [ + 5, + 0.75 + ], + [ + 18, + 32 + ] + ] + }, + "line-opacity": 1, + "line-dasharray": [ + 3, + 3 + ] + } + }, + { + "id": "tunnel-construction", + "type": "line", + "metadata": { + "mapbox:group": "1444855769305.6016" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 14, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "construction" + ], + [ + "==", + "structure", + "tunnel" + ] + ] + ], + "layout": { + "line-join": "miter" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12.5, + 0.5 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-color": "hsl(187, 7%, 88%)", + "line-opacity": { + "base": 1, + "stops": [ + [ + 13.99, + 0 + ], + [ + 14, + 1 + ] + ] + }, + "line-dasharray": { + "base": 1, + "stops": [ + [ + 14, + [ + 0.4, + 0.8 + ] + ], + [ + 15, + [ + 0.3, + 0.6 + ] + ], + [ + 16, + [ + 0.2, + 0.3 + ] + ], + [ + 17, + [ + 0.2, + 0.25 + ] + ], + [ + 18, + [ + 0.15, + 0.15 + ] + ] + ] + } + } + }, + { + "id": "tunnel-path", + "type": "line", + "metadata": { + "mapbox:group": "1444855769305.6016" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "path" + ], + [ + "==", + "structure", + "tunnel" + ], + [ + "!=", + "type", + "steps" + ] + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 15, + 1 + ], + [ + 18, + 4 + ] + ] + }, + "line-dasharray": { + "base": 1, + "stops": [ + [ + 14, + [ + 1, + 0 + ] + ], + [ + 15, + [ + 1.75, + 1 + ] + ], + [ + 16, + [ + 1, + 0.75 + ] + ], + [ + 17, + [ + 1, + 0.5 + ] + ] + ] + }, + "line-color": "hsl(0, 0%, 85%)", + "line-opacity": { + "base": 1, + "stops": [ + [ + 14, + 0 + ], + [ + 14.25, + 1 + ] + ] + } + } + }, + { + "id": "tunnel-steps", + "type": "line", + "metadata": { + "mapbox:group": "1444855769305.6016" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "structure", + "tunnel" + ], + [ + "==", + "type", + "steps" + ] + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 15, + 1 + ], + [ + 18, + 4 + ] + ] + }, + "line-color": "hsl(0, 0%, 85%)", + "line-dasharray": { + "base": 1, + "stops": [ + [ + 14, + [ + 1, + 0 + ] + ], + [ + 15, + [ + 1.75, + 1 + ] + ], + [ + 16, + [ + 1, + 0.75 + ] + ], + [ + 17, + [ + 0.3, + 0.3 + ] + ] + ] + }, + "line-opacity": { + "base": 1, + "stops": [ + [ + 14, + 0 + ], + [ + 14.25, + 1 + ] + ] + } + } + }, + { + "id": "tunnel-trunk_link", + "metadata": { + "mapbox:group": "1444855769305.6016" + }, + "ref": "tunnel-trunk_link-case", + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12, + 0.5 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-color": "hsl(187, 7%, 88%)", + "line-opacity": 1, + "line-dasharray": [ + 1, + 0 + ] + } + }, + { + "id": "tunnel-motorway_link", + "metadata": { + "mapbox:group": "1444855769305.6016" + }, + "ref": "tunnel-motorway_link-case", + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12, + 0.5 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-color": "hsl(187, 7%, 88%)", + "line-opacity": 1, + "line-dasharray": [ + 1, + 0 + ] + } + }, + { + "id": "tunnel-pedestrian", + "type": "line", + "metadata": { + "mapbox:group": "1444855769305.6016" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "pedestrian" + ], + [ + "==", + "structure", + "tunnel" + ] + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 14, + 0.5 + ], + [ + 18, + 12 + ] + ] + }, + "line-color": "hsl(187, 7%, 88%)", + "line-opacity": 1, + "line-dasharray": { + "base": 1, + "stops": [ + [ + 14, + [ + 1, + 0 + ] + ], + [ + 15, + [ + 1.5, + 0.4 + ] + ], + [ + 16, + [ + 1, + 0.2 + ] + ] + ] + } + } + }, + { + "id": "tunnel-service-link-track", + "metadata": { + "mapbox:group": "1444855769305.6016" + }, + "ref": "tunnel-service-link-track-case", + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 14, + 0.5 + ], + [ + 18, + 12 + ] + ] + }, + "line-color": "hsl(187, 7%, 88%)", + "line-dasharray": [ + 1, + 0 + ] + } + }, + { + "id": "tunnel-street_limited", + "metadata": { + "mapbox:group": "1444855769305.6016" + }, + "ref": "tunnel-street_limited-low", + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12.5, + 0.5 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-color": "hsl(187, 7%, 88%)", + "line-opacity": { + "base": 1, + "stops": [ + [ + 13.99, + 0 + ], + [ + 14, + 1 + ] + ] + } + } + }, + { + "id": "tunnel-street", + "metadata": { + "mapbox:group": "1444855769305.6016" + }, + "ref": "tunnel-street-low", + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12.5, + 0.5 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-color": "hsl(187, 7%, 88%)", + "line-opacity": { + "base": 1, + "stops": [ + [ + 13.99, + 0 + ], + [ + 14, + 1 + ] + ] + } + } + }, + { + "id": "tunnel-secondary-tertiary", + "metadata": { + "mapbox:group": "1444855769305.6016" + }, + "ref": "tunnel-secondary-tertiary-case", + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 8.5, + 0.5 + ], + [ + 10, + 0.75 + ], + [ + 18, + 26 + ] + ] + }, + "line-color": "hsl(187, 7%, 88%)", + "line-opacity": 1, + "line-dasharray": [ + 1, + 0 + ], + "line-blur": 0 + } + }, + { + "id": "tunnel-primary", + "metadata": { + "mapbox:group": "1444855769305.6016" + }, + "ref": "tunnel-primary-case", + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 5, + 0.75 + ], + [ + 18, + 32 + ] + ] + }, + "line-color": "hsl(187, 7%, 88%)", + "line-opacity": 1, + "line-dasharray": [ + 1, + 0 + ], + "line-blur": 0 + } + }, + { + "id": "tunnel-trunk", + "type": "line", + "metadata": { + "mapbox:group": "1444855769305.6016" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "trunk" + ], + [ + "==", + "structure", + "tunnel" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 5, + 0.75 + ], + [ + 18, + 32 + ] + ] + }, + "line-color": "hsl(187, 7%, 88%)" + } + }, + { + "id": "tunnel-motorway", + "metadata": { + "mapbox:group": "1444855769305.6016" + }, + "ref": "tunnel-motorway-case", + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 5, + 0.75 + ], + [ + 18, + 32 + ] + ] + }, + "line-dasharray": [ + 1, + 0 + ], + "line-opacity": 1, + "line-color": "hsl(187, 7%, 88%)", + "line-blur": 0 + } + }, + { + "id": "road-pedestrian-case", + "type": "line", + "metadata": { + "mapbox:group": "1444855786460.0557" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 12, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "pedestrian" + ], + [ + "==", + "structure", + "none" + ] + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 14, + 2 + ], + [ + 18, + 14.5 + ] + ] + }, + "line-color": { + "base": 1, + "stops": [ + [ + 9, + "hsl(156, 7%, 87%)" + ], + [ + 11, + "#e8edeb" + ] + ] + }, + "line-gap-width": 0, + "line-opacity": { + "base": 1, + "stops": [ + [ + 6, + 0 + ], + [ + 7, + 0.4 + ], + [ + 9, + 0.5 + ], + [ + 10, + 1 + ] + ] + } + } + }, + { + "id": "road-street-low", + "type": "line", + "metadata": { + "mapbox:group": "1444855786460.0557" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 11, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "street" + ], + [ + "==", + "structure", + "none" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12.5, + 0.5 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-color": "#fff", + "line-opacity": { + "stops": [ + [ + 11, + 0 + ], + [ + 11.25, + 1 + ], + [ + 14, + 1 + ], + [ + 14.01, + 0 + ] + ] + } + } + }, + { + "id": "road-street_limited-low", + "type": "line", + "metadata": { + "mapbox:group": "1444855786460.0557" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 11, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "street_limited" + ], + [ + "==", + "structure", + "none" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12.5, + 0.5 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-color": "#fff", + "line-opacity": { + "stops": [ + [ + 11, + 0 + ], + [ + 11.25, + 1 + ], + [ + 14, + 1 + ], + [ + 14.01, + 0 + ] + ] + } + } + }, + { + "id": "road-service-link-track-case", + "type": "line", + "metadata": { + "mapbox:group": "1444855786460.0557" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 14, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "in", + "class", + "link", + "service", + "track" + ], + [ + "!in", + "structure", + "bridge", + "tunnel" + ], + [ + "!=", + "type", + "trunk_link" + ] + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12, + 0.75 + ], + [ + 20, + 2 + ] + ] + }, + "line-color": { + "base": 1, + "stops": [ + [ + 9, + "hsl(156, 7%, 87%)" + ], + [ + 11, + "#e8edeb" + ] + ] + }, + "line-gap-width": { + "base": 1.5, + "stops": [ + [ + 14, + 0.5 + ], + [ + 18, + 12 + ] + ] + }, + "line-opacity": { + "base": 1, + "stops": [ + [ + 6, + 0 + ], + [ + 7, + 0.4 + ], + [ + 9, + 0.5 + ], + [ + 10, + 1 + ] + ] + } + } + }, + { + "id": "road-street_limited-case", + "metadata": { + "mapbox:group": "1444855786460.0557" + }, + "ref": "road-street_limited-low", + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12, + 0.75 + ], + [ + 20, + 2 + ] + ] + }, + "line-color": { + "base": 1, + "stops": [ + [ + 9, + "hsl(156, 7%, 87%)" + ], + [ + 11, + "#e8edeb" + ] + ] + }, + "line-gap-width": { + "base": 1.5, + "stops": [ + [ + 13, + 0 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-opacity": { + "base": 1, + "stops": [ + [ + 6, + 0 + ], + [ + 7, + 0.4 + ], + [ + 9, + 0.5 + ], + [ + 10, + 1 + ] + ] + } + } + }, + { + "id": "road-street-case", + "metadata": { + "mapbox:group": "1444855786460.0557" + }, + "ref": "road-street-low", + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12, + 0.75 + ], + [ + 20, + 2 + ] + ] + }, + "line-color": { + "base": 1, + "stops": [ + [ + 9, + "hsl(156, 7%, 87%)" + ], + [ + 11, + "#e8edeb" + ] + ] + }, + "line-gap-width": { + "base": 1.5, + "stops": [ + [ + 13, + 0 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-opacity": { + "base": 1, + "stops": [ + [ + 6, + 0 + ], + [ + 7, + 0.4 + ], + [ + 9, + 0.5 + ], + [ + 10, + 1 + ] + ] + } + } + }, + { + "id": "road-main-case", + "type": "line", + "metadata": { + "mapbox:group": "1444855786460.0557" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "in", + "class", + "secondary", + "tertiary" + ], + [ + "!in", + "structure", + "bridge", + "tunnel" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.2, + "stops": [ + [ + 10, + 0.75 + ], + [ + 18, + 2 + ] + ] + }, + "line-color": { + "base": 1, + "stops": [ + [ + 9, + "hsl(156, 7%, 87%)" + ], + [ + 11, + "#e8edeb" + ] + ] + }, + "line-gap-width": { + "base": 1.5, + "stops": [ + [ + 8.5, + 0.5 + ], + [ + 10, + 0.75 + ], + [ + 18, + 26 + ] + ] + }, + "line-opacity": { + "base": 1, + "stops": [ + [ + 6, + 0 + ], + [ + 7, + 0.4 + ], + [ + 9, + 0.5 + ], + [ + 10, + 1 + ] + ] + } + } + }, + { + "id": "road-primary-case", + "type": "line", + "metadata": { + "mapbox:group": "1444855786460.0557" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "primary" + ], + [ + "!in", + "structure", + "bridge", + "tunnel" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 5, + 0.75 + ], + [ + 16, + 2 + ] + ] + }, + "line-color": { + "base": 1, + "stops": [ + [ + 9, + "hsl(156, 7%, 87%)" + ], + [ + 11, + "#e8edeb" + ] + ] + }, + "line-gap-width": { + "base": 1.5, + "stops": [ + [ + 5, + 0.75 + ], + [ + 18, + 32 + ] + ] + }, + "line-opacity": { + "base": 1, + "stops": [ + [ + 6, + 0 + ], + [ + 7, + 0.4 + ], + [ + 9, + 0.5 + ], + [ + 10, + 1 + ] + ] + } + } + }, + { + "id": "road-motorway_link-case", + "type": "line", + "metadata": { + "mapbox:group": "1444855786460.0557" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 10, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "motorway_link" + ], + [ + "!in", + "structure", + "bridge", + "tunnel" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12, + 0.75 + ], + [ + 20, + 2 + ] + ] + }, + "line-color": { + "base": 1, + "stops": [ + [ + 9, + "hsl(156, 7%, 87%)" + ], + [ + 11, + "#e8edeb" + ] + ] + }, + "line-gap-width": { + "base": 1.5, + "stops": [ + [ + 12, + 0.5 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-opacity": { + "base": 1, + "stops": [ + [ + 6, + 0 + ], + [ + 7, + 0.4 + ], + [ + 9, + 0.5 + ], + [ + 10, + 1 + ] + ] + } + } + }, + { + "id": "road-trunk_link-case", + "type": "line", + "metadata": { + "mapbox:group": "1444855786460.0557" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 11, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "!in", + "structure", + "bridge", + "tunnel" + ], + [ + "==", + "type", + "trunk_link" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12, + 0.75 + ], + [ + 20, + 2 + ] + ] + }, + "line-color": { + "base": 1, + "stops": [ + [ + 9, + "hsl(156, 7%, 87%)" + ], + [ + 11, + "#e8edeb" + ] + ] + }, + "line-gap-width": { + "base": 1.5, + "stops": [ + [ + 12, + 0.5 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-opacity": { + "base": 1, + "stops": [ + [ + 6, + 0 + ], + [ + 7, + 0.4 + ], + [ + 9, + 0.5 + ], + [ + 10, + 1 + ] + ] + } + } + }, + { + "id": "road-trunk-case", + "type": "line", + "metadata": { + "mapbox:group": "1444855786460.0557" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 5, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "trunk" + ], + [ + "!in", + "structure", + "bridge", + "tunnel" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 7, + 0.5 + ], + [ + 10, + 1 + ], + [ + 16, + 2 + ] + ] + }, + "line-color": { + "base": 1, + "stops": [ + [ + 9, + "hsl(156, 7%, 87%)" + ], + [ + 11, + "#e8edeb" + ] + ] + }, + "line-gap-width": { + "base": 1.5, + "stops": [ + [ + 5, + 0.5 + ], + [ + 9, + 1.4 + ], + [ + 18, + 32 + ] + ] + }, + "line-opacity": { + "base": 1, + "stops": [ + [ + 6, + 0 + ], + [ + 6.1, + 1 + ] + ] + } + } + }, + { + "id": "road-motorway-case", + "type": "line", + "metadata": { + "mapbox:group": "1444855786460.0557" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "motorway" + ], + [ + "!in", + "structure", + "bridge", + "tunnel" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 7, + 0.5 + ], + [ + 10, + 1 + ], + [ + 16, + 2 + ] + ] + }, + "line-color": { + "base": 1, + "stops": [ + [ + 9, + "hsl(156, 7%, 87%)" + ], + [ + 11, + "#e8edeb" + ] + ] + }, + "line-gap-width": { + "base": 1.5, + "stops": [ + [ + 5, + 0.75 + ], + [ + 18, + 32 + ] + ] + }, + "line-opacity": 1 + } + }, + { + "id": "road-construction", + "type": "line", + "metadata": { + "mapbox:group": "1444855786460.0557" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 14, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "construction" + ], + [ + "==", + "structure", + "none" + ] + ] + ], + "layout": { + "line-join": "miter" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12.5, + 0.5 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-color": "#fff", + "line-opacity": { + "base": 1, + "stops": [ + [ + 13.99, + 0 + ], + [ + 14, + 1 + ] + ] + }, + "line-dasharray": { + "base": 1, + "stops": [ + [ + 14, + [ + 0.4, + 0.8 + ] + ], + [ + 15, + [ + 0.3, + 0.6 + ] + ], + [ + 16, + [ + 0.2, + 0.3 + ] + ], + [ + 17, + [ + 0.2, + 0.25 + ] + ], + [ + 18, + [ + 0.15, + 0.15 + ] + ] + ] + } + } + }, + { + "id": "road-sidewalks", + "type": "line", + "metadata": { + "mapbox:group": "1444855786460.0557" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 16, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "!in", + "structure", + "bridge", + "tunnel" + ], + [ + "in", + "type", + "crossing", + "sidewalk" + ] + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 15, + 1 + ], + [ + 18, + 4 + ] + ] + }, + "line-color": "#fff", + "line-dasharray": { + "base": 1, + "stops": [ + [ + 14, + [ + 1, + 0 + ] + ], + [ + 15, + [ + 1.75, + 1 + ] + ], + [ + 16, + [ + 1, + 0.75 + ] + ], + [ + 17, + [ + 1, + 0.5 + ] + ] + ] + }, + "line-opacity": { + "base": 1, + "stops": [ + [ + 16, + 0 + ], + [ + 16.25, + 1 + ] + ] + } + } + }, + { + "id": "road-path", + "type": "line", + "metadata": { + "mapbox:group": "1444855786460.0557" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "path" + ], + [ + "!in", + "structure", + "bridge", + "tunnel" + ], + [ + "!in", + "type", + "crossing", + "sidewalk", + "steps" + ] + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 15, + 1 + ], + [ + 18, + 4 + ] + ] + }, + "line-color": "#fff", + "line-dasharray": { + "base": 1, + "stops": [ + [ + 14, + [ + 1, + 0 + ] + ], + [ + 15, + [ + 1.75, + 1 + ] + ], + [ + 16, + [ + 1, + 0.75 + ] + ], + [ + 17, + [ + 1, + 0.5 + ] + ] + ] + }, + "line-opacity": { + "base": 1, + "stops": [ + [ + 14, + 0 + ], + [ + 14.25, + 1 + ] + ] + } + } + }, + { + "id": "road-steps", + "type": "line", + "metadata": { + "mapbox:group": "1444855786460.0557" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "!in", + "structure", + "bridge", + "tunnel" + ], + [ + "==", + "type", + "steps" + ] + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 15, + 1 + ], + [ + 18, + 4 + ] + ] + }, + "line-color": "#fff", + "line-dasharray": { + "base": 1, + "stops": [ + [ + 14, + [ + 1, + 0 + ] + ], + [ + 15, + [ + 1.75, + 1 + ] + ], + [ + 16, + [ + 1, + 0.75 + ] + ], + [ + 17, + [ + 0.3, + 0.3 + ] + ] + ] + }, + "line-opacity": { + "base": 1, + "stops": [ + [ + 14, + 0 + ], + [ + 14.25, + 1 + ] + ] + } + } + }, + { + "id": "road-trunk_link", + "metadata": { + "mapbox:group": "1444855786460.0557" + }, + "ref": "road-trunk_link-case", + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12, + 0.5 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-color": "#fff", + "line-opacity": 1 + } + }, + { + "id": "road-motorway_link", + "metadata": { + "mapbox:group": "1444855786460.0557" + }, + "ref": "road-motorway_link-case", + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12, + 0.5 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-color": "#fff", + "line-opacity": 1 + } + }, + { + "id": "road-pedestrian", + "metadata": { + "mapbox:group": "1444855786460.0557" + }, + "ref": "road-pedestrian-case", + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 14, + 0.5 + ], + [ + 18, + 12 + ] + ] + }, + "line-color": "#fff", + "line-opacity": 1, + "line-dasharray": { + "base": 1, + "stops": [ + [ + 14, + [ + 1, + 0 + ] + ], + [ + 15, + [ + 1.5, + 0.4 + ] + ], + [ + 16, + [ + 1, + 0.2 + ] + ] + ] + } + } + }, + { + "id": "road-service-link-track", + "type": "line", + "metadata": { + "mapbox:group": "1444855786460.0557" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 14, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "in", + "class", + "link", + "service", + "track" + ], + [ + "!in", + "structure", + "bridge", + "tunnel" + ], + [ + "!=", + "type", + "trunk_link" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 14, + 0.5 + ], + [ + 18, + 12 + ] + ] + }, + "line-color": "#fff" + } + }, + { + "id": "road-street_limited", + "metadata": { + "mapbox:group": "1444855786460.0557" + }, + "ref": "road-street_limited-low", + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12.5, + 0.5 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-color": "#fff", + "line-opacity": { + "base": 1, + "stops": [ + [ + 13.99, + 0 + ], + [ + 14, + 1 + ] + ] + } + } + }, + { + "id": "road-street", + "metadata": { + "mapbox:group": "1444855786460.0557" + }, + "ref": "road-street-low", + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12.5, + 0.5 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-color": "#fff", + "line-opacity": { + "base": 1, + "stops": [ + [ + 13.99, + 0 + ], + [ + 14, + 1 + ] + ] + } + } + }, + { + "id": "road-secondary-tertiary", + "metadata": { + "mapbox:group": "1444855786460.0557" + }, + "ref": "road-main-case", + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 8.5, + 0.5 + ], + [ + 10, + 0.75 + ], + [ + 18, + 26 + ] + ] + }, + "line-color": "#fff", + "line-opacity": { + "base": 1.2, + "stops": [ + [ + 5, + 0 + ], + [ + 5.5, + 1 + ] + ] + } + } + }, + { + "id": "road-primary", + "metadata": { + "mapbox:group": "1444855786460.0557" + }, + "ref": "road-primary-case", + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 5, + 0.75 + ], + [ + 18, + 32 + ] + ] + }, + "line-color": "#fff", + "line-opacity": { + "base": 1.2, + "stops": [ + [ + 5, + 0 + ], + [ + 5.5, + 1 + ] + ] + } + } + }, + { + "id": "road-trunk", + "metadata": { + "mapbox:group": "1444855786460.0557" + }, + "ref": "road-trunk-case", + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 5, + 0.5 + ], + [ + 9, + 1.4 + ], + [ + 18, + 32 + ] + ] + }, + "line-color": "#fff", + "line-opacity": 1 + } + }, + { + "id": "road-motorway", + "metadata": { + "mapbox:group": "1444855786460.0557" + }, + "ref": "road-motorway-case", + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 5, + 0.75 + ], + [ + 18, + 32 + ] + ] + }, + "line-color": "#fff", + "line-opacity": 1 + } + }, + { + "id": "road-rail", + "type": "line", + "metadata": { + "mapbox:group": "1444855786460.0557" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "in", + "class", + "major_rail", + "minor_rail" + ], + [ + "!in", + "structure", + "bridge", + "tunnel" + ] + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#e8edeb", + "line-width": { + "base": 1, + "stops": [ + [ + 14, + 0.75 + ], + [ + 20, + 1 + ] + ] + } + } + }, + { + "id": "bridge-pedestrian-case", + "type": "line", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "pedestrian" + ], + [ + "==", + "structure", + "bridge" + ] + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 14, + 2 + ], + [ + 18, + 14.5 + ] + ] + }, + "line-color": "#e8edeb", + "line-gap-width": 0, + "line-opacity": { + "base": 1, + "stops": [ + [ + 13.99, + 0 + ], + [ + 14, + 1 + ] + ] + } + } + }, + { + "id": "bridge-street-low", + "type": "line", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 11, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "street" + ], + [ + "==", + "structure", + "bridge" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12.5, + 0.5 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-color": "#fff", + "line-opacity": { + "stops": [ + [ + 11.5, + 0 + ], + [ + 12, + 1 + ], + [ + 14, + 1 + ], + [ + 14.01, + 0 + ] + ] + } + } + }, + { + "id": "bridge-street_limited-low", + "type": "line", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 11, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "street_limited" + ], + [ + "==", + "structure", + "bridge" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12.5, + 0.5 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-color": "#fff", + "line-opacity": { + "stops": [ + [ + 11.5, + 0 + ], + [ + 12, + 1 + ], + [ + 14, + 1 + ], + [ + 14.01, + 0 + ] + ] + } + } + }, + { + "id": "bridge-service-link-track-case", + "type": "line", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 14, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "in", + "class", + "link", + "service", + "track" + ], + [ + "==", + "structure", + "bridge" + ], + [ + "!=", + "type", + "trunk_link" + ] + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12, + 0.75 + ], + [ + 20, + 2 + ] + ] + }, + "line-color": "#e8edeb", + "line-gap-width": { + "base": 1.5, + "stops": [ + [ + 14, + 0.5 + ], + [ + 18, + 12 + ] + ] + } + } + }, + { + "id": "bridge-street_limited-case", + "type": "line", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 11, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "street_limited" + ], + [ + "==", + "structure", + "bridge" + ] + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12, + 0.75 + ], + [ + 20, + 2 + ] + ] + }, + "line-color": "#e8edeb", + "line-gap-width": { + "base": 1.5, + "stops": [ + [ + 13, + 0 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + } + } + }, + { + "id": "bridge-street-case", + "type": "line", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 11, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "street" + ], + [ + "==", + "structure", + "bridge" + ] + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12, + 0.75 + ], + [ + 20, + 2 + ] + ] + }, + "line-color": "#e8edeb", + "line-opacity": { + "base": 1, + "stops": [ + [ + 13.99, + 0 + ], + [ + 14, + 1 + ] + ] + }, + "line-gap-width": { + "base": 1.5, + "stops": [ + [ + 13, + 0 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + } + } + }, + { + "id": "bridge-secondary-tertiary-case", + "type": "line", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "in", + "class", + "secondary", + "tertiary" + ], + [ + "==", + "structure", + "bridge" + ] + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.2, + "stops": [ + [ + 10, + 0.75 + ], + [ + 18, + 2 + ] + ] + }, + "line-color": "#e8edeb", + "line-gap-width": { + "base": 1.5, + "stops": [ + [ + 8.5, + 0.5 + ], + [ + 10, + 0.75 + ], + [ + 18, + 26 + ] + ] + }, + "line-translate": [ + 0, + 0 + ] + } + }, + { + "id": "bridge-primary-case", + "type": "line", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "primary" + ], + [ + "==", + "structure", + "bridge" + ] + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 5, + 0.75 + ], + [ + 16, + 2 + ] + ] + }, + "line-color": "#e8edeb", + "line-gap-width": { + "base": 1.5, + "stops": [ + [ + 5, + 0.75 + ], + [ + 18, + 32 + ] + ] + }, + "line-translate": [ + 0, + 0 + ] + } + }, + { + "id": "bridge-trunk_link-case", + "type": "line", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "structure", + "bridge" + ], + [ + "==", + "type", + "trunk_link" + ] + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12, + 0.75 + ], + [ + 20, + 2 + ] + ] + }, + "line-color": "#e8edeb", + "line-gap-width": { + "base": 1.5, + "stops": [ + [ + 12, + 0.5 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-opacity": { + "base": 1, + "stops": [ + [ + 10.99, + 0 + ], + [ + 11, + 1 + ] + ] + } + } + }, + { + "id": "bridge-motorway_link-case", + "type": "line", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "motorway_link" + ], + [ + "<=", + "layer", + 1 + ], + [ + "==", + "structure", + "bridge" + ] + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12, + 0.75 + ], + [ + 20, + 2 + ] + ] + }, + "line-color": "#e8edeb", + "line-gap-width": { + "base": 1.5, + "stops": [ + [ + 12, + 0.5 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-opacity": 1 + } + }, + { + "id": "bridge-trunk-case", + "type": "line", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "trunk" + ], + [ + "==", + "structure", + "bridge" + ] + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 10, + 1 + ], + [ + 16, + 2 + ] + ] + }, + "line-color": "#e8edeb", + "line-gap-width": { + "base": 1.5, + "stops": [ + [ + 5, + 0.75 + ], + [ + 18, + 32 + ] + ] + } + } + }, + { + "id": "bridge-motorway-case", + "type": "line", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "motorway" + ], + [ + "==", + "structure", + "bridge" + ] + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 7, + 0.5 + ], + [ + 10, + 1 + ], + [ + 16, + 2 + ] + ] + }, + "line-color": "#e8edeb", + "line-gap-width": { + "base": 1.5, + "stops": [ + [ + 5, + 0.75 + ], + [ + 18, + 32 + ] + ] + } + } + }, + { + "id": "bridge-construction", + "type": "line", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 14, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "construction" + ], + [ + "==", + "structure", + "bridge" + ] + ] + ], + "layout": { + "line-join": "miter" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12.5, + 0.5 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-color": "#fff", + "line-opacity": { + "base": 1, + "stops": [ + [ + 13.99, + 0 + ], + [ + 14, + 1 + ] + ] + }, + "line-dasharray": { + "base": 1, + "stops": [ + [ + 14, + [ + 0.4, + 0.8 + ] + ], + [ + 15, + [ + 0.3, + 0.6 + ] + ], + [ + 16, + [ + 0.2, + 0.3 + ] + ], + [ + 17, + [ + 0.2, + 0.25 + ] + ], + [ + 18, + [ + 0.15, + 0.15 + ] + ] + ] + } + } + }, + { + "id": "bridge-path", + "type": "line", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "path" + ], + [ + "==", + "structure", + "bridge" + ], + [ + "!=", + "type", + "steps" + ] + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 15, + 1 + ], + [ + 18, + 4 + ] + ] + }, + "line-color": "#fff", + "line-dasharray": { + "base": 1, + "stops": [ + [ + 14, + [ + 1, + 0 + ] + ], + [ + 15, + [ + 1.75, + 1 + ] + ], + [ + 16, + [ + 1, + 0.75 + ] + ], + [ + 17, + [ + 1, + 0.5 + ] + ] + ] + }, + "line-opacity": { + "base": 1, + "stops": [ + [ + 14, + 0 + ], + [ + 14.25, + 1 + ] + ] + } + } + }, + { + "id": "bridge-steps", + "type": "line", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "structure", + "bridge" + ], + [ + "==", + "type", + "steps" + ] + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 15, + 1 + ], + [ + 18, + 4 + ] + ] + }, + "line-color": "#fff", + "line-dasharray": { + "base": 1, + "stops": [ + [ + 14, + [ + 1, + 0 + ] + ], + [ + 15, + [ + 1.75, + 1 + ] + ], + [ + 16, + [ + 1, + 0.75 + ] + ], + [ + 17, + [ + 0.3, + 0.3 + ] + ] + ] + }, + "line-opacity": { + "base": 1, + "stops": [ + [ + 14, + 0 + ], + [ + 14.25, + 1 + ] + ] + } + } + }, + { + "id": "bridge-trunk_link", + "type": "line", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "!in", + "layer", + 2, + 3, + 4, + 5 + ], + [ + "==", + "structure", + "bridge" + ], + [ + "==", + "type", + "trunk_link" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12, + 0.5 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-color": "#fff" + } + }, + { + "id": "bridge-motorway_link", + "type": "line", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "motorway_link" + ], + [ + "!in", + "layer", + 2, + 3, + 4, + 5 + ], + [ + "==", + "structure", + "bridge" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12, + 0.5 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-color": "#fff" + } + }, + { + "id": "bridge-pedestrian", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "ref": "bridge-pedestrian-case", + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 14, + 0.5 + ], + [ + 18, + 12 + ] + ] + }, + "line-color": "#fff", + "line-opacity": 1, + "line-dasharray": { + "base": 1, + "stops": [ + [ + 14, + [ + 1, + 0 + ] + ], + [ + 15, + [ + 1.5, + 0.4 + ] + ], + [ + 16, + [ + 1, + 0.2 + ] + ] + ] + } + } + }, + { + "id": "bridge-service-link-track", + "type": "line", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 14, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "in", + "class", + "link", + "service", + "track" + ], + [ + "==", + "structure", + "bridge" + ], + [ + "!=", + "type", + "trunk_link" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 14, + 0.5 + ], + [ + 18, + 12 + ] + ] + }, + "line-color": "#fff" + } + }, + { + "id": "bridge-street_limited", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "ref": "bridge-street_limited-low", + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12.5, + 0.5 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-color": "#fff", + "line-opacity": { + "base": 1, + "stops": [ + [ + 13.99, + 0 + ], + [ + 14, + 1 + ] + ] + } + } + }, + { + "id": "bridge-street", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "ref": "bridge-street-low", + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12.5, + 0.5 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-color": "#fff", + "line-opacity": { + "base": 1, + "stops": [ + [ + 13.99, + 0 + ], + [ + 14, + 1 + ] + ] + } + } + }, + { + "id": "bridge-secondary-tertiary", + "type": "line", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "structure", + "bridge" + ], + [ + "in", + "type", + "secondary", + "tertiary" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 8.5, + 0.5 + ], + [ + 10, + 0.75 + ], + [ + 18, + 26 + ] + ] + }, + "line-color": "#fff", + "line-opacity": { + "base": 1.2, + "stops": [ + [ + 5, + 0 + ], + [ + 5.5, + 1 + ] + ] + } + } + }, + { + "id": "bridge-primary", + "type": "line", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "structure", + "bridge" + ], + [ + "==", + "type", + "primary" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 5, + 0.75 + ], + [ + 18, + 32 + ] + ] + }, + "line-color": "#fff", + "line-opacity": { + "base": 1.2, + "stops": [ + [ + 5, + 0 + ], + [ + 5.5, + 1 + ] + ] + } + } + }, + { + "id": "bridge-trunk", + "type": "line", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "trunk" + ], + [ + "!in", + "layer", + 2, + 3, + 4, + 5 + ], + [ + "==", + "structure", + "bridge" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 5, + 0.75 + ], + [ + 18, + 32 + ] + ] + }, + "line-color": "#fff" + } + }, + { + "id": "bridge-motorway", + "type": "line", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "motorway" + ], + [ + "!in", + "layer", + 2, + 3, + 4, + 5 + ], + [ + "==", + "structure", + "bridge" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 5, + 0.75 + ], + [ + 18, + 32 + ] + ] + }, + "line-color": "#fff" + } + }, + { + "id": "bridge-rail", + "type": "line", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "in", + "class", + "major_rail", + "minor_rail" + ], + [ + "==", + "structure", + "bridge" + ] + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#e8edeb", + "line-width": { + "base": 1, + "stops": [ + [ + 14, + 0.75 + ], + [ + 20, + 1 + ] + ] + } + } + }, + { + "id": "bridge-trunk_link-2-case", + "type": "line", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + ">=", + "layer", + 2 + ], + [ + "==", + "structure", + "bridge" + ], + [ + "==", + "type", + "trunk_link" + ] + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12, + 0.75 + ], + [ + 20, + 2 + ] + ] + }, + "line-color": "#e8edeb", + "line-gap-width": { + "base": 1.5, + "stops": [ + [ + 12, + 0.5 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-opacity": { + "base": 1, + "stops": [ + [ + 10.99, + 0 + ], + [ + 11, + 1 + ] + ] + } + } + }, + { + "id": "bridge-motorway_link-2-case copy", + "type": "line", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "motorway_link" + ], + [ + ">=", + "layer", + 2 + ], + [ + "==", + "structure", + "bridge" + ] + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12, + 0.75 + ], + [ + 20, + 2 + ] + ] + }, + "line-color": "#e8edeb", + "line-gap-width": { + "base": 1.5, + "stops": [ + [ + 12, + 0.5 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-opacity": 1 + } + }, + { + "id": "bridge-trunk-2-case", + "type": "line", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "trunk" + ], + [ + ">=", + "layer", + 2 + ], + [ + "==", + "structure", + "bridge" + ] + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 10, + 1 + ], + [ + 16, + 2 + ] + ] + }, + "line-color": "#e8edeb", + "line-gap-width": { + "base": 1.5, + "stops": [ + [ + 5, + 0.75 + ], + [ + 18, + 32 + ] + ] + } + } + }, + { + "id": "bridge-motorway-2-case", + "type": "line", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "motorway" + ], + [ + ">=", + "layer", + 2 + ], + [ + "==", + "structure", + "bridge" + ] + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 7, + 0.5 + ], + [ + 10, + 1 + ], + [ + 16, + 2 + ] + ] + }, + "line-color": "#e8edeb", + "line-gap-width": { + "base": 1.5, + "stops": [ + [ + 5, + 0.75 + ], + [ + 18, + 32 + ] + ] + } + } + }, + { + "id": "bridge-trunk_link-2", + "type": "line", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + ">=", + "layer", + 2 + ], + [ + "==", + "structure", + "bridge" + ], + [ + "==", + "type", + "trunk_link" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12, + 0.5 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-color": "#fff" + } + }, + { + "id": "bridge-motorway_link-2", + "type": "line", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "source": "composite", + "source-layer": "road", + "minzoom": 13, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "motorway_link" + ], + [ + ">=", + "layer", + 2 + ], + [ + "==", + "structure", + "bridge" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 12, + 0.5 + ], + [ + 14, + 2 + ], + [ + 18, + 18 + ] + ] + }, + "line-color": "#fff" + } + }, + { + "id": "bridge-trunk-2", + "type": "line", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "trunk" + ], + [ + ">=", + "layer", + 2 + ], + [ + "==", + "structure", + "bridge" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 5, + 0.75 + ], + [ + 18, + 32 + ] + ] + }, + "line-color": "#fff" + } + }, + { + "id": "bridge-motorway-2", + "type": "line", + "metadata": { + "mapbox:group": "1444855799204.86" + }, + "source": "composite", + "source-layer": "road", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "motorway" + ], + [ + ">=", + "layer", + 2 + ], + [ + "==", + "structure", + "bridge" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": { + "base": 1.5, + "stops": [ + [ + 5, + 0.75 + ], + [ + 18, + 32 + ] + ] + }, + "line-color": "#fff" + } + }, + { + "id": "admin-3-4-boundaries-bg", + "type": "line", + "metadata": { + "mapbox:group": "1444934295202.7542" + }, + "source": "composite", + "source-layer": "admin", + "filter": [ + "all", + [ + ">=", + "admin_level", + 3 + ], + [ + "==", + "maritime", + 0 + ] + ], + "layout": { + "line-join": "bevel" + }, + "paint": { + "line-color": "hsl(0, 0%, 84%)", + "line-width": { + "base": 1, + "stops": [ + [ + 3, + 3.5 + ], + [ + 10, + 8 + ] + ] + }, + "line-opacity": { + "base": 1, + "stops": [ + [ + 4, + 0 + ], + [ + 7, + 0.5 + ], + [ + 8, + 0.75 + ] + ] + }, + "line-dasharray": [ + 1, + 0 + ], + "line-translate": [ + 0, + 0 + ], + "line-blur": { + "base": 1, + "stops": [ + [ + 3, + 0 + ], + [ + 8, + 3 + ] + ] + } + } + }, + { + "id": "admin-2-boundaries-bg", + "type": "line", + "metadata": { + "mapbox:group": "1444934295202.7542" + }, + "source": "composite", + "source-layer": "admin", + "minzoom": 1, + "filter": [ + "all", + [ + "==", + "admin_level", + 2 + ], + [ + "==", + "maritime", + 0 + ] + ], + "layout": { + "line-join": "miter" + }, + "paint": { + "line-width": { + "base": 1, + "stops": [ + [ + 3, + 3.5 + ], + [ + 10, + 10 + ] + ] + }, + "line-color": "hsl(0, 0%, 84%)", + "line-opacity": { + "base": 1, + "stops": [ + [ + 3, + 0 + ], + [ + 4, + 0.5 + ] + ] + }, + "line-translate": [ + 0, + 0 + ], + "line-blur": { + "base": 1, + "stops": [ + [ + 3, + 0 + ], + [ + 10, + 2 + ] + ] + } + } + }, + { + "id": "admin-3-4-boundaries", + "type": "line", + "metadata": { + "mapbox:group": "1444934295202.7542" + }, + "source": "composite", + "source-layer": "admin", + "filter": [ + "all", + [ + ">=", + "admin_level", + 3 + ], + [ + "==", + "maritime", + 0 + ] + ], + "layout": { + "line-join": "round", + "line-cap": "round" + }, + "paint": { + "line-dasharray": { + "base": 1, + "stops": [ + [ + 6, + [ + 2, + 0 + ] + ], + [ + 7, + [ + 2, + 2, + 6, + 2 + ] + ] + ] + }, + "line-width": { + "base": 1, + "stops": [ + [ + 7, + 0.75 + ], + [ + 12, + 1.5 + ] + ] + }, + "line-opacity": { + "base": 1, + "stops": [ + [ + 2, + 0 + ], + [ + 3, + 1 + ] + ] + }, + "line-color": { + "base": 1, + "stops": [ + [ + 4, + "hsl(0, 0%, 80%)" + ], + [ + 5, + "hsl(0, 0%, 70%)" + ] + ] + } + } + }, + { + "id": "admin-2-boundaries", + "type": "line", + "metadata": { + "mapbox:group": "1444934295202.7542" + }, + "source": "composite", + "source-layer": "admin", + "minzoom": 1, + "filter": [ + "all", + [ + "==", + "admin_level", + 2 + ], + [ + "==", + "disputed", + 0 + ], + [ + "==", + "maritime", + 0 + ] + ], + "layout": { + "line-join": "round", + "line-cap": "round" + }, + "paint": { + "line-color": { + "base": 1, + "stops": [ + [ + 3, + "hsl(0, 0%, 70%)" + ], + [ + 4, + "hsl(0, 0%, 62%)" + ] + ] + }, + "line-width": { + "base": 1, + "stops": [ + [ + 3, + 0.5 + ], + [ + 10, + 2 + ] + ] + } + } + }, + { + "id": "admin-2-boundaries-dispute", + "type": "line", + "metadata": { + "mapbox:group": "1444934295202.7542" + }, + "source": "composite", + "source-layer": "admin", + "minzoom": 1, + "filter": [ + "all", + [ + "==", + "admin_level", + 2 + ], + [ + "==", + "disputed", + 1 + ], + [ + "==", + "maritime", + 0 + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-dasharray": [ + 1.5, + 1.5 + ], + "line-color": { + "base": 1, + "stops": [ + [ + 3, + "hsl(0, 0%, 70%)" + ], + [ + 4, + "hsl(0, 0%, 62%)" + ] + ] + }, + "line-width": { + "base": 1, + "stops": [ + [ + 3, + 0.5 + ], + [ + 10, + 2 + ] + ] + } + } + }, + { + "id": "waterway-label", + "type": "symbol", + "source": "composite", + "source-layer": "waterway_label", + "minzoom": 12, + "filter": [ + "in", + "class", + "canal", + "river" + ], + "layout": { + "text-field": "{name_en}", + "text-font": [ + "DIN Offc Pro Italic", + "Arial Unicode MS Regular" + ], + "symbol-placement": "line", + "text-max-angle": 30, + "text-size": { + "base": 1, + "stops": [ + [ + 13, + 12 + ], + [ + 18, + 16 + ] + ] + } + }, + "paint": { + "text-halo-width": 0, + "text-halo-blur": 0, + "text-color": "#78888a" + } + }, + { + "id": "poi-scalerank3", + "type": "symbol", + "metadata": { + "mapbox:group": "1444933372896.5967" + }, + "source": "composite", + "source-layer": "poi_label", + "filter": [ + "all", + [ + "!in", + "maki", + "campsite", + "cemetery", + "dog-park", + "garden", + "golf", + "park", + "picnic-site", + "playground", + "zoo" + ], + [ + "==", + "scalerank", + 3 + ] + ], + "layout": { + "text-line-height": 1.1, + "text-size": { + "base": 1, + "stops": [ + [ + 16, + 11 + ], + [ + 20, + 13 + ] + ] + }, + "text-max-angle": 38, + "symbol-spacing": 250, + "text-font": [ + "DIN Offc Pro Medium", + "Arial Unicode MS Regular" + ], + "text-padding": 1, + "text-offset": [ + 0, + 0 + ], + "text-field": "{name_en}", + "text-letter-spacing": 0.01, + "text-max-width": 8 + }, + "paint": { + "text-color": "#949494", + "text-halo-color": "#ffffff", + "text-halo-width": 1, + "text-halo-blur": 0 + } + }, + { + "id": "poi-parks-scalerank3", + "type": "symbol", + "metadata": { + "mapbox:group": "1444933372896.5967" + }, + "source": "composite", + "source-layer": "poi_label", + "filter": [ + "all", + [ + "in", + "maki", + "campsite", + "cemetery", + "dog-park", + "garden", + "golf", + "park", + "picnic-site", + "playground", + "zoo" + ], + [ + "==", + "scalerank", + 3 + ] + ], + "layout": { + "text-line-height": 1.1, + "text-size": { + "base": 1, + "stops": [ + [ + 16, + 11 + ], + [ + 20, + 12 + ] + ] + }, + "text-max-angle": 38, + "symbol-spacing": 250, + "text-font": [ + "DIN Offc Pro Medium", + "Arial Unicode MS Regular" + ], + "text-padding": 2, + "text-offset": [ + 0, + 0 + ], + "text-field": "{name_en}", + "text-letter-spacing": 0.01, + "text-max-width": 8 + }, + "paint": { + "text-halo-blur": 0, + "text-halo-color": "#ffffff", + "text-halo-width": 1, + "text-color": "#949494" + } + }, + { + "id": "road-label-small", + "type": "symbol", + "metadata": { + "mapbox:group": "1444933721429.3076" + }, + "source": "composite", + "source-layer": "road_label", + "minzoom": 15, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "!in", + "class", + "", + "ferry", + "link", + "motorway", + "path", + "pedestrian", + "primary", + "secondary", + "street", + "street_limited", + "tertiary", + "track", + "trunk" + ] + ], + "layout": { + "text-size": { + "base": 1, + "stops": [ + [ + 15, + 10 + ], + [ + 20, + 13 + ] + ] + }, + "text-max-angle": 30, + "symbol-spacing": 500, + "text-font": [ + "DIN Offc Pro Regular", + "Arial Unicode MS Regular" + ], + "symbol-placement": "line", + "text-padding": 1, + "text-rotation-alignment": "map", + "text-field": "{name_en}", + "text-letter-spacing": 0.01 + }, + "paint": { + "text-color": "#6B6B6B", + "text-halo-color": "#ffffff", + "text-halo-width": 1.25, + "text-halo-blur": 0 + } + }, + { + "id": "road-label-medium", + "type": "symbol", + "metadata": { + "mapbox:group": "1444933721429.3076" + }, + "source": "composite", + "source-layer": "road_label", + "minzoom": 13, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "in", + "class", + "", + "link", + "pedestrian", + "street", + "street_limited" + ] + ], + "layout": { + "text-size": { + "base": 1, + "stops": [ + [ + 11, + 10 + ], + [ + 20, + 14 + ] + ] + }, + "text-max-angle": 30, + "symbol-spacing": 500, + "text-font": [ + "DIN Offc Pro Regular", + "Arial Unicode MS Regular" + ], + "symbol-placement": "line", + "text-padding": 1, + "text-rotation-alignment": "map", + "text-field": "{name_en}", + "text-letter-spacing": 0.01 + }, + "paint": { + "text-color": "#6B6B6B", + "text-halo-color": "#ffffff", + "text-halo-width": 1, + "text-halo-blur": 0 + } + }, + { + "id": "road-label-large", + "type": "symbol", + "metadata": { + "mapbox:group": "1444933721429.3076" + }, + "source": "composite", + "source-layer": "road_label", + "minzoom": 12, + "filter": [ + "in", + "class", + "motorway", + "primary", + "secondary", + "tertiary", + "trunk" + ], + "layout": { + "text-size": { + "base": 1, + "stops": [ + [ + 9, + 10 + ], + [ + 20, + 16 + ] + ] + }, + "text-max-angle": 30, + "symbol-spacing": 400, + "text-font": [ + "DIN Offc Pro Regular", + "Arial Unicode MS Regular" + ], + "symbol-placement": "line", + "text-padding": 1, + "text-rotation-alignment": "map", + "text-field": "{name_en}", + "text-letter-spacing": 0.01 + }, + "paint": { + "text-color": "#6B6B6B", + "text-halo-color": "rgba(255,255,255, 0.75)", + "text-halo-width": 1, + "text-halo-blur": 0 + } + }, + { + "id": "poi-scalerank2", + "type": "symbol", + "metadata": { + "mapbox:group": "1444933358918.2366" + }, + "source": "composite", + "source-layer": "poi_label", + "filter": [ + "all", + [ + "!in", + "maki", + "campsite", + "cemetery", + "dog-park", + "garden", + "golf", + "park", + "picnic-site", + "playground", + "zoo" + ], + [ + "==", + "scalerank", + 2 + ] + ], + "layout": { + "text-line-height": 1.1, + "text-size": { + "base": 1, + "stops": [ + [ + 14, + 11 + ], + [ + 20, + 12 + ] + ] + }, + "text-max-angle": 38, + "symbol-spacing": 250, + "text-font": [ + "DIN Offc Pro Medium", + "Arial Unicode MS Regular" + ], + "text-padding": 2, + "text-offset": [ + 0, + 0 + ], + "text-field": "{name_en}", + "text-letter-spacing": 0.01, + "text-max-width": 8 + }, + "paint": { + "text-color": "#949494", + "text-halo-color": "#ffffff", + "text-halo-width": 1, + "text-halo-blur": 0 + } + }, + { + "id": "poi-parks-scalerank2", + "type": "symbol", + "metadata": { + "mapbox:group": "1444933358918.2366" + }, + "source": "composite", + "source-layer": "poi_label", + "filter": [ + "all", + [ + "in", + "maki", + "campsite", + "cemetery", + "dog-park", + "garden", + "golf", + "park", + "picnic-site", + "playground", + "zoo" + ], + [ + "==", + "scalerank", + 2 + ] + ], + "layout": { + "text-line-height": 1.1, + "text-size": { + "base": 1, + "stops": [ + [ + 14, + 11 + ], + [ + 20, + 12 + ] + ] + }, + "text-max-angle": 38, + "symbol-spacing": 250, + "text-font": [ + "DIN Offc Pro Medium", + "Arial Unicode MS Regular" + ], + "text-padding": 2, + "text-offset": [ + 0, + 0 + ], + "text-field": "{name_en}", + "text-letter-spacing": 0.01, + "text-max-width": 8 + }, + "paint": { + "text-color": "#949494", + "text-halo-color": "#ffffff", + "text-halo-width": 1, + "text-halo-blur": 0 + } + }, + { + "id": "water-label", + "type": "symbol", + "metadata": { + "mapbox:group": "1444933808272.805" + }, + "source": "composite", + "source-layer": "water_label", + "minzoom": 5, + "filter": [ + ">", + "area", + 10000 + ], + "layout": { + "text-field": "{name_en}", + "text-font": [ + "DIN Offc Pro Italic", + "Arial Unicode MS Regular" + ], + "text-max-width": 7, + "text-size": { + "base": 1, + "stops": [ + [ + 13, + 13 + ], + [ + 18, + 18 + ] + ] + } + }, + "paint": { + "text-color": "#78888a", + "text-halo-blur": 0 + } + }, + { + "id": "poi-parks-scalerank1", + "type": "symbol", + "metadata": { + "mapbox:group": "1444933322393.2852" + }, + "source": "composite", + "source-layer": "poi_label", + "filter": [ + "all", + [ + "in", + "maki", + "campsite", + "cemetery", + "dog-park", + "garden", + "golf", + "park", + "picnic-site", + "playground", + "zoo" + ], + [ + "<=", + "scalerank", + 1 + ] + ], + "layout": { + "text-line-height": 1.1, + "text-size": { + "base": 1, + "stops": [ + [ + 10, + 11 + ], + [ + 18, + 12 + ] + ] + }, + "text-max-angle": 38, + "symbol-spacing": 250, + "text-font": [ + "DIN Offc Pro Medium", + "Arial Unicode MS Regular" + ], + "text-padding": 2, + "text-offset": [ + 0, + 0 + ], + "text-field": "{name_en}", + "text-letter-spacing": 0.01, + "text-max-width": 8 + }, + "paint": { + "text-color": "hsl(0, 0%, 58%)", + "text-halo-color": "#ffffff", + "text-halo-width": 1, + "text-halo-blur": 0 + } + }, + { + "id": "poi-scalerank1", + "type": "symbol", + "metadata": { + "mapbox:group": "1444933322393.2852" + }, + "source": "composite", + "source-layer": "poi_label", + "filter": [ + "all", + [ + "!in", + "maki", + "campsite", + "cemetery", + "dog-park", + "garden", + "golf", + "park", + "picnic-site", + "playground", + "zoo" + ], + [ + "<=", + "scalerank", + 1 + ] + ], + "layout": { + "text-line-height": 1.1, + "text-size": { + "base": 1, + "stops": [ + [ + 10, + 11 + ], + [ + 18, + 12 + ] + ] + }, + "text-max-angle": 38, + "symbol-spacing": 250, + "text-font": [ + "DIN Offc Pro Medium", + "Arial Unicode MS Regular" + ], + "text-padding": 2, + "text-offset": [ + 0, + 0 + ], + "text-field": "{name_en}", + "text-letter-spacing": 0.01, + "text-max-width": 8 + }, + "paint": { + "text-color": "hsl(0, 0%, 58%)", + "text-halo-color": "#ffffff", + "text-halo-width": 1, + "text-halo-blur": 0 + } + }, + { + "id": "airport-label", + "type": "symbol", + "source": "composite", + "source-layer": "airport_label", + "minzoom": 10, + "filter": [ + "<=", + "scalerank", + 2 + ], + "layout": { + "text-line-height": 1.1, + "text-size": { + "base": 1, + "stops": [ + [ + 10, + 12 + ], + [ + 18, + 18 + ] + ] + }, + "icon-image": { + "stops": [ + [ + 12, + "{maki}-11" + ], + [ + 13, + "{maki}-15" + ] + ] + }, + "symbol-spacing": 250, + "text-font": [ + "DIN Offc Pro Medium", + "Arial Unicode MS Regular" + ], + "text-padding": 2, + "text-offset": [ + 0, + 0.75 + ], + "text-anchor": "top", + "text-field": { + "stops": [ + [ + 11, + "{ref}" + ], + [ + 14, + "{name_en}" + ] + ] + }, + "text-letter-spacing": 0.01, + "text-max-width": 9 + }, + "paint": { + "text-color": "#6B6B6B", + "text-halo-color": "#ffffff", + "text-halo-width": 0.5, + "text-halo-blur": 0 + } + }, + { + "id": "place-islets-archipelago-aboriginal", + "type": "symbol", + "source": "composite", + "source-layer": "place_label", + "maxzoom": 16, + "filter": [ + "in", + "type", + "aboriginal_lands", + "archipelago", + "islet" + ], + "layout": { + "text-line-height": 1.2, + "text-size": { + "base": 1, + "stops": [ + [ + 10, + 11 + ], + [ + 18, + 16 + ] + ] + }, + "text-max-angle": 38, + "symbol-spacing": 250, + "text-font": [ + "DIN Offc Pro Regular", + "Arial Unicode MS Regular" + ], + "text-padding": 2, + "text-offset": [ + 0, + 0 + ], + "text-field": "{name_en}", + "text-letter-spacing": 0.01, + "text-max-width": 8 + }, + "paint": { + "text-color": "#6B6B6B", + "text-halo-color": "#ffffff", + "text-halo-width": 1, + "text-halo-blur": 0 + } + }, + { + "id": "place-neighbourhood", + "type": "symbol", + "source": "composite", + "source-layer": "place_label", + "minzoom": 12, + "maxzoom": 16, + "filter": [ + "==", + "type", + "neighbourhood" + ], + "layout": { + "text-field": "{name_en}", + "text-transform": "uppercase", + "text-letter-spacing": 0.1, + "text-max-width": 7, + "text-font": [ + "DIN Offc Pro Regular", + "Arial Unicode MS Regular" + ], + "text-padding": 3, + "text-size": { + "base": 1, + "stops": [ + [ + 12, + 11 + ], + [ + 16, + 16 + ] + ] + } + }, + "paint": { + "text-halo-color": "hsl(0, 0%, 100%)", + "text-halo-width": 1, + "text-color": "hsl(0, 0%, 62%)", + "text-halo-blur": 0 + } + }, + { + "id": "place-suburb", + "type": "symbol", + "source": "composite", + "source-layer": "place_label", + "minzoom": 11, + "maxzoom": 16, + "filter": [ + "==", + "type", + "suburb" + ], + "layout": { + "text-field": "{name_en}", + "text-transform": "uppercase", + "text-font": [ + "DIN Offc Pro Regular", + "Arial Unicode MS Regular" + ], + "text-letter-spacing": 0.15, + "text-max-width": 7, + "text-padding": 3, + "text-size": { + "base": 1, + "stops": [ + [ + 11, + 11 + ], + [ + 15, + 18 + ] + ] + } + }, + "paint": { + "text-halo-color": "hsl(0, 0%, 100%)", + "text-halo-width": 1, + "text-color": "hsl(0, 0%, 62%)", + "text-halo-blur": 0 + } + }, + { + "id": "place-hamlet", + "type": "symbol", + "source": "composite", + "source-layer": "place_label", + "minzoom": 10, + "maxzoom": 16, + "filter": [ + "==", + "type", + "hamlet" + ], + "layout": { + "text-field": "{name_en}", + "text-font": [ + "DIN Offc Pro Regular", + "Arial Unicode MS Regular" + ], + "text-size": { + "base": 1, + "stops": [ + [ + 12, + 11.5 + ], + [ + 15, + 16 + ] + ] + } + }, + "paint": { + "text-halo-color": "#ffffff", + "text-halo-width": 1.25, + "text-color": "hsl(0, 0%, 62%)", + "text-halo-blur": 0 + } + }, + { + "id": "place-village", + "type": "symbol", + "source": "composite", + "source-layer": "place_label", + "minzoom": 11, + "maxzoom": 15, + "filter": [ + "==", + "type", + "village" + ], + "layout": { + "text-field": "{name_en}", + "text-font": [ + "DIN Offc Pro Regular", + "Arial Unicode MS Regular" + ], + "text-max-width": 7, + "text-size": { + "base": 1, + "stops": [ + [ + 10, + 11.5 + ], + [ + 16, + 18 + ] + ] + }, + "text-offset": [ + 0, + 0 + ] + }, + "paint": { + "text-halo-color": "#ffffff", + "text-halo-width": 1.25, + "text-color": { + "base": 1, + "stops": [ + [ + 10, + "hsl(0, 0%, 62%)" + ], + [ + 11, + "hsl(0, 0%, 55%)" + ] + ] + }, + "text-halo-blur": 0 + } + }, + { + "id": "place-town", + "type": "symbol", + "source": "composite", + "source-layer": "place_label", + "minzoom": 7, + "maxzoom": 15, + "filter": [ + "==", + "type", + "town" + ], + "layout": { + "text-size": { + "base": 1, + "stops": [ + [ + 7, + 11.5 + ], + [ + 15, + 20 + ] + ] + }, + "text-font": { + "base": 1, + "stops": [ + [ + 11, + [ + "DIN Offc Pro Regular", + "Arial Unicode MS Regular" + ] + ], + [ + 12, + [ + "DIN Offc Pro Medium", + "Arial Unicode MS Regular" + ] + ] + ] + }, + "text-padding": 2, + "text-offset": [ + 0, + 0 + ], + "text-field": "{name_en}", + "text-max-width": 7 + }, + "paint": { + "text-color": { + "base": 1, + "stops": [ + [ + 10, + "hsl(0, 0%, 62%)" + ], + [ + 11, + "hsl(0, 0%, 55%)" + ] + ] + }, + "text-halo-color": "#ffffff", + "text-halo-width": 1.25, + "icon-opacity": { + "base": 1, + "stops": [ + [ + 7.99, + 1 + ], + [ + 8, + 0 + ] + ] + }, + "text-halo-blur": 0 + } + }, + { + "id": "place-islands", + "type": "symbol", + "source": "composite", + "source-layer": "place_label", + "maxzoom": 16, + "filter": [ + "==", + "type", + "island" + ], + "layout": { + "text-line-height": 1.2, + "text-size": { + "base": 1, + "stops": [ + [ + 10, + 11 + ], + [ + 18, + 16 + ] + ] + }, + "text-max-angle": 38, + "symbol-spacing": 250, + "text-font": [ + "DIN Offc Pro Regular", + "Arial Unicode MS Regular" + ], + "text-padding": 2, + "text-offset": [ + 0, + 0 + ], + "text-field": "{name_en}", + "text-letter-spacing": 0.01, + "text-max-width": 7 + }, + "paint": { + "text-color": "#6B6B6B", + "text-halo-color": "#ffffff", + "text-halo-width": 1, + "text-halo-blur": 0 + } + }, + { + "id": "place-city-sm", + "type": "symbol", + "metadata": { + "mapbox:group": "1444862510685.128" + }, + "source": "composite", + "source-layer": "place_label", + "maxzoom": 14, + "filter": [ + "all", + [ + "!in", + "scalerank", + 0, + 1, + 2, + 3, + 4, + 5 + ], + [ + "==", + "type", + "city" + ] + ], + "layout": { + "text-size": { + "base": 1, + "stops": [ + [ + 6, + 12 + ], + [ + 14, + 22 + ] + ] + }, + "text-font": { + "base": 1, + "stops": [ + [ + 7, + [ + "DIN Offc Pro Regular", + "Arial Unicode MS Regular" + ] + ], + [ + 8, + [ + "DIN Offc Pro Medium", + "Arial Unicode MS Regular" + ] + ] + ] + }, + "text-offset": [ + 0, + 0 + ], + "text-field": "{name_en}", + "text-max-width": 7 + }, + "paint": { + "text-color": "hsl(0, 0%, 42%)", + "text-halo-color": "#ffffff", + "text-halo-width": 1.25, + "icon-opacity": { + "base": 1, + "stops": [ + [ + 7.99, + 1 + ], + [ + 8, + 0 + ] + ] + }, + "text-halo-blur": 0 + } + }, + { + "id": "place-city-md-s", + "type": "symbol", + "metadata": { + "mapbox:group": "1444862510685.128" + }, + "source": "composite", + "source-layer": "place_label", + "maxzoom": 14, + "filter": [ + "all", + [ + "in", + "ldir", + "E", + "S", + "SE", + "SW" + ], + [ + "in", + "scalerank", + 3, + 4, + 5 + ], + [ + "==", + "type", + "city" + ] + ], + "layout": { + "text-field": "{name_en}", + "text-size": { + "base": 0.9, + "stops": [ + [ + 5, + 12 + ], + [ + 12, + 22 + ] + ] + }, + "text-anchor": "top", + "text-offset": { + "base": 1, + "stops": [ + [ + 7.99, + [ + 0, + 0.1 + ] + ], + [ + 8, + [ + 0, + 0 + ] + ] + ] + }, + "text-font": { + "base": 1, + "stops": [ + [ + 7, + [ + "DIN Offc Pro Regular", + "Arial Unicode MS Regular" + ] + ], + [ + 8, + [ + "DIN Offc Pro Medium", + "Arial Unicode MS Regular" + ] + ] + ] + }, + "icon-image": "dot-10" + }, + "paint": { + "text-halo-width": 1, + "text-halo-color": "#ffffff", + "text-color": "hsl(0, 0%, 42%)", + "text-halo-blur": 0, + "icon-opacity": { + "base": 1, + "stops": [ + [ + 7.99, + 1 + ], + [ + 8, + 0 + ] + ] + } + } + }, + { + "id": "place-city-md-n", + "type": "symbol", + "metadata": { + "mapbox:group": "1444862510685.128" + }, + "source": "composite", + "source-layer": "place_label", + "maxzoom": 14, + "filter": [ + "all", + [ + "in", + "ldir", + "N", + "NE", + "NW", + "W" + ], + [ + "in", + "scalerank", + 3, + 4, + 5 + ], + [ + "==", + "type", + "city" + ] + ], + "layout": { + "text-size": { + "base": 0.9, + "stops": [ + [ + 5, + 12 + ], + [ + 12, + 22 + ] + ] + }, + "text-font": { + "base": 1, + "stops": [ + [ + 7, + [ + "DIN Offc Pro Regular", + "Arial Unicode MS Regular" + ] + ], + [ + 8, + [ + "DIN Offc Pro Medium", + "Arial Unicode MS Regular" + ] + ] + ] + }, + "text-offset": { + "base": 1, + "stops": [ + [ + 7.99, + [ + 0, + -0.25 + ] + ], + [ + 8, + [ + 0, + 0 + ] + ] + ] + }, + "text-anchor": "bottom", + "text-field": "{name_en}", + "text-max-width": 7, + "icon-image": "dot-10" + }, + "paint": { + "text-color": "hsl(0, 0%, 42%)", + "text-halo-color": "#ffffff", + "text-halo-width": 1, + "icon-opacity": { + "base": 1, + "stops": [ + [ + 7.99, + 1 + ], + [ + 8, + 0 + ] + ] + }, + "text-halo-blur": 0 + } + }, + { + "id": "place-city-lg-s", + "type": "symbol", + "metadata": { + "mapbox:group": "1444862510685.128" + }, + "source": "composite", + "source-layer": "place_label", + "minzoom": 1, + "maxzoom": 14, + "filter": [ + "all", + [ + "in", + "ldir", + "E", + "S", + "SE", + "SW" + ], + [ + "<=", + "scalerank", + 2 + ], + [ + "==", + "type", + "city" + ] + ], + "layout": { + "text-size": { + "base": 0.9, + "stops": [ + [ + 4, + 12 + ], + [ + 10, + 22 + ] + ] + }, + "icon-image": "dot-11", + "text-font": { + "base": 1, + "stops": [ + [ + 7, + [ + "DIN Offc Pro Regular", + "Arial Unicode MS Regular" + ] + ], + [ + 8, + [ + "DIN Offc Pro Medium", + "Arial Unicode MS Regular" + ] + ] + ] + }, + "text-offset": { + "base": 1, + "stops": [ + [ + 7.99, + [ + 0, + 0.15 + ] + ], + [ + 8, + [ + 0, + 0 + ] + ] + ] + }, + "icon-size": 1, + "text-anchor": { + "base": 1, + "stops": [ + [ + 7, + "top" + ], + [ + 8, + "center" + ] + ] + }, + "text-field": "{name_en}", + "text-max-width": 7 + }, + "paint": { + "text-color": "hsl(0, 0%, 42%)", + "text-halo-color": "#ffffff", + "text-halo-width": 1, + "icon-opacity": { + "base": 1, + "stops": [ + [ + 7.99, + 1 + ], + [ + 8, + 0 + ] + ] + }, + "text-halo-blur": 0 + } + }, + { + "id": "place-city-lg-n", + "type": "symbol", + "metadata": { + "mapbox:group": "1444862510685.128" + }, + "source": "composite", + "source-layer": "place_label", + "minzoom": 1, + "maxzoom": 14, + "filter": [ + "all", + [ + "in", + "ldir", + "N", + "NE", + "NW", + "W" + ], + [ + "<=", + "scalerank", + 2 + ], + [ + "==", + "type", + "city" + ] + ], + "layout": { + "text-size": { + "base": 0.9, + "stops": [ + [ + 4, + 12 + ], + [ + 10, + 22 + ] + ] + }, + "icon-image": "dot-11", + "text-font": { + "base": 1, + "stops": [ + [ + 7, + [ + "DIN Offc Pro Regular", + "Arial Unicode MS Regular" + ] + ], + [ + 8, + [ + "DIN Offc Pro Medium", + "Arial Unicode MS Regular" + ] + ] + ] + }, + "text-offset": { + "base": 1, + "stops": [ + [ + 7.99, + [ + 0, + -0.25 + ] + ], + [ + 8, + [ + 0, + 0 + ] + ] + ] + }, + "icon-size": 1, + "text-anchor": { + "base": 1, + "stops": [ + [ + 7, + "bottom" + ], + [ + 8, + "center" + ] + ] + }, + "text-field": "{name_en}", + "text-max-width": 7 + }, + "paint": { + "text-color": "hsl(0, 0%, 42%)", + "text-opacity": 1, + "text-halo-color": "#ffffff", + "text-halo-width": 1, + "icon-opacity": { + "base": 1, + "stops": [ + [ + 7.99, + 1 + ], + [ + 8, + 0 + ] + ] + }, + "text-halo-blur": 0 + } + }, + { + "id": "marine-label-sm-ln", + "type": "symbol", + "metadata": { + "mapbox:group": "1444856087950.3635" + }, + "source": "composite", + "source-layer": "marine_label", + "minzoom": 3, + "maxzoom": 10, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + ">=", + "labelrank", + 4 + ] + ], + "layout": { + "text-line-height": 1.1, + "text-size": { + "base": 1, + "stops": [ + [ + 3, + 12 + ], + [ + 6, + 16 + ] + ] + }, + "symbol-spacing": { + "base": 1, + "stops": [ + [ + 4, + 100 + ], + [ + 6, + 400 + ] + ] + }, + "text-font": [ + "DIN Offc Pro Italic", + "Arial Unicode MS Regular" + ], + "symbol-placement": "line", + "text-field": "{name_en}", + "text-letter-spacing": 0.1, + "text-max-width": 5 + }, + "paint": { + "text-color": "#78888a", + "text-halo-blur": 0 + } + }, + { + "id": "marine-label-sm-pt", + "type": "symbol", + "metadata": { + "mapbox:group": "1444856087950.3635" + }, + "source": "composite", + "source-layer": "marine_label", + "minzoom": 3, + "maxzoom": 10, + "filter": [ + "all", + [ + "==", + "$type", + "Point" + ], + [ + ">=", + "labelrank", + 4 + ] + ], + "layout": { + "text-field": "{name_en}", + "text-max-width": 5, + "text-letter-spacing": 0.1, + "text-line-height": 1.5, + "text-font": [ + "DIN Offc Pro Italic", + "Arial Unicode MS Regular" + ], + "text-size": { + "base": 1, + "stops": [ + [ + 3, + 12 + ], + [ + 6, + 16 + ] + ] + } + }, + "paint": { + "text-color": "#78888a", + "text-halo-blur": 0 + } + }, + { + "id": "marine-label-md-ln", + "type": "symbol", + "metadata": { + "mapbox:group": "1444856087950.3635" + }, + "source": "composite", + "source-layer": "marine_label", + "minzoom": 2, + "maxzoom": 8, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "in", + "labelrank", + 2, + 3 + ] + ], + "layout": { + "text-line-height": 1.1, + "text-size": { + "base": 1.1, + "stops": [ + [ + 2, + 12 + ], + [ + 5, + 20 + ] + ] + }, + "symbol-spacing": 250, + "text-font": [ + "DIN Offc Pro Italic", + "Arial Unicode MS Regular" + ], + "symbol-placement": "line", + "text-field": "{name_en}", + "text-letter-spacing": 0.15, + "text-max-width": 5 + }, + "paint": { + "text-color": "#78888a", + "text-halo-blur": 0 + } + }, + { + "id": "marine-label-md-pt", + "type": "symbol", + "metadata": { + "mapbox:group": "1444856087950.3635" + }, + "source": "composite", + "source-layer": "marine_label", + "minzoom": 2, + "maxzoom": 8, + "filter": [ + "all", + [ + "==", + "$type", + "Point" + ], + [ + "in", + "labelrank", + 2, + 3 + ] + ], + "layout": { + "text-field": "{name_en}", + "text-max-width": 5, + "text-letter-spacing": 0.15, + "text-line-height": 1.5, + "text-font": [ + "DIN Offc Pro Italic", + "Arial Unicode MS Regular" + ], + "text-size": { + "base": 1.1, + "stops": [ + [ + 2, + 14 + ], + [ + 5, + 20 + ] + ] + } + }, + "paint": { + "text-color": "#78888a", + "text-halo-blur": 0 + } + }, + { + "id": "marine-label-lg-ln", + "type": "symbol", + "metadata": { + "mapbox:group": "1444856087950.3635" + }, + "source": "composite", + "source-layer": "marine_label", + "minzoom": 1, + "maxzoom": 4, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "==", + "labelrank", + 1 + ] + ], + "layout": { + "text-field": "{name_en}", + "text-max-width": 4, + "text-letter-spacing": 0.25, + "text-line-height": 1.1, + "symbol-placement": "line", + "text-font": [ + "DIN Offc Pro Italic", + "Arial Unicode MS Regular" + ], + "text-size": { + "base": 1, + "stops": [ + [ + 1, + 14 + ], + [ + 4, + 30 + ] + ] + } + }, + "paint": { + "text-color": "#78888a", + "text-halo-blur": 0 + } + }, + { + "id": "marine-label-lg-pt", + "type": "symbol", + "metadata": { + "mapbox:group": "1444856087950.3635" + }, + "source": "composite", + "source-layer": "marine_label", + "minzoom": 1, + "maxzoom": 4, + "filter": [ + "all", + [ + "==", + "$type", + "Point" + ], + [ + "==", + "labelrank", + 1 + ] + ], + "layout": { + "text-field": "{name_en}", + "text-max-width": 4, + "text-letter-spacing": 0.25, + "text-line-height": 1.5, + "text-font": [ + "DIN Offc Pro Italic", + "Arial Unicode MS Regular" + ], + "text-size": { + "base": 1, + "stops": [ + [ + 1, + 14 + ], + [ + 4, + 30 + ] + ] + } + }, + "paint": { + "text-color": "#78888a", + "text-halo-blur": 0 + } + }, + { + "id": "state-label-sm", + "type": "symbol", + "metadata": { + "mapbox:group": "1444856151690.9143" + }, + "source": "composite", + "source-layer": "state_label", + "minzoom": 3, + "maxzoom": 9, + "filter": [ + "<", + "area", + 20000 + ], + "layout": { + "text-size": { + "base": 1, + "stops": [ + [ + 6, + 10 + ], + [ + 9, + 14 + ] + ] + }, + "text-transform": "uppercase", + "text-font": [ + "DIN Offc Pro Bold", + "Arial Unicode MS Bold" + ], + "text-field": { + "base": 1, + "stops": [ + [ + 0, + "{abbr}" + ], + [ + 6, + "{name_en}" + ] + ] + }, + "text-letter-spacing": 0.15, + "text-max-width": 5 + }, + "paint": { + "text-opacity": 1, + "text-color": "#a8a8a8", + "text-halo-color": "#ffffff", + "text-halo-width": 1, + "text-halo-blur": 0 + } + }, + { + "id": "state-label-md", + "type": "symbol", + "metadata": { + "mapbox:group": "1444856151690.9143" + }, + "source": "composite", + "source-layer": "state_label", + "minzoom": 3, + "maxzoom": 8, + "filter": [ + "all", + [ + "<", + "area", + 80000 + ], + [ + ">=", + "area", + 20000 + ] + ], + "layout": { + "text-size": { + "base": 1, + "stops": [ + [ + 5, + 10 + ], + [ + 8, + 16 + ] + ] + }, + "text-transform": "uppercase", + "text-font": [ + "DIN Offc Pro Bold", + "Arial Unicode MS Bold" + ], + "text-field": { + "base": 1, + "stops": [ + [ + 0, + "{abbr}" + ], + [ + 5, + "{name_en}" + ] + ] + }, + "text-letter-spacing": 0.15, + "text-max-width": 6 + }, + "paint": { + "text-opacity": 1, + "text-color": "#a8a8a8", + "text-halo-color": "#ffffff", + "text-halo-width": 1, + "text-halo-blur": 0 + } + }, + { + "id": "state-label-lg", + "type": "symbol", + "metadata": { + "mapbox:group": "1444856151690.9143" + }, + "source": "composite", + "source-layer": "state_label", + "minzoom": 3, + "maxzoom": 7, + "filter": [ + ">=", + "area", + 80000 + ], + "layout": { + "text-size": { + "base": 1, + "stops": [ + [ + 4, + 10 + ], + [ + 7, + 18 + ] + ] + }, + "text-transform": "uppercase", + "text-font": [ + "DIN Offc Pro Bold", + "Arial Unicode MS Bold" + ], + "text-padding": 1, + "text-field": { + "base": 1, + "stops": [ + [ + 0, + "{abbr}" + ], + [ + 4, + "{name_en}" + ] + ] + }, + "text-letter-spacing": 0.15, + "text-max-width": 6 + }, + "paint": { + "text-opacity": 1, + "text-color": "#a8a8a8", + "text-halo-color": "#ffffff", + "text-halo-width": 1, + "text-halo-blur": 0 + } + }, + { + "id": "country-label-sm", + "type": "symbol", + "metadata": { + "mapbox:group": "1444856144497.7825" + }, + "source": "composite", + "source-layer": "country_label", + "minzoom": 1, + "maxzoom": 10, + "filter": [ + ">=", + "scalerank", + 5 + ], + "layout": { + "text-field": "{name_en}", + "text-max-width": 6, + "text-font": [ + "DIN Offc Pro Medium", + "Arial Unicode MS Regular" + ], + "text-size": { + "base": 0.9, + "stops": [ + [ + 5, + 14 + ], + [ + 9, + 22 + ] + ] + } + }, + "paint": { + "text-halo-width": 1.25, + "text-halo-color": { + "base": 1, + "stops": [ + [ + 2, + "rgba(255,255,255,0.75)" + ], + [ + 3, + "#fff" + ] + ] + }, + "text-color": "#6b6b6b", + "text-halo-blur": 0 + } + }, + { + "id": "country-label-md", + "type": "symbol", + "metadata": { + "mapbox:group": "1444856144497.7825" + }, + "source": "composite", + "source-layer": "country_label", + "minzoom": 1, + "maxzoom": 8, + "filter": [ + "in", + "scalerank", + 3, + 4 + ], + "layout": { + "text-field": { + "base": 1, + "stops": [ + [ + 0, + "{code}" + ], + [ + 2, + "{name_en}" + ] + ] + }, + "text-max-width": 6, + "text-font": [ + "DIN Offc Pro Medium", + "Arial Unicode MS Regular" + ], + "text-size": { + "base": 1, + "stops": [ + [ + 3, + 10 + ], + [ + 8, + 24 + ] + ] + } + }, + "paint": { + "text-halo-width": 1.25, + "text-halo-color": { + "base": 1, + "stops": [ + [ + 2, + "rgba(255,255,255,0.75)" + ], + [ + 3, + "#fff" + ] + ] + }, + "text-color": "#6b6b6b", + "text-halo-blur": 0 + } + }, + { + "id": "country-label-lg", + "type": "symbol", + "metadata": { + "mapbox:group": "1444856144497.7825" + }, + "source": "composite", + "source-layer": "country_label", + "minzoom": 1, + "maxzoom": 7, + "filter": [ + "in", + "scalerank", + 1, + 2 + ], + "layout": { + "text-field": "{name_en}", + "text-max-width": { + "base": 1, + "stops": [ + [ + 0, + 5 + ], + [ + 3, + 6 + ] + ] + }, + "text-font": [ + "DIN Offc Pro Medium", + "Arial Unicode MS Regular" + ], + "text-size": { + "base": 1, + "stops": [ + [ + 1, + 10 + ], + [ + 6, + 24 + ] + ] + } + }, + "paint": { + "text-halo-width": 1.25, + "text-halo-color": { + "base": 1, + "stops": [ + [ + 2, + "rgba(255,255,255,0.75)" + ], + [ + 3, + "#fff" + ] + ] + }, + "text-color": "#6b6b6b", + "text-halo-blur": 0 + } + } + ], + "created": 0, + "modified": 0, + "owner": "mapbox", + "id": "light-v9", + "draft": false +} diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/debug/markers.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/debug/markers.html new file mode 100644 index 000000000..e174a60fc --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/debug/markers.html @@ -0,0 +1,63 @@ + + + + Mapbox GL JS debug page + + + + + + + +
+ + + + + + + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/debug/multiple.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/debug/multiple.html new file mode 100644 index 000000000..bf3a5469f --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/debug/multiple.html @@ -0,0 +1,75 @@ + + + + Mapbox GL JS debug page + + + + + + + +
+
+
+
+ + + + + + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/debug/no_wrap.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/debug/no_wrap.html new file mode 100644 index 000000000..e4ac3de20 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/debug/no_wrap.html @@ -0,0 +1,32 @@ + + + + Mapbox GL JS debug page + + + + + + + +
+ + + + + + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/debug/query_features.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/debug/query_features.html new file mode 100644 index 000000000..ce5ac6c5b --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/debug/query_features.html @@ -0,0 +1,101 @@ + + + + Mapbox GL JS debug page + + + + + + + +
+ + + + + + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/debug/satellite.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/debug/satellite.html new file mode 100644 index 000000000..4265f9af5 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/debug/satellite.html @@ -0,0 +1,31 @@ + + + + Mapbox GL JS debug page + + + + + + + +
+ + + + + + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/debug/setstyle.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/debug/setstyle.html new file mode 100644 index 000000000..afd55455f --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/debug/setstyle.html @@ -0,0 +1,42 @@ + + + + Mapbox GL JS debug page + + + + + + + +
+ + + + + + + + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/debug/video.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/debug/video.html new file mode 100644 index 000000000..ac090c646 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/debug/video.html @@ -0,0 +1,69 @@ + + + + Mapbox GL JS debug page + + + + + + + +
+ + + + + + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/debug/wms.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/debug/wms.html new file mode 100644 index 000000000..3741b5f03 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/debug/wms.html @@ -0,0 +1,49 @@ + + + + Mapbox GL JS debug page + + + + + + + +
+ + + + + + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/dist/mapbox-gl.css b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/dist/mapbox-gl.css new file mode 100644 index 000000000..592dbe389 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/dist/mapbox-gl.css @@ -0,0 +1,313 @@ +.mapboxgl-map { + font: 12px/20px 'Helvetica Neue', Arial, Helvetica, sans-serif; + overflow: hidden; + position: relative; + -webkit-tap-highlight-color: rgba(0,0,0,0); +} + +.mapboxgl-canvas-container.mapboxgl-interactive, +.mapboxgl-ctrl-nav-compass { + cursor: -webkit-grab; + cursor: -moz-grab; + cursor: grab; +} +.mapboxgl-canvas-container.mapboxgl-interactive:active, +.mapboxgl-ctrl-nav-compass:active { + cursor: -webkit-grabbing; + cursor: -moz-grabbing; + cursor: grabbing; +} + +.mapboxgl-ctrl-top-left, +.mapboxgl-ctrl-top-right, +.mapboxgl-ctrl-bottom-left, +.mapboxgl-ctrl-bottom-right { position:absolute; pointer-events:none; z-index:2; } +.mapboxgl-ctrl-top-left { top:0; left:0; } +.mapboxgl-ctrl-top-right { top:0; right:0; } +.mapboxgl-ctrl-bottom-left { bottom:0; left:0; } +.mapboxgl-ctrl-bottom-right { right:0; bottom:0; } + +.mapboxgl-ctrl { clear:both; pointer-events:auto } +.mapboxgl-ctrl-top-left .mapboxgl-ctrl { margin:10px 0 0 10px; float:left; } +.mapboxgl-ctrl-top-right .mapboxgl-ctrl{ margin:10px 10px 0 0; float:right; } +.mapboxgl-ctrl-bottom-left .mapboxgl-ctrl { margin:0 0 10px 10px; float:left; } +.mapboxgl-ctrl-bottom-right .mapboxgl-ctrl { margin:0 10px 10px 0; float:right; } + +.mapboxgl-ctrl-group { + border-radius: 4px; + -moz-box-shadow: 0px 0px 2px rgba(0,0,0,0.1); + -webkit-box-shadow: 0px 0px 2px rgba(0,0,0,0.1); + box-shadow: 0px 0px 0px 2px rgba(0,0,0,0.1); + overflow: hidden; + background: #fff; +} +.mapboxgl-ctrl-group > button { + width: 30px; + height: 30px; + display: block; + padding: 0; + outline: none; + border: none; + border-bottom: 1px solid #ddd; + box-sizing: border-box; + background-color: rgba(0,0,0,0); + cursor: pointer; +} +/* https://bugzilla.mozilla.org/show_bug.cgi?id=140562 */ +.mapboxgl-ctrl > button::-moz-focus-inner { + border: 0; + padding: 0; +} +.mapboxgl-ctrl > button:last-child { + border-bottom: 0; +} +.mapboxgl-ctrl > button:hover { + background-color: rgba(0,0,0,0.05); +} +.mapboxgl-ctrl-icon, +.mapboxgl-ctrl-icon > .mapboxgl-ctrl-compass-arrow { + speak: none; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.mapboxgl-ctrl-icon { + padding: 5px; +} +.mapboxgl-ctrl-icon.mapboxgl-ctrl-zoom-out { + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg%20viewBox%3D%270%200%2020%2020%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%0A%20%20%3Cpath%20style%3D%27fill%3A%23333333%3B%27%20d%3D%27m%207%2C9%20c%20-0.554%2C0%20-1%2C0.446%20-1%2C1%200%2C0.554%200.446%2C1%201%2C1%20l%206%2C0%20c%200.554%2C0%201%2C-0.446%201%2C-1%200%2C-0.554%20-0.446%2C-1%20-1%2C-1%20z%27%20%2F%3E%0A%3C%2Fsvg%3E%0A"); +} +.mapboxgl-ctrl-icon.mapboxgl-ctrl-zoom-in { + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg%20viewBox%3D%270%200%2020%2020%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%0A%20%20%3Cpath%20style%3D%27fill%3A%23333333%3B%27%20d%3D%27M%2010%206%20C%209.446%206%209%206.4459904%209%207%20L%209%209%20L%207%209%20C%206.446%209%206%209.446%206%2010%20C%206%2010.554%206.446%2011%207%2011%20L%209%2011%20L%209%2013%20C%209%2013.55401%209.446%2014%2010%2014%20C%2010.554%2014%2011%2013.55401%2011%2013%20L%2011%2011%20L%2013%2011%20C%2013.554%2011%2014%2010.554%2014%2010%20C%2014%209.446%2013.554%209%2013%209%20L%2011%209%20L%2011%207%20C%2011%206.4459904%2010.554%206%2010%206%20z%27%20%2F%3E%0A%3C%2Fsvg%3E%0A"); +} +.mapboxgl-ctrl-icon.mapboxgl-ctrl-geolocate { + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D%270%200%2020%2020%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%0D%0A%20%20%3Cpath%20style%3D%27fill%3A%23333%3B%27%20d%3D%27M10%204C9%204%209%205%209%205L9%205.1A5%205%200%200%200%205.1%209L5%209C5%209%204%209%204%2010%204%2011%205%2011%205%2011L5.1%2011A5%205%200%200%200%209%2014.9L9%2015C9%2015%209%2016%2010%2016%2011%2016%2011%2015%2011%2015L11%2014.9A5%205%200%200%200%2014.9%2011L15%2011C15%2011%2016%2011%2016%2010%2016%209%2015%209%2015%209L14.9%209A5%205%200%200%200%2011%205.1L11%205C11%205%2011%204%2010%204zM10%206.5A3.5%203.5%200%200%201%2013.5%2010%203.5%203.5%200%200%201%2010%2013.5%203.5%203.5%200%200%201%206.5%2010%203.5%203.5%200%200%201%2010%206.5zM10%208.3A1.8%201.8%200%200%200%208.3%2010%201.8%201.8%200%200%200%2010%2011.8%201.8%201.8%200%200%200%2011.8%2010%201.8%201.8%200%200%200%2010%208.3z%27%20%2F%3E%0D%0A%3C%2Fsvg%3E"); +} +.mapboxgl-ctrl-icon.mapboxgl-ctrl-geolocate.watching { + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D%270%200%2020%2020%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%0D%0A%20%20%3Cpath%20style%3D%27fill%3A%2300f%3B%27%20d%3D%27M10%204C9%204%209%205%209%205L9%205.1A5%205%200%200%200%205.1%209L5%209C5%209%204%209%204%2010%204%2011%205%2011%205%2011L5.1%2011A5%205%200%200%200%209%2014.9L9%2015C9%2015%209%2016%2010%2016%2011%2016%2011%2015%2011%2015L11%2014.9A5%205%200%200%200%2014.9%2011L15%2011C15%2011%2016%2011%2016%2010%2016%209%2015%209%2015%209L14.9%209A5%205%200%200%200%2011%205.1L11%205C11%205%2011%204%2010%204zM10%206.5A3.5%203.5%200%200%201%2013.5%2010%203.5%203.5%200%200%201%2010%2013.5%203.5%203.5%200%200%201%206.5%2010%203.5%203.5%200%200%201%2010%206.5zM10%208.3A1.8%201.8%200%200%200%208.3%2010%201.8%201.8%200%200%200%2010%2011.8%201.8%201.8%200%200%200%2011.8%2010%201.8%201.8%200%200%200%2010%208.3z%27%20%2F%3E%0D%0A%3C%2Fsvg%3E"); +} +.mapboxgl-ctrl-icon.mapboxgl-ctrl-fullscreen { + background-image: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxOS4wLjEsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4KCjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgdmVyc2lvbj0iMS4xIgogICBpZD0iTGF5ZXJfMSIKICAgeD0iMHB4IgogICB5PSIwcHgiCiAgIHZpZXdCb3g9IjAgMCAyMCAyMCIKICAgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMjAgMjA7IgogICB4bWw6c3BhY2U9InByZXNlcnZlIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjkxIHIxMzcyNSIKICAgc29kaXBvZGk6ZG9jbmFtZT0iZnVsbHNjcmVlbi5zdmciPjxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTQxODUiPjxyZGY6UkRGPjxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj48ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD48ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+PGRjOnRpdGxlPjwvZGM6dGl0bGU+PC9jYzpXb3JrPjwvcmRmOlJERj48L21ldGFkYXRhPjxkZWZzCiAgICAgaWQ9ImRlZnM0MTgzIiAvPjxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMSIKICAgICBvYmplY3R0b2xlcmFuY2U9IjEwIgogICAgIGdyaWR0b2xlcmFuY2U9IjEwIgogICAgIGd1aWRldG9sZXJhbmNlPSIxMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTQ3MSIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSI2OTUiCiAgICAgaWQ9Im5hbWVkdmlldzQxODEiCiAgICAgc2hvd2dyaWQ9ImZhbHNlIgogICAgIGlua3NjYXBlOnpvb209IjExLjMxMzcwOCIKICAgICBpbmtzY2FwZTpjeD0iMTQuNjk4MjgiCiAgICAgaW5rc2NhcGU6Y3k9IjEwLjUyNjY4OSIKICAgICBpbmtzY2FwZTp3aW5kb3cteD0iNjk3IgogICAgIGlua3NjYXBlOndpbmRvdy15PSIyOTgiCiAgICAgaW5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMCIKICAgICBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJMYXllcl8xIgogICAgIGlua3NjYXBlOnNuYXAtYmJveD0idHJ1ZSIKICAgICBpbmtzY2FwZTpiYm94LXBhdGhzPSJ0cnVlIgogICAgIGlua3NjYXBlOm9iamVjdC1wYXRocz0idHJ1ZSIKICAgICBpbmtzY2FwZTpiYm94LW5vZGVzPSJ0cnVlIgogICAgIGlua3NjYXBlOm9iamVjdC1ub2Rlcz0idHJ1ZSI+PGlua3NjYXBlOmdyaWQKICAgICAgIHR5cGU9Inh5Z3JpZCIKICAgICAgIGlkPSJncmlkNjA3NiIgLz48L3NvZGlwb2RpOm5hbWVkdmlldz48cGF0aAogICAgIGQ9Ik0gNSA0IEMgNC41IDQgNCA0LjUgNCA1IEwgNCA2IEwgNCA5IEwgNC41IDkgTCA1Ljc3NzM0MzggNy4yOTY4NzUgQyA2Ljc3NzEzMTkgOC4wNjAyMTMxIDcuODM1NzY1IDguOTU2NTcyOCA4Ljg5MDYyNSAxMCBDIDcuODI1NzEyMSAxMS4wNjMzIDYuNzc2MTc5MSAxMS45NTE2NzUgNS43ODEyNSAxMi43MDcwMzEgTCA0LjUgMTEgTCA0IDExIEwgNCAxNSBDIDQgMTUuNSA0LjUgMTYgNSAxNiBMIDkgMTYgTCA5IDE1LjUgTCA3LjI3MzQzNzUgMTQuMjA1MDc4IEMgOC4wNDI4OTMxIDEzLjE4Nzg4NiA4LjkzOTU0NDEgMTIuMTMzNDgxIDkuOTYwOTM3NSAxMS4wNjgzNTkgQyAxMS4wNDIzNzEgMTIuMTQ2OTkgMTEuOTQyMDkzIDEzLjIxMTIgMTIuNzA3MDMxIDE0LjIxODc1IEwgMTEgMTUuNSBMIDExIDE2IEwgMTQgMTYgTCAxNSAxNiBDIDE1LjUgMTYgMTYgMTUuNSAxNiAxNSBMIDE2IDE0IEwgMTYgMTEgTCAxNS41IDExIEwgMTQuMjA1MDc4IDEyLjcyNjU2MiBDIDEzLjE3Nzk4NSAxMS45NDk2MTcgMTIuMTEyNzE4IDExLjA0MzU3NyAxMS4wMzcxMDkgMTAuMDA5NzY2IEMgMTIuMTUxODU2IDguOTgxMDYxIDEzLjIyNDM0NSA4LjA3OTg2MjQgMTQuMjI4NTE2IDcuMzA0Njg3NSBMIDE1LjUgOSBMIDE2IDkgTCAxNiA1IEMgMTYgNC41IDE1LjUgNCAxNSA0IEwgMTEgNCBMIDExIDQuNSBMIDEyLjcwMzEyNSA1Ljc3NzM0MzggQyAxMS45MzI2NDcgNi43ODY0ODM0IDExLjAyNjY5MyA3Ljg1NTQ3MTIgOS45NzA3MDMxIDguOTE5OTIxOSBDIDguOTU4NDczOSA3LjgyMDQ5NDMgOC4wNjk4NzY3IDYuNzYyNzE4OCA3LjMwNDY4NzUgNS43NzE0ODQ0IEwgOSA0LjUgTCA5IDQgTCA2IDQgTCA1IDQgeiAiCiAgICAgaWQ9InBhdGg0MTY5IiAvPjwvc3ZnPg=="); +} +.mapboxgl-ctrl-icon.mapboxgl-ctrl-shrink { + background-image: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxOS4wLjEsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4KCjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgdmVyc2lvbj0iMS4xIgogICBpZD0iTGF5ZXJfMSIKICAgeD0iMHB4IgogICB5PSIwcHgiCiAgIHZpZXdCb3g9IjAgMCAyMCAyMCIKICAgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMjAgMjA7IgogICB4bWw6c3BhY2U9InByZXNlcnZlIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjkxIHIxMzcyNSIKICAgc29kaXBvZGk6ZG9jbmFtZT0ic2hyaW5rLnN2ZyI+PG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhMTkiPjxyZGY6UkRGPjxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj48ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD48ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+PGRjOnRpdGxlPjwvZGM6dGl0bGU+PC9jYzpXb3JrPjwvcmRmOlJERj48L21ldGFkYXRhPjxkZWZzCiAgICAgaWQ9ImRlZnMxNyIgLz48c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgIGJvcmRlcm9wYWNpdHk9IjEiCiAgICAgb2JqZWN0dG9sZXJhbmNlPSIxMCIKICAgICBncmlkdG9sZXJhbmNlPSIxMCIKICAgICBndWlkZXRvbGVyYW5jZT0iMTAiCiAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAiCiAgICAgaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIKICAgICBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjIwMjEiCiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iOTA4IgogICAgIGlkPSJuYW1lZHZpZXcxNSIKICAgICBzaG93Z3JpZD0iZmFsc2UiCiAgICAgaW5rc2NhcGU6em9vbT0iMSIKICAgICBpbmtzY2FwZTpjeD0iNC45NTAxMDgyIgogICAgIGlua3NjYXBlOmN5PSIxMC44NTQ3NDciCiAgICAgaW5rc2NhcGU6d2luZG93LXg9IjAiCiAgICAgaW5rc2NhcGU6d2luZG93LXk9IjAiCiAgICAgaW5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMCIKICAgICBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJMYXllcl8xIgogICAgIGlua3NjYXBlOnNuYXAtYmJveD0idHJ1ZSIKICAgICBpbmtzY2FwZTpiYm94LXBhdGhzPSJ0cnVlIgogICAgIGlua3NjYXBlOnNuYXAtYmJveC1lZGdlLW1pZHBvaW50cz0idHJ1ZSIKICAgICBpbmtzY2FwZTpiYm94LW5vZGVzPSJ0cnVlIgogICAgIGlua3NjYXBlOnNuYXAtYmJveC1taWRwb2ludHM9InRydWUiCiAgICAgaW5rc2NhcGU6b2JqZWN0LXBhdGhzPSJ0cnVlIgogICAgIGlua3NjYXBlOm9iamVjdC1ub2Rlcz0idHJ1ZSI+PGlua3NjYXBlOmdyaWQKICAgICAgIHR5cGU9Inh5Z3JpZCIKICAgICAgIGlkPSJncmlkNDE0NyIgLz48L3NvZGlwb2RpOm5hbWVkdmlldz48cGF0aAogICAgIHN0eWxlPSJmaWxsOiMwMDAwMDAiCiAgICAgZD0iTSA0LjI0MjE4NzUgMy40OTIxODc1IEEgMC43NTAwNzUgMC43NTAwNzUgMCAwIDAgMy43MTg3NSA0Ljc4MTI1IEwgNS45NjQ4NDM4IDcuMDI3MzQzOCBMIDQgOC41IEwgNCA5IEwgOCA5IEMgOC41MDAwMDEgOC45OTk5OTg4IDkgOC40OTk5OTkyIDkgOCBMIDkgNCBMIDguNSA0IEwgNy4wMTc1NzgxIDUuOTU1MDc4MSBMIDQuNzgxMjUgMy43MTg3NSBBIDAuNzUwMDc1IDAuNzUwMDc1IDAgMCAwIDQuMjQyMTg3NSAzLjQ5MjE4NzUgeiBNIDE1LjczNDM3NSAzLjQ5MjE4NzUgQSAwLjc1MDA3NSAwLjc1MDA3NSAwIDAgMCAxNS4yMTg3NSAzLjcxODc1IEwgMTIuOTg0Mzc1IDUuOTUzMTI1IEwgMTEuNSA0IEwgMTEgNCBMIDExIDggQyAxMSA4LjQ5OTk5OTIgMTEuNDk5OTk5IDguOTk5OTk4OCAxMiA5IEwgMTYgOSBMIDE2IDguNSBMIDE0LjAzNTE1NiA3LjAyNzM0MzggTCAxNi4yODEyNSA0Ljc4MTI1IEEgMC43NTAwNzUgMC43NTAwNzUgMCAwIDAgMTUuNzM0Mzc1IDMuNDkyMTg3NSB6IE0gNCAxMSBMIDQgMTEuNSBMIDUuOTY0ODQzOCAxMi45NzI2NTYgTCAzLjcxODc1IDE1LjIxODc1IEEgMC43NTEzMDA5NiAwLjc1MTMwMDk2IDAgMSAwIDQuNzgxMjUgMTYuMjgxMjUgTCA3LjAyNzM0MzggMTQuMDM1MTU2IEwgOC41IDE2IEwgOSAxNiBMIDkgMTIgQyA5IDExLjUwMDAwMSA4LjUwMDAwMSAxMS4wMDAwMDEgOCAxMSBMIDQgMTEgeiBNIDEyIDExIEMgMTEuNDk5OTk5IDExLjAwMDAwMSAxMSAxMS41MDAwMDEgMTEgMTIgTCAxMSAxNiBMIDExLjUgMTYgTCAxMi45NzI2NTYgMTQuMDM1MTU2IEwgMTUuMjE4NzUgMTYuMjgxMjUgQSAwLjc1MTMwMDk2IDAuNzUxMzAwOTYgMCAxIDAgMTYuMjgxMjUgMTUuMjE4NzUgTCAxNC4wMzUxNTYgMTIuOTcyNjU2IEwgMTYgMTEuNSBMIDE2IDExIEwgMTIgMTEgeiAiCiAgICAgaWQ9InBhdGg3IiAvPjwvc3ZnPg=="); +} +.mapboxgl-ctrl-icon.mapboxgl-ctrl-compass > .mapboxgl-ctrl-compass-arrow { + width: 20px; + height: 20px; + margin: 5px; + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%0A%09%3Cpolygon%20fill%3D%27%23333333%27%20points%3D%276%2C9%2010%2C1%2014%2C9%27%2F%3E%0A%09%3Cpolygon%20fill%3D%27%23CCCCCC%27%20points%3D%276%2C11%2010%2C19%2014%2C11%20%27%2F%3E%0A%3C%2Fsvg%3E"); + background-repeat: no-repeat; + display: inline-block; +} + +a.mapboxgl-ctrl-logo { + width: 60px; + height: 20px; + display: block; + background-repeat: no-repeat; + cursor: pointer; + background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgeD0iMCIgeT0iMCIgd2lkdGg9IjU5LjEiIGhlaWdodD0iMTgiIHZpZXdCb3g9IjAgMCA1OS4xIDE4IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCA1OS4xMTkgMTgiIHhtbDpzcGFjZT0icHJlc2VydmUiPjxwYXRoIGQ9Ik0xLjQgMEMwLjYgMC4xIDAgMC44IDAgMS41TDAgMTMuNEMwIDE0LjIgMC43IDE0LjggMS41IDE0LjhMMy4zIDE0LjhDNCAxNC44IDQuNyAxNC4yIDQuOCAxMy40TDQuOCA5LjEgNS41IDEwLjNDNiAxMS4yIDcuNSAxMS4yIDggMTAuM0w4LjggOS4xIDguOCAxMy40QzguOCAxNC4xIDkuNSAxNC44IDEwLjIgMTQuOEwxMiAxNC44QzEyLjggMTQuOCAxMy41IDE0LjIgMTMuNSAxMy40TDEzLjUgMTMuMkMxNC41IDE0LjMgMTUuOSAxNSAxNy42IDE1TDIxLjcgMTUgMjEuNyAxNi41QzIxLjcgMTcuMyAyMi4zIDE4IDIzLjEgMThMMjQuOSAxOEMyNS43IDE4IDI2LjQgMTcuMyAyNi40IDE2LjVMMjYuNCAxNUMyOC4xIDE1IDI5LjUgMTQuNCAzMC41IDEzLjNMMzAuNSAxMy41QzMwLjUgMTMuOSAzMC43IDE0LjMgMzEgMTQuNiAzMS4zIDE0LjkgMzEuNiAxNSAzMiAxNUwzNS4zIDE1QzM3LjQgMTUgMzkuMiAxNCA0MC4zIDEyLjMgNDEuMyAxMy45IDQzLjEgMTUgNDUuMSAxNSA0Ni4yIDE1IDQ3LjEgMTQuOCA0Ny45IDE0LjMgNDguMiAxNC42IDQ4LjcgMTQuOCA0OS4xIDE0LjhMNTEuMyAxNC44QzUxLjcgMTQuOCA1Mi4yIDE0LjYgNTIuNSAxNC4yTDUzLjQgMTIuOSA1NC4zIDE0LjJDNTQuNiAxNC42IDU1LjEgMTQuOCA1NS41IDE0LjhMNTcuNyAxNC44QzU4LjggMTQuOCA1OS41IDEzLjQgNTguOSAxMi41TDU2LjMgOC45IDU4LjcgNS41QzU5LjQgNC42IDU4LjYgMy4xIDU3LjUgMy4xTDU1LjMgMy4xQzU0LjkgMy4xIDU0LjQgMy40IDU0LjEgMy44TDUzLjQgNC44IDUyLjcgMy44QzUyLjQgMy40IDUxLjkgMy4xIDUxLjQgMy4xTDQ5LjMgMy4xQzQ4LjggMy4xIDQ4LjMgMy40IDQ4IDMuOCA0Ny4yIDMuMyA0Ni4yIDMgNDUuMSAzIDQzLjEgMyA0MS4zIDQuMSA0MC4yIDUuNyAzOS4yIDQgMzcuNCAzIDM1LjMgM0wzNS4zIDEuNUMzNS4zIDEuMSAzNS4xIDAuNyAzNC44IDAuNCAzNC42IDAuMiAzNC4yIDAgMzMuOCAwTDMyIDBDMzEuMyAwIDMwLjUgMC44IDMwLjUgMS41TDMwLjUgNC43QzI5LjUgMy42IDI4LjEgMyAyNi41IDNMMjMuMSAzQzIyLjQgMyAyMS43IDMuNyAyMS43IDQuNUwyMS43IDQuOEMyMC42IDMuNyAxOS4yIDMgMTcuNiAzIDE1LjkgMyAxNC41IDMuNyAxMy41IDQuOEwxMy41IDEuNUMxMy41IDAuNyAxMi44IDAgMTIgMEwxMC42IDBDOS42IDAgOC40IDAuNCA3LjggMS40TDYuOCAzLjEgNS44IDEuNEM1LjEgMC40IDMuOSAwIDIuOSAwTDEuNSAwIDEuNCAwek0xLjUgMS41TDIuOSAxLjVDMy42IDEuNSA0LjIgMS43IDQuNSAyLjJMNi44IDYuMSA5IDIuMkM5LjMgMS43IDkuOSAxLjUgMTAuNiAxLjVMMTIgMS41IDEyIDEzLjUgMTAuMiAxMy41IDEwLjIgMy42IDYuOCA5LjUgMy4zIDMuNiAzLjMgMTMuNSAxLjUgMTMuNSAxLjUgMS41ek0zMi4xIDEuNUwzMy44IDEuNSAzMy44IDQuNUMzNC40IDQuNSAzNC44IDQuNSAzNS4zIDQuNSAzNy44IDQuNSAzOS43IDYuNCAzOS43IDkgMzkuNyAxMS42IDM3LjggMTMuNSAzNS4zIDEzLjVMMzIuMSAxMy41IDMyLjEgMS41ek0xNy42IDQuNUMyMCA0LjUgMjEuOCA2LjQgMjEuOCA5TDIxLjggMTMuNSAxNy42IDEzLjVDMTUuMSAxMy41IDEzLjQgMTEuNiAxMy40IDkgMTMuNCA2LjQgMTUuMSA0LjUgMTcuNiA0LjV6TTQ1LjEgNC41QzQ3LjUgNC41IDQ5LjUgNi41IDQ5LjUgOSA0OS41IDExLjUgNDcuNSAxMy41IDQ1LjEgMTMuNSA0Mi43IDEzLjUgNDAuNyAxMS41IDQwLjcgOSA0MC43IDYuNSA0Mi43IDQuNSA0NS4xIDQuNXpNMjMuMSA0LjVMMjYuNSA0LjVDMjguOSA0LjUgMzAuOCA2LjQgMzAuOCA5IDMwLjggMTEuNiAyOC45IDEzLjUgMjYuNSAxMy41TDI0LjkgMTMuNSAyNC45IDE2LjUgMjMuMSAxNi41IDIzLjEgNC41ek00OS4zIDQuNUw1MS40IDQuNSA1My40IDcuMyA1NS4zIDQuNSA1Ny41IDQuNSA1NC41IDguOSA1Ny43IDEzLjUgNTUuNSAxMy41IDUzLjQgMTAuNCA1MS4yIDEzLjUgNDkuMSAxMy41IDUyLjMgOC45IDQ5LjMgNC41ek0xNy42IDYuMkMxNi4yIDYuMiAxNS4xIDcuNCAxNS4xIDkgMTUuMSAxMC42IDE2LjIgMTEuOCAxNy42IDExLjhMMjAgMTEuOCAyMCA5QzIwIDcuNCAxOSA2LjIgMTcuNiA2LjJ6TTQ1LjEgNi4yQzQzLjcgNi4yIDQyLjUgNy41IDQyLjUgOSA0Mi41IDEwLjUgNDMuNyAxMS44IDQ1LjEgMTEuOCA0Ni42IDExLjggNDcuNyAxMC41IDQ3LjcgOSA0Ny43IDcuNSA0Ni42IDYuMiA0NS4xIDYuMnpNMjQuOSA2LjNMMjQuOSAxMS44IDI2LjUgMTEuOEMyNy45IDExLjggMjkuMSAxMC41IDI5LjEgOSAyOS4xIDcuNSAyOC4xIDYuMyAyNi41IDYuM0wyNC45IDYuM3pNMzMuOCA2LjNMMzMuOCAxMS44IDM1LjMgMTEuOEMzNi45IDExLjggMzggMTAuNSAzOCA5IDM4IDcuNSAzNi44IDYuMyAzNS4zIDYuM0wzMy44IDYuM3pNMTcuNiA3LjdDMTguMSA3LjcgMTguNSA4LjEgMTguNSA5TDE4LjUgMTAuMyAxNy42IDEwLjNDMTcgMTAuMyAxNi42IDkuOSAxNi42IDkgMTYuNiA4LjEgMTcgNy43IDE3LjYgNy43ek0yNi40IDcuN0MyNy4yIDcuNyAyNy42IDguNCAyNy42IDkgMjcuNiA5LjkgMjYuOSAxMC4zIDI2LjQgMTAuM0wyNi40IDcuN3pNMzUuMSA3LjdDMzUuOCA3LjcgMzYuNSA4LjMgMzYuNSA5IDM2LjUgOS44IDM1LjkgMTAuMyAzNS4xIDEwLjNMMzUuMSA3Ljd6TTQ1LjEgNy43QzQ1LjcgNy43IDQ2LjIgOC4yIDQ2LjIgOSA0Ni4yIDkuOCA0NS43IDEwLjMgNDUuMSAxMC4zIDQ0LjUgMTAuMyA0NCA5LjggNDQgOSA0NCA4LjIgNDQuNSA3LjcgNDUuMSA3Ljd6IiBvcGFjaXR5PSIwLjMiLz48cGF0aCBkPSJtMS41IDEuNSAwIDEyIDEuOCAwIDAtOS45IDMuNSA1LjkgMy41LTUuOSAwIDkuOSAxLjggMCAwLTEyLTEuNCAwQzkuOSAxLjUgOS4zIDEuNyA5IDIuMkw2LjggNi4xIDQuNSAyLjJDNC4yIDEuNyAzLjYgMS41IDIuOSAxLjVMMS41IDEuNVptMzAuNiAwIDAgMTIgMy4zIDBjMi40IDAgNC40LTEuOSA0LjQtNC41IDAtMi42LTEuOS00LjUtNC40LTQuNS0wLjUgMC0wLjkgMC0xLjUgMGwwLTMtMS43IDB6TTE3LjYgNC41Yy0yLjQgMC00LjIgMS45LTQuMiA0LjUgMCAyLjYgMS44IDQuNSA0LjIgNC41bDQuMiAwTDIxLjggOWMwLTIuNi0xLjctNC41LTQuMi00LjV6bTI3LjYgMGMtMi40IDAtNC40IDItNC40IDQuNSAwIDIuNSAyIDQuNSA0LjQgNC41IDIuNCAwIDQuMy0yIDQuMy00LjUgMC0yLjUtMS45LTQuNS00LjMtNC41em0tMjIgMCAwIDEyIDEuOCAwIDAtMyAxLjYgMGMyLjQgMCA0LjMtMS45IDQuMy00LjUgMC0yLjYtMS45LTQuNS00LjMtNC41bC0zLjMgMHptMjYuMiAwIDMgNC40LTMuMiA0LjYgMi4xIDAgMi4yLTMuMSAyLjEgMy4xIDIuMiAwTDU0LjUgOC45IDU3LjUgNC41IDU1LjMgNC41IDUzLjQgNy4zIDUxLjQgNC41IDQ5LjMgNC41Wk0xNy42IDYuMkMxOSA2LjIgMjAgNy40IDIwIDlsMCAyLjgtMi40IDBjLTEuNCAwLTIuNC0xLjItMi40LTIuOCAwLTEuNiAxLTIuOCAyLjQtMi44em0yNy42IDBjMS40IDAgMi42IDEuMiAyLjYgMi44IDAgMS41LTEuMiAyLjgtMi42IDIuOEM0My43IDExLjggNDIuNSAxMC41IDQyLjUgOWMwLTEuNSAxLjItMi44IDIuNi0yLjh6bS0yMC4yIDAgMS42IDBjMS42IDAgMi42IDEuMyAyLjYgMi44IDAgMS41LTEuMSAyLjgtMi42IDIuOGwtMS42IDAgMC01LjV6bTkgMCAxLjUgMGMxLjUgMCAyLjYgMS4zIDIuNiAyLjggMCAxLjUtMSAyLjgtMi42IDIuOGwtMS41IDAgMC01LjV6IiBmaWxsPSIjZmZmIi8+PC9zdmc+"); +} + +.mapboxgl-ctrl.mapboxgl-ctrl-attrib { + padding: 0 5px; + background-color: rgba(255, 255, 255, .5); + margin: 0; +} +.mapboxgl-ctrl-attrib.compact { + padding-top: 2px; + padding-bottom: 2px; + margin: 0 10px 10px 10px; + position: relative; + padding-right: 24px; + background-color: #fff; + border-radius: 3px 12px 12px 3px; + visibility: hidden; +} +.mapboxgl-ctrl-attrib.compact:hover { + visibility: visible; +} +.mapboxgl-ctrl-attrib.compact:after { + content: ''; + cursor: pointer; + position: absolute; + bottom: 0; + right: 0; + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D%270%200%2020%2020%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%0D%0A%09%3Cpath%20fill%3D%27%23333333%27%20fill-rule%3D%27evenodd%27%20d%3D%27M4%2C10a6%2C6%200%201%2C0%2012%2C0a6%2C6%200%201%2C0%20-12%2C0%20M9%2C7a1%2C1%200%201%2C0%202%2C0a1%2C1%200%201%2C0%20-2%2C0%20M9%2C10a1%2C1%200%201%2C1%202%2C0l0%2C3a1%2C1%200%201%2C1%20-2%2C0%27%20%2F%3E%0D%0A%3C%2Fsvg%3E"); + background-color: rgba(255, 255, 255, .5); + width: 24px; + height: 24px; + box-sizing: border-box; + visibility: visible; + border-radius: 12px; +} +.mapboxgl-ctrl-attrib a { + color: rgba(0,0,0,0.75); + text-decoration: none; +} +.mapboxgl-ctrl-attrib a:hover { + color: inherit; + text-decoration: underline; +} +.mapboxgl-ctrl-attrib .mapbox-improve-map { + font-weight: bold; + margin-left: 2px; +} + +.mapboxgl-ctrl-scale { + background-color: rgba(255,255,255,0.75); + font-size: 10px; + border-width: medium 2px 2px; + border-style: none solid solid; + border-color: #333; + padding: 0 5px; + color: #333; +} + +.mapboxgl-popup { + position: absolute; + top: 0; + left: 0; + display: -webkit-flex; + display: flex; + will-change: transform; + pointer-events: none; +} +.mapboxgl-popup-anchor-top, +.mapboxgl-popup-anchor-top-left, +.mapboxgl-popup-anchor-top-right { + -webkit-flex-direction: column; + flex-direction: column; +} +.mapboxgl-popup-anchor-bottom, +.mapboxgl-popup-anchor-bottom-left, +.mapboxgl-popup-anchor-bottom-right { + -webkit-flex-direction: column-reverse; + flex-direction: column-reverse; +} +.mapboxgl-popup-anchor-left { + -webkit-flex-direction: row; + flex-direction: row; +} +.mapboxgl-popup-anchor-right { + -webkit-flex-direction: row-reverse; + flex-direction: row-reverse; +} +.mapboxgl-popup-tip { + width: 0; + height: 0; + border: 10px solid transparent; + z-index: 1; +} +.mapboxgl-popup-anchor-top .mapboxgl-popup-tip { + -webkit-align-self: center; + align-self: center; + border-top: none; + border-bottom-color: #fff; +} +.mapboxgl-popup-anchor-top-left .mapboxgl-popup-tip { + -webkit-align-self: flex-start; + align-self: flex-start; + border-top: none; + border-left: none; + border-bottom-color: #fff; +} +.mapboxgl-popup-anchor-top-right .mapboxgl-popup-tip { + -webkit-align-self: flex-end; + align-self: flex-end; + border-top: none; + border-right: none; + border-bottom-color: #fff; +} +.mapboxgl-popup-anchor-bottom .mapboxgl-popup-tip { + -webkit-align-self: center; + align-self: center; + border-bottom: none; + border-top-color: #fff; +} +.mapboxgl-popup-anchor-bottom-left .mapboxgl-popup-tip { + -webkit-align-self: flex-start; + align-self: flex-start; + border-bottom: none; + border-left: none; + border-top-color: #fff; +} +.mapboxgl-popup-anchor-bottom-right .mapboxgl-popup-tip { + -webkit-align-self: flex-end; + align-self: flex-end; + border-bottom: none; + border-right: none; + border-top-color: #fff; +} +.mapboxgl-popup-anchor-left .mapboxgl-popup-tip { + -webkit-align-self: center; + align-self: center; + border-left: none; + border-right-color: #fff; +} +.mapboxgl-popup-anchor-right .mapboxgl-popup-tip { + -webkit-align-self: center; + align-self: center; + border-right: none; + border-left-color: #fff; +} +.mapboxgl-popup-close-button { + position: absolute; + right: 0; + top: 0; + border: none; + border-radius: 0 3px 0 0; + cursor: pointer; + background-color: rgba(0,0,0,0); +} +.mapboxgl-popup-close-button:hover { + background-color: rgba(0,0,0,0.05); +} +.mapboxgl-popup-content { + position: relative; + background: #fff; + border-radius: 3px; + box-shadow: 0 1px 2px rgba(0,0,0,0.10); + padding: 10px 10px 15px; + pointer-events: auto; +} +.mapboxgl-popup-anchor-top-left .mapboxgl-popup-content { + border-top-left-radius: 0; +} +.mapboxgl-popup-anchor-top-right .mapboxgl-popup-content { + border-top-right-radius: 0; +} +.mapboxgl-popup-anchor-bottom-left .mapboxgl-popup-content { + border-bottom-left-radius: 0; +} +.mapboxgl-popup-anchor-bottom-right .mapboxgl-popup-content { + border-bottom-right-radius: 0; +} + +.mapboxgl-marker { + position: absolute; + top: 0; + left: 0; + will-change: transform; +} + +.mapboxgl-crosshair, +.mapboxgl-crosshair .mapboxgl-interactive, +.mapboxgl-crosshair .mapboxgl-interactive:active { + cursor: crosshair; +} +.mapboxgl-boxzoom { + position: absolute; + top: 0; + left: 0; + width: 0; + height: 0; + background: #fff; + border: 2px dotted #202020; + opacity: 0.5; +} +@media print { + .mapbox-improve-map { + display:none; + } +} diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/dist/svg/mapboxgl-ctrl-attrib.svg b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/dist/svg/mapboxgl-ctrl-attrib.svg new file mode 100644 index 000000000..3bedbb0ea --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/dist/svg/mapboxgl-ctrl-attrib.svg @@ -0,0 +1,3 @@ + + + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/dist/svg/mapboxgl-ctrl-compass.svg b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/dist/svg/mapboxgl-ctrl-compass.svg new file mode 100644 index 000000000..dd5e2a880 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/dist/svg/mapboxgl-ctrl-compass.svg @@ -0,0 +1,4 @@ + + + + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/dist/svg/mapboxgl-ctrl-geolocate.svg b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/dist/svg/mapboxgl-ctrl-geolocate.svg new file mode 100644 index 000000000..efb9a3f79 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/dist/svg/mapboxgl-ctrl-geolocate.svg @@ -0,0 +1 @@ + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/dist/svg/mapboxgl-ctrl-zoom-in.svg b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/dist/svg/mapboxgl-ctrl-zoom-in.svg new file mode 100644 index 000000000..b26e3d162 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/dist/svg/mapboxgl-ctrl-zoom-in.svg @@ -0,0 +1,3 @@ + + + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/dist/svg/mapboxgl-ctrl-zoom-out.svg b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/dist/svg/mapboxgl-ctrl-zoom-out.svg new file mode 100644 index 000000000..ab6e9ff22 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/dist/svg/mapboxgl-ctrl-zoom-out.svg @@ -0,0 +1,3 @@ + + + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/README.md b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/README.md new file mode 100644 index 000000000..0d9aa18cf --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/README.md @@ -0,0 +1,74 @@ +Mapbox GL JS has [API documentation](#writing-api-documentation) and [examples](#writing-examples). + +## Writing API Documentation + +API documentation is written as [JSDoc comments](http://usejsdoc.org/) and processed with [documentationjs](http://documentation.js.org/). + +* Classes, methods, events, and anything else in the public interface must be documented with JSDoc comments. Everything outside of the public interface may be documented and must be tagged as `@private`. +* Text within JSDoc comments may use markdown formatting. Code identifiers must be surrounded by \`backticks\`. +* Documentation must be written in grammatically correct sentences ending with periods. +* Documentation must specify measurement units when applicable. +* Documentation descriptions must contain more information than what is obvious from the identifier and JSDoc metadata. +* Class descriptions should describe what the class *is*, or what its instances *are*. They do not document the constructor, but the class. They should begin with either a complete sentence or a phrase that would complete a sentence beginning with "A `T` is..." or "The `T` class is..." Examples: "Lists are ordered indexed dense collections." "A class used for asynchronous computations." +* Function descriptions should begin with a third person singular present tense verb, as if completing a sentence beginning with "This function..." If the primary purpose of the function is to return a value, the description should begin with "Returns..." Examples: "Returns the layer with the specified id." "Sets the map's center point." +* `@param`, `@property`, and `@returns` descriptions should be capitalized and end with a period. They should begin as if completing a sentence beginning with "This is..." or "This..." +* Functions that do not return a value (return `undefined`), should not have a `@returns` annotation. +* Member descriptions should document what a member represents or gets and sets. They should also indicate whether the member is read-only. +* Event descriptions should begin with "Fired when..." and so should describe when the event fires. Event entries should clearly document any data passed to the handler, with a link to MDN documentation of native Event objects when applicable. + +## Writing Examples + +Examples are written as Jekyll posts in `docs/_posts/examples`. The Jekyll front matter should include the following items: + +* `layout`: `example` +* `category`: `example` +* `title`: A short title for the example in **sentence case** as a **verb phrase** +* `description`: A one sentence description of the example + +In the post body, write the HTML and JavaScript constituting the example. + +* Use **4 space indentation**. Exception: do not add an initial level of indentation to code within ` + +{% endhighlight html %}{% endcopyable %} + +

Include the following code in the <body> of your HTML file.

+
+{% copyable %}{% highlight html %} +
+ +{% endhighlight html %}{% endcopyable %} +
diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_layouts/default.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_layouts/default.html new file mode 100755 index 000000000..bc45aa133 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_layouts/default.html @@ -0,0 +1,560 @@ +--- +footer: + mapbox: + - title: Products + path: /products + - title: Showcase + path: /showcase + - title: Pricing + path: /pricing + - title: Blog + path: /blog + - title: Platform + path: /platform + - title: Telemetry + path: /telemetry + aboutus: + - title: Our story + path: /about + - title: Team + path: /about/team + - title: Jobs + path: /jobs + - title: Events + path: /events + - title: Press + path: /about/press + - title: Green + path: /about/green + - title: Open source + path: /about/open + - title: Board and investors + path: /about/board + support: + - title: Help/FAQ + path: /help + - title: Status + path: /status + - title: Map feedback + path: /map-feedback + - title: Contact us + path: /contact + - title: Education + path: /education + - title: Humanitarian + path: /humanitarian + - title: Security + path: /security + mapdesign: + - title: Maps + path: /maps + - title: Mapbox Studio + path: /mapbox-studio + - title: Gallery + path: /gallery + - title: Vector tiles + path: /vector-tiles + - title: Maki icons + path: /maki-icons + developers: + - title: Mapbox API + path: /developers/api + - title: Mapbox.js + path: /mapbox.js + - title: iOS SDK + path: /ios-sdk + - title: Android SDK + path: /android-sdk + - title: Mapbox GL for JS + path: /mapbox-gl-js + industries: + - title: Real estate + path: /industries/realestate + - title: Transportation + path: /industries/transportation + - title: Agriculture + path: /industries/agriculture + - title: Social + path: /industries/social + - title: "GIS: Mapbox Esri Connect" + path: /esriconnect +--- + + + + {% if page.prehead %}{{page.prehead}}{% endif %} + + + + + + {% if page.description %}{% endif %} + {% if page.title == 'Mapbox' %}{{page.title}} | Design and publish beautiful maps{% else %}{{page.title}} | Mapbox{% endif %} + + + + {% if page.date and site.baseurl == '/blog' %} + {% endif %}{% if page.tags %} + {% for tags in page.tags %} + {% endfor %}{% endif %}{% if page.category and page.category !='none' %} + {% endif %}{% if page.author %} + {% endif %}{% if page.excerpt or page.description %} + {% endif %} + {% if site.baseurl == '/mapbox.js' %}{% if site.mapboxjs != page.version and page.version != 'latest' %}{% endif %}{% endif %} + {% if page.card or layout.card %} + + + + + + + + + {% if page.video or layout.video %} + + + + + + + + + {% elsif page.image or layout.image %} + + + + + + {% endif %} + {% endif %} + + + {% if site.localbase == true %} + + {% else %} + + {% endif %} + + + + + + {% unless page.nomapboxjs %} + + {% endunless %} + + + + + {% unless page.nomapboxjs %} + + {% endunless %} + + + + {% if site.test %}{% endif %} + {% if page.head %}{{page.head}}{% endif %}{% if layout.head %}{{layout.head}}{% endif %} + + + +
+{% if page.app %} +{{content}} +{% else %} + + + +
+
+ +
+
+ + +
{{content}}
+ +{% unless page.url contains '/hello/directions' %} + + + +{% endunless %} + +{% if page.url contains '/hello/directions' %} + +{% endif %} +{% endif %} + + +
+ + + + + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_layouts/example.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_layouts/example.html new file mode 100644 index 000000000..63ff1ee42 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_layouts/example.html @@ -0,0 +1,82 @@ +--- +layout: pages +--- + +
+ + + +
+
{{ page.title }}
{{ page.description }}
+ +
+ + + + + + +
+ +
{% highlight html %} + + + + + {{ page.exampletitle }} + + + + + + + +{{content | insert_token}} + +{% endhighlight %} +
+ + Copy example +
+ +
diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_layouts/pages.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_layouts/pages.html new file mode 100644 index 000000000..a7d5d1e8e --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_layouts/pages.html @@ -0,0 +1,89 @@ +--- +layout: default +class: fill-light +options: full +examples: + - name: Styles + id: styles + - name: Layers + id: layers + - name: Sources + id: sources + - name: User interaction + id: user-interaction + - name: Camera + id: camera + - name: Controls and overlays + id: controls-and-overlays + - name: Browser support + id: browser-support + - name: Internationalization support + id: internationalization +--- + + + + + +
+
+
+ +
+
+
+ +
+ {% include navigation.html %} + +
+ {{ content }} +
+
+ + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_layouts/redirect.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_layouts/redirect.html new file mode 100644 index 000000000..979122776 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_layouts/redirect.html @@ -0,0 +1,7 @@ + + + + + + + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_plugins/copyable.rb b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_plugins/copyable.rb new file mode 100644 index 000000000..ec7f7c512 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_plugins/copyable.rb @@ -0,0 +1,19 @@ +class CopyableBlock < Liquid::Block + + @@nextId = 0 + + def initialize(tag_name, text, tokens) + super + @id = @@nextId + @@nextId = @@nextId + 1 + end + + def render(context) + "
\ + \ +
#{super}
\ +
" + end +end + +Liquid::Template.register_tag('copyable', CopyableBlock) diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_plugins/insert_token.rb b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_plugins/insert_token.rb new file mode 100644 index 000000000..b9a191e94 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_plugins/insert_token.rb @@ -0,0 +1,7 @@ +module InsertToken + def insert_token(input) + input.sub(" diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-01-toggle-layers.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-01-toggle-layers.html new file mode 100644 index 000000000..d1887ddfa --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-01-toggle-layers.html @@ -0,0 +1,134 @@ +--- +layout: example +category: example +title: Show and hide layers +description: Create a custom layer switcher to display different datasets. +tags: + - layers +--- + + + +
+ + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-01-vector-source.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-01-vector-source.html new file mode 100644 index 000000000..2b8b5fe7c --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-01-vector-source.html @@ -0,0 +1,38 @@ +--- +layout: example +category: example +title: Add a vector tile source +description: Add a vector source to a map. +tags: + - sources +--- +
+ diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-02-check-for-support.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-02-check-for-support.html new file mode 100644 index 000000000..7389da8a8 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-02-check-for-support.html @@ -0,0 +1,23 @@ +--- +layout: example +category: example +title: Check for browser support +description: Check for Mapbox GL browser support +tags: + - browser-support +--- + +
+ + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-02-cluster.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-02-cluster.html new file mode 100644 index 000000000..c11226d46 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-02-cluster.html @@ -0,0 +1,87 @@ +--- +layout: example +category: example +title: Create and style clusters +description: Use Mapbox GL JS' built-in functions to visualize points as clusters. +tags: + - layers +--- + +
+ + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-02-custom-style-id.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-02-custom-style-id.html new file mode 100644 index 000000000..51b42a0fc --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-02-custom-style-id.html @@ -0,0 +1,17 @@ +--- +layout: example +category: example +title: Display a map with a custom style +description: Using a custom Mapbox-hosted style. +tags: + - styles +--- +
+ diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-02-heatmap.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-02-heatmap.html new file mode 100644 index 000000000..3e84f485c --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-02-heatmap.html @@ -0,0 +1,74 @@ +--- +layout: example +category: example +title: Create a heatmap from points +description: Use Mapbox GL JS clustering to visualize point data as a heatmap. +tags: + - layers +--- + +
+ + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-02-interactive-false.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-02-interactive-false.html new file mode 100644 index 000000000..b62adb08b --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-02-interactive-false.html @@ -0,0 +1,20 @@ +--- +layout: example +category: example +title: Display a non-interactive map +description: "Setting interactive: false to create a static map" +tags: + - user-interaction +--- +
+ diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-02-map-tiles.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-02-map-tiles.html new file mode 100644 index 000000000..67290f4a7 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-02-map-tiles.html @@ -0,0 +1,34 @@ +--- +layout: example +category: example +title: Add a raster tile source +description: Using a Mapbox raster tile source in a map +tags: + - sources +--- +
+ diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-02-setstyle.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-02-setstyle.html new file mode 100644 index 000000000..b7c74b039 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-02-setstyle.html @@ -0,0 +1,53 @@ +--- +layout: example +category: example +title: Change a map's style +description: Switch to another map style. +tags: + - styles + - user-interaction +--- + + +
+ + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-02-wms.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-02-wms.html new file mode 100644 index 000000000..e871a18ae --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-02-wms.html @@ -0,0 +1,33 @@ +--- +layout: example +category: example +title: Add a WMS source +description: Adding an external Web Map Service layer to the map +tags: + - sources +--- +
+ diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-03-fitbounds.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-03-fitbounds.html new file mode 100644 index 000000000..0dc57efd9 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-03-fitbounds.html @@ -0,0 +1,46 @@ +--- +layout: example +category: example +title: Fit a map to a bounding box +description: Use fitBounds to show a specific area of the map in view, regardless of the pixel size of the map. +tags: + - camera +--- + +
+
+ + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-03-flyto-options.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-03-flyto-options.html new file mode 100644 index 000000000..8938c2c6e --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-03-flyto-options.html @@ -0,0 +1,68 @@ +--- +layout: example +category: example +title: Slowly fly to a location +description: Using .flyTo with flyOptions +tags: + - camera +--- + +
+
+ + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-03-flyto.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-03-flyto.html new file mode 100644 index 000000000..0b519fd29 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-03-flyto.html @@ -0,0 +1,45 @@ +--- +layout: example +category: example +title: Fly to a location +description: Using .flyTo to smoothly interpolate between locations +tags: + - camera +--- + +
+
+ + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-03-language-switch.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-03-language-switch.html new file mode 100644 index 000000000..d1479ff91 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-03-language-switch.html @@ -0,0 +1,53 @@ +--- +layout: example +category: example +title: Change a map's language +description: Using .setLayoutProperty to switch languages dynamically. +tags: + - user-interaction +--- + +
+
    +
  • French
  • +
  • Russian
  • +
  • German
  • +
  • Spanish
  • +
+ diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-03-scroll-fly-to.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-03-scroll-fly-to.html new file mode 100644 index 000000000..95915d82d --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-03-scroll-fly-to.html @@ -0,0 +1,169 @@ +--- +layout: example +category: example +title: Fly to a location based on scroll position +description: Scroll down through the story and the map will fly to the chapter's location. +tags: + - camera +--- + + + +
+
+
+

221b Baker St.

+

November 1895. London is shrouded in fog and Sherlock Holmes and Watson pass time restlessly awaiting a new case. "The London criminal is certainly a dull fellow," Sherlock bemoans. "There have been numerous petty thefts," Watson offers in response. Just then a telegram arrives from Sherlock's brother Mycroft with a mysterious case.

+
+
+

Aldgate Station

+

Arthur Cadogan West was found dead, head crushed in on train tracks at Aldgate Station at 6AM Tuesday morning. West worked at Woolwich Arsenal on the Bruce-Partington submarine, a secret military project. Plans for the submarine had been stolen and seven of the ten missing papers were found in West's possession. Mycroft implores Sherlock to take the case and recover the three missing papers.

+
+
+

London Bridge

+

Holmes and Watson's investigations take them across London. Sherlock deduces that West was murdered elsewhere, then moved to Aldgate Station to create the illusion that he was crushed on the tracks by a train. On their way to Woolwich Sherlock dispatches a telegram to Mycroft at London Bridge: "Send list of all foreign spies known to be in England, with full address."

+
+
+

Woolwich Arsenal

+

While investigating at Woolwich Arsenal Sherlock learns that West did not have the three keys—door, office, and safe—necessary to steal the papers. The train station clerk mentions seeing an agitated West boarding the 8:15 train to London Bridge. Sherlock suspects West of following someone who had access to the Woolwich chief's keyring with all three keys.

+
+
+

Gloucester Road

+

Mycroft responds to Sherlock's telegram and mentions several spies. Hugo Oberstein of 13 Caulfield Gardens catches Sherlock's eye. He heads to the nearby Gloucester Road station to investigate and learns that the windows of Caulfield Gardens open over rail tracks where trains stop frequently.

+
+
+

13 Caulfield Gardens

+

Holmes deduces that the murderer placed West atop a stopped train at Caulfield Gardens. The train traveled to Aldgate Station before West's body finally toppled off. Backtracking to the criminal's apartment, Holmes finds a series of classified ads from The Daily Telegraph stashed away. All are under the name Pierrot: "Monday night after nine. Two taps. Only ourselves. Do not be so suspicious. Payment in hard cash when goods delivered."

+
+
+

The Daily Telegraph

+

Holmes and Watson head to The Daily Telegraph and place an ad to draw out the criminal. It reads: "To-night. Same hour. Same place. Two taps. Most vitally important. Your own safety at stake. Pierrot." The trap works and Holmes catches the criminal: Colonel Valentine Walter, the brother of Woolwich Arsenal's chief. He confesses to working for Hugo Oberstein to obtain the submarine plans in order to pay off his debts.

+
+
+

Charing Cross Hotel

+

Walter writes to Oberstein and convinces him to meet in the smoking room of the Charing Cross Hotel where he promises additional plans for the submarine in exchange for money. The plan works and Holmes and Watson catch both criminals.

+ + Adapted from Project Gutenberg + +
+
+ diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-03-set-perspective.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-03-set-perspective.html new file mode 100644 index 000000000..533023aa9 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-03-set-perspective.html @@ -0,0 +1,19 @@ +--- +layout: example +category: example +title: Set pitch and bearing +description: Map options extend CameraOptions, so you can set more than just center and zoom +tags: + - camera +--- +
+ diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-04-center-on-symbol.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-04-center-on-symbol.html new file mode 100644 index 000000000..8b563343e --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-04-center-on-symbol.html @@ -0,0 +1,93 @@ +--- +layout: example +category: example +title: Center the map on a clicked symbol +description: Using queryRenderedFeatures and flyTo to center the map on a symbol +tags: + - camera + - user-interaction +--- +
+ diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-04-color-switcher.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-04-color-switcher.html new file mode 100644 index 000000000..3e74666c0 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-04-color-switcher.html @@ -0,0 +1,113 @@ +--- +layout: example +category: example +title: Change a layer's color with buttons +description: Using setPaintProperty to change a layer's fill color +tags: + - layers + - user-interaction +--- + + +
+
+
+
+ + +
+
+ +
+
+
+
+ + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-04-geojson-layer-in-stack.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-04-geojson-layer-in-stack.html new file mode 100644 index 000000000..9a59b0da6 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-04-geojson-layer-in-stack.html @@ -0,0 +1,40 @@ +--- +layout: example +category: example +title: Add a new layer below labels +description: Using the second argument of addLayer, you can be more precise +tags: + - layers +--- +
+ diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-04-geojson-line.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-04-geojson-line.html new file mode 100644 index 000000000..ae1e7664f --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-04-geojson-line.html @@ -0,0 +1,66 @@ +--- +layout: example +category: example +title: Add a GeoJSON line +description: Add a GeoJSON line to a map. +tags: + - layers +--- +
+ diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-04-geojson-polygon.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-04-geojson-polygon.html new file mode 100644 index 000000000..47934d672 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-04-geojson-polygon.html @@ -0,0 +1,59 @@ +--- +layout: example +category: example +title: Add a GeoJSON polygon +description: Style a polygon with the fill layer type +tags: + - layers +--- +
+ diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-04-hover-styles.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-04-hover-styles.html new file mode 100644 index 000000000..d7e1c4ff5 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-04-hover-styles.html @@ -0,0 +1,76 @@ +--- +layout: example +category: example +title: Create a hover effect +description: Using queryRenderedFeatures and a filter to change hover styles +tags: + - user-interaction +--- +
+ diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-04-multiple-geometries.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-04-multiple-geometries.html new file mode 100644 index 000000000..d17f86854 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-04-multiple-geometries.html @@ -0,0 +1,94 @@ +--- +layout: example +category: example +title: Add multiple geometries from one GeoJSON source +description: Add a polygon and circle layer from the same GeoJSON source +tags: + - layers +--- +
+ diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-04-navigation.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-04-navigation.html new file mode 100644 index 000000000..79690ba7e --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-04-navigation.html @@ -0,0 +1,20 @@ +--- +layout: example +category: example +title: Display map navigation controls +description: Zoom and rotation controls to make map navigation more obvious +tags: + - controls-and-overlays +--- +
+ diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-05-geojson-markers.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-05-geojson-markers.html new file mode 100644 index 000000000..defa0158e --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-05-geojson-markers.html @@ -0,0 +1,59 @@ +--- +layout: example +category: example +title: Draw GeoJSON points +description: Draw points from a GeoJSON collection to a map. +tags: + - layers +--- +
+ diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-05-locate-user.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-05-locate-user.html new file mode 100644 index 000000000..1718ab388 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-05-locate-user.html @@ -0,0 +1,20 @@ +--- +layout: example +category: example +title: Locate the user +description: Geolocate the user and then center the map on their current location +tags: + - controls-and-overlays +--- +
+ diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-05-mouse-position.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-05-mouse-position.html new file mode 100644 index 000000000..da0e0839d --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-05-mouse-position.html @@ -0,0 +1,42 @@ +--- +layout: example +category: example +title: Get coordinates of the mouse pointer +description: Showing mouse position on hover with pixel and latitude and longitude coordinates +tags: + - user-interaction +--- + +
+

+
diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-05-popup.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-05-popup.html
new file mode 100644
index 000000000..4002d10ed
--- /dev/null
+++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-05-popup.html
@@ -0,0 +1,22 @@
+---
+layout: example
+category: example
+title: Display a popup
+description: Add a popup to the map
+tags:
+  - controls-and-overlays
+---
+
+ diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-05-queryrenderedfeatures.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-05-queryrenderedfeatures.html new file mode 100644 index 000000000..b019c004c --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-05-queryrenderedfeatures.html @@ -0,0 +1,37 @@ +--- +layout: example +category: example +title: Get features under the mouse pointer +description: Using the queryRenderedFeatures API to show properties of hovered-over map elements. +tags: + - user-interaction +--- + +
+

+
diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-06-polygon-popup-on-click.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-06-polygon-popup-on-click.html
new file mode 100644
index 000000000..a1a23980a
--- /dev/null
+++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-06-polygon-popup-on-click.html
@@ -0,0 +1,64 @@
+---
+layout: example
+category: example
+title: Show polygon information on click
+description: When a user clicks a polygon, show a popup containing more information.
+tags:
+  - controls-and-overlays
+---
+
+
+ diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-06-popup-on-click.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-06-popup-on-click.html new file mode 100644 index 000000000..593a28b5d --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-06-popup-on-click.html @@ -0,0 +1,161 @@ +--- +layout: example +category: example +title: Display a popup on click +description: When a user clicks a symbol, show a popup containing more information. +tags: + - controls-and-overlays +--- + +
+ diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-06-popup-on-hover.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-06-popup-on-hover.html new file mode 100644 index 000000000..0131d3d9f --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-06-popup-on-hover.html @@ -0,0 +1,159 @@ +--- +layout: example +category: example +title: Display a popup on hover +description: When a user hovers over a symbol, show a popup containing more information. +tags: + - controls-and-overlays +--- + +
+ diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-06-satellite-map.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-06-satellite-map.html new file mode 100644 index 000000000..2792a65d4 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-06-satellite-map.html @@ -0,0 +1,18 @@ +--- +layout: example +category: example +title: Display a satellite map +description: Satellite raster baselayer. +tags: + - styles +--- +
+ diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-07-image-on-a-map.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-07-image-on-a-map.html new file mode 100644 index 000000000..ae254fbce --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-07-image-on-a-map.html @@ -0,0 +1,109 @@ +--- +layout: example +category: example +title: Add an image +description: Dark vector baselayer with radar weather image overlay +tags: + - sources + - layers +--- +
+ diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-07-video-on-a-map.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-07-video-on-a-map.html new file mode 100644 index 000000000..bf6c843d3 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-07-video-on-a-map.html @@ -0,0 +1,57 @@ +--- +layout: example +category: example +title: Add a video +description: Satellite raster baselayer with video on top +tags: + - sources + - layers +--- +
+ diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-08-data-driven-circle-colors.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-08-data-driven-circle-colors.html new file mode 100644 index 000000000..9413f1de4 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-08-data-driven-circle-colors.html @@ -0,0 +1,48 @@ +--- +layout: example +category: example +title: Style circles using data-driven styling +description: Using a categorical circle-color property function for a visualization +tags: + - layers +--- +
+ diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-08-third-party.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-08-third-party.html new file mode 100644 index 000000000..10056623f --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-08-third-party.html @@ -0,0 +1,47 @@ +--- +layout: example +category: example +title: Add a third party vector tile source +description: 'Render a map using an external vector source of OpenStreetMap data provided by Mapzen.' +tags: + - sources +--- +
+ diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-09-disable-rotation.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-09-disable-rotation.html new file mode 100644 index 000000000..d7dba64a9 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-09-disable-rotation.html @@ -0,0 +1,23 @@ +--- +layout: example +category: example +title: Disable map rotation +description: Prevent users from rotating a map. +tags: + - user-interaction +--- +
+ diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-10-live-geojson.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-10-live-geojson.html new file mode 100644 index 000000000..39b3b82d3 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-10-live-geojson.html @@ -0,0 +1,34 @@ +--- +layout: example +category: example +title: Add live realtime data +description: Use realtime GeoJSON data streams to move a symbol on your map +tags: + - sources +--- +
+ + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-10-live-update-feature.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-10-live-update-feature.html new file mode 100644 index 000000000..63682e4f4 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-10-live-update-feature.html @@ -0,0 +1,63 @@ +--- +layout: example +category: example +title: Update a feature in realtime +description: Change an existing feature on your map in realtime by updating its data +tags: + - sources +--- +
+ + + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-10-rotating-controllable-marker.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-10-rotating-controllable-marker.html new file mode 100644 index 000000000..238c3a214 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-10-rotating-controllable-marker.html @@ -0,0 +1,101 @@ +--- +layout: example +category: example +title: Move symbol with the keyboard +description: Control a symbol with keybindings and rotate it +tags: + - layers + - sources +--- +
+ diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-11-mapbox-gl-directions.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-11-mapbox-gl-directions.html new file mode 100644 index 000000000..d9ca4ca42 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-11-mapbox-gl-directions.html @@ -0,0 +1,24 @@ +--- +layout: example +category: example +title: Display driving directions +description: 'Use the mapbox-gl-directions plugin to show results from the Mapbox Directions API. Click the map to add an origin and destination.' +tags: + - controls-and-overlays +--- + + +
+ + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-12-mapbox-gl-geocoder.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-12-mapbox-gl-geocoder.html new file mode 100644 index 000000000..fbbe56101 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-12-mapbox-gl-geocoder.html @@ -0,0 +1,24 @@ +--- +layout: example +category: example +title: Add a geocoder +description: 'Use the mapbox-gl-geocoder control to search for places using Mapbox Geocoding API.' +tags: + - controls-and-overlays +--- + + +
+ + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-13-filter-markers.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-13-filter-markers.html new file mode 100644 index 000000000..ca1ca3c21 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-13-filter-markers.html @@ -0,0 +1,182 @@ +--- +layout: example +category: example +title: Filter symbols by toggling a list +description: Filter a set of symbols based on a property value in the data. +tags: + - user-interaction +--- + +
+ + + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-14-filter-features-within-map-view.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-14-filter-features-within-map-view.html new file mode 100644 index 000000000..69bb46aec --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-14-filter-features-within-map-view.html @@ -0,0 +1,235 @@ +--- +layout: example +category: example +title: "Filter features within map view" +description: "Move the map to query viewable features in a vector tile layer and filter by typing in an input" +tags: + - user-interaction +--- + + +
+ +
+
+ +
+
+
+ + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-14-filter-markers-by-input.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-14-filter-markers-by-input.html new file mode 100644 index 000000000..ea99a0161 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-14-filter-markers-by-input.html @@ -0,0 +1,163 @@ +--- +layout: example +category: example +title: Filter symbols by text input +description: Filter symbols by icon name by typing in a text input. +tags: + - user-interaction +--- + +
+
+ +
+ + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-14-restrict-bounds.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-14-restrict-bounds.html new file mode 100644 index 000000000..b09d43643 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-14-restrict-bounds.html @@ -0,0 +1,25 @@ +--- +layout: example +category: example +title: Restrict map panning to an area +description: Prevent a map from being panned to a different place by setting maxBounds. +tags: + - user-interaction +--- +
+ diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-14-toggle-interaction-handlers.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-14-toggle-interaction-handlers.html new file mode 100644 index 000000000..61a77ef0c --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-14-toggle-interaction-handlers.html @@ -0,0 +1,92 @@ +--- +layout: example +category: example +title: Toggle interactions +description: Enable or disable UI handlers on a map. +tags: + - user-interaction +--- + +
+ + + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-15-animate-point-along-line.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-15-animate-point-along-line.html new file mode 100644 index 000000000..44b5bb1a9 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-15-animate-point-along-line.html @@ -0,0 +1,60 @@ +--- +layout: example +category: example +title: Animate a point +description: Animate the position of a point by updating a GeoJSON source on each frame. +tags: + - layers + - sources +--- +
+ diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-15-animate-point-along-route.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-15-animate-point-along-route.html new file mode 100644 index 000000000..606d22e1b --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-15-animate-point-along-route.html @@ -0,0 +1,165 @@ +--- +layout: example +category: example +title: Animate a point along a route +description: "Use Turf to smoothly animate a point along the distance of a line." +tags: + - animate + - camera +--- + + + +
+
+ +
+ + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-15-attribution-position.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-15-attribution-position.html new file mode 100644 index 000000000..b0a4584a5 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-15-attribution-position.html @@ -0,0 +1,20 @@ +--- +layout: example +category: example +title: Change the default position for attribution +description: Place attribution in the top-left position when initializing a map. +tags: + - controls-and-overlays +--- +
+ + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-16-point-from-geocoder-result.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-16-point-from-geocoder-result.html new file mode 100644 index 000000000..e5cf23e36 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-16-point-from-geocoder-result.html @@ -0,0 +1,60 @@ +--- +layout: example +category: example +title: Set a point after Geocoder result +description: 'Listen to the geocoder.input event from the Geocoder plugin and place a point on the coordinate results.' +tags: + - controls-and-overlays +--- + + + +
+ + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-17-animate-images.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-17-animate-images.html new file mode 100644 index 000000000..2c0cf13ea --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-17-animate-images.html @@ -0,0 +1,56 @@ +--- +layout: example +category: example +title: Animate a series of images +description: Use a series of image sources to create an animation. +tags: + - layers + - sources +--- +
+ diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-17-disable-scroll-zoom.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-17-disable-scroll-zoom.html new file mode 100644 index 000000000..2cc0c01cf --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-17-disable-scroll-zoom.html @@ -0,0 +1,20 @@ +--- +layout: example +category: example +title: Disable scroll zoom +description: Prevents scroll from zooming a map. +tags: + - change-option +--- +
+ diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-17-updating-choropleth.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-17-updating-choropleth.html new file mode 100644 index 000000000..68a200ec3 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-17-updating-choropleth.html @@ -0,0 +1,150 @@ +--- +layout: example +category: example +title: Update a choropleth layer by zoom level +description: 'Using 2014 census data, display state or county population depending on zoom level.' +tags: + - layers + - user-interaction +--- + + +
+ +
+

Population

+
25,000,000
+
10,000,000
+
7,500,000
+
5,000,000
+
2,500,000
+
1,000,000
+
750,000
+
500,000
+
0
+
+ + + + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-18-playback-locations.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-18-playback-locations.html new file mode 100644 index 000000000..d3d8fd39e --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-18-playback-locations.html @@ -0,0 +1,160 @@ +--- +layout: example +category: example +title: Play map locations as a slideshow +description: 'Autoplay the locations of boroughs in New York City' +tags: + - camera +--- + + +
+ +
+
+

+

+ Text credit: nycgo.com +
+
+ + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-19-queryrenderedfeatures-around-point.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-19-queryrenderedfeatures-around-point.html new file mode 100644 index 000000000..6486bc7cc --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-19-queryrenderedfeatures-around-point.html @@ -0,0 +1,68 @@ +--- +layout: example +category: example +title: Select features around a clicked point +description: 'Click on the map to query features using queryRenderedFeatures.' +tags: + - user-interaction +--- +
+ + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-19-using-box-queryrenderedfeatures.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-19-using-box-queryrenderedfeatures.html new file mode 100644 index 000000000..c82c5e35f --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-19-using-box-queryrenderedfeatures.html @@ -0,0 +1,199 @@ +--- +layout: example +category: example +title: Highlight features within a bounding box +description: 'Hold Shift & drag the map to query features using queryRenderedFeatures.' +tags: + - user-interaction +--- + + +
+ + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-20-timeline-animation.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-20-timeline-animation.html new file mode 100644 index 000000000..ccca71824 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-20-timeline-animation.html @@ -0,0 +1,174 @@ +--- +layout: example +category: example +title: Create a time slider +description: Drag the range slider to visualize earthquakes that were greater than 5.9 magnitude in 2015. +tags: + - user-interaction + - sources +--- + + +
+ +
+
+

Significant earthquakes in 2015

+ + +
+
+
+
+
Magnitude (m)
+
+
+
+ + + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-21-mapbox-gl-compare.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-21-mapbox-gl-compare.html new file mode 100644 index 000000000..749411c90 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-21-mapbox-gl-compare.html @@ -0,0 +1,53 @@ +--- +layout: example +category: example +title: Swipe between maps +description: 'Use mapbox-gl-compare to swipe between map instances & sync their movement.' +tags: + - controls-and-overlays +--- + + + + +
+
+ diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-22-measure.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-22-measure.html new file mode 100644 index 000000000..b42249ff8 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-22-measure.html @@ -0,0 +1,146 @@ +--- +layout: example +category: example +title: Measure distances +description: 'Click points on a map to create lines that measure distanced using turf.lineDistance.' +tags: + - user-interaction +--- + + +
+
+ + + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-23-adjust-layer-opacity.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-23-adjust-layer-opacity.html new file mode 100644 index 000000000..a420bb85d --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-23-adjust-layer-opacity.html @@ -0,0 +1,86 @@ +--- +layout: example +category: example +title: "Adjust a layer's opacity" +description: "Drag the range slider to adjust the opacity of a raster layer on top of a map." +tags: + - layers + - user-interaction +--- + + +
+ +
+
+ + +
+
+ + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-24-custom-marker-icons.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-24-custom-marker-icons.html new file mode 100644 index 000000000..d12ff1c7e --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-24-custom-marker-icons.html @@ -0,0 +1,95 @@ +--- +layout: example +category: example +title: Add custom icons with Markers +description: 'Use Markers to add custom icons to your map.' +tags: + - controls-and-overlays +--- + + +
+ + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-24-drag-a-point.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-24-drag-a-point.html new file mode 100644 index 000000000..238489972 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-24-drag-a-point.html @@ -0,0 +1,142 @@ +--- +layout: example +category: example +title: "Create a draggable point" +description: "Drag the point to a new location on a map and populates its coordinates in a display." +tags: + - user-interaction +--- + + + +
+

+
+
diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-24-query-similar-features.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-24-query-similar-features.html
new file mode 100644
index 000000000..946140f94
--- /dev/null
+++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-24-query-similar-features.html
@@ -0,0 +1,128 @@
+---
+layout: example
+category: example
+title: Highlight features containing similar data
+description: 'Hover over counties to highlight counties that share the same name.'
+tags: 
+  - user-interaction
+---
+
+
+
+
+ + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-25-mapbox-gl-draw.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-25-mapbox-gl-draw.html new file mode 100644 index 000000000..c972eff62 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-25-mapbox-gl-draw.html @@ -0,0 +1,81 @@ +--- +layout: example +category: example +title: Show drawn polygon area +description: Use GL draw to draw a polygon and turf.js to calculate its area in square meters. +tags: + - controls-and-overlays +--- + + + + + +
+
+

Draw a polygon using the draw tools.

+
Calculate area
+
+
+ + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-26-game-controls.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-26-game-controls.html new file mode 100644 index 000000000..1e1e959b0 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-26-game-controls.html @@ -0,0 +1,60 @@ +--- +layout: example +category: example +title: Navigate the map with game-like controls +description: Move around the map with game-like controls. +tags: + - camera +--- + +
+ + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-27-3d-extrusion-floorplan.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-27-3d-extrusion-floorplan.html new file mode 100644 index 000000000..4f8bd4236 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-27-3d-extrusion-floorplan.html @@ -0,0 +1,55 @@ +--- +layout: example +category: example +title: Extrude polygons for 3D indoor mapping. +description: Create a 3D indoor map with the fill-extrude-height paint property. +tags: + - layers +--- +
+
+ diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-27-set-popup.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-27-set-popup.html new file mode 100644 index 000000000..afcd90659 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-27-set-popup.html @@ -0,0 +1,52 @@ +--- +layout: example +category: example +title: Attach a popup to a marker instance +description: Attach a popup to a marker and display it on click. +tags: + - controls-and-overlays +--- + + +
+ + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-28-fullscreen.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-28-fullscreen.html new file mode 100644 index 000000000..ced287870 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-28-fullscreen.html @@ -0,0 +1,23 @@ +--- +layout: example +category: example +title: View a fullscreen map +description: Toggle between current view and fullscreen mode +tags: + - controls-and-overlays +--- + +
+ + diff --git a/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-28-zoomto-linestring.html b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-28-zoomto-linestring.html new file mode 100644 index 000000000..4561f9873 --- /dev/null +++ b/geoprism-web/src/main/webapp/3rd-party/mapbox/mapboxgl/mapbox-gl-js-0.34.0/docs/_posts/examples/3400-01-28-zoomto-linestring.html @@ -0,0 +1,105 @@ +--- +layout: example +category: example +title: Fit to the bounds of a LineString +description: "Get the bounds of a LineString by passing it's first coordinates to mapboxgl.LngLatBounds and chaining extend to include the last coordinates." +tags: + - user-interaction +--- + +
+